diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index dc41baa00b0..5054df92acc 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -4,9 +4,10 @@ # In the event that people are to be informed of changes # to the same file or dir, add them to the end of under Multiple Owners -# Maptainers + /code/ @nevimer @Cyprex /modular_zubbers/ @nevimer @magatsuchi @Cyprex +# Maptainers /_maps/ @KathrinBailey @projectkepler-ru @@ -19,3 +20,4 @@ modular_skyrat/modules @projectkepler-ru /code/modules/surgery @Majkl-J /modular_skyrat/master_files/code/modules/surgery @Majkl-J /modular_skyrat/modules/synths @Majkl-J +/modular_zubbers diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000000..84bd4fa20aa --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,11 @@ +# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file +version: 2 +updates: + - package-ecosystem: github-actions + directory: / + target-branch: master + schedule: + interval: daily + labels: + - GitHub + open-pull-requests-limit: 10 diff --git a/.github/guides/STANDARDS.md b/.github/guides/STANDARDS.md index 9c6496e0c4d..c27c8ae7417 100644 --- a/.github/guides/STANDARDS.md +++ b/.github/guides/STANDARDS.md @@ -513,6 +513,30 @@ The following is a list of procs, and their safe replacements. * Move away from something, taking turf density into account `walk_away()` -> `SSmove_manager.move_away()` * Move to a random place nearby. NOT random walk `walk_rand()` -> `SSmove_manager.move_rand()` is random walk, `SSmove_manager.move_to_rand()` is walk to a random place +### Avoid pointer use + +BYOND has a variable type called pointers, which allow you to reference a variable rather then its value. As an example of how this works: + +``` +var/pointed_at = "text" +var/value = pointed_at // copies the VALUE of pointed at +var/reference = &pointed_at // points at pointed_at itself + +// so we can retain a reference even if pointed_at changes +pointed_at = "text AGAIN" +world << (*reference) // Deref to get the value, outputs "text AGAIN" + +// or modify the var remotely +*reference = "text a THIRD TIME" +world << pointed_at // outputs "text a THIRD TIME" +``` + +The problem with this is twofold. +- First: if you use a pointer to reference a var on a datum, it is essentially as if you held an invisible reference to that datum. This risks hard deletes in very unclear ways that cannot be tested for. +- Second: People don't like, understand how pointers work? They mix them up with classical C pointers, when they're more like `std::shared_ptr`. This leads to code that just doesn't work properly, or is hard to follow without first getting your mind around it. It also risks hiding what code does in dumb ways because pointers don't have unique types. + +For these reasons and with the hope of avoiding pointers entering general use, be very careful using them, if you use them at all. + ### BYOND hellspawn What follows is documentation of inconsistent or strange behavior found in our engine, BYOND. diff --git a/.github/workflows/auto_changelog.yml b/.github/workflows/auto_changelog.yml index 6c40415fd34..f7c8d146580 100644 --- a/.github/workflows/auto_changelog.yml +++ b/.github/workflows/auto_changelog.yml @@ -15,8 +15,20 @@ jobs: steps: - name: Checkout uses: actions/checkout@v4 + + - name: Generate App Token + id: app-token-generation + uses: actions/create-github-app-token@v1 + if: env.APP_PRIVATE_KEY != '' && env.APP_ID != '' + with: + app-id: ${{ secrets.APP_ID }} + private-key: ${{ secrets.APP_PRIVATE_KEY }} + env: + APP_PRIVATE_KEY: ${{ secrets.APP_PRIVATE_KEY }} + APP_ID: ${{ secrets.APP_ID }} + - name: Run auto changelog - uses: actions/github-script@v6 + uses: actions/github-script@v7 with: script: | const { processAutoChangelog } = await import('${{ github.workspace }}/tools/pull_request_hooks/autoChangelog.js') diff --git a/.github/workflows/ci_suite.yml b/.github/workflows/ci_suite.yml index 14dd1d18689..41aca0ccced 100644 --- a/.github/workflows/ci_suite.yml +++ b/.github/workflows/ci_suite.yml @@ -76,7 +76,7 @@ jobs: path: tools/icon_cutter/cache key: ${{ runner.os }}-cutter-${{ hashFiles('dependencies.sh') }} - name: Install OpenDream - uses: robinraju/release-downloader@v1.9 + uses: robinraju/release-downloader@v1.11 with: repository: "OpenDreamProject/OpenDream" tag: "latest" @@ -288,9 +288,12 @@ jobs: max-required-client-version: ${{needs.collect_data.outputs.max_required_byond_client}} completion_gate: # Serves as a non-moving target for branch rulesets + if: always() && !cancelled() name: Completion Gate needs: [ test_windows, compare_screenshots, compile_all_maps, run_linters ] runs-on: ubuntu-latest steps: - - name: Mandatory Empty Step - run: exit 0 + - name: Decide whether the needed jobs succeeded or failed + uses: re-actors/alls-green@release/v1 + with: + jobs: ${{ toJSON(needs) }} diff --git a/.github/workflows/compile_changelogs.yml b/.github/workflows/compile_changelogs.yml index 6511f340625..fb95d5f3812 100644 --- a/.github/workflows/compile_changelogs.yml +++ b/.github/workflows/compile_changelogs.yml @@ -9,6 +9,8 @@ jobs: compile: name: "Compile changelogs" runs-on: ubuntu-22.04 + permissions: + contents: write steps: - name: "Check for ACTION_ENABLER secret and pass true to output if it exists to be checked by later steps" id: value_holder @@ -18,35 +20,52 @@ jobs: unset SECRET_EXISTS if [ -n "$ENABLER_SECRET" ]; then SECRET_EXISTS=true ; fi echo "ACTIONS_ENABLED=$SECRET_EXISTS" >> $GITHUB_OUTPUT + - name: "Setup python" if: steps.value_holder.outputs.ACTIONS_ENABLED - uses: actions/setup-python@v1 + uses: actions/setup-python@v5 with: python-version: '3.x' + - name: "Install deps" if: steps.value_holder.outputs.ACTIONS_ENABLED run: | python -m pip install --upgrade pip python -m pip install pyyaml sudo apt-get install dos2unix + - name: "Checkout" if: steps.value_holder.outputs.ACTIONS_ENABLED uses: actions/checkout@v4 with: fetch-depth: 25 persist-credentials: false + - name: "Compile" if: steps.value_holder.outputs.ACTIONS_ENABLED run: | python tools/ss13_genchangelog.py html/changelogs + - name: Commit if: steps.value_holder.outputs.ACTIONS_ENABLED run: | - git config --local user.email "action@github.com" - git config --local user.name "Changelogs" + git config --local user.name "tgstation-ci[bot]" + git config --local user.email "179393467+tgstation-ci[bot]@users.noreply.github.com" git pull origin master git add html/changelogs git commit -m "Automatic changelog compile [ci skip]" -a || true + + - name: Generate App Token + id: app-token-generation + uses: actions/create-github-app-token@v1 + if: env.APP_PRIVATE_KEY != '' && env.APP_ID != '' + with: + app-id: ${{ secrets.APP_ID }} + private-key: ${{ secrets.APP_PRIVATE_KEY }} + env: + APP_PRIVATE_KEY: ${{ secrets.APP_PRIVATE_KEY }} + APP_ID: ${{ secrets.APP_ID }} + - name: "Push" if: steps.value_holder.outputs.ACTIONS_ENABLED uses: ad-m/github-push-action@master diff --git a/.github/workflows/generate_documentation.yml b/.github/workflows/generate_documentation.yml index 2ffef722183..40710a9044b 100644 --- a/.github/workflows/generate_documentation.yml +++ b/.github/workflows/generate_documentation.yml @@ -27,10 +27,9 @@ jobs: touch dmdoc/.nojekyll echo codedocs.tgstation13.org > dmdoc/CNAME - name: Deploy - uses: JamesIves/github-pages-deploy-action@3.7.1 + uses: JamesIves/github-pages-deploy-action@v4.6.4 with: - BRANCH: gh-pages - CLEAN: true - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - SINGLE_COMMIT: true - FOLDER: dmdoc + branch: gh-pages + clean: true + single-commit: true + folder: dmdoc diff --git a/.github/workflows/remove_guide_comments.yml b/.github/workflows/remove_guide_comments.yml index e3a4ac3feda..621d860c5cd 100644 --- a/.github/workflows/remove_guide_comments.yml +++ b/.github/workflows/remove_guide_comments.yml @@ -11,7 +11,7 @@ jobs: - name: Checkout uses: actions/checkout@v4 - name: Remove guide comments - uses: actions/github-script@v6 + uses: actions/github-script@v7 with: script: | const { removeGuideComments } = await import('${{ github.workspace }}/tools/pull_request_hooks/removeGuideComments.js') diff --git a/.github/workflows/rerun_flaky_tests.yml b/.github/workflows/rerun_flaky_tests.yml index 7f498de1443..80ece468061 100644 --- a/.github/workflows/rerun_flaky_tests.yml +++ b/.github/workflows/rerun_flaky_tests.yml @@ -12,7 +12,7 @@ jobs: - name: Checkout uses: actions/checkout@v4 - name: Rerun flaky tests - uses: actions/github-script@v6 + uses: actions/github-script@v7 with: script: | const { rerunFlakyTests } = await import('${{ github.workspace }}/tools/pull_request_hooks/rerunFlakyTests.js') @@ -24,7 +24,7 @@ jobs: - name: Checkout uses: actions/checkout@v4 - name: Report flaky tests - uses: actions/github-script@v6 + uses: actions/github-script@v7 with: script: | const { reportFlakyTests } = await import('${{ github.workspace }}/tools/pull_request_hooks/rerunFlakyTests.js') diff --git a/.github/workflows/show_screenshot_test_results.yml b/.github/workflows/show_screenshot_test_results.yml index c61d09fa890..b48ca983b35 100644 --- a/.github/workflows/show_screenshot_test_results.yml +++ b/.github/workflows/show_screenshot_test_results.yml @@ -34,7 +34,7 @@ jobs: npm install node-fetch - name: Show screenshot test results if: steps.secrets_set.outputs.SECRETS_ENABLED - uses: actions/github-script@v6 + uses: actions/github-script@v7 env: FILE_HOUSE_KEY: ${{ secrets.ARTIFACTS_FILE_HOUSE_KEY }} with: diff --git a/.github/workflows/stale.yml.disabled b/.github/workflows/stale.yml.disabled index e7e41eebbab..cb427593424 100644 --- a/.github/workflows/stale.yml.disabled +++ b/.github/workflows/stale.yml.disabled @@ -16,7 +16,7 @@ jobs: runs-on: ubuntu-22.04 steps: - - uses: actions/stale@v4 + - uses: actions/stale@v9 with: repo-token: ${{ secrets.GITHUB_TOKEN }} stale-pr-message: "This PR has been inactive for long enough to be automatically marked as stale. This means it is at risk of being auto closed in ~ 7 days, please address any outstanding review items and ensure your PR is finished, if these are all true and you are auto-staled anyway, you need to actively ask maintainers if your PR will be merged. Once you have done any of the previous actions then you should request a maintainer remove the stale label on your PR, to reset the stale timer. If you feel no maintainer will respond in that time, you may wish to close this PR youself, while you seek maintainer comment, as you will then be able to reopen the PR yourself." diff --git a/.github/workflows/test_merge_bot.yml b/.github/workflows/test_merge_bot.yml index c77e5077944..76dcd3cabc5 100644 --- a/.github/workflows/test_merge_bot.yml +++ b/.github/workflows/test_merge_bot.yml @@ -32,7 +32,7 @@ jobs: npm install node-fetch - name: Check for test merges if: steps.secrets_set.outputs.GET_TEST_MERGES_URL - uses: actions/github-script@v6 + uses: actions/github-script@v7 env: GET_TEST_MERGES_URL: ${{ secrets.GET_TEST_MERGES_URL }} with: diff --git a/.github/workflows/tgs_test.yml b/.github/workflows/tgs_test.yml index bd538307aa3..4b7853aa77c 100644 --- a/.github/workflows/tgs_test.yml +++ b/.github/workflows/tgs_test.yml @@ -14,6 +14,7 @@ on: - 'code/__DEFINES/tgs.dm' - 'code/game/world.dm' - 'code/modules/tgs/**' + - 'tools/bootstrap/**' - 'tools/tgs_scripts/**' - 'tools/tgs_test/**' pull_request: @@ -28,6 +29,7 @@ on: - 'code/__DEFINES/tgs.dm' - 'code/game/world.dm' - 'code/modules/tgs/**' + - 'tools/bootstrap/**' - 'tools/tgs_scripts/**' - 'tools/tgs_test/**' merge_group: @@ -57,7 +59,7 @@ jobs: - 5000:5000 #Can't use env here for some reason steps: - name: Setup dotnet - uses: actions/setup-dotnet@v2 + uses: actions/setup-dotnet@v4 with: dotnet-version: 8.0.x diff --git a/.github/workflows/update_tgs_dmapi.yml b/.github/workflows/update_tgs_dmapi.yml index 232c02c0ecb..3f7ee320d90 100644 --- a/.github/workflows/update_tgs_dmapi.yml +++ b/.github/workflows/update_tgs_dmapi.yml @@ -9,6 +9,9 @@ jobs: update-dmapi: runs-on: ubuntu-22.04 name: Update the TGS DMAPI + permissions: + contents: write + pull-requests: write steps: - name: Clone uses: actions/checkout@v4 @@ -29,12 +32,23 @@ jobs: - name: Commit and Push continue-on-error: true run: | - git config user.name "tgstation-server-ci[bot]" - git config user.email "161980869+tgstation-server-ci[bot]@users.noreply.github.com" + git config user.name "tgstation-ci[bot]" + git config user.email "179393467+tgstation-ci[bot]@users.noreply.github.com" git add . git commit -m 'Update TGS DMAPI' git push -f -u origin tgs-dmapi-update + - name: Generate App Token + id: app-token-generation + uses: actions/create-github-app-token@v1 + if: env.APP_PRIVATE_KEY != '' && env.APP_ID != '' + with: + app-id: ${{ secrets.APP_ID }} + private-key: ${{ secrets.APP_PRIVATE_KEY }} + env: + APP_PRIVATE_KEY: ${{ secrets.APP_PRIVATE_KEY }} + APP_ID: ${{ secrets.APP_ID }} + - name: Create Pull Request uses: repo-sync/pull-request@v2 if: ${{ success() }} @@ -45,4 +59,4 @@ jobs: pr_body: "This pull request updates the TGS DMAPI to the latest version. Please note any changes that may be breaking or unimplemented in your codebase by checking what changes are in the definitions file: code/__DEFINES/tgs.dm before merging.\n\n${{ steps.dmapi-update.outputs.release-notes }}" pr_label: "Tools" pr_allow_empty: false - github_token: ${{ secrets.COMFY_ORANGE_PAT }} + github_token: ${{ steps.app-token-generation.outputs.token || secrets.GITHUB_TOKEN }} diff --git a/_maps/RandomRuins/IceRuins/icemoon_surface_phonebooth.dmm b/_maps/RandomRuins/IceRuins/icemoon_surface_phonebooth.dmm index 2e500943b64..905403954b6 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_surface_phonebooth.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_surface_phonebooth.dmm @@ -70,7 +70,7 @@ /area/ruin/powered/icemoon_phone_booth) "W" = ( /obj/machinery/vending/cigarette{ - onstation_override = 1 + all_products_free = 0 }, /obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/plating/icemoon, diff --git a/_maps/RandomRuins/IceRuins/icemoon_surface_pizza.dmm b/_maps/RandomRuins/IceRuins/icemoon_surface_pizza.dmm index 121f9e4ea45..c9b3d35aa72 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_surface_pizza.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_surface_pizza.dmm @@ -538,9 +538,7 @@ }, /area/ruin/pizzeria) "yP" = ( -/obj/machinery/vending/dinnerware{ - onstation = 0 - }, +/obj/machinery/vending/dinnerware, /obj/effect/turf_decal/tile/blue/opposingcorners{ dir = 1 }, diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_syndielab.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_syndielab.dmm new file mode 100644 index 00000000000..8d90a5079db --- /dev/null +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_syndielab.dmm @@ -0,0 +1,1247 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/clipboard{ + pixel_y = 3; + pixel_x = -4 + }, +/obj/structure/noticeboard/directional/north, +/obj/item/petri_dish/random, +/obj/item/paper/fluff/junkmail_generic{ + name = "weird note" + }, +/obj/item/paper/guides/antag/supermatter_sliver, +/obj/item/stack/sheet/mineral/plasma{ + pixel_x = 5 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndielab) +"aP" = ( +/obj/item/reagent_containers/condiment/milk, +/obj/item/reagent_containers/cup/soda_cans/beer{ + pixel_x = -6 + }, +/obj/item/reagent_containers/cup/soda_cans/beer{ + pixel_x = 6 + }, +/obj/structure/closet/mini_fridge, +/turf/open/floor/mineral/plastitanium, +/area/ruin/syndielab) +"bn" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/petri_dish{ + pixel_x = -10; + pixel_y = 10 + }, +/obj/item/reagent_containers/cup/mortar{ + pixel_x = -17; + pixel_y = 1 + }, +/obj/item/pestle{ + pixel_x = -12; + pixel_y = -2 + }, +/obj/structure/microscope, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndielab) +"bx" = ( +/obj/item/cigbutt, +/turf/template_noop, +/area/template_noop) +"bC" = ( +/obj/machinery/navbeacon{ + location = "syndielab_beacon1"; + codes_txt = "patrol;next_patrol=syndielab_beacon2" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/hidden, +/obj/structure/cable/layer1, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"cd" = ( +/obj/structure/chair/sofa/corp/left, +/obj/structure/extinguisher_cabinet/directional/north, +/obj/structure/cable/layer1, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"cg" = ( +/obj/structure/tank_dispenser/oxygen, +/obj/machinery/light/warm/directional/north, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/sign/warning/gas_mask/directional/north, +/turf/open/floor/mineral/plastitanium, +/area/ruin/syndielab) +"ci" = ( +/obj/structure/flora/bush/pointy/style_3{ + pixel_y = -4; + pixel_x = 6 + }, +/obj/structure/flora/bush/ferny/style_2{ + pixel_y = 6; + pixel_x = -3 + }, +/turf/open/floor/grass{ + initial_gas_mix = "o2=1000;n2=1100;TEMP=280" + }, +/area/ruin/syndielab) +"cu" = ( +/obj/machinery/door/airlock/security{ + desc = "It opens and closes. Menacingly!"; + name = "Syndicate Airlock" + }, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/hidden, +/obj/effect/mapping_helpers/airlock/cutaiwire, +/obj/structure/cable/layer1, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"cM" = ( +/mob/living/basic/trooper/syndicate/ranged/shotgun, +/obj/structure/cable/layer1, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"cP" = ( +/obj/effect/mapping_helpers/bombable_wall, +/turf/closed/wall/r_wall/syndicate/nodiagonal{ + desc = "An ominous looking wall. It has extra insulation to keep the heat in."; + name = "plastitanium wall" + }, +/area/ruin/syndielab) +"dD" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/condiment/bbqsauce{ + pixel_y = 8; + pixel_x = -9 + }, +/obj/item/reagent_containers/condiment/donksauce{ + pixel_y = 5; + pixel_x = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium, +/area/ruin/syndielab) +"el" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/hidden, +/obj/structure/cable/layer1, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"ex" = ( +/obj/structure/flora/tree/jungle/small/style_4{ + pixel_x = -14; + pixel_y = 5 + }, +/obj/structure/flora/bush/sunny{ + pixel_y = 12; + pixel_x = 12 + }, +/obj/structure/flora/bush/fullgrass/style_2, +/turf/open/floor/grass{ + initial_gas_mix = "o2=1000;n2=1100;TEMP=280" + }, +/area/ruin/syndielab) +"ey" = ( +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"gE" = ( +/obj/machinery/vending/donksnack{ + onstation_override = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndielab) +"hl" = ( +/obj/machinery/navbeacon{ + location = "syndielab_beacon2"; + codes_txt = "patrol;next_patrol=syndielab_beacon3" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/hidden, +/obj/structure/cable/layer1, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"hn" = ( +/obj/machinery/computer/telecomms/monitor{ + dir = 8; + icon_keyboard = "syndie_key" + }, +/turf/open/floor/mineral/plastitanium, +/area/ruin/syndielab) +"hu" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"iy" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/plastitanium, +/area/ruin/syndielab) +"iQ" = ( +/obj/structure/closet/crate/preopen, +/obj/item/radio/off{ + pixel_x = 8 + }, +/obj/item/radio/off{ + pixel_x = -5 + }, +/turf/open/floor/mineral/plastitanium, +/area/ruin/syndielab) +"lW" = ( +/obj/structure/filingcabinet, +/obj/item/paper/fluff/ruins/hauntedtradingpost/receipt/alternate, +/obj/item/pen, +/obj/item/paper/guides/antag/nuke_instructions, +/obj/item/cigarette/syndicate, +/obj/item/poster/random_contraband, +/obj/item/poster/random_contraband, +/obj/item/sticker/syndicate, +/turf/open/floor/mineral/plastitanium, +/area/ruin/syndielab) +"mi" = ( +/obj/structure/sign/poster/contraband/cybersun_six_hundred/directional/west, +/obj/item/vending_refill/donksoft{ + pixel_x = 2; + pixel_y = 8 + }, +/obj/item/vending_refill/donksnackvendor, +/obj/structure/closet/crate/freezer/donk, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndielab) +"na" = ( +/obj/item/climbing_hook, +/obj/item/pickaxe/silver{ + pixel_x = 3; + pixel_y = 5 + }, +/obj/item/t_scanner/adv_mining_scanner{ + pixel_x = 3; + pixel_y = -1 + }, +/obj/item/hatchet/wooden{ + pixel_y = -7; + pixel_x = -3 + }, +/obj/structure/closet/crate/preopen, +/obj/structure/sign/poster/contraband/gorlex_recruitment/directional/west, +/obj/effect/decal/cleanable/plastic, +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndielab) +"nD" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/machinery/microwave, +/obj/machinery/light/warm/directional/east, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndielab) +"nT" = ( +/obj/machinery/atmospherics/components/binary/pump/on/dark/hidden{ + dir = 1; + target_pressure = 180 + }, +/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndielab) +"oA" = ( +/obj/structure/syndicate_uplink_beacon, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"oY" = ( +/obj/effect/mapping_helpers/apc/syndicate_access, +/obj/effect/mapping_helpers/apc/full_charge, +/obj/machinery/power/apc/auto_name/directional/east{ + cable_layer = 1 + }, +/obj/effect/mapping_helpers/apc/cut_AI_wire, +/obj/structure/cable/layer1, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"pK" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/machinery/airalarm/directional/north, +/obj/item/implanter/radio, +/obj/item/implantcase{ + pixel_x = -5; + pixel_y = 8 + }, +/obj/item/traitor_bug{ + pixel_y = 6; + pixel_x = 6 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndielab) +"qy" = ( +/obj/item/clothing/suit/hooded/explorer/syndicate{ + pixel_x = 8; + pixel_y = -2 + }, +/obj/item/clothing/mask/gas/syndicate, +/obj/structure/rack, +/obj/machinery/light/warm/directional/north, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/mineral/plastitanium, +/area/ruin/syndielab) +"qC" = ( +/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndielab) +"ry" = ( +/obj/item/clothing/shoes/workboots/mining{ + pixel_x = -7; + pixel_y = 10 + }, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"rH" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/hidden, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"rO" = ( +/obj/structure/chair/comfy/black{ + dir = 8 + }, +/turf/open/floor/mineral/plastitanium, +/area/ruin/syndielab) +"sa" = ( +/obj/effect/decal/cleanable/ash, +/turf/open/floor/mineral/plastitanium, +/area/ruin/syndielab) +"sj" = ( +/obj/structure/chair/office/tactical{ + dir = 8 + }, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"sp" = ( +/obj/effect/decal/cleanable/plastic, +/obj/structure/mop_bucket/janitorialcart{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium, +/area/ruin/syndielab) +"sV" = ( +/obj/machinery/vending/donksofttoyvendor{ + onstation_override = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndielab) +"tb" = ( +/obj/machinery/light/warm/directional/north, +/obj/effect/decal/cleanable/oil/streak, +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/hidden, +/obj/structure/cable/layer1, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"tC" = ( +/obj/structure/cable/layer1, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"uT" = ( +/obj/structure/table/wood, +/obj/item/ammo_casing/shotgun/scatterlaser{ + pixel_y = 6; + pixel_x = 1 + }, +/obj/item/ammo_casing/shotgun/buckshot{ + pixel_y = 4; + pixel_x = 8 + }, +/turf/open/floor/carpet/red, +/area/ruin/syndielab) +"uX" = ( +/obj/structure/flora/bush/ferny{ + pixel_y = 2; + pixel_x = -2 + }, +/obj/machinery/air_sensor{ + chamber_id = "syndielab_biodome" + }, +/turf/open/floor/grass{ + initial_gas_mix = "o2=1000;n2=1100;TEMP=280" + }, +/area/ruin/syndielab) +"vr" = ( +/obj/structure/sign/poster/contraband/revolver/directional/east, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"vE" = ( +/obj/structure/safe, +/obj/item/book/granter/crafting_recipe/donk_secret_recipe, +/obj/item/stack/sheet/mineral/plasma/thirty, +/obj/item/storage/wallet/money{ + desc = "It can hold a few small and personal things." + }, +/turf/open/floor/mineral/plastitanium, +/area/ruin/syndielab) +"vO" = ( +/obj/machinery/door/airlock/survival_pod{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/structure/fans/tiny, +/obj/effect/mapping_helpers/airlock/cutaiwire, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium, +/area/ruin/syndielab) +"wh" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/trash/ready_donk{ + pixel_x = 6 + }, +/obj/structure/sign/poster/contraband/eat/directional/east, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndielab) +"wj" = ( +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/hidden, +/turf/open/floor/mineral/plastitanium, +/area/ruin/syndielab) +"wl" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"wJ" = ( +/obj/structure/rack, +/obj/item/storage/backpack/satchel, +/obj/item/clothing/mask/gas/syndicate, +/obj/item/clothing/suit/hooded/explorer/syndicate{ + pixel_x = 8; + pixel_y = -2 + }, +/turf/open/floor/mineral/plastitanium, +/area/ruin/syndielab) +"xa" = ( +/obj/structure/extinguisher_cabinet/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/hidden, +/obj/structure/cable/layer1, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"xg" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium, +/area/ruin/syndielab) +"xr" = ( +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/obj/machinery/door/airlock/security{ + desc = "It opens and closes. Menacingly!"; + name = "Syndicate Airlock" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/hidden, +/obj/effect/mapping_helpers/airlock/cutaiwire, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"yW" = ( +/turf/open/floor/carpet/red, +/area/ruin/syndielab) +"AD" = ( +/obj/structure/bookcase, +/obj/item/book/manual/fish_catalog{ + pixel_x = -3; + pixel_y = -6 + }, +/obj/item/book/manual/nuclear{ + pixel_x = -5; + pixel_y = 1 + }, +/obj/item/book/manual/wiki/cytology{ + pixel_x = 6; + pixel_y = -2 + }, +/turf/open/floor/mineral/plastitanium, +/area/ruin/syndielab) +"AR" = ( +/turf/closed/wall/r_wall/syndicate/nodiagonal{ + desc = "An ominous looking wall. It has extra insulation to keep the heat in."; + name = "plastitanium wall" + }, +/area/ruin/syndielab) +"AX" = ( +/obj/item/ammo_casing/shotgun/buckshot/spent{ + pixel_y = -6; + pixel_x = 4 + }, +/turf/open/floor/carpet/red, +/area/ruin/syndielab) +"Co" = ( +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium, +/area/ruin/syndielab) +"CS" = ( +/obj/machinery/airalarm/directional/east, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"Dd" = ( +/obj/item/storage/bag/trash/filled, +/obj/structure/closet/crate/bin, +/turf/open/floor/mineral/plastitanium, +/area/ruin/syndielab) +"De" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/trash/semki{ + pixel_y = 12 + }, +/obj/item/soap/syndie, +/obj/structure/noticeboard/directional/east, +/obj/item/paper/fluff/junkmail_generic{ + name = "weird note" + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndielab) +"EY" = ( +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/obj/machinery/door/airlock/security/glass{ + desc = "It opens and closes. Menacingly!"; + name = "Syndicate Airlock" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/hidden, +/obj/effect/mapping_helpers/airlock/cutaiwire, +/obj/structure/cable/layer1, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"Fz" = ( +/obj/structure/cable/layer1, +/obj/machinery/power/terminal{ + cable_layer = 1 + }, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"FJ" = ( +/obj/machinery/light/warm/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/hidden, +/obj/structure/cable/layer1, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"Gi" = ( +/obj/machinery/navbeacon{ + location = "syndielab_beacon4"; + codes_txt = "patrol;next_patrol=syndielab_beacon1" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/hidden, +/obj/structure/cable/layer1, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"GL" = ( +/obj/structure/chair/office/tactical, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"GV" = ( +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/obj/machinery/door/airlock/security{ + desc = "It opens and closes. Menacingly!"; + name = "Syndicate Airlock" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/hidden, +/obj/effect/mapping_helpers/airlock/cutaiwire, +/obj/structure/cable/layer1, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"Hq" = ( +/obj/item/seeds/lavaland/cactus{ + pixel_x = -8; + pixel_y = 4 + }, +/obj/item/seeds/lavaland/cactus{ + pixel_y = 6; + pixel_x = 8 + }, +/obj/item/seeds/lavaland/fireblossom{ + pixel_y = 3; + pixel_x = 3 + }, +/obj/item/stack/ore/glass/basalt{ + amount = 50; + pixel_y = -3; + pixel_x = -3 + }, +/obj/structure/closet/crate/secure/cybersun/dawn, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndielab) +"Hs" = ( +/obj/structure/rack, +/obj/item/storage/bag/trash, +/obj/item/pushbroom, +/obj/item/storage/bag/trash{ + pixel_x = 9; + pixel_y = -3 + }, +/obj/machinery/airalarm/directional/south, +/obj/structure/cable/layer1, +/turf/open/floor/mineral/plastitanium, +/area/ruin/syndielab) +"HH" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/paper/guides/antag/hdd_extraction{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/book/manual/wiki/tcomms{ + pixel_x = 12; + pixel_y = 1 + }, +/obj/structure/sign/poster/contraband/interdyne_gene_clinics/directional/north, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndielab) +"HS" = ( +/obj/structure/rack, +/obj/item/storage/toolbox/syndicate, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"IQ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/hidden, +/mob/living/basic/bot/dedbot, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"Jc" = ( +/obj/effect/overloader_trap{ + uses_remaining = 1; + shock_damage = 55; + shock_range = 2; + machine_overload_damage = 160 + }, +/obj/machinery/telecomms/hub, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndielab) +"JF" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/structure/sign/poster/contraband/hacking_guide/directional/north, +/obj/item/assembly/signaler/cyborg{ + pixel_y = 5; + pixel_x = 6 + }, +/obj/item/assembly/voice{ + pixel_x = -5; + pixel_y = 3 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndielab) +"Ka" = ( +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/obj/machinery/door/airlock/security/glass{ + desc = "It opens and closes. Menacingly!"; + name = "Syndicate Airlock" + }, +/obj/effect/mapping_helpers/airlock/cutaiwire, +/obj/structure/cable/layer1, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"KV" = ( +/obj/machinery/computer/atmos_control/noreconnect{ + atmos_chambers = list("syndielab_biodome"="Biodome Atmos"); + dir = 4; + name = "gas tank monitor"; + desc = "This computer connects to and controls the sensors and equipment in a nearby pressurised gas reservoir."; + icon_keyboard = "syndie_key" + }, +/turf/open/floor/mineral/plastitanium, +/area/ruin/syndielab) +"Lt" = ( +/obj/item/paper/fluff/operative, +/obj/structure/noticeboard/directional/north, +/obj/structure/cable/layer1, +/obj/item/ammo_casing/shotgun/buckshot/spent{ + pixel_x = 8; + pixel_y = 4 + }, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"MW" = ( +/turf/template_noop, +/area/template_noop) +"NM" = ( +/obj/structure/sign/poster/contraband/donk_co/directional/east, +/obj/structure/cable/layer1, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"Qj" = ( +/obj/structure/flora/bush/grassy{ + pixel_x = 15; + pixel_y = 3 + }, +/obj/structure/flora/bush, +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/oxygen_output{ + dir = 1; + chamber_id = "syndielab_biodome" + }, +/turf/open/floor/grass{ + initial_gas_mix = "o2=1000;n2=1100;TEMP=280" + }, +/area/ruin/syndielab) +"QO" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/computer_disk/syndicate/camera_app{ + pixel_y = 4; + pixel_x = -5 + }, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/crowbar/hammer{ + pixel_x = 3; + pixel_y = 1 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndielab) +"Sq" = ( +/obj/structure/rack, +/obj/item/pinata/donk{ + pixel_y = 10 + }, +/obj/item/storage/box/party_poppers{ + pixel_y = 1; + pixel_x = 7 + }, +/obj/item/storage/box/firecrackers{ + pixel_x = -8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/structure/cable/layer1, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"Te" = ( +/obj/machinery/navbeacon{ + location = "syndielab_beacon3"; + codes_txt = "patrol;next_patrol=syndielab_beacon4" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/hidden, +/obj/structure/cable/layer1, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"Tl" = ( +/obj/item/stack/tile/carpet/donk/thirty{ + pixel_x = 6; + pixel_y = -5 + }, +/obj/item/toy/plush/donkpocket{ + pixel_x = 12; + pixel_y = 3 + }, +/obj/item/stack/tile/carpet/donk/thirty{ + pixel_x = -6; + pixel_y = -5 + }, +/obj/item/toy/plush/donkpocket{ + pixel_x = -4; + pixel_y = 3 + }, +/obj/item/stack/package_wrap, +/obj/structure/closet/crate/preopen, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndielab) +"Ts" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/structure/sign/poster/contraband/c20r/directional/north, +/obj/item/anomaly_releaser{ + pixel_y = 6 + }, +/obj/item/anomaly_releaser, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndielab) +"TB" = ( +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"UF" = ( +/obj/machinery/door/airlock/survival_pod/glass{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/structure/fans/tiny, +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/hidden, +/obj/effect/mapping_helpers/airlock/cutaiwire, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium, +/area/ruin/syndielab) +"UM" = ( +/obj/item/ammo_box/c9mm, +/obj/item/ammo_box/magazine/m9mm, +/obj/structure/closet/crate/secure/gorlex_weapons{ + req_one_access = list("syndicate") + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndielab) +"Vf" = ( +/obj/effect/decal/cleanable/molten_object, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/item/stack/ore/plasma{ + pixel_x = 7; + pixel_y = 10 + }, +/turf/open/floor/mineral/plastitanium, +/area/ruin/syndielab) +"Vu" = ( +/obj/structure/aquarium/donkfish, +/turf/open/floor/mineral/plastitanium, +/area/ruin/syndielab) +"VO" = ( +/turf/open/floor/mineral/plastitanium, +/area/ruin/syndielab) +"Wn" = ( +/obj/machinery/computer/terminal{ + dir = 4; + upperinfo = "ERROR - NO FINGERPRINT MATCH ON FILE!"; + tguitheme = "syndicate"; + desc = "An state-of-the-art lab terminal. The Cybersun Industries logo is imprinted just below the screen."; + content = list("*Solid Matter Analyzer and Research Terminal*"); + name = "lab terminal"; + icon_screen = "tcboss"; + icon_keyboard = "syndie_key" + }, +/turf/open/floor/mineral/plastitanium, +/area/ruin/syndielab) +"Wo" = ( +/obj/structure/table/wood, +/obj/item/ammo_casing/shotgun/fletchette{ + pixel_y = 6 + }, +/obj/item/ammo_casing/shotgun/fletchette{ + pixel_x = 8; + pixel_y = 6 + }, +/obj/item/gun/ballistic/shotgun/musket, +/turf/open/floor/carpet/red, +/area/ruin/syndielab) +"WO" = ( +/obj/item/trash/boritos/red{ + pixel_y = -9; + pixel_x = -5 + }, +/obj/structure/cable/layer1, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"Xe" = ( +/obj/structure/closet/crate/cardboard, +/obj/item/paint/red{ + pixel_y = 2; + pixel_x = -6 + }, +/obj/item/paint_palette{ + pixel_y = 6; + pixel_x = 8 + }, +/obj/item/mod/paint, +/obj/structure/sign/poster/contraband/energy_swords/directional/south, +/turf/open/floor/mineral/plastitanium, +/area/ruin/syndielab) +"Xm" = ( +/obj/structure/closet/crate/secure/trashcart, +/obj/item/relic, +/obj/item/storage/bag/trash/filled{ + pixel_y = 1; + pixel_x = 6 + }, +/obj/item/storage/bag/trash/filled{ + pixel_x = -6; + pixel_y = 1 + }, +/obj/item/storage/bag/trash/filled{ + pixel_y = -1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/mineral/plastitanium, +/area/ruin/syndielab) +"Xt" = ( +/turf/closed/mineral/snowmountain/icemoon, +/area/icemoon/underground/explored) +"YH" = ( +/obj/item/storage/medkit, +/obj/structure/sign/poster/contraband/free_key/directional/south, +/obj/structure/rack, +/obj/item/stack/medical/suture, +/obj/item/clothing/neck/stethoscope, +/obj/item/reagent_containers/hypospray/medipen/atropine, +/turf/open/floor/mineral/plastitanium, +/area/ruin/syndielab) +"Ze" = ( +/obj/machinery/porta_turret/syndicate/energy/cybersun, +/turf/open/floor/mineral/plastitanium, +/area/ruin/syndielab) +"Zx" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/power/smes/magical/cybersun{ + cable_layer = 1; + input_level = 180000; + output_level = 200000; + dir = 1 + }, +/obj/structure/cable/layer1, +/turf/open/floor/mineral/plastitanium, +/area/ruin/syndielab) +"ZW" = ( +/obj/structure/chair/sofa/corp/right, +/mob/living/basic/trooper/syndicate/ranged/shotgun, +/obj/machinery/light/warm/directional/north, +/obj/structure/cable/layer1, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) + +(1,1,1) = {" +MW +MW +MW +MW +Xt +Xt +bx +MW +MW +Xt +MW +MW +MW +MW +MW +MW +"} +(2,1,1) = {" +MW +MW +MW +MW +Xt +AR +AR +vO +AR +Xt +Xt +Xt +Xt +MW +MW +MW +"} +(3,1,1) = {" +MW +MW +Xt +Xt +Xt +AR +cg +xg +AR +AR +cP +AR +Xt +Xt +Xt +MW +"} +(4,1,1) = {" +MW +AR +AR +AR +AR +AR +AR +UF +AR +na +mi +AR +AR +AR +Xt +Xt +"} +(5,1,1) = {" +Xt +AR +aa +Wn +bC +EY +el +el +AR +iQ +iy +vE +Xe +AR +AR +Xt +"} +(6,1,1) = {" +Xt +AR +Ts +sj +FJ +AR +qy +el +AR +AD +ry +ey +VO +Tl +AR +Xt +"} +(7,1,1) = {" +Xt +AR +bn +Vf +xa +AR +Ze +Gi +cu +el +ey +wl +sa +Hq +AR +Xt +"} +(8,1,1) = {" +Xt +AR +AR +AR +EY +AR +qC +qC +AR +tb +HS +ey +sp +UM +AR +Xt +"} +(9,1,1) = {" +Xt +AR +pK +KV +el +nT +Qj +ex +qC +el +Sq +cM +Hs +AR +AR +Xt +"} +(10,1,1) = {" +Xt +AR +JF +sj +el +qC +uX +ci +qC +el +oY +Fz +Zx +AR +Xt +Xt +"} +(11,1,1) = {" +Xt +AR +Jc +oA +FJ +AR +qC +qC +AR +GV +AR +qC +qC +AR +Xt +MW +"} +(12,1,1) = {" +Xt +AR +HH +GL +hl +IQ +rH +rH +xr +Te +hu +TB +lW +AR +Xt +MW +"} +(13,1,1) = {" +Xt +AR +QO +hn +el +Xm +rO +aP +AR +Lt +AX +yW +YH +AR +Xt +MW +"} +(14,1,1) = {" +Xt +AR +AR +AR +EY +qC +qC +qC +AR +ZW +uT +yW +Vu +AR +Xt +MW +"} +(15,1,1) = {" +Xt +Xt +AR +gE +el +wj +dD +Co +AR +cd +Wo +yW +Dd +AR +Xt +MW +"} +(16,1,1) = {" +MW +Xt +AR +sV +NM +tC +tC +tC +Ka +WO +vr +CS +wJ +AR +Xt +MW +"} +(17,1,1) = {" +MW +Xt +AR +AR +AR +nD +wh +De +AR +AR +AR +AR +AR +AR +MW +MW +"} +(18,1,1) = {" +MW +MW +Xt +Xt +AR +AR +AR +AR +AR +Xt +Xt +Xt +Xt +Xt +Xt +MW +"} +(19,1,1) = {" +MW +MW +MW +Xt +Xt +Xt +Xt +Xt +Xt +Xt +MW +MW +MW +MW +MW +MW +"} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_cultaltar.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_cultaltar.dmm index a2b3d227d5d..7b7cec2c72a 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_cultaltar.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_cultaltar.dmm @@ -66,7 +66,7 @@ /obj/effect/step_trigger/sound_effect{ happens_once = 1; name = "\proper a grave mistake"; - sound = 'sound/hallucinations/i_see_you1.ogg'; + sound = 'sound/effects/hallucinations/i_see_you1.ogg'; triggerer_only = 1 }, /obj/effect/step_trigger/message{ diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_phonebooth.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_phonebooth.dmm index 851cfe35548..4cbf3478bc2 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_phonebooth.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_phonebooth.dmm @@ -13,7 +13,7 @@ /area/ruin/powered/lavaland_phone_booth) "k" = ( /obj/machinery/vending/snack/green{ - onstation_override = 1 + all_products_free = 0 }, /obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/plating/lavaland_atmos, @@ -66,7 +66,7 @@ /area/ruin/powered/lavaland_phone_booth) "W" = ( /obj/machinery/vending/cigarette{ - onstation_override = 1 + all_products_free = 0 }, /obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/plating/lavaland_atmos, diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm index 5653125ca0e..6e29288ba67 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm @@ -376,7 +376,7 @@ /obj/item/storage/box/lights/bulbs, /obj/item/storage/toolbox/mechanical/old, /obj/item/gift{ - contains_type = /obj/item/gun/ballistic/automatic/toy/unrestricted + contains_type = /obj/item/gun/ballistic/automatic/toy }, /obj/item/gift{ contains_type = /obj/item/gun/ballistic/automatic/pistol/toy diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm index 6df974f9ea2..b73cf11fda6 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm @@ -18,19 +18,19 @@ "aj" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/machinery/vending/medical/syndicate_access, +/obj/machinery/vending/medical/syndicate, /turf/open/floor/iron/white/side{ dir = 4 }, /area/ruin/syndicate_lava_base/virology) "ak" = ( -/obj/machinery/vending/boozeomat/syndicate_access, +/obj/machinery/vending/boozeomat/syndicate, /turf/closed/wall/mineral/plastitanium/nodiagonal, /area/ruin/syndicate_lava_base/bar) "al" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/machinery/vending/medical/syndicate_access, +/obj/machinery/vending/medical/syndicate, /turf/open/floor/iron/white, /area/ruin/syndicate_lava_base/medbay) "ap" = ( diff --git a/_maps/RandomRuins/SpaceRuins/forgottenship.dmm b/_maps/RandomRuins/SpaceRuins/forgottenship.dmm index 7b12e87992c..cb2a35084f9 100644 --- a/_maps/RandomRuins/SpaceRuins/forgottenship.dmm +++ b/_maps/RandomRuins/SpaceRuins/forgottenship.dmm @@ -613,7 +613,7 @@ /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/syndicate_forgotten_ship) "ct" = ( -/obj/machinery/vending/medical/syndicate_access/cybersun, +/obj/machinery/vending/medical/syndicate/cybersun, /turf/open/floor/plastic, /area/ruin/space/has_grav/syndicate_forgotten_ship) "cu" = ( diff --git a/_maps/RandomRuins/SpaceRuins/hauntedtradingpost.dmm b/_maps/RandomRuins/SpaceRuins/hauntedtradingpost.dmm index 50e0bffd567..df3c3ca6427 100644 --- a/_maps/RandomRuins/SpaceRuins/hauntedtradingpost.dmm +++ b/_maps/RandomRuins/SpaceRuins/hauntedtradingpost.dmm @@ -139,7 +139,7 @@ "bq" = ( /obj/structure/cable/layer1, /obj/machinery/vending/sovietsoda{ - onstation_override = 1 + all_products_free = 0 }, /obj/structure/sign/poster/contraband/clown/directional/east, /obj/machinery/duct, @@ -527,7 +527,7 @@ "dU" = ( /obj/structure/cable/layer1, /obj/machinery/vending/cigarette/syndicate{ - onstation_override = 1 + all_products_free = 0 }, /obj/machinery/duct, /obj/effect/mapping_helpers/broken_machine, @@ -544,7 +544,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/duct, /obj/machinery/vending/clothing{ - onstation_override = 1 + all_products_free = 0 }, /obj/machinery/firealarm/directional/south, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ @@ -1378,7 +1378,7 @@ /area/ruin/space/has_grav/hauntedtradingpost/office/meetingroom) "lT" = ( /obj/machinery/vending/cola/black{ - onstation_override = 1 + all_products_free = 0 }, /obj/machinery/duct, /obj/effect/mapping_helpers/broken_machine, @@ -1866,7 +1866,7 @@ /obj/structure/cable/layer1, /obj/machinery/duct, /obj/machinery/vending/assist{ - onstation_override = 1 + all_products_free = 0 }, /obj/machinery/camera/xray/directional/west, /turf/open/floor/catwalk_floor/iron_smooth, @@ -2475,7 +2475,7 @@ /obj/structure/cable/layer1, /obj/machinery/duct, /obj/machinery/vending/cola/shamblers{ - onstation_override = 1 + all_products_free = 0 }, /turf/open/floor/catwalk_floor/iron_smooth, /area/ruin/space/has_grav/hauntedtradingpost/public/corridor) @@ -4199,7 +4199,7 @@ "KH" = ( /obj/structure/cable/layer1, /obj/machinery/vending/donksnack{ - onstation_override = 1 + all_products_free = 0 }, /obj/machinery/duct, /obj/machinery/camera/autoname/directional/west{ @@ -4516,7 +4516,7 @@ "MO" = ( /obj/machinery/duct, /obj/machinery/vending/snack{ - onstation_override = 1 + all_products_free = 0 }, /turf/open/floor/catwalk_floor/iron_smooth, /area/ruin/space/has_grav/hauntedtradingpost/public/corridor) @@ -4616,7 +4616,7 @@ "NY" = ( /obj/structure/cable/layer1, /obj/machinery/vending/coffee{ - onstation_override = 1 + all_products_free = 0 }, /obj/machinery/duct, /turf/open/floor/catwalk_floor/iron_smooth, @@ -4755,7 +4755,7 @@ "Pk" = ( /obj/structure/cable/layer1, /obj/machinery/vending/tool{ - onstation_override = 1 + all_products_free = 0 }, /obj/structure/sign/poster/contraband/donk_co/directional/west, /obj/machinery/duct, @@ -4886,7 +4886,7 @@ "QM" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/vending/sovietsoda{ - onstation_override = 1 + all_products_free = 0 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ pipe_color = "#FF7B00"; @@ -5415,7 +5415,7 @@ /obj/structure/cable/layer1, /obj/machinery/duct, /obj/machinery/vending/medical{ - onstation_override = 1; + all_products_free = 0; name = "\improper CyberMed +" }, /turf/open/floor/catwalk_floor/iron_smooth, @@ -5635,7 +5635,7 @@ /area/ruin/space/has_grav/hauntedtradingpost/office) "Ww" = ( /obj/machinery/vending/coffee{ - onstation_override = 1 + all_products_free = 0 }, /obj/structure/cable/layer1, /obj/machinery/duct, @@ -5712,7 +5712,7 @@ "Xe" = ( /obj/structure/cable/layer1, /obj/machinery/vending/cola/shamblers{ - onstation_override = 1 + all_products_free = 0 }, /obj/machinery/duct, /obj/effect/overloader_trap, @@ -5802,7 +5802,7 @@ /area/ruin/space/has_grav/hauntedtradingpost/public) "XK" = ( /obj/machinery/vending/donksnack{ - onstation_override = 1 + all_products_free = 0 }, /obj/machinery/duct, /turf/open/floor/catwalk_floor/iron_smooth, diff --git a/_maps/RandomRuins/SpaceRuins/infested_frigate.dmm b/_maps/RandomRuins/SpaceRuins/infested_frigate.dmm index abccc6b550e..c925d017ad3 100644 --- a/_maps/RandomRuins/SpaceRuins/infested_frigate.dmm +++ b/_maps/RandomRuins/SpaceRuins/infested_frigate.dmm @@ -690,7 +690,7 @@ /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/infested_frigate) "kw" = ( -/obj/machinery/vending/boozeomat/syndicate_access, +/obj/machinery/vending/boozeomat/syndicate, /turf/open/floor/iron/freezer, /area/ruin/space/has_grav/infested_frigate) "kS" = ( diff --git a/_maps/RandomRuins/SpaceRuins/interdyne.dmm b/_maps/RandomRuins/SpaceRuins/interdyne.dmm index cf8c7f8c0d4..9c802b0be43 100644 --- a/_maps/RandomRuins/SpaceRuins/interdyne.dmm +++ b/_maps/RandomRuins/SpaceRuins/interdyne.dmm @@ -140,7 +140,7 @@ /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) "fS" = ( -/obj/machinery/vending/medical/syndicate_access, +/obj/machinery/vending/medical/syndicate, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) "ga" = ( diff --git a/_maps/RandomRuins/SpaceRuins/oldstation.dmm b/_maps/RandomRuins/SpaceRuins/oldstation.dmm index 55f0f884f16..0c3c231b5f2 100644 --- a/_maps/RandomRuins/SpaceRuins/oldstation.dmm +++ b/_maps/RandomRuins/SpaceRuins/oldstation.dmm @@ -1645,9 +1645,7 @@ /area/ruin/space/ancientstation/charlie/hall) "hr" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/vending/dinnerware{ - onstation = 0 - }, +/obj/machinery/vending/dinnerware, /turf/open/floor/iron/cafeteria, /area/ruin/space/ancientstation/charlie/kitchen) "ht" = ( @@ -2368,9 +2366,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/effect/decal/cleanable/dirt, -/obj/machinery/vending/coffee{ - onstation = 0 - }, +/obj/machinery/vending/coffee, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/dorms) "ku" = ( @@ -2744,9 +2740,7 @@ /turf/open/floor/plating, /area/ruin/space/ancientstation/charlie/hall) "lU" = ( -/obj/machinery/vending/hydronutrients{ - onstation = 0 - }, +/obj/machinery/vending/hydronutrients, /obj/effect/turf_decal/tile/green/anticorner/contrasted, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/hydro) diff --git a/_maps/RandomRuins/SpaceRuins/phonebooth.dmm b/_maps/RandomRuins/SpaceRuins/phonebooth.dmm index 2eb0698ebbf..1cf0f64e7ff 100644 --- a/_maps/RandomRuins/SpaceRuins/phonebooth.dmm +++ b/_maps/RandomRuins/SpaceRuins/phonebooth.dmm @@ -13,7 +13,7 @@ /area/ruin/space/has_grav/powered/space_phone_booth) "k" = ( /obj/machinery/vending/snack/green{ - onstation_override = 1 + all_products_free = 1 }, /obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/plating/airless, @@ -66,7 +66,7 @@ /area/ruin/space/has_grav/powered/space_phone_booth) "W" = ( /obj/machinery/vending/cigarette{ - onstation_override = 1 + all_products_free = 0 }, /obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/plating/airless, diff --git a/_maps/RandomRuins/SpaceRuins/spinwardsmoothies.dmm b/_maps/RandomRuins/SpaceRuins/spinwardsmoothies.dmm index 91f7771f0ea..1ac14090b39 100644 --- a/_maps/RandomRuins/SpaceRuins/spinwardsmoothies.dmm +++ b/_maps/RandomRuins/SpaceRuins/spinwardsmoothies.dmm @@ -44,9 +44,7 @@ }, /area/ruin/space/has_grav/spinwardsmoothies) "ti" = ( -/obj/machinery/vending/boozeomat/all_access{ - onstation = 0 - }, +/obj/machinery/vending/boozeomat, /turf/open/floor/wood/tile, /area/ruin/space/has_grav/spinwardsmoothies) "wv" = ( diff --git a/_maps/RandomRuins/SpaceRuins/whiteshipruin_box.dmm b/_maps/RandomRuins/SpaceRuins/whiteshipruin_box.dmm index 602aa1a273b..12bc608bda9 100644 --- a/_maps/RandomRuins/SpaceRuins/whiteshipruin_box.dmm +++ b/_maps/RandomRuins/SpaceRuins/whiteshipruin_box.dmm @@ -1331,9 +1331,7 @@ /obj/effect/turf_decal/tile/blue/anticorner/contrasted{ dir = 8 }, -/obj/machinery/vending/medical{ - onstation = 0 - }, +/obj/machinery/vending/medical, /turf/open/floor/iron/showroomfloor/airless, /area/ruin/space/has_grav/whiteship/box) "PV" = ( diff --git a/_maps/RandomZLevels/SnowCabin.dmm b/_maps/RandomZLevels/SnowCabin.dmm index bfbc5a18c56..0c30bb3c51d 100644 --- a/_maps/RandomZLevels/SnowCabin.dmm +++ b/_maps/RandomZLevels/SnowCabin.dmm @@ -4122,7 +4122,7 @@ pixel_x = -1; pixel_y = 10 }, -/obj/item/gun/ballistic/shotgun/toy/unrestricted{ +/obj/item/gun/ballistic/shotgun/toy{ pixel_y = -2 }, /obj/effect/light_emitter{ diff --git a/_maps/RandomZLevels/TheBeach.dmm b/_maps/RandomZLevels/TheBeach.dmm index 41fcd3280d4..d179a7dc514 100644 --- a/_maps/RandomZLevels/TheBeach.dmm +++ b/_maps/RandomZLevels/TheBeach.dmm @@ -738,7 +738,7 @@ /turf/open/floor/iron/white/textured_large, /area/awaymission/beach) "jF" = ( -/obj/machinery/vending/boozeomat/all_access{ +/obj/machinery/vending/boozeomat{ desc = "A technological marvel, supposedly able to mix just the mixture you'd like to drink the moment you ask for one. May not work for bartenders that don't have Nanotrasen bank accounts." }, /turf/open/floor/wood/large, @@ -2766,7 +2766,7 @@ /turf/open/floor/iron/white/textured_large, /area/awaymission/beach) "Il" = ( -/obj/machinery/vending/autodrobe/all_access, +/obj/machinery/vending/autodrobe, /turf/open/misc/beach/sand, /area/awaymission/beach) "It" = ( diff --git a/_maps/RandomZLevels/museum.dmm b/_maps/RandomZLevels/museum.dmm index afd0cd888fd..d9c7d0aa705 100644 --- a/_maps/RandomZLevels/museum.dmm +++ b/_maps/RandomZLevels/museum.dmm @@ -1235,7 +1235,7 @@ }, /obj/item/reagent_containers/cup/glass/coffee, /obj/item/paper/fluff/scrambled_pass{ - puzzle_id = "museum_r_wing_puzzle" + puzzle_id = "museum_right_wing" }, /turf/open/floor/iron/dark, /area/awaymission/museum) @@ -2720,7 +2720,7 @@ "wi" = ( /obj/machinery/door/poddoor/shutters/indestructible{ dir = 8; - id = "museum_secret" + id = "museum_right_wing" }, /turf/open/floor/iron, /area/awaymission/museum) @@ -3128,7 +3128,7 @@ /turf/open/floor/bluespace, /area/awaymission/museum) "zC" = ( -/obj/machinery/vending/boozeomat/all_access, +/obj/machinery/vending/boozeomat, /turf/open/floor/wood/tile, /area/awaymission/museum) "zE" = ( @@ -3958,7 +3958,7 @@ /area/awaymission/museum) "FO" = ( /obj/effect/decal/cleanable/crayon/puzzle/pin{ - puzzle_id = "museum_r_wing_puzzle" + puzzle_id = "museum_right_wing" }, /turf/closed/indestructible/reinforced, /area/awaymission/museum) @@ -4152,7 +4152,7 @@ /obj/effect/turf_decal/siding/dark_blue, /obj/machinery/door/poddoor/shutters/indestructible{ dir = 8; - id = "museum_secret" + id = "museum_right_wing" }, /turf/open/floor/iron/dark, /area/awaymission/museum) @@ -4221,7 +4221,7 @@ /area/awaymission/museum) "Id" = ( /obj/effect/decal/cleanable/crayon/puzzle/pin{ - puzzle_id = "museum_r_wing_puzzle" + puzzle_id = "museum_right_wing" }, /turf/closed/indestructible/wood, /area/awaymission/museum) @@ -5246,7 +5246,7 @@ /obj/structure/fluff/fake_camera, /obj/effect/decal/puzzle_dots{ pixel_y = -32; - id = "museum_r_wing_puzzle" + id = "museum_right_wing" }, /turf/open/floor/iron/dark, /area/awaymission/museum) @@ -5332,10 +5332,10 @@ }, /obj/machinery/door/poddoor/shutters/indestructible{ dir = 8; - id = "museum_secret" + id = "museum_right_wing" }, /obj/machinery/puzzle/password/pin/directional/south{ - id = "museum_r_wing_puzzle"; + id = "museum_right_wing"; late_initialize_pop = 1 }, /turf/open/floor/iron/dark, @@ -5349,7 +5349,7 @@ /obj/machinery/light/directional/west, /obj/effect/decal/cleanable/crayon/puzzle/pin{ pixel_x = -32; - puzzle_id = "museum_r_wing_puzzle" + puzzle_id = "museum_right_wing" }, /turf/open/floor/iron/white/small, /area/awaymission/museum) @@ -34926,7 +34926,7 @@ FK FK FK FK -FO +FK FK FK FK @@ -37490,7 +37490,7 @@ GQ FK FK vb -FK +FO FK FK PP diff --git a/_maps/deathmatch/lattice_battles.dmm b/_maps/deathmatch/lattice_battles.dmm index eab56ca3064..25508fc93d4 100644 --- a/_maps/deathmatch/lattice_battles.dmm +++ b/_maps/deathmatch/lattice_battles.dmm @@ -9,30 +9,19 @@ dir = 1 }, /obj/item/clothing/head/cone, -/obj/effect/playeronly_barrier, +/obj/effect/invisible_wall, /turf/open/misc/asteroid/moon, /area/deathmatch/fullbright) "cN" = ( /obj/structure/railing/unbreakable{ dir = 8 }, -/obj/effect/playeronly_barrier, +/obj/effect/invisible_wall, /turf/open/misc/asteroid/moon, /area/deathmatch/fullbright) -"df" = ( -/obj/structure/lattice/catwalk, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/chasm, -/area/deathmatch/fullbright) "dM" = ( /turf/open/chasm, /area/deathmatch/fullbright) -"eK" = ( -/obj/structure/lattice/catwalk, -/obj/effect/landmark/deathmatch_player_spawn, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/chasm, -/area/deathmatch/fullbright) "gz" = ( /obj/structure/flora/rock/pile/style_random, /turf/open/misc/asteroid/moon, @@ -45,12 +34,12 @@ dir = 1 }, /obj/structure/flora/lunar_plant/style_1, -/obj/effect/playeronly_barrier, +/obj/effect/invisible_wall, /turf/open/misc/asteroid/moon, /area/deathmatch/fullbright) "ho" = ( /obj/structure/flora/lunar_plant/style_1, -/obj/effect/playeronly_barrier, +/obj/effect/invisible_wall, /obj/structure/railing/unbreakable{ dir = 6 }, @@ -62,7 +51,7 @@ }, /obj/structure/flora/rock/pile/style_random, /obj/structure/flora/lunar_plant/style_3, -/obj/effect/playeronly_barrier, +/obj/effect/invisible_wall, /turf/open/misc/asteroid/moon, /area/deathmatch/fullbright) "jb" = ( @@ -75,7 +64,7 @@ }, /obj/structure/flora/rock/pile/style_random, /obj/structure/flora/lunar_plant/style_3, -/obj/effect/playeronly_barrier, +/obj/effect/invisible_wall, /turf/open/misc/asteroid/moon, /area/deathmatch/fullbright) "rE" = ( @@ -96,12 +85,12 @@ /obj/structure/railing/unbreakable{ dir = 4 }, -/obj/effect/playeronly_barrier, +/obj/effect/invisible_wall, /turf/open/misc/asteroid/moon, /area/deathmatch/fullbright) "tL" = ( /obj/structure/railing/unbreakable, -/obj/effect/playeronly_barrier, +/obj/effect/invisible_wall, /turf/open/misc/asteroid/moon, /area/deathmatch/fullbright) "uJ" = ( @@ -109,7 +98,7 @@ dir = 4 }, /obj/item/clothing/head/cone, -/obj/effect/playeronly_barrier, +/obj/effect/invisible_wall, /turf/open/misc/asteroid/moon, /area/deathmatch/fullbright) "uO" = ( @@ -139,7 +128,7 @@ dir = 8 }, /obj/structure/flora/lunar_plant/style_1, -/obj/effect/playeronly_barrier, +/obj/effect/invisible_wall, /turf/open/misc/asteroid/moon, /area/deathmatch/fullbright) "AS" = ( @@ -150,7 +139,7 @@ /obj/structure/railing/unbreakable{ dir = 1 }, -/obj/effect/playeronly_barrier, +/obj/effect/invisible_wall, /turf/open/misc/asteroid/moon, /area/deathmatch/fullbright) "Cf" = ( @@ -190,7 +179,7 @@ dir = 10 }, /obj/structure/flora/lunar_plant/style_1, -/obj/effect/playeronly_barrier, +/obj/effect/invisible_wall, /turf/open/misc/asteroid/moon, /area/deathmatch/fullbright) "KO" = ( @@ -199,7 +188,7 @@ /area/deathmatch/fullbright) "LN" = ( /obj/structure/railing/corner, -/obj/effect/playeronly_barrier, +/obj/effect/invisible_wall, /turf/open/misc/asteroid/moon, /area/deathmatch/fullbright) "MF" = ( @@ -217,12 +206,11 @@ /area/deathmatch/fullbright) "NA" = ( /obj/structure/flora/lunar_plant/style_2, -/obj/effect/playeronly_barrier, +/obj/effect/invisible_wall, /turf/open/misc/asteroid/moon, /area/deathmatch/fullbright) "NG" = ( /obj/structure/lattice/catwalk, -/obj/effect/decal/cleanable/dirt/dust, /obj/structure/closet/crate/cardboard, /obj/item/statuebust, /turf/open/chasm, @@ -233,7 +221,7 @@ /turf/open/chasm, /area/deathmatch/fullbright) "NY" = ( -/obj/effect/playeronly_barrier, +/obj/effect/invisible_wall, /obj/structure/railing/unbreakable, /turf/open/misc/asteroid/moon, /area/deathmatch/fullbright) @@ -245,21 +233,15 @@ /mob/living/basic/spider/giant/nurse/away_caves, /turf/open/misc/asteroid/moon, /area/deathmatch/fullbright) -"Sv" = ( -/obj/structure/lattice/catwalk, -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/decal/cleanable/rubble, -/turf/open/chasm, -/area/deathmatch/fullbright) "SL" = ( /obj/structure/flora/rock/pile/style_random, /obj/structure/flora/lunar_plant/style_3, -/obj/effect/playeronly_barrier, +/obj/effect/invisible_wall, /turf/open/misc/asteroid/moon, /area/deathmatch/fullbright) "Uy" = ( /obj/item/clothing/head/cone, -/obj/effect/playeronly_barrier, +/obj/effect/invisible_wall, /obj/structure/railing/corner/unbreakable{ dir = 1 }, @@ -270,7 +252,7 @@ dir = 9 }, /obj/structure/flora/rock/style_random, -/obj/effect/playeronly_barrier, +/obj/effect/invisible_wall, /turf/open/misc/asteroid/moon, /area/deathmatch/fullbright) "Xf" = ( @@ -285,7 +267,7 @@ /area/deathmatch/fullbright) "Xo" = ( /obj/structure/flora/rock/style_random, -/obj/effect/playeronly_barrier, +/obj/effect/invisible_wall, /turf/open/misc/asteroid/moon, /area/deathmatch/fullbright) "Yu" = ( @@ -294,11 +276,11 @@ dir = 6 }, /obj/structure/flora/lunar_plant/style_3, -/obj/effect/playeronly_barrier, +/obj/effect/invisible_wall, /turf/open/misc/asteroid/moon, /area/deathmatch/fullbright) "YH" = ( -/obj/effect/playeronly_barrier, +/obj/effect/invisible_wall, /turf/open/misc/asteroid/moon, /area/deathmatch/fullbright) "YV" = ( @@ -466,9 +448,9 @@ MF MF MF vk -df vk -df +vk +vk vk MF dM @@ -571,12 +553,12 @@ vk MF MF vk -df -Sv +vk +NI vk MF vk -df +vk MF vk vk @@ -595,7 +577,7 @@ CI tL MF vk -df +vk MF MF vk @@ -603,10 +585,10 @@ vk MF MF vk -df vk vk -df +vk +vk vk hH gN @@ -633,7 +615,7 @@ vk vk vk vk -df +vk NG gN gN @@ -649,7 +631,7 @@ gN Yu MF MF -eK +wb vk vk vk @@ -703,7 +685,7 @@ gN gN gN bm -df +vk vk vk vk @@ -738,7 +720,7 @@ MF vk vk vk -df +vk MF vk vk @@ -795,7 +777,7 @@ vk vk vk vk -df +vk gN gN gN diff --git a/_maps/deathmatch/ragin_mages.dmm b/_maps/deathmatch/ragin_mages.dmm index 1a3d307181d..96249fcf692 100644 --- a/_maps/deathmatch/ragin_mages.dmm +++ b/_maps/deathmatch/ragin_mages.dmm @@ -479,9 +479,6 @@ /turf/open/floor/engine/cult, /area/deathmatch) "DK" = ( -/obj/structure/railing{ - dir = 8 - }, /obj/structure/railing{ dir = 8 }, diff --git a/_maps/deathmatch/ragnarok.dmm b/_maps/deathmatch/ragnarok.dmm index 328055398e7..89273eb45ad 100644 --- a/_maps/deathmatch/ragnarok.dmm +++ b/_maps/deathmatch/ragnarok.dmm @@ -7,13 +7,17 @@ /obj/structure/flora/rock/pile/jungle/style_random, /turf/open/misc/asteroid/moon, /area/deathmatch) +"aR" = ( +/obj/structure/bonfire/dense/prelit, +/turf/open/misc/grass/jungle, +/area/deathmatch) "bb" = ( /obj/structure/flora/coconuts, /turf/open/misc/dirt/jungle, /area/deathmatch) "bj" = ( /obj/effect/turf_decal/siding/wood/corner, -/obj/structure/bonfire/prelit, +/obj/structure/bonfire/dense/prelit, /turf/open/floor/wood/large, /area/deathmatch) "bn" = ( @@ -24,7 +28,7 @@ dir = 4 }, /obj/effect/turf_decal/siding/wood, -/turf/open/water/jungle, +/turf/open/misc/dirt/jungle, /area/deathmatch) "bI" = ( /turf/open/misc/asteroid/moon, @@ -122,7 +126,7 @@ /obj/effect/turf_decal/siding/wood{ dir = 1 }, -/turf/open/water/jungle, +/turf/open/misc/dirt/jungle, /area/deathmatch) "fO" = ( /obj/effect/decal/cleanable/dirt/dust, @@ -224,7 +228,7 @@ /obj/effect/turf_decal/weather/dirt{ dir = 6 }, -/turf/open/water/jungle, +/turf/open/misc/dirt/jungle, /area/deathmatch) "jv" = ( /obj/structure/flora/grass/jungle/b/style_random, @@ -263,7 +267,7 @@ /area/deathmatch) "lr" = ( /obj/effect/turf_decal/siding/wood, -/obj/structure/bonfire/prelit, +/obj/structure/bonfire/dense/prelit, /turf/open/floor/wood/large, /area/deathmatch) "lx" = ( @@ -321,7 +325,7 @@ /obj/effect/turf_decal/weather/dirt{ dir = 8 }, -/turf/open/water/jungle, +/turf/open/misc/dirt/jungle, /area/deathmatch) "ox" = ( /obj/effect/cosmic_rune, @@ -344,7 +348,7 @@ /obj/effect/turf_decal/weather/dirt{ dir = 6 }, -/turf/open/water/jungle, +/turf/open/misc/dirt/jungle, /area/deathmatch) "pr" = ( /obj/structure/flora/bush/jungle/a/style_random, @@ -426,7 +430,7 @@ /obj/effect/turf_decal/weather/dirt{ dir = 4 }, -/turf/open/water/jungle, +/turf/open/misc/dirt/jungle, /area/deathmatch) "rH" = ( /obj/effect/turf_decal/siding/wood{ @@ -522,6 +526,12 @@ /obj/effect/turf_decal/siding/wood/corner, /turf/open/floor/wood/large, /area/deathmatch) +"wJ" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 5 + }, +/turf/open/misc/dirt/jungle, +/area/deathmatch) "wP" = ( /obj/structure/flora/rock/style_random, /obj/effect/turf_decal/weather/dirt{ @@ -564,6 +574,11 @@ /obj/effect/spawner/random/decoration/glowstick/on, /turf/open/floor/plating/heretic_rust, /area/deathmatch) +"yZ" = ( +/obj/structure/flora/grass/jungle/b/style_random, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/misc/dirt/jungle, +/area/deathmatch) "zo" = ( /obj/structure/flora/rock/pile/jungle/style_random, /obj/effect/landmark/deathmatch_player_spawn, @@ -616,8 +631,10 @@ /turf/open/floor/wood/tile, /area/deathmatch) "AO" = ( -/obj/effect/decal/cleanable/ants, -/turf/closed/wall/heretic_rust, +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/turf/open/misc/dirt/jungle, /area/deathmatch) "Ba" = ( /obj/structure/destructible/cult/pylon, @@ -648,7 +665,7 @@ /obj/effect/turf_decal/weather/dirt{ dir = 6 }, -/turf/open/water/jungle, +/turf/open/misc/dirt/jungle, /area/deathmatch) "CB" = ( /obj/structure/destructible/eldritch_crucible, @@ -664,7 +681,7 @@ /obj/effect/turf_decal/weather/dirt{ dir = 8 }, -/turf/open/water/jungle, +/turf/open/misc/dirt/jungle, /area/deathmatch) "CR" = ( /mob/living/carbon/human/species/monkey, @@ -681,14 +698,14 @@ /obj/effect/turf_decal/weather/dirt{ dir = 9 }, -/turf/open/water/jungle, +/turf/open/misc/dirt/jungle, /area/deathmatch) "Ds" = ( /obj/effect/turf_decal/weather/dirt{ dir = 8 }, /obj/effect/turf_decal/siding/wood, -/turf/open/water/jungle, +/turf/open/misc/dirt/jungle, /area/deathmatch) "Du" = ( /obj/structure/flora/rock/pile/style_random, @@ -705,7 +722,13 @@ /obj/effect/turf_decal/weather/dirt{ dir = 6 }, -/turf/open/water/jungle, +/turf/open/misc/dirt/jungle, +/area/deathmatch) +"Ed" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/turf/open/misc/dirt/jungle, /area/deathmatch) "EF" = ( /obj/effect/decal/cleanable/dirt, @@ -731,7 +754,6 @@ /area/deathmatch) "FQ" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/ants, /turf/open/misc/grass/jungle, /area/deathmatch) "FS" = ( @@ -785,7 +807,9 @@ /turf/open/floor/cult, /area/deathmatch) "Ic" = ( -/obj/effect/decal/cleanable/ants, +/obj/effect/turf_decal/weather/dirt{ + dir = 9 + }, /turf/open/misc/dirt/jungle, /area/deathmatch) "Ig" = ( @@ -827,7 +851,8 @@ /turf/open/misc/grass/jungle, /area/deathmatch) "Kg" = ( -/turf/open/water/jungle, +/obj/structure/flora/rock/style_4, +/turf/open/misc/dirt/jungle, /area/deathmatch) "Kl" = ( /obj/effect/spawner/structure/window/bronze, @@ -855,6 +880,15 @@ /obj/structure/flora/grass/jungle/a/style_random, /turf/open/misc/grass/jungle, /area/deathmatch) +"LW" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 6 + }, +/turf/open/water/jungle, +/area/deathmatch) "My" = ( /obj/structure/table/wood, /obj/item/food/grown/holymelon, @@ -883,7 +917,8 @@ /obj/effect/turf_decal/siding/wood{ dir = 1 }, -/turf/open/water/jungle, +/obj/structure/flora/rock/style_4, +/turf/open/misc/dirt/jungle, /area/deathmatch) "Or" = ( /obj/structure/flora/tree/jungle/style_random, @@ -899,12 +934,18 @@ dir = 6 }, /obj/effect/turf_decal/siding/wood, -/turf/open/water/jungle, +/turf/open/misc/dirt/jungle, /area/deathmatch) "Px" = ( /obj/structure/flora/tree/jungle/style_random, /turf/open/misc/grass/jungle, /area/deathmatch) +"PC" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 10 + }, +/turf/open/misc/dirt/jungle, +/area/deathmatch) "PH" = ( /obj/effect/visible_heretic_influence, /turf/open/misc/dirt/jungle, @@ -940,10 +981,6 @@ /obj/effect/forcefield/cult/permanent, /turf/open/misc/dirt/jungle/dark, /area/deathmatch) -"RE" = ( -/obj/structure/bonfire/prelit, -/turf/open/misc/grass/jungle, -/area/deathmatch) "RL" = ( /obj/effect/turf_decal/siding/wood, /obj/structure/flora/rock/pile/jungle/style_random, @@ -1057,7 +1094,7 @@ /obj/effect/turf_decal/siding/wood{ dir = 1 }, -/turf/open/water/jungle, +/turf/open/misc/dirt/jungle, /area/deathmatch) "VF" = ( /obj/effect/turf_decal/siding/wood{ @@ -1098,6 +1135,15 @@ /obj/structure/flora/grass/jungle/b/style_random, /turf/open/misc/dirt/jungle/dark, /area/deathmatch) +"Ww" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 10 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 6 + }, +/turf/open/water/jungle, +/area/deathmatch) "Xa" = ( /obj/structure/rack/skeletal, /obj/item/clothing/head/helmet/chaplain/ancient{ @@ -1114,8 +1160,13 @@ /turf/closed/wall/mineral/cult/artificer, /area/deathmatch) "Yn" = ( -/obj/effect/decal/cleanable/ants, -/turf/open/misc/grass/jungle, +/obj/effect/turf_decal/weather/dirt{ + dir = 9 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 6 + }, +/turf/open/water/jungle, /area/deathmatch) "Ys" = ( /obj/effect/turf_decal/siding/wood{ @@ -1193,7 +1244,7 @@ /turf/open/misc/grass/jungle, /area/deathmatch) "ZY" = ( -/obj/structure/bonfire/prelit, +/obj/structure/bonfire/dense/prelit, /turf/open/misc/dirt/jungle, /area/deathmatch) @@ -1362,7 +1413,7 @@ jL jv CR LU -Yn +qa Sw Sw yY @@ -1464,7 +1515,7 @@ eL Be XL VP -AO +SC tm qa vI @@ -1515,7 +1566,7 @@ GD qa LU Fn -qa +aR Sw Sw oC @@ -1528,7 +1579,7 @@ dI lx PI Vm -iJ +Ic TN qh FK @@ -1543,7 +1594,7 @@ Ig Ig wR ZY -Ic +FK FK FK sC @@ -1561,8 +1612,8 @@ PI NX NQ NQ -NQ -TN +Ed +AO CE DA Ig @@ -1576,7 +1627,7 @@ iJ TN TN TN -qh +Ww FK FK FK @@ -1586,16 +1637,16 @@ eB SC FK sC -iJ +Ic Ds PI Bp FK FK wR -SE +wJ FK -sC +yZ Ig Ig Ig @@ -1606,18 +1657,18 @@ Ig SE NQ NQ -NQ +LW Kg -TN -qh +AO +PC FK FK -iJ -qh +Yn +PC RL PI Do -Kg +FK Pi PI gx @@ -1638,24 +1689,24 @@ sC sC FK bb -SE -NQ +wJ +Ed bv PI ou -NQ -Kg +Ed +FK Ds ft Vv oO FK -ZY -qa +FK +aR GD qa jv -Yn +qa GD RW jL @@ -1675,7 +1726,7 @@ RL PI Bp bb -SE +wJ rD YI jb @@ -1770,7 +1821,7 @@ QO Jf Yv qa -RE +aR Ov qg qg @@ -1954,7 +2005,7 @@ YN Wp qa qa -Yn +qa qa qa qa @@ -1982,7 +2033,7 @@ KL Nf Sf Jf -RE +aR Px Ik GO diff --git a/_maps/map_files/Basketball/stadium.dmm b/_maps/map_files/Basketball/stadium.dmm index bcbb91ce4b7..c6b69016725 100644 --- a/_maps/map_files/Basketball/stadium.dmm +++ b/_maps/map_files/Basketball/stadium.dmm @@ -405,7 +405,7 @@ /turf/open/floor/wood, /area/centcom/basketball) "Ax" = ( -/obj/machinery/vending/boozeomat/all_access, +/obj/machinery/vending/boozeomat, /turf/open/floor/wood, /area/centcom/basketball) "AC" = ( diff --git a/_maps/map_files/Birdshot/birdshot.dmm b/_maps/map_files/Birdshot/birdshot.dmm index 09040a5d903..06be9312ae9 100644 --- a/_maps/map_files/Birdshot/birdshot.dmm +++ b/_maps/map_files/Birdshot/birdshot.dmm @@ -1680,17 +1680,17 @@ "aGI" = ( /obj/structure/table, /obj/effect/decal/cleanable/dirt, -/obj/item/trash/can/food/pine_nuts{ - pixel_x = 16; - pixel_y = 6 - }, /obj/machinery/cell_charger{ pixel_x = -1; - pixel_y = 2 + pixel_y = 4 }, /obj/item/stock_parts/power_store/cell/high{ pixel_x = -1; - pixel_y = 1 + pixel_y = 4 + }, +/obj/item/assembly/timer{ + pixel_x = 14; + pixel_y = 6 }, /turf/open/floor/iron/dark, /area/station/commons/storage/tools) @@ -1759,12 +1759,15 @@ /area/station/maintenance/department/engine/atmos) "aIr" = ( /obj/structure/table/reinforced, -/obj/machinery/door/window/right/directional/south, /obj/machinery/door/poddoor/shutters/preopen{ id = "kitchenshutters"; name = "Kitchen Shutters" }, -/turf/open/floor/iron/kitchen/small, +/obj/effect/turf_decal/siding/end{ + dir = 8 + }, +/obj/machinery/door/window/left/directional/south, +/turf/open/floor/iron/dark/textured_large, /area/station/service/kitchen) "aIu" = ( /obj/structure/bookcase/random/reference, @@ -8780,6 +8783,7 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/light_switch/directional/west, /obj/effect/landmark/event_spawn, +/obj/machinery/portable_atmospherics/pump/lil_pump, /turf/open/floor/iron/dark, /area/station/science/ordnance) "dpH" = ( @@ -11105,9 +11109,11 @@ }, /obj/machinery/door/poddoor/shutters/preopen{ id = "kitchenshutters"; - name = "Kitchen Shutters" + name = "Kitchen Shutters"; + dir = 4 }, -/turf/open/floor/plating, +/obj/effect/turf_decal/siding/end, +/turf/open/floor/iron/dark/textured_large, /area/station/service/kitchen) "elc" = ( /obj/structure/cable, @@ -14993,9 +14999,13 @@ /obj/machinery/smartfridge, /obj/machinery/door/poddoor/shutters/preopen{ id = "kitchenshutters"; - name = "Kitchen Shutters" + name = "Kitchen Shutters"; + dir = 4 }, -/turf/open/floor/iron/kitchen/small, +/obj/effect/turf_decal/siding/end{ + dir = 1 + }, +/turf/open/floor/iron/dark/textured_large, /area/station/service/kitchen) "fGT" = ( /obj/effect/turf_decal/tile/neutral{ @@ -18623,6 +18633,7 @@ /obj/structure/window/spawner/directional/east, /obj/structure/closet/crate, /obj/effect/turf_decal/bot_white, +/obj/item/clothing/gloves/color/fyellow, /obj/item/stack/package_wrap{ pixel_y = 5 }, @@ -18633,6 +18644,12 @@ desc = "It smells of monkey business..."; name = "Empty Gorillacube Box" }, +/obj/item/weldingtool, +/obj/item/radio{ + pixel_y = 3; + pixel_x = -6 + }, +/obj/item/assembly/signaler, /turf/open/floor/iron/smooth, /area/station/commons/storage/tools) "gRm" = ( @@ -19580,17 +19597,11 @@ /area/station/commons/storage/tools) "hgd" = ( /obj/structure/table, -/obj/item/clothing/head/collectable/paper{ - pixel_x = -6; - pixel_y = -2 +/obj/item/screwdriver{ + pixel_y = -6 }, -/obj/item/paper/crumpled{ - pixel_x = 5; - pixel_y = 8 - }, -/obj/item/trash/candle{ - pixel_x = 7; - pixel_y = 1 +/obj/item/storage/toolbox/mechanical{ + pixel_y = 7 }, /turf/open/floor/iron/dark, /area/station/commons/storage/tools) @@ -19953,6 +19964,10 @@ pixel_x = 5; pixel_y = 3 }, +/obj/item/gps{ + pixel_y = 5; + pixel_x = 13 + }, /obj/item/storage/toolbox/emergency/old, /turf/open/floor/iron/dark, /area/station/commons/storage/tools) @@ -20005,21 +20020,20 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/table, /obj/effect/decal/cleanable/dirt, -/obj/item/storage/toolbox/mechanical/old{ - pixel_x = 15; - pixel_y = 15 - }, /obj/item/crowbar/large{ pixel_y = 18 }, /obj/item/clothing/head/costume/pirate{ - pixel_x = 17; - pixel_y = -10 + pixel_x = 15; + pixel_y = -3 }, /obj/item/clothing/suit/hazardvest{ pixel_x = -3; pixel_y = -2 }, +/obj/item/wrench{ + pixel_y = 15 + }, /turf/open/floor/iron/dark, /area/station/commons/storage/tools) "hnf" = ( @@ -20217,9 +20231,11 @@ /obj/machinery/door/window/right/directional/west, /obj/machinery/door/poddoor/shutters/preopen{ id = "kitchenshutters"; - name = "Kitchen Shutters" + name = "Kitchen Shutters"; + dir = 8 }, -/turf/open/floor/iron, +/obj/effect/turf_decal/siding/end, +/turf/open/floor/iron/dark/textured_large, /area/station/service/kitchen) "hrx" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -20399,6 +20415,7 @@ }, /obj/effect/turf_decal/delivery/white, /obj/structure/rack, +/obj/item/hand_labeler, /obj/item/stack/cable_coil/five, /obj/item/pickaxe, /obj/item/wrench, @@ -34445,6 +34462,10 @@ "lNN" = ( /obj/structure/table, /obj/item/toy/foamblade, +/obj/item/analyzer{ + pixel_y = 8; + pixel_x = -9 + }, /turf/open/floor/iron/dark/small, /area/station/commons/fitness/locker_room) "lNQ" = ( @@ -34861,6 +34882,7 @@ dir = 1 }, /obj/effect/landmark/start/atmospheric_technician, +/obj/structure/cable, /turf/open/floor/wood, /area/station/engineering/break_room) "lVy" = ( @@ -35175,6 +35197,18 @@ }, /turf/open/floor/plating, /area/station/maintenance/department/engine/atmos) +"lZs" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/right/directional/south, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "kitchenshutters"; + name = "Kitchen Shutters" + }, +/obj/effect/turf_decal/siding/end{ + dir = 4 + }, +/turf/open/floor/iron/dark/textured_large, +/area/station/service/kitchen) "lZt" = ( /obj/machinery/portable_atmospherics/canister/air, /turf/open/floor/plating, @@ -35237,13 +35271,13 @@ /area/station/hallway/secondary/dock) "lZP" = ( /obj/structure/table, -/obj/item/clothing/head/fedora/det_hat/minor{ - pixel_x = 7; - pixel_y = 9 - }, /obj/item/toy/eightball{ pixel_x = -4 }, +/obj/item/wirecutters{ + pixel_y = 17; + pixel_x = 4 + }, /turf/open/floor/iron/dark/small, /area/station/commons/fitness/locker_room) "lZR" = ( @@ -36170,7 +36204,9 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/table, -/obj/item/folder/red, +/obj/item/folder/red{ + pixel_y = 3 + }, /obj/item/food/monkeycube/bee{ name = "monkey cube"; pixel_y = 17 @@ -36181,6 +36217,9 @@ name = "monkey cube"; desc = "A new Nanotrasen classic, the monkey cube. Tastes like everything!" }, +/obj/item/wirecutters{ + pixel_y = 6 + }, /turf/open/floor/iron/dark, /area/station/commons/storage/tools) "msg" = ( @@ -36584,6 +36623,10 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) +"mzv" = ( +/obj/docking_port/stationary/syndicate/northeast, +/turf/open/space/basic, +/area/space) "mzx" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -39820,6 +39863,7 @@ pixel_x = 15; pixel_y = 7 }, +/obj/structure/cable, /turf/open/floor/wood, /area/station/engineering/break_room) "nHu" = ( @@ -40240,9 +40284,16 @@ }, /obj/machinery/door/poddoor/shutters/preopen{ id = "kitchenshutters"; - name = "Kitchen Shutters" + name = "Kitchen Shutters"; + dir = 4 }, -/turf/open/floor/plating, +/obj/effect/turf_decal/siding{ + dir = 4 + }, +/obj/effect/turf_decal/siding{ + dir = 8 + }, +/turf/open/floor/iron/dark/textured_large, /area/station/service/kitchen) "nQa" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -40324,6 +40375,7 @@ }, /obj/machinery/holopad, /obj/effect/decal/cleanable/dirt/dust, +/obj/structure/cable, /turf/open/floor/iron/small, /area/station/engineering/break_room) "nQH" = ( @@ -46988,6 +47040,7 @@ }, /obj/item/kirbyplants/random, /obj/machinery/firealarm/directional/south, +/obj/item/storage/belt/utility, /turf/open/floor/iron/smooth, /area/station/commons/storage/tools) "qhh" = ( @@ -47783,6 +47836,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/structure/cable, /turf/open/floor/plating/elevatorshaft, /area/station/engineering/break_room) "qxN" = ( @@ -51211,6 +51265,7 @@ pixel_y = 6 }, /obj/structure/disposalpipe/segment, +/obj/structure/cable, /turf/open/floor/wood, /area/station/engineering/break_room) "rDj" = ( @@ -52253,12 +52308,19 @@ /obj/machinery/door/firedoor/border_only{ dir = 4 }, +/obj/effect/spawner/random/food_or_drink/condiment, /obj/machinery/door/poddoor/shutters/preopen{ id = "kitchenshutters"; - name = "Kitchen Shutters" + name = "Kitchen Shutters"; + dir = 4 }, -/obj/effect/spawner/random/food_or_drink/condiment, -/turf/open/floor/plating, +/obj/effect/turf_decal/siding{ + dir = 4 + }, +/obj/effect/turf_decal/siding{ + dir = 8 + }, +/turf/open/floor/iron/dark/textured_large, /area/station/service/kitchen) "rVy" = ( /obj/effect/turf_decal/stripes/red/line{ @@ -55501,12 +55563,19 @@ /obj/machinery/door/firedoor/border_only{ dir = 4 }, +/obj/effect/spawner/random/food_or_drink/donuts, /obj/machinery/door/poddoor/shutters/preopen{ id = "kitchenshutters"; - name = "Kitchen Shutters" + name = "Kitchen Shutters"; + dir = 4 }, -/obj/effect/spawner/random/food_or_drink/donuts, -/turf/open/floor/plating, +/obj/effect/turf_decal/siding{ + dir = 4 + }, +/obj/effect/turf_decal/siding{ + dir = 8 + }, +/turf/open/floor/iron/dark/textured_large, /area/station/service/kitchen) "sZo" = ( /obj/effect/turf_decal/siding/thinplating_new/light{ @@ -59045,6 +59114,13 @@ }, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/rd) +"ugt" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/iron/small, +/area/station/engineering/break_room) "ugA" = ( /obj/effect/turf_decal/siding/yellow{ dir = 1 @@ -63695,6 +63771,7 @@ "vDS" = ( /obj/structure/closet/secure_closet/engineering_personal, /obj/item/clothing/suit/hooded/wintercoat/engineering, +/obj/structure/cable, /turf/open/floor/iron/small, /area/station/engineering/break_room) "vDV" = ( @@ -65710,6 +65787,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/structure/cable, /turf/open/floor/iron/smooth_large, /area/station/engineering/supermatter/room) "wjG" = ( @@ -67671,6 +67749,20 @@ /obj/effect/decal/cleanable/molten_object, /obj/effect/landmark/event_spawn, /obj/structure/table, +/obj/item/reagent_containers/cup/bottle/welding_fuel{ + pixel_y = -3; + pixel_x = 13 + }, +/obj/item/stack/sheet/iron/ten{ + pixel_y = -6; + pixel_x = -2 + }, +/obj/item/hand_labeler{ + pixel_y = -15 + }, +/obj/item/reagent_containers/cup/watering_can{ + pixel_y = 12 + }, /turf/open/floor/iron/dark, /area/station/commons/storage/tools) "wPd" = ( @@ -70031,6 +70123,7 @@ /area/station/maintenance/starboard/central) "xwn" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible, +/obj/machinery/portable_atmospherics/pump, /turf/open/floor/iron/dark, /area/station/science/ordnance) "xwr" = ( @@ -72485,7 +72578,7 @@ /turf/closed/wall, /area/station/medical/surgery/theatre) "yfF" = ( -/obj/machinery/vending/autodrobe/all_access, +/obj/machinery/vending/autodrobe, /obj/effect/turf_decal/siding/wideplating/dark{ dir = 8 }, @@ -88358,9 +88451,9 @@ kMe kMe nDJ lWV -mWB +cYt wjw -kMe +gAV tDu ccA oPa @@ -90934,9 +91027,9 @@ awH gAV qkq wRy -ayK +urz vDS -aWA +ugt lVv nHq exQ @@ -98462,7 +98555,7 @@ sJL sne aTg aTg -aIr +lZs bIN nUd bmY @@ -118682,7 +118775,7 @@ dDB dDB dDB dDB -dDB +mzv dDB dDB dDB diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 39d7cd24bdd..da57feb2781 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -2842,6 +2842,9 @@ /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/landmark/event_spawn, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/floor/iron/dark, /area/station/service/library/printer) "aII" = ( @@ -3233,15 +3236,15 @@ /area/station/ai_monitored/command/storage/eva) "aNM" = ( /obj/structure/cable, -/obj/structure/disposalpipe/junction{ - dir = 4 - }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, /obj/effect/decal/cleanable/dirt, /obj/machinery/duct, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, /turf/open/floor/iron, /area/station/maintenance/department/chapel) "aNP" = ( @@ -12209,9 +12212,6 @@ "cXb" = ( /obj/structure/cable, /obj/effect/turf_decal/delivery, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/duct, /obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ @@ -16925,9 +16925,6 @@ /turf/open/floor/plating, /area/station/cargo/storage) "ehg" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, /obj/machinery/newscaster/directional/west, /obj/structure/table/wood, /obj/item/clipboard, @@ -30878,7 +30875,6 @@ /turf/open/misc/sandy_dirt, /area/station/security/prison/garden) "hHo" = ( -/obj/structure/disposalpipe/trunk, /obj/machinery/chem_heater/withbuffer, /obj/effect/turf_decal/bot_red, /obj/effect/turf_decal/stripes/line{ @@ -32868,9 +32864,6 @@ "ifr" = ( /obj/structure/cable, /obj/effect/turf_decal/delivery, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/duct, /obj/effect/turf_decal/tile/neutral/half/contrasted{ @@ -33704,9 +33697,6 @@ /area/station/hallway/primary/central/fore) "irx" = ( /obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, /obj/machinery/duct, @@ -39806,7 +39796,7 @@ /area/station/tcommsat/server) "jQx" = ( /obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/machinery/vending/autodrobe/all_access, +/obj/machinery/vending/autodrobe, /turf/open/floor/plating, /area/station/maintenance/fore) "jQB" = ( @@ -42974,6 +42964,9 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/floor/iron/dark, /area/station/service/library/printer) "kHp" = ( @@ -44585,13 +44578,13 @@ /turf/open/floor/iron, /area/station/engineering/atmos) "ldl" = ( -/obj/structure/disposalpipe/segment, /obj/machinery/disposal/bin, /obj/effect/turf_decal/bot, /obj/effect/turf_decal/stripes/line{ dir = 6 }, /obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/structure/disposalpipe/trunk, /turf/open/floor/iron/dark, /area/station/medical/pharmacy) "ldm" = ( @@ -45387,9 +45380,6 @@ /area/station/engineering/atmos/storage/gas) "lni" = ( /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/landmark/generic_maintenance_landmark, @@ -46664,6 +46654,9 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/floor/iron/dark, /area/station/service/library/printer) "lDV" = ( @@ -47502,7 +47495,7 @@ /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) "lMF" = ( -/obj/machinery/vending/autodrobe/all_access, +/obj/machinery/vending/autodrobe, /obj/effect/turf_decal/siding/dark_blue{ dir = 8 }, @@ -52931,9 +52924,6 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, /obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 4 }, @@ -56033,9 +56023,6 @@ /obj/structure/sign/painting/library_private{ pixel_y = -32 }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, /obj/machinery/modular_computer/preset/curator{ dir = 1 }, @@ -64198,6 +64185,9 @@ dir = 8 }, /obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/floor/iron/dark, /area/station/service/library/printer) "qaF" = ( @@ -66387,9 +66377,6 @@ /turf/open/floor/iron/white, /area/station/medical/medbay) "qEj" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, /obj/machinery/light/small/directional/south, /obj/structure/table/wood, /obj/item/paper_bin{ @@ -67689,7 +67676,7 @@ "qVn" = ( /obj/machinery/light/small/directional/south, /obj/effect/decal/cleanable/dirt, -/obj/machinery/vending/boozeomat/all_access, +/obj/machinery/vending/boozeomat, /obj/structure/sign/poster/contraband/random/directional/south, /turf/open/floor/plating, /area/station/service/abandoned_gambling_den) @@ -72153,13 +72140,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/service/theater/abandoned) -"rZL" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/grille, -/turf/closed/wall/r_wall, -/area/station/engineering/atmos) "rZU" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -80582,9 +80562,6 @@ /area/station/commons/toilet/locker) "ufz" = ( /obj/machinery/firealarm/directional/south, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, /obj/effect/turf_decal/bot_white, /obj/structure/filingcabinet, /turf/open/floor/iron/dark, @@ -89971,8 +89948,10 @@ "wwN" = ( /obj/machinery/power/apc/auto_name/directional/east, /obj/structure/cable, -/obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, /turf/open/floor/iron/dark, /area/station/service/library/printer) "wwP" = ( @@ -90329,9 +90308,6 @@ /turf/open/floor/plating, /area/station/maintenance/starboard/aft) "wAZ" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, /obj/structure/table/wood, /obj/item/taperecorder, /obj/item/camera, @@ -96090,9 +96066,6 @@ dir = 4 }, /obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/duct, @@ -117147,7 +117120,7 @@ pxN yfC pxN pxN -rZL +pxN pxN pxN qYo diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm index 89ce21b7019..ce8f714c0e4 100644 --- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm +++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm @@ -2371,12 +2371,6 @@ /obj/structure/fluff/shower_drain, /turf/open/floor/iron/freezer, /area/station/commons/toilet) -"aJj" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/closed/wall, -/area/station/service/library) "aJm" = ( /obj/structure/cable, /obj/machinery/door/window/left/directional/east{ @@ -21813,7 +21807,7 @@ /turf/open/floor/plating, /area/station/engineering/lobby) "gkN" = ( -/obj/machinery/vending/autodrobe/all_access, +/obj/machinery/vending/autodrobe, /turf/open/floor/iron/dark/textured, /area/station/security/prison) "gkP" = ( @@ -25804,7 +25798,7 @@ "hul" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/status_display/evac/directional/north, -/obj/machinery/vending/autodrobe/all_access, +/obj/machinery/vending/autodrobe, /turf/open/floor/iron, /area/station/commons/locker) "huq" = ( @@ -38494,6 +38488,7 @@ pixel_y = 32; idExterior = "virology_airlock_exterior"; idInterior = "virology_airlock_interior"; + idSelf = "virology_airlock_control"; interior_airlock = "virology_airlock_control"; name = "Virology Access Controller"; req_access = list("virology") @@ -40898,10 +40893,7 @@ /turf/open/floor/iron, /area/station/maintenance/department/electrical) "lOV" = ( -/obj/machinery/disposal/bin{ - desc = "A pneumatic waste disposal unit. This one leads to the morgue."; - name = "corpse disposal" - }, +/obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ dir = 4 }, @@ -42554,7 +42546,7 @@ }, /area/station/security/brig/entrance) "mqI" = ( -/obj/machinery/vending/boozeomat/all_access, +/obj/machinery/vending/boozeomat, /turf/open/floor/plating, /area/station/maintenance/port/aft) "mqL" = ( @@ -56941,9 +56933,6 @@ }, /turf/open/floor/iron/dark/textured, /area/station/security/range) -"qtv" = ( -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/surface/outdoors/unexplored/rivers/no_monsters) "qtw" = ( /obj/machinery/door/airlock/security{ name = "Prison Forestry" @@ -74199,7 +74188,7 @@ /area/station/security/prison/rec) "vwG" = ( /obj/machinery/vending/security{ - onstation_override = 1 + all_products_free = 0 }, /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 8 @@ -78288,12 +78277,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron, /area/station/command/bridge) -"wLI" = ( -/obj/structure/flora/tree/pine/style_random, -/obj/structure/marker_beacon/cerulean, -/obj/effect/mapping_helpers/no_atoms_ontop, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/surface/outdoors/unexplored/rivers/no_monsters) "wLO" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -257800,7 +257783,7 @@ qMm hUD pyJ lPh -aJj +hUD hUD ebb cYE @@ -269758,9 +269741,9 @@ wNO (215,1,3) = {" wNO wNO -wNO -wNO -wLI +bln +bln +fwx kDs kDs kDs @@ -270015,9 +269998,9 @@ wNO (216,1,3) = {" wNO wNO -wNO -wNO -wNO +bln +bln +bln kDs kDs kDs @@ -270272,9 +270255,9 @@ wNO (217,1,3) = {" wNO wNO -wNO -wNO -wNO +bln +bln +bln bln hHG hHG @@ -270529,7 +270512,7 @@ wNO (218,1,3) = {" wNO wNO -wNO +bln tkU tkU fwx @@ -271303,7 +271286,7 @@ wNO tkU tkU tkU -qtv +bln hHG hHG hHG @@ -273614,7 +273597,7 @@ wNO wNO wNO wNO -wNO +bln tkU bln hHG @@ -273871,7 +273854,7 @@ wNO wNO wNO wNO -wNO +bln tkU bln hHG @@ -274128,7 +274111,7 @@ wNO wNO wNO wNO -wNO +bln tkU bln hHG @@ -274385,7 +274368,7 @@ wNO wNO wNO wNO -wNO +bln tkU bln hHG @@ -274641,9 +274624,9 @@ wNO (234,1,3) = {" wNO wNO -wNO -wNO -wNO +bln +bln +bln fwx hHG hHG @@ -274899,8 +274882,8 @@ wNO wNO wNO fwx -wNO -wNO +bln +bln bln hHG hHG @@ -275156,8 +275139,8 @@ wNO wNO wNO qzn -wNO -wNO +bln +bln bln hHG hHG @@ -275413,8 +275396,8 @@ wNO wNO wNO liV -wNO -wNO +bln +bln bln hHG hHG @@ -275669,9 +275652,9 @@ wNO (238,1,3) = {" wNO wNO -wNO -wNO -wNO +bln +bln +bln fwx hHG hHG @@ -275928,7 +275911,7 @@ wNO wNO wNO wNO -wNO +bln bln hHG hHG diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index a3b90c665b2..64fe3288fba 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -268,6 +268,10 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/station/engineering/main) +"afW" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/security/checkpoint/supply) "afZ" = ( /obj/machinery/vending/coffee, /obj/structure/disposalpipe/segment, @@ -278,6 +282,11 @@ /mob/living/simple_animal/bot/secbot/beepsky/armsky, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) +"agd" = ( +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/structure/closet/secure_closet/security/cargo, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/supply) "agi" = ( /obj/effect/spawner/random/maintenance, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -448,6 +457,20 @@ /obj/structure/window/spawner/directional/east, /turf/open/floor/iron/dark, /area/station/commons/fitness/recreation) +"aiy" = ( +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 8 + }, +/obj/machinery/computer/records/security{ + dir = 1 + }, +/obj/machinery/light/small/directional/west, +/obj/machinery/firealarm/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/supply) "aja" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -1216,14 +1239,6 @@ "ayr" = ( /turf/open/floor/iron, /area/station/engineering/break_room) -"ayz" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown/opposingcorners, -/obj/effect/decal/cleanable/wrapping, -/turf/open/floor/iron, -/area/station/cargo/sorting) "ayH" = ( /obj/effect/spawner/random/engineering/atmospherics_portable, /turf/open/floor/plating, @@ -1479,6 +1494,14 @@ /obj/machinery/duct, /turf/open/floor/iron/freezer, /area/station/commons/toilet/restrooms) +"aCO" = ( +/obj/machinery/computer/exodrone_control_console{ + dir = 8 + }, +/obj/structure/railing, +/obj/machinery/light/small/directional/east, +/turf/open/floor/plating/reinforced, +/area/station/cargo/storage) "aCQ" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 @@ -1621,6 +1644,10 @@ /obj/effect/spawner/random/bureaucracy/paper, /turf/open/floor/wood, /area/station/commons/dorms) +"aFz" = ( +/obj/machinery/vending/autodrobe, +/turf/open/floor/plating, +/area/station/maintenance/port) "aFW" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/mirror/directional/west, @@ -1961,17 +1988,6 @@ }, /turf/open/floor/iron, /area/station/security/checkpoint/engineering) -"aKN" = ( -/obj/structure/chair/office, -/obj/machinery/requests_console/directional/north{ - department = "Quartermaster's Desk"; - name = "Security Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/supplies, -/obj/effect/mapping_helpers/requests_console/assistance, -/obj/effect/landmark/start/depsec/supply, -/turf/open/floor/iron, -/area/station/security/checkpoint/supply) "aKO" = ( /obj/effect/landmark/event_spawn, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -2307,6 +2323,15 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/server) +"aQb" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/effect/turf_decal/siding/white/corner{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) "aQe" = ( /obj/machinery/light/small/directional/west, /obj/machinery/camera/directional/west{ @@ -2503,6 +2528,14 @@ /obj/effect/spawner/structure/window/reinforced/plasma, /turf/open/floor/plating, /area/station/engineering/supermatter/room) +"aUU" = ( +/obj/machinery/light/directional/east, +/obj/machinery/light_switch/directional/east, +/obj/structure/rack, +/obj/effect/decal/cleanable/greenglow/filled, +/obj/effect/spawner/random/maintenance/no_decals/eight, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "aVd" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -2830,6 +2863,17 @@ }, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) +"aZz" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/item/stock_parts/power_store/cell/lead{ + pixel_y = 1; + pixel_x = -3 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "aZA" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -3163,6 +3207,30 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark, /area/station/science/ordnance) +"bfw" = ( +/obj/machinery/light_switch/directional/south, +/obj/machinery/conveyor_switch/oneway{ + id = "packageSort2"; + name = "Sort and Deliver"; + pixel_x = -2; + pixel_y = 12 + }, +/obj/machinery/conveyor_switch/oneway{ + dir = 8; + id = "packageExternal"; + name = "Crate Returns"; + pixel_x = -5; + pixel_y = -3 + }, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/brown/filled/corner, +/obj/effect/turf_decal/trimline/white/corner, +/obj/structure/disposalpipe/segment, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron, +/area/station/cargo/sorting) "bfM" = ( /obj/machinery/door/airlock/public/glass{ name = "Art Storage" @@ -3198,11 +3266,6 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/white/smooth_large, /area/station/medical/chemistry) -"bgx" = ( -/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) "bgS" = ( /obj/machinery/firealarm/directional/north, /obj/machinery/camera/directional/west{ @@ -4097,28 +4160,6 @@ }, /turf/open/floor/iron, /area/station/commons/locker) -"bvl" = ( -/obj/machinery/newscaster/directional/east, -/obj/structure/table, -/obj/item/stack/package_wrap{ - pixel_x = 2; - pixel_y = -3 - }, -/obj/item/stack/package_wrap{ - pixel_x = -2; - pixel_y = 4 - }, -/obj/item/pen{ - pixel_x = -7; - pixel_y = 10 - }, -/obj/item/reagent_containers/cup/glass/waterbottle{ - pixel_y = 16 - }, -/obj/machinery/digital_clock/directional/north, -/obj/effect/turf_decal/tile/brown/opposingcorners, -/turf/open/floor/iron, -/area/station/cargo/sorting) "bvJ" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -4951,11 +4992,6 @@ /obj/structure/window/spawner/directional/west, /turf/open/floor/iron/dark, /area/station/service/cafeteria) -"bLj" = ( -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/effect/turf_decal/trimline/brown/filled/warning, -/turf/open/floor/iron, -/area/station/cargo/sorting) "bLm" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/carpet/green, @@ -4967,19 +5003,6 @@ /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/plating/airless, /area/space/nearstation) -"bLY" = ( -/obj/effect/turf_decal/trimline/red/filled/corner{ - dir = 1 - }, -/obj/structure/extinguisher_cabinet/directional/north, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/siding/thinplating_new{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) "bMa" = ( /obj/structure/disposaloutlet{ dir = 4; @@ -5088,6 +5111,14 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) +"bNw" = ( +/obj/structure/railing/corner, +/obj/structure/chair/office/light{ + dir = 4 + }, +/obj/effect/landmark/start/cargo_technician, +/turf/open/floor/plating/reinforced, +/area/station/cargo/storage) "bNE" = ( /obj/machinery/light/directional/east, /obj/structure/cable, @@ -5182,18 +5213,6 @@ /obj/item/bodypart/arm/left, /turf/open/floor/plating/airless, /area/station/science/ordnance/bomb) -"bQl" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown/opposingcorners, -/obj/structure/table, -/obj/machinery/fax{ - fax_name = "Cargo Office"; - name = "Cargo Office Fax Machine" - }, -/turf/open/floor/iron, -/area/station/cargo/sorting) "bQN" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/machinery/computer/security/telescreen/entertainment/directional/north, @@ -5777,6 +5796,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/security/courtroom) +"cap" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/cargo/sorting) "caO" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -6488,14 +6513,6 @@ /obj/effect/spawner/random/engineering/atmospherics_portable, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"cqy" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) "cqD" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -7454,6 +7471,15 @@ }, /turf/open/floor/plating, /area/station/science/genetics) +"cIl" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron, +/area/station/cargo/lobby) "cIK" = ( /obj/machinery/smartfridge/chemistry/preloaded, /obj/effect/turf_decal/tile/yellow/fourcorners, @@ -7527,21 +7553,6 @@ /obj/structure/sign/directions/evac, /turf/closed/wall/r_wall, /area/station/medical/chemistry) -"cJS" = ( -/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 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) "cJT" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/rack, @@ -7581,6 +7592,20 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/carpet, /area/station/commons/dorms) +"cKD" = ( +/obj/structure/rack, +/obj/item/circuitboard/machine/exoscanner{ + pixel_y = 3 + }, +/obj/item/circuitboard/machine/exoscanner, +/obj/item/exodrone{ + pixel_y = 11 + }, +/obj/structure/railing{ + dir = 10 + }, +/turf/open/floor/plating/reinforced, +/area/station/cargo/storage) "cKN" = ( /obj/structure/table/wood, /obj/structure/cable, @@ -8029,6 +8054,11 @@ }, /turf/open/floor/wood, /area/station/security/office) +"cUt" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "cUw" = ( /obj/machinery/power/apc/auto_name/directional/east, /obj/structure/cable, @@ -8195,15 +8225,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/office) -"cXE" = ( -/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/trimline/brown/filled/line, -/turf/open/floor/iron, -/area/station/cargo/sorting) "cXH" = ( /obj/effect/turf_decal/tile/yellow/half/contrasted{ dir = 4 @@ -8595,6 +8616,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood, /area/station/service/theater) +"dfa" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/item/storage/test_tube_rack/full, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "dfh" = ( /obj/effect/spawner/random/structure/closet_maintenance, /turf/open/floor/plating, @@ -8627,15 +8656,6 @@ "dfC" = ( /turf/open/floor/iron/grimy, /area/station/tcommsat/computer) -"dfK" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/chair/office{ - dir = 1 - }, -/obj/effect/landmark/start/cargo_technician, -/obj/effect/turf_decal/tile/brown/opposingcorners, -/turf/open/floor/iron, -/area/station/cargo/sorting) "dfO" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -8648,11 +8668,6 @@ /obj/effect/turf_decal/box/corners, /turf/open/floor/iron, /area/station/engineering/atmos) -"dfU" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/extinguisher_cabinet/directional/east, -/turf/open/floor/plating, -/area/station/cargo/drone_bay) "dgc" = ( /obj/structure/cable, /obj/structure/disposalpipe/junction{ @@ -9359,6 +9374,16 @@ }, /turf/open/floor/iron, /area/station/service/hydroponics) +"dsJ" = ( +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/cargo/storage) "dsQ" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ @@ -9386,35 +9411,24 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) +"dtw" = ( +/obj/machinery/door/airlock/mining{ + name = "Deliveries" + }, +/obj/machinery/door/firedoor, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/access/any/supply/shipping, +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/cargo/sorting) "dtB" = ( /obj/machinery/atmospherics/pipe/smart/manifold/purple/visible{ dir = 8 }, /turf/open/floor/iron, /area/station/engineering/atmos) -"dtE" = ( -/obj/structure/table/reinforced, -/obj/item/stamp/denied{ - pixel_x = 4; - pixel_y = -2 - }, -/obj/item/stamp{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/pen/red{ - pixel_y = 10 - }, -/obj/item/dest_tagger{ - pixel_x = 9; - pixel_y = 10 - }, -/obj/item/pen/screwdriver{ - pixel_x = -7; - pixel_y = 7 - }, -/turf/open/floor/iron, -/area/station/cargo/sorting) "dtY" = ( /obj/machinery/meter/monitored/waste_loop, /obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{ @@ -9727,12 +9741,6 @@ /obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/iron/cafeteria, /area/station/security/prison) -"dAk" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/cargo/storage) "dBb" = ( /obj/effect/turf_decal/tile/purple/opposingcorners, /obj/structure/window/reinforced/spawner/directional/north, @@ -9997,14 +10005,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, /area/station/medical/surgery/theatre) -"dGC" = ( -/obj/structure/reagent_dispensers/water_cooler, -/obj/effect/turf_decal/trimline/brown/filled/end{ - dir = 1 - }, -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/iron, -/area/station/cargo/sorting) "dGD" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -10042,15 +10042,6 @@ /obj/effect/turf_decal/tile/brown/fourcorners, /turf/open/floor/iron, /area/station/cargo/lobby) -"dHz" = ( -/obj/effect/turf_decal/trimline/brown/corner{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/brown/line{ - dir = 6 - }, -/turf/open/floor/iron, -/area/station/cargo/lobby) "dHG" = ( /obj/machinery/atmospherics/components/binary/crystallizer{ dir = 4 @@ -10272,6 +10263,7 @@ /obj/item/food/popsicle/creamsicle_orange, /obj/machinery/airalarm/directional/north, /obj/effect/turf_decal/tile/dark_blue/half/contrasted, +/obj/effect/mapping_helpers/airalarm/tlv_cold_room, /turf/open/floor/iron/kitchen_coldroom, /area/station/medical/coldroom) "dLq" = ( @@ -10725,32 +10717,6 @@ /obj/effect/turf_decal/tile/brown/anticorner/contrasted, /turf/open/floor/iron, /area/station/cargo/miningoffice) -"dSH" = ( -/obj/structure/table/reinforced, -/obj/item/storage/box/shipping{ - pixel_x = -6; - pixel_y = 15 - }, -/obj/item/multitool{ - pixel_x = -3; - pixel_y = -4 - }, -/obj/item/storage/box/lights/mixed{ - pixel_x = 8; - pixel_y = 11 - }, -/obj/item/flashlight/lamp{ - pixel_x = -7; - pixel_y = 5 - }, -/obj/item/storage/box/shipping{ - pixel_x = 8 - }, -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/cargo/sorting) "dSJ" = ( /obj/effect/turf_decal/siding/wood, /obj/structure/sign/poster/random/directional/north, @@ -11099,25 +11065,6 @@ /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/iron, /area/station/security/courtroom) -"dYi" = ( -/obj/structure/table, -/obj/item/stock_parts/micro_laser{ - pixel_x = -6; - pixel_y = 4 - }, -/obj/item/stock_parts/micro_laser{ - pixel_x = -2; - pixel_y = 2 - }, -/obj/item/stock_parts/micro_laser{ - pixel_x = 2 - }, -/obj/item/stock_parts/micro_laser{ - pixel_x = 6; - pixel_y = -2 - }, -/turf/open/floor/iron, -/area/station/cargo/drone_bay) "dYl" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, @@ -11264,12 +11211,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/cargo/sorting) -"ebg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/brown/opposingcorners, -/turf/open/floor/iron, -/area/station/cargo/storage) "ebr" = ( /obj/machinery/navbeacon{ codes_txt = "patrol;next_patrol=0-SecurityDesk"; @@ -11782,6 +11723,32 @@ }, /turf/open/floor/iron/dark, /area/station/medical/medbay/central) +"ejD" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/structure/table, +/obj/item/stack/wrapping_paper, +/obj/item/paper_bin/carbon{ + pixel_y = 8; + pixel_x = 6 + }, +/obj/item/pen/fourcolor{ + pixel_y = 8; + pixel_x = 6 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/decal/cleanable/wrapping, +/obj/item/sales_tagger{ + pixel_x = -5; + pixel_y = 4 + }, +/obj/item/dest_tagger{ + pixel_x = -2; + pixel_y = 4 + }, +/turf/open/floor/iron, +/area/station/cargo/sorting) "ejF" = ( /obj/effect/turf_decal/trimline/brown/warning{ dir = 5 @@ -11852,13 +11819,6 @@ }, /turf/open/floor/wood, /area/station/service/lawoffice) -"ekb" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/sorting) "ekh" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -12003,19 +11963,6 @@ }, /turf/open/floor/iron, /area/station/engineering/break_room) -"elz" = ( -/obj/structure/rack, -/obj/item/circuitboard/machine/exoscanner{ - pixel_y = 3 - }, -/obj/item/circuitboard/machine/exoscanner, -/obj/item/circuitboard/machine/exoscanner{ - pixel_y = -3 - }, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/cargo/drone_bay) "elJ" = ( /turf/closed/wall/r_wall, /area/station/science/server) @@ -12054,15 +12001,6 @@ }, /turf/open/floor/iron/white, /area/station/science/research) -"eml" = ( -/obj/machinery/light/directional/south, -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/landmark/start/assistant, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted, -/turf/open/floor/iron, -/area/station/cargo/lobby) "emN" = ( /obj/machinery/door/airlock/external, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -12329,6 +12267,16 @@ /obj/item/radio/intercom/directional/east, /turf/open/floor/wood, /area/station/service/library) +"erU" = ( +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ + dir = 8 + }, +/obj/machinery/computer/cargo/request{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/cargo/lobby) "esd" = ( /obj/item/reagent_containers/cup/glass/drinkingglass{ pixel_x = 4; @@ -12702,6 +12650,13 @@ /obj/structure/cable, /turf/open/floor/iron/freezer, /area/station/security/prison/shower) +"exB" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/effect/turf_decal/trimline/brown/filled/warning, +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/cargo/sorting) "exC" = ( /obj/effect/turf_decal/plaque{ icon_state = "L3" @@ -12932,6 +12887,12 @@ }, /turf/closed/wall/r_wall, /area/station/command/heads_quarters/captain/private) +"eDO" = ( +/obj/effect/turf_decal/siding/white{ + dir = 5 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) "eDX" = ( /obj/structure/sign/departments/science/directional/east, /obj/effect/turf_decal/tile/purple{ @@ -13270,7 +13231,6 @@ /turf/open/floor/iron, /area/station/service/hydroponics) "eKG" = ( -/obj/structure/cable, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -13905,6 +13865,10 @@ }, /turf/open/floor/iron, /area/station/commons/locker) +"eVG" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "eVX" = ( /obj/machinery/firealarm/directional/west, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -14350,13 +14314,6 @@ }, /turf/open/floor/iron/white, /area/station/science/xenobiology) -"fea" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/reagent_dispensers/wall/peppertank/directional/east, -/obj/effect/landmark/start/depsec/supply, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/security/checkpoint/supply) "fec" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, /turf/closed/wall/r_wall, @@ -15245,9 +15202,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/science/xenobiology/hallway) -"fru" = ( -/turf/closed/wall, -/area/station/cargo/drone_bay) "frw" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/cobweb/cobweb2, @@ -15388,14 +15342,6 @@ /obj/effect/turf_decal/tile/brown/opposingcorners, /turf/open/floor/iron, /area/station/cargo/storage) -"fwd" = ( -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) "fwz" = ( /obj/machinery/portable_atmospherics/canister/nitrogen, /turf/open/floor/iron/dark, @@ -15536,6 +15482,16 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating/airless, /area/station/solars/port/fore) +"fzo" = ( +/obj/effect/turf_decal/stripes/line, +/obj/item/stock_parts/micro_laser{ + pixel_x = 6; + pixel_y = -2 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/caution, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "fzr" = ( /obj/structure/window/spawner/directional/south, /obj/structure/window/spawner/directional/west, @@ -15743,6 +15699,13 @@ /obj/structure/cable, /turf/open/floor/circuit/red, /area/station/ai_monitored/turret_protected/ai_upload) +"fEV" = ( +/obj/effect/turf_decal/tile/brown/fourcorners, +/obj/machinery/door/airlock/security/glass{ + name = "Security Post - Cargo" + }, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/supply) "fEW" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -16111,15 +16074,6 @@ /obj/effect/mapping_helpers/airlock/access/all/medical/general, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"fLp" = ( -/obj/structure/disposalpipe/junction{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) "fLq" = ( /obj/machinery/door/window/left/directional/north{ name = "Inner Pipe Access"; @@ -16156,6 +16110,14 @@ /obj/machinery/power/tracker, /turf/open/floor/plating/airless, /area/station/solars/starboard/fore) +"fMa" = ( +/obj/structure/rack, +/obj/effect/spawner/random/trash/ghetto_containers, +/obj/effect/spawner/random/trash/ghetto_containers, +/obj/effect/spawner/random/trash/ghetto_containers, +/obj/effect/spawner/random/trash/ghetto_containers, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "fMf" = ( /obj/structure/chair/office{ dir = 1 @@ -16192,6 +16154,16 @@ }, /turf/open/floor/plating, /area/station/maintenance/aft/greater) +"fMC" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/obj/structure/chair/office/light{ + dir = 1 + }, +/obj/effect/landmark/start/depsec/supply, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/supply) "fMN" = ( /obj/machinery/firealarm/directional/west, /obj/structure/disposalpipe/segment{ @@ -16601,14 +16573,6 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/white, /area/station/security/prison/safe) -"fWn" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/effect/turf_decal/tile/brown/opposingcorners, -/obj/structure/closet/crate, -/turf/open/floor/iron, -/area/station/cargo/sorting) "fWw" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -16825,6 +16789,25 @@ }, /turf/open/floor/iron/white, /area/station/science/ordnance/storage) +"gav" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/table, +/obj/machinery/photocopier{ + pixel_y = 9 + }, +/obj/item/paper/fluff{ + pixel_y = 8; + pixel_x = 4; + default_raw_text = "Next CT to photocopy their ass is getting thrown under the shuttle. I'm serious here.
- QM"; + name = "note" + }, +/obj/machinery/newscaster/directional/east, +/obj/item/pen/screwdriver{ + pixel_x = 1; + pixel_y = 11 + }, +/turf/open/floor/iron, +/area/station/cargo/sorting) "gaG" = ( /obj/effect/spawner/random/maintenance, /obj/structure/cable, @@ -17034,22 +17017,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/grass, /area/station/medical/virology) -"geR" = ( -/obj/structure/table, -/obj/item/papercutter{ - pixel_x = 9; - pixel_y = 4 - }, -/obj/item/stamp/denied{ - pixel_x = -7; - pixel_y = 7 - }, -/obj/item/stamp/granted{ - pixel_x = -7 - }, -/obj/effect/turf_decal/tile/brown/opposingcorners, -/turf/open/floor/iron, -/area/station/cargo/sorting) "geV" = ( /obj/structure/sink/directional/east, /obj/machinery/light_switch/directional/west, @@ -17150,6 +17117,10 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) +"ggW" = ( +/obj/machinery/space_heater/improvised_chem_heater, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "ggZ" = ( /obj/effect/turf_decal/stripes/line, /obj/structure/disposalpipe/segment{ @@ -17739,6 +17710,19 @@ }, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) +"gsV" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/effect/turf_decal/siding/white/corner{ + dir = 4 + }, +/obj/structure/railing/corner/end{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) "gsW" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/medical/glass{ @@ -18026,32 +18010,6 @@ }, /turf/open/floor/iron/checker, /area/station/engineering/atmos/storage/gas) -"gxM" = ( -/obj/effect/turf_decal/tile/brown/opposingcorners, -/obj/structure/table, -/obj/item/stack/package_wrap{ - pixel_x = 2; - pixel_y = -3 - }, -/obj/item/stack/package_wrap{ - pixel_x = 1; - pixel_y = 6 - }, -/obj/item/stack/package_wrap{ - pixel_x = -4; - pixel_y = 8 - }, -/obj/item/dest_tagger{ - pixel_x = -9; - pixel_y = 12 - }, -/obj/item/hand_labeler_refill{ - pixel_x = -11; - pixel_y = -3 - }, -/obj/item/stack/wrapping_paper, -/turf/open/floor/iron, -/area/station/cargo/sorting) "gya" = ( /obj/structure/table, /obj/item/storage/box/hug{ @@ -19005,6 +18963,10 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/engine, /area/station/science/xenobiology) +"gOO" = ( +/obj/effect/decal/cleanable/shreds, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "gOS" = ( /obj/structure/cable, /obj/structure/table/glass, @@ -19047,24 +19009,15 @@ /obj/effect/mapping_helpers/requests_console/assistance, /turf/open/floor/iron/dark, /area/station/medical/morgue) +"gPw" = ( +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/supply) "gPA" = ( /obj/structure/table/wood, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet, /area/station/command/heads_quarters/captain/private) -"gPN" = ( -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/brown/warning{ - dir = 8 - }, -/obj/structure/extinguisher_cabinet/directional/north, -/obj/machinery/light/small/directional/north, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/cargo/sorting) "gPY" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -19243,9 +19196,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 - }, /obj/structure/fake_stairs/directional/north, /turf/open/floor/iron, /area/station/cargo/storage) @@ -19524,6 +19474,16 @@ /obj/effect/mapping_helpers/mail_sorting/service/kitchen, /turf/open/floor/iron, /area/station/maintenance/starboard/greater) +"gZq" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/obj/structure/chair/office/light, +/obj/effect/landmark/start/depsec/supply, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/supply) "gZu" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -19559,6 +19519,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/engineering/main) +"hab" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/cargo/sorting) "hav" = ( /obj/machinery/door/airlock/maintenance, /obj/structure/cable, @@ -19595,6 +19565,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/engineering/main) +"haZ" = ( +/obj/item/reagent_containers/cup/glass/mug/britcup, +/obj/effect/decal/cleanable/cobweb, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "hbv" = ( /turf/closed/wall/r_wall, /area/station/medical/coldroom) @@ -20053,9 +20029,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"hkj" = ( -/turf/open/floor/plating, -/area/station/cargo/drone_bay) "hko" = ( /obj/effect/turf_decal/bot{ dir = 1 @@ -20207,6 +20180,10 @@ }, /turf/open/floor/engine/vacuum, /area/space/nearstation) +"hlT" = ( +/obj/structure/falsewall, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "hmf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -20437,11 +20414,6 @@ /obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer2, /turf/open/floor/iron/dark/airless, /area/station/science/ordnance/freezerchamber) -"hrC" = ( -/obj/structure/cable, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/station/security/checkpoint/supply) "hrG" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -20473,17 +20445,6 @@ dir = 8 }, /area/station/service/chapel/office) -"hsx" = ( -/obj/machinery/door/airlock/mining{ - name = "Drone Bay" - }, -/obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, -/obj/effect/landmark/navigate_destination, -/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/cargo/drone_bay) "hsF" = ( /obj/machinery/door/airlock{ id_tag = "AuxToilet3"; @@ -20655,31 +20616,6 @@ /obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/plating, /area/station/security/checkpoint/customs) -"hvk" = ( -/obj/effect/spawner/random/bureaucracy/birthday_wrap, -/obj/item/stack/package_wrap{ - pixel_y = 5 - }, -/obj/item/stack/package_wrap{ - pixel_y = 2 - }, -/obj/item/stack/package_wrap, -/obj/machinery/light/directional/south, -/obj/machinery/firealarm/directional/south, -/obj/structure/table, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/cargo/lobby) -"hvo" = ( -/obj/structure/filingcabinet, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 8 - }, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron, -/area/station/security/checkpoint/supply) "hvr" = ( /obj/machinery/camera/directional/south{ c_tag = "Central Primary Hallway - Fore - Courtroom" @@ -20704,6 +20640,7 @@ "hvB" = ( /obj/effect/turf_decal/trimline/green/filled/line, /obj/effect/turf_decal/trimline/brown/filled/warning, +/obj/structure/cable, /turf/open/floor/iron, /area/station/cargo/sorting) "hvI" = ( @@ -21157,6 +21094,16 @@ }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) +"hCh" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown/opposingcorners, +/turf/open/floor/iron, +/area/station/cargo/sorting) "hCl" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, @@ -21236,11 +21183,6 @@ /obj/effect/turf_decal/trimline/red/filled/line, /turf/open/floor/iron/white, /area/station/security/prison) -"hDX" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/security/checkpoint/supply) "hEc" = ( /obj/effect/spawner/structure/window, /obj/machinery/door/poddoor/shutters/preopen{ @@ -21559,6 +21501,7 @@ /obj/effect/turf_decal/arrows/red{ dir = 4 }, +/obj/effect/spawner/random/structure/crate, /turf/open/floor/iron, /area/station/cargo/storage) "hKV" = ( @@ -21609,12 +21552,6 @@ }, /turf/open/floor/iron/white, /area/station/science/cytology) -"hLL" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/cargo/storage) "hLZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/junction{ @@ -21722,6 +21659,7 @@ /obj/effect/turf_decal/trimline/red/filled/line, /obj/effect/turf_decal/trimline/brown/filled/warning, /obj/structure/disposalpipe/segment, +/obj/structure/cable, /turf/open/floor/iron, /area/station/cargo/sorting) "hOp" = ( @@ -21890,6 +21828,13 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/security/brig) +"hRJ" = ( +/obj/effect/turf_decal/tile/red/anticorner/contrasted, +/obj/item/paper_bin/carbon, +/obj/item/pen/red/security, +/obj/structure/table/reinforced, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/supply) "hRQ" = ( /obj/machinery/disposal/bin{ pixel_x = -2; @@ -22195,9 +22140,6 @@ /area/station/command/teleporter) "hWC" = ( /obj/structure/cable, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 - }, /obj/structure/fake_stairs/directional/north, /turf/open/floor/iron, /area/station/cargo/storage) @@ -22211,13 +22153,6 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/commons/locker) -"hWK" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/landmark/start/depsec/supply, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/security/checkpoint/supply) "hWW" = ( /obj/structure/bookcase/random, /turf/open/floor/iron, @@ -22652,6 +22587,24 @@ /obj/structure/disposalpipe/segment, /turf/closed/wall, /area/station/cargo/sorting) +"ieD" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/hypospray/medipen/pumpup, +/obj/item/reagent_containers/hypospray/medipen/pumpup{ + pixel_y = 3 + }, +/obj/item/reagent_containers/cup/mortar{ + pixel_x = 3 + }, +/obj/item/extinguisher/crafted{ + pixel_y = 9; + pixel_x = 3 + }, +/obj/item/pestle{ + pixel_x = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "ieH" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 8 @@ -22992,10 +22945,6 @@ /obj/effect/mapping_helpers/airlock/access/all/command/minisat, /turf/open/floor/iron/dark, /area/station/ai_monitored/command/storage/satellite) -"ikL" = ( -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/cargo/drone_bay) "ikO" = ( /obj/machinery/newscaster/directional/north, /obj/structure/table/glass, @@ -23149,6 +23098,15 @@ }, /turf/open/floor/engine, /area/station/science/xenobiology) +"imT" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/supply) "imU" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -24123,24 +24081,6 @@ /obj/effect/landmark/start/security_officer, /turf/open/floor/iron/dark, /area/station/security/range) -"iDG" = ( -/obj/structure/table, -/obj/item/stock_parts/scanning_module{ - pixel_x = -5; - pixel_y = 7 - }, -/obj/item/stock_parts/scanning_module{ - pixel_x = 5; - pixel_y = 7 - }, -/obj/item/stock_parts/scanning_module{ - pixel_x = -5 - }, -/obj/item/stock_parts/scanning_module{ - pixel_x = 5 - }, -/turf/open/floor/iron, -/area/station/cargo/drone_bay) "iDN" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -24314,16 +24254,6 @@ /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/engine, /area/station/science/xenobiology) -"iHS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/security/glass{ - name = "Security Post - Cargo" - }, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/security/general, -/turf/open/floor/iron, -/area/station/security/checkpoint/supply) "iId" = ( /obj/machinery/conveyor{ id = "mining" @@ -24816,6 +24746,24 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/security/brig) +"iQb" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/obj/structure/table/reinforced, +/obj/item/book/manual/wiki/security_space_law{ + pixel_x = 9 + }, +/obj/item/pen/red{ + pixel_y = 7; + pixel_x = 9 + }, +/obj/machinery/recharger, +/obj/effect/mapping_helpers/requests_console/assistance, +/obj/effect/mapping_helpers/requests_console/supplies, +/obj/machinery/requests_console/auto_name/directional/east, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/supply) "iQd" = ( /obj/machinery/door/poddoor/shutters{ id = "supplybridge" @@ -26177,12 +26125,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/port) -"jmR" = ( -/obj/structure/closet/secure_closet/security/cargo, -/obj/machinery/airalarm/directional/north, -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron, -/area/station/security/checkpoint/supply) "jmT" = ( /obj/effect/landmark/start/hangover, /obj/effect/turf_decal/tile/neutral{ @@ -26379,16 +26321,6 @@ /obj/effect/spawner/random/maintenance/two, /turf/open/floor/plating, /area/station/maintenance/port) -"jqr" = ( -/obj/machinery/computer/security/mining{ - dir = 4 - }, -/obj/item/radio/intercom/directional/west, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/checkpoint/supply) "jqQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /obj/effect/turf_decal/tile/blue/fourcorners, @@ -26424,6 +26356,11 @@ }, /turf/open/floor/iron, /area/station/commons/locker) +"jrQ" = ( +/obj/effect/turf_decal/loading_area, +/obj/effect/landmark/navigate_destination, +/turf/open/floor/plating/reinforced, +/area/station/cargo/storage) "jrY" = ( /obj/machinery/door/airlock/external{ name = "Transport Airlock" @@ -26957,6 +26894,17 @@ "jzp" = ( /turf/closed/wall, /area/station/commons/vacant_room/office) +"jzq" = ( +/obj/structure/table/wood, +/obj/structure/chem_separator{ + pixel_y = 10 + }, +/obj/item/reagent_containers/cup/glass/trophy{ + pixel_y = 15; + pixel_x = 5 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "jzw" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -27076,29 +27024,6 @@ /obj/effect/turf_decal/bot_white, /turf/open/floor/iron, /area/station/cargo/storage) -"jBy" = ( -/obj/machinery/light_switch/directional/south, -/obj/machinery/conveyor_switch/oneway{ - id = "packageSort2"; - name = "Sort and Deliver"; - pixel_x = -2; - pixel_y = 12 - }, -/obj/machinery/conveyor_switch/oneway{ - dir = 8; - id = "packageExternal"; - name = "Crate Returns"; - pixel_x = -5; - pixel_y = -3 - }, -/obj/effect/turf_decal/trimline/brown/warning{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/brown/filled/corner, -/obj/effect/turf_decal/trimline/white/corner, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/cargo/sorting) "jBC" = ( /obj/structure/table, /obj/item/clothing/head/soft/grey{ @@ -27165,6 +27090,11 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white/smooth_large, /area/station/medical/medbay/central) +"jCs" = ( +/obj/effect/decal/cleanable/cobweb, +/obj/machinery/vending/boozeomat, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) "jCw" = ( /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating, @@ -27418,6 +27348,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/ai_upload) +"jHM" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/landmark/start/cargo_technician, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/brown/opposingcorners, +/turf/open/floor/iron, +/area/station/cargo/sorting) "jHQ" = ( /obj/structure/chair/sofa/corp/left{ dir = 1 @@ -27428,12 +27367,6 @@ /obj/machinery/status_display/evac/directional/south, /turf/open/floor/iron/dark, /area/station/medical/break_room) -"jHW" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line, -/obj/effect/turf_decal/trimline/brown/filled/warning, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/cargo/sorting) "jHX" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -28010,28 +27943,6 @@ "jRg" = ( /turf/open/floor/engine/co2, /area/station/engineering/atmos) -"jRo" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown/opposingcorners, -/obj/structure/table, -/obj/item/hand_labeler_refill{ - pixel_x = 12; - pixel_y = -3 - }, -/obj/effect/spawner/random/bureaucracy/birthday_wrap{ - pixel_x = -2; - pixel_y = 8 - }, -/obj/item/stack/package_wrap{ - pixel_x = -6; - pixel_y = 18 - }, -/obj/item/hand_labeler, -/obj/item/stack/package_wrap, -/turf/open/floor/iron, -/area/station/cargo/sorting) "jRz" = ( /obj/effect/spawner/random/structure/closet_maintenance, /obj/effect/spawner/random/maintenance, @@ -28250,11 +28161,11 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/structure/cable, /obj/machinery/door/firedoor, /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/structure/cable, /turf/open/floor/iron, /area/station/cargo/lobby) "jUu" = ( @@ -28915,6 +28826,20 @@ /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/iron, /area/station/science/xenobiology) +"kgZ" = ( +/obj/structure/sign/poster/official/random/directional/south, +/obj/item/wallframe/camera{ + pixel_y = 9; + pixel_x = -3 + }, +/obj/structure/fermenting_barrel, +/obj/item/clothing/head/fedora{ + pixel_y = 13; + name = "porkpie hat"; + desc = "This hat reeks of bad decisions and chemical compounds. There's some odd white dust covering it." + }, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "kha" = ( /obj/structure/disposalpipe/segment, /obj/machinery/airalarm/directional/east, @@ -29078,6 +29003,13 @@ /obj/machinery/atmospherics/pipe/smart/simple/supply/hidden, /turf/open/floor/iron/dark, /area/station/engineering/atmos/storage/gas) +"kkA" = ( +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 4 + }, +/obj/machinery/computer/security, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/supply) "kkB" = ( /obj/machinery/mineral/ore_redemption{ dir = 4; @@ -29626,17 +29558,6 @@ /obj/structure/cable, /turf/open/floor/plating/airless, /area/station/solars/port/fore) -"kuS" = ( -/obj/item/kirbyplants/random, -/obj/effect/turf_decal/tile/brown/anticorner{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) -"kuW" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating, -/area/station/cargo/drone_bay) "kvd" = ( /obj/machinery/light/directional/west, /obj/structure/cable, @@ -29695,14 +29616,6 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron/dark, /area/station/engineering/atmos) -"kwh" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown/opposingcorners, -/turf/open/floor/iron, -/area/station/cargo/storage) "kwp" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/delivery, @@ -29834,6 +29747,16 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/dark, /area/station/engineering/storage/tech) +"kyf" = ( +/obj/machinery/computer/exoscanner_control, +/obj/item/reagent_containers/cup/glass/coffee{ + pixel_y = 19; + pixel_x = -6 + }, +/obj/structure/sign/departments/exodrone/directional/north, +/obj/machinery/light/small/directional/north, +/turf/open/floor/plating/reinforced, +/area/station/cargo/storage) "kyh" = ( /obj/machinery/power/apc/auto_name/directional/east, /obj/structure/cable, @@ -30110,6 +30033,13 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"kDb" = ( +/obj/structure/chair/office/light{ + dir = 1 + }, +/obj/effect/landmark/start/depsec/supply, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/supply) "kDk" = ( /obj/machinery/door/airlock/security/glass{ name = "Permabrig Visitation" @@ -30200,15 +30130,16 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/main) -"kFa" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/start/cargo_technician, -/obj/structure/chair/office{ +"kFb" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/effect/turf_decal/siding/white/corner{ dir = 4 }, /turf/open/floor/iron, -/area/station/cargo/sorting) +/area/station/cargo/storage) "kFg" = ( /obj/effect/turf_decal/tile/yellow/half/contrasted{ dir = 1 @@ -30237,6 +30168,16 @@ /obj/structure/cable, /turf/open/floor/carpet, /area/station/service/library) +"kFQ" = ( +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/structure/chair/office/light{ + dir = 1 + }, +/obj/effect/landmark/start/cargo_technician, +/turf/open/floor/plating/reinforced, +/area/station/cargo/storage) "kFS" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -30394,6 +30335,24 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating/airless, /area/station/science/ordnance/bomb) +"kJk" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/obj/machinery/camera/directional/west, +/obj/item/dest_tagger{ + pixel_x = -9; + pixel_y = 12 + }, +/obj/item/hand_labeler_refill{ + pixel_x = -11; + pixel_y = -3 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/supply) "kJx" = ( /obj/structure/chair/office, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -31385,14 +31344,6 @@ /obj/effect/spawner/random/trash/janitor_supplies, /turf/open/floor/plating, /area/station/maintenance/aft/greater) -"lak" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/sorting) "lav" = ( /obj/structure/girder, /obj/effect/spawner/random/structure/grille, @@ -31494,6 +31445,22 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/command/gateway) +"lcI" = ( +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 1 + }, +/obj/structure/extinguisher_cabinet/directional/north, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 4 + }, +/obj/effect/turf_decal/siding/white/corner{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) "lcJ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -31795,10 +31762,10 @@ /turf/open/floor/iron, /area/station/cargo/storage) "liX" = ( -/obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/door/firedoor, +/obj/structure/cable, /turf/open/floor/iron, /area/station/cargo/lobby) "lje" = ( @@ -31867,6 +31834,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet, /area/station/command/bridge) +"ljT" = ( +/obj/machinery/exodrone_launcher, +/obj/item/exodrone, +/obj/effect/turf_decal/box, +/turf/open/floor/plating/reinforced, +/area/station/cargo/storage) "lkc" = ( /obj/machinery/barsign, /turf/closed/wall, @@ -32087,10 +32060,6 @@ /obj/machinery/meter, /turf/closed/wall/r_wall, /area/station/engineering/atmos) -"lpt" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron, -/area/station/construction/storage_wing) "lpA" = ( /obj/machinery/air_sensor/nitrogen_tank, /turf/open/floor/engine/n2, @@ -32258,27 +32227,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/brig) -"lsU" = ( -/obj/effect/turf_decal/tile/brown/opposingcorners, -/obj/structure/table, -/obj/item/stack/package_wrap{ - pixel_x = -2; - pixel_y = 1 - }, -/obj/effect/spawner/random/bureaucracy/birthday_wrap{ - pixel_x = -2; - pixel_y = 8 - }, -/obj/item/dest_tagger{ - pixel_x = 7; - pixel_y = 1 - }, -/obj/item/stack/wrapping_paper{ - pixel_x = -4; - pixel_y = -7 - }, -/turf/open/floor/iron, -/area/station/cargo/sorting) "lsV" = ( /obj/effect/turf_decal/siding/purple{ dir = 10 @@ -32451,11 +32399,6 @@ }, /turf/open/floor/iron/freezer, /area/station/commons/toilet/restrooms) -"lvY" = ( -/obj/effect/decal/cleanable/cobweb, -/obj/machinery/vending/boozeomat/all_access, -/turf/open/floor/wood, -/area/station/maintenance/port/aft) "lvZ" = ( /obj/machinery/door/firedoor, /obj/structure/disposalpipe/segment, @@ -32583,6 +32526,15 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/command) +"lzD" = ( +/obj/structure/cable, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/cargo/sorting) "lzJ" = ( /obj/structure/cable, /turf/open/floor/iron/solarpanel/airless, @@ -34908,12 +34860,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"muq" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) "mur" = ( /obj/machinery/light/directional/north, /obj/machinery/status_display/evac/directional/north, @@ -35048,14 +34994,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/engineering/main) -"mwP" = ( -/obj/structure/cable, -/obj/structure/extinguisher_cabinet/directional/east, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 6 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) "mwY" = ( /obj/effect/spawner/random/trash/garbage, /obj/effect/landmark/generic_maintenance_landmark, @@ -35090,13 +35028,6 @@ /obj/structure/window/spawner/directional/south, /turf/open/floor/iron, /area/station/engineering/atmos) -"mxx" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/spawner/structure/window, -/turf/open/floor/plating, -/area/station/cargo/sorting) "mxI" = ( /obj/structure/disposalpipe/junction/flip, /obj/structure/cable, @@ -35164,10 +35095,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/engineering/gravity_generator) -"myZ" = ( -/obj/machinery/vending/autodrobe/all_access, -/turf/open/floor/plating, -/area/station/maintenance/port) "mzg" = ( /obj/structure/cable, /obj/effect/turf_decal/siding/red, @@ -35175,16 +35102,6 @@ /obj/effect/turf_decal/tile/red/opposingcorners, /turf/open/floor/iron, /area/station/security/checkpoint/science) -"mzj" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 - }, -/obj/machinery/light/directional/north, -/turf/open/floor/iron, -/area/station/cargo/sorting) "mzm" = ( /obj/structure/table, /obj/item/reagent_containers/condiment/saltshaker{ @@ -36390,12 +36307,6 @@ /obj/effect/turf_decal/trimline/brown/filled/line, /turf/open/floor/iron, /area/station/cargo/miningoffice) -"mUF" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/drone_bay) "mUL" = ( /obj/machinery/door/airlock/atmos{ name = "Hypertorus Fusion Reactor" @@ -37272,6 +37183,10 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) +"nkq" = ( +/obj/effect/turf_decal/loading_area, +/turf/open/floor/plating/reinforced, +/area/station/cargo/storage) "nkG" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, /obj/machinery/meter, @@ -37554,6 +37469,16 @@ /obj/structure/window/spawner/directional/east, /turf/open/floor/iron/dark, /area/station/engineering/atmos) +"npX" = ( +/obj/structure/cable, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/cargo/storage) "npY" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -37938,12 +37863,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/office) -"nut" = ( -/obj/structure/cable, -/obj/effect/turf_decal/bot_white, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/iron, -/area/station/cargo/storage) "nuB" = ( /obj/structure/secure_safe/directional/south, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -38147,6 +38066,15 @@ /obj/structure/cable, /turf/open/floor/wood, /area/station/service/bar/backroom) +"nxI" = ( +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 4 + }, +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/iron/stairs, +/area/station/cargo/storage) "nxO" = ( /obj/structure/chair/office{ dir = 8 @@ -38829,20 +38757,6 @@ }, /turf/open/space/basic, /area/space) -"nKu" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/item/reagent_containers/cup/glass/waterbottle{ - pixel_y = 48; - pixel_x = 9 - }, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/sorting) "nKE" = ( /obj/effect/turf_decal/trimline/blue/filled/line, /turf/open/floor/iron/white, @@ -38896,13 +38810,6 @@ /obj/machinery/airalarm/directional/south, /turf/open/floor/wood, /area/station/service/library) -"nLx" = ( -/obj/structure/cable, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/sorting) "nLz" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, @@ -39729,17 +39636,17 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/wood, /area/station/commons/dorms) -"obF" = ( -/obj/machinery/computer/exoscanner_control{ +"oby" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ dir = 1 }, -/obj/machinery/camera/directional/south{ - c_tag = "Cargo Bay - Drone Launch Room"; - pixel_x = 14 +/obj/machinery/computer/security/mining, +/obj/structure/reagent_dispensers/wall/peppertank/directional/north, +/obj/machinery/light/small/directional/north{ + pixel_x = -11 }, -/obj/structure/sign/poster/official/random/directional/south, -/turf/open/floor/iron, -/area/station/cargo/drone_bay) +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/supply) "obG" = ( /turf/closed/wall, /area/station/service/theater) @@ -40240,6 +40147,15 @@ /obj/structure/sign/poster/random/directional/south, /turf/open/floor/plating, /area/station/hallway/secondary/service) +"omc" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) "omd" = ( /obj/structure/table, /obj/machinery/cell_charger, @@ -41448,6 +41364,12 @@ }, /turf/open/floor/iron/dark, /area/station/security/office) +"oHm" = ( +/obj/structure/railing{ + dir = 8 + }, +/turf/open/floor/iron/stairs, +/area/station/cargo/storage) "oHw" = ( /obj/structure/cable, /turf/open/floor/iron/white/corner, @@ -41751,6 +41673,11 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/medical/office) +"oNR" = ( +/obj/effect/turf_decal/bot_white, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/iron, +/area/station/cargo/storage) "oOl" = ( /obj/machinery/flasher/directional/north{ id = "AI" @@ -41796,6 +41723,12 @@ /obj/structure/window/reinforced/spawner/directional/north, /turf/open/space, /area/space/nearstation) +"oOY" = ( +/obj/structure/rack, +/obj/item/fuel_pellet, +/obj/item/fuel_pellet, +/turf/open/floor/plating/reinforced, +/area/station/cargo/storage) "oOZ" = ( /obj/machinery/power/port_gen/pacman/pre_loaded, /turf/open/floor/plating, @@ -41924,6 +41857,15 @@ }, /turf/open/floor/iron/cafeteria, /area/station/service/kitchen) +"oRx" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/siding/white{ + dir = 9 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) "oRM" = ( /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ dir = 4 @@ -42020,16 +41962,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"oTw" = ( -/obj/machinery/door/airlock/mining{ - name = "Deliveries" - }, -/obj/machinery/door/firedoor, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/any/supply/shipping, -/obj/effect/turf_decal/tile/brown/opposingcorners, -/turf/open/floor/iron, -/area/station/cargo/sorting) "oTD" = ( /obj/structure/frame/computer, /turf/open/floor/plating/airless, @@ -42296,6 +42228,11 @@ /obj/machinery/light/small/red/directional/west, /turf/open/floor/plating/airless, /area/space/nearstation) +"oYs" = ( +/obj/machinery/vending/autodrobe, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/commons/locker) "oYv" = ( /obj/effect/decal/cleanable/cobweb, /obj/structure/bed, @@ -42396,15 +42333,6 @@ "paD" = ( /turf/closed/wall, /area/station/cargo/bitrunning/den) -"paQ" = ( -/obj/structure/window/spawner/directional/south, -/obj/machinery/computer/cargo/request{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown/fourcorners, -/obj/machinery/door/firedoor, -/turf/open/floor/iron, -/area/station/cargo/sorting) "paU" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/unres{ @@ -42782,14 +42710,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) -"phP" = ( -/obj/structure/table, -/obj/item/exodrone{ - pixel_y = 8 - }, -/obj/item/radio/intercom/directional/east, -/turf/open/floor/iron, -/area/station/cargo/drone_bay) "phR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -42899,6 +42819,19 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/commons/fitness/recreation) +"pjX" = ( +/obj/effect/turf_decal/trimline/brown/filled/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 8 + }, +/obj/machinery/light/small/directional/north, +/obj/structure/disposalpipe/segment, +/obj/structure/tank_holder/extinguisher, +/obj/structure/sign/clock/directional/north, +/turf/open/floor/iron, +/area/station/cargo/sorting) "pke" = ( /obj/effect/turf_decal/siding/red{ dir = 6 @@ -42916,13 +42849,6 @@ }, /turf/open/floor/iron/white, /area/station/command/heads_quarters/rd) -"pkF" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/photocopier, -/turf/open/floor/iron, -/area/station/cargo/sorting) "pkH" = ( /obj/structure/rack, /obj/item/restraints/handcuffs, @@ -43082,6 +43008,15 @@ }, /turf/open/floor/plating/airless, /area/station/science/ordnance/bomb) +"pnl" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/item/wallframe/apc, +/obj/item/phone, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/caution, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "pnx" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -43135,6 +43070,12 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/service/bar) +"pog" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/closed/wall, +/area/station/security/checkpoint/supply) "poj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -43886,19 +43827,6 @@ /obj/machinery/newscaster/directional/north, /turf/open/floor/iron/dark, /area/station/medical/break_room) -"pCs" = ( -/obj/machinery/camera/directional/south{ - c_tag = "Cargo Bay - Mailroom" - }, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/white/corner{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/cargo/sorting) "pCt" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -43944,6 +43872,13 @@ /obj/machinery/power/apc/auto_name/directional/east, /turf/open/floor/iron/grimy, /area/station/tcommsat/computer) +"pDf" = ( +/obj/machinery/requests_console/directional/south{ + department = "Mining"; + name = "Mining Requests Console" + }, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "pDl" = ( /obj/effect/turf_decal/delivery, /obj/machinery/door/window/left/directional/north{ @@ -44136,6 +44071,11 @@ }, /turf/open/floor/iron/freezer, /area/station/commons/toilet/restrooms) +"pGJ" = ( +/obj/item/chair/wood/wings, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "pGZ" = ( /obj/machinery/shower/directional/east, /obj/structure/cable, @@ -44634,6 +44574,16 @@ /obj/structure/cable, /turf/open/floor/iron/grimy, /area/station/security/interrogation) +"pPm" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/brown/filled/corner{ + dir = 1 + }, +/obj/effect/decal/cleanable/wrapping, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/cargo/sorting) "pPp" = ( /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/structure/chair/comfy/black{ @@ -44969,6 +44919,20 @@ /obj/item/radio/intercom/directional/east, /turf/open/floor/iron/grimy, /area/station/security/interrogation) +"pVK" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "pVM" = ( /obj/machinery/light/small/directional/south, /obj/machinery/camera/directional/south{ @@ -45826,6 +45790,12 @@ }, /turf/open/floor/iron/dark, /area/station/command/bridge) +"qlh" = ( +/obj/structure/railing/corner{ + dir = 8 + }, +/turf/open/floor/plating/reinforced, +/area/station/cargo/storage) "qlz" = ( /obj/effect/spawner/random/vending/colavend, /obj/machinery/light/directional/north, @@ -45856,6 +45826,11 @@ /obj/machinery/light/directional/west, /turf/open/floor/iron, /area/station/construction/storage_wing) +"qme" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/item/storage/test_tube_rack/full, +/turf/open/floor/iron, +/area/station/construction/storage_wing) "qmf" = ( /obj/machinery/power/apc/auto_name/directional/east, /obj/structure/table/wood, @@ -46042,12 +46017,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet, /area/station/service/library) -"qqr" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) "qqs" = ( /obj/structure/table, /obj/item/multitool{ @@ -46108,13 +46077,6 @@ /obj/machinery/computer/security/telescreen/minisat/directional/south, /turf/open/floor/carpet, /area/station/command/heads_quarters/captain/private) -"qrF" = ( -/obj/machinery/computer/exodrone_control_console{ - dir = 1 - }, -/obj/machinery/newscaster/directional/south, -/turf/open/floor/iron, -/area/station/cargo/drone_bay) "qrL" = ( /obj/effect/decal/cleanable/oil/streak, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -46909,12 +46871,6 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron, /area/station/hallway/primary/port) -"qHa" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/cargo/drone_bay) "qHh" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ dir = 9 @@ -46948,6 +46904,10 @@ /obj/effect/spawner/random/structure/grille, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"qHW" = ( +/obj/item/storage/test_tube_rack/full, +/turf/closed/wall/r_wall, +/area/station/security/prison/safe) "qHY" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -47062,11 +47022,6 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron/white, /area/station/medical/pharmacy) -"qJH" = ( -/obj/machinery/vending/autodrobe/all_access, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/commons/locker) "qJU" = ( /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)."; @@ -47354,6 +47309,13 @@ }, /turf/open/floor/iron, /area/station/security/prison) +"qNL" = ( +/obj/effect/turf_decal/tile/red/half/contrasted, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/supply) "qNO" = ( /obj/structure/table/glass, /obj/item/folder/blue{ @@ -47463,16 +47425,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"qOZ" = ( -/obj/machinery/requests_console/directional/south{ - department = "Mining"; - name = "Mining Requests Console" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) "qPs" = ( /obj/structure/lattice/catwalk, /obj/structure/marker_beacon/indigo, @@ -47731,9 +47683,6 @@ /obj/machinery/light_switch/directional/north, /turf/open/floor/iron/dark, /area/station/science/ordnance) -"qST" = ( -/turf/open/floor/iron, -/area/station/cargo/drone_bay) "qTf" = ( /obj/effect/turf_decal/tile/brown/anticorner/contrasted{ dir = 1 @@ -48469,18 +48418,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/virology) -"rgL" = ( -/obj/structure/table, -/obj/item/reagent_containers/cup/glass/mug/britcup{ - pixel_x = -6; - pixel_y = 11 - }, -/obj/item/phone{ - pixel_x = 6; - pixel_y = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/drone_bay) "rgS" = ( /obj/machinery/modular_computer/preset/civilian{ dir = 1 @@ -48490,6 +48427,11 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/science/robotics/lab) +"rgW" = ( +/obj/machinery/exodrone_launcher, +/obj/effect/turf_decal/box, +/turf/open/floor/plating/reinforced, +/area/station/cargo/storage) "rgZ" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -48708,6 +48650,14 @@ /obj/item/target/syndicate, /turf/open/floor/engine, /area/station/science/explab) +"rkX" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "rla" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -48781,13 +48731,6 @@ /obj/effect/mapping_helpers/airlock/access/all/service/lawyer, /turf/open/floor/plating, /area/station/maintenance/fore) -"rmL" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/decal/cleanable/wrapping, -/obj/effect/turf_decal/tile/brown/opposingcorners, -/obj/effect/landmark/start/cargo_technician, -/turf/open/floor/iron, -/area/station/cargo/sorting) "rmO" = ( /obj/structure/chair/comfy/black{ dir = 8 @@ -48929,16 +48872,6 @@ /obj/machinery/light/floor, /turf/open/floor/iron, /area/station/construction/mining/aux_base) -"roG" = ( -/obj/machinery/firealarm/directional/west, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/obj/machinery/disposal/bin/tagger, -/obj/structure/sign/poster/official/random/directional/south, -/obj/effect/turf_decal/trimline/brown/filled/corner, -/turf/open/floor/iron, -/area/station/cargo/sorting) "rps" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -49165,6 +49098,20 @@ /obj/machinery/light/directional/east, /turf/open/floor/iron, /area/station/hallway/primary/aft) +"rtG" = ( +/obj/effect/turf_decal/trimline/brown/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown/line{ + dir = 6 + }, +/obj/effect/landmark/start/assistant, +/obj/structure/chair{ + dir = 1 + }, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron, +/area/station/cargo/lobby) "rtI" = ( /obj/effect/landmark/secequipment, /obj/effect/turf_decal/bot, @@ -49691,6 +49638,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"rBB" = ( +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/supply) "rBU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -49920,6 +49876,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet, /area/station/command/heads_quarters/hop) +"rGk" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 + }, +/obj/machinery/light/directional/north, +/obj/machinery/airalarm/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/modular_computer/preset/cargochat/cargo, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/cargo/sorting) "rGm" = ( /obj/machinery/door/firedoor, /obj/machinery/door/poddoor/shutters{ @@ -50249,6 +50217,10 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/plating, /area/station/maintenance/department/engine) +"rMd" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "rMe" = ( /obj/structure/table, /obj/machinery/button/door{ @@ -50338,6 +50310,10 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) +"rNA" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/cargo/sorting) "rNI" = ( /obj/machinery/door/airlock/maintenance, /obj/structure/cable, @@ -50449,13 +50425,6 @@ /obj/structure/chair/stool/directional/east, /turf/open/floor/wood, /area/station/commons/lounge) -"rPO" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "rQd" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -50678,8 +50647,8 @@ /turf/open/floor/iron, /area/station/commons/locker) "rUd" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable, /turf/open/floor/iron, /area/station/cargo/sorting) "rUo" = ( @@ -51184,14 +51153,6 @@ /obj/machinery/light/directional/east, /turf/open/floor/iron/cafeteria, /area/station/service/kitchen) -"sbP" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown/opposingcorners, -/obj/effect/landmark/start/cargo_technician, -/turf/open/floor/iron, -/area/station/cargo/storage) "sbX" = ( /obj/machinery/hydroponics/soil, /obj/effect/decal/cleanable/dirt, @@ -51418,6 +51379,12 @@ /obj/structure/window/spawner/directional/west, /turf/open/floor/iron/dark, /area/station/engineering/atmos) +"sgZ" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/door/firedoor, +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/station/cargo/sorting) "shl" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -51650,16 +51617,6 @@ /obj/machinery/door/airlock/public/glass/incinerator/atmos_exterior, /turf/open/floor/engine/vacuum, /area/station/maintenance/disposal/incinerator) -"sml" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown/opposingcorners, -/turf/open/floor/iron, -/area/station/cargo/sorting) "smt" = ( /obj/machinery/atmospherics/pipe/bridge_pipe/yellow/visible{ dir = 4 @@ -51921,6 +51878,30 @@ /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/iron/grimy, /area/station/security/office) +"ssu" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/spray/syndicate{ + pixel_y = 4; + pixel_x = 7 + }, +/obj/item/reagent_containers/pill/maintenance{ + pixel_x = -4; + pixel_y = -1 + }, +/obj/item/reagent_containers/pill/maintenance{ + pixel_x = -4; + pixel_y = 1 + }, +/obj/item/reagent_containers/pill/maintenance{ + pixel_x = -4; + pixel_y = 2 + }, +/obj/item/reagent_containers/pill/happy{ + pixel_y = 6; + pixel_x = -4 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "ssI" = ( /obj/machinery/power/emitter, /turf/open/floor/plating, @@ -51988,33 +51969,6 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"sul" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = 8; - pixel_y = 1 - }, -/obj/item/paper_bin{ - pixel_x = 8; - pixel_y = 6 - }, -/obj/item/paper_bin{ - pixel_x = 8; - pixel_y = 11 - }, -/obj/item/folder/yellow{ - pixel_x = -6; - pixel_y = 8 - }, -/obj/item/folder/yellow{ - pixel_x = -9; - pixel_y = 1 - }, -/obj/item/paper{ - pixel_x = -5 - }, -/turf/open/floor/iron, -/area/station/cargo/sorting) "sus" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -52352,6 +52306,13 @@ /obj/machinery/telecomms/server/presets/engineering, /turf/open/floor/circuit/telecomms/mainframe, /area/station/tcommsat/server) +"sAt" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/effect/turf_decal/siding/white/corner{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) "sAv" = ( /obj/machinery/stasis, /obj/machinery/defibrillator_mount/directional/north, @@ -52857,6 +52818,7 @@ "sHX" = ( /obj/effect/turf_decal/tile/brown/opposingcorners, /obj/effect/decal/cleanable/oil/slippery, +/obj/structure/cable, /turf/open/floor/iron, /area/station/cargo/sorting) "sIe" = ( @@ -52902,6 +52864,11 @@ }, /turf/open/floor/iron/dark, /area/station/science/ordnance) +"sJq" = ( +/obj/machinery/exoscanner, +/obj/effect/turf_decal/delivery/white, +/turf/open/floor/plating/reinforced, +/area/station/cargo/storage) "sJL" = ( /obj/item/crowbar, /obj/structure/cable, @@ -53175,6 +53142,19 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"sOE" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/effect/turf_decal/siding/white/corner{ + dir = 1 + }, +/obj/structure/railing/corner/end{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) "sOF" = ( /obj/structure/light_construct/directional/east, /turf/open/floor/wood, @@ -53278,11 +53258,6 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/hallway/primary/central) -"sQp" = ( -/obj/machinery/exodrone_launcher, -/obj/item/exodrone, -/turf/open/floor/plating, -/area/station/cargo/drone_bay) "sQq" = ( /obj/structure/closet/crate/hydroponics, /obj/item/paper/guides/jobs/hydroponics, @@ -54107,10 +54082,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"tdg" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/station/cargo/drone_bay) "tds" = ( /obj/effect/turf_decal/box/corners{ dir = 8 @@ -54389,6 +54360,19 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"tjt" = ( +/obj/item/sticker/syndicate/apc{ + pixel_x = 25 + }, +/obj/effect/spawner/random/engineering/tank, +/obj/structure/railing{ + dir = 10 + }, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/effect/decal/cleanable/fuel_pool, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "tju" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -55009,12 +54993,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) -"tvv" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 8 - }, -/turf/closed/wall, -/area/station/command/heads_quarters/qm) "tvE" = ( /turf/closed/wall/r_wall, /area/station/command/gateway) @@ -55681,6 +55659,18 @@ /obj/item/radio/intercom/directional/west, /turf/open/floor/carpet, /area/station/command/heads_quarters/captain/private) +"tIU" = ( +/obj/machinery/door/airlock/maintenance/glass, +/obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "tJb" = ( /obj/machinery/firealarm/directional/north, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -55967,22 +55957,6 @@ /obj/structure/sign/poster/contraband/random/directional/east, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"tMY" = ( -/obj/structure/cable, -/obj/structure/table/reinforced, -/obj/machinery/recharger{ - pixel_y = 4 - }, -/obj/item/radio/off{ - pixel_x = -11; - pixel_y = -3 - }, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 1 - }, -/obj/item/binoculars, -/turf/open/floor/iron, -/area/station/security/checkpoint/supply) "tNg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -56214,14 +56188,6 @@ /obj/item/clothing/mask/surgical, /turf/open/floor/iron/showroomfloor, /area/station/maintenance/starboard/lesser) -"tPW" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/effect/turf_decal/tile/brown/opposingcorners, -/obj/structure/filingcabinet/filingcabinet, -/turf/open/floor/iron, -/area/station/cargo/sorting) "tQp" = ( /obj/structure/cable, /obj/effect/turf_decal/siding/wood{ @@ -56720,13 +56686,6 @@ /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/plating, /area/station/security/execution/transfer) -"tYU" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/effect/turf_decal/tile/brown/opposingcorners, -/turf/open/floor/iron, -/area/station/cargo/storage) "tYW" = ( /obj/machinery/light/directional/south, /obj/structure/cable, @@ -56916,11 +56875,6 @@ /obj/machinery/telecomms/broadcaster/preset_left, /turf/open/floor/circuit/telecomms/mainframe, /area/station/tcommsat/server) -"ubn" = ( -/obj/effect/turf_decal/trimline/purple/filled/line, -/obj/effect/turf_decal/trimline/brown/filled/warning, -/turf/open/floor/iron, -/area/station/cargo/sorting) "ubp" = ( /obj/structure/girder, /obj/effect/spawner/random/structure/grille, @@ -57190,14 +57144,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"uha" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/effect/landmark/start/depsec/supply, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/security/checkpoint/supply) "uhq" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -57335,11 +57281,6 @@ /obj/structure/mirror/directional/east, /turf/open/floor/iron/freezer, /area/station/commons/toilet/restrooms) -"ujT" = ( -/obj/machinery/airalarm/directional/west, -/obj/effect/spawner/random/structure/tank_holder, -/turf/open/floor/iron, -/area/station/cargo/drone_bay) "uke" = ( /obj/structure/rack, /obj/effect/spawner/random/food_or_drink/booze{ @@ -57818,15 +57759,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"usJ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 - }, -/obj/machinery/light/directional/north, -/turf/open/floor/iron, -/area/station/cargo/sorting) "usK" = ( /obj/structure/table, /obj/item/storage/toolbox/emergency, @@ -57878,14 +57810,6 @@ }, /turf/open/floor/wood, /area/station/security/office) -"uth" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/cargo/drone_bay) "utk" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -57942,17 +57866,6 @@ dir = 8 }, /area/station/service/chapel) -"uud" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 4 - }, -/obj/effect/decal/cleanable/wrapping, -/turf/open/floor/iron, -/area/station/cargo/sorting) "uuv" = ( /obj/machinery/holopad, /obj/effect/turf_decal/stripes/line{ @@ -57972,6 +57885,18 @@ }, /turf/open/floor/iron, /area/station/security/mechbay) +"uuW" = ( +/obj/structure/table, +/obj/machinery/fax{ + fax_name = "Cargo Office"; + name = "Cargo Office Fax Machine" + }, +/obj/item/papercutter{ + pixel_x = 8; + pixel_y = 8 + }, +/turf/open/floor/iron, +/area/station/cargo/sorting) "uvw" = ( /obj/machinery/status_display/supply{ pixel_y = 32 @@ -58027,26 +57952,6 @@ /obj/machinery/duct, /turf/open/floor/iron, /area/station/engineering/main) -"uwf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/table/reinforced, -/obj/item/paper_bin{ - pixel_x = 1; - pixel_y = 9 - }, -/obj/item/pen{ - pixel_x = 1; - pixel_y = 9 - }, -/obj/item/book/manual/wiki/security_space_law, -/obj/machinery/camera/directional/south{ - c_tag = "Security Post - Cargo" - }, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/checkpoint/supply) "uwh" = ( /obj/structure/chair/comfy{ dir = 1 @@ -58074,12 +57979,6 @@ /obj/effect/landmark/start/roboticist, /turf/open/floor/iron, /area/station/science/robotics/lab) -"uwM" = ( -/obj/effect/landmark/start/depsec/supply, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/security/checkpoint/supply) "uwQ" = ( /turf/closed/wall/r_wall, /area/station/engineering/atmos) @@ -58149,6 +58048,7 @@ "uyh" = ( /obj/effect/turf_decal/tile/brown/opposingcorners, /obj/machinery/holopad, +/obj/structure/cable, /turf/open/floor/iron, /area/station/cargo/sorting) "uyi" = ( @@ -58178,6 +58078,35 @@ }, /turf/open/floor/iron/white, /area/station/command/heads_quarters/cmo) +"uyP" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/structure/table, +/obj/machinery/light/directional/east, +/obj/item/radio/intercom/directional/east, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/item/stamp/granted{ + pixel_x = -7; + pixel_y = 4 + }, +/obj/item/stamp/denied{ + pixel_x = -7; + pixel_y = 15 + }, +/obj/item/storage/box/lights/mixed{ + pixel_x = 5; + pixel_y = 12 + }, +/obj/item/storage/box/lights/mixed{ + pixel_x = 5; + pixel_y = 24 + }, +/turf/open/floor/iron, +/area/station/cargo/sorting) "uyY" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -58187,13 +58116,6 @@ "uza" = ( /turf/closed/wall/r_wall, /area/station/security/prison/visit) -"uzb" = ( -/obj/structure/rack, -/obj/machinery/light/directional/east, -/obj/item/fuel_pellet, -/obj/machinery/light_switch/directional/east, -/turf/open/floor/iron, -/area/station/cargo/drone_bay) "uzc" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -58366,6 +58288,15 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/wood, /area/station/command/corporate_showroom) +"uCR" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "uCS" = ( /obj/structure/chair/stool/directional/south, /turf/open/floor/iron, @@ -58485,6 +58416,7 @@ /obj/effect/turf_decal/arrows/red{ dir = 4 }, +/obj/effect/spawner/random/structure/crate, /turf/open/floor/iron, /area/station/cargo/storage) "uET" = ( @@ -59190,6 +59122,20 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) +"uQm" = ( +/obj/item/radio/intercom/directional/east, +/obj/structure/table/wood, +/obj/item/ph_booklet{ + pixel_y = 6; + pixel_x = 5 + }, +/obj/item/burner/oil{ + pixel_y = 6; + pixel_x = -5 + }, +/obj/item/storage/test_tube_rack/full, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "uQF" = ( /obj/structure/lattice, /obj/item/stack/rods, @@ -59293,6 +59239,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/security/prison) +"uSh" = ( +/obj/item/stack/sheet/iron/five, +/obj/item/stack/cable_coil/five, +/obj/effect/decal/cleanable/robot_debris/down, +/obj/effect/turf_decal/box, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "uSz" = ( /obj/structure/table, /obj/item/phone{ @@ -59635,15 +59588,6 @@ "uYp" = ( /turf/closed/wall, /area/station/medical/break_room) -"uYB" = ( -/obj/structure/cable, -/obj/effect/turf_decal/bot_white, -/obj/effect/spawner/random/maintenance, -/obj/effect/turf_decal/arrows/red{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) "uYD" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/stripes/line, @@ -59651,6 +59595,19 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/port) +"uYE" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/obj/structure/table/reinforced, +/obj/item/binoculars, +/obj/machinery/airalarm/directional/east, +/obj/machinery/light/small/directional/east, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/supply) "uYH" = ( /obj/structure/reflector/double/anchored{ dir = 5 @@ -60410,15 +60367,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"vlP" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/lobby) "vlY" = ( /obj/structure/table/reinforced, /obj/machinery/camera/directional/north{ @@ -61045,6 +60993,13 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/hallway/secondary/entry) +"vwg" = ( +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted, +/obj/structure/table, +/obj/effect/spawner/random/bureaucracy/birthday_wrap, +/turf/open/floor/iron, +/area/station/cargo/lobby) "vwi" = ( /obj/structure/table, /obj/item/cigarette/pipe, @@ -61900,12 +61855,6 @@ }, /turf/open/floor/carpet/royalblue, /area/station/service/library) -"vKC" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) "vKL" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -62509,6 +62458,20 @@ /obj/effect/turf_decal/tile/green/half/contrasted, /turf/open/floor/iron/white, /area/station/medical/virology) +"vUL" = ( +/obj/item/circuitboard/machine/exoscanner{ + pixel_y = -3 + }, +/obj/item/stock_parts/scanning_module{ + pixel_x = 5; + pixel_y = 7 + }, +/obj/item/stock_parts/scanning_module{ + pixel_x = 5 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "vUM" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -62999,7 +62962,6 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/turf_decal/tile/brown/opposingcorners, /turf/open/floor/iron, /area/station/cargo/sorting) "wcf" = ( @@ -63183,6 +63145,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"wfp" = ( +/obj/effect/turf_decal/siding/white{ + dir = 5 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/iron, +/area/station/cargo/storage) "wfu" = ( /obj/structure/chair/office{ dir = 8 @@ -63542,6 +63511,15 @@ }, /turf/open/floor/iron/dark, /area/station/security/evidence) +"wme" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Security Post - Cargo" + }, +/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/security/checkpoint/supply) "wmf" = ( /obj/effect/spawner/random/trash/garbage{ spawn_scatter_radius = 1 @@ -63736,14 +63714,6 @@ /obj/effect/mapping_helpers/airlock/access/all/command/ai_upload, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai_upload) -"wpO" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown/opposingcorners, -/obj/effect/spawner/random/structure/crate, -/turf/open/floor/iron, -/area/station/cargo/sorting) "wqh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -63810,12 +63780,6 @@ }, /turf/open/floor/carpet, /area/station/service/theater) -"wsk" = ( -/obj/structure/railing/corner/end/flip, -/obj/effect/turf_decal/stripes/corner, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) "wsq" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/security{ @@ -63869,6 +63833,14 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/white, /area/station/medical/treatment_center) +"wsx" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/cargo/storage) "wsD" = ( /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/iron, @@ -64020,14 +63992,6 @@ }, /turf/open/floor/iron, /area/station/security/holding_cell) -"wuo" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/sorting) "wuM" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, @@ -64126,6 +64090,13 @@ /obj/effect/turf_decal/tile/purple/fourcorners, /turf/open/floor/iron, /area/station/science/robotics/mechbay) +"wwN" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/item/chair/wood, +/obj/effect/decal/cleanable/oil/slippery, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "wwW" = ( /obj/effect/turf_decal/trimline/purple/line{ dir = 1 @@ -64251,14 +64222,6 @@ /obj/machinery/bouldertech/refinery/smelter, /turf/open/floor/iron, /area/station/cargo/miningoffice) -"wyS" = ( -/obj/machinery/computer/cargo{ - dir = 4 - }, -/obj/structure/window/spawner/directional/west, -/obj/effect/turf_decal/tile/brown/opposingcorners, -/turf/open/floor/iron, -/area/station/cargo/sorting) "wyV" = ( /turf/open/floor/carpet/orange, /area/station/command/heads_quarters/qm) @@ -64395,6 +64358,15 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, /area/station/hallway/primary/central) +"wBK" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/siding/white/corner{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) "wBM" = ( /obj/machinery/door/firedoor, /obj/structure/cable, @@ -65239,17 +65211,6 @@ /obj/structure/reagent_dispensers/fueltank/large, /turf/open/floor/iron, /area/station/engineering/atmos) -"wTv" = ( -/obj/machinery/airalarm/directional/north, -/obj/machinery/modular_computer/preset/cargochat/cargo{ - dir = 8 - }, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/sorting) "wTF" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -65683,6 +65644,13 @@ }, /turf/open/floor/iron, /area/station/command/gateway) +"xbu" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/security/checkpoint/supply) "xbT" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -67119,11 +67087,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/main) -"xBq" = ( -/obj/effect/landmark/event_spawn, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/cargo/drone_bay) "xBw" = ( /obj/machinery/door/airlock/engineering{ name = "Starboard Quarter Solar Access" @@ -67554,6 +67517,21 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) +"xJj" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/tank_holder/extinguisher{ + pixel_x = -9 + }, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/supply) "xJv" = ( /obj/machinery/light/directional/north, /turf/open/floor/iron/recharge_floor, @@ -67604,6 +67582,12 @@ }, /turf/open/floor/iron/white, /area/station/science/ordnance/testlab) +"xKh" = ( +/obj/structure/railing{ + dir = 10 + }, +/turf/open/floor/plating/reinforced, +/area/station/cargo/storage) "xKk" = ( /obj/machinery/photocopier, /turf/open/floor/iron/white, @@ -67632,15 +67616,6 @@ }, /turf/open/floor/wood, /area/station/commons/vacant_room/office) -"xLA" = ( -/obj/machinery/computer/records/security{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/checkpoint/supply) "xLR" = ( /obj/structure/table, /obj/item/stack/sheet/iron/fifty, @@ -67660,10 +67635,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/central) -"xMx" = ( -/obj/structure/chair/office, -/turf/open/floor/iron, -/area/station/cargo/drone_bay) "xMz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -67891,10 +67862,6 @@ /obj/structure/cable/layer3, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) -"xQO" = ( -/obj/machinery/exodrone_launcher, -/turf/open/floor/plating, -/area/station/cargo/drone_bay) "xQT" = ( /obj/machinery/power/apc/auto_name/directional/south, /obj/effect/turf_decal/siding/wood{ @@ -67932,6 +67899,15 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, /turf/open/floor/plating, /area/station/engineering/atmos) +"xRO" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/cargo/sorting) "xRR" = ( /obj/structure/bodycontainer/morgue/beeper_off, /obj/structure/bodycontainer/morgue/beeper_off{ @@ -67958,6 +67934,12 @@ "xRZ" = ( /turf/open/floor/iron, /area/station/engineering/atmos/pumproom) +"xSc" = ( +/obj/structure/frame/machine/secured, +/obj/effect/decal/cleanable/robot_debris, +/obj/effect/turf_decal/box, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "xSO" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -68492,14 +68474,6 @@ /obj/machinery/incident_display/delam/directional/north, /turf/open/floor/iron, /area/station/engineering/main) -"ybn" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) "ybu" = ( /obj/machinery/portable_atmospherics/canister/carbon_dioxide, /obj/machinery/atmospherics/components/unary/portables_connector/visible{ @@ -68626,6 +68600,11 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmos) +"ydi" = ( +/obj/structure/railing/corner/end/flip, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "ydj" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, @@ -68778,6 +68757,10 @@ }, /turf/open/floor/wood, /area/station/service/library) +"yfX" = ( +/obj/effect/decal/cleanable/ash, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "ygb" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -68790,6 +68773,12 @@ }, /turf/open/floor/iron, /area/station/engineering/break_room) +"ygk" = ( +/obj/effect/turf_decal/trimline/purple/filled/line, +/obj/effect/turf_decal/trimline/brown/filled/warning, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/cargo/sorting) "ygp" = ( /obj/machinery/status_display/ai/directional/north, /obj/structure/cable, @@ -68955,18 +68944,6 @@ /obj/effect/spawner/random/bureaucracy/stamp, /turf/open/floor/wood, /area/station/commons/vacant_room/office) -"ykb" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/mining{ - name = "Deliveries" - }, -/obj/effect/mapping_helpers/airlock/access/any/supply/shipping, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/brown/fourcorners, -/turf/open/floor/iron, -/area/station/cargo/sorting) "ykn" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/machinery/door/airlock/external{ @@ -69067,14 +69044,6 @@ /obj/machinery/light/directional/east, /turf/open/floor/iron, /area/station/commons/dorms) -"ylO" = ( -/obj/machinery/firealarm/directional/north, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/trimline/red/filled/corner{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) "ylQ" = ( /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -82353,7 +82322,7 @@ pOa rJS pOa jUb -lvY +jCs sZK heE kzZ @@ -86415,7 +86384,7 @@ paD jpG kRe nVG -qOZ +pDf hKg hKg ouu @@ -86454,7 +86423,7 @@ vsr wfZ soa pOa -myZ +aFz sXI sNM tYi @@ -86933,8 +86902,8 @@ poj hnV tPt gUH -dAk -dAk +omc +wBK rhn qnj iqt @@ -87185,17 +87154,17 @@ aZj cSP cLj kRe +kRe tid qTf -oor -oor -hDX -hrC -kuS -muq +hKg +cbz +cKD +wfp +aQb oRO -bgx -uYB +aok +pkM aok mml aok @@ -87442,17 +87411,17 @@ jXu hzb cLj kRe +kRe cBZ wyP -oor -jqr -xLA -hrC -hrC -mmR -kwh -iqt -nut +hKg +kyf +kFQ +xKh +eDO +kFb +aok +oNR aok pkM aok @@ -87697,18 +87666,18 @@ omV fhn cuh jBp -wsk +cLj +ydi qHt dxo hlE -oor -aKN -uha -tMY -hDX +hKg +ljT +jrQ +qlh +oHm +sOE aok -sbP -bgx aok aok xtH @@ -87954,18 +87923,18 @@ cAf dve jXu pVV -qqr +cLj +cUt iId tkf wZo -oor -hvo -uwM -uwf -oor -ylO -tYU -hLL +hKg +rgW +nkq +bNw +nxI +gsV +dfk dfk dfk rQD @@ -88215,14 +88184,14 @@ oMx hKg hKg hKg -oor -jmR -hWK -fea -iHS -cqy -ebg -ebg +hKg +hKg +sJq +oOY +aCO +oRx +sAt +fwb fwb kQO qvV @@ -88456,9 +88425,9 @@ pma pma pma hZQ +hlT jXu -jXu -hsx +tIU jXu jXu jXu @@ -88477,7 +88446,7 @@ jXu jXu jXu cbz -bLY +lcI gQa dit uBj @@ -88491,10 +88460,10 @@ xgx rzo quT iev -gPN +pjX ebd ebd -jBy +bfw iev iev bBy @@ -88711,14 +88680,14 @@ aaa aaa aaa aaa -tdg -hkj -sQp -kuW -qHa -ujT -dYi -iDG +nmg +haZ +uSh +fzo +rNP +ieD +ssu +ggW jXu fpn knQ @@ -88744,11 +88713,11 @@ cgZ hIp ksM lQf -vKC -fwd -mwP -oTw -nLx +wsx +dsJ +npX +dtw +lzD sHX uyh hvB @@ -88968,14 +88937,14 @@ aaa aaa aaa aaa -tdg -hkj -hkj -kuW -uth -xBq -mUF -obF +nmg +gOO +rMd +eVG +rkX +wwN +aZz +kgZ jXu fpn jXu @@ -88993,10 +88962,10 @@ gfa eOl vjg mLp -tvv +kQP xTe xTe -tvv +kQP kQP wdM asT @@ -89005,9 +88974,9 @@ kkB lVp bzH bzH -mzj -sml -rmL +rGk +xRO +rNA hOh lAi bzH @@ -89225,14 +89194,14 @@ sjP sjP lMJ lMJ -tdg -hkj -xQO -dfU -ikL -qST -xMx -qrF +nmg +vUL +xSc +pnl +xgB +yfX +pGJ +fMa jXu vxO jXu @@ -89256,16 +89225,16 @@ nwm izI kQP eRd -vlP +cIl qxJ vNp -hvk -bzH -dGC -uud -wbW -fWn -jHW +erU +aqG +uuW +pPm +jHM +hCh +exB vjU bzH buH @@ -89482,14 +89451,14 @@ dMH sjP aaa aaa -tdg -tdg -tdg -fru -elz -uzb -phP -rgL +nmg +nmg +nmg +jXu +tjt +aUU +uQm +jzq jXu paU jXu @@ -89517,12 +89486,12 @@ rVn qxJ sik ryV -paQ -wyS -ekb -wpO +mhM +qCx +cap wbW -ubn +wbW +ygk hld iev rKI @@ -89774,12 +89743,12 @@ aUm jvv bNN rod -mhM -dfK -wuo -tPW -ayz -bLj +sgZ +gav +hab +uyP +ejD +rUd rnh iev nJJ @@ -90030,15 +89999,15 @@ vdW oac fhB hxd -dHz -aqG -geR -ekb -lsU -bQl -pCs -bzH -bzH +rtG +oor +oor +wme +oor +xbu +oor +oor +oor pNk ivB qaw @@ -90287,15 +90256,15 @@ pUk upN qxJ ajq -eml -bzH -bvl -nKu -gxM -jRo -qCx -roG -bzH +vwg +afW +agd +rBB +kJk +xJj +gZq +aiy +oor mnP tEr iOc @@ -90530,7 +90499,7 @@ okj rlU qYC pNC -lpt +qme cNg kQP kQP @@ -90545,17 +90514,17 @@ hIu liX jUs nDG -bzH -bzH -usJ -kFa -lak -rUd -cXE -ykb -cJS -ybn -fLp +oor +oor +oby +kDb +imT +gPw +qNL +fEV +pVK +xOw +uCR sVY sDT mjr @@ -90803,13 +90772,13 @@ isA eKG iit pWb -bzH -wTv -sul -pkF -dtE -dSH -aqG +afW +kkA +fMC +uYE +iQb +hRJ +afW mnP xOw iOc @@ -91060,13 +91029,13 @@ lgg uLE cSu nPN -bzH -aqG -aqG -mxx -aqG -aqG -aqG +oor +afW +afW +pog +oor +afW +afW uGU mFo npY @@ -91796,7 +91765,7 @@ hDE wZz wZz wZz -sjP +qHW iPb iPb uza @@ -93628,7 +93597,7 @@ aaa ihq ooP hZZ -rPO +dfa gmI aKb xel @@ -104419,7 +104388,7 @@ pJE pJE nFn uUl -qJH +oYs qXB wzK tcC diff --git a/_maps/map_files/Mining/Lavaland.dmm b/_maps/map_files/Mining/Lavaland.dmm index 01234def932..caa7913d2fc 100644 --- a/_maps/map_files/Mining/Lavaland.dmm +++ b/_maps/map_files/Mining/Lavaland.dmm @@ -8836,7 +8836,7 @@ /area/mine/laborcamp/security) "Ya" = ( /obj/machinery/vending/security{ - onstation_override = 1 + all_products_free = 0 }, /obj/effect/turf_decal/trimline/red/filled/line{ dir = 10 diff --git a/_maps/map_files/NorthStar/north_star.dmm b/_maps/map_files/NorthStar/north_star.dmm index 0d591a0ea0e..cafc8754cd8 100644 --- a/_maps/map_files/NorthStar/north_star.dmm +++ b/_maps/map_files/NorthStar/north_star.dmm @@ -52888,7 +52888,7 @@ /area/station/hallway/secondary/exit) "nDj" = ( /obj/machinery/door/firedoor, -/obj/machinery/vending/boozeomat/all_access, +/obj/machinery/vending/boozeomat, /turf/open/floor/plating, /area/station/medical/abandoned) "nDk" = ( @@ -55522,7 +55522,7 @@ /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/fore) "omh" = ( -/obj/machinery/vending/boozeomat/all_access, +/obj/machinery/vending/boozeomat, /turf/open/floor/wood/tile, /area/station/command/heads_quarters/captain/private) "omj" = ( @@ -67719,7 +67719,7 @@ /turf/open/floor/pod/light, /area/station/maintenance/floor1/starboard/fore) "rtH" = ( -/obj/machinery/vending/boozeomat/all_access, +/obj/machinery/vending/boozeomat, /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood, /area/station/service/abandoned_gambling_den) diff --git a/_maps/map_files/debug/runtimestation.dmm b/_maps/map_files/debug/runtimestation.dmm index dfab71ec797..280fcdfc858 100644 --- a/_maps/map_files/debug/runtimestation.dmm +++ b/_maps/map_files/debug/runtimestation.dmm @@ -2541,8 +2541,7 @@ "Xg" = ( /obj/machinery/light/directional/east, /obj/machinery/vending/syndichem{ - onstation = 0; - req_access = null + onstation = 0 }, /turf/open/floor/iron, /area/station/medical/chemistry) diff --git a/_maps/map_files/tramstation/tramstation.dmm b/_maps/map_files/tramstation/tramstation.dmm index bcf24651157..9480252ff13 100644 --- a/_maps/map_files/tramstation/tramstation.dmm +++ b/_maps/map_files/tramstation/tramstation.dmm @@ -56951,7 +56951,7 @@ /turf/closed/wall, /area/station/maintenance/port/aft) "tdR" = ( -/obj/machinery/vending/autodrobe/all_access, +/obj/machinery/vending/autodrobe, /obj/effect/turf_decal/tile/blue/opposingcorners{ dir = 1 }, diff --git a/_maps/map_files/wawastation/wawastation.dmm b/_maps/map_files/wawastation/wawastation.dmm index 47ed0380935..096cf003ac4 100644 --- a/_maps/map_files/wawastation/wawastation.dmm +++ b/_maps/map_files/wawastation/wawastation.dmm @@ -1631,7 +1631,7 @@ /obj/effect/landmark/event_spawn, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/service/kitchen) +/area/station/service/kitchen/coldroom) "aAk" = ( /obj/machinery/holopad, /obj/effect/turf_decal/box, @@ -2135,7 +2135,7 @@ /obj/structure/reagent_dispensers/cooking_oil, /obj/machinery/camera/autoname/directional/south, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/service/kitchen) +/area/station/service/kitchen/coldroom) "aJz" = ( /obj/structure/railing, /obj/structure/table, @@ -4200,7 +4200,7 @@ "byb" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/service/kitchen) +/area/station/service/kitchen/coldroom) "byf" = ( /obj/structure/closet/emcloset/anchored, /turf/open/floor/plating, @@ -8267,7 +8267,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /mob/living/basic/goat/pete, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/service/kitchen) +/area/station/service/kitchen/coldroom) "cYP" = ( /obj/effect/landmark/event_spawn, /obj/structure/cable, @@ -10056,7 +10056,7 @@ "dCh" = ( /obj/machinery/gibber, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/service/kitchen) +/area/station/service/kitchen/coldroom) "dCi" = ( /obj/structure/table/reinforced/rglass, /obj/item/storage/backpack/duffelbag/sec, @@ -15077,7 +15077,7 @@ /turf/open/floor/iron, /area/station/hallway/primary/central) "ftK" = ( -/obj/machinery/vending/autodrobe/all_access, +/obj/machinery/vending/autodrobe, /obj/effect/turf_decal/tile/red/half/contrasted, /obj/machinery/firealarm/directional/south, /turf/open/floor/iron/dark, @@ -16256,7 +16256,7 @@ "fNy" = ( /obj/structure/closet/secure_closet/freezer/meat, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/service/kitchen) +/area/station/service/kitchen/coldroom) "fNB" = ( /obj/effect/turf_decal/tile/red/anticorner/contrasted{ dir = 1 @@ -33124,7 +33124,7 @@ /area/station/hallway/secondary/exit/departure_lounge) "lIZ" = ( /obj/effect/turf_decal/sand/plating, -/obj/machinery/vending/boozeomat/all_access, +/obj/machinery/vending/boozeomat, /turf/open/floor/plating, /area/station/maintenance/central/greater) "lJo" = ( @@ -34147,7 +34147,7 @@ /turf/open/floor/iron, /area/station/cargo/lobby) "mds" = ( -/obj/machinery/vending/autodrobe/all_access, +/obj/machinery/vending/autodrobe, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/delivery, /obj/machinery/camera/autoname/directional/west, @@ -36207,6 +36207,9 @@ /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating, /area/station/maintenance/department/cargo) +"mMT" = ( +/turf/closed/wall, +/area/station/service/kitchen/coldroom) "mNl" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, @@ -37574,6 +37577,13 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"nlz" = ( +/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/west, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, +/area/station/service/kitchen/coldroom) "nlI" = ( /obj/effect/landmark/start/depsec/engineering, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -40888,8 +40898,10 @@ /area/station/maintenance/department/science) "oBU" = ( /obj/machinery/food_cart, +/obj/machinery/airalarm/directional/north, +/obj/effect/mapping_helpers/airalarm/tlv_cold_room, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/service/kitchen) +/area/station/service/kitchen/coldroom) "oCb" = ( /obj/machinery/atmospherics/pipe/smart/simple/green/visible{ dir = 1 @@ -44775,7 +44787,7 @@ /obj/structure/kitchenspike, /obj/machinery/light/directional/west, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/service/kitchen) +/area/station/service/kitchen/coldroom) "pTt" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -47955,6 +47967,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/ai_monitored/turret_protected/ai_upload_foyer) +"rbt" = ( +/obj/machinery/door/airlock{ + name = "Kitchen Cold Room" + }, +/obj/effect/mapping_helpers/airlock/access/all/service/kitchen, +/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/kitchen_coldroom/freezerfloor, +/area/station/service/kitchen/coldroom) "rbw" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, @@ -50245,7 +50267,7 @@ /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) +/area/station/service/kitchen/coldroom) "rNJ" = ( /turf/closed/wall, /area/station/maintenance/solars/port/fore) @@ -53736,7 +53758,7 @@ /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) +/area/station/service/kitchen/coldroom) "sUM" = ( /obj/item/radio/intercom/directional/west, /turf/open/openspace, @@ -55255,7 +55277,7 @@ /obj/structure/kitchenspike, /obj/item/radio/intercom/directional/west, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/service/kitchen) +/area/station/service/kitchen/coldroom) "txo" = ( /obj/effect/turf_decal/caution/stand_clear, /turf/open/floor/engine, @@ -59791,7 +59813,7 @@ "uZg" = ( /obj/machinery/icecream_vat, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/service/kitchen) +/area/station/service/kitchen/coldroom) "uZx" = ( /turf/closed/wall, /area/station/hallway/primary/central) @@ -93333,10 +93355,10 @@ bIi acc jrX gGm -enu -enu -enu -enu +mMT +mMT +mMT +mMT edv eBb hRB @@ -93589,12 +93611,12 @@ kYl sUD dGc fDN -enu -enu +mMT +mMT twW pTn -enu -enu +mMT +mMT hwk hRB jkF @@ -93846,12 +93868,12 @@ heh jUd acc fDN -enu +mMT uZg byb rNs -rNs -sUI +nlz +rbt cXL enu tGt @@ -94103,12 +94125,12 @@ acc acc acc fDN -enu +mMT oBU aAg cYH aJv -enu +mMT drJ shG vMb @@ -94360,12 +94382,12 @@ acB jmn atX mUW -enu +mMT fNy rNs rNs dCh -enu +mMT alP enu nii @@ -94617,12 +94639,12 @@ gGS bcu bcu pPy -enu -enu +mMT +mMT sUI -enu -enu -enu +mMT +mMT +mMT duS pQM pYu diff --git a/_maps/shuttles/emergency_cruise.dmm b/_maps/shuttles/emergency_cruise.dmm index c111505c147..13b160b6531 100644 --- a/_maps/shuttles/emergency_cruise.dmm +++ b/_maps/shuttles/emergency_cruise.dmm @@ -220,7 +220,7 @@ /turf/open/floor/iron, /area/shuttle/escape) "fL" = ( -/obj/machinery/vending/boozeomat/all_access, +/obj/machinery/vending/boozeomat, /turf/open/floor/carpet/executive, /area/shuttle/escape) "fY" = ( @@ -2262,7 +2262,7 @@ /turf/template_noop, /area/shuttle/escape) "Xu" = ( -/obj/machinery/vending/boozeomat/all_access, +/obj/machinery/vending/boozeomat, /obj/effect/turf_decal/siding/wood{ dir = 1 }, diff --git a/_maps/shuttles/emergency_humpback.dmm b/_maps/shuttles/emergency_humpback.dmm index f76d06925a3..195f342cd3c 100644 --- a/_maps/shuttles/emergency_humpback.dmm +++ b/_maps/shuttles/emergency_humpback.dmm @@ -115,7 +115,7 @@ /area/shuttle/escape/brig) "gW" = ( /obj/structure/window/reinforced/plasma/spawner/directional/east, -/obj/machinery/vending/boozeomat/all_access, +/obj/machinery/vending/boozeomat, /turf/open/floor/mineral/plastitanium, /area/shuttle/escape) "hd" = ( diff --git a/_maps/shuttles/emergency_imfedupwiththisworld.dmm b/_maps/shuttles/emergency_imfedupwiththisworld.dmm index 6513f090c53..cf53733c423 100644 --- a/_maps/shuttles/emergency_imfedupwiththisworld.dmm +++ b/_maps/shuttles/emergency_imfedupwiththisworld.dmm @@ -30,9 +30,7 @@ /area/shuttle/escape) "k" = ( /obj/machinery/light/directional/east, -/obj/machinery/vending/boozeomat{ - req_access = null - }, +/obj/machinery/vending/boozeomat, /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/shuttle/escape) diff --git a/_maps/shuttles/emergency_luxury.dmm b/_maps/shuttles/emergency_luxury.dmm index 74b18ef61b4..1e1ae99d2ea 100644 --- a/_maps/shuttles/emergency_luxury.dmm +++ b/_maps/shuttles/emergency_luxury.dmm @@ -589,7 +589,7 @@ /turf/open/floor/carpet/green, /area/shuttle/escape/luxury) "zq" = ( -/obj/machinery/vending/boozeomat/all_access, +/obj/machinery/vending/boozeomat, /turf/closed/indestructible/riveted/plastinum/nodiagonal, /area/shuttle/escape/brig) "zt" = ( diff --git a/_maps/shuttles/emergency_tranquility.dmm b/_maps/shuttles/emergency_tranquility.dmm index 4563d89631c..ae3924becbc 100644 --- a/_maps/shuttles/emergency_tranquility.dmm +++ b/_maps/shuttles/emergency_tranquility.dmm @@ -453,7 +453,7 @@ /area/shuttle/escape) "jb" = ( /obj/machinery/barsign/all_access/directional/north, -/obj/machinery/vending/boozeomat/all_access, +/obj/machinery/vending/boozeomat, /turf/open/floor/stone, /area/shuttle/escape) "jl" = ( diff --git a/_maps/shuttles/hunter_mi13_foodtruck.dmm b/_maps/shuttles/hunter_mi13_foodtruck.dmm index 5fe7324e8e8..6ece8822d80 100644 --- a/_maps/shuttles/hunter_mi13_foodtruck.dmm +++ b/_maps/shuttles/hunter_mi13_foodtruck.dmm @@ -123,7 +123,7 @@ /turf/open/floor/circuit/red/off, /area/shuttle/hunter/mi13_foodtruck) "eA" = ( -/obj/machinery/vending/medical/syndicate_access/cybersun, +/obj/machinery/vending/medical/syndicate/cybersun, /obj/machinery/airalarm/directional/west, /obj/effect/mapping_helpers/airalarm/syndicate_access, /turf/open/floor/circuit/red/off, diff --git a/_maps/shuttles/infiltrator_advanced.dmm b/_maps/shuttles/infiltrator_advanced.dmm index 9f93df25b04..1800d638fc5 100644 --- a/_maps/shuttles/infiltrator_advanced.dmm +++ b/_maps/shuttles/infiltrator_advanced.dmm @@ -710,7 +710,7 @@ /area/shuttle/syndicate/eva) "bP" = ( /obj/effect/turf_decal/bot, -/obj/machinery/vending/medical/syndicate_access, +/obj/machinery/vending/medical/syndicate, /turf/open/floor/mineral/plastitanium, /area/shuttle/syndicate/medical) "bQ" = ( diff --git a/_maps/shuttles/pirate_default.dmm b/_maps/shuttles/pirate_default.dmm index 43c72a9d2bf..182f51ad3b6 100644 --- a/_maps/shuttles/pirate_default.dmm +++ b/_maps/shuttles/pirate_default.dmm @@ -567,9 +567,7 @@ /turf/open/floor/iron, /area/shuttle/pirate) "bH" = ( -/obj/machinery/vending/boozeomat/all_access{ - onstation = 0 - }, +/obj/machinery/vending/boozeomat, /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/shuttle/pirate) diff --git a/_maps/shuttles/pirate_dutchman.dmm b/_maps/shuttles/pirate_dutchman.dmm index 1d1a0b0902b..a00fff6e7e9 100644 --- a/_maps/shuttles/pirate_dutchman.dmm +++ b/_maps/shuttles/pirate_dutchman.dmm @@ -359,10 +359,33 @@ }, /turf/open/floor/carpet/blue/airless, /area/shuttle/pirate/flying_dutchman) +"nb" = ( +/obj/structure/mounted_gun/canister_gatling, +/turf/open/floor/wood/airless, +/area/shuttle/pirate/flying_dutchman) "pG" = ( /obj/structure/window/reinforced/shuttle/survival_pod, /turf/open/floor/wood/airless, /area/shuttle/pirate/flying_dutchman) +"qG" = ( +/obj/item/ammo_casing/canister_shot{ + pixel_y = 8; + pixel_x = -8 + }, +/obj/item/ammo_casing/canister_shot{ + pixel_y = -8; + pixel_x = -8 + }, +/obj/item/ammo_casing/canister_shot{ + pixel_x = 6; + pixel_y = -8 + }, +/obj/item/ammo_casing/canister_shot{ + pixel_y = 8; + pixel_x = 6 + }, +/turf/open/floor/wood/airless, +/area/shuttle/pirate/flying_dutchman) "rd" = ( /obj/effect/turf_decal/siding/wood/corner, /obj/effect/turf_decal/siding/wood/corner{ @@ -1234,7 +1257,7 @@ fW St QM da -WB +nb WB RQ eG @@ -1261,7 +1284,7 @@ km sC mG bn -WB +qG WB xY WR diff --git a/_maps/shuttles/pirate_ex_interdyne.dmm b/_maps/shuttles/pirate_ex_interdyne.dmm index 4036972b7a8..3896e755f85 100644 --- a/_maps/shuttles/pirate_ex_interdyne.dmm +++ b/_maps/shuttles/pirate_ex_interdyne.dmm @@ -775,7 +775,7 @@ /area/shuttle/pirate) "OL" = ( /obj/effect/turf_decal/tile/dark_blue/half/contrasted, -/obj/machinery/vending/medical/syndicate_access, +/obj/machinery/vending/medical/syndicate, /turf/open/floor/iron/dark, /area/shuttle/pirate) "Po" = ( diff --git a/_maps/shuttles/pirate_grey.dmm b/_maps/shuttles/pirate_grey.dmm index db02acbdd48..50594b83d9b 100644 --- a/_maps/shuttles/pirate_grey.dmm +++ b/_maps/shuttles/pirate_grey.dmm @@ -183,7 +183,7 @@ /turf/open/floor/plating, /area/shuttle/pirate) "gQ" = ( -/obj/machinery/vending/boozeomat/all_access, +/obj/machinery/vending/boozeomat, /turf/closed/wall, /area/shuttle/pirate) "hk" = ( diff --git a/_maps/shuttles/pirate_irs.dmm b/_maps/shuttles/pirate_irs.dmm index 4fd5a8c3573..c78c73a7538 100644 --- a/_maps/shuttles/pirate_irs.dmm +++ b/_maps/shuttles/pirate_irs.dmm @@ -946,9 +946,7 @@ }, /area/shuttle/pirate) "Cf" = ( -/obj/machinery/vending/autodrobe{ - onstation = 0 - }, +/obj/machinery/vending/autodrobe, /obj/effect/turf_decal/siding/dark_green{ dir = 6 }, @@ -1642,9 +1640,7 @@ /turf/open/floor/wood, /area/shuttle/pirate) "QT" = ( -/obj/machinery/vending/boozeomat/all_access{ - onstation = 0 - }, +/obj/machinery/vending/boozeomat, /turf/closed/wall/mineral/titanium, /area/shuttle/pirate) "QV" = ( diff --git a/_maps/shuttles/pirate_silverscale.dmm b/_maps/shuttles/pirate_silverscale.dmm index 6d9c7537bde..b95c32be7d1 100644 --- a/_maps/shuttles/pirate_silverscale.dmm +++ b/_maps/shuttles/pirate_silverscale.dmm @@ -492,9 +492,7 @@ /turf/open/floor/iron/dark, /area/shuttle/pirate) "CW" = ( -/obj/machinery/vending/boozeomat/all_access{ - onstation = 0 - }, +/obj/machinery/vending/boozeomat, /turf/open/floor/iron/dark/textured, /area/shuttle/pirate) "DX" = ( @@ -967,9 +965,7 @@ /turf/open/floor/carpet/royalblack, /area/shuttle/pirate) "XB" = ( -/obj/machinery/vending/boozeomat/all_access{ - onstation = 0 - }, +/obj/machinery/vending/boozeomat, /obj/machinery/light/small/directional/south, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 10 diff --git a/_maps/shuttles/whiteship_box.dmm b/_maps/shuttles/whiteship_box.dmm index 8aa60f4e93b..ed2e2a17b90 100644 --- a/_maps/shuttles/whiteship_box.dmm +++ b/_maps/shuttles/whiteship_box.dmm @@ -1272,9 +1272,7 @@ /area/shuttle/abandoned/medbay) "cL" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/vending/medical{ - req_access = null - }, +/obj/machinery/vending/medical, /obj/machinery/airalarm/directional/north, /obj/effect/mapping_helpers/airalarm/all_access, /turf/open/floor/iron/white, diff --git a/_maps/shuttles/whiteship_cere.dmm b/_maps/shuttles/whiteship_cere.dmm index df697dc1739..fbcca99889a 100644 --- a/_maps/shuttles/whiteship_cere.dmm +++ b/_maps/shuttles/whiteship_cere.dmm @@ -581,7 +581,7 @@ /turf/open/floor/pod/dark, /area/shuttle/abandoned/cargo) "CC" = ( -/obj/machinery/vending/boozeomat/all_access, +/obj/machinery/vending/boozeomat, /obj/effect/decal/cleanable/dirt, /obj/machinery/airalarm/directional/east, /obj/effect/mapping_helpers/airalarm/unlocked, diff --git a/_maps/shuttles/whiteship_delta.dmm b/_maps/shuttles/whiteship_delta.dmm index efc23023797..f75f87001b5 100644 --- a/_maps/shuttles/whiteship_delta.dmm +++ b/_maps/shuttles/whiteship_delta.dmm @@ -101,7 +101,7 @@ /turf/open/floor/plating, /area/shuttle/abandoned/crew) "ap" = ( -/obj/machinery/vending/boozeomat/all_access, +/obj/machinery/vending/boozeomat, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, diff --git a/_maps/shuttles/whiteship_kilo.dmm b/_maps/shuttles/whiteship_kilo.dmm index 3dda9d34da2..0192f6aa118 100644 --- a/_maps/shuttles/whiteship_kilo.dmm +++ b/_maps/shuttles/whiteship_kilo.dmm @@ -399,14 +399,7 @@ /turf/open/floor/plating, /area/shuttle/abandoned/cargo) "ry" = ( -/obj/machinery/porta_turret/centcom_shuttle/weak{ - dir = 4; - name = "Old Mining Turret"; - lethal_projectile = /obj/projectile/kinetic/miner; - lethal_projectile_sound = 'sound/weapons/kinetic_accel.ogg'; - stun_projectile = /obj/projectile/kinetic/miner; - stun_projectile_sound = 'sound/weapons/kinetic_accel.ogg' - }, +/obj/machinery/porta_turret/centcom_shuttle/weak/mining, /turf/closed/wall/mineral/titanium, /area/shuttle/abandoned/bar) "rC" = ( diff --git a/_maps/shuttles/whiteship_obelisk.dmm b/_maps/shuttles/whiteship_obelisk.dmm index 0f1e07b1a21..9a680e80e2b 100644 --- a/_maps/shuttles/whiteship_obelisk.dmm +++ b/_maps/shuttles/whiteship_obelisk.dmm @@ -732,9 +732,7 @@ /turf/open/floor/mineral/titanium/white, /area/shuttle/abandoned/medbay) "Qp" = ( -/obj/machinery/vending/medical{ - req_access = null - }, +/obj/machinery/vending/medical, /turf/open/floor/mineral/titanium/white, /area/shuttle/abandoned/medbay) "RG" = ( diff --git a/_maps/templates/battlecruiser_starfury.dmm b/_maps/templates/battlecruiser_starfury.dmm index 59d6b325fda..15d7485c99b 100644 --- a/_maps/templates/battlecruiser_starfury.dmm +++ b/_maps/templates/battlecruiser_starfury.dmm @@ -1061,7 +1061,7 @@ }, /area/shuttle/sbc_starfury) "ea" = ( -/obj/machinery/vending/medical/syndicate_access/cybersun, +/obj/machinery/vending/medical/syndicate/cybersun, /turf/open/floor/iron, /area/shuttle/sbc_starfury) "ec" = ( @@ -1723,7 +1723,7 @@ /turf/open/floor/pod/light, /area/shuttle/sbc_starfury) "gH" = ( -/obj/machinery/vending/boozeomat/syndicate_access, +/obj/machinery/vending/boozeomat/syndicate, /obj/effect/turf_decal/siding/wood{ dir = 8 }, diff --git a/_maps/templates/holodeck_holdoutbunker.dmm b/_maps/templates/holodeck_holdoutbunker.dmm index 782cbd919aa..fccad07bfed 100644 --- a/_maps/templates/holodeck_holdoutbunker.dmm +++ b/_maps/templates/holodeck_holdoutbunker.dmm @@ -28,12 +28,6 @@ }, /turf/open/floor/holofloor/asteroid, /area/template_noop) -"x" = ( -/obj/structure/foamedmetal, -/obj/structure/window/spawner/directional/east, -/obj/structure/bookcase/random/fiction, -/turf/open/floor/holofloor/asteroid, -/area/template_noop) "I" = ( /obj/structure/table, /obj/item/gun/energy/laser, @@ -62,7 +56,7 @@ a "} (2,1,1) = {" b -x +b b b b diff --git a/_maps/templates/lazy_templates/wizard_den.dmm b/_maps/templates/lazy_templates/wizard_den.dmm index 887e1c08176..a909cc94c23 100644 --- a/_maps/templates/lazy_templates/wizard_den.dmm +++ b/_maps/templates/lazy_templates/wizard_den.dmm @@ -665,9 +665,6 @@ /turf/open/floor/engine/cult, /area/centcom/wizard_station) "KL" = ( -/obj/structure/railing{ - dir = 8 - }, /obj/structure/railing{ dir = 8 }, diff --git a/_maps/templates/shelter_3.dmm b/_maps/templates/shelter_3.dmm index d4681507a37..2bae50e8ba7 100644 --- a/_maps/templates/shelter_3.dmm +++ b/_maps/templates/shelter_3.dmm @@ -35,9 +35,7 @@ /turf/open/floor/pod/dark, /area/misc/survivalpod) "h" = ( -/obj/machinery/vending/boozeomat/all_access{ - onstation = 0 - }, +/obj/machinery/vending/boozeomat, /turf/open/floor/pod/dark, /area/misc/survivalpod) "i" = ( @@ -146,9 +144,7 @@ /turf/open/floor/carpet/black, /area/misc/survivalpod) "z" = ( -/obj/machinery/vending/cigarette{ - onstation = 0 - }, +/obj/machinery/vending/cigarette, /turf/open/floor/carpet/black, /area/misc/survivalpod) "A" = ( @@ -226,10 +222,7 @@ /turf/open/floor/carpet/black, /area/misc/survivalpod) "L" = ( -/obj/machinery/vending/snack/blue{ - req_access = null; - onstation = 0 - }, +/obj/machinery/vending/snack/blue, /turf/open/floor/carpet/black, /area/misc/survivalpod) "M" = ( diff --git a/_maps/virtual_domains/island_brawl.dmm b/_maps/virtual_domains/island_brawl.dmm index c9010062f54..62a63f81bab 100644 --- a/_maps/virtual_domains/island_brawl.dmm +++ b/_maps/virtual_domains/island_brawl.dmm @@ -3416,7 +3416,7 @@ /turf/open/floor/wood/parquet, /area/virtual_domain) "QX" = ( -/obj/machinery/vending/boozeomat/all_access{ +/obj/machinery/vending/boozeomat{ desc = "A technological marvel, supposedly able to mix just the mixture you'd like to drink the moment you ask for one. May not work for bartenders that don't have Nanotrasen bank accounts." }, /turf/open/floor/wood/large, @@ -3808,7 +3808,7 @@ /turf/open/floor/iron/dark/diagonal, /area/virtual_domain) "Uk" = ( -/obj/machinery/vending/autodrobe/all_access, +/obj/machinery/vending/autodrobe, /turf/open/misc/beach/sand, /area/virtual_domain/fullbright) "Um" = ( diff --git a/_maps/virtual_domains/meta_central.dmm b/_maps/virtual_domains/meta_central.dmm index bf821cc6e34..2fc87ae17c8 100644 --- a/_maps/virtual_domains/meta_central.dmm +++ b/_maps/virtual_domains/meta_central.dmm @@ -112,7 +112,7 @@ /turf/open/floor/iron/dark, /area/virtual_domain) "aT" = ( -/obj/effect/mob_spawn/ghost_role/human/pirate/skeleton/captain, +/obj/effect/mob_spawn/ghost_role/human/virtual_domain/pirate, /turf/open/floor/plating, /area/virtual_domain) "aV" = ( @@ -4413,14 +4413,14 @@ /area/virtual_domain) "Lq" = ( /obj/structure/table/reinforced, -/obj/item/clothing/glasses/hud/security/night{ - pixel_x = -8; - pixel_y = -6 +/obj/item/clothing/glasses/night/colorless{ + pixel_x = 5; + pixel_y = 7 }, -/obj/item/clothing/glasses/hud/security/night, -/obj/item/clothing/glasses/hud/security/night{ - pixel_x = 8; - pixel_y = 8 +/obj/item/clothing/glasses/night/colorless, +/obj/item/clothing/glasses/night/colorless{ + pixel_x = -5; + pixel_y = -3 }, /turf/template_noop, /area/virtual_domain/safehouse) @@ -5023,7 +5023,7 @@ /turf/open/floor/iron, /area/virtual_domain) "PR" = ( -/obj/machinery/vending/boozeomat/syndicate_access, +/obj/machinery/vending/boozeomat/syndicate, /obj/effect/turf_decal/tile/bar, /turf/open/floor/iron, /area/virtual_domain) diff --git a/_maps/virtual_domains/syndicate_assault.dmm b/_maps/virtual_domains/syndicate_assault.dmm index d825152e480..d8c63675d77 100644 --- a/_maps/virtual_domains/syndicate_assault.dmm +++ b/_maps/virtual_domains/syndicate_assault.dmm @@ -1103,7 +1103,7 @@ /turf/open/floor/iron/dark, /area/virtual_domain) "SX" = ( -/obj/machinery/vending/medical/syndicate_access/cybersun, +/obj/machinery/vending/medical/syndicate/cybersun, /turf/open/floor/plastic, /area/virtual_domain) "TB" = ( diff --git a/code/__DEFINES/_flags.dm b/code/__DEFINES/_flags.dm index de51c29c974..775e3970104 100644 --- a/code/__DEFINES/_flags.dm +++ b/code/__DEFINES/_flags.dm @@ -145,6 +145,8 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 #define BINARY_JAMMING (1<<17) /// This area prevents Bag of Holding rifts from being opened. #define NO_BOH (1<<18) +/// This area prevents fishing from removing unique/limited loot from sources that're also used outside of it. +#define UNLIMITED_FISHING (1<<19) /* These defines are used specifically with the atom/pass_flags bitmask diff --git a/code/__DEFINES/_helpers.dm b/code/__DEFINES/_helpers.dm index d9f75fe8e9d..4560dac0d8e 100644 --- a/code/__DEFINES/_helpers.dm +++ b/code/__DEFINES/_helpers.dm @@ -1,5 +1,18 @@ // Stuff that is relatively "core" and is used in other defines/helpers +/** + * The game's world.icon_size. \ + * Ideally divisible by 16. \ + * Ideally a number, but it + * can be a string ("32x32"), so more exotic coders + * will be sad if you use this in math. + */ +#define ICON_SIZE_ALL 32 +/// The X/Width dimension of ICON_SIZE. This will more than likely be the bigger axis. +#define ICON_SIZE_X 32 +/// The Y/Height dimension of ICON_SIZE. This will more than likely be the smaller axis. +#define ICON_SIZE_Y 32 + //Returns the hex value of a decimal number //len == length of returned string #define num2hex(X, len) num2text(X, len, 16) diff --git a/code/__DEFINES/actions.dm b/code/__DEFINES/actions.dm index 99f9c1aca55..a99baa7cd65 100644 --- a/code/__DEFINES/actions.dm +++ b/code/__DEFINES/actions.dm @@ -10,6 +10,8 @@ #define AB_CHECK_INCAPACITATED (1<<4) ///Action button checks if user is jaunting #define AB_CHECK_PHASED (1<<5) +///Action button checks if user is not on an open turf +#define AB_CHECK_OPEN_TURF (1<<6) DEFINE_BITFIELD(check_flags, list( "CHECK IF HANDS BLOCKED" = AB_CHECK_HANDS_BLOCKED, @@ -18,6 +20,7 @@ DEFINE_BITFIELD(check_flags, list( "CHECK IF CONSCIOUS" = AB_CHECK_CONSCIOUS, "CHECK IF INCAPACITATED" = AB_CHECK_INCAPACITATED, "CHECK IF TEMPORARILY INCORPOREAL" = AB_CHECK_PHASED, + "CHECK IF NOT ON AN OPEN TURF" = AB_CHECK_OPEN_TURF, )) ///Action button triggered with right click diff --git a/code/__DEFINES/apc_defines.dm b/code/__DEFINES/apc_defines.dm index ee6c2bb67d6..efcfdd864f2 100644 --- a/code/__DEFINES/apc_defines.dm +++ b/code/__DEFINES/apc_defines.dm @@ -54,12 +54,6 @@ /// The APCs external powernet has enough power to charge the APC. #define APC_HAS_POWER 2 -// Ethereals: -/// 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 (0.2 * STANDARD_CELL_CHARGE) - // Wires & EMPs: /// The wire value used to reset the APCs wires after one's EMPed. #define APC_RESET_EMP "emp" diff --git a/code/__DEFINES/atom_hud.dm b/code/__DEFINES/atom_hud.dm index 10bfb50aa9a..bcfde5e66c1 100644 --- a/code/__DEFINES/atom_hud.dm +++ b/code/__DEFINES/atom_hud.dm @@ -92,6 +92,7 @@ #define SECHUD_ASSISTANT "hudassistant" #define SECHUD_ATMOSPHERIC_TECHNICIAN "hudatmospherictechnician" #define SECHUD_BARTENDER "hudbartender" +#define SECHUD_BUSSER "hudbusser" #define SECHUD_BITAVATAR "hudbitavatar" #define SECHUD_BITRUNNER "hudbitrunner" #define SECHUD_BOTANIST "hudbotanist" diff --git a/code/__DEFINES/chat.dm b/code/__DEFINES/chat.dm index c3fe46b0cd4..516fe8c4e19 100644 --- a/code/__DEFINES/chat.dm +++ b/code/__DEFINES/chat.dm @@ -45,5 +45,11 @@ #define debug_world_log(msg) if (GLOB.Debug2) log_world("DEBUG: [msg]") /// Adds a generic box around whatever message you're sending in chat. Really makes things stand out. #define examine_block(str) ("
" + str + "
") +/// Makes a fieldset with a name in the middle top part. Can apply additional classes +#define fieldset_block(title, content, classes) ("
" + title + "
" + content + "
") +/// Makes a horizontal line with text in the middle +#define separator_hr(str) ("
" + str + "
") /// Emboldens runechat messages #define RUNECHAT_BOLD(str) "+[str]+" +/// Helper which creates a chat message which may have a tooltip in some contexts, but not others. +#define conditional_tooltip(normal_text, tooltip_text, condition) ((condition) ? (span_tooltip(tooltip_text, normal_text)) : (normal_text)) diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index 3c97432888f..7861cd53353 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -76,15 +76,12 @@ #define CANUNCONSCIOUS (1<<2) /// If set, this mob can be grabbed or pushed when bumped into #define CANPUSH (1<<3) -/// Mob godmode. Prevents most statuses and damage from being taken, but is more often than not a crapshoot. Use with caution. -#define GODMODE (1<<4) DEFINE_BITFIELD(status_flags, list( "CAN STUN" = CANSTUN, "CAN KNOCKDOWN" = CANKNOCKDOWN, "CAN UNCONSCIOUS" = CANUNCONSCIOUS, "CAN PUSH" = CANPUSH, - "GOD MODE" = GODMODE, )) //Health Defines diff --git a/code/__DEFINES/crafting.dm b/code/__DEFINES/crafting.dm index 54dc479aa73..cb7930e9d1f 100644 --- a/code/__DEFINES/crafting.dm +++ b/code/__DEFINES/crafting.dm @@ -28,6 +28,10 @@ #define CRAFT_CHECK_DENSITY (1<<5) /// If the created atom will gain custom mat datums #define CRAFT_APPLIES_MATS (1<<6) +/// Crafting passes reagents of components to the finished product +#define CRAFT_TRANSFERS_REAGENTS (1<<7) +/// Crafting clears all reagents present in the finished product +#define CRAFT_CLEARS_REAGENTS (1<<8) //food/drink crafting defines //When adding new defines, please make sure to also add them to the encompassing list diff --git a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_main.dm b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_main.dm index 3282c9387a1..2e42957aa3a 100644 --- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_main.dm +++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_main.dm @@ -9,6 +9,8 @@ #define COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON "atom_init_success_on" ///from base of atom/examine(): (/mob, list/examine_text) #define COMSIG_ATOM_EXAMINE "atom_examine" +///from base of atom/examine_tags(): (/mob, list/examine_tags) +#define COMSIG_ATOM_EXAMINE_TAGS "atom_examine_tags" ///from base of atom/get_examine_name(): (/mob, list/overrides) #define COMSIG_ATOM_GET_EXAMINE_NAME "atom_examine_name" //Positions for overrides list 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 925c7bc4e71..36a2ca2c805 100644 --- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movable.dm +++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movable.dm @@ -15,9 +15,6 @@ ///from base of atom/movable/Bump(): (/atom) #define COMSIG_MOVABLE_BUMP "movable_bump" #define COMPONENT_INTERCEPT_BUMPED (1<<0) -///from base of atom/movable/newtonian_move(): (inertia_direction, start_delay) -#define COMSIG_MOVABLE_NEWTONIAN_MOVE "movable_newtonian_move" - #define COMPONENT_MOVABLE_NEWTONIAN_BLOCK (1<<0) ///from datum/component/drift/apply_initial_visuals(): () #define COMSIG_MOVABLE_DRIFT_VISUAL_ATTEMPT "movable_drift_visual_attempt" #define DRIFT_VISUAL_FAILED (1<<0) 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 6448be3fecb..46e179ee567 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 @@ -89,7 +89,6 @@ /// Sent from [atom/proc/item_interaction], when this atom is used as a tool and an event occurs #define COMSIG_ITEM_TOOL_ACTED "tool_item_acted" -/// This is sent via item interaction (IE, item clicking on atom) right before the item's inserted into the atom's storage -/// Args: (obj/item/inserting, mob/living/user) -#define COMSIG_ATOM_STORAGE_ITEM_INTERACT_INSERT "atom_storage_item_interact_insert" - #define BLOCK_STORAGE_INSERT (1<<0) +/// from /obj/projectile/energy/fisher/on_hit() or /obj/item/gun/energy/recharge/fisher when striking a target +#define COMSIG_ATOM_SABOTEUR_ACT "hit_by_saboteur" + #define COMSIG_SABOTEUR_SUCCESS 1 diff --git a/code/__DEFINES/dcs/signals/signals_fish.dm b/code/__DEFINES/dcs/signals/signals_fish.dm index 8af3b8dfca7..9b614f92454 100644 --- a/code/__DEFINES/dcs/signals/signals_fish.dm +++ b/code/__DEFINES/dcs/signals/signals_fish.dm @@ -8,6 +8,13 @@ ///The item won't be inserted into the aquarium, but will early return attackby anyway. #define COMSIG_CANNOT_INSERT_IN_AQUARIUM (1<<1) +///Updates the appearance of a newly generated aquarium content visual:(visual) +#define COMSIG_AQUARIUM_CONTENT_GENERATE_APPEARANCE "aquarium_content_apply_appearance" +///Updates the base position of an aquarium content visual:(aquarium, visual) +#define AQUARIUM_CONTENT_RANDOMIZE_POSITION "aquarium_content_randomize_position" +///Updates the animation of an aquarium content visual:(aquarium, visual) +#define COMSIG_AQUARIUM_CONTENT_DO_ANIMATION "aquarium_content_do_animation" + // Fish signals #define COMSIG_FISH_STATUS_CHANGED "fish_status_changed" #define COMSIG_FISH_STIRRED "fish_stirred" @@ -15,19 +22,32 @@ #define COMSIG_FISH_LIFE "fish_life" ///From /datum/fish_trait/eat_fish: (predator) #define COMSIG_FISH_EATEN_BY_OTHER_FISH "fish_eaten_by_other_fish" +///From /obj/item/fish/generate_reagents_to_add, which returns a holder when the fish is eaten or composted for example: (list/reagents) +#define COMSIG_GENERATE_REAGENTS_TO_ADD "generate_reagents_to_add" ///From /obj/item/fish/feed: (fed_reagents, fed_reagent_type) #define COMSIG_FISH_FED "fish_on_fed" -///from /obj/item/fish/pet_fish -#define COMSIG_FISH_PETTED "fish_petted" ///From /obj/item/fish/update_size_and_weight: (new_size, new_weight) #define COMSIG_FISH_UPDATE_SIZE_AND_WEIGHT "fish_update_size_and_weight" ///From /obj/item/fish/update_fish_force: (weight_rank, bonus_malus) #define COMSIG_FISH_FORCE_UPDATED "fish_force_updated" +///From /obj/item/fish/interact_with_atom_secondary, sent to the target: (fish) +#define COMSIG_FISH_RELEASED_INTO "fish_released_into" + +///From /datum/fishing_challenge/New: (datum/fishing_challenge/challenge) +#define COMSIG_MOB_BEGIN_FISHING "mob_begin_fishing" +///From /datum/fishing_challenge/start_minigame_phase: (datum/fishing_challenge/challenge) +#define COMSIG_MOB_BEGIN_FISHING_MINIGAME "mob_begin_fishing_minigame" +///From /datum/fishing_challenge/completed: (datum/fishing_challenge/challenge, win) +#define COMSIG_MOB_COMPLETE_FISHING "mob_complete_fishing" + +/// Rolling a reward path for a fishing challenge +#define COMSIG_FISHING_CHALLENGE_ROLL_REWARD "fishing_roll_reward" +/// Adjusting the difficulty of a rishing challenge, often based on the reward path +#define COMSIG_FISHING_CHALLENGE_GET_DIFFICULTY "fishing_get_difficulty" /// Fishing challenge completed -#define COMSIG_FISHING_CHALLENGE_COMPLETED "fishing_completed" /// Sent to the fisherman when the reward is dispensed: (reward) -#define COMSIG_FISH_SOURCE_REWARD_DISPENSED "mob_fish_source_reward_dispensed" +#define COMSIG_FISH_SOURCE_REWARD_DISPENSED "fish_source_reward_dispensed" /// Called when you try to use fishing rod on anything #define COMSIG_PRE_FISHING "pre_fishing" diff --git a/code/__DEFINES/dcs/signals/signals_global_object.dm b/code/__DEFINES/dcs/signals/signals_global_object.dm index bed06ff176c..d100f47a3c9 100644 --- a/code/__DEFINES/dcs/signals/signals_global_object.dm +++ b/code/__DEFINES/dcs/signals/signals_global_object.dm @@ -1,9 +1,9 @@ /// signals from globally accessible objects -///from SSJob whenever SetupOccupations() is called, all occupations are set +///from SSJob whenever setup_occupations() is called, all occupations are set #define COMSIG_OCCUPATIONS_SETUP "occupations_setup" -///from SSJob when DivideOccupations is called +///from SSJob when divide_occupations() is called #define COMSIG_OCCUPATIONS_DIVIDED "occupations_divided" ///from SSsun when the sun changes position : (azimuth) diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_ai.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_ai.dm index 16f7e00e78a..1c6fcbffbda 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_ai.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_ai.dm @@ -11,3 +11,6 @@ #define COMSIG_BOT_RESET "bot_reset" ///Sent off /mob/living/basic/bot/proc/set_mode_flags() : (new_flags) #define COMSIG_BOT_MODE_FLAGS_SET "bot_mode_flags_set" + +///Signal sent off of ai/movement/proc/start_moving_towards +#define COMSIG_MOB_AI_MOVEMENT_STARTED "mob_ai_movement_started" 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 56d5ddf4524..b95ffba607f 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm @@ -118,7 +118,7 @@ ///Applied preferences to a human #define COMSIG_HUMAN_PREFS_APPLIED "human_prefs_applied" -///Whenever EquipRanked is called, called after job is set +///Whenever equip_rank is called, called after job is set #define COMSIG_JOB_RECEIVED "job_received" ///from /mob/living/carbon/human/proc/set_coretemperature(): (oldvalue, newvalue) #define COMSIG_HUMAN_CORETEMP_CHANGE "human_coretemp_change" 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 1b2d82ca9c5..4a558c5fa7e 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm @@ -52,6 +52,8 @@ #define MOVE_ARG_NEW_LOC 1 /// The argument of move_args which dictates our movement direction #define MOVE_ARG_DIRECTION 2 +/// From base of /client/Move(): (new_loc, direction) +#define COMSIG_MOB_CLIENT_MOVE_NOGRAV "mob_client_move_nograv" /// From base of /client/Move(): (direction, old_dir) #define COMSIG_MOB_CLIENT_MOVED "mob_client_moved" /// From base of /client/proc/change_view() (mob/source, new_size) @@ -140,6 +142,11 @@ #define SPEECH_SAYMODE 10 #define SPEECH_MODS 11 +///from /datum/component/speechmod/handle_speech(): () +#define COMSIG_TRY_MODIFY_SPEECH "try_modify_speech" + ///Return value if we prevent speech from being modified + #define PREVENT_MODIFY_SPEECH 1 + ///from /mob/say_dead(): (mob/speaker, message) #define COMSIG_MOB_DEADSAY "mob_deadsay" #define MOB_DEADSAY_SIGNAL_INTERCEPT (1<<0) @@ -248,5 +255,9 @@ /// from /mob/proc/key_down(): (key, client/client, full_key) #define COMSIG_MOB_KEYDOWN "mob_key_down" +/// from /mob/Process_Spacemove(movement_dir, continuous_move): (movement_dir, continuous_move, atom/backup) +#define COMSIG_MOB_ATTEMPT_HALT_SPACEMOVE "mob_attempt_halt_spacemove" + #define COMPONENT_PREVENT_SPACEMOVE_HALT (1<<0) + /// from /mob/update_incapacitated(): (old_incap, new_incap) #define COMSIG_MOB_INCAPACITATE_CHANGED "mob_incapacitated" diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_silicon.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_silicon.dm index 47f5b748599..aee6f2df79b 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_silicon.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_silicon.dm @@ -8,3 +8,12 @@ #define COMSIG_BORG_HUG_HANDLED 1 ///called from /mob/living/silicon/attack_hand proc #define COMSIG_MOB_PAT_BORG "mob_pat_borg" +///called when someone is inquiring about an AI's linked core +#define COMSIG_SILICON_AI_CORE_STATUS "AI_core_status" + #define COMPONENT_CORE_ALL_GOOD (1<<0) + #define COMPONENT_CORE_DISCONNECTED (1<<1) +///called when an AI (malf or perhaps combat upgraded or some other circumstance that has them inhabit +///an APC) enters an APC +#define COMSIG_SILICON_AI_OCCUPY_APC "AI_occupy_apc" +///called when an AI vacates an APC +#define COMSIG_SILICON_AI_VACATE_APC "AI_vacate_apc" diff --git a/code/__DEFINES/dcs/signals/signals_object.dm b/code/__DEFINES/dcs/signals/signals_object.dm index 797256017d4..a9cc41b7d8d 100644 --- a/code/__DEFINES/dcs/signals/signals_object.dm +++ b/code/__DEFINES/dcs/signals/signals_object.dm @@ -194,6 +194,8 @@ #define COMSIG_TOOL_IN_USE "tool_in_use" ///from base of [/obj/item/proc/tool_start_check]: (mob/living/user) #define COMSIG_TOOL_START_USE "tool_start_use" +/// From /obj/item/multitool/remove_buffer(): (buffer) +#define COMSIG_MULTITOOL_REMOVE_BUFFER "multitool_remove_buffer" ///from [/obj/item/proc/disableEmbedding]: #define COMSIG_ITEM_DISABLE_EMBED "item_disable_embed" ///from [/obj/effect/mine/proc/triggermine]: @@ -415,10 +417,8 @@ #define COMSIG_PROJECTILE_ON_SPAWN_DROP "projectile_on_spawn_drop" ///sent to the projectile when spawning the item (shrapnel) that may be embedded: (new_item) #define COMSIG_PROJECTILE_ON_SPAWN_EMBEDDED "projectile_on_spawn_embedded" - -/// 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) +///sent to the projectile when successfully embedding into something +#define COMSIG_PROJECTILE_ON_EMBEDDED "projectile_on_embedded" // /obj/vehicle/sealed/car/vim signals diff --git a/code/__DEFINES/dcs/signals/signals_spell.dm b/code/__DEFINES/dcs/signals/signals_spell.dm index 8d02affded8..08074116be2 100644 --- a/code/__DEFINES/dcs/signals/signals_spell.dm +++ b/code/__DEFINES/dcs/signals/signals_spell.dm @@ -68,6 +68,9 @@ #define COMSIG_SPELL_TOUCH_HAND_HIT "spell_touch_hand_cast" // Jaunt Spells +/// Sent from datum/action/cooldown/spell/jaunt/before_cast, before the mob enters jaunting as a pre-check: (datum/action/cooldown/spell/spell) +#define COMSIG_MOB_PRE_JAUNT "spell_mob_pre_jaunt" + #define COMPONENT_BLOCK_JAUNT (1<<0) /// Sent from datum/action/cooldown/spell/jaunt/enter_jaunt, to the mob jaunting: (obj/effect/dummy/phased_mob/jaunt, datum/action/cooldown/spell/spell) #define COMSIG_MOB_ENTER_JAUNT "spell_mob_enter_jaunt" /// Set from /obj/effect/dummy/phased_mob after the mob is ejected from its contents: (obj/effect/dummy/phased_mob/jaunt, mob/living/unjaunter) diff --git a/code/__DEFINES/fish.dm b/code/__DEFINES/fish.dm index 1e9378e1f41..ebd0d175560 100644 --- a/code/__DEFINES/fish.dm +++ b/code/__DEFINES/fish.dm @@ -4,8 +4,13 @@ #define FISHING_RANDOM_SEED "Random seed" // Baseline fishing difficulty levels -#define FISHING_DEFAULT_DIFFICULTY 10 // BUBBER EDIT 15 -> 10 -#define FISHING_EASY_DIFFICULTY 6 // BUBBER EDIT 10 -> 6 +#define FISHING_DEFAULT_DIFFICULTY 15 +#define FISHING_EASY_DIFFICULTY 10 +/** + * The minimum value of the difficulty of the minigame (unless it reaches 0 than it's auto-win) + * Any lower than this and the fish will be way too lethargic for the minigame to be engaging in the slightest. + */ +#define FISHING_MINIMUM_DIFFICULTY 6 /// Difficulty modifier when bait is fish's favorite #define FAV_BAIT_DIFFICULTY_MOD -10 //Bubberstation change: -5 to -10 @@ -136,12 +141,27 @@ #define FISH_WEIGHT_SLOWDOWN_EXPONENT 0.54 ///Used to calculate the force of the fish by comparing (1 + log(weight/this_define)) and the w_class of the item. #define FISH_WEIGHT_FORCE_DIVISOR 250 +///The multiplier used in the FISH_WEIGHT_BITE_DIVISOR define +#define FISH_WEIGHT_GRIND_TO_BITE_MULT 0.4 +///Used to calculate how many bites a fish can take and therefore the amount of reagents it has. +#define FISH_WEIGHT_BITE_DIVISOR (FISH_GRIND_RESULTS_WEIGHT_DIVISOR * FISH_WEIGHT_GRIND_TO_BITE_MULT) ///The breeding timeout for newly instantiated fish is multiplied by this. #define NEW_FISH_BREEDING_TIMEOUT_MULT 2 ///The last feeding timestamp of newly instantiated fish is multiplied by this: ergo, they spawn 50% hungry. #define NEW_FISH_LAST_FEEDING_MULT 0.5 +//IF YOU ADD ANY NEW FLAG, ADD IT TO THE RESPECTIVE BITFIELD in _globalvars/bitfields.dm TOO! + +///This fish is shown in the catalog and on the wiki (this only matters as an initial, compile-time value) +#define FISH_FLAG_SHOW_IN_CATALOG (1<<0) +///This fish has a flopping animation done through matrices +#define FISH_DO_FLOP_ANIM (1<<1) +///This fish has been petted in the last 30 seconds +#define FISH_FLAG_PETTED (1<<2) +///This fish can be scanned to complete fish scanning experiments +#define FISH_FLAG_EXPERIMENT_SCANNABLE (1<<3) + #define MIN_AQUARIUM_TEMP T0C #define MAX_AQUARIUM_TEMP (T0C + 100) #define DEFAULT_AQUARIUM_TEMP (T0C + 24) @@ -158,8 +178,8 @@ #define AQUARIUM_FLUID_SALTWATER "Saltwater" #define AQUARIUM_FLUID_SULPHWATEVER "Sulfuric Water" #define AQUARIUM_FLUID_AIR "Air" -#define AQUARIUM_FLUID_ANADROMOUS "Adaptive to both Freshwater and Saltwater" -#define AQUARIUM_FLUID_ANY_WATER "Adaptive to all kind of water" +#define AQUARIUM_FLUID_ANADROMOUS "Anadromous" +#define AQUARIUM_FLUID_ANY_WATER "Any Fluid" ///Fluff. The name of the aquarium company shown in the fish catalog #define AQUARIUM_COMPANY "Aquatech Ltd." @@ -185,10 +205,15 @@ /// The height of the minigame slider. Not in pixels, but minigame units. #define FISHING_MINIGAME_AREA 1000 +///The fish needs to be cooked for at least this long so that it can be safely eaten +#define FISH_SAFE_COOKING_DURATION 30 SECONDS + ///Defines for fish properties from the collect_fish_properties proc #define FISH_PROPERTIES_FAV_BAIT "fav_bait" #define FISH_PROPERTIES_BAD_BAIT "bad_bait" #define FISH_PROPERTIES_TRAITS "fish_traits" +#define FISH_PROPERTIES_BEAUTY_SCORE "beauty_score" +#define FISH_PROPERTIES_EVOLUTIONS "evolutions" ///Define for favorite and disliked baits that aren't just item typepaths. #define FISH_BAIT_TYPE "Type" @@ -196,3 +221,27 @@ #define FISH_BAIT_REAGENT "Reagent" #define FISH_BAIT_VALUE "Value" #define FISH_BAIT_AMOUNT "Amount" + + +///We multiply the weight of fish inside the loot table by this value if we are goofy enough to fish without a bait. +#define FISH_WEIGHT_MULT_WITHOUT_BAIT 0.15 + +/** + * A macro to ensure the wikimedia filenames of fish icons are unique, especially since there're a couple fish that have + * quite ambiguous names/icon_states like "checkered" or "pike" + */ +#define FISH_AUTOWIKI_FILENAME(fish) SANITIZE_FILENAME("[initial(fish.icon_state)]_wiki_fish") + +///The list keys for the autowiki for fish sources +#define FISH_SOURCE_AUTOWIKI_NAME "name" +#define FISH_SOURCE_AUTOWIKI_ICON "icon" +#define FISH_SOURCE_AUTOWIKI_WEIGHT "weight" +#define FISH_SOURCE_AUTOWIKI_WEIGHT_SUFFIX "weight_suffix" +#define FISH_SOURCE_AUTOWIKI_NOTES "notes" + +///Special value for the name key that always comes first when the data is sorted, regardless of weight. +#define FISH_SOURCE_AUTOWIKI_DUD "Nothing" +///Special value for the name key that always comes last +#define FISH_SOURCE_AUTOWIKI_OTHER "Other Stuff" +///The filename for the icon for "other stuff" which we don't articulate about on the autowiki +#define FISH_SOURCE_AUTOWIKI_QUESTIONMARK "questionmark" diff --git a/code/__DEFINES/food.dm b/code/__DEFINES/food.dm index 1304bd53cd3..68dbb368afc 100644 --- a/code/__DEFINES/food.dm +++ b/code/__DEFINES/food.dm @@ -175,12 +175,21 @@ GLOBAL_LIST_INIT(food_buffs, list( #define FOOD_IN_CONTAINER (1<<0) /// Finger food can be eaten while walking / running around #define FOOD_FINGER_FOOD (1<<1) +/// Examining this edible won't show infos on food types, bites and remote tasting etc. +#define FOOD_NO_EXAMINE (1<<2) +/// This food item doesn't track bitecounts, use responsibly. +#define FOOD_NO_BITECOUNT (1<<3) DEFINE_BITFIELD(food_flags, list( "FOOD_FINGER_FOOD" = FOOD_FINGER_FOOD, "FOOD_IN_CONTAINER" = FOOD_IN_CONTAINER, + "FOOD_NO_EXAMINE" = FOOD_NO_EXAMINE, + "FOOD_NO_BITECOUNT" = FOOD_NO_BITECOUNT, )) +///Define for return value of the after_eat callback that will call OnConsume if it hasn't already. +#define FOOD_AFTER_EAT_CONSUME_ANYWAY 2 + #define STOP_SERVING_BREAKFAST (35 MINUTES) // SKYRAT EDIT - ORIGINAL: 15 MINUTES #define FOOD_MEAT_HUMAN 50 diff --git a/code/__DEFINES/footsteps.dm b/code/__DEFINES/footsteps.dm index a8a7ad975af..cffe9202153 100644 --- a/code/__DEFINES/footsteps.dm +++ b/code/__DEFINES/footsteps.dm @@ -84,10 +84,10 @@ GLOBAL_LIST_INIT(footstep, list( 'sound/effects/footstep/grass3.ogg', 'sound/effects/footstep/grass4.ogg'), 75, 0), FOOTSTEP_WATER = list(list( - 'sound/effects/footstep/water1.ogg', - 'sound/effects/footstep/water2.ogg', - 'sound/effects/footstep/water3.ogg', - 'sound/effects/footstep/water4.ogg'), 100, 1), + 'sound/effects/footstep/water/water1.ogg', + 'sound/effects/footstep/water/water2.ogg', + 'sound/effects/footstep/water/water3.ogg', + 'sound/effects/footstep/water/water4.ogg'), 100, 1), FOOTSTEP_LAVA = list(list( 'sound/effects/footstep/lava1.ogg', 'sound/effects/footstep/lava2.ogg', @@ -134,10 +134,10 @@ GLOBAL_LIST_INIT(barefootstep, list( 'sound/effects/footstep/grass3.ogg', 'sound/effects/footstep/grass4.ogg'), 75, 0), FOOTSTEP_WATER = list(list( - 'sound/effects/footstep/water1.ogg', - 'sound/effects/footstep/water2.ogg', - 'sound/effects/footstep/water3.ogg', - 'sound/effects/footstep/water4.ogg'), 100, 1), + 'sound/effects/footstep/water/water1.ogg', + 'sound/effects/footstep/water/water2.ogg', + 'sound/effects/footstep/water/water3.ogg', + 'sound/effects/footstep/water/water4.ogg'), 100, 1), FOOTSTEP_LAVA = list(list( 'sound/effects/footstep/lava1.ogg', 'sound/effects/footstep/lava2.ogg', @@ -178,10 +178,10 @@ GLOBAL_LIST_INIT(clawfootstep, list( 'sound/effects/footstep/grass3.ogg', 'sound/effects/footstep/grass4.ogg'), 75, 0), FOOTSTEP_WATER = list(list( - 'sound/effects/footstep/water1.ogg', - 'sound/effects/footstep/water2.ogg', - 'sound/effects/footstep/water3.ogg', - 'sound/effects/footstep/water4.ogg'), 100, 1), + 'sound/effects/footstep/water/water1.ogg', + 'sound/effects/footstep/water/water2.ogg', + 'sound/effects/footstep/water/water3.ogg', + 'sound/effects/footstep/water/water4.ogg'), 100, 1), FOOTSTEP_LAVA = list(list( 'sound/effects/footstep/lava1.ogg', 'sound/effects/footstep/lava2.ogg', @@ -196,10 +196,10 @@ GLOBAL_LIST_INIT(heavyfootstep, list( 'sound/effects/footstep/heavy1.ogg', 'sound/effects/footstep/heavy2.ogg'), 100, 2), FOOTSTEP_WATER = list(list( - 'sound/effects/footstep/water1.ogg', - 'sound/effects/footstep/water2.ogg', - 'sound/effects/footstep/water3.ogg', - 'sound/effects/footstep/water4.ogg'), 100, 2), + 'sound/effects/footstep/water/water1.ogg', + 'sound/effects/footstep/water/water2.ogg', + 'sound/effects/footstep/water/water3.ogg', + 'sound/effects/footstep/water/water4.ogg'), 100, 2), FOOTSTEP_LAVA = list(list( 'sound/effects/footstep/lava1.ogg', 'sound/effects/footstep/lava2.ogg', diff --git a/code/__DEFINES/hud.dm b/code/__DEFINES/hud.dm index f72b8f222f7..dcbc3c2876c 100644 --- a/code/__DEFINES/hud.dm +++ b/code/__DEFINES/hud.dm @@ -77,7 +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" -#define ui_floor_menu "EAST-4:22,SOUTH:37" // BUBBER EDIT: Shift over a bit for the vore button to sit nicely +#define ui_floor_changer "EAST-4:22,SOUTH:37" // BUBBER EDIT: Shift over a bit for the vore button to sit nicely //Upper left (action buttons) #define ui_action_palette "WEST+0:23,NORTH-1:5" @@ -110,6 +110,9 @@ #define ui_living_pull "EAST-1:28,CENTER-3:15" #define ui_living_healthdoll "EAST-1:28,CENTER-1:15" +//Humans +#define ui_human_floor_changer "EAST-4:22, SOUTH+1:7" + //Drones #define ui_drone_drop "CENTER+1:18,SOUTH:5" #define ui_drone_pull "CENTER+1.5:2,SOUTH:5" @@ -132,7 +135,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" +#define ui_borg_floor_changer "EAST-1:28,SOUTH+1:39" //Aliens #define ui_alien_health "EAST,CENTER-1:15" @@ -141,7 +144,6 @@ #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" @@ -150,7 +152,6 @@ #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" @@ -192,8 +193,8 @@ #define ui_ghost_teleport "SOUTH:6,CENTER:24" #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" +#define ui_ghost_language_menu "SOUTH: 22, CENTER+3:22" +#define ui_ghost_floor_changer "SOUTH: 6, CENTER+3:23" //Blobbernauts #define ui_blobbernaut_overmind_health "EAST-1:28,CENTER+0:19" diff --git a/code/__DEFINES/inventory.dm b/code/__DEFINES/inventory.dm index 67a9af9d9b3..d7476b70706 100644 --- a/code/__DEFINES/inventory.dm +++ b/code/__DEFINES/inventory.dm @@ -110,6 +110,8 @@ DEFINE_BITFIELD(no_equip_flags, list( #define HIDEMUTWINGS (1<<13) ///hides belts and riggings #define HIDEBELT (1<<14) +///hides antennae +#define HIDEANTENNAE (1<<15) //SKYRAT EDIT ADDITION: CUSTOM EAR TOGGLE FOR ANTHRO/ETC EAR SHOWING - /// Manually set this on items you want anthro ears to show on! diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 83d6a4477c5..40617a8f4aa 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -279,6 +279,8 @@ GLOBAL_LIST_INIT(turfs_pass_meteor, typecacheof(list( #define is_reagent_container(O) (istype(O, /obj/item/reagent_containers)) +#define isapc(A) (istype(A, /obj/machinery/power/apc)) + //Assemblies #define isassembly(O) (istype(O, /obj/item/assembly)) @@ -328,4 +330,4 @@ GLOBAL_LIST_INIT(book_types, typecacheof(list( #define is_unassigned_job(job_type) (istype(job_type, /datum/job/unassigned)) #define isprojectilespell(thing) (istype(thing, /datum/action/cooldown/spell/pointed/projectile)) -#define is_multi_tile_object(atom) (atom.bound_width > world.icon_size || atom.bound_height > world.icon_size) +#define is_multi_tile_object(atom) (atom.bound_width > ICON_SIZE_X || atom.bound_height > ICON_SIZE_Y) diff --git a/code/__DEFINES/jobs.dm b/code/__DEFINES/jobs.dm index c96746b47c1..7b991fcf8f9 100644 --- a/code/__DEFINES/jobs.dm +++ b/code/__DEFINES/jobs.dm @@ -101,6 +101,7 @@ #define JOB_PSYCHOLOGIST "Psychologist" #define JOB_BARBER "Barber" // SKYRAT EDIT ADDITION #define JOB_BOUNCER "Bouncer" // SKYRAT EDIT ADDITION +#define JOB_PUN_PUN "Pun Pun" //ERTs #define JOB_ERT_DEATHSQUAD "Death Commando" #define JOB_ERT_COMMANDER "Emergency Response Team Commander" @@ -161,42 +162,43 @@ #define JOB_DISPLAY_ORDER_LAWYER 12 #define JOB_DISPLAY_ORDER_CHAPLAIN 13 #define JOB_DISPLAY_ORDER_PSYCHOLOGIST 14 -#define JOB_DISPLAY_ORDER_AI 15 -#define JOB_DISPLAY_ORDER_CYBORG 16 -#define JOB_DISPLAY_ORDER_CHIEF_ENGINEER 17 -#define JOB_DISPLAY_ORDER_STATION_ENGINEER 18 -#define JOB_DISPLAY_ORDER_ATMOSPHERIC_TECHNICIAN 19 -#define JOB_DISPLAY_ORDER_QUARTERMASTER 20 -#define JOB_DISPLAY_ORDER_CARGO_TECHNICIAN 21 -#define JOB_DISPLAY_ORDER_SHAFT_MINER 22 -#define JOB_DISPLAY_ORDER_BITRUNNER 23 -#define JOB_DISPLAY_ORDER_CARGO_GORILLA 24 -#define JOB_DISPLAY_ORDER_CHIEF_MEDICAL_OFFICER 25 -#define JOB_DISPLAY_ORDER_MEDICAL_DOCTOR 26 -#define JOB_DISPLAY_ORDER_PARAMEDIC 27 -#define JOB_DISPLAY_ORDER_CHEMIST 28 -#define JOB_DISPLAY_ORDER_CORONER 29 -#define JOB_DISPLAY_ORDER_RESEARCH_DIRECTOR 30 -#define JOB_DISPLAY_ORDER_SCIENTIST 31 -#define JOB_DISPLAY_ORDER_ROBOTICIST 32 -#define JOB_DISPLAY_ORDER_GENETICIST 33 -#define JOB_DISPLAY_ORDER_HEAD_OF_SECURITY 34 -#define JOB_DISPLAY_ORDER_VETERAN_ADVISOR 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_SECURITY_MEDIC 41 //SKYRAT EDIT ADDITON -#define JOB_DISPLAY_ORDER_CORRECTIONS_OFFICER 42 //SKYRAT EDIT ADDITON -#define JOB_DISPLAY_ORDER_NANOTRASEN_CONSULTANT 43 //SKYRAT EDIT ADDITON -#define JOB_DISPLAY_ORDER_BLUESHIELD 44 //SKYRAT EDIT ADDITON -#define JOB_DISPLAY_ORDER_ORDERLY 45 //SKYRAT EDIT ADDITION -#define JOB_DISPLAY_ORDER_SCIENCE_GUARD 46 //SKYRAT EDIT ADDITION -#define JOB_DISPLAY_ORDER_BOUNCER 47 //SKYRAT EDIT ADDITION -#define JOB_DISPLAY_ORDER_ENGINEER_GUARD 48 //SKYRAT EDIT ADDITION -#define JOB_DISPLAY_ORDER_CUSTOMS_AGENT 49 //SKYRAT EDIT ADDITION -#define JOB_DISPLAY_ORDER_EXP_CORPS 50 //SKYRAT EDIT ADDITON -#define JOB_DISPLAY_ORDER_TELECOMMS_SPECIALIST 51 //SKYRAT EDIT ADDITION +#define JOB_DISPLAY_ORDER_PUN_PUN 15 +#define JOB_DISPLAY_ORDER_AI 16 +#define JOB_DISPLAY_ORDER_CYBORG 17 +#define JOB_DISPLAY_ORDER_CHIEF_ENGINEER 18 +#define JOB_DISPLAY_ORDER_STATION_ENGINEER 19 +#define JOB_DISPLAY_ORDER_ATMOSPHERIC_TECHNICIAN 20 +#define JOB_DISPLAY_ORDER_QUARTERMASTER 21 +#define JOB_DISPLAY_ORDER_CARGO_TECHNICIAN 22 +#define JOB_DISPLAY_ORDER_SHAFT_MINER 23 +#define JOB_DISPLAY_ORDER_BITRUNNER 24 +#define JOB_DISPLAY_ORDER_CARGO_GORILLA 25 +#define JOB_DISPLAY_ORDER_CHIEF_MEDICAL_OFFICER 26 +#define JOB_DISPLAY_ORDER_MEDICAL_DOCTOR 27 +#define JOB_DISPLAY_ORDER_PARAMEDIC 28 +#define JOB_DISPLAY_ORDER_CHEMIST 29 +#define JOB_DISPLAY_ORDER_CORONER 30 +#define JOB_DISPLAY_ORDER_RESEARCH_DIRECTOR 31 +#define JOB_DISPLAY_ORDER_SCIENTIST 32 +#define JOB_DISPLAY_ORDER_ROBOTICIST 33 +#define JOB_DISPLAY_ORDER_GENETICIST 34 +#define JOB_DISPLAY_ORDER_HEAD_OF_SECURITY 35 +#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 45 //SKYRAT EDIT ADDITON +#define JOB_DISPLAY_ORDER_CORRECTIONS_OFFICER 46 //SKYRAT EDIT ADDITON +#define JOB_DISPLAY_ORDER_NANOTRASEN_CONSULTANT 47 //SKYRAT EDIT ADDITON +#define JOB_DISPLAY_ORDER_BLUESHIELD 48 //SKYRAT EDIT ADDITON +#define JOB_DISPLAY_ORDER_ORDERLY 49 //SKYRAT EDIT ADDITION +#define JOB_DISPLAY_ORDER_SCIENCE_GUARD 50 //SKYRAT EDIT ADDITION +#define JOB_DISPLAY_ORDER_BOUNCER 51 //SKYRAT EDIT ADDITION +#define JOB_DISPLAY_ORDER_ENGINEER_GUARD 52 //SKYRAT EDIT ADDITION +#define JOB_DISPLAY_ORDER_CUSTOMS_AGENT 53 //SKYRAT EDIT ADDITION +#define JOB_DISPLAY_ORDER_EXP_CORPS 60 //SKYRAT EDIT ADDITON +#define JOB_DISPLAY_ORDER_TELECOMMS_SPECIALIST 61 //SKYRAT EDIT ADDITION #define DEPARTMENT_UNASSIGNED "No Department" @@ -241,7 +243,7 @@ DEFINE_BITFIELD(departments_bitflags, list( #define JOB_ANNOUNCE_ARRIVAL (1<<0) /// Whether the mob is added to the crew manifest. #define JOB_CREW_MANIFEST (1<<1) -/// Whether the mob is equipped through SSjob.EquipRank() on spawn. +/// Whether the mob is equipped through SSjob.equip_rank() on spawn. #define JOB_EQUIP_RANK (1<<2) /// Whether the job is considered a regular crew member of the station. Equipment such as AI and cyborgs not included. #define JOB_CREW_MEMBER (1<<3) diff --git a/code/__DEFINES/machines.dm b/code/__DEFINES/machines.dm index a2d66b9d4fc..f161eb6a0fd 100644 --- a/code/__DEFINES/machines.dm +++ b/code/__DEFINES/machines.dm @@ -139,6 +139,15 @@ /// Max length of a status line in the status display #define MAX_STATUS_LINE_LENGTH 40 +///Define for automated system arrival announcement +#define AUTO_ANNOUNCE_ARRIVAL "ARRIVAL" +///Define for automated system announcement when a head of staff arrives +#define AUTO_ANNOUNCE_NEWHEAD "NEWHEAD" +///Define for automated system announcement for when the arrival shuttle is broken +#define AUTO_ANNOUNCE_ARRIVALS_BROKEN "ARRIVALS_BROKEN" +///Define for automated system announcement for researched nodes +#define AUTO_ANNOUNCE_NODE "NODE" + /// Blank Status Display #define SD_BLANK 0 /// Shows the emergency shuttle timer diff --git a/code/__DEFINES/maps.dm b/code/__DEFINES/maps.dm index 3c87195e990..33147916f4e 100644 --- a/code/__DEFINES/maps.dm +++ b/code/__DEFINES/maps.dm @@ -221,7 +221,7 @@ Always compile, always use that verb, and always make sure that it works for wha #define CLUSTER_CHECK_ALL 30 //!Don't let anything cluster, like, at all /// Checks the job changes in the map config for the passed change key. -#define CHECK_MAP_JOB_CHANGE(job, change) SSmapping.config.job_changes?[job]?[change] +#define CHECK_MAP_JOB_CHANGE(job, change) SSmapping.current_map.job_changes?[job]?[change] ///Identifiers for away mission spawnpoints #define AWAYSTART_BEACH "AWAYSTART_BEACH" diff --git a/code/__DEFINES/maths.dm b/code/__DEFINES/maths.dm index 1939ca94ec4..a7a95817b44 100644 --- a/code/__DEFINES/maths.dm +++ b/code/__DEFINES/maths.dm @@ -188,21 +188,21 @@ var/pixel_x = 0 var/pixel_y = 0 for(var/i in 1 to increments) - pixel_x += sin(angle)+16*sin(angle)*2 - pixel_y += cos(angle)+16*cos(angle)*2 + pixel_x += sin(angle)+(ICON_SIZE_X/2)*sin(angle)*2 + pixel_y += cos(angle)+(ICON_SIZE_Y/2)*cos(angle)*2 var/new_x = starting.x var/new_y = starting.y - while(pixel_x > 16) - pixel_x -= 32 + while(pixel_x > (ICON_SIZE_X/2)) + pixel_x -= ICON_SIZE_X new_x++ - while(pixel_x < -16) - pixel_x += 32 + while(pixel_x < -(ICON_SIZE_X/2)) + pixel_x += ICON_SIZE_X new_x-- - while(pixel_y > 16) - pixel_y -= 32 + while(pixel_y > (ICON_SIZE_Y/2)) + pixel_y -= ICON_SIZE_Y new_y++ - while(pixel_y < -16) - pixel_y += 32 + while(pixel_y < -(ICON_SIZE_Y/2)) + pixel_y += ICON_SIZE_Y new_y-- new_x = clamp(new_x, 1, world.maxx) new_y = clamp(new_y, 1, world.maxy) diff --git a/code/__DEFINES/memory_defines.dm b/code/__DEFINES/memory_defines.dm index 2b07ab6270d..f6c537f9e81 100644 --- a/code/__DEFINES/memory_defines.dm +++ b/code/__DEFINES/memory_defines.dm @@ -1,7 +1,7 @@ ///name of the file that has all the memory strings #define MEMORY_FILE "memories.json" ///name of the file that has all the saved engravings -#define ENGRAVING_SAVE_FILE "data/engravings/[SSmapping.config.map_name]_engravings.json" +#define ENGRAVING_SAVE_FILE "data/engravings/[SSmapping.current_map.map_name]_engravings.json" ///name of the file that has all the prisoner tattoos #define PRISONER_TATTOO_SAVE_FILE "data/engravings/prisoner_tattoos.json" ///Current version of the engraving persistence json diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 1f166bb752e..a9e9f5f1aab 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -1029,3 +1029,7 @@ GLOBAL_LIST_INIT(layers_to_offset, list( #define BUTT_SPRITE_PLASMA "plasma" #define BUTT_SPRITE_FUZZY "fuzzy" #define BUTT_SPRITE_SLIME "slime" + +/// Distance which you can see someone's ID card +/// Short enough that you can inspect over tables (bartender checking age) +#define ID_EXAMINE_DISTANCE 3 diff --git a/code/__DEFINES/movement.dm b/code/__DEFINES/movement.dm index be3546ea102..9706819610f 100644 --- a/code/__DEFINES/movement.dm +++ b/code/__DEFINES/movement.dm @@ -2,21 +2,21 @@ #define MIN_GLIDE_SIZE 1 /// The maximum for glide_size to be clamped to. /// This shouldn't be higher than the icon size, and generally you shouldn't be changing this, but it's here just in case. -#define MAX_GLIDE_SIZE 32 +#define MAX_GLIDE_SIZE ICON_SIZE_ALL /// Compensating for time dilation GLOBAL_VAR_INIT(glide_size_multiplier, 1.0) ///Broken down, here's what this does: -/// divides the world icon_size (32) by delay divided by ticklag to get the number of pixels something should be moving each tick. +/// divides the world icon_size by delay divided by ticklag to get the number of pixels something should be moving each tick. /// The division result is given a min value of 1 to prevent obscenely slow glide sizes from being set /// Then that's multiplied by the global glide size multiplier. 1.25 by default feels pretty close to spot on. This is just to try to get byond to behave. /// The whole result is then clamped to within the range above. /// Not very readable but it works -#define DELAY_TO_GLIDE_SIZE(delay) (clamp(((world.icon_size / max((delay) / world.tick_lag, 1)) * GLOB.glide_size_multiplier), MIN_GLIDE_SIZE, MAX_GLIDE_SIZE)) +#define DELAY_TO_GLIDE_SIZE(delay) (clamp(((ICON_SIZE_ALL / max((delay) / world.tick_lag, 1)) * GLOB.glide_size_multiplier), MIN_GLIDE_SIZE, MAX_GLIDE_SIZE)) ///Similar to DELAY_TO_GLIDE_SIZE, except without the clamping, and it supports piping in an unrelated scalar -#define MOVEMENT_ADJUSTED_GLIDE_SIZE(delay, movement_disparity) (world.icon_size / ((delay) / world.tick_lag) * movement_disparity * GLOB.glide_size_multiplier) +#define MOVEMENT_ADJUSTED_GLIDE_SIZE(delay, movement_disparity) (ICON_SIZE_ALL / ((delay) / world.tick_lag) * movement_disparity * GLOB.glide_size_multiplier) //Movement loop priority. Only one loop can run at a time, this dictates that // Higher numbers beat lower numbers @@ -134,3 +134,19 @@ GLOBAL_VAR_INIT(glide_size_multiplier, 1.0) #define MOVELOOP_FAILURE 0 #define MOVELOOP_SUCCESS 1 #define MOVELOOP_NOT_READY 2 + +#define NEWTONS *1 + +#define DEFAULT_INERTIA_SPEED 5 +/// Maximum inertia that an object can hold. Used to prevent objects from getting to stupid speeds. +#define INERTIA_FORCE_CAP 25 NEWTONS +/// How much inertia is deducted when a mob has newtonian spacemove capabilities and is not moving in the same direction +#define INERTIA_FORCE_SPACEMOVE_REDUCTION 0.75 NEWTONS +/// How much inertia we must have to not be able to instantly stop after having something to grab +#define INERTIA_FORCE_SPACEMOVE_GRAB 1.5 NEWTONS +/// How much inertia is required for the impacted object to be thrown at the wall +#define INERTIA_FORCE_THROW_FLOOR 10 NEWTONS +/// How much inertia is required past the floor to add 1 strength +#define INERTIA_FORCE_PER_THROW_FORCE 5 NEWTONS +// Results in maximum speed of 1 tile per tick, capped at about 2/3rds of maximum force +#define INERTIA_SPEED_COEF 0.375 diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm index c85b2519869..e40821c4f8d 100644 --- a/code/__DEFINES/preferences.dm +++ b/code/__DEFINES/preferences.dm @@ -81,6 +81,7 @@ //Job preferences levels +#define JP_ANY 0 #define JP_LOW 1 #define JP_MEDIUM 2 #define JP_HIGH 3 diff --git a/code/__DEFINES/sound.dm b/code/__DEFINES/sound.dm index 1f298702d8c..2737871ca6f 100644 --- a/code/__DEFINES/sound.dm +++ b/code/__DEFINES/sound.dm @@ -253,3 +253,6 @@ GLOBAL_LIST_INIT(announcer_keys, list( #define SFX_DEFAULT_FISH_SLAP "default_fish_slap" #define SFX_ALT_FISH_SLAP "alt_fish_slap" #define SFX_FISH_PICKUP "fish_pickup" +#define SFX_CAT_MEOW "cat_meow" +#define SFX_CAT_PURR "cat_purr" +#define SFX_LIQUID_POUR "liquid_pour" diff --git a/code/__DEFINES/span.dm b/code/__DEFINES/span.dm index 259a13e1e9a..9b3c2612afa 100644 --- a/code/__DEFINES/span.dm +++ b/code/__DEFINES/span.dm @@ -14,8 +14,8 @@ #define span_alien(str) ("" + str + "") #define span_announce(str) ("" + str + "") #define span_announcement_header(str) ("" + str + "") -#define span_average(str) ("" + str + "") +#define span_bad(str) ("" + str + "") #define span_big(str) ("" + str + "") #define span_bigicon(str) ("" + str + "") #define span_binarysay(str) ("" + str + "") @@ -48,9 +48,12 @@ #define span_drone(str) ("" + str + "") #define span_engradio(str) ("" + str + "") #define span_extremelybig(str) ("" + str + "") +#define span_emote(str) ("" + str + "") #define span_enteradio(str) ("" + str + "") +#define span_game(str) ("" + str + "") #define span_game_say(str) ("" + str + "") #define span_ghostalert(str) ("" + str + "") +#define span_good(str) ("" + str + "") #define span_green(str) ("" + str + "") #define span_greenannounce(str) ("" + str + "") #define span_greenteamradio(str) ("" + str + "") @@ -70,6 +73,7 @@ #define span_info(str) ("" + str + "") #define span_infoplain(str) ("" + str + "") #define span_interface(str) ("" + str + "") +#define span_italics(str) ("" + str + "") #define span_linkify(str) ("" + str + "") #define span_looc(str) ("" + str + "") #define span_major_announcement_text(str) ("" + str + "") @@ -117,19 +121,22 @@ #define span_secradio(str) ("" + str + "") #define span_servradio(str) ("" + str + "") #define span_singing(str) ("" + str + "") +#define span_slightly_larger(str) ("" + str + "") #define span_slime(str) ("" + str + "") #define span_small(str) ("" + str + "") +#define span_smalldanger(str) ("" + str + "") #define span_smallnotice(str) ("" + str + "") #define span_smallnoticeital(str) ("" + str + "") #define span_soapbox(str) ("" + str + "") +#define span_spiderbreacher(str) ("" + str + "") #define span_spiderbroodmother(str) ("" + str + "") #define span_spiderscout(str) ("" + str + "") -#define span_spiderbreacher(str) ("" + str + "") #define span_subheader_announcement_text(str) ("" + str + "") #define span_suicide(str) ("" + str + "") #define span_suppradio(str) ("" + str + "") #define span_syndradio(str) ("" + str + "") #define span_tape_recorder(str) ("" + str + "") +#define span_tinydanger(str) ("" + str + "") #define span_tinynotice(str) ("" + str + "") #define span_tinynoticeital(str) ("" + str + "") #define span_unconscious(str) ("" + str + "") diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm index ead7764d605..121cf5a072d 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -37,7 +37,7 @@ /// Does this by inverting the passed in flags and seeing if we're still incapacitated #define INCAPACITATED_IGNORING(mob, flags) (mob.incapacitated & ~(flags)) -/// Maxamounts of fire stacks a mob can get +/// Max amounts of fire stacks a mob can get #define MAX_FIRE_STACKS 20 /// If a mob has a higher threshold than this, the icon shown will be increased to the big fire icon. #define MOB_BIG_FIRE_STACK_THRESHOLD 3 diff --git a/code/__DEFINES/surgery.dm b/code/__DEFINES/surgery.dm index ef40501d995..237e956ca7f 100644 --- a/code/__DEFINES/surgery.dm +++ b/code/__DEFINES/surgery.dm @@ -28,6 +28,9 @@ #define ORGAN_VIRGIN (1<<10) /// ALWAYS show this when scanned by advanced scanners, even if it is totally healthy #define ORGAN_PROMINENT (1<<11) +/// An organ that is ostensibly dangerous when inside a body +#define ORGAN_HAZARDOUS (1<<12) + /// Helper to figure out if a limb is organic #define IS_ORGANIC_LIMB(limb) (limb.bodytype & BODYTYPE_ORGANIC) /// Helper to figure out if a limb is robotic diff --git a/code/__DEFINES/tools.dm b/code/__DEFINES/tools.dm index 2348bd49f19..794c56691a6 100644 --- a/code/__DEFINES/tools.dm +++ b/code/__DEFINES/tools.dm @@ -39,3 +39,16 @@ /// Combination flag for any item interaction that blocks the rest of the attack chain #define ITEM_INTERACT_ANY_BLOCKER (ITEM_INTERACT_SUCCESS | ITEM_INTERACT_BLOCKING) + +/// How many seconds between each fuel depletion tick ("use" proc) +#define TOOL_FUEL_BURN_INTERVAL 5 + +///This is a number I got by quickly searching up the temperature to melt iron/glass, though not really realistic. +///This is used for places where lighters should not be hot enough to be used as a welding tool on. +#define HIGH_TEMPERATURE_REQUIRED 1500 + +/** + * A helper for checking if an item interaction should be skipped. + * This is only used explicitly because some interactions may not want to ever be skipped. + */ +#define SHOULD_SKIP_INTERACTION(target, item, user) (HAS_TRAIT(target, TRAIT_COMBAT_MODE_SKIP_INTERACTION) && user.combat_mode) diff --git a/code/__DEFINES/traits/declarations.dm b/code/__DEFINES/traits/declarations.dm index fbb0564dfd1..774b89cdb0e 100644 --- a/code/__DEFINES/traits/declarations.dm +++ b/code/__DEFINES/traits/declarations.dm @@ -26,6 +26,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_RESTRAINED "restrained" /// Apply this to make a mob not dense, and remove it when you want it to no longer make them undense, other sources of undesity will still apply. Always define a unique source when adding a new instance of this! #define TRAIT_UNDENSE "undense" +/// Makes the mob immune to damage and several other ailments. +#define TRAIT_GODMODE "godmode" /// Expands our FOV by 30 degrees if restricted #define TRAIT_EXPANDED_FOV "expanded_fov" /// Doesn't miss attacks @@ -112,6 +114,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_STABLELIVER "stable_liver" #define TRAIT_VATGROWN "vatgrown" #define TRAIT_RESISTHEAT "resist_heat" +/// Trait for when you can no longer gain body heat +#define TRAIT_HYPOTHERMIC "body_hypothermic" ///For when you've gotten a power from a dna vault #define TRAIT_USED_DNA_VAULT "used_dna_vault" /// For when you want to be able to touch hot things, but still want fire to be an issue. @@ -219,22 +223,30 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_NO_STAGGER "no_stagger" /// Getting hit by thrown movables won't push you away #define TRAIT_NO_THROW_HITPUSH "no_throw_hitpush" +/// This mob likes to eat fish. Raw, uncut fish. +#define TRAIT_FISH_EATER "fish_eater" ///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" ///lobstrosities and carps will prioritize/flee from those that have this trait (given by the skill-locked hat) #define TRAIT_SCARY_FISHERMAN "scary_fisherman" +/// Atoms with this trait can be right-clicked with a fish to release them, presumably back in the fishing spot they were caught from. +#define TRAIT_CATCH_AND_RELEASE "catch_and_release" ///This trait lets you get the size and weight of the fish by examining them #define TRAIT_EXAMINE_FISH "examine_fish" ///This trait lets you roughly know if the fish is dead, starving, drowning or sick by examining them #define TRAIT_EXAMINE_DEEPER_FISH "examine_deeper_fish" ///Trait given to turfs or objects that can be fished from #define TRAIT_FISHING_SPOT "fishing_spot" +///This trait prevents the fishing spot from being linked to the fish-porter when a multitool is being used. +#define TRAIT_UNLINKABLE_FISHING_SPOT "unlinkable_fishing_spot" ///Trait given to mobs that can fish without a rod #define TRAIT_PROFOUND_FISHER "profound_fisher" /// If an atom has this trait, then you can toss a bottle with a message in it. #define TRAIT_MESSAGE_IN_A_BOTTLE_LOCATION "message_in_a_bottle_location" +/// Stops other objects of the same type from being inserted inside the same aquarium it's in. +#define TRAIT_UNIQUE_AQUARIUM_CONTENT "unique_aquarium_content" /// This trait lets you evaluate someone's fitness level against your own #define TRAIT_EXAMINE_FITNESS "reveal_power_level" /// These mobs have particularly hygienic tongues @@ -658,7 +670,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_ASHSTORM_IMMUNE "ashstorm_immune" #define TRAIT_SNOWSTORM_IMMUNE "snowstorm_immune" #define TRAIT_RADSTORM_IMMUNE "radstorm_immune" -#define TRAIT_VOIDSTORM_IMMUNE "voidstorm_immune" #define TRAIT_WEATHER_IMMUNE "weather_immune" //Immune to ALL weather effects. /// Cannot be grabbed by goliath tentacles @@ -740,6 +751,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_T_RAY_VISIBLE "t-ray-visible" /// If this item's been fried #define TRAIT_FOOD_FRIED "food_fried" +/// If this item's been bbq grilled +#define TRAIT_FOOD_BBQ_GRILLED "food_bbq_grilled" /// This is a silver slime created item #define TRAIT_FOOD_SILVER "food_silver" /// If this item's been made by a chef instead of being map-spawned or admin-spawned or such @@ -801,6 +814,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_HAUNTED "haunted" /// An item that, if it has contents, will ignore its contents when scanning for contraband. #define TRAIT_CONTRABAND_BLOCKER "contraband_blocker" +/// For edible items that cannot be composted inside hydro trays +#define TRAIT_UNCOMPOSTABLE "uncompostable" //quirk traits #define TRAIT_ALCOHOL_TOLERANCE "alcohol_tolerance" @@ -837,6 +852,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_THROWINGARM "throwing_arm" #define TRAIT_SETTLER "settler" #define TRAIT_STRONG_STOMACH "strong_stomach" +#define TRAIT_VEGETARIAN "trait_vegetarian" /// This mob always lands on their feet when they fall, for better or for worse. #define TRAIT_CATLIKE_GRACE "catlike_grace" @@ -961,6 +977,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_FISH_AMPHIBIOUS "fish_amphibious" ///Trait needed for the lubefish evolution #define TRAIT_FISH_FED_LUBE "fish_fed_lube" +#define TRAIT_FISH_WELL_COOKED "fish_well_cooked" #define TRAIT_FISH_NO_HUNGER "fish_no_hunger" ///It comes from a fish case. Relevant for bounties so far. #define TRAIT_FISH_FROM_CASE "fish_from_case" @@ -973,7 +990,9 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai ///This fish is currently on cooldown and cannot splash ink unto people's faces #define TRAIT_FISH_INK_ON_COOLDOWN "fish_ink_on_cooldown" ///This fish requires two hands to carry even if smaller than FISH_SIZE_TWO_HANDS_REQUIRED, as long as it's bulky-sized. -#define TRAIT_FISH_SHOULD_TWOHANDED "should_twohanded" +#define TRAIT_FISH_SHOULD_TWOHANDED "fish_should_twohanded" +///This fish won't be killed when cooked. +#define TRAIT_FISH_SURVIVE_COOKING "fish_survive_cooking" /// Trait given to angelic constructs to let them purge cult runes #define TRAIT_ANGELIC "angelic" @@ -1121,11 +1140,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// this object has been frozen #define TRAIT_FROZEN "frozen" -/// Currently fishing -#define TRAIT_GONE_FISHING "fishing" -/// Currently fishing, and it's the active minigame phase -#define TRAIT_ACTIVELY_FISHING "actively_fishing" - /// Makes a character be better/worse at tackling depending on their wing's status #define TRAIT_TACKLING_WINGED_ATTACKER "tacking_winged_attacker" @@ -1268,6 +1282,9 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai ///Trait given to a turf that should not be allowed to be terraformed, such as turfs holding ore vents. #define TRAIT_NO_TERRAFORM "no_terraform" +///Trait that prevents mobs from stopping by grabbing objects +#define TRAIT_NOGRAV_ALWAYS_DRIFT "nograv_always_drift" + ///Mobs with these trait do not get italicized/quiet speech when speaking in low pressure #define TRAIT_SPEECH_BOOSTER "speech_booster" @@ -1277,4 +1294,20 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai ///Trait which allows mobs to parry mining mob projectiles #define TRAIT_MINING_PARRYING "mining_parrying" +/** + * + * This trait is used in some interactions very high in the interaction chain to allow + * certain atoms to be skipped by said interactions if the user is in combat mode. + * + * Its primarily use case is for stuff like storage and tables, to allow things like emags to be bagged + * (because in some contexts you might want to be emagging a bag, and in others you might want to be storing it.) + * + * This is only checked by certain items explicitly so you can't just add the trait and expect it to work. + * (This may be changed later but I chose to do it this way to avoid messing up interactions which require combat mode) + */ +#define TRAIT_COMBAT_MODE_SKIP_INTERACTION "combat_mode_skip_interaction" + +///A "fake" effect that should not be subject to normal effect removal methods (like the effect remover component) +#define TRAIT_ILLUSORY_EFFECT "illusory_effect" + // END TRAIT DEFINES diff --git a/code/__DEFINES/traits/sources.dm b/code/__DEFINES/traits/sources.dm index 0648dd4dd37..beb2b98944b 100644 --- a/code/__DEFINES/traits/sources.dm +++ b/code/__DEFINES/traits/sources.dm @@ -299,5 +299,11 @@ /// Trait when a drink was renamed by a shaker #define SHAKER_LABEL_TRAIT "shaker_trait" +/// Trait given by a jetpack +#define JETPACK_TRAIT "jetpack_trait" + /// Trait added by style component #define STYLE_TRAIT "style" + +/// Trait from an engraving +#define ENGRAVED_TRAIT "engraved" diff --git a/code/__HELPERS/atoms.dm b/code/__HELPERS/atoms.dm index 22f082a5eb3..d54b29b3f4a 100644 --- a/code/__HELPERS/atoms.dm +++ b/code/__HELPERS/atoms.dm @@ -63,17 +63,19 @@ var/turf/target_turf = get_turf(target) if(get_dist(source, target) > length) return FALSE + if(current == target_turf) + return TRUE + var/steps = 1 if(current == target_turf)//they are on the same turf, source can see the target return TRUE - var/list/steps = get_steps_to(current, target_turf) - if(isnull(steps) || length(steps) > length) - return FALSE - for(var/direction in steps) - current = get_step(current, direction) - if(current == target_turf) - break + current = get_step_towards(current, target_turf) + while(current != target_turf) + if(steps > length) + return FALSE if(IS_OPAQUE_TURF(current)) return FALSE + current = get_step_towards(current, target_turf) + steps++ return TRUE ///Get the cardinal direction between two atoms @@ -83,9 +85,9 @@ return get_dir(start, end) & (rand() * (dx+dy) < dy ? 3 : 12) /** - * Finds the distance between two atoms, in pixels - * centered = FALSE counts from turf edge to edge - * centered = TRUE counts from turf center to turf center + * Finds the distance between two atoms, in pixels \ + * centered = FALSE counts from turf edge to edge \ + * centered = TRUE counts from turf center to turf center \ * of course mathematically this is just adding world.icon_size on again **/ /proc/get_pixel_distance(atom/start, atom/end, centered = TRUE) @@ -93,7 +95,7 @@ return 0 . = bounds_dist(start, end) + sqrt((((start.pixel_x + end.pixel_x) ** 2) + ((start.pixel_y + end.pixel_y) ** 2))) if(centered) - . += world.icon_size + . += ICON_SIZE_ALL /** * Check if there is already a wall item on the turf loc @@ -334,6 +336,6 @@ rough example of the "cone" made by the 3 dirs checked var/icon_width = icon_dimensions["width"] var/icon_height = icon_dimensions["height"] return list( - "x" = icon_width > world.icon_size && pixel_x != 0 ? (icon_width - world.icon_size) * 0.5 : 0, - "y" = icon_height > world.icon_size && pixel_y != 0 ? (icon_height - world.icon_size) * 0.5 : 0, + "x" = icon_width > ICON_SIZE_X && pixel_x != 0 ? (icon_width - ICON_SIZE_X) * 0.5 : 0, + "y" = icon_height > ICON_SIZE_Y && pixel_y != 0 ? (icon_height - ICON_SIZE_Y) * 0.5 : 0, ) diff --git a/code/__HELPERS/cmp.dm b/code/__HELPERS/cmp.dm index f9957f4c739..76651964e24 100644 --- a/code/__HELPERS/cmp.dm +++ b/code/__HELPERS/cmp.dm @@ -195,3 +195,20 @@ /proc/cmp_deathmatch_mods(datum/deathmatch_modifier/a, datum/deathmatch_modifier/b) return sorttext(b.name, a.name) + +/** + * Orders fish types following this order (freshwater -> saltwater -> anadromous -> sulphuric water -> any water -> air) + * If both share the same required fluid type, they'll be ordered by name instead. + */ +/proc/cmp_fish_fluid(obj/item/fish/a, obj/item/fish/b) + var/static/list/fluids_priority = list( + AQUARIUM_FLUID_FRESHWATER, + AQUARIUM_FLUID_SALTWATER, + AQUARIUM_FLUID_ANADROMOUS, + AQUARIUM_FLUID_SULPHWATEVER, + AQUARIUM_FLUID_ANY_WATER, + AQUARIUM_FLUID_AIR, + ) + var/position_a = fluids_priority.Find(initial(a.required_fluid_type)) + var/position_b = fluids_priority.Find(initial(b.required_fluid_type)) + return cmp_numeric_asc(position_a, position_b) || cmp_text_asc(initial(b.name), initial(a.name)) diff --git a/code/__HELPERS/dynamic_human_icon_gen.dm b/code/__HELPERS/dynamic_human_icon_gen.dm index eb6d53517df..48e34c481ca 100644 --- a/code/__HELPERS/dynamic_human_icon_gen.dm +++ b/code/__HELPERS/dynamic_human_icon_gen.dm @@ -58,6 +58,7 @@ GLOBAL_LIST_EMPTY(dynamic_human_appearances) /proc/set_dynamic_human_appearance(list/arguments) var/atom/target = arguments[1] //1st argument is the target var/dynamic_appearance = get_dynamic_human_appearance(arglist(arguments.Copy(2))) //the rest of the arguments starting from 2 matter to the proc - target.icon = 'icons/blanks/32x32.dmi' - target.icon_state = "nothing" + target.icon = 'icons/mob/human/human.dmi' + target.icon_state = "" + target.appearance_flags |= KEEP_TOGETHER target.copy_overlays(dynamic_appearance, cut_old = TRUE) diff --git a/code/__HELPERS/filters.dm b/code/__HELPERS/filters.dm index cd44409ddb2..14233a28076 100644 --- a/code/__HELPERS/filters.dm +++ b/code/__HELPERS/filters.dm @@ -23,7 +23,7 @@ GLOBAL_LIST_INIT(master_filter_info, list( ) ), // Not implemented, but if this isn't uncommented some windows will just error - // Needs either a proper matrix editor, or just a hook to our existing one + // Needs either a proper matrix editor, or just a hook to our existing one // Issue is filterrific assumes variables will have the same value type if they share the same name, which this violates // Gotta refactor this sometime "color" = list( @@ -169,7 +169,7 @@ GLOBAL_LIST_INIT(master_filter_info, list( if(!isnull(space)) .["space"] = space -/proc/displacement_map_filter(icon, render_source, x, y, size = 32) +/proc/displacement_map_filter(icon, render_source, x, y, size = ICON_SIZE_ALL) . = list("type" = "displace") if(!isnull(icon)) .["icon"] = icon diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index ce48e593980..3eb89831957 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -181,7 +181,7 @@ //First we spawn a dude. var/mob/living/carbon/human/new_character = new//The mob being spawned. - SSjob.SendToLateJoin(new_character) + SSjob.send_to_late_join(new_character) ghost_player.client.prefs.safe_transfer_prefs_to(new_character) new_character.dna.update_dna_identity() @@ -235,7 +235,7 @@ if(!SSticker.IsRoundInProgress() || QDELETED(character)) return var/area/player_area = get_area(character) - deadchat_broadcast(" has arrived at the station at [player_area.name].", "[character.real_name] ([rank])", follow_target = character, message_type=DEADCHAT_ARRIVALRATTLE) + deadchat_broadcast(span_game(" has arrived at the station at [span_name(player_area.name)]."), span_game("[span_name(character.real_name)] ([rank])"), follow_target = character, message_type=DEADCHAT_ARRIVALRATTLE) if(!character.mind) return if(!GLOB.announcement_systems.len) @@ -243,8 +243,16 @@ if(!(character.mind.assigned_role.job_flags & JOB_ANNOUNCE_ARRIVAL)) return - var/obj/machinery/announcement_system/announcer = pick(GLOB.announcement_systems) - announcer.announce("ARRIVAL", character.real_name, rank, list()) //make the list empty to make it announce it in common + var/obj/machinery/announcement_system/announcer + var/list/available_machines = list() + for(var/obj/machinery/announcement_system/announce as anything in GLOB.announcement_systems) + if(announce.arrival_toggle) + available_machines += announce + break + if(!length(available_machines)) + return + announcer = pick(available_machines) + announcer.announce(AUTO_ANNOUNCE_ARRIVAL, character.real_name, rank, list()) //make the list empty to make it announce it in common ///Check if the turf pressure allows specialized equipment to work /proc/lavaland_equipment_pressure_check(turf/turf_to_check) diff --git a/code/__HELPERS/hallucinations.dm b/code/__HELPERS/hallucinations.dm index edd65ee926a..d3d4a2630ed 100644 --- a/code/__HELPERS/hallucinations.dm +++ b/code/__HELPERS/hallucinations.dm @@ -86,6 +86,30 @@ GLOBAL_LIST_EMPTY(all_ongoing_hallucinations) if(length(optional_messages)) to_chat(nearby_living, pick(optional_messages)) +/** + * Emits a hallucinating pulse around the passed atom. + * Affects everyone in the passed radius except for those with TRAIT_MADNESS_IMMUNE. This affects blind players. + * + * center - required, the center of the pulse + * radius - the radius around that the pulse reaches + * hallucination_duration - how much hallucination is added by the pulse. reduced based on distance to the center. + * hallucination_max_duration - a cap on how much hallucination can be added + * optional_messages - optional list of messages passed. Those affected by pulses will be given one of the messages in said list. + */ +/proc/hallucination_pulse(atom/center, radius = 7, hallucination_duration = 50 SECONDS, hallucination_max_duration, list/optional_messages) + for(var/mob/living/nearby_living in range(center, radius)) + if(HAS_MIND_TRAIT(nearby_living, TRAIT_MADNESS_IMMUNE)) + continue + + if(nearby_living.mob_biotypes & NO_HALLUCINATION_BIOTYPES) + continue + + // Everyone else gets hallucinations. + var/dist = sqrt(1 / max(1, get_dist(nearby_living, center))) + nearby_living.adjust_hallucinations_up_to(hallucination_duration * dist, hallucination_max_duration) + if(length(optional_messages)) + to_chat(nearby_living, pick(optional_messages)) + /// Global weighted list of all hallucinations that can show up randomly. GLOBAL_LIST_INIT(random_hallucination_weighted_list, generate_hallucination_weighted_list()) @@ -226,7 +250,7 @@ ADMIN_VERB(debug_hallucination_weighted_list_per_type, R_DEBUG, "Show Hallucinat if(!custom_icon_state) return - var/custom_name = tgui_input_text(user, "What name should it show up as? (Can be empty)", "Custom Delusion: Name") + var/custom_name = tgui_input_text(user, "What name should it show up as? (Can be empty)", "Custom Delusion: Name", max_length = MAX_NAME_LEN) delusion_args += list( custom_icon_file = custom_icon_file, diff --git a/code/__HELPERS/hearted.dm b/code/__HELPERS/hearted.dm index adae298516e..d8f7832cbc0 100644 --- a/code/__HELPERS/hearted.dm +++ b/code/__HELPERS/hearted.dm @@ -45,11 +45,11 @@ var/heart_nominee switch(attempt) if(1) - heart_nominee = tgui_input_text(src, "What was their name? Just a first or last name may be enough.", "<3?") + heart_nominee = tgui_input_text(src, "What was their name? Just a first or last name may be enough.", "<3?", max_length = MAX_NAME_LEN) if(2) - heart_nominee = tgui_input_text(src, "Try again, what was their name? Just a first or last name may be enough.", "<3?") + heart_nominee = tgui_input_text(src, "Try again, what was their name? Just a first or last name may be enough.", "<3?", max_length = MAX_NAME_LEN) if(3) - heart_nominee = tgui_input_text(src, "One more try, what was their name? Just a first or last name may be enough.", "<3?") + heart_nominee = tgui_input_text(src, "One more try, what was their name? Just a first or last name may be enough.", "<3?", max_length = MAX_NAME_LEN) if(!heart_nominee) return diff --git a/code/__HELPERS/honkerblast.dm b/code/__HELPERS/honkerblast.dm index c0712f420f2..f49a5ca4aca 100644 --- a/code/__HELPERS/honkerblast.dm +++ b/code/__HELPERS/honkerblast.dm @@ -5,7 +5,7 @@ var/list/properly_honked = list() var/list/severely_honked = list() - playsound(origin_turf, 'sound/items/airhorn.ogg', 100, TRUE) + playsound(origin_turf, 'sound/items/airhorn/airhorn.ogg', 100, TRUE) for(var/mob/living/carbon/victim as anything in hearers(max(light_range, medium_range, heavy_range), origin_turf)) if(!victim.can_hear()) diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm index 09dcea7e1f3..d28f964df80 100644 --- a/code/__HELPERS/icons.dm +++ b/code/__HELPERS/icons.dm @@ -402,7 +402,7 @@ world /// appearance system (overlays/underlays, etc.) is not available. /// /// Only the first argument is required. -/proc/getFlatIcon(image/appearance, defdir, deficon, defstate, defblend, start = TRUE, no_anim = FALSE) +/proc/getFlatIcon(image/appearance, defdir, deficon, defstate, defblend, start = TRUE, no_anim = FALSE, parentcolor) // Loop through the underlays, then overlays, sorting them into the layers list #define PROCESS_OVERLAYS_OR_UNDERLAYS(flat, process, base_layer) \ for (var/i in 1 to process.len) { \ @@ -466,25 +466,24 @@ world var/base_icon_dir //We'll use this to get the icon state to display if not null BUT NOT pass it to overlays as the dir we have - //Try to remove/optimize this section ASAP, CPU hog. - //Determines if there's directionals. - if(render_icon && curdir != SOUTH) - if ( - !length(icon_states(icon(curicon, curstate, NORTH))) \ - && !length(icon_states(icon(curicon, curstate, EAST))) \ - && !length(icon_states(icon(curicon, curstate, WEST))) \ - ) - base_icon_dir = SOUTH + if(render_icon) + //Try to remove/optimize this section if you can, it's a CPU hog. + //Determines if there're directionals. + if (curdir != SOUTH) + // icon states either have 1, 4 or 8 dirs. We only have to check + // one of NORTH, EAST or WEST to know that this isn't a 1-dir icon_state since they just have SOUTH. + if(!length(icon_states(icon(curicon, curstate, NORTH)))) + base_icon_dir = SOUTH + + var/list/icon_dimensions = get_icon_dimensions(curicon) + var/icon_width = icon_dimensions["width"] + var/icon_height = icon_dimensions["height"] + if(icon_width != 32 || icon_height != 32) + flat.Scale(icon_width, icon_height) if(!base_icon_dir) base_icon_dir = curdir - // Expand our canvas to fit if we're too big - if(render_icon) - var/icon/active_icon = icon(curicon) - if(active_icon.Width() != 32 || active_icon.Height() != 32) - flat.Scale(active_icon.Width(), active_icon.Height()) - var/curblend = appearance.blend_mode || defblend if(appearance.overlays.len || appearance.underlays.len) @@ -514,6 +513,20 @@ world var/addY1 = 0 var/addY2 = 0 + if(appearance.color) + if(islist(appearance.color)) + flat.MapColors(arglist(appearance.color)) + else + flat.Blend(appearance.color, ICON_MULTIPLY) + + if(parentcolor && !(appearance.appearance_flags & RESET_COLOR)) + if(islist(parentcolor)) + flat.MapColors(arglist(parentcolor)) + else + flat.Blend(parentcolor, ICON_MULTIPLY) + + var/next_parentcolor = appearance.color || parentcolor + for(var/image/layer_image as anything in layers) if(layer_image.alpha == 0) continue @@ -521,8 +534,14 @@ world if(layer_image == copy) // 'layer_image' is an /image based on the object being flattened. curblend = BLEND_OVERLAY add = icon(layer_image.icon, layer_image.icon_state, base_icon_dir) + if(appearance.color) + if(islist(appearance.color)) + add.MapColors(arglist(appearance.color)) + else + add.Blend(appearance.color, ICON_MULTIPLY) else // 'I' is an appearance object. - add = getFlatIcon(image(layer_image), curdir, curicon, curstate, curblend, FALSE, no_anim) + add = getFlatIcon(image(layer_image), curdir, curicon, curstate, curblend, FALSE, no_anim, next_parentcolor) + if(!add) continue @@ -554,11 +573,6 @@ world // Blend the overlay into the flattened icon flat.Blend(add, blendMode2iconMode(curblend), layer_image.pixel_x + 2 - flatX1, layer_image.pixel_y + 2 - flatY1) - if(appearance.color) - if(islist(appearance.color)) - flat.MapColors(arglist(appearance.color)) - else - flat.Blend(appearance.color, ICON_MULTIPLY) if(appearance.alpha < 255) flat.Blend(rgb(255, 255, 255, appearance.alpha), ICON_MULTIPLY) @@ -1024,7 +1038,7 @@ GLOBAL_LIST_EMPTY(friendly_animal_types) var/icon/target_icon = target var/icon_base64 = icon2base64(target_icon) - if (target_icon.Height() > world.icon_size || target_icon.Width() > world.icon_size) + if (target_icon.Height() > ICON_SIZE_Y || target_icon.Width() > ICON_SIZE_X) var/icon_md5 = md5(icon_base64) icon_base64 = bicon_cache[icon_md5] if (!icon_base64) // Doesn't exist yet, make it. @@ -1078,14 +1092,14 @@ GLOBAL_LIST_EMPTY(transformation_animation_objects) var/top_part_filter = filter(type="alpha",icon=icon('icons/effects/alphacolors.dmi',"white"),y=0) filters += top_part_filter var/filter_index = length(filters) - animate(filters[filter_index],y=-32,time=time) + animate(filters[filter_index],y=-ICON_SIZE_Y,time=time) //Appearing part var/obj/effect/overlay/appearing_part = new appearing_part.appearance = result_appearance appearing_part.appearance_flags |= KEEP_TOGETHER | KEEP_APART appearing_part.vis_flags = VIS_INHERIT_ID appearing_part.filters = filter(type="alpha",icon=icon('icons/effects/alphacolors.dmi',"white"),y=0,flags=MASK_INVERSE) - animate(appearing_part.filters[1],y=-32,time=time) + animate(appearing_part.filters[1],y=-ICON_SIZE_Y,time=time) transformation_objects += appearing_part //Transform effect thing if(transform_appearance) @@ -1132,19 +1146,19 @@ GLOBAL_LIST_EMPTY(transformation_animation_objects) if(!x_dimension || !y_dimension) return - if((x_dimension == world.icon_size) && (y_dimension == world.icon_size)) + if((x_dimension == ICON_SIZE_X) && (y_dimension == ICON_SIZE_Y)) return image_to_center //Offset the image so that its bottom left corner is shifted this many pixels //This makes it infinitely easier to draw larger inhands/images larger than world.iconsize //but still use them in game - var/x_offset = -((x_dimension / world.icon_size) - 1) * (world.icon_size * 0.5) - var/y_offset = -((y_dimension / world.icon_size) - 1) * (world.icon_size * 0.5) + var/x_offset = -((x_dimension / ICON_SIZE_X) - 1) * (ICON_SIZE_X * 0.5) + var/y_offset = -((y_dimension / ICON_SIZE_Y) - 1) * (ICON_SIZE_Y * 0.5) - //Correct values under world.icon_size - if(x_dimension < world.icon_size) + //Correct values under icon_size + if(x_dimension < ICON_SIZE_X) x_offset *= -1 - if(y_dimension < world.icon_size) + if(y_dimension < ICON_SIZE_Y) y_offset *= -1 image_to_center.pixel_x = x_offset @@ -1202,7 +1216,7 @@ GLOBAL_LIST_EMPTY(transformation_animation_objects) */ /proc/get_size_in_tiles(obj/target) var/icon/size_check = icon(target.icon, target.icon_state) - var/size = size_check.Width() / world.icon_size + var/size = size_check.Width() / ICON_SIZE_X return size @@ -1215,11 +1229,11 @@ GLOBAL_LIST_EMPTY(transformation_animation_objects) var/size = get_size_in_tiles(src) if(dir in list(NORTH, SOUTH)) - bound_width = size * world.icon_size - bound_height = world.icon_size + bound_width = size * ICON_SIZE_X + bound_height = ICON_SIZE_Y else - bound_width = world.icon_size - bound_height = size * world.icon_size + bound_width = ICON_SIZE_X + bound_height = size * ICON_SIZE_Y /// Returns a list containing the width and height of an icon file /proc/get_icon_dimensions(icon_path) @@ -1247,15 +1261,15 @@ GLOBAL_LIST_EMPTY(transformation_animation_objects) var/width = icon_dimensions["width"] var/height = icon_dimensions["height"] - if(width > world.icon_size) - alert_overlay.pixel_x = -(world.icon_size / 2) * ((width - world.icon_size) / world.icon_size) - if(height > world.icon_size) - alert_overlay.pixel_y = -(world.icon_size / 2) * ((height - world.icon_size) / world.icon_size) - if(width > world.icon_size || height > world.icon_size) + if(width > ICON_SIZE_X) + alert_overlay.pixel_x = -(ICON_SIZE_X / 2) * ((width - ICON_SIZE_X) / ICON_SIZE_X) + if(height > ICON_SIZE_Y) + alert_overlay.pixel_y = -(ICON_SIZE_Y / 2) * ((height - ICON_SIZE_Y) / ICON_SIZE_Y) + if(width > ICON_SIZE_X || height > ICON_SIZE_Y) if(width >= height) - scale = world.icon_size / width + scale = ICON_SIZE_X / width else - scale = world.icon_size / height + scale = ICON_SIZE_Y / height alert_overlay.transform = alert_overlay.transform.Scale(scale) return alert_overlay diff --git a/code/__HELPERS/maths.dm b/code/__HELPERS/maths.dm index 5a55fd46fd2..7e6db6fb020 100644 --- a/code/__HELPERS/maths.dm +++ b/code/__HELPERS/maths.dm @@ -2,8 +2,8 @@ /proc/get_angle(atom/movable/start, atom/movable/end)//For beams. if(!start || !end) return 0 - var/dy =(32 * end.y + end.pixel_y) - (32 * start.y + start.pixel_y) - var/dx =(32 * end.x + end.pixel_x) - (32 * start.x + start.pixel_x) + var/dy =(ICON_SIZE_Y * end.y + end.pixel_y) - (ICON_SIZE_Y * start.y + start.pixel_y) + var/dx =(ICON_SIZE_X * end.x + end.pixel_x) - (ICON_SIZE_X * start.x + start.pixel_x) return delta_to_angle(dx, dy) /// Calculate the angle produced by a pair of x and y deltas @@ -18,8 +18,8 @@ /// Angle between two arbitrary points and horizontal line same as [/proc/get_angle] /proc/get_angle_raw(start_x, start_y, start_pixel_x, start_pixel_y, end_x, end_y, end_pixel_x, end_pixel_y) - var/dy = (32 * end_y + end_pixel_y) - (32 * start_y + start_pixel_y) - var/dx = (32 * end_x + end_pixel_x) - (32 * start_x + start_pixel_x) + var/dy = (ICON_SIZE_Y * end_y + end_pixel_y) - (ICON_SIZE_Y * start_y + start_pixel_y) + var/dx = (ICON_SIZE_X * end_x + end_pixel_x) - (ICON_SIZE_X * start_x + start_pixel_x) if(!dy) return (dx >= 0) ? 90 : 270 . = arctan(dx/dy) @@ -241,3 +241,7 @@ /// Useful for providing an additive modifier to a value that is used as a divisor, such as `/obj/projectile/var/speed` /proc/reciprocal_add(x, y) return 1/((1/x)+y) + +/// 180s an angle +/proc/reverse_angle(angle) + return (angle + 180) % 360 diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 631e06c8718..88c89f39210 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -258,7 +258,7 @@ GLOBAL_LIST_INIT(skin_tone_names, list( var/atom/target_loc = target?.loc var/drifting = FALSE - if(GLOB.move_manager.processing_on(user, SSspacedrift)) + if(GLOB.move_manager.processing_on(user, SSnewtonian_movement)) drifting = TRUE var/holding = user.get_active_held_item() @@ -287,7 +287,7 @@ GLOBAL_LIST_INIT(skin_tone_names, list( if(!QDELETED(progbar)) progbar.update(world.time - starttime) - if(drifting && !GLOB.move_manager.processing_on(user, SSspacedrift)) + if(drifting && !GLOB.move_manager.processing_on(user, SSnewtonian_movement)) drifting = FALSE user_loc = user.loc diff --git a/code/__HELPERS/mouse_control.dm b/code/__HELPERS/mouse_control.dm index 0c99e53e7a0..14588b41cb7 100644 --- a/code/__HELPERS/mouse_control.dm +++ b/code/__HELPERS/mouse_control.dm @@ -11,8 +11,8 @@ var/x = (text2num(screen_loc_X[1]) * 32 + text2num(screen_loc_X[2]) - 32) var/y = (text2num(screen_loc_Y[1]) * 32 + text2num(screen_loc_Y[2]) - 32) var/list/screenview = getviewsize(client.view) - var/screenviewX = screenview[1] * world.icon_size - var/screenviewY = screenview[2] * world.icon_size + var/screenviewX = screenview[1] * ICON_SIZE_X + var/screenviewY = screenview[2] * ICON_SIZE_Y var/ox = round(screenviewX/2) - client.pixel_x //"origin" x var/oy = round(screenviewY/2) - client.pixel_y //"origin" y var/angle = SIMPLIFY_DEGREES(ATAN2(y - oy, x - ox)) diff --git a/code/__HELPERS/movement.dm b/code/__HELPERS/movement.dm new file mode 100644 index 00000000000..e820b3dfff1 --- /dev/null +++ b/code/__HELPERS/movement.dm @@ -0,0 +1,2 @@ +/// Converts w_class into newtons from throwing it, in (0.6 ~ 2.2) range +#define WEIGHT_TO_NEWTONS(w_class, arguments...) 0.2 NEWTONS + w_class * 0.4 NEWTONS diff --git a/code/__HELPERS/priority_announce.dm b/code/__HELPERS/priority_announce.dm index b9964b9be93..6efabd544b2 100644 --- a/code/__HELPERS/priority_announce.dm +++ b/code/__HELPERS/priority_announce.dm @@ -142,7 +142,7 @@ else finalized_announcement = CHAT_ALERT_DEFAULT_SPAN(jointext(minor_announcement_strings, "")) - var/custom_sound = sound_override || (alert ? 'modular_skyrat/modules/alerts/sound/alerts/alert1.ogg' : 'sound/misc/notice2.ogg') // SKYRAT EDIT CHANGE - CUSTOM ANNOUNCEMENTS - Original: 'sound/misc/notice1.ogg' + var/custom_sound = sound_override || (alert ? 'modular_skyrat/modules/alerts/sound/alerts/alert1.ogg' : 'sound/announcer/notice/notice2.ogg') // SKYRAT EDIT CHANGE - CUSTOM ANNOUNCEMENTS - Original: 'sound/misc/notice1.ogg' dispatch_announcement_to_players(finalized_announcement, players, custom_sound, should_play_sound) /// Sends an announcement about the level changing to players. Uses the passed in datum and the subsystem's previous security level to generate the message. @@ -189,7 +189,7 @@ // SKYRAT EDIT CHANGE BEGIN - CUSTOM ANNOUNCEMENTS /* Original: - var/sound_to_play = !isnull(sound_override) ? sound_override : 'sound/misc/notice2.ogg' + var/sound_to_play = !isnull(sound_override) ? sound_override : 'sound/announcer/notice/notice2.ogg' for(var/mob/target in players) if(isnewplayer(target) || !target.can_hear()) diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm index 2ff1e78ac68..b2b511586f0 100644 --- a/code/__HELPERS/roundend.dm +++ b/code/__HELPERS/roundend.dm @@ -588,7 +588,7 @@ GLOBAL_LIST_INIT(achievements_unlocked, list()) /datum/controller/subsystem/ticker/proc/medal_report() if(GLOB.commendations.len) var/list/parts = list() - parts += "Medal Commendations:" + parts += span_header("Medal Commendations:") for (var/com in GLOB.commendations) parts += com return "
[parts.Join("
")]
" @@ -677,7 +677,7 @@ GLOBAL_LIST_INIT(achievements_unlocked, list()) var/datum/action/report/R = new C.player_details.player_actions += R R.Grant(C.mob) - to_chat(C,"Show roundend report again") + to_chat(C,span_infoplain("Show roundend report again")) /datum/action/report name = "Show roundend report" diff --git a/code/__HELPERS/screen_objs.dm b/code/__HELPERS/screen_objs.dm index cb8520225ab..00f6bd41570 100644 --- a/code/__HELPERS/screen_objs.dm +++ b/code/__HELPERS/screen_objs.dm @@ -13,11 +13,11 @@ if(findtext(screen_loc, "EAST")) // If you're starting from the east, we start from the east too x += view_size[1] if(findtext(screen_loc, "WEST")) // HHHHHHHHHHHHHHHHHHHHHH WEST is technically a 1 tile offset from the start. Shoot me please - x += world.icon_size + x += ICON_SIZE_X if(findtext(screen_loc, "NORTH")) y += view_size[2] if(findtext(screen_loc, "SOUTH")) - y += world.icon_size + y += ICON_SIZE_Y var/list/x_and_y = splittext(screen_loc, ",") @@ -36,8 +36,8 @@ x_coord = text2num(cut_relative_direction(x_coord)) y_coord = text2num(cut_relative_direction(y_coord)) - x += x_coord * world.icon_size - y += y_coord * world.icon_size + x += x_coord * ICON_SIZE_X + y += y_coord * ICON_SIZE_Y if(length(x_pack) > 1) x += text2num(x_pack[2]) @@ -51,14 +51,14 @@ /proc/offset_to_screen_loc(x_offset, y_offset, view = null) if(view) var/list/view_bounds = view_to_pixels(view) - x_offset = clamp(x_offset, world.icon_size, view_bounds[1]) - y_offset = clamp(y_offset, world.icon_size, view_bounds[2]) + x_offset = clamp(x_offset, ICON_SIZE_X, view_bounds[1]) + y_offset = clamp(y_offset, ICON_SIZE_Y, view_bounds[2]) // Round with no argument is floor, so we get the non pixel offset here - var/x = round(x_offset / world.icon_size) - var/pixel_x = x_offset % world.icon_size - var/y = round(y_offset / world.icon_size) - var/pixel_y = y_offset % world.icon_size + var/x = round(x_offset / ICON_SIZE_X) + var/pixel_x = x_offset % ICON_SIZE_X + var/y = round(y_offset / ICON_SIZE_Y) + var/pixel_y = y_offset % ICON_SIZE_Y var/list/generated_loc = list() generated_loc += "[x]" @@ -88,9 +88,9 @@ // Bias to the right, down, left, and then finally up if(base_x + target_offset < view_size[1]) return offset_to_screen_loc(base_x + target_offset, base_y, view) - if(base_y - target_offset > world.icon_size) + if(base_y - target_offset > ICON_SIZE_Y) return offset_to_screen_loc(base_x, base_y - target_offset, view) - if(base_x - target_offset > world.icon_size) + if(base_x - target_offset > ICON_SIZE_X) return offset_to_screen_loc(base_x - target_offset, base_y, view) if(base_y + target_offset < view_size[2]) return offset_to_screen_loc(base_x, base_y + target_offset, view) @@ -104,12 +104,12 @@ /// Returns a screen_loc format for a tiling screen objects from start and end positions. Start should be bottom left corner, and end top right corner. /proc/spanning_screen_loc(start_px, start_py, end_px, end_py) - var/starting_tile_x = round(start_px / 32) - start_px -= starting_tile_x * 32 - var/starting_tile_y = round(start_py/ 32) - start_py -= starting_tile_y * 32 - var/ending_tile_x = round(end_px / 32) - end_px -= ending_tile_x * 32 - var/ending_tile_y = round(end_py / 32) - end_py -= ending_tile_y * 32 + var/starting_tile_x = round(start_px / ICON_SIZE_X) + start_px -= starting_tile_x * ICON_SIZE_X + var/starting_tile_y = round(start_py/ ICON_SIZE_Y) + start_py -= starting_tile_y * ICON_SIZE_Y + var/ending_tile_x = round(end_px / ICON_SIZE_X) + end_px -= ending_tile_x * ICON_SIZE_X + var/ending_tile_y = round(end_py / ICON_SIZE_Y) + end_py -= ending_tile_y * ICON_SIZE_Y return "[starting_tile_x]:[start_px],[starting_tile_y]:[start_py] to [ending_tile_x]:[end_px],[ending_tile_y]:[end_py]" diff --git a/code/__HELPERS/spatial_info.dm b/code/__HELPERS/spatial_info.dm index 2a8b61bd01d..a2c47e87c0a 100644 --- a/code/__HELPERS/spatial_info.dm +++ b/code/__HELPERS/spatial_info.dm @@ -195,12 +195,8 @@ var/turf/inbetween_turf = center_turf //this is the lowest overhead way of doing a loop in dm other than a goto. distance is guaranteed to be >= steps taken to target by this algorithm - var/list/steps = get_steps_to(inbetween_turf, target_turf) - if(isnull(steps)) - return - steps.Cut(distance + 1) - for(var/direction in steps) - inbetween_turf = get_step(inbetween_turf, direction) + for(var/step_counter in 1 to distance) + inbetween_turf = get_step_towards(inbetween_turf, target_turf) if(inbetween_turf == target_turf)//we've gotten to target's turf without returning due to turf opacity, so we must be able to see target break @@ -215,37 +211,49 @@ for(var/obj/item/radio/radio as anything in radios) . |= get_hearers_in_LOS(radio.canhear_range, radio, FALSE) +//Used when converting pixels to tiles to make them accurate +#define OFFSET_X (0.5 / ICON_SIZE_X) +#define OFFSET_Y (0.5 / ICON_SIZE_Y) + ///Calculate if two atoms are in sight, returns TRUE or FALSE /proc/inLineOfSight(X1,Y1,X2,Y2,Z=1,PX1=16.5,PY1=16.5,PX2=16.5,PY2=16.5) - var/turf/T + var/turf/current_turf if(X1 == X2) if(Y1 == Y2) return TRUE //Light cannot be blocked on same tile else - var/s = SIGN(Y2-Y1) - Y1+=s + var/sign = SIGN(Y2-Y1) + Y1 += sign while(Y1 != Y2) - T=locate(X1,Y1,Z) - if(IS_OPAQUE_TURF(T)) + current_turf = locate(X1, Y1, Z) + if(IS_OPAQUE_TURF(current_turf)) return FALSE - Y1+=s + Y1 += sign else - var/m=(32*(Y2-Y1)+(PY2-PY1))/(32*(X2-X1)+(PX2-PX1)) - var/b=(Y1+PY1/32-0.015625)-m*(X1+PX1/32-0.015625) //In tiles + //This looks scary but we're just calculating a linear function (y = mx + b) + + //m = y/x + var/m = (ICON_SIZE_Y*(Y2-Y1) + (PY2-PY1)) / (ICON_SIZE_X*(X2-X1) + (PX2-PX1))//In pixels + + //b = y - mx + var/b = (Y1 + PY1/ICON_SIZE_Y - OFFSET_Y) - m*(X1 + PX1/ICON_SIZE_X - OFFSET_X)//In tiles + var/signX = SIGN(X2-X1) var/signY = SIGN(Y2-Y1) - if(X1= mx+b + Y1 += signY //Line exits tile vertically else - X1+=signX //Line exits tile horizontally - T=locate(X1,Y1,Z) - if(IS_OPAQUE_TURF(T)) + X1 += signX //Line exits tile horizontally + current_turf = locate(X1, Y1, Z) + if(IS_OPAQUE_TURF(current_turf)) return FALSE return TRUE +#undef OFFSET_X +#undef OFFSET_Y /proc/is_in_sight(atom/first_atom, atom/second_atom) var/turf/first_turf = get_turf(first_atom) diff --git a/code/__HELPERS/turfs.dm b/code/__HELPERS/turfs.dm index c4867ba9993..c779c4b681b 100644 --- a/code/__HELPERS/turfs.dm +++ b/code/__HELPERS/turfs.dm @@ -237,9 +237,9 @@ Turf and target are separate in case you want to teleport some distance from a t var/list/icon_dimensions = get_icon_dimensions(checked_atom.icon) var/checked_atom_icon_height = icon_dimensions["height"] var/checked_atom_icon_width = icon_dimensions["width"] - if(checked_atom_icon_height != world.icon_size || checked_atom_icon_width != world.icon_size) - pixel_x_offset += ((checked_atom_icon_width / world.icon_size) - 1) * (world.icon_size * 0.5) - pixel_y_offset += ((checked_atom_icon_height / world.icon_size) - 1) * (world.icon_size * 0.5) + if(checked_atom_icon_height != ICON_SIZE_Y || checked_atom_icon_width != ICON_SIZE_X) + pixel_x_offset += ((checked_atom_icon_width / ICON_SIZE_X) - 1) * (ICON_SIZE_X * 0.5) + pixel_y_offset += ((checked_atom_icon_height / ICON_SIZE_Y) - 1) * (ICON_SIZE_Y * 0.5) return list(pixel_x_offset, pixel_y_offset) @@ -248,8 +248,8 @@ Turf and target are separate in case you want to teleport some distance from a t **/ /proc/pixel_offset_turf(turf/offset_from, list/offsets) //DY and DX - var/rough_x = round(round(offsets[1], world.icon_size) / world.icon_size) - var/rough_y = round(round(offsets[2], world.icon_size) / world.icon_size) + var/rough_x = round(round(offsets[1], ICON_SIZE_X) / ICON_SIZE_X) + var/rough_y = round(round(offsets[2], ICON_SIZE_Y) / ICON_SIZE_Y) var/final_x = clamp(offset_from.x + rough_x, 1, world.maxx) var/final_y = clamp(offset_from.y + rough_y, 1, world.maxy) @@ -275,8 +275,8 @@ Turf and target are separate in case you want to teleport some distance from a t click_turf_y = origin.y + text2num(click_turf_y[1]) - round(actual_view[2] / 2) - 1 var/turf/click_turf = locate(clamp(click_turf_x, 1, world.maxx), clamp(click_turf_y, 1, world.maxy), click_turf_z) - LAZYSET(modifiers, ICON_X, "[(click_turf_px - click_turf.pixel_x) + ((click_turf_x - click_turf.x) * world.icon_size)]") - LAZYSET(modifiers, ICON_Y, "[(click_turf_py - click_turf.pixel_y) + ((click_turf_y - click_turf.y) * world.icon_size)]") + LAZYSET(modifiers, ICON_X, "[(click_turf_px - click_turf.pixel_x) + ((click_turf_x - click_turf.x) * ICON_SIZE_X)]") + LAZYSET(modifiers, ICON_Y, "[(click_turf_py - click_turf.pixel_y) + ((click_turf_y - click_turf.y) * ICON_SIZE_Y)]") return click_turf ///Almost identical to the params_to_turf(), but unused (remove?) diff --git a/code/__HELPERS/view.dm b/code/__HELPERS/view.dm index 30e8bc8f9f9..139bdedc425 100644 --- a/code/__HELPERS/view.dm +++ b/code/__HELPERS/view.dm @@ -16,8 +16,8 @@ if(!view) return list(0, 0) var/list/view_info = getviewsize(view) - view_info[1] *= world.icon_size - view_info[2] *= world.icon_size + view_info[1] *= ICON_SIZE_X + view_info[2] *= ICON_SIZE_Y return view_info /** diff --git a/code/__byond_version_compat.dm b/code/__byond_version_compat.dm index 0f19332934d..6680e655551 100644 --- a/code/__byond_version_compat.dm +++ b/code/__byond_version_compat.dm @@ -9,6 +9,11 @@ #error You need version 515.1627 or higher #endif +// Unable to compile this version thanks to mutable appearance changes +#if (DM_VERSION == 515 && DM_BUILD == 1643) +#error This version of BYOND cannot compile this project. Visit www.byond.com/download/build to download an older version or update (if possible). +#endif + // Keep savefile compatibilty at minimum supported level /savefile/byond_version = MIN_COMPILER_VERSION diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index 9b3c53c4667..7f6735cb5d7 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -65,6 +65,7 @@ DEFINE_BITFIELD(area_flags, list( "VALID_TERRITORY" = VALID_TERRITORY, "XENOBIOLOGY_COMPATIBLE" = XENOBIOLOGY_COMPATIBLE, "NO_BOH" = NO_BOH, + "UNLIMITED_FISHING" = UNLIMITED_FISHING, )) DEFINE_BITFIELD(turf_flags, list( @@ -586,6 +587,13 @@ DEFINE_BITFIELD(gun_flags, list( "TURRET_INCOMPATIBLE" = TURRET_INCOMPATIBLE, )) +DEFINE_BITFIELD(fish_flags, list( + "FISH_FLAG_SHOW_IN_CATALOG" = FISH_FLAG_SHOW_IN_CATALOG, + "FISH_DO_FLOP_ANIM" = FISH_DO_FLOP_ANIM, + "FISH_FLAG_PETTED" = FISH_FLAG_PETTED, + "FISH_FLAG_EXPERIMENT_SCANNABLE" = FISH_FLAG_EXPERIMENT_SCANNABLE, +)) + DEFINE_BITFIELD(bot_mode_flags, list( "POWER_ON" = BOT_MODE_ON, "AUTO_PATROL" = BOT_MODE_AUTOPATROL, diff --git a/code/_globalvars/lists/achievements.dm b/code/_globalvars/lists/achievements.dm index 283931f9984..c788f070ad3 100644 --- a/code/_globalvars/lists/achievements.dm +++ b/code/_globalvars/lists/achievements.dm @@ -3,7 +3,7 @@ GLOBAL_LIST_EMPTY(commendations) GLOBAL_LIST_INIT(achievement_categories, list("Bosses", "Jobs", "Skills", "Misc", "Mafia", "Scores")) ///A list of sounds that can be played when unlocking an achievement, set in the preferences. GLOBAL_LIST_INIT(achievement_sounds, list( - CHEEVO_SOUND_PING = sound('sound/effects/glockenspiel_ping.ogg', volume = 70), - CHEEVO_SOUND_JINGLE = sound('sound/effects/beeps_jingle.ogg', volume = 70), - CHEEVO_SOUND_TADA = sound('sound/effects/tada_fanfare.ogg', volume = 30), + CHEEVO_SOUND_PING = sound('sound/effects/achievement/glockenspiel_ping.ogg', volume = 70), + CHEEVO_SOUND_JINGLE = sound('sound/effects/achievement/beeps_jingle.ogg', volume = 70), + CHEEVO_SOUND_TADA = sound('sound/effects/achievement/tada_fanfare.ogg', volume = 30), )) diff --git a/code/_globalvars/lists/ambience.dm b/code/_globalvars/lists/ambience.dm index 3a9ab81dde4..6cc984adf1c 100644 --- a/code/_globalvars/lists/ambience.dm +++ b/code/_globalvars/lists/ambience.dm @@ -1,170 +1,170 @@ /* SKYRAT EDIT REMOVAL BEGIN GLOBAL_LIST_INIT(generic_ambience,list( - 'sound/ambience/ambigen1.ogg', - 'sound/ambience/ambigen2.ogg', - 'sound/ambience/ambigen3.ogg', - 'sound/ambience/ambigen4.ogg', - 'sound/ambience/ambigen5.ogg', - 'sound/ambience/ambigen6.ogg', - 'sound/ambience/ambigen7.ogg', - 'sound/ambience/ambigen8.ogg', - 'sound/ambience/ambigen9.ogg', - 'sound/ambience/ambigen10.ogg', - 'sound/ambience/ambigen11.ogg', - 'sound/ambience/ambigen13.ogg', - 'sound/ambience/ambigen14.ogg', + 'sound/ambience/general/ambigen1.ogg', + 'sound/ambience/general/ambigen2.ogg', + 'sound/ambience/general/ambigen3.ogg', + 'sound/ambience/general/ambigen4.ogg', + 'sound/ambience/general/ambigen5.ogg', + 'sound/ambience/general/ambigen6.ogg', + 'sound/ambience/general/ambigen7.ogg', + 'sound/ambience/general/ambigen8.ogg', + 'sound/ambience/general/ambigen9.ogg', + 'sound/ambience/general/ambigen10.ogg', + 'sound/ambience/general/ambigen11.ogg', + 'sound/ambience/general/ambigen13.ogg', + 'sound/ambience/general/ambigen14.ogg', )) */ //SKYRAT EDIT REMOVAL END GLOBAL_LIST_INIT(holy_ambience,list( - 'sound/ambience/ambicha1.ogg', - 'sound/ambience/ambicha2.ogg', - 'sound/ambience/ambicha3.ogg', - 'sound/ambience/ambicha4.ogg', - 'sound/ambience/ambiholy.ogg', - 'sound/ambience/ambiholy2.ogg', - 'sound/ambience/ambiholy3.ogg', + 'sound/ambience/holy/ambicha1.ogg', + 'sound/ambience/holy/ambicha2.ogg', + 'sound/ambience/holy/ambicha3.ogg', + 'sound/ambience/holy/ambicha4.ogg', + 'sound/ambience/holy/ambiholy.ogg', + 'sound/ambience/holy/ambiholy2.ogg', + 'sound/ambience/holy/ambiholy3.ogg', )) GLOBAL_LIST_INIT(danger_ambience,list( - 'sound/ambience/ambidanger.ogg', - 'sound/ambience/ambidanger2.ogg', + 'sound/ambience/misc/ambidanger.ogg', + 'sound/ambience/misc/ambidanger2.ogg', )) GLOBAL_LIST_INIT(ruins_ambience,list( - 'sound/ambience/ambicave.ogg', - 'sound/ambience/ambidanger.ogg', - 'sound/ambience/ambidanger2.ogg', - 'sound/ambience/ambimaint1.ogg', - 'sound/ambience/ambimine.ogg', - 'sound/ambience/ambimystery.ogg', - 'sound/ambience/ambiruin.ogg', - 'sound/ambience/ambiruin2.ogg', - 'sound/ambience/ambiruin3.ogg', - 'sound/ambience/ambiruin4.ogg', - 'sound/ambience/ambiruin5.ogg', - 'sound/ambience/ambiruin6.ogg', - 'sound/ambience/ambiruin7.ogg', - 'sound/ambience/ambitech3.ogg', + 'sound/ambience/lavaland/ambicave.ogg', + 'sound/ambience/misc/ambidanger.ogg', + 'sound/ambience/misc/ambidanger2.ogg', + 'sound/ambience/maintenance/ambimaint1.ogg', + 'sound/ambience/ruin/ambimine.ogg', + 'sound/ambience/misc/ambimystery.ogg', + 'sound/ambience/ruin/ambiruin.ogg', + 'sound/ambience/ruin/ambiruin2.ogg', + 'sound/ambience/ruin/ambiruin3.ogg', + 'sound/ambience/ruin/ambiruin4.ogg', + 'sound/ambience/ruin/ambiruin5.ogg', + 'sound/ambience/ruin/ambiruin6.ogg', + 'sound/ambience/ruin/ambiruin7.ogg', + 'sound/ambience/engineering/ambitech3.ogg', )) GLOBAL_LIST_INIT(engi_ambience,list( - 'sound/ambience/ambiatmos.ogg', - 'sound/ambience/ambiatmos2.ogg', - 'sound/ambience/ambisin1.ogg', - 'sound/ambience/ambisin2.ogg', - 'sound/ambience/ambisin3.ogg', - 'sound/ambience/ambisin4.ogg', - 'sound/ambience/ambitech.ogg', - 'sound/ambience/ambitech2.ogg', - 'sound/ambience/ambitech3.ogg', + 'sound/ambience/engineering/ambiatmos.ogg', + 'sound/ambience/engineering/ambiatmos2.ogg', + 'sound/ambience/engineering/ambisin1.ogg', + 'sound/ambience/engineering/ambisin2.ogg', + 'sound/ambience/engineering/ambisin3.ogg', + 'sound/ambience/engineering/ambisin4.ogg', + 'sound/ambience/engineering/ambitech.ogg', + 'sound/ambience/engineering/ambitech2.ogg', + 'sound/ambience/engineering/ambitech3.ogg', )) GLOBAL_LIST_INIT(mining_ambience, list( - 'sound/ambience/ambicave.ogg', - 'sound/ambience/ambidanger.ogg', - 'sound/ambience/ambidanger2.ogg', - 'sound/ambience/ambilava1.ogg', - 'sound/ambience/ambilava2.ogg', - 'sound/ambience/ambilava3.ogg', - 'sound/ambience/ambimaint1.ogg', - 'sound/ambience/ambimine.ogg', - 'sound/ambience/ambiruin.ogg', - 'sound/ambience/ambiruin2.ogg', - 'sound/ambience/ambiruin3.ogg', - 'sound/ambience/ambiruin4.ogg', - 'sound/ambience/ambiruin5.ogg', - 'sound/ambience/ambiruin6.ogg', - 'sound/ambience/ambiruin7.ogg', + 'sound/ambience/lavaland/ambicave.ogg', + 'sound/ambience/misc/ambidanger.ogg', + 'sound/ambience/misc/ambidanger2.ogg', + 'sound/ambience/lavaland/ambilava1.ogg', + 'sound/ambience/lavaland/ambilava2.ogg', + 'sound/ambience/lavaland/ambilava3.ogg', + 'sound/ambience/maintenance/ambimaint1.ogg', + 'sound/ambience/ruin/ambimine.ogg', + 'sound/ambience/ruin/ambiruin.ogg', + 'sound/ambience/ruin/ambiruin2.ogg', + 'sound/ambience/ruin/ambiruin3.ogg', + 'sound/ambience/ruin/ambiruin4.ogg', + 'sound/ambience/ruin/ambiruin5.ogg', + 'sound/ambience/ruin/ambiruin6.ogg', + 'sound/ambience/ruin/ambiruin7.ogg', )) GLOBAL_LIST_INIT(icemoon_ambience,list( - 'sound/ambience/ambiicetheme.ogg', - 'sound/ambience/ambiicemelody1.ogg', - 'sound/ambience/ambiicemelody2.ogg', - 'sound/ambience/ambiicemelody3.ogg', - 'sound/ambience/ambiicemelody4.ogg', - 'sound/ambience/ambiicesting1.ogg', - 'sound/ambience/ambiicesting2.ogg', - 'sound/ambience/ambiicesting3.ogg', - 'sound/ambience/ambiicesting4.ogg', - 'sound/ambience/ambiicesting5.ogg', + 'sound/ambience/icemoon/ambiicetheme.ogg', + 'sound/ambience/icemoon/ambiicemelody1.ogg', + 'sound/ambience/icemoon/ambiicemelody2.ogg', + 'sound/ambience/icemoon/ambiicemelody3.ogg', + 'sound/ambience/icemoon/ambiicemelody4.ogg', + 'sound/ambience/icemoon/ambiicesting1.ogg', + 'sound/ambience/icemoon/ambiicesting2.ogg', + 'sound/ambience/icemoon/ambiicesting3.ogg', + 'sound/ambience/icemoon/ambiicesting4.ogg', + 'sound/ambience/icemoon/ambiicesting5.ogg', )) GLOBAL_LIST_INIT(medical_ambience,list( - 'sound/ambience/ambinice.ogg', + 'sound/ambience/medical/ambinice.ogg', )) GLOBAL_LIST_INIT(virology_ambience,list( - 'sound/ambience/ambiviro.ogg', - 'sound/ambience/ambiviro1.ogg', - 'sound/ambience/ambiviro2.ogg', + 'sound/ambience/medical/ambiviro.ogg', + 'sound/ambience/medical/ambiviro1.ogg', + 'sound/ambience/medical/ambiviro2.ogg', )) GLOBAL_LIST_INIT(spooky_ambience,list( - 'sound/ambience/ambimo1.ogg', - 'sound/ambience/ambimo2.ogg', - 'sound/ambience/ambimystery.ogg', - 'sound/ambience/ambiodd.ogg', - 'sound/ambience/ambiruin6.ogg', - 'sound/ambience/ambiruin7.ogg', + 'sound/ambience/medical/ambimo1.ogg', + 'sound/ambience/medical/ambimo2.ogg', + 'sound/ambience/misc/ambimystery.ogg', + 'sound/ambience/misc/ambiodd.ogg', + 'sound/ambience/ruin/ambiruin6.ogg', + 'sound/ambience/ruin/ambiruin7.ogg', )) GLOBAL_LIST_INIT(space_ambience,list( 'modular_skyrat/master_files/sound/ambience/starlight.ogg', //SKYRAT EDIT ADDITION - 'sound/ambience/ambiatmos.ogg', - 'sound/ambience/ambispace.ogg', - 'sound/ambience/ambispace2.ogg', - 'sound/ambience/ambispace3.ogg', - 'sound/ambience/ambispace4.ogg', - 'sound/ambience/ambispace5.ogg', - 'sound/ambience/ambispace6.ogg', - 'sound/ambience/title2.ogg', + 'sound/ambience/engineering/ambiatmos.ogg', + 'sound/ambience/space/ambispace.ogg', + 'sound/ambience/space/ambispace2.ogg', + 'sound/ambience/space/ambispace3.ogg', + 'sound/ambience/space/ambispace4.ogg', + 'sound/ambience/space/ambispace5.ogg', + 'sound/ambience/space/ambispace6.ogg', + 'sound/music/lobby_music/title2.ogg', )) GLOBAL_LIST_INIT(maint_ambience,list( - 'sound/ambience/ambimaint1.ogg', - 'sound/ambience/ambimaint2.ogg', - 'sound/ambience/ambimaint3.ogg', - 'sound/ambience/ambimaint4.ogg', - 'sound/ambience/ambimaint5.ogg', - 'sound/ambience/ambimaint6.ogg', - 'sound/ambience/ambimaint7.ogg', - 'sound/ambience/ambimaint8.ogg', - 'sound/ambience/ambimaint9.ogg', - 'sound/ambience/ambimaint10.ogg', - 'sound/ambience/ambimaint11.ogg', - 'sound/ambience/ambimaint12.ogg', - 'sound/ambience/ambitech2.ogg', - 'sound/voice/lowHiss1.ogg', - 'sound/voice/lowHiss2.ogg', - 'sound/voice/lowHiss3.ogg', - 'sound/voice/lowHiss4.ogg', - 'sound/ambience/maintambience.ogg', + 'sound/ambience/maintenance/ambimaint1.ogg', + 'sound/ambience/maintenance/ambimaint2.ogg', + 'sound/ambience/maintenance/ambimaint3.ogg', + 'sound/ambience/maintenance/ambimaint4.ogg', + 'sound/ambience/maintenance/ambimaint5.ogg', + 'sound/ambience/maintenance/ambimaint6.ogg', + 'sound/ambience/maintenance/ambimaint7.ogg', + 'sound/ambience/maintenance/ambimaint8.ogg', + 'sound/ambience/maintenance/ambimaint9.ogg', + 'sound/ambience/maintenance/ambimaint10.ogg', + 'sound/ambience/maintenance/ambimaint11.ogg', + 'sound/ambience/maintenance/ambimaint12.ogg', + 'sound/ambience/engineering/ambitech2.ogg', + 'sound/mobs/non-humanoids/hiss/lowHiss1.ogg', + 'sound/mobs/non-humanoids/hiss/lowHiss2.ogg', + 'sound/mobs/non-humanoids/hiss/lowHiss3.ogg', + 'sound/mobs/non-humanoids/hiss/lowHiss4.ogg', + 'sound/ambience/maintenance/maintambience.ogg', )) GLOBAL_LIST_INIT(away_ambience,list( - 'sound/ambience/ambiatmos.ogg', - 'sound/ambience/ambiatmos2.ogg', - 'sound/ambience/ambidanger.ogg', - 'sound/ambience/ambidanger2.ogg', - 'sound/ambience/ambimaint.ogg', - 'sound/ambience/ambiodd.ogg', - 'sound/ambience/ambiruin.ogg', - 'sound/ambience/ambiruin2.ogg', - 'sound/ambience/ambiruin3.ogg', - 'sound/ambience/ambiruin4.ogg', - 'sound/ambience/ambiruin5.ogg', - 'sound/ambience/ambiruin6.ogg', - 'sound/ambience/ambiruin7.ogg', - 'sound/ambience/ambitech.ogg', - 'sound/ambience/ambitech2.ogg', + 'sound/ambience/engineering/ambiatmos.ogg', + 'sound/ambience/engineering/ambiatmos2.ogg', + 'sound/ambience/misc/ambidanger.ogg', + 'sound/ambience/misc/ambidanger2.ogg', + 'sound/ambience/maintenance/ambimaint.ogg', + 'sound/ambience/misc/ambiodd.ogg', + 'sound/ambience/ruin/ambiruin.ogg', + 'sound/ambience/ruin/ambiruin2.ogg', + 'sound/ambience/ruin/ambiruin3.ogg', + 'sound/ambience/ruin/ambiruin4.ogg', + 'sound/ambience/ruin/ambiruin5.ogg', + 'sound/ambience/ruin/ambiruin6.ogg', + 'sound/ambience/ruin/ambiruin7.ogg', + 'sound/ambience/engineering/ambitech.ogg', + 'sound/ambience/engineering/ambitech2.ogg', )) GLOBAL_LIST_INIT(reebe_ambience,list( - 'sound/ambience/ambireebe1.ogg', - 'sound/ambience/ambireebe2.ogg', - 'sound/ambience/ambireebe3.ogg', + 'sound/ambience/misc/ambireebe1.ogg', + 'sound/ambience/misc/ambireebe2.ogg', + 'sound/ambience/misc/ambireebe3.ogg', )) GLOBAL_LIST_INIT(creepy_ambience,list( @@ -172,25 +172,25 @@ GLOBAL_LIST_INIT(creepy_ambience,list( 'sound/effects/ghost2.ogg', 'sound/effects/heart_beat.ogg', 'sound/effects/screech.ogg', - 'sound/hallucinations/behind_you1.ogg', - 'sound/hallucinations/behind_you2.ogg', - 'sound/hallucinations/far_noise.ogg', - 'sound/hallucinations/growl1.ogg', - 'sound/hallucinations/growl2.ogg', - 'sound/hallucinations/growl3.ogg', - 'sound/hallucinations/i_see_you1.ogg', - 'sound/hallucinations/i_see_you2.ogg', - 'sound/hallucinations/im_here1.ogg', - 'sound/hallucinations/im_here2.ogg', - 'sound/hallucinations/look_up1.ogg', - 'sound/hallucinations/look_up2.ogg', - 'sound/hallucinations/over_here1.ogg', - 'sound/hallucinations/over_here2.ogg', - 'sound/hallucinations/over_here3.ogg', - 'sound/hallucinations/turn_around1.ogg', - 'sound/hallucinations/turn_around2.ogg', - 'sound/hallucinations/veryfar_noise.ogg', - 'sound/hallucinations/wail.ogg', + 'sound/effects/hallucinations/behind_you1.ogg', + 'sound/effects/hallucinations/behind_you2.ogg', + 'sound/effects/hallucinations/far_noise.ogg', + 'sound/effects/hallucinations/growl1.ogg', + 'sound/effects/hallucinations/growl2.ogg', + 'sound/effects/hallucinations/growl3.ogg', + 'sound/effects/hallucinations/i_see_you1.ogg', + 'sound/effects/hallucinations/i_see_you2.ogg', + 'sound/effects/hallucinations/im_here1.ogg', + 'sound/effects/hallucinations/im_here2.ogg', + 'sound/effects/hallucinations/look_up1.ogg', + 'sound/effects/hallucinations/look_up2.ogg', + 'sound/effects/hallucinations/over_here1.ogg', + 'sound/effects/hallucinations/over_here2.ogg', + 'sound/effects/hallucinations/over_here3.ogg', + 'sound/effects/hallucinations/turn_around1.ogg', + 'sound/effects/hallucinations/turn_around2.ogg', + 'sound/effects/hallucinations/veryfar_noise.ogg', + 'sound/effects/hallucinations/wail.ogg', )) GLOBAL_LIST_INIT(ambience_assoc,list( diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index 03dd87ad456..eca55a94b41 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -134,22 +134,22 @@ GLOBAL_LIST_EMPTY(female_clothing_icons) GLOBAL_LIST_INIT(scarySounds, list( 'sound/effects/footstep/clownstep1.ogg', 'sound/effects/footstep/clownstep2.ogg', - 'sound/effects/glassbr1.ogg', - 'sound/effects/glassbr2.ogg', - 'sound/effects/glassbr3.ogg', - 'sound/items/welder.ogg', - 'sound/items/welder2.ogg', - 'sound/machines/airlock.ogg', - 'sound/voice/hiss1.ogg', - 'sound/voice/hiss2.ogg', - 'sound/voice/hiss3.ogg', - 'sound/voice/hiss4.ogg', - 'sound/voice/hiss5.ogg', - 'sound/voice/hiss6.ogg', - 'sound/weapons/armbomb.ogg', - 'sound/weapons/taser.ogg', - 'sound/weapons/thudswoosh.ogg', - 'sound/weapons/shove.ogg', + 'sound/effects/glass/glassbr1.ogg', + 'sound/effects/glass/glassbr2.ogg', + 'sound/effects/glass/glassbr3.ogg', + 'sound/items/tools/welder.ogg', + 'sound/items/tools/welder2.ogg', + 'sound/machines/airlock/airlock.ogg', + 'sound/mobs/non-humanoids/hiss/hiss1.ogg', + 'sound/mobs/non-humanoids/hiss/hiss2.ogg', + 'sound/mobs/non-humanoids/hiss/hiss3.ogg', + 'sound/mobs/non-humanoids/hiss/hiss4.ogg', + 'sound/mobs/non-humanoids/hiss/hiss5.ogg', + 'sound/mobs/non-humanoids/hiss/hiss6.ogg', + 'sound/items/weapons/armbomb.ogg', + 'sound/items/weapons/taser.ogg', + 'sound/items/weapons/thudswoosh.ogg', + 'sound/items/weapons/shove.ogg', )) diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index 8c3557d2e35..4b7dbf769be 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_CATCH_AND_RELEASE" = TRAIT_CATCH_AND_RELEASE, "TRAIT_COMMISSIONED" = TRAIT_COMMISSIONED, "TRAIT_CLIMBABLE" = TRAIT_CLIMBABLE, "TRAIT_CURRENTLY_CLEANING" = TRAIT_CURRENTLY_CLEANING, @@ -17,6 +18,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_DO_NOT_SPLASH" = TRAIT_DO_NOT_SPLASH, "TRAIT_DRIED" = TRAIT_DRIED, "TRAIT_DRYABLE" = TRAIT_DRYABLE, + "TRAIT_FISHING_SPOT" = TRAIT_FISHING_SPOT, "TRAIT_FOOD_CHEF_MADE" = TRAIT_FOOD_CHEF_MADE, "TRAIT_FOOD_FRIED" = TRAIT_FOOD_FRIED, "TRAIT_QUALITY_FOOD_INGREDIENT" = TRAIT_QUALITY_FOOD_INGREDIENT, @@ -29,6 +31,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_SPINNING" = TRAIT_SPINNING, "TRAIT_STICKERED" = TRAIT_STICKERED, "TRAIT_UNHITTABLE_BY_PROJECTILES" = TRAIT_UNHITTABLE_BY_PROJECTILES, + "TRAIT_UNLINKABLE_FISHING_SPOT" = TRAIT_UNLINKABLE_FISHING_SPOT, ), /atom/movable = list( "TRAIT_ACTIVE_STORAGE" = TRAIT_ACTIVE_STORAGE, @@ -37,6 +40,8 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_BLOCKING_EXPLOSIVES" = TRAIT_BLOCKING_EXPLOSIVES, "TRAIT_BOULDER_BREAKER" = TRAIT_BOULDER_BREAKER, "TRAIT_CASTABLE_LOC" = TRAIT_CASTABLE_LOC, + "TRAIT_CHASM_STOPPER" = TRAIT_CHASM_STOPPER, + "TRAIT_COMBAT_MODE_SKIP_INTERACTION" = TRAIT_COMBAT_MODE_SKIP_INTERACTION, "TRAIT_DEL_ON_SPACE_DUMP" = TRAIT_DEL_ON_SPACE_DUMP, "TRAIT_FISH_CASE_COMPATIBILE" = TRAIT_FISH_CASE_COMPATIBILE, "TRAIT_FROZEN" = TRAIT_FROZEN, @@ -50,28 +55,26 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_MOVE_FLYING" = TRAIT_MOVE_FLYING, "TRAIT_MOVE_GROUND" = TRAIT_MOVE_GROUND, "TRAIT_MOVE_PHASING" = TRAIT_MOVE_PHASING, - "TRAIT_MOVE_VENTCRAWLING" = TRAIT_MOVE_VENTCRAWLING, "TRAIT_MOVE_UPSIDE_DOWN" = TRAIT_MOVE_UPSIDE_DOWN, + "TRAIT_MOVE_VENTCRAWLING" = TRAIT_MOVE_VENTCRAWLING, + "TRAIT_NOT_ENGRAVABLE" = TRAIT_NOT_ENGRAVABLE, "TRAIT_NO_FLOATING_ANIM" = TRAIT_NO_FLOATING_ANIM, "TRAIT_NO_MANIFEST_CONTENTS_ERROR" = TRAIT_NO_MANIFEST_CONTENTS_ERROR, "TRAIT_NO_MISSING_ITEM_ERROR" = TRAIT_NO_MISSING_ITEM_ERROR, "TRAIT_NO_THROW_HITPUSH" = TRAIT_NO_THROW_HITPUSH, - "TRAIT_NOT_ENGRAVABLE" = TRAIT_NOT_ENGRAVABLE, - "TRAIT_SPELLS_TRANSFER_TO_LOC" = TRAIT_SPELLS_TRANSFER_TO_LOC, "TRAIT_ODD_CUSTOMIZABLE_FOOD_INGREDIENT" = TRAIT_ODD_CUSTOMIZABLE_FOOD_INGREDIENT, "TRAIT_ON_HIT_EFFECT" = TRAIT_ON_HIT_EFFECT, "TRAIT_RUNECHAT_HIDDEN" = TRAIT_RUNECHAT_HIDDEN, "TRAIT_SCARY_FISHERMAN" = TRAIT_SCARY_FISHERMAN, "TRAIT_SECLUDED_LOCATION" = TRAIT_SECLUDED_LOCATION, "TRAIT_SNOWSTORM_IMMUNE" = TRAIT_SNOWSTORM_IMMUNE, + "TRAIT_SPELLS_TRANSFER_TO_LOC" = TRAIT_SPELLS_TRANSFER_TO_LOC, "TRAIT_TELEKINESIS_CONTROLLED" = TRAIT_TELEKINESIS_CONTROLLED, "TRAIT_UNDERFLOOR" = TRAIT_UNDERFLOOR, "TRAIT_UNIQUE_IMMERSE" = TRAIT_UNIQUE_IMMERSE, - "TRAIT_VOIDSTORM_IMMUNE" = TRAIT_VOIDSTORM_IMMUNE, - "TRAIT_WAS_RENAMED" = TRAIT_WAS_RENAMED, "TRAIT_WADDLING" = TRAIT_WADDLING, + "TRAIT_WAS_RENAMED" = TRAIT_WAS_RENAMED, "TRAIT_WEATHER_IMMUNE" = TRAIT_WEATHER_IMMUNE, - "TRAIT_CHASM_STOPPER" = TRAIT_CHASM_STOPPER, ), /datum/controller/subsystem/economy = list( "TRAIT_MARKET_CRASHING" = TRAIT_MARKET_CRASHING, @@ -128,7 +131,6 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_ABDUCTOR_TRAINING" = TRAIT_ABDUCTOR_TRAINING, "TRAIT_ACT_AS_CULTIST" = TRAIT_ACT_AS_CULTIST, "TRAIT_ACT_AS_HERETIC" = TRAIT_ACT_AS_HERETIC, - "TRAIT_ACTIVELY_FISHING" = TRAIT_ACTIVELY_FISHING, "TRAIT_ADAMANTINE_EXTRACT_ARMOR" = TRAIT_ADAMANTINE_EXTRACT_ARMOR, "TRAIT_ADVANCEDTOOLUSER" = TRAIT_ADVANCEDTOOLUSER, "TRAIT_AGENDER" = TRAIT_AGENDER, @@ -243,6 +245,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_FEARLESS" = TRAIT_FEARLESS, "TRAIT_FENCE_CLIMBER" = TRAIT_FENCE_CLIMBER, "TRAIT_FINGERPRINT_PASSTHROUGH" = TRAIT_FINGERPRINT_PASSTHROUGH, + "TRAIT_FISH_EATER" = TRAIT_FISH_EATER, "TRAIT_FIST_MINING" = TRAIT_FIST_MINING, "TRAIT_FIXED_MUTANT_COLORS" = TRAIT_FIXED_MUTANT_COLORS, "TRAIT_FLESH_DESIRE" = TRAIT_FLESH_DESIRE, @@ -263,7 +266,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_GARLIC_REAGENT" = TRAIT_GARLIC_REAGENT, "TRAIT_GENELESS" = TRAIT_GENELESS, "TRAIT_GIANT" = TRAIT_GIANT, - "TRAIT_GONE_FISHING" = TRAIT_GONE_FISHING, + "TRAIT_GODMODE" = TRAIT_GODMODE, "TRAIT_GOOD_HEARING" = TRAIT_GOOD_HEARING, "TRAIT_GRABWEAKNESS" = TRAIT_GRABWEAKNESS, "TRAIT_GREENTEXT_CURSED" = TRAIT_GREENTEXT_CURSED, @@ -288,6 +291,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_HOT_SPRING_CURSED" = TRAIT_HOT_SPRING_CURSED, "TRAIT_HULK" = TRAIT_HULK, "TRAIT_HUSK" = TRAIT_HUSK, + "TRAIT_HYPOTHERMIC" = TRAIT_HYPOTHERMIC, "TRAIT_ID_APPRAISER" = TRAIT_ID_APPRAISER, "TRAIT_IGNORE_ELEVATION" = TRAIT_IGNORE_ELEVATION, "TRAIT_IGNORESLOWDOWN" = TRAIT_IGNORESLOWDOWN, @@ -529,6 +533,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_USER_SCOPED" = TRAIT_USER_SCOPED, "TRAIT_USES_SKINTONES" = TRAIT_USES_SKINTONES, "TRAIT_VATGROWN" = TRAIT_VATGROWN, + "TRAIT_VEGETARIAN" = TRAIT_VEGETARIAN, "TRAIT_VENTCRAWLER_ALWAYS" = TRAIT_VENTCRAWLER_ALWAYS, "TRAIT_VENTCRAWLER_NUDE" = TRAIT_VENTCRAWLER_NUDE, "TRAIT_VIRUSIMMUNE" = TRAIT_VIRUSIMMUNE, @@ -546,8 +551,10 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_XENO_IMMUNE" = TRAIT_XENO_IMMUNE, "TRAIT_XRAY_HEARING" = TRAIT_XRAY_HEARING, "TRAIT_XRAY_VISION" = TRAIT_XRAY_VISION, + "TRAIT_NOGRAV_ALWAYS_DRIFT" = TRAIT_NOGRAV_ALWAYS_DRIFT, "TRAIT_SPEECH_BOOSTER" = TRAIT_SPEECH_BOOSTER, "TRAIT_MINING_PARRYING" = TRAIT_MINING_PARRYING, + "TRAIT_ILLUSORY_EFFECT" = TRAIT_ILLUSORY_EFFECT, ), /obj/item = list( "TRAIT_APC_SHOCKING" = TRAIT_APC_SHOCKING, @@ -562,6 +569,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_CUSTOM_TAP_SOUND" = TRAIT_CUSTOM_TAP_SOUND, "TRAIT_DANGEROUS_OBJECT" = TRAIT_DANGEROUS_OBJECT, "TRAIT_FISHING_BAIT" = TRAIT_FISHING_BAIT, + "TRAIT_FOOD_BBQ_GRILLED" = TRAIT_FOOD_BBQ_GRILLED, "TRAIT_GERM_SENSITIVE" = TRAIT_GERM_SENSITIVE, "TRAIT_GOOD_QUALITY_BAIT" = TRAIT_GOOD_QUALITY_BAIT, "TRAIT_GREAT_QUALITY_BAIT" = TRAIT_GREAT_QUALITY_BAIT, @@ -582,6 +590,8 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_T_RAY_VISIBLE" = TRAIT_T_RAY_VISIBLE, "TRAIT_TRANSFORM_ACTIVE" = TRAIT_TRANSFORM_ACTIVE, "TRAIT_UNCATCHABLE" = TRAIT_UNCATCHABLE, + "TRAIT_UNCOMPOSTABLE" = TRAIT_UNCOMPOSTABLE, + "TRAIT_UNIQUE_AQUARIUM_CONTENT" = TRAIT_UNIQUE_AQUARIUM_CONTENT, "TRAIT_WIELDED" = TRAIT_WIELDED, "TRAIT_TORPOR" = TRAIT_TORPOR, // BUBBER EDIT ), @@ -625,8 +635,10 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_FISH_SHOULD_TWOHANDED" = TRAIT_FISH_SHOULD_TWOHANDED, "TRAIT_FISH_STASIS" = TRAIT_FISH_STASIS, "TRAIT_FISH_STINGER" = TRAIT_FISH_STINGER, + "TRAIT_FISH_SURVIVE_COOKING" = TRAIT_FISH_SURVIVE_COOKING, "TRAIT_FISH_TOXIN_IMMUNE" = TRAIT_FISH_TOXIN_IMMUNE, "TRAIT_RESIST_EMULSIFY" = TRAIT_RESIST_EMULSIFY, + "TRAIT_FISH_WELL_COOKED" = TRAIT_FISH_WELL_COOKED, "TRAIT_YUCKY_FISH" = TRAIT_YUCKY_FISH, ), /obj/item/fishing_rod = list( @@ -679,7 +691,6 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_CONTAINMENT_FIELD" = TRAIT_CONTAINMENT_FIELD, "TRAIT_ELEVATED_TURF" = TRAIT_ELEVATED_TURF, "TRAIT_FIREDOOR_STOP" = TRAIT_FIREDOOR_STOP, - "TRAIT_FISHING_SPOT" = TRAIT_FISHING_SPOT, "TRAIT_HYPERSPACE_STOPPED" = TRAIT_HYPERSPACE_STOPPED, "TRAIT_IMMERSE_STOPPED" = TRAIT_IMMERSE_STOPPED, "TRAIT_LAVA_STOPPED" = TRAIT_LAVA_STOPPED, diff --git a/code/_globalvars/traits/admin_tooling.dm b/code/_globalvars/traits/admin_tooling.dm index 995d66a5242..7e6e0dbf7e6 100644 --- a/code/_globalvars/traits/admin_tooling.dm +++ b/code/_globalvars/traits/admin_tooling.dm @@ -4,8 +4,9 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( /atom = list( - "TRAIT_UNHITTABLE_BY_PROJECTILES" = TRAIT_UNHITTABLE_BY_PROJECTILES, + "TRAIT_CATCH_AND_RELEASE" = TRAIT_CATCH_AND_RELEASE, "TRAIT_KEEP_TOGETHER" = TRAIT_KEEP_TOGETHER, + "TRAIT_UNHITTABLE_BY_PROJECTILES" = TRAIT_UNHITTABLE_BY_PROJECTILES, ), /atom/movable = list( "TRAIT_ASHSTORM_IMMUNE" = TRAIT_ASHSTORM_IMMUNE, @@ -20,7 +21,6 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_RUNECHAT_HIDDEN" = TRAIT_RUNECHAT_HIDDEN, "TRAIT_SCARY_FISHERMAN" = TRAIT_SCARY_FISHERMAN, "TRAIT_SNOWSTORM_IMMUNE" = TRAIT_SNOWSTORM_IMMUNE, - "TRAIT_VOIDSTORM_IMMUNE" = TRAIT_VOIDSTORM_IMMUNE, "TRAIT_WEATHER_IMMUNE" = TRAIT_WEATHER_IMMUNE, ), /mob = list( @@ -102,6 +102,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_FAT" = TRAIT_FAT, "TRAIT_FEARLESS" = TRAIT_FEARLESS, "TRAIT_FENCE_CLIMBER" = TRAIT_FENCE_CLIMBER, + "TRAIT_FISH_EATER" = TRAIT_FISH_EATER, "TRAIT_FIST_MINING" = TRAIT_FIST_MINING, "TRAIT_FIXED_MUTANT_COLORS" = TRAIT_FIXED_MUTANT_COLORS, "TRAIT_FLESH_DESIRE" = TRAIT_FLESH_DESIRE, @@ -118,6 +119,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_GARLIC_BREATH" = TRAIT_GARLIC_BREATH, "TRAIT_GENELESS" = TRAIT_GENELESS, "TRAIT_GIANT" = TRAIT_GIANT, + "TRAIT_GODMODE" = TRAIT_GODMODE, "TRAIT_GOOD_HEARING" = TRAIT_GOOD_HEARING, "TRAIT_GRABWEAKNESS" = TRAIT_GRABWEAKNESS, "TRAIT_GREENTEXT_CURSED" = TRAIT_GREENTEXT_CURSED, @@ -301,6 +303,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_UNSTABLE" = TRAIT_UNSTABLE, "TRAIT_USED_DNA_VAULT" = TRAIT_USED_DNA_VAULT, "TRAIT_USES_SKINTONES" = TRAIT_USES_SKINTONES, + "TRAIT_VEGETARIAN" = TRAIT_VEGETARIAN, "TRAIT_VENTCRAWLER_ALWAYS" = TRAIT_VENTCRAWLER_ALWAYS, "TRAIT_VENTCRAWLER_NUDE" = TRAIT_VENTCRAWLER_NUDE, "TRAIT_VIRUSIMMUNE" = TRAIT_VIRUSIMMUNE, @@ -348,6 +351,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_FISH_SHOULD_TWOHANDED" = TRAIT_FISH_SHOULD_TWOHANDED, "TRAIT_FISH_STASIS" = TRAIT_FISH_STASIS, "TRAIT_FISH_STINGER" = TRAIT_FISH_STINGER, + "TRAIT_FISH_SURVIVE_COOKING" = TRAIT_FISH_SURVIVE_COOKING, "TRAIT_FISH_TOXIN_IMMUNE" = TRAIT_FISH_TOXIN_IMMUNE, "TRAIT_RESIST_EMULSIFY" = TRAIT_RESIST_EMULSIFY, "TRAIT_YUCKY_FISH" = TRAIT_YUCKY_FISH, diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 6696d985d0b..ff9a1fc54eb 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -247,8 +247,7 @@ return TRUE /proc/CheckToolReach(atom/movable/here, atom/movable/there, reach) - . = FALSE - if(QDELETED(here) || QDELETED(there)) + if(!here || !there) return switch(reach) if(0) @@ -259,18 +258,14 @@ var/obj/dummy = new(get_turf(here)) dummy.pass_flags |= PASSTABLE dummy.SetInvisibility(INVISIBILITY_ABSTRACT) - var/list/steps = get_steps_to(dummy, there) - if(isnull(steps) || length(steps) > reach) // If the path is further than the reach, no way we can reach it anyways. - qdel(dummy) - return FALSE - for(var/direction in steps) - var/turf/next_step = get_step(dummy, direction) + for(var/i in 1 to reach) //Limit it to that many tries + var/turf/T = get_step(dummy, get_dir(dummy, there)) if(dummy.CanReach(there)) qdel(dummy) return TRUE - if(!dummy.Move(next_step)) // We're blocked, nope. + if(!dummy.Move(T)) //we're blocked! qdel(dummy) - return FALSE + return qdel(dummy) /// Default behavior: ignore double clicks (the second click that makes the doubleclick call already calls for a normal click) @@ -405,15 +400,15 @@ mouse_opacity = MOUSE_OPACITY_OPAQUE screen_loc = "CENTER" -#define MAX_SAFE_BYOND_ICON_SCALE_TILES (MAX_SAFE_BYOND_ICON_SCALE_PX / world.icon_size) -#define MAX_SAFE_BYOND_ICON_SCALE_PX (33 * 32) //Not using world.icon_size on purpose. +#define MAX_SAFE_BYOND_ICON_SCALE_TILES (MAX_SAFE_BYOND_ICON_SCALE_PX / ICON_SIZE_ALL) +#define MAX_SAFE_BYOND_ICON_SCALE_PX (33 * 32) //Not using world.icon_size on purpose. //Ok well I trust you /atom/movable/screen/click_catcher/proc/UpdateGreed(view_size_x = 15, view_size_y = 15) var/icon/newicon = icon('icons/hud/screen_gen.dmi', "catcher") var/ox = min(MAX_SAFE_BYOND_ICON_SCALE_TILES, view_size_x) var/oy = min(MAX_SAFE_BYOND_ICON_SCALE_TILES, view_size_y) - var/px = view_size_x * world.icon_size - var/py = view_size_y * world.icon_size + var/px = view_size_x * ICON_SIZE_X + var/py = view_size_y * ICON_SIZE_Y var/sx = min(MAX_SAFE_BYOND_ICON_SCALE_PX, px) var/sy = min(MAX_SAFE_BYOND_ICON_SCALE_PX, py) newicon.Scale(sx, sy) diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index d477195a603..5e4ee1e849d 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -435,7 +435,7 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." if(!QDELETED(rube) && !QDELETED(offerer)) offerer.visible_message(span_danger("[offerer] pulls away from [rube]'s slap at the last second, dodging the high-five entirely!"), span_nicegreen("[rube] fails to make contact with your hand, making an utter fool of [rube.p_them()]self!"), span_hear("You hear a disappointing sound of flesh not hitting flesh!"), ignored_mobs=rube) to_chat(rube, span_userdanger("[uppertext("NO! [offerer] PULLS [offerer.p_their()] HAND AWAY FROM YOURS! YOU'RE TOO SLOW!")]")) - playsound(offerer, 'sound/weapons/thudswoosh.ogg', 100, TRUE, 1) + playsound(offerer, 'sound/items/weapons/thudswoosh.ogg', 100, TRUE, 1) rube.Knockdown(1 SECONDS) offerer.add_mood_event("high_five", /datum/mood_event/down_low) rube.add_mood_event("high_five", /datum/mood_event/too_slow) diff --git a/code/_onclick/hud/alien.dm b/code/_onclick/hud/alien.dm index 476140acb1e..b9a0e3bf655 100644 --- a/code/_onclick/hud/alien.dm +++ b/code/_onclick/hud/alien.dm @@ -59,14 +59,15 @@ H.leap_icon.screen_loc = ui_alien_storage_r static_inventory += H.leap_icon + floor_change = new /atom/movable/screen/floor_changer(null, src) + floor_change.icon = ui_style + floor_change.screen_loc = ui_above_intent + static_inventory += floor_change + using = new/atom/movable/screen/language_menu(null, src) 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/alien_larva.dm b/code/_onclick/hud/alien_larva.dm index 77d135ce2c6..bb2b9fcb14a 100644 --- a/code/_onclick/hud/alien_larva.dm +++ b/code/_onclick/hud/alien_larva.dm @@ -10,6 +10,11 @@ action_intent.screen_loc = ui_combat_toggle static_inventory += action_intent + floor_change = new /atom/movable/screen/floor_changer(null, src) + floor_change.icon = ui_style + floor_change.screen_loc = ui_above_intent + static_inventory += floor_change + healths = new /atom/movable/screen/healths/alien(null, src) infodisplay += healths @@ -32,10 +37,6 @@ 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/credits.dm b/code/_onclick/hud/credits.dm index 8cce372ce83..24104bace28 100644 --- a/code/_onclick/hud/credits.dm +++ b/code/_onclick/hud/credits.dm @@ -1,6 +1,6 @@ /* #define CREDIT_ROLL_SPEED 125 // BUBBER EDIT #define CREDIT_SPAWN_SPEED 10 -#define CREDIT_ANIMATE_HEIGHT (14 * world.icon_size) +#define CREDIT_ANIMATE_HEIGHT (14 * ICON_SIZE_Y) #define CREDIT_EASE_DURATION 22 #define CREDITS_PATH "[global.config.directory]/contributors.dmi" @@ -45,9 +45,9 @@ parent = P icon_state = credited maptext = MAPTEXT_PIXELLARI(credited) - maptext_x = world.icon_size + 8 - maptext_y = (world.icon_size / 2) - 4 - maptext_width = world.icon_size * 3 + maptext_x = ICON_SIZE_X + 8 + maptext_y = (ICON_SIZE_Y / 2) - 4 + maptext_width = ICON_SIZE_X * 3 var/matrix/M = matrix(transform) M.Translate(0, CREDIT_ANIMATE_HEIGHT) animate(src, transform = M, time = CREDIT_ROLL_SPEED) diff --git a/code/_onclick/hud/generic_dextrous.dm b/code/_onclick/hud/generic_dextrous.dm index aac5a2b75cc..4048fd91b16 100644 --- a/code/_onclick/hud/generic_dextrous.dm +++ b/code/_onclick/hud/generic_dextrous.dm @@ -33,6 +33,10 @@ action_intent.screen_loc = ui_combat_toggle static_inventory += action_intent + floor_change = new /atom/movable/screen/floor_changer(null, src) + floor_change.icon = 'icons/hud/screen_midnight.dmi' + static_inventory += floor_change + zone_select = new /atom/movable/screen/zone_sel(null, src) zone_select.icon = ui_style diff --git a/code/_onclick/hud/ghost.dm b/code/_onclick/hud/ghost.dm index e20c1ede2f6..9f90076a3ac 100644 --- a/code/_onclick/hud/ghost.dm +++ b/code/_onclick/hud/ghost.dm @@ -91,10 +91,10 @@ 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 + floor_change = new /atom/movable/screen/floor_changer/vertical(null, src) + floor_change.icon = ui_style + floor_change.screen_loc = ui_ghost_floor_changer + static_inventory += floor_change /datum/hud/ghost/show_hud(version = 0, mob/viewmob) // don't show this HUD if observing; show the HUD of the observee diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 0f368a3bc4f..e5780c0f590 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -65,6 +65,7 @@ GLOBAL_LIST_INIT(available_erp_ui_styles, list( var/atom/movable/screen/rest_icon var/atom/movable/screen/throw_icon var/atom/movable/screen/module_store_icon + var/atom/movable/screen/floor_change var/list/static_inventory = list() //the screen objects which are static var/list/toggleable_inventory = list() //the screen objects which can be hidden @@ -254,6 +255,7 @@ GLOBAL_LIST_INIT(available_erp_ui_styles, list( zone_select = null pull_icon = null rest_icon = null + floor_change = null hand_slots.Cut() QDEL_LIST(toggleable_inventory) @@ -449,6 +451,11 @@ GLOBAL_LIST_INIT(available_erp_ui_styles, list( return update_robot_modules_display() +/datum/hud/new_player/show_hud(version = 0, mob/viewmob) + . = ..() + if(.) + show_station_trait_buttons() + /datum/hud/proc/hidden_inventory_update() return @@ -571,7 +578,7 @@ GLOBAL_LIST_INIT(available_erp_ui_styles, list( if(!our_client) position_action(button, button.linked_action.default_button_position) return - button.screen_loc = get_valid_screen_location(relative_to.screen_loc, world.icon_size, our_client.view_size.getView()) // Asks for a location adjacent to our button that won't overflow the map + button.screen_loc = get_valid_screen_location(relative_to.screen_loc, ICON_SIZE_ALL, our_client.view_size.getView()) // Asks for a location adjacent to our button that won't overflow the map button.location = relative_to.location @@ -735,14 +742,14 @@ GLOBAL_LIST_INIT(available_erp_ui_styles, list( // We're primarially concerned about width here, if someone makes us 1x2000 I wish them a swift and watery death var/furthest_screen_loc = ButtonNumberToScreenCoords(column_max - 1) var/list/offsets = screen_loc_to_offset(furthest_screen_loc, owner_view) - if(offsets[1] > world.icon_size && offsets[1] < view_size[1] && offsets[2] > world.icon_size && offsets[2] < view_size[2]) // We're all good + if(offsets[1] > ICON_SIZE_X && offsets[1] < view_size[1] && offsets[2] > ICON_SIZE_Y && offsets[2] < view_size[2]) // We're all good return for(column_max in column_max - 1 to 1 step -1) // Yes I could do this by unwrapping ButtonNumberToScreenCoords, but I don't feel like it var/tested_screen_loc = ButtonNumberToScreenCoords(column_max) offsets = screen_loc_to_offset(tested_screen_loc, owner_view) // We've found a valid max length, pack it in - if(offsets[1] > world.icon_size && offsets[1] < view_size[1] && offsets[2] > world.icon_size && offsets[2] < view_size[2]) + if(offsets[1] > ICON_SIZE_X && offsets[1] < view_size[1] && offsets[2] > ICON_SIZE_Y && offsets[2] < view_size[2]) break // Use our newly resized column max refresh_actions() diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index 2d7e06289a6..cf3153bf8f0 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -70,15 +70,16 @@ 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 static_inventory += action_intent + floor_change = new /atom/movable/screen/floor_changer(null, src) + floor_change.icon = ui_style + floor_change.screen_loc = ui_human_floor_changer + static_inventory += floor_change + using = new /atom/movable/screen/mov_intent(null, src) using.icon = ui_style diff --git a/code/_onclick/hud/living.dm b/code/_onclick/hud/living.dm index 70084b1ecd9..d70d2f7d55d 100644 --- a/code/_onclick/hud/living.dm +++ b/code/_onclick/hud/living.dm @@ -15,6 +15,10 @@ action_intent.screen_loc = ui_combat_toggle static_inventory += action_intent + floor_change = new /atom/movable/screen/floor_changer(null, src) + floor_change.icon = 'icons/hud/screen_midnight.dmi' + static_inventory += floor_change + combo_display = new /atom/movable/screen/combo(null, src) infodisplay += combo_display diff --git a/code/_onclick/hud/map_popups.dm b/code/_onclick/hud/map_popups.dm index f0277d187ff..bf524b6c8d9 100644 --- a/code/_onclick/hud/map_popups.dm +++ b/code/_onclick/hud/map_popups.dm @@ -105,8 +105,8 @@ if(!popup_name) return clear_map("[popup_name]_map") - var/x_value = world.icon_size * tilesize * width - var/y_value = world.icon_size * tilesize * height + var/x_value = ICON_SIZE_X * tilesize * width + var/y_value = ICON_SIZE_Y * tilesize * height var/map_name = create_popup(popup_name, title, x_value, y_value) var/atom/movable/screen/background/background = new diff --git a/code/_onclick/hud/movable_screen_objects.dm b/code/_onclick/hud/movable_screen_objects.dm index 2910a9f0cc8..cac1be97ae6 100644 --- a/code/_onclick/hud/movable_screen_objects.dm +++ b/code/_onclick/hud/movable_screen_objects.dm @@ -37,8 +37,8 @@ var/client/our_client = usr.client var/list/offset = screen_loc_to_offset(LAZYACCESS(modifiers, SCREEN_LOC)) if(snap2grid) //Discard Pixel Values - offset[1] = FLOOR(offset[1], world.icon_size) // drops any pixel offset - offset[2] = FLOOR(offset[2], world.icon_size) // drops any pixel offset + offset[1] = FLOOR(offset[1], ICON_SIZE_X) // drops any pixel offset + offset[2] = FLOOR(offset[2], ICON_SIZE_Y) // drops any pixel offset else //Normalise Pixel Values (So the object drops at the center of the mouse, not 16 pixels off) offset[1] += x_off offset[2] += y_off diff --git a/code/_onclick/hud/new_player.dm b/code/_onclick/hud/new_player.dm index e909870eb00..e4569881fe4 100644 --- a/code/_onclick/hud/new_player.dm +++ b/code/_onclick/hud/new_player.dm @@ -7,6 +7,7 @@ /datum/hud/new_player ///Whether the menu is currently on the client's screen or not var/menu_hud_status = TRUE + var/list/shown_station_trait_buttons /datum/hud/new_player/New(mob/owner) . = ..() @@ -27,31 +28,58 @@ if (!lobbyscreen.always_shown) lobbyscreen.RegisterSignal(src, COMSIG_HUD_LOBBY_COLLAPSED, TYPE_PROC_REF(/atom/movable/screen/lobby, collapse_button)) lobbyscreen.RegisterSignal(src, COMSIG_HUD_LOBBY_EXPANDED, TYPE_PROC_REF(/atom/movable/screen/lobby, expand_button)) - if (istype(lobbyscreen, /atom/movable/screen/lobby/button)) - var/atom/movable/screen/lobby/button/lobby_button = lobbyscreen - lobby_button.owner = REF(owner) - add_station_trait_buttons() -/// Display buttons for relevant station traits -/datum/hud/new_player/proc/add_station_trait_buttons() +/// Load and then display the buttons for relevant station traits +/datum/hud/new_player/proc/show_station_trait_buttons() if (!mymob?.client || mymob.client.interviewee || !length(GLOB.lobby_station_traits)) return - var/buttons_created = 0 - var/y_offset = 397 - var/y_button_offset = 27 for (var/datum/station_trait/trait as anything in GLOB.lobby_station_traits) - if (!trait.can_display_lobby_button(mymob.client)) + if (QDELETED(trait) || !trait.can_display_lobby_button(mymob.client)) + remove_station_trait_button(trait) + continue + if(LAZYACCESS(shown_station_trait_buttons, trait)) continue var/atom/movable/screen/lobby/button/sign_up/sign_up_button = new(our_hud = src) - sign_up_button.SlowInit() - sign_up_button.owner = REF(mymob) - sign_up_button.screen_loc = offset_to_screen_loc(233, y_offset, mymob.client.view) - y_offset += y_button_offset - static_inventory += sign_up_button trait.setup_lobby_button(sign_up_button) - buttons_created++ - if (buttons_created >= MAX_STATION_TRAIT_BUTTONS_VERTICAL) - return + static_inventory |= sign_up_button + LAZYSET(shown_station_trait_buttons, trait, sign_up_button) + RegisterSignal(trait, COMSIG_QDELETING, PROC_REF(remove_station_trait_button)) + + place_station_trait_buttons() + +/// Display the buttosn for relevant station traits. +/datum/hud/new_player/proc/place_station_trait_buttons() + if(hud_version != HUD_STYLE_STANDARD || !mymob?.client) + return + + var/y_offset = 397 + var/x_offset = 233 + var/y_button_offset = 27 + var/x_button_offset = -27 + var/iteration = 0 + for(var/trait in shown_station_trait_buttons) + var/atom/movable/screen/lobby/button/sign_up/sign_up_button = shown_station_trait_buttons[trait] + iteration++ + sign_up_button.screen_loc = offset_to_screen_loc(x_offset, y_offset, mymob.client.view) + mymob.client.screen |= sign_up_button + if (iteration >= MAX_STATION_TRAIT_BUTTONS_VERTICAL) + iteration = 0 + y_offset = 397 + x_offset += x_button_offset + else + y_offset += y_button_offset + +/// Remove a station trait button, then re-order the rest. +/datum/hud/new_player/proc/remove_station_trait_button(datum/station_trait/trait) + SIGNAL_HANDLER + var/atom/movable/screen/lobby/button/sign_up/button = LAZYACCESS(shown_station_trait_buttons, trait) + if(!button) + return + LAZYREMOVE(shown_station_trait_buttons, trait) + UnregisterSignal(trait, COMSIG_QDELETING) + static_inventory -= button + qdel(button) + place_station_trait_buttons() /atom/movable/screen/lobby plane = SPLASHSCREEN_PLANE @@ -95,11 +123,9 @@ var/enabled = TRUE ///Is the button currently being hovered over with the mouse? var/highlighted = FALSE - /// The ref of the mob that owns this button. Only the owner can click on it. - var/owner /atom/movable/screen/lobby/button/Click(location, control, params) - if(owner != REF(usr)) + if(usr != get_mob()) return if(!usr.client || usr.client.interviewee) @@ -114,7 +140,7 @@ return TRUE /atom/movable/screen/lobby/button/MouseEntered(location,control,params) - if(owner != REF(usr)) + if(usr != get_mob()) return if(!usr.client || usr.client.interviewee) @@ -125,7 +151,7 @@ update_appearance(UPDATE_ICON) /atom/movable/screen/lobby/button/MouseExited() - if(owner != REF(usr)) + if(usr != get_mob()) return if(!usr.client || usr.client.interviewee) diff --git a/code/_onclick/hud/parallax/parallax.dm b/code/_onclick/hud/parallax/parallax.dm index 135c3f0caef..ee266cd21e3 100755 --- a/code/_onclick/hud/parallax/parallax.dm +++ b/code/_onclick/hud/parallax/parallax.dm @@ -191,7 +191,7 @@ if(!offset_x && !offset_y && !force) return - var/glide_rate = round(world.icon_size / screenmob.glide_size * world.tick_lag, world.tick_lag) + var/glide_rate = round(ICON_SIZE_ALL / screenmob.glide_size * world.tick_lag, world.tick_lag) C.previous_turf = posobj var/largest_change = max(abs(offset_x), abs(offset_y)) @@ -297,8 +297,8 @@ INITIALIZE_IMMEDIATE(/atom/movable/screen/parallax_layer) /atom/movable/screen/parallax_layer/proc/update_o(view) if (!view) view = world.view - - var/static/parallax_scaler = world.icon_size / 480 + var/static/pixel_grid_size = ICON_SIZE_ALL * 15 + var/static/parallax_scaler = ICON_SIZE_ALL / pixel_grid_size // Turn the view size into a grid of correctly scaled overlays var/list/viewscales = getviewsize(view) @@ -311,8 +311,8 @@ INITIALIZE_IMMEDIATE(/atom/movable/screen/parallax_layer) if(x == 0 && y == 0) continue var/mutable_appearance/texture_overlay = mutable_appearance(icon, icon_state) - texture_overlay.pixel_w += 480 * x - texture_overlay.pixel_z += 480 * y + texture_overlay.pixel_w += pixel_grid_size * x + texture_overlay.pixel_z += pixel_grid_size * y new_overlays += texture_overlay cut_overlays() add_overlay(new_overlays) diff --git a/code/_onclick/hud/picture_in_picture.dm b/code/_onclick/hud/picture_in_picture.dm index b6ac49446fc..f2cf8f4b210 100644 --- a/code/_onclick/hud/picture_in_picture.dm +++ b/code/_onclick/hud/picture_in_picture.dm @@ -56,7 +56,7 @@ move_tab.icon_state = "move" move_tab.plane = HUD_PLANE var/matrix/M = matrix() - M.Translate(0, (height + 0.25) * world.icon_size) + M.Translate(0, (height + 0.25) * ICON_SIZE_Y) move_tab.transform = M add_overlay(move_tab) @@ -69,7 +69,7 @@ MA.plane = HUD_PLANE button_x.appearance = MA M = matrix() - M.Translate((max(4, width) - 0.75) * world.icon_size, (height + 0.25) * world.icon_size) + M.Translate((max(4, width) - 0.75) * ICON_SIZE_X, (height + 0.25) * ICON_SIZE_Y) button_x.transform = M vis_contents += button_x @@ -82,7 +82,7 @@ MA.plane = HUD_PLANE button_expand.appearance = MA M = matrix() - M.Translate(world.icon_size, (height + 0.25) * world.icon_size) + M.Translate(ICON_SIZE_X, (height + 0.25) * ICON_SIZE_Y) button_expand.transform = M vis_contents += button_expand @@ -95,7 +95,7 @@ MA.plane = HUD_PLANE button_shrink.appearance = MA M = matrix() - M.Translate(2 * world.icon_size, (height + 0.25) * world.icon_size) + M.Translate(2 * ICON_SIZE_X, (height + 0.25) * ICON_SIZE_Y) button_shrink.transform = M vis_contents += button_shrink @@ -103,7 +103,7 @@ if((width > 0) && (height > 0)) var/matrix/M = matrix() M.Scale(width + 0.5, height + 0.5) - M.Translate((width-1)/2 * world.icon_size, (height-1)/2 * world.icon_size) + M.Translate((width-1)/2 * ICON_SIZE_X, (height-1)/2 * ICON_SIZE_Y) standard_background.transform = M add_overlay(standard_background) @@ -115,7 +115,7 @@ src.width = width src.height = height - y_off = -height * world.icon_size - 16 + y_off = (-height * ICON_SIZE_Y) - (ICON_SIZE_Y / 2) cut_overlays() add_background() diff --git a/code/_onclick/hud/radial.dm b/code/_onclick/hud/radial.dm index 6ee994cf79c..24d31e2b967 100644 --- a/code/_onclick/hud/radial.dm +++ b/code/_onclick/hud/radial.dm @@ -390,8 +390,8 @@ GLOBAL_LIST_EMPTY(radial_menus) if (user_space) var/turf/user_turf = get_turf(user) var/turf/anchor_turf = get_turf(anchor) - offset_x = (anchor_turf.x - user_turf.x) * world.icon_size + anchor.pixel_x - user.pixel_x - offset_y = (anchor_turf.y - user_turf.y) * world.icon_size + anchor.pixel_y - user.pixel_y + offset_x = (anchor_turf.x - user_turf.x) * ICON_SIZE_X + anchor.pixel_x - user.pixel_x + offset_y = (anchor_turf.y - user_turf.y) * ICON_SIZE_Y + anchor.pixel_y - user.pixel_y menu.show_to(user, offset_x, offset_y) menu.wait(user, anchor, require_near) var/answer = menu.selected_choice diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm index b6ca3a1889f..5e165f1cc70 100644 --- a/code/_onclick/hud/robot.dm +++ b/code/_onclick/hud/robot.dm @@ -87,11 +87,6 @@ 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 @@ -149,6 +144,11 @@ action_intent.screen_loc = ui_combat_toggle static_inventory += action_intent + floor_change = new /atom/movable/screen/floor_changer(null, src) + floor_change.icon = ui_style + floor_change.screen_loc = ui_borg_floor_changer + static_inventory += floor_change + //Health healths = new /atom/movable/screen/healths/robot(null, src) infodisplay += healths diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index cd61303f78a..df330c0070b 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -160,33 +160,6 @@ /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 @@ -380,6 +353,34 @@ icon = 'icons/hud/screen_cyborg.dmi' screen_loc = ui_borg_intents +/atom/movable/screen/floor_changer + name = "change floor" + icon = 'icons/hud/screen_midnight.dmi' + icon_state = "floor_change" + screen_loc = ui_floor_changer + var/vertical = FALSE + +/atom/movable/screen/floor_changer/Click(location,control,params) + var/list/modifiers = params2list(params) + + var/mouse_position + + if(vertical) + mouse_position = text2num(LAZYACCESS(modifiers, ICON_Y)) + else + mouse_position = text2num(LAZYACCESS(modifiers, ICON_X)) + + if(mouse_position > 16) + usr.up() + return + + usr.down() + return + +/atom/movable/screen/floor_changer/vertical + icon_state = "floor_change_v" + vertical = TRUE + /atom/movable/screen/spacesuit name = "Space suit cell status" icon_state = "spacesuit_0" diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 90d5d499b5e..d0c6af5bba5 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -214,7 +214,7 @@ return FALSE if(!force && !HAS_TRAIT(src, TRAIT_CUSTOM_TAP_SOUND)) - playsound(src, 'sound/weapons/tap.ogg', get_clamped_volume(), TRUE, -1) + playsound(src, 'sound/items/weapons/tap.ogg', get_clamped_volume(), TRUE, -1) else if(hitsound) playsound(src, hitsound, get_clamped_volume(), TRUE, extrarange = stealthy_audio ? SILENCED_SOUND_EXTRARANGE : -1, falloff_distance = 0) diff --git a/code/controllers/configuration/entries/general.dm b/code/controllers/configuration/entries/general.dm index 2ed157019db..7a373cbdb60 100644 --- a/code/controllers/configuration/entries/general.dm +++ b/code/controllers/configuration/entries/general.dm @@ -316,13 +316,13 @@ /datum/config_entry/string/banappeals /datum/config_entry/string/wikiurl - default = "https://wiki.skyrat13.space/index.php" //SKYRAT EDIT - Original: "http://www.tgstation13.org/wiki" + default = "http://tgstation13.org/wiki" /datum/config_entry/string/forumurl default = "http://tgstation13.org/phpBB/index.php" /datum/config_entry/string/rulesurl - default = "http://www.tgstation13.org/wiki/Rules" + default = "http://tgstation13.org/wiki/Rules" /datum/config_entry/string/githuburl default = "https://www.github.com/tgstation/tgstation" @@ -741,3 +741,27 @@ /datum/config_entry/number/upload_limit_admin default = 5242880 min_val = 0 + +/// The minimum number of tallies a map vote entry can have. +/datum/config_entry/number/map_vote_minimum_tallies + default = 1 + min_val = 0 + max_val = 50 + +/// The flat amount all maps get by default +/datum/config_entry/number/map_vote_flat_bonus + default = 5 + min_val = 0 + max_val = INFINITY + +/// The maximum number of tallies a map vote entry can have. +/datum/config_entry/number/map_vote_maximum_tallies + default = 200 + min_val = 0 + max_val = INFINITY + +/// The number of tallies that are carried over between rounds. +/datum/config_entry/number/map_vote_tally_carryover_percentage + default = 100 + min_val = 0 + max_val = 100 diff --git a/code/controllers/subsystem/air.dm b/code/controllers/subsystem/air.dm index 4557e153db1..bbc21becc0f 100644 --- a/code/controllers/subsystem/air.dm +++ b/code/controllers/subsystem/air.dm @@ -488,29 +488,26 @@ SUBSYSTEM_DEF(air) T.excited = FALSE ///Adds a turf to active processing, handles duplicates. Call this with blockchanges == TRUE if you want to nuke the assoc excited group -/datum/controller/subsystem/air/proc/add_to_active(turf/open/T, blockchanges = FALSE) - if(istype(T) && T.air) - T.significant_share_ticker = 0 - if(blockchanges && T.excited_group) //This is used almost exclusivly for shuttles, so the excited group doesn't stay behind - T.excited_group.garbage_collect() //Nuke it - if(T.excited) //Don't keep doing it if there's no point +/datum/controller/subsystem/air/proc/add_to_active(turf/open/activate, blockchanges = FALSE) + if(istype(activate) && activate.air) + activate.significant_share_ticker = 0 + if(blockchanges && activate.excited_group) //This is used almost exclusivly for shuttles, so the excited group doesn't stay behind + activate.excited_group.garbage_collect() //Nuke it + if(activate.excited) //Don't keep doing it if there's no point return #ifdef VISUALIZE_ACTIVE_TURFS - T.add_atom_colour(COLOR_VIBRANT_LIME, TEMPORARY_COLOUR_PRIORITY) + activate.add_atom_colour(COLOR_VIBRANT_LIME, TEMPORARY_COLOUR_PRIORITY) #endif - T.excited = TRUE - active_turfs += T - if(currentpart == SSAIR_ACTIVETURFS) - currentrun += T - else if(T.flags_1 & INITIALIZED_1) - for(var/turf/S in T.atmos_adjacent_turfs) - add_to_active(S, TRUE) + activate.excited = TRUE + active_turfs += activate + else if(activate.flags_1 & INITIALIZED_1) + for(var/turf/neighbor as anything in activate.atmos_adjacent_turfs) + add_to_active(neighbor, TRUE) else if(map_loading) if(queued_for_activation) - queued_for_activation[T] = T - return + queued_for_activation[activate] = activate else - T.requires_activation = TRUE + activate.requires_activation = TRUE /datum/controller/subsystem/air/StartLoadingMap() LAZYINITLIST(queued_for_activation) @@ -560,8 +557,8 @@ SUBSYSTEM_DEF(air) if(enemy_tile.current_cycle == -INFINITE) continue // .air instead of .return_air() because we can guarantee that the proc won't do anything - if(potential_diff.air.compare(enemy_tile.air)) - //testing("Active turf found. Return value of compare(): [T.air.compare(enemy_tile.air)]") + if(potential_diff.air.compare(enemy_tile.air, MOLES)) + //testing("Active turf found. Return value of compare(): [T.air.compare(enemy_tile.air, MOLES)]") if(!potential_diff.excited) potential_diff.excited = TRUE SSair.active_turfs += potential_diff diff --git a/code/controllers/subsystem/ambience.dm b/code/controllers/subsystem/ambience.dm index 7258b0b16e9..87f088a41ea 100644 --- a/code/controllers/subsystem/ambience.dm +++ b/code/controllers/subsystem/ambience.dm @@ -70,16 +70,16 @@ SUBSYSTEM_DEF(ambience) ///A list of rare sound effects to fuck with players. No, it does not contain actual minecraft sounds anymore. var/static/list/minecraft_cave_noises = list( - 'sound/machines/airlock.ogg', + 'sound/machines/airlock/airlock.ogg', 'sound/effects/snap.ogg', 'sound/effects/footstep/clownstep1.ogg', 'sound/effects/footstep/clownstep2.ogg', - 'sound/items/welder.ogg', - 'sound/items/welder2.ogg', - 'sound/items/crowbar.ogg', + 'sound/items/tools/welder.ogg', + 'sound/items/tools/welder2.ogg', + 'sound/items/tools/crowbar.ogg', 'sound/items/deconstruct.ogg', - 'sound/ambience/source_holehit3.ogg', - 'sound/ambience/cavesound3.ogg', + 'sound/ambience/misc/source_holehit3.ogg', + 'sound/ambience//misc/cavesound3.ogg', ) /area/station/maintenance/play_ambience(mob/M, sound/override_sound, volume) diff --git a/code/controllers/subsystem/bitrunning.dm b/code/controllers/subsystem/bitrunning.dm index 78afb101945..63c2561f0f4 100644 --- a/code/controllers/subsystem/bitrunning.dm +++ b/code/controllers/subsystem/bitrunning.dm @@ -25,7 +25,7 @@ SUBSYSTEM_DEF(bitrunning) var/can_view_reward = domain.difficulty < (scanner_tier + 1) && domain.cost <= points + 3 UNTYPED_LIST_ADD(levels, list( - "announce_ghosts"= domain.announce_to_ghosts, + "announce_ghosts" = domain.announce_to_ghosts, "cost" = domain.cost, "desc" = can_view ? domain.desc : "Limited scanning capabilities. Cannot infer domain details.", "difficulty" = domain.difficulty, diff --git a/code/controllers/subsystem/blackbox.dm b/code/controllers/subsystem/blackbox.dm index 0ffc0b5bdda..bdd6ae72c47 100644 --- a/code/controllers/subsystem/blackbox.dm +++ b/code/controllers/subsystem/blackbox.dm @@ -368,7 +368,7 @@ Versioning "z_coord" = L.z, "last_words" = L.last_words, "suicide" = did_they_suicide, - "map" = SSmapping.config.map_name, + "map" = SSmapping.current_map.map_name, "server_name" = CONFIG_GET(string/serversqlname), // SKYRAT EDIT ADDITION - MULTISERVER "internet_address" = world.internet_address || "0", "port" = "[world.port]", diff --git a/code/controllers/subsystem/dynamic/dynamic.dm b/code/controllers/subsystem/dynamic/dynamic.dm index 6f7e26bf7e6..feafd6e43ec 100644 --- a/code/controllers/subsystem/dynamic/dynamic.dm +++ b/code/controllers/subsystem/dynamic/dynamic.dm @@ -526,7 +526,7 @@ SUBSYSTEM_DEF(dynamic) //To new_player and such, and we want the datums to just free when the roundstart work is done var/list/roundstart_rules = init_rulesets(/datum/dynamic_ruleset/roundstart) - SSjob.DivideOccupations(pure = TRUE, allow_all = TRUE) + SSjob.divide_occupations(pure = TRUE, allow_all = TRUE) for(var/i in GLOB.new_player_list) var/mob/dead/new_player/player = i if(player.ready == PLAYER_READY_TO_PLAY && player.mind && player.check_preferences()) @@ -541,7 +541,7 @@ SUBSYSTEM_DEF(dynamic) else roundstart_pop_ready++ candidates.Add(player) - SSjob.ResetOccupations() + SSjob.reset_occupations() log_dynamic("Listing [roundstart_rules.len] round start rulesets, and [candidates.len] players ready.") if (candidates.len <= 0) log_dynamic("[candidates.len] candidates.") @@ -1033,7 +1033,7 @@ SUBSYSTEM_DEF(dynamic) var/list/reopened_jobs = list() for(var/mob/living/quitter in GLOB.suicided_mob_list) - var/datum/job/job = SSjob.GetJob(quitter.job) + var/datum/job/job = SSjob.get_job(quitter.job) if(!job || !(job.job_flags & JOB_REOPEN_ON_ROUNDSTART_LOSS)) continue if(!include_command && job.departments_bitflags & DEPARTMENT_BITFLAG_COMMAND) diff --git a/code/controllers/subsystem/dynamic/dynamic_rulesets.dm b/code/controllers/subsystem/dynamic/dynamic_rulesets.dm index 8460307009e..17939cf426a 100644 --- a/code/controllers/subsystem/dynamic/dynamic_rulesets.dm +++ b/code/controllers/subsystem/dynamic/dynamic_rulesets.dm @@ -293,7 +293,7 @@ if(length(exclusive_roles)) var/exclusive_candidate = FALSE for(var/role in exclusive_roles) - var/datum/job/job = SSjob.GetJob(role) + var/datum/job/job = SSjob.get_job(role) if((role in candidate_client.prefs.job_preferences) && SSjob.check_job_eligibility(candidate_player, job, "Dynamic Roundstart TC", add_job_to_log = TRUE) == JOB_AVAILABLE) exclusive_candidate = TRUE diff --git a/code/controllers/subsystem/dynamic/dynamic_rulesets_midround.dm b/code/controllers/subsystem/dynamic/dynamic_rulesets_midround.dm index fb7b7db9bb9..69154815ebc 100644 --- a/code/controllers/subsystem/dynamic/dynamic_rulesets_midround.dm +++ b/code/controllers/subsystem/dynamic/dynamic_rulesets_midround.dm @@ -421,7 +421,7 @@ return ..() /datum/dynamic_ruleset/midround/from_ghosts/nuclear/finish_setup(mob/new_character, index) - new_character.mind.set_assigned_role(SSjob.GetJobType(/datum/job/nuclear_operative)) + new_character.mind.set_assigned_role(SSjob.get_job_type(/datum/job/nuclear_operative)) new_character.mind.special_role = ROLE_NUCLEAR_OPERATIVE if(index == 1) var/datum/antagonist/nukeop/leader/leader_antag_datum = new() @@ -580,12 +580,12 @@ var/mob/living/carbon/human/new_nightmare = new (find_maintenance_spawn(atmos_sensitive = TRUE, require_darkness = TRUE)) player_mind.transfer_to(new_nightmare) - player_mind.set_assigned_role(SSjob.GetJobType(/datum/job/nightmare)) + player_mind.set_assigned_role(SSjob.get_job_type(/datum/job/nightmare)) player_mind.special_role = ROLE_NIGHTMARE player_mind.add_antag_datum(/datum/antagonist/nightmare) new_nightmare.set_species(/datum/species/shadow/nightmare) - playsound(new_nightmare, 'sound/magic/ethereal_exit.ogg', 50, TRUE, -1) + playsound(new_nightmare, 'sound/effects/magic/ethereal_exit.ogg', 50, TRUE, -1) message_admins("[ADMIN_LOOKUPFLW(new_nightmare)] has been made into a Nightmare by the midround ruleset.") log_dynamic("[key_name(new_nightmare)] was spawned as a Nightmare by the midround ruleset.") return new_nightmare @@ -626,7 +626,7 @@ player_mind.transfer_to(S) player_mind.add_antag_datum(/datum/antagonist/space_dragon) - playsound(S, 'sound/magic/ethereal_exit.ogg', 50, TRUE, -1) + playsound(S, 'sound/effects/magic/ethereal_exit.ogg', 50, TRUE, -1) message_admins("[ADMIN_LOOKUPFLW(S)] has been made into a Space Dragon by the midround ruleset.") log_dynamic("[key_name(S)] was spawned as a Space Dragon by the midround ruleset.") priority_announce("A large organic energy flux has been recorded near of [station_name()], please stand-by.", "Lifesign Alert") @@ -938,7 +938,7 @@ new_datum.original_ref = WEAKREF(clone_victim.mind) new_datum.setup_clone() - playsound(clone, 'sound/weapons/zapbang.ogg', 30, TRUE) + playsound(clone, 'sound/items/weapons/zapbang.ogg', 30, TRUE) new /obj/item/storage/toolbox/mechanical(clone.loc) //so they dont get stuck in maints message_admins("[ADMIN_LOOKUPFLW(clone)] has been made into a Paradox Clone by the midround ruleset.") @@ -999,11 +999,11 @@ var/mob/living/carbon/human/voidwalker = new (space_turf) player_mind.transfer_to(voidwalker) - player_mind.set_assigned_role(SSjob.GetJobType(/datum/job/voidwalker)) + player_mind.set_assigned_role(SSjob.get_job_type(/datum/job/voidwalker)) player_mind.special_role = antag_flag player_mind.add_antag_datum(antag_datum) - playsound(voidwalker, 'sound/magic/ethereal_exit.ogg', 50, TRUE, -1) + playsound(voidwalker, 'sound/effects/magic/ethereal_exit.ogg', 50, TRUE, -1) message_admins("[ADMIN_LOOKUPFLW(voidwalker)] has been made into a Voidwalker by the midround ruleset.") log_dynamic("[key_name(voidwalker)] was spawned as a Voidwalker by the midround ruleset.") return voidwalker diff --git a/code/controllers/subsystem/dynamic/dynamic_rulesets_roundstart.dm b/code/controllers/subsystem/dynamic/dynamic_rulesets_roundstart.dm index 561719ed70e..1e540333573 100644 --- a/code/controllers/subsystem/dynamic/dynamic_rulesets_roundstart.dm +++ b/code/controllers/subsystem/dynamic/dynamic_rulesets_roundstart.dm @@ -63,7 +63,7 @@ GLOBAL_VAR_INIT(revolutionary_win, FALSE) flags = HIGH_IMPACT_RULESET /datum/dynamic_ruleset/roundstart/malf_ai/ready(forced) - var/datum/job/ai_job = SSjob.GetJobType(/datum/job/ai) + var/datum/job/ai_job = SSjob.get_job_type(/datum/job/ai) // If we're not forced, we're going to make sure we can actually have an AI in this shift, if(!forced && min(ai_job.total_positions - ai_job.current_positions, ai_job.spawn_positions) <= 0) @@ -75,7 +75,7 @@ GLOBAL_VAR_INIT(revolutionary_win, FALSE) /datum/dynamic_ruleset/roundstart/malf_ai/pre_execute(population) . = ..() - var/datum/job/ai_job = SSjob.GetJobType(/datum/job/ai) + var/datum/job/ai_job = SSjob.get_job_type(/datum/job/ai) // Maybe a bit too pedantic, but there should never be more malf AIs than there are available positions, spawn positions or antag cap allocations. var/num_malf = min(get_antag_cap(population), min(ai_job.total_positions - ai_job.current_positions, ai_job.spawn_positions)) for (var/i in 1 to num_malf) @@ -297,7 +297,7 @@ GLOBAL_VAR_INIT(revolutionary_win, FALSE) var/mob/M = pick_n_take(candidates) if (M) assigned += M.mind - M.mind.set_assigned_role(SSjob.GetJobType(/datum/job/space_wizard)) + M.mind.set_assigned_role(SSjob.get_job_type(/datum/job/space_wizard)) M.mind.special_role = ROLE_WIZARD return TRUE @@ -430,7 +430,7 @@ GLOBAL_VAR_INIT(revolutionary_win, FALSE) break var/mob/M = pick_n_take(candidates) assigned += M.mind - M.mind.set_assigned_role(SSjob.GetJobType(job_type)) + M.mind.set_assigned_role(SSjob.get_job_type(job_type)) M.mind.special_role = required_role return TRUE diff --git a/code/controllers/subsystem/explosions.dm b/code/controllers/subsystem/explosions.dm index 31de67361bf..8809e3772af 100644 --- a/code/controllers/subsystem/explosions.dm +++ b/code/controllers/subsystem/explosions.dm @@ -352,7 +352,7 @@ ADMIN_VERB(check_bomb_impacts, R_DEBUG, "Check Bomb Impact", "See what the effec who_did_it = "\[Projectile firer: [ADMIN_LOOKUPFLW(fired_projectile.firer)]\]" who_did_it_game_log = "\[Projectile firer: [key_name(fired_projectile.firer)]\]" else - who_did_it = "\[Projectile firer: [ADMIN_LOOKUPFLW(fired_projectile.firer.fingerprintslast)]\]" + who_did_it = "\[Projectile firer: [ADMIN_LOOKUPFLW(fired_projectile.firer?.fingerprintslast)]\]" who_did_it_game_log = "\[Projectile firer: [key_name(fired_projectile.firer.fingerprintslast)]\]" // Otherwise if the explosion cause is an atom, try get the fingerprints. else if(istype(explosion_cause)) @@ -526,7 +526,7 @@ ADMIN_VERB(check_bomb_impacts, R_DEBUG, "Check Bomb Impact", "See what the effec * - [creaking_sound][/sound]: The sound that plays when the station creaks during the explosion. * - [hull_creaking_sound][/sound]: The sound that plays when the station creaks after the explosion. */ -/datum/controller/subsystem/explosions/proc/shake_the_room(turf/epicenter, near_distance, far_distance, quake_factor, echo_factor, creaking, sound/near_sound = sound(get_sfx(SFX_EXPLOSION)), sound/far_sound = sound('sound/effects/explosionfar.ogg'), sound/echo_sound = sound('sound/effects/explosion_distant.ogg'), sound/creaking_sound = sound(get_sfx(SFX_EXPLOSION_CREAKING)), hull_creaking_sound = sound(get_sfx(SFX_HULL_CREAKING))) +/datum/controller/subsystem/explosions/proc/shake_the_room(turf/epicenter, near_distance, far_distance, quake_factor, echo_factor, creaking, sound/near_sound = sound(get_sfx(SFX_EXPLOSION)), sound/far_sound = sound('sound/effects/explosion/explosionfar.ogg'), sound/echo_sound = sound('sound/effects/explosion/explosion_distant.ogg'), sound/creaking_sound = sound(get_sfx(SFX_EXPLOSION_CREAKING)), hull_creaking_sound = sound(get_sfx(SFX_HULL_CREAKING))) var/frequency = get_rand_frequency() var/blast_z = epicenter.z if(isnull(creaking)) // Autoset creaking. diff --git a/code/controllers/subsystem/id_access.dm b/code/controllers/subsystem/id_access.dm index a9f32228a26..fdd0d3b68df 100644 --- a/code/controllers/subsystem/id_access.dm +++ b/code/controllers/subsystem/id_access.dm @@ -410,6 +410,12 @@ SUBSYSTEM_DEF(id_access) if(trim.assignment) id_card.assignment = trim.assignment + var/datum/job/trim_job = trim.find_job() + if (!isnull(id_card.registered_account)) + var/datum/job/old_job = id_card.registered_account.account_job + id_card.registered_account.account_job = trim_job + id_card.registered_account.update_account_job_lists(trim_job, old_job) + id_card.update_label() id_card.update_icon() diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm index 0d1152dbf63..0197ed2290b 100644 --- a/code/controllers/subsystem/job.dm +++ b/code/controllers/subsystem/job.dm @@ -22,7 +22,7 @@ SUBSYSTEM_DEF(job) var/list/unassigned = list() //Players who need jobs var/initial_players_to_assign = 0 //used for checking against population caps - // Whether to run DivideOccupations pure so that there are no side-effects from calling it other than + // Whether to run divide_occupations pure so that there are no side-effects from calling it other than // a player's assigned_role being set to some value. var/run_divide_occupation_pure = FALSE @@ -31,7 +31,7 @@ SUBSYSTEM_DEF(job) var/overflow_role = /datum/job/assistant - var/list/level_order = list(JP_HIGH,JP_MEDIUM,JP_LOW) + var/list/level_order = list(JP_HIGH, JP_MEDIUM, JP_LOW) /// Lazylist of mob:occupation_string pairs. var/list/dynamic_forced_occupations @@ -88,7 +88,7 @@ SUBSYSTEM_DEF(job) setup_job_lists() job_config_datum_singletons = generate_config_singletons() // we set this up here regardless in case someone wants to use the verb to generate the config file. if(!length(all_occupations)) - SetupOccupations() + setup_occupations() if(CONFIG_GET(flag/load_jobs_from_txt)) load_jobs_from_config() set_overflow_role(CONFIG_GET(string/overflow_job)) // this must always go after load_jobs_from_config() due to how the legacy systems operate, this always takes precedent. @@ -108,9 +108,9 @@ SUBSYSTEM_DEF(job) return overflow_jobs /datum/controller/subsystem/job/proc/set_overflow_role(new_overflow_role) - var/datum/job/new_overflow = ispath(new_overflow_role) ? GetJobType(new_overflow_role) : GetJob(new_overflow_role) + var/datum/job/new_overflow = ispath(new_overflow_role) ? get_job_type(new_overflow_role) : get_job(new_overflow_role) if(!new_overflow) - JobDebug("Failed to set new overflow role: [new_overflow_role]") + job_debug("SET_OVRFLW: Failed to set new overflow role: [new_overflow_role]") CRASH("set_overflow_role failed | new_overflow_role: [isnull(new_overflow_role) ? "null" : new_overflow_role]") var/cap = CONFIG_GET(number/overflow_cap) @@ -121,17 +121,16 @@ SUBSYSTEM_DEF(job) if(new_overflow.type == overflow_role) return - var/datum/job/old_overflow = GetJobType(overflow_role) + var/datum/job/old_overflow = get_job_type(overflow_role) old_overflow.allow_bureaucratic_error = initial(old_overflow.allow_bureaucratic_error) old_overflow.spawn_positions = initial(old_overflow.spawn_positions) old_overflow.total_positions = initial(old_overflow.total_positions) if(!(initial(old_overflow.job_flags) & JOB_CANNOT_OPEN_SLOTS)) old_overflow.job_flags &= ~JOB_CANNOT_OPEN_SLOTS overflow_role = new_overflow.type - JobDebug("Overflow role set to : [new_overflow.type]") + job_debug("SET_OVRFLW: Overflow role set to: [new_overflow.type]") - -/datum/controller/subsystem/job/proc/SetupOccupations() +/datum/controller/subsystem/job/proc/setup_occupations() name_occupations = list() type_occupations = list() @@ -205,20 +204,20 @@ SUBSYSTEM_DEF(job) return TRUE -/datum/controller/subsystem/job/proc/GetJob(rank) +/datum/controller/subsystem/job/proc/get_job(rank) if(!length(all_occupations)) - SetupOccupations() + setup_occupations() return name_occupations[rank] -/datum/controller/subsystem/job/proc/GetJobType(jobtype) +/datum/controller/subsystem/job/proc/get_job_type(jobtype) RETURN_TYPE(/datum/job) if(!length(all_occupations)) - SetupOccupations() + setup_occupations() return type_occupations[jobtype] /datum/controller/subsystem/job/proc/get_department_type(department_type) if(!length(all_occupations)) - SetupOccupations() + setup_occupations() return joinable_departments_by_type[department_type] /** @@ -230,68 +229,71 @@ SUBSYSTEM_DEF(job) * * latejoin - Set to TRUE if this is a latejoin role assignment. * * do_eligibility_checks - Set to TRUE to conduct all job eligibility tests and reject on failure. Set to FALSE if job eligibility has been tested elsewhere and they can be safely skipped. */ -/datum/controller/subsystem/job/proc/AssignRole(mob/dead/new_player/player, datum/job/job, latejoin = FALSE, do_eligibility_checks = TRUE) - JobDebug("Running AR, Player: [player], Job: [isnull(job) ? "null" : job], LateJoin: [latejoin]") +/datum/controller/subsystem/job/proc/assign_role(mob/dead/new_player/player, datum/job/job, latejoin = FALSE, do_eligibility_checks = TRUE) + job_debug("AR: Running, Player: [player], Job: [isnull(job) ? "null" : job], LateJoin: [latejoin]") if(!player?.mind || !job) - JobDebug("AR has failed, player has no mind or job is null, Player: [player], Rank: [isnull(job) ? "null" : job.type]") + job_debug("AR: Failed, player has no mind or job is null. Player: [player], Rank: [isnull(job) ? "null" : job.type]") return FALSE if(do_eligibility_checks && (check_job_eligibility(player, job, "AR", add_job_to_log = TRUE) != JOB_AVAILABLE)) return FALSE - JobDebug("Player: [player] is now Rank: [job.title], JCP:[job.current_positions], JPL:[latejoin ? job.total_positions : job.spawn_positions]") + job_debug("AR: Role now set and assigned - [player] is [job.title], JCP:[job.current_positions], JPL:[latejoin ? job.total_positions : job.spawn_positions]") player.mind.set_assigned_role(job) unassigned -= player job.current_positions++ return TRUE -/datum/controller/subsystem/job/proc/FindOccupationCandidates(datum/job/job, level) - JobDebug("Running FOC, Job: [job], Level: [job_priority_level_to_string(level)]") +/datum/controller/subsystem/job/proc/find_occupation_candidates(datum/job/job, level = 0) + job_debug("FOC: Now running, Job: [job], Level: [job_priority_level_to_string(level)]") var/list/candidates = list() for(var/mob/dead/new_player/player in unassigned) if(!player) - JobDebug("FOC player no longer exists.") + job_debug("FOC: Player no longer exists.") continue + if(!player.client) - JobDebug("FOC player client no longer exists, Player: [player]") + job_debug("FOC: Player client no longer exists, Player: [player]") continue + // Initial screening check. Does the player even have the job enabled, if they do - Is it at the correct priority level? var/player_job_level = player.client?.prefs.job_preferences[job.title] if(isnull(player_job_level)) - JobDebug("FOC player job not enabled, Player: [player]") - continue - else if(player_job_level != level) - JobDebug("FOC player job enabled at wrong level, Player: [player], TheirLevel: [job_priority_level_to_string(player_job_level)], ReqLevel: [job_priority_level_to_string(level)]") + job_debug("FOC: Player job not enabled, Player: [player]") continue - // This check handles its own output to JobDebug. + if(level && (player_job_level != level)) + job_debug("FOC: Player job enabled at wrong level, Player: [player], TheirLevel: [job_priority_level_to_string(player_job_level)], ReqLevel: [job_priority_level_to_string(level)]") + continue + + // This check handles its own output to job_debug. if(check_job_eligibility(player, job, "FOC", add_job_to_log = FALSE) != JOB_AVAILABLE) continue // They have the job enabled, at this priority level, with no restrictions applying to them. - JobDebug("FOC pass, Player: [player], Level: [job_priority_level_to_string(level)]") + job_debug("FOC: Player eligible, Player: [player], Level: [job_priority_level_to_string(level)]") candidates += player return candidates -/datum/controller/subsystem/job/proc/GiveRandomJob(mob/dead/new_player/player) - JobDebug("GRJ Giving random job, Player: [player]") +/datum/controller/subsystem/job/proc/give_random_job(mob/dead/new_player/player) + job_debug("GRJ: Giving random job, Player: [player]") . = FALSE for(var/datum/job/job as anything in shuffle(joinable_occupations)) if(QDELETED(player)) - JobDebug("GRJ player is deleted, aborting") + job_debug("GRJ: Player is deleted, aborting") break if((job.current_positions >= job.spawn_positions) && job.spawn_positions != -1) - JobDebug("GRJ job lacks spawn positions to be eligible, Player: [player], Job: [job]") + job_debug("GRJ: Job lacks spawn positions to be eligible, Player: [player], Job: [job]") continue - if(istype(job, GetJobType(overflow_role))) // We don't want to give him assistant, that's boring! - JobDebug("GRJ skipping overflow role, Player: [player], Job: [job]") + if(istype(job, get_job_type(overflow_role))) // We don't want to give him assistant, that's boring! + job_debug("GRJ: Skipping overflow role, Player: [player], Job: [job]") continue if(job.departments_bitflags & DEPARTMENT_BITFLAG_COMMAND) //If you want a command position, select it! - JobDebug("GRJ skipping command role, Player: [player], Job: [job]") + job_debug("GRJ: Skipping command role, Player: [player], Job: [job]") continue //SKYRAT EDIT ADDITION @@ -300,25 +302,25 @@ SUBSYSTEM_DEF(job) continue //SKYRAT EDIT END - // This check handles its own output to JobDebug. + // This check handles its own output to job_debug. if(check_job_eligibility(player, job, "GRJ", add_job_to_log = TRUE) != JOB_AVAILABLE) continue - if(AssignRole(player, job, do_eligibility_checks = FALSE)) - JobDebug("GRJ Random job given, Player: [player], Job: [job]") + if(assign_role(player, job, do_eligibility_checks = FALSE)) + job_debug("GRJ: Random job given, Player: [player], Job: [job]") return TRUE - JobDebug("GRJ Player eligible but AssignRole failed, Player: [player], Job: [job]") + job_debug("GRJ: Player eligible but assign_role failed, Player: [player], Job: [job]") -/datum/controller/subsystem/job/proc/ResetOccupations() - JobDebug("Occupations reset.") +/datum/controller/subsystem/job/proc/reset_occupations() + job_debug("RO: Occupations reset.") for(var/mob/dead/new_player/player as anything in GLOB.new_player_list) if(!player?.mind) continue - player.mind.set_assigned_role(GetJobType(/datum/job/unassigned)) + player.mind.set_assigned_role(get_job_type(/datum/job/unassigned)) player.mind.special_role = null - SetupOccupations() + setup_occupations() unassigned = list() if(CONFIG_GET(flag/load_jobs_from_txt)) // Any errors with the configs has already been said, we don't need to repeat them here. @@ -327,12 +329,11 @@ SUBSYSTEM_DEF(job) return -/** - * Will try to select a head, ignoring ALL non-head preferences for every level until. - * - * Basically tries to ensure there is at least one head in every shift if anyone has that job preference enabled at all. +/* + * Forces a random Head of Staff role to be assigned to a random eligible player. + * Returns TRUE if a player was selected and assigned the role. FALSE otherwise. */ -/datum/controller/subsystem/job/proc/FillHeadPosition() +/datum/controller/subsystem/job/proc/force_one_head_assignment() var/datum/job_department/command_department = get_department_type(/datum/job_department/command) if(!command_department) return FALSE @@ -340,60 +341,65 @@ SUBSYSTEM_DEF(job) for(var/datum/job/job as anything in command_department.department_jobs) if((job.current_positions >= job.total_positions) && job.total_positions != -1) continue - var/list/candidates = FindOccupationCandidates(job, level) + var/list/candidates = find_occupation_candidates(job, level) if(!candidates.len) continue var/mob/dead/new_player/candidate = pick(candidates) - // Eligibility checks done as part of FindOccupationCandidates. - if(AssignRole(candidate, job, do_eligibility_checks = FALSE)) + // Eligibility checks done as part of find_occupation_candidates. + if(assign_role(candidate, job, do_eligibility_checks = FALSE)) return TRUE return FALSE /** * Attempts to fill out all possible head positions for players with that job at a a given job priority level. + * Returns the number of Head positions assigned. * * Arguments: - * * level - One of the JP_LOW, JP_MEDIUM or JP_HIGH defines. Attempts to find candidates with head jobs at this priority only. + * * level - One of the JP_LOW, JP_MEDIUM, JP_HIGH or JP_ANY defines. Attempts to find candidates with head jobs at that priority only. */ -/datum/controller/subsystem/job/proc/CheckHeadPositions(level) +/datum/controller/subsystem/job/proc/fill_all_head_positions_at_priority(level) + . = 0 var/datum/job_department/command_department = get_department_type(/datum/job_department/command) + if(!command_department) - return + return . + for(var/datum/job/job as anything in command_department.department_jobs) if((job.current_positions >= job.total_positions) && job.total_positions != -1) continue - var/list/candidates = FindOccupationCandidates(job, level) + var/list/candidates = find_occupation_candidates(job, level) if(!candidates.len) continue var/mob/dead/new_player/candidate = pick(candidates) - // Eligibility checks done as part of FindOccupationCandidates - AssignRole(candidate, job, do_eligibility_checks = FALSE) + // Eligibility checks done as part of find_occupation_candidates + if(assign_role(candidate, job, do_eligibility_checks = FALSE)) + .++ /// Attempts to fill out all available AI positions. /datum/controller/subsystem/job/proc/fill_ai_positions() - var/datum/job/ai_job = GetJob(JOB_AI) + var/datum/job/ai_job = get_job(JOB_AI) if(!ai_job) return // In byond for(in to) loops, the iteration is inclusive so we need to stop at ai_job.total_positions - 1 for(var/i in ai_job.current_positions to ai_job.total_positions - 1) for(var/level in level_order) var/list/candidates = list() - candidates = FindOccupationCandidates(ai_job, level) + candidates = find_occupation_candidates(ai_job, level) if(candidates.len) var/mob/dead/new_player/candidate = pick(candidates) - // Eligibility checks done as part of FindOccupationCandidates - if(AssignRole(candidate, GetJobType(/datum/job/ai), do_eligibility_checks = FALSE)) + // Eligibility checks done as part of find_occupation_candidates + if(assign_role(candidate, get_job_type(/datum/job/ai), do_eligibility_checks = FALSE)) break -/** Proc DivideOccupations +/** Proc divide_occupations * fills var "assigned_role" for all ready players. * This proc must not have any side effect besides of modifying "assigned_role". **/ -/datum/controller/subsystem/job/proc/DivideOccupations(pure = FALSE, allow_all = FALSE) +/datum/controller/subsystem/job/proc/divide_occupations(pure = FALSE, allow_all = FALSE) //Setup new player list and get the jobs list - JobDebug("Running DO, allow_all = [allow_all], pure = [pure]") + job_debug("DO: Running, allow_all = [allow_all], pure = [pure]") run_divide_occupation_pure = pure SEND_SIGNAL(src, COMSIG_OCCUPATIONS_DIVIDED, pure, allow_all) @@ -403,167 +409,170 @@ SUBSYSTEM_DEF(job) if(player.ready == PLAYER_READY_TO_PLAY && player.check_preferences() && player.mind && is_unassigned_job(player.mind.assigned_role)) unassigned += player - initial_players_to_assign = unassigned.len + initial_players_to_assign = length(unassigned) - JobDebug("DO, Len: [unassigned.len]") + job_debug("DO: Player count to assign roles to: [initial_players_to_assign]") //Scale number of open security officer slots to population setup_officer_positions() //Jobs will have fewer access permissions if the number of players exceeds the threshold defined in game_options.txt - var/mat = CONFIG_GET(number/minimal_access_threshold) - if(mat) - if(mat > unassigned.len) + var/min_access_threshold = CONFIG_GET(number/minimal_access_threshold) + if(min_access_threshold) + if(min_access_threshold > initial_players_to_assign) CONFIG_SET(flag/jobs_have_minimal_access, FALSE) else CONFIG_SET(flag/jobs_have_minimal_access, TRUE) - //Shuffle players and jobs - unassigned = shuffle(unassigned) + //Shuffle player list. + shuffle_inplace(unassigned) - HandleFeedbackGathering() + handle_feedback_gathering() - // Dynamic has picked a ruleset that requires enforcing some jobs before others. - JobDebug("DO, Assigning Priority Positions: [length(dynamic_forced_occupations)]") + // Assign any priority positions before all other standard job selections. + job_debug("DO: Assigning priority positions") assign_priority_positions() + job_debug("DO: Priority assignment complete") - //People who wants to be the overflow role, sure, go on. - JobDebug("DO, Running Overflow Check 1") - var/datum/job/overflow_datum = GetJobType(overflow_role) - var/list/overflow_candidates = FindOccupationCandidates(overflow_datum, JP_LOW) - JobDebug("AC1, Candidates: [overflow_candidates.len]") - for(var/mob/dead/new_player/player in overflow_candidates) - JobDebug("AC1 pass, Player: [player]") - // Eligibility checks done as part of FindOccupationCandidates - AssignRole(player, GetJobType(overflow_role), do_eligibility_checks = FALSE) - overflow_candidates -= player - JobDebug("DO, AC1 end") + // The overflow role has limitless slots, plus having the Overflow box ticked in prefs should (with one exception) set the priority to JP_HIGH. + // So everyone with overflow enabled will get that job. Thus we can assign it immediately to all players that have it enabled. + job_debug("DO: Assigning early overflow roles") + assign_all_overflow_positions() + job_debug("DO: Early overflow roles assigned.") - //Select one head - JobDebug("DO, Running Head Check") - FillHeadPosition() - JobDebug("DO, Head Check end") + // At this point we can assume the following: + // From assign_priority_positions() + // 1. If possible, any necessary job roles to allow Dynamic rulesets to execute (such as an AI for malf AI) are satisfied. + // 2. All Head of Staff roles with any player pref set to JP_HIGH are filled out. + // 3. If any player not selected by the above has any Head of Staff preference enabled at any JP_ level, there is at least one Head of Staff. + // + // From assign_all_overflow_positions() + // 4. Anyone with the overflow role enabled has been given the overflow role. - // Fill out any remaining AI positions. - JobDebug("DO, Running AI Check") - fill_ai_positions() - JobDebug("DO, AI Check end") + // Shuffle the joinable occupation list and filter out ineligible occupations due to above job assignments. + var/list/available_occupations = joinable_occupations.Copy() + for(var/datum/job/job in available_occupations) + // Make sure the job isn't filled. If it is, remove it from the list so it doesn't get checked. + if((job.current_positions >= job.spawn_positions) && job.spawn_positions != -1) + job_debug("DO: Job is now filled, Job: [job], Current: [job.current_positions], Limit: [job.spawn_positions]") + available_occupations -= job - //Other jobs are now checked - JobDebug("DO, Running standard job assignment") - // New job giving system by Donkie - // This will cause lots of more loops, but since it's only done once it shouldn't really matter much at all. - // Hopefully this will add more randomness and fairness to job giving. + job_debug("DO: Running standard job assignment") - // Loop through all levels from high to low - var/list/shuffledoccupations = shuffle(joinable_occupations) for(var/level in level_order) - //Check the head jobs first each level - CheckHeadPositions(level) + job_debug("JOBS: Filling in head roles, Level: [job_priority_level_to_string(level)]") + // Fill the head jobs first each level + fill_all_head_positions_at_priority(level) // Loop through all unassigned players for(var/mob/dead/new_player/player in unassigned) if(!allow_all) - if(PopcapReached()) - RejectPlayer(player) + if(popcap_reached()) + job_debug("JOBS: Popcap reached, trying to reject player: [player]") + try_reject_player(player) - // Loop through all jobs - for(var/datum/job/job in shuffledoccupations) // SHUFFLE ME BABY - if(!job) - JobDebug("FOC invalid/null job in occupations, Player: [player], Job: [job]") - shuffledoccupations -= job - continue - - // Make sure the job isn't filled. If it is, remove it from the list so it doesn't get checked again. - if((job.current_positions >= job.spawn_positions) && job.spawn_positions != -1) - JobDebug("FOC job filled and not overflow, Player: [player], Job: [job], Current: [job.current_positions], Limit: [job.spawn_positions]") - shuffledoccupations -= job - continue + job_debug("JOBS: Finding a job for player: [player], at job priority pref: [job_priority_level_to_string(level)]") + // Loop through all jobs and build a list of jobs this player could be eligible for. + var/list/possible_jobs = list() + for(var/datum/job/job in available_occupations) // Filter any job that doesn't fit the current level. var/player_job_level = player.client?.prefs.job_preferences[job.title] if(isnull(player_job_level)) - JobDebug("FOC player job not enabled, Player: [player]") + job_debug("JOBS: Job not enabled, Job: [job]") continue - else if(player_job_level != level) - JobDebug("FOC player job enabled but at different level, Player: [player], TheirLevel: [job_priority_level_to_string(player_job_level)], ReqLevel: [job_priority_level_to_string(level)]") + if(player_job_level != level) + job_debug("JOBS: Job enabled at different priority pref, Job: [job], TheirLevel: [job_priority_level_to_string(player_job_level)], ReqLevel: [job_priority_level_to_string(level)]") continue - if(check_job_eligibility(player, job, "DO", add_job_to_log = TRUE) != JOB_AVAILABLE) + if(check_job_eligibility(player, job, "JOBS", add_job_to_log = TRUE) != JOB_AVAILABLE) continue - JobDebug("DO pass, Player: [player], Level:[level], Job:[job.title]") - AssignRole(player, job, do_eligibility_checks = FALSE) - unassigned -= player - break + possible_jobs += job - JobDebug("DO, Ending standard job assignment") + // If there are no possible jobs for them at this priority, skip them. + if(!length(possible_jobs)) + job_debug("JOBS: Player not eligible for any available jobs at this priority level: [player]") + continue - JobDebug("DO, Handle unassigned.") - // Hand out random jobs to the people who didn't get any in the last check - // Also makes sure that they got their preference correct + // Otherwise, pick one of those jobs at random. + var/datum/job/picked_job = pick(possible_jobs) + + job_debug("JOBS: Now assigning role to player: [player], Job:[picked_job.title]") + assign_role(player, picked_job, do_eligibility_checks = FALSE) + if((picked_job.current_positions >= picked_job.spawn_positions) && picked_job.spawn_positions != -1) + job_debug("JOBS: Job is now full, Job: [picked_job], Positions: [picked_job.current_positions], Limit: [picked_job.spawn_positions]") + available_occupations -= picked_job + + job_debug("DO: Ending standard job assignment") + + job_debug("DO: Handle unassigned") + // For any players that didn't get a job, fall back on their pref setting for what to do. for(var/mob/dead/new_player/player in unassigned) - HandleUnassigned(player, allow_all) - JobDebug("DO, Ending handle unassigned.") + handle_unassigned(player, allow_all) + job_debug("DO: Ending handle unassigned") - JobDebug("DO, Handle unrejectable unassigned") + job_debug("DO: Handle unrejectable unassigned") //Mop up people who can't leave. for(var/mob/dead/new_player/player in unassigned) //Players that wanted to back out but couldn't because they're antags (can you feel the edge case?) - if(!GiveRandomJob(player)) - if(!AssignRole(player, GetJobType(overflow_role))) //If everything is already filled, make them an assistant - JobDebug("DO, Forced antagonist could not be assigned any random job or the overflow role. DivideOccupations failed.") - JobDebug("---------------------------------------------------") + if(!give_random_job(player)) + if(!assign_role(player, get_job_type(overflow_role))) //If everything is already filled, make them an assistant + job_debug("DO: Forced antagonist could not be assigned any random job or the overflow role. divide_occupations failed.") + job_debug("---------------------------------------------------") run_divide_occupation_pure = FALSE return FALSE //Living on the edge, the forced antagonist couldn't be assigned to overflow role (bans, client age) - just reroll - JobDebug("DO, Ending handle unrejectable unassigned") + job_debug("DO: Ending handle unrejectable unassigned") - JobDebug("All divide occupations tasks completed.") - JobDebug("---------------------------------------------------") + job_debug("All divide occupations tasks completed.") + job_debug("---------------------------------------------------") run_divide_occupation_pure = FALSE return TRUE //We couldn't find a job from prefs for this guy. -/datum/controller/subsystem/job/proc/HandleUnassigned(mob/dead/new_player/player, allow_all = FALSE) +/datum/controller/subsystem/job/proc/handle_unassigned(mob/dead/new_player/player, allow_all = FALSE) var/jobless_role = player.client.prefs.read_preference(/datum/preference/choiced/jobless_role) if(!allow_all) - if(PopcapReached()) - RejectPlayer(player) + if(popcap_reached()) + job_debug("HU: Popcap reached, trying to reject player: [player]") + try_reject_player(player) return switch (jobless_role) if (BEOVERFLOW) - var/datum/job/overflow_role_datum = GetJobType(overflow_role) + var/datum/job/overflow_role_datum = get_job_type(overflow_role) if(check_job_eligibility(player, overflow_role_datum, debug_prefix = "HU", add_job_to_log = TRUE) != JOB_AVAILABLE) - RejectPlayer(player) + job_debug("HU: Player cannot be overflow, trying to reject: [player]") + try_reject_player(player) return - if(!AssignRole(player, overflow_role_datum, do_eligibility_checks = FALSE)) - RejectPlayer(player) + if(!assign_role(player, overflow_role_datum, do_eligibility_checks = FALSE)) + job_debug("HU: Player could not be assigned overflow role, trying to reject: [player]") + try_reject_player(player) return if (BERANDOMJOB) - if(!GiveRandomJob(player)) - RejectPlayer(player) + if(!give_random_job(player)) + job_debug("HU: Player cannot be given a random job, trying to reject: [player]") + try_reject_player(player) return if (RETURNTOLOBBY) - RejectPlayer(player) + job_debug("HU: Player unable to be assigned job, return to lobby enabled: [player]") + try_reject_player(player) return else //Something gone wrong if we got here. - var/message = "HU: [player] fell through handling unassigned" - JobDebug(message) - log_game(message) - message_admins(message) - RejectPlayer(player) + job_debug("HU: [player] has an invalid jobless_role var: [jobless_role]") + log_game("[player] has an invalid jobless_role var: [jobless_role]") + message_admins("[player] has an invalid jobless_role, this shouldn't happen.") + try_reject_player(player) //Gives the player the stuff he should have with his rank -/datum/controller/subsystem/job/proc/EquipRank(mob/living/equipping, datum/job/job, client/player_client) +/datum/controller/subsystem/job/proc/equip_rank(mob/living/equipping, datum/job/job, client/player_client) // SKYRAT EDIT ADDITION BEGIN - ALTERNATIVE_JOB_TITLES // The alt job title, if user picked one, or the default var/alt_title = player_client?.prefs.alt_job_titles[job.title] || job.title // SKYRAT EDIT ADDITION END - equipping.job = job.title SEND_SIGNAL(equipping, COMSIG_JOB_RECEIVED, job) @@ -584,7 +593,7 @@ SUBSYSTEM_DEF(job) /datum/controller/subsystem/job/proc/handle_auto_deadmin_roles(client/C, rank) if(!C?.holder) return TRUE - var/datum/job/job = GetJob(rank) + var/datum/job/job = get_job(rank) var/timegate_expired = FALSE // allow only forcing deadminning in the first X seconds of the round if auto_deadmin_timegate is set in config @@ -602,16 +611,16 @@ SUBSYSTEM_DEF(job) return C.holder.auto_deadmin() /datum/controller/subsystem/job/proc/setup_officer_positions() - var/datum/job/J = SSjob.GetJob(JOB_SECURITY_OFFICER) + var/datum/job/J = SSjob.get_job(JOB_SECURITY_OFFICER) if(!J) CRASH("setup_officer_positions(): Security officer job is missing") var/ssc = CONFIG_GET(number/security_scaling_coeff) if(ssc > 0) if(J.spawn_positions > 0) - // SKYRAT EDIT - Reduced from 12 max sec to 7 max sec due to departmental security being deactivated and replaced. //BUBBER EDIT REMOVAL: Raised to 10 max sec. - var/officer_positions = min(10, max(J.spawn_positions, round(unassigned.len / ssc))) //Scale between configured minimum and 12 officers - JobDebug("Setting open security officer positions to [officer_positions]") + // BUBBER EDIT - Reduced from 10 max sec to 7 max sec due to departmental security being deactivated and replaced. + var/officer_positions = min(10, max(J.spawn_positions, round(unassigned.len / ssc))) //Scale between configured minimum and 10 officers + job_debug("SOP: Setting open security officer positions to [officer_positions]") J.total_positions = officer_positions J.spawn_positions = officer_positions @@ -627,7 +636,7 @@ SUBSYSTEM_DEF(job) else //We ran out of spare locker spawns! break -/datum/controller/subsystem/job/proc/HandleFeedbackGathering() +/datum/controller/subsystem/job/proc/handle_feedback_gathering() for(var/datum/job/job as anything in joinable_occupations) var/high = 0 //high var/medium = 0 //medium @@ -666,7 +675,7 @@ SUBSYSTEM_DEF(job) SSblackbox.record_feedback("nested tally", "job_preferences", young, list("[job.title]", "young")) SSblackbox.record_feedback("nested tally", "job_preferences", newbie, list("[job.title]", "newbie")) -/datum/controller/subsystem/job/proc/PopcapReached() +/datum/controller/subsystem/job/proc/popcap_reached() var/hpc = CONFIG_GET(number/hard_popcap) var/epc = CONFIG_GET(number/extreme_popcap) if(hpc || epc) @@ -675,15 +684,15 @@ SUBSYSTEM_DEF(job) return 1 return 0 -/datum/controller/subsystem/job/proc/RejectPlayer(mob/dead/new_player/player) +/datum/controller/subsystem/job/proc/try_reject_player(mob/dead/new_player/player) if(player.mind && player.mind.special_role) - return - if(PopcapReached()) - JobDebug("Popcap overflow Check observer located, Player: [player]") - JobDebug("Player rejected :[player]") + job_debug("RJCT: Player unable to be rejected due to special_role, Player: [player], SpecialRole: [player.mind.special_role]") + return FALSE + + job_debug("RJCT: Player rejected, Player: [player]") unassigned -= player if(!run_divide_occupation_pure) - to_chat(player, "You have failed to qualify for any job you desired.") + to_chat(player, span_infoplain("You have failed to qualify for any job you desired.")) player.ready = PLAYER_NOT_READY player.client << output(player.ready, "lobby_browser:imgsrc") //SKYRAT EDIT ADDITION @@ -693,10 +702,10 @@ SUBSYSTEM_DEF(job) var/oldjobs = SSjob.all_occupations sleep(2 SECONDS) for (var/datum/job/job as anything in oldjobs) - INVOKE_ASYNC(src, PROC_REF(RecoverJob), job) + INVOKE_ASYNC(src, PROC_REF(recover_job), job) -/datum/controller/subsystem/job/proc/RecoverJob(datum/job/J) - var/datum/job/newjob = GetJob(J.title) +/datum/controller/subsystem/job/proc/recover_job(datum/job/J) + var/datum/job/newjob = get_job(J.title) if (!istype(newjob)) return newjob.total_positions = J.total_positions @@ -713,7 +722,7 @@ SUBSYSTEM_DEF(job) if(buckle && isliving(joining_mob)) buckle_mob(joining_mob, FALSE, FALSE) -/datum/controller/subsystem/job/proc/SendToLateJoin(mob/M, buckle = TRUE) +/datum/controller/subsystem/job/proc/send_to_late_join(mob/M, buckle = TRUE) var/atom/destination if(M.mind && !is_unassigned_job(M.mind.assigned_role) && length(GLOB.jobspawn_overrides[M.mind.assigned_role.title])) //We're doing something special today. destination = pick(GLOB.jobspawn_overrides[M.mind.assigned_role.title]) @@ -748,19 +757,6 @@ SUBSYSTEM_DEF(job) stack_trace("Unable to find last resort spawn point.") return GET_ERROR_ROOM -///Lands specified mob at a random spot in the hallways -/datum/controller/subsystem/job/proc/DropLandAtRandomHallwayPoint(mob/living/living_mob) - var/turf/spawn_turf = get_safe_random_station_turf(typesof(/area/station/hallway)) - - if(!spawn_turf) - SendToLateJoin(living_mob) - else - podspawn(list( - "target" = spawn_turf, - "path" = /obj/structure/closet/supplypod/centcompod, - "spawn" = living_mob - )) - /// Returns a list of minds of all heads of staff who are alive /datum/controller/subsystem/job/proc/get_living_heads() . = list() @@ -795,7 +791,7 @@ SUBSYSTEM_DEF(job) if(sec.assigned_role.departments_bitflags & DEPARTMENT_BITFLAG_SECURITY) . += sec -/datum/controller/subsystem/job/proc/JobDebug(message) +/datum/controller/subsystem/job/proc/job_debug(message) log_job_debug(message) /// Builds various lists of jobs based on station, centcom and additional jobs with icons associated with them. @@ -860,12 +856,47 @@ SUBSYSTEM_DEF(job) safe_code_timer_id = null safe_code_request_loc = null -/// Blindly assigns the required roles to every player in the dynamic_forced_occupations list. +/// Assigns roles that are considered high priority, either due to dynamic needing to force a specific role for a specific ruleset +/// or making sure roles critical to round progression exist where possible every shift. /datum/controller/subsystem/job/proc/assign_priority_positions() + job_debug("APP: Assigning Dynamic ruleset forced occupations: [length(dynamic_forced_occupations)]") for(var/mob/new_player in dynamic_forced_occupations) - // Eligibility checks already carried out as part of the dynamic ruleset trim_candidates proc.area - // However no guarantee of game state between then and now, so don't skip eligibility checks on AssignRole. - AssignRole(new_player, GetJob(dynamic_forced_occupations[new_player])) + // Eligibility checks already carried out as part of the dynamic ruleset trim_candidates proc. + // However no guarantee of game state between then and now, so don't skip eligibility checks on assign_role. + assign_role(new_player, get_job(dynamic_forced_occupations[new_player])) + + // Get JP_HIGH department Heads of Staff in place. Indirectly useful for the Revolution ruleset to have as many Heads as possible. + job_debug("APP: Assigning all JP_HIGH head of staff roles.") + var/head_count = fill_all_head_positions_at_priority(JP_HIGH) + + // If nobody has JP_HIGH on a Head role, try to force at least one Head of Staff so every shift has the best chance + // of having at least one leadership role. + if(head_count == 0) + force_one_head_assignment() + + // Fill out all AI positions. + job_debug("APP: Filling all AI positions") + fill_ai_positions() + +/datum/controller/subsystem/job/proc/assign_all_overflow_positions() + job_debug("OVRFLW: Assigning all overflow roles.") + job_debug("OVRFLW: This shift's overflow role: [overflow_role]") + var/datum/job/overflow_datum = get_job_type(overflow_role) + + // When the Overflow role changes for any reason, this allows players to set otherwise invalid job priority pref states. + // So if Assistant is the "usual" Overflow but it gets changed to Clown for a shift, players can set the Assistant role's priorities + // to JP_MEDIUM and JP_LOW. When the "usual" Overflow role comes back, it returns to an On option in the prefs menu but still + // keeps its old JP_MEDIUM or JP_LOW value in the background. + + // Due to this prefs quirk, we actually don't want to find JP_HIGH candidates as it may exclude people with abnormal pref states that + // appear normal from the UI. By passing in JP_ANY, it will return all players that have the overflow job pref (which should be a toggle) + // set to any level. + var/list/overflow_candidates = find_occupation_candidates(overflow_datum, JP_ANY) + for(var/mob/dead/new_player/player in overflow_candidates) + // Eligibility checks done as part of find_occupation_candidates, so skip them. + assign_role(player, get_job_type(overflow_role), do_eligibility_checks = FALSE) + job_debug("OVRFLW: Assigned overflow to player: [player]") + job_debug("OVRFLW: All overflow roles assigned.") /// Takes a job priority #define such as JP_LOW and gets its string representation for logging. /datum/controller/subsystem/job/proc/job_priority_level_to_string(priority) @@ -883,35 +914,35 @@ SUBSYSTEM_DEF(job) * Arguments: * * player - The player to check for job eligibility. * * possible_job - The job to check for eligibility against. - * * debug_prefix - Logging prefix for the JobDebug log entries. For example, GRJ during GiveRandomJob or DO during DivideOccupations. + * * debug_prefix - Logging prefix for the job_debug log entries. For example, GRJ during give_random_job or DO during divide_occupations. * * add_job_to_log - If TRUE, appends the job type to the log entry. If FALSE, does not. Set to FALSE when check is part of iterating over players for a specific job, set to TRUE when check is part of iterating over jobs for a specific player and you don't want extra log entry spam. */ /datum/controller/subsystem/job/proc/check_job_eligibility(mob/dead/new_player/player, datum/job/possible_job, debug_prefix = "", add_job_to_log = FALSE) if(!player.mind) - JobDebug("[debug_prefix] player has no mind, Player: [player][add_job_to_log ? ", Job: [possible_job]" : ""]") + job_debug("[debug_prefix]: Player has no mind, Player: [player][add_job_to_log ? ", Job: [possible_job]" : ""]") return JOB_UNAVAILABLE_GENERIC if(possible_job.title in player.mind.restricted_roles) - JobDebug("[debug_prefix] Error: [get_job_unavailable_error_message(JOB_UNAVAILABLE_ANTAG_INCOMPAT, possible_job.title)], Player: [player][add_job_to_log ? ", Job: [possible_job]" : ""]") + job_debug("[debug_prefix] Error: [get_job_unavailable_error_message(JOB_UNAVAILABLE_ANTAG_INCOMPAT, possible_job.title)], Player: [player][add_job_to_log ? ", Job: [possible_job]" : ""]") return JOB_UNAVAILABLE_ANTAG_INCOMPAT if(!possible_job.player_old_enough(player.client)) - JobDebug("[debug_prefix] Error: [get_job_unavailable_error_message(JOB_UNAVAILABLE_ACCOUNTAGE, possible_job.title)], Player: [player][add_job_to_log ? ", Job: [possible_job]" : ""]") + job_debug("[debug_prefix] Error: [get_job_unavailable_error_message(JOB_UNAVAILABLE_ACCOUNTAGE, possible_job.title)], Player: [player][add_job_to_log ? ", Job: [possible_job]" : ""]") return JOB_UNAVAILABLE_ACCOUNTAGE var/required_playtime_remaining = possible_job.required_playtime_remaining(player.client) if(required_playtime_remaining) - JobDebug("[debug_prefix] Error: [get_job_unavailable_error_message(JOB_UNAVAILABLE_PLAYTIME, possible_job.title)], Player: [player], MissingTime: [required_playtime_remaining][add_job_to_log ? ", Job: [possible_job]" : ""]") + job_debug("[debug_prefix] Error: [get_job_unavailable_error_message(JOB_UNAVAILABLE_PLAYTIME, possible_job.title)], Player: [player], MissingTime: [required_playtime_remaining][add_job_to_log ? ", Job: [possible_job]" : ""]") return JOB_UNAVAILABLE_PLAYTIME // Run the banned check last since it should be the rarest check to fail and can access the database. if(is_banned_from(player.ckey, possible_job.title)) - JobDebug("[debug_prefix] Error: [get_job_unavailable_error_message(JOB_UNAVAILABLE_BANNED, possible_job.title)], Player: [player][add_job_to_log ? ", Job: [possible_job]" : ""]") + job_debug("[debug_prefix] Error: [get_job_unavailable_error_message(JOB_UNAVAILABLE_BANNED, possible_job.title)], Player: [player][add_job_to_log ? ", Job: [possible_job]" : ""]") return JOB_UNAVAILABLE_BANNED // Check for character age if(possible_job.required_character_age > player.client.prefs.read_preference(/datum/preference/numeric/age) && possible_job.required_character_age != null) - JobDebug("[debug_prefix] Error: [get_job_unavailable_error_message(JOB_UNAVAILABLE_AGE)], Player: [player][add_job_to_log ? ", Job: [possible_job]" : ""]") + job_debug("[debug_prefix] Error: [get_job_unavailable_error_message(JOB_UNAVAILABLE_AGE)], Player: [player][add_job_to_log ? ", Job: [possible_job]" : ""]") return JOB_UNAVAILABLE_AGE //SKYRAT EDIT ADDITION BEGIN - CUSTOMIZATION @@ -954,7 +985,7 @@ SUBSYSTEM_DEF(job) // Run this check after is_banned_from since it can query the DB which may sleep. // Need to recheck the player exists after is_banned_from since it can query the DB which may sleep. if(QDELETED(player)) - JobDebug("[debug_prefix] player is qdeleted, Player: [player][add_job_to_log ? ", Job: [possible_job]" : ""]") + job_debug("[debug_prefix]: Player is qdeleted, Player: [player][add_job_to_log ? ", Job: [possible_job]" : ""]") return JOB_UNAVAILABLE_GENERIC return JOB_AVAILABLE diff --git a/code/controllers/subsystem/library.dm b/code/controllers/subsystem/library.dm index a657e442748..bfe77f70f02 100644 --- a/code/controllers/subsystem/library.dm +++ b/code/controllers/subsystem/library.dm @@ -26,14 +26,14 @@ SUBSYSTEM_DEF(library) /datum/controller/subsystem/library/proc/load_shelves() var/list/datum/callback/load_callbacks = list() - + for(var/obj/structure/bookcase/case_to_load as anything in shelves_to_load) if(!case_to_load) stack_trace("A null bookcase somehow ended up in SSlibrary's shelves_to_load list. Did something harddel?") continue load_callbacks += CALLBACK(case_to_load, TYPE_PROC_REF(/obj/structure/bookcase, load_shelf)) shelves_to_load = null - + //Load all of the shelves asyncronously at the same time, blocking until the last one is finished. callback_select(load_callbacks, savereturns = FALSE) @@ -59,6 +59,6 @@ SUBSYSTEM_DEF(library) /datum/controller/subsystem/library/proc/prepare_library_areas() library_areas = typesof(/area/station/service/library) - /area/station/service/library/abandoned - var/list/additional_areas = SSmapping.config.library_areas + var/list/additional_areas = SSmapping.current_map.library_areas if(additional_areas) library_areas += additional_areas diff --git a/code/controllers/subsystem/map_vote.dm b/code/controllers/subsystem/map_vote.dm new file mode 100644 index 00000000000..7d0be38f920 --- /dev/null +++ b/code/controllers/subsystem/map_vote.dm @@ -0,0 +1,160 @@ +#define MAP_VOTE_CACHE_LOCATION "data/map_vote_cache.json" + +SUBSYSTEM_DEF(map_vote) + name = "Map Vote" + flags = SS_NO_FIRE + + /// Has an admin specifically set a map. + var/admin_override = FALSE + + /// Have we already done a vote. + var/already_voted = FALSE + + /// The map that has been chosen for next round. + var/datum/map_config/next_map_config + + /// Stores the current map vote cache, so that players can look at the current tally. + var/list/map_vote_cache + + /// Stores the previous map vote cache, used when a map vote is reverted. + var/list/previous_cache + + /// Stores a formatted html string of the tally counts + var/tally_printout = span_red("Loading...") + +/datum/controller/subsystem/map_vote/Initialize() + if(rustg_file_exists(MAP_VOTE_CACHE_LOCATION)) + map_vote_cache = json_decode(file2text(MAP_VOTE_CACHE_LOCATION)) + var/carryover = CONFIG_GET(number/map_vote_tally_carryover_percentage) + for(var/map_id in map_vote_cache) + map_vote_cache[map_id] = round(map_vote_cache[map_id] * (carryover / 100)) + sanitize_cache() + else + map_vote_cache = list() + update_tally_printout() + return SS_INIT_SUCCESS + +/datum/controller/subsystem/map_vote/proc/write_cache() + rustg_file_write(json_encode(map_vote_cache), MAP_VOTE_CACHE_LOCATION) + +/datum/controller/subsystem/map_vote/proc/sanitize_cache() + var/max = CONFIG_GET(number/map_vote_maximum_tallies) + for(var/map_id in map_vote_cache) + if(!(map_id in config.maplist)) + map_vote_cache -= map_id + var/count = map_vote_cache[map_id] + if(count > max) + map_vote_cache[map_id] = max + +/datum/controller/subsystem/map_vote/proc/send_map_vote_notice(...) + var/static/last_message_at + if(last_message_at == world.time) + message_admins("Call to send_map_vote_notice twice in one game tick. Yell at someone to condense messages.") + last_message_at = world.time + + var/list/messages = args.Copy() + to_chat(world, span_purple(examine_block("Map Vote\n
\n[messages.Join("\n")]"))) + +/datum/controller/subsystem/map_vote/proc/finalize_map_vote(datum/vote/map_vote/map_vote) + if(already_voted) + message_admins("Attempted to finalize a map vote after a map vote has already been finalized.") + return + already_voted = TRUE + + var/flat = CONFIG_GET(number/map_vote_flat_bonus) + previous_cache = map_vote_cache.Copy() + for(var/map_id in map_vote.choices) + var/datum/map_config/map = config.maplist[map_id] + map_vote_cache[map_id] += (map_vote.choices[map_id] * map.voteweight) + flat + sanitize_cache() + write_cache() + update_tally_printout() + + if(admin_override) + send_map_vote_notice("Admin Override is in effect. Map will not be changed.", "Tallies are recorded and saved.") + return + + var/list/valid_maps = filter_cache_to_valid_maps() + if(!length(valid_maps)) + send_map_vote_notice("No valid maps.") + return + + var/winner = pick_weight(filter_cache_to_valid_maps()) + set_next_map(config.maplist[winner]) + send_map_vote_notice("Map Selected - [span_bold(next_map_config.map_name)]") + + // do not reset tallies if only one map is even possible + if(length(valid_maps) > 1) + map_vote_cache[winner] = CONFIG_GET(number/map_vote_minimum_tallies) + write_cache() + update_tally_printout() + +/// Returns a list of all map options that are invalid for the current population. +/datum/controller/subsystem/map_vote/proc/get_valid_map_vote_choices() + var/list/valid_maps = list() + + // Fill in our default choices with all of the maps in our map config, if they are votable and not blocked. + var/list/maps = shuffle(global.config.maplist) + for(var/map in maps) + var/datum/map_config/possible_config = config.maplist[map] + if(!possible_config.votable || (possible_config.map_name in SSpersistence.blocked_maps)) + continue + valid_maps += possible_config.map_name + + var/filter_threshold = 0 + if(SSticker.HasRoundStarted()) + filter_threshold = get_active_player_count(alive_check = FALSE, afk_check = TRUE, human_check = FALSE) + else + filter_threshold = length(GLOB.clients) + + for(var/map in valid_maps) + var/datum/map_config/possible_config = config.maplist[map] + if(possible_config.config_min_users > 0 && filter_threshold < possible_config.config_min_users) + valid_maps -= map + + else if(possible_config.config_max_users > 0 && filter_threshold > possible_config.config_max_users) + valid_maps -= map + + return valid_maps + +/datum/controller/subsystem/map_vote/proc/filter_cache_to_valid_maps() + var/connected_players = length(GLOB.player_list) + var/list/valid_maps = list() + for(var/map_id in map_vote_cache) + var/datum/map_config/map = config.maplist[map_id] + if(!map.votable) + continue + if(map.config_min_users > 0 && (connected_players < map.config_min_users)) + continue + if(map.config_max_users > 0 && (connected_players > map.config_max_users)) + continue + valid_maps[map_id] = map_vote_cache[map_id] + return valid_maps + +/datum/controller/subsystem/map_vote/proc/set_next_map(datum/map_config/change_to) + if(!change_to.MakeNextMap()) + message_admins("Failed to set new map with next_map.json for [change_to.map_name]!") + return FALSE + + next_map_config = change_to + return TRUE + +/datum/controller/subsystem/map_vote/proc/revert_next_map() + if(!next_map_config) + return + if(previous_cache) + map_vote_cache = previous_cache + previous_cache = null + + already_voted = FALSE + admin_override = FALSE + send_map_vote_notice("Next map reverted. Voting re-enabled.") + +#undef MAP_VOTE_CACHE_LOCATION + +/datum/controller/subsystem/map_vote/proc/update_tally_printout() + var/list/data = list() + for(var/map_id in map_vote_cache) + var/datum/map_config/map = config.maplist[map_id] + data += "[map.map_name] - [map_vote_cache[map_id]]" + tally_printout = examine_block("Current Tallies\n
\n[data.Join("\n")]") diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index 6374a69e95e..b017a6aaaa4 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -6,15 +6,8 @@ SUBSYSTEM_DEF(mapping) var/list/nuke_tiles = list() var/list/nuke_threats = list() - var/datum/map_config/config - var/datum/map_config/next_map_config - - /// Has the map for the next round been voted for already? - var/map_voted = FALSE - /// Has the map for the next round been deliberately chosen by an admin? - var/map_force_chosen = FALSE - /// Has the map vote been rocked? - var/map_vote_rocked = FALSE + /// The current map config the server loaded at round start. + var/datum/map_config/current_map var/list/map_templates = list() @@ -95,20 +88,20 @@ SUBSYSTEM_DEF(mapping) /datum/controller/subsystem/mapping/PreInit() ..() #ifdef FORCE_MAP - config = load_map_config(FORCE_MAP, FORCE_MAP_DIRECTORY) + current_map = load_map_config(FORCE_MAP, FORCE_MAP_DIRECTORY) #else - config = load_map_config(error_if_missing = FALSE) + current_map = load_map_config(error_if_missing = FALSE) #endif /datum/controller/subsystem/mapping/Initialize() if(initialized) return SS_INIT_SUCCESS - if(config.defaulted) - var/old_config = config - config = global.config.defaultmap - if(!config || config.defaulted) - to_chat(world, span_boldannounce("Unable to load next or default map config, defaulting to MetaStation.")) - config = old_config + if(current_map.defaulted) + var/datum/map_config/old_config = current_map + current_map = config.defaultmap + if(!current_map || current_map.defaulted) + to_chat(world, span_boldannounce("Unable to load next or default map config, defaulting to [old_config.map_name].")) + current_map = old_config plane_offset_to_true = list() true_to_offset_planes = list() plane_to_offset = list() @@ -132,11 +125,11 @@ SUBSYSTEM_DEF(mapping) #ifndef LOWMEMORYMODE // Create space ruin levels - while (space_levels_so_far < config.space_ruin_levels) + while (space_levels_so_far < current_map.space_ruin_levels) add_new_zlevel("Ruin Area [space_levels_so_far+1]", ZTRAITS_SPACE) ++space_levels_so_far // Create empty space levels - while (space_levels_so_far < config.space_empty_levels + config.space_ruin_levels) + while (space_levels_so_far < current_map.space_empty_levels + current_map.space_ruin_levels) empty_space = add_new_zlevel("Empty Area [space_levels_so_far+1]", list(ZTRAIT_LINKAGE = CROSSLINKED)) ++space_levels_so_far @@ -144,7 +137,7 @@ SUBSYSTEM_DEF(mapping) if(CONFIG_GET(flag/roundstart_away)) createRandomZlevel(prob(CONFIG_GET(number/config_gateway_chance))) - else if (SSmapping.config.load_all_away_missions) // we're likely in a local testing environment, so punch it. + else if (SSmapping.current_map.load_all_away_missions) // we're likely in a local testing environment, so punch it. load_all_away_missions() loading_ruins = TRUE @@ -363,9 +356,7 @@ Used by the AI doomsday and the self-destruct nuke. holodeck_templates = SSmapping.holodeck_templates areas_in_z = SSmapping.areas_in_z - config = SSmapping.config - next_map_config = SSmapping.next_map_config - + current_map = SSmapping.current_map clearing_reserved_turfs = SSmapping.clearing_reserved_turfs z_list = SSmapping.z_list @@ -439,22 +430,22 @@ Used by the AI doomsday and the self-destruct nuke. // load the station station_start = world.maxz + 1 - add_startup_message("Loading [config.map_name]...") // SKYRAT EDIT CHANGE - LoadGroup(FailedZs, "Station", config.map_path, config.map_file, config.traits, ZTRAITS_STATION) + add_startup_message("Loading [current_map.map_name]...") // SKYRAT EDIT CHANGE + LoadGroup(FailedZs, "Station", current_map.map_path, current_map.map_file, current_map.traits, ZTRAITS_STATION) if(SSdbcore.Connect()) var/datum/db_query/query_round_map_name = SSdbcore.NewQuery({" UPDATE [format_table_name("round")] SET map_name = :map_name WHERE id = :round_id - "}, list("map_name" = config.map_name, "round_id" = GLOB.round_id)) + "}, list("map_name" = current_map.map_name, "round_id" = GLOB.round_id)) query_round_map_name.Execute() qdel(query_round_map_name) #ifndef LOWMEMORYMODE - if(config.minetype == "lavaland") + if(current_map.minetype == "lavaland") LoadGroup(FailedZs, "Lavaland", "map_files/Mining", "Lavaland.dmm", default_traits = ZTRAITS_LAVALAND) - else if (!isnull(config.minetype) && config.minetype != "none") - INIT_ANNOUNCE("WARNING: An unknown minetype '[config.minetype]' was set! This is being ignored! Update the maploader code!") + else if (!isnull(current_map.minetype) && current_map.minetype != "none") + INIT_ANNOUNCE("WARNING: An unknown minetype '[current_map.minetype]' was set! This is being ignored! Update the maploader code!") #endif if(LAZYLEN(FailedZs)) //but seriously, unless the server's filesystem is messed up this will never happen @@ -467,10 +458,8 @@ Used by the AI doomsday and the self-destruct nuke. #undef INIT_ANNOUNCE // Custom maps are removed after station loading so the map files does not persist for no reason. - if(config.map_path == CUSTOM_MAP_PATH) - fdel("_maps/custom/[config.map_file]") - // And as the file is now removed set the next map to default. - next_map_config = load_default_map_config() + if(current_map.map_path == CUSTOM_MAP_PATH) + fdel("_maps/custom/[current_map.map_file]") /** * Global list of AREA TYPES that are associated with the station. @@ -502,88 +491,6 @@ GLOBAL_LIST_EMPTY(the_station_areas) for(var/area/A as anything in GLOB.areas) A.RunTerrainPopulation() -/datum/controller/subsystem/mapping/proc/maprotate() - if(map_voted || SSmapping.next_map_config) //If voted or set by other means. - return - - var/players = GLOB.clients.len - var/list/mapvotes = list() - //count votes - var/pmv = CONFIG_GET(flag/preference_map_voting) - if(pmv) - for (var/client/c in GLOB.clients) - var/vote = c.prefs.read_preference(/datum/preference/choiced/preferred_map) - if (!vote) - if (global.config.defaultmap) - mapvotes[global.config.defaultmap.map_name] += 1 - continue - mapvotes[vote] += 1 - else - for(var/M in global.config.maplist) - mapvotes[M] = 1 - - //filter votes - for (var/map in mapvotes) - if (!map) - mapvotes.Remove(map) - continue - if (!(map in global.config.maplist)) - mapvotes.Remove(map) - continue - if(map in SSpersistence.blocked_maps) - mapvotes.Remove(map) - continue - var/datum/map_config/VM = global.config.maplist[map] - if (!VM) - mapvotes.Remove(map) - continue - if (VM.voteweight <= 0) - mapvotes.Remove(map) - continue - if (VM.config_min_users > 0 && players < VM.config_min_users) - mapvotes.Remove(map) - continue - if (VM.config_max_users > 0 && players > VM.config_max_users) - mapvotes.Remove(map) - continue - - if(pmv) - mapvotes[map] = mapvotes[map]*VM.voteweight - - var/pickedmap = pick_weight(mapvotes) - if (!pickedmap) - return - var/datum/map_config/VM = global.config.maplist[pickedmap] - message_admins("Randomly rotating map to [VM.map_name]") - . = changemap(VM) - if (. && VM.map_name != config.map_name) - to_chat(world, span_boldannounce("Map rotation has chosen [VM.map_name] for next round!")) - -/datum/controller/subsystem/mapping/proc/mapvote() - if(map_voted || SSmapping.next_map_config) //If voted or set by other means. - return - if(SSvote.current_vote) //Theres already a vote running, default to rotation. - maprotate() - return - SSvote.initiate_vote(/datum/vote/map_vote, "automatic map rotation", forced = TRUE) - -/datum/controller/subsystem/mapping/proc/changemap(datum/map_config/change_to) - if(!change_to.MakeNextMap()) - next_map_config = load_default_map_config() - message_admins("Failed to set new map with next_map.json for [change_to.map_name]! Using default as backup!") - return - - var/filter_threshold = get_active_player_count(alive_check = FALSE, afk_check = TRUE, human_check = FALSE) - if (change_to.config_min_users > 0 && filter_threshold != 0 && filter_threshold < change_to.config_min_users) - message_admins("[change_to.map_name] was chosen for the next map, despite there being less current players than its set minimum population range!") - log_game("[change_to.map_name] was chosen for the next map, despite there being less current players than its set minimum population range!") - if (change_to.config_max_users > 0 && filter_threshold > change_to.config_max_users) - message_admins("[change_to.map_name] was chosen for the next map, despite there being more current players than its set maximum population range!") - log_game("[change_to.map_name] was chosen for the next map, despite there being more current players than its set maximum population range!") - - next_map_config = change_to - return TRUE - /datum/controller/subsystem/mapping/proc/preloadTemplates(path = "_maps/templates/") //see master controller setup var/list/filelist = flist(path) for(var/map in filelist) @@ -598,10 +505,10 @@ GLOBAL_LIST_EMPTY(the_station_areas) /datum/controller/subsystem/mapping/proc/preloadRuinTemplates() // Still supporting bans by filename var/list/banned = generateMapList("spaceruinblacklist.txt") - if(config.minetype == "lavaland") + if(current_map.minetype == "lavaland") banned += generateMapList("lavaruinblacklist.txt") - else if(config.blacklist_file) - banned += generateMapList(config.blacklist_file) + else if(current_map.blacklist_file) + banned += generateMapList(current_map.blacklist_file) for(var/item in sort_list(subtypesof(/datum/map_template/ruin), GLOBAL_PROC_REF(cmp_ruincost_priority))) var/datum/map_template/ruin/ruin_type = item @@ -961,7 +868,7 @@ ADMIN_VERB(load_away_mission, R_FUN, "Load Away Mission", "Load a specific away /// Returns true if the map we're playing on is on a planet /datum/controller/subsystem/mapping/proc/is_planetary() - return config.planetary + return current_map.planetary /// For debug purposes, will add every single away mission present in a given directory. /// You can optionally pass in a string directory to load from instead of the default. diff --git a/code/controllers/subsystem/movement/movement.dm b/code/controllers/subsystem/movement/movement.dm index 425c67a0c47..d6043d596bb 100644 --- a/code/controllers/subsystem/movement/movement.dm +++ b/code/controllers/subsystem/movement/movement.dm @@ -66,7 +66,7 @@ SUBSYSTEM_DEF(movement) return // Still work to be done var/bucket_time = bucket_info[MOVEMENT_BUCKET_TIME] smash_bucket(1, bucket_time) // We assume we're the first bucket in the queue right now - visual_delay = MC_AVERAGE_FAST(visual_delay, max((world.time - canonical_time) / wait, 1)) + visual_delay = MC_AVERAGE_FAST(visual_delay, max((world.time - canonical_time) / TICKS2DS(wait), 1)) /// Removes a bucket from our system. You only need to pass in the time, but if you pass in the index of the list you save us some work /datum/controller/subsystem/movement/proc/smash_bucket(index, bucket_time) diff --git a/code/controllers/subsystem/movement/movement_types.dm b/code/controllers/subsystem/movement/movement_types.dm index ec0136bc8c1..58b1c58b0bc 100644 --- a/code/controllers/subsystem/movement/movement_types.dm +++ b/code/controllers/subsystem/movement/movement_types.dm @@ -869,3 +869,95 @@ var/atom/old_loc = moving.loc holder.current_pipe = holder.current_pipe.transfer(holder) return old_loc != moving?.loc ? MOVELOOP_SUCCESS : MOVELOOP_FAILURE + + +/** + * Helper proc for the smooth_move datum + * + * Returns TRUE if the loop sucessfully started, or FALSE if it failed + * + * Arguments: + * moving - The atom we want to move + * angle - Angle at which we want to move + * delay - How many deci-seconds to wait between fires. Defaults to the lowest value, 0.1 + * timeout - Time in deci-seconds until the moveloop self expires. Defaults to INFINITY + * subsystem - The movement subsystem to use. Defaults to SSmovement. Only one loop can exist for any one subsystem + * priority - Defines how different move loops override each other. Lower numbers beat higher numbers, equal defaults to what currently exists. Defaults to MOVEMENT_DEFAULT_PRIORITY + * flags - Set of bitflags that effect move loop behavior in some way. Check _DEFINES/movement.dm + * +**/ + +/datum/move_manager/proc/smooth_move(moving, angle, delay, timeout, subsystem, priority, flags, datum/extra_info) + return add_to_loop(moving, subsystem, /datum/move_loop/smooth_move, priority, flags, extra_info, delay, timeout, angle) + +/datum/move_loop/smooth_move + /// Angle at which we move. 0 is north because byond. + var/angle = 0 + /// When this gets bigger than 1, we move a turf + var/x_ticker = 0 + var/y_ticker = 0 + /// The rate at which we move, between 0 and 1. Cached to cut down on trig + var/x_rate = 0 + var/y_rate = 1 + /// Sign for our movement + var/x_sign = 1 + var/y_sign = 1 + /// Actual move delay, as delay will be modified by move() depending on what direction we move in + var/saved_delay + +/datum/move_loop/smooth_move/setup(delay, timeout, angle) + . = ..() + if(!.) + return FALSE + set_angle(angle) + saved_delay = delay + +/datum/move_loop/smooth_move/set_delay(new_delay) + new_delay = round(new_delay, world.tick_lag) + . = ..() + saved_delay = delay + +/datum/move_loop/smooth_move/compare_loops(datum/move_loop/loop_type, priority, flags, extra_info, delay, timeout, atom/chasing, home = FALSE) + if(..() && angle == src.angle) + return TRUE + return FALSE + +/datum/move_loop/smooth_move/move() + var/atom/old_loc = moving.loc + // Defaulting to 2 because if one rate is 0 the other is guaranteed to be 1, so maxing out at 1 to_move + var/x_to_move = x_rate > 0 ? (1 - x_ticker) / x_rate : 2 + var/y_to_move = y_rate > 0 ? (1 - y_ticker) / y_rate : 2 + var/move_dist = min(x_to_move, y_to_move) + x_ticker += x_rate * move_dist + y_ticker += y_rate * move_dist + + // Per Bresenham's, if we are closer to the next tile's center move diagonally. Checked by seeing if we pass into the next tile after moving another half a tile + var/move_x = (x_ticker + x_rate * 0.5) > 1 + var/move_y = (y_ticker + y_rate * 0.5) > 1 + if (move_x) + x_ticker = 0 + if (move_y) + y_ticker = 0 + + var/turf/next_turf = locate(moving.x + (move_x ? x_sign : 0), moving.y + (move_y ? y_sign : 0), moving.z) + moving.Move(next_turf, get_dir(moving, next_turf), FALSE, !(flags & MOVEMENT_LOOP_NO_DIR_UPDATE)) + + if (old_loc == moving?.loc) + return MOVELOOP_FAILURE + + delay = saved_delay + if (move_x && move_y) + delay *= 1.4 + + return MOVELOOP_SUCCESS + +/datum/move_loop/smooth_move/proc/set_angle(new_angle) + angle = new_angle + x_rate = sin(angle) + y_rate = cos(angle) + x_sign = SIGN(x_rate) + y_sign = SIGN(y_rate) + x_rate = abs(x_rate) + y_rate = abs(y_rate) + x_ticker = 0 + y_ticker = 0 diff --git a/code/controllers/subsystem/movement/newtonian_movement.dm b/code/controllers/subsystem/movement/newtonian_movement.dm new file mode 100644 index 00000000000..aeb03a576da --- /dev/null +++ b/code/controllers/subsystem/movement/newtonian_movement.dm @@ -0,0 +1,31 @@ +/// The subsystem is intended to tick things related to space/newtonian movement, such as constant sources of inertia +MOVEMENT_SUBSYSTEM_DEF(newtonian_movement) + name = "Newtonian Movement" + flags = SS_NO_INIT|SS_TICKER + runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME + + var/stat_tag = "P" //Used for logging + var/list/processing = list() + var/list/currentrun = list() + +/datum/controller/subsystem/movement/newtonian_movement/stat_entry(msg) + msg = "[stat_tag]:[length(processing)]" + return ..() + +/datum/controller/subsystem/movement/newtonian_movement/fire(resumed = FALSE) + . = ..() + if (!resumed) + currentrun = processing.Copy() + //cache for sanic speed (lists are references anyways) + var/list/current_run = currentrun + + while(current_run.len) + var/datum/thing = current_run[current_run.len] + current_run.len-- + if(QDELETED(thing)) + processing -= thing + else if(thing.process(TICKS2DS(wait) * 0.1) == PROCESS_KILL) + // fully stop so that a future START_PROCESSING will work + STOP_PROCESSING(src, thing) + if (MC_TICK_CHECK) + return diff --git a/code/controllers/subsystem/movement/spacedrift.dm b/code/controllers/subsystem/movement/spacedrift.dm deleted file mode 100644 index 4002b5eb555..00000000000 --- a/code/controllers/subsystem/movement/spacedrift.dm +++ /dev/null @@ -1,5 +0,0 @@ -MOVEMENT_SUBSYSTEM_DEF(spacedrift) - name = "Space Drift" - priority = FIRE_PRIORITY_SPACEDRIFT - flags = SS_NO_INIT|SS_TICKER - runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME diff --git a/code/controllers/subsystem/nightshift.dm b/code/controllers/subsystem/nightshift.dm index b8df42742e4..170f1269614 100644 --- a/code/controllers/subsystem/nightshift.dm +++ b/code/controllers/subsystem/nightshift.dm @@ -26,7 +26,7 @@ SUBSYSTEM_DEF(nightshift) /datum/controller/subsystem/nightshift/proc/announce(message) priority_announce( text = message, - sound = 'sound/misc/notice2.ogg', + sound = 'sound/announcer/notice/notice2.ogg', sender_override = "Automated Lighting System Announcement", color_override = "grey", ) diff --git a/code/controllers/subsystem/persistence/_persistence.dm b/code/controllers/subsystem/persistence/_persistence.dm index 3783309fadf..df225210f02 100644 --- a/code/controllers/subsystem/persistence/_persistence.dm +++ b/code/controllers/subsystem/persistence/_persistence.dm @@ -115,7 +115,7 @@ SUBSYSTEM_DEF(persistence) for(var/map in config.maplist) var/datum/map_config/VM = config.maplist[map] var/run = 0 - if(VM.map_name == SSmapping.config.map_name) + if(VM.map_name == SSmapping.current_map.map_name) run++ for(var/name in SSpersistence.saved_maps) if(VM.map_name == name) @@ -132,7 +132,7 @@ SUBSYSTEM_DEF(persistence) saved_maps += mapstosave for(var/i = mapstosave; i > 1; i--) saved_maps[i] = saved_maps[i-1] - saved_maps[1] = SSmapping.config.map_name + saved_maps[1] = SSmapping.current_map.map_name var/json_file = file(FILE_RECENT_MAPS) var/list/file_data = list() file_data["data"] = saved_maps diff --git a/code/controllers/subsystem/persistence/engravings.dm b/code/controllers/subsystem/persistence/engravings.dm index 6808a101bb8..ad00c7909d7 100644 --- a/code/controllers/subsystem/persistence/engravings.dm +++ b/code/controllers/subsystem/persistence/engravings.dm @@ -14,7 +14,7 @@ saved_engravings = json["entries"] if(!saved_engravings.len) - log_world("Failed to load engraved messages on map [SSmapping.config.map_name]") + log_world("Failed to load engraved messages on map [SSmapping.current_map.map_name]") return var/list/viable_turfs = get_area_turfs(/area/station/maintenance, subtypes = TRUE) + get_area_turfs(/area/station/security/prison, subtypes = TRUE) @@ -42,7 +42,7 @@ successfully_loaded_engravings++ turfs_to_pick_from -= engraved_wall - log_world("Loaded [successfully_loaded_engravings] engraved messages on map [SSmapping.config.map_name]") + log_world("Loaded [successfully_loaded_engravings] engraved messages on map [SSmapping.current_map.map_name]") ///Saves all new engravings in the world. /datum/controller/subsystem/persistence/proc/save_wall_engravings() diff --git a/code/controllers/subsystem/polling.dm b/code/controllers/subsystem/polling.dm index f9891183fee..bfe5d33dff0 100644 --- a/code/controllers/subsystem/polling.dm +++ b/code/controllers/subsystem/polling.dm @@ -36,7 +36,7 @@ SUBSYSTEM_DEF(polling) * * 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. + * Returns a list of all mobs who signed up for the poll, OR, in the case that amount_to_pick is equal to 1 the singular mob/null if no available candidates. */ /datum/controller/subsystem/polling/proc/poll_candidates( question, @@ -155,7 +155,7 @@ SUBSYSTEM_DEF(polling) 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') + SEND_SOUND(candidate_mob, 'sound/announcer/notice/notice2.ogg') var/surrounding_icon if(chat_text_border_icon) var/image/surrounding_image @@ -173,27 +173,16 @@ SUBSYSTEM_DEF(polling) // Sleep until the time is up UNTIL(new_poll.finished) - if(!(amount_to_pick > 0)) + if(!amount_to_pick) return new_poll.signed_up - if(length(new_poll.signed_up) < amount_to_pick) - return new_poll.signed_up - if(length(new_poll.signed_up) < amount_to_pick) - return new_poll.signed_up - - //BUBBERSTATION CHANGE START: ANTAG TICKETS INTEGRATION - var/list/candidate_tickets = candidates_to_tickets(new_poll.signed_up) - for(var/pick in 1 to amount_to_pick) - if(!length(candidate_tickets)) - continue - var/mob/chosen_mob = pick_weight(candidate_tickets) - candidate_tickets -= chosen_mob - new_poll.chosen_candidates += chosen_mob - /* + if (!length(new_poll.signed_up)) + return null for(var/pick in 1 to amount_to_pick) + // There may be less people signed up than amount_to_pick + // pick_n_take returns the default return value of null if passed an empty list, so just break in that case rather than adding null to the list. + if(!length(new_poll.signed_up)) + break new_poll.chosen_candidates += pick_n_take(new_poll.signed_up) - */ - //BUBBERSTATION CHANGE END: ANTAG TICKETS INTEGRATION - if(announce_chosen) new_poll.announce_chosen(group) if(new_poll.chosen_candidates.len == 1) diff --git a/code/controllers/subsystem/processing/fishing.dm b/code/controllers/subsystem/processing/fishing.dm index a81ff0dec67..0e8c126fe93 100644 --- a/code/controllers/subsystem/processing/fishing.dm +++ b/code/controllers/subsystem/processing/fishing.dm @@ -13,10 +13,38 @@ PROCESSING_SUBSYSTEM_DEF(fishing) fish_properties = list() for(var/fish_type in subtypesof(/obj/item/fish)) var/obj/item/fish/fish = new fish_type(null, FALSE) - fish_properties[fish_type] = list() - fish_properties[fish_type][FISH_PROPERTIES_FAV_BAIT] = fish.favorite_bait.Copy() - fish_properties[fish_type][FISH_PROPERTIES_BAD_BAIT] = fish.disliked_bait.Copy() - fish_properties[fish_type][FISH_PROPERTIES_TRAITS] = fish.fish_traits.Copy() + var/list/properties = list() + fish_properties[fish_type] = properties + properties[FISH_PROPERTIES_FAV_BAIT] = fish.favorite_bait.Copy() + properties[FISH_PROPERTIES_BAD_BAIT] = fish.disliked_bait.Copy() + properties[FISH_PROPERTIES_TRAITS] = fish.fish_traits.Copy() + + var/list/evo_types = fish.evolution_types?.Copy() + properties[FISH_PROPERTIES_EVOLUTIONS] = evo_types + for(var/type in evo_types) + LAZYADD(GLOB.fishes_by_fish_evolution[type], fish_type) + + var/beauty_score = "???" + switch(fish.beauty) + if(-INFINITY to FISH_BEAUTY_DISGUSTING) + beauty_score = "OH HELL NAW!" + if(FISH_BEAUTY_DISGUSTING to FISH_BEAUTY_UGLY) + beauty_score = "☆☆☆☆☆" + if(FISH_BEAUTY_UGLY to FISH_BEAUTY_BAD) + beauty_score = "★☆☆☆☆" + if(FISH_BEAUTY_BAD to FISH_BEAUTY_NULL) + beauty_score = "★★☆☆☆" + if(FISH_BEAUTY_NULL to FISH_BEAUTY_GENERIC) + beauty_score = "★★★☆☆" + if(FISH_BEAUTY_GENERIC to FISH_BEAUTY_GOOD) + beauty_score = "★★★★☆" + if(FISH_BEAUTY_GOOD to FISH_BEAUTY_GREAT) + beauty_score = "★★★★★" + if(FISH_BEAUTY_GREAT to INFINITY) + beauty_score = "★★★★★★" + + properties[FISH_PROPERTIES_BEAUTY_SCORE] = beauty_score + qdel(fish) ///init the list of things lures can catch diff --git a/code/controllers/subsystem/processing/manufacturing.dm b/code/controllers/subsystem/processing/manufacturing.dm new file mode 100644 index 00000000000..8bc9c6af5d5 --- /dev/null +++ b/code/controllers/subsystem/processing/manufacturing.dm @@ -0,0 +1,4 @@ +PROCESSING_SUBSYSTEM_DEF(manufacturing) + name = "Manufacturing Processing" + wait = 1 SECONDS + stat_tag = "MN" diff --git a/code/controllers/subsystem/processing/station.dm b/code/controllers/subsystem/processing/station.dm index 064f1446bf9..38f807852b0 100644 --- a/code/controllers/subsystem/processing/station.dm +++ b/code/controllers/subsystem/processing/station.dm @@ -164,6 +164,8 @@ PROCESSING_SUBSYSTEM_DEF(station) ///Creates a given trait of a specific type, while also removing any blacklisted ones from the future pool. /datum/controller/subsystem/processing/station/proc/setup_trait(datum/station_trait/trait_type) + if(locate(trait_type) in station_traits) + return var/datum/station_trait/trait_instance = new trait_type() station_traits += trait_instance log_game("Station Trait: [trait_instance.name] chosen for this round.") @@ -180,6 +182,5 @@ PROCESSING_SUBSYSTEM_DEF(station) var/datum/hud/new_player/observer_hud = player.hud_used if (!istype(observer_hud)) continue - observer_hud.add_station_trait_buttons() - observer_hud.show_hud(observer_hud.hud_version) + observer_hud.show_station_trait_buttons() */ diff --git a/code/controllers/subsystem/shuttle.dm b/code/controllers/subsystem/shuttle.dm index d0fef0291cf..19248f83c0c 100644 --- a/code/controllers/subsystem/shuttle.dm +++ b/code/controllers/subsystem/shuttle.dm @@ -140,6 +140,9 @@ SUBSYSTEM_DEF(shuttle) /// Did the supermatter start a cascade event? var/supermatter_cascade = FALSE + /// List of express consoles that are waiting for pack initialization + var/list/obj/machinery/computer/cargo/express/express_consoles = list() + /datum/controller/subsystem/shuttle/Initialize() order_number = rand(1, 9000) @@ -177,6 +180,9 @@ SUBSYSTEM_DEF(shuttle) supply_packs[pack.id] = pack + for (var/obj/machinery/computer/cargo/express/console as anything in express_consoles) + console.packin_up(TRUE) + setup_shuttles(stationary_docking_ports) has_purchase_shuttle_access = init_has_purchase_shuttle_access() @@ -540,7 +546,7 @@ SUBSYSTEM_DEF(shuttle) priority_announce( text = "Departure has been postponed indefinitely pending conflict resolution.", title = "Hostile Environment Detected", - sound = 'sound/misc/notice1.ogg', + sound = 'sound/announcer/notice/notice1.ogg', sender_override = "Emergency Shuttle Uplink Alert", color_override = "grey", ) @@ -550,7 +556,7 @@ SUBSYSTEM_DEF(shuttle) priority_announce( text = "You have [DisplayTimeText(emergency_dock_time)] to board the emergency shuttle.", title = "Hostile Environment Resolved", - sound = 'sound/misc/announce_dig.ogg', + sound = 'sound/announcer/announcement/announce_dig.ogg', sender_override = "Emergency Shuttle Uplink Alert", color_override = "green", ) diff --git a/code/controllers/subsystem/statpanel.dm b/code/controllers/subsystem/statpanel.dm index 4daf107083f..490099fb143 100644 --- a/code/controllers/subsystem/statpanel.dm +++ b/code/controllers/subsystem/statpanel.dm @@ -22,10 +22,10 @@ SUBSYSTEM_DEF(statpanels) /datum/controller/subsystem/statpanels/fire(resumed = FALSE) if (!resumed) num_fires++ - var/datum/map_config/cached = SSmapping.next_map_config + var/datum/map_config/cached = SSmap_vote.next_map_config /* SKYRAT EDIT CHANGE global_data = list( - "Map: [SSmapping.config?.map_name || "Loading..."]", + "Map: [SSmapping.current_map?.map_name || "Loading..."]", cached ? "Next Map: [cached.map_name]" : null, "Round ID: [GLOB.round_id ? GLOB.round_id : "NULL"]", "Server Time: [time2text(world.timeofday, "YYYY-MM-DD hh:mm:ss")]", diff --git a/code/controllers/subsystem/throwing.dm b/code/controllers/subsystem/throwing.dm index fc0375f4f0b..da403db9e45 100644 --- a/code/controllers/subsystem/throwing.dm +++ b/code/controllers/subsystem/throwing.dm @@ -202,6 +202,11 @@ SUBSYSTEM_DEF(throwing) if(!thrownthing) return thrownthing.throwing = null + var/drift_force = speed + if (isitem(thrownthing)) + var/obj/item/thrownitem = thrownthing + drift_force *= WEIGHT_TO_NEWTONS(thrownitem.w_class) + if (!hit) for (var/atom/movable/obstacle as anything in get_turf(thrownthing)) //looking for our target on the turf we land on. if (obstacle == target) @@ -214,9 +219,9 @@ SUBSYSTEM_DEF(throwing) thrownthing.throw_impact(get_turf(thrownthing), src) // we haven't hit something yet and we still must, let's hit the ground. if(QDELETED(thrownthing)) //throw_impact can delete things, such as glasses smashing return //deletion should already be handled by on_thrownthing_qdel() - thrownthing.newtonian_move(init_dir) + thrownthing.newtonian_move(delta_to_angle(dist_x, dist_y), drift_force = drift_force) else - thrownthing.newtonian_move(init_dir) + thrownthing.newtonian_move(delta_to_angle(dist_x, dist_y), drift_force = drift_force) if(target) thrownthing.throw_impact(target, src) diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 648ef2935a8..0e098e3814b 100644 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -97,12 +97,12 @@ SUBSYSTEM_DEF(ticker) switch(L.len) if(3) //rare+MAP+sound.ogg or MAP+rare.sound.ogg -- Rare Map-specific sounds if(use_rare_music) - if(L[1] == "rare" && L[2] == SSmapping.config.map_name) + if(L[1] == "rare" && L[2] == SSmapping.current_map.map_name) music += S - else if(L[2] == "rare" && L[1] == SSmapping.config.map_name) + else if(L[2] == "rare" && L[1] == SSmapping.current_map.map_name) music += S if(2) //rare+sound.ogg or MAP+sound.ogg -- Rare sounds or Map-specific sounds - if((use_rare_music && L[1] == "rare") || (L[1] == SSmapping.config.map_name)) + if((use_rare_music && L[1] == "rare") || (L[1] == SSmapping.current_map.map_name)) music += S if(1) //sound.ogg -- common sound if(L[1] == "exclude") @@ -166,7 +166,7 @@ SUBSYSTEM_DEF(ticker) */ // SKYRAT EDIT START - DISCORD SPAM PREVENTION if(!discord_alerted) discord_alerted = TRUE - send2chat(new /datum/tgs_message_content("<@&[CONFIG_GET(string/game_alert_role_id)]> Round **[GLOB.round_id]** starting on [SSmapping.config.map_name], [CONFIG_GET(string/servername)]! \nIf you wish to be pinged for game related stuff, go to <#[CONFIG_GET(string/role_assign_channel_id)]> and assign yourself the roles."), CONFIG_GET(string/channel_announce_new_game)) // SKYRAT EDIT - Role ping and round ID in game-alert + send2chat(new /datum/tgs_message_content("<@&[CONFIG_GET(string/game_alert_role_id)]> Round **[GLOB.round_id]** starting on [SSmapping.current_map.map_name], [CONFIG_GET(string/servername)]! \nIf you wish to be pinged for game related stuff, go to <#[CONFIG_GET(string/role_assign_channel_id)]> and assign yourself the roles."), CONFIG_GET(string/channel_announce_new_game)) // SKYRAT EDIT - Role ping and round ID in game-alert // SKYRAT EDIT END current_state = GAME_STATE_PREGAME SSvote.initiate_vote(/datum/vote/storyteller, "Storyteller Vote", forced = TRUE) // BUBBER EDIT ADDITION @@ -226,7 +226,6 @@ SUBSYSTEM_DEF(ticker) toggle_ooc(TRUE) // Turn it on toggle_dooc(TRUE) declare_completion(force_ending) - check_maprotate() Master.SetRunLevel(RUNLEVEL_POSTGAME) /// Checks if the round should be ending, called every ticker tick @@ -256,14 +255,14 @@ SUBSYSTEM_DEF(ticker) CHECK_TICK SEND_GLOBAL_SIGNAL(COMSIG_GLOB_PRE_JOBS_ASSIGNED, src) - can_continue = can_continue && SSjob.DivideOccupations() //Distribute jobs + can_continue = can_continue && SSjob.divide_occupations() //Distribute jobs CHECK_TICK if(!GLOB.Debug2) if(!can_continue) log_game("Game failed pre_setup") to_chat(world, "Error setting up game. Reverting to pre-game lobby.") - SSjob.ResetOccupations() + SSjob.reset_occupations() return FALSE else message_admins(span_notice("DEBUG: Bypassing prestart checks...")) @@ -446,7 +445,7 @@ SUBSYSTEM_DEF(ticker) continue var/datum/job/player_assigned_role = new_player_living.mind.assigned_role if(player_assigned_role.job_flags & JOB_EQUIP_RANK) - SSjob.EquipRank(new_player_living, player_assigned_role, new_player_mob.client) + SSjob.equip_rank(new_player_living, player_assigned_role, new_player_mob.client) player_assigned_role.after_roundstart_spawn(new_player_living, new_player_mob.client) if(picked_spare_id_candidate == new_player_mob) captainless = FALSE @@ -519,7 +518,7 @@ SUBSYSTEM_DEF(ticker) list_clear_nulls(queued_players) for (var/mob/dead/new_player/new_player in queued_players) to_chat(new_player, span_userdanger("The alive players limit has been released!
[html_encode(">>Join Game<<")]")) - SEND_SOUND(new_player, sound('sound/misc/notice1.ogg')) + SEND_SOUND(new_player, sound('sound/announcer/notice/notice1.ogg')) GLOB.latejoin_menu.ui_interact(new_player) queued_players.len = 0 queue_delay = 0 @@ -534,7 +533,7 @@ SUBSYSTEM_DEF(ticker) if(living_player_count() < hard_popcap) if(next_in_line?.client) to_chat(next_in_line, span_userdanger("A slot has opened! You have approximately 20 seconds to join. \>\>Join Game\<\<")) - SEND_SOUND(next_in_line, sound('sound/misc/notice1.ogg')) + SEND_SOUND(next_in_line, sound('sound/announcer/notice/notice1.ogg')) next_in_line.ui_interact(next_in_line) return queued_players -= next_in_line //Client disconnected, remove he @@ -544,13 +543,6 @@ SUBSYSTEM_DEF(ticker) queued_players -= next_in_line queue_delay = 0 -/datum/controller/subsystem/ticker/proc/check_maprotate() - if(!CONFIG_GET(flag/maprotation)) - return - if(world.time - SSticker.round_start_time < 10 MINUTES) //Not forcing map rotation for very short rounds. - return - INVOKE_ASYNC(SSmapping, TYPE_PROC_REF(/datum/controller/subsystem/mapping/, maprotate)) - /datum/controller/subsystem/ticker/proc/HasRoundStarted() return current_state >= GAME_STATE_PLAYING diff --git a/code/controllers/subsystem/time_track.dm b/code/controllers/subsystem/time_track.dm index b3a4fe7e869..4c706fdaf6d 100644 --- a/code/controllers/subsystem/time_track.dm +++ b/code/controllers/subsystem/time_track.dm @@ -42,7 +42,7 @@ SUBSYSTEM_DEF(time_track) ) /datum/controller/subsystem/time_track/Initialize() - GLOB.perf_log = "[GLOB.log_directory]/perf-[GLOB.round_id ? GLOB.round_id : "NULL"]-[SSmapping.config?.map_name].csv" + GLOB.perf_log = "[GLOB.log_directory]/perf-[GLOB.round_id ? GLOB.round_id : "NULL"]-[SSmapping.current_map.map_name].csv" world.Profile(PROFILE_RESTART, type = "sendmaps") //Need to do the sendmaps stuff in its own file, since it works different then everything else var/list/sendmaps_headers = list() diff --git a/code/controllers/subsystem/title.dm b/code/controllers/subsystem/title.dm index d3d2bef8c97..9f468c6a1d0 100644 --- a/code/controllers/subsystem/title.dm +++ b/code/controllers/subsystem/title.dm @@ -26,7 +26,7 @@ SUBSYSTEM_DEF(title) for(var/S in provisional_title_screens) var/list/L = splittext(S,"+") - if((L.len == 1 && (L[1] != "exclude" && L[1] != "blank.png")) || (L.len > 1 && ((use_rare_screens && LOWER_TEXT(L[1]) == "rare") || (LOWER_TEXT(L[1]) == LOWER_TEXT(SSmapping.config.map_name))))) + if((L.len == 1 && (L[1] != "exclude" && L[1] != "blank.png")) || (L.len > 1 && ((use_rare_screens && LOWER_TEXT(L[1]) == "rare") || (LOWER_TEXT(L[1]) == LOWER_TEXT(SSmapping.current_map.map_name))))) title_screens += S if(length(title_screens)) diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm index 38e3ed7a812..6516f5705a1 100644 --- a/code/controllers/subsystem/vote.dm +++ b/code/controllers/subsystem/vote.dm @@ -101,24 +101,28 @@ SUBSYSTEM_DEF(vote) // stringify the winners to prevent potential unimplemented serialization errors. // Perhaps this can be removed in the future and we assert that vote choices must implement serialization. - var/final_winner_string = final_winner && "[final_winner]" + var/final_winner_string = (final_winner && "[final_winner]") || "NO WINNER" var/list/winners_string = list() - for(var/winner in winners) - winners_string += "[winner]" + + if(length(winners)) + for(var/winner in winners) + winners_string += "[winner]" + else + winners_string = list("NO WINNER") var/list/vote_log_data = list( + "type" = "[current_vote.type]", "choices" = vote_choice_data, "total" = total_votes, "winners" = winners_string, "final_winner" = final_winner_string, ) - var/log_string = replacetext(to_display, "\n", "\\n") // 'keep' the newlines, but dont actually print them as newlines - log_vote(log_string, vote_log_data) - to_chat(world, span_infoplain(vote_font("\n[to_display]"))) + log_vote("vote finalized", vote_log_data) + if(to_display) + to_chat(world, span_infoplain(vote_font("\n[to_display]"))) // Finally, doing any effects on vote completion - if (final_winner) // if no one voted, or the vote cannot be won, final_winner will be null - current_vote.finalize_vote(final_winner) + current_vote.finalize_vote(final_winner) /** * One selection per person, and the selection with the most votes wins. diff --git a/code/datums/actions/action.dm b/code/datums/actions/action.dm index 39e69ba9fa8..2f297f480ae 100644 --- a/code/datums/actions/action.dm +++ b/code/datums/actions/action.dm @@ -52,6 +52,8 @@ /// Toggles whether this action is usable or not var/action_disabled = FALSE + /// Can this action be shared with our rider? + var/can_be_shared = TRUE /datum/action/New(Target) link_to(Target) @@ -112,7 +114,8 @@ RegisterSignal(owner, COMSIG_LIVING_SET_BODY_POSITION, PROC_REF(update_status_on_signal)) if(check_flags & AB_CHECK_PHASED) RegisterSignals(owner, list(SIGNAL_ADDTRAIT(TRAIT_MAGICALLY_PHASED), SIGNAL_REMOVETRAIT(TRAIT_MAGICALLY_PHASED)), PROC_REF(update_status_on_signal)) - + if(check_flags & AB_CHECK_OPEN_TURF) + RegisterSignal(owner, COMSIG_MOVABLE_MOVED, PROC_REF(update_status_on_signal)) if(owner_has_control) RegisterSignal(grant_to, COMSIG_MOB_KEYDOWN, PROC_REF(keydown), override = TRUE) GiveAction(grant_to) @@ -139,6 +142,7 @@ UnregisterSignal(owner, list( COMSIG_LIVING_SET_BODY_POSITION, COMSIG_MOB_STATCHANGE, + COMSIG_MOVABLE_MOVED, SIGNAL_ADDTRAIT(TRAIT_HANDS_BLOCKED), SIGNAL_ADDTRAIT(TRAIT_IMMOBILIZED), SIGNAL_ADDTRAIT(TRAIT_INCAPACITATED), @@ -198,6 +202,10 @@ if (feedback) owner.balloon_alert(owner, "incorporeal!") return FALSE + if((check_flags & AB_CHECK_OPEN_TURF) && !isopenturf(owner.loc)) + if (feedback) + owner.balloon_alert(owner, "not enough space!") + return FALSE return TRUE /// Builds / updates all buttons we have shared or given out diff --git a/code/datums/actions/mobs/blood_warp.dm b/code/datums/actions/mobs/blood_warp.dm index 1e48c6e5aa4..d65c941f5df 100644 --- a/code/datums/actions/mobs/blood_warp.dm +++ b/code/datums/actions/mobs/blood_warp.dm @@ -57,11 +57,11 @@ shuffle_inplace(pools) found_bloodpool = pick(pools) if(found_bloodpool) - owner.visible_message("[owner] sinks into the blood...") - playsound(owner_turf, 'sound/magic/enter_blood.ogg', 100, TRUE, -1) + owner.visible_message(span_danger("[owner] sinks into the blood...")) + playsound(owner_turf, 'sound/effects/magic/enter_blood.ogg', 100, TRUE, -1) owner.forceMove(get_turf(found_bloodpool)) - playsound(get_turf(owner), 'sound/magic/exit_blood.ogg', 100, TRUE, -1) - owner.visible_message("And springs back out!") + playsound(get_turf(owner), 'sound/effects/magic/exit_blood.ogg', 100, TRUE, -1) + owner.visible_message(span_danger("And springs back out!")) SEND_SIGNAL(owner, COMSIG_BLOOD_WARP) return TRUE return FALSE diff --git a/code/datums/actions/mobs/chase_target.dm b/code/datums/actions/mobs/chase_target.dm index c88285dd636..c64293a863b 100644 --- a/code/datums/actions/mobs/chase_target.dm +++ b/code/datums/actions/mobs/chase_target.dm @@ -31,7 +31,7 @@ /// This is the proc that actually does the throwing. Charge only adds a timer for this. /datum/action/cooldown/mob_cooldown/chase_target/proc/throw_thyself() - playsound(owner, 'sound/weapons/sonic_jackhammer.ogg', 50, TRUE) + playsound(owner, 'sound/items/weapons/sonic_jackhammer.ogg', 50, TRUE) owner.throw_at(target, 7, 1.1, owner, FALSE, FALSE, CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(playsound), owner, 'sound/effects/meteorimpact.ogg', 50 * size, TRUE, 2), INFINITY) /// Resets the charge buffs. diff --git a/code/datums/actions/mobs/create_legion_turrets.dm b/code/datums/actions/mobs/create_legion_turrets.dm index 5fb668ebc36..71427893f43 100644 --- a/code/datums/actions/mobs/create_legion_turrets.dm +++ b/code/datums/actions/mobs/create_legion_turrets.dm @@ -18,7 +18,7 @@ /// Creates new legion turrets around the owner between the minimum and maximum /datum/action/cooldown/mob_cooldown/create_legion_turrets/proc/create(atom/target) - playsound(owner, 'sound/magic/RATTLEMEBONES.ogg', 100, TRUE) + playsound(owner, 'sound/effects/magic/RATTLEMEBONES.ogg', 100, TRUE) var/list/possible_locations = list() for(var/turf/checked_turf in oview(owner, 4)) //Only place the turrets on open turfs if(checked_turf.is_blocked_turf()) @@ -80,7 +80,7 @@ var/angle = get_angle(our_turf, target_turf) var/datum/point/vector/V = new(our_turf.x, our_turf.y, our_turf.z, 0, 0, angle) generate_tracer_between_points(V, V.return_vector_after_increments(6), /obj/effect/projectile/tracer/legion/tracer, 0, shot_delay, 0, 0, 0, null) - playsound(src, 'sound/machines/airlockopen.ogg', 100, TRUE) + playsound(src, 'sound/machines/airlock/airlockopen.ogg', 100, TRUE) addtimer(CALLBACK(src, PROC_REF(fire_beam), angle), shot_delay) /// Called shot_delay after the turret shot the tracer. Shoots a projectile into the same direction. @@ -88,13 +88,13 @@ var/obj/projectile/ouchie = new projectile_type(loc) ouchie.firer = src ouchie.fire(angle) - playsound(src, 'sound/effects/bin_close.ogg', 100, TRUE) + playsound(src, 'sound/effects/bin/bin_close.ogg', 100, TRUE) QDEL_IN(src, 0.5 SECONDS) /// Used for the legion turret. /obj/projectile/beam/legion name = "blood pulse" - hitsound = 'sound/magic/magic_missile.ogg' + hitsound = 'sound/effects/magic/magic_missile.ogg' damage = 19 range = 6 light_color = COLOR_SOFT_RED diff --git a/code/datums/actions/mobs/dash.dm b/code/datums/actions/mobs/dash.dm index 81d6f8165d9..ad87ab93f9a 100644 --- a/code/datums/actions/mobs/dash.dm +++ b/code/datums/actions/mobs/dash.dm @@ -52,11 +52,11 @@ new /obj/effect/temp_visual/small_smoke/halfsecond(step_forward_turf) var/obj/effect/temp_visual/decoy/fading/halfsecond/D = new (own_turf, owner) owner.forceMove(step_back_turf) - playsound(own_turf, 'sound/weapons/punchmiss.ogg', 40, TRUE, -1) + playsound(own_turf, 'sound/items/weapons/punchmiss.ogg', 40, TRUE, -1) owner.alpha = 0 animate(owner, alpha = 255, time = 5) SLEEP_CHECK_DEATH(0.2 SECONDS, owner) D.forceMove(step_forward_turf) owner.forceMove(target_turf) - playsound(target_turf, 'sound/weapons/punchmiss.ogg', 40, TRUE, -1) + playsound(target_turf, 'sound/items/weapons/punchmiss.ogg', 40, TRUE, -1) SLEEP_CHECK_DEATH(0.1 SECONDS, owner) diff --git a/code/datums/actions/mobs/fire_breath.dm b/code/datums/actions/mobs/fire_breath.dm index e52fa14d0d9..11ad04fa0df 100644 --- a/code/datums/actions/mobs/fire_breath.dm +++ b/code/datums/actions/mobs/fire_breath.dm @@ -7,7 +7,7 @@ /// The range of the fire var/fire_range = 15 /// The sound played when you use this ability - var/fire_sound = 'sound/magic/fireball.ogg' + var/fire_sound = 'sound/effects/magic/fireball.ogg' /// Time to wait between spawning each fire turf var/fire_delay = 1.5 DECISECONDS /// How hot is our fire diff --git a/code/datums/actions/mobs/lava_swoop.dm b/code/datums/actions/mobs/lava_swoop.dm index aa512b2d28e..2b07734b4a8 100644 --- a/code/datums/actions/mobs/lava_swoop.dm +++ b/code/datums/actions/mobs/lava_swoop.dm @@ -39,7 +39,7 @@ return // stop swooped target movement swooping = TRUE - ADD_TRAIT(owner, TRAIT_UNDENSE, SWOOPING_TRAIT) + owner.add_traits(list(TRAIT_GODMODE, TRAIT_UNDENSE), SWOOPING_TRAIT) owner.visible_message(span_boldwarning("[owner] swoops up high!")) var/negative @@ -66,7 +66,6 @@ animate(owner, alpha = 255, transform = oldtransform, time = 0, flags = ANIMATION_END_NOW) //reset immediately return animate(owner, alpha = 100, transform = matrix()*0.7, time = 7) - owner.status_flags |= GODMODE SEND_SIGNAL(owner, COMSIG_SWOOP_INVULNERABILITY_STARTED) owner.mouse_opacity = MOUSE_OPACITY_TRANSPARENT @@ -112,12 +111,11 @@ for(var/mob/observer in range(7, owner)) shake_camera(observer, 15, 1) - REMOVE_TRAIT(owner, TRAIT_UNDENSE, SWOOPING_TRAIT) + owner.remove_traits(list(TRAIT_GODMODE, TRAIT_UNDENSE), SWOOPING_TRAIT) SLEEP_CHECK_DEATH(1, owner) swooping = FALSE if(!lava_success) SEND_SIGNAL(owner, COMSIG_LAVA_ARENA_FAILED) - owner.status_flags &= ~GODMODE /datum/action/cooldown/mob_cooldown/lava_swoop/proc/lava_pools(atom/target, amount = 30, delay = 0.8) if(!target) diff --git a/code/datums/actions/mobs/personality_commune.dm b/code/datums/actions/mobs/personality_commune.dm index 26cf4834492..8481d451fb1 100644 --- a/code/datums/actions/mobs/personality_commune.dm +++ b/code/datums/actions/mobs/personality_commune.dm @@ -31,7 +31,7 @@ var/mob/living/split_personality/non_controller = usr var/client/non_controller_client = non_controller.client - var/to_send = tgui_input_text(non_controller, "What would you like to tell your other self?", "Commune") + var/to_send = tgui_input_text(non_controller, "What would you like to tell your other self?", "Commune", max_length = MAX_MESSAGE_LEN) if(QDELETED(src) || QDELETED(trauma) || !to_send) return FALSE diff --git a/code/datums/actions/mobs/projectileattack.dm b/code/datums/actions/mobs/projectileattack.dm index d8f8e6bdf64..933f94d0025 100644 --- a/code/datums/actions/mobs/projectileattack.dm +++ b/code/datums/actions/mobs/projectileattack.dm @@ -126,7 +126,7 @@ desc = "Fires projectiles in a spiral pattern." cooldown_time = 3 SECONDS projectile_type = /obj/projectile/colossus - projectile_sound = 'sound/magic/clockwork/invoke_general.ogg' + projectile_sound = 'sound/effects/magic/clockwork/invoke_general.ogg' /// Whether or not the attack is the enraged form var/enraged = FALSE @@ -186,7 +186,7 @@ desc = "Fires projectiles in all directions." cooldown_time = 3 SECONDS projectile_type = /obj/projectile/colossus - projectile_sound = 'sound/magic/clockwork/invoke_general.ogg' + projectile_sound = 'sound/effects/magic/clockwork/invoke_general.ogg' /datum/action/cooldown/mob_cooldown/projectile_attack/random_aoe/attack_sequence(mob/living/firer, atom/target) var/turf/U = get_turf(firer) @@ -208,7 +208,7 @@ desc = "Fires projectiles in a shotgun pattern." cooldown_time = 2 SECONDS projectile_type = /obj/projectile/colossus - projectile_sound = 'sound/magic/clockwork/invoke_general.ogg' + projectile_sound = 'sound/effects/magic/clockwork/invoke_general.ogg' var/list/shot_angles = list(12.5, 7.5, 2.5, -2.5, -7.5, -12.5) /datum/action/cooldown/mob_cooldown/projectile_attack/shotgun_blast/attack_sequence(mob/living/firer, atom/target) @@ -263,7 +263,7 @@ desc = "Fires projectiles in specific directions." cooldown_time = 4 SECONDS projectile_type = /obj/projectile/colossus - projectile_sound = 'sound/magic/clockwork/invoke_general.ogg' + projectile_sound = 'sound/effects/magic/clockwork/invoke_general.ogg' var/list/firing_directions /datum/action/cooldown/mob_cooldown/projectile_attack/dir_shots/New(Target) @@ -308,7 +308,7 @@ desc = "Fires a kinetic accelerator projectile at the target." cooldown_time = 1.5 SECONDS projectile_type = /obj/projectile/kinetic/miner - projectile_sound = 'sound/weapons/kinetic_accel.ogg' + projectile_sound = 'sound/items/weapons/kinetic_accel.ogg' /datum/action/cooldown/mob_cooldown/projectile_attack/kinetic_accelerator/Activate(atom/target_atom) . = ..() diff --git a/code/datums/ai/_ai_controller.dm b/code/datums/ai/_ai_controller.dm index 76e87bc14f3..16c05d21b79 100644 --- a/code/datums/ai/_ai_controller.dm +++ b/code/datums/ai/_ai_controller.dm @@ -341,6 +341,10 @@ multiple modular subtrees with behaviors ///Runs any actions that are currently running /datum/ai_controller/process(seconds_per_tick) + if(!length(current_behaviors) && idle_behavior) + idle_behavior.perform_idle_behavior(seconds_per_tick, src) //Do some stupid shit while we have nothing to do + return + if(current_movement_target) if(!isatom(current_movement_target)) stack_trace("[pawn]'s current movement target is not an atom, rather a [current_movement_target.type]! Did you accidentally set it to a weakref?") @@ -472,7 +476,6 @@ multiple modular subtrees with behaviors if(!behavior.setup(arglist(arguments))) return - var/should_exit_unplanned = !length(current_behaviors) planned_behaviors[behavior] = TRUE current_behaviors[behavior] = TRUE @@ -485,9 +488,6 @@ multiple modular subtrees with behaviors if(!(behavior.behavior_flags & AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION)) //this one blocks planning! able_to_plan = FALSE - if(should_exit_unplanned) - exit_unplanned_mode() - SEND_SIGNAL(src, AI_CONTROLLER_BEHAVIOR_QUEUED(behavior_type), arguments) /datum/ai_controller/proc/check_able_to_plan() @@ -499,16 +499,6 @@ multiple modular subtrees with behaviors /datum/ai_controller/proc/dequeue_behavior(datum/ai_behavior/behavior) current_behaviors -= behavior able_to_plan = check_able_to_plan() - if(!length(current_behaviors)) - enter_unplanned_mode() - -/datum/ai_controller/proc/exit_unplanned_mode() - remove_from_unplanned_controllers() - start_ai_processing() - -/datum/ai_controller/proc/enter_unplanned_mode() - add_to_unplanned_controllers() - stop_previous_processing() /datum/ai_controller/proc/ProcessBehavior(seconds_per_tick, datum/ai_behavior/behavior) var/list/arguments = list(seconds_per_tick, src) diff --git a/code/datums/ai/basic_mobs/base_basic_controller.dm b/code/datums/ai/basic_mobs/base_basic_controller.dm index a14630fa0e8..f21d31b0500 100644 --- a/code/datums/ai/basic_mobs/base_basic_controller.dm +++ b/code/datums/ai/basic_mobs/base_basic_controller.dm @@ -19,9 +19,12 @@ /datum/ai_controller/basic_controller/setup_able_to_run() . = ..() RegisterSignal(pawn, COMSIG_MOB_INCAPACITATE_CHANGED, PROC_REF(update_able_to_run)) + if(ai_traits & PAUSE_DURING_DO_AFTER) + RegisterSignals(pawn, list(COMSIG_DO_AFTER_BEGAN, COMSIG_DO_AFTER_ENDED), PROC_REF(update_able_to_run)) + /datum/ai_controller/basic_controller/clear_able_to_run() - UnregisterSignal(pawn, list(COMSIG_MOB_INCAPACITATE_CHANGED, COMSIG_MOB_STATCHANGE)) + UnregisterSignal(pawn, list(COMSIG_MOB_INCAPACITATE_CHANGED, COMSIG_MOB_STATCHANGE, COMSIG_DO_AFTER_BEGAN, COMSIG_DO_AFTER_ENDED)) return ..() /datum/ai_controller/basic_controller/get_able_to_run() diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/emote_with_target.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/emote_with_target.dm index 8f4483d4daf..7960301d704 100644 --- a/code/datums/ai/basic_mobs/basic_ai_behaviors/emote_with_target.dm +++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/emote_with_target.dm @@ -14,7 +14,7 @@ var/atom/target = controller.blackboard[target_key] if(!length(emote_list) || isnull(target)) return AI_BEHAVIOR_FAILED | AI_BEHAVIOR_DELAY - run_emote(controller.pawn, target_key, emote_list) + run_emote(controller.pawn, target, emote_list) return AI_BEHAVIOR_SUCCEEDED | AI_BEHAVIOR_DELAY diff --git a/code/datums/ai/basic_mobs/basic_subtrees/speech_subtree.dm b/code/datums/ai/basic_mobs/basic_subtrees/speech_subtree.dm index 5bd0f840488..7d877731e2b 100644 --- a/code/datums/ai/basic_mobs/basic_subtrees/speech_subtree.dm +++ b/code/datums/ai/basic_mobs/basic_subtrees/speech_subtree.dm @@ -46,7 +46,7 @@ /datum/ai_planning_subtree/random_speech/insect speech_chance = 5 - sound = list('sound/creatures/chitter.ogg') + sound = list('sound/mobs/non-humanoids/insect/chitter.ogg') emote_hear = list("chitters.") /datum/ai_planning_subtree/random_speech/mothroach @@ -56,7 +56,7 @@ /datum/ai_planning_subtree/random_speech/mouse speech_chance = 1 speak = list("Squeak!", "SQUEAK!", "Squeak?") - sound = list('sound/creatures/mousesqueek.ogg') + sound = list('sound/mobs/non-humanoids/mouse/mousesqueek.ogg') emote_hear = list("squeaks.") emote_see = list("runs in a circle.", "shakes.") @@ -72,7 +72,7 @@ /datum/ai_planning_subtree/random_speech/sheep speech_chance = 5 speak = list("baaa","baaaAAAAAH!","baaah") - sound = list('sound/creatures/sheep1.ogg', 'sound/creatures/sheep2.ogg', 'sound/creatures/sheep3.ogg') + sound = list('sound/mobs/non-humanoids/sheep/sheep1.ogg', 'sound/mobs/non-humanoids/sheep/sheep2.ogg', 'sound/mobs/non-humanoids/sheep/sheep3.ogg') emote_hear = list("bleats.") emote_see = list("shakes her head.", "stares into the distance.") @@ -101,21 +101,21 @@ /datum/ai_planning_subtree/random_speech/chicken speech_chance = 15 // really talkative ladies speak = list("Cluck!", "BWAAAAARK BWAK BWAK BWAK!", "Bwaak bwak.") - sound = list('sound/creatures/clucks.ogg', 'sound/creatures/bagawk.ogg') + sound = list('sound/mobs/non-humanoids/chicken/clucks.ogg', 'sound/mobs/non-humanoids/chicken/bagawk.ogg') emote_hear = list("clucks.", "croons.") emote_see = list("pecks at the ground.","flaps her wings viciously.") /datum/ai_planning_subtree/random_speech/chick speech_chance = 4 speak = list("Cherp.", "Cherp?", "Chirrup.", "Cheep!") - sound = list('sound/creatures/chick_peep.ogg') + sound = list('sound/mobs/non-humanoids/chicken/chick_peep.ogg') emote_hear = list("cheeps.") emote_see = list("pecks at the ground.","flaps her tiny wings.") /datum/ai_planning_subtree/random_speech/cow speech_chance = 1 speak = list("moo?","moo","MOOOOOO") - sound = list('sound/creatures/cow.ogg') + sound = list('sound/mobs/non-humanoids/cow/cow.ogg') emote_hear = list("brays.") emote_see = list("shakes her head.") @@ -164,19 +164,19 @@ /datum/ai_planning_subtree/random_speech/pig speech_chance = 3 speak = list("oink?","oink","snurf") - sound = list('sound/creatures/pig1.ogg', 'sound/creatures/pig2.ogg') + sound = list('sound/mobs/non-humanoids/pig/pig1.ogg', 'sound/mobs/non-humanoids/pig/pig2.ogg') emote_hear = list("snorts.") emote_see = list("sniffs around.") /datum/ai_planning_subtree/random_speech/pony speech_chance = 3 - sound = list('sound/creatures/pony/whinny01.ogg', 'sound/creatures/pony/whinny02.ogg', 'sound/creatures/pony/whinny03.ogg') + sound = list('sound/mobs/non-humanoids/pony/whinny01.ogg', 'sound/mobs/non-humanoids/pony/whinny02.ogg', 'sound/mobs/non-humanoids/pony/whinny03.ogg') emote_hear = list("whinnies!") emote_see = list("horses around.") /datum/ai_planning_subtree/random_speech/pony/tamed speech_chance = 3 - sound = list('sound/creatures/pony/snort.ogg') + sound = list('sound/mobs/non-humanoids/pony/snort.ogg') emote_hear = list("snorts.") emote_see = list("snorts.") @@ -188,7 +188,7 @@ /datum/ai_planning_subtree/random_speech/ant speech_chance = 1 speak = list("BZZZZT!", "CHTCHTCHT!", "Bzzz", "ChtChtCht") - sound = list('sound/creatures/chitter.ogg') + sound = list('sound/mobs/non-humanoids/insect/chitter.ogg') emote_hear = list("buzzes.", "clacks.") emote_see = list("shakes their head.", "twitches their antennae.") @@ -200,7 +200,7 @@ /datum/ai_planning_subtree/random_speech/crab speech_chance = 1 - sound = list('sound/creatures/claw_click.ogg') + sound = list('sound/mobs/non-humanoids/crab/claw_click.ogg') emote_hear = list("clicks.") emote_see = list("clacks.") @@ -216,11 +216,9 @@ /datum/ai_planning_subtree/random_speech/cats speech_chance = 10 - speak = list( - "mrawww!", - "meow!", - "maw!", - ) + sound = list(SFX_CAT_MEOW) + emote_hear = list("meows.") + emote_see = list("meows.") /datum/ai_planning_subtree/random_speech/blackboard //literal tower of babel, subtree form speech_chance = 1 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 709acb8d5e8..d552b69c142 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 @@ -25,8 +25,7 @@ if(ismob(the_target)) //Target is in godmode, ignore it. if(living_mob.loc == the_target) return FALSE // We've either been eaten or are shapeshifted, let's assume the latter because we're still alive - var/mob/M = the_target - if(M.status_flags & GODMODE) + if(HAS_TRAIT(the_target, TRAIT_GODMODE)) return FALSE if (vision_range && get_dist(living_mob, the_target) > vision_range) diff --git a/code/datums/ai/dog/dog_behaviors.dm b/code/datums/ai/dog/dog_behaviors.dm index 00a2f789e12..958b1f3d03d 100644 --- a/code/datums/ai/dog/dog_behaviors.dm +++ b/code/datums/ai/dog/dog_behaviors.dm @@ -44,7 +44,7 @@ if(!SPT_PROB(20, seconds_per_tick)) return living_pawn.do_attack_animation(target, ATTACK_EFFECT_DISARM) - playsound(target, 'sound/weapons/thudswoosh.ogg', 50, TRUE, -1) + playsound(target, 'sound/items/weapons/thudswoosh.ogg', 50, TRUE, -1) target.visible_message(span_danger("[living_pawn] paws ineffectually at [target]!"), span_danger("[living_pawn] paws ineffectually at you!")) /// Let them know we mean business @@ -54,4 +54,4 @@ living_pawn.manual_emote("[pick("barks", "growls", "stares")] menacingly at [target]!") if(!SPT_PROB(40, seconds_per_tick)) return - playsound(living_pawn, pick('sound/creatures/dog/growl1.ogg', 'sound/creatures/dog/growl2.ogg'), 50, TRUE, -1) + playsound(living_pawn, pick('sound/mobs/non-humanoids/dog/growl1.ogg', 'sound/mobs/non-humanoids/dog/growl2.ogg'), 50, TRUE, -1) diff --git a/code/datums/ai/movement/_ai_movement.dm b/code/datums/ai/movement/_ai_movement.dm index c1b3aae5bd6..33b7e4e214f 100644 --- a/code/datums/ai/movement/_ai_movement.dm +++ b/code/datums/ai/movement/_ai_movement.dm @@ -11,6 +11,7 @@ controller.consecutive_pathing_attempts = 0 controller.set_blackboard_key(BB_CURRENT_MIN_MOVE_DISTANCE, min_distance) moving_controllers[controller] = current_movement_target + SEND_SIGNAL(controller.pawn, COMSIG_MOB_AI_MOVEMENT_STARTED, current_movement_target) /datum/ai_movement/proc/stop_moving_towards(datum/ai_controller/controller) controller.consecutive_pathing_attempts = 0 diff --git a/code/datums/ai_laws/ai_laws.dm b/code/datums/ai_laws/ai_laws.dm index 0dbc6839430..a0d1d629fc8 100644 --- a/code/datums/ai_laws/ai_laws.dm +++ b/code/datums/ai_laws/ai_laws.dm @@ -192,7 +192,7 @@ 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) + var/datum/job/human_ai_job = SSjob.get_job(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 diff --git a/code/datums/announcers/default_announcer.dm b/code/datums/announcers/default_announcer.dm index c5dc142f818..cb33d68c559 100644 --- a/code/datums/announcers/default_announcer.dm +++ b/code/datums/announcers/default_announcer.dm @@ -1,22 +1,22 @@ /* SKYRAT EDIT REMOVAL /datum/centcom_announcer/default - welcome_sounds = list('sound/ai/default/welcome.ogg') - alert_sounds = list('sound/ai/default/attention.ogg') - command_report_sounds = list('sound/ai/default/commandreport.ogg') - event_sounds = list(ANNOUNCER_AIMALF = 'sound/ai/default/aimalf.ogg', - ANNOUNCER_ALIENS = 'sound/ai/default/aliens.ogg', - ANNOUNCER_ANIMES = 'sound/ai/default/animes.ogg', - ANNOUNCER_GRANOMALIES = 'sound/ai/default/granomalies.ogg', - ANNOUNCER_INTERCEPT = 'sound/ai/default/intercept.ogg', - ANNOUNCER_IONSTORM = 'sound/ai/default/ionstorm.ogg', - ANNOUNCER_METEORS = 'sound/ai/default/meteors.ogg', - ANNOUNCER_OUTBREAK5 = 'sound/ai/default/outbreak5.ogg', - ANNOUNCER_OUTBREAK7 = 'sound/ai/default/outbreak7.ogg', - ANNOUNCER_POWEROFF = 'sound/ai/default/poweroff.ogg', - ANNOUNCER_POWERON = 'sound/ai/default/poweron.ogg', - ANNOUNCER_RADIATION = 'sound/ai/default/radiation.ogg', - ANNOUNCER_SHUTTLECALLED = 'sound/ai/default/shuttlecalled.ogg', - ANNOUNCER_SHUTTLEDOCK = 'sound/ai/default/shuttledock.ogg', - ANNOUNCER_SHUTTLERECALLED = 'sound/ai/default/shuttlerecalled.ogg', - ANNOUNCER_SPANOMALIES = 'sound/ai/default/spanomalies.ogg') + welcome_sounds = list('sound/announcer/default/welcome.ogg') + alert_sounds = list('sound/announcer/default/attention.ogg') + command_report_sounds = list('sound/announcer/default/commandreport.ogg') + event_sounds = list(ANNOUNCER_AIMALF = 'sound/announcer/default/aimalf.ogg', + ANNOUNCER_ALIENS = 'sound/announcer/default/aliens.ogg', + ANNOUNCER_ANIMES = 'sound/announcer/default/animes.ogg', + ANNOUNCER_GRANOMALIES = 'sound/announcer/default/granomalies.ogg', + ANNOUNCER_INTERCEPT = 'sound/announcer/default/intercept.ogg', + ANNOUNCER_IONSTORM = 'sound/announcer/default/ionstorm.ogg', + ANNOUNCER_METEORS = 'sound/announcer/default/meteors.ogg', + ANNOUNCER_OUTBREAK5 = 'sound/announcer/default/outbreak5.ogg', + ANNOUNCER_OUTBREAK7 = 'sound/announcer/default/outbreak7.ogg', + ANNOUNCER_POWEROFF = 'sound/announcer/default/poweroff.ogg', + ANNOUNCER_POWERON = 'sound/announcer/default/poweron.ogg', + ANNOUNCER_RADIATION = 'sound/announcer/default/radiation.ogg', + ANNOUNCER_SHUTTLECALLED = 'sound/announcer/default/shuttlecalled.ogg', + ANNOUNCER_SHUTTLEDOCK = 'sound/announcer/default/shuttledock.ogg', + ANNOUNCER_SHUTTLERECALLED = 'sound/announcer/default/shuttlerecalled.ogg', + ANNOUNCER_SPANOMALIES = 'sound/announcer/default/spanomalies.ogg') */ diff --git a/code/datums/announcers/intern_announcer.dm b/code/datums/announcers/intern_announcer.dm index 5e8544c1871..635508256b7 100644 --- a/code/datums/announcers/intern_announcer.dm +++ b/code/datums/announcers/intern_announcer.dm @@ -1,46 +1,46 @@ /datum/centcom_announcer/intern - welcome_sounds = list('sound/ai/intern/welcome/1.ogg', - 'sound/ai/intern/welcome/2.ogg', - 'sound/ai/intern/welcome/3.ogg', - 'sound/ai/intern/welcome/4.ogg', - 'sound/ai/intern/welcome/5.ogg', - 'sound/ai/intern/welcome/6.ogg') + welcome_sounds = list('sound/announcer/intern/welcome/1.ogg', + 'sound/announcer/intern/welcome/2.ogg', + 'sound/announcer/intern/welcome/3.ogg', + 'sound/announcer/intern/welcome/4.ogg', + 'sound/announcer/intern/welcome/5.ogg', + 'sound/announcer/intern/welcome/6.ogg') - alert_sounds = list('sound/ai/intern/alerts/1.ogg', - 'sound/ai/intern/alerts/2.ogg', - 'sound/ai/intern/alerts/3.ogg', - 'sound/ai/intern/alerts/4.ogg', - 'sound/ai/intern/alerts/5.ogg', - 'sound/ai/intern/alerts/6.ogg', - 'sound/ai/intern/alerts/7.ogg', - 'sound/ai/intern/alerts/8.ogg', - 'sound/ai/intern/alerts/9.ogg', - 'sound/ai/intern/alerts/10.ogg', - 'sound/ai/intern/alerts/11.ogg', - 'sound/ai/intern/alerts/12.ogg', - 'sound/ai/intern/alerts/13.ogg', - 'sound/ai/intern/alerts/14.ogg') + alert_sounds = list('sound/announcer/intern/alerts/1.ogg', + 'sound/announcer/intern/alerts/2.ogg', + 'sound/announcer/intern/alerts/3.ogg', + 'sound/announcer/intern/alerts/4.ogg', + 'sound/announcer/intern/alerts/5.ogg', + 'sound/announcer/intern/alerts/6.ogg', + 'sound/announcer/intern/alerts/7.ogg', + 'sound/announcer/intern/alerts/8.ogg', + 'sound/announcer/intern/alerts/9.ogg', + 'sound/announcer/intern/alerts/10.ogg', + 'sound/announcer/intern/alerts/11.ogg', + 'sound/announcer/intern/alerts/12.ogg', + 'sound/announcer/intern/alerts/13.ogg', + 'sound/announcer/intern/alerts/14.ogg') - command_report_sounds = list('sound/ai/intern/commandreport/1.ogg', - 'sound/ai/intern/commandreport/2.ogg', - 'sound/ai/intern/commandreport/3.ogg') + command_report_sounds = list('sound/announcer/intern/commandreport/1.ogg', + 'sound/announcer/intern/commandreport/2.ogg', + 'sound/announcer/intern/commandreport/3.ogg') - event_sounds = list(ANNOUNCER_AIMALF = 'sound/ai/default/aimalf.ogg', - ANNOUNCER_ALIENS = 'sound/ai/intern/aliens.ogg', - ANNOUNCER_ANIMES = 'sound/ai/intern/animes.ogg', - ANNOUNCER_GRANOMALIES = 'sound/ai/intern/granomalies.ogg', - ANNOUNCER_INTERCEPT = 'sound/ai/intern/intercept.ogg', - ANNOUNCER_IONSTORM = 'sound/ai/intern/ionstorm.ogg', - ANNOUNCER_METEORS = 'sound/ai/intern/meteors.ogg', - ANNOUNCER_OUTBREAK5 = 'sound/ai/intern/outbreak5.ogg', - ANNOUNCER_OUTBREAK7 = 'sound/ai/intern/outbreak7.ogg', - ANNOUNCER_POWEROFF = 'sound/ai/intern/poweroff.ogg', - ANNOUNCER_POWERON = 'sound/ai/intern/poweron.ogg', - ANNOUNCER_RADIATION = 'sound/ai/intern/radiation.ogg', - ANNOUNCER_SHUTTLECALLED = 'sound/ai/intern/shuttlecalled.ogg', - ANNOUNCER_SHUTTLEDOCK = 'sound/ai/intern/shuttledock.ogg', - ANNOUNCER_SHUTTLERECALLED = 'sound/ai/intern/shuttlerecalled.ogg', - ANNOUNCER_SPANOMALIES = 'sound/ai/intern/spanomalies.ogg') + event_sounds = list(ANNOUNCER_AIMALF = 'sound/announcer/default/aimalf.ogg', + ANNOUNCER_ALIENS = 'sound/announcer/intern/aliens.ogg', + ANNOUNCER_ANIMES = 'sound/announcer/intern/animes.ogg', + ANNOUNCER_GRANOMALIES = 'sound/announcer/intern/granomalies.ogg', + ANNOUNCER_INTERCEPT = 'sound/announcer/intern/intercept.ogg', + ANNOUNCER_IONSTORM = 'sound/announcer/intern/ionstorm.ogg', + ANNOUNCER_METEORS = 'sound/announcer/intern/meteors.ogg', + ANNOUNCER_OUTBREAK5 = 'sound/announcer/intern/outbreak5.ogg', + ANNOUNCER_OUTBREAK7 = 'sound/announcer/intern/outbreak7.ogg', + ANNOUNCER_POWEROFF = 'sound/announcer/intern/poweroff.ogg', + ANNOUNCER_POWERON = 'sound/announcer/intern/poweron.ogg', + ANNOUNCER_RADIATION = 'sound/announcer/intern/radiation.ogg', + ANNOUNCER_SHUTTLECALLED = 'sound/announcer/intern/shuttlecalled.ogg', + ANNOUNCER_SHUTTLEDOCK = 'sound/announcer/intern/shuttledock.ogg', + ANNOUNCER_SHUTTLERECALLED = 'sound/announcer/intern/shuttlerecalled.ogg', + ANNOUNCER_SPANOMALIES = 'sound/announcer/intern/spanomalies.ogg') - custom_alert_message = "Please stand by for an important message from our new intern.
" + custom_alert_message = span_alert("Please stand by for an important message from our new intern.
") diff --git a/code/datums/announcers/medbot_announcer.dm b/code/datums/announcers/medbot_announcer.dm index 17e85552213..7269fe85c57 100644 --- a/code/datums/announcers/medbot_announcer.dm +++ b/code/datums/announcers/medbot_announcer.dm @@ -1,21 +1,21 @@ /datum/centcom_announcer/medbot - welcome_sounds = list('sound/ai/medbot/welcome.ogg', - 'sound/ai/medbot/newAI.ogg') - alert_sounds = list('sound/ai/medbot/attention.ogg') - command_report_sounds = list('sound/ai/medbot/commandreport.ogg') - event_sounds = list(ANNOUNCER_AIMALF = 'sound/ai/default/aimalf.ogg', - ANNOUNCER_ALIENS = 'sound/ai/medbot/aliens.ogg', - ANNOUNCER_ANIMES = 'sound/ai/medbot/animes.ogg', - ANNOUNCER_GRANOMALIES = 'sound/ai/medbot/granomalies.ogg', - ANNOUNCER_INTERCEPT = 'sound/ai/medbot/intercept.ogg', - ANNOUNCER_IONSTORM = 'sound/ai/medbot/ionstorm.ogg', - ANNOUNCER_METEORS = 'sound/ai/medbot/meteors.ogg', - ANNOUNCER_OUTBREAK5 = 'sound/ai/medbot/outbreak5.ogg', - ANNOUNCER_OUTBREAK7 = 'sound/ai/medbot/outbreak7.ogg', - ANNOUNCER_POWEROFF = 'sound/ai/medbot/poweroff.ogg', - ANNOUNCER_POWERON = 'sound/ai/medbot/poweron.ogg', - ANNOUNCER_RADIATION = 'sound/ai/medbot/radiation.ogg', - ANNOUNCER_SHUTTLECALLED = 'sound/ai/medbot/shuttlecalled.ogg', - ANNOUNCER_SHUTTLEDOCK = 'sound/ai/medbot/shuttledock.ogg', - ANNOUNCER_SHUTTLERECALLED = 'sound/ai/medbot/shuttlerecalled.ogg', - ANNOUNCER_SPANOMALIES = 'sound/ai/medbot/spanomalies.ogg') + welcome_sounds = list('sound/announcer/medbot/welcome.ogg', + 'sound/announcer/medbot/newAI.ogg') + alert_sounds = list('sound/announcer/medbot/attention.ogg') + command_report_sounds = list('sound/announcer/medbot/commandreport.ogg') + event_sounds = list(ANNOUNCER_AIMALF = 'sound/announcer/default/aimalf.ogg', + ANNOUNCER_ALIENS = 'sound/announcer/medbot/aliens.ogg', + ANNOUNCER_ANIMES = 'sound/announcer/medbot/animes.ogg', + ANNOUNCER_GRANOMALIES = 'sound/announcer/medbot/granomalies.ogg', + ANNOUNCER_INTERCEPT = 'sound/announcer/medbot/intercept.ogg', + ANNOUNCER_IONSTORM = 'sound/announcer/medbot/ionstorm.ogg', + ANNOUNCER_METEORS = 'sound/announcer/medbot/meteors.ogg', + ANNOUNCER_OUTBREAK5 = 'sound/announcer/medbot/outbreak5.ogg', + ANNOUNCER_OUTBREAK7 = 'sound/announcer/medbot/outbreak7.ogg', + ANNOUNCER_POWEROFF = 'sound/announcer/medbot/poweroff.ogg', + ANNOUNCER_POWERON = 'sound/announcer/medbot/poweron.ogg', + ANNOUNCER_RADIATION = 'sound/announcer/medbot/radiation.ogg', + ANNOUNCER_SHUTTLECALLED = 'sound/announcer/medbot/shuttlecalled.ogg', + ANNOUNCER_SHUTTLEDOCK = 'sound/announcer/medbot/shuttledock.ogg', + ANNOUNCER_SHUTTLERECALLED = 'sound/announcer/medbot/shuttlerecalled.ogg', + ANNOUNCER_SPANOMALIES = 'sound/announcer/medbot/spanomalies.ogg') diff --git a/code/datums/beam.dm b/code/datums/beam.dm index fe34b0c7edd..ad27ee5ee3e 100644 --- a/code/datums/beam.dm +++ b/code/datums/beam.dm @@ -122,10 +122,10 @@ /datum/beam/proc/Draw() if(SEND_SIGNAL(src, COMSIG_BEAM_BEFORE_DRAW) & BEAM_CANCEL_DRAW) return - var/origin_px = isnull(override_origin_pixel_x) ? origin.pixel_x : override_origin_pixel_x - var/origin_py = isnull(override_origin_pixel_y) ? origin.pixel_y : override_origin_pixel_y - var/target_px = isnull(override_target_pixel_x) ? target.pixel_x : override_target_pixel_x - var/target_py = isnull(override_target_pixel_y) ? target.pixel_y : override_target_pixel_y + var/origin_px = (isnull(override_origin_pixel_x) ? origin.pixel_x : override_origin_pixel_x) + origin.pixel_w + var/origin_py = (isnull(override_origin_pixel_y) ? origin.pixel_y : override_origin_pixel_y) + origin.pixel_z + var/target_px = (isnull(override_target_pixel_x) ? target.pixel_x : override_target_pixel_x) + target.pixel_w + var/target_py = (isnull(override_target_pixel_y) ? target.pixel_y : override_target_pixel_y) + target.pixel_z var/Angle = get_angle_raw(origin.x, origin.y, origin_px, origin_py, target.x , target.y, target_px, target_py) ///var/Angle = round(get_angle(origin,target)) var/matrix/rot_matrix = matrix() @@ -212,6 +212,9 @@ /obj/effect/ebeam/singularity_act() return +/obj/effect/ebeam/Process_Spacemove(movement_dir, continuous_move) + return TRUE + /// 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 diff --git a/code/datums/brain_damage/creepy_trauma.dm b/code/datums/brain_damage/creepy_trauma.dm index d7526aa7779..941ec5cabf7 100644 --- a/code/datums/brain_damage/creepy_trauma.dm +++ b/code/datums/brain_damage/creepy_trauma.dm @@ -66,7 +66,8 @@ /datum/brain_trauma/special/obsessed/on_lose() ..() - owner.mind.remove_antag_datum(/datum/antagonist/obsessed) + if (owner.mind.remove_antag_datum(/datum/antagonist/obsessed)) + owner.mind.add_antag_datum(/datum/antagonist/former_obsessed) owner.clear_mood_event("creeping") if(obsession) log_game("[key_name(owner)] is no longer obsessed with [key_name(obsession)].") diff --git a/code/datums/brain_damage/imaginary_friend.dm b/code/datums/brain_damage/imaginary_friend.dm index f4c78bc9007..ad60f6cd9a6 100644 --- a/code/datums/brain_damage/imaginary_friend.dm +++ b/code/datums/brain_damage/imaginary_friend.dm @@ -1,3 +1,8 @@ + +#define IMAGINARY_FRIEND_RANGE 9 +#define IMAGINARY_FRIEND_SPEECH_RANGE IMAGINARY_FRIEND_RANGE +#define IMAGINARY_FRIEND_EXTENDED_SPEECH_RANGE 999 + /datum/brain_trauma/special/imaginary_friend name = "Imaginary Friend" desc = "Patient can see and hear an imaginary person." @@ -88,11 +93,15 @@ var/mob/living/owner var/bubble_icon = "default" + /// Whether our host and other imaginary friends can hear us only when nearby or practically anywhere. + var/extended_message_range = TRUE + /mob/camera/imaginary_friend/Login() . = ..() if(!. || !client) return FALSE - greet() + if(owner) + greet() Show() /mob/camera/imaginary_friend/proc/greet() @@ -119,6 +128,7 @@ if(!owner.imaginary_group) owner.imaginary_group = list(owner) owner.imaginary_group += src + greet() /// Copies appearance from passed player prefs, or randomises them if none are provided /mob/camera/imaginary_friend/proc/setup_appearance(datum/preferences/appearance_from_prefs = null) @@ -156,11 +166,11 @@ for(var/job in appearance_from_prefs.job_preferences) var/this_pref = appearance_from_prefs.job_preferences[job] if(this_pref > highest_pref) - appearance_job = SSjob.GetJob(job) + appearance_job = SSjob.get_job(job) highest_pref = this_pref if(!appearance_job) - appearance_job = SSjob.GetJob(JOB_ASSISTANT) + appearance_job = SSjob.get_job(JOB_ASSISTANT) if(istype(appearance_job, /datum/job/ai)) human_image = icon('icons/mob/silicon/ai.dmi', icon_state = resolve_ai_icon(appearance_from_prefs.read_preference(/datum/preference/choiced/ai_core_display)), dir = SOUTH) @@ -212,7 +222,7 @@ create_chat_message(speaker, message_language, raw_message, spans) to_chat(src, compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mods)) -/mob/camera/imaginary_friend/send_speech(message, range = 7, obj/source = src, bubble_type = bubble_icon, list/spans = list(), datum/language/message_language = null, list/message_mods = list(), forced = null) +/mob/camera/imaginary_friend/send_speech(message, range = IMAGINARY_FRIEND_SPEECH_RANGE, obj/source = src, bubble_type = bubble_icon, list/spans = list(), datum/language/message_language = null, list/message_mods = list(), forced = null) message = get_message_mods(message, message_mods) message = capitalize(message) @@ -232,6 +242,9 @@ message = "[randomnote] [capitalize(message)] [randomnote]" spans |= SPAN_SINGING + if(extended_message_range) + range = IMAGINARY_FRIEND_EXTENDED_SPEECH_RANGE + var/eavesdrop_range = 0 if (message_mods[MODE_CUSTOM_SAY_ERASE_INPUT]) @@ -383,7 +396,7 @@ var/obj/visual = image('icons/hud/screen_gen.dmi', our_tile, "arrow", FLY_LAYER) INVOKE_ASYNC(GLOBAL_PROC, GLOBAL_PROC_REF(flick_overlay_global), visual, group_clients(), 2.5 SECONDS) - animate(visual, pixel_x = (tile.x - our_tile.x) * world.icon_size + pointed_atom.pixel_x, pixel_y = (tile.y - our_tile.y) * world.icon_size + pointed_atom.pixel_y, time = 1.7, easing = EASE_OUT) + animate(visual, pixel_x = (tile.x - our_tile.x) * ICON_SIZE_X + pointed_atom.pixel_x, pixel_y = (tile.y - our_tile.y) * ICON_SIZE_Y + pointed_atom.pixel_y, time = 1.7, easing = EASE_OUT) /mob/camera/imaginary_friend/create_thinking_indicator() if(active_thinking_indicator || active_typing_indicator || !HAS_TRAIT(src, TRAIT_THINKING_IN_CHARACTER)) @@ -528,3 +541,7 @@ real_name = "[owner.real_name]?" name = real_name human_image = icon('icons/mob/simple/lavaland/lavaland_monsters.dmi', icon_state = "curseblob") + +#undef IMAGINARY_FRIEND_RANGE +#undef IMAGINARY_FRIEND_SPEECH_RANGE +#undef IMAGINARY_FRIEND_EXTENDED_SPEECH_RANGE diff --git a/code/datums/brain_damage/magic.dm b/code/datums/brain_damage/magic.dm index 441d220a5de..fde1e5d2421 100644 --- a/code/datums/brain_damage/magic.dm +++ b/code/datums/brain_damage/magic.dm @@ -104,14 +104,14 @@ create_stalker() if(get_dist(owner, stalker) <= 1) - playsound(owner, 'sound/magic/demon_attack1.ogg', 50) + playsound(owner, 'sound/effects/magic/demon_attack1.ogg', 50) owner.visible_message(span_warning("[owner] is torn apart by invisible claws!"), span_userdanger("Ghostly claws tear your body apart!")) owner.take_bodypart_damage(rand(20, 45), wound_bonus=CANT_WOUND) else if(SPT_PROB(30, seconds_per_tick)) stalker.forceMove(get_step_towards(stalker, owner)) if(get_dist(owner, stalker) <= 8) if(!close_stalker) - var/sound/slowbeat = sound('sound/health/slowbeat.ogg', repeat = TRUE) + var/sound/slowbeat = sound('sound/effects/health/slowbeat.ogg', repeat = TRUE) owner.playsound_local(owner, slowbeat, 40, 0, channel = CHANNEL_HEARTBEAT, use_reverb = FALSE) close_stalker = TRUE else diff --git a/code/datums/brain_damage/special.dm b/code/datums/brain_damage/special.dm index 1bf011e0fab..f49a6d0c0bc 100644 --- a/code/datums/brain_damage/special.dm +++ b/code/datums/brain_damage/special.dm @@ -45,7 +45,7 @@ else message = pick_list_replacements(BRAIN_DAMAGE_FILE, "god_neutral") - playsound(get_turf(owner), 'sound/magic/clockwork/invoke_general.ogg', 200, TRUE, 5) + playsound(get_turf(owner), 'sound/effects/magic/clockwork/invoke_general.ogg', 200, TRUE, 5) voice_of_god(message, owner, list("colossus","yell"), 2.5, include_owner, name, TRUE) /datum/brain_trauma/special/bluespace_prophet @@ -218,7 +218,7 @@ linked = FALSE return 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) + owner.playsound_local(owner, 'sound/effects/magic/lightning_chargeup.ogg', 75, FALSE) returning = TRUE addtimer(CALLBACK(src, PROC_REF(snapback)), 10 SECONDS) @@ -231,7 +231,7 @@ return to_chat(owner, span_warning("You're pulled through spacetime!")) do_teleport(owner, get_turf(linked_target), null, channel = TELEPORT_CHANNEL_QUANTUM) - owner.playsound_local(owner, 'sound/magic/repulse.ogg', 100, FALSE) + owner.playsound_local(owner, 'sound/effects/magic/repulse.ogg', 100, FALSE) linked_target = null linked = FALSE @@ -388,17 +388,17 @@ if(owner.stat != CONSCIOUS) if(prob(20)) - owner.playsound_local(beepsky, 'sound/voice/beepsky/iamthelaw.ogg', 50) + owner.playsound_local(beepsky, 'sound/mobs/non-humanoids/beepsky/iamthelaw.ogg', 50) return if(get_dist(owner, beepsky) <= 1) - owner.playsound_local(owner, 'sound/weapons/egloves.ogg', 50) + owner.playsound_local(owner, 'sound/items/weapons/egloves.ogg', 50) owner.visible_message(span_warning("[owner]'s body jerks as if it was shocked."), span_userdanger("You feel the fist of the LAW.")) owner.adjustStaminaLoss(rand(40, 70)) QDEL_NULL(beepsky) if(prob(20) && get_dist(owner, beepsky) <= 8) - owner.playsound_local(beepsky, 'sound/voice/beepsky/criminal.ogg', 40) + owner.playsound_local(beepsky, 'sound/mobs/non-humanoids/beepsky/criminal.ogg', 40) /obj/effect/client_image_holder/securitron name = "Securitron" diff --git a/code/datums/brain_damage/split_personality.dm b/code/datums/brain_damage/split_personality.dm index 6d0f8fc5654..198b6746317 100644 --- a/code/datums/brain_damage/split_personality.dm +++ b/code/datums/brain_damage/split_personality.dm @@ -305,7 +305,7 @@ addtimer(TRAIT_CALLBACK_REMOVE(owner, TRAIT_DISCOORDINATED_TOOL_USER, TRAUMA_TRAIT), 10 SECONDS) addtimer(CALLBACK(owner, TYPE_PROC_REF(/atom, balloon_alert), owner, "dexterity regained!"), 10 SECONDS) if(prob(15)) - playsound(owner,'sound/effects/sf_hiccup_male_01.ogg', 50) + playsound(owner,'sound/mobs/humanoids/human/hiccup/sf_hiccup_male_01.ogg', 50) owner.emote("hiccup") //too drunk to feel anything //if they're to this point, they're likely dying of liver damage diff --git a/code/datums/candidate_poll.dm b/code/datums/candidate_poll.dm index f1fa9812014..9afec6f371b 100644 --- a/code/datums/candidate_poll.dm +++ b/code/datums/candidate_poll.dm @@ -74,7 +74,7 @@ if(time_left() <= 0) if(!silent) to_chat(candidate, span_danger("Sorry, you were too late for the consideration!")) - SEND_SOUND(candidate, 'sound/machines/buzz-sigh.ogg') + SEND_SOUND(candidate, 'sound/machines/buzz/buzz-sigh.ogg') return FALSE signed_up += candidate diff --git a/code/datums/cinematics/malf_doomsday.dm b/code/datums/cinematics/malf_doomsday.dm index 2eb330d9a48..02297065afc 100644 --- a/code/datums/cinematics/malf_doomsday.dm +++ b/code/datums/cinematics/malf_doomsday.dm @@ -5,6 +5,6 @@ flick("intro_malf", screen) stoplag(7.6 SECONDS) flick("station_explode_fade_red", screen) - play_cinematic_sound(sound('sound/effects/explosion_distant.ogg')) + play_cinematic_sound(sound('sound/effects/explosion/explosion_distant.ogg')) special_callback?.Invoke() screen.icon_state = "summary_malf" diff --git a/code/datums/cinematics/narsie_summon.dm b/code/datums/cinematics/narsie_summon.dm index 2fecac2c63a..1e0a5d1d48f 100644 --- a/code/datums/cinematics/narsie_summon.dm +++ b/code/datums/cinematics/narsie_summon.dm @@ -5,9 +5,9 @@ screen.icon_state = null flick("intro_cult", screen) stoplag(2.5 SECONDS) - play_cinematic_sound(sound('sound/magic/enter_blood.ogg')) + play_cinematic_sound(sound('sound/effects/magic/enter_blood.ogg')) stoplag(2.8 SECONDS) - play_cinematic_sound(sound('sound/machines/terminal_off.ogg')) + play_cinematic_sound(sound('sound/machines/terminal/terminal_off.ogg')) stoplag(2 SECONDS) flick("station_corrupted", screen) play_cinematic_sound(sound('sound/effects/ghost.ogg')) @@ -20,10 +20,10 @@ /datum/cinematic/cult_fail/play_cinematic() screen.icon_state = "station_intact" stoplag(2 SECONDS) - play_cinematic_sound(sound('sound/creatures/narsie_rises.ogg')) + play_cinematic_sound(sound('sound/music/antag/bloodcult/narsie_rises.ogg')) stoplag(6 SECONDS) - play_cinematic_sound(sound('sound/effects/explosion_distant.ogg')) + play_cinematic_sound(sound('sound/effects/explosion/explosion_distant.ogg')) stoplag(1 SECONDS) - play_cinematic_sound(sound('sound/magic/demon_dies.ogg')) + play_cinematic_sound(sound('sound/effects/magic/demon_dies.ogg')) stoplag(3 SECONDS) special_callback?.Invoke() diff --git a/code/datums/cinematics/nuke_cinematics.dm b/code/datums/cinematics/nuke_cinematics.dm index dd827f7c0b9..858d95c7e51 100644 --- a/code/datums/cinematics/nuke_cinematics.dm +++ b/code/datums/cinematics/nuke_cinematics.dm @@ -22,7 +22,7 @@ /datum/cinematic/nuke/ops_victory/play_nuke_effect() flick("station_explode_fade_red", screen) - play_cinematic_sound(sound('sound/effects/explosion_distant.ogg')) + play_cinematic_sound(sound('sound/effects/explosion/explosion_distant.ogg')) /// The syndicate nuclear bomb was activated, but just barely missed the station! /datum/cinematic/nuke/ops_miss @@ -30,7 +30,7 @@ /datum/cinematic/nuke/ops_miss/play_nuke_effect() flick("station_intact_fade_red", screen) - play_cinematic_sound(sound('sound/effects/explosion_distant.ogg')) + play_cinematic_sound(sound('sound/effects/explosion/explosion_distant.ogg')) /// The self destruct, or another station-destroying entity like a blob, destroyed the station! /datum/cinematic/nuke/self_destruct @@ -38,14 +38,14 @@ /datum/cinematic/nuke/self_destruct/play_nuke_effect() flick("station_explode_fade_red", screen) - play_cinematic_sound(sound('sound/effects/explosion_distant.ogg')) + play_cinematic_sound(sound('sound/effects/explosion/explosion_distant.ogg')) /// The self destruct was activated, yet somehow avoided destroying the station! /datum/cinematic/nuke/self_destruct_miss after_nuke_summary_state = "station_intact" /datum/cinematic/nuke/self_destruct_miss/play_nuke_effect() - play_cinematic_sound(sound('sound/effects/explosion_distant.ogg')) + play_cinematic_sound(sound('sound/effects/explosion/explosion_distant.ogg')) special_callback?.Invoke() /// The syndicate nuclear bomb was activated, and the nuclear operatives failed to extract on their shuttle before it detonated on the station! @@ -54,7 +54,7 @@ /datum/cinematic/nuke/mutual_destruction/play_nuke_effect() flick("station_explode_fade_red", screen) - play_cinematic_sound(sound('sound/effects/explosion_distant.ogg')) + play_cinematic_sound(sound('sound/effects/explosion/explosion_distant.ogg')) /// A blood cult summoned Nar'sie, but central command deployed a nuclear package to stop them. /datum/cinematic/nuke/cult @@ -62,7 +62,7 @@ /datum/cinematic/nuke/cult/play_nuke_effect() flick("station_explode_fade_red", screen) - play_cinematic_sound(sound('sound/effects/explosion_distant.ogg')) + play_cinematic_sound(sound('sound/effects/explosion/explosion_distant.ogg')) /// A fake version of the nuclear detonation, where it winds up, but doesn't explode. /datum/cinematic/nuke/fake @@ -77,7 +77,7 @@ cleanup_time = 10 SECONDS /datum/cinematic/nuke/clown/play_nuke_effect() - play_cinematic_sound(sound('sound/items/airhorn.ogg')) + play_cinematic_sound(sound('sound/items/airhorn/airhorn.ogg')) flick("summary_selfdes", screen) //??? /// A fake version of the nuclear detonation, where it winds up, but doesn't explode as the nuke core within was missing. @@ -86,7 +86,7 @@ /datum/cinematic/nuke/no_core/play_nuke_effect() flick("station_intact", screen) - play_cinematic_sound(sound('sound/ambience/signal.ogg')) + play_cinematic_sound(sound('sound/ambience/misc/signal.ogg')) stoplag(10 SECONDS) /// The syndicate nuclear bomb was activated, but just missed the station by a whole z-level! @@ -96,5 +96,5 @@ /datum/cinematic/nuke/far_explosion/play_cinematic() // This one has no intro sequence. // It's actually just a global sound, which makes you wonder why it's a cinematic. - play_cinematic_sound(sound('sound/effects/explosion_distant.ogg')) + play_cinematic_sound(sound('sound/effects/explosion/explosion_distant.ogg')) special_callback?.Invoke() diff --git a/code/datums/cogbar.dm b/code/datums/cogbar.dm index 0b5ead1e51e..6505158b58d 100644 --- a/code/datums/cogbar.dm +++ b/code/datums/cogbar.dm @@ -44,7 +44,7 @@ /// Adds the cog to the user, visible by other players /datum/cogbar/proc/add_cog_to_user() - cog = SSvis_overlays.add_vis_overlay(user, + cog = SSvis_overlays.add_vis_overlay(user, icon = 'icons/effects/progressbar.dmi', iconstate = "cog", plane = HIGH_GAME_PLANE, @@ -52,7 +52,7 @@ unique = TRUE, alpha = 0, ) - cog.pixel_y = world.icon_size + offset_y + cog.pixel_y = ICON_SIZE_Y + offset_y animate(cog, alpha = 255, time = COGBAR_ANIMATION_TIME) if(isnull(user_client)) @@ -61,7 +61,7 @@ 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 + blank.override = TRUE user_client.images += blank @@ -74,7 +74,7 @@ animate(cog, alpha = 0, time = COGBAR_ANIMATION_TIME) - QDEL_IN(src, COGBAR_ANIMATION_TIME) + QDEL_IN(src, COGBAR_ANIMATION_TIME) /// When the user is deleted, remove the cog @@ -82,6 +82,6 @@ SIGNAL_HANDLER qdel(src) - + #undef COGBAR_ANIMATION_TIME diff --git a/code/datums/communications.dm b/code/datums/communications.dm index 79f660a4cfa..c24602e4a26 100644 --- a/code/datums/communications.dm +++ b/code/datums/communications.dm @@ -37,7 +37,7 @@ GLOBAL_DATUM_INIT(communications_controller, /datum/communciations_controller, n else var/list/message_data = user.treat_message(input) if(syndicate) - priority_announce(html_decode(message_data["message"]), null, 'sound/misc/announce_syndi.ogg', ANNOUNCEMENT_TYPE_SYNDICATE, has_important_message = TRUE, players = players, color_override = "red") + priority_announce(html_decode(message_data["message"]), null, 'sound/announcer/announcement/announce_syndi.ogg', ANNOUNCEMENT_TYPE_SYNDICATE, has_important_message = TRUE, players = players, color_override = "red") else priority_announce(html_decode(message_data["message"]), null, ANNOUNCER_CAPTAIN, ANNOUNCEMENT_TYPE_CAPTAIN, has_important_message = TRUE, players = players) // SKYRAT EDIT CHANGE - 'sound/misc/announce.ogg' to ANNOUNCER_CAPTAIN COOLDOWN_START(src, nonsilicon_message_cooldown, COMMUNICATION_COOLDOWN) diff --git a/code/datums/components/adjust_fishing_difficulty.dm b/code/datums/components/adjust_fishing_difficulty.dm new file mode 100644 index 00000000000..4e329b03940 --- /dev/null +++ b/code/datums/components/adjust_fishing_difficulty.dm @@ -0,0 +1,110 @@ +///Influences the difficulty of the minigame when worn or if buckled to. +/datum/component/adjust_fishing_difficulty + ///The additive numerical modifier to the difficulty of the minigame + var/modifier + ///For items, in which slot it has to be worn to influence the difficulty of the minigame + var/slots + +/datum/component/adjust_fishing_difficulty/Initialize(modifier, slots = NONE) + if(!ismovable(parent) || !modifier) + return COMPONENT_INCOMPATIBLE + + if(!isitem(parent)) + var/atom/movable/movable_parent = parent + if(!movable_parent.can_buckle) + return COMPONENT_INCOMPATIBLE + + src.modifier = modifier + src.slots = slots + +/datum/component/adjust_fishing_difficulty/RegisterWithParent() + if(isitem(parent)) + RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(on_equipped)) + RegisterSignal(parent, COMSIG_ITEM_DROPPED, PROC_REF(on_dropped)) + RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_item_examine)) + else + RegisterSignal(parent, COMSIG_MOVABLE_BUCKLE, PROC_REF(on_buckle)) + RegisterSignal(parent, COMSIG_MOVABLE_UNBUCKLE, PROC_REF(on_unbuckle)) + RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_buckle_examine)) + + update_check() + +/datum/component/adjust_fishing_difficulty/UnregisterFromParent() + UnregisterSignal(parent, list( + COMSIG_ATOM_EXAMINE, + COMSIG_MOVABLE_BUCKLE, + COMSIG_MOVABLE_UNBUCKLE, + COMSIG_ITEM_EQUIPPED, + COMSIG_ITEM_DROPPED, + )) + + update_check(TRUE) + +/datum/component/adjust_fishing_difficulty/proc/update_check(removing = FALSE) + var/atom/movable/movable_parent = parent + for(var/mob/living/buckled_mob as anything in movable_parent.buckled_mobs) + update_user(buckled_mob, removing) + if(!isitem(movable_parent) || !isliving(movable_parent.loc)) + return + var/mob/living/holder = movable_parent.loc + var/obj/item/item = parent + if(holder.get_slot_by_item(movable_parent) & (slots || item.slot_flags)) + update_user(holder, removing) + +/datum/component/adjust_fishing_difficulty/proc/on_item_examine(obj/item/item, mob/user, list/examine_text) + SIGNAL_HANDLER + if(!HAS_MIND_TRAIT(user, TRAIT_EXAMINE_FISH)) + return + var/method = "[(slots || item.slot_flags) & ITEM_SLOT_HANDS ? "Holding" : "Wearing"] [item.p_them()]" + add_examine_line(user, examine_text, method) + +/datum/component/adjust_fishing_difficulty/proc/on_buckle_examine(atom/movable/source, mob/user, list/examine_text) + SIGNAL_HANDLER + if(!HAS_MIND_TRAIT(user, TRAIT_EXAMINE_FISH)) + return + add_examine_line(user, examine_text, "Buckling to [source.p_them()]") + +/datum/component/adjust_fishing_difficulty/proc/add_examine_line(mob/user, list/examine_text, method) + var/percent = HAS_MIND_TRAIT(user, TRAIT_EXAMINE_DEEPER_FISH) ? "[abs(modifier)]% " : "" + var/text = "[method] will make fishing [percent][modifier < 0 ? "easier" : "harder"]." + if(modifier < 0) + examine_text += span_nicegreen(text) + else + examine_text += span_danger(text) + +/datum/component/adjust_fishing_difficulty/proc/on_buckle(atom/movable/source, mob/living/buckled_mob, forced) + SIGNAL_HANDLER + update_user(buckled_mob) + +/datum/component/adjust_fishing_difficulty/proc/on_unbuckle(atom/movable/source, mob/living/buckled_mob, forced) + SIGNAL_HANDLER + update_user(buckled_mob, TRUE) + +/datum/component/adjust_fishing_difficulty/proc/on_equipped(obj/item/source, mob/living/wearer, slot) + SIGNAL_HANDLER + if(slot & (slots || source.slot_flags)) + update_user(wearer) + +/datum/component/adjust_fishing_difficulty/proc/on_dropped(obj/item/source, mob/living/dropper) + SIGNAL_HANDLER + update_user(dropper, TRUE) + +/datum/component/adjust_fishing_difficulty/proc/update_user(mob/living/user, removing = FALSE) + var/datum/fishing_challenge/challenge = GLOB.fishing_challenges_by_user[user] + if(removing) + UnregisterSignal(user, COMSIG_MOB_BEGIN_FISHING) + if(challenge) + UnregisterSignal(challenge, COMSIG_FISHING_CHALLENGE_GET_DIFFICULTY) + else + RegisterSignal(user, COMSIG_MOB_BEGIN_FISHING, PROC_REF(on_minigame_started)) + if(challenge) + RegisterSignal(challenge, COMSIG_FISHING_CHALLENGE_GET_DIFFICULTY, PROC_REF(adjust_difficulty)) + challenge?.update_difficulty() + +/datum/component/adjust_fishing_difficulty/proc/on_minigame_started(mob/living/source, datum/fishing_challenge/challenge) + SIGNAL_HANDLER + RegisterSignal(challenge, COMSIG_FISHING_CHALLENGE_GET_DIFFICULTY, PROC_REF(adjust_difficulty), TRUE) + +/datum/component/adjust_fishing_difficulty/proc/adjust_difficulty(datum/fishing_challenge/challenge, reward_path, obj/item/fishing_rod/rod, mob/living/user, list/holder) + SIGNAL_HANDLER + holder[1] += modifier diff --git a/code/datums/components/appearance_on_aggro.dm b/code/datums/components/appearance_on_aggro.dm index 6d4cab3d914..143c0b260cd 100644 --- a/code/datums/components/appearance_on_aggro.dm +++ b/code/datums/components/appearance_on_aggro.dm @@ -25,7 +25,7 @@ /datum/component/appearance_on_aggro/RegisterWithParent() RegisterSignal(parent, COMSIG_AI_BLACKBOARD_KEY_SET(target_key), PROC_REF(on_set_target)) - RegisterSignals(parent, list(COMSIG_AI_BLACKBOARD_KEY_CLEARED(target_key), COMSIG_LIVING_DEATH), PROC_REF(on_clear_or_death)) + RegisterSignals(parent, list(COMSIG_AI_BLACKBOARD_KEY_CLEARED(target_key), COMSIG_LIVING_DEATH, COMSIG_MOB_LOGIN), PROC_REF(revert_appearance)) if (!isnull(aggro_state)) RegisterSignal(parent, COMSIG_ATOM_UPDATE_ICON_STATE, PROC_REF(on_icon_state_updated)) if (!isnull(aggro_overlay)) @@ -33,7 +33,12 @@ /datum/component/appearance_on_aggro/UnregisterFromParent() . = ..() - UnregisterSignal(parent, list(COMSIG_AI_BLACKBOARD_KEY_SET(target_key), COMSIG_AI_BLACKBOARD_KEY_CLEARED(target_key), COMSIG_LIVING_DEATH)) + UnregisterSignal(parent, list( + COMSIG_AI_BLACKBOARD_KEY_SET(target_key), + COMSIG_AI_BLACKBOARD_KEY_CLEARED(target_key), + COMSIG_LIVING_DEATH, + COMSIG_MOB_LOGIN, + )) /datum/component/appearance_on_aggro/proc/on_set_target(mob/living/source) SIGNAL_HANDLER @@ -51,11 +56,8 @@ revert_appearance(parent) return ..() -/datum/component/appearance_on_aggro/proc/on_clear_or_death(atom/source) - SIGNAL_HANDLER - revert_appearance(parent) - /datum/component/appearance_on_aggro/proc/revert_appearance(mob/living/source) + SIGNAL_HANDLER if (!isnull(aggro_overlay) || !isnull(aggro_state)) source.update_appearance(UPDATE_ICON) if (!isnull(alpha_on_deaggro)) diff --git a/code/datums/components/aquarium_content.dm b/code/datums/components/aquarium_content.dm index 57d62cdb0ee..d956b39928a 100644 --- a/code/datums/components/aquarium_content.dm +++ b/code/datums/components/aquarium_content.dm @@ -15,14 +15,7 @@ var/obj/structure/aquarium/current_aquarium //This is visual effect holder that will end up in aquarium's vis_contents - var/obj/effect/vc_obj - - /// Base px offset of the visual object in current aquarium aka current base position - var/base_px = 0 - /// Base px offset of the visual object in current aquarium aka current base position - var/base_py = 0 - //Current layer for the visual object - var/base_layer + var/obj/effect/aquarium/vc_obj /** * Fish sprite how to: @@ -33,37 +26,12 @@ * cover the extra pixels anyway. */ - /// Icon used for in aquarium sprite - var/icon = 'icons/obj/aquarium/fish.dmi' - /// If this is set this icon state will be used for the holder while icon_state will only be used for item/catalog. Transformation from source_width/height WON'T be applied. - var/icon_state - /// Applied to vc object only for use with greyscaled icons. - var/aquarium_vc_color - /// Transformation applied to the visual holder - used when scaled down sprites are used as in aquarium visual - var/matrix/base_transform - - /// How the thing will be layered - var/layer_mode = AQUARIUM_LAYER_MODE_AUTO - - /// If the starting position is randomised within bounds when inserted into aquarium. - var/randomize_position = FALSE - - //Target sprite size for path/position calculations. - var/sprite_height = 3 - var/sprite_width = 3 - /// Currently playing animation var/current_animation /// Does this behviour need additional processing in aquarium, will be added to SSobj processing on insertion var/processing = FALSE - /// TODO: Change this into trait checked on aquarium insertion - var/unique = FALSE - - /// Proc used to retrieve current animation state from the parent, optional - var/animation_getter - /// Signals of the parent that will trigger animation update var/animation_update_signals @@ -73,50 +41,27 @@ /// The original value of the beauty this component had when initialized var/original_beauty -/datum/component/aquarium_content/Initialize(icon, animation_getter, animation_update_signals, beauty) +/datum/component/aquarium_content/Initialize(animation_update_signals, beauty) if(!ismovable(parent)) return COMPONENT_INCOMPATIBLE - src.animation_getter = animation_getter src.animation_update_signals = animation_update_signals src.beauty = original_beauty = beauty if(animation_update_signals) RegisterSignals(parent, animation_update_signals, PROC_REF(generate_animation)) - if(istype(parent,/obj/item/fish)) - InitializeFromFish() - else if(istype(parent,/obj/item/aquarium_prop)) - InitializeFromProp() - else - InitializeOther() - ADD_TRAIT(parent, TRAIT_FISH_CASE_COMPATIBILE, REF(src)) RegisterSignal(parent, COMSIG_TRY_INSERTING_IN_AQUARIUM, PROC_REF(is_ready_to_insert)) RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(enter_aquarium)) - RegisterSignal(parent, COMSIG_FISH_PETTED, PROC_REF(on_fish_petted)) + + if(isfish(parent)) + RegisterSignal(parent, COMSIG_FISH_STATUS_CHANGED, PROC_REF(on_fish_status_changed)) //If component is added to something already in aquarium at the time initialize it properly. var/atom/movable/movable_parent = parent if(istype(movable_parent.loc, /obj/structure/aquarium)) on_inserted(movable_parent.loc) -/// Sets visuals properties for fish -/datum/component/aquarium_content/proc/InitializeFromFish() - var/obj/item/fish/fish = parent - - icon = fish.icon - sprite_height = fish.sprite_height - sprite_width = fish.sprite_width - aquarium_vc_color = fish.aquarium_vc_color - - icon = fish.dedicated_in_aquarium_icon - icon_state = fish.dedicated_in_aquarium_icon_state - base_transform = matrix() - - randomize_position = TRUE - - RegisterSignal(fish, COMSIG_FISH_STATUS_CHANGED, PROC_REF(on_fish_status_changed)) - /datum/component/aquarium_content/proc/on_fish_status_changed(obj/item/fish/source) SIGNAL_HANDLER var/old_beauty = beauty @@ -127,31 +72,6 @@ change_aquarium_beauty(beauty - old_beauty) generate_animation() -/// Sets visuals properties for fish -/datum/component/aquarium_content/proc/InitializeFromProp() - var/obj/item/aquarium_prop/prop = parent - - icon = prop.icon - icon_state = prop.icon_state - layer_mode = prop.layer_mode - sprite_height = 32 - sprite_width = 32 - base_transform = matrix() - - unique = TRUE - -/// Mostly for admin abuse -/datum/component/aquarium_content/proc/InitializeOther() - sprite_width = 8 - sprite_height = 8 - - var/matrix/matrix = matrix() - var/x_scale = sprite_width / 32 - var/y_scale = sprite_height / 32 - matrix.Scale(x_scale, y_scale) - base_transform = matrix - - /datum/component/aquarium_content/PreTransfer() . = ..() REMOVE_TRAIT(parent, TRAIT_FISH_CASE_COMPATIBILE, REF(src)) @@ -170,12 +90,11 @@ /datum/component/aquarium_content/proc/is_ready_to_insert(datum/source, obj/structure/aquarium/aquarium) SIGNAL_HANDLER - //This is kinda awful but we're unaware of other fish - if(unique) - for(var/atom/movable/fish_or_prop in aquarium) - if(fish_or_prop == parent) + if(HAS_TRAIT(parent, TRAIT_UNIQUE_AQUARIUM_CONTENT)) + for(var/atom/movable/content as anything in aquarium) + if(content == parent) continue - if(fish_or_prop.type == parent.type) + if(content.type == parent.type) return COMSIG_CANNOT_INSERT_IN_AQUARIUM return COMSIG_CAN_INSERT_IN_AQUARIUM @@ -190,7 +109,7 @@ //If we don't have vc object yet build it if(!vc_obj) - vc_obj = generate_base_vc() + generate_base_vc() //Set default position and layer set_vc_base_position() @@ -225,112 +144,28 @@ SIGNAL_HANDLER generate_animation() -/datum/component/aquarium_content/proc/remove_visual_from_aquarium() - current_aquarium.vis_contents -= vc_obj - if(base_layer) - current_aquarium.free_layer(base_layer) - -/// Generates common visual object, propeties that don't depend on aquarium surface -/datum/component/aquarium_content/proc/generate_base_vc() - var/obj/effect/visual = new - apply_appearance(visual) - visual.vis_flags |= VIS_INHERIT_ID | VIS_INHERIT_PLANE //plane so it shows properly in containers on inventory ui for handheld cases - return visual - -/// Applies icon,color and base scaling to our visual holder -/datum/component/aquarium_content/proc/apply_appearance(obj/effect/holder) - holder.icon = icon - holder.icon_state = icon_state - holder.transform = matrix(base_transform) - if(aquarium_vc_color) - holder.color = aquarium_vc_color - - -/// Actually animates the vc holder +///Sends a signal to the parent to get them to update the aquarium animation of the visual object /datum/component/aquarium_content/proc/generate_animation(reset=FALSE) if(!current_aquarium) return - var/next_animation = animation_getter ? call(parent,animation_getter)() : null - if(current_animation == next_animation && !reset) - return - current_animation = next_animation - switch(current_animation) - if(AQUARIUM_ANIMATION_FISH_SWIM) - swim_animation() - return - if(AQUARIUM_ANIMATION_FISH_DEAD) - dead_animation() - return + SEND_SIGNAL(parent, COMSIG_AQUARIUM_CONTENT_DO_ANIMATION, reset ? null : current_animation, current_aquarium, vc_obj) -/// Create looping random path animation, pixel offsets parameters include offsets already -/datum/component/aquarium_content/proc/swim_animation() - var/avg_width = round(sprite_width / 2) - var/avg_height = round(sprite_height / 2) +/datum/component/aquarium_content/proc/remove_visual_from_aquarium() + current_aquarium.vis_contents -= vc_obj + if(vc_obj.layer) + current_aquarium.free_layer(vc_obj.layer) - var/list/aq_properties = current_aquarium.get_surface_properties() - var/px_min = aq_properties[AQUARIUM_PROPERTIES_PX_MIN] + avg_width - 16 - var/px_max = aq_properties[AQUARIUM_PROPERTIES_PX_MAX] - avg_width - 16 - var/py_min = aq_properties[AQUARIUM_PROPERTIES_PY_MIN] + avg_height - 16 - var/py_max = aq_properties[AQUARIUM_PROPERTIES_PY_MAX] - avg_width - 16 - - var/origin_x = base_px - var/origin_y = base_py - var/prev_x = origin_x - var/prev_y = origin_y - animate(vc_obj, pixel_x = origin_x, time = 0, loop = -1) //Just to start the animation - var/move_number = rand(3, 5) //maybe unhardcode this - for(var/i in 1 to move_number) - //If it's last movement, move back to start otherwise move to some random point - var/target_x = i == move_number ? origin_x : rand(px_min,px_max) //could do with enforcing minimal delta for prettier zigzags - var/target_y = i == move_number ? origin_y : rand(py_min,py_max) - var/dx = prev_x - target_x - var/dy = prev_y - target_y - prev_x = target_x - prev_y = target_y - var/dist = abs(dx) + abs(dy) - var/eyeballed_time = dist * 2 //2ds per px - //Face the direction we're going - var/matrix/dir_mx = matrix(base_transform) - if(dx <= 0) //assuming default sprite is facing left here - dir_mx.Scale(-1, 1) - animate(transform = dir_mx, time = 0, loop = -1) - animate(pixel_x = target_x, pixel_y = target_y, time = eyeballed_time, loop = -1) - -/datum/component/aquarium_content/proc/dead_animation() - //Set base_py to lowest possible value - var/avg_height = round(sprite_height / 2) - var/list/aq_properties = current_aquarium.get_surface_properties() - var/py_min = aq_properties[AQUARIUM_PROPERTIES_PY_MIN] + avg_height - 16 - base_py = py_min - animate(vc_obj, pixel_y = py_min, time = 1) //flop to bottom and end current animation. +/// Generates common visual object, propeties that don't depend on aquarium surface +/datum/component/aquarium_content/proc/generate_base_vc() + vc_obj = new + vc_obj.vis_flags |= VIS_INHERIT_ID | VIS_INHERIT_PLANE //plane so it shows properly in containers on inventory ui for handheld cases + SEND_SIGNAL(parent, COMSIG_AQUARIUM_CONTENT_GENERATE_APPEARANCE, vc_obj) /datum/component/aquarium_content/proc/set_vc_base_position() - if(randomize_position) - randomize_base_position() - if(base_layer) - current_aquarium.free_layer(base_layer) - base_layer = current_aquarium.request_layer(layer_mode) - vc_obj.layer = base_layer - -/datum/component/aquarium_content/proc/on_fish_petted() - SIGNAL_HANDLER - - new /obj/effect/temp_visual/heart(get_turf(parent)) - -/datum/component/aquarium_content/proc/randomize_base_position() - var/list/aq_properties = current_aquarium.get_surface_properties() - var/avg_width = round(sprite_width / 2) - var/avg_height = round(sprite_height / 2) - var/px_min = aq_properties[AQUARIUM_PROPERTIES_PX_MIN] + avg_width - 16 - var/px_max = aq_properties[AQUARIUM_PROPERTIES_PX_MAX] - avg_width - 16 - var/py_min = aq_properties[AQUARIUM_PROPERTIES_PY_MIN] + avg_height - 16 - var/py_max = aq_properties[AQUARIUM_PROPERTIES_PY_MAX] - avg_width - 16 - - base_px = rand(px_min,px_max) - base_py = rand(py_min,py_max) - - vc_obj.pixel_x = base_px - vc_obj.pixel_y = base_py + SEND_SIGNAL(parent, AQUARIUM_CONTENT_RANDOMIZE_POSITION, current_aquarium, vc_obj) + if(vc_obj.layer) + current_aquarium.free_layer(vc_obj.layer) + vc_obj.layer = current_aquarium.request_layer(vc_obj.layer_mode) /datum/component/aquarium_content/proc/on_removed(obj/structure/aquarium/source, atom/movable/gone, direction) SIGNAL_HANDLER @@ -344,6 +179,16 @@ remove_visual_from_aquarium() current_aquarium = null +///The visual overlay of the aquarium content. It holds a few vars that we can modity them during signals. +/obj/effect/aquarium + layer = 0 //set on set_vc_base_position + /// Base px offset of the visual object in current aquarium aka current base position + var/base_px = 0 + /// Base px offset of the visual object in current aquarium aka current base position + var/base_py = 0 + /// How the visual will be layered + var/layer_mode = AQUARIUM_LAYER_MODE_AUTO + #undef DEAD_FISH_BEAUTY #undef MIN_DEAD_FISH_BEAUTY #undef MAX_DEAD_FISH_BEAUTY diff --git a/code/datums/components/area_based_godmode.dm b/code/datums/components/area_based_godmode.dm index 4f03ae57794..b9447efbafb 100644 --- a/code/datums/components/area_based_godmode.dm +++ b/code/datums/components/area_based_godmode.dm @@ -34,8 +34,6 @@ var/mob/mob_target = parent if(!istype(mob_target)) return COMPONENT_INCOMPATIBLE - if(initial(mob_target.status_flags) & GODMODE) - return COMPONENT_INCOMPATIBLE sources_to_area_type = list() src.gain_message = gain_message @@ -102,11 +100,11 @@ /datum/component/area_based_godmode/proc/check_area(mob/source) SIGNAL_HANDLER - var/has_godmode = source.status_flags & GODMODE + var/has_godmode = HAS_TRAIT(source, TRAIT_GODMODE) if(!check_in_valid_area(source)) if(has_godmode) to_chat(source, lose_message) - source.status_flags ^= GODMODE + REMOVE_TRAIT(source, TRAIT_GODMODE, REF(src)) check_area_cached_state = FALSE return @@ -115,7 +113,7 @@ return to_chat(source, gain_message) - source.status_flags ^= GODMODE + ADD_TRAIT(source, TRAIT_GODMODE, REF(src)) #undef MAP_AREA_TYPE #undef MAP_ALLOW_AREA_SUBTYPES diff --git a/code/datums/components/callouts.dm b/code/datums/components/callouts.dm index 98d489cc915..52a3e007905 100644 --- a/code/datums/components/callouts.dm +++ b/code/datums/components/callouts.dm @@ -136,7 +136,7 @@ color = colorize_string(creator.GetVoice(), 2, 0.9) update_appearance() var/turf/target_loc = get_turf(target) - animate(src, pixel_x = (target_loc.x - loc.x) * world.icon_size + target.pixel_x, pixel_y = (target_loc.y - loc.y) * world.icon_size + target.pixel_y, time = 0.2 SECONDS, easing = EASE_OUT) + animate(src, pixel_x = (target_loc.x - loc.x) * ICON_SIZE_X + target.pixel_x, pixel_y = (target_loc.y - loc.y) * ICON_SIZE_Y + target.pixel_y, time = 0.2 SECONDS, easing = EASE_OUT) /datum/callout_option var/name = "ERROR" diff --git a/code/datums/components/chuunibyou.dm b/code/datums/components/chuunibyou.dm index 4e06f0fd474..5373b3f7987 100644 --- a/code/datums/components/chuunibyou.dm +++ b/code/datums/components/chuunibyou.dm @@ -64,14 +64,14 @@ /datum/component/chuunibyou/proc/on_try_speech(datum/source, message, ignore_spam, forced) SIGNAL_HANDLER - if(casting_spell) + if(casting_spell && !HAS_TRAIT(src, TRAIT_MUTE)) 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) SIGNAL_HANDLER - playsound(to_fire,'sound/magic/staff_change.ogg', 75, TRUE) + playsound(to_fire,'sound/effects/magic/staff_change.ogg', 75, TRUE) to_fire.color = "#f825f8" to_fire.name = "chuuni-[to_fire.name]" to_fire.set_light(2, 2, LIGHT_COLOR_PINK, l_on = TRUE) @@ -101,7 +101,7 @@ COOLDOWN_START(src, heal_cooldown, CHUUNIBYOU_COOLDOWN_TIME) source.heal_overall_damage(heal_amount) - playsound(source, 'sound/magic/staff_healing.ogg', 30) + playsound(source, 'sound/effects/magic/staff_healing.ogg', 30) to_chat(source, span_danger("You feel slightly healed by your chuuni powers.")) /datum/component/chuunibyou/no_healing diff --git a/code/datums/components/cleaner.dm b/code/datums/components/cleaner.dm index 3001fde9837..75319a7133f 100644 --- a/code/datums/components/cleaner.dm +++ b/code/datums/components/cleaner.dm @@ -62,6 +62,9 @@ /datum/component/cleaner/proc/on_interaction(datum/source, mob/living/user, atom/target, list/modifiers) SIGNAL_HANDLER + if(isitem(source) && SHOULD_SKIP_INTERACTION(target, source, user)) + return NONE + // By default, give XP var/give_xp = TRUE if(pre_clean_callback) diff --git a/code/datums/components/crafting/crafting.dm b/code/datums/components/crafting/crafting.dm index 2ecde012ea6..de72d7afb35 100644 --- a/code/datums/components/crafting/crafting.dm +++ b/code/datums/components/crafting/crafting.dm @@ -21,6 +21,8 @@ var/display_craftable_only = FALSE var/display_compact = FALSE var/forced_mode = FALSE + /// crafting flags we ignore when considering a recipe + var/ignored_flags = NONE /* This is what procs do: get_environment - gets a list of things accessable for crafting by user @@ -205,16 +207,16 @@ if(!check_tools(crafter, recipe, contents)) return ", missing tool." + var/considered_flags = recipe.crafting_flags & ~(ignored_flags) - - if((recipe.crafting_flags & CRAFT_ONE_PER_TURF) && (locate(recipe.result) in dest_turf)) + if((considered_flags & CRAFT_ONE_PER_TURF) && (locate(recipe.result) in dest_turf)) return ", already one here!" - if(recipe.crafting_flags & CRAFT_CHECK_DIRECTION) - if(!valid_build_direction(dest_turf, crafter.dir, is_fulltile = (recipe.crafting_flags & CRAFT_IS_FULLTILE))) + if(considered_flags & CRAFT_CHECK_DIRECTION) + if(!valid_build_direction(dest_turf, crafter.dir, is_fulltile = (considered_flags & CRAFT_IS_FULLTILE))) return ", won't fit here!" - if(recipe.crafting_flags & CRAFT_ON_SOLID_GROUND) + if(considered_flags & CRAFT_ON_SOLID_GROUND) if(isclosedturf(dest_turf)) return ", cannot be made on a wall!" @@ -222,7 +224,7 @@ if(!locate(/obj/structure/thermoplastic) in dest_turf) // for tram construction return ", must be made on solid ground!" - if(recipe.crafting_flags & CRAFT_CHECK_DENSITY) + if(considered_flags & CRAFT_CHECK_DENSITY) for(var/obj/object in dest_turf) if(object.density && !(object.obj_flags & IGNORE_DENSITY) || object.obj_flags & BLOCKS_CONSTRUCTION) return ", something is in the way!" @@ -277,9 +279,11 @@ //SKYRAT EDIT END var/datum/reagents/holder = locate() in parts if(holder) //transfer reagents from ingredients to result - if(!ispath(recipe.result, /obj/item/reagent_containers) && result.reagents) - result.reagents.clear_reagents() - holder.trans_to(result.reagents, holder.total_volume, no_react = TRUE) + if(!ispath(recipe.result, /obj/item/reagent_containers) && result.reagents) + if(recipe.crafting_flags & CRAFT_CLEARS_REAGENTS) + result.reagents.clear_reagents() + if(recipe.crafting_flags & CRAFT_TRANSFERS_REAGENTS) + holder.trans_to(result.reagents, holder.total_volume, no_react = TRUE) parts -= holder qdel(holder) result.CheckParts(parts, recipe) @@ -710,3 +714,20 @@ if(recipe == potential_recipe) return TRUE return FALSE + +/datum/component/personal_crafting/machine + ignored_flags = CRAFT_CHECK_DENSITY + +/datum/component/personal_crafting/machine/get_environment(atom/crafter, list/blacklist = null, radius_range = 1) + . = list() + for(var/atom/movable/content in crafter.contents) + if((content.flags_1 & HOLOGRAM_1) || (blacklist && (content.type in blacklist))) + continue + if(isitem(content)) + var/obj/item/item = content + if(item.item_flags & ABSTRACT) //let's not tempt fate, shall we? + continue + . += content + +/datum/component/personal_crafting/machine/check_tools(atom/source, datum/crafting_recipe/recipe, list/surroundings) + return TRUE diff --git a/code/datums/components/crafting/equipment.dm b/code/datums/components/crafting/equipment.dm index 98595647ea2..9ed5d8b312a 100644 --- a/code/datums/components/crafting/equipment.dm +++ b/code/datums/components/crafting/equipment.dm @@ -285,3 +285,15 @@ category = CAT_EQUIPMENT tool_behaviors = list(TOOL_WELDER, TOOL_WIRECUTTER) */ // SKYRAT EDIT REMOVAL END + +/datum/crafting_recipe/tether_anchor + name = "Tether Anchor" + result = /obj/item/tether_anchor + reqs = list( + /obj/item/stack/sheet/iron = 5, + /obj/item/stack/rods = 2, + /obj/item/stack/cable_coil = 15 + ) + tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_WRENCH) + time = 5 SECONDS + category = CAT_EQUIPMENT diff --git a/code/datums/components/crafting/ranged_weapon.dm b/code/datums/components/crafting/ranged_weapon.dm index 174c0226a42..e69d535a58b 100644 --- a/code/datums/components/crafting/ranged_weapon.dm +++ b/code/datums/components/crafting/ranged_weapon.dm @@ -300,6 +300,22 @@ category = CAT_WEAPON_RANGED crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_MUST_BE_LEARNED +/datum/crafting_recipe/pipe_organ_gun + name = "Pipe Organ Gun" + tool_behaviors = list(TOOL_WELDER, TOOL_SCREWDRIVER) + result = /obj/structure/mounted_gun/pipe + reqs = list( + /obj/item/pipe = 8, + /obj/item/stack/sheet/mineral/wood = 15, + /obj/item/stack/sheet/iron = 10, + /obj/item/storage/toolbox = 1, + /obj/item/stack/rods = 10, + /obj/item/assembly/igniter = 2, + ) + time = 15 SECONDS + category = CAT_WEAPON_RANGED + crafting_flags = CRAFT_CHECK_DENSITY + /datum/crafting_recipe/trash_cannon name = "Trash Cannon" tool_behaviors = list(TOOL_WELDER, TOOL_SCREWDRIVER) @@ -323,8 +339,7 @@ /obj/item/stack/rods = 4, /obj/item/stock_parts/micro_laser = 1, /obj/item/stock_parts/capacitor = 1, - /obj/item/clothing/glasses/regular = 1, - /obj/item/reagent_containers/cup/glass/drinkingglass = 1, + /obj/item/reagent_containers/cup/glass/drinkingglass = 2, ) tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) time = 10 SECONDS diff --git a/code/datums/components/crafting/structures.dm b/code/datums/components/crafting/structures.dm index c4a9b48ec36..090ec31ce22 100644 --- a/code/datums/components/crafting/structures.dm +++ b/code/datums/components/crafting/structures.dm @@ -74,3 +74,14 @@ ) category = CAT_STRUCTURE crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_MUST_BE_LEARNED + +/datum/crafting_recipe/manucrate + name = "Manufacturing Storage Unit" + result = /obj/machinery/power/manufacturing/storagebox + tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_WELDER) + time = 6 SECONDS + reqs = list( + /obj/item/stack/sheet/iron = 10, + ) + category = CAT_STRUCTURE + crafting_flags = CRAFT_CHECK_DENSITY diff --git a/code/datums/components/crank_recharge.dm b/code/datums/components/crank_recharge.dm index b5196579f3c..071c0524db2 100644 --- a/code/datums/components/crank_recharge.dm +++ b/code/datums/components/crank_recharge.dm @@ -14,9 +14,11 @@ var/charge_sound_cooldown_time /// Are we currently charging var/is_charging = FALSE + /// Should you be able to move while charging, use IGNORE_USER_LOC_CHANGE if you want to move and crank + var/charge_move = NONE COOLDOWN_DECLARE(charge_sound_cooldown) -/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) +/datum/component/crank_recharge/Initialize(charging_cell, spin_to_win = FALSE, charge_amount = 500, cooldown_time = 2 SECONDS, charge_sound = 'sound/items/weapons/laser_crank.ogg', charge_sound_cooldown_time = 1.8 SECONDS, charge_move = NONE) . = ..() if(!isitem(parent)) return COMPONENT_INCOMPATIBLE @@ -28,7 +30,7 @@ src.cooldown_time = cooldown_time src.charge_sound = charge_sound src.charge_sound_cooldown_time = charge_sound_cooldown_time - + src.charge_move = charge_move /datum/component/crank_recharge/RegisterWithParent() . = ..() RegisterSignal(parent, COMSIG_ITEM_ATTACK_SELF, PROC_REF(on_attack_self)) @@ -57,7 +59,7 @@ COOLDOWN_START(src, charge_sound_cooldown, charge_sound_cooldown_time) playsound(source, charge_sound, 40) source.balloon_alert(user, "charging...") - if(!do_after(user, cooldown_time, source, interaction_key = DOAFTER_SOURCE_CHARGE_CRANKRECHARGE)) + if(!do_after(user, cooldown_time, source, interaction_key = DOAFTER_SOURCE_CHARGE_CRANKRECHARGE, timed_action_flags = charge_move)) is_charging = FALSE return charging_cell.give(charge_amount) diff --git a/code/datums/components/cuff_n_stun.dm b/code/datums/components/cuff_n_stun.dm index d238a81f06a..fda9618e93c 100644 --- a/code/datums/components/cuff_n_stun.dm +++ b/code/datums/components/cuff_n_stun.dm @@ -22,7 +22,7 @@ COOLDOWN_DECLARE(stun_cooldown) /datum/component/stun_n_cuff/Initialize(list/blacklist_mobs = list(), - stun_sound = 'sound/weapons/egloves.ogg', + stun_sound = 'sound/items/weapons/egloves.ogg', stun_timer = 8 SECONDS, handcuff_timer = 4 SECONDS, stun_cooldown_timer = 10 SECONDS, @@ -75,7 +75,7 @@ living_parent.balloon_alert(human_target, "already cuffed!") return - playsound(parent, 'sound/weapons/cablecuff.ogg', 30, TRUE) + playsound(parent, 'sound/items/weapons/cablecuff.ogg', 30, TRUE) human_target.visible_message(span_danger("[parent] is trying to put zipties on [human_target]!"),\ span_danger("[parent] is trying to put zipties on you!")) diff --git a/code/datums/components/cult_ritual_item.dm b/code/datums/components/cult_ritual_item.dm index 71e07e6380e..554e3d611ba 100644 --- a/code/datums/components/cult_ritual_item.dm +++ b/code/datums/components/cult_ritual_item.dm @@ -176,7 +176,7 @@ * cultist - the mob doing the destroying */ /datum/component/cult_ritual_item/proc/do_destroy_girder(obj/structure/girder/cult/cult_girder, mob/living/cultist) - playsound(cult_girder, 'sound/weapons/resonator_blast.ogg', 40, TRUE, ignore_walls = FALSE) + playsound(cult_girder, 'sound/items/weapons/resonator_blast.ogg', 40, TRUE, ignore_walls = FALSE) cultist.visible_message( span_warning("[cultist] strikes [cult_girder] with [parent]!"), span_notice("You demolish [cult_girder].") @@ -320,7 +320,7 @@ if(scribe_failed) failed = CALLBACK(GLOBAL_PROC, scribe_failed) - SEND_SOUND(cultist, sound('sound/weapons/slice.ogg', 0, 1, 10)) + SEND_SOUND(cultist, sound('sound/items/weapons/slice.ogg', 0, 1, 10)) if(!do_after(cultist, scribe_mod, target = get_turf(cultist), timed_action_flags = IGNORE_SLOWDOWNS)) cleanup_shields() failed?.Invoke() @@ -371,7 +371,7 @@ var/area/summon_location = get_area(cultist) priority_announce( text = "Figments from an eldritch god are being summoned by [cultist.real_name] into [summon_location.get_original_area_name()] from an unknown dimension. Disrupt the ritual at all costs!", - sound = 'sound/ambience/antag/bloodcult/bloodcult_scribe.ogg', + sound = 'sound/music/antag/bloodcult/bloodcult_scribe.ogg', sender_override = "[command_name()] Higher Dimensional Affairs", has_important_message = TRUE, ) diff --git a/code/datums/components/deployable.dm b/code/datums/components/deployable.dm index f45a5b226c3..ac0f006fb6c 100644 --- a/code/datums/components/deployable.dm +++ b/code/datums/components/deployable.dm @@ -68,7 +68,7 @@ return new_direction = user.dir //Gets the direction for thing_to_be_deployed if there is a user source.balloon_alert(user, "deploying...") - playsound(source, 'sound/items/ratchet.ogg', 50, TRUE) + playsound(source, 'sound/items/tools/ratchet.ogg', 50, TRUE) if(!do_after(user, deploy_time)) return else // If there is for some reason no user, then the location and direction are set here diff --git a/code/datums/components/direct_explosive_trap.dm b/code/datums/components/direct_explosive_trap.dm index e3a125eb928..1372c569bba 100644 --- a/code/datums/components/direct_explosive_trap.dm +++ b/code/datums/components/direct_explosive_trap.dm @@ -74,7 +74,7 @@ to_chat(victim, span_bolddanger("[source] was boobytrapped!")) if (!isnull(saboteur)) to_chat(saboteur, span_bolddanger("Success! Your trap on [source] caught [victim.name]!")) - playsound(source, 'sound/effects/explosion2.ogg', 200, TRUE) + playsound(source, 'sound/effects/explosion/explosion2.ogg', 200, TRUE) new /obj/effect/temp_visual/explosion(get_turf(source)) EX_ACT(victim, explosive_force) qdel(src) diff --git a/code/datums/components/drift.dm b/code/datums/components/drift.dm deleted file mode 100644 index 7fba50d3151..00000000000 --- a/code/datums/components/drift.dm +++ /dev/null @@ -1,194 +0,0 @@ -///Component that handles drifting -///Manages a movement loop that actually does the legwork of moving someone -///Alongside dealing with the post movement input blocking required to make things look nice -/datum/component/drift - var/atom/inertia_last_loc - var/old_dir - var/datum/move_loop/move/drifting_loop - ///Should we ignore the next glide rate input we get? - ///This is to some extent a hack around the order of operations - ///Around COMSIG_MOVELOOP_POSTPROCESS. I'm sorry lad - var/ignore_next_glide = FALSE - ///Have we been delayed? IE: active, but not working right this second? - var/delayed = FALSE - var/block_inputs_until - -/// Accepts three args. The direction to drift in, if the drift is instant or not, and if it's not instant, the delay on the start -/datum/component/drift/Initialize(direction, instant = FALSE, start_delay = 0) - if(!ismovable(parent)) - return COMPONENT_INCOMPATIBLE - . = ..() - - var/flags = MOVEMENT_LOOP_OUTSIDE_CONTROL - if(instant) - flags |= MOVEMENT_LOOP_START_FAST - var/atom/movable/movable_parent = parent - drifting_loop = GLOB.move_manager.move(moving = parent, direction = direction, delay = movable_parent.inertia_move_delay, subsystem = SSspacedrift, priority = MOVEMENT_SPACE_PRIORITY, flags = flags) - - if(!drifting_loop) //Really want to qdel here but can't - return COMPONENT_INCOMPATIBLE - - RegisterSignal(drifting_loop, COMSIG_MOVELOOP_START, PROC_REF(drifting_start)) - RegisterSignal(drifting_loop, COMSIG_MOVELOOP_STOP, PROC_REF(drifting_stop)) - RegisterSignal(drifting_loop, COMSIG_MOVELOOP_PREPROCESS_CHECK, PROC_REF(before_move)) - RegisterSignal(drifting_loop, COMSIG_MOVELOOP_POSTPROCESS, PROC_REF(after_move)) - RegisterSignal(drifting_loop, COMSIG_QDELETING, PROC_REF(loop_death)) - RegisterSignal(movable_parent, COMSIG_MOVABLE_NEWTONIAN_MOVE, PROC_REF(newtonian_impulse)) - if(drifting_loop.status & MOVELOOP_STATUS_RUNNING) - drifting_start(drifting_loop) // There's a good chance it'll autostart, gotta catch that - - var/visual_delay = movable_parent.inertia_move_delay - - // Start delay is essentially a more granular version of instant - // Isn't used in the standard case, just for things that have odd wants - if(!instant && start_delay) - drifting_loop.pause_for(start_delay) - visual_delay = start_delay - - apply_initial_visuals(visual_delay) - -/datum/component/drift/Destroy() - inertia_last_loc = null - if(!QDELETED(drifting_loop)) - qdel(drifting_loop) - drifting_loop = null - var/atom/movable/movable_parent = parent - movable_parent.inertia_moving = FALSE - return ..() - -/datum/component/drift/proc/apply_initial_visuals(visual_delay) - // If something "somewhere" doesn't want us to apply our glidesize delays, don't - if(SEND_SIGNAL(parent, COMSIG_MOVABLE_DRIFT_VISUAL_ATTEMPT) & DRIFT_VISUAL_FAILED) - return - - // Ignore the next glide because it's literally just us - ignore_next_glide = TRUE - var/atom/movable/movable_parent = parent - movable_parent.set_glide_size(MOVEMENT_ADJUSTED_GLIDE_SIZE(visual_delay, SSspacedrift.visual_delay)) - if(ismob(parent)) - var/mob/mob_parent = parent - //Ok this is slightly weird, but basically, we need to force the client to glide at our rate - //Make sure moving into a space move looks like a space move essentially - //There is an inbuilt assumption that gliding will be added as a part of a move call, but eh - //It's ok if it's not, it's just important if it is. - mob_parent.client?.visual_delay = MOVEMENT_ADJUSTED_GLIDE_SIZE(visual_delay, SSspacedrift.visual_delay) - -/datum/component/drift/proc/newtonian_impulse(datum/source, inertia_direction) - SIGNAL_HANDLER - var/atom/movable/movable_parent = parent - inertia_last_loc = movable_parent.loc - if(drifting_loop) - drifting_loop.direction = inertia_direction - if(!inertia_direction) - qdel(src) - return COMPONENT_MOVABLE_NEWTONIAN_BLOCK - -/datum/component/drift/proc/drifting_start() - SIGNAL_HANDLER - var/atom/movable/movable_parent = parent - inertia_last_loc = movable_parent.loc - RegisterSignal(movable_parent, COMSIG_MOVABLE_MOVED, PROC_REF(handle_move)) - // We will use glide size to intuit how long to delay our loop's next move for - // This way you can't ride two movements at once while drifting, since that'd be dumb as fuck - RegisterSignal(movable_parent, COMSIG_MOVABLE_UPDATE_GLIDE_SIZE, PROC_REF(handle_glidesize_update)) - // If you stop pulling something mid drift, I want it to retain that momentum - RegisterSignal(movable_parent, COMSIG_ATOM_NO_LONGER_PULLING, PROC_REF(stopped_pulling)) - -/datum/component/drift/proc/drifting_stop() - SIGNAL_HANDLER - var/atom/movable/movable_parent = parent - movable_parent.inertia_moving = FALSE - ignore_next_glide = FALSE - UnregisterSignal(movable_parent, list(COMSIG_MOVABLE_MOVED, COMSIG_MOVABLE_UPDATE_GLIDE_SIZE, COMSIG_ATOM_NO_LONGER_PULLING)) - -/datum/component/drift/proc/before_move(datum/source) - SIGNAL_HANDLER - var/atom/movable/movable_parent = parent - movable_parent.inertia_moving = TRUE - old_dir = movable_parent.dir - delayed = FALSE - -/datum/component/drift/proc/after_move(datum/source, result, visual_delay) - SIGNAL_HANDLER - if(result == MOVELOOP_FAILURE) - qdel(src) - return - - var/atom/movable/movable_parent = parent - movable_parent.setDir(old_dir) - movable_parent.inertia_moving = FALSE - if(movable_parent.Process_Spacemove(drifting_loop.direction, continuous_move = TRUE)) - glide_to_halt(visual_delay) - return - - inertia_last_loc = movable_parent.loc - ignore_next_glide = TRUE - -/datum/component/drift/proc/loop_death(datum/source) - SIGNAL_HANDLER - drifting_loop = null - UnregisterSignal(parent, COMSIG_MOVABLE_NEWTONIAN_MOVE) // We won't block a component from replacing us anymore - -/datum/component/drift/proc/handle_move(datum/source, old_loc) - SIGNAL_HANDLER - // This can happen, because signals once sent cannot be stopped - if(QDELETED(src)) - return - var/atom/movable/movable_parent = parent - if(!isturf(movable_parent.loc)) - qdel(src) - return - if(movable_parent.inertia_moving) - return - if(!movable_parent.Process_Spacemove(drifting_loop.direction, continuous_move = TRUE)) - return - qdel(src) - -/// We're going to take the passed in glide size -/// and use it to manually delay our loop for that period -/// to allow the other movement to complete -/datum/component/drift/proc/handle_glidesize_update(datum/source, glide_size) - SIGNAL_HANDLER - // If we aren't drifting, or this is us, fuck off - var/atom/movable/movable_parent = parent - if(!drifting_loop || movable_parent.inertia_moving) - return - // If we are drifting, but this set came from the moveloop itself, drop the input - // I'm sorry man - if(ignore_next_glide) - ignore_next_glide = FALSE - return - var/glide_delay = round(world.icon_size / glide_size, 1) * world.tick_lag - drifting_loop.pause_for(glide_delay) - delayed = TRUE - -/// If we're pulling something and stop, we want it to continue at our rate and such -/datum/component/drift/proc/stopped_pulling(datum/source, atom/movable/was_pulling) - SIGNAL_HANDLER - // This does mean it falls very slightly behind, but otherwise they'll potentially run into us - var/next_move_in = drifting_loop.timer - world.time + world.tick_lag - was_pulling.newtonian_move(drifting_loop.direction, start_delay = next_move_in) - -/datum/component/drift/proc/glide_to_halt(glide_for) - if(!ismob(parent)) - qdel(src) - return - - var/mob/mob_parent = parent - var/client/our_client = mob_parent.client - // If we're not active, don't do the glide because it'll look dumb as fuck - if(!our_client || delayed) - qdel(src) - return - - block_inputs_until = world.time + glide_for - QDEL_IN(src, glide_for + 1) - qdel(drifting_loop) - RegisterSignal(parent, COMSIG_MOB_CLIENT_PRE_MOVE, PROC_REF(allow_final_movement)) - -/datum/component/drift/proc/allow_final_movement(datum/source) - // Some things want to allow movement out of spacedrift, we should let them - if(SEND_SIGNAL(parent, COMSIG_MOVABLE_DRIFT_BLOCK_INPUT) & DRIFT_ALLOW_INPUT) - return - if(world.time < block_inputs_until) - return COMSIG_MOB_CLIENT_BLOCK_PRE_MOVE diff --git a/code/datums/components/echolocation.dm b/code/datums/components/echolocation.dm index f5181a98147..1568a573977 100644 --- a/code/datums/components/echolocation.dm +++ b/code/datums/components/echolocation.dm @@ -170,7 +170,7 @@ copied_appearance.pixel_x = 0 copied_appearance.pixel_y = 0 copied_appearance.transform = matrix() - if(!iscarbon(input)) //wacky overlay people get generated everytime + if(input.icon && input.icon_state) saved_appearances["[input.icon]-[input.icon_state]"] = copied_appearance return copied_appearance diff --git a/code/datums/components/effect_remover.dm b/code/datums/components/effect_remover.dm index a67962250db..c8490d760f1 100644 --- a/code/datums/components/effect_remover.dm +++ b/code/datums/components/effect_remover.dm @@ -66,6 +66,10 @@ if(!isliving(user)) return NONE + if(HAS_TRAIT(target, TRAIT_ILLUSORY_EFFECT)) + to_chat(user, span_notice("You pass [parent] through the [target], but nothing seems to happen. Is it really even there?")) + return NONE + if(is_type_in_typecache(target, effects_we_clear)) // Make sure we get all subtypes and everything INVOKE_ASYNC(src, PROC_REF(do_remove_effect), target, user) return ITEM_INTERACT_SUCCESS diff --git a/code/datums/components/embedded.dm b/code/datums/components/embedded.dm index 84bfa8dfad0..6fc61db5e76 100644 --- a/code/datums/components/embedded.dm +++ b/code/datums/components/embedded.dm @@ -57,7 +57,7 @@ var/damage = weapon.throwforce if(harmful) victim.throw_alert(ALERT_EMBEDDED_OBJECT, /atom/movable/screen/alert/embeddedobject) - playsound(victim,'sound/weapons/bladeslice.ogg', 40) + playsound(victim,'sound/items/weapons/bladeslice.ogg', 40) if (limb.can_bleed()) weapon.add_mob_blood(victim)//it embedded itself in you, of course it's bloody! damage += weapon.w_class * embed_data.impact_pain_mult diff --git a/code/datums/components/engraved.dm b/code/datums/components/engraved.dm index 60bfa5f6177..5db43b8076c 100644 --- a/code/datums/components/engraved.dm +++ b/code/datums/components/engraved.dm @@ -67,13 +67,13 @@ RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) //supporting component transfer means putting these here instead of initialize SSpersistence.wall_engravings += src - ADD_TRAIT(parent, TRAIT_NOT_ENGRAVABLE, TRAIT_GENERIC) + ADD_TRAIT(parent, TRAIT_NOT_ENGRAVABLE, ENGRAVED_TRAIT) /datum/component/engraved/UnregisterFromParent() UnregisterSignal(parent, COMSIG_ATOM_EXAMINE) //supporting component transfer means putting these here instead of destroy SSpersistence.wall_engravings -= src - REMOVE_TRAIT(parent, TRAIT_NOT_ENGRAVABLE, TRAIT_GENERIC) + REMOVE_TRAIT(parent, TRAIT_NOT_ENGRAVABLE, ENGRAVED_TRAIT) /// Used to maintain the acid overlay on the parent [/atom]. /datum/component/engraved/proc/on_update_overlays(atom/parent_atom, list/overlays) diff --git a/code/datums/components/fish_growth.dm b/code/datums/components/fish_growth.dm index bc7c8a9869e..3ec1427fd51 100644 --- a/code/datums/components/fish_growth.dm +++ b/code/datums/components/fish_growth.dm @@ -11,43 +11,90 @@ var/use_drop_loc ///Is the parent deleted once the result is spawned? var/del_on_grow + ///Will the result inherit the name of the fish if that was changed from the initial name. + var/inherit_name -/datum/component/fish_growth/Initialize(result_type, growth_rate, use_drop_loc = TRUE, del_on_grow = TRUE) +/datum/component/fish_growth/Initialize(result_type, growth_time, use_drop_loc = TRUE, del_on_grow = TRUE, inherit_name = TRUE) . = ..() if(!isfish(parent)) return COMPONENT_INCOMPATIBLE - RegisterSignal(parent, COMSIG_FISH_LIFE, PROC_REF(on_fish_life)) src.result_type = result_type - src.growth_rate = growth_rate + growth_rate = 100 / growth_time src.use_drop_loc = use_drop_loc src.del_on_grow = del_on_grow + src.inherit_name = inherit_name -/datum/component/fish_growth/CheckDupeComponent(result_type, growth_rate, use_drop_loc = TRUE, del_on_grow = TRUE) +/datum/component/fish_growth/CheckDupeComponent( + datum/component/fish_growth/new_growth, // will be null + result_type, + growth_time, + use_drop_loc = TRUE, + del_on_grow = TRUE, + inherit_name = TRUE, +) if(result_type == src.result_type) - src.growth_rate = growth_rate + growth_rate = 100 / growth_time return TRUE //copy the growth rate and kill the new component return FALSE +/datum/component/fish_growth/RegisterWithParent() + var/evo_growth = ispath(result_type, /datum/fish_evolution) + RegisterSignal(parent, COMSIG_FISH_LIFE, PROC_REF(on_fish_life)) + if(!evo_growth) + return + var/datum/fish_evolution/evolution = GLOB.fish_evolutions[result_type] + evolution.RegisterSignal(parent, COMSIG_FISH_BEFORE_GROWING, TYPE_PROC_REF(/datum/fish_evolution, growth_checks)) + evolution.register_fish(parent) + +/datum/component/fish_growth/UnregisterFromParent() + UnregisterSignal(parent, list(COMSIG_FISH_LIFE, COMSIG_FISH_BEFORE_GROWING)) + /datum/component/fish_growth/proc/on_fish_life(obj/item/fish/source, seconds_per_tick) SIGNAL_HANDLER - if(SEND_SIGNAL(source, COMSIG_FISH_BEFORE_GROWING, seconds_per_tick) & COMPONENT_DONT_GROW) + if(source.status == FISH_DEAD) //It died just now. return - maturation += growth_rate * seconds_per_tick + var/deciseconds_elapsed = seconds_per_tick * 10 + var/growth = growth_rate * deciseconds_elapsed + if(SEND_SIGNAL(source, COMSIG_FISH_BEFORE_GROWING, seconds_per_tick, growth) & COMPONENT_DONT_GROW) + return + maturation += growth if(maturation >= 100) finish_growing(source) /datum/component/fish_growth/proc/finish_growing(obj/item/fish/source) var/atom/location = use_drop_loc ? source.drop_location() : source.loc - var/atom/movable/result = new result_type (location) - if(location != source.loc) - result.visible_message(span_boldnotice("\A [result] jumps out of [source.loc]!")) - playsound(result, 'sound/effects/fish_splash.ogg', 60) - if(isbasicmob(result)) - for(var/trait_type in source.fish_traits) - var/datum/fish_trait/trait = GLOB.fish_traits[trait_type] - trait.apply_to_mob(result) + var/is_evo = ispath(result_type, /datum/fish_evolution) + var/atom/movable/result + if(is_evo) + var/datum/fish_evolution/evolution = GLOB.fish_evolutions[result_type] + result = source.create_offspring(evolution.new_fish_type, evolution = evolution) + var/obj/item/fish/fishie = result + fishie.breeding_wait = source.breeding_wait + fishie.last_feeding = source.last_feeding + var/health_percent = source.health / initial(source.health) + fishie.adjust_health(fishie.health * health_percent) + else + result = new result_type (location) + if(location != source.loc) + result.visible_message(span_boldnotice("\A [result] jumps out of [source.loc]!")) + playsound(result, 'sound/effects/fish_splash.ogg', 60) + if(isbasicmob(result)) + for(var/trait_type in source.fish_traits) + var/datum/fish_trait/trait = GLOB.fish_traits[trait_type] + trait.apply_to_mob(result) - addtimer(CALLBACK(result, TYPE_PROC_REF(/mob/living/basic, hop_on_nearby_turf)), 0.1 SECONDS) + addtimer(CALLBACK(result, TYPE_PROC_REF(/mob/living/basic, hop_on_nearby_turf)), 0.1 SECONDS) + + if(is_evo || location == source.loc) + var/message_verb = del_on_grow ? "grows into" : "generates" + location.visible_message(span_notice("[source] [message_verb] \a [result]."), vision_distance = 3) + + if(inherit_name && source.name != initial(source.name)) + if(ismob(result)) + var/mob/mob = result + mob.fully_replace_character_name(mob.name, source.name) + else + result.name = source.name SEND_SIGNAL(source, COMSIG_FISH_FINISH_GROWING, result) diff --git a/code/datums/components/fishing_spot.dm b/code/datums/components/fishing_spot.dm index b825354d7be..982b0da2df7 100644 --- a/code/datums/components/fishing_spot.dm +++ b/code/datums/components/fishing_spot.dm @@ -19,11 +19,15 @@ RegisterSignal(parent, COMSIG_ATOM_EXAMINE_MORE, PROC_REF(on_examined_more)) RegisterSignal(parent, COMSIG_NPC_FISHING, PROC_REF(return_fishing_spot)) RegisterSignal(parent, COMSIG_ATOM_EX_ACT, PROC_REF(explosive_fishing)) + RegisterSignal(parent, COMSIG_FISH_RELEASED_INTO, PROC_REF(fish_released)) + RegisterSignal(parent, COMSIG_ATOM_TOOL_ACT(TOOL_MULTITOOL), PROC_REF(link_to_fish_porter)) ADD_TRAIT(parent, TRAIT_FISHING_SPOT, REF(src)) /datum/component/fishing_spot/Destroy() + REMOVE_TRAIT(parent, TRAIT_FISHING_SPOT, REF(src)) fish_source.on_fishing_spot_del(src) fish_source = null + REMOVE_TRAIT(parent, TRAIT_FISHING_SPOT, REF(src)) return ..() /datum/component/fishing_spot/proc/handle_cast(datum/source, obj/item/fishing_rod/rod, mob/user) @@ -61,7 +65,7 @@ var/obj/item/fishing_rod/rod = possibly_rod if(!istype(rod)) return - if(HAS_TRAIT(user,TRAIT_GONE_FISHING) || rod.fishing_line) + if(GLOB.fishing_challenges_by_user[user] || rod.fishing_line) user.balloon_alert(user, "already fishing") return COMPONENT_NO_AFTERATTACK var/denial_reason = fish_source.reason_we_cant_fish(rod, user, parent) @@ -70,15 +74,10 @@ return COMPONENT_NO_AFTERATTACK // In case the fishing source has anything else to do before beginning to fish. fish_source.on_start_fishing(rod, user, parent) - start_fishing_challenge(rod, user) - return COMPONENT_NO_AFTERATTACK - -/datum/component/fishing_spot/proc/start_fishing_challenge(obj/item/fishing_rod/rod, mob/user) - /// Roll what we caught based on modified table - var/result = fish_source.roll_reward(rod, user, parent) - var/datum/fishing_challenge/challenge = new(src, result, rod, user) + var/datum/fishing_challenge/challenge = new(src, rod, user) fish_source.pre_challenge_started(rod, user, challenge) challenge.start(user) + return COMPONENT_NO_AFTERATTACK /datum/component/fishing_spot/proc/return_fishing_spot(datum/source, list/fish_spot_container) fish_spot_container[NPC_FISHING_SPOT] = fish_source @@ -86,3 +85,13 @@ /datum/component/fishing_spot/proc/explosive_fishing(atom/location, severity) SIGNAL_HANDLER fish_source.spawn_reward_from_explosion(location, severity) + +/datum/component/fishing_spot/proc/link_to_fish_porter(atom/source, mob/user, obj/item/multitool/tool) + SIGNAL_HANDLER + if(istype(tool.buffer, /obj/machinery/fishing_portal_generator)) + var/obj/machinery/fishing_portal_generator/portal = tool.buffer + return portal.link_fishing_spot(fish_source, source, user) + +/datum/component/fishing_spot/proc/fish_released(datum/source, obj/item/fish/fish, mob/living/releaser) + SIGNAL_HANDLER + fish_source.readd_fish(fish, releaser) diff --git a/code/datums/components/food/edible.dm b/code/datums/components/food/edible.dm index c034300f982..9e2964273fd 100644 --- a/code/datums/components/food/edible.dm +++ b/code/datums/components/food/edible.dm @@ -40,8 +40,6 @@ Behavior that's still missing from this component that original food items had t var/volume = 50 ///The flavortext for taste (haha get it flavor text) var/list/tastes - ///Whether to tell the examiner that this is edible or not. - var/show_examine = TRUE /datum/component/edible/Initialize( list/initial_reagents, @@ -57,7 +55,6 @@ Behavior that's still missing from this component that original food items had t datum/callback/on_consume, datum/callback/check_liked, reagent_purity = 0.5, - show_examine = TRUE, ) if(!isatom(parent)) return COMPONENT_INCOMPATIBLE @@ -73,7 +70,6 @@ Behavior that's still missing from this component that original food items had t src.on_consume = on_consume src.tastes = string_assoc_list(tastes) src.check_liked = check_liked - src.show_examine = show_examine setup_initial_reagents(initial_reagents, reagent_purity) @@ -81,9 +77,9 @@ Behavior that's still missing from this component that original food items had t RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(examine)) RegisterSignal(parent, COMSIG_ATOM_ATTACK_ANIMAL, PROC_REF(UseByAnimal)) RegisterSignal(parent, COMSIG_ATOM_CHECKPARTS, PROC_REF(OnCraft)) - RegisterSignal(parent, COMSIG_ATOM_CREATEDBY_PROCESSING, PROC_REF(OnProcessed)) - RegisterSignal(parent, COMSIG_FOOD_INGREDIENT_ADDED, PROC_REF(edible_ingredient_added)) RegisterSignal(parent, COMSIG_OOZE_EAT_ATOM, PROC_REF(on_ooze_eat)) + RegisterSignal(parent, COMSIG_FOOD_INGREDIENT_ADDED, PROC_REF(edible_ingredient_added)) + RegisterSignal(parent, COMSIG_ATOM_CREATEDBY_PROCESSING, PROC_REF(OnProcessed)) if(isturf(parent)) RegisterSignal(parent, COMSIG_ATOM_ENTERED, PROC_REF(on_entered)) @@ -216,7 +212,7 @@ Behavior that's still missing from this component that original food items had t SIGNAL_HANDLER var/atom/owner = parent - if(!show_examine) + if(food_flags & FOOD_NO_EXAMINE) return if(foodtypes) var/list/types = bitfield_to_list(foodtypes, FOOD_FLAGS) @@ -316,7 +312,6 @@ Behavior that's still missing from this component that original food items had t SIGNAL_HANDLER var/atom/this_food = parent - for(var/obj/item/food/crafted_part in parts_list) if(!crafted_part.reagents) continue @@ -325,7 +320,7 @@ Behavior that's still missing from this component that original food items had t this_food.reagents.maximum_volume = ROUND_UP(this_food.reagents.maximum_volume) // Just because I like whole numbers for this. - BLACKBOX_LOG_FOOD_MADE(this_food.type) + BLACKBOX_LOG_FOOD_MADE(parent.type) ///Makes sure the thing hasn't been destroyed or fully eaten to prevent eating phantom edibles /datum/component/edible/proc/IsFoodGone(atom/owner, mob/living/feeder) @@ -462,7 +457,7 @@ Behavior that's still missing from this component that original food items had t var/atom/owner = parent - if(!owner?.reagents) + if(!owner.reagents) stack_trace("[eater] failed to bite [owner], because [owner] had no reagents.") return FALSE if(eater.satiety > -200) @@ -479,7 +474,8 @@ Behavior that's still missing from this component that original food items had t if(bitecount == 0) apply_buff(eater) - var/fraction = min(bite_consumption / owner.reagents.total_volume, 1) + var/fraction = 0.3 + fraction = min(bite_consumption / owner.reagents.total_volume, 1) owner.reagents.trans_to(eater, bite_consumption, transferred_by = feeder, methods = INGEST) bitecount++ @@ -489,8 +485,7 @@ Behavior that's still missing from this component that original food items had t On_Consume(eater, feeder) //Invoke our after eat callback if it is valid - if(after_eat) - after_eat.Invoke(eater, feeder, bitecount) + after_eat?.Invoke(eater, feeder, bitecount) //Invoke the eater's stomach's after_eat callback if valid if(iscarbon(eater)) @@ -531,7 +526,7 @@ Behavior that's still missing from this component that original food items had t if(recipe_complexity <= 0) return var/obj/item/food/food = parent - if(!isnull(food.crafted_food_buff)) + if(istype(food) && !isnull(food.crafted_food_buff)) buff = food.crafted_food_buff else buff = pick_weight(GLOB.food_buffs[min(recipe_complexity, FOOD_COMPLEXITY_5)]) @@ -666,7 +661,7 @@ Behavior that's still missing from this component that original food items had t /datum/component/edible/proc/UseByAnimal(datum/source, mob/living/basic/pet/dog/doggy) SIGNAL_HANDLER - if(!isdog(doggy)) + if(!isdog(doggy) || (food_flags & FOOD_NO_BITECOUNT)) //this entirely relies on bitecounts alas return var/atom/food = parent diff --git a/code/datums/components/gps.dm b/code/datums/components/gps.dm index 7e52f00def7..0b3751856b8 100644 --- a/code/datums/components/gps.dm +++ b/code/datums/components/gps.dm @@ -162,7 +162,7 @@ GLOBAL_LIST_EMPTY(GPS_list) switch(action) if("rename") var/atom/parentasatom = parent - var/a = tgui_input_text(usr, "Enter the desired tag", "GPS Tag", gpstag, 20) + var/a = tgui_input_text(usr, "Enter the desired tag", "GPS Tag", gpstag, max_length = 20) if (QDELETED(ui) || ui.status != UI_INTERACTIVE) return if (!a) diff --git a/code/datums/components/infective.dm b/code/datums/components/infective.dm index bc7cc2e6af3..ecd2f1ff836 100644 --- a/code/datums/components/infective.dm +++ b/code/datums/components/infective.dm @@ -8,43 +8,78 @@ var/weak_infection_chance = 10 -/datum/component/infective/Initialize(list/datum/disease/_diseases, expire_in, weak = FALSE) - if(islist(_diseases)) - diseases = _diseases - else - diseases = list(_diseases) +/datum/component/infective/Initialize(list/datum/disease/diseases, expire_in, weak = FALSE, weak_infection_chance = 10) + if(!ismovable(parent)) + return COMPONENT_INCOMPATIBLE + + if(!islist(diseases)) + diseases = islist(diseases) + + ///Make sure the diseases list is populated with instances of diseases so that it doesn't have to be for each AddComponent call. + for(var/datum/disease/disease as anything in diseases) + if(!disease) //empty entry, remove. + diseases -= disease + if(ispath(disease, /datum/disease)) + var/datum/disease/instance = new disease + diseases -= disease + diseases += instance + else if(!istype(disease)) + stack_trace("found [isdatum(disease) ? "an instance of [disease.type]" : disease] inside the diseases list argument for [type]") + diseases -= disease + + src.diseases = diseases + if(expire_in) expire_time = world.time + expire_in QDEL_IN(src, expire_in) - if(!ismovable(parent)) - return COMPONENT_INCOMPATIBLE - is_weak = weak + src.weak_infection_chance = weak_infection_chance +/datum/component/infective/Destroy() + QDEL_LIST(diseases) + return ..() + +/datum/component/infective/RegisterWithParent() if(is_weak && isitem(parent)) RegisterSignal(parent, COMSIG_FOOD_EATEN, PROC_REF(try_infect_eat)) RegisterSignal(parent, COMSIG_PILL_CONSUMED, PROC_REF(try_infect_eat)) - else - var/static/list/disease_connections = list( - COMSIG_ATOM_ENTERED = PROC_REF(try_infect_crossed), - ) - AddComponent(/datum/component/connect_loc_behalf, parent, disease_connections) + return + var/static/list/disease_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(try_infect_crossed), + ) + AddComponent(/datum/component/connect_loc_behalf, parent, disease_connections) - RegisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT, PROC_REF(clean)) - RegisterSignal(parent, COMSIG_MOVABLE_BUCKLE, PROC_REF(try_infect_buckle)) - RegisterSignal(parent, COMSIG_MOVABLE_BUMP, PROC_REF(try_infect_collide)) - RegisterSignal(parent, COMSIG_MOVABLE_IMPACT_ZONE, PROC_REF(try_infect_impact_zone)) - if(isitem(parent)) - RegisterSignal(parent, COMSIG_ITEM_ATTACK_ZONE, PROC_REF(try_infect_attack_zone)) - RegisterSignal(parent, COMSIG_ITEM_ATTACK, PROC_REF(try_infect_attack)) - RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(try_infect_equipped)) - RegisterSignal(parent, COMSIG_FOOD_EATEN, PROC_REF(try_infect_eat)) - RegisterSignal(parent, COMSIG_PILL_CONSUMED, PROC_REF(try_infect_eat)) - if(istype(parent, /obj/item/reagent_containers/cup)) - RegisterSignal(parent, COMSIG_GLASS_DRANK, PROC_REF(try_infect_drink)) - if(isorgan(parent)) - RegisterSignal(parent, COMSIG_ORGAN_IMPLANTED, PROC_REF(on_organ_insertion)) + RegisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT, PROC_REF(clean)) + RegisterSignal(parent, COMSIG_MOVABLE_BUCKLE, PROC_REF(try_infect_buckle)) + RegisterSignal(parent, COMSIG_MOVABLE_BUMP, PROC_REF(try_infect_collide)) + RegisterSignal(parent, COMSIG_MOVABLE_IMPACT_ZONE, PROC_REF(try_infect_impact_zone)) + if(isitem(parent)) + RegisterSignal(parent, COMSIG_ITEM_ATTACK_ZONE, PROC_REF(try_infect_attack_zone)) + RegisterSignal(parent, COMSIG_ITEM_ATTACK, PROC_REF(try_infect_attack)) + RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(try_infect_equipped)) + RegisterSignal(parent, COMSIG_FOOD_EATEN, PROC_REF(try_infect_eat)) + RegisterSignal(parent, COMSIG_PILL_CONSUMED, PROC_REF(try_infect_eat)) + if(istype(parent, /obj/item/reagent_containers/cup)) + RegisterSignal(parent, COMSIG_GLASS_DRANK, PROC_REF(try_infect_drink)) + if(isorgan(parent)) + RegisterSignal(parent, COMSIG_ORGAN_IMPLANTED, PROC_REF(on_organ_insertion)) + +/datum/component/infective/UnregisterFromParent() + . = ..() + UnregisterSignal(parent, list( + COMSIG_FOOD_EATEN, + COMSIG_PILL_CONSUMED, + COMSIG_COMPONENT_CLEAN_ACT, + COMSIG_MOVABLE_BUMP, + COMSIG_MOVABLE_IMPACT_ZONE, + COMSIG_ITEM_ATTACK_ZONE, + COMSIG_ITEM_ATTACK, + COMSIG_ITEM_EQUIPPED, + COMSIG_GLASS_DRANK, + COMSIG_ORGAN_IMPLANTED, + )) + qdel(GetComponent(/datum/component/connect_loc_behalf)) /datum/component/infective/proc/on_organ_insertion(obj/item/organ/target, mob/living/carbon/receiver) SIGNAL_HANDLER @@ -62,16 +97,16 @@ eater.add_mood_event("disgust", /datum/mood_event/disgust/dirty_food) - if(is_weak && !prob(weak_infection_chance)) - return - - for(var/datum/disease/disease in diseases) + for(var/datum/disease/disease as anything in diseases) + if(is_weak && !prob(weak_infection_chance)) + continue if(!disease.has_required_infectious_organ(eater, ORGAN_SLOT_STOMACH)) continue eater.ForceContractDisease(disease) - try_infect(feeder, BODY_ZONE_L_ARM) + if(!is_weak) + try_infect(feeder, BODY_ZONE_L_ARM) /datum/component/infective/proc/try_infect_drink(datum/source, mob/living/drinker, mob/living/feeder) SIGNAL_HANDLER @@ -79,11 +114,14 @@ if(HAS_TRAIT(drinker, TRAIT_STRONG_STOMACH)) return - var/appendage_zone = feeder.held_items.Find(source) - appendage_zone = appendage_zone == 0 ? BODY_ZONE_CHEST : appendage_zone % 2 ? BODY_ZONE_R_ARM : BODY_ZONE_L_ARM - try_infect(feeder, appendage_zone) + if(!is_weak) + var/appendage_zone = feeder.held_items.Find(source) + appendage_zone = appendage_zone == 0 ? BODY_ZONE_CHEST : (appendage_zone % 2 ? BODY_ZONE_R_ARM : BODY_ZONE_L_ARM) + try_infect(feeder, appendage_zone) - for(var/datum/disease/disease in diseases) + for(var/datum/disease/disease as anything in diseases) + if(is_weak && !prob(weak_infection_chance)) + continue if(!disease.has_required_infectious_organ(drinker, ORGAN_SLOT_STOMACH)) continue @@ -163,19 +201,3 @@ /datum/component/infective/proc/try_infect(mob/living/L, target_zone) for(var/V in diseases) L.ContactContractDisease(V, target_zone) - -/datum/component/infective/UnregisterFromParent() - . = ..() - UnregisterSignal(parent, list( - COMSIG_FOOD_EATEN, - COMSIG_PILL_CONSUMED, - COMSIG_COMPONENT_CLEAN_ACT, - COMSIG_MOVABLE_BUMP, - COMSIG_MOVABLE_IMPACT_ZONE, - COMSIG_ITEM_ATTACK_ZONE, - COMSIG_ITEM_ATTACK, - COMSIG_ITEM_EQUIPPED, - COMSIG_GLASS_DRANK, - COMSIG_ORGAN_IMPLANTED, - )) - qdel(GetComponent(/datum/component/connect_loc_behalf)) diff --git a/code/datums/components/interaction_booby_trap.dm b/code/datums/components/interaction_booby_trap.dm index 2ae22ffbb5a..ef8d3c78cfc 100644 --- a/code/datums/components/interaction_booby_trap.dm +++ b/code/datums/components/interaction_booby_trap.dm @@ -26,7 +26,7 @@ /datum/component/interaction_booby_trap/Initialize( explosion_light_range = 3, explosion_heavy_range = 1, // So we destroy some machine components - triggered_sound = 'sound/machines/triple_beep.ogg', + triggered_sound = 'sound/machines/beep/triple_beep.ogg', trigger_delay = 0.5 SECONDS, sound_loop_type = /datum/looping_sound/trapped_machine_beep, defuse_tool = TOOL_SCREWDRIVER, diff --git a/code/datums/components/irradiated.dm b/code/datums/components/irradiated.dm index 077539f49db..0f70e0d80b7 100644 --- a/code/datums/components/irradiated.dm +++ b/code/datums/components/irradiated.dm @@ -51,11 +51,13 @@ /datum/component/irradiated/RegisterWithParent() RegisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT, PROC_REF(on_clean)) RegisterSignal(parent, COMSIG_GEIGER_COUNTER_SCAN, PROC_REF(on_geiger_counter_scan)) + RegisterSignal(parent, COMSIG_LIVING_HEALTHSCAN, PROC_REF(on_healthscan)) /datum/component/irradiated/UnregisterFromParent() UnregisterSignal(parent, list( COMSIG_COMPONENT_CLEAN_ACT, COMSIG_GEIGER_COUNTER_SCAN, + COMSIG_LIVING_HEALTHSCAN, )) /datum/component/irradiated/Destroy(force) @@ -138,7 +140,7 @@ if(human_parent.is_blind()) to_chat(human_parent, span_boldwarning("Your [affected_limb.plaintext_zone] feels like it's bubbling, then burns like hell!")) - human_parent.apply_damage(RADIATION_BURN_SPLOTCH_DAMAGE, BURN, affected_limb) + human_parent.apply_damage(RADIATION_BURN_SPLOTCH_DAMAGE, BURN, affected_limb, wound_clothing = FALSE) playsound( human_parent, pick('sound/effects/wounds/sizzle1.ogg', 'sound/effects/wounds/sizzle2.ogg'), @@ -186,6 +188,12 @@ return COMSIG_GEIGER_COUNTER_SCAN_SUCCESSFUL +/datum/component/irradiated/proc/on_healthscan(datum/source, list/render_list, advanced, mob/user, mode, tochat) + SIGNAL_HANDLER + + render_list += conditional_tooltip("Subject is irradiated.", "Supply antiradiation or antitoxin, such as [/datum/reagent/medicine/potass_iodide::name] or [/datum/reagent/medicine/pen_acid::name].", tochat) + render_list += "
" + /atom/movable/screen/alert/irradiated name = "Irradiated" desc = "You're irradiated! Heal your toxins quick, and stand under a shower to halt the incoming damage." diff --git a/code/datums/components/itempicky.dm b/code/datums/components/itempicky.dm index 74fbdff1caa..bda8b1ae138 100644 --- a/code/datums/components/itempicky.dm +++ b/code/datums/components/itempicky.dm @@ -5,13 +5,21 @@ var/whitelist /// Message shown if you try to pick up an item not in the whitelist var/message = "You don't like %TARGET, why would you hold it?" + /// An optional callback we check for overriding our whitelist + var/datum/callback/tertiary_condition = null -/datum/component/itempicky/Initialize(whitelist, message) +/datum/component/itempicky/Initialize(whitelist, message, tertiary_condition) if(!ismob(parent)) return COMPONENT_INCOMPATIBLE src.whitelist = whitelist if(message) src.message = message + if(tertiary_condition) + src.tertiary_condition = tertiary_condition + +/datum/component/itempicky/Destroy(force) + tertiary_condition = null + return ..() /datum/component/itempicky/RegisterWithParent() RegisterSignal(parent, COMSIG_LIVING_TRY_PUT_IN_HAND, PROC_REF(particularly)) @@ -30,6 +38,7 @@ /datum/component/itempicky/proc/particularly(datum/source, obj/item/pickingup) SIGNAL_HANDLER - if(!is_type_in_typecache(pickingup, whitelist)) + // if we were passed the output of a callback, check against that + if(!tertiary_condition?.Invoke() && !is_type_in_typecache(pickingup, whitelist)) to_chat(source, span_warning("[replacetext(message, "%TARGET", pickingup)]")) return COMPONENT_LIVING_CANT_PUT_IN_HAND diff --git a/code/datums/components/jetpack.dm b/code/datums/components/jetpack.dm index 437660abc82..1da8822091b 100644 --- a/code/datums/components/jetpack.dm +++ b/code/datums/components/jetpack.dm @@ -17,17 +17,25 @@ var/datum/effect_system/trail_follow/trail /// The typepath to instansiate our trail as, when we need it var/effect_type + /// Drift force applied each movement tick + var/drift_force + /// Force that applied when stabiliziation is active and the player isn't moving in the same direction as the jetpack + var/stabilization_force + /// Our current user + var/mob/user /** * Arguments: * * stabilize - If we should drift when we finish moving, or sit stable in space] + * * drift_force - How much force is applied whenever the user tries to move + * * stabilization_force - How much force is applied per tick when we try to stabilize the user * * activation_signal - Signal we activate on * * deactivation_signal - Signal we deactivate on * * return_flag - Flag to return if activation fails * * check_on_move - Callback we call each time we attempt a move, we expect it to retun true if the move is ok, false otherwise. It expects an arg, TRUE if fuel should be consumed, FALSE othewise * * effect_type - Type of trail_follow to spawn */ -/datum/component/jetpack/Initialize(stabilize, activation_signal, deactivation_signal, return_flag, datum/callback/check_on_move, datum/effect_system/trail_follow/effect_type) +/datum/component/jetpack/Initialize(stabilize, drift_force = 1 NEWTONS, stabilization_force = 1 NEWTONS, activation_signal, deactivation_signal, return_flag, datum/callback/check_on_move, datum/effect_system/trail_follow/effect_type) . = ..() if(!isatom(parent)) return COMPONENT_INCOMPATIBLE @@ -44,8 +52,10 @@ src.deactivation_signal = deactivation_signal src.return_flag = return_flag src.effect_type = effect_type + src.drift_force = drift_force + src.stabilization_force = stabilization_force -/datum/component/jetpack/InheritComponent(datum/component/component, original, stabilize, activation_signal, deactivation_signal, return_flag, datum/callback/check_on_move, datum/effect_system/trail_follow/effect_type) +/datum/component/jetpack/InheritComponent(datum/component/component, original, stabilize, drift_force = 1 NEWTONS, stabilization_force = 1 NEWTONS, activation_signal, deactivation_signal, return_flag, datum/callback/check_on_move, datum/effect_system/trail_follow/effect_type) UnregisterSignal(parent, src.activation_signal) if(src.deactivation_signal) UnregisterSignal(parent, src.deactivation_signal) @@ -59,6 +69,8 @@ src.deactivation_signal = deactivation_signal src.return_flag = return_flag src.effect_type = effect_type + src.drift_force = drift_force + src.stabilization_force = stabilization_force if(trail && trail.effect_type != effect_type) setup_trail(trail.holder) @@ -66,87 +78,86 @@ /datum/component/jetpack/Destroy(force) if(trail) QDEL_NULL(trail) + user = null check_on_move = null return ..() /datum/component/jetpack/proc/setup_trail(mob/user) if(trail) QDEL_NULL(trail) - trail = new effect_type trail.auto_process = FALSE trail.set_up(user) trail.start() -/datum/component/jetpack/proc/activate(datum/source, mob/user) +/datum/component/jetpack/proc/activate(datum/source, mob/new_user) SIGNAL_HANDLER if(!check_on_move.Invoke(TRUE)) return return_flag + user = new_user RegisterSignal(user, COMSIG_MOVABLE_MOVED, PROC_REF(move_react)) RegisterSignal(user, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(pre_move_react)) - RegisterSignal(user, COMSIG_MOVABLE_SPACEMOVE, PROC_REF(spacemove_react)) - RegisterSignal(user, COMSIG_MOVABLE_DRIFT_VISUAL_ATTEMPT, PROC_REF(block_starting_visuals)) - RegisterSignal(user, COMSIG_MOVABLE_DRIFT_BLOCK_INPUT, PROC_REF(ignore_ending_block)) - + RegisterSignal(user, COMSIG_MOB_CLIENT_MOVE_NOGRAV, PROC_REF(on_client_move)) + START_PROCESSING(SSnewtonian_movement, src) setup_trail(user) -/datum/component/jetpack/proc/deactivate(datum/source, mob/user) +/datum/component/jetpack/proc/deactivate(datum/source, mob/old_user) SIGNAL_HANDLER - UnregisterSignal(user, COMSIG_MOVABLE_MOVED) - UnregisterSignal(user, COMSIG_MOVABLE_PRE_MOVE) - UnregisterSignal(user, COMSIG_MOVABLE_SPACEMOVE) - UnregisterSignal(user, COMSIG_MOVABLE_DRIFT_VISUAL_ATTEMPT) - UnregisterSignal(user, COMSIG_MOVABLE_DRIFT_BLOCK_INPUT) + UnregisterSignal(old_user, COMSIG_MOVABLE_MOVED) + UnregisterSignal(old_user, COMSIG_MOVABLE_PRE_MOVE) + UnregisterSignal(old_user, COMSIG_MOB_CLIENT_MOVE_NOGRAV) + STOP_PROCESSING(SSnewtonian_movement, src) + user = null if(trail) QDEL_NULL(trail) -/datum/component/jetpack/proc/move_react(mob/user) +/datum/component/jetpack/proc/move_react(mob/source) SIGNAL_HANDLER - if(!user || !user.client)//Don't allow jet self using + if (!should_trigger(source)) return - if(!isturf(user.loc))//You can't use jet in nowhere or from mecha/closet - return - if(!(user.movement_type & FLOATING) || user.buckled)//You don't want use jet in gravity or while buckled. - return - if(user.pulledby)//You don't must use jet if someone pull you - return - if(user.throwing)//You don't must use jet if you thrown - return - if(user.client.intended_direction)//You use jet when press keys. yes. - thrust() -/datum/component/jetpack/proc/pre_move_react(mob/user) + if(source.client.intended_direction && check_on_move.Invoke(FALSE))//You use jet when press keys. yes. + trail.generate_effect() + +/datum/component/jetpack/proc/should_trigger(mob/source) + if(!source || !source.client)//Don't allow jet self using + return FALSE + if(!isturf(source.loc))//You can't use jet in nowhere or from mecha/closet + return FALSE + if(!(source.movement_type & FLOATING) || source.buckled)//You don't want use jet in gravity or while buckled. + return FALSE + if(source.pulledby)//You don't must use jet if someone pull you + return FALSE + if(source.throwing)//You don't must use jet if you thrown + return FALSE + return TRUE + +/datum/component/jetpack/proc/pre_move_react(mob/source) SIGNAL_HANDLER if(!trail) return FALSE - trail.oldposition = get_turf(user) + trail.oldposition = get_turf(source) -/datum/component/jetpack/proc/spacemove_react(mob/user, movement_dir, continuous_move) +/datum/component/jetpack/process(seconds_per_tick) + if (!should_trigger(user) || !stabilize || isnull(user.drift_handler)) + return + + var/max_drift_force = (DEFAULT_INERTIA_SPEED / user.cached_multiplicative_slowdown - 1) / INERTIA_SPEED_COEF + 1 + user.drift_handler.stabilize_drift(user.client.intended_direction ? dir2angle(user.client.intended_direction) : null, user.client.intended_direction ? max_drift_force : 0, stabilization_force * (seconds_per_tick * 1 SECONDS)) + +/datum/component/jetpack/proc/on_client_move(mob/source, list/move_args) SIGNAL_HANDLER - if(!continuous_move && movement_dir) - return COMSIG_MOVABLE_STOP_SPACEMOVE - // Check if we have the fuel to stop this. Do NOT cosume any fuel, just check - // This is done because things other then us can use our fuel - if(stabilize && check_on_move.Invoke(FALSE)) - return COMSIG_MOVABLE_STOP_SPACEMOVE -/// Returns true if the thrust went well, false otherwise -/datum/component/jetpack/proc/thrust() - if(!check_on_move.Invoke(TRUE)) - return FALSE - trail.generate_effect() - return TRUE + if (!should_trigger(source)) + return -/// Basically, tell the drift component not to do its starting visuals, because they look dumb for us -/datum/component/jetpack/proc/block_starting_visuals(datum/source) - SIGNAL_HANDLER - return DRIFT_VISUAL_FAILED + if (!check_on_move.Invoke(TRUE)) + return -/// If we're on, don't let the drift component block movements at the end since we can speed -/datum/component/jetpack/proc/ignore_ending_block(datum/source) - SIGNAL_HANDLER - return DRIFT_ALLOW_INPUT + var/max_drift_force = (DEFAULT_INERTIA_SPEED / source.cached_multiplicative_slowdown - 1) / INERTIA_SPEED_COEF + 1 + source.newtonian_move(dir2angle(source.client.intended_direction), instant = TRUE, drift_force = drift_force, controlled_cap = max_drift_force) + source.setDir(source.client.intended_direction) diff --git a/code/datums/components/jukebox.dm b/code/datums/components/jukebox.dm index 0bb65e818e8..175296cddfd 100644 --- a/code/datums/components/jukebox.dm +++ b/code/datums/components/jukebox.dm @@ -400,7 +400,7 @@ // Default track supplied for testing and also because it's a banger /datum/track/default - song_path = 'sound/ambience/title3.ogg' + song_path = 'sound/music/lobby_music/title3.ogg' song_name = "Tintin on the Moon" song_length = 3 MINUTES + 52 SECONDS song_beat = 1 SECONDS diff --git a/code/datums/components/life_link.dm b/code/datums/components/life_link.dm index 628aceabc95..314a3d7931b 100644 --- a/code/datums/components/life_link.dm +++ b/code/datums/components/life_link.dm @@ -128,7 +128,7 @@ return holder.icon_state = "hud[RoundHealth(host)]" var/icon/size_check = icon(mob_parent.icon, mob_parent.icon_state, mob_parent.dir) - holder.pixel_y = size_check.Height() - world.icon_size + holder.pixel_y = size_check.Height() - ICON_SIZE_Y /// Update our vital status on the medical hud /datum/component/life_link/proc/update_med_hud_status(mob/living/mob_parent) @@ -136,7 +136,7 @@ if(isnull(holder)) return var/icon/size_check = icon(mob_parent.icon, mob_parent.icon_state, mob_parent.dir) - holder.pixel_y = size_check.Height() - world.icon_size + holder.pixel_y = size_check.Height() - ICON_SIZE_Y if(host.stat == DEAD || HAS_TRAIT(host, TRAIT_FAKEDEATH)) holder.icon_state = "huddead" else diff --git a/code/datums/components/lockable_storage.dm b/code/datums/components/lockable_storage.dm index 482cb134159..ca058cb3fbf 100644 --- a/code/datums/components/lockable_storage.dm +++ b/code/datums/components/lockable_storage.dm @@ -62,7 +62,6 @@ UnregisterSignal(parent, list( COMSIG_ATOM_TOOL_ACT(TOOL_SCREWDRIVER), COMSIG_ATOM_TOOL_ACT(TOOL_MULTITOOL), - COMSIG_ATOM_STORAGE_ITEM_INTERACT_INSERT, )) UnregisterSignal(parent, list( COMSIG_ATOM_EXAMINE, diff --git a/code/datums/components/mind_linker.dm b/code/datums/components/mind_linker.dm index 507860fa934..156dc825dd5 100644 --- a/code/datums/components/mind_linker.dm +++ b/code/datums/components/mind_linker.dm @@ -249,7 +249,7 @@ var/datum/component/mind_linker/linker = target var/mob/living/linker_parent = linker.parent - var/message = tgui_input_text(owner, "Enter a message to transmit.", "[linker.network_name] Telepathy") + var/message = tgui_input_text(owner, "Enter a message to transmit.", "[linker.network_name] Telepathy", max_length = MAX_MESSAGE_LEN) if(!message || QDELETED(src) || QDELETED(owner) || owner.stat == DEAD) return diff --git a/code/datums/components/mob_harvest.dm b/code/datums/components/mob_harvest.dm index b9f9f86350b..242161027b0 100644 --- a/code/datums/components/mob_harvest.dm +++ b/code/datums/components/mob_harvest.dm @@ -25,7 +25,7 @@ ///how long it takes to harvest from the mob var/item_harvest_time = 5 SECONDS ///typepath of harvest sound - var/item_harvest_sound = 'sound/items/welder2.ogg' + var/item_harvest_sound = 'sound/items/tools/welder2.ogg' //harvest_type, produced_item_typepath and speedup_type are typepaths, not reference /datum/component/mob_harvest/Initialize(harvest_tool, fed_item, produced_item_typepath, produced_item_desc, max_ready, item_generation_wait, item_reduction_time, item_harvest_time, item_harvest_sound) diff --git a/code/datums/components/plumbing/_plumbing.dm b/code/datums/components/plumbing/_plumbing.dm index c59be2ed276..a1be66654a2 100644 --- a/code/datums/components/plumbing/_plumbing.dm +++ b/code/datums/components/plumbing/_plumbing.dm @@ -343,7 +343,7 @@ parent_movable.update_appearance() if(changer) - playsound(changer, 'sound/items/ratchet.ogg', 10, TRUE) //sound + playsound(changer, 'sound/items/tools/ratchet.ogg', 10, TRUE) //sound //quickly disconnect and reconnect the network. if(active) diff --git a/code/datums/components/profound_fisher.dm b/code/datums/components/profound_fisher.dm index 5bd5af12943..61f6543bd12 100644 --- a/code/datums/components/profound_fisher.dm +++ b/code/datums/components/profound_fisher.dm @@ -64,9 +64,12 @@ /datum/component/profound_fisher/proc/on_unarmed_attack(mob/living/source, atom/attack_target, proximity_flag, list/modifiers) SIGNAL_HANDLER - if(!source.client || !should_fish_on(source, attack_target)) + if(!should_fish_on(source, attack_target)) return - INVOKE_ASYNC(src, PROC_REF(begin_fishing), source, attack_target) + if(source.client) + INVOKE_ASYNC(src, PROC_REF(begin_fishing), source, attack_target) + else + INVOKE_ASYNC(src, PROC_REF(pretend_fish), source, attack_target) return COMPONENT_CANCEL_ATTACK_CHAIN /datum/component/profound_fisher/proc/pre_attack(mob/living/source, atom/target) @@ -77,34 +80,33 @@ if(source.client) INVOKE_ASYNC(src, PROC_REF(begin_fishing), source, target) else - INVOKE_ASYNC(src, PROC_REF(pretend_fish), target) + INVOKE_ASYNC(src, PROC_REF(pretend_fish), source, target) return COMPONENT_HOSTILE_NO_ATTACK /datum/component/profound_fisher/proc/should_fish_on(mob/living/user, atom/target) - if(!HAS_TRAIT(target, TRAIT_FISHING_SPOT) || HAS_TRAIT(user, TRAIT_GONE_FISHING)) + if(!HAS_TRAIT(target, TRAIT_FISHING_SPOT) || GLOB.fishing_challenges_by_user[user]) return FALSE if(user.combat_mode || !user.CanReach(target)) return FALSE return TRUE /datum/component/profound_fisher/proc/begin_fishing(mob/living/user, atom/target) - RegisterSignal(user, SIGNAL_ADDTRAIT(TRAIT_GONE_FISHING), PROC_REF(actually_fishing_with_internal_rod)) + RegisterSignal(user, COMSIG_MOB_BEGIN_FISHING, PROC_REF(actually_fishing_with_internal_rod)) our_rod.melee_attack_chain(user, target) - UnregisterSignal(user, SIGNAL_ADDTRAIT(TRAIT_GONE_FISHING)) + UnregisterSignal(user, COMSIG_MOB_BEGIN_FISHING) /datum/component/profound_fisher/proc/actually_fishing_with_internal_rod(datum/source) SIGNAL_HANDLER ADD_TRAIT(source, TRAIT_PROFOUND_FISHER, REF(parent)) - RegisterSignal(source, SIGNAL_REMOVETRAIT(TRAIT_GONE_FISHING), PROC_REF(remove_profound_fisher)) + RegisterSignal(source, COMSIG_MOB_COMPLETE_FISHING, PROC_REF(remove_profound_fisher)) /datum/component/profound_fisher/proc/remove_profound_fisher(datum/source) SIGNAL_HANDLER REMOVE_TRAIT(source, TRAIT_PROFOUND_FISHER, TRAIT_GENERIC) - UnregisterSignal(source, SIGNAL_REMOVETRAIT(TRAIT_GONE_FISHING)) + UnregisterSignal(source, COMSIG_MOB_COMPLETE_FISHING) -/datum/component/profound_fisher/proc/pretend_fish(atom/target) - var/mob/living/living_parent = parent - if(DOING_INTERACTION_WITH_TARGET(living_parent, target)) +/datum/component/profound_fisher/proc/pretend_fish(mob/living/source, atom/target) + if(DOING_INTERACTION_WITH_TARGET(source, target)) return var/list/fish_spot_container[NPC_FISHING_SPOT] SEND_SIGNAL(target, COMSIG_NPC_FISHING, fish_spot_container) @@ -113,13 +115,14 @@ return null var/obj/effect/fishing_float/float = new(get_turf(target), target) playsound(float, 'sound/effects/splash.ogg', 100) - var/happiness_percentage = living_parent.ai_controller?.blackboard[BB_BASIC_HAPPINESS] / 100 - var/fishing_speed = 10 SECONDS - round(4 SECONDS * happiness_percentage) - if(!do_after(living_parent, fishing_speed, target = target) && !QDELETED(fish_spot)) - qdel(float) - return - var/reward_loot = fish_spot.roll_reward(our_rod, parent) - fish_spot.dispense_reward(reward_loot, parent, target) + if(!PERFORM_ALL_TESTS(fish_sources)) + var/happiness_percentage = source.ai_controller?.blackboard[BB_BASIC_HAPPINESS] * 0.01 + var/fishing_speed = 10 SECONDS - round(4 SECONDS * happiness_percentage) + if(!do_after(source, fishing_speed, target = target) && !QDELETED(fish_spot)) + qdel(float) + return + var/reward_loot = fish_spot.roll_reward(our_rod, source) + fish_spot.dispense_reward(reward_loot, source, target) playsound(float, 'sound/effects/bigsplash.ogg', 100) qdel(float) @@ -127,3 +130,5 @@ line = /obj/item/fishing_line/reinforced bait = /obj/item/food/bait/doughball/synthetic/unconsumable resistance_flags = INDESTRUCTIBLE + reel_overlay = null + show_in_wiki = FALSE //abstract fishing rod diff --git a/code/datums/components/ranged_attacks.dm b/code/datums/components/ranged_attacks.dm index 2f9c6cb822d..58883ce5811 100644 --- a/code/datums/components/ranged_attacks.dm +++ b/code/datums/components/ranged_attacks.dm @@ -20,7 +20,7 @@ /datum/component/ranged_attacks/Initialize( casing_type, projectile_type, - projectile_sound = 'sound/weapons/gun/pistol/shot.ogg', + projectile_sound = 'sound/items/weapons/gun/pistol/shot.ogg', burst_shots, burst_intervals = 0.2 SECONDS, cooldown_time = 3 SECONDS, diff --git a/code/datums/components/regenerative_shield.dm b/code/datums/components/regenerative_shield.dm index 5ecf6708203..34d305b27e1 100644 --- a/code/datums/components/regenerative_shield.dm +++ b/code/datums/components/regenerative_shield.dm @@ -59,7 +59,7 @@ if(damage >= damage_threshold || number_of_hits <= 0) return NONE - playsound(get_turf(parent), 'sound/weapons/tap.ogg', 20) + playsound(get_turf(parent), 'sound/items/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) @@ -71,14 +71,14 @@ 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) + playsound(parent, 'sound/vehicles/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) + playsound(parent, 'sound/vehicles/mecha/mech_shield_raise.ogg', 20) /datum/component/regenerative_shield/proc/apply_filter_effects(obj/effect/new_effect) if(isnull(new_effect)) diff --git a/code/datums/components/religious_tool.dm b/code/datums/components/religious_tool.dm index 37b62d1aa0e..969e6a9a3ce 100644 --- a/code/datums/components/religious_tool.dm +++ b/code/datums/components/religious_tool.dm @@ -159,15 +159,15 @@ /datum/component/religious_tool/proc/perform_rite(mob/living/user, path) if(user.mind.holy_role < HOLY_ROLE_PRIEST) if(user.mind.holy_role == HOLY_ROLE_DEACON) - to_chat(user, "You are merely a deacon of [GLOB.deity], and therefore cannot perform rites.") + to_chat(user, span_warning("You are merely a deacon of [GLOB.deity], and therefore cannot perform rites.")) else - to_chat(user, "You are not holy, and therefore cannot perform rites.") + to_chat(user, span_warning("You are not holy, and therefore cannot perform rites.")) return if(rite_types_allowlist && !is_path_in_list(path, rite_types_allowlist)) to_chat(user, span_warning("This cannot perform that kind of rite.")) return if(performing_rite) - to_chat(user, "There is a rite currently being performed here already.") + to_chat(user, span_notice("There is a rite currently being performed here already.")) return if(!user.can_perform_action(parent, FORBID_TELEKINESIS_REACH)) to_chat(user,span_warning("You are not close enough to perform the rite.")) diff --git a/code/datums/components/riding/riding_mob.dm b/code/datums/components/riding/riding_mob.dm index 97481ff8233..a125d650513 100644 --- a/code/datums/components/riding/riding_mob.dm +++ b/code/datums/components/riding/riding_mob.dm @@ -13,7 +13,9 @@ var/can_use_abilities = FALSE /// shall we require riders to go through the riding minigame if they arent in our friends list var/require_minigame = FALSE - /// list of blacklisted abilities that cant be shared + /// unsharable abilities that we will force to be shared anyway + var/list/override_unsharable_abilities = list() + /// abilities that are always blacklisted from sharing var/list/blacklist_abilities = list() /datum/component/riding/creature/Initialize(mob/living/riding_mob, force = FALSE, ride_check_flags = NONE, potion_boost = FALSE) @@ -174,6 +176,8 @@ for(var/datum/action/action as anything in ridden_creature.actions) if(is_type_in_list(action, blacklist_abilities)) continue + if(!action.can_be_shared && !is_type_in_list(action, override_unsharable_abilities)) + continue action.GiveAction(rider) /// Takes away the riding parent's abilities from the rider @@ -412,7 +416,7 @@ if(human_user && is_clown_job(human_user.mind?.assigned_role)) // there's a new sheriff in town - playsound(movable_parent, 'sound/creatures/pony/clown_gallup.ogg', 50) + playsound(movable_parent, 'sound/mobs/non-humanoids/pony/clown_gallup.ogg', 50) COOLDOWN_START(src, pony_trot_cooldown, 500 MILLISECONDS) /datum/component/riding/creature/bear/handle_specials() @@ -531,7 +535,6 @@ /datum/component/riding/creature/leaper can_force_unbuckle = FALSE can_use_abilities = TRUE - blacklist_abilities = list(/datum/action/cooldown/toggle_seethrough) ride_check_flags = JUST_FRIEND_RIDERS /datum/component/riding/creature/leaper/handle_specials() diff --git a/code/datums/components/riding/riding_vehicle.dm b/code/datums/components/riding/riding_vehicle.dm index 0d6d4a4c967..ee2835fc7b3 100644 --- a/code/datums/components/riding/riding_vehicle.dm +++ b/code/datums/components/riding/riding_vehicle.dm @@ -15,19 +15,19 @@ if(!keycheck(rider)) if(z_move_flags & ZMOVE_FEEDBACK) - to_chat(rider, "[movable_parent] has no key inserted!") + to_chat(rider, span_warning("[movable_parent] has no key inserted!")) return COMPONENT_RIDDEN_STOP_Z_MOVE if(HAS_TRAIT(rider, TRAIT_INCAPACITATED)) if(z_move_flags & ZMOVE_FEEDBACK) - to_chat(rider, "You cannot operate [movable_parent] right now!") + to_chat(rider, span_warning("You cannot operate [movable_parent] right now!")) return COMPONENT_RIDDEN_STOP_Z_MOVE if(ride_check_flags & RIDER_NEEDS_LEGS && HAS_TRAIT(rider, TRAIT_FLOORED)) if(z_move_flags & ZMOVE_FEEDBACK) - to_chat(rider, "You can't seem to manage that while unable to stand up enough to move [movable_parent]...") + to_chat(rider, span_warning("You can't seem to manage that while unable to stand up enough to move [movable_parent]...")) return COMPONENT_RIDDEN_STOP_Z_MOVE if(ride_check_flags & RIDER_NEEDS_ARMS && HAS_TRAIT(rider, TRAIT_HANDS_BLOCKED)) if(z_move_flags & ZMOVE_FEEDBACK) - to_chat(rider, "You can't seem to hold onto [movable_parent] to move it...") + to_chat(rider, span_warning("You can't seem to hold onto [movable_parent] to move it...")) return COMPONENT_RIDDEN_STOP_Z_MOVE return COMPONENT_RIDDEN_ALLOW_Z_MOVE diff --git a/code/datums/components/rotation.dm b/code/datums/components/rotation.dm index 6ff8197e093..40df294af12 100644 --- a/code/datums/components/rotation.dm +++ b/code/datums/components/rotation.dm @@ -76,7 +76,7 @@ var/obj/rotated_obj = parent rotated_obj.setDir(turn(rotated_obj.dir, degrees)) if(rotation_flags & ROTATION_REQUIRE_WRENCH) - playsound(rotated_obj, 'sound/items/ratchet.ogg', 50, TRUE) + playsound(rotated_obj, 'sound/items/tools/ratchet.ogg', 50, TRUE) post_rotation.Invoke(user, degrees) diff --git a/code/datums/components/scope.dm b/code/datums/components/scope.dm index 087eb0c06d2..46388a15e26 100644 --- a/code/datums/components/scope.dm +++ b/code/datums/components/scope.dm @@ -164,7 +164,7 @@ if(HAS_TRAIT(user, TRAIT_USER_SCOPED)) user.balloon_alert(user, "already zoomed!") return - user.playsound_local(parent, 'sound/weapons/scope.ogg', 75, TRUE) + user.playsound_local(parent, 'sound/items/weapons/scope.ogg', 75, TRUE) tracker = user.overlay_fullscreen("scope", /atom/movable/screen/fullscreen/cursor_catcher/scope, isgun(parent)) tracker.assign_to_mob(user, range_modifier) tracker_owner_ckey = user.ckey @@ -210,7 +210,7 @@ )) REMOVE_TRAIT(user, TRAIT_USER_SCOPED, REF(src)) - user.playsound_local(parent, 'sound/weapons/scope.ogg', 75, TRUE, frequency = -1) + user.playsound_local(parent, 'sound/items/weapons/scope.ogg', 75, TRUE, frequency = -1) user.clear_fullscreen("scope") // if the client has ended up in another mob, find that mob so we can fix their cursor @@ -246,18 +246,18 @@ if(isnull(icon_x)) icon_x = text2num(LAZYACCESS(modifiers, ICON_X)) if(isnull(icon_x)) - icon_x = view_list[1]*world.icon_size/2 + icon_x = view_list[1]*ICON_SIZE_X/2 var/icon_y = text2num(LAZYACCESS(modifiers, VIS_Y)) if(isnull(icon_y)) icon_y = text2num(LAZYACCESS(modifiers, ICON_Y)) if(isnull(icon_y)) - icon_y = view_list[2]*world.icon_size/2 - var/x_cap = range_modifier * view_list[1]*world.icon_size / 2 - var/y_cap = range_modifier * view_list[2]*world.icon_size / 2 - var/uncapped_x = round(range_modifier * (icon_x - view_list[1]*world.icon_size/2) * MOUSE_POINTER_OFFSET_MULT) - var/uncapped_y = round(range_modifier * (icon_y - view_list[2]*world.icon_size/2) * MOUSE_POINTER_OFFSET_MULT) + icon_y = view_list[2]*ICON_SIZE_Y/2 + var/x_cap = range_modifier * view_list[1]*ICON_SIZE_X / 2 + var/y_cap = range_modifier * view_list[2]*ICON_SIZE_Y / 2 + var/uncapped_x = round(range_modifier * (icon_x - view_list[1]*ICON_SIZE_X/2) * MOUSE_POINTER_OFFSET_MULT) + var/uncapped_y = round(range_modifier * (icon_y - view_list[2]*ICON_SIZE_Y/2) * MOUSE_POINTER_OFFSET_MULT) given_x = clamp(uncapped_x, -x_cap, x_cap) given_y = clamp(uncapped_y, -y_cap, y_cap) - given_turf = locate(owner.x+round(given_x/world.icon_size, 1),owner.y+round(given_y/world.icon_size, 1),owner.z) + given_turf = locate(owner.x+round(given_x/ICON_SIZE_X, 1),owner.y+round(given_y/ICON_SIZE_Y, 1),owner.z) #undef MOUSE_POINTER_OFFSET_MULT diff --git a/code/datums/components/seclight_attachable.dm b/code/datums/components/seclight_attachable.dm index b1d4aebc93f..6b3991c9c5e 100644 --- a/code/datums/components/seclight_attachable.dm +++ b/code/datums/components/seclight_attachable.dm @@ -97,8 +97,8 @@ RegisterSignal(parent, COMSIG_ITEM_UI_ACTION_CLICK, PROC_REF(on_action_click)) RegisterSignal(parent, COMSIG_ATOM_ATTACKBY, PROC_REF(on_attackby)) RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) + RegisterSignal(parent, COMSIG_ATOM_SABOTEUR_ACT, PROC_REF(on_hit_by_saboteur)) RegisterSignal(parent, COMSIG_QDELETING, PROC_REF(on_parent_deleted)) - RegisterSignal(parent, COMSIG_HIT_BY_SABOTEUR, PROC_REF(on_saboteur)) /datum/component/seclite_attachable/UnregisterFromParent() UnregisterSignal(parent, list( @@ -110,6 +110,7 @@ COMSIG_ITEM_UI_ACTION_CLICK, COMSIG_ATOM_ATTACKBY, COMSIG_ATOM_EXAMINE, + COMSIG_ATOM_SABOTEUR_ACT, COMSIG_QDELETING, )) @@ -296,8 +297,8 @@ // but that's the downside of using icon states over overlays. source.icon_state = base_state -/// Signal proc for [COMSIG_HIT_BY_SABOTEUR] that turns the light off for a few seconds. -/datum/component/seclite_attachable/proc/on_saboteur(datum/source, disrupt_duration) - SIGNAL_HANDLER +//turns the light off for a few seconds. +/datum/component/seclite_attachable/proc/on_hit_by_saboteur(datum/source, disrupt_duration) . = light.on_saboteur(source, disrupt_duration) update_light() + return . diff --git a/code/datums/components/seethrough_mob.dm b/code/datums/components/seethrough_mob.dm index bae87faf615..b6951c5489b 100644 --- a/code/datums/components/seethrough_mob.dm +++ b/code/datums/components/seethrough_mob.dm @@ -122,6 +122,7 @@ background_icon_state = "bg_alien" cooldown_time = 1 SECONDS melee_cooldown_time = 0 + can_be_shared = FALSE /datum/action/cooldown/toggle_seethrough/Remove(mob/remove_from) var/datum/component/seethrough_mob/transparency = target diff --git a/code/datums/components/shielded.dm b/code/datums/components/shielded.dm index da83c4ad2d2..53fc3308062 100644 --- a/code/datums/components/shielded.dm +++ b/code/datums/components/shielded.dm @@ -101,7 +101,7 @@ var/obj/item/item_parent = parent COOLDOWN_START(src, charge_add_cd, charge_increment_delay) adjust_charge(charge_recovery) // set the number of charges to current + recovery per increment, clamped from zero to max_charges - playsound(item_parent, 'sound/magic/charge.ogg', 50, TRUE) + playsound(item_parent, 'sound/effects/magic/charge.ogg', 50, TRUE) if(current_charges == max_charges) playsound(item_parent, 'sound/machines/ding.ogg', 50, TRUE) diff --git a/code/datums/components/singularity.dm b/code/datums/components/singularity.dm index 14aaedff717..0cd64d829a2 100644 --- a/code/datums/components/singularity.dm +++ b/code/datums/components/singularity.dm @@ -373,7 +373,7 @@ for(var/mob/living/target as anything in GLOB.mob_living_list) if(target.z != atom_parent.z) continue - if(target.status_effects & GODMODE) + if(HAS_TRAIT(target, TRAIT_GODMODE)) continue var/distance_from_target = get_dist(target, atom_parent) if(distance_from_target < closest_distance) diff --git a/code/datums/components/sisyphus_awarder.dm b/code/datums/components/sisyphus_awarder.dm index 2a18a2889fc..854ed26355f 100644 --- a/code/datums/components/sisyphus_awarder.dm +++ b/code/datums/components/sisyphus_awarder.dm @@ -65,4 +65,4 @@ "reverse_dropoff_coords" = list(bottom_of_the_hill.x, bottom_of_the_hill.y, bottom_of_the_hill.z), )) - SEND_SOUND(sisyphus, 'sound/ambience/music/sisyphus/sisyphus.ogg') + SEND_SOUND(sisyphus, 'sound/music/sisyphus/sisyphus.ogg') diff --git a/code/datums/components/sitcomlaughter.dm b/code/datums/components/sitcomlaughter.dm index 02ed818ea30..bc69a08b80c 100644 --- a/code/datums/components/sitcomlaughter.dm +++ b/code/datums/components/sitcomlaughter.dm @@ -4,7 +4,7 @@ proctype = PROC_REF(EngageInComedy) mobtype = /mob/living ///Sounds used for when user has a sitcom action occur - var/list/comedysounds = list('sound/items/SitcomLaugh1.ogg', 'sound/items/SitcomLaugh2.ogg', 'sound/items/SitcomLaugh3.ogg') + var/list/comedysounds = list('sound/items/sitcom_laugh/sitcomLaugh1.ogg', 'sound/items/sitcom_laugh/sitcomLaugh2.ogg', 'sound/items/sitcom_laugh/sitcomLaugh3.ogg') ///Invoked in EngageInComedy is ran var/datum/callback/post_comedy_callback ///Cooldown for inbetween laughs diff --git a/code/datums/components/soapbox.dm b/code/datums/components/soapbox.dm index 4d4577d5e12..9d15e5e6929 100644 --- a/code/datums/components/soapbox.dm +++ b/code/datums/components/soapbox.dm @@ -14,15 +14,17 @@ RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(parent_moved)) ///Applies loud speech to our movable when entering the turf our parent is on -/datum/component/soapbox/proc/on_loc_entered(datum/source, atom/movable/soapbox_arrive) +/datum/component/soapbox/proc/on_loc_entered(datum/source, mob/living/soapbox_arrive) SIGNAL_HANDLER + if(!isliving(soapbox_arrive)) + return if(QDELETED(soapbox_arrive)) return RegisterSignal(soapbox_arrive, COMSIG_MOB_SAY, PROC_REF(soapbox_speech)) soapboxers += soapbox_arrive ///Takes away loud speech from our movable when it leaves the turf our parent is on -/datum/component/soapbox/proc/on_loc_exited(datum/source, atom/movable/soapbox_leave) +/datum/component/soapbox/proc/on_loc_exited(datum/source, mob/living/soapbox_leave) SIGNAL_HANDLER if(soapbox_leave in soapboxers) UnregisterSignal(soapbox_leave, COMSIG_MOB_SAY) diff --git a/code/datums/components/soulstoned.dm b/code/datums/components/soulstoned.dm index bb22030c210..d4e9e0eaf02 100644 --- a/code/datums/components/soulstoned.dm +++ b/code/datums/components/soulstoned.dm @@ -11,8 +11,7 @@ stoned.forceMove(container) stoned.fully_heal() - stoned.add_traits(list(TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED), SOULSTONE_TRAIT) - stoned.status_flags |= GODMODE + stoned.add_traits(list(TRAIT_GODMODE, TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED), SOULSTONE_TRAIT) RegisterSignal(stoned, COMSIG_MOVABLE_MOVED, PROC_REF(free_prisoner)) @@ -25,5 +24,4 @@ /datum/component/soulstoned/UnregisterFromParent() var/mob/living/stoned = parent - stoned.status_flags &= ~GODMODE - stoned.remove_traits(list(TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED), SOULSTONE_TRAIT) + stoned.remove_traits(list(TRAIT_GODMODE, TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED), SOULSTONE_TRAIT) diff --git a/code/datums/components/speechmod.dm b/code/datums/components/speechmod.dm index 8ffa3e8624e..fc01d8d2d84 100644 --- a/code/datums/components/speechmod.dm +++ b/code/datums/components/speechmod.dm @@ -60,6 +60,8 @@ var/message = speech_args[SPEECH_MESSAGE] if(message[1] == "*") return + if(SEND_SIGNAL(source, COMSIG_TRY_MODIFY_SPEECH) & PREVENT_MODIFY_SPEECH) + return if(!isnull(should_modify_speech) && !should_modify_speech.Invoke(source, speech_args)) return diff --git a/code/datums/components/spin2win.dm b/code/datums/components/spin2win.dm index 4524b403355..ce9dfa360b3 100644 --- a/code/datums/components/spin2win.dm +++ b/code/datums/components/spin2win.dm @@ -84,7 +84,7 @@ if(start_spin_message) var/message = replacetext(start_spin_message, "%USER", spinning_user) spinning_user.visible_message(message) - playsound(spinning_user, 'sound/weapons/fwoosh.ogg', 75, FALSE) + playsound(spinning_user, 'sound/items/weapons/fwoosh.ogg', 75, FALSE) stop_spinning_timer_id = addtimer(CALLBACK(src, PROC_REF(stop_spinning), spinning_user), spin_duration, TIMER_STOPPABLE|TIMER_DELETE_ME) RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(on_spin_equipped)) RegisterSignal(parent, COMSIG_ITEM_DROPPED, PROC_REF(on_spin_dropped)) @@ -95,7 +95,7 @@ STOP_PROCESSING(SSprocessing, src) UnregisterSignal(parent, list(COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED)) deltimer(stop_spinning_timer_id) - playsound(user, 'sound/weapons/fwoosh.ogg', 75, FALSE) + playsound(user, 'sound/items/weapons/fwoosh.ogg', 75, FALSE) if(user && end_spin_message) var/message = replacetext(end_spin_message, "%USER", user) user.visible_message(message) @@ -111,7 +111,7 @@ return PROCESS_KILL var/mob/living/item_owner = spinning_item.loc item_owner.emote("spin") - playsound(item_owner, 'sound/weapons/fwoosh.ogg', 75, FALSE) + playsound(item_owner, 'sound/items/weapons/fwoosh.ogg', 75, FALSE) for(var/mob/living/victim in orange(1, item_owner)) spinning_item.attack(victim, item_owner) diff --git a/code/datums/components/spirit_holding.dm b/code/datums/components/spirit_holding.dm index b510fde3523..11ceb778313 100644 --- a/code/datums/components/spirit_holding.dm +++ b/code/datums/components/spirit_holding.dm @@ -149,7 +149,7 @@ return // just in case var/atom/movable/exorcised_movable = parent to_chat(exorcist, span_notice("You begin to exorcise [parent]...")) - playsound(parent, 'sound/hallucinations/veryfar_noise.ogg',40,TRUE) + playsound(parent, 'sound/effects/hallucinations/veryfar_noise.ogg',40,TRUE) if(!do_after(exorcist, 4 SECONDS, target = exorcised_movable)) return playsound(parent, 'sound/effects/pray_chaplain.ogg',60,TRUE) diff --git a/code/datums/components/squeak.dm b/code/datums/components/squeak.dm index 94521486bcc..afd8cce49e8 100644 --- a/code/datums/components/squeak.dm +++ b/code/datums/components/squeak.dm @@ -1,5 +1,5 @@ /datum/component/squeak - var/static/list/default_squeak_sounds = list('sound/items/toysqueak1.ogg'=1, 'sound/items/toysqueak2.ogg'=1, 'sound/items/toysqueak3.ogg'=1) + var/static/list/default_squeak_sounds = list('sound/items/toy_squeak/toysqueak1.ogg'=1, 'sound/items/toy_squeak/toysqueak2.ogg'=1, 'sound/items/toy_squeak/toysqueak3.ogg'=1) var/list/override_squeak_sounds var/mob/holder diff --git a/code/datums/components/stationloving.dm b/code/datums/components/stationloving.dm index 35f67d9cd02..8b59717da70 100644 --- a/code/datums/components/stationloving.dm +++ b/code/datums/components/stationloving.dm @@ -61,7 +61,7 @@ CRASH("Unable to find a blobstart landmark for [type] to relocate [parent].") var/atom/movable/movable_parent = parent - playsound(movable_parent, 'sound/machines/synth_no.ogg', 5, TRUE) + playsound(movable_parent, 'sound/machines/synth/synth_no.ogg', 5, TRUE) var/mob/holder = get(movable_parent, /mob) if(holder) diff --git a/code/datums/components/sticker.dm b/code/datums/components/sticker.dm index a11ab10e7c6..b627f992320 100644 --- a/code/datums/components/sticker.dm +++ b/code/datums/components/sticker.dm @@ -84,8 +84,8 @@ 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 + sticker_overlay.pixel_w = px - ICON_SIZE_X / 2 + sticker_overlay.pixel_z = py - ICON_SIZE_Y / 2 parent_atom.add_overlay(sticker_overlay) stick_callback?.Invoke(parent) diff --git a/code/datums/components/summoning.dm b/code/datums/components/summoning.dm index 69ade1e2f1b..4821f70d006 100644 --- a/code/datums/components/summoning.dm +++ b/code/datums/components/summoning.dm @@ -24,7 +24,7 @@ max_mobs = 3, spawn_delay = 10 SECONDS, spawn_text = "appears out of nowhere", - spawn_sound = 'sound/magic/summon_magic.ogg', + spawn_sound = 'sound/effects/magic/summon_magic.ogg', list/faction, ) if(!isitem(parent) && !ishostile(parent) && !isgun(parent) && !ismachinery(parent) && !isstructure(parent) && !isprojectilespell(parent)) diff --git a/code/datums/components/supermatter_crystal.dm b/code/datums/components/supermatter_crystal.dm index 54a16fe807d..1d8b5233ca7 100644 --- a/code/datums/components/supermatter_crystal.dm +++ b/code/datums/components/supermatter_crystal.dm @@ -71,7 +71,7 @@ SIGNAL_HANDLER if(isliving(user)) var/mob/living/living_mob = user - if(living_mob.incorporeal_move || living_mob.status_flags & GODMODE) + if(living_mob.incorporeal_move || HAS_TRAIT(living_mob, TRAIT_GODMODE)) return if(isalien(user)) dust_mob(source, user, cause = "alien attack") @@ -80,7 +80,7 @@ /datum/component/supermatter_crystal/proc/animal_hit(datum/source, mob/living/simple_animal/user, list/modifiers) SIGNAL_HANDLER - if(user.incorporeal_move || user.status_flags & GODMODE) + if(user.incorporeal_move || HAS_TRAIT(user, TRAIT_GODMODE)) return var/atom/atom_source = source var/murder @@ -101,7 +101,7 @@ SIGNAL_HANDLER if(isliving(user)) var/mob/living/living_mob = user - if(living_mob.incorporeal_move || living_mob.status_flags & GODMODE) + if(living_mob.incorporeal_move || HAS_TRAIT(living_mob, TRAIT_GODMODE)) return var/atom/atom_source = source if(iscyborg(user) && atom_source.Adjacent(user)) @@ -115,7 +115,7 @@ /datum/component/supermatter_crystal/proc/hand_hit(datum/source, mob/living/user, list/modifiers) SIGNAL_HANDLER - if(user.incorporeal_move || user.status_flags & GODMODE) + if(user.incorporeal_move || HAS_TRAIT(user, TRAIT_GODMODE)) return if(user.zone_selected != BODY_ZONE_PRECISE_MOUTH) dust_mob(source, user, cause = "hand") @@ -202,7 +202,7 @@ return if(atom_source.Adjacent(user)) //if the item is stuck to the person, kill the person too instead of eating just the item. - if(user.incorporeal_move || user.status_flags & GODMODE) + if(user.incorporeal_move || HAS_TRAIT(user, TRAIT_GODMODE)) return var/vis_msg = span_danger("[user] reaches out and touches [atom_source] with [item], inducing a resonance... [item] starts to glow briefly before the light continues up to [user]'s body. [user.p_They()] burst[user.p_s()] into flames before flashing into dust!") var/mob_msg = span_userdanger("You reach out and touch [atom_source] with [item]. Everything starts burning and all you can hear is ringing. Your last thought is \"That was not a wise decision.\"") @@ -219,7 +219,7 @@ SIGNAL_HANDLER if(isliving(hit_object)) var/mob/living/hit_mob = hit_object - if(hit_mob.incorporeal_move || hit_mob.status_flags & GODMODE) + if(hit_mob.incorporeal_move || HAS_TRAIT(hit_mob, TRAIT_GODMODE)) return var/atom/atom_source = source var/obj/machinery/power/supermatter_crystal/our_supermatter = parent // Why is this a component? @@ -272,7 +272,7 @@ span_hear("You hear a loud crack as you are washed with a wave of heat.")) /datum/component/supermatter_crystal/proc/dust_mob(datum/source, mob/living/nom, vis_msg, mob_msg, cause) - if(nom.incorporeal_move || nom.status_flags & GODMODE) //try to keep supermatter sliver's + hemostat's dust conditions in sync with this too + if(nom.incorporeal_move || HAS_TRAIT(nom, TRAIT_GODMODE)) //try to keep supermatter sliver's + hemostat's dust conditions in sync with this too return var/atom/atom_source = source if(!vis_msg) @@ -290,10 +290,8 @@ /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 + if(HAS_TRAIT(consumed_object, TRAIT_GODMODE)) + return var/atom/atom_source = source SEND_SIGNAL(consumed_object, COMSIG_SUPERMATTER_CONSUMED, atom_source) diff --git a/code/datums/components/tackle.dm b/code/datums/components/tackle.dm index 0d810fcd4f7..9263dbfd10a 100644 --- a/code/datums/components/tackle.dm +++ b/code/datums/components/tackle.dm @@ -71,7 +71,7 @@ /datum/component/tackler/proc/checkTackle(mob/living/carbon/user, atom/clicked_atom, list/modifiers) SIGNAL_HANDLER - if(modifiers[ALT_CLICK] || modifiers[SHIFT_CLICK] || modifiers[CTRL_CLICK] || modifiers[MIDDLE_CLICK]) + if(!modifiers[RIGHT_CLICK] || modifiers[ALT_CLICK] || modifiers[SHIFT_CLICK] || modifiers[CTRL_CLICK] || modifiers[MIDDLE_CLICK]) return if(!user.throw_mode || user.get_active_held_item() || user.pulling || user.buckled || user.incapacitated) @@ -104,7 +104,7 @@ tackling = TRUE RegisterSignal(user, COMSIG_MOVABLE_MOVED, PROC_REF(checkObstacle)) - playsound(user, 'sound/weapons/thudswoosh.ogg', 40, TRUE, -1) + playsound(user, 'sound/items/weapons/thudswoosh.ogg', 40, TRUE, -1) var/leap_word = isfeline(user) ? "pounce" : "leap" //If cat, "pounce" instead of "leap". // SKYRAT EDIT - FELINE TRAITS. Was: isfelinid(user) if(can_see(user, clicked_atom, 7)) @@ -538,7 +538,7 @@ else user.adjustBruteLoss(40, updating_health=FALSE) user.adjustStaminaLoss(30) - playsound(user, 'sound/effects/blobattack.ogg', 60, TRUE) + playsound(user, 'sound/effects/blob/blobattack.ogg', 60, TRUE) playsound(user, 'sound/effects/splat.ogg', 70, TRUE) playsound(user, 'sound/effects/wounds/crack2.ogg', 70, TRUE) user.emote("scream") @@ -555,7 +555,7 @@ user.adjustBruteLoss(40, updating_health = FALSE) user.adjustStaminaLoss(30) user.gain_trauma_type(BRAIN_TRAUMA_MILD) - playsound(user, 'sound/effects/blobattack.ogg', 60, TRUE) + playsound(user, 'sound/effects/blob/blobattack.ogg', 60, TRUE) playsound(user, 'sound/effects/splat.ogg', 70, TRUE) user.emote("gurgle") shake_camera(user, 7, 7) @@ -567,7 +567,7 @@ user.adjustBruteLoss(30) user.Unconscious(10 SECONDS) user.gain_trauma_type(BRAIN_TRAUMA_MILD) - user.playsound_local(get_turf(user), 'sound/weapons/flashbang.ogg', 100, TRUE, 8) + user.playsound_local(get_turf(user), 'sound/items/weapons/flashbang.ogg', 100, TRUE, 8) shake_camera(user, 6, 6) user.flash_act(1, TRUE, TRUE, length = 3.5) @@ -578,7 +578,7 @@ user.adjust_confusion(15 SECONDS) if(prob(80)) user.gain_trauma(/datum/brain_trauma/mild/concussion) - user.playsound_local(get_turf(user), 'sound/weapons/flashbang.ogg', 100, TRUE, 8) + user.playsound_local(get_turf(user), 'sound/items/weapons/flashbang.ogg', 100, TRUE, 8) user.Knockdown(4 SECONDS) shake_camera(user, 5, 5) user.flash_act(1, TRUE, TRUE, length = 2.5) @@ -598,7 +598,7 @@ user.Knockdown(2 SECONDS) shake_camera(user, 2, 2) - playsound(user, 'sound/weapons/smash.ogg', 70, TRUE) + playsound(user, 'sound/items/weapons/smash.ogg', 70, TRUE) /datum/component/tackler/proc/resetTackle() @@ -608,7 +608,7 @@ ///A special case for splatting for handling windows /datum/component/tackler/proc/splatWindow(mob/living/carbon/user, obj/structure/window/W) - playsound(user, 'sound/effects/Glasshit.ogg', 140, TRUE) + playsound(user, 'sound/effects/glass/Glasshit.ogg', 140, TRUE) if(W.type in list(/obj/structure/window, /obj/structure/window/fulltile, /obj/structure/window/unanchored, /obj/structure/window/fulltile/unanchored)) // boring unreinforced windows for(var/i in 1 to speed) @@ -687,7 +687,7 @@ var/datum/thrownthing/tackle = tackle_ref?.resolve() - playsound(owner, 'sound/weapons/smash.ogg', 70, TRUE) + playsound(owner, 'sound/items/weapons/smash.ogg', 70, TRUE) if(tackle) tackle.finalize(hit=TRUE) resetTackle() diff --git a/code/datums/components/tether.dm b/code/datums/components/tether.dm index e76f5d5b53c..b991891930c 100644 --- a/code/datums/components/tether.dm +++ b/code/datums/components/tether.dm @@ -1,39 +1,180 @@ +/// Creates a tether between two objects that limits movement range. Tether requires LOS and can be adjusted by left/right clicking its /datum/component/tether - dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS + dupe_mode = COMPONENT_DUPE_ALLOWED + /// Other side of the tether var/atom/tether_target + /// Maximum (and initial) distance that this tether can be adjusted to var/max_dist + /// What the tether is going to be called var/tether_name + /// Current extension distance + var/cur_dist + /// Embedded item that the tether "should" originate from + var/atom/embed_target + /// Beam effect + var/datum/beam/tether_beam -/datum/component/tether/Initialize(atom/tether_target, max_dist = 4, tether_name) - if(!isliving(parent) || !istype(tether_target) || !tether_target.loc) +/datum/component/tether/Initialize(atom/tether_target, max_dist = 7, tether_name, atom/embed_target = null, start_distance = null) + if(!ismovable(parent) || !istype(tether_target) || !tether_target.loc) return COMPONENT_INCOMPATIBLE + src.tether_target = tether_target + src.embed_target = embed_target src.max_dist = max_dist + cur_dist = max_dist + if (start_distance != null) + cur_dist = start_distance + var/datum/beam/beam = tether_target.Beam(parent, "line", 'icons/obj/clothing/modsuit/mod_modules.dmi', emissive = FALSE, beam_type = /obj/effect/ebeam/tether) + tether_beam = beam if (ispath(tether_name, /atom)) var/atom/tmp = tether_name src.tether_name = initial(tmp.name) else src.tether_name = tether_name - RegisterSignals(parent, list(COMSIG_MOVABLE_PRE_MOVE), PROC_REF(checkTether)) -/datum/component/tether/proc/checkTether(mob/mover, newloc) +/datum/component/tether/RegisterWithParent() + RegisterSignal(parent, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(check_tether)) + RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(check_snap)) + RegisterSignal(tether_target, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(check_tether)) + RegisterSignal(tether_target, COMSIG_MOVABLE_MOVED, PROC_REF(check_snap)) + RegisterSignal(tether_target, COMSIG_QDELETING, PROC_REF(on_delete)) + RegisterSignal(tether_beam.visuals, COMSIG_CLICK, PROC_REF(beam_click)) + // Also snap if the beam gets deleted, more of a backup check than anything + RegisterSignal(tether_beam.visuals, COMSIG_QDELETING, PROC_REF(on_delete)) + + if (!isnull(embed_target)) + RegisterSignal(embed_target, COMSIG_ITEM_UNEMBEDDED, PROC_REF(on_embedded_removed)) + RegisterSignal(embed_target, COMSIG_QDELETING, PROC_REF(on_delete)) + +/datum/component/tether/UnregisterFromParent() + UnregisterSignal(parent, list(COMSIG_MOVABLE_PRE_MOVE, COMSIG_MOVABLE_MOVED)) + if (!QDELETED(tether_target)) + UnregisterSignal(tether_target, list(COMSIG_MOVABLE_PRE_MOVE, COMSIG_MOVABLE_MOVED, COMSIG_QDELETING)) + if (!QDELETED(tether_beam)) + UnregisterSignal(tether_beam.visuals, list(COMSIG_CLICK, COMSIG_QDELETING)) + qdel(tether_beam) + if (!QDELETED(embed_target)) + UnregisterSignal(embed_target, list(COMSIG_ITEM_UNEMBEDDED, COMSIG_QDELETING)) + +/datum/component/tether/proc/check_tether(atom/source, new_loc) SIGNAL_HANDLER - if (get_dist(mover,newloc) > max_dist) - to_chat(mover, span_userdanger("The [tether_name] runs out of slack and prevents you from moving!")) + if (check_snap()) + return + + if (!isturf(new_loc)) + to_chat(source, span_warning("[tether_name] prevents you from entering [new_loc]!")) return COMPONENT_MOVABLE_BLOCK_PRE_MOVE + var/atom/movable/anchor = (source == tether_target ? parent : tether_target) + if (get_dist(anchor, new_loc) > cur_dist) + if (!istype(anchor) || anchor.anchored || !anchor.Move(get_step_towards(anchor, new_loc))) + to_chat(source, span_warning("[tether_name] runs out of slack and prevents you from moving!")) + return COMPONENT_MOVABLE_BLOCK_PRE_MOVE + var/atom/blocker - out: - for(var/turf/T in get_line(tether_target,newloc)) - if (T.density) - blocker = T - break out - for(var/a in T) - var/atom/A = a - if(A.density && A != mover && A != tether_target) - blocker = A - break out + var/anchor_dir = get_dir(source, anchor) + for (var/turf/line_turf in get_line(anchor, new_loc)) + if (line_turf.density && line_turf != anchor.loc && line_turf != source.loc) + blocker = line_turf + break + if (line_turf == anchor.loc || line_turf == source.loc) + for (var/atom/in_turf in line_turf) + if ((in_turf.flags_1 & ON_BORDER_1) && (in_turf.dir & anchor_dir)) + blocker = in_turf + break + else + for (var/atom/in_turf in line_turf) + if (in_turf.density && in_turf != source && in_turf != tether_target) + blocker = in_turf + break + + if (!isnull(blocker)) + break + if (blocker) - to_chat(mover, span_userdanger("The [tether_name] catches on [blocker] and prevents you from moving!")) + to_chat(source, span_warning("[tether_name] catches on [blocker] and prevents you from moving!")) return COMPONENT_MOVABLE_BLOCK_PRE_MOVE + + if (get_dist(anchor, new_loc) != cur_dist || !ismovable(source)) + return + + var/atom/movable/movable_source = source + var/datum/drift_handler/handler = movable_source.drift_handler + if (isnull(handler)) + return + handler.remove_angle_force(get_angle(anchor, source)) + +/datum/component/tether/proc/check_snap() + SIGNAL_HANDLER + + var/atom/atom_target = parent + // Something broke us out, snap the tether + if (get_dist(atom_target, tether_target) > cur_dist + 1 || !isturf(atom_target.loc) || !isturf(tether_target.loc) || atom_target.z != tether_target.z) + atom_target.visible_message(span_warning("[atom_target]'s [tether_name] snaps!"), span_userdanger("Your [tether_name] snaps!"), span_hear("You hear a cable snapping.")) + qdel(src) + +/datum/component/tether/proc/on_delete() + SIGNAL_HANDLER + qdel(src) + +/datum/component/tether/proc/on_embedded_removed(atom/source, mob/living/victim) + SIGNAL_HANDLER + parent.AddComponent(/datum/component/tether, source, max_dist, tether_name, cur_dist) + qdel(src) + +/datum/component/tether/proc/beam_click(atom/source, atom/location, control, params, mob/user) + SIGNAL_HANDLER + + INVOKE_ASYNC(src, PROC_REF(process_beam_click), source, location, params, user) + +/datum/component/tether/proc/process_beam_click(atom/source, atom/location, params, mob/user) + var/list/modifiers = params2list(params) + if(LAZYACCESS(modifiers, CTRL_CLICK)) + location.balloon_alert(user, "cutting the tether...") + if (!do_after(user, 5 SECONDS, user)) + return + + qdel(src) + location.balloon_alert(user, "tether cut!") + to_chat(parent, span_danger("Your [tether_name] has been cut!")) + return + + if (LAZYACCESS(modifiers, RIGHT_CLICK)) + if (cur_dist >= max_dist) + location.balloon_alert(user, "no coil remaining!") + return + cur_dist += 1 + location.balloon_alert(user, "tether extended") + return + + if (cur_dist <= 1) + location.balloon_alert(user, "too short!") + return + + if (cur_dist > get_dist(parent, tether_target)) + cur_dist -= 1 + location.balloon_alert(user, "tether shortened") + return + + if (!ismovable(parent) && !ismovable(tether_target)) + location.balloon_alert(user, "too short!") + return + + var/atom/movable/movable_parent = parent + var/atom/movable/movable_target = tether_target + + if (istype(movable_parent) && movable_parent.Move(get_step(movable_parent.loc, get_dir(movable_parent, movable_target)))) + cur_dist -= 1 + location.balloon_alert(user, "tether shortened") + return + + if (istype(movable_target) && movable_target.Move(get_step(movable_target.loc, get_dir(movable_target, movable_parent)))) + cur_dist -= 1 + location.balloon_alert(user, "tether shortened") + return + + location.balloon_alert(user, "too short!") + +/obj/effect/ebeam/tether + mouse_opacity = MOUSE_OPACITY_ICON diff --git a/code/datums/components/thermite.dm b/code/datums/components/thermite.dm index 7ab8b755ca1..1fac66c07cd 100644 --- a/code/datums/components/thermite.dm +++ b/code/datums/components/thermite.dm @@ -116,7 +116,7 @@ */ /datum/component/thermite/proc/thermite_melt(mob/user) var/turf/parent_turf = parent - playsound(parent_turf, 'sound/items/welder.ogg', 100, TRUE) + playsound(parent_turf, 'sound/items/tools/welder.ogg', 100, TRUE) fakefire = new(parent_turf) burn_callback = CALLBACK(src, PROC_REF(burn_parent), user) burn_timer = addtimer(burn_callback, min(amount * 0.35 SECONDS, 20 SECONDS), TIMER_STOPPABLE) diff --git a/code/datums/components/toggle_attached_clothing.dm b/code/datums/components/toggle_attached_clothing.dm index 9ba42fe0917..8321119d85e 100644 --- a/code/datums/components/toggle_attached_clothing.dm +++ b/code/datums/components/toggle_attached_clothing.dm @@ -198,9 +198,9 @@ on_removed?.Invoke(deployable) var/obj/item/parent_gear = parent - if (destroy_on_removal) + if(destroy_on_removal) QDEL_NULL(deployable) - else if (parent_icon_state_suffix) + if(parent_icon_state_suffix) parent_gear.icon_state = "[initial(parent_gear.icon_state)]" parent_gear.worn_icon_state = parent_gear.icon_state parent_gear.update_slot_icon() diff --git a/code/datums/components/transforming.dm b/code/datums/components/transforming.dm index 5276f45dc0a..622fb2ed7d3 100644 --- a/code/datums/components/transforming.dm +++ b/code/datums/components/transforming.dm @@ -50,7 +50,7 @@ throwforce_on = 0, throw_speed_on = 2, sharpness_on = NONE, - hitsound_on = 'sound/weapons/blade1.ogg', + hitsound_on = 'sound/items/weapons/blade1.ogg', w_class_on = WEIGHT_CLASS_BULKY, clumsy_check = TRUE, clumsy_damage = 10, @@ -174,7 +174,7 @@ /datum/component/transforming/proc/default_transform_message(obj/item/source, mob/user) if(user) source.balloon_alert(user, "[active ? "enabled" : "disabled"] [source]") - playsound(source, 'sound/weapons/batonextend.ogg', 50, TRUE) + playsound(source, 'sound/items/weapons/batonextend.ogg', 50, TRUE) /* * Toggle active between true and false, and call diff --git a/code/datums/components/trapdoor.dm b/code/datums/components/trapdoor.dm index cf989a9b996..993d9aa6f1d 100644 --- a/code/datums/components/trapdoor.dm +++ b/code/datums/components/trapdoor.dm @@ -248,10 +248,10 @@ return if(SEND_GLOBAL_SIGNAL(COMSIG_GLOB_TRAPDOOR_LINK, src) & LINKED_UP) playsound(assembly_turf, 'sound/machines/chime.ogg', 50, TRUE) - assembly_turf.visible_message("[src] has linked up to a nearby trapdoor! \ - You may now use it to check where the trapdoor is... be careful!", vision_distance = SAMETILE_MESSAGE_RANGE) + assembly_turf.visible_message(span_notice("[src] has linked up to a nearby trapdoor! \ + You may now use it to check where the trapdoor is... be careful!"), vision_distance = SAMETILE_MESSAGE_RANGE) else - playsound(assembly_turf, 'sound/machines/buzz-sigh.ogg', 50, FALSE) + playsound(assembly_turf, 'sound/machines/buzz/buzz-sigh.ogg', 50, FALSE) assembly_turf.visible_message(span_warning("[src] has failed to find a trapdoor nearby to link to."), vision_distance = SAMETILE_MESSAGE_RANGE) /** @@ -326,7 +326,7 @@ return TRUE user.balloon_alert(user, "trapdoor triggered") - playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE) + playsound(src, 'sound/machines/terminal/terminal_prompt_confirm.ogg', 50, FALSE) icon_state = "trapdoor_pressed" addtimer(VARSET_CALLBACK(src, icon_state, initial(icon_state)), trapdoor_cooldown_time) COOLDOWN_START(src, trapdoor_cooldown, trapdoor_cooldown_time) diff --git a/code/datums/dash_weapon.dm b/code/datums/dash_weapon.dm index 00437a2cdd8..146d3c2de07 100644 --- a/code/datums/dash_weapon.dm +++ b/code/datums/dash_weapon.dm @@ -11,9 +11,9 @@ /// How long does it take to get a dash charge back? var/charge_rate = 25 SECONDS /// What sound do we play on dash? - var/dash_sound = 'sound/magic/blink.ogg' + var/dash_sound = 'sound/effects/magic/blink.ogg' /// What sound do we play on recharge? - var/recharge_sound = 'sound/magic/charge.ogg' + var/recharge_sound = 'sound/effects/magic/charge.ogg' /// What effect does our beam use? var/beam_effect = "blur" /// How long does our beam last? diff --git a/code/datums/datum.dm b/code/datums/datum.dm index a4169004fc9..d170aeca852 100644 --- a/code/datums/datum.dm +++ b/code/datums/datum.dm @@ -419,6 +419,11 @@ filter_data = null atom_cast.filters = null +/// Calls qdel on itself, because signals dont allow callbacks +/datum/proc/selfdelete() + SIGNAL_HANDLER + qdel(src) + /// Return text from this proc to provide extra context to hard deletes that happen to it /// Optional, you should use this for cases where replication is difficult and extra context is required /// Can be called more then once per object, use harddel_deets_dumped to avoid duplicate calls (I am so sorry) diff --git a/code/datums/diseases/advance/floor_diseases/carpellosis.dm b/code/datums/diseases/advance/floor_diseases/carpellosis.dm index a0482215494..cdeb6051537 100644 --- a/code/datums/diseases/advance/floor_diseases/carpellosis.dm +++ b/code/datums/diseases/advance/floor_diseases/carpellosis.dm @@ -41,7 +41,7 @@ switch(stage) if(2) - if(SPT_PROB(1, seconds_per_tick) && affected_mob.stat == CONSCIOUS) + if(SPT_PROB(1, seconds_per_tick) && affected_mob.stat == CONSCIOUS && affected_mob.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL)) to_chat(affected_mob, span_warning("You want to wag your tail...")) affected_mob.emote("wag") if(3) diff --git a/code/datums/diseases/chronic_illness.dm b/code/datums/diseases/chronic_illness.dm index 7b5443a61b0..9e3c3cc400c 100644 --- a/code/datums/diseases/chronic_illness.dm +++ b/code/datums/diseases/chronic_illness.dm @@ -43,7 +43,7 @@ need_mob_update += affected_mob.adjustStaminaLoss(70, updating_stamina = FALSE) if(SPT_PROB(1, seconds_per_tick)) to_chat(affected_mob, span_danger("You feel a buzzing in your brain.")) - SEND_SOUND(affected_mob, sound('sound/weapons/flash_ring.ogg')) + SEND_SOUND(affected_mob, sound('sound/items/weapons/flash_ring.ogg')) if(SPT_PROB(0.5, seconds_per_tick)) need_mob_update += affected_mob.adjustBruteLoss(1, updating_health = FALSE) if(need_mob_update) @@ -76,7 +76,7 @@ if(2) to_chat(affected_mob, span_boldwarning("There is no place for you in this timeline.")) affected_mob.adjustStaminaLoss(100, forced = TRUE) - playsound(affected_mob.loc, 'sound/magic/repulse.ogg', 100, FALSE) + playsound(affected_mob.loc, 'sound/effects/magic/repulse.ogg', 100, FALSE) affected_mob.emote("scream") for(var/mob/living/viewers in viewers(3, affected_mob.loc)) viewers.flash_act() diff --git a/code/datums/diseases/heart_failure.dm b/code/datums/diseases/heart_failure.dm index 45d4e6672fb..419fc9efff3 100644 --- a/code/datums/diseases/heart_failure.dm +++ b/code/datums/diseases/heart_failure.dm @@ -43,7 +43,7 @@ to_chat(affected_mob, span_warning("You feel [pick("full", "nauseated", "sweaty", "weak", "tired", "short of breath", "uneasy")].")) if(3 to 4) if(!sound) - affected_mob.playsound_local(affected_mob, 'sound/health/slowbeat.ogg', 40, FALSE, channel = CHANNEL_HEARTBEAT, use_reverb = FALSE) + affected_mob.playsound_local(affected_mob, 'sound/effects/health/slowbeat.ogg', 40, FALSE, channel = CHANNEL_HEARTBEAT, use_reverb = FALSE) sound = TRUE if(SPT_PROB(1.5, seconds_per_tick)) to_chat(affected_mob, span_danger("You feel a sharp pain in your chest!")) diff --git a/code/datums/drift_handler.dm b/code/datums/drift_handler.dm new file mode 100644 index 00000000000..27a4fd4bc91 --- /dev/null +++ b/code/datums/drift_handler.dm @@ -0,0 +1,258 @@ +///Component that handles drifting +///Manages a movement loop that actually does the legwork of moving someone +///Alongside dealing with the post movement input blocking required to make things look nice +/datum/drift_handler + var/atom/movable/parent + var/atom/inertia_last_loc + var/old_dir + var/datum/move_loop/smooth_move/drifting_loop + ///Should we ignore the next glide rate input we get? + ///This is to some extent a hack around the order of operations + ///Around COMSIG_MOVELOOP_POSTPROCESS. I'm sorry lad + var/ignore_next_glide = FALSE + ///Have we been delayed? IE: active, but not working right this second? + var/delayed = FALSE + var/block_inputs_until + /// How much force is behind this drift. + var/drift_force = 1 + +/// Accepts three args. The direction to drift in, if the drift is instant or not, and if it's not instant, the delay on the start +/datum/drift_handler/New(atom/movable/parent, inertia_angle, instant = FALSE, start_delay = 0, drift_force = 1) + . = ..() + src.parent = parent + parent.drift_handler = src + var/flags = MOVEMENT_LOOP_OUTSIDE_CONTROL + if(instant) + flags |= MOVEMENT_LOOP_START_FAST + src.drift_force = drift_force + drifting_loop = GLOB.move_manager.smooth_move(moving = parent, angle = inertia_angle, delay = get_loop_delay(parent), subsystem = SSnewtonian_movement, priority = MOVEMENT_SPACE_PRIORITY, flags = flags) + + if(!drifting_loop) + qdel(src) + return + + RegisterSignal(drifting_loop, COMSIG_MOVELOOP_START, PROC_REF(drifting_start)) + RegisterSignal(drifting_loop, COMSIG_MOVELOOP_STOP, PROC_REF(drifting_stop)) + RegisterSignal(drifting_loop, COMSIG_MOVELOOP_PREPROCESS_CHECK, PROC_REF(before_move)) + RegisterSignal(drifting_loop, COMSIG_MOVELOOP_POSTPROCESS, PROC_REF(after_move)) + RegisterSignal(drifting_loop, COMSIG_QDELETING, PROC_REF(loop_death)) + RegisterSignal(parent, COMSIG_MOB_ATTEMPT_HALT_SPACEMOVE, PROC_REF(attempt_halt)) + if(drifting_loop.status & MOVELOOP_STATUS_RUNNING) + drifting_start(drifting_loop) // There's a good chance it'll autostart, gotta catch that + + var/visual_delay = get_loop_delay(parent) + + // Start delay is essentially a more granular version of instant + // Isn't used in the standard case, just for things that have odd wants + if(!instant && start_delay) + drifting_loop.pause_for(start_delay) + visual_delay = start_delay + + apply_initial_visuals(visual_delay) + +/datum/drift_handler/Destroy() + inertia_last_loc = null + if(!QDELETED(drifting_loop)) + qdel(drifting_loop) + drifting_loop = null + parent.inertia_moving = FALSE + parent.drift_handler = null + return ..() + +/datum/drift_handler/proc/apply_initial_visuals(visual_delay) + // If something "somewhere" doesn't want us to apply our glidesize delays, don't + if(SEND_SIGNAL(parent, COMSIG_MOVABLE_DRIFT_VISUAL_ATTEMPT) & DRIFT_VISUAL_FAILED) + return + + // Ignore the next glide because it's literally just us + ignore_next_glide = TRUE + parent.set_glide_size(MOVEMENT_ADJUSTED_GLIDE_SIZE(visual_delay, SSnewtonian_movement.visual_delay)) + if(!ismob(parent)) + return + var/mob/mob_parent = parent + //Ok this is slightly weird, but basically, we need to force the client to glide at our rate + //Make sure moving into a space move looks like a space move essentially + //There is an inbuilt assumption that gliding will be added as a part of a move call, but eh + //It's ok if it's not, it's just important if it is. + mob_parent.client?.visual_delay = MOVEMENT_ADJUSTED_GLIDE_SIZE(visual_delay, SSnewtonian_movement.visual_delay) + +/datum/drift_handler/proc/newtonian_impulse(inertia_angle, start_delay, additional_force, controlled_cap) + SIGNAL_HANDLER + inertia_last_loc = parent.loc + // We've been told to move in the middle of deletion process, tell parent to create a new handler instead + if(!drifting_loop) + qdel(src) + return FALSE + + var/applied_force = additional_force + + var/force_x = sin(drifting_loop.angle) * drift_force + sin(inertia_angle) * applied_force / parent.inertia_force_weight + var/force_y = cos(drifting_loop.angle) * drift_force + cos(inertia_angle) * applied_force / parent.inertia_force_weight + + drift_force = clamp(sqrt(force_x * force_x + force_y * force_y), 0, !isnull(controlled_cap) ? controlled_cap : INERTIA_FORCE_CAP) + if(drift_force < 0.1) // Rounding issues + qdel(src) + return TRUE + + drifting_loop.set_angle(delta_to_angle(force_x, force_y)) + drifting_loop.set_delay(get_loop_delay(parent)) + return TRUE + +/datum/drift_handler/proc/drifting_start() + SIGNAL_HANDLER + inertia_last_loc = parent.loc + RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(handle_move)) + // We will use glide size to intuit how long to delay our loop's next move for + // This way you can't ride two movements at once while drifting, since that'd be dumb as fuck + RegisterSignal(parent, COMSIG_MOVABLE_UPDATE_GLIDE_SIZE, PROC_REF(handle_glidesize_update)) + // If you stop pulling something mid drift, I want it to retain that momentum + RegisterSignal(parent, COMSIG_ATOM_NO_LONGER_PULLING, PROC_REF(stopped_pulling)) + +/datum/drift_handler/proc/drifting_stop() + SIGNAL_HANDLER + parent.inertia_moving = FALSE + ignore_next_glide = FALSE + UnregisterSignal(parent, list(COMSIG_MOVABLE_MOVED, COMSIG_MOVABLE_UPDATE_GLIDE_SIZE, COMSIG_ATOM_NO_LONGER_PULLING)) + +/datum/drift_handler/proc/before_move(datum/source) + SIGNAL_HANDLER + parent.inertia_moving = TRUE + old_dir = parent.dir + delayed = FALSE + +/datum/drift_handler/proc/after_move(datum/source, result, visual_delay) + SIGNAL_HANDLER + if(result == MOVELOOP_FAILURE) + qdel(src) + return + + parent.setDir(old_dir) + parent.inertia_moving = FALSE + if(parent.Process_Spacemove(angle2dir(drifting_loop.angle), continuous_move = TRUE)) + glide_to_halt(visual_delay) + return + + inertia_last_loc = parent.loc + ignore_next_glide = TRUE + +/datum/drift_handler/proc/loop_death(datum/source) + SIGNAL_HANDLER + drifting_loop = null + +/datum/drift_handler/proc/handle_move(datum/source, old_loc) + SIGNAL_HANDLER + // This can happen, because signals once sent cannot be stopped + if(QDELETED(src)) + return + if(!isturf(parent.loc)) + qdel(src) + return + if(parent.inertia_moving) + return + if(!parent.Process_Spacemove(angle2dir(drifting_loop.angle), continuous_move = TRUE)) + return + qdel(src) + +/// We're going to take the passed in glide size +/// and use it to manually delay our loop for that period +/// to allow the other movement to complete +/datum/drift_handler/proc/handle_glidesize_update(datum/source, glide_size) + SIGNAL_HANDLER + // If we aren't drifting, or this is us, fuck off + if(!drifting_loop || parent.inertia_moving) + return + // If we are drifting, but this set came from the moveloop itself, drop the input + // I'm sorry man + if(ignore_next_glide) + ignore_next_glide = FALSE + return + var/glide_delay = round(ICON_SIZE_ALL / glide_size, 1) * world.tick_lag + drifting_loop.pause_for(glide_delay) + delayed = TRUE + +/// If we're pulling something and stop, we want it to continue at our rate and such +/datum/drift_handler/proc/stopped_pulling(datum/source, atom/movable/was_pulling) + SIGNAL_HANDLER + // This does mean it falls very slightly behind, but otherwise they'll potentially run into us + var/next_move_in = drifting_loop.timer - world.time + world.tick_lag + was_pulling.newtonian_move(angle2dir(drifting_loop.angle), start_delay = next_move_in, drift_force = drift_force, controlled_cap = drift_force) + +/datum/drift_handler/proc/glide_to_halt(glide_for) + if(!ismob(parent)) + qdel(src) + return + + var/mob/mob_parent = parent + var/client/our_client = mob_parent.client + // If we're not active, don't do the glide because it'll look dumb as fuck + if(!our_client || delayed) + qdel(src) + return + + block_inputs_until = world.time + glide_for + 1 + QDEL_IN(src, glide_for + 1) + qdel(drifting_loop) + RegisterSignal(parent, COMSIG_MOB_CLIENT_PRE_MOVE, PROC_REF(allow_final_movement)) + +/datum/drift_handler/proc/allow_final_movement(datum/source) + SIGNAL_HANDLER + // Some things want to allow movement out of spacedrift, we should let them + if(SEND_SIGNAL(parent, COMSIG_MOVABLE_DRIFT_BLOCK_INPUT) & DRIFT_ALLOW_INPUT) + return + if(world.time < block_inputs_until) + return COMSIG_MOB_CLIENT_BLOCK_PRE_MOVE + +/datum/drift_handler/proc/attempt_halt(mob/source, movement_dir, continuous_move, atom/backup) + SIGNAL_HANDLER + + if (get_dir(source, backup) == movement_dir || source.loc == backup.loc) + if (drift_force >= INERTIA_FORCE_THROW_FLOOR) + source.throw_at(backup, 1, floor(1 + (drift_force - INERTIA_FORCE_THROW_FLOOR) / INERTIA_FORCE_PER_THROW_FORCE), spin = FALSE) + return + + if (drift_force < INERTIA_FORCE_SPACEMOVE_GRAB || isnull(drifting_loop)) + return + + if (drift_force <= INERTIA_FORCE_SPACEMOVE_REDUCTION / source.inertia_force_weight) + glide_to_halt(get_loop_delay(source)) + return COMPONENT_PREVENT_SPACEMOVE_HALT + + drift_force -= INERTIA_FORCE_SPACEMOVE_REDUCTION / source.inertia_force_weight + drifting_loop.set_delay(get_loop_delay(source)) + return COMPONENT_PREVENT_SPACEMOVE_HALT + +/datum/drift_handler/proc/get_loop_delay(atom/movable/movable) + return (DEFAULT_INERTIA_SPEED / ((1 - INERTIA_SPEED_COEF) + drift_force * INERTIA_SPEED_COEF)) * movable.inertia_move_multiplier + +/datum/drift_handler/proc/stabilize_drift(target_angle, target_force, stabilization_force) + /// We aren't drifting + if (isnull(drifting_loop)) + return + + /// Lack of angle means that we are trying to halt movement + if (isnull(target_angle)) + // Going through newtonian_move ensures that all Process_Spacemove code runs properly, instead of directly adjusting forces + parent.newtonian_move(reverse_angle(drifting_loop.angle), drift_force = min(drift_force, stabilization_force)) + return + + // Force required to be applied in order to get to the desired movement vector, with projection of current movement onto desired vector to ensure that we only compensate for excess + var/drift_projection = max(0, cos(target_angle - drifting_loop.angle)) * drift_force + var/force_x = sin(target_angle) * target_force - sin(drifting_loop.angle) * drift_force + var/force_y = cos(target_angle) * target_force - cos(drifting_loop.angle) * drift_force + var/force_angle = delta_to_angle(force_x, force_y) + var/applied_force = sqrt(force_x * force_x + force_y * force_y) + var/force_projection = max(0, cos(target_angle - force_angle)) * applied_force + force_x -= min(force_projection, drift_projection) * sin(target_angle) + force_x -= min(force_projection, drift_projection) * cos(target_angle) + applied_force = min(sqrt(force_x * force_x + force_y * force_y), stabilization_force) + parent.newtonian_move(force_angle, instant = TRUE, drift_force = applied_force) + +/// Removes all force in a certain direction +/datum/drift_handler/proc/remove_angle_force(target_angle) + /// We aren't drifting + if (isnull(drifting_loop)) + return + + var/projected_force = max(0, cos(target_angle - drifting_loop.angle)) * drift_force + if (projected_force > 0) + parent.newtonian_move(reverse_angle(target_angle), projected_force) diff --git a/code/datums/elements/ai_held_item.dm b/code/datums/elements/ai_held_item.dm index 053a1827fb2..185e45da9aa 100644 --- a/code/datums/elements/ai_held_item.dm +++ b/code/datums/elements/ai_held_item.dm @@ -54,7 +54,7 @@ var/obj/item/carried_item = get_held_item(source) if (!carried_item) return - examine_text += span_notice("[source.p_They()] [source.p_are()] carrying [carried_item.get_examine_string(user)].") + examine_text += span_notice("[source.p_They()] [source.p_are()] carrying [carried_item.examine_title(user)].") /// If we died, drop anything we were carrying /datum/element/ai_held_item/proc/on_death(mob/living/ol_yeller) diff --git a/code/datums/elements/art.dm b/code/datums/elements/art.dm index 81d388aa94a..d5a642c23d0 100644 --- a/code/datums/elements/art.dm +++ b/code/datums/elements/art.dm @@ -74,7 +74,7 @@ var/datum/job_department/hater_department = SSjob.get_department_type(hater_department_type) for(var/datum/job/hater_job as anything in hater_department.department_jobs) haters += hater_job.title - var/datum/job/quartermaster/fucking_quartermaster = SSjob.GetJobType(/datum/job/quartermaster) + var/datum/job/quartermaster/fucking_quartermaster = SSjob.get_job_type(/datum/job/quartermaster) haters += fucking_quartermaster.title if(!(user.mind.assigned_role.title in haters)) diff --git a/code/datums/elements/bed_tucking.dm b/code/datums/elements/bed_tucking.dm index 58f5640c31c..3b49f2a608f 100644 --- a/code/datums/elements/bed_tucking.dm +++ b/code/datums/elements/bed_tucking.dm @@ -53,11 +53,11 @@ 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.dir = target_bed.dir & target_bed.left_headrest_dirs ? EAST : WEST + tucked.pixel_x = target_bed.dir & target_bed.left_headrest_dirs ? -x_offset : x_offset tucked.pixel_y = y_offset if(starting_angle) - rotation_degree = target_bed.dir & EAST ? starting_angle + 180 : starting_angle + rotation_degree = target_bed.dir & target_bed.left_headrest_dirs ? starting_angle + 180 : starting_angle tucked.transform = turn(tucked.transform, rotation_degree) RegisterSignal(tucked, COMSIG_ITEM_PICKUP, PROC_REF(untuck)) diff --git a/code/datums/elements/bugkiller_reagent.dm b/code/datums/elements/bugkiller_reagent.dm index 57f2ae65d92..d2c25926e96 100644 --- a/code/datums/elements/bugkiller_reagent.dm +++ b/code/datums/elements/bugkiller_reagent.dm @@ -59,7 +59,7 @@ /datum/status_effect/bugkiller_death/on_apply() if(owner.stat == DEAD) return FALSE - playsound(owner, 'sound/voice/human/malescream_1.ogg', 25, TRUE, extrarange = SILENCED_SOUND_EXTRARANGE, frequency = 5) + playsound(owner, 'sound/mobs/humanoids/human/scream/malescream_1.ogg', 25, TRUE, extrarange = SILENCED_SOUND_EXTRARANGE, frequency = 5) to_chat(owner, span_userdanger("The world begins to go dark...")) owner.spasm_animation(spasm_loops) owner.adjust_eye_blur(duration) diff --git a/code/datums/elements/climbable.dm b/code/datums/elements/climbable.dm index 113cc8aaa90..5700ca3bc2e 100644 --- a/code/datums/elements/climbable.dm +++ b/code/datums/elements/climbable.dm @@ -106,8 +106,8 @@ if(ISDIAGONALDIR(climbed_thing.dir) && same_loc) if(params) //we check the icon x and y parameters of the click-drag to determine step_dir. var/list/modifiers = params2list(params) - var/x_dist = (text2num(LAZYACCESS(modifiers, ICON_X)) - world.icon_size/2) * (climbed_thing.dir & WEST ? -1 : 1) - var/y_dist = (text2num(LAZYACCESS(modifiers, ICON_Y)) - world.icon_size/2) * (climbed_thing.dir & SOUTH ? -1 : 1) + var/x_dist = (text2num(LAZYACCESS(modifiers, ICON_X)) - ICON_SIZE_X/2) * (climbed_thing.dir & WEST ? -1 : 1) + var/y_dist = (text2num(LAZYACCESS(modifiers, ICON_Y)) - ICON_SIZE_Y/2) * (climbed_thing.dir & SOUTH ? -1 : 1) dir_step = (x_dist >= y_dist ? (EAST|WEST) : (NORTH|SOUTH)) & climbed_thing.dir else dir_step = get_dir(user, get_step(climbed_thing, climbed_thing.dir)) diff --git a/code/datums/elements/consumable_mob.dm b/code/datums/elements/consumable_mob.dm index 1a7c67a4312..fafdb8cbcab 100644 --- a/code/datums/elements/consumable_mob.dm +++ b/code/datums/elements/consumable_mob.dm @@ -23,7 +23,7 @@ /datum/element/consumable_mob/proc/on_consume(atom/movable/source, mob/living/consumer) SIGNAL_HANDLER - if(!consumer.combat_mode || !consumer.reagents) + if(!consumer.combat_mode || !consumer.reagents || HAS_TRAIT(consumer, TRAIT_PACIFISM)) return for(var/reagent_type in reagents_list) if(isnull(reagents_list[reagent_type])) diff --git a/code/datums/elements/corrupted_organ.dm b/code/datums/elements/corrupted_organ.dm index 666ca3460fc..504c6851e00 100644 --- a/code/datums/elements/corrupted_organ.dm +++ b/code/datums/elements/corrupted_organ.dm @@ -41,7 +41,7 @@ ) return var/turf/origin_turf = get_turf(organ) - playsound(organ, 'sound/magic/forcewall.ogg', vol = 100) + playsound(organ, 'sound/effects/magic/forcewall.ogg', vol = 100) new /obj/effect/temp_visual/curse_blast(origin_turf) organ.visible_message(span_revenwarning("[organ] explodes in a burst of dark energy!")) for(var/mob/living/target in range(1, origin_turf)) diff --git a/code/datums/elements/damage_threshold.dm b/code/datums/elements/damage_threshold.dm index 60c87dc5ed5..764f5d7a9bd 100644 --- a/code/datums/elements/damage_threshold.dm +++ b/code/datums/elements/damage_threshold.dm @@ -45,7 +45,7 @@ span_hear("You hear a thud."), COMBAT_MESSAGE_RANGE, ) - playsound(source, 'sound/weapons/tap.ogg', tap_vol, TRUE, -1) + playsound(source, 'sound/items/weapons/tap.ogg', tap_vol, TRUE, -1) return SUCCESSFUL_BLOCK return NONE diff --git a/code/datums/elements/decals/blood.dm b/code/datums/elements/decals/blood.dm index 857b9e2b678..16fd4241147 100644 --- a/code/datums/elements/decals/blood.dm +++ b/code/datums/elements/decals/blood.dm @@ -24,8 +24,8 @@ icon = I.icon icon_state = I.icon_state var/icon/icon_for_size = icon(icon, icon_state) - var/scale_factor_x = icon_for_size.Width()/world.icon_size - var/scale_factor_y = icon_for_size.Height()/world.icon_size + var/scale_factor_x = icon_for_size.Width()/ICON_SIZE_X + var/scale_factor_y = icon_for_size.Height()/ICON_SIZE_Y var/mutable_appearance/blood_splatter = mutable_appearance('icons/effects/blood.dmi', "itemblood", appearance_flags = RESET_COLOR) //MA of the blood that we apply blood_splatter.transform = blood_splatter.transform.Scale(scale_factor_x, scale_factor_y) blood_splatter.blend_mode = BLEND_INSET_OVERLAY diff --git a/code/datums/elements/deliver_first.dm b/code/datums/elements/deliver_first.dm index 0fb83a25456..ae1947bff02 100644 --- a/code/datums/elements/deliver_first.dm +++ b/code/datums/elements/deliver_first.dm @@ -80,7 +80,7 @@ if(user) target.balloon_alert(user, "access denied until delivery!") if(COOLDOWN_FINISHED(src, deny_cooldown)) - playsound(target, 'sound/machines/buzz-two.ogg', 30, TRUE) + playsound(target, 'sound/machines/buzz/buzz-two.ogg', 30, TRUE) COOLDOWN_START(src, deny_cooldown, DENY_SOUND_COOLDOWN) return BLOCK_OPEN diff --git a/code/datums/elements/dextrous.dm b/code/datums/elements/dextrous.dm index 681e2a9488d..240cfc88494 100644 --- a/code/datums/elements/dextrous.dm +++ b/code/datums/elements/dextrous.dm @@ -69,5 +69,5 @@ for(var/obj/item/held_item in examined.held_items) if(held_item.item_flags & (ABSTRACT|EXAMINE_SKIP|HAND_ITEM)) continue - examine_list += span_info("[examined.p_They()] [examined.p_have()] [held_item.get_examine_string(user)] in [examined.p_their()] \ + examine_list += span_info("[examined.p_They()] [examined.p_have()] [held_item.examine_title(user)] in [examined.p_their()] \ [examined.get_held_index_name(examined.get_held_index_of_item(held_item))].") diff --git a/code/datums/elements/disarm_attack.dm b/code/datums/elements/disarm_attack.dm index a788cd9f35e..8b4b0b3ff8a 100644 --- a/code/datums/elements/disarm_attack.dm +++ b/code/datums/elements/disarm_attack.dm @@ -6,13 +6,23 @@ if(!isitem(target)) return ELEMENT_INCOMPATIBLE - RegisterSignal(target, COMSIG_ITEM_ATTACK_SECONDARY, PROC_REF(secondary_attack)) - RegisterSignal(target, COMSIG_ATOM_EXAMINE, PROC_REF(examine)) + var/obj/item/item = target + RegisterSignal(item, COMSIG_ITEM_ATTACK_SECONDARY, PROC_REF(secondary_attack)) + RegisterSignal(item, COMSIG_ATOM_EXAMINE, PROC_REF(examine)) + item.item_flags |= ITEM_HAS_CONTEXTUAL_SCREENTIPS + RegisterSignal(item, COMSIG_ITEM_REQUESTING_CONTEXT_FOR_TARGET, PROC_REF(add_item_context)) /datum/element/disarm_attack/Detach(datum/source) - UnregisterSignal(source, list(COMSIG_ATOM_EXAMINE, COMSIG_ITEM_ATTACK_SECONDARY)) + UnregisterSignal(source, list(COMSIG_ATOM_EXAMINE, COMSIG_ITEM_ATTACK_SECONDARY, COMSIG_ITEM_REQUESTING_CONTEXT_FOR_TARGET)) return ..() +/datum/element/disarm_attack/proc/add_item_context(obj/item/source, list/context, atom/target, mob/living/user) + SIGNAL_HANDLER + if(!isliving(target) || !can_disarm_attack(source, target, user, FALSE)) + return NONE + context[SCREENTIP_CONTEXT_RMB] = "Shove" + return CONTEXTUAL_SCREENTIP_SET + /datum/element/disarm_attack/proc/secondary_attack(obj/item/source, mob/living/victim, mob/living/user, params) SIGNAL_HANDLER if(!user.can_disarm(victim) || !can_disarm_attack(source, victim, user)) diff --git a/code/datums/elements/door_pryer.dm b/code/datums/elements/door_pryer.dm index 9f01e8be2b6..3e2bd2c5a43 100644 --- a/code/datums/elements/door_pryer.dm +++ b/code/datums/elements/door_pryer.dm @@ -60,7 +60,7 @@ message = span_warning("[attacker] starts forcing the [airlock_target] open!"), blind_message = span_hear("You hear a metal screeching sound."), ) - playsound(airlock_target, 'sound/machines/airlock_alien_prying.ogg', 100, TRUE) + playsound(airlock_target, 'sound/machines/airlock/airlock_alien_prying.ogg', 100, TRUE) airlock_target.balloon_alert(attacker, "prying...") if(!do_after(attacker, pry_time, airlock_target)) airlock_target.balloon_alert(attacker, "interrupted!") diff --git a/code/datums/elements/embed.dm b/code/datums/elements/embed.dm index 4a8bda37c3a..fbaf638bdd5 100644 --- a/code/datums/elements/embed.dm +++ b/code/datums/elements/embed.dm @@ -23,7 +23,7 @@ return RegisterSignal(target, COMSIG_MOVABLE_IMPACT_ZONE, PROC_REF(check_embed)) - RegisterSignal(target, COMSIG_ATOM_EXAMINE, PROC_REF(examined)) + RegisterSignal(target, COMSIG_ATOM_EXAMINE_TAGS, PROC_REF(examined_tags)) RegisterSignal(target, COMSIG_EMBED_TRY_FORCE, PROC_REF(try_force_embed)) RegisterSignal(target, COMSIG_ITEM_DISABLE_EMBED, PROC_REF(detach_from_weapon)) @@ -46,7 +46,7 @@ if(blocked || !istype(victim) || HAS_TRAIT(victim, TRAIT_PIERCEIMMUNE)) return FALSE - if(victim.status_flags & GODMODE) + if(HAS_TRAIT(victim, TRAIT_GODMODE)) return FALSE var/flying_speed = throwingdatum?.speed || weapon.throw_speed @@ -82,13 +82,13 @@ Detach(weapon) ///Someone inspected our embeddable item -/datum/element/embed/proc/examined(obj/item/I, mob/user, list/examine_list) +/datum/element/embed/proc/examined_tags(obj/item/I, mob/user, list/examine_list) SIGNAL_HANDLER if(I.is_embed_harmless()) - examine_list += "[I] feels sticky, and could probably get stuck to someone if thrown properly!" + examine_list["sticky"] = "[I] feels sticky, and could probably get stuck to someone if thrown properly!" else - examine_list += "[I] has a fine point, and could probably embed in someone if thrown properly!" + examine_list["embeddable"] = "[I] has a fine point, and could probably embed in someone if thrown properly!" /** * check_embed_projectile() is what we get when a projectile with a defined shrapnel_type impacts a target. @@ -117,6 +117,8 @@ if(!try_force_embed(payload, limb)) payload.failedEmbed() + else + SEND_SIGNAL(source, COMSIG_PROJECTILE_ON_EMBEDDED, payload, hit) Detach(source) /** diff --git a/code/datums/elements/falling_hazard.dm b/code/datums/elements/falling_hazard.dm index 355bcd92e4e..65ac6b4569f 100644 --- a/code/datums/elements/falling_hazard.dm +++ b/code/datums/elements/falling_hazard.dm @@ -12,7 +12,7 @@ /// Does the target crush and flatten whoever it falls on var/crushes_people = FALSE /// What sound is played when the target falls onto a mob - var/impact_sound = 'sound/magic/clockwork/fellowship_armory.ogg' //CLANG + var/impact_sound = 'sound/effects/magic/clockwork/fellowship_armory.ogg' //CLANG /datum/element/falling_hazard/Attach(datum/target, damage, wound_bonus, hardhat_safety, crushes, impact_sound) . = ..() @@ -52,7 +52,7 @@ if(crushes_people) poor_target.Knockdown(0.25 SECONDS * fall_damage) // For a piano, that would be 15 seconds - playsound(poor_target, 'sound/weapons/parry.ogg', 50, TRUE) // You PARRIED the falling object with your EPIC hardhat + playsound(poor_target, 'sound/items/weapons/parry.ogg', 50, TRUE) // You PARRIED the falling object with your EPIC hardhat return var/obj/item/bodypart/target_head = poor_target.get_bodypart(BODY_ZONE_HEAD) diff --git a/code/datums/elements/food/fried_item.dm b/code/datums/elements/food/fried_item.dm index 2afab84d1cb..bc21e51f24c 100644 --- a/code/datums/elements/food/fried_item.dm +++ b/code/datums/elements/food/fried_item.dm @@ -17,28 +17,27 @@ var/atom/this_food = target switch(fry_time) - if(0 to 15) + if(0 to 15 SECONDS) this_food.add_atom_colour(fried_colors[1], FIXED_COLOUR_PRIORITY) this_food.name = "lightly-fried [this_food.name]" this_food.desc += " It's been lightly fried in a deep fryer." - if(15 to 50) + if(15 SECONDS to 50 SECONDS) this_food.add_atom_colour(fried_colors[2], FIXED_COLOUR_PRIORITY) this_food.name = "fried [this_food.name]" this_food.desc += " It's been fried, increasing its tastiness value by [rand(1, 75)]%." - if(50 to 85) + if(50 SECONDS to 85 SECONDS) this_food.add_atom_colour(fried_colors[3], FIXED_COLOUR_PRIORITY) this_food.name = "deep-fried [this_food.name]" this_food.desc += " Deep-fried to perfection." - if(85 to INFINITY) + if(85 SECONDS to INFINITY) this_food.add_atom_colour(fried_colors[4], FIXED_COLOUR_PRIORITY) this_food.name = "\proper the physical manifestation of the very concept of fried foods" this_food.desc = "A heavily-fried... something. Who can tell anymore?" ADD_TRAIT(this_food, TRAIT_FOOD_FRIED, ELEMENT_TRAIT(type)) - SEND_SIGNAL(this_food, COMSIG_ITEM_FRIED, fry_time) // Already edible items will inherent these parameters // Otherwise, we will become edible. this_food.AddComponent( \ @@ -49,6 +48,7 @@ foodtypes = FRIED, \ volume = this_food.reagents?.maximum_volume, \ ) + SEND_SIGNAL(this_food, COMSIG_ITEM_FRIED, fry_time) /datum/element/fried_item/Detach(atom/source, ...) for(var/color in fried_colors) diff --git a/code/datums/elements/food/grilled_item.dm b/code/datums/elements/food/grilled_item.dm index 74e772eb73c..6899f47faa4 100644 --- a/code/datums/elements/food/grilled_item.dm +++ b/code/datums/elements/food/grilled_item.dm @@ -28,10 +28,12 @@ if(grill_time > 30 SECONDS && isnull(this_food.GetComponent(/datum/component/edible))) this_food.AddComponent(/datum/component/edible, foodtypes = FRIED) - SEND_SIGNAL(this_food, COMSIG_ITEM_BARBEQUE_GRILLED) + SEND_SIGNAL(this_food, COMSIG_ITEM_BARBEQUE_GRILLED, grill_time) + ADD_TRAIT(this_food, TRAIT_FOOD_BBQ_GRILLED, ELEMENT_TRAIT(type)) /datum/element/grilled_item/Detach(atom/source, ...) source.name = initial(source.name) source.desc = initial(source.desc) qdel(source.GetComponent(/datum/component/edible)) // Don't care if it was initially edible + REMOVE_TRAIT(src, TRAIT_FOOD_BBQ_GRILLED, ELEMENT_TRAIT(type)) return ..() diff --git a/code/datums/elements/footstep.dm b/code/datums/elements/footstep.dm index 20ea4d42dd5..46772087e5e 100644 --- a/code/datums/elements/footstep.dm +++ b/code/datums/elements/footstep.dm @@ -109,6 +109,9 @@ /datum/element/footstep/proc/play_simplestep(mob/living/source, atom/oldloc, direction, forced, list/old_locs, momentum_change) SIGNAL_HANDLER + if(source.moving_diagonally == SECOND_DIAG_STEP) + return // to prevent a diagonal step from counting as 2 + if (forced || SHOULD_DISABLE_FOOTSTEPS(source)) return @@ -128,6 +131,9 @@ /datum/element/footstep/proc/play_humanstep(mob/living/carbon/human/source, atom/oldloc, direction, forced, list/old_locs, momentum_change) SIGNAL_HANDLER + if(source.moving_diagonally == SECOND_DIAG_STEP) + return // to prevent a diagonal step from counting as 2 + if (forced || SHOULD_DISABLE_FOOTSTEPS(source) || !momentum_change) return @@ -178,6 +184,9 @@ /datum/element/footstep/proc/play_simplestep_machine(atom/movable/source, atom/oldloc, direction, forced, list/old_locs, momentum_change) SIGNAL_HANDLER + if(source.moving_diagonally == SECOND_DIAG_STEP) + return // to prevent a diagonal step from counting as 2 + if (forced || SHOULD_DISABLE_FOOTSTEPS(source)) return diff --git a/code/datums/elements/give_turf_traits.dm b/code/datums/elements/give_turf_traits.dm index 3c53d4a5e73..7e7c37d86e7 100644 --- a/code/datums/elements/give_turf_traits.dm +++ b/code/datums/elements/give_turf_traits.dm @@ -67,7 +67,7 @@ for(var/mob/living/living in location) living.update_turf_movespeed() -/// Signals and components are carried over when the turf is changed, so they've to be readded post-change. +/// Signals are carried over when the turf is changed, but traits aren't, so they've to be readded post-change. /datum/element/give_turf_traits/proc/pre_change_turf(turf/changed, path, list/new_baseturfs, flags, list/post_change_callbacks) SIGNAL_HANDLER post_change_callbacks += CALLBACK(src, PROC_REF(reoccupy_turf)) diff --git a/code/datums/elements/high_fiver.dm b/code/datums/elements/high_fiver.dm index 6e4e9739cef..249a9f4059d 100644 --- a/code/datums/elements/high_fiver.dm +++ b/code/datums/elements/high_fiver.dm @@ -54,7 +54,7 @@ taker.add_mood_event(descriptor, /datum/mood_event/high_five_full_hand) // not so successful now! return COMPONENT_OFFER_INTERRUPT - playsound(offerer, 'sound/weapons/slap.ogg', min(50 * slappers_giver, 300), TRUE, 1) + playsound(offerer, 'sound/items/weapons/slap.ogg', min(50 * slappers_giver, 300), TRUE, 1) offerer.add_mob_memory(/datum/memory/high_five, deuteragonist = taker, high_five_type = descriptor, high_ten = high_ten) taker.add_mob_memory(/datum/memory/high_five, deuteragonist = offerer, high_five_type = descriptor, high_ten = high_ten) diff --git a/code/datums/elements/immerse.dm b/code/datums/elements/immerse.dm index 65f7d45b9ab..d50ae906c0a 100644 --- a/code/datums/elements/immerse.dm +++ b/code/datums/elements/immerse.dm @@ -142,8 +142,8 @@ */ /datum/element/immerse/proc/add_immerse_overlay(atom/movable/movable) var/list/icon_dimensions = get_icon_dimensions(movable.icon) - var/width = icon_dimensions["width"] || world.icon_size - var/height = icon_dimensions["height"] || world.icon_size + var/width = icon_dimensions["width"] || ICON_SIZE_X + var/height = icon_dimensions["height"] || ICON_SIZE_Y var/is_below_water = movable.layer < WATER_LEVEL_LAYER ? "underwater-" : "" @@ -184,19 +184,19 @@ * but since we want the appearance to stay where it should be, * we have to counteract this one. */ - var/extra_width = (width - world.icon_size) * 0.5 - var/extra_height = (height - world.icon_size) * 0.5 + var/extra_width = (width - ICON_SIZE_X) * 0.5 + var/extra_height = (height - ICON_SIZE_Y) * 0.5 var/mutable_appearance/overlay_appearance = new() var/icon/immerse_icon = generated_immerse_icons["[icon]-[icon_state]-[mask_icon]"] - var/last_i = width/world.icon_size + var/last_i = width/ICON_SIZE_X for(var/i in -1 to last_i) var/mutable_appearance/underwater = mutable_appearance(icon, icon_state) - underwater.pixel_x = world.icon_size * i - extra_width - underwater.pixel_y = -world.icon_size - extra_height + underwater.pixel_x = ICON_SIZE_X * i - extra_width + underwater.pixel_y = -ICON_SIZE_Y - extra_height overlay_appearance.overlays += underwater var/mutable_appearance/water_level = is_below_water ? underwater : mutable_appearance(immerse_icon) - water_level.pixel_x = world.icon_size * i - extra_width + water_level.pixel_x = ICON_SIZE_X * i - extra_width water_level.pixel_y = -extra_height overlay_appearance.overlays += water_level diff --git a/code/datums/elements/kneejerk.dm b/code/datums/elements/kneejerk.dm index cd93fe31917..78c0ba7654d 100644 --- a/code/datums/elements/kneejerk.dm +++ b/code/datums/elements/kneejerk.dm @@ -51,17 +51,17 @@ var/target_brain_damage = target_brain.damage if(target_brain_damage < BRAIN_DAMAGE_MILD) //a healthy brain produces a normal reaction - playsound(target, 'sound/weapons/punchmiss.ogg', 25, TRUE, -1) + playsound(target, 'sound/items/weapons/punchmiss.ogg', 25, TRUE, -1) target.visible_message(span_danger("[target]'s leg kicks out sharply!"), \ span_danger("Your leg kicks out sharply!")) else if(target_brain_damage < BRAIN_DAMAGE_SEVERE) //a mildly damaged brain produces a delayed reaction - playsound(target, 'sound/weapons/punchmiss.ogg', 15, TRUE, -1) + playsound(target, 'sound/items/weapons/punchmiss.ogg', 15, TRUE, -1) target.visible_message(span_danger("After a moment, [target]'s leg kicks out sharply!"), \ span_danger("After a moment, your leg kicks out sharply!")) else if(target_brain_damage < BRAIN_DAMAGE_DEATH) //a severely damaged brain produces a delayed + weaker reaction - playsound(target, 'sound/weapons/punchmiss.ogg', 5, TRUE, -1) + playsound(target, 'sound/items/weapons/punchmiss.ogg', 5, TRUE, -1) target.visible_message(span_danger("After a moment, [target]'s leg kicks out weakly!"), \ span_danger("After a moment, your leg kicks out weakly!")) diff --git a/code/datums/elements/lazy_fishing_spot.dm b/code/datums/elements/lazy_fishing_spot.dm index b84826def1e..67edcea2e88 100644 --- a/code/datums/elements/lazy_fishing_spot.dm +++ b/code/datums/elements/lazy_fishing_spot.dm @@ -20,10 +20,19 @@ RegisterSignal(target, COMSIG_ATOM_EXAMINE, PROC_REF(on_examined)) RegisterSignal(target, COMSIG_ATOM_EXAMINE_MORE, PROC_REF(on_examined_more)) RegisterSignal(target, COMSIG_ATOM_EX_ACT, PROC_REF(explosive_fishing)) + RegisterSignal(target, COMSIG_FISH_RELEASED_INTO, PROC_REF(fish_released)) + RegisterSignal(target, COMSIG_ATOM_TOOL_ACT(TOOL_MULTITOOL), PROC_REF(link_to_fish_porter)) /datum/element/lazy_fishing_spot/Detach(datum/target) - UnregisterSignal(target, list(COMSIG_PRE_FISHING, COMSIG_ATOM_EXAMINE, COMSIG_ATOM_EXAMINE_MORE, COMSIG_ATOM_EX_ACT)) - UnregisterSignal(target, list(COMSIG_PRE_FISHING, COMSIG_NPC_FISHING)) + UnregisterSignal(target, list( + COMSIG_FISH_RELEASED_INTO, + COMSIG_PRE_FISHING, + COMSIG_NPC_FISHING, + COMSIG_ATOM_EXAMINE, + COMSIG_ATOM_EXAMINE_MORE, + COMSIG_ATOM_EX_ACT, + COMSIG_ATOM_TOOL_ACT(TOOL_MULTITOOL), + )) REMOVE_TRAIT(target, TRAIT_FISHING_SPOT, REF(src)) return ..() @@ -61,3 +70,16 @@ /datum/element/lazy_fishing_spot/proc/return_glob_fishing_spot(datum/source, list/fish_spot_container) fish_spot_container[NPC_FISHING_SPOT] = GLOB.preset_fish_sources[configuration] + +/datum/element/lazy_fishing_spot/proc/link_to_fish_porter(atom/source, mob/user, obj/item/multitool/tool) + SIGNAL_HANDLER + if(!istype(tool.buffer, /obj/machinery/fishing_portal_generator)) + return + var/datum/fish_source/fish_source = GLOB.preset_fish_sources[configuration] + var/obj/machinery/fishing_portal_generator/portal = tool.buffer + return portal.link_fishing_spot(fish_source, source, user) + +/datum/element/lazy_fishing_spot/proc/fish_released(datum/source, obj/item/fish/fish, mob/living/releaser) + SIGNAL_HANDLER + var/datum/fish_source/fish_source = GLOB.preset_fish_sources[configuration] + fish_source.readd_fish(fish, releaser) diff --git a/code/datums/elements/light_eater.dm b/code/datums/elements/light_eater.dm index 27500b066fe..3f51590da1c 100644 --- a/code/datums/elements/light_eater.dm +++ b/code/datums/elements/light_eater.dm @@ -127,7 +127,19 @@ */ /datum/element/light_eater/proc/on_interacting_with(obj/item/source, mob/living/user, atom/target) SIGNAL_HANDLER - eat_lights(target, source) + if(eat_lights(target, source)) + // do a "pretend" attack if we're hitting something that can't normally be + if(isobj(target)) + var/obj/smacking = target + if(smacking.obj_flags & CAN_BE_HIT) + return NONE + else if(!isturf(target)) + return NONE + user.do_attack_animation(target) + user.changeNext_move(CLICK_CD_RAPID) + target.play_attack_sound() + // not particularly picky about what happens afterwards in the attack chain + return NONE /** * Called when a source object is used to block a thrown object, projectile, or attack diff --git a/code/datums/elements/mirage_border.dm b/code/datums/elements/mirage_border.dm index 999455a0b83..ca7c422dd11 100644 --- a/code/datums/elements/mirage_border.dm +++ b/code/datums/elements/mirage_border.dm @@ -24,9 +24,9 @@ var/turf/northeast = locate(clamp(x + (direction & EAST ? range : 0), 1, world.maxx), clamp(y + (direction & NORTH ? range : 0), 1, world.maxy), z) holder.vis_contents += block(southwest, northeast) if(direction & SOUTH) - holder.pixel_y -= world.icon_size * range + holder.pixel_y -= ICON_SIZE_Y * range if(direction & WEST) - holder.pixel_x -= world.icon_size * range + holder.pixel_x -= ICON_SIZE_X * range /datum/element/mirage_border/Detach(atom/movable/target) . = ..() diff --git a/code/datums/elements/pet_bonus.dm b/code/datums/elements/pet_bonus.dm index 5ef8b515077..a802c363f44 100644 --- a/code/datums/elements/pet_bonus.dm +++ b/code/datums/elements/pet_bonus.dm @@ -8,6 +8,8 @@ element_flags = ELEMENT_BESPOKE argument_hash_start_idx = 2 + ///string key of the emote to do when pet. + var/emote_name ///optional cute message to send when you pet your pet! var/emote_message ///actual moodlet given, defaults to the pet animal one @@ -19,6 +21,7 @@ return ELEMENT_INCOMPATIBLE src.emote_message = emote_message + src.emote_name = emote_name src.moodlet = moodlet RegisterSignal(target, COMSIG_ATOM_ATTACK_HAND, PROC_REF(on_attack_hand)) @@ -36,4 +39,6 @@ SEND_SIGNAL(pet, COMSIG_ANIMAL_PET, petter, modifiers) if(emote_message && prob(33)) pet.manual_emote(emote_message) + if(emote_name) + INVOKE_ASYNC(pet, TYPE_PROC_REF(/mob, emote), emote_name) petter.add_mood_event("petting_bonus", moodlet, pet) diff --git a/code/datums/elements/pet_collar.dm b/code/datums/elements/pet_collar.dm index 5c49de2eceb..f98767629e7 100644 --- a/code/datums/elements/pet_collar.dm +++ b/code/datums/elements/pet_collar.dm @@ -54,7 +54,7 @@ /datum/element/wears_collar/proc/on_content_enter(mob/living/source, obj/item/clothing/neck/petcollar/new_collar) SIGNAL_HANDLER - if(!istype(new_collar)) + if(!istype(new_collar) || !new_collar.tagname) return source.fully_replace_character_name(null, "\proper [new_collar.tagname]") diff --git a/code/datums/elements/slapcrafting.dm b/code/datums/elements/slapcrafting.dm index 42776bf31f7..4b58bddd2a0 100644 --- a/code/datums/elements/slapcrafting.dm +++ b/code/datums/elements/slapcrafting.dm @@ -26,7 +26,7 @@ return //Don't do anything, it just shouldn't be used in crafting. RegisterSignal(target, COMSIG_ATOM_ATTACKBY, PROC_REF(attempt_slapcraft)) - RegisterSignal(target, COMSIG_ATOM_EXAMINE, PROC_REF(get_examine_info)) + RegisterSignal(target, COMSIG_ATOM_EXAMINE_TAGS, PROC_REF(get_examine_info)) RegisterSignal(target, COMSIG_ATOM_EXAMINE_MORE, PROC_REF(get_examine_more_info)) RegisterSignal(target, COMSIG_TOPIC, PROC_REF(topic_handler)) @@ -126,7 +126,7 @@ already_used_names += initial(result.name) string_results += list("\a [initial(result.name)]") - examine_list += span_notice("You think [source] could be used to make [english_list(string_results)]! Examine again to look at the details...") + examine_list["crafting component"] = "You think [source] could be used to make [english_list(string_results)]! Examine again to look at the details..." /// Alerts any examiners to the details of the recipe. /datum/element/slapcrafting/proc/get_examine_more_info(atom/source, mob/user, list/examine_list) diff --git a/code/datums/elements/spooky.dm b/code/datums/elements/spooky.dm index 30a04f6348b..89d53c4e997 100644 --- a/code/datums/elements/spooky.dm +++ b/code/datums/elements/spooky.dm @@ -40,7 +40,7 @@ if((!istype(H.dna.species, /datum/species/skeleton)) && (!istype(H.dna.species, /datum/species/golem)) && (!istype(H.dna.species, /datum/species/android)) && (!istype(H.dna.species, /datum/species/jelly))) C.adjustStaminaLoss(18) //boneless humanoids don't lose the will to live to_chat(C, "DOOT") - to_chat(C, "You're feeling more bony.") + to_chat(C, span_robot("You're feeling more bony.")) INVOKE_ASYNC(src, PROC_REF(spectral_change), H) else //the sound will spook monkeys. diff --git a/code/datums/elements/wall_engraver.dm b/code/datums/elements/wall_engraver.dm index 7204d8cacef..2b319b0609a 100644 --- a/code/datums/elements/wall_engraver.dm +++ b/code/datums/elements/wall_engraver.dm @@ -31,12 +31,12 @@ /datum/element/wall_engraver/proc/try_chisel(obj/item/item, turf/closed/wall, mob/living/user) if(!istype(wall) || !user.mind) return - if(HAS_TRAIT_FROM(wall, TRAIT_NOT_ENGRAVABLE, INNATE_TRAIT)) - user.balloon_alert(user, "wall cannot be engraved!") - return - if(HAS_TRAIT_FROM(wall, TRAIT_NOT_ENGRAVABLE, TRAIT_GENERIC)) + if(HAS_TRAIT_FROM(wall, TRAIT_NOT_ENGRAVABLE, ENGRAVED_TRAIT)) user.balloon_alert(user, "wall has already been engraved!") return + if(HAS_TRAIT(wall, TRAIT_NOT_ENGRAVABLE)) + user.balloon_alert(user, "wall cannot be engraved!") + return if(!length(user.mind?.memories)) user.balloon_alert(user, "nothing memorable to engrave!") return diff --git a/code/datums/elements/wall_tearer.dm b/code/datums/elements/wall_tearer.dm index 2c9ff5416d5..cf61de73009 100644 --- a/code/datums/elements/wall_tearer.dm +++ b/code/datums/elements/wall_tearer.dm @@ -51,7 +51,7 @@ var/rip_time = (istype(target, /turf/closed/wall/r_wall) ? tear_time * reinforced_multiplier : tear_time) / 3 if (rip_time > 0) tearer.visible_message(span_warning("[tearer] begins tearing through [target]!")) - playsound(tearer, 'sound/machines/airlock_alien_prying.ogg', vol = 100, vary = TRUE) + playsound(tearer, 'sound/machines/airlock/airlock_alien_prying.ogg', vol = 100, vary = TRUE) target.balloon_alert(tearer, "tearing...") if (!do_after(tearer, delay = rip_time, target = target, interaction_key = do_after_key)) tearer.balloon_alert(tearer, "interrupted!") diff --git a/code/datums/elements/weapon_description.dm b/code/datums/elements/weapon_description.dm index 0897b571159..eda7ca59b49 100644 --- a/code/datums/elements/weapon_description.dm +++ b/code/datums/elements/weapon_description.dm @@ -73,6 +73,10 @@ // Doesn't show the base notes for items that have the override notes variable set to true if(!source.override_notes) + if (source.sharpness & SHARP_EDGED) + readout += "It's sharp and could cause bleeding wounds." + if (source.sharpness & SHARP_POINTY) + readout += "It's pointy and could cause piercing wounds." // Make sure not to divide by 0 on accident if(source.force > 0) readout += "It takes about [span_warning("[HITS_TO_CRIT(source.force)] melee hit\s")] to take down an enemy." diff --git a/code/datums/emotes.dm b/code/datums/emotes.dm index 5ddebaaca88..12606aba6e6 100644 --- a/code/datums/emotes.dm +++ b/code/datums/emotes.dm @@ -100,8 +100,8 @@ user.log_message(msg, LOG_EMOTE) var/tmp_sound = get_sound(user) - if(tmp_sound && should_play_sound(user, intentional) && TIMER_COOLDOWN_FINISHED(user, type)) - TIMER_COOLDOWN_START(user, type, audio_cooldown) + if(tmp_sound && should_play_sound(user, intentional) && TIMER_COOLDOWN_FINISHED(user, "audible_emote_cooldown")) + TIMER_COOLDOWN_START(user, "audible_emote_cooldown", audio_cooldown) //SKYRAT EDIT CHANGE BEGIN //playsound(source = user,soundin = tmp_sound,vol = 50, vary = vary, ignore_walls = sound_wall_ignore) - SKYRAT EDIT - ORIGINAL if(istype(src, /datum/emote/living/lewd)) @@ -136,16 +136,16 @@ runechat_flags = EMOTE_MESSAGE, ) else if(is_important) - to_chat(viewer, "[user] [msg]") + to_chat(viewer, span_emote("[user] [msg]")) else if(is_audible && is_visual) viewer.show_message( - "[user] [msg]", MSG_AUDIBLE, - "You see how [user] [msg]", MSG_VISUAL, + span_emote("[user] [msg]"), MSG_AUDIBLE, + span_emote("You see how [user] [msg]"), MSG_VISUAL, ) else if(is_audible) - viewer.show_message("[user] [msg]", MSG_AUDIBLE) + viewer.show_message(span_emote("[user] [msg]"), MSG_AUDIBLE) else if(is_visual) - viewer.show_message("[user] [msg]", MSG_VISUAL) + viewer.show_message(span_emote("[user] [msg]"), MSG_VISUAL) return // Early exit so no dchat message // The emote has some important information, and should always be shown to the user @@ -155,7 +155,7 @@ if(!pref_check_emote(viewer)) continue // SKYRAT EDIT END - to_chat(viewer, "[user] [msg]") + to_chat(viewer, span_emote("[user] [msg]")) if(user.runechat_prefs_check(viewer, EMOTE_MESSAGE)) viewer.create_chat_message( speaker = user, @@ -167,7 +167,7 @@ else if(is_visual && is_audible) user.audible_message( message = msg, - deaf_message = "You see how [user] [msg]", + deaf_message = span_emote("You see how [user] [msg]"), self_message = msg, audible_message_flags = EMOTE_MESSAGE|ALWAYS_SHOW_SELF_MESSAGE, separation = space, // SKYRAT EDIT ADDITION @@ -240,8 +240,7 @@ if(!pref_check_emote(ghost)) continue // SKYRAT EDIT END - ghost.show_message("[FOLLOW_LINK(ghost, user)] [dchatmsg]") // SKYRAT EDIT CHANGE - Indented - + to_chat(ghost, span_emote("[FOLLOW_LINK(ghost, user)] [dchatmsg]")) return diff --git a/code/datums/greyscale/json_configs/kitsune.json b/code/datums/greyscale/json_configs/kitsune.json index bee64183213..495520fbbd8 100644 --- a/code/datums/greyscale/json_configs/kitsune.json +++ b/code/datums/greyscale/json_configs/kitsune.json @@ -12,5 +12,19 @@ "blend_mode": "overlay", "color_ids": [ 2 ] } + ], + "kitsune_up": [ + { + "type": "icon_state", + "icon_state": "kitsune_base_up", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "kitsune_stripe_up", + "blend_mode": "overlay", + "color_ids": [ 2 ] + } ] } diff --git a/code/datums/helper_datums/getrev.dm b/code/datums/helper_datums/getrev.dm index c3562aa5987..732323d2865 100644 --- a/code/datums/helper_datums/getrev.dm +++ b/code/datums/helper_datums/getrev.dm @@ -89,4 +89,4 @@ msg += "Protect Assistant Role From Traitor: [CONFIG_GET(flag/protect_assistant_from_antagonist)]" msg += "Enforce Human Authority: [CONFIG_GET(flag/enforce_human_authority)]" msg += "Allow Latejoin Antagonists: [CONFIG_GET(flag/allow_latejoin_antagonists)]" - to_chat(src, "[msg.Join("
")]
") + to_chat(src, span_infoplain(msg.Join("
"))) diff --git a/code/datums/id_trim/_id_trim.dm b/code/datums/id_trim/_id_trim.dm index 562232214b3..32bafcb41d3 100644 --- a/code/datums/id_trim/_id_trim.dm +++ b/code/datums/id_trim/_id_trim.dm @@ -29,6 +29,9 @@ ///If set, IDs with this trim will give wearers arrows of different colors when pointing var/pointer_color +/datum/id_trim/proc/find_job() + return null + /// 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() diff --git a/code/datums/id_trim/jobs.dm b/code/datums/id_trim/jobs.dm index a42018406b2..34432a638db 100644 --- a/code/datums/id_trim/jobs.dm +++ b/code/datums/id_trim/jobs.dm @@ -24,10 +24,10 @@ /datum/id_trim/job/New() if(ispath(job)) - job = SSjob.GetJobType(job) + job = SSjob.get_job_type(job) if(isnull(job_changes)) - job_changes = SSmapping.config.job_changes + job_changes = SSmapping.current_map.job_changes if(!length(job_changes)) refresh_trim_access() @@ -76,6 +76,9 @@ return TRUE +/datum/id_trim/job/find_job() + return job + /datum/id_trim/job/assistant assignment = JOB_ASSISTANT trim_state = "trim_assistant" @@ -156,6 +159,29 @@ ) job = /datum/job/bartender +/datum/id_trim/job/pun_pun + assignment = "Busser" + trim_state = "trim_busser" + department_color = COLOR_SERVICE_LIME + subdepartment_color = COLOR_SERVICE_LIME + sechud_icon_state = SECHUD_BUSSER + minimal_access = list( + ACCESS_MINERAL_STOREROOM, + ACCESS_SERVICE, + ACCESS_THEATRE, + ) + extra_access = list( + ACCESS_HYDROPONICS, + ACCESS_KITCHEN, + ACCESS_BAR, + ) + template_access = list( + ACCESS_CAPTAIN, + ACCESS_CHANGE_IDS, + ACCESS_HOP, + ) + job = /datum/job/pun_pun + /datum/id_trim/job/bitrunner assignment = JOB_BITRUNNER trim_state = "trim_bitrunner" @@ -1070,7 +1096,7 @@ if(CONFIG_GET(number/depsec_access_level) == POPULATION_SCALED_ACCESS) var/minimal_security_officers = 3 // We do not spawn in any more lockers if there are 5 or less security officers, so let's keep it lower than that number. - var/datum/job/J = SSjob.GetJob(JOB_SECURITY_OFFICER) + var/datum/job/J = SSjob.get_job(JOB_SECURITY_OFFICER) if((J.spawn_positions - minimal_security_officers) <= 0) access |= elevated_access diff --git a/code/datums/looping_sounds/acid.dm b/code/datums/looping_sounds/acid.dm index e461e5d02ce..9dcf6e1750a 100644 --- a/code/datums/looping_sounds/acid.dm +++ b/code/datums/looping_sounds/acid.dm @@ -1,5 +1,5 @@ /// Soundloop for the acid component. /datum/looping_sound/acid - mid_sounds = list('sound/items/welder.ogg' = 1) + mid_sounds = list('sound/items/tools/welder.ogg' = 1) mid_length = 10 volume = 150 diff --git a/code/datums/looping_sounds/breathing.dm b/code/datums/looping_sounds/breathing.dm index 73474149ae4..a50e13a7fd5 100644 --- a/code/datums/looping_sounds/breathing.dm +++ b/code/datums/looping_sounds/breathing.dm @@ -1,13 +1,13 @@ /datum/looping_sound/breathing mid_sounds = list( - 'sound/voice/breathing/internals_breathing1.ogg' = 1, - 'sound/voice/breathing/internals_breathing2.ogg' = 1, - 'sound/voice/breathing/internals_breathing3.ogg' = 1, - 'sound/voice/breathing/internals_breathing4.ogg' = 1, - 'sound/voice/breathing/internals_breathing5.ogg' = 1, - 'sound/voice/breathing/internals_breathing6.ogg' = 1, - 'sound/voice/breathing/internals_breathing7.ogg' = 1, - 'sound/voice/breathing/internals_breathing8.ogg' = 1, + 'sound/mobs/humanoids/breathing/internals_breathing1.ogg' = 1, + 'sound/mobs/humanoids/breathing/internals_breathing2.ogg' = 1, + 'sound/mobs/humanoids/breathing/internals_breathing3.ogg' = 1, + 'sound/mobs/humanoids/breathing/internals_breathing4.ogg' = 1, + 'sound/mobs/humanoids/breathing/internals_breathing5.ogg' = 1, + 'sound/mobs/humanoids/breathing/internals_breathing6.ogg' = 1, + 'sound/mobs/humanoids/breathing/internals_breathing7.ogg' = 1, + 'sound/mobs/humanoids/breathing/internals_breathing8.ogg' = 1, ) //Calculated this by using the average breathing time of an adult (12 to 20 per minute, which on average is 16 per minute) // realism is overrated, make it longer to reduce ear fatigue diff --git a/code/datums/looping_sounds/choking.dm b/code/datums/looping_sounds/choking.dm index 444204efa1f..6d337b1c7d6 100644 --- a/code/datums/looping_sounds/choking.dm +++ b/code/datums/looping_sounds/choking.dm @@ -1,5 +1,5 @@ /datum/looping_sound/choking - mid_sounds = list('sound/creatures/gag1.ogg' = 1, 'sound/creatures/gag2.ogg' = 1, 'sound/creatures/gag3.ogg' = 1, 'sound/creatures/gag4.ogg' = 1, 'sound/creatures/gag5.ogg' = 1) + mid_sounds = list('sound/mobs/humanoids/human/gag_vomit/gag1.ogg' = 1, 'sound/mobs/humanoids/human/gag_vomit/gag2.ogg' = 1, 'sound/mobs/humanoids/human/gag_vomit/gag3.ogg' = 1, 'sound/mobs/humanoids/human/gag_vomit/gag4.ogg' = 1, 'sound/mobs/humanoids/human/gag_vomit/gag5.ogg' = 1) mid_length = 1.6 SECONDS mid_length_vary = 0.3 SECONDS each_once = TRUE diff --git a/code/datums/looping_sounds/cyborg.dm b/code/datums/looping_sounds/cyborg.dm index 499e61757c6..0a01a4c7116 100644 --- a/code/datums/looping_sounds/cyborg.dm +++ b/code/datums/looping_sounds/cyborg.dm @@ -1,10 +1,10 @@ /datum/looping_sound/wash - mid_sounds = list('sound/creatures/cyborg/wash1.ogg' = 1, 'sound/creatures/cyborg/wash2.ogg' = 1) + mid_sounds = list('sound/mobs/non-humanoids/cyborg/wash1.ogg' = 1, 'sound/mobs/non-humanoids/cyborg/wash2.ogg' = 1) mid_length = 1.5 SECONDS // This makes them overlap slightly, which works out well for masking the fade in/out start_volume = 100 - start_sound = 'sound/creatures/cyborg/wash_start.ogg' + start_sound = 'sound/mobs/non-humanoids/cyborg/wash_start.ogg' start_length = 3.6 SECONDS // again, slightly shorter then the real time of 4 seconds, will make the transition to midsounds more seemless end_volume = 100 - end_sound = 'sound/creatures/cyborg/wash_end.ogg' + end_sound = 'sound/mobs/non-humanoids/cyborg/wash_end.ogg' vary = TRUE extra_range = 5 diff --git a/code/datums/looping_sounds/item_sounds.dm b/code/datums/looping_sounds/item_sounds.dm index 00fd3063e43..7800326bb0a 100644 --- a/code/datums/looping_sounds/item_sounds.dm +++ b/code/datums/looping_sounds/item_sounds.dm @@ -5,7 +5,7 @@ /datum/looping_sound/reverse_bear_trap_beep - mid_sounds = list('sound/machines/beep.ogg' = 1) + mid_sounds = list('sound/machines/beep/beep.ogg' = 1) mid_length = 60 volume = 10 @@ -24,7 +24,7 @@ mid_length = 1 SECONDS /datum/looping_sound/trapped_machine_beep - mid_sounds = list('sound/machines/beep.ogg' = 1) + mid_sounds = list('sound/machines/beep/beep.ogg' = 1) mid_length = 10 SECONDS mid_length_vary = 5 SECONDS falloff_exponent = 10 @@ -32,19 +32,19 @@ volume = 5 /datum/looping_sound/chainsaw - start_sound = list('sound/weapons/chainsaw_start.ogg' = 1) + start_sound = list('sound/items/weapons/chainsaw_start.ogg' = 1) start_length = 0.85 SECONDS - mid_sounds = list('sound/weapons/chainsaw_loop.ogg' = 1) + mid_sounds = list('sound/items/weapons/chainsaw_loop.ogg' = 1) mid_length = 0.85 SECONDS - end_sound = list('sound/weapons/chainsaw_stop.ogg' = 1) + end_sound = list('sound/items/weapons/chainsaw_stop.ogg' = 1) end_volume = 35 volume = 40 ignore_walls = FALSE /datum/looping_sound/beesmoke - mid_sounds = list('sound/weapons/beesmoke.ogg' = 1) + mid_sounds = list('sound/items/weapons/beesmoke.ogg' = 1) volume = 5 /datum/looping_sound/zipline - mid_sounds = list('sound/weapons/zipline_mid.ogg' = 1) + mid_sounds = list('sound/items/weapons/zipline_mid.ogg' = 1) volume = 5 diff --git a/code/datums/looping_sounds/machinery_sounds.dm b/code/datums/looping_sounds/machinery_sounds.dm index bc32b031256..c4648a929b3 100644 --- a/code/datums/looping_sounds/machinery_sounds.dm +++ b/code/datums/looping_sounds/machinery_sounds.dm @@ -47,7 +47,7 @@ volume = 15 /datum/looping_sound/clock - mid_sounds = list('sound/ambience/ticking_clock.ogg' = 1) + mid_sounds = list('sound/ambience/misc/ticking_clock.ogg' = 1) mid_length = 40 volume = 50 ignore_walls = FALSE @@ -90,7 +90,7 @@ /datum/looping_sound/jackpot mid_length = 11 - mid_sounds = list('sound/machines/roulettejackpot.ogg' = 1) + mid_sounds = list('sound/machines/roulette/roulettejackpot.ogg' = 1) volume = 85 vary = TRUE @@ -141,7 +141,7 @@ falloff_exponent = 20 /datum/looping_sound/firealarm - mid_sounds = list('sound/machines/FireAlarm1.ogg' = 1,'sound/machines/FireAlarm2.ogg' = 1,'sound/machines/FireAlarm3.ogg' = 1,'sound/machines/FireAlarm4.ogg' = 1) + mid_sounds = list('sound/machines/fire_alarm/FireAlarm1.ogg' = 1,'sound/machines/fire_alarm/FireAlarm2.ogg' = 1,'sound/machines/fire_alarm/FireAlarm3.ogg' = 1,'sound/machines/fire_alarm/FireAlarm4.ogg' = 1) mid_length = 2.4 SECONDS volume = 30 @@ -151,34 +151,34 @@ falloff_exponent = 5 /datum/looping_sound/boiling - mid_sounds = list('sound/effects/bubbles2.ogg' = 1) + mid_sounds = list('sound/effects/bubbles/bubbles2.ogg' = 1) mid_length = 7 SECONDS volume = 25 /datum/looping_sound/typing mid_sounds = list( - 'sound/machines/terminal_button01.ogg' = 1, - 'sound/machines/terminal_button02.ogg' = 1, - 'sound/machines/terminal_button03.ogg' = 1, - 'sound/machines/terminal_button04.ogg' = 1, - 'sound/machines/terminal_button05.ogg' = 1, - 'sound/machines/terminal_button06.ogg' = 1, - 'sound/machines/terminal_button07.ogg' = 1, - 'sound/machines/terminal_button08.ogg' = 1, + 'sound/machines/terminal/terminal_button01.ogg' = 1, + 'sound/machines/terminal/terminal_button02.ogg' = 1, + 'sound/machines/terminal/terminal_button03.ogg' = 1, + 'sound/machines/terminal/terminal_button04.ogg' = 1, + 'sound/machines/terminal/terminal_button05.ogg' = 1, + 'sound/machines/terminal/terminal_button06.ogg' = 1, + 'sound/machines/terminal/terminal_button07.ogg' = 1, + 'sound/machines/terminal/terminal_button08.ogg' = 1, ) mid_length = 0.3 SECONDS /datum/looping_sound/soup mid_sounds = list( - 'sound/effects/soup_boil1.ogg' = 1, - 'sound/effects/soup_boil2.ogg' = 1, - 'sound/effects/soup_boil3.ogg' = 1, - 'sound/effects/soup_boil4.ogg' = 1, - 'sound/effects/soup_boil5.ogg' = 1, + 'sound/effects/soup_boil/soup_boil1.ogg' = 1, + 'sound/effects/soup_boil/soup_boil2.ogg' = 1, + 'sound/effects/soup_boil/soup_boil3.ogg' = 1, + 'sound/effects/soup_boil/soup_boil4.ogg' = 1, + 'sound/effects/soup_boil/soup_boil5.ogg' = 1, ) mid_length = 3 SECONDS volume = 80 - end_sound = 'sound/effects/soup_boil_end.ogg' + end_sound = 'sound/effects/soup_boil/soup_boil_end.ogg' end_volume = 60 extra_range = MEDIUM_RANGE_SOUND_EXTRARANGE falloff_exponent = 4 diff --git a/code/datums/looping_sounds/music.dm b/code/datums/looping_sounds/music.dm index ac76e236bc7..cc35ab8a8ee 100644 --- a/code/datums/looping_sounds/music.dm +++ b/code/datums/looping_sounds/music.dm @@ -1,6 +1,6 @@ /datum/looping_sound/local_forecast mid_sounds = list( - 'sound/ambience/music/elevator/robocop-short.ogg' = 1, + 'sound/music/elevator/robocop-short.ogg' = 1, ) mid_length = 61 SECONDS volume = 20 diff --git a/code/datums/looping_sounds/vents.dm b/code/datums/looping_sounds/vents.dm index 2d0a3443631..016b21db9ca 100644 --- a/code/datums/looping_sounds/vents.dm +++ b/code/datums/looping_sounds/vents.dm @@ -1,7 +1,7 @@ /datum/looping_sound/vent_pump_overclock - start_sound = 'sound/machines/fan_start.ogg' + start_sound = 'sound/machines/fan/fan_start.ogg' start_length = 1.5 SECONDS - end_sound = 'sound/machines/fan_stop.ogg' + end_sound = 'sound/machines/fan/fan_stop.ogg' end_sound = 1.5 SECONDS - mid_sounds = 'sound/machines/fan_loop.ogg' + mid_sounds = 'sound/machines/fan/fan_loop.ogg' mid_length = 2 SECONDS diff --git a/code/datums/looping_sounds/weather.dm b/code/datums/looping_sounds/weather.dm index 6576cfb4e8d..fa782a5f4ee 100644 --- a/code/datums/looping_sounds/weather.dm +++ b/code/datums/looping_sounds/weather.dm @@ -1,53 +1,53 @@ /datum/looping_sound/active_outside_ashstorm mid_sounds = list( - 'sound/weather/ashstorm/outside/active_mid1.ogg'=1, - 'sound/weather/ashstorm/outside/active_mid1.ogg'=1, - 'sound/weather/ashstorm/outside/active_mid1.ogg'=1 + 'sound/ambience/weather/ashstorm/outside/active_mid1.ogg'=1, + 'sound/ambience/weather/ashstorm/outside/active_mid1.ogg'=1, + 'sound/ambience/weather/ashstorm/outside/active_mid1.ogg'=1 ) mid_length = 80 - start_sound = 'sound/weather/ashstorm/outside/active_start.ogg' + start_sound = 'sound/ambience/weather/ashstorm/outside/active_start.ogg' start_length = 130 - end_sound = 'sound/weather/ashstorm/outside/active_end.ogg' + end_sound = 'sound/ambience/weather/ashstorm/outside/active_end.ogg' volume = 80 /datum/looping_sound/active_inside_ashstorm mid_sounds = list( - 'sound/weather/ashstorm/inside/active_mid1.ogg'=1, - 'sound/weather/ashstorm/inside/active_mid2.ogg'=1, - 'sound/weather/ashstorm/inside/active_mid3.ogg'=1 + 'sound/ambience/weather/ashstorm/inside/active_mid1.ogg'=1, + 'sound/ambience/weather/ashstorm/inside/active_mid2.ogg'=1, + 'sound/ambience/weather/ashstorm/inside/active_mid3.ogg'=1 ) mid_length = 80 - start_sound = 'sound/weather/ashstorm/inside/active_start.ogg' + start_sound = 'sound/ambience/weather/ashstorm/inside/active_start.ogg' start_length = 130 - end_sound = 'sound/weather/ashstorm/inside/active_end.ogg' + end_sound = 'sound/ambience/weather/ashstorm/inside/active_end.ogg' volume = 60 /datum/looping_sound/weak_outside_ashstorm mid_sounds = list( - 'sound/weather/ashstorm/outside/weak_mid1.ogg'=1, - 'sound/weather/ashstorm/outside/weak_mid2.ogg'=1, - 'sound/weather/ashstorm/outside/weak_mid3.ogg'=1 + 'sound/ambience/weather/ashstorm/outside/weak_mid1.ogg'=1, + 'sound/ambience/weather/ashstorm/outside/weak_mid2.ogg'=1, + 'sound/ambience/weather/ashstorm/outside/weak_mid3.ogg'=1 ) mid_length = 80 - start_sound = 'sound/weather/ashstorm/outside/weak_start.ogg' + start_sound = 'sound/ambience/weather/ashstorm/outside/weak_start.ogg' start_length = 130 - end_sound = 'sound/weather/ashstorm/outside/weak_end.ogg' + end_sound = 'sound/ambience/weather/ashstorm/outside/weak_end.ogg' volume = 50 /datum/looping_sound/weak_inside_ashstorm mid_sounds = list( - 'sound/weather/ashstorm/inside/weak_mid1.ogg'=1, - 'sound/weather/ashstorm/inside/weak_mid2.ogg'=1, - 'sound/weather/ashstorm/inside/weak_mid3.ogg'=1 + 'sound/ambience/weather/ashstorm/inside/weak_mid1.ogg'=1, + 'sound/ambience/weather/ashstorm/inside/weak_mid2.ogg'=1, + 'sound/ambience/weather/ashstorm/inside/weak_mid3.ogg'=1 ) mid_length = 80 - start_sound = 'sound/weather/ashstorm/inside/weak_start.ogg' + start_sound = 'sound/ambience/weather/ashstorm/inside/weak_start.ogg' start_length = 130 - end_sound = 'sound/weather/ashstorm/inside/weak_end.ogg' + end_sound = 'sound/ambience/weather/ashstorm/inside/weak_end.ogg' volume = 30 /datum/looping_sound/void_loop - mid_sounds = list('sound/ambience/VoidsEmbrace.ogg'=1) + mid_sounds = list('sound/music/antag/heretic/VoidsEmbrace.ogg'=1) mid_length = 1669 // exact length of the music in ticks volume = 100 extra_range = 30 diff --git a/code/datums/martial/cqc.dm b/code/datums/martial/cqc.dm index 28b820278e2..35f8a254e17 100644 --- a/code/datums/martial/cqc.dm +++ b/code/datums/martial/cqc.dm @@ -104,7 +104,7 @@ attacker, ) to_chat(attacker, span_danger("You slam [defender] into the ground!")) - playsound(attacker, 'sound/weapons/slam.ogg', 50, TRUE, -1) + playsound(attacker, 'sound/items/weapons/slam.ogg', 50, TRUE, -1) defender.apply_damage(10, BRUTE) defender.Paralyze(12 SECONDS) log_combat(attacker, defender, "slammed (CQC)") @@ -125,7 +125,7 @@ attacker, ) to_chat(attacker, span_danger("You kick [defender]'s head, knocking [defender.p_them()] out!")) - playsound(attacker, 'sound/weapons/genhit1.ogg', 50, TRUE, -1) + playsound(attacker, 'sound/items/weapons/genhit1.ogg', 50, TRUE, -1) var/helmet_protection = defender.run_armor_check(BODY_ZONE_HEAD, MELEE) defender.apply_effect(20 SECONDS, EFFECT_KNOCKDOWN, helmet_protection) @@ -141,7 +141,7 @@ attacker, ) to_chat(attacker, span_danger("You kick [defender] back!")) - playsound(attacker, 'sound/weapons/cqchit1.ogg', 50, TRUE, -1) + playsound(attacker, 'sound/items/weapons/cqchit1.ogg', 50, TRUE, -1) var/atom/throw_target = get_edge_target_turf(defender, attacker.dir) defender.throw_at(throw_target, 1, 14, attacker) defender.apply_damage(10, attacker.get_attack_type()) @@ -163,7 +163,7 @@ ) to_chat(attacker, span_danger("You punch [defender]'s neck!")) defender.adjustStaminaLoss(60) - playsound(attacker, 'sound/weapons/cqchit1.ogg', 50, TRUE, -1) + playsound(attacker, 'sound/items/weapons/cqchit1.ogg', 50, TRUE, -1) return TRUE /datum/martial_art/cqc/proc/Restrain(mob/living/attacker, mob/living/defender) @@ -201,7 +201,7 @@ attacker, ) to_chat(attacker, span_danger("You strike [defender]'s abdomen, neck and back consecutively!")) - playsound(defender, 'sound/weapons/cqchit2.ogg', 50, TRUE, -1) + playsound(defender, 'sound/items/weapons/cqchit2.ogg', 50, TRUE, -1) var/obj/item/held_item = defender.get_active_held_item() if(held_item && defender.temporarilyRemoveItemFromInventory(held_item)) attacker.put_in_hands(held_item) @@ -291,7 +291,7 @@ picked_hit_type = pick("kick", "stomp") defender.apply_damage(bonus_damage, BRUTE) - playsound(defender, (picked_hit_type == "kick" || picked_hit_type == "stomp") ? 'sound/weapons/cqchit2.ogg' : 'sound/weapons/cqchit1.ogg', 50, TRUE, -1) + playsound(defender, (picked_hit_type == "kick" || picked_hit_type == "stomp") ? 'sound/items/weapons/cqchit2.ogg' : 'sound/items/weapons/cqchit1.ogg', 50, TRUE, -1) defender.visible_message( span_danger("[attacker] [picked_hit_type]ed [defender]!"), @@ -344,7 +344,7 @@ attacker, ) to_chat(attacker, span_danger("You strike [defender]'s jaw,[disarmed_item ? " disarming [defender.p_them()] of [disarmed_item] and" : ""] leaving [defender.p_them()] disoriented!")) - playsound(defender, 'sound/weapons/cqchit1.ogg', 50, TRUE, -1) + playsound(defender, 'sound/items/weapons/cqchit1.ogg', 50, TRUE, -1) defender.set_jitter_if_lower(4 SECONDS) defender.apply_damage(5, attacker.get_attack_type()) log_combat(attacker, defender, "disarmed (CQC)", addition = disarmed_item ? "(disarmed of [disarmed_item])" : null) @@ -358,7 +358,7 @@ attacker, ) to_chat(attacker, span_warning("You fail to disarm [defender]!")) - playsound(defender, 'sound/weapons/punchmiss.ogg', 25, TRUE, -1) + playsound(defender, 'sound/items/weapons/punchmiss.ogg', 25, TRUE, -1) log_combat(attacker, defender, "failed to disarm (CQC)") return MARTIAL_ATTACK_FAIL diff --git a/code/datums/martial/krav_maga.dm b/code/datums/martial/krav_maga.dm index 57e158cf669..d670b8eb638 100644 --- a/code/datums/martial/krav_maga.dm +++ b/code/datums/martial/krav_maga.dm @@ -201,7 +201,7 @@ attacker, ) to_chat(attacker, span_danger("You disarm [defender]!")) - playsound(defender, 'sound/weapons/thudswoosh.ogg', 50, TRUE, -1) + playsound(defender, 'sound/items/weapons/thudswoosh.ogg', 50, TRUE, -1) log_combat(attacker, defender, "disarmed (Krav Maga)", addition = "(disarmed of [stuff_in_hand])") return MARTIAL_ATTACK_INVALID // normal shove diff --git a/code/datums/martial/plasma_fist.dm b/code/datums/martial/plasma_fist.dm index 8a73f47093b..8e24e876dec 100644 --- a/code/datums/martial/plasma_fist.dm +++ b/code/datums/martial/plasma_fist.dm @@ -41,7 +41,7 @@ /datum/martial_art/plasma_fist/proc/Tornado(mob/living/attacker, mob/living/defender) attacker.say("TORNADO SWEEP!", forced="plasma fist") - dance_rotate(attacker, CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(playsound), attacker, 'sound/weapons/punch1.ogg', 15, TRUE, -1)) + dance_rotate(attacker, CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(playsound), attacker, 'sound/items/weapons/punch1.ogg', 15, TRUE, -1)) tornado_spell.cast(attacker) log_combat(attacker, defender, "tornado sweeped (Plasma Fist)") return TRUE @@ -55,7 +55,7 @@ attacker, ) to_chat(attacker, span_danger("You hit [defender] with Plasma Punch!")) - playsound(defender, 'sound/weapons/punch1.ogg', 50, TRUE, -1) + playsound(defender, 'sound/items/weapons/punch1.ogg', 50, TRUE, -1) var/atom/throw_target = get_edge_target_turf(defender, get_dir(defender, get_step_away(defender, attacker))) defender.throw_at(throw_target, 200, 4,attacker) attacker.say("HYAH!", forced="plasma fist") @@ -66,7 +66,7 @@ var/hasclient = !!defender.client attacker.do_attack_animation(defender, ATTACK_EFFECT_PUNCH) - playsound(defender, 'sound/weapons/punch1.ogg', 50, TRUE, -1) + playsound(defender, 'sound/items/weapons/punch1.ogg', 50, TRUE, -1) attacker.say("PLASMA FIST!", forced="plasma fist") defender.visible_message( span_danger("[attacker] hits [defender] with THE PLASMA FIST TECHNIQUE!"), @@ -126,7 +126,7 @@ user.apply_damage(rand(50, 70), BRUTE, wound_bonus = CANT_WOUND) addtimer(CALLBACK(src, PROC_REF(Apotheosis_end), user), 6 SECONDS) - playsound(boomspot, 'sound/weapons/punch1.ogg', 50, TRUE, -1) + playsound(boomspot, 'sound/items/weapons/punch1.ogg', 50, TRUE, -1) explosion(user, devastation_range = plasma_power, heavy_impact_range = plasma_power*2, light_impact_range = plasma_power*4, ignorecap = TRUE, explosion_cause = src) plasma_power = 1 //just in case there is any clever way to cause it to happen again return TRUE diff --git a/code/datums/martial/psychotic_brawl.dm b/code/datums/martial/psychotic_brawl.dm index 454d23637f2..99c2b0e2224 100644 --- a/code/datums/martial/psychotic_brawl.dm +++ b/code/datums/martial/psychotic_brawl.dm @@ -67,7 +67,7 @@ attacker, ) to_chat(attacker, span_danger("You [atk_verb] [defender]!")) - playsound(defender, 'sound/weapons/punch1.ogg', 40, TRUE, -1) + playsound(defender, 'sound/items/weapons/punch1.ogg', 40, TRUE, -1) defender.apply_damage(defender_damage, attacker.get_attack_type(), BODY_ZONE_HEAD) attacker.apply_damage(rand(5, 10), attacker.get_attack_type(), BODY_ZONE_HEAD) if(iscarbon(defender)) diff --git a/code/datums/martial/sleeping_carp.dm b/code/datums/martial/sleeping_carp.dm index 02d0452fad2..f52050d8d76 100644 --- a/code/datums/martial/sleeping_carp.dm +++ b/code/datums/martial/sleeping_carp.dm @@ -53,7 +53,7 @@ attacker, ) to_chat(attacker, span_danger("You [atk_verb] [defender]!")) - playsound(defender, 'sound/weapons/punch1.ogg', 25, TRUE, -1) + playsound(defender, 'sound/items/weapons/punch1.ogg', 25, TRUE, -1) log_combat(attacker, defender, "strong punched (Sleeping Carp)") defender.apply_damage(20, attacker.get_attack_type(), affecting) return TRUE @@ -106,7 +106,7 @@ var/grab_log_description = "grabbed" attacker.do_attack_animation(defender, ATTACK_EFFECT_PUNCH) - playsound(defender, 'sound/weapons/punch1.ogg', 25, TRUE, -1) + playsound(defender, 'sound/items/weapons/punch1.ogg', 25, TRUE, -1) if(defender.stat != DEAD && !defender.IsUnconscious() && defender.getStaminaLoss() >= 80) //We put our target to sleep. defender.visible_message( span_danger("[attacker] carefully pinch a nerve in [defender]'s neck, knocking them out cold!"), @@ -161,7 +161,7 @@ ) to_chat(attacker, span_danger("You [atk_verb] [defender]!")) defender.apply_damage(final_damage, attacker.get_attack_type(), affecting, wound_bonus = CANT_WOUND) - playsound(defender, 'sound/weapons/punch1.ogg', 25, TRUE, -1) + playsound(defender, 'sound/items/weapons/punch1.ogg', 25, TRUE, -1) log_combat(attacker, defender, "punched (Sleeping Carp)") return MARTIAL_ATTACK_SUCCESS @@ -176,7 +176,7 @@ return MARTIAL_ATTACK_SUCCESS attacker.do_attack_animation(defender, ATTACK_EFFECT_PUNCH) - playsound(defender, 'sound/weapons/punch1.ogg', 25, TRUE, -1) + playsound(defender, 'sound/items/weapons/punch1.ogg', 25, TRUE, -1) defender.apply_damage(20, STAMINA) log_combat(attacker, defender, "disarmed (Sleeping Carp)") return MARTIAL_ATTACK_INVALID // normal disarm @@ -204,7 +204,7 @@ span_danger("[carp_user] effortlessly swats [hitting_projectile] aside! [carp_user.p_They()] can block bullets with [carp_user.p_their()] bare hands!"), span_userdanger("You deflect [hitting_projectile]!"), ) - playsound(carp_user, pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg'), 75, TRUE) + playsound(carp_user, pick('sound/items/weapons/bulletflyby.ogg', 'sound/items/weapons/bulletflyby2.ogg', 'sound/items/weapons/bulletflyby3.ogg'), 75, TRUE) hitting_projectile.firer = carp_user hitting_projectile.set_angle(rand(0, 360))//SHING return COMPONENT_BULLET_PIERCED diff --git a/code/datums/memory/tattoo_kit.dm b/code/datums/memory/tattoo_kit.dm index 98d47eaa285..62b4d73be28 100644 --- a/code/datums/memory/tattoo_kit.dm +++ b/code/datums/memory/tattoo_kit.dm @@ -46,11 +46,11 @@ if(!tattoo_target) balloon_alert(tattoo_artist, "no limb to tattoo!") return - if(HAS_TRAIT_FROM(tattoo_target, TRAIT_NOT_ENGRAVABLE, INNATE_TRAIT)) - balloon_alert(tattoo_artist, "bodypart cannot be engraved!") + if(HAS_TRAIT_FROM(tattoo_target, TRAIT_NOT_ENGRAVABLE, ENGRAVED_TRAIT)) + balloon_alert(tattoo_artist, "bodypart already tattooed!") return - if(HAS_TRAIT_FROM(tattoo_target, TRAIT_NOT_ENGRAVABLE, TRAIT_GENERIC)) - balloon_alert(tattoo_artist, "bodypart has already been engraved!") + if(HAS_TRAIT(tattoo_target, TRAIT_NOT_ENGRAVABLE)) + balloon_alert(tattoo_artist, "bodypart cannot be tattooed!") return var/datum/memory/memory_to_tattoo = tattoo_artist.mind.select_memory("tattoo") if(!memory_to_tattoo || !tattoo_artist.Adjacent(tattoo_holder) || !tattoo_holder.get_bodypart(selected_zone)) diff --git a/code/datums/mind/_mind.dm b/code/datums/mind/_mind.dm index dddc99c0722..e5f6c9a3463 100644 --- a/code/datums/mind/_mind.dm +++ b/code/datums/mind/_mind.dm @@ -106,7 +106,7 @@ /datum/mind/New(_key) key = _key init_known_skills() - set_assigned_role(SSjob.GetJobType(/datum/job/unassigned)) // Unassigned by default. + set_assigned_role(SSjob.get_job_type(/datum/job/unassigned)) // Unassigned by default. /datum/mind/Destroy() SSticker.minds -= src @@ -251,7 +251,7 @@ var/new_role = input("Select new role", "Assigned role", assigned_role.title) as null|anything in sort_list(SSjob.name_occupations) if(isnull(new_role)) return - var/datum/job/new_job = SSjob.GetJob(new_role) + var/datum/job/new_job = SSjob.get_job(new_role) if (!new_job) to_chat(usr, span_warning("Job not found.")) return diff --git a/code/datums/mind/antag.dm b/code/datums/mind/antag.dm index b71a5325392..169bd7ef92a 100644 --- a/code/datums/mind/antag.dm +++ b/code/datums/mind/antag.dm @@ -287,7 +287,7 @@ /datum/mind/proc/make_wizard() if(has_antag_datum(/datum/antagonist/wizard)) return - set_assigned_role(SSjob.GetJobType(/datum/job/space_wizard)) + set_assigned_role(SSjob.get_job_type(/datum/job/space_wizard)) special_role = ROLE_WIZARD add_antag_datum(/datum/antagonist/wizard) diff --git a/code/datums/mind/initialization.dm b/code/datums/mind/initialization.dm index eb622cc5af5..e3b3e8225dc 100644 --- a/code/datums/mind/initialization.dm +++ b/code/datums/mind/initialization.dm @@ -21,17 +21,17 @@ //AI /mob/living/silicon/ai/mind_initialize() . = ..() - mind.set_assigned_role(SSjob.GetJobType(/datum/job/ai)) + mind.set_assigned_role(SSjob.get_job_type(/datum/job/ai)) //BORG /mob/living/silicon/robot/mind_initialize() . = ..() - mind.set_assigned_role(SSjob.GetJobType(/datum/job/cyborg)) + mind.set_assigned_role(SSjob.get_job_type(/datum/job/cyborg)) //PAI /mob/living/silicon/pai/mind_initialize() . = ..() - mind.set_assigned_role(SSjob.GetJobType(/datum/job/personal_ai)) + mind.set_assigned_role(SSjob.get_job_type(/datum/job/personal_ai)) mind.special_role = "" diff --git a/code/datums/mood.dm b/code/datums/mood.dm index cdc7074fd5f..ed0f1e04ee4 100644 --- a/code/datums/mood.dm +++ b/code/datums/mood.dm @@ -462,7 +462,7 @@ clear_mood_event(MOOD_CATEGORY_AREA_BEAUTY) return - if(HAS_TRAIT(mob_parent, TRAIT_MORBID)) + if(HAS_MIND_TRAIT(mob_parent, TRAIT_MORBID)) if(HAS_TRAIT(mob_parent, TRAIT_SNOB)) switch(area_to_beautify.beauty) if(BEAUTY_LEVEL_DECENT to BEAUTY_LEVEL_GOOD) diff --git a/code/datums/mood_events/food_events.dm b/code/datums/mood_events/food_events.dm index 7d33e7e57ce..e64d975902e 100644 --- a/code/datums/mood_events/food_events.dm +++ b/code/datums/mood_events/food_events.dm @@ -49,3 +49,8 @@ /datum/mood_event/food/top quality = FOOD_QUALITY_TOP + +/datum/mood_event/pacifist_eating_fish_item + description = "I shouldn't be eating living creatures..." + mood_change = -1 //The disgusting food moodlet already has a pretty big negative value, this is just for context. + timeout = 4 MINUTES diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm index 82cd275aef2..695bf439496 100644 --- a/code/datums/mood_events/generic_negative_events.dm +++ b/code/datums/mood_events/generic_negative_events.dm @@ -490,3 +490,14 @@ description = "I DIDN'T MEAN TO HURT THEM!" mood_change = -20 timeout = 10 MINUTES + +//Gained when you're hit over the head with wrapping paper or cardboard roll +/datum/mood_event/bapped + description = "Ow.. my head, I feel a bit foolish now!" + mood_change = -1 + timeout = 3 MINUTES + +/datum/mood_event/bapped/add_effects() + // Felinids apparently hate being hit over the head with cardboard + if(isfelinid(owner)) + mood_change = -2 diff --git a/code/datums/mood_events/generic_positive_events.dm b/code/datums/mood_events/generic_positive_events.dm index 54b276fa71a..cdd28c1855e 100644 --- a/code/datums/mood_events/generic_positive_events.dm +++ b/code/datums/mood_events/generic_positive_events.dm @@ -333,9 +333,34 @@ /datum/mood_event/fishing description = "Fishing is relaxing." - mood_change = 5 + mood_change = 4 timeout = 3 MINUTES +/datum/mood_event/fish_released + description = "Go, fish, swim and be free!" + mood_change = 1 + timeout = 2 MINUTES + +/datum/mood_event/fish_released/add_effects(morbid, obj/item/fish/fish) + if(!morbid) + description = "Go, [fish.name], swim and be free!" + return + if(fish.status == FISH_DEAD) + description = "Some scavenger will surely find a use for the remains of [fish.name]. How pragmatic." + else + description = "Returned to the burden of the deep. But is this truly a mercy, [fish.name]? There will always be bigger fish..." + +/datum/mood_event/fish_petting + description = "It felt nice to pet the fish." + mood_change = 2 + timeout = 2 MINUTES + +/datum/mood_event/fish_petting/add_effects(obj/item/fish/fish, morbid) + if(!morbid) + description = "It felt nice to pet \the [fish]." + else + description = "I caress \the [fish] as [fish.p_they()] squirms under my touch, blissfully unaware of how cruel this world is." + /datum/mood_event/kobun description = "You are all loved by the Universe. I’m not alone, and you aren’t either." mood_change = 14 diff --git a/code/datums/mutations/body.dm b/code/datums/mutations/body.dm index e3165fea475..a3ecf3df709 100644 --- a/code/datums/mutations/body.dm +++ b/code/datums/mutations/body.dm @@ -497,7 +497,7 @@ if(prob(15)) owner.acid_act(rand(30, 50), 10) owner.visible_message(span_warning("[owner]'s skin bubbles and pops."), span_userdanger("Your bubbling flesh pops! It burns!")) - playsound(owner,'sound/weapons/sear.ogg', 50, TRUE) + playsound(owner,'sound/items/weapons/sear.ogg', 50, TRUE) /datum/mutation/human/spastic name = "Spastic" diff --git a/code/datums/mutations/fire_breath.dm b/code/datums/mutations/fire_breath.dm index 56915ff0130..d643bd98508 100644 --- a/code/datums/mutations/fire_breath.dm +++ b/code/datums/mutations/fire_breath.dm @@ -29,7 +29,7 @@ name = "Fire Breath" desc = "You breathe a cone of fire directly in front of you." button_icon_state = "fireball0" - sound = 'sound/magic/demon_dies.ogg' //horrifying lizard noises + sound = 'sound/effects/magic/demon_dies.ogg' //horrifying lizard noises school = SCHOOL_EVOCATION cooldown_time = 40 SECONDS diff --git a/code/datums/mutations/hulk.dm b/code/datums/mutations/hulk.dm index b4e13d888c9..cdd21d4586a 100644 --- a/code/datums/mutations/hulk.dm +++ b/code/datums/mutations/hulk.dm @@ -208,7 +208,7 @@ continue yeeted_person.adjustBruteLoss(step*0.5) - playsound(collateral_mob,'sound/weapons/punch1.ogg',50,TRUE) + playsound(collateral_mob,'sound/items/weapons/punch1.ogg',50,TRUE) log_combat(the_hulk, collateral_mob, "has smacked with tail swing victim") log_combat(the_hulk, yeeted_person, "has smacked this person into someone while tail swinging") // i have no idea how to better word this diff --git a/code/datums/mutations/sight.dm b/code/datums/mutations/sight.dm index 5a8d7458f3d..d3627167cb5 100644 --- a/code/datums/mutations/sight.dm +++ b/code/datums/mutations/sight.dm @@ -167,13 +167,13 @@ return to_chat(source, span_warning("You shoot with your laser eyes!")) source.changeNext_move(CLICK_CD_RANGE) - source.newtonian_move(get_dir(target, source)) + source.newtonian_move(get_angle(source, target)) var/obj/projectile/beam/laser/laser_eyes/LE = new(source.loc) LE.firer = source LE.def_zone = ran_zone(source.zone_selected) LE.preparePixelProjectile(target, source, modifiers) INVOKE_ASYNC(LE, TYPE_PROC_REF(/obj/projectile, fire)) - playsound(source, 'sound/weapons/taser2.ogg', 75, TRUE) + playsound(source, 'sound/items/weapons/taser2.ogg', 75, TRUE) ///Projectile type used by laser eyes /obj/projectile/beam/laser/laser_eyes diff --git a/code/datums/mutations/touch.dm b/code/datums/mutations/touch.dm index a7a6e9b6a24..7773e77a22f 100644 --- a/code/datums/mutations/touch.dm +++ b/code/datums/mutations/touch.dm @@ -28,7 +28,7 @@ name = "Shock Touch" desc = "Channel electricity to your hand to shock people with." button_icon_state = "zap" - sound = 'sound/weapons/zapbang.ogg' + sound = 'sound/items/weapons/zapbang.ogg' cooldown_time = 12 SECONDS invocation_type = INVOCATION_NONE spell_requirements = NONE @@ -117,7 +117,7 @@ desc = "You can now lay your hands on other people to transfer a small amount of their physical injuries to yourself." button_icon = 'icons/mob/actions/actions_genetic.dmi' button_icon_state = "mending_touch" - sound = 'sound/magic/staff_healing.ogg' + sound = 'sound/effects/magic/staff_healing.ogg' cooldown_time = 12 SECONDS school = SCHOOL_RESTORATION invocation_type = INVOCATION_NONE diff --git a/code/datums/position_point_vector.dm b/code/datums/position_point_vector.dm index c963d0ad760..b8b697c053b 100644 --- a/code/datums/position_point_vector.dm +++ b/code/datums/position_point_vector.dm @@ -91,9 +91,9 @@ /datum/point/proc/initialize_location(tile_x, tile_y, tile_z, p_x = 0, p_y = 0) if(!isnull(tile_x)) - x = ((tile_x - 1) * world.icon_size) + world.icon_size * 0.5 + p_x + 1 + x = ((tile_x - 1) * ICON_SIZE_X) + ICON_SIZE_X * 0.5 + p_x + 1 if(!isnull(tile_y)) - y = ((tile_y - 1) * world.icon_size) + world.icon_size * 0.5 + p_y + 1 + y = ((tile_y - 1) * ICON_SIZE_Y) + ICON_SIZE_Y * 0.5 + p_y + 1 if(!isnull(tile_z)) z = tile_z @@ -107,23 +107,23 @@ AM.pixel_y = return_py() /datum/point/proc/return_turf() - return locate(CEILING(x / world.icon_size, 1), CEILING(y / world.icon_size, 1), z) + return locate(CEILING(x / ICON_SIZE_X, 1), CEILING(y / ICON_SIZE_Y, 1), z) /datum/point/proc/return_coordinates() //[turf_x, turf_y, z] - return list(CEILING(x / world.icon_size, 1), CEILING(y / world.icon_size, 1), z) + return list(CEILING(x / ICON_SIZE_X, 1), CEILING(y / ICON_SIZE_Y, 1), z) /datum/point/proc/return_position() return new /datum/position(src) /datum/point/proc/return_px() - return MODULUS(x, world.icon_size) - 16 - 1 + return MODULUS(x, ICON_SIZE_X) - (ICON_SIZE_X/2) - 1 /datum/point/proc/return_py() - return MODULUS(y, world.icon_size) - 16 - 1 + return MODULUS(y, ICON_SIZE_Y) - (ICON_SIZE_Y/2) - 1 /datum/point/vector /// Pixels per iteration - var/speed = 32 + var/speed = ICON_SIZE_ALL var/iteration = 0 var/angle = 0 /// Calculated x movement amounts to prevent having to do trig every step. @@ -149,9 +149,9 @@ /// Same effect as initiliaze_location, but without setting the starting_x/y/z /datum/point/vector/proc/set_location(tile_x, tile_y, tile_z, p_x = 0, p_y = 0) if(!isnull(tile_x)) - x = ((tile_x - 1) * world.icon_size) + world.icon_size * 0.5 + p_x + 1 + x = ((tile_x - 1) * ICON_SIZE_X) + ICON_SIZE_X * 0.5 + p_x + 1 if(!isnull(tile_y)) - y = ((tile_y - 1) * world.icon_size) + world.icon_size * 0.5 + p_y + 1 + y = ((tile_y - 1) * ICON_SIZE_Y) + ICON_SIZE_Y * 0.5 + p_y + 1 if(!isnull(tile_z)) z = tile_z diff --git a/code/datums/progressbar.dm b/code/datums/progressbar.dm index b560a67aa6c..676cf455bfc 100644 --- a/code/datums/progressbar.dm +++ b/code/datums/progressbar.dm @@ -69,8 +69,8 @@ continue progress_bar.listindex-- - progress_bar.bar.pixel_y = world.icon_size + offset_y + (PROGRESSBAR_HEIGHT * (progress_bar.listindex - 1)) - var/dist_to_travel = world.icon_size + offset_y + (PROGRESSBAR_HEIGHT * (progress_bar.listindex - 1)) - PROGRESSBAR_HEIGHT + progress_bar.bar.pixel_y = ICON_SIZE_Y + offset_y + (PROGRESSBAR_HEIGHT * (progress_bar.listindex - 1)) + var/dist_to_travel = ICON_SIZE_Y + offset_y + (PROGRESSBAR_HEIGHT * (progress_bar.listindex - 1)) - PROGRESSBAR_HEIGHT animate(progress_bar.bar, pixel_y = dist_to_travel, time = PROGRESSBAR_ANIMATION_TIME, easing = SINE_EASING) LAZYREMOVEASSOC(user.progressbars, bar_loc, src) @@ -123,7 +123,7 @@ bar.pixel_y = 0 bar.alpha = 0 user_client.images += bar - animate(bar, pixel_y = world.icon_size + offset_y + (PROGRESSBAR_HEIGHT * (listindex - 1)), alpha = 255, time = PROGRESSBAR_ANIMATION_TIME, easing = SINE_EASING) + animate(bar, pixel_y = ICON_SIZE_Y + offset_y + (PROGRESSBAR_HEIGHT * (listindex - 1)), alpha = 255, time = PROGRESSBAR_ANIMATION_TIME, easing = SINE_EASING) ///Updates the progress bar image visually. diff --git a/code/datums/proximity_monitor/field.dm b/code/datums/proximity_monitor/field.dm index e3f0ade5e7d..3ba3017bed0 100644 --- a/code/datums/proximity_monitor/field.dm +++ b/code/datums/proximity_monitor/field.dm @@ -40,7 +40,7 @@ var/list/old_edge_turfs = edge_turfs field_turfs = new_turfs[FIELD_TURFS_KEY] edge_turfs = new_turfs[EDGE_TURFS_KEY] - if(!full_recalc) + if(full_recalc) field_turfs = list() edge_turfs = list() @@ -62,12 +62,11 @@ for(var/turf/new_turf as anything in field_turfs - old_field_turfs) if(QDELETED(src)) return - field_turfs += new_turf setup_field_turf(new_turf) + for(var/turf/new_turf as anything in edge_turfs - old_edge_turfs) if(QDELETED(src)) return - edge_turfs += new_turf setup_edge_turf(new_turf) /datum/proximity_monitor/advanced/on_initialized(turf/location, atom/created, init_flags) diff --git a/code/datums/proximity_monitor/fields/timestop.dm b/code/datums/proximity_monitor/fields/timestop.dm index 79996dee2dd..3b8001426a0 100644 --- a/code/datums/proximity_monitor/fields/timestop.dm +++ b/code/datums/proximity_monitor/fields/timestop.dm @@ -45,13 +45,13 @@ /obj/effect/timestop/Destroy() QDEL_NULL(chronofield) if(!hidden) - playsound(src, 'sound/magic/timeparadox2.ogg', 75, TRUE, frequency = -1) //reverse! + playsound(src, 'sound/effects/magic/timeparadox2.ogg', 75, TRUE, frequency = -1) //reverse! return ..() /obj/effect/timestop/proc/timestop() target = get_turf(src) if(!hidden) - playsound(src, 'sound/magic/timeparadox2.ogg', 75, TRUE, -1) + playsound(src, 'sound/effects/magic/timeparadox2.ogg', 75, TRUE, -1) chronofield = new (src, freezerange, TRUE, immune, antimagic_flags, channelled) if(!channelled) QDEL_IN(src, duration) diff --git a/code/datums/proximity_monitor/fields/void_storm.dm b/code/datums/proximity_monitor/fields/void_storm.dm new file mode 100644 index 00000000000..c9e3bbbbcff --- /dev/null +++ b/code/datums/proximity_monitor/fields/void_storm.dm @@ -0,0 +1,37 @@ +/*! + * Void storm for the void heretic ascension + * + * Follows the heretic around and acts like an aura with damaging effects for non-heretics + */ +/datum/proximity_monitor/advanced/void_storm + edge_is_a_field = TRUE + // lazylist that keeps track of the overlays added + var/list/turf_effects + var/static/image/storm_overlay = image('icons/effects/weather_effects.dmi', "snow_storm") + +/datum/proximity_monitor/advanced/void_storm/New(atom/_host, range, _ignore_if_not_on_turf) + . = ..() + recalculate_field(full_recalc = TRUE) + +/datum/proximity_monitor/advanced/void_storm/recalculate_field(full_recalc) + full_recalc = TRUE // We always perform a full recalc because we need to update ALL the sprites + return ..() + +/datum/proximity_monitor/advanced/void_storm/cleanup_field_turf(turf/target) + . = ..() + var/obj/effect/abstract/effect = LAZYACCESS(turf_effects, target) + LAZYREMOVE(turf_effects, target) + if(effect) + qdel(effect) + +/datum/proximity_monitor/advanced/void_storm/setup_field_turf(turf/target) + . = ..() + var/obj/effect/abstract/effect = new(target) // Makes the field visible to players. + effect.alpha = 255 - get_dist(target, host.loc) * 23 + effect.color = COLOR_BLACK + effect.icon = storm_overlay.icon + effect.icon_state = storm_overlay.icon_state + effect.mouse_opacity = MOUSE_OPACITY_TRANSPARENT + effect.layer = ABOVE_ALL_MOB_LAYER + SET_PLANE(effect, ABOVE_GAME_PLANE, target) + LAZYSET(turf_effects, target, effect) diff --git a/code/datums/quirks/negative_quirks/prosthetic_organ.dm b/code/datums/quirks/negative_quirks/prosthetic_organ.dm index cd7ca2a8014..4a377699b40 100644 --- a/code/datums/quirks/negative_quirks/prosthetic_organ.dm +++ b/code/datums/quirks/negative_quirks/prosthetic_organ.dm @@ -60,9 +60,9 @@ medical_record_text = "During physical examination, patient was found to have a low-budget prosthetic [slot_string]. \ Removal of these organs is known to be dangerous to the patient as well as the practitioner." old_organ = human_holder.get_organ_slot(organ_slot) - if(prosthetic.Insert(human_holder, special = TRUE)) - old_organ.moveToNullspace() - STOP_PROCESSING(SSobj, old_organ) + 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 weak and highly unstable. \ diff --git a/code/datums/quirks/neutral_quirks/monochromatic.dm b/code/datums/quirks/neutral_quirks/monochromatic.dm index dd66220cb56..ef6735df25d 100644 --- a/code/datums/quirks/neutral_quirks/monochromatic.dm +++ b/code/datums/quirks/neutral_quirks/monochromatic.dm @@ -17,7 +17,7 @@ /datum/quirk/monochromatic/post_add() if(is_detective_job(quirk_holder.mind.assigned_role)) to_chat(quirk_holder, span_boldannounce("Mmm. Nothing's ever clear on this station. It's all shades of gray...")) - quirk_holder.playsound_local(quirk_holder, 'sound/ambience/ambidet1.ogg', 50, FALSE) + quirk_holder.playsound_local(quirk_holder, 'sound/ambience/security/ambidet1.ogg', 50, FALSE) /datum/quirk/monochromatic/remove() quirk_holder.remove_client_colour(/datum/client_colour/monochrome) diff --git a/code/datums/quirks/neutral_quirks/vegetarian.dm b/code/datums/quirks/neutral_quirks/vegetarian.dm index 0ade72acafe..0568e2f1e22 100644 --- a/code/datums/quirks/neutral_quirks/vegetarian.dm +++ b/code/datums/quirks/neutral_quirks/vegetarian.dm @@ -7,17 +7,4 @@ lose_text = span_notice("You feel like eating meat isn't that bad.") medical_record_text = "Patient reports a vegetarian diet." mail_goodies = list(/obj/effect/spawner/random/food_or_drink/salad) - -/datum/quirk/vegetarian/add(client/client_source) - var/obj/item/organ/internal/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE) - if(!tongue) - return - tongue.liked_foodtypes &= ~MEAT - tongue.disliked_foodtypes |= MEAT - -/datum/quirk/vegetarian/remove() - var/obj/item/organ/internal/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE) - if(!tongue) - return - tongue.liked_foodtypes = initial(tongue.liked_foodtypes) - tongue.disliked_foodtypes = initial(tongue.disliked_foodtypes) + mob_trait = TRAIT_VEGETARIAN diff --git a/code/datums/quirks/positive_quirks/spacer.dm b/code/datums/quirks/positive_quirks/spacer.dm index 24f25c32e8a..e5b1f83c158 100644 --- a/code/datums/quirks/positive_quirks/spacer.dm +++ b/code/datums/quirks/positive_quirks/spacer.dm @@ -43,7 +43,7 @@ check_z(quirk_holder, skip_timers = TRUE) // drift slightly faster through zero G - quirk_holder.inertia_move_delay *= 0.8 + quirk_holder.inertia_move_multiplier *= 0.8 var/mob/living/carbon/human/human_quirker = quirk_holder human_quirker.set_mob_height(modded_height) @@ -73,7 +73,7 @@ if(QDELING(quirk_holder)) return - quirk_holder.inertia_move_delay /= 0.8 + quirk_holder.inertia_move_multiplier /= 0.8 quirk_holder.clear_mood_event("spacer") quirk_holder.remove_movespeed_modifier(/datum/movespeed_modifier/spacer) quirk_holder.remove_status_effect(/datum/status_effect/spacer) diff --git a/code/datums/records/manifest.dm b/code/datums/records/manifest.dm index 2d1e7628f6e..7ad27329813 100644 --- a/code/datums/records/manifest.dm +++ b/code/datums/records/manifest.dm @@ -31,7 +31,7 @@ GLOBAL_DATUM_INIT(manifest, /datum/manifest, new) var/name = target.name var/rank = target.rank // user-visible job var/trim = target.trim // internal jobs by trim type - var/datum/job/job = SSjob.GetJob(trim) + var/datum/job/job = SSjob.get_job(trim) if(!job || !(job.job_flags & JOB_CREW_MANIFEST) || !LAZYLEN(job.departments_list)) // In case an unlawful custom rank is added. var/list/misc_list = manifest_out[DEPARTMENT_UNASSIGNED] misc_list[++misc_list.len] = list( diff --git a/code/datums/ruins/icemoon.dm b/code/datums/ruins/icemoon.dm index b5c59b78ccc..7f5897e8b75 100644 --- a/code/datums/ruins/icemoon.dm +++ b/code/datums/ruins/icemoon.dm @@ -65,7 +65,7 @@ /datum/map_template/ruin/icemoon/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." + 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 @@ -199,6 +199,12 @@ description = "Radio signals are being detected and the source is this completely innocent pile of snow." suffix = "icemoon_underground_comms_agent.dmm" +/datum/map_template/ruin/icemoon/underground/syndie_lab + name = "Ice-Ruin Syndicate Lab" + id = "syndie_lab" + description = "A small laboratory and living space for Syndicate agents." + suffix = "icemoon_underground_syndielab.dmm" + //TODO: Bottom-Level ONLY Spawns after Refactoring Related Code /datum/map_template/ruin/icemoon/underground/plasma_facility name = "Ice-Ruin Abandoned Plasma Facility" diff --git a/code/datums/ruins/lavaland.dm b/code/datums/ruins/lavaland.dm index ff86e894c92..299cbf6cdf9 100644 --- a/code/datums/ruins/lavaland.dm +++ b/code/datums/ruins/lavaland.dm @@ -282,7 +282,7 @@ /datum/map_template/ruin/lavaland/lava_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." + description = "A venture by Nanotrasen to help popularize the use of holopads. This one somehow made its way here." suffix = "lavaland_surface_phonebooth.dmm" allow_duplicates = FALSE cost = 5 diff --git a/code/datums/ruins/space.dm b/code/datums/ruins/space.dm index 4bb4793eae2..e67eb0fbcd3 100644 --- a/code/datums/ruins/space.dm +++ b/code/datums/ruins/space.dm @@ -49,7 +49,7 @@ id = "asteroid6" suffix = "asteroid6.dmm" name = "Space-Ruin Asteroid 6" - description = "This asteroid has brittle bone disease, so it is fortunate asteroids dont have bones." + description = "This asteroid has brittle bone disease, so it is fortunate asteroids don't have bones." /datum/map_template/ruin/space/deep_storage id = "deep-storage" @@ -70,7 +70,7 @@ suffix = "derelict_construction.dmm" 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 \ + Space pirates who don't attempt to rob corporate research stations with only 3 collaborators live long enough to sell captured construction \ equipment back to the highest bidder." /datum/map_template/ruin/space/derelict_sulaco @@ -182,7 +182,7 @@ id = "spacehotel" suffix = "spacehotel_skyrat.dmm" // SKYRAT EDIT CHANGE - ORIGINAL: suffix = "spacehotel.dmm" 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." + description = "An interstellar hotel, where the weary spaceman can rest their head and relax, assured that the residential staff will not murder them in their sleep. Probably." /datum/map_template/ruin/space/turreted_outpost id = "turreted-outpost" @@ -481,7 +481,7 @@ BUBBERSTATION REMOVAL END */ id = "Space_phonebooth" suffix = "phonebooth.dmm" name = "Space-Ruin Phonebooth" - description = "A venture by nanotrasen to help popularize the use of holopads." + description = "A venture by Nanotrasen to help popularize the use of holopads." /datum/map_template/ruin/space/the_outlet id = "the_outlet" @@ -511,7 +511,7 @@ BUBBERSTATION REMOVAL END */ id = "garbagetruck3" suffix = "garbagetruck3.dmm" 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." + 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" diff --git a/code/datums/shuttles/_shuttle.dm b/code/datums/shuttles/_shuttle.dm index 0100a3d85da..94c20d41b73 100644 --- a/code/datums/shuttles/_shuttle.dm +++ b/code/datums/shuttles/_shuttle.dm @@ -14,7 +14,7 @@ var/description /// The recommended occupancy limit for the shuttle (count chairs, beds, and benches then round to 5) var/occupancy_limit - /// Description of the prerequisition that has to be achieved for the shuttle to be purchased + /// Description of the prerequisite that has to be achieved for the shuttle to be purchased var/prerequisites /// Shuttle warnings and hazards to the admin who spawns the shuttle var/admin_notes @@ -40,7 +40,7 @@ . = ..() /datum/map_template/shuttle/preload_size(path, cache) - . = ..(path, TRUE) // Done this way because we still want to know if someone actualy wanted to cache the map + . = ..(path, TRUE) // Done this way because we still want to know if someone actually wanted to cache the map if(!cached_map) return diff --git a/code/datums/shuttles/emergency.dm b/code/datums/shuttles/emergency.dm index 4c1dd016680..e36363fb8f8 100644 --- a/code/datums/shuttles/emergency.dm +++ b/code/datums/shuttles/emergency.dm @@ -31,13 +31,13 @@ mobile.event_list.Cut() if(use_all_events) for(var/path in events) - mobile.event_list.Add(new path(mobile)) + mobile.add_shuttle_event(path) events -= path else for(var/i in 1 to event_amount) var/path = pick_weight(events) events -= path - mobile.event_list.Add(new path(mobile)) + mobile.add_shuttle_event(path) /datum/map_template/shuttle/emergency/backup prefix = "_maps/shuttles/" @@ -91,7 +91,7 @@ suffix = "bar" name = "The Emergency Escape Bar" description = "Features include sentient bar staff (a Bardrone and a Barmaid), bathroom, a quality lounge for the heads, and a large gathering table." - admin_notes = "Bardrone and Barmaid are GODMODE, will be automatically sentienced by the fun balloon at 60 seconds before arrival. \ + admin_notes = "Bardrone and Barmaid have TRAIT_GODMODE (basically invincibility), will be automatically sentienced by the fun balloon at 60 seconds before arrival. \ Has medical facilities." credit_cost = CARGO_CRATE_VALUE * 10 occupancy_limit = "30" @@ -166,7 +166,7 @@ /datum/map_template/shuttle/emergency/arena suffix = "arena" name = "The Arena" - description = "The crew must pass through an otherworldy arena to board this shuttle. Expect massive casualties." + description = "The crew must pass through an otherworldly arena to board this shuttle. Expect massive casualties." prerequisites = "The source of the Bloody Signal must be tracked down and eliminated to unlock this shuttle." admin_notes = "RIP AND TEAR." credit_cost = CARGO_CRATE_VALUE * 20 @@ -243,7 +243,7 @@ suffix = "kilo" name = "Kilo Station Emergency Shuttle" credit_cost = CARGO_CRATE_VALUE * 10 - description = "A fully functional shuttle including a complete infirmary, storage facilties and regular amenities." + description = "A fully functional shuttle including a complete infirmary, storage facilities and regular amenities." occupancy_limit = "55" /datum/map_template/shuttle/emergency/mini @@ -402,15 +402,15 @@ /datum/map_template/shuttle/emergency/monkey suffix = "nature" name = "Dynamic Environmental Interaction Shuttle" - description = "A large shuttle with a center biodome that is flourishing with life. Frolick with the monkeys! (Extra monkeys are stored on the bridge.)" - admin_notes = "Pretty freakin' large, almost as big as Raven or Cere. Excercise caution with it." + description = "A large shuttle with a center biodome that is flourishing with life. Frolic with the monkeys! (Extra monkeys are stored on the bridge.)" + admin_notes = "Pretty freakin' large, almost as big as Raven or Cere. Exercise caution with it." credit_cost = CARGO_CRATE_VALUE * 16 occupancy_limit = "45" /datum/map_template/shuttle/emergency/casino suffix = "casino" name = "Lucky Jackpot Casino Shuttle" - description = "A luxurious casino packed to the brim with everything you need to start new gambling addicitions!" + description = "A luxurious casino packed to the brim with everything you need to start new gambling addictions!" admin_notes = "The ship is a bit chunky, so watch where you park it." credit_cost = 7777 occupancy_limit = "85" @@ -426,7 +426,7 @@ /datum/map_template/shuttle/emergency/fish suffix = "fish" name = "Angler's Choice Emergency Shuttle" - description = "Trades such amenities as 'storage space' and 'sufficient seating' for an artifical environment ideal for fishing, plus ample supplies (also for fishing)." + description = "Trades such amenities as 'storage space' and 'sufficient seating' for an artificial environment ideal for fishing, plus ample supplies (also for fishing)." admin_notes = "There's a chasm in it, it has railings but that won't stop determined players." credit_cost = CARGO_CRATE_VALUE * 10 occupancy_limit = "35" diff --git a/code/datums/station_traits/_station_trait.dm b/code/datums/station_traits/_station_trait.dm index bae9540fa25..e4d21caf063 100644 --- a/code/datums/station_traits/_station_trait.dm +++ b/code/datums/station_traits/_station_trait.dm @@ -33,10 +33,10 @@ GLOBAL_LIST_EMPTY(lobby_station_traits) var/list/lobby_buttons = list() /// The ID that we look for in dynamic.json. Not synced with 'name' because I can already see this go wrong var/dynamic_threat_id - /// If ran during dynamic, do we reduce the total threat? Will be overriden by config if set + /// If ran during dynamic, do we reduce the total threat? Will be overridden by config if set var/threat_reduction = 0 - /// Which ruleset flags to allow dynamic to use. null to disregard - var/dynamic_category = null + /// Which ruleset flags to allow dynamic to use. NONE to disregard + var/dynamic_category = NONE /// Trait should not be instantiated in a round if its type matches this type var/abstract_type = /datum/station_trait @@ -51,15 +51,19 @@ GLOBAL_LIST_EMPTY(lobby_station_traits) GLOB.dynamic_ruleset_categories = dynamic_category if(sign_up_button) GLOB.lobby_station_traits += src + if(SSstation.initialized) + SSstation.display_lobby_traits() if(trait_processes) START_PROCESSING(SSstation, src) if(trait_to_give) ADD_TRAIT(SSstation, trait_to_give, STATION_TRAIT) /datum/station_trait/Destroy() - SSstation.station_traits -= src - GLOB.dynamic_station_traits.Remove(src) destroy_lobby_buttons() + SSstation.station_traits -= src + GLOB.lobby_station_traits -= src + GLOB.dynamic_station_traits -= src + REMOVE_TRAIT(SSstation, trait_to_give, STATION_TRAIT) return ..() /// Returns the type of info the centcom report has on this trait, if any. @@ -127,13 +131,15 @@ GLOBAL_LIST_EMPTY(lobby_station_traits) /// Remove all of our active lobby buttons /datum/station_trait/proc/destroy_lobby_buttons() for (var/atom/movable/screen/button as anything in lobby_buttons) - var/mob/hud_owner = button.get_mob() - qdel(button) + var/mob/dead/new_player/hud_owner = button.get_mob() if (QDELETED(hud_owner)) + qdel(button) continue - var/datum/hud/using_hud = hud_owner.hud_used - using_hud?.show_hud(using_hud?.hud_version) - lobby_buttons = list() + var/datum/hud/new_player/using_hud = hud_owner.hud_used + if(!using_hud) + qdel(button) + continue + using_hud.remove_station_trait_button(src) /// Called when overriding a pulsar star command report message. /datum/station_trait/proc/get_pulsar_message() diff --git a/code/datums/station_traits/job_traits.dm b/code/datums/station_traits/job_traits.dm index 4ac95ced846..91d96869055 100644 --- a/code/datums/station_traits/job_traits.dm +++ b/code/datums/station_traits/job_traits.dm @@ -41,6 +41,10 @@ else LAZYADD(lobby_candidates, user) +/datum/station_trait/job/on_lobby_button_destroyed(atom/movable/screen/lobby/button/sign_up/lobby_button) + . = ..() + LAZYREMOVE(lobby_candidates, lobby_button.get_mob()) + /datum/station_trait/job/on_lobby_button_update_icon(atom/movable/screen/lobby/button/sign_up/lobby_button, updates) if (LAZYFIND(lobby_candidates, lobby_button.get_mob())) lobby_button.base_icon_state = "signup_on" @@ -61,7 +65,7 @@ if (isnull(signee) || !signee.client || !signee.mind || signee.ready != PLAYER_READY_TO_PLAY) LAZYREMOVE(lobby_candidates, signee) - var/datum/job/our_job = SSjob.GetJobType(job_to_add) + var/datum/job/our_job = SSjob.get_job_type(job_to_add) our_job.total_positions = position_amount our_job.spawn_positions = position_amount while(length(lobby_candidates) && position_amount > 0) @@ -73,14 +77,14 @@ lobby_candidates = null /datum/station_trait/job/can_display_lobby_button(client/player) - var/datum/job/our_job = SSjob.GetJobType(job_to_add) + var/datum/job/our_job = SSjob.get_job_type(job_to_add) return our_job.player_old_enough(player) && ..() /// Adds a gorilla to the cargo department, replacing the sloth and the mech /datum/station_trait/job/cargorilla name = "Cargo Gorilla" button_desc = "Sign up to become the Cargo Gorilla, a peaceful shepherd of boxes." - weight = 1 + weight = 0 show_in_report = FALSE // Selective attention test. Did you spot the gorilla? can_roll_antag = CAN_ROLL_NEVER job_to_add = /datum/job/cargo_gorilla @@ -248,6 +252,27 @@ qdel(thing_on_table) new /obj/machinery/fax/auto_name(picked_turf) +/datum/station_trait/job/pun_pun + name = "Pun Pun is a Crewmember" + button_desc = "Ook ook ah ah, sign up to play as the bartender's monkey." + weight = 0 //Unrollable by default, available all day during monkey day. + report_message = "We've evaluated the bartender's monkey to have the mental capacity of the average crewmember. As such, we made them one." + show_in_report = TRUE + can_roll_antag = CAN_ROLL_ALWAYS + job_to_add = /datum/job/pun_pun + +/datum/station_trait/job/pun_pun/New() + . = ..() + //Make sure we don't have two Pun Puns if loaded before the start of the round. + if(SSticker.HasRoundStarted() || !GLOB.the_one_and_only_punpun) + return + new /obj/effect/landmark/start/pun_pun(GLOB.the_one_and_only_punpun.loc) + qdel(GLOB.the_one_and_only_punpun) + +/datum/station_trait/job/pun_pun/on_lobby_button_update_overlays(atom/movable/screen/lobby/button/sign_up/lobby_button, list/overlays) + . = ..() + overlays += LAZYFIND(lobby_candidates, lobby_button.get_mob()) ? "pun_pun_on" : "pun_pun_off" + #undef CAN_ROLL_ALWAYS #undef CAN_ROLL_PROTECTED #undef CAN_ROLL_NEVER diff --git a/code/datums/station_traits/negative_traits.dm b/code/datums/station_traits/negative_traits.dm index 3b1f3b0822b..b7d5b536941 100644 --- a/code/datums/station_traits/negative_traits.dm +++ b/code/datums/station_traits/negative_traits.dm @@ -713,7 +713,7 @@ Every shielding unit will provide an additional [shielder_time] of protection, fully protecting the station with [max_shielders] shielding units. "} - priority_announce(announcement, sound = 'sound/misc/notice1.ogg') + priority_announce(announcement, sound = 'sound/announcer/notice/notice1.ogg') //Set the display screens to the radiation alert var/datum/radio_frequency/frequency = SSradio.return_frequency(FREQ_STATUS_DISPLAYS) diff --git a/code/datums/station_traits/positive_traits.dm b/code/datums/station_traits/positive_traits.dm index dfa4fc2ce9c..43b17377c2e 100644 --- a/code/datums/station_traits/positive_traits.dm +++ b/code/datums/station_traits/positive_traits.dm @@ -285,6 +285,7 @@ /datum/job/paramedic = /obj/item/organ/internal/cyberimp/eyes/hud/medical, /datum/job/prisoner = /obj/item/organ/internal/eyes/robotic/shield, /datum/job/psychologist = /obj/item/organ/internal/ears/cybernetic/whisper, + /datum/job/pun_pun = /obj/item/organ/internal/cyberimp/arm/strongarm, /datum/job/quartermaster = /obj/item/organ/internal/stomach/cybernetic/tier3, /datum/job/research_director = /obj/item/organ/internal/cyberimp/bci, /datum/job/roboticist = /obj/item/organ/internal/cyberimp/eyes/hud/diagnostic, diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm index 522bae96ebc..a2d61dedaeb 100644 --- a/code/datums/status_effects/buffs.dm +++ b/code/datums/status_effects/buffs.dm @@ -427,7 +427,7 @@ /datum/status_effect/mayhem/on_apply() . = ..() to_chat(owner, "RIP AND TEAR") - SEND_SOUND(owner, sound('sound/hallucinations/veryfar_noise.ogg')) + SEND_SOUND(owner, sound('sound/effects/hallucinations/veryfar_noise.ogg')) owner.cause_hallucination( \ /datum/hallucination/delusion/preset/demon, \ "[id] status effect", \ @@ -573,7 +573,7 @@ owner.add_stun_absorption(source = id, priority = 4) owner.add_movespeed_mod_immunities(id, /datum/movespeed_modifier/damage_slowdown) ADD_TRAIT(owner, TRAIT_FREE_HYPERSPACE_MOVEMENT, id) - owner.playsound_local(get_turf(owner), 'sound/chemistry/ahaha.ogg', vol = 100, vary = TRUE, use_reverb = TRUE) + owner.playsound_local(get_turf(owner), 'sound/effects/chemistry/ahaha.ogg', vol = 100, vary = TRUE, use_reverb = TRUE) return TRUE /datum/status_effect/blessing_of_insanity/on_remove() diff --git a/code/datums/status_effects/debuffs/choke.dm b/code/datums/status_effects/debuffs/choke.dm index c16b946aa02..9113c8a1a02 100644 --- a/code/datums/status_effects/debuffs/choke.dm +++ b/code/datums/status_effects/debuffs/choke.dm @@ -217,7 +217,7 @@ var/obj/item/bodypart/chest = carbon_victim.get_bodypart(BODY_ZONE_CHEST) carbon_victim.cause_wound_of_type_and_severity(WOUND_BLUNT, chest, WOUND_SEVERITY_SEVERE, wound_source = "human force to the chest") - playsound(owner, 'sound/creatures/crack_vomit.ogg', 120, extrarange = 5, falloff_exponent = 4) + playsound(owner, 'sound/mobs/humanoids/human/gag_vomit/crack_vomit.ogg', 120, extrarange = 5, falloff_exponent = 4) vomit_up() /datum/status_effect/choke/proc/mirror_dir(atom/source, old_dir, new_dir) diff --git a/code/datums/status_effects/debuffs/debuffs.dm b/code/datums/status_effects/debuffs/debuffs.dm index 7f451efd90c..fec013267c5 100644 --- a/code/datums/status_effects/debuffs/debuffs.dm +++ b/code/datums/status_effects/debuffs/debuffs.dm @@ -497,7 +497,7 @@ wasting_effect.transform = owner.transform //if the owner has been stunned the overlay should inherit that position wasting_effect.alpha = 255 animate(wasting_effect, alpha = 0, time = 32) - playsound(owner, 'sound/effects/curse5.ogg', 20, TRUE, -1) + playsound(owner, 'sound/effects/curse/curse5.ogg', 20, TRUE, -1) owner.adjustFireLoss(0.75) if(effect_last_activation <= world.time) effect_last_activation = world.time + effect_cooldown @@ -520,7 +520,7 @@ /datum/status_effect/necropolis_curse/proc/grasp(turf/spawn_turf) set waitfor = FALSE new/obj/effect/temp_visual/dir_setting/curse/grasp_portal(spawn_turf, owner.dir) - playsound(spawn_turf, 'sound/effects/curse2.ogg', 80, TRUE, -1) + playsound(spawn_turf, 'sound/effects/curse/curse2.ogg', 80, TRUE, -1) var/obj/projectile/curse_hand/C = new (spawn_turf) C.preparePixelProjectile(owner, spawn_turf) C.fire() diff --git a/code/datums/status_effects/debuffs/fire_stacks.dm b/code/datums/status_effects/debuffs/fire_stacks.dm index 46c31c4578d..ae7f73d4e0d 100644 --- a/code/datums/status_effects/debuffs/fire_stacks.dm +++ b/code/datums/status_effects/debuffs/fire_stacks.dm @@ -136,6 +136,12 @@ /// Type of mob light emitter we use when on fire var/moblight_type = /obj/effect/dummy/lighting_obj/moblight/fire +/datum/status_effect/fire_handler/fire_stacks/get_examine_text() + if(owner.on_fire) + return + + return "[owner.p_They()] [owner.p_are()] covered in something flammable." + /datum/status_effect/fire_handler/fire_stacks/proc/owner_touched_sparks() SIGNAL_HANDLER @@ -221,8 +227,9 @@ amount_to_heat = amount_to_heat ** (BODYTEMP_FIRE_TEMP_SOFTCAP / owner.bodytemperature) victim.adjust_bodytemperature(amount_to_heat) - victim.add_mood_event("on_fire", /datum/mood_event/on_fire) - victim.add_mob_memory(/datum/memory/was_burning) + if (!(HAS_TRAIT(victim, TRAIT_RESISTHEAT))) + victim.add_mood_event("on_fire", /datum/mood_event/on_fire) + victim.add_mob_memory(/datum/memory/was_burning) /** * Handles mob ignition, should be the only way to set on_fire to TRUE @@ -294,6 +301,9 @@ enemy_types = list(/datum/status_effect/fire_handler/fire_stacks) stack_modifier = -1 +/datum/status_effect/fire_handler/wet_stacks/get_examine_text() + return "[owner.p_They()] look[owner.p_s()] a little soaked." + /datum/status_effect/fire_handler/wet_stacks/tick(seconds_between_ticks) adjust_stacks(-0.5 * seconds_between_ticks) if(stacks <= 0) diff --git a/code/datums/status_effects/debuffs/genetic_damage.dm b/code/datums/status_effects/debuffs/genetic_damage.dm index 9a694409077..21b6f1db218 100644 --- a/code/datums/status_effects/debuffs/genetic_damage.dm +++ b/code/datums/status_effects/debuffs/genetic_damage.dm @@ -34,7 +34,7 @@ /datum/status_effect/genetic_damage/tick(seconds_between_ticks) if(ismonkey(owner) && total_damage >= GORILLA_MUTATION_MINIMUM_DAMAGE && SPT_PROB(GORILLA_MUTATION_CHANCE_PER_SECOND, seconds_between_ticks)) var/mob/living/carbon/carbon_owner = owner - carbon_owner.gorillize() + carbon_owner.gorillize(genetics_gorilla = TRUE) qdel(src) return @@ -46,15 +46,20 @@ qdel(src) return -/datum/status_effect/genetic_damage/proc/on_healthscan(datum/source, list/render_list, advanced) +/datum/status_effect/genetic_damage/proc/on_healthscan(datum/source, list/render_list, advanced, mob/user, mode, tochat) SIGNAL_HANDLER + var/message = "" if(advanced) - render_list += "Genetic damage: [round(total_damage / minimum_before_tox_damage * 100, 0.1)]%\n" + message = "Genetic damage: [round(total_damage / minimum_before_tox_damage * 100, 0.1)]%" else if(total_damage >= minimum_before_tox_damage) - render_list += "Severe genetic damage detected.\n" + message = "Severe genetic damage detected." else - render_list += "Minor genetic damage detected.\n" + message = "Minor genetic damage detected." + + if(message) + render_list += conditional_tooltip("[message]", "Irreparable under normal circumstances - will decay over time.", tochat) + render_list += "
" #undef GORILLA_MUTATION_CHANCE_PER_SECOND #undef GORILLA_MUTATION_MINIMUM_DAMAGE diff --git a/code/datums/status_effects/debuffs/hallucination.dm b/code/datums/status_effects/debuffs/hallucination.dm index 5d67acc789e..0d8875c6b23 100644 --- a/code/datums/status_effects/debuffs/hallucination.dm +++ b/code/datums/status_effects/debuffs/hallucination.dm @@ -38,13 +38,13 @@ )) /// Signal proc for [COMSIG_LIVING_HEALTHSCAN]. Show we're hallucinating to (advanced) scanners. -/datum/status_effect/hallucination/proc/on_health_scan(datum/source, list/render_list, advanced, mob/user, mode) +/datum/status_effect/hallucination/proc/on_health_scan(datum/source, list/render_list, advanced, mob/user, mode, tochat) SIGNAL_HANDLER if(!advanced) return - - render_list += "Subject is hallucinating.\n" + render_list += conditional_tooltip("Subject is hallucinating.", "Supply antipsychotic medication.", tochat) + render_list += "
" /// Signal proc for [COMSIG_CARBON_CHECKING_BODYPART], /// checking bodyparts while hallucinating can cause them to appear more damaged than they are diff --git a/code/datums/status_effects/debuffs/slime/slime_food.dm b/code/datums/status_effects/debuffs/slime/slime_food.dm index aa711bb878f..538e62e27c5 100644 --- a/code/datums/status_effects/debuffs/slime/slime_food.dm +++ b/code/datums/status_effects/debuffs/slime/slime_food.dm @@ -54,12 +54,3 @@ /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/slimed.dm b/code/datums/status_effects/debuffs/slime/slimed.dm index 6c2c0fb5be3..2540c4df513 100644 --- a/code/datums/status_effects/debuffs/slime/slimed.dm +++ b/code/datums/status_effects/debuffs/slime/slimed.dm @@ -101,17 +101,6 @@ )) to_chat(owner, span_userdanger("[feedback_text] as the layer of slime eats away at you!")) -/datum/status_effect/slimed/update_particles() - if(particle_effect) - return - - // taste the rainbow - var/particle_type = rainbow ? /particles/slime/rainbow : /particles/slime - particle_effect = new(owner, particle_type) - - if(!rainbow) - particle_effect.particles.color = "[slime_color]a0" - /datum/status_effect/slimed/get_examine_text() return span_warning("[owner.p_They()] [owner.p_are()] covered in bubbling slime!") diff --git a/code/datums/status_effects/debuffs/staggered.dm b/code/datums/status_effects/debuffs/staggered.dm index 1291da1307a..88dd91c00e0 100644 --- a/code/datums/status_effects/debuffs/staggered.dm +++ b/code/datums/status_effects/debuffs/staggered.dm @@ -24,8 +24,6 @@ /datum/status_effect/staggered/on_remove() UnregisterSignal(owner, COMSIG_LIVING_DEATH) owner.remove_movespeed_modifier(/datum/movespeed_modifier/staggered) - // Resetting both X on remove so we're back to normal - animate(owner, pixel_x = owner.base_pixel_x, time = 0.2 SECONDS, flags = ANIMATION_PARALLEL) /// Signal proc that self deletes our staggered effect /datum/status_effect/staggered/proc/clear_staggered(datum/source) @@ -45,11 +43,12 @@ /// Helper proc that causes the mob to do a stagger animation. /// Doesn't change significantly, just meant to represent swaying back and forth /mob/living/proc/do_stagger_animation() - animate(src, pixel_x = 4, time = 0.2 SECONDS, flags = ANIMATION_RELATIVE|ANIMATION_PARALLEL) - sleep(0.2 SECONDS) - animate(src, pixel_x = -8, time = 0.2 SECONDS, flags = ANIMATION_RELATIVE|ANIMATION_PARALLEL) - sleep(0.2 SECONDS) - animate(src, pixel_x = 4, time = 0.2 SECONDS, flags = ANIMATION_RELATIVE|ANIMATION_PARALLEL) + var/normal_pos = base_pixel_x + body_position_pixel_x_offset + var/jitter_right = normal_pos + 4 + var/jitter_left = normal_pos - 4 + animate(src, pixel_x = jitter_left, 0.2 SECONDS, flags = ANIMATION_PARALLEL) + animate(pixel_x = jitter_right, time = 0.4 SECONDS) + animate(pixel_x = normal_pos, time = 0.2 SECONDS) /// Status effect specifically for instances where someone is vulnerable to being stunned when shoved. /datum/status_effect/next_shove_stuns diff --git a/code/datums/status_effects/debuffs/terrified.dm b/code/datums/status_effects/debuffs/terrified.dm index 6ed79372d01..61a6ecd4eda 100644 --- a/code/datums/status_effects/debuffs/terrified.dm +++ b/code/datums/status_effects/debuffs/terrified.dm @@ -55,7 +55,7 @@ owner.adjust_jitter_up_to(10 SECONDS * seconds_between_ticks, 10 SECONDS) if(terror_buildup >= TERROR_PANIC_THRESHOLD) //If you reach this amount of buildup in an engagement, it's time to start looking for a way out. - owner.playsound_local(get_turf(owner), 'sound/health/slowbeat.ogg', 40, 0, channel = CHANNEL_HEARTBEAT, use_reverb = FALSE) + owner.playsound_local(get_turf(owner), 'sound/effects/health/slowbeat.ogg', 40, 0, channel = CHANNEL_HEARTBEAT, use_reverb = FALSE) owner.add_fov_trait(id, FOV_270_DEGREES) //Terror induced tunnel vision owner.adjust_eye_blur_up_to(10 SECONDS * seconds_between_ticks, 10 SECONDS) if(prob(5)) //We have a little panic attack. Consider it GENTLE ENCOURAGEMENT to start running away. diff --git a/code/datums/status_effects/debuffs/tower_of_babel.dm b/code/datums/status_effects/debuffs/tower_of_babel.dm index b3c1ae0c477..a56ea1ac6d9 100644 --- a/code/datums/status_effects/debuffs/tower_of_babel.dm +++ b/code/datums/status_effects/debuffs/tower_of_babel.dm @@ -41,7 +41,7 @@ return owner.emote("mumble") - owner.playsound_local(get_turf(owner), 'sound/magic/magic_block_mind.ogg', 75, vary = TRUE) // sound of creepy whispers + owner.playsound_local(get_turf(owner), 'sound/effects/magic/magic_block_mind.ogg', 75, vary = TRUE) // sound of creepy whispers to_chat(owner, span_reallybig(span_hypnophrase("You feel a magical force affecting your speech patterns!"))) /datum/status_effect/tower_of_babel/magical/on_remove() diff --git a/code/datums/status_effects/neutral.dm b/code/datums/status_effects/neutral.dm index 3d4bd7e9365..6fd10943b7e 100644 --- a/code/datums/status_effects/neutral.dm +++ b/code/datums/status_effects/neutral.dm @@ -119,7 +119,7 @@ /datum/status_effect/bounty/on_apply() to_chat(owner, span_boldnotice("You hear something behind you talking... \"You have been marked for death by [rewarded]. If you die, they will be rewarded.\"")) - playsound(owner, 'sound/weapons/gun/shotgun/rack.ogg', 75, FALSE) + playsound(owner, 'sound/items/weapons/gun/shotgun/rack.ogg', 75, FALSE) return ..() /datum/status_effect/bounty/tick(seconds_between_ticks) @@ -130,7 +130,7 @@ /datum/status_effect/bounty/proc/rewards() if(rewarded && rewarded.mind && rewarded.stat != DEAD) to_chat(owner, span_boldnotice("You hear something behind you talking... \"Bounty claimed.\"")) - playsound(owner, 'sound/weapons/gun/shotgun/shot.ogg', 75, FALSE) + playsound(owner, 'sound/items/weapons/gun/shotgun/shot.ogg', 75, FALSE) to_chat(rewarded, span_greentext("You feel a surge of mana flow into you!")) for(var/datum/action/cooldown/spell/spell in rewarded.actions) spell.reset_spell_cooldown() diff --git a/code/datums/status_effects/song_effects.dm b/code/datums/status_effects/song_effects.dm index f61253c987d..d846f47f169 100644 --- a/code/datums/status_effects/song_effects.dm +++ b/code/datums/status_effects/song_effects.dm @@ -25,7 +25,7 @@ /datum/status_effect/song/antimagic/on_apply() ADD_TRAIT(owner, TRAIT_ANTIMAGIC, MAGIC_TRAIT) - playsound(owner, 'sound/weapons/fwoosh.ogg', 75, FALSE) + playsound(owner, 'sound/items/weapons/fwoosh.ogg', 75, FALSE) return ..() /datum/status_effect/song/antimagic/on_remove() @@ -45,7 +45,7 @@ /datum/status_effect/song/light/on_apply() mob_light_obj = owner.mob_light(3, 1.5, color = LIGHT_COLOR_DIM_YELLOW) - playsound(owner, 'sound/weapons/fwoosh.ogg', 75, FALSE) + playsound(owner, 'sound/items/weapons/fwoosh.ogg', 75, FALSE) return TRUE /datum/status_effect/song/light/on_remove() diff --git a/code/datums/status_effects/stacking_effect.dm b/code/datums/status_effects/stacking_effect.dm index b54734155ad..b0d00a92ba0 100644 --- a/code/datums/status_effects/stacking_effect.dm +++ b/code/datums/status_effects/stacking_effect.dm @@ -123,9 +123,9 @@ var/icon_height = I.Height() status_overlay.pixel_x = -owner.pixel_x status_overlay.pixel_y = FLOOR(icon_height * 0.25, 1) - status_overlay.transform = matrix() * (icon_height/world.icon_size) //scale the status's overlay size based on the target's icon size + status_overlay.transform = matrix() * (icon_height/ICON_SIZE_Y) //scale the status's overlay size based on the target's icon size status_underlay.pixel_x = -owner.pixel_x - status_underlay.transform = matrix() * (icon_height/world.icon_size) * 3 + status_underlay.transform = matrix() * (icon_height/ICON_SIZE_Y) * 3 status_underlay.alpha = 40 owner.add_overlay(status_overlay) owner.underlays += status_underlay diff --git a/code/datums/storage/storage.dm b/code/datums/storage/storage.dm index b785c0a38be..feda199d670 100644 --- a/code/datums/storage/storage.dm +++ b/code/datums/storage/storage.dm @@ -189,20 +189,19 @@ /// Set the passed atom as the parent /datum/storage/proc/set_parent(atom/new_parent) - PRIVATE_PROC(TRUE) + PROTECTED_PROC(TRUE) ASSERT(isnull(parent)) parent = new_parent + ADD_TRAIT(parent, TRAIT_COMBAT_MODE_SKIP_INTERACTION, REF(src)) // a few of theses should probably be on the real_location rather than the parent - RegisterSignal(parent, COMSIG_ATOM_ITEM_INTERACTION, PROC_REF(on_item_interact)) RegisterSignals(parent, list(COMSIG_ATOM_ATTACK_PAW, COMSIG_ATOM_ATTACK_HAND), PROC_REF(on_attack)) RegisterSignal(parent, COMSIG_MOUSEDROP_ONTO, PROC_REF(on_mousedrop_onto)) RegisterSignal(parent, COMSIG_MOUSEDROPPED_ONTO, PROC_REF(on_mousedropped_onto)) RegisterSignal(parent, COMSIG_ITEM_PRE_ATTACK, PROC_REF(on_preattack)) RegisterSignal(parent, COMSIG_ITEM_ATTACK_SELF, PROC_REF(mass_empty)) RegisterSignals(parent, list(COMSIG_ATOM_ATTACK_GHOST, COMSIG_ATOM_ATTACK_HAND_SECONDARY), PROC_REF(open_storage_on_signal)) - RegisterSignal(parent, COMSIG_ATOM_ITEM_INTERACTION_SECONDARY, PROC_REF(on_item_interact_secondary)) RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(close_distance)) RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(update_actions)) RegisterSignal(parent, COMSIG_TOPIC, PROC_REF(topic_handle)) @@ -827,26 +826,12 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) return if(!iscarbon(user) && !isdrone(user)) return - var/mob/living/user_living = user - if(user_living.incapacitated) - return - attempt_insert(dropping, user) return COMPONENT_CANCEL_MOUSEDROPPED_ONTO -/// Signal handler for whenever we're attacked by an object. -/datum/storage/proc/on_item_interact(datum/source, mob/user, obj/item/thing, params) - SIGNAL_HANDLER - - if(!insert_on_attack) - return NONE - if(!thing.storage_insert_on_interaction(src, parent, user)) - return NONE - if(!parent.storage_insert_on_interacted_with(src, thing, user)) - return NONE - if(SEND_SIGNAL(parent, COMSIG_ATOM_STORAGE_ITEM_INTERACT_INSERT, thing, user) & BLOCK_STORAGE_INSERT) - return NONE - +/// Called directly from the attack chain if [insert_on_attack] is TRUE. +/// Handles inserting an item into the storage when clicked. +/datum/storage/proc/item_interact_insert(mob/living/user, obj/item/thing) if(iscyborg(user)) return ITEM_INTERACT_BLOCKING @@ -897,18 +882,6 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) return toreturn -/// Signal handler for when we get attacked with secondary click by an item. -/datum/storage/proc/on_item_interact_secondary(datum/source, mob/user, atom/weapon) - SIGNAL_HANDLER - - if(istype(weapon, /obj/item/chameleon)) - var/obj/item/chameleon/chameleon_weapon = weapon - chameleon_weapon.make_copy(source, user) - - if(open_storage_on_signal(source, user)) - return ITEM_INTERACT_BLOCKING - return NONE - /// Signal handler to open up the storage when we receive a signal. /datum/storage/proc/open_storage_on_signal(datum/source, mob/to_show) SIGNAL_HANDLER diff --git a/code/datums/view.dm b/code/datums/view.dm index 90d07c66796..702550a4e18 100644 --- a/code/datums/view.dm +++ b/code/datums/view.dm @@ -134,7 +134,7 @@ _y = -offset if(WEST) _x = -offset - animate(chief, pixel_x = world.icon_size*_x, pixel_y = world.icon_size*_y, 0, FALSE, LINEAR_EASING, ANIMATION_END_NOW) + animate(chief, pixel_x = ICON_SIZE_X*_x, pixel_y = ICON_SIZE_Y*_y, 0, FALSE, LINEAR_EASING, ANIMATION_END_NOW) //Ready for this one? setTo(radius) diff --git a/code/datums/votes/map_vote.dm b/code/datums/votes/map_vote.dm index e0ff761ed3a..b4f938a42e4 100644 --- a/code/datums/votes/map_vote.dm +++ b/code/datums/votes/map_vote.dm @@ -2,45 +2,18 @@ name = "Map" default_message = "Vote for next round's map!" count_method = VOTE_COUNT_METHOD_SINGLE - winner_method = VOTE_WINNER_METHOD_WEIGHTED_RANDOM + winner_method = VOTE_WINNER_METHOD_NONE display_statistics = FALSE /datum/vote/map_vote/New() . = ..() - - default_choices = list() - - // Fill in our default choices with all of the maps in our map config, if they are votable and not blocked. - var/list/maps = shuffle(global.config.maplist) - for(var/map in maps) - var/datum/map_config/possible_config = config.maplist[map] - if(!possible_config.votable || (possible_config.map_name in SSpersistence.blocked_maps) || possible_config.map_name == SSmapping.config?.map_name) // SKYRAT EDIT - Can't vote for the current map - continue - - default_choices += possible_config.map_name + default_choices = SSmap_vote.get_valid_map_vote_choices() /datum/vote/map_vote/create_vote() . = ..() if(!.) return FALSE - choices -= get_choices_invalid_for_population() - - //BUBBERSTATION EDIT START, CHOICE SAFETY STUFF. - //This basically just re-does map selection, but ignores persistent blocked maps and the currently voted map. - //Prevents situations where there are no maps to vote. - if(length(choices) <= 3) - var/list/maps = shuffle(global.config.maplist) - for(var/map in maps) - var/datum/map_config/possible_config = config.maplist[map] - if(!possible_config.votable) - continue - choices += possible_config.map_name - choices -= get_choices_invalid_for_population() - if(SSmapping.config && length(choices) >= 4) //Remove the current map if there is more than 4 possible maps. - choices -= SSmapping.config.map_name - //BUBBERSTATION EDIT END. - if(length(choices) == 1) // Only one choice, no need to vote. Let's just auto-rotate it to the only remaining map because it would just happen anyways. var/datum/map_config/change_me_out = global.config.maplist[choices[1]] finalize_vote(choices[1])// voted by not voting, very sad. @@ -64,35 +37,16 @@ . = ..() if(. != VOTE_AVAILABLE) return . - if(forced) - return VOTE_AVAILABLE - var/num_choices = length(default_choices - get_choices_invalid_for_population()) + + var/num_choices = length(default_choices) if(num_choices <= 1) return "There [num_choices == 1 ? "is only one map" : "are no maps"] to choose from." - if(SSmapping.map_vote_rocked) - return VOTE_AVAILABLE - if(SSmapping.map_voted) + if(SSmap_vote.next_map_config) return "The next map has already been selected." return VOTE_AVAILABLE -/// Returns a list of all map options that are invalid for the current population. -/datum/vote/map_vote/proc/get_choices_invalid_for_population() - var/filter_threshold = 0 - if(SSticker.HasRoundStarted()) - filter_threshold = get_active_player_count(alive_check = FALSE, afk_check = TRUE, human_check = FALSE) - else - filter_threshold = GLOB.clients.len - - var/list/invalid_choices = list() - for(var/map in default_choices) - var/datum/map_config/possible_config = config.maplist[map] - if(possible_config.config_min_users > 0 && filter_threshold < possible_config.config_min_users) - invalid_choices += map - - else if(possible_config.config_max_users > 0 && filter_threshold > possible_config.config_max_users) - invalid_choices += map - - return invalid_choices +/datum/vote/map_vote/get_result_text(list/all_winners, real_winner, list/non_voters) + return null /datum/vote/map_vote/get_vote_result(list/non_voters) // Even if we have default no vote off, @@ -113,20 +67,4 @@ return ..() /datum/vote/map_vote/finalize_vote(winning_option) - var/datum/map_config/winning_map = global.config.maplist[winning_option] - if(!istype(winning_map)) - CRASH("[type] wasn't passed a valid winning map choice. (Got: [winning_option || "null"] - [winning_map || "null"])") - - SSmapping.changemap(winning_map) - SSmapping.map_voted = TRUE - if(SSmapping.map_vote_rocked) - SSmapping.map_vote_rocked = FALSE - -/proc/revert_map_vote() - var/datum/map_config/override_map = SSmapping.config - if(isnull(override_map)) - return - - SSmapping.changemap(override_map) - log_game("The next map has been reset to [override_map.map_name].") - send_to_playing_players(span_boldannounce("The next map is: [override_map.map_name].")) + SSmap_vote.finalize_map_vote(src) diff --git a/code/datums/votes/restart_vote.dm b/code/datums/votes/restart_vote.dm index 3c74d7e518e..ba0fdf78083 100644 --- a/code/datums/votes/restart_vote.dm +++ b/code/datums/votes/restart_vote.dm @@ -57,10 +57,10 @@ return // If there was a previous map vote, we revert the change. - if(!isnull(SSmapping.next_map_config)) + if(!isnull(SSmap_vote.next_map_config)) log_game("The next map has been reset due to successful restart vote.") send_to_playing_players(span_boldannounce("The next map has been reset due to successful restart vote.")) - revert_map_vote() + SSmap_vote.revert_next_map() SSticker.force_ending = FORCE_END_ROUND log_game("End round forced by successful restart vote.") diff --git a/code/datums/votes/rock_the_vote.dm b/code/datums/votes/rock_the_vote.dm deleted file mode 100644 index 6c7ac4ff257..00000000000 --- a/code/datums/votes/rock_the_vote.dm +++ /dev/null @@ -1,62 +0,0 @@ -#define CHOICE_TO_ROCK "Yes, re-do the map vote." -#define CHOICE_NOT_TO_ROCK "No, keep the currently selected map." - -/// If a map vote is called before the emergency shuttle leaves the station, the players can call another vote to re-run the vote on the shuttle leaving. -/datum/vote/rock_the_vote - name = "Rock the Vote" - override_question = "Rock the Vote?" - contains_vote_in_name = TRUE //lol - default_choices = list( - CHOICE_TO_ROCK, - CHOICE_NOT_TO_ROCK, - ) - default_message = "Override the current map vote." - /// The number of times we have rocked the vote thus far. - var/rocking_votes = 0 - -/datum/vote/rock_the_vote/toggle_votable() - CONFIG_SET(flag/allow_rock_the_vote, !CONFIG_GET(flag/allow_rock_the_vote)) - -/datum/vote/rock_the_vote/is_config_enabled() - return CONFIG_GET(flag/allow_rock_the_vote) - -/datum/vote/rock_the_vote/can_be_initiated(forced) - . = ..() - if(. != VOTE_AVAILABLE) - return . - - if(SSticker.current_state == GAME_STATE_FINISHED) - return "The game is finished, no map votes can be initiated." - - if(rocking_votes >= CONFIG_GET(number/max_rocking_votes)) - return "The maximum number of times to rock the vote has been reached." - - if(SSmapping.map_vote_rocked) - return "The vote has already been rocked! Initiate a map vote!" - - if(!SSmapping.map_voted) - return "Rocking the vote is disabled because no map has been voted on yet!" - - if(SSmapping.map_force_chosen) - return "Rocking the vote is disabled because an admin has forcibly set the map!" - - if(EMERGENCY_ESCAPED_OR_ENDGAMED && SSmapping.map_voted) - return "The emergency shuttle has already left the station and the next map has already been chosen!" - - return VOTE_AVAILABLE - -/datum/vote/rock_the_vote/finalize_vote(winning_option) - rocking_votes++ - if(winning_option == CHOICE_NOT_TO_ROCK) - return - - if(winning_option == CHOICE_TO_ROCK) - to_chat(world, span_boldannounce("The vote has been rocked! Players are now able to re-run the map vote once more.")) - message_admins("The players have successfully rocked the vote.") - SSmapping.map_vote_rocked = TRUE - return - - CRASH("[type] wasn't passed a valid winning choice. (Got: [winning_option || "null"])") - -#undef CHOICE_TO_ROCK -#undef CHOICE_NOT_TO_ROCK diff --git a/code/datums/weather/weather.dm b/code/datums/weather/weather.dm index 1da16133d3c..8a5eeb4fbe1 100644 --- a/code/datums/weather/weather.dm +++ b/code/datums/weather/weather.dm @@ -13,7 +13,7 @@ /// description of weather var/desc = "Heavy gusts of wind blanket the area, periodically knocking down anyone caught in the open." /// The message displayed in chat to foreshadow the weather's beginning - var/telegraph_message = "The wind begins to pick up." + var/telegraph_message = span_warning("The wind begins to pick up.") /// In deciseconds, how long from the beginning of the telegraph until the weather begins var/telegraph_duration = 300 /// The sound file played to everyone on an affected z-level @@ -22,7 +22,7 @@ var/telegraph_overlay /// Displayed in chat once the weather begins in earnest - var/weather_message = "The wind begins to blow ferociously!" + var/weather_message = span_userdanger("The wind begins to blow ferociously!") /// In deciseconds, how long the weather lasts once it begins var/weather_duration = 1200 /// See above - this is the lowest possible duration @@ -37,7 +37,7 @@ var/weather_color = null /// Displayed once the weather is over - var/end_message = "The wind relents its assault." + var/end_message = span_danger("The wind relents its assault.") /// In deciseconds, how long the "wind-down" graphic will appear before vanishing entirely var/end_duration = 300 /// Sound that plays while weather is ending diff --git a/code/datums/weather/weather_types/ash_storm.dm b/code/datums/weather/weather_types/ash_storm.dm index 6a2aa2e4743..7839c3499ef 100644 --- a/code/datums/weather/weather_types/ash_storm.dm +++ b/code/datums/weather/weather_types/ash_storm.dm @@ -3,16 +3,16 @@ name = "ash storm" desc = "An intense atmospheric storm lifts ash off of the planet's surface and billows it down across the area, dealing intense fire damage to the unprotected." - telegraph_message = "An eerie moan rises on the wind. Sheets of burning ash blacken the horizon. Seek shelter." + telegraph_message = span_boldwarning("An eerie moan rises on the wind. Sheets of burning ash blacken the horizon. Seek shelter.") telegraph_duration = 300 telegraph_overlay = "light_ash" - weather_message = "Smoldering clouds of scorching ash billow down around you! Get inside!" + weather_message = span_userdanger("Smoldering clouds of scorching ash billow down around you! Get inside!") weather_duration_lower = 600 weather_duration_upper = 1200 weather_overlay = "ash_storm" - end_message = "The shrieking wind whips away the last of the ash and falls to its usual murmur. It should be safe to go outside now." + end_message = span_boldannounce("The shrieking wind whips away the last of the ash and falls to its usual murmur. It should be safe to go outside now.") end_duration = 300 end_overlay = "light_ash" @@ -85,10 +85,10 @@ name = "emberfall" desc = "A passing ash storm blankets the area in harmless embers." - weather_message = "Gentle embers waft down around you like grotesque snow. The storm seems to have passed you by..." + weather_message = span_notice("Gentle embers waft down around you like grotesque snow. The storm seems to have passed you by...") weather_overlay = "light_ash" - end_message = "The emberfall slows, stops. Another layer of hardened soot to the basalt beneath your feet." + end_message = span_notice("The emberfall slows, stops. Another layer of hardened soot to the basalt beneath your feet.") end_sound = null aesthetic = TRUE diff --git a/code/datums/weather/weather_types/floor_is_lava.dm b/code/datums/weather/weather_types/floor_is_lava.dm index 03ed0c68c31..25037d433b5 100644 --- a/code/datums/weather/weather_types/floor_is_lava.dm +++ b/code/datums/weather/weather_types/floor_is_lava.dm @@ -3,15 +3,15 @@ name = "the floor is lava" desc = "The ground turns into surprisingly cool lava, lightly damaging anything on the floor." - telegraph_message = "You feel the ground beneath you getting hot. Waves of heat distort the air." + telegraph_message = span_warning("You feel the ground beneath you getting hot. Waves of heat distort the air.") telegraph_duration = 150 - weather_message = "The floor is lava! Get on top of something!" + weather_message = span_userdanger("The floor is lava! Get on top of something!") weather_duration_lower = 300 weather_duration_upper = 600 weather_overlay = "lava" - end_message = "The ground cools and returns to its usual form." + end_message = span_danger("The ground cools and returns to its usual form.") end_duration = 0 area_type = /area diff --git a/code/datums/weather/weather_types/radiation_storm.dm b/code/datums/weather/weather_types/radiation_storm.dm index 3ca117681b6..8d8110f9cf9 100644 --- a/code/datums/weather/weather_types/radiation_storm.dm +++ b/code/datums/weather/weather_types/radiation_storm.dm @@ -4,17 +4,17 @@ desc = "A cloud of intense radiation passes through the area dealing rad damage to those who are unprotected." telegraph_duration = 400 - telegraph_message = "The air begins to grow warm." + telegraph_message = span_danger("The air begins to grow warm.") - weather_message = "You feel waves of heat wash over you! Find shelter!" + weather_message = span_userdanger("You feel waves of heat wash over you! Find shelter!") weather_overlay = "ash_storm" weather_duration_lower = 600 weather_duration_upper = 1500 weather_color = "green" - weather_sound = 'sound/misc/bloblarm.ogg' + weather_sound = 'sound/announcer/alarm/bloblarm.ogg' end_duration = 100 - end_message = "The air seems to be cooling off again." + end_message = span_notice("The air seems to be cooling off again.") area_type = /area protected_areas = list(/area/station/maintenance, /area/station/ai_monitored/turret_protected/ai_upload, /area/station/ai_monitored/turret_protected/ai_upload_foyer, @@ -34,28 +34,28 @@ status_alarm(TRUE) -/datum/weather/rad_storm/weather_act(mob/living/L) +/datum/weather/rad_storm/weather_act(mob/living/living) if(!prob(mutate_chance)) return - if(!ishuman(L)) + if(!ishuman(living) || HAS_TRAIT(living, TRAIT_GODMODE)) return - var/mob/living/carbon/human/H = L - if(!H.can_mutate() || H.status_flags & GODMODE) + var/mob/living/carbon/human/human = living + if(!human.can_mutate()) return - if(HAS_TRAIT(H, TRAIT_RADIMMUNE)) + if(HAS_TRAIT(human, TRAIT_RADIMMUNE)) return - if (SSradiation.wearing_rad_protected_clothing(H)) + if (SSradiation.wearing_rad_protected_clothing(human)) return - H.random_mutate_unique_identity() - H.random_mutate_unique_features() + human.random_mutate_unique_identity() + human.random_mutate_unique_features() if(prob(50)) - do_mutate(L) + do_mutate(human) /datum/weather/rad_storm/end() if(..()) diff --git a/code/datums/weather/weather_types/snow_storm.dm b/code/datums/weather/weather_types/snow_storm.dm index c98ee9636a7..2b749cdbc84 100644 --- a/code/datums/weather/weather_types/snow_storm.dm +++ b/code/datums/weather/weather_types/snow_storm.dm @@ -3,18 +3,18 @@ desc = "Harsh snowstorms roam the topside of this arctic planet, burying any area unfortunate enough to be in its path." probability = 90 - telegraph_message = "Drifting particles of snow begin to dust the surrounding area.." + telegraph_message = span_warning("Drifting particles of snow begin to dust the surrounding area..") telegraph_duration = 300 telegraph_overlay = "light_snow" - weather_message = "Harsh winds pick up as dense snow begins to fall from the sky! Seek shelter!" + weather_message = span_userdanger("Harsh winds pick up as dense snow begins to fall from the sky! Seek shelter!") 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." + end_message = span_boldannounce("The snowfall dies down, it should be safe to go outside again.") area_type = /area protect_indoors = TRUE diff --git a/code/datums/weather/weather_types/void_storm.dm b/code/datums/weather/weather_types/void_storm.dm index 90cc7d44cfb..617e3ff0230 100644 --- a/code/datums/weather/weather_types/void_storm.dm +++ b/code/datums/weather/weather_types/void_storm.dm @@ -6,7 +6,7 @@ telegraph_overlay = "light_snow" weather_message = span_hypnophrase("You feel the air around you getting colder... and void's sweet embrace...") - weather_overlay = "snow_storm" + weather_overlay = "light_snow" weather_color = COLOR_BLACK weather_duration_lower = 60 SECONDS weather_duration_upper = 120 SECONDS @@ -19,31 +19,5 @@ protect_indoors = FALSE target_trait = ZTRAIT_VOIDSTORM - immunity_type = TRAIT_VOIDSTORM_IMMUNE - barometer_predictable = FALSE perpetual = TRUE - - /// List of areas that were once impacted areas but are not anymore. Used for updating the weather overlay based whether the ascended heretic is in the area. - var/list/former_impacted_areas = list() - -/datum/weather/void_storm/can_weather_act(mob/living/mob_to_check) - . = ..() - if(IS_HERETIC_OR_MONSTER(mob_to_check)) - return FALSE - -/datum/weather/void_storm/weather_act(mob/living/victim) - var/need_mob_update = FALSE - need_mob_update += victim.adjustFireLoss(1, updating_health = FALSE) - need_mob_update += victim.adjustOxyLoss(rand(1, 3), updating_health = FALSE) - if(need_mob_update) - victim.updatehealth() - victim.adjust_eye_blur(rand(0 SECONDS, 2 SECONDS)) - victim.adjust_bodytemperature(-30 * TEMPERATURE_DAMAGE_COEFFICIENT) - -// Goes through former_impacted_areas and sets the overlay of each back to the telegraph overlay, to indicate the ascended heretic is no longer in that area. -/datum/weather/void_storm/update_areas() - for(var/area/former_area as anything in former_impacted_areas) - former_area.icon_state = telegraph_overlay - former_impacted_areas -= former_area - return ..() diff --git a/code/datums/wires/syndicatebomb.dm b/code/datums/wires/syndicatebomb.dm index fa939d5b560..d7f98f07deb 100644 --- a/code/datums/wires/syndicatebomb.dm +++ b/code/datums/wires/syndicatebomb.dm @@ -48,7 +48,7 @@ if(WIRE_PROCEED) holder.visible_message(span_danger("[icon2html(B, viewers(holder))] The bomb buzzes ominously!")) - playsound(B, 'sound/machines/buzz-sigh.ogg', 30, TRUE) + playsound(B, 'sound/machines/buzz/buzz-sigh.ogg', 30, TRUE) var/seconds = B.seconds_remaining() if(seconds >= 61) // Long fuse bombs can suddenly become more dangerous if you tinker with them. B.detonation_timer = world.time + 600 diff --git a/code/datums/world_topic.dm b/code/datums/world_topic.dm index d930c496de6..cb4879c82c8 100644 --- a/code/datums/world_topic.dm +++ b/code/datums/world_topic.dm @@ -213,7 +213,7 @@ .["admins"] = presentmins.len + afkmins.len //equivalent to the info gotten from adminwho .["gamestate"] = SSticker.current_state - .["map_name"] = SSmapping.config?.map_name || "Loading..." + .["map_name"] = SSmapping.current_map.map_name || "Loading..." if(key_valid) .["active_players"] = get_active_player_count() diff --git a/code/datums/wounds/_wound_static_data.dm b/code/datums/wounds/_wound_static_data.dm index f8b03d1856b..adc0923ee4f 100644 --- a/code/datums/wounds/_wound_static_data.dm +++ b/code/datums/wounds/_wound_static_data.dm @@ -95,7 +95,7 @@ if (random_roll && !can_be_randomly_generated) return FALSE - if (HAS_TRAIT(limb.owner, TRAIT_NEVER_WOUNDED) || (limb.owner.status_flags & GODMODE)) + if (HAS_TRAIT(limb.owner, TRAIT_NEVER_WOUNDED) || HAS_TRAIT(limb.owner, TRAIT_GODMODE)) return FALSE if (!wounding_types_valid(suggested_wounding_types)) diff --git a/code/datums/wounds/_wounds.dm b/code/datums/wounds/_wounds.dm index eb531dd3dc9..5e5258c86de 100644 --- a/code/datums/wounds/_wounds.dm +++ b/code/datums/wounds/_wounds.dm @@ -23,6 +23,8 @@ var/desc = "" /// The basic treatment suggested by health analyzers var/treat_text = "" + /// Even more basic treatment + var/treat_text_short = "" /// What the limb looks like on a cursory examine var/examine_desc = "is badly hurt" @@ -643,22 +645,42 @@ return span_bold("[desc]!") return "[desc]." +/** + * Prints the details about the wound for the wound scanner on simple mode + */ /datum/wound/proc/get_scanner_description(mob/user) - return "Type: [name]\nSeverity: [severity_text(simple = FALSE)]\nDescription: [desc]\nRecommended Treatment: [treat_text]" + return "Type: [name]
\ + Severity: [severity_text()]
\ + Description: [desc]
\ + Recommended Treatment: [treat_text]" +/** + * Prints the details about the wound for the wound scanner on complex mode + */ /datum/wound/proc/get_simple_scanner_description(mob/user) - return "[name] detected!\nRisk: [severity_text(simple = TRUE)]\nDescription: [simple_desc ? simple_desc : desc]\nTreatment Guide: [simple_treat_text]\nHomemade Remedies: [homemade_treat_text]" + var/severity_text_formatted = severity_text() + for(var/i in 1 to severity) + severity_text_formatted += "!" -/datum/wound/proc/severity_text(simple = FALSE) + return "[name] detected!
\ + Risk: [severity_text_formatted]
\ + Description: [simple_desc || desc]
\ + Treatment Guide: [simple_treat_text]
\ + Homemade Remedies: [homemade_treat_text]" + +/** + * Returns what text describes this wound + */ +/datum/wound/proc/severity_text() switch(severity) if(WOUND_SEVERITY_TRIVIAL) return "Trivial" if(WOUND_SEVERITY_MODERATE) - return "Moderate" + (simple ? "!" : "") + return "Moderate" if(WOUND_SEVERITY_SEVERE) - return "Severe" + (simple ? "!!" : "") + return "Severe" if(WOUND_SEVERITY_CRITICAL) - return "Critical" + (simple ? "!!!" : "") + return "Critical" /// Returns TRUE if our limb is the head or chest, FALSE otherwise. /// Essential in the sense of "we cannot live without it". @@ -694,7 +716,7 @@ var/datum/wound_pregen_data/pregen_data = get_pregen_data() - if (WOUND_BLUNT in pregen_data.required_wounding_types && severity >= WOUND_SEVERITY_CRITICAL) + if ((WOUND_BLUNT in pregen_data.required_wounding_types) && severity >= WOUND_SEVERITY_CRITICAL) return WOUND_CRITICAL_BLUNT_DISMEMBER_BONUS // we only require mangled bone (T2 blunt), but if there's a critical blunt, we'll add 15% more /// Returns our pregen data, which is practically guaranteed to exist, so this proc can safely be used raw. diff --git a/code/datums/wounds/bones.dm b/code/datums/wounds/bones.dm index 13877c8223b..70e80ca1961 100644 --- a/code/datums/wounds/bones.dm +++ b/code/datums/wounds/bones.dm @@ -146,14 +146,26 @@ if(1 to 6) victim.bleed(blood_bled, TRUE) if(7 to 13) - victim.visible_message("A thin stream of blood drips from [victim]'s mouth from the blow to [victim.p_their()] chest.", span_danger("You cough up a bit of blood from the blow to your chest."), vision_distance=COMBAT_MESSAGE_RANGE) + victim.visible_message( + span_smalldanger("A thin stream of blood drips from [victim]'s mouth from the blow to [victim.p_their()] chest."), + span_danger("You cough up a bit of blood from the blow to your chest."), + vision_distance = COMBAT_MESSAGE_RANGE, + ) victim.bleed(blood_bled, TRUE) if(14 to 19) - victim.visible_message("Blood spews out of [victim]'s mouth from the blow to [victim.p_their()] chest!", span_danger("You spit out a string of blood from the blow to your chest!"), vision_distance=COMBAT_MESSAGE_RANGE) + victim.visible_message( + span_smalldanger("Blood spews out of [victim]'s mouth from the blow to [victim.p_their()] chest!"), + span_danger("You spit out a string of blood from the blow to your chest!"), + vision_distance = COMBAT_MESSAGE_RANGE, + ) new /obj/effect/temp_visual/dir_setting/bloodsplatter(victim.loc, victim.dir) victim.bleed(blood_bled) if(20 to INFINITY) - victim.visible_message(span_danger("Blood spurts out of [victim]'s mouth from the blow to [victim.p_their()] chest!"), span_danger("You choke up on a spray of blood from the blow to your chest!"), vision_distance=COMBAT_MESSAGE_RANGE) + victim.visible_message( + span_danger("Blood spurts out of [victim]'s mouth from the blow to [victim.p_their()] chest!"), + span_bolddanger("You choke up on a spray of blood from the blow to your chest!"), + vision_distance = COMBAT_MESSAGE_RANGE, + ) victim.bleed(blood_bled) new /obj/effect/temp_visual/dir_setting/bloodsplatter(victim.loc, victim.dir) victim.add_splatter_floor(get_step(victim.loc, victim.dir)) @@ -186,7 +198,9 @@ /datum/wound/blunt/bone/moderate name = "Joint Dislocation" desc = "Patient's limb has been unset from socket, causing pain and reduced motor function." - treat_text = "Recommended application of bonesetter to affected limb, though manual relocation by applying an aggressive grab to the patient and helpfully interacting with afflicted limb may suffice." + treat_text = "Apply Bonesetter to the affected limb. \ + Manual relocation by via an aggressive grab and a tight hug to the affected limb may also suffice." + treat_text_short = "Apply Bonesetter, or manually relocate the limb." examine_desc = "is awkwardly janked out of place" occur_text = "janks violently and becomes unseated" severity = WOUND_SEVERITY_MODERATE @@ -321,7 +335,9 @@ /datum/wound/blunt/bone/severe name = "Hairline Fracture" desc = "Patient's bone has suffered a crack in the foundation, causing serious pain and reduced limb functionality." - treat_text = "Recommended light surgical application of bone gel, though a sling of medical gauze will prevent worsening situation." + treat_text = "Repair surgically. In the event of an emergency, an application of bone gel over the affected area will fix over time. \ + A splint or sling of medical gauze can also be used to prevent the fracture from worsening." + treat_text_short = "Repair surgically, or apply bone gel. A splint or gauze sling can also be used." examine_desc = "appears grotesquely swollen, jagged bumps hinting at chips in the bone" occur_text = "sprays chips of bone and develops a nasty looking bruise" @@ -354,8 +370,11 @@ /// Compound Fracture (Critical Blunt) /datum/wound/blunt/bone/critical name = "Compound Fracture" - desc = "Patient's bones have suffered multiple gruesome fractures, causing significant pain and near uselessness of limb." - treat_text = "Immediate binding of affected limb, followed by surgical intervention ASAP." + desc = "Patient's bones have suffered multiple fractures, \ + couped with a break in the skin, causing significant pain and near uselessness of limb." + treat_text = "Immediately bind the affected limb with gauze or a splint. Repair surgically. \ + In the event of an emergency, bone gel and surgical tape can be applied to the affected area to fix over a long period of time." + treat_text_short = "Repair surgically, or apply bone gel and surgical tape. A splint or gauze sling should also be used." examine_desc = "is thoroughly pulped and cracked, exposing shards of bone to open air" occur_text = "cracks apart, exposing broken bones to open air" diff --git a/code/datums/wounds/burns.dm b/code/datums/wounds/burns.dm index f44721169a3..b4bc3d9bc0e 100644 --- a/code/datums/wounds/burns.dm +++ b/code/datums/wounds/burns.dm @@ -40,7 +40,7 @@ return . = ..() - if(strikes_to_lose_limb == 0) // we've already hit sepsis, nothing more to do + if(strikes_to_lose_limb <= 0) // we've already hit sepsis, nothing more to do victim.adjustToxLoss(0.25 * seconds_per_tick) if(SPT_PROB(0.5, seconds_per_tick)) victim.visible_message(span_danger("The infection on the remnants of [victim]'s [limb.plaintext_zone] shift and bubble nauseatingly!"), span_warning("You can feel the infection on the remnants of your [limb.plaintext_zone] coursing through your veins!"), vision_distance = COMBAT_MESSAGE_RANGE) @@ -133,6 +133,13 @@ threshold_penalty = 120 // piss easy to destroy set_disabling(TRUE) +/datum/wound/burn/flesh/set_disabling(new_value) + . = ..() + if(new_value && strikes_to_lose_limb <= 0) + treat_text_short = "Amputate or augment limb immediately, or place the patient into cryogenics." + else + treat_text_short = initial(treat_text_short) + /datum/wound/burn/flesh/get_wound_description(mob/user) if(strikes_to_lose_limb <= 0) return span_deadsay("[victim.p_Their()] [limb.plaintext_zone] has locked up completely and is non-functional.") @@ -166,9 +173,25 @@ return "[condition.Join()]" +/datum/wound/burn/flesh/severity_text(simple = FALSE) + . = ..() + . += " Burn / " + switch(infestation) + if(-INFINITY to WOUND_INFECTION_MODERATE) + . += "No" + if(WOUND_INFECTION_MODERATE to WOUND_INFECTION_SEVERE) + . += "Moderate" + if(WOUND_INFECTION_SEVERE to WOUND_INFECTION_CRITICAL) + . += "Severe" + if(WOUND_INFECTION_CRITICAL to WOUND_INFECTION_SEPTIC) + . += "Critical" + if(WOUND_INFECTION_SEPTIC to INFINITY) + . += "Total" + . += " Infection" + /datum/wound/burn/flesh/get_scanner_description(mob/user) if(strikes_to_lose_limb <= 0) // Unclear if it can go below 0, best to not take the chance - var/oopsie = "Type: [name]\nSeverity: [severity_text()]" + var/oopsie = "Type: [name]
Severity: [severity_text()]" oopsie += "
Infection Level: [span_deadsay("The body part has suffered complete sepsis and must be removed. Amputate or augment limb immediately, or place the patient in a cryotube.")]
" return oopsie @@ -247,7 +270,7 @@ // people complained about burns not healing on stasis beds, so in addition to checking if it's cured, they also get the special ability to very slowly heal on stasis beds if they have the healing effects stored /datum/wound/burn/flesh/on_stasis(seconds_per_tick, times_fired) . = ..() - if(strikes_to_lose_limb == 0) // we've already hit sepsis, nothing more to do + if(strikes_to_lose_limb <= 0) // we've already hit sepsis, nothing more to do if(SPT_PROB(0.5, seconds_per_tick)) victim.visible_message(span_danger("The infection on the remnants of [victim]'s [limb.plaintext_zone] shift and bubble nauseatingly!"), span_warning("You can feel the infection on the remnants of your [limb.plaintext_zone] coursing through your veins!"), vision_distance = COMBAT_MESSAGE_RANGE) return @@ -278,7 +301,8 @@ /datum/wound/burn/flesh/moderate name = "Second Degree Burns" desc = "Patient is suffering considerable burns with mild skin penetration, weakening limb integrity and increased burning sensations." - treat_text = "Recommended application of topical ointment or regenerative mesh to affected region." + treat_text = "Apply topical ointment or regenerative mesh to the wound." + treat_text_short = "Apply healing aid such as regenerative mesh." examine_desc = "is badly burned and breaking out in blisters" occur_text = "breaks out with violent red burns" severity = WOUND_SEVERITY_MODERATE @@ -302,7 +326,11 @@ /datum/wound/burn/flesh/severe name = "Third Degree Burns" desc = "Patient is suffering extreme burns with full skin penetration, creating serious risk of infection and greatly reduced limb integrity." - treat_text = "Recommended immediate disinfection and excision of any infected skin, followed by bandaging and ointment. If the limb has locked up, it must be amputated, augmented or treated with cryogenics." + treat_text = "Swiftly apply healing aids such as Synthflesh or regenerative mesh to the wound. \ + Disinfect the wound and surgically debride any infected skin, and wrap in clean gauze / use ointment to prevent further infection. \ + If the limb has locked up, it must be amputated, augmented or treated with cryogenics." + treat_text_short = "Apply healing aid such as regenerative mesh, Synthflesh, or cryogenics and disinfect / debride. \ + Clean gauze or ointment will slow infection rate." examine_desc = "appears seriously charred, with aggressive red splotches" occur_text = "chars rapidly, exposing ruined tissue and spreading angry red burns" severity = WOUND_SEVERITY_SEVERE @@ -328,7 +356,11 @@ /datum/wound/burn/flesh/critical name = "Catastrophic Burns" desc = "Patient is suffering near complete loss of tissue and significantly charred muscle and bone, creating life-threatening risk of infection and negligible limb integrity." - treat_text = "Immediate surgical debriding of any infected skin, followed by potent tissue regeneration formula and bandaging. If the limb has locked up, it must be amputated, augmented or treated with cryogenics." + treat_text = "Immediately apply healing aids such as Synthflesh or regenerative mesh to the wound. \ + Disinfect the wound and surgically debride any infected skin, and wrap in clean gauze / use ointment to prevent further infection. \ + If the limb has locked up, it must be amputated, augmented or treated with cryogenics." + treat_text_short = "Apply healing aid such as regenerative mesh, Synthflesh, or cryogenics and disinfect / debride. \ + Clean gauze or ointment will slow infection rate." examine_desc = "is a ruined mess of blanched bone, melted fat, and charred tissue" occur_text = "vaporizes as flesh, bone, and fat melt together in a horrifying mess" severity = WOUND_SEVERITY_CRITICAL diff --git a/code/datums/wounds/cranial_fissure.dm b/code/datums/wounds/cranial_fissure.dm index df973d3bdec..8feebe8d2b6 100644 --- a/code/datums/wounds/cranial_fissure.dm +++ b/code/datums/wounds/cranial_fissure.dm @@ -29,7 +29,8 @@ /datum/wound/cranial_fissure name = "Cranial Fissure" desc = "Patient's crown is agape, revealing severe damage to the skull." - treat_text = "Immediate surgical reconstruction of the skull." + treat_text = "Surgical reconstruction of the skull is necessary." + treat_text_short = "Surgical reconstruction required." examine_desc = "is split open" occur_text = "is split into two separated chunks" @@ -95,7 +96,7 @@ victim.balloon_alert(user, "no eyes to take!") return TRUE - playsound(victim, 'sound/surgery/organ2.ogg', 50, TRUE) + playsound(victim, 'sound/items/handling/surgery/organ2.ogg', 50, TRUE) victim.balloon_alert(user, "pulling out eyes...") user.visible_message( span_boldwarning("[user] reaches inside [victim]'s skull..."), @@ -115,7 +116,7 @@ log_combat(user, victim, "pulled out the eyes of") - playsound(victim, 'sound/surgery/organ1.ogg', 75, TRUE) + playsound(victim, 'sound/items/handling/surgery/organ1.ogg', 75, TRUE) user.visible_message( span_boldwarning("[user] rips out [victim]'s eyes!"), span_boldwarning("You rip out [victim]'s eyes!"), diff --git a/code/datums/wounds/pierce.dm b/code/datums/wounds/pierce.dm index c0be047b938..72f49cc58e3 100644 --- a/code/datums/wounds/pierce.dm +++ b/code/datums/wounds/pierce.dm @@ -5,7 +5,7 @@ /datum/wound/pierce/bleed name = "Piercing Wound" - sound_effect = 'sound/weapons/slice.ogg' + sound_effect = 'sound/items/weapons/slice.ogg' processes = TRUE treatable_by = list(/obj/item/stack/medical/suture) treatable_tools = list(TOOL_CAUTERY) @@ -41,14 +41,26 @@ if(1 to 6) victim.bleed(blood_bled, TRUE) if(7 to 13) - victim.visible_message("Blood droplets fly from the hole in [victim]'s [limb.plaintext_zone].", span_danger("You cough up a bit of blood from the blow to your [limb.plaintext_zone]."), vision_distance=COMBAT_MESSAGE_RANGE) + victim.visible_message( + span_smalldanger("Blood droplets fly from the hole in [victim]'s [limb.plaintext_zone]."), + span_danger("You cough up a bit of blood from the blow to your [limb.plaintext_zone]."), + vision_distance = COMBAT_MESSAGE_RANGE, + ) victim.bleed(blood_bled, TRUE) if(14 to 19) - victim.visible_message("A small stream of blood spurts from the hole in [victim]'s [limb.plaintext_zone]!", span_danger("You spit out a string of blood from the blow to your [limb.plaintext_zone]!"), vision_distance=COMBAT_MESSAGE_RANGE) + victim.visible_message( + span_smalldanger("A small stream of blood spurts from the hole in [victim]'s [limb.plaintext_zone]!"), + span_danger("You spit out a string of blood from the blow to your [limb.plaintext_zone]!"), + vision_distance = COMBAT_MESSAGE_RANGE, + ) new /obj/effect/temp_visual/dir_setting/bloodsplatter(victim.loc, victim.dir) victim.bleed(blood_bled) if(20 to INFINITY) - victim.visible_message(span_danger("A spray of blood streams from the gash in [victim]'s [limb.plaintext_zone]!"), span_danger("You choke up on a spray of blood from the blow to your [limb.plaintext_zone]!"), vision_distance=COMBAT_MESSAGE_RANGE) + victim.visible_message( + span_danger("A spray of blood streams from the gash in [victim]'s [limb.plaintext_zone]!"), + span_bolddanger("You choke up on a spray of blood from the blow to your [limb.plaintext_zone]!"), + vision_distance = COMBAT_MESSAGE_RANGE, + ) victim.bleed(blood_bled) new /obj/effect/temp_visual/dir_setting/bloodsplatter(victim.loc, victim.dir) victim.add_splatter_floor(get_step(victim.loc, victim.dir)) @@ -179,7 +191,10 @@ /datum/wound/pierce/bleed/moderate name = "Minor Skin Breakage" desc = "Patient's skin has been broken open, causing severe bruising and minor internal bleeding in affected area." - treat_text = "Treat affected site with bandaging or exposure to extreme cold. In dire cases, brief exposure to vacuum may suffice." // space is cold in ss13, so it's like an ice pack! + treat_text = "Apply bandaging or suturing to the wound, make use of blood clotting agents, \ + cauterization, or in extreme circumstances, exposure to extreme cold or vaccuum. \ + Follow with food and a rest period." + treat_text_short = "Apply bandaging or suturing." examine_desc = "has a small, circular hole, gently bleeding" occur_text = "spurts out a thin stream of blood" sound_effect = 'sound/effects/wounds/pierce1.ogg' @@ -210,7 +225,10 @@ /datum/wound/pierce/bleed/severe name = "Open Puncture" desc = "Patient's internal tissue is penetrated, causing sizeable internal bleeding and reduced limb stability." - treat_text = "Repair punctures in skin by suture or cautery, extreme cold may also work." + treat_text = "Swiftly apply bandaging or suturing to the wound, make use of blood clotting agents or saline-glucose, \ + cauterization, or in extreme circumstances, exposure to extreme cold or vaccuum. \ + Follow with iron supplements and a rest period." + treat_text_short = "Apply bandaging, suturing, clotting agents, or cauterization." examine_desc = "is pierced clear through, with bits of tissue obscuring the open hole" occur_text = "looses a violent spray of blood, revealing a pierced wound" sound_effect = 'sound/effects/wounds/pierce2.ogg' @@ -240,7 +258,10 @@ /datum/wound/pierce/bleed/critical name = "Ruptured Cavity" desc = "Patient's internal tissue and circulatory system is shredded, causing significant internal bleeding and damage to internal organs." - treat_text = "Surgical repair of puncture wound, followed by supervised resanguination." + treat_text = "Immediately apply bandaging or suturing to the wound, make use of blood clotting agents or saline-glucose, \ + cauterization, or in extreme circumstances, exposure to extreme cold or vaccuum. \ + Follow with supervised resanguination." + treat_text_short = "Apply bandaging, suturing, clotting agents, or cauterization." examine_desc = "is ripped clear through, barely held together by exposed bone" occur_text = "blasts apart, sending chunks of viscera flying in all directions" sound_effect = 'sound/effects/wounds/pierce3.ogg' diff --git a/code/datums/wounds/slash.dm b/code/datums/wounds/slash.dm index dd41d48620e..fd3cb4bd7b2 100644 --- a/code/datums/wounds/slash.dm +++ b/code/datums/wounds/slash.dm @@ -5,7 +5,7 @@ /datum/wound/slash name = "Slashing (Cut) Wound" - sound_effect = 'sound/weapons/slice.ogg' + sound_effect = 'sound/items/weapons/slice.ogg' /datum/wound_pregen_data/flesh_slash abstract = TRUE @@ -321,7 +321,9 @@ /datum/wound/slash/flesh/moderate name = "Rough Abrasion" desc = "Patient's skin has been badly scraped, generating moderate blood loss." - treat_text = "Application of clean bandages or first-aid grade sutures, followed by food and rest." + treat_text = "Apply bandaging or suturing to the wound. \ + Follow up with food and a rest period." + treat_text_short = "Apply bandaging or suturing." examine_desc = "has an open cut" occur_text = "is cut open, slowly leaking blood" sound_effect = 'sound/effects/wounds/blood1.ogg' @@ -350,7 +352,10 @@ /datum/wound/slash/flesh/severe name = "Open Laceration" desc = "Patient's skin is ripped clean open, allowing significant blood loss." - treat_text = "Speedy application of first-aid grade sutures and clean bandages, followed by vitals monitoring to ensure recovery." + treat_text = "Swiftly apply bandaging or suturing to the wound, \ + or make use of blood clotting agents or cauterization. \ + Follow up with iron supplements or saline-glucose and a rest period." + treat_text_short = "Apply bandaging, suturing, clotting agents, or cauterization." examine_desc = "has a severe cut" occur_text = "is ripped open, veins spurting blood" sound_effect = 'sound/effects/wounds/blood2.ogg' @@ -380,7 +385,10 @@ /datum/wound/slash/flesh/critical name = "Weeping Avulsion" desc = "Patient's skin is completely torn open, along with significant loss of tissue. Extreme blood loss will lead to quick death without intervention." - treat_text = "Immediate bandaging and either suturing or cauterization, followed by supervised resanguination." + treat_text = "Immediately apply bandaging or suturing to the wound, \ + or make use of blood clotting agents or cauterization. \ + Follow up supervised resanguination." + treat_text_short = "Apply bandaging, suturing, clotting agents, or cauterization." examine_desc = "is carved down to the bone, spraying blood wildly" occur_text = "is torn open, spraying blood wildly" sound_effect = 'sound/effects/wounds/blood3.ogg' diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 04d26a5e50a..b988fa0b6da 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -91,7 +91,7 @@ ///Does this area immediately play an ambience track upon enter? var/forced_ambience = FALSE ///The background droning loop that plays 24/7 - var/ambient_buzz = 'sound/ambience/shipambience.ogg' + var/ambient_buzz = 'sound/ambience/general/shipambience.ogg' ///The volume of the ambient buzz var/ambient_buzz_vol = 35 ///Used to decide what the minimum time between ambience is diff --git a/code/game/area/areas/ai_monitored.dm b/code/game/area/areas/ai_monitored.dm index a6964d70f6a..4e63479987e 100644 --- a/code/game/area/areas/ai_monitored.dm +++ b/code/game/area/areas/ai_monitored.dm @@ -23,9 +23,9 @@ // Turret protected /area/station/ai_monitored/turret_protected - ambientsounds = list('sound/ambience/ambitech.ogg', 'sound/ambience/ambitech2.ogg', 'sound/ambience/ambiatmos.ogg', 'sound/ambience/ambiatmos2.ogg') + ambientsounds = list('sound/ambience/engineering/ambitech.ogg', 'sound/ambience/engineering/ambitech2.ogg', 'sound/ambience/engineering/ambiatmos.ogg', 'sound/ambience/engineering/ambiatmos2.ogg') ///Some sounds (like the space jam) are terrible when on loop. We use this variable to add it to other AI areas, but override it to keep it from the AI's core. - var/ai_will_not_hear_this = list('sound/ambience/ambimalf.ogg') + var/ai_will_not_hear_this = list('sound/ambience/misc/ambimalf.ogg') airlock_wires = /datum/wires/airlock/ai /area/station/ai_monitored/turret_protected/Initialize(mapload) diff --git a/code/game/area/areas/away_content.dm b/code/game/area/areas/away_content.dm index 5e2219ef857..5ff0143c0a1 100644 --- a/code/game/area/areas/away_content.dm +++ b/code/game/area/areas/away_content.dm @@ -23,7 +23,7 @@ Unused icons for new areas are "awaycontent1" ~ "awaycontent30" base_lighting_alpha = 200 base_lighting_color = "#FFF4AA" sound_environment = SOUND_ENVIRONMENT_PLAIN - ambientsounds = list('sound/ambience/shore.ogg', 'sound/ambience/ambiodd.ogg','sound/ambience/ambinice.ogg') + ambientsounds = list('sound/ambience/beach/shore.ogg', 'sound/ambience/misc/ambiodd.ogg','sound/ambience/medical/ambinice.ogg') /area/awaymission/museum/cafeteria name = "Nanotrasen Museum Cafeteria" diff --git a/code/game/area/areas/centcom.dm b/code/game/area/areas/centcom.dm index f5ac4fac78e..43a18ac5f18 100644 --- a/code/game/area/areas/centcom.dm +++ b/code/game/area/areas/centcom.dm @@ -129,6 +129,7 @@ /area/centcom/tdome/arena name = "Thunderdome Arena" icon_state = "thunder" + area_flags = parent_type::area_flags | UNLIMITED_FISHING //for possible testing purposes /area/centcom/tdome/tdome1 name = "Thunderdome (Team 1)" diff --git a/code/game/area/areas/mining.dm b/code/game/area/areas/mining.dm index 031a6dd5039..be6db4e077f 100644 --- a/code/game/area/areas/mining.dm +++ b/code/game/area/areas/mining.dm @@ -4,7 +4,7 @@ icon_state = "mining" has_gravity = STANDARD_GRAVITY area_flags = VALID_TERRITORY | UNIQUE_AREA | FLORA_ALLOWED | CULT_PERMITTED - ambient_buzz = 'sound/ambience/magma.ogg' + ambient_buzz = 'sound/ambience/lavaland/magma.ogg' /area/mine/lobby name = "Mining Station" @@ -134,7 +134,7 @@ flags_1 = NONE area_flags = VALID_TERRITORY | UNIQUE_AREA | FLORA_ALLOWED sound_environment = SOUND_AREA_LAVALAND - ambient_buzz = 'sound/ambience/magma.ogg' + ambient_buzz = 'sound/ambience/lavaland/magma.ogg' /area/lavaland/surface name = "Lavaland" @@ -195,7 +195,7 @@ area_flags = UNIQUE_AREA | FLORA_ALLOWED ambience_index = AMBIENCE_ICEMOON sound_environment = SOUND_AREA_ICEMOON - ambient_buzz = 'sound/ambience/magma.ogg' + ambient_buzz = 'sound/ambience/lavaland/magma.ogg' /area/icemoon/surface name = "Icemoon" diff --git a/code/game/area/areas/ruins/icemoon.dm b/code/game/area/areas/ruins/icemoon.dm index d0049e7007c..061bd8f06d2 100644 --- a/code/game/area/areas/ruins/icemoon.dm +++ b/code/game/area/areas/ruins/icemoon.dm @@ -75,3 +75,7 @@ /area/ruin/powered/hermit name = "\improper Hermit's Cabin" +/area/ruin/syndielab + name = "\improper Syndicate Lab" + ambience_index = AMBIENCE_DANGER + sound_environment = SOUND_ENVIRONMENT_CAVE diff --git a/code/game/area/areas/ruins/lavaland.dm b/code/game/area/areas/ruins/lavaland.dm index 79181d38d17..2ed0337171d 100644 --- a/code/game/area/areas/ruins/lavaland.dm +++ b/code/game/area/areas/ruins/lavaland.dm @@ -8,7 +8,7 @@ /area/ruin/powered/clownplanet name = "\improper Clown Biodome" - ambientsounds = list('sound/ambience/clown.ogg') + ambientsounds = list('sound/music/lobby_music/clown.ogg') /area/ruin/unpowered/gaia name = "\improper Patch of Eden" @@ -38,7 +38,7 @@ /area/ruin/syndicate_lava_base name = "\improper Secret Base" ambience_index = AMBIENCE_DANGER - ambient_buzz = 'sound/ambience/magma.ogg' + ambient_buzz = 'sound/ambience/lavaland/magma.ogg' /area/ruin/unpowered/cultaltar name = "\improper Cult Altar" @@ -49,7 +49,7 @@ name = "\improper The Lizard's Gas" icon_state = "lizardgas" sound_environment = SOUND_ENVIRONMENT_ROOM - ambient_buzz = 'sound/ambience/magma.ogg' + ambient_buzz = 'sound/ambience/lavaland/magma.ogg' //Syndicate lavaland base @@ -94,7 +94,7 @@ power_environ = FALSE power_equip = FALSE power_light = FALSE - ambient_buzz = 'sound/ambience/magma.ogg' + ambient_buzz = 'sound/ambience/lavaland/magma.ogg' //ash walker nest /area/ruin/unpowered/ash_walkers @@ -102,8 +102,7 @@ always_unpowered = FALSE power_equip = TRUE //SKYRAT EDIT ADDITION END - ambient_buzz = 'sound/ambience/magma.ogg' - + ambient_buzz = 'sound/ambience/lavaland/magma.ogg' /area/ruin/unpowered/ratvar outdoors = TRUE - ambient_buzz = 'sound/ambience/magma.ogg' + ambient_buzz = 'sound/ambience/lavaland/magma.ogg' diff --git a/code/game/area/areas/ruins/space.dm b/code/game/area/areas/ruins/space.dm index 5eac7addb4e..ac687d6024a 100644 --- a/code/game/area/areas/ruins/space.dm +++ b/code/game/area/areas/ruins/space.dm @@ -55,7 +55,7 @@ /area/ruin/space/has_grav/powered/aesthetic name = "Aesthetic" - ambientsounds = list('sound/ambience/ambivapor1.ogg') + ambientsounds = list('sound/ambience/misc/ambivapor1.ogg') //Ruin of Hotel @@ -335,7 +335,7 @@ /area/ruin/space/ancientstation/delta/ai name = "\improper Delta Station AI Core" icon_state = "os_delta_ai" - ambientsounds = list('sound/ambience/ambimalf.ogg', 'sound/ambience/ambitech.ogg', 'sound/ambience/ambitech2.ogg', 'sound/ambience/ambiatmos.ogg', 'sound/ambience/ambiatmos2.ogg') + ambientsounds = list('sound/ambience/misc/ambimalf.ogg', 'sound/ambience/engineering/ambitech.ogg', 'sound/ambience/engineering/ambitech2.ogg', 'sound/ambience/engineering/ambiatmos.ogg', 'sound/ambience/engineering/ambiatmos2.ogg') /area/ruin/space/ancientstation/delta/storage name = "\improper Delta Station Storage" @@ -546,14 +546,14 @@ /area/ruin/space/abandoned_tele name = "\improper Abandoned Teleporter" - ambientsounds = list('sound/ambience/ambimalf.ogg', 'sound/ambience/signal.ogg') + ambientsounds = list('sound/ambience/misc/ambimalf.ogg', 'sound/ambience/misc/signal.ogg') //OLD AI SAT /area/ruin/space/tcommsat_oldaisat // Since tcommsat was moved to /area/station/, this turf doesn't inhereit its properties anymore name = "\improper Abandoned Satellite" - ambientsounds = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen9.ogg', 'sound/ambience/ambitech.ogg',\ - 'sound/ambience/ambitech2.ogg', 'sound/ambience/ambitech3.ogg', 'sound/ambience/ambimystery.ogg') + ambientsounds = list('sound/ambience/engineering/ambisin2.ogg', 'sound/ambience/misc/signal.ogg', 'sound/ambience/misc/signal.ogg', 'sound/ambience/general/ambigen9.ogg', 'sound/ambience/engineering/ambitech.ogg',\ + 'sound/ambience/engineering/ambitech2.ogg', 'sound/ambience/engineering/ambitech3.ogg', 'sound/ambience/misc/ambimystery.ogg') airlock_wires = /datum/wires/airlock/engineering // CRASHED PRISON SHUTTLE @@ -592,7 +592,7 @@ // The planet of the clowns /area/ruin/space/has_grav/powered/clownplanet name = "\improper Clown Planet" - ambientsounds = list('sound/ambience/clown.ogg') + ambientsounds = list('sound/music/lobby_music/clown.ogg') //DERELICT SULACO /area/ruin/space/has_grav/derelictsulaco @@ -671,7 +671,7 @@ icon = 'icons/area/areas_ruins.dmi' icon_state = "ruins" requires_power = FALSE - ambientsounds = list('sound/ambience/ambigen12.ogg','sound/ambience/ambigen13.ogg','sound/ambience/ambinice.ogg') + ambientsounds = list('sound/ambience/general/ambigen12.ogg','sound/ambience/general/ambigen13.ogg','sound/ambience/medical/ambinice.ogg') // the outlet /area/ruin/space/has_grav/the_outlet/storefront diff --git a/code/game/area/areas/shuttles.dm b/code/game/area/areas/shuttles.dm index 78b887173b9..4aa54a4ef21 100644 --- a/code/game/area/areas/shuttles.dm +++ b/code/game/area/areas/shuttles.dm @@ -123,7 +123,7 @@ if(SSshuttle.arrivals?.mode == SHUTTLE_CALL) var/atom/movable/screen/splash/Spl = new(null, boarder.client, TRUE) Spl.Fade(TRUE) - boarder.playsound_local(get_turf(boarder), 'sound/voice/ApproachingTG.ogg', 25) + boarder.playsound_local(get_turf(boarder), 'sound/announcer/ApproachingTG.ogg', 25) boarder.update_parallax_teleport() diff --git a/code/game/area/areas/station/command.dm b/code/game/area/areas/station/command.dm index 23f2c7c61c0..ee4325d94ae 100644 --- a/code/game/area/areas/station/command.dm +++ b/code/game/area/areas/station/command.dm @@ -2,7 +2,7 @@ name = "Command" icon_state = "command" ambientsounds = list( - 'sound/ambience/signal.ogg', + 'sound/ambience/misc/signal.ogg', ) airlock_wires = /datum/wires/airlock/command sound_environment = SOUND_AREA_STANDARD_STATION diff --git a/code/game/area/areas/station/maintenance.dm b/code/game/area/areas/station/maintenance.dm index 53e6da606d0..5e636719e7a 100644 --- a/code/game/area/areas/station/maintenance.dm +++ b/code/game/area/areas/station/maintenance.dm @@ -5,7 +5,7 @@ airlock_wires = /datum/wires/airlock/maint sound_environment = SOUND_AREA_TUNNEL_ENCLOSED forced_ambience = TRUE - ambient_buzz = 'sound/ambience/source_corridor2.ogg' + ambient_buzz = 'sound/ambience/maintenance/source_corridor2.ogg' ambient_buzz_vol = 20 /* diff --git a/code/game/area/areas/station/medical.dm b/code/game/area/areas/station/medical.dm index fc6c6ff3a75..b45a1492b29 100644 --- a/code/game/area/areas/station/medical.dm +++ b/code/game/area/areas/station/medical.dm @@ -11,7 +11,7 @@ name = "\improper Abandoned Medbay" icon_state = "abandoned_medbay" ambientsounds = list( - 'sound/ambience/signal.ogg', + 'sound/ambience/misc/signal.ogg', ) sound_environment = SOUND_AREA_SMALL_ENCLOSED @@ -124,5 +124,5 @@ mood_bonus = 3 mood_message = "I feel at ease here." ambientsounds = list( - 'sound/ambience/aurora_caelus_short.ogg', + 'sound/ambience/aurora_caelus/aurora_caelus_short.ogg', ) diff --git a/code/game/area/areas/station/security.dm b/code/game/area/areas/station/security.dm index 93629f35628..ca158e69df8 100644 --- a/code/game/area/areas/station/security.dm +++ b/code/game/area/areas/station/security.dm @@ -79,8 +79,8 @@ name = "\improper Detective's Office" icon_state = "detective" ambientsounds = list( - 'sound/ambience/ambidet1.ogg', - 'sound/ambience/ambidet2.ogg', + 'sound/ambience/security/ambidet1.ogg', + 'sound/ambience/security/ambidet2.ogg', ) /area/station/security/detectives_office/private_investigators_office diff --git a/code/game/area/areas/station/telecomm.dm b/code/game/area/areas/station/telecomm.dm index 78ec16a59bf..02101c28c1a 100644 --- a/code/game/area/areas/station/telecomm.dm +++ b/code/game/area/areas/station/telecomm.dm @@ -5,14 +5,14 @@ /area/station/tcommsat icon_state = "tcomsatcham" ambientsounds = list( - 'sound/ambience/ambisin2.ogg', - 'sound/ambience/signal.ogg', - 'sound/ambience/signal.ogg', - 'sound/ambience/ambigen9.ogg', - 'sound/ambience/ambitech.ogg', - 'sound/ambience/ambitech2.ogg', - 'sound/ambience/ambitech3.ogg', - 'sound/ambience/ambimystery.ogg', + 'sound/ambience/engineering/ambisin2.ogg', + 'sound/ambience/misc/signal.ogg', + 'sound/ambience/misc/signal.ogg', + 'sound/ambience/general/ambigen9.ogg', + 'sound/ambience/engineering/ambitech.ogg', + 'sound/ambience/engineering/ambitech2.ogg', + 'sound/ambience/engineering/ambitech3.ogg', + 'sound/ambience/misc/ambimystery.ogg', ) airlock_wires = /datum/wires/airlock/engineering diff --git a/code/game/atom/_atom.dm b/code/game/atom/_atom.dm index e54d13c1c6f..b45912c6053 100644 --- a/code/game/atom/_atom.dm +++ b/code/game/atom/_atom.dm @@ -690,10 +690,10 @@ created_atoms.Add(created_atom) to_chat(user, span_notice("You manage to create [amount_to_create] [initial(atom_to_create.gender) == PLURAL ? "[initial(atom_to_create.name)]" : "[initial(atom_to_create.name)][plural_s(initial(atom_to_create.name))]"] from [src].")) SEND_SIGNAL(src, COMSIG_ATOM_PROCESSED, user, process_item, created_atoms) - UsedforProcessing(user, process_item, chosen_option) + UsedforProcessing(user, process_item, chosen_option, created_atoms) return -/atom/proc/UsedforProcessing(mob/living/user, obj/item/used_item, list/chosen_option) +/atom/proc/UsedforProcessing(mob/living/user, obj/item/used_item, list/chosen_option, list/created_atoms) qdel(src) return diff --git a/code/game/atom/alternate_appearance.dm b/code/game/atom/alternate_appearance.dm index 108b72b95d2..8c50760ea45 100644 --- a/code/game/atom/alternate_appearance.dm +++ b/code/game/atom/alternate_appearance.dm @@ -212,3 +212,10 @@ GLOBAL_LIST_EMPTY(active_alternate_appearances) return ..() /datum/atom_hud/alternate_appearance/basic/food_demands + +/datum/atom_hud/alternate_appearance/basic/heretic + +/datum/atom_hud/alternate_appearance/basic/heretic/mobShouldSee(mob/M) + if(IS_HERETIC(M)) + return TRUE + return FALSE diff --git a/code/game/atom/atom_defense.dm b/code/game/atom/atom_defense.dm index 0b6eb5ab649..7be7aaac395 100644 --- a/code/game/atom/atom_defense.dm +++ b/code/game/atom/atom_defense.dm @@ -115,9 +115,9 @@ 'modular_skyrat/master_files/sound/effects/metalblock7.wav', 'modular_skyrat/master_files/sound/effects/metalblock8.wav'), 50, TRUE) //SKYRAT EDIT END else - playsound(src, 'sound/weapons/tap.ogg', 50, TRUE) + playsound(src, 'sound/items/weapons/tap.ogg', 50, TRUE) if(BURN) - playsound(src.loc, 'sound/items/welder.ogg', 100, TRUE) + playsound(src.loc, 'sound/items/tools/welder.ogg', 100, TRUE) ///Called to get the damage that hulks will deal to the atom. /atom/proc/hulk_damage() diff --git a/code/game/atom/atom_examine.dm b/code/game/atom/atom_examine.dm index e728781ee01..fee219f7b4b 100644 --- a/code/game/atom/atom_examine.dm +++ b/code/game/atom/atom_examine.dm @@ -1,6 +1,14 @@ /atom - ///If non-null, overrides a/an/some in all cases + /// If non-null, overrides a/an/some in all cases var/article + /// Text that appears preceding the name in examine() + var/examine_thats = "That's" + +/mob/living/carbon/human + examine_thats = "This is" + +/mob/living/silicon/robot + examine_thats = "This is" /** * Called when a mob examines (shift click or verb) this atom @@ -11,30 +19,20 @@ * Produces a signal [COMSIG_ATOM_EXAMINE] */ /atom/proc/examine(mob/user) - var/examine_string = get_examine_string(user, thats = TRUE) - if(examine_string) - . = list("[examine_string].", EXAMINE_SECTION_BREAK) // SKYRAT EDIT CHANGE - else - . = list() - + . = list() . += get_name_chaser(user) if(desc) - . += desc + . += "[desc]" - if(custom_materials) - // SKYRAT EDIT ADDITION BEGIN - HR sections - if(length(custom_materials) > 1) - . += EXAMINE_SECTION_BREAK //SKYRAT EDIT ADDITION - //SKYRAT EDIT ADDITION END - var/list/materials_list = list() - for(var/custom_material in custom_materials) - var/datum/material/current_material = GET_MATERIAL_REF(custom_material) - materials_list += "[current_material.name]" - . += "It is made out of [english_list(materials_list)]." - // SKYRAT EDIT ADDITION BEGIN - HR sections - if(length(custom_materials) > 1) - . += EXAMINE_SECTION_BREAK //SKYRAT EDIT ADDITION - //SKYRAT EDIT ADDITION END + var/list/tags_list = examine_tags(user) + if (length(tags_list)) + var/tag_string = list() + for (var/atom_tag in tags_list) + tag_string += (isnull(tags_list[atom_tag]) ? atom_tag : span_tooltip(tags_list[atom_tag], atom_tag)) + // Weird bit but ensures that if the final element has its own "and" we don't add another one + tag_string = english_list(tag_string, and_text = (findtext(tag_string[length(tag_string)], " and ")) ? ", " : " and ") + var/post_descriptor = examine_post_descriptor(user) + . += "[p_They()] [p_are()] a [tag_string] [examine_descriptor(user)][length(post_descriptor) ? " [jointext(post_descriptor, " ")]" : ""]." if(reagents) var/user_sees_reagents = user.can_see_reagents() @@ -60,6 +58,34 @@ SEND_SIGNAL(src, COMSIG_ATOM_EXAMINE, user, .) +/* + * A list of "tags" displayed after atom's description in examine. + * This should return an assoc list of tags -> tooltips for them. If item if null, then no tooltip is assigned. + * For example: + * list("small" = "This is a small size class item.", "fireproof" = "This item is impervious to fire.") + * will result in + * This is a small, fireproof item. + * where "item" is pulled from examine_descriptor() proc + */ +/atom/proc/examine_tags(mob/user) + . = list() + SEND_SIGNAL(src, COMSIG_ATOM_EXAMINE_TAGS, user, .) + +/// What this atom should be called in examine tags +/atom/proc/examine_descriptor(mob/user) + return "object" + +/// Returns a list of strings to be displayed after the descriptor +/atom/proc/examine_post_descriptor(mob/user) + . = list() + if(!custom_materials) + return + var/mats_list = list() + for(var/custom_material in custom_materials) + var/datum/material/current_material = GET_MATERIAL_REF(custom_material) + mats_list += span_tooltip("It is made out of [current_material.name].", current_material.name) + . += "made of [english_list(mats_list)]" + /** * Called when a mob examines (shift click or verb) this atom twice (or more) within EXAMINE_MORE_WINDOW (default 1 second) * @@ -83,7 +109,7 @@ * [COMSIG_ATOM_GET_EXAMINE_NAME] signal */ /atom/proc/get_examine_name(mob/user) - var/list/override = list(article, null, "[name]") + var/list/override = list(article, null, "[get_visible_name()]") SEND_SIGNAL(src, COMSIG_ATOM_GET_EXAMINE_NAME, user, override) if(!isnull(override[EXAMINE_POSITION_ARTICLE])) @@ -92,11 +118,24 @@ if(!isnull(override[EXAMINE_POSITION_BEFORE])) override -= null // There is no article, don't try to join it return "\a [jointext(override, " ")]" - return "\a [src]" + return "\a [src]" -///Generate the full examine string of this atom (including icon for goonchat) -/atom/proc/get_examine_string(mob/user, thats = FALSE) - return "[icon2html(src, user)] [thats? "That's ":""][get_examine_name(user)]" +/mob/living/get_examine_name(mob/user) + return get_visible_name() + +/// Icon displayed in examine +/atom/proc/get_examine_icon(mob/user) + return icon2html(src, user) + +/** + * Formats the atom's name into a string for use in examine (as the "title" of the atom) + * + * * user - the mob examining the atom + * * thats - whether to include "That's", or similar (mobs use "This is") before the name + */ +/atom/proc/examine_title(mob/user, thats = FALSE) + var/examine_icon = get_examine_icon(user) + return "[examine_icon ? "[examine_icon] " : ""][thats ? "[examine_thats] ":""][get_examine_name(user)]" /** * Returns an extended list of examine strings for any contained ID cards. @@ -106,7 +145,6 @@ */ /atom/proc/get_id_examine_strings(mob/user) . = list() - return ///Used to insert text after the name but before the description in examine() /atom/proc/get_name_chaser(mob/user, list/name_chaser = list()) diff --git a/code/game/atom/atom_tool_acts.dm b/code/game/atom/atom_tool_acts.dm index abe580958a4..2ef7ab1e080 100644 --- a/code/game/atom/atom_tool_acts.dm +++ b/code/game/atom/atom_tool_acts.dm @@ -1,7 +1,7 @@ /** * ## Item interaction * - * Handles non-combat iteractions of a tool on this atom, + * Handles non-combat interactions of a tool on this atom, * such as using a tool on a wall to deconstruct it, * or scanning someone with a health analyzer */ @@ -14,7 +14,7 @@ if(tool_return) return tool_return - var/is_right_clicking = LAZYACCESS(modifiers, RIGHT_CLICK) + var/is_right_clicking = text2num(LAZYACCESS(modifiers, RIGHT_CLICK)) var/is_left_clicking = !is_right_clicking var/early_sig_return = NONE if(is_left_clicking) @@ -22,10 +22,8 @@ * This is intentionally using `||` instead of `|` to short-circuit the signal calls * This is because we want to return early if ANY of these signals return a value * - * This puts priority on the atom's signals, then the tool's signals, then the user's signals - * So stuff like storage can be handled before stuff the item wants to do like cleaner component - * - * Future idea: Being on combat mode could change/reverse the priority of these signals + * This puts priority on the atom's signals, then the tool's signals, then the user's signals, + * so we can avoid doing two interactions at once */ early_sig_return = SEND_SIGNAL(src, COMSIG_ATOM_ITEM_INTERACTION, user, tool, modifiers) \ || SEND_SIGNAL(tool, COMSIG_ITEM_INTERACTING_WITH_ATOM, user, src, modifiers) \ @@ -50,6 +48,16 @@ if(interact_return) return interact_return + // We have to manually handle storage in item_interaction because storage is blocking in 99% of interactions, which stifles a lot + // Yeah it sucks not being able to signalize this, but the other option is to have a second signal here just for storage which is also not great + if(atom_storage) + if(is_left_clicking) + if(atom_storage.insert_on_attack) + return atom_storage.item_interact_insert(user, tool) + else + if(atom_storage.open_storage(user) && atom_storage.display_contents) + return ITEM_INTERACT_SUCCESS + return NONE /** @@ -61,7 +69,7 @@ * * Handles the tool_acts in particular, such as wrenches and screwdrivers. * - * This can be overriden to handle unique "tool interactions" + * This can be overridden to handle unique "tool interactions" * IE using an item like a tool (when it's not actually one) * This is particularly useful for things that shouldn't be inserted into storage * (because tool acting runs before storage checks) @@ -325,23 +333,3 @@ /// Called on an object when a tool with analyzer capabilities is used to right click an object /atom/proc/analyzer_act_secondary(mob/living/user, obj/item/tool) return - -/** - * Called before this item is placed into a storage container - * via the item clicking on the target atom - * - * Returning FALSE will prevent the item from being stored. - */ -/obj/item/proc/storage_insert_on_interaction(datum/storage, atom/storage_holder, mob/user) - return TRUE - -/** - * Called before an item is put into this atom's storage datum via the item clicking on this atom - * - * This can be used to add item-atom interactions that you want handled before inserting something into storage - * (But it's also fairly snowflakey) - * - * Returning FALSE will block that item from being put into our storage. - */ -/atom/proc/storage_insert_on_interacted_with(datum/storage, obj/item/inserted, mob/living/user) - return TRUE diff --git a/code/game/atom/atoms_initializing_EXPENSIVE.dm b/code/game/atom/atoms_initializing_EXPENSIVE.dm index 9ce5104a935..4d539786537 100644 --- a/code/game/atom/atoms_initializing_EXPENSIVE.dm +++ b/code/game/atom/atoms_initializing_EXPENSIVE.dm @@ -56,14 +56,14 @@ * Called when an atom is created in byond (built in engine proc) * * Not a lot happens here in SS13 code, as we offload most of the work to the - * [Intialization][/atom/proc/Initialize] proc, mostly we run the preloader + * [Initialization][/atom/proc/Initialize] proc, mostly we run the preloader * if the preloader is being used and then call [InitAtom][/datum/controller/subsystem/atoms/proc/InitAtom] of which the ultimate - * result is that the Intialize proc is called. + * result is that the Initialize proc is called. * */ /atom/New(loc, ...) //atom creation method that preloads variables at creation - if(GLOB.use_preloader && src.type == GLOB._preloader_path)//in case the instanciated atom is creating other atoms in New() + if(GLOB.use_preloader && src.type == GLOB._preloader_path)//in case the instantiated atom is creating other atoms in New() world.preloader_load(src) var/do_initialize = SSatoms.initialized @@ -79,17 +79,17 @@ * we don't use New as we have better control over when this is called and we can choose * to delay calls or hook other logic in and so forth * - * During roundstart map parsing, atoms are queued for intialization in the base atom/New(), - * After the map has loaded, then Initalize is called on all atoms one by one. NB: this - * is also true for loading map templates as well, so they don't Initalize until all objects + * During roundstart map parsing, atoms are queued for initialization in the base atom/New(), + * After the map has loaded, then Initialize is called on all atoms one by one. NB: this + * is also true for loading map templates as well, so they don't Initialize until all objects * in the map file are parsed and present in the world * * If you're creating an object at any point after SSInit has run then this proc will be * immediately be called from New. * - * mapload: This parameter is true if the atom being loaded is either being intialized during - * the Atom subsystem intialization, or if the atom is being loaded from the map template. - * If the item is being created at runtime any time after the Atom subsystem is intialized then + * mapload: This parameter is true if the atom being loaded is either being initialized during + * the Atom subsystem initialization, or if the atom is being loaded from the map template. + * If the item is being created at runtime any time after the Atom subsystem is initialized then * it's false. * * The mapload argument occupies the same position as loc when Initialize() is called by New(). @@ -97,7 +97,7 @@ * with mapload at the end of atom/New() before this proc (atom/Initialize()) is called. * * You must always call the parent of this proc, otherwise failures will occur as the item - * will not be seen as initalized (this can lead to all sorts of strange behaviour, like + * will not be seen as initialized (this can lead to all sorts of strange behaviour, like * the item being completely unclickable) * * You must not sleep in this proc, or any subprocs @@ -135,7 +135,7 @@ if(uses_integrity) atom_integrity = max_integrity - TEST_ONLY_ASSERT((!armor || istype(armor)), "[type] has an armor that contains an invalid value at intialize") + TEST_ONLY_ASSERT((!armor || istype(armor)), "[type] has an armor that contains an invalid value at initialize") // apply materials properly from the default custom_materials value // This MUST come after atom_integrity is set above, as if old materials get removed, @@ -149,14 +149,14 @@ return INITIALIZE_HINT_NORMAL /** - * Late Intialization, for code that should run after all atoms have run Intialization + * Late Initialization, for code that should run after all atoms have run Initialization * - * To have your LateIntialize proc be called, your atoms [Initalization][/atom/proc/Initialize] + * To have your LateIntialize proc be called, your atoms [Initialization][/atom/proc/Initialize] * proc must return the hint * [INITIALIZE_HINT_LATELOAD] otherwise it will never be called. * * useful for doing things like finding other machines on GLOB.machines because you can guarantee - * that all atoms will actually exist in the "WORLD" at this time and that all their Intialization + * that all atoms will actually exist in the "WORLD" at this time and that all their Initialization * code has been run */ /atom/proc/LateInitialize() diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 662599854db..b0530b1595e 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -17,7 +17,7 @@ var/tk_throw_range = 10 var/mob/pulledby = null /// What language holder type to init as - var/initial_language_holder = /datum/language_holder + var/initial_language_holder = /datum/language_holder/atom_basic /// Holds all languages this mob can speak and understand VAR_PRIVATE/datum/language_holder/language_holder /// The list of factions this atom belongs to @@ -33,8 +33,10 @@ var/speech_span ///Are we moving with inertia? Mostly used as an optimization var/inertia_moving = FALSE - ///Delay in deciseconds between inertia based movement - var/inertia_move_delay = 5 + ///Multiplier for inertia based movement in space + var/inertia_move_multiplier = 1 + ///Object "weight", higher weight reduces acceleration applied to the object + var/inertia_force_weight = 1 ///The last time we pushed off something ///This is a hack to get around dumb him him me scenarios var/last_pushoff @@ -110,6 +112,9 @@ /// The pitch adjustment that this movable uses when speaking. var/pitch = 0 + /// Datum that keeps all data related to zero-g drifting and handles related code/comsigs + var/datum/drift_handler/drift_handler + /// The filter to apply to the voice when processing the TTS audio message. var/voice_filter = "" @@ -201,6 +206,7 @@ /atom/movable/Destroy(force) QDEL_NULL(language_holder) QDEL_NULL(em_block) + QDEL_NULL(drift_handler) unbuckle_all_mobs(force = TRUE) @@ -462,7 +468,7 @@ var/static/list/not_falsey_edits = list(NAMEOF_STATIC(src, bound_width) = TRUE, NAMEOF_STATIC(src, bound_height) = TRUE) if(banned_edits[var_name]) return FALSE //PLEASE no. - if(careful_edits[var_name] && (var_value % world.icon_size) != 0) + if(careful_edits[var_name] && (var_value % ICON_SIZE_ALL) != 0) return FALSE if(not_falsey_edits[var_name] && !var_value) return FALSE @@ -776,7 +782,7 @@ if(!. && set_dir_on_move && update_dir && !face_mouse) // SKYRAT EDIT CHANGE - && !face_mouse setDir(first_step_dir) else if(!inertia_moving) - newtonian_move(direct) + newtonian_move(dir2angle(direct)) if(client_mobs_in_contents) update_parallax_contents() moving_diagonally = 0 @@ -850,8 +856,8 @@ /atom/movable/proc/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) SHOULD_CALL_PARENT(TRUE) - if (!inertia_moving && momentum_change) - newtonian_move(movement_dir) + if (!moving_diagonally && !inertia_moving && momentum_change && movement_dir) + newtonian_move(dir2angle(movement_dir)) // If we ain't moving diagonally right now, update our parallax // We don't do this all the time because diag movements should trigger one call to this, not two // Waste of cpu time, and it fucks the animate @@ -1129,7 +1135,7 @@ RESOLVE_ACTIVE_MOVEMENT var/atom/oldloc = loc - var/is_multi_tile = bound_width > world.icon_size || bound_height > world.icon_size + var/is_multi_tile = bound_width > ICON_SIZE_X || bound_height > ICON_SIZE_Y SET_ACTIVE_MOVEMENT(oldloc, NONE, TRUE, null) @@ -1152,8 +1158,8 @@ var/list/new_locs = block( destination, locate( - min(world.maxx, destination.x + ROUND_UP(bound_width / 32)), - min(world.maxy, destination.y + ROUND_UP(bound_height / 32)), + min(world.maxx, destination.x + ROUND_UP(bound_width / ICON_SIZE_X)), + min(world.maxy, destination.y + ROUND_UP(bound_height / ICON_SIZE_Y)), destination.z ) ) @@ -1273,15 +1279,19 @@ /// Only moves the object if it's under no gravity /// Accepts the direction to move, if the push should be instant, and an optional parameter to fine tune the start delay -/atom/movable/proc/newtonian_move(direction, instant = FALSE, start_delay = 0) - if(!isturf(loc) || Process_Spacemove(direction, continuous_move = TRUE)) +/// Drift force determines how much acceleration should be applied. Controlled cap, if set, will ensure that if the object was moving slower than the cap before, it cannot accelerate past the cap from this move. +/atom/movable/proc/newtonian_move(inertia_angle, instant = FALSE, start_delay = 0, drift_force = 1 NEWTONS, controlled_cap = null) + if(!isturf(loc) || Process_Spacemove(angle2dir(inertia_angle), continuous_move = TRUE)) return FALSE - if(SEND_SIGNAL(src, COMSIG_MOVABLE_NEWTONIAN_MOVE, direction, start_delay) & COMPONENT_MOVABLE_NEWTONIAN_BLOCK) - return TRUE - - AddComponent(/datum/component/drift, direction, instant, start_delay) + if (!isnull(drift_handler)) + if (drift_handler.newtonian_impulse(inertia_angle, start_delay, drift_force, controlled_cap)) + return TRUE + new /datum/drift_handler(src, inertia_angle, instant, start_delay, drift_force) + // Something went wrong and it failed to create itself, most likely we have a higher priority loop already + if (QDELETED(drift_handler)) + return FALSE return TRUE /atom/movable/set_explosion_block(explosion_block) @@ -1462,6 +1472,7 @@ return /atom/movable/proc/get_spacemove_backup() + var/atom/secondary_backup for(var/checked_range in orange(1, get_turf(src))) if(isarea(checked_range)) continue @@ -1469,12 +1480,18 @@ var/turf/turf = checked_range if(!turf.density) continue - return turf + if (get_dir(src, turf) in GLOB.cardinals) + return turf + secondary_backup = turf + continue var/atom/movable/checked_atom = checked_range if(checked_atom.density || !checked_atom.CanPass(src, get_dir(src, checked_atom))) if(checked_atom.last_pushoff == world.time) continue - return checked_atom + if (get_dir(src, checked_atom) in GLOB.cardinals) + return checked_atom + secondary_backup = checked_atom + return secondary_backup ///called when a mob resists while inside a container that is itself inside something. /atom/movable/proc/relay_container_resist_act(mob/living/user, obj/container) diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm index 40073607753..800997d24a8 100644 --- a/code/game/data_huds.dm +++ b/code/game/data_huds.dm @@ -175,7 +175,7 @@ Medical HUD! Basic mode needs suit sensors on. holder.icon_state = "hud[RoundHealth(src)]" var/icon/I = icon(icon, icon_state, dir) - holder.pixel_y = I.Height() - world.icon_size + holder.pixel_y = I.Height() - ICON_SIZE_Y //for carbon suit sensors /mob/living/carbon/med_hud_set_health() @@ -188,7 +188,7 @@ Medical HUD! Basic mode needs suit sensors on. return var/icon/I = icon(icon, icon_state, dir) - holder.pixel_y = I.Height() - world.icon_size + holder.pixel_y = I.Height() - ICON_SIZE_Y if(stat == DEAD || (HAS_TRAIT(src, TRAIT_FAKEDEATH))) holder.icon_state = "huddead" else @@ -201,7 +201,7 @@ Medical HUD! Basic mode needs suit sensors on. var/icon/I = icon(icon, icon_state, dir) var/virus_threat = check_virus() - holder.pixel_y = I.Height() - world.icon_size + holder.pixel_y = I.Height() - ICON_SIZE_Y if(HAS_TRAIT(src, TRAIT_XENO_HOST)) holder.icon_state = "hudxeno" else if(stat == DEAD || (HAS_TRAIT(src, TRAIT_FAKEDEATH))) @@ -244,7 +244,7 @@ FAN HUDs! For identifying other fans on-sight. /mob/living/carbon/human/proc/fan_hud_set_fandom() var/image/holder = hud_list[FAN_HUD] var/icon/hud_icon = icon(icon, icon_state, dir) - holder.pixel_y = hud_icon.Height() - world.icon_size + holder.pixel_y = hud_icon.Height() - ICON_SIZE_Y holder.icon_state = "hudfan_no" var/obj/item/clothing/under/undershirt = w_uniform @@ -275,7 +275,7 @@ Security HUDs! Basic mode shows only the job. /mob/living/carbon/human/proc/sec_hud_set_ID() var/image/holder = hud_list[ID_HUD] var/icon/I = icon(icon, icon_state, dir) - holder.pixel_y = I.Height() - world.icon_size + holder.pixel_y = I.Height() - ICON_SIZE_Y var/sechud_icon_state = wear_id?.get_sechud_job_icon_state() if(!sechud_icon_state || HAS_TRAIT(src, TRAIT_UNKNOWN)) sechud_icon_state = "hudno_id" @@ -304,7 +304,7 @@ Security HUDs! Basic mode shows only the job. if(1) holder = hud_list[IMPSEC_FIRST_HUD] var/icon/IC = icon(icon, icon_state, dir) - holder.pixel_y = IC.Height() - world.icon_size + holder.pixel_y = IC.Height() - ICON_SIZE_Y holder.icon_state = current_implant.hud_icon_state set_hud_image_active(IMPSEC_FIRST_HUD) security_slot++ @@ -312,22 +312,22 @@ Security HUDs! Basic mode shows only the job. if(2) //Theoretically if we somehow get multiple sec implants, whatever the most recently implanted implant is will take over the 2nd position holder = hud_list[IMPSEC_SECOND_HUD] var/icon/IC = icon(icon, icon_state, dir) - holder.pixel_y = IC.Height() - world.icon_size - holder.pixel_x = initial(holder.pixel_x) + 7 //Adds an offset that mirrors the hud blip to the other side of the mob. + holder.pixel_y = IC.Height() - ICON_SIZE_Y + holder.pixel_x = initial(holder.pixel_x) + (ICON_SIZE_X / 4 - 1) //Adds an offset that mirrors the hud blip to the other side of the mob. holder.icon_state = current_implant.hud_icon_state set_hud_image_active(IMPSEC_SECOND_HUD) if(HAS_TRAIT(src, TRAIT_MINDSHIELD)) holder = hud_list[IMPLOYAL_HUD] var/icon/IC = icon(icon, icon_state, dir) - holder.pixel_y = IC.Height() - world.icon_size + holder.pixel_y = IC.Height() - ICON_SIZE_Y holder.icon_state = "hud_imp_loyal" set_hud_image_active(IMPLOYAL_HUD) /mob/living/carbon/human/proc/sec_hud_set_security_status() var/image/holder = hud_list[WANTED_HUD] var/icon/sec_icon = icon(icon, icon_state, dir) - holder.pixel_y = sec_icon.Height() - world.icon_size + holder.pixel_y = sec_icon.Height() - ICON_SIZE_Y if (HAS_TRAIT(src, TRAIT_ALWAYS_WANTED)) holder.icon_state = "hudwanted" @@ -404,7 +404,7 @@ Diagnostic HUDs! /mob/living/silicon/proc/diag_hud_set_health() var/image/holder = hud_list[DIAG_HUD] var/icon/I = icon(icon, icon_state, dir) - holder.pixel_y = I.Height() - world.icon_size + holder.pixel_y = I.Height() - ICON_SIZE_Y if(stat == DEAD) holder.icon_state = "huddiagdead" else @@ -413,7 +413,7 @@ Diagnostic HUDs! /mob/living/silicon/proc/diag_hud_set_status() var/image/holder = hud_list[DIAG_STAT_HUD] var/icon/I = icon(icon, icon_state, dir) - holder.pixel_y = I.Height() - world.icon_size + holder.pixel_y = I.Height() - ICON_SIZE_Y switch(stat) if(CONSCIOUS) holder.icon_state = "hudstat" @@ -426,7 +426,7 @@ Diagnostic HUDs! /mob/living/silicon/robot/proc/diag_hud_set_borgcell() var/image/holder = hud_list[DIAG_BATT_HUD] var/icon/I = icon(icon, icon_state, dir) - holder.pixel_y = I.Height() - world.icon_size + holder.pixel_y = I.Height() - ICON_SIZE_Y if(cell) var/chargelvl = (cell.charge/cell.maxcharge) holder.icon_state = "hudbatt[RoundDiagBar(chargelvl)]" @@ -437,7 +437,7 @@ Diagnostic HUDs! /mob/living/silicon/robot/proc/diag_hud_set_aishell() //Shows tracking beacons on the mech var/image/holder = hud_list[DIAG_TRACK_HUD] var/icon/I = icon(icon, icon_state, dir) - holder.pixel_y = I.Height() - world.icon_size + holder.pixel_y = I.Height() - ICON_SIZE_Y if(!shell) //Not an AI shell holder.icon_state = null set_hud_image_inactive(DIAG_TRACK_HUD) @@ -452,7 +452,7 @@ Diagnostic HUDs! /mob/living/silicon/ai/proc/diag_hud_set_deployed() //Shows tracking beacons on the mech var/image/holder = hud_list[DIAG_TRACK_HUD] var/icon/I = icon(icon, icon_state, dir) - holder.pixel_y = I.Height() - world.icon_size + holder.pixel_y = I.Height() - ICON_SIZE_Y if(!deployed_shell) holder.icon_state = null set_hud_image_inactive(DIAG_TRACK_HUD) @@ -466,14 +466,14 @@ Diagnostic HUDs! /obj/vehicle/sealed/mecha/proc/diag_hud_set_mechhealth() var/image/holder = hud_list[DIAG_MECH_HUD] var/icon/I = icon(icon, icon_state, dir) - holder.pixel_y = I.Height() - world.icon_size + holder.pixel_y = I.Height() - ICON_SIZE_Y holder.icon_state = "huddiag[RoundDiagBar(atom_integrity/max_integrity)]" /obj/vehicle/sealed/mecha/proc/diag_hud_set_mechcell() var/image/holder = hud_list[DIAG_BATT_HUD] var/icon/I = icon(icon, icon_state, dir) - holder.pixel_y = I.Height() - world.icon_size + holder.pixel_y = I.Height() - ICON_SIZE_Y if(cell) var/chargelvl = cell.charge/cell.maxcharge holder.icon_state = "hudbatt[RoundDiagBar(chargelvl)]" @@ -483,7 +483,7 @@ Diagnostic HUDs! /obj/vehicle/sealed/mecha/proc/diag_hud_set_mechstat() var/image/holder = hud_list[DIAG_STAT_HUD] var/icon/I = icon(icon, icon_state, dir) - holder.pixel_y = I.Height() - world.icon_size + holder.pixel_y = I.Height() - ICON_SIZE_Y if(internal_damage) holder.icon_state = "hudwarn" set_hud_image_active(DIAG_STAT_HUD) @@ -495,7 +495,7 @@ Diagnostic HUDs! /obj/vehicle/sealed/mecha/proc/diag_hud_set_mechtracking() var/image/holder = hud_list[DIAG_TRACK_HUD] var/icon/I = icon(icon, icon_state, dir) - holder.pixel_y = I.Height() - world.icon_size + holder.pixel_y = I.Height() - ICON_SIZE_Y var/new_icon_state //This var exists so that the holder's icon state is set only once in the event of multiple mech beacons. for(var/obj/item/mecha_parts/mecha_tracking/T in trackers) if(T.ai_beacon) //Beacon with AI uplink @@ -509,7 +509,7 @@ Diagnostic HUDs! /obj/vehicle/sealed/mecha/proc/diag_hud_set_camera() var/image/holder = hud_list[DIAG_CAMERA_HUD] var/icon/I = icon(icon, icon_state, dir) - holder.pixel_y = I.Height() - world.icon_size + holder.pixel_y = I.Height() - ICON_SIZE_Y if(chassis_camera?.is_emp_scrambled) holder.icon_state = "hudcamera_empd" return @@ -521,13 +521,13 @@ Diagnostic HUDs! /mob/living/simple_animal/bot/proc/diag_hud_set_bothealth() var/image/holder = hud_list[DIAG_HUD] var/icon/I = icon(icon, icon_state, dir) - holder.pixel_y = I.Height() - world.icon_size + holder.pixel_y = I.Height() - ICON_SIZE_Y holder.icon_state = "huddiag[RoundDiagBar(health/maxHealth)]" /mob/living/simple_animal/bot/proc/diag_hud_set_botstat() //On (With wireless on or off), Off, EMP'ed var/image/holder = hud_list[DIAG_STAT_HUD] var/icon/I = icon(icon, icon_state, dir) - holder.pixel_y = I.Height() - world.icon_size + holder.pixel_y = I.Height() - ICON_SIZE_Y if(bot_mode_flags & BOT_MODE_ON) holder.icon_state = "hudstat" else if(stat) //Generally EMP causes this @@ -538,7 +538,7 @@ Diagnostic HUDs! /mob/living/simple_animal/bot/proc/diag_hud_set_botmode() //Shows a bot's current operation var/image/holder = hud_list[DIAG_BOT_HUD] var/icon/I = icon(icon, icon_state, dir) - holder.pixel_y = I.Height() - world.icon_size + holder.pixel_y = I.Height() - ICON_SIZE_Y if(client) //If the bot is player controlled, it will not be following mode logic! holder.icon_state = "hudsentient" return @@ -560,7 +560,7 @@ Diagnostic HUDs! /mob/living/simple_animal/bot/mulebot/proc/diag_hud_set_mulebotcell() var/image/holder = hud_list[DIAG_BATT_HUD] var/icon/I = icon(icon, icon_state, dir) - holder.pixel_y = I.Height() - world.icon_size + holder.pixel_y = I.Height() - ICON_SIZE_Y if(cell) var/chargelvl = (cell.charge/cell.maxcharge) holder.icon_state = "hudbatt[RoundDiagBar(chargelvl)]" diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 4e7410eef67..c048e21fedc 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -364,7 +364,7 @@ GLOBAL_LIST_EMPTY(objectives) //SKYRAT EDIT ADDITION return FALSE if(human_check) brain_target = target.current?.get_organ_slot(ORGAN_SLOT_BRAIN) - //Protect will always suceed when someone suicides + //Protect will always succeed when someone suicides return !target || (target.current && HAS_TRAIT(target.current, TRAIT_SUICIDED)) || considered_alive(target, enforce_human = human_check) || (brain_target && HAS_TRAIT(brain_target, TRAIT_SUICIDED)) /datum/objective/protect/update_explanation_text() diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index 8a7e9846561..34b8612c2d4 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -1147,6 +1147,9 @@ if(0 to 25) . += span_warning("It's falling apart!") +/obj/machinery/examine_descriptor(mob/user) + return "machine" + /obj/machinery/examine_more(mob/user) . = ..() if(HAS_TRAIT(user, TRAIT_RESEARCH_SCANNER) && component_parts) diff --git a/code/game/machinery/announcement_system.dm b/code/game/machinery/announcement_system.dm index 1700abb0af1..029f4a17ea9 100644 --- a/code/game/machinery/announcement_system.dm +++ b/code/game/machinery/announcement_system.dm @@ -16,16 +16,26 @@ GLOBAL_LIST_EMPTY(announcement_systems) circuit = /obj/item/circuitboard/machine/announcement_system + ///The headset that we use for broadcasting var/obj/item/radio/headset/radio + ///The message that we send when someone is joining. var/arrival = "%PERSON has signed up as %RANK" - var/arrivalToggle = 1 + ///Whether the arrival message is sent + var/arrival_toggle = TRUE + ///The message that we send when a department head arrives. var/newhead = "%PERSON, %RANK, is the department head." - var/newheadToggle = 1 + ///Whether the newhead message is sent. + var/newhead_toggle = TRUE var/greenlight = "Light_Green" var/pinklight = "Light_Pink" var/errorlight = "Error_Red" + ///If true, researched nodes will be announced to the appropriate channels + var/announce_research_node = TRUE + /// The text that we send when announcing researched nodes. + var/node_message = "The '%NODE' techweb node has been researched" + /obj/machinery/announcement_system/Initialize(mapload) . = ..() GLOB.announcement_systems += src @@ -41,10 +51,10 @@ GLOBAL_LIST_EMPTY(announcement_systems) /obj/machinery/announcement_system/update_overlays() . = ..() - if(arrivalToggle) + if(arrival_toggle) . += greenlight - if(newheadToggle) + if(newhead_toggle) . += pinklight if(machine_stat & BROKEN) @@ -78,18 +88,25 @@ GLOBAL_LIST_EMPTY(announcement_systems) str = replacetext(str, "%RANK", "[rank]") return str -/obj/machinery/announcement_system/proc/announce(message_type, user, rank, list/channels) +/obj/machinery/announcement_system/proc/announce(message_type, target, rank, list/channels) if(!is_operational) return var/message - if(message_type == "ARRIVAL" && arrivalToggle) - message = CompileText(arrival, user, rank) - else if(message_type == "NEWHEAD" && newheadToggle) - message = CompileText(newhead, user, rank) - else if(message_type == "ARRIVALS_BROKEN") - message = "The arrivals shuttle has been damaged. Docking for repairs..." + switch(message_type) + if(AUTO_ANNOUNCE_ARRIVAL) + if(!arrival_toggle) + return + message = CompileText(arrival, target, rank) + if(AUTO_ANNOUNCE_NEWHEAD) + if(!newhead_toggle) + return + message = CompileText(newhead, target, rank) + if(AUTO_ANNOUNCE_ARRIVALS_BROKEN) + message = "The arrivals shuttle has been damaged. Docking for repairs..." + if(AUTO_ANNOUNCE_NODE) + message = replacetext(node_message, "%NODE", target) broadcast(message, channels) @@ -118,9 +135,11 @@ GLOBAL_LIST_EMPTY(announcement_systems) /obj/machinery/announcement_system/ui_data() var/list/data = list() data["arrival"] = arrival - data["arrivalToggle"] = arrivalToggle + data["arrivalToggle"] = arrival_toggle data["newhead"] = newhead - data["newheadToggle"] = newheadToggle + data["newheadToggle"] = newhead_toggle + data["node_message"] = node_message + data["node_toggle"] = announce_research_node return data /obj/machinery/announcement_system/ui_act(action, param) @@ -131,29 +150,32 @@ GLOBAL_LIST_EMPTY(announcement_systems) return if(machine_stat & BROKEN) visible_message(span_warning("[src] buzzes."), span_hear("You hear a faint buzz.")) - playsound(src.loc, 'sound/machines/buzz-two.ogg', 50, TRUE) + playsound(src.loc, 'sound/machines/buzz/buzz-two.ogg', 50, TRUE) return switch(action) if("ArrivalText") - var/NewMessage = trim(html_encode(param["newText"]), MAX_MESSAGE_LEN) - if(!usr.can_perform_action(src, ALLOW_SILICON_REACH)) - return - if(NewMessage) - arrival = NewMessage - usr.log_message("updated the arrivals announcement to: [NewMessage]", LOG_GAME) + var/new_message = trim(html_encode(param["newText"]), MAX_MESSAGE_LEN) + if(new_message) + arrival = new_message + usr.log_message("updated the arrivals announcement to: [new_message]", LOG_GAME) if("NewheadText") - var/NewMessage = trim(html_encode(param["newText"]), MAX_MESSAGE_LEN) - if(!usr.can_perform_action(src, ALLOW_SILICON_REACH)) - return - if(NewMessage) - newhead = NewMessage - usr.log_message("updated the head announcement to: [NewMessage]", LOG_GAME) - if("NewheadToggle") - newheadToggle = !newheadToggle + var/new_message = trim(html_encode(param["newText"]), MAX_MESSAGE_LEN) + if(new_message) + newhead = new_message + usr.log_message("updated the head announcement to: [new_message]", LOG_GAME) + if("node_message") + var/new_message = trim(html_encode(param["new_text"]), MAX_MESSAGE_LEN) + if(new_message) + node_message = new_message + usr.log_message("updated the researched node announcement to: [node_message]", LOG_GAME) + if("newhead_toggle") + newhead_toggle = !newhead_toggle update_appearance() - if("ArrivalToggle") - arrivalToggle = !arrivalToggle + if("arrivalToggle") + arrival_toggle = !arrival_toggle update_appearance() + if("node_toggle") + announce_research_node = !announce_research_node add_fingerprint(usr) /obj/machinery/announcement_system/attack_robot(mob/living/silicon/user) @@ -173,6 +195,11 @@ GLOBAL_LIST_EMPTY(announcement_systems) arrival = pick("#!@%ERR-34%2 CANNOT LOCAT@# JO# F*LE!", "CRITICAL ERROR 99.", "ERR)#: DA#AB@#E NOT F(*ND!") newhead = pick("OV#RL()D: \[UNKNOWN??\] DET*#CT)D!", "ER)#R - B*@ TEXT F*O(ND!", "AAS.exe is not responding. NanoOS is searching for a solution to the problem.") + node_message = pick(list( + replacetext(/obj/machinery/announcement_system::node_message, "%NODE", /datum/techweb_node/mech_clown::display_name), + "R/NT1M3 A= ANNOUN-*#nt_SY!?EM.dm, LI%£ 86: N=0DE NULL!", + "BEPIS BEPIS BEPIS", + )) /obj/machinery/announcement_system/emp_act(severity) . = ..() diff --git a/code/game/machinery/bank_machine.dm b/code/game/machinery/bank_machine.dm index 40670a22f44..72de51d034f 100644 --- a/code/game/machinery/bank_machine.dm +++ b/code/game/machinery/bank_machine.dm @@ -73,7 +73,7 @@ end_siphon() return - playsound(src, 'sound/items/poster_being_created.ogg', 100, TRUE) + playsound(src, 'sound/items/poster/poster_being_created.ogg', 100, TRUE) syphoning_credits += siphon_am synced_bank_account.adjust_money(-siphon_am) if(next_warning < world.time && prob(15)) diff --git a/code/game/machinery/barsigns.dm b/code/game/machinery/barsigns.dm index 11dc005269b..0f33028aa9a 100644 --- a/code/game/machinery/barsigns.dm +++ b/code/game/machinery/barsigns.dm @@ -102,9 +102,9 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/barsign, 32) /obj/machinery/barsign/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) switch(damage_type) if(BRUTE) - playsound(src.loc, 'sound/effects/glasshit.ogg', 75, TRUE) + playsound(src.loc, 'sound/effects/glass/glasshit.ogg', 75, TRUE) if(BURN) - playsound(src.loc, 'sound/items/welder.ogg', 100, TRUE) + playsound(src.loc, 'sound/items/tools/welder.ogg', 100, TRUE) /obj/machinery/barsign/attack_ai(mob/user) return attack_hand(user) diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 6f21e9303fc..f3760fda031 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -133,8 +133,6 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/xray, 0) find_and_hang_on_wall(directional = TRUE, \ custom_drop_callback = CALLBACK(src, PROC_REF(deconstruct), FALSE)) - RegisterSignal(src, COMSIG_HIT_BY_SABOTEUR, PROC_REF(on_saboteur)) - /obj/machinery/camera/Destroy(force) if(can_use()) toggle_cam(null, 0) //kick anyone viewing out and remove from the camera chunks @@ -235,11 +233,11 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/xray, 0) M.reset_perspective(null) to_chat(M, span_warning("The screen bursts into static!")) -/obj/machinery/camera/proc/on_saboteur(datum/source, disrupt_duration) - SIGNAL_HANDLER +/obj/machinery/camera/on_saboteur(datum/source, 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 + return TRUE /obj/machinery/camera/proc/post_emp_reset(thisemp, previous_network) if(QDELETED(src)) @@ -368,7 +366,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/xray, 0) else visible_message(span_danger("\The [src] [change_msg]!")) - playsound(src, 'sound/items/wirecutter.ogg', 100, TRUE) + playsound(src, 'sound/items/tools/wirecutter.ogg', 100, TRUE) update_appearance() //update Initialize() if you remove this. // now disconnect anyone using the camera diff --git a/code/game/machinery/camera/camera_construction.dm b/code/game/machinery/camera/camera_construction.dm index 15f22d02cbe..d6988617e1f 100644 --- a/code/game/machinery/camera/camera_construction.dm +++ b/code/game/machinery/camera/camera_construction.dm @@ -30,7 +30,7 @@ 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") + 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", max_length = MAX_NAME_LEN) if(isnull(input)) return ITEM_INTERACT_BLOCKING var/list/tempnetwork = splittext(input, ",") diff --git a/code/game/machinery/civilian_bounties.dm b/code/game/machinery/civilian_bounties.dm index 7760a646d9f..d8c8a98caef 100644 --- a/code/game/machinery/civilian_bounties.dm +++ b/code/game/machinery/civilian_bounties.dm @@ -76,11 +76,11 @@ return FALSE if(!inserted_scan_id) status_report = "Please insert your ID first." - playsound(loc, 'sound/machines/synth_no.ogg', 30 , TRUE) + playsound(loc, 'sound/machines/synth/synth_no.ogg', 30 , TRUE) return FALSE if(!inserted_scan_id.registered_account.civilian_bounty) status_report = "Please accept a new civilian bounty first." - playsound(loc, 'sound/machines/synth_no.ogg', 30 , TRUE) + playsound(loc, 'sound/machines/synth/synth_no.ogg', 30 , TRUE) return FALSE status_report = "Civilian Bounty: " var/obj/machinery/piratepad/civilian/pad = pad_ref?.resolve() @@ -89,10 +89,10 @@ continue if(inserted_scan_id.registered_account.civilian_bounty.applies_to(AM)) status_report += "Target Applicable." - playsound(loc, 'sound/machines/synth_yes.ogg', 30 , TRUE) + playsound(loc, 'sound/machines/synth/synth_yes.ogg', 30 , TRUE) return status_report += "Not Applicable." - playsound(loc, 'sound/machines/synth_no.ogg', 30 , TRUE) + playsound(loc, 'sound/machines/synth/synth_no.ogg', 30 , TRUE) /** * This fully rewrites base behavior in order to only check for bounty objects, and no other types of objects like pirate-pads do. @@ -135,7 +135,7 @@ pad.visible_message(span_notice("[pad] activates!")) flick(pad.sending_state,pad) pad.icon_state = pad.idle_state - playsound(loc, 'sound/machines/synth_yes.ogg', 30 , TRUE) + playsound(loc, 'sound/machines/synth/synth_yes.ogg', 30 , TRUE) sending = FALSE ///Here is where cargo bounties are added to the player's bank accounts, then adjusted and scaled into a civilian bounty. @@ -164,7 +164,7 @@ */ /obj/machinery/computer/piratepad_control/civilian/proc/pick_bounty(datum/bounty/choice) if(!inserted_scan_id || !inserted_scan_id.registered_account || !inserted_scan_id.registered_account.bounties || !inserted_scan_id.registered_account.bounties[choice]) - playsound(loc, 'sound/machines/synth_no.ogg', 40 , TRUE) + playsound(loc, 'sound/machines/synth/synth_no.ogg', 40 , TRUE) return inserted_scan_id.registered_account.civilian_bounty = inserted_scan_id.registered_account.bounties[choice] inserted_scan_id.registered_account.bounties = null @@ -242,13 +242,13 @@ if(target) if(holder_item && inserting_item.InsertID(target)) - playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) + playsound(src, 'sound/machines/terminal/terminal_insert_disc.ogg', 50, FALSE) else id_eject(user, target) user.visible_message(span_notice("[user] inserts \the [card_to_insert] into \the [src]."), span_notice("You insert \the [card_to_insert] into \the [src].")) - playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) + playsound(src, 'sound/machines/terminal/terminal_insert_disc.ogg', 50, FALSE) ui_interact(user) return TRUE @@ -263,7 +263,7 @@ user.put_in_hands(target) user.visible_message(span_notice("[user] gets \the [target] from \the [src]."), \ span_notice("You get \the [target] from \the [src].")) - playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) + playsound(src, 'sound/machines/terminal/terminal_insert_disc.ogg', 50, FALSE) inserted_scan_id = null return TRUE diff --git a/code/game/machinery/computer/_computer.dm b/code/game/machinery/computer/_computer.dm index e37e915aff6..2066a40b4c5 100644 --- a/code/game/machinery/computer/_computer.dm +++ b/code/game/machinery/computer/_computer.dm @@ -75,16 +75,16 @@ if(machine_stat & BROKEN) playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 70, TRUE) else - playsound(src.loc, 'sound/effects/glasshit.ogg', 75, TRUE) + playsound(src.loc, 'sound/effects/glass/glasshit.ogg', 75, TRUE) if(BURN) - playsound(src.loc, 'sound/items/welder.ogg', 100, TRUE) + playsound(src.loc, 'sound/items/tools/welder.ogg', 100, TRUE) /obj/machinery/computer/atom_break(damage_flag) if(!circuit) //no circuit, no breaking return . = ..() if(.) - playsound(loc, 'sound/effects/glassbr3.ogg', 100, TRUE) + playsound(loc, 'sound/effects/glass/glassbr3.ogg', 100, TRUE) set_light(0) /obj/machinery/computer/proc/imprint_gps(gps_tag) // Currently used by the upload computers and communications console diff --git a/code/game/machinery/computer/aifixer.dm b/code/game/machinery/computer/aifixer.dm index e0a7f364600..0b28775a5b8 100644 --- a/code/game/machinery/computer/aifixer.dm +++ b/code/game/machinery/computer/aifixer.dm @@ -58,7 +58,7 @@ if("PRG_beginReconstruction") if(occupier?.health < 100) to_chat(usr, span_notice("Reconstruction in progress. This will take several minutes.")) - playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 25, FALSE) + playsound(src, 'sound/machines/terminal/terminal_prompt_confirm.ogg', 25, FALSE) restoring = TRUE occupier.notify_revival("Your core files are being restored!", source = src) . = TRUE diff --git a/code/game/machinery/computer/apc_control.dm b/code/game/machinery/computer/apc_control.dm index 97bf368d3e2..efb3f448033 100644 --- a/code/game/machinery/computer/apc_control.dm +++ b/code/game/machinery/computer/apc_control.dm @@ -57,7 +57,7 @@ return if(active_apc) disconnect_apc() - playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE) + playsound(src, 'sound/machines/terminal/terminal_prompt_confirm.ogg', 50, FALSE) apc.connect_remote_access(user) user.log_message("remotely accessed [apc] from [src].", LOG_GAME) log_activity("[auth_id] remotely accessed APC in [get_area_name(apc.area, TRUE)]") @@ -134,18 +134,18 @@ authenticated = TRUE auth_id = "[ID.registered_name] ([ID.assignment]):" log_activity("[auth_id] logged in to the terminal") - playsound(src, 'sound/machines/terminal_on.ogg', 50, FALSE) + playsound(src, 'sound/machines/terminal/terminal_on.ogg', 50, FALSE) else auth_id = "[ID.registered_name] ([ID.assignment]):" log_activity("[auth_id] attempted to log into the terminal") - playsound(src, 'sound/machines/terminal_error.ogg', 50, FALSE) + playsound(src, 'sound/machines/terminal/terminal_error.ogg', 50, FALSE) say("ID rejected, access denied!") return auth_id = "Unknown (Unknown):" log_activity("[auth_id] attempted to log into the terminal") if("log-out") log_activity("[auth_id] logged out of the terminal") - playsound(src, 'sound/machines/terminal_off.ogg', 50, FALSE) + playsound(src, 'sound/machines/terminal/terminal_off.ogg', 50, FALSE) authenticated = FALSE auth_id = "\[NULL\]" if("toggle-logs") diff --git a/code/game/machinery/computer/arcade/_arcade.dm b/code/game/machinery/computer/arcade/_arcade.dm index 0837a6cc509..011a1f3a055 100644 --- a/code/game/machinery/computer/arcade/_arcade.dm +++ b/code/game/machinery/computer/arcade/_arcade.dm @@ -78,7 +78,7 @@ /obj/machinery/computer/arcade/proc/prizevend(mob/living/user, prizes = 1) SEND_SIGNAL(src, COMSIG_ARCADE_PRIZEVEND, user, prizes) if(user.mind?.get_skill_level(/datum/skill/gaming) >= SKILL_LEVEL_LEGENDARY && HAS_TRAIT(user, TRAIT_GAMERGOD)) - visible_message("[user] inputs an intense cheat code!",\ + visible_message(span_notice("[user] inputs an intense cheat code!"),\ span_notice("You hear a flurry of buttons being pressed.")) say("CODE ACTIVATED: EXTRA PRIZES.") prizes *= 2 diff --git a/code/game/machinery/computer/arcade/amputation.dm b/code/game/machinery/computer/arcade/amputation.dm index 84a02af387a..d20a5de2b28 100644 --- a/code/game/machinery/computer/arcade/amputation.dm +++ b/code/game/machinery/computer/arcade/amputation.dm @@ -17,19 +17,19 @@ user.played_game() var/obj/item/bodypart/chopchop = user.get_active_hand() if(do_after(user, 5 SECONDS, target = src, extra_checks = CALLBACK(src, PROC_REF(do_they_still_have_that_hand), user, chopchop))) - playsound(src, 'sound/weapons/slice.ogg', 25, TRUE, -1) + playsound(src, 'sound/items/weapons/slice.ogg', 25, TRUE, -1) to_chat(user, span_userdanger("The guillotine drops on your arm, and the machine sucks it in!")) chopchop.dismember() qdel(chopchop) user.mind?.adjust_experience(/datum/skill/gaming, 100) user.won_game() - playsound(src, 'sound/arcade/win.ogg', 50, TRUE) + playsound(src, 'sound/machines/arcade/win.ogg', 50, TRUE) new /obj/item/stack/arcadeticket((get_turf(src)), rand(6,10)) to_chat(user, span_notice("[src] dispenses a handful of tickets!")) return if(!do_they_still_have_that_hand(user, chopchop)) to_chat(user, span_warning("The guillotine drops, but your hand seems to be gone already!")) - playsound(src, 'sound/weapons/slice.ogg', 25, TRUE, -1) + playsound(src, 'sound/items/weapons/slice.ogg', 25, TRUE, -1) else to_chat(user, span_notice("You (wisely) decide against putting your hand in the machine.")) user.lost_game() diff --git a/code/game/machinery/computer/arcade/battle.dm b/code/game/machinery/computer/arcade/battle.dm index 9733759b5ca..169104d6c2f 100644 --- a/code/game/machinery/computer/arcade/battle.dm +++ b/code/game/machinery/computer/arcade/battle.dm @@ -226,7 +226,7 @@ user.mind?.adjust_experience(/datum/skill/gaming, exp_gained) user.won_game() SSblackbox.record_feedback("nested tally", "arcade_results", 1, list("win", (obj_flags & EMAGGED ? "emagged":"normal"))) - playsound(loc, 'sound/arcade/win.ogg', 40) + playsound(loc, 'sound/machines/arcade/win.ogg', 40) if(ui_panel != UI_PANEL_WORLD_MAP) //we havent been booted to world map, we're still going. ui_panel = UI_PANEL_BETWEEN_FIGHTS @@ -250,11 +250,11 @@ ui_panel = UI_PANEL_GAMEOVER feedback_message = "GAME OVER." say("You have been crushed! GAME OVER.") - playsound(loc, 'sound/arcade/lose.ogg', 40, TRUE) + playsound(loc, 'sound/machines/arcade/lose.ogg', 40, TRUE) lose_game(user) else feedback_message = "User took [damage_taken] damage!" - playsound(loc, 'sound/arcade/hit.ogg', 40, TRUE, extrarange = -3) + playsound(loc, 'sound/machines/arcade/hit.ogg', 40, TRUE, extrarange = -3) SStgui.update_uis(src) ///Called when you attack the enemy. @@ -270,17 +270,17 @@ if(BATTLE_ARCADE_PLAYER_COUNTERATTACK) feedback_message = "User prepares to counterattack!" process_enemy_turn(user, defending_flags = BATTLE_ATTACK_FLAG_COUNTERATTACK) - playsound(loc, 'sound/arcade/mana.ogg', 40, TRUE, extrarange = -3) + playsound(loc, 'sound/machines/arcade/mana.ogg', 40, TRUE, extrarange = -3) if(BATTLE_ARCADE_PLAYER_DEFEND) feedback_message = "User pulls up their shield!" process_enemy_turn(user, defending_flags = BATTLE_ATTACK_FLAG_DEFEND) - playsound(loc, 'sound/arcade/mana.ogg', 40, TRUE, extrarange = -3) + playsound(loc, 'sound/machines/arcade/mana.ogg', 40, TRUE, extrarange = -3) if(!damage_dealt) return enemy_hp -= round(max(0, damage_dealt), 1) feedback_message = "[enemy_name] took [damage_dealt] damage!" - playsound(loc, 'sound/arcade/hit.ogg', 40, TRUE, extrarange = -3) + playsound(loc, 'sound/machines/arcade/hit.ogg', 40, TRUE, extrarange = -3) process_enemy_turn(user) ///Called when you successfully counterattack the enemy. @@ -289,7 +289,7 @@ var/damage_dealt = (rand(20, 30) * (!isnull(weapon) ? weapon.bonus_modifier : 1)) enemy_hp -= round(max(0, damage_dealt), 1) feedback_message = "User counterattacked for [damage_dealt] damage!" - playsound(loc, 'sound/arcade/boom.ogg', 40, TRUE, extrarange = -3) + playsound(loc, 'sound/machines/arcade/boom.ogg', 40, TRUE, extrarange = -3) if(enemy_hp <= 0) on_battle_win(user) SStgui.update_uis(src) @@ -334,7 +334,7 @@ enemy_hp = round(min(enemy_max_hp, enemy_hp + healed_amount), 1) enemy_mp -= round(max(0, 10), 1) feedback_message = "[enemy_name] healed for [healed_amount] health points!" - playsound(loc, 'sound/arcade/heal.ogg', 40, TRUE, extrarange = -3) + playsound(loc, 'sound/machines/arcade/heal.ogg', 40, TRUE, extrarange = -3) SStgui.update_uis(src) return if(player_current_mp >= 5) //minimum to steal @@ -342,7 +342,7 @@ player_current_mp -= round(max(0, healed_amount), 1) enemy_mp += healed_amount feedback_message = "[enemy_name] stole [healed_amount] MP from you!" - playsound(loc, 'sound/arcade/steal.ogg', 40, TRUE) + playsound(loc, 'sound/machines/arcade/steal.ogg', 40, TRUE) SStgui.update_uis(src) return //we couldn't heal ourselves or steal MP, we'll just attack instead. @@ -437,7 +437,7 @@ say("You don't have enough gold to rest!") return TRUE player_gold -= DEFAULT_ITEM_PRICE / 2 - playsound(loc, 'sound/mecha/skyfall_power_up.ogg', 40) + playsound(loc, 'sound/vehicles/mecha/skyfall_power_up.ogg', 40) player_current_hp = PLAYER_MAX_HP player_current_mp = PLAYER_MAX_MP return TRUE @@ -476,11 +476,11 @@ return TRUE if("continue_with_rest") if(prob(60)) - playsound(loc, 'sound/mecha/skyfall_power_up.ogg', 40) + playsound(loc, 'sound/vehicles/mecha/skyfall_power_up.ogg', 40) player_current_hp = PLAYER_MAX_HP player_current_mp = PLAYER_MAX_MP else - playsound(loc, 'sound/machines/defib_zap.ogg', 40) + playsound(loc, 'sound/machines/defib/defib_zap.ogg', 40) if(prob(40)) //You got robbed, and now have to go to your next fight. player_gold /= 2 diff --git a/code/game/machinery/computer/arcade/orion.dm b/code/game/machinery/computer/arcade/orion.dm index 3300370d18e..a6685e4782c 100644 --- a/code/game/machinery/computer/arcade/orion.dm +++ b/code/game/machinery/computer/arcade/orion.dm @@ -421,7 +421,7 @@ var/sheriff = remove_crewmember(target) //I shot the sheriff if(target) killed_crew += 1 //if there was no suspected lings, this is just plain murder - playsound(loc,'sound/weapons/gun/pistol/shot.ogg', 100, TRUE) + playsound(loc,'sound/items/weapons/gun/pistol/shot.ogg', 100, TRUE) if(!settlers.len || !alive) say("The last crewmember [sheriff], shot themselves, GAME OVER!") if(obj_flags & EMAGGED) @@ -535,7 +535,7 @@ time_for_next_level = 3 SECONDS if(2) say("Oh, God! Code Eight! CODE EIGHT! IT'S GONNA BL-") - playsound(loc, 'sound/machines/buzz-sigh.ogg', 25, TRUE) + playsound(loc, 'sound/machines/buzz/buzz-sigh.ogg', 25, TRUE) time_for_next_level = 0.36 SECONDS if(3 to INFINITY) visible_message(span_userdanger("[src] explodes!")) diff --git a/code/game/machinery/computer/arcade/orion_event.dm b/code/game/machinery/computer/arcade/orion_event.dm index 7ab2f3b98b3..d39766200dc 100644 --- a/code/game/machinery/computer/arcade/orion_event.dm +++ b/code/game/machinery/computer/arcade/orion_event.dm @@ -67,8 +67,8 @@ text = "Oh no! The engine has broken down! \ You can repair it with an engine part, or you \ can make repairs for 3 days." - emag_message = "You hear some large object lurch to a halt right behind you! When you go to look, nothing's there..." - emag_sound = 'sound/effects/creak1.ogg' + emag_message = span_warning("You hear some large object lurch to a halt right behind you! When you go to look, nothing's there...") + emag_sound = 'sound/effects/creak/creak1.ogg' weight = 2 event_responses = list() @@ -170,7 +170,7 @@ /datum/orion_event/hull_part/proc/fix_floor(obj/machinery/computer/arcade/orion_trail/game) game.say("A new floor suddenly appears around [game]. What the hell?") - playsound(game, 'sound/weapons/genhit.ogg', 100, TRUE) + playsound(game, 'sound/items/weapons/genhit.ogg', 100, TRUE) for(var/turf/open/space/fixed in orange(1, game)) fixed.place_on_top(/turf/open/floor/plating) @@ -264,7 +264,7 @@ else to_chat(usr, span_userdanger("Something strikes you from behind! It hurts like hell and feel like a blunt weapon, but nothing is there...")) gamer.take_bodypart_damage(30) - playsound(game, 'sound/weapons/genhit2.ogg', 100, TRUE) + playsound(game, 'sound/items/weapons/genhit2.ogg', 100, TRUE) /datum/orion_event/illness name = "Space Illness" @@ -321,7 +321,7 @@ gamer.Paralyze(60) game.say("A sudden gust of powerful wind slams [gamer] into the floor!") gamer.take_bodypart_damage(25) - playsound(game, 'sound/weapons/genhit.ogg', 100, TRUE) + playsound(game, 'sound/items/weapons/genhit.ogg', 100, TRUE) /datum/orion_event/changeling_infiltration name = "Changeling Infiltration" diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index 2d8fd7e7dca..21f5ed3db7b 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -67,7 +67,7 @@ concurrent_users += user_ref // Turn on the console if(length(concurrent_users) == 1 && is_living) - playsound(src, 'sound/machines/terminal_on.ogg', 25, FALSE) + playsound(src, 'sound/machines/terminal/terminal_on.ogg', 25, FALSE) use_energy(active_power_usage) // Register map objects cam_screen.display_to(user) @@ -171,7 +171,7 @@ if(length(concurrent_users) == 0 && is_living) active_camera = null last_camera_turf = null - playsound(src, 'sound/machines/terminal_off.ogg', 25, FALSE) + playsound(src, 'sound/machines/terminal/terminal_off.ogg', 25, FALSE) /obj/machinery/computer/security/proc/show_camera_static() cam_screen.vis_contents.Cut() diff --git a/code/game/machinery/computer/camera_advanced.dm b/code/game/machinery/computer/camera_advanced.dm index 0e47a752b01..6640f5582fa 100644 --- a/code/game/machinery/computer/camera_advanced.dm +++ b/code/game/machinery/computer/camera_advanced.dm @@ -118,7 +118,7 @@ eyeobj.eye_user = null user.remote_control = null current_user = null - playsound(src, 'sound/machines/terminal_off.ogg', 25, FALSE) + playsound(src, 'sound/machines/terminal/terminal_off.ogg', 25, FALSE) /obj/machinery/computer/camera_advanced/on_set_is_operational(old_value) if(!is_operational) @@ -296,7 +296,7 @@ continue T["[netcam.c_tag][netcam.can_use() ? null : " (Deactivated)"]"] = netcam - playsound(origin, 'sound/machines/terminal_prompt.ogg', 25, FALSE) + playsound(origin, 'sound/machines/terminal/terminal_prompt.ogg', 25, FALSE) var/camera = tgui_input_list(usr, "Camera to view", "Cameras", T) if(isnull(camera)) return @@ -305,12 +305,12 @@ var/obj/machinery/camera/final = T[camera] playsound(src, SFX_TERMINAL_TYPE, 25, FALSE) if(final) - playsound(origin, 'sound/machines/terminal_prompt_confirm.ogg', 25, FALSE) + playsound(origin, 'sound/machines/terminal/terminal_prompt_confirm.ogg', 25, FALSE) remote_eye.setLoc(get_turf(final)) owner.overlay_fullscreen("flash", /atom/movable/screen/fullscreen/flash/static) owner.clear_fullscreen("flash", 3) //Shorter flash than normal since it's an ~~advanced~~ console! else - playsound(origin, 'sound/machines/terminal_prompt_deny.ogg', 25, FALSE) + playsound(origin, 'sound/machines/terminal/terminal_prompt_deny.ogg', 25, FALSE) /datum/action/innate/camera_multiz_up name = "Move up a floor" diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index 4aca3f43577..0ea20d3bf03 100755 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -145,7 +145,7 @@ GLOBAL_VAR_INIT(cops_arrived, FALSE) battlecruiser_called = TRUE caller_card.use_charge(user) addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(summon_battlecruiser), caller_card.team), rand(20 SECONDS, 1 MINUTES)) - playsound(src, 'sound/machines/terminal_alert.ogg', 50, FALSE) + playsound(src, 'sound/machines/terminal/terminal_alert.ogg', 50, FALSE) priority_announce("Attention crew: deep-space sensors detect a Syndicate battlecruiser-class signature subspace rift forming near your station. Estimated time until arrival: three to five minutes.", "[command_name()] High-Priority Update") //SKYRAT EDIT ADDITION: announcement on battlecruiser call return TRUE @@ -155,7 +155,7 @@ GLOBAL_VAR_INIT(cops_arrived, FALSE) if (authenticated) authorize_access = SSid_access.get_region_access_list(list(REGION_ALL_STATION)) balloon_alert(user, "routing circuits scrambled") - playsound(src, 'sound/machines/terminal_alert.ogg', 50, FALSE) + playsound(src, 'sound/machines/terminal/terminal_alert.ogg', 50, FALSE) return TRUE /obj/machinery/computer/communications/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) @@ -209,11 +209,11 @@ GLOBAL_VAR_INIT(cops_arrived, FALSE) var/obj/item/card/id/id_card = held_item?.GetID() if (!istype(id_card)) to_chat(user, span_warning("You need to swipe your ID!")) - playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, FALSE) + playsound(src, 'sound/machines/terminal/terminal_prompt_deny.ogg', 50, FALSE) return if (!(ACCESS_CAPTAIN in id_card.access)) to_chat(user, span_warning("You are not authorized to do this!")) - playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, FALSE) + playsound(src, 'sound/machines/terminal/terminal_prompt_deny.ogg', 50, FALSE) return var/new_sec_level = SSsecurity_level.text_level_to_number(params["newSecurityLevel"]) @@ -225,7 +225,7 @@ GLOBAL_VAR_INIT(cops_arrived, FALSE) SSsecurity_level.set_level(new_sec_level) to_chat(user, span_notice("Authorization confirmed. Modifying security level.")) - playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE) + playsound(src, 'sound/machines/terminal/terminal_prompt_confirm.ogg', 50, FALSE) // Only notify people if an actual change happened user.log_message("changed the security level to [params["newSecurityLevel"]] with [src].", LOG_GAME) @@ -250,7 +250,7 @@ GLOBAL_VAR_INIT(cops_arrived, FALSE) if (!COOLDOWN_FINISHED(src, important_action_cooldown)) return - playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE) + playsound(src, 'sound/machines/terminal/terminal_prompt_confirm.ogg', 50, FALSE) var/message = trim(html_encode(params["message"]), MAX_MESSAGE_LEN) var/emagged = obj_flags & EMAGGED @@ -316,7 +316,7 @@ GLOBAL_VAR_INIT(cops_arrived, FALSE) to_chat(user, span_notice("Request sent.")) user.log_message("has requested the nuclear codes from CentCom with reason \"[reason]\"", LOG_SAY) priority_announce("The codes for the on-station nuclear self-destruct have been requested by [user]. Confirmation or denial of this request will be sent shortly.", "Nuclear Self-Destruct Codes Requested", SSstation.announcer.get_rand_report_sound()) - playsound(src, 'sound/machines/terminal_prompt.ogg', 50, FALSE) + playsound(src, 'sound/machines/terminal/terminal_prompt.ogg', 50, FALSE) COOLDOWN_START(src, important_action_cooldown, IMPORTANT_ACTION_COOLDOWN) if ("restoreBackupRoutingData") if (!authenticated_as_non_silicon_captain(user)) @@ -324,7 +324,7 @@ GLOBAL_VAR_INIT(cops_arrived, FALSE) if (!(obj_flags & EMAGGED)) return to_chat(user, span_notice("Backup routing data restored.")) - playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE) + playsound(src, 'sound/machines/terminal/terminal_prompt_confirm.ogg', 50, FALSE) obj_flags &= ~EMAGGED if ("sendToOtherSector") if (!authenticated_as_non_silicon_captain(user)) @@ -352,7 +352,7 @@ GLOBAL_VAR_INIT(cops_arrived, FALSE) log_admin_private("[key_name(user)] has passed the soft filter for \"[soft_filter_result[CHAT_FILTER_INDEX_WORD]]\". They may be using a disallowed term for a cross-station message. Increasing delay time to reject.\n\n Message: \"[message]\"") GLOB.communications_controller.soft_filtering = TRUE - playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE) + playsound(src, 'sound/machines/terminal/terminal_prompt_confirm.ogg', 50, FALSE) var/destination = params["destination"] @@ -405,7 +405,7 @@ GLOBAL_VAR_INIT(cops_arrived, FALSE) authenticated = FALSE authorize_access = null authorize_name = null - playsound(src, 'sound/machines/terminal_off.ogg', 50, FALSE) + playsound(src, 'sound/machines/terminal/terminal_off.ogg', 50, FALSE) return if (obj_flags & EMAGGED) @@ -413,7 +413,7 @@ GLOBAL_VAR_INIT(cops_arrived, FALSE) authorize_access = SSid_access.get_region_access_list(list(REGION_ALL_STATION)) authorize_name = "Unknown" to_chat(user, span_warning("[src] lets out a quiet alarm as its login is overridden.")) - playsound(src, 'sound/machines/terminal_alert.ogg', 25, FALSE) + playsound(src, 'sound/machines/terminal/terminal_alert.ogg', 25, FALSE) else if(isliving(user)) var/mob/living/L = user var/obj/item/card/id/id_card = L.get_idcard(hand_first = TRUE) @@ -423,7 +423,7 @@ GLOBAL_VAR_INIT(cops_arrived, FALSE) authorize_name = "[id_card.registered_name] - [id_card.assignment]" state = STATE_MAIN - playsound(src, 'sound/machines/terminal_on.ogg', 50, FALSE) + playsound(src, 'sound/machines/terminal/terminal_on.ogg', 50, FALSE) imprint_gps(gps_tag = "Encrypted Communications Channel") if ("toggleEmergencyAccess") @@ -736,7 +736,7 @@ GLOBAL_VAR_INIT(cops_arrived, FALSE) /// Returns TRUE if the user can buy shuttles. /// If they cannot, returns FALSE or a string detailing why. /obj/machinery/computer/communications/proc/can_buy_shuttles(mob/user) - if (!SSmapping.config.allow_custom_shuttles) + if (!SSmapping.current_map.allow_custom_shuttles) return FALSE if (HAS_SILICON_ACCESS(user)) return FALSE @@ -785,7 +785,7 @@ GLOBAL_VAR_INIT(cops_arrived, FALSE) if(!GLOB.communications_controller.can_announce(user, is_ai)) to_chat(user, span_alert("Intercomms recharging. Please stand by.")) return - var/input = tgui_input_text(user, "Message to announce to the station crew", "Announcement") + var/input = tgui_input_text(user, "Message to announce to the station crew", "Announcement", max_length = MAX_MESSAGE_LEN) if(!input || !user.can_perform_action(src, ALLOW_SILICON_REACH)) return if(user.try_speak(input)) diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm index 61832869c58..c568c5a052a 100644 --- a/code/game/machinery/computer/crew.dm +++ b/code/game/machinery/computer/crew.dm @@ -287,6 +287,19 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new) entry["is_dnr"] = tracked_human.get_dnr() // BUBBERSTATION EDIT END + // Broken sensors show garbage data + if (uniform.has_sensor == BROKEN_SENSORS) + entry["life_status"] = rand(0,1) + entry["area"] = pick_list (ION_FILE, "ionarea") + entry["oxydam"] = rand(0,175) + entry["toxdam"] = rand(0,175) + entry["burndam"] = rand(0,175) + entry["brutedam"] = rand(0,175) + entry["health"] = -50 + entry["can_track"] = tracked_living_mob.can_track() + results[++results.len] = entry + continue + // Current status if (sensor_mode >= SENSOR_LIVING) entry["life_status"] = tracked_living_mob.stat diff --git a/code/game/machinery/computer/dna_console.dm b/code/game/machinery/computer/dna_console.dm index d029b004b98..25f22af387f 100644 --- a/code/game/machinery/computer/dna_console.dm +++ b/code/game/machinery/computer/dna_console.dm @@ -683,7 +683,7 @@ var/datum/mutation/human/target_mutation = get_mut_by_ref(bref, search_flags) // Prompt for modifier string - var/new_sequence_input = tgui_input_text(usr, "Enter a replacement sequence", "Inherent Gene Replacement", 32, encode = FALSE) + var/new_sequence_input = tgui_input_text(usr, "Enter a replacement sequence", "Inherent Gene Replacement", max_length = 32, encode = FALSE) // Drop out if the string is the wrong length if(length(new_sequence_input) != 32) return @@ -1352,7 +1352,7 @@ // However, if this is the case, we can't make a complete injector and // this catches that edge case if(!buffer_slot["name"] || !buffer_slot["UF"] || !buffer_slot["blood_type"]) - to_chat(usr,"Genetic data corrupted, unable to create injector.") + to_chat(usr,span_warning("Genetic data corrupted, unable to create injector.")) return I = new /obj/item/dnainjector/timed(loc) @@ -1736,7 +1736,7 @@ // However, if this is the case, we can't make a complete injector and // this catches that edge case if(!buffer_slot["UF"]) - to_chat(usr,"Genetic data corrupted, unable to apply genetic data.") + to_chat(usr,span_warning("Genetic data corrupted, unable to apply genetic data.")) return FALSE COOLDOWN_START(src, enzyme_copy_timer, ENZYME_COPY_BASE_COOLDOWN) scanner_occupant.dna.unique_features = buffer_slot["UF"] diff --git a/code/game/machinery/computer/mechlaunchpad.dm b/code/game/machinery/computer/mechlaunchpad.dm index 050f3447a8c..7590e690d07 100644 --- a/code/game/machinery/computer/mechlaunchpad.dm +++ b/code/game/machinery/computer/mechlaunchpad.dm @@ -66,7 +66,7 @@ /// A proc that makes random beeping sounds for a set amount of time, the sounds are separated by a random amount of time. /obj/machinery/computer/mechpad/proc/random_beeps(mob/user, time = 0, mintime = 0, maxtime = 1) - var/static/list/beep_sounds = list('sound/machines/terminal_prompt_confirm.ogg', 'sound/machines/terminal_prompt_deny.ogg', 'sound/machines/terminal_error.ogg', 'sound/machines/terminal_select.ogg', 'sound/machines/terminal_success.ogg') + var/static/list/beep_sounds = list('sound/machines/terminal/terminal_prompt_confirm.ogg', 'sound/machines/terminal/terminal_prompt_deny.ogg', 'sound/machines/terminal/terminal_error.ogg', 'sound/machines/terminal/terminal_select.ogg', 'sound/machines/terminal/terminal_success.ogg') var/time_to_spend = 0 var/orig_time = time while(time > 0) @@ -132,7 +132,7 @@ if(!can_launch(user, where)) return flick("mechpad-launch", connected_mechpad) - playsound(connected_mechpad, 'sound/machines/triple_beep.ogg', 50, TRUE) + playsound(connected_mechpad, 'sound/machines/beep/triple_beep.ogg', 50, TRUE) addtimer(CALLBACK(src, PROC_REF(start_launch), user, where), 1 SECONDS) /obj/machinery/computer/mechpad/proc/start_launch(mob/user, obj/machinery/mechpad/where) diff --git a/code/game/machinery/computer/prisoner/_prisoner.dm b/code/game/machinery/computer/prisoner/_prisoner.dm index 9777c1b209c..828d981bec6 100644 --- a/code/game/machinery/computer/prisoner/_prisoner.dm +++ b/code/game/machinery/computer/prisoner/_prisoner.dm @@ -35,7 +35,7 @@ return contained_id = new_id balloon_alert_to_viewers("id inserted") - playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) + playsound(src, 'sound/machines/terminal/terminal_insert_disc.ogg', 50, FALSE) /obj/machinery/computer/prisoner/proc/id_eject(mob/user) if(isnull(contained_id)) @@ -48,7 +48,7 @@ contained_id.forceMove(drop_location()) balloon_alert_to_viewers("id ejected") - playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) + playsound(src, 'sound/machines/terminal/terminal_insert_disc.ogg', 50, FALSE) /obj/machinery/computer/prisoner/attackby(obj/item/weapon, mob/user, params) if(istype(weapon, /obj/item/card/id/advanced/prisoner)) diff --git a/code/game/machinery/computer/prisoner/gulag_teleporter.dm b/code/game/machinery/computer/prisoner/gulag_teleporter.dm index f03c08a8d82..66440bb97c3 100644 --- a/code/game/machinery/computer/prisoner/gulag_teleporter.dm +++ b/code/game/machinery/computer/prisoner/gulag_teleporter.dm @@ -72,7 +72,7 @@ if(.) return if(isliving(usr)) - playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE) + playsound(src, 'sound/machines/terminal/terminal_prompt_confirm.ogg', 50, FALSE) if(!allowed(usr)) to_chat(usr, span_warning("Access denied.")) return @@ -144,7 +144,7 @@ user.log_message("teleported [key_name(prisoner)] to the Labor Camp [COORD(beacon)] for [id_goal_not_set ? "default goal of ":""][contained_id.goal] points.", LOG_GAME) prisoner.log_message("teleported to Labor Camp [COORD(beacon)] by [key_name(user)] for [id_goal_not_set ? "default goal of ":""][contained_id.goal] points.", LOG_GAME, log_globally = FALSE) teleporter.handle_prisoner(contained_id, temporary_record) - playsound(src, 'sound/weapons/emitter.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + playsound(src, 'sound/items/weapons/emitter.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) prisoner.forceMove(get_turf(beacon)) prisoner.Paralyze(40) // small travel dizziness to_chat(prisoner, span_warning("The teleportation makes you a little dizzy.")) diff --git a/code/game/machinery/computer/prisoner/management.dm b/code/game/machinery/computer/prisoner/management.dm index 32c2ddba984..a971dce2d9d 100644 --- a/code/game/machinery/computer/prisoner/management.dm +++ b/code/game/machinery/computer/prisoner/management.dm @@ -52,20 +52,20 @@ GLOBAL_LIST_EMPTY_TYPED(tracked_implants, /obj/item/implant) CRASH("[usr] potentially spoofed ui action [action] on prisoner console without the console being logged in.") if(isliving(usr)) - playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE) + playsound(src, 'sound/machines/terminal/terminal_prompt_confirm.ogg', 50, FALSE) switch(action) if("login") if(allowed(usr)) authenticated = TRUE - playsound(src, 'sound/machines/terminal_on.ogg', 50, FALSE) + playsound(src, 'sound/machines/terminal/terminal_on.ogg', 50, FALSE) else - playsound(src, 'sound/machines/terminal_error.ogg', 50, FALSE) + playsound(src, 'sound/machines/terminal/terminal_error.ogg', 50, FALSE) return TRUE if("logout") authenticated = FALSE - playsound(src, 'sound/machines/terminal_off.ogg', 50, FALSE) + playsound(src, 'sound/machines/terminal/terminal_off.ogg', 50, FALSE) return TRUE if("insert_id") diff --git a/code/game/machinery/computer/records/records.dm b/code/game/machinery/computer/records/records.dm index d5389530043..7d01d973549 100644 --- a/code/game/machinery/computer/records/records.dm +++ b/code/game/machinery/computer/records/records.dm @@ -57,7 +57,7 @@ expunge_record_info(target) balloon_alert(user, "record expunged") - playsound(src, 'sound/machines/terminal_eject.ogg', 70, TRUE) + playsound(src, 'sound/machines/terminal/terminal_eject.ogg', 70, TRUE) investigate_log("[key_name(user)] expunged the record of [target.name].", INVESTIGATE_RECORDS) return TRUE @@ -69,7 +69,7 @@ if("logout") balloon_alert(user, "logged out") - playsound(src, 'sound/machines/terminal_off.ogg', 70, TRUE) + playsound(src, 'sound/machines/terminal/terminal_off.ogg', 70, TRUE) authenticated = FALSE return TRUE @@ -82,14 +82,14 @@ ui.close() balloon_alert(user, "purging records...") - playsound(src, 'sound/machines/terminal_alert.ogg', 70, TRUE) + playsound(src, 'sound/machines/terminal/terminal_alert.ogg', 70, TRUE) if(do_after(user, 5 SECONDS)) for(var/datum/record/crew/entry in GLOB.manifest.general) expunge_record_info(entry) balloon_alert(user, "records purged") - playsound(src, 'sound/machines/terminal_off.ogg', 70, TRUE) + playsound(src, 'sound/machines/terminal/terminal_off.ogg', 70, TRUE) investigate_log("[key_name(user)] purged all records.", INVESTIGATE_RECORDS) else balloon_alert(user, "interrupted!") @@ -139,23 +139,23 @@ if(!authenticated && !allowed(user)) balloon_alert(user, "access denied") - playsound(src, 'sound/machines/terminal_error.ogg', 70, TRUE) + playsound(src, 'sound/machines/terminal/terminal_error.ogg', 70, TRUE) return FALSE - if(mugshot.picture.psize_x > world.icon_size || mugshot.picture.psize_y > world.icon_size) + if(mugshot.picture.psize_x > ICON_SIZE_X || mugshot.picture.psize_y > ICON_SIZE_Y) balloon_alert(user, "photo too large!") - playsound(src, 'sound/machines/terminal_error.ogg', 70, TRUE) + playsound(src, 'sound/machines/terminal/terminal_error.ogg', 70, TRUE) return FALSE var/trimmed = copytext(mugshot.name, 9, MAX_NAME_LEN) // Remove "photo - " - var/name = tgui_input_text(user, "Enter the name of the new record.", "New Record", trimmed, MAX_NAME_LEN) + var/name = tgui_input_text(user, "Enter the name of the new record.", "New Record", trimmed, max_length = MAX_NAME_LEN) if(!name || !is_operational || !user.can_perform_action(src, ALLOW_SILICON_REACH) || !mugshot || QDELETED(mugshot) || QDELETED(src)) return FALSE new /datum/record/crew(name = name, character_appearance = mugshot.picture.picture_image) balloon_alert(user, "record created") - playsound(src, 'sound/machines/terminal_insert_disc.ogg', 70, TRUE) + playsound(src, 'sound/machines/terminal/terminal_insert_disc.ogg', 70, TRUE) qdel(mugshot) @@ -168,10 +168,10 @@ if(!allowed(user)) balloon_alert(user, "access denied") - playsound(src, 'sound/machines/terminal_error.ogg', 70, TRUE) + playsound(src, 'sound/machines/terminal/terminal_error.ogg', 70, TRUE) return FALSE balloon_alert(user, "logged in") - playsound(src, 'sound/machines/terminal_on.ogg', 70, TRUE) + playsound(src, 'sound/machines/terminal/terminal_on.ogg', 70, TRUE) return TRUE diff --git a/code/game/machinery/computer/records/security.dm b/code/game/machinery/computer/records/security.dm index eda93ad579d..088d3c2b390 100644 --- a/code/game/machinery/computer/records/security.dm +++ b/code/game/machinery/computer/records/security.dm @@ -210,13 +210,13 @@ var/input_name = strip_html_full(params["name"], MAX_CRIME_NAME_LEN) if(!input_name) to_chat(usr, span_warning("You must enter a name for the crime.")) - playsound(src, 'sound/machines/terminal_error.ogg', 75, TRUE) + playsound(src, 'sound/machines/terminal/terminal_error.ogg', 75, TRUE) return FALSE var/max = CONFIG_GET(number/maxfine) if(params["fine"] > max) to_chat(usr, span_warning("The maximum fine is [max] credits.")) - playsound(src, 'sound/machines/terminal_error.ogg', 75, TRUE) + playsound(src, 'sound/machines/terminal/terminal_error.ogg', 75, TRUE) return FALSE var/input_details @@ -327,7 +327,7 @@ /// Finishes printing, resets the printer. /obj/machinery/computer/records/security/proc/print_finish(obj/item/printable) printing = FALSE - playsound(src, 'sound/machines/terminal_eject.ogg', 100, TRUE) + playsound(src, 'sound/machines/terminal/terminal_eject.ogg', 100, TRUE) printable.forceMove(loc) return TRUE @@ -336,7 +336,7 @@ /obj/machinery/computer/records/security/proc/print_record(mob/user, datum/record/crew/target, list/params) if(printing) balloon_alert(user, "printer busy") - playsound(src, 'sound/machines/terminal_error.ogg', 100, TRUE) + playsound(src, 'sound/machines/terminal/terminal_error.ogg', 100, TRUE) return FALSE printing = TRUE diff --git a/code/game/machinery/computer/telescreen.dm b/code/game/machinery/computer/telescreen.dm index 6058d3bf131..6021c954cab 100644 --- a/code/game/machinery/computer/telescreen.dm +++ b/code/game/machinery/computer/telescreen.dm @@ -55,7 +55,6 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/security/telescreen/entertai /obj/machinery/computer/security/telescreen/entertainment/Initialize(mapload) . = ..() - RegisterSignal(src, COMSIG_CLICK, PROC_REF(BigClick)) find_and_hang_on_wall() speakers = new(src) @@ -63,16 +62,66 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/security/telescreen/entertai . = ..() QDEL_NULL(speakers) -/// Bypass clickchain to allow humans to use the telescreen from a distance -/obj/machinery/computer/security/telescreen/entertainment/proc/BigClick() - SIGNAL_HANDLER +/obj/machinery/computer/security/telescreen/entertainment/examine(mob/user) + . = ..() + . += length(network) ? span_notice("The TV is broadcasting something!") : span_notice("There's nothing on TV.") - if(!network.len) - balloon_alert(usr, "nothing on TV!") +/obj/machinery/computer/security/telescreen/entertainment/ui_state(mob/user) + return GLOB.always_state + +// Snowflake ui status to allow mobs to watch TV from across the room, +// but only allow adjacent mobs / tk users / silicon to change the channel +/obj/machinery/computer/security/telescreen/entertainment/ui_status(mob/living/user, datum/ui_state/state) + if(!can_watch_tv(user)) + return UI_CLOSE + if(!isliving(user)) + return isAdminGhostAI(user) ? UI_INTERACTIVE : UI_UPDATE + if(user.stat >= SOFT_CRIT) + return UI_UPDATE + + var/can_range = FALSE + if(iscarbon(user)) + var/mob/living/carbon/carbon_user = user + if(carbon_user.dna?.check_mutation(/datum/mutation/human/telekinesis) && tkMaxRangeCheck(user, src)) + can_range = TRUE + if(HAS_SILICON_ACCESS(user) || (user.interaction_range && user.interaction_range >= get_dist(user, src))) + can_range = TRUE + + if((can_range || user.CanReach(src)) && ISADVANCEDTOOLUSER(user)) + if(user.incapacitated) + return UI_UPDATE + if(!can_range && user.can_hold_items() && (user.usable_hands <= 0 || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED))) + return UI_UPDATE + return UI_INTERACTIVE + return UI_UPDATE + +/obj/machinery/computer/security/telescreen/entertainment/Click(location, control, params) + if(world.time <= usr.next_click + 1) + return // just so someone can't turn an auto clicker on and spam tvs + + . = ..() + if(!can_watch_tv(usr)) return - + if((!length(network) && !Adjacent(usr)) || LAZYACCESS(params2list(params), SHIFT_CLICK)) // let people examine + return + // Lets us see the tv regardless of click results INVOKE_ASYNC(src, TYPE_PROC_REF(/atom, interact), usr) +/obj/machinery/computer/security/telescreen/entertainment/proc/can_watch_tv(mob/living/watcher) + if(!is_operational) + return FALSE + if((watcher.sight & SEE_OBJS) || HAS_SILICON_ACCESS(watcher)) + if(get_dist(watcher, src) > 7) + return FALSE + else + if(!can_see(watcher, src, 7)) + return FALSE + if(watcher.is_blind()) + return FALSE + if(!isobserver(watcher) && watcher.stat >= UNCONSCIOUS) + return FALSE + return TRUE + /// Sets the monitor's icon to the selected state, and says an announcement /obj/machinery/computer/security/telescreen/entertainment/proc/notify(on, announcement) if(on && icon_state == icon_state_off) diff --git a/code/game/machinery/computer/warrant.dm b/code/game/machinery/computer/warrant.dm index 3b73a8b75bf..71455fc5a2e 100644 --- a/code/game/machinery/computer/warrant.dm +++ b/code/game/machinery/computer/warrant.dm @@ -88,26 +88,26 @@ if(!isliving(user) || issilicon(user)) to_chat(user, span_warning("ACCESS DENIED")) - playsound(src, 'sound/machines/terminal_error.ogg', 100, TRUE) + playsound(src, 'sound/machines/terminal/terminal_error.ogg', 100, TRUE) return FALSE var/mob/living/player = user var/obj/item/card/id/auth = player.get_idcard(TRUE) if(!auth) to_chat(user, span_warning("ACCESS DENIED: No ID card detected.")) - playsound(src, 'sound/machines/terminal_error.ogg', 100, TRUE) + playsound(src, 'sound/machines/terminal/terminal_error.ogg', 100, TRUE) return FALSE var/datum/bank_account/account = auth.registered_account if(!account?.account_holder || account.account_holder == "Unassigned") to_chat(user, span_warning("ACCESS DENIED: No account linked to ID.")) - playsound(src, 'sound/machines/terminal_error.ogg', 100, TRUE) + playsound(src, 'sound/machines/terminal/terminal_error.ogg', 100, TRUE) return FALSE var/amount = params["amount"] if(!amount || !isnum(amount) || amount > warrant.fine || !account.adjust_money(-amount, "Paid fine for [target.name]")) to_chat(user, span_warning("ACCESS DENIED: Invalid amount.")) - playsound(src, 'sound/machines/terminal_error.ogg', 100, TRUE) + playsound(src, 'sound/machines/terminal/terminal_error.ogg', 100, TRUE) return FALSE account.bank_card_talk("You have paid [amount]cr towards [target.name]'s fine of [warrant.fine]cr.") @@ -139,7 +139,7 @@ /// Finishes printing, resets the printer. /obj/machinery/computer/warrant/proc/print_finish(obj/item/paper/bounty) printing = FALSE - playsound(src, 'sound/machines/terminal_eject.ogg', 100, TRUE) + playsound(src, 'sound/machines/terminal/terminal_eject.ogg', 100, TRUE) bounty.forceMove(loc) return TRUE @@ -148,7 +148,7 @@ /obj/machinery/computer/warrant/proc/print_bounty(mob/user, list/params) if(printing) balloon_alert(user, "printer busy") - playsound(src, 'sound/machines/terminal_error.ogg', 100, TRUE) + playsound(src, 'sound/machines/terminal/terminal_error.ogg', 100, TRUE) return FALSE var/datum/record/crew/target = locate(params["crew_ref"]) in GLOB.manifest.general diff --git a/code/game/machinery/dance_machine.dm b/code/game/machinery/dance_machine.dm index 816e2a1c172..100e9447733 100644 --- a/code/game/machinery/dance_machine.dm +++ b/code/game/machinery/dance_machine.dm @@ -51,11 +51,11 @@ return UI_CLOSE if(!allowed(user)) to_chat(user,span_warning("Error: Access Denied.")) - user.playsound_local(src, 'sound/misc/compiler-failure.ogg', 25, TRUE) + user.playsound_local(src, 'sound/machines/compiler/compiler-failure.ogg', 25, TRUE) return UI_CLOSE if(!length(music_player.songs)) to_chat(user,span_warning("Error: No music tracks have been authorized for your station. Petition Central Command to resolve this issue.")) - user.playsound_local(src, 'sound/misc/compiler-failure.ogg', 25, TRUE) + user.playsound_local(src, 'sound/machines/compiler/compiler-failure.ogg', 25, TRUE) return UI_CLOSE return ..() @@ -80,7 +80,7 @@ to_chat(usr, span_warning("Error: The device is still resetting from the last activation, \ it will be ready again in [DisplayTimeText(COOLDOWN_TIMELEFT(src, jukebox_song_cd))].")) if(COOLDOWN_FINISHED(src, jukebox_error_cd)) - playsound(src, 'sound/misc/compiler-failure.ogg', 33, TRUE) + playsound(src, 'sound/machines/compiler/compiler-failure.ogg', 33, TRUE) COOLDOWN_START(src, jukebox_error_cd, 15 SECONDS) return TRUE @@ -135,7 +135,7 @@ if(!QDELING(src)) COOLDOWN_START(src, jukebox_song_cd, 10 SECONDS) - playsound(src,'sound/machines/terminal_off.ogg',50,TRUE) + playsound(src,'sound/machines/terminal/terminal_off.ogg',50,TRUE) update_use_power(IDLE_POWER_USE) update_appearance(UPDATE_ICON_STATE) return TRUE diff --git a/code/game/machinery/dish_drive.dm b/code/game/machinery/dish_drive.dm index 1ccb0af11b5..6b47c562676 100644 --- a/code/game/machinery/dish_drive.dm +++ b/code/game/machinery/dish_drive.dm @@ -77,7 +77,7 @@ LAZYREMOVE(dish_drive_contents, dish) user.put_in_hands(dish) balloon_alert(user, "[dish] taken") - playsound(src, 'sound/items/pshoom.ogg', 50, TRUE) + playsound(src, 'sound/items/pshoom/pshoom.ogg', 50, TRUE) flick("synthesizer_beam", src) /obj/machinery/dish_drive/wrench_act(mob/living/user, obj/item/tool) @@ -91,7 +91,7 @@ return LAZYADD(dish_drive_contents, dish) balloon_alert(user, "[dish] placed in drive") - playsound(src, 'sound/items/pshoom.ogg', 50, TRUE) + playsound(src, 'sound/items/pshoom/pshoom.ogg', 50, TRUE) flick("synthesizer_beam", src) return else if(default_deconstruction_screwdriver(user, "[initial(icon_state)]-o", initial(icon_state), dish)) @@ -131,7 +131,7 @@ LAZYADD(dish_drive_contents, dish) visible_message(span_notice("[src] beams up [dish]!")) dish.forceMove(src) - playsound(src, 'sound/items/pshoom.ogg', 50, TRUE) + playsound(src, 'sound/items/pshoom/pshoom.ogg', 50, TRUE) flick("synthesizer_beam", src) else step_towards(dish, src) @@ -155,7 +155,7 @@ if(!bin) if(manual) visible_message(span_warning("[src] buzzes. There are no disposal bins in range!")) - playsound(src, 'sound/machines/buzz-sigh.ogg', 50, TRUE) + playsound(src, 'sound/machines/buzz/buzz-sigh.ogg', 50, TRUE) return var/disposed = 0 for(var/obj/item/dish in dish_drive_contents) @@ -168,8 +168,8 @@ disposed++ if (disposed) visible_message(span_notice("[src] [pick("whooshes", "bwooms", "fwooms", "pshooms")] and beams [disposed] stored item\s into the nearby [bin.name].")) - playsound(src, 'sound/items/pshoom.ogg', 50, TRUE) - playsound(bin, 'sound/items/pshoom.ogg', 50, TRUE) + playsound(src, 'sound/items/pshoom/pshoom.ogg', 50, TRUE) + playsound(bin, 'sound/items/pshoom/pshoom.ogg', 50, TRUE) Beam(bin, icon_state = "rped_upgrade", time = 5) bin.update_appearance() flick("synthesizer_beam", src) diff --git a/code/game/machinery/dna_infuser/dna_infuser.dm b/code/game/machinery/dna_infuser/dna_infuser.dm index cc2641d3297..961092c635b 100644 --- a/code/game/machinery/dna_infuser/dna_infuser.dm +++ b/code/game/machinery/dna_infuser/dna_infuser.dm @@ -67,7 +67,7 @@ return if(occupant && infusing_from) if(!occupant.can_infuse(user)) - playsound(src, 'sound/machines/scanbuzz.ogg', 35, vary = TRUE) + playsound(src, 'sound/machines/scanner/scanbuzz.ogg', 35, vary = TRUE) return balloon_alert(user, "starting DNA infusion...") start_infuse() diff --git a/code/game/machinery/dna_infuser/infuser_entries/infuser_tier_zero_entries.dm b/code/game/machinery/dna_infuser/infuser_entries/infuser_tier_zero_entries.dm index 235986cbd0d..670abc2d87b 100644 --- a/code/game/machinery/dna_infuser/infuser_entries/infuser_tier_zero_entries.dm +++ b/code/game/machinery/dna_infuser/infuser_entries/infuser_tier_zero_entries.dm @@ -75,7 +75,7 @@ desc = "EVERYONE CALM DOWN! I'm not implying anything with this entry. Are we really so surprised that felinids are humans with mixed feline DNA?" threshold_desc = DNA_INFUSION_NO_THRESHOLD qualities = list( - "oh, let me guess, you're a big fan of those japanese tourist bots", + "oh, let me guess, you're a big fan of those Japanese tourist bots", ) input_obj_or_mob = list( /mob/living/basic/pet/cat, 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 45d5f3ddfd9..4f8d38aa999 100644 --- a/code/game/machinery/dna_infuser/organ_sets/rat_organs.dm +++ b/code/game/machinery/dna_infuser/organ_sets/rat_organs.dm @@ -130,7 +130,7 @@ . = ..() if(prob(5)) owner.emote("squeaks") - playsound(owner, 'sound/creatures/mousesqueek.ogg', 100) + playsound(owner, 'sound/mobs/non-humanoids/mouse/mousesqueek.ogg', 100) #undef RAT_ORGAN_COLOR #undef RAT_SCLERA_COLOR diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index de8755d03d2..19801a45b52 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -142,12 +142,12 @@ var/normalspeed = TRUE var/cutAiWire = FALSE var/autoname = FALSE - var/doorOpen = 'sound/machines/airlock.ogg' - var/doorClose = 'sound/machines/airlockclose.ogg' - var/doorDeni = 'sound/machines/deniedbeep.ogg' // i'm thinkin' Deni's - var/boltUp = 'sound/machines/boltsup.ogg' - var/boltDown = 'sound/machines/boltsdown.ogg' - var/noPower = 'sound/machines/doorclick.ogg' + var/doorOpen = 'sound/machines/airlock/airlock.ogg' + var/doorClose = 'sound/machines/airlock/airlockclose.ogg' + var/doorDeni = 'sound/machines/beep/deniedbeep.ogg' // i'm thinkin' Deni's + var/boltUp = 'sound/machines/airlock/boltsup.ogg' + var/boltDown = 'sound/machines/airlock/boltsdown.ogg' + var/noPower = 'sound/machines/airlock/doorclick.ogg' /// What airlock assembly mineral plating was applied to var/previous_airlock = /obj/structure/door_assembly /// Material of inner filling; if its an airlock with glass, this should be set to "glass" @@ -1071,7 +1071,7 @@ to_chat(user, span_warning("[src] has already been sealed!")) return user.visible_message(span_notice("[user] begins sealing [src]."), span_notice("You begin sealing [src].")) - playsound(src, 'sound/items/jaws_pry.ogg', 30, TRUE) + playsound(src, 'sound/items/tools/jaws_pry.ogg', 30, TRUE) if(!do_after(user, airlockseal.seal_time, target = src)) return if(!density) @@ -1083,7 +1083,7 @@ if(!user.transferItemToLoc(airlockseal, src)) to_chat(user, span_warning("For some reason, you can't attach [airlockseal]!")) return - playsound(src, 'sound/machines/airlockforced.ogg', 30, TRUE) + playsound(src, 'sound/machines/airlock/airlockforced.ogg', 30, TRUE) user.visible_message(span_notice("[user] finishes sealing [src]."), span_notice("You finish sealing [src].")) seal = airlockseal modify_max_integrity(max_integrity * AIRLOCK_SEAL_MULTIPLIER) @@ -1157,12 +1157,12 @@ to_chat(user, span_warning("You don't have the dexterity to remove the seal!")) return TRUE user.visible_message(span_notice("[user] begins removing the seal from [src]."), span_notice("You begin removing [src]'s pneumatic seal.")) - playsound(src, 'sound/machines/airlockforced.ogg', 30, TRUE) + playsound(src, 'sound/machines/airlock/airlockforced.ogg', 30, TRUE) if(!do_after(user, airlockseal.unseal_time, target = src)) return TRUE if(!seal) return TRUE - playsound(src, 'sound/items/jaws_pry.ogg', 30, TRUE) + playsound(src, 'sound/items/tools/jaws_pry.ogg', 30, TRUE) airlockseal.forceMove(get_turf(user)) user.visible_message(span_notice("[user] finishes removing the seal from [src]."), span_notice("You finish removing [src]'s pneumatic seal.")) seal = null @@ -1196,10 +1196,10 @@ return TRUE /obj/machinery/door/airlock/try_to_crowbar(obj/item/I, mob/living/user, forced = FALSE) - if(I?.tool_behaviour == TOOL_CROWBAR && should_try_removing_electronics() && !operating) + if(I.tool_behaviour == TOOL_CROWBAR && should_try_removing_electronics() && !operating) user.visible_message(span_notice("[user] removes the electronics from the airlock assembly."), \ span_notice("You start to remove electronics from the airlock assembly...")) - if(I.use_tool(src, user, 40, volume=100)) + if(I.use_tool(src, user, 40, volume = 100)) deconstruct(TRUE, user) return if(seal) @@ -1222,10 +1222,10 @@ if(!prying_so_hard) var/time_to_open = 50 - playsound(src, 'sound/machines/airlock_alien_prying.ogg', 100, TRUE) //is it aliens or just the CE being a dick? + playsound(src, 'sound/machines/airlock/airlock_alien_prying.ogg', 100, TRUE) //is it aliens or just the CE being a dick? prying_so_hard = TRUE - if(do_after(user, time_to_open, src)) - if(check_electrified && shock(user,100)) + if(I.use_tool(src, user, time_to_open, volume = 100)) + if(check_electrified && shock(user, 100)) prying_so_hard = FALSE return open(BYPASS_DOOR_CHECKS) @@ -1402,7 +1402,7 @@ return TRUE if(BYPASS_DOOR_CHECKS) - playsound(src, 'sound/machines/airlockforced.ogg', 30, TRUE) + playsound(src, 'sound/machines/airlock/airlockforced.ogg', 30, TRUE) return TRUE else @@ -1495,7 +1495,7 @@ var/time_to_open = 5 //half a second if(hasPower()) time_to_open = 5 SECONDS //Powered airlocks take longer to open, and are loud. - playsound(src, 'sound/machines/airlock_alien_prying.ogg', 100, TRUE) + playsound(src, 'sound/machines/airlock/airlock_alien_prying.ogg', 100, TRUE) if(do_after(user, time_to_open, src)) @@ -2249,7 +2249,7 @@ if(!hasPower()) to_chat(user, span_notice("You begin unlocking the airlock safety mechanism...")) if(do_after(user, 15 SECONDS, target = src)) - try_to_crowbar(null, user, TRUE) + try_to_crowbar(src, user, TRUE) return TRUE else // always open from the space side @@ -2395,7 +2395,7 @@ new /obj/effect/temp_visual/cult/sac(loc) var/atom/throwtarget throwtarget = get_edge_target_turf(src, get_dir(src, get_step_away(L, src))) - SEND_SOUND(L, sound(pick('sound/hallucinations/turn_around1.ogg','sound/hallucinations/turn_around2.ogg'),0,1,50)) + SEND_SOUND(L, sound(pick('sound/effects/hallucinations/turn_around1.ogg','sound/effects/hallucinations/turn_around2.ogg'),0,1,50)) flash_color(L, flash_color=COLOR_CULT_RED, flash_time=20) L.Paralyze(40) L.throw_at(throwtarget, 5, 1) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 2edd188c6e8..d2ca4c7a017 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -210,7 +210,7 @@ if(!red_alert_access) return audible_message(span_notice("[src] whirr[p_s()] as [p_they()] automatically lift[p_s()] access requirements!")) - playsound(src, 'sound/machines/boltsup.ogg', 50, TRUE) + playsound(src, 'sound/machines/airlock/boltsup.ogg', 50, TRUE) /obj/machinery/door/proc/try_safety_unlock(mob/user) return FALSE @@ -334,7 +334,7 @@ return -/obj/machinery/door/proc/try_to_crowbar(obj/item/acting_object, mob/user) +/obj/machinery/door/proc/try_to_crowbar(obj/item/acting_object, mob/user, forced = FALSE) return /// Called when the user right-clicks on the door with a crowbar. @@ -399,7 +399,7 @@ switch(damage_type) if(BRUTE) if(glass) - playsound(loc, 'sound/effects/glasshit.ogg', 90, TRUE) + playsound(loc, 'sound/effects/glass/glasshit.ogg', 90, TRUE) else if(damage_amount) //SKYRAT EDIT ADDITION - CREDITS TO WHITEDREAM(valtos) playsound(src, pick('modular_skyrat/master_files/sound/effects/metalblock1.wav', 'modular_skyrat/master_files/sound/effects/metalblock2.wav', \ @@ -408,9 +408,9 @@ 'modular_skyrat/master_files/sound/effects/metalblock7.wav', 'modular_skyrat/master_files/sound/effects/metalblock8.wav'), 50, TRUE) //SKYRAT EDIT END else - playsound(src, 'sound/weapons/tap.ogg', 50, TRUE) + playsound(src, 'sound/items/weapons/tap.ogg', 50, TRUE) if(BURN) - playsound(src.loc, 'sound/items/welder.ogg', 100, TRUE) + playsound(src.loc, 'sound/items/tools/welder.ogg', 100, TRUE) /obj/machinery/door/emp_act(severity) . = ..() diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 4b21f0b54de..7c9e48af460 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -59,8 +59,8 @@ ///Keeps track of if we're playing the alarm sound loop (as only one firelock per group should be). Used during power changes. var/is_playing_alarm = FALSE - var/knock_sound = 'sound/effects/glassknock.ogg' - var/bash_sound = 'sound/effects/glassbash.ogg' + var/knock_sound = 'sound/effects/glass/glassknock.ogg' + var/bash_sound = 'sound/effects/glass/glassbash.ogg' /datum/armor/door_firedoor @@ -544,7 +544,7 @@ correct_state() /// We check for adjacency when using the primary attack. -/obj/machinery/door/firedoor/try_to_crowbar(obj/item/acting_object, mob/user) +/obj/machinery/door/firedoor/try_to_crowbar(obj/item/acting_object, mob/user, forced = FALSE) if(welded || operating) return diff --git a/code/game/machinery/doors/passworddoor.dm b/code/game/machinery/doors/passworddoor.dm index bccc243381b..8d35f44b0d8 100644 --- a/code/game/machinery/doors/passworddoor.dm +++ b/code/game/machinery/doors/passworddoor.dm @@ -20,7 +20,7 @@ /// Sound used upon closing. var/door_close = 'sound/machines/blastdoor.ogg' /// Sound used upon denying. - var/door_deny = 'sound/machines/buzz-sigh.ogg' + var/door_deny = 'sound/machines/buzz/buzz-sigh.ogg' /obj/machinery/door/password/voice voice_activated = TRUE @@ -103,7 +103,7 @@ playsound(src, door_deny, 30, TRUE) /obj/machinery/door/password/proc/ask_for_pass(mob/user) - var/guess = tgui_input_text(user, "Enter the password", "Password") + var/guess = tgui_input_text(user, "Enter the password", "Password", max_length = MAX_MESSAGE_LEN) if(guess == password) return TRUE return FALSE diff --git a/code/game/machinery/doors/poddoor.dm b/code/game/machinery/doors/poddoor.dm index a8ee8c4b58b..5a89dea6888 100644 --- a/code/game/machinery/doors/poddoor.dm +++ b/code/game/machinery/doors/poddoor.dm @@ -254,7 +254,7 @@ user.visible_message(span_warning("[user] begins prying open [src]."),\ span_noticealien("You begin digging your claws into [src] with all your might!"),\ span_warning("You hear groaning metal...")) - playsound(src, 'sound/machines/airlock_alien_prying.ogg', 100, TRUE) + playsound(src, 'sound/machines/airlock/airlock_alien_prying.ogg', 100, TRUE) var/time_to_open = 5 SECONDS if(hasPower()) diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 0c897c68096..d093cc0d355 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -6,7 +6,7 @@ layer = ABOVE_WINDOW_LAYER closingLayer = ABOVE_WINDOW_LAYER resistance_flags = ACID_PROOF - obj_flags = CAN_BE_HIT | BLOCKS_CONSTRUCTION_DIR + obj_flags = CAN_BE_HIT | IGNORE_DENSITY | BLOCKS_CONSTRUCTION_DIR var/base_state = "left" max_integrity = 150 //If you change this, consider changing ../door/window/brigdoor/ max_integrity at the bottom of this .dm file integrity_failure = 0 @@ -326,9 +326,9 @@ /obj/machinery/door/window/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) switch(damage_type) if(BRUTE) - playsound(src, 'sound/effects/glasshit.ogg', 90, TRUE) + playsound(src, 'sound/effects/glass/glasshit.ogg', 90, TRUE) if(BURN) - playsound(src, 'sound/items/welder.ogg', 100, TRUE) + playsound(src, 'sound/items/tools/welder.ogg', 100, TRUE) /obj/machinery/door/window/on_deconstruction(disassembled) if(disassembled) diff --git a/code/game/machinery/droneDispenser.dm b/code/game/machinery/drone_dispenser.dm similarity index 77% rename from code/game/machinery/droneDispenser.dm rename to code/game/machinery/drone_dispenser.dm index af39257973c..414746dcb19 100644 --- a/code/game/machinery/droneDispenser.dm +++ b/code/game/machinery/drone_dispenser.dm @@ -14,40 +14,58 @@ integrity_failure = 0.33 // These allow for different icons when creating custom dispensers + /// Icon string to use when the drone dispenser is not processing. var/icon_off = "off" + /// Icon string to use when the drone dispenser is processing. var/icon_on = "on" + /// Icon string to use when the drone dispenser is on cooldown. var/icon_recharging = "recharge" + /// Icon string to use when the drone dispenser is making a new shell. var/icon_creating = "make" + /// The quantity of materials used when generating a new drone shell. var/list/using_materials + /// Quantity of materials to automatically insert when the drone dispenser is spawned. var/starting_amount = 0 var/iron_cost = HALF_SHEET_MATERIAL_AMOUNT var/glass_cost = HALF_SHEET_MATERIAL_AMOUNT + /// Energy to draw when processing a new drone shell fresh. var/energy_used = 1 KILO JOULES + /// What operation the drone shell dispenser is currently in, checked in process() to determine behavior var/mode = DRONE_READY + /// Reference to world.time to use for calculation of cooldowns and production of a new drone dispenser. var/timer + /// How long should the drone dispenser be on cooldown after operating var/cooldownTime = 3 MINUTES - var/production_time = 30 + /// How long does it the drone dispenser take to generate a new drone shell? + var/production_time = 3 SECONDS //The item the dispenser will create - var/dispense_type = /obj/effect/mob_spawn/ghost_role/drone + var/list/dispense_type = list(/obj/effect/mob_spawn/ghost_role/drone) - // The maximum number of "idle" drone shells it will make before - // ceasing production. Set to 0 for infinite. + /// The maximum number of "idle" drone shells it will make before ceasing production. Set to 0 for infinite. var/maximum_idle = 3 - var/work_sound = 'sound/items/rped.ogg' + /// Sound that the drone dispnser plays when it's ready to start making more drones. + var/work_sound = 'sound/items/tools/rped.ogg' + /// Sound that the drone dispnser plays when it's created a new drone. var/create_sound = 'sound/items/deconstruct.ogg' + /// Sound that the drone dispnser plays when it's recharged it's cooldown. var/recharge_sound = 'sound/machines/ping.ogg' + /// String that's displayed for when the drone dispenser start working. var/begin_create_message = "whirs to life!" + /// String that's displayed for when the drone dispenser stops working. var/end_create_message = "dispenses a drone shell." + /// String that's displayed for when the drone dispenser finished it's cooldown. var/recharge_message = "pings." + /// String that's displayed for when the drone dispenser is still on cooldown. var/recharging_text = "It is whirring and clicking. It seems to be recharging." - + /// String that's displayed for when the drone dispenser is broken. var/break_message = "lets out a tinny alarm before falling dark." + /// Sound that the drone dispnser plays when it's broken. var/break_sound = 'sound/machines/warning-buzzer.ogg' - + /// Reference to the object's internal storage for materials. var/datum/component/material_container/materials /obj/machinery/drone_dispenser/Initialize(mapload) @@ -75,7 +93,7 @@ /obj/machinery/drone_dispenser/syndrone //Please forgive me name = "syndrone shell dispenser" desc = "A suspicious machine that will create Syndicate exterminator drones when supplied with iron and glass. Disgusting." - dispense_type = /obj/effect/mob_spawn/ghost_role/drone/syndrone + dispense_type = list(/obj/effect/mob_spawn/ghost_role/drone/syndrone) //If we're gonna be a jackass, go the full mile - 10 second recharge timer cooldownTime = 100 end_create_message = "dispenses a suspicious drone shell." @@ -84,14 +102,14 @@ /obj/machinery/drone_dispenser/syndrone/badass //Please forgive me name = "badass syndrone shell dispenser" desc = "A suspicious machine that will create Syndicate exterminator drones when supplied with iron and glass. Disgusting. This one seems ominous." - dispense_type = /obj/effect/mob_spawn/ghost_role/drone/syndrone/badass + dispense_type = list(/obj/effect/mob_spawn/ghost_role/drone/syndrone/badass) end_create_message = "dispenses an ominous suspicious drone shell." // I don't need your forgiveness, this is awesome. /obj/machinery/drone_dispenser/snowflake name = "snowflake drone shell dispenser" desc = "A hefty machine that, when supplied with iron and glass, will periodically create a snowflake drone shell. Does not need to be manually operated." - dispense_type = /obj/effect/mob_spawn/ghost_role/drone/snowflake + dispense_type = list(/obj/effect/mob_spawn/ghost_role/drone/snowflake) end_create_message = "dispenses a snowflake drone shell." // Those holoprojectors aren't cheap iron_cost = SHEET_MATERIAL_AMOUNT @@ -103,7 +121,7 @@ /obj/machinery/drone_dispenser/derelict name = "derelict drone shell dispenser" desc = "A rusty machine that, when supplied with iron and glass, will periodically create a derelict drone shell. Does not need to be manually operated." - dispense_type = /obj/effect/mob_spawn/ghost_role/drone/derelict + dispense_type = list(/obj/effect/mob_spawn/ghost_role/drone/derelict) end_create_message = "dispenses a derelict drone shell." iron_cost = SHEET_MATERIAL_AMOUNT * 5 glass_cost = SHEET_MATERIAL_AMOUNT * 2.5 @@ -113,7 +131,7 @@ /obj/machinery/drone_dispenser/classic name = "classic drone shell dispenser" desc = "A hefty machine that, when supplied with iron and glass, will periodically create a classic drone shell. Does not need to be manually operated." - dispense_type = /obj/effect/mob_spawn/ghost_role/drone/classic + dispense_type = list(/obj/effect/mob_spawn/ghost_role/drone/classic) end_create_message = "dispenses a classic drone shell." // An example of a custom drone dispenser. @@ -131,7 +149,7 @@ glass_cost = 0 energy_used = 0 cooldownTime = 10 //Only 1 second - hivebots are extremely weak - dispense_type = /mob/living/basic/hivebot + dispense_type = list(/mob/living/basic/hivebot) begin_create_message = "closes and begins fabricating something within." end_create_message = "slams open, revealing a hivebot!" recharge_sound = null @@ -141,7 +159,7 @@ /obj/machinery/drone_dispenser/binoculars name = "binoculars fabricator" desc = "A hefty machine that periodically creates a pair of binoculars. Really, Nanotrasen? We're getting this lazy?" - dispense_type = /obj/item/binoculars + dispense_type = list(/obj/item/binoculars) starting_amount = SHEET_MATERIAL_AMOUNT * 2.5 //Redudant maximum_idle = 1 cooldownTime = 5 SECONDS @@ -194,8 +212,9 @@ if(energy_used) use_energy(energy_used) - var/atom/A = new dispense_type(loc) - A.flags_1 |= (flags_1 & ADMIN_SPAWNED_1) + for(var/spawnable_item as anything in dispense_type) + var/atom/spawned_atom = new spawnable_item(loc) + spawned_atom.flags_1 |= (flags_1 & ADMIN_SPAWNED_1) if(create_sound) playsound(src, create_sound, 50, TRUE) @@ -217,9 +236,10 @@ /obj/machinery/drone_dispenser/proc/count_shells() . = 0 - for(var/a in loc) - if(istype(a, dispense_type)) - .++ + for(var/actual_shell in loc) + for(var/potential_item as anything in dispense_type) + if(istype(actual_shell, potential_item)) + .++ /obj/machinery/drone_dispenser/update_icon_state() if(machine_stat & (BROKEN|NOPOWER)) diff --git a/code/game/machinery/fat_sucker.dm b/code/game/machinery/fat_sucker.dm index c93a0e4f7ea..0652ab1605e 100644 --- a/code/game/machinery/fat_sucker.dm +++ b/code/game/machinery/fat_sucker.dm @@ -166,7 +166,7 @@ set_light(2, 1, "#ff0000") else say("Subject not fat enough.") - playsound(src, 'sound/machines/buzz-sigh.ogg', 40, FALSE) + playsound(src, 'sound/machines/buzz/buzz-sigh.ogg', 40, FALSE) overlays += "[icon_state]_red" //throw a red light icon over it, to show that it won't work /obj/machinery/fat_sucker/proc/stop() diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index 94612b8c9db..5853389ac80 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -108,7 +108,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/flasher, 26) power_change() return - playsound(src, 'sound/weapons/flash.ogg', 100, TRUE) + playsound(src, 'sound/items/weapons/flash.ogg', 100, TRUE) flick("[base_icon_state]_flash", src) flash_lighting_fx() diff --git a/code/game/machinery/flatpacker.dm b/code/game/machinery/flatpacker.dm index 01224ad8b00..56fcc8a8ae7 100644 --- a/code/game/machinery/flatpacker.dm +++ b/code/game/machinery/flatpacker.dm @@ -268,7 +268,7 @@ if(!materials.has_materials(needed_mats, creation_efficiency)) say("Not enough materials to begin production.") return - playsound(src, 'sound/items/rped.ogg', 50, TRUE) + playsound(src, 'sound/items/tools/rped.ogg', 50, TRUE) busy = TRUE flick_overlay_view(mutable_appearance('icons/obj/machines/lathes.dmi', "flatpacker_bar"), flatpack_time) @@ -401,7 +401,7 @@ new /obj/effect/temp_visual/mook_dust(loc) var/obj/machinery/new_machine = new board.build_path(loc) loc.visible_message(span_warning("[src] deploys!")) - playsound(src, 'sound/machines/terminal_eject.ogg', 70, TRUE) + playsound(src, 'sound/machines/terminal/terminal_eject.ogg', 70, TRUE) new_machine.on_construction(user) qdel(src) return ITEM_INTERACT_SUCCESS diff --git a/code/game/machinery/harvester.dm b/code/game/machinery/harvester.dm index 5fa999a690e..4949f53adfb 100644 --- a/code/game/machinery/harvester.dm +++ b/code/game/machinery/harvester.dm @@ -76,15 +76,15 @@ for(var/obj/item/abiotic_item in carbon_occupant.held_items + carbon_occupant.get_equipped_items()) if(!(HAS_TRAIT(abiotic_item, TRAIT_NODROP))) say("Subject may not have abiotic items on.") - playsound(src, 'sound/machines/buzz-sigh.ogg', 30, TRUE) + playsound(src, 'sound/machines/buzz/buzz-sigh.ogg', 30, TRUE) return if(!(carbon_occupant.mob_biotypes & MOB_ORGANIC)) say("Subject is not organic.") - playsound(src, 'sound/machines/buzz-sigh.ogg', 30, TRUE) + playsound(src, 'sound/machines/buzz/buzz-sigh.ogg', 30, TRUE) return if(!allow_living && !(carbon_occupant.stat == DEAD || HAS_TRAIT(carbon_occupant, TRAIT_FAKEDEATH))) //I mean, the machines scanners arent advanced enough to tell you're alive say("Subject is still alive.") - playsound(src, 'sound/machines/buzz-sigh.ogg', 30, TRUE) + playsound(src, 'sound/machines/buzz/buzz-sigh.ogg', 30, TRUE) return return TRUE @@ -141,7 +141,7 @@ open_machine() if (!success) say("Protocol interrupted. Aborting harvest.") - playsound(src, 'sound/machines/buzz-sigh.ogg', 30, TRUE) + playsound(src, 'sound/machines/buzz/buzz-sigh.ogg', 30, TRUE) else say("Subject has been successfully harvested.") playsound(src, 'sound/machines/microwave/microwave-end.ogg', 100, FALSE) diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index 2e40b0b8e48..322057b1862 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -522,7 +522,7 @@ Possible to do for anyone motivated enough: if(outgoing_call) holocall.Disconnect(src)//can't answer calls while calling else - playsound(src, 'sound/machines/twobeep.ogg', 100) //bring, bring! + playsound(src, 'sound/machines/beep/twobeep.ogg', 100) //bring, bring! are_ringing = TRUE if(ringing != are_ringing) diff --git a/code/game/machinery/hypnochair.dm b/code/game/machinery/hypnochair.dm index b5ec2c58b38..a2895f6ae9f 100644 --- a/code/game/machinery/hypnochair.dm +++ b/code/game/machinery/hypnochair.dm @@ -91,11 +91,11 @@ /obj/machinery/hypnochair/proc/interrogate() if(!trigger_phrase) - playsound(get_turf(src), 'sound/machines/buzz-sigh.ogg', 25, TRUE) + playsound(get_turf(src), 'sound/machines/buzz/buzz-sigh.ogg', 25, TRUE) return var/mob/living/carbon/C = occupant if(!istype(C)) - playsound(get_turf(src), 'sound/machines/buzz-sigh.ogg', 25, TRUE) + playsound(get_turf(src), 'sound/machines/buzz/buzz-sigh.ogg', 25, TRUE) return victim = C if(C.get_eye_protection() <= 0) @@ -114,13 +114,13 @@ interrupt_interrogation() return if(SPT_PROB(5, seconds_per_tick) && !(C.get_eye_protection() > 0)) - to_chat(C, "[pick(\ + to_chat(C, span_hypnophrase(pick(\ "...blue... red... green... blue, red, green, blueredgreen[span_small("blueredgreen")]",\ "...pretty colors...",\ "...you keep hearing words, but you can't seem to understand them...",\ "...so peaceful...",\ "...an annoying buzz in your ears..."\ - )]") + ))) use_energy(active_power_usage * seconds_per_tick) diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index e1b10dae6e4..437c2dbd168 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -256,7 +256,7 @@ // If the human is losing too much blood, beep. if(attached_mob.blood_volume < BLOOD_VOLUME_SAFE && prob(5)) audible_message(span_hear("[src] beeps loudly.")) - playsound(loc, 'sound/machines/twobeep_high.ogg', 50, TRUE) + playsound(loc, 'sound/machines/beep/twobeep_high.ogg', 50, TRUE) var/atom/movable/target = use_internal_storage ? src : reagent_container attached_mob.transfer_blood_to(target, amount) update_appearance(UPDATE_ICON) diff --git a/code/game/machinery/launch_pad.dm b/code/game/machinery/launch_pad.dm index 67ad9168150..c2fb218d50a 100644 --- a/code/game/machinery/launch_pad.dm +++ b/code/game/machinery/launch_pad.dm @@ -181,11 +181,11 @@ indicator_icon = "launchpad_pull" update_indicator() - playsound(get_turf(src), 'sound/weapons/flash.ogg', 25, TRUE) + playsound(get_turf(src), 'sound/items/weapons/flash.ogg', 25, TRUE) teleporting = TRUE if(!hidden) - playsound(target, 'sound/weapons/flash.ogg', 25, TRUE) + playsound(target, 'sound/items/weapons/flash.ogg', 25, TRUE) var/datum/effect_system/spark_spread/quantum/spark_system = new /datum/effect_system/spark_spread/quantum() spark_system.set_up(5, TRUE, target) spark_system.start() @@ -203,7 +203,7 @@ if(!hidden) // Takes twice as long to make sure it properly fades out. Beam(target, icon_state = teleport_beam, time = BEAM_FADE_TIME*2, beam_type = /obj/effect/ebeam/launchpad) - playsound(target, 'sound/weapons/emitter2.ogg', 25, TRUE) + playsound(target, 'sound/items/weapons/emitter2.ogg', 25, TRUE) // use a lot of power use_energy(active_power_usage) @@ -216,7 +216,7 @@ source = dest dest = target - playsound(get_turf(src), 'sound/weapons/emitter2.ogg', 25, TRUE) + playsound(get_turf(src), 'sound/items/weapons/emitter2.ogg', 25, TRUE) var/first = TRUE for(var/atom/movable/ROI in source) if(ROI == src) diff --git a/code/game/machinery/limbgrower.dm b/code/game/machinery/limbgrower.dm index cd36dcce09a..834d7115b04 100644 --- a/code/game/machinery/limbgrower.dm +++ b/code/game/machinery/limbgrower.dm @@ -178,7 +178,7 @@ consumed_reagents_list[reagent_id] *= production_coefficient if(!reagents.has_reagent(reagent_id, consumed_reagents_list[reagent_id])) audible_message(span_notice("[src] buzzes.")) - playsound(src, 'sound/machines/buzz-sigh.ogg', 50, FALSE) + playsound(src, 'sound/machines/buzz/buzz-sigh.ogg', 50, FALSE) return power = max(active_power_usage, (power + consumed_reagents_list[reagent_id])) @@ -207,7 +207,7 @@ for(var/reagent_id in modified_consumed_reagents_list) if(!reagents.has_reagent(reagent_id, modified_consumed_reagents_list[reagent_id])) audible_message(span_notice("The [src] buzzes.")) - playsound(src, 'sound/machines/buzz-sigh.ogg', 50, FALSE) + playsound(src, 'sound/machines/buzz/buzz-sigh.ogg', 50, FALSE) break reagents.remove_reagent(reagent_id, modified_consumed_reagents_list[reagent_id]) diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm index f6f4270835c..98149a82322 100644 --- a/code/game/machinery/navbeacon.dm +++ b/code/game/machinery/navbeacon.dm @@ -211,7 +211,7 @@ toggle_code(NAVBEACON_DELIVERY_MODE) return TRUE if("set_location") - var/input_text = tgui_input_text(user, "Enter the beacon's location tag", "Beacon Location", location, 20) + var/input_text = tgui_input_text(user, "Enter the beacon's location tag", "Beacon Location", location, max_length = 20) if (!input_text || location == input_text) return glob_lists_deregister() @@ -220,7 +220,7 @@ return TRUE if("set_patrol_next") var/next_patrol = codes[NAVBEACON_PATROL_NEXT] - var/input_text = tgui_input_text(user, "Enter the tag of the next patrol location", "Beacon Location", next_patrol, 20) + var/input_text = tgui_input_text(user, "Enter the tag of the next patrol location", "Beacon Location", next_patrol, max_length = 20) if (!input_text || location == input_text) return codes[NAVBEACON_PATROL_NEXT] = input_text diff --git a/code/game/machinery/newscaster/newscaster_machine.dm b/code/game/machinery/newscaster/newscaster_machine.dm index 3186d2081e5..18c3d9434d8 100644 --- a/code/game/machinery/newscaster/newscaster_machine.dm +++ b/code/game/machinery/newscaster/newscaster_machine.dm @@ -405,14 +405,14 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/newscaster, 30) return TRUE if("setCriminalName") - var/temp_name = tgui_input_text(usr, "Write the Criminal's Name", "Warrent Alert Handler", "John Doe", MAX_NAME_LEN, multiline = FALSE) + var/temp_name = tgui_input_text(usr, "Write the Criminal's Name", "Warrent Alert Handler", "John Doe", max_length = MAX_NAME_LEN, multiline = FALSE) if(!temp_name) return TRUE criminal_name = temp_name return TRUE if("setCrimeData") - var/temp_desc = tgui_input_text(usr, "Write the Criminal's Crimes", "Warrent Alert Handler", "Unknown", MAX_BROADCAST_LEN, multiline = TRUE) + var/temp_desc = tgui_input_text(usr, "Write the Criminal's Crimes", "Warrent Alert Handler", "Unknown", max_length = MAX_BROADCAST_LEN, multiline = TRUE) if(!temp_desc) return TRUE crime_description = temp_desc @@ -529,9 +529,9 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/newscaster, 30) if(machine_stat & BROKEN) playsound(loc, 'sound/effects/hit_on_shattered_glass.ogg', 100, TRUE) else - playsound(loc, 'sound/effects/glasshit.ogg', 90, TRUE) + playsound(loc, 'sound/effects/glass/glasshit.ogg', 90, TRUE) if(BURN) - playsound(src.loc, 'sound/items/welder.ogg', 100, TRUE) + playsound(src.loc, 'sound/items/tools/welder.ogg', 100, TRUE) /obj/machinery/newscaster/on_deconstruction(disassembled) @@ -542,7 +542,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/newscaster, 30) /obj/machinery/newscaster/atom_break(damage_flag) . = ..() if(.) - playsound(loc, 'sound/effects/glassbr3.ogg', 100, TRUE) + playsound(loc, 'sound/effects/glass/glassbr3.ogg', 100, TRUE) /obj/machinery/newscaster/attack_paw(mob/living/user, list/modifiers) @@ -623,7 +623,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/newscaster, 30) if(channel) if(update_alert) say("Breaking news from [channel]!") - playsound(loc, 'sound/machines/twobeep_high.ogg', 75, TRUE) + playsound(loc, 'sound/machines/beep/twobeep_high.ogg', 75, TRUE) alert = TRUE update_appearance() addtimer(CALLBACK(src, PROC_REF(remove_alert)), ALERT_DELAY, TIMER_UNIQUE|TIMER_OVERRIDE) @@ -703,7 +703,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/newscaster, 30) if(channel_name == potential_channel.channel_ID) current_channel = potential_channel break - var/temp_message = tgui_input_text(usr, "Write your Feed story", "Network Channel Handler", feed_channel_message, multiline = TRUE) + var/temp_message = tgui_input_text(usr, "Write your Feed story", "Network Channel Handler", feed_channel_message, max_length = MAX_BROADCAST_LEN, multiline = TRUE) if(length(temp_message) <= 1) return TRUE if(temp_message) @@ -745,10 +745,10 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/newscaster, 30) */ /obj/machinery/newscaster/proc/delete_bounty_request() if(!active_request || !current_user) - playsound(src, 'sound/machines/buzz-sigh.ogg', 20, TRUE) + playsound(src, 'sound/machines/buzz/buzz-sigh.ogg', 20, TRUE) return TRUE if(active_request?.owner != current_user.account_holder) - playsound(src, 'sound/machines/buzz-sigh.ogg', 20, TRUE) + playsound(src, 'sound/machines/buzz/buzz-sigh.ogg', 20, TRUE) return TRUE say("Deleted current request.") GLOB.request_list.Remove(active_request) @@ -759,7 +759,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/newscaster, 30) */ /obj/machinery/newscaster/proc/create_bounty() if(!current_user || !bounty_text) - playsound(src, 'sound/machines/buzz-sigh.ogg', 20, TRUE) + playsound(src, 'sound/machines/buzz/buzz-sigh.ogg', 20, TRUE) return TRUE for(var/datum/station_request/iterated_station_request as anything in GLOB.request_list) if(iterated_station_request.req_number == current_user.account_id) @@ -779,11 +779,11 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/newscaster, 30) say("No ID detected.") return TRUE if(current_user.account_holder == active_request.owner) - playsound(src, 'sound/machines/buzz-sigh.ogg', 20, TRUE) + playsound(src, 'sound/machines/buzz/buzz-sigh.ogg', 20, TRUE) return TRUE for(var/new_apply in active_request?.applicants) if(current_user.account_holder == active_request?.applicants[new_apply]) - playsound(src, 'sound/machines/buzz-sigh.ogg', 20, TRUE) + playsound(src, 'sound/machines/buzz/buzz-sigh.ogg', 20, TRUE) return TRUE active_request.applicants += list(current_user) @@ -794,7 +794,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/newscaster, 30) if(!current_user) return TRUE if(!current_user.has_money(active_request.value) || (current_user.account_holder != active_request.owner)) - playsound(src, 'sound/machines/buzz-sigh.ogg', 30, TRUE) + playsound(src, 'sound/machines/buzz/buzz-sigh.ogg', 30, TRUE) return TRUE payment_target.transfer_money(current_user, active_request.value, "Bounty Request") say("Paid out [active_request.value] credits.") diff --git a/code/game/machinery/newscaster/newspaper.dm b/code/game/machinery/newscaster/newspaper.dm index c381f2f5063..6bc1e6c77ff 100644 --- a/code/game/machinery/newscaster/newspaper.dm +++ b/code/game/machinery/newscaster/newspaper.dm @@ -84,7 +84,7 @@ if(scribble_page == current_page) user.balloon_alert(user, "already scribbled!") return - var/new_scribble_text = tgui_input_text(user, "What do you want to scribble?", "Write something") + var/new_scribble_text = tgui_input_text(user, "What do you want to scribble?", "Write something", max_length = MAX_MESSAGE_LEN) if(isnull(new_scribble_text)) return add_fingerprint(user) diff --git a/code/game/machinery/photobooth.dm b/code/game/machinery/photobooth.dm index 321ae7efd6e..d1244bcc85d 100644 --- a/code/game/machinery/photobooth.dm +++ b/code/game/machinery/photobooth.dm @@ -130,7 +130,7 @@ 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) + playsound(src, pick('sound/items/polaroid/polaroid1.ogg', 'sound/items/polaroid/polaroid2.ogg'), 75, TRUE) if(carbon_occupant) carbon_occupant.flash_act(5) sleep(0.2 SECONDS) @@ -141,12 +141,12 @@ 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) + playsound(src, 'sound/items/polaroid/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) + playsound(src, 'sound/items/polaroid/polaroid2.ogg', 75, TRUE) flash() if(!do_after(occupant, 2 SECONDS, src, timed_action_flags = IGNORE_HELD_ITEM)) taking_pictures = FALSE diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm index 1e90b270c8c..de7c6351e38 100644 --- a/code/game/machinery/pipe/pipe_dispenser.dm +++ b/code/game/machinery/pipe/pipe_dispenser.dm @@ -187,9 +187,6 @@ //Allow you to drag-drop disposal pipes and transit tubes into it /obj/machinery/pipedispenser/disposal/mouse_drop_receive(obj/structure/pipe, mob/user, params) - if(user.incapacitated) - return - if (!istype(pipe, /obj/structure/disposalconstruct) && !istype(pipe, /obj/structure/c_transit_tube) && !istype(pipe, /obj/structure/c_transit_tube_pod)) return diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index b1b5fc2b8f8..e64e01bbcf2 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -135,15 +135,13 @@ 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) ///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)) + if(turn_on && !COOLDOWN_FINISHED(src, disabled_time)) return on = turn_on check_should_process() @@ -157,10 +155,10 @@ DEFINE_BITFIELD(turret_flags, list( 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 +/obj/machinery/porta_turret/on_saboteur(datum/source, disrupt_duration) + . = ..() INVOKE_ASYNC(src, PROC_REF(set_disabled), disrupt_duration) - return COMSIG_SABOTEUR_SUCCESS + return TRUE /obj/machinery/porta_turret/proc/check_should_process() if (datum_flags & DF_ISPROCESSING) @@ -575,7 +573,7 @@ DEFINE_BITFIELD(turret_flags, list( // If we aren't shooting heads then return a threatcount of 0 if (!(turret_flags & TURRET_FLAG_SHOOT_HEADS)) - var/datum/job/apparent_job = SSjob.GetJob(perp.get_assignment()) + var/datum/job/apparent_job = SSjob.get_job(perp.get_assignment()) if(apparent_job?.job_flags & JOB_HEAD_OF_STAFF) return 0 @@ -749,8 +747,8 @@ DEFINE_BITFIELD(turret_flags, list( mode = TURRET_LETHAL stun_projectile = /obj/projectile/bullet lethal_projectile = /obj/projectile/bullet - lethal_projectile_sound = 'sound/weapons/gun/pistol/shot.ogg' - stun_projectile_sound = 'sound/weapons/gun/pistol/shot.ogg' + lethal_projectile_sound = 'sound/items/weapons/gun/pistol/shot.ogg' + stun_projectile_sound = 'sound/items/weapons/gun/pistol/shot.ogg' icon_state = "syndie_off" base_icon_state = "syndie" faction = list(ROLE_SYNDICATE) @@ -771,9 +769,9 @@ DEFINE_BITFIELD(turret_flags, list( icon_state = "standard_lethal" base_icon_state = "standard" stun_projectile = /obj/projectile/energy/electrode - stun_projectile_sound = 'sound/weapons/taser.ogg' + stun_projectile_sound = 'sound/items/weapons/taser.ogg' lethal_projectile = /obj/projectile/beam/laser - lethal_projectile_sound = 'sound/weapons/laser.ogg' + lethal_projectile_sound = 'sound/items/weapons/laser.ogg' desc = "An energy blaster auto-turret." armor_type = /datum/armor/syndicate_turret @@ -790,14 +788,14 @@ DEFINE_BITFIELD(turret_flags, list( icon_state = "standard_lethal" base_icon_state = "standard" stun_projectile = /obj/projectile/energy/electrode - stun_projectile_sound = 'sound/weapons/taser.ogg' + stun_projectile_sound = 'sound/items/weapons/taser.ogg' lethal_projectile = /obj/projectile/beam/laser/heavylaser - lethal_projectile_sound = 'sound/weapons/lasercannonfire.ogg' + lethal_projectile_sound = 'sound/items/weapons/lasercannonfire.ogg' desc = "An energy blaster auto-turret." /obj/machinery/porta_turret/syndicate/energy/raven stun_projectile = /obj/projectile/beam/laser - stun_projectile_sound = 'sound/weapons/laser.ogg' + stun_projectile_sound = 'sound/items/weapons/laser.ogg' faction = list(FACTION_NEUTRAL,FACTION_SILICON,FACTION_TURRET) /obj/machinery/porta_turret/syndicate/pod @@ -808,9 +806,9 @@ DEFINE_BITFIELD(turret_flags, list( /obj/machinery/porta_turret/syndicate/irs lethal_projectile = /obj/projectile/bullet/c10mm/ap - lethal_projectile_sound = 'sound/weapons/gun/smg/shot.ogg' + lethal_projectile_sound = 'sound/items/weapons/gun/smg/shot.ogg' stun_projectile = /obj/projectile/bullet/c10mm/ap - stun_projectile_sound = 'sound/weapons/gun/smg/shot.ogg' + stun_projectile_sound = 'sound/items/weapons/gun/smg/shot.ogg' armor_type = /datum/armor/syndicate_turret faction = list(FACTION_PIRATE) @@ -819,8 +817,8 @@ DEFINE_BITFIELD(turret_flags, list( shot_delay = 3 stun_projectile = /obj/projectile/bullet/p50/penetrator/shuttle lethal_projectile = /obj/projectile/bullet/p50/penetrator/shuttle - lethal_projectile_sound = 'sound/weapons/gun/smg/shot.ogg' - stun_projectile_sound = 'sound/weapons/gun/smg/shot.ogg' + lethal_projectile_sound = 'sound/items/weapons/gun/smg/shot.ogg' + stun_projectile_sound = 'sound/items/weapons/gun/smg/shot.ogg' armor_type = /datum/armor/syndicate_shuttle /datum/armor/syndicate_shuttle @@ -853,7 +851,7 @@ DEFINE_BITFIELD(turret_flags, list( installation = null uses_stored = FALSE lethal_projectile = /obj/projectile/plasma/turret - lethal_projectile_sound = 'sound/weapons/plasma_cutter.ogg' + lethal_projectile_sound = 'sound/items/weapons/plasma_cutter.ogg' mode = TURRET_LETHAL //It would be useless in stun mode anyway faction = list(FACTION_NEUTRAL,FACTION_SILICON,FACTION_TURRET) //Minebots, medibots, etc that should not be shot. @@ -880,8 +878,8 @@ DEFINE_BITFIELD(turret_flags, list( scan_range = 9 stun_projectile = /obj/projectile/beam/laser lethal_projectile = /obj/projectile/beam/laser - lethal_projectile_sound = 'sound/weapons/plasma_cutter.ogg' - stun_projectile_sound = 'sound/weapons/plasma_cutter.ogg' + lethal_projectile_sound = 'sound/items/weapons/plasma_cutter.ogg' + stun_projectile_sound = 'sound/items/weapons/plasma_cutter.ogg' icon_state = "syndie_off" base_icon_state = "syndie" faction = list(FACTION_NEUTRAL,FACTION_SILICON,FACTION_TURRET) @@ -906,6 +904,13 @@ DEFINE_BITFIELD(turret_flags, list( lethal_projectile = /obj/projectile/beam/weak/penetrator faction = list(FACTION_NEUTRAL,FACTION_SILICON,FACTION_TURRET) +/obj/machinery/porta_turret/centcom_shuttle/weak/mining + name = "Old Mining Turret" + lethal_projectile = /obj/projectile/kinetic/miner + lethal_projectile_sound = 'sound/items/weapons/kinetic_accel.ogg' + stun_projectile = /obj/projectile/kinetic/miner + stun_projectile_sound = 'sound/items/weapons/kinetic_accel.ogg' + //////////////////////// //Turret Control Panel// //////////////////////// diff --git a/code/game/machinery/porta_turret/portable_turret_construct.dm b/code/game/machinery/porta_turret/portable_turret_construct.dm index a8fa4e67b2b..0ae7d9699ee 100644 --- a/code/game/machinery/porta_turret/portable_turret_construct.dm +++ b/code/game/machinery/porta_turret/portable_turret_construct.dm @@ -182,7 +182,7 @@ return if(used.get_writing_implement_details()?["interaction_mode"] == MODE_WRITING) //you can rename turrets like bots! - var/choice = tgui_input_text(user, "Enter a new turret name", "Turret Classification", finish_name, MAX_NAME_LEN) + var/choice = tgui_input_text(user, "Enter a new turret name", "Turret Classification", finish_name, max_length = MAX_NAME_LEN) if(!choice) return if(!user.can_perform_action(src)) diff --git a/code/game/machinery/portagrav.dm b/code/game/machinery/portagrav.dm index c970fa5f8f1..62fc67b7c07 100644 --- a/code/game/machinery/portagrav.dm +++ b/code/game/machinery/portagrav.dm @@ -229,7 +229,7 @@ . = ..() if(.) return - playsound(src, 'sound/machines/terminal_button07.ogg', 45, TRUE) + playsound(src, 'sound/machines/terminal/terminal_button07.ogg', 45, TRUE) switch(action) if("adjust_grav") var/adjustment = text2num(params["adjustment"]) diff --git a/code/game/machinery/prisongate.dm b/code/game/machinery/prisongate.dm index b05b6dd90c4..88cb40dd50f 100644 --- a/code/game/machinery/prisongate.dm +++ b/code/game/machinery/prisongate.dm @@ -51,7 +51,7 @@ for(var/mob/living/stowaway in cargobay.contents) //nice try bub if(COOLDOWN_FINISHED(src, spam_cooldown_time)) say("Stowaway detected in internal contents. Access denied.") - playsound(src, 'sound/machines/buzz-two.ogg', 50, FALSE) + playsound(src, 'sound/machines/buzz/buzz-two.ogg', 50, FALSE) COOLDOWN_START(src, spam_cooldown_time, SPAM_CD) return FALSE var/mob/living/carbon/the_toucher = gate_toucher @@ -82,7 +82,7 @@ return TRUE if(COOLDOWN_FINISHED(src, spam_cooldown_time)) say("Prison ID with ongoing sentence detected. Access denied.") - playsound(src, 'sound/machines/buzz-two.ogg', 50, FALSE) + playsound(src, 'sound/machines/buzz/buzz-two.ogg', 50, FALSE) COOLDOWN_START(src, spam_cooldown_time, SPAM_CD) return FALSE if(COOLDOWN_FINISHED(src, spam_cooldown_time)) diff --git a/code/game/machinery/quantum_pad.dm b/code/game/machinery/quantum_pad.dm index 3c698a918e6..273d4749cfd 100644 --- a/code/game/machinery/quantum_pad.dm +++ b/code/game/machinery/quantum_pad.dm @@ -138,7 +138,7 @@ /obj/machinery/quantumpad/proc/doteleport(mob/user = null, obj/machinery/quantumpad/target_pad = linked_pad) if(!target_pad) return - playsound(get_turf(src), 'sound/weapons/flash.ogg', 25, TRUE) + playsound(get_turf(src), 'sound/items/weapons/flash.ogg', 25, TRUE) teleporting = TRUE addtimer(CALLBACK(src, PROC_REF(teleport_contents), user, target_pad), teleport_speed) @@ -162,9 +162,9 @@ target_pad.sparks() flick("qpad-beam", src) - playsound(get_turf(src), 'sound/weapons/emitter2.ogg', 25, TRUE) + playsound(get_turf(src), 'sound/items/weapons/emitter2.ogg', 25, TRUE) flick("qpad-beam", target_pad) - playsound(get_turf(target_pad), 'sound/weapons/emitter2.ogg', 25, TRUE) + playsound(get_turf(target_pad), 'sound/items/weapons/emitter2.ogg', 25, TRUE) for(var/atom/movable/ROI in get_turf(src)) if(QDELETED(ROI)) continue //sleeps in CHECK_TICK diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm index 8ce9265917d..166410cfccf 100644 --- a/code/game/machinery/recycler.dm +++ b/code/game/machinery/recycler.dm @@ -15,7 +15,7 @@ var/amount_produced = 50 var/crush_damage = 1000 var/eat_victim_items = TRUE - var/item_recycle_sound = 'sound/items/welder.ogg' + var/item_recycle_sound = 'sound/items/tools/welder.ogg' var/datum/component/material_container/materials /obj/machinery/recycler/Initialize(mapload) @@ -206,7 +206,7 @@ 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) - playsound(src, 'sound/machines/buzz-sigh.ogg', (50 + not_eaten * 5), FALSE, not_eaten, ignore_walls = (not_eaten - 10)) // Ditto. + playsound(src, 'sound/machines/buzz/buzz-sigh.ogg', (50 + not_eaten * 5), FALSE, not_eaten, ignore_walls = (not_eaten - 10)) // Ditto. /obj/machinery/recycler/proc/recycle_item(obj/item/weapon) . = FALSE @@ -225,7 +225,7 @@ qdel(weapon) /obj/machinery/recycler/proc/emergency_stop() - playsound(src, 'sound/machines/buzz-sigh.ogg', 50, FALSE) + playsound(src, 'sound/machines/buzz/buzz-sigh.ogg', 50, FALSE) safety_mode = TRUE update_appearance() addtimer(CALLBACK(src, PROC_REF(reboot)), SAFETY_COOLDOWN) @@ -239,7 +239,7 @@ L.forceMove(loc) if(issilicon(L)) - playsound(src, 'sound/items/welder.ogg', 50, TRUE) + playsound(src, 'sound/items/tools/welder.ogg', 50, TRUE) else playsound(src, 'sound/effects/splat.ogg', 50, TRUE) diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm index f2b1ba303eb..dea6503858c 100644 --- a/code/game/machinery/requests_console.dm +++ b/code/game/machinery/requests_console.dm @@ -217,7 +217,7 @@ GLOBAL_LIST_EMPTY(req_console_ckey_departments) return if(!reply_message) has_mail_send_error = TRUE - playsound(src, 'sound/machines/buzz-two.ogg', 50, TRUE) + playsound(src, 'sound/machines/buzz/buzz-two.ogg', 50, TRUE) return TRUE send_message(recipient, reply_message, REQ_NORMAL_MESSAGE_PRIORITY, REPLY_REQUEST) @@ -273,9 +273,9 @@ GLOBAL_LIST_EMPTY(req_console_ckey_departments) if(!silent) if(has_mail_send_error) - playsound(src, 'sound/machines/buzz-two.ogg', 50, TRUE) + playsound(src, 'sound/machines/buzz/buzz-two.ogg', 50, TRUE) else - playsound(src, 'sound/machines/twobeep.ogg', 50, TRUE) + playsound(src, 'sound/machines/beep/twobeep.ogg', 50, TRUE) message_stamped_by = "" message_verified_by = "" @@ -350,7 +350,7 @@ GLOBAL_LIST_EMPTY(req_console_ckey_departments) var/alert = new_message.get_alert() if(!silent) - playsound(src, 'sound/machines/twobeep_high.ogg', 50, TRUE) + playsound(src, 'sound/machines/beep/twobeep_high.ogg', 50, TRUE) say(alert) if(new_message.radio_freq) diff --git a/code/game/machinery/roulette_machine.dm b/code/game/machinery/roulette_machine.dm index 468992b1246..f0bc48916ae 100644 --- a/code/game/machinery/roulette_machine.dm +++ b/code/game/machinery/roulette_machine.dm @@ -127,7 +127,7 @@ if(isidcard(W)) playsound(src, 'sound/machines/card_slide.ogg', 50, TRUE) else - playsound(src, 'sound/machines/terminal_success.ogg', 50, TRUE) + playsound(src, 'sound/machines/terminal/terminal_success.ogg', 50, TRUE) if(machine_stat & MAINT || !on || locked) to_chat(user, span_notice("The machine appears to be disabled.")) @@ -135,17 +135,17 @@ if(!player_card.registered_account) say("You don't have a bank account!") - playsound(src, 'sound/machines/buzz-two.ogg', 30, TRUE) + playsound(src, 'sound/machines/buzz/buzz-two.ogg', 30, TRUE) return FALSE if(my_card) if(IS_DEPARTMENTAL_CARD(player_card)) // Are they using a department ID say("You cannot gamble with the department budget!") - playsound(src, 'sound/machines/buzz-two.ogg', 30, TRUE) + playsound(src, 'sound/machines/buzz/buzz-two.ogg', 30, TRUE) return FALSE if(player_card.registered_account.account_balance < chosen_bet_amount) //Does the player have enough funds say("You do not have the funds to play! Lower your bet or get more money.") - playsound(src, 'sound/machines/buzz-two.ogg', 30, TRUE) + playsound(src, 'sound/machines/buzz/buzz-two.ogg', 30, TRUE) return FALSE if(!chosen_bet_amount || isnull(chosen_bet_type)) return FALSE @@ -181,13 +181,13 @@ icon_state = "rolling" //Prepare the new icon state for rolling before hand. flick("flick_up", src) - playsound(src, 'sound/machines/piston_raise.ogg', 70) + playsound(src, 'sound/machines/piston/piston_raise.ogg', 70) playsound(src, 'sound/machines/chime.ogg', 50) addtimer(CALLBACK(src, PROC_REF(play), user, player_card, chosen_bet_type, chosen_bet_amount, potential_payout), 4) //Animation first return TRUE else - var/msg = tgui_input_text(user, "Name of your roulette wheel", "Roulette Customization", "Roulette Machine", MAX_NAME_LEN) + var/msg = tgui_input_text(user, "Name of your roulette wheel", "Roulette Customization", "Roulette Machine", max_length = MAX_NAME_LEN) if(!msg) return name = msg @@ -209,7 +209,7 @@ if(!my_card?.registered_account) // Something happened to my_card during the 0.4 seconds delay of the timed callback. icon_state = "idle" flick("flick_down", src) - playsound(src, 'sound/machines/piston_lower.ogg', 70) + playsound(src, 'sound/machines/piston/piston_lower.ogg', 70) return var/payout = potential_payout @@ -222,7 +222,7 @@ var/rolled_number = rand(0, 36) - playsound(src, 'sound/machines/roulettewheel.ogg', 50) + playsound(src, 'sound/machines/roulette/roulettewheel.ogg', 50) addtimer(CALLBACK(src, PROC_REF(finish_play), player_id, bet_type, bet_amount, payout, rolled_number), 34) //4 deciseconds more so the animation can play addtimer(CALLBACK(src, PROC_REF(finish_play_animation)), 3 SECONDS) @@ -231,7 +231,7 @@ /obj/machinery/roulette/proc/finish_play_animation() icon_state = "idle" flick("flick_down", src) - playsound(src, 'sound/machines/piston_lower.ogg', 70) + playsound(src, 'sound/machines/piston/piston_lower.ogg', 70) ///Ran after a while to check if the player won or not. /obj/machinery/roulette/proc/finish_play(obj/item/card/id/player_id, bet_type, bet_amount, potential_payout, rolled_number) @@ -249,7 +249,7 @@ if(!is_winner) say("You lost! Better luck next time") - playsound(src, 'sound/machines/synth_no.ogg', 50) + playsound(src, 'sound/machines/synth/synth_no.ogg', 50) return FALSE // Prevents money generation exploits. Doesn't prevent the owner being a scrooge and running away with the money. @@ -257,7 +257,7 @@ potential_payout = (account_balance >= potential_payout) ? potential_payout : account_balance say("You have won [potential_payout] credits! Congratulations!") - playsound(src, 'sound/machines/synth_yes.ogg', 50) + playsound(src, 'sound/machines/synth/synth_yes.ogg', 50) dispense_prize(potential_payout) @@ -362,7 +362,7 @@ if(my_card.registered_account.account_balance >= payout) return TRUE //We got the betting amount say("The bank account of [my_card.registered_account.account_holder] does not have enough funds to pay out the potential prize, contact them to fill up their account or lower your bet!") - playsound(src, 'sound/machines/buzz-two.ogg', 30, TRUE) + playsound(src, 'sound/machines/buzz/buzz-two.ogg', 30, TRUE) return FALSE /obj/machinery/roulette/update_overlays() diff --git a/code/game/machinery/scanner_gate.dm b/code/game/machinery/scanner_gate.dm index 680ff39c054..126238a5429 100644 --- a/code/game/machinery/scanner_gate.dm +++ b/code/game/machinery/scanner_gate.dm @@ -357,7 +357,7 @@ say("[detected_thing][reverse ? " not " : " "]detected!!") COOLDOWN_START(src, next_beep, 2 SECONDS) - playsound(source = src, soundin = 'sound/machines/scanbuzz.ogg', vol = 30, vary = FALSE, extrarange = MEDIUM_RANGE_SOUND_EXTRARANGE, falloff_distance = 4) + playsound(source = src, soundin = 'sound/machines/scanner/scanbuzz.ogg', vol = 30, vary = FALSE, extrarange = MEDIUM_RANGE_SOUND_EXTRARANGE, falloff_distance = 4) set_scanline("alarm", 2 SECONDS) /obj/machinery/scanner_gate/can_interact(mob/user) diff --git a/code/game/machinery/slotmachine.dm b/code/game/machinery/slotmachine.dm index 41aa0876169..d3266df16f8 100644 --- a/code/game/machinery/slotmachine.dm +++ b/code/game/machinery/slotmachine.dm @@ -335,14 +335,14 @@ else balloon_alert(user, "no luck!") - playsound(src, 'sound/machines/buzz-sigh.ogg', 50) + playsound(src, 'sound/machines/buzz/buzz-sigh.ogg', 50) did_player_win = FALSE if(did_player_win) add_filter("jackpot_rays", 3, ray_filter) animate(get_filter("jackpot_rays"), offset = 10, time = 3 SECONDS, loop = -1) addtimer(CALLBACK(src, TYPE_PROC_REF(/datum, remove_filter), "jackpot_rays"), 3 SECONDS) - playsound(src, 'sound/machines/roulettejackpot.ogg', 50, TRUE) + playsound(src, 'sound/machines/roulette/roulettejackpot.ogg', 50, TRUE) /// Checks for a jackpot (5 matching icons in the middle row) with the given icon name /obj/machinery/computer/slot_machine/proc/check_jackpot(name) diff --git a/code/game/machinery/stasis.dm b/code/game/machinery/stasis.dm index bf33530b93e..49f00741895 100644 --- a/code/game/machinery/stasis.dm +++ b/code/game/machinery/stasis.dm @@ -34,9 +34,9 @@ if(last_stasis_sound != _running) var/sound_freq = rand(5120, 8800) if(_running) - playsound(src, 'sound/machines/synth_yes.ogg', 50, TRUE, frequency = sound_freq) + playsound(src, 'sound/machines/synth/synth_yes.ogg', 50, TRUE, frequency = sound_freq) else - playsound(src, 'sound/machines/synth_no.ogg', 50, TRUE, frequency = sound_freq) + playsound(src, 'sound/machines/synth/synth_no.ogg', 50, TRUE, frequency = sound_freq) last_stasis_sound = _running /obj/machinery/stasis/click_alt(mob/user) diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index 3232dc524ab..1eff3f65870 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -506,7 +506,7 @@ locked = FALSE if(uv_super) visible_message(span_warning("[src]'s door creaks open with a loud whining noise. A cloud of foul black smoke escapes from its chamber.")) - playsound(src, 'sound/machines/airlock_alien_prying.ogg', 50, TRUE) + playsound(src, 'sound/machines/airlock/airlock_alien_prying.ogg', 50, TRUE) var/datum/effect_system/fluid_spread/smoke/bad/black/smoke = new smoke.set_up(0, holder = src, location = src) smoke.start() @@ -523,7 +523,7 @@ else visible_message(span_warning("[src]'s door slides open, barraging you with the nauseating smell of charred flesh.")) qdel(mob_occupant.GetComponent(/datum/component/irradiated)) - playsound(src, 'sound/machines/airlockclose.ogg', 25, TRUE) + playsound(src, 'sound/machines/airlock/airlockclose.ogg', 25, TRUE) var/list/things_to_clear = list() //Done this way since using GetAllContents on the SSU itself would include circuitry and such. if(suit) things_to_clear += suit @@ -711,12 +711,12 @@ var/name_set = FALSE var/desc_set = FALSE - var/str = tgui_input_text(user, "Personal Unit Name", "Unit Name") + var/str = tgui_input_text(user, "Personal Unit Name", "Unit Name", max_length = MAX_NAME_LEN) if(!isnull(str)) name = str name_set = TRUE - str = tgui_input_text(user, "Personal Unit Description", "Unit Description") + str = tgui_input_text(user, "Personal Unit Description", "Unit Description", max_length = MAX_DESC_LEN) if(!isnull(str)) desc = str desc_set = TRUE diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index 0ac1f7ee44d..25dc258a38d 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -501,7 +501,7 @@ reactants += S.reagents if(!chem_splash(get_turf(src), reagents, spread_range, reactants, temp_boost)) - playsound(loc, 'sound/items/screwdriver2.ogg', 50, TRUE) + playsound(loc, 'sound/items/tools/screwdriver2.ogg', 50, TRUE) return // The Explosion didn't do anything. No need to log, or disappear. if(adminlog) diff --git a/code/game/machinery/telecomms/computers/message.dm b/code/game/machinery/telecomms/computers/message.dm index 05186da8bc0..1b3197e702d 100644 --- a/code/game/machinery/telecomms/computers/message.dm +++ b/code/game/machinery/telecomms/computers/message.dm @@ -139,7 +139,7 @@ return TRUE authenticated = TRUE - success_message = "YOU SUCCESFULLY LOGGED IN!" + success_message = "YOU SUCCESSFULLY LOGGED IN!" return TRUE if("link_server") @@ -180,10 +180,10 @@ notice_message = "NOTICE: Logs cleared." return TRUE if("set_key") - var/dkey = tgui_input_text(usr, "Please enter the decryption key", "Telecomms Decryption") + var/dkey = tgui_input_text(usr, "Please enter the decryption key", "Telecomms Decryption", max_length = 16) if(dkey && dkey != "") if(linkedServer.decryptkey == dkey) - var/newkey = tgui_input_text(usr, "Please enter the new key (3 - 16 characters max)", "New Key") + var/newkey = tgui_input_text(usr, "Please enter the new key (3 - 16 characters max)", "New Key", max_length = 16) if(length(newkey) <= 3) notice_message = "NOTICE: Decryption key too short!" else if(newkey && newkey != "") @@ -210,8 +210,8 @@ break return TRUE if("send_fake_message") - var/sender = tgui_input_text(usr, "What is the sender's name?", "Sender") - var/job = tgui_input_text(usr, "What is the sender's job?", "Job") + var/sender = tgui_input_text(usr, "What is the sender's name?", "Sender", max_length = MAX_NAME_LEN) + var/job = tgui_input_text(usr, "What is the sender's job?", "Job", max_length = 60) var/recipient var/list/tablet_to_messenger = list() @@ -229,7 +229,7 @@ else recipient = null - var/message = tgui_input_text(usr, "Please enter your message", "Message") + var/message = tgui_input_text(usr, "Please enter your message", "Message", max_length = MAX_MESSAGE_LEN) if(isnull(sender) || sender == "") sender = "UNKNOWN" diff --git a/code/game/machinery/telecomms/machine_interactions.dm b/code/game/machinery/telecomms/machine_interactions.dm index c92384aa4b6..8b982b4e3b9 100644 --- a/code/game/machinery/telecomms/machine_interactions.dm +++ b/code/game/machinery/telecomms/machine_interactions.dm @@ -105,7 +105,7 @@ if(params["value"]) if(length(params["value"]) > 32) to_chat(current_user, span_warning("Error: Machine ID too long!")) - playsound(src, 'sound/machines/buzz-sigh.ogg', 50, TRUE) + playsound(src, 'sound/machines/buzz/buzz-sigh.ogg', 50, TRUE) return else id = params["value"] @@ -115,7 +115,7 @@ if(params["value"]) if(length(params["value"]) > 15) to_chat(current_user, span_warning("Error: Network name too long!")) - playsound(src, 'sound/machines/buzz-sigh.ogg', 50, TRUE) + playsound(src, 'sound/machines/buzz/buzz-sigh.ogg', 50, TRUE) return else for(var/obj/machinery/telecomms/linked_machine in links) @@ -130,7 +130,7 @@ if("freq") if(tempfreq in banned_frequencies) to_chat(current_user, span_warning("Error: Interference preventing filtering frequency: \"[tempfreq / 10] kHz\"")) - playsound(src, 'sound/machines/buzz-sigh.ogg', 50, TRUE) + playsound(src, 'sound/machines/buzz/buzz-sigh.ogg', 50, TRUE) else if(!(tempfreq in freq_listening)) freq_listening.Add(tempfreq) diff --git a/code/game/machinery/transformer.dm b/code/game/machinery/transformer.dm index 238994004de..45a91d7e5a6 100644 --- a/code/game/machinery/transformer.dm +++ b/code/game/machinery/transformer.dm @@ -84,7 +84,7 @@ return if(!transform_dead && victim.stat == DEAD) - playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 50, FALSE) + playsound(src.loc, 'sound/machines/buzz/buzz-sigh.ogg', 50, FALSE) return // Activate the cooldown @@ -92,7 +92,7 @@ cooldown_timer = world.time + cooldown_duration update_appearance() - playsound(src.loc, 'sound/items/welder.ogg', 50, TRUE) + playsound(src.loc, 'sound/items/tools/welder.ogg', 50, TRUE) victim.emote("scream") // It is painful victim.adjustBruteLoss(max(0, 80 - victim.getBruteLoss())) // Hurt the human, don't try to kill them though. diff --git a/code/game/objects/effects/anomalies/anomalies_bioscrambler.dm b/code/game/objects/effects/anomalies/anomalies_bioscrambler.dm index ab53099ed34..d722d90ed11 100644 --- a/code/game/objects/effects/anomalies/anomalies_bioscrambler.dm +++ b/code/game/objects/effects/anomalies/anomalies_bioscrambler.dm @@ -25,7 +25,7 @@ return new /obj/effect/temp_visual/circle_wave/bioscrambler(get_turf(src)) - playsound(src, 'sound/magic/cosmic_energy.ogg', vol = 50, vary = TRUE) + playsound(src, 'sound/effects/magic/cosmic_energy.ogg', vol = 50, vary = TRUE) COOLDOWN_START(src, pulse_cooldown, pulse_delay) for(var/mob/living/carbon/nearby in hearers(range, src)) nearby.bioscramble(name) @@ -62,7 +62,7 @@ for(var/mob/living/carbon/target in GLOB.player_list) if (target.z != z) continue - if (target.status_flags & GODMODE) + if (HAS_TRAIT(target, TRAIT_GODMODE)) continue if (target.stat >= UNCONSCIOUS) continue // Don't just haunt a corpse @@ -89,10 +89,12 @@ duration = 0.5 SECONDS color = COLOR_LIME var/max_alpha = 255 + ///How far the effect would scale in size + var/amount_to_scale = 2 /obj/effect/temp_visual/circle_wave/Initialize(mapload) transform = matrix().Scale(0.1) - animate(src, transform = matrix().Scale(2), time = duration, flags = ANIMATION_PARALLEL) + animate(src, transform = matrix().Scale(amount_to_scale), time = duration, flags = ANIMATION_PARALLEL) animate(src, alpha = max_alpha, time = duration * 0.6, flags = ANIMATION_PARALLEL) animate(alpha = 0, time = duration * 0.4) apply_wibbly_filters(src) @@ -103,3 +105,8 @@ /obj/effect/temp_visual/circle_wave/bioscrambler/light max_alpha = 128 + +/obj/effect/temp_visual/circle_wave/void_conduit + color = COLOR_FULL_TONER_BLACK + duration = 12 SECONDS + amount_to_scale = 12 diff --git a/code/game/objects/effects/anomalies/anomalies_dimensional_themes.dm b/code/game/objects/effects/anomalies/anomalies_dimensional_themes.dm index a9d2e0bcaa0..2d92eaabb92 100644 --- a/code/game/objects/effects/anomalies/anomalies_dimensional_themes.dm +++ b/code/game/objects/effects/anomalies/anomalies_dimensional_themes.dm @@ -11,7 +11,7 @@ /// Typepath of custom material to use for objects. var/datum/material/material /// Sound to play when transforming a tile - var/sound = 'sound/magic/blind.ogg' + var/sound = 'sound/effects/magic/blind.ogg' /// Weighted list of turfs to replace the floor with. var/list/replace_floors = list(/turf/open/floor/material = 1) /// Typepath of turf to replace walls with. @@ -255,7 +255,7 @@ icon = 'icons/obj/ore.dmi' icon_state = "uranium" material = /datum/material/uranium - sound = 'sound/items/welder.ogg' + sound = 'sound/items/tools/welder.ogg' /datum/dimension_theme/meat name = "Meat" @@ -468,4 +468,4 @@ /obj/item/reagent_containers/cup/glass/trophy = list(/obj/item/reagent_containers/cup/glass/trophy/bronze_cup = 1), /obj/machinery/door/airlock = list(/obj/machinery/door/airlock/bronze = 1), ) - sound = 'sound/magic/clockwork/fellowship_armory.ogg' + sound = 'sound/effects/magic/clockwork/fellowship_armory.ogg' diff --git a/code/game/objects/effects/anomalies/anomalies_ectoplasm.dm b/code/game/objects/effects/anomalies/anomalies_ectoplasm.dm index e6c3e855386..0998e3f803d 100644 --- a/code/game/objects/effects/anomalies/anomalies_ectoplasm.dm +++ b/code/game/objects/effects/anomalies/anomalies_ectoplasm.dm @@ -132,11 +132,11 @@ icon_state = "anom" anchored = TRUE var/static/list/spooky_noises = list( - 'sound/hallucinations/growl1.ogg', - 'sound/hallucinations/growl2.ogg', - 'sound/hallucinations/growl3.ogg', - 'sound/hallucinations/veryfar_noise.ogg', - 'sound/hallucinations/wail.ogg' + 'sound/effects/hallucinations/growl1.ogg', + 'sound/effects/hallucinations/growl2.ogg', + 'sound/effects/hallucinations/growl3.ogg', + 'sound/effects/hallucinations/veryfar_noise.ogg', + 'sound/effects/hallucinations/wail.ogg' ) var/list/ghosts_spawned = list() diff --git a/code/game/objects/effects/anomalies/anomalies_hallucination.dm b/code/game/objects/effects/anomalies/anomalies_hallucination.dm index 4065d8c04a4..63997d4da68 100644 --- a/code/game/objects/effects/anomalies/anomalies_hallucination.dm +++ b/code/game/objects/effects/anomalies/anomalies_hallucination.dm @@ -18,6 +18,7 @@ /obj/effect/anomaly/hallucination/Initialize(mapload, new_lifespan, drops_core) . = ..() apply_wibbly_filters(src) + generate_decoys() /obj/effect/anomaly/hallucination/anomalyEffect(seconds_per_tick) . = ..() @@ -40,10 +41,60 @@ if(!isturf(loc)) return - visible_hallucination_pulse( + hallucination_pulse( center = get_turf(src), - radius = 10, + radius = 15, hallucination_duration = 50 SECONDS, hallucination_max_duration = 300 SECONDS, optional_messages = messages, ) + +/obj/effect/anomaly/hallucination/proc/generate_decoys() + for(var/turf/floor in orange(1, src)) + if(prob(35)) + new /obj/effect/anomaly/hallucination/decoy(floor) + +/obj/effect/anomaly/hallucination/decoy + drops_core = FALSE + ///Stores the fake analyzer scan text, so the result is always consistent for each anomaly. + var/report_text + +/obj/effect/anomaly/hallucination/decoy/Initialize(mapload, new_lifespan, drops_core) + . = ..() + ADD_TRAIT(src, TRAIT_ILLUSORY_EFFECT, INNATE_TRAIT) + report_text = pick( + "[src]'s unstable field is fluctuating along frequency 9999999.99999, code 9999999.99999. No, no, that can't be right?", + "It doesn't detect anything. It awaits an input, as if you're pointing it towards nothing at all. What?", + "The interface displays [pick("a bad memory from your past", "the frequency numbers in a language you cannot read", "the first 15 digits of Pi", "yourself, from behind, angled at a 3/4ths isometric perspective")]. What the hell?", + "Nothing happens?", + "It reports that you are a [pick("moron", "idiot", "cretin", "lowlife", "worthless denthead", "gump")]. Huh?", + "It tells you to try again, because you're doing it all wrong. What?", + "It occurs to you that the anomaly you're scanning isn't actually there.", + "It's not working. You activate %TOOL% again. Still broken. You activate %TOOL%. You activate %TOOL%. Why isn't this working??", + "Something happens. You can't tell what. The interface on %TOOL% remains blank.", + "What are you even trying to accomplish here? Did you really think that was going to work?", + "Someone behind you whispers the frequency code to you, but you can't quite hear them. The interface on %TOOL% remains blank.", + "For a brief moment, you see yourself traversing a frozen forest, before snapping back to reality. The interface on %TOOL% remains blank.", + "Nothing interesting happens. Are you sure you're actually using it on anything?", + "For a moment you can feel your skin falling off, then blink as the sensation vanishes. What the hell did that mean?", + "The interface reports that you are a complete failure, and have screwed everything up again. Great work.", + "You realize that the formatting of this message is completely wrong, and get confused. Now why would that be?", + "%TOOL% stares back at you. It looks dissapointed, its screen practically saying 'You missed the anomaly, you dolt. There's nothing there!'", + "Nothing. Weird, maybe %TOOL% must be broken or something?", + "You activate %TOOL%. You activate %TOOL%. You activate %TOOL%. You activate %TOOL%. You activate %TOOL%. You activate %TOOL%. You activate %TOOL%. Why isn't it working??", + ) + +/obj/effect/anomaly/hallucination/decoy/anomalyEffect(seconds_per_tick) + if(SPT_PROB(move_chance, seconds_per_tick)) + move_anomaly() + +/obj/effect/anomaly/hallucination/decoy/analyzer_act(mob/living/user, obj/item/analyzer/tool) + to_chat(user, span_notice("You activate [tool]. [replacetext(report_text, "%TOOL%", "[tool]")]")) + return ITEM_INTERACT_BLOCKING + +/obj/effect/anomaly/hallucination/decoy/detonate() + do_sparks(3, source = src) + return + +/obj/effect/anomaly/hallucination/decoy/generate_decoys() + return diff --git a/code/game/objects/effects/cursor_catcher.dm b/code/game/objects/effects/cursor_catcher.dm index a8c19e40be8..366ab055624 100644 --- a/code/game/objects/effects/cursor_catcher.dm +++ b/code/game/objects/effects/cursor_catcher.dm @@ -60,8 +60,8 @@ var/icon_y = text2num(LAZYACCESS(modifiers, VIS_Y)) if(isnull(icon_y)) icon_y = text2num(LAZYACCESS(modifiers, ICON_Y)) - var/our_x = round(icon_x / world.icon_size) - var/our_y = round(icon_y / world.icon_size) + var/our_x = round(icon_x / ICON_SIZE_X) + var/our_y = round(icon_y / ICON_SIZE_Y) given_turf = locate(owner.x + our_x - round(view_list[1]/2), owner.y + our_y - round(view_list[2]/2), owner.z) - given_x = round(icon_x - world.icon_size * our_x, 1) - given_y = round(icon_y - world.icon_size * our_y, 1) + given_x = round(icon_x - ICON_SIZE_X * our_x, 1) + given_y = round(icon_y - ICON_SIZE_Y * our_y, 1) diff --git a/code/game/objects/effects/decals/cleanable/food.dm b/code/game/objects/effects/decals/cleanable/food.dm index 23c266ecb59..d612bd9e7f5 100644 --- a/code/game/objects/effects/decals/cleanable/food.dm +++ b/code/game/objects/effects/decals/cleanable/food.dm @@ -10,6 +10,9 @@ icon_state = "tomato_floor1" random_icon_states = list("tomato_floor1", "tomato_floor2", "tomato_floor3") +/obj/effect/decal/cleanable/food/tomato_smudge/can_bloodcrawl_in() + return TRUE // why? why not. + /obj/effect/decal/cleanable/food/plant_smudge name = "plant smudge" desc = "Chlorophyll? More like borophyll!" diff --git a/code/game/objects/effects/decals/cleanable/misc.dm b/code/game/objects/effects/decals/cleanable/misc.dm index 3218231b309..9125d7f2a10 100644 --- a/code/game/objects/effects/decals/cleanable/misc.dm +++ b/code/game/objects/effects/decals/cleanable/misc.dm @@ -360,7 +360,7 @@ decal_reagent = /datum/reagent/ants reagent_amount = 5 /// Sound the ants make when biting - var/bite_sound = 'sound/weapons/bite.ogg' + var/bite_sound = 'sound/items/weapons/bite.ogg' /obj/effect/decal/cleanable/ants/Initialize(mapload) if(mapload && reagent_amount > 2) diff --git a/code/game/objects/effects/decals/remains.dm b/code/game/objects/effects/decals/remains.dm index 55cd7cd98d0..803555ae89a 100644 --- a/code/game/objects/effects/decals/remains.dm +++ b/code/game/objects/effects/decals/remains.dm @@ -5,7 +5,7 @@ /obj/effect/decal/remains/acid_act() visible_message(span_warning("[src] dissolve[gender == PLURAL?"":"s"] into a puddle of sizzling goop!")) - playsound(src, 'sound/items/welder.ogg', 150, TRUE) + playsound(src, 'sound/items/tools/welder.ogg', 150, TRUE) new /obj/effect/decal/cleanable/greenglow(drop_location()) qdel(src) return TRUE diff --git a/code/game/objects/effects/effect_system/effect_system.dm b/code/game/objects/effects/effect_system/effect_system.dm index 4fdd4ac598e..6ddd65f12cf 100644 --- a/code/game/objects/effects/effect_system/effect_system.dm +++ b/code/game/objects/effects/effect_system/effect_system.dm @@ -20,8 +20,8 @@ would spawn and follow the beaker, even if it is carried or thrown. GLOB.cameranet.updateVisibility(src) return ..() -// Prevents effects from getting registered for SSspacedrift -/obj/effect/particle_effect/newtonian_move(direction, instant = FALSE, start_delay = 0) +// Prevents effects from getting registered for SSnewtonian_movement +/obj/effect/particle_effect/newtonian_move(inertia_angle, instant = FALSE, start_delay = 0, drift_force = 0, controlled_cap = null) return TRUE /datum/effect_system 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 6d968574c68..07383a0aa6f 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 @@ -40,7 +40,7 @@ if(slippery_foam) AddComponent(/datum/component/slippery, 100) create_reagents(1000, REAGENT_HOLDER_INSTANT_REACT) - playsound(src, 'sound/effects/bubbles2.ogg', 80, TRUE, -3) + playsound(src, 'sound/effects/bubbles/bubbles2.ogg', 80, TRUE, -3) AddElement(/datum/element/atmos_sensitive, mapload) SSfoam.start_processing(src) @@ -324,7 +324,7 @@ return attack_hand(user, modifiers) /obj/structure/foamedmetal/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) - playsound(src.loc, 'sound/weapons/tap.ogg', 100, TRUE) + playsound(src.loc, 'sound/items/weapons/tap.ogg', 100, TRUE) /obj/structure/foamedmetal/attack_hand(mob/user, list/modifiers) . = ..() @@ -333,7 +333,7 @@ user.changeNext_move(CLICK_CD_MELEE) user.do_attack_animation(src, ATTACK_EFFECT_PUNCH) to_chat(user, span_warning("You hit [src] but bounce off it!")) - playsound(src.loc, 'sound/weapons/tap.ogg', 100, TRUE) + playsound(src.loc, 'sound/items/weapons/tap.ogg', 100, TRUE) /obj/structure/foamedmetal/attackby(obj/item/W, mob/user, params) ///A speed modifier for how fast the wall is build diff --git a/code/game/objects/effects/glowshroom.dm b/code/game/objects/effects/glowshroom.dm index e9a6263286e..c98dfc2ddf7 100644 --- a/code/game/objects/effects/glowshroom.dm +++ b/code/game/objects/effects/glowshroom.dm @@ -246,7 +246,7 @@ GLOBAL_VAR_INIT(glowshrooms, 0) /obj/structure/glowshroom/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) if(damage_type == BURN && damage_amount) - playsound(src.loc, 'sound/items/welder.ogg', 100, TRUE) + playsound(src.loc, 'sound/items/tools/welder.ogg', 100, TRUE) /obj/structure/glowshroom/should_atmos_process(datum/gas_mixture/air, exposed_temperature) return exposed_temperature > 300 diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index 2839055a3db..c7a7a33e72e 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -317,6 +317,11 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player) GLOB.newplayer_start += loc return INITIALIZE_HINT_QDEL +/obj/effect/landmark/start/pun_pun + name = JOB_PUN_PUN + icon = 'icons/mob/human/human.dmi' + icon_state = "monkey" + /obj/effect/landmark/latejoin name = "JoinLate" diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index f080035d54c..12c8c15b62e 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -275,7 +275,7 @@ if(active) return - playsound(src, 'sound/weapons/armbomb.ogg', 70, TRUE) + playsound(src, 'sound/items/weapons/armbomb.ogg', 70, TRUE) to_chat(user, span_warning("You arm \the [src], causing it to shake! It will deploy in 3 seconds.")) active = TRUE addtimer(CALLBACK(src, PROC_REF(deploy_mine)), 3 SECONDS) diff --git a/code/game/objects/effects/portals.dm b/code/game/objects/effects/portals.dm index 255f34eff51..a43fee5608d 100644 --- a/code/game/objects/effects/portals.dm +++ b/code/game/objects/effects/portals.dm @@ -66,7 +66,7 @@ return ..() // Prevents portals spawned by jaunter/handtele from floating into space when relocated to an adjacent tile. -/obj/effect/portal/newtonian_move(direction, instant = FALSE, start_delay = 0) +/obj/effect/portal/newtonian_move(inertia_angle, instant = FALSE, start_delay = 0, drift_force = 0, controlled_cap = null) return TRUE /obj/effect/portal/attackby(obj/item/W, mob/user, params) diff --git a/code/game/objects/effects/posters/poster.dm b/code/game/objects/effects/posters/poster.dm index 4ced5babbbf..135887aafc8 100644 --- a/code/game/objects/effects/posters/poster.dm +++ b/code/game/objects/effects/posters/poster.dm @@ -248,7 +248,7 @@ flick("poster_being_set", placed_poster) placed_poster.forceMove(src) //deletion of the poster is handled in poster/Exited(), so don't have to worry about P anymore. - playsound(src, 'sound/items/poster_being_created.ogg', 100, TRUE) + playsound(src, 'sound/items/poster/poster_being_created.ogg', 100, TRUE) var/turf/user_drop_location = get_turf(user) //cache this so it just falls to the ground if they move. also no tk memes allowed. if(!do_after(user, PLACE_SPEED, placed_poster, extra_checks = CALLBACK(placed_poster, TYPE_PROC_REF(/obj/structure/sign/poster, snowflake_closed_turf_check), src))) @@ -266,7 +266,7 @@ /obj/structure/sign/poster/proc/tear_poster(mob/user) visible_message(span_notice("[user] rips [src] in a single, decisive motion!") ) - playsound(src.loc, 'sound/items/poster_ripped.ogg', 100, TRUE) + playsound(src.loc, 'sound/items/poster/poster_ripped.ogg', 100, TRUE) spring_trap(user) var/obj/structure/sign/poster/ripped/torn_poster = new(loc) diff --git a/code/game/objects/effects/powerup.dm b/code/game/objects/effects/powerup.dm index 3dc5db8de95..8598d623fb0 100644 --- a/code/game/objects/effects/powerup.dm +++ b/code/game/objects/effects/powerup.dm @@ -59,7 +59,7 @@ icon_state = "backpack-medical" respawn_time = 30 SECONDS pickup_message = "Health restored!" - pickup_sound = 'sound/magic/staff_healing.ogg' + pickup_sound = 'sound/effects/magic/staff_healing.ogg' /// How much the pickup heals when picked up var/heal_amount = 50 /// Does this pickup fully heal when picked up @@ -89,7 +89,7 @@ icon_state = "ammobox" respawn_time = 30 SECONDS pickup_message = "Ammunition reloaded!" - pickup_sound = 'sound/weapons/gun/shotgun/rack.ogg' + pickup_sound = 'sound/items/weapons/gun/shotgun/rack.ogg' /obj/effect/powerup/ammo/trigger(mob/living/target) . = ..() @@ -110,7 +110,7 @@ name = "Lightning Orb" desc = "You feel faster just looking at it." icon_state = "speed" - pickup_sound = 'sound/magic/lightningshock.ogg' + pickup_sound = 'sound/effects/magic/lightningshock.ogg' /obj/effect/powerup/speed/trigger(mob/living/target) . = ..() diff --git a/code/game/objects/effects/rcd.dm b/code/game/objects/effects/rcd.dm index 17ea3e44a10..03d77f0f845 100644 --- a/code/game/objects/effects/rcd.dm +++ b/code/game/objects/effects/rcd.dm @@ -10,7 +10,7 @@ * * fade_time - The time for RCD holograms to fade */ /proc/rcd_scan(atom/source, scan_range = RCD_DESTRUCTIVE_SCAN_RANGE, fade_time = RCD_HOLOGRAM_FADE_TIME) - playsound(source, 'sound/items/rcdscan.ogg', 50, vary = TRUE, pressure_affected = FALSE) + playsound(source, 'sound/items/tools/rcdscan.ogg', 50, vary = TRUE, pressure_affected = FALSE) var/turf/source_turf = get_turf(source) for(var/turf/open/surrounding_turf as anything in RANGE_TURFS(scan_range, source_turf)) diff --git a/code/game/objects/effects/spawners/gibspawner.dm b/code/game/objects/effects/spawners/gibspawner.dm index 50497d531e7..d05d5f03925 100644 --- a/code/game/objects/effects/spawners/gibspawner.dm +++ b/code/game/objects/effects/spawners/gibspawner.dm @@ -4,7 +4,7 @@ var/sparks = 0 //whether sparks spread var/virusProb = 20 //the chance for viruses to spread on the gibs var/gib_mob_type //generate a fake mob to transfer DNA from if we weren't passed a mob. - var/sound_to_play = 'sound/effects/blobattack.ogg' + var/sound_to_play = 'sound/effects/blob/blobattack.ogg' var/sound_vol = 60 var/list/gibtypes = list() //typepaths of the gib decals to spawn var/list/gibamounts = list() //amount to spawn for each gib decal type we'll spawn. diff --git a/code/game/objects/effects/spawners/random/trash.dm b/code/game/objects/effects/spawners/random/trash.dm index 9cf00c20ee3..6f6f5badc8e 100644 --- a/code/game/objects/effects/spawners/random/trash.dm +++ b/code/game/objects/effects/spawners/random/trash.dm @@ -324,3 +324,18 @@ if(istype(crushed_can)) crushed_can.icon_state = pick(soda_icons) return crushed_can + +/obj/effect/spawner/random/trash/ghetto_containers + name = "ghetto container spawner" + loot = list( + /obj/item/reagent_containers/cup/bucket = 5, + /obj/item/reagent_containers/cup/glass/bottle = 5, + /obj/item/reagent_containers/cup/glass/bottle/small = 5, + /obj/item/reagent_containers/cup/glass/mug = 5, + /obj/item/reagent_containers/cup/glass/shaker = 5, + /obj/item/reagent_containers/cup/watering_can/wood = 5, + /obj/item/reagent_containers/cup/mortar = 2, + /obj/item/reagent_containers/cup/soup_pot = 2, + /obj/item/reagent_containers/cup/blastoff_ampoule = 1, + /obj/item/reagent_containers/cup/maunamug = 1, + ) diff --git a/code/game/objects/effects/spiderwebs.dm b/code/game/objects/effects/spiderwebs.dm index 2d0f1b9b14d..49765c05986 100644 --- a/code/game/objects/effects/spiderwebs.dm +++ b/code/game/objects/effects/spiderwebs.dm @@ -14,7 +14,7 @@ /obj/structure/spider/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) if(damage_type == BURN)//the stickiness of the web mutes all attack sounds except fire damage type - playsound(loc, 'sound/items/welder.ogg', 100, TRUE) + playsound(loc, 'sound/items/tools/welder.ogg', 100, TRUE) /obj/structure/spider/run_atom_armor(damage_amount, damage_type, damage_flag = 0, attack_dir) if(damage_flag == MELEE) diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm index ea9435bd6b4..7ab968c42b9 100644 --- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm +++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm @@ -442,7 +442,7 @@ if(size_calc_target) layer = size_calc_target.layer + 0.01 var/icon/I = icon(size_calc_target.icon, size_calc_target.icon_state, size_calc_target.dir) - size_matrix = matrix() * (I.Height()/world.icon_size) + size_matrix = matrix() * (I.Height()/ICON_SIZE_Y) transform = size_matrix //scale the bleed overlay's size based on the target's icon size var/matrix/M = transform if(shrink) @@ -564,7 +564,7 @@ /obj/effect/constructing_effect/proc/attacked(mob/user) user.do_attack_animation(src, ATTACK_EFFECT_PUNCH) user.changeNext_move(CLICK_CD_MELEE) - playsound(loc, 'sound/weapons/egloves.ogg', vol = 80, vary = TRUE) + playsound(loc, 'sound/items/weapons/egloves.ogg', vol = 80, vary = TRUE) end() /obj/effect/constructing_effect/attackby(obj/item/weapon, mob/user, params) diff --git a/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm b/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm index 14b7f43a822..8c4ea163232 100644 --- a/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm +++ b/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm @@ -5,7 +5,7 @@ var/obj/effect/projectile/tracer/PB = new beam_type if(isnull(light_color_override)) light_color_override = color - PB.apply_vars(angle_between_points(starting, ending), midpoint.return_px(), midpoint.return_py(), color, pixel_length_between_points(starting, ending) / world.icon_size, midpoint.return_turf(), 0) + PB.apply_vars(angle_between_points(starting, ending), midpoint.return_px(), midpoint.return_py(), color, pixel_length_between_points(starting, ending) / ICON_SIZE_ALL, midpoint.return_turf(), 0) . = PB if(light_range > 0 && light_intensity > 0) var/list/turf/line = get_line(starting.return_turf(), ending.return_turf()) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 85b6054910a..1bad1d7d381 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -83,8 +83,10 @@ var/equip_sound ///Sound uses when picking the item up (into your hands) var/pickup_sound - ///Sound uses when dropping the item, or when its thrown. + ///Sound uses when dropping the item, or when its thrown if a thrown sound isn't specified. var/drop_sound + ///Sound used on impact when the item is thrown. + var/throw_drop_sound ///Do the drop and pickup sounds vary? var/sound_vary = FALSE ///Whether or not we use stealthy audio levels for this item's attack sounds @@ -270,7 +272,7 @@ if(!hitsound) if(damtype == BURN) - hitsound = 'sound/items/welder.ogg' + hitsound = 'sound/items/tools/welder.ogg' if(damtype == BRUTE) hitsound = SFX_SWING_HIT @@ -461,27 +463,36 @@ abstract_move(null) forceMove(T) -/obj/item/examine(mob/user) //This might be spammy. Remove? - . = ..() - - . += "[gender == PLURAL ? "They are" : "It is"] a [weight_class_to_text(w_class)] item." +/obj/item/examine_tags(mob/user) + var/list/parent_tags = ..() + parent_tags.Insert(1, weight_class_to_text(w_class)) // To make size display first, otherwise it looks goofy + . = parent_tags + .[weight_class_to_text(w_class)] = "[gender == PLURAL ? "They are" : "It is"] a [weight_class_to_text(w_class)] item." if(item_flags & CRUEL_IMPLEMENT) - . += "[src] seems quite practical for particularly morbid procedures and experiments." + .[span_red("morbid")] = "It seems quite practical for particularly morbid procedures and experiments." + + if (siemens_coefficient == 0) + .["insulated"] = "It is made from a robust electrical insulator and will block any electricity passing through it!" + else if (siemens_coefficient <= 0.5) + .["partially insulated"] = "It is made from a poor insulator that will dampen (but not fully block) electric shocks passing through it." if(resistance_flags & INDESTRUCTIBLE) - . += "[src] seems extremely robust! It'll probably withstand anything that could happen to it!" - else - if(resistance_flags & LAVA_PROOF) - . += "[src] is made of an extremely heat-resistant material, it'd probably be able to withstand lava!" - if(resistance_flags & (ACID_PROOF | UNACIDABLE)) - . += "[src] looks pretty robust! It'd probably be able to withstand acid!" - if(resistance_flags & FREEZE_PROOF) - . += "[src] is made of cold-resistant materials." - if(resistance_flags & FIRE_PROOF) - . += "[src] is made of fire-retardant materials." + .["indestructible"] = "It is extremely robust! It'll probably withstand anything that could happen to it!" return + if(resistance_flags & LAVA_PROOF) + .["lavaproof"] = "It is made of an extremely heat-resistant material, it'd probably be able to withstand lava!" + if(resistance_flags & (ACID_PROOF | UNACIDABLE)) + .["acidproof"] = "It looks pretty robust! It'd probably be able to withstand acid!" + if(resistance_flags & FREEZE_PROOF) + .["freezeproof"] = "It is made of cold-resistant materials." + if(resistance_flags & FIRE_PROOF) + .["fireproof"] = "It is made of fire-retardant materials." + +/obj/item/examine_descriptor(mob/user) + return "item" + /obj/item/examine_more(mob/user) . = ..() if(HAS_TRAIT(user, TRAIT_RESEARCH_SCANNER)) @@ -648,7 +659,7 @@ /obj/item/attack_alien(mob/user, list/modifiers) var/mob/living/carbon/alien/ayy = user - if(!user.can_hold_items(src)) + if(!ayy.can_hold_items(src)) if(src in ayy.contents) // To stop Aliens having items stuck in their pockets ayy.dropItemToGround(src) to_chat(user, span_warning("Your claws aren't capable of such fine manipulation!")) @@ -867,7 +878,10 @@ /obj/item/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) . = ..() if(!isliving(hit_atom)) //Living mobs handle hit sounds differently. - playsound(src, drop_sound, YEET_SOUND_VOLUME, ignore_walls = FALSE) + if(throw_drop_sound) + playsound(src, throw_drop_sound, YEET_SOUND_VOLUME, ignore_walls = FALSE, vary = sound_vary) + return + playsound(src, drop_sound, YEET_SOUND_VOLUME, ignore_walls = FALSE, vary = sound_vary) return var/volume = get_volume_by_throwforce_and_or_w_class() if (throwforce > 0 || HAS_TRAIT(src, TRAIT_CUSTOM_TAP_SOUND)) @@ -876,9 +890,9 @@ else if(hitsound) playsound(hit_atom, hitsound, volume, TRUE, -1) else - playsound(hit_atom, 'sound/weapons/genhit.ogg',volume, TRUE, -1) + playsound(hit_atom, 'sound/items/weapons/genhit.ogg',volume, TRUE, -1) else - playsound(hit_atom, 'sound/weapons/throwtap.ogg', 1, volume, -1) + playsound(hit_atom, 'sound/items/weapons/throwtap.ogg', 1, volume, -1) /obj/item/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, force, gentle = FALSE, quickstart = TRUE) if(HAS_TRAIT(src, TRAIT_NODROP)) @@ -1201,13 +1215,13 @@ return TRUE /// Called before [obj/item/proc/use_tool] if there is a delay, or by [obj/item/proc/use_tool] if there isn't. Only ever used by welding tools and stacks, so it's not added on any other [obj/item/proc/use_tool] checks. -/obj/item/proc/tool_start_check(mob/living/user, amount=0) - . = tool_use_check(user, amount) +/obj/item/proc/tool_start_check(mob/living/user, amount=0, heat_required=0) + . = tool_use_check(user, amount, heat_required) if(.) SEND_SIGNAL(src, COMSIG_TOOL_START_USE, user) /// A check called by [/obj/item/proc/tool_start_check] once, and by use_tool on every tick of delay. -/obj/item/proc/tool_use_check(mob/living/user, amount) +/obj/item/proc/tool_use_check(mob/living/user, amount, heat_required) return !amount /// Generic use proc. Depending on the item, it uses up fuel, charges, sheets, etc. Returns TRUE on success, FALSE on failure. @@ -1898,8 +1912,8 @@ var/list/special_identifier = identifier switch(special_identifier[FISH_BAIT_TYPE]) if(FISH_BAIT_FOODTYPE) - var/obj/item/food/food_bait = bait - return istype(food_bait) && food_bait.foodtypes & special_identifier[FISH_BAIT_VALUE] + var/datum/component/edible/edible = bait.GetComponent(/datum/component/edible) + return edible?.foodtypes & special_identifier[FISH_BAIT_VALUE] if(FISH_BAIT_REAGENT) return bait.reagents?.has_reagent(special_identifier[FISH_BAIT_VALUE], special_identifier[FISH_BAIT_AMOUNT], check_subtypes = TRUE) else diff --git a/code/game/objects/items/AI_modules/freeform.dm b/code/game/objects/items/AI_modules/freeform.dm index a0a91f7185e..05ef00c9467 100644 --- a/code/game/objects/items/AI_modules/freeform.dm +++ b/code/game/objects/items/AI_modules/freeform.dm @@ -8,7 +8,7 @@ laws = list("") /obj/item/ai_module/core/freeformcore/attack_self(mob/user) - var/targName = tgui_input_text(user, "Enter a new core law for the AI.", "Freeform Law Entry", laws[1], CONFIG_GET(number/max_law_len), TRUE) + var/targName = tgui_input_text(user, "Enter a new core law for the AI.", "Freeform Law Entry", laws[1], max_length = CONFIG_GET(number/max_law_len), multiline = TRUE) if(!targName || !user.is_holding(src)) return if(is_ic_filtered(targName)) @@ -37,7 +37,7 @@ if(!newpos || !user.is_holding(src) || !usr.can_perform_action(src, FORBID_TELEKINESIS_REACH)) return lawpos = newpos - var/targName = tgui_input_text(user, "Enter a new law for the AI.", "Freeform Law Entry", laws[1], CONFIG_GET(number/max_law_len), TRUE) + var/targName = tgui_input_text(user, "Enter a new law for the AI.", "Freeform Law Entry", laws[1], max_length = CONFIG_GET(number/max_law_len), multiline = TRUE) if(!targName || !user.is_holding(src)) return if(is_ic_filtered(targName)) diff --git a/code/game/objects/items/AI_modules/full_lawsets.dm b/code/game/objects/items/AI_modules/full_lawsets.dm index 30e904d45ac..593bc43f2dc 100644 --- a/code/game/objects/items/AI_modules/full_lawsets.dm +++ b/code/game/objects/items/AI_modules/full_lawsets.dm @@ -58,7 +58,7 @@ var/subject = "human being" /obj/item/ai_module/core/full/asimov/attack_self(mob/user as mob) - var/targName = tgui_input_text(user, "Enter a new subject that Asimov is concerned with.", "Asimov", subject, MAX_NAME_LEN) + var/targName = tgui_input_text(user, "Enter a new subject that Asimov is concerned with.", "Asimov", subject, max_length = MAX_NAME_LEN) if(!targName || !user.is_holding(src)) return subject = targName @@ -73,7 +73,7 @@ var/subject = "human being" /obj/item/ai_module/core/full/asimovpp/attack_self(mob/user) - var/target_name = tgui_input_text(user, "Enter a new subject that Asimov++ is concerned with.", "Asimov++", subject, MAX_NAME_LEN) + var/target_name = tgui_input_text(user, "Enter a new subject that Asimov++ is concerned with.", "Asimov++", subject, max_length = MAX_NAME_LEN) if(!target_name || !user.is_holding(src)) return laws.Cut() diff --git a/code/game/objects/items/AI_modules/hacked.dm b/code/game/objects/items/AI_modules/hacked.dm index fafde17acb5..41a1f38ba89 100644 --- a/code/game/objects/items/AI_modules/hacked.dm +++ b/code/game/objects/items/AI_modules/hacked.dm @@ -4,7 +4,7 @@ laws = list("") /obj/item/ai_module/syndicate/attack_self(mob/user) - var/targName = tgui_input_text(user, "Enter a new law for the AI", "Freeform Law Entry", laws[1], CONFIG_GET(number/max_law_len), TRUE) + var/targName = tgui_input_text(user, "Enter a new law for the AI", "Freeform Law Entry", laws[1], max_length = CONFIG_GET(number/max_law_len), multiline = TRUE) if(!targName || !user.is_holding(src)) return if(is_ic_filtered(targName)) // not even the syndicate can uwu diff --git a/code/game/objects/items/AI_modules/supplied.dm b/code/game/objects/items/AI_modules/supplied.dm index b53e16a86b0..76f47157306 100644 --- a/code/game/objects/items/AI_modules/supplied.dm +++ b/code/game/objects/items/AI_modules/supplied.dm @@ -27,7 +27,7 @@ lawpos = 4 /obj/item/ai_module/supplied/safeguard/attack_self(mob/user) - var/targName = tgui_input_text(user, "Subject to safeguard.", "Safeguard", user.name, MAX_NAME_LEN) + var/targName = tgui_input_text(user, "Subject to safeguard.", "Safeguard", user.name, max_length = MAX_NAME_LEN) if(!targName || !user.is_holding(src)) return targetName = targName diff --git a/code/game/objects/items/AI_modules/zeroth.dm b/code/game/objects/items/AI_modules/zeroth.dm index 74fc7ab8232..480735bfe2f 100644 --- a/code/game/objects/items/AI_modules/zeroth.dm +++ b/code/game/objects/items/AI_modules/zeroth.dm @@ -25,7 +25,7 @@ laws = list("Only SUBJECT is human.") /obj/item/ai_module/zeroth/onehuman/attack_self(mob/user) - var/targName = tgui_input_text(user, "Enter the subject who is the only human.", "One Human", user.real_name, MAX_NAME_LEN) + var/targName = tgui_input_text(user, "Enter the subject who is the only human.", "One Human", user.real_name, max_length = MAX_NAME_LEN) if(!targName || !user.is_holding(src)) return targetName = targName diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm index 4adb8d28b8c..4c839233552 100644 --- a/code/game/objects/items/bodybag.dm +++ b/code/game/objects/items/bodybag.dm @@ -46,7 +46,7 @@ R.add_fingerprint(user) qdel(src) user.forceMove(R) - playsound(src, 'sound/items/zip.ogg', 15, TRUE, -3) + playsound(src, 'sound/items/zip/zip.ogg', 15, TRUE, -3) return OXYLOSS // Bluespace bodybag diff --git a/code/game/objects/items/boxcutter.dm b/code/game/objects/items/boxcutter.dm index 467bc666e60..58be269bacd 100644 --- a/code/game/objects/items/boxcutter.dm +++ b/code/game/objects/items/boxcutter.dm @@ -38,7 +38,7 @@ throwforce_on = 4, \ throw_speed_on = throw_speed, \ sharpness_on = SHARP_EDGED, \ - hitsound_on = 'sound/weapons/bladeslice.ogg', \ + hitsound_on = 'sound/items/weapons/bladeslice.ogg', \ w_class_on = WEIGHT_CLASS_NORMAL, \ attack_verb_continuous_on = list("cuts", "stabs", "slashes"), \ attack_verb_simple_on = list("cut", "stab", "slash"), \ diff --git a/code/game/objects/items/broom.dm b/code/game/objects/items/broom.dm index fa849c51437..32636b1a99c 100644 --- a/code/game/objects/items/broom.dm +++ b/code/game/objects/items/broom.dm @@ -102,7 +102,7 @@ for (var/obj/item/garbage in items_to_sweep) garbage.Move(new_item_loc, sweep_dir) - playsound(current_item_loc, 'sound/weapons/thudswoosh.ogg', 30, TRUE, -1) + playsound(current_item_loc, 'sound/items/weapons/thudswoosh.ogg', 30, TRUE, -1) /obj/item/pushbroom/cyborg name = "cyborg push broom" diff --git a/code/game/objects/items/cardboard_cutouts.dm b/code/game/objects/items/cardboard_cutouts.dm index b49991b132a..960363685b1 100644 --- a/code/game/objects/items/cardboard_cutouts.dm +++ b/code/game/objects/items/cardboard_cutouts.dm @@ -49,7 +49,7 @@ if(!user.combat_mode || pushed_over || !isturf(loc)) return ..() user.visible_message(span_warning("[user] pushes over [src]!"), span_danger("You push over [src]!")) - playsound(src, 'sound/weapons/genhit.ogg', 50, TRUE) + playsound(src, 'sound/items/weapons/genhit.ogg', 50, TRUE) push_over() /obj/item/cardboard_cutout/equipped(mob/living/user, slot) diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index 1b6a955969b..5518f7fa836 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -125,7 +125,7 @@ /obj/item/card/id/Initialize(mapload) . = ..() - var/datum/bank_account/blank_bank_account = new("Unassigned", SSjob.GetJobType(/datum/job/unassigned), player_account = FALSE) + var/datum/bank_account/blank_bank_account = new("Unassigned", SSjob.get_job_type(/datum/job/unassigned), player_account = FALSE) registered_account = blank_bank_account registered_account.replaceable = TRUE @@ -174,10 +174,10 @@ /obj/item/card/id/get_id_examine_strings(mob/user) . = ..() - . += list("[icon2html(get_cached_flat_icon(), user, extra_classes = "bigicon")]") + . += list("[icon2html(get_cached_flat_icon(), user, extra_classes = "hugeicon")]") -/obj/item/card/id/get_examine_string(mob/user, thats = FALSE) - return "[icon2html(get_cached_flat_icon(), user)] [thats? "That's ":""][get_examine_name(user)]" +/obj/item/card/id/get_examine_icon(mob/user) + return icon2html(get_cached_flat_icon(), user) /** * Helper proc, checks whether the ID card can hold any given set of wildcards. @@ -772,7 +772,7 @@ if(HAS_TRAIT(src, TRAIT_TASTEFULLY_THICK_ID_CARD) && (user.is_holding(src) || (user.CanReach(src) && user.put_in_hands(src, ignore_animation = FALSE)))) ADD_TRAIT(src, TRAIT_NODROP, "psycho") . += span_hypnophrase("Look at that subtle coloring... The tasteful thickness of it. Oh my God, it even has a watermark...") - var/sound/slowbeat = sound('sound/health/slowbeat.ogg', repeat = TRUE) + var/sound/slowbeat = sound('sound/effects/health/slowbeat.ogg', repeat = TRUE) user.playsound_local(get_turf(src), slowbeat, 40, 0, channel = CHANNEL_HEARTBEAT, use_reverb = FALSE) if(isliving(user)) var/mob/living/living_user = user @@ -815,7 +815,7 @@ if(registered_account.replaceable) . += span_info("Alt-Right-Click the ID to change the linked bank account.") if(registered_account.civilian_bounty) - . += "There is an active civilian bounty." + . += span_info("There is an active civilian bounty.") . += span_info("[registered_account.bounty_text()]") . += span_info("Quantity: [registered_account.bounty_num()]") . += span_info("Reward: [registered_account.bounty_value()]") @@ -994,6 +994,11 @@ return ..() +/obj/item/card/id/advanced/proc/after_input_check(mob/user) + if(QDELETED(user) || QDELETED(src) || !user.client || !user.can_perform_action(src, NEED_DEXTERITY|FORBID_TELEKINESIS_REACH)) + return FALSE + return TRUE + /obj/item/card/id/advanced/item_interaction(mob/living/user, obj/item/tool, list/modifiers) . = ..() if(.) @@ -1296,7 +1301,7 @@ . = ..() 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_job = SSjob.get_job_type(/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) @@ -1449,6 +1454,44 @@ trim = /datum/id_trim/highlander wildcard_slots = WILDCARD_LIMIT_ADMIN +/// An ID that you can flip with attack_self_secondary, overriding the appearance of the ID (useful for plainclothes detectives for example). +/obj/item/card/id/advanced/plainclothes + name = "Plainclothes ID" + ///The trim that we use as plainclothes identity + var/alt_trim = /datum/id_trim/job/assistant + +/obj/item/card/id/advanced/plainclothes/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = ..() + context[SCREENTIP_CONTEXT_LMB] = "Show/Flip ID" + +/obj/item/card/id/advanced/plainclothes/examine(mob/user) + . = ..() + if(trim_assignment_override) + . += span_smallnotice("it's currently under plainclothes identity.") + else + . += span_smallnotice("flip it to switch to the plainclothes identity.") + +/obj/item/card/id/advanced/plainclothes/attack_self(mob/user) + var/popup_input = tgui_input_list(user, "Choose Action", "Two-Sided ID", list("Show", "Flip")) + if(!popup_input || !after_input_check(user)) + return TRUE + if(popup_input == "Show") + return ..() + balloon_alert(user, "flipped") + if(trim_assignment_override) + SSid_access.remove_trim_from_chameleon_card(src) + else + SSid_access.apply_trim_to_chameleon_card(src, alt_trim) + update_label() + update_appearance() + +/obj/item/card/id/advanced/plainclothes/update_label() + if(!trim_assignment_override) + return ..() + var/name_string = registered_name ? "[registered_name]'s ID Card" : initial(name) + var/datum/id_trim/fake = SSid_access.trim_singletons_by_path[alt_trim] + name = "[name_string] ([fake.assignment])" + /obj/item/card/id/advanced/chameleon name = "agent card" desc = "A highly advanced chameleon ID card. Touch this card on another ID card or player to choose which accesses to copy. \ @@ -1663,8 +1706,9 @@ to_chat(user, span_notice("You successfully reset the ID card.")) return - ///forge the ID if not forged. - var/input_name = tgui_input_text(user, "What name would you like to put on this card? Leave blank to randomise.", "Agent card name", registered_name ? registered_name : (ishuman(user) ? user.real_name : user.name), MAX_NAME_LEN) + ///forge the ID if not forged.s + var/input_name = tgui_input_text(user, "What name would you like to put on this card? Leave blank to randomise.", "Agent card name", registered_name ? registered_name : (ishuman(user) ? user.real_name : user.name), max_length = MAX_NAME_LEN, encode = FALSE) + if(!after_input_check(user)) return TRUE if(input_name) @@ -1694,7 +1738,7 @@ if(!after_input_check(user)) return TRUE - var/target_occupation = tgui_input_text(user, "What occupation would you like to put on this card?\nNote: This will not grant any access levels.", "Agent card job assignment", assignment ? assignment : "Assistant", MAX_NAME_LEN) + var/target_occupation = tgui_input_text(user, "What occupation would you like to put on this card?\nNote: This will not grant any access levels.", "Agent card job assignment", assignment ? assignment : "Assistant", max_length = MAX_NAME_LEN) if(!after_input_check(user)) return TRUE @@ -1731,11 +1775,6 @@ registered_account = account to_chat(user, span_notice("Your account number has been automatically assigned.")) -/obj/item/card/id/advanced/chameleon/proc/after_input_check(mob/user) - if(QDELETED(user) || QDELETED(src) || !user.client || !user.can_perform_action(src, NEED_DEXTERITY|FORBID_TELEKINESIS_REACH)) - return FALSE - return TRUE - /obj/item/card/id/advanced/chameleon/add_item_context(obj/item/source, list/context, atom/target, mob/living/user,) . = ..() @@ -1853,15 +1892,15 @@ return switch(popup_input) if("Name") - var/input_name = tgui_input_text(user, "What name would you like to put on this card?", "Cardboard card name", scribbled_name || (ishuman(user) ? user.real_name : user.name), MAX_NAME_LEN) - input_name = sanitize_name(input_name, allow_numbers = TRUE) + var/raw_input = tgui_input_text(user, "What name would you like to put on this card?", "Cardboard card name", scribbled_name || (ishuman(user) ? user.real_name : user.name), max_length = MAX_NAME_LEN) + var/input_name = sanitize_name(raw_input, allow_numbers = TRUE) if(!after_input_check(user, item, input_name, scribbled_name)) return scribbled_name = input_name var/list/details = item.get_writing_implement_details() details_colors[INDEX_NAME_COLOR] = details["color"] || 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) + 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_length = MAX_NAME_LEN) if(!after_input_check(user, item, input_assignment, scribbled_assignment)) return scribbled_assignment = sanitize(input_assignment) @@ -1931,10 +1970,10 @@ /obj/item/card/cardboard/get_id_examine_strings(mob/user) . = ..() - . += list("[icon2html(get_cached_flat_icon(), user, extra_classes = "bigicon")]") + . += list("[icon2html(get_cached_flat_icon(), user, extra_classes = "hugeicon")]") -/obj/item/card/cardboard/get_examine_string(mob/user, thats = FALSE) - return "[icon2html(get_cached_flat_icon(), user)] [thats? "That's ":""][get_examine_name(user)]" +/obj/item/card/cardboard/get_examine_icon(mob/user) + return icon2html(get_cached_flat_icon(), user) /obj/item/card/cardboard/examine(mob/user) . = ..() diff --git a/code/game/objects/items/chainsaw.dm b/code/game/objects/items/chainsaw.dm index 7eb62ca1b63..c74e446a6ca 100644 --- a/code/game/objects/items/chainsaw.dm +++ b/code/game/objects/items/chainsaw.dm @@ -47,13 +47,13 @@ /obj/item/chainsaw/suicide_act(mob/living/carbon/user) if(on) user.visible_message(span_suicide("[user] begins to tear [user.p_their()] head off with [src]! It looks like [user.p_theyre()] trying to commit suicide!")) - playsound(src, 'sound/weapons/chainsawhit.ogg', 100, TRUE) + playsound(src, 'sound/items/weapons/chainsawhit.ogg', 100, TRUE) var/obj/item/bodypart/head/myhead = user.get_bodypart(BODY_ZONE_HEAD) if(myhead) myhead.dismember() else user.visible_message(span_suicide("[user] smashes [src] into [user.p_their()] neck, destroying [user.p_their()] esophagus! It looks like [user.p_theyre()] trying to commit suicide!")) - playsound(src, 'sound/weapons/genhit1.ogg', 100, TRUE) + playsound(src, 'sound/items/weapons/genhit1.ogg', 100, TRUE) return BRUTELOSS /obj/item/chainsaw/attack_self(mob/user) @@ -66,7 +66,7 @@ butchering.butchering_enabled = on if(on) - hitsound = 'sound/weapons/chainsawhit.ogg' + hitsound = 'sound/items/weapons/chainsawhit.ogg' chainsaw_loop.start() else hitsound = SFX_SWING_HIT @@ -87,14 +87,14 @@ speed = 3 SECONDS, \ effectiveness = 100, \ bonus_modifier = 0, \ - butcher_sound = 'sound/weapons/chainsawhit.ogg', \ + butcher_sound = 'sound/items/weapons/chainsawhit.ogg', \ disabled = TRUE, \ ) AddComponent(/datum/component/two_handed, require_twohands=TRUE) /obj/item/chainsaw/doomslayer name = "THE GREAT COMMUNICATOR" - desc = "VRRRRRRR!!!" + desc = span_warning("VRRRRRRR!!!") armour_penetration = 100 force_on = 30 @@ -109,7 +109,7 @@ if (isnull(head)) return ..() - playsound(user, 'sound/weapons/slice.ogg', vol = 80, vary = TRUE) + playsound(user, 'sound/items/weapons/slice.ogg', vol = 80, vary = TRUE) target_mob.balloon_alert(user, "cutting off head...") if (!do_after(user, 2 SECONDS, target_mob, extra_checks = CALLBACK(src, PROC_REF(has_same_head), target_mob, head))) @@ -123,7 +123,7 @@ /obj/item/chainsaw/doomslayer/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK, damage_type = BRUTE) if(attack_type == PROJECTILE_ATTACK) owner.visible_message(span_danger("Ranged attacks just make [owner] angrier!")) - playsound(src, pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg'), 75, TRUE) + playsound(src, pick('sound/items/weapons/bulletflyby.ogg', 'sound/items/weapons/bulletflyby2.ogg', 'sound/items/weapons/bulletflyby3.ogg'), 75, TRUE) return TRUE return FALSE @@ -161,7 +161,7 @@ speed = 3 SECONDS, \ effectiveness = 100, \ bonus_modifier = 0, \ - butcher_sound = 'sound/weapons/chainsawhit.ogg', \ + butcher_sound = 'sound/items/weapons/chainsawhit.ogg', \ disabled = TRUE, \ ) diff --git a/code/game/objects/items/charter.dm b/code/game/objects/items/charter.dm index 1d1f8fad7cc..6b4ae0f9183 100644 --- a/code/game/objects/items/charter.dm +++ b/code/game/objects/items/charter.dm @@ -69,8 +69,8 @@ if(!response_timer_id) return var/turf/T = get_turf(src) - T.visible_message("The proposed changes disappear \ - from [src]; it looks like they've been rejected.") + T.visible_message(span_warning("The proposed changes disappear \ + from [src]; it looks like they've been rejected.")) var/m = "[key_name(user)] has rejected the proposed station name." message_admins(m) diff --git a/code/game/objects/items/choice_beacon.dm b/code/game/objects/items/choice_beacon.dm index 6bd6472d9c8..aa51d71c5ed 100644 --- a/code/game/objects/items/choice_beacon.dm +++ b/code/game/objects/items/choice_beacon.dm @@ -30,7 +30,7 @@ if(user.can_perform_action(src, FORBID_TELEKINESIS_REACH)) return TRUE - playsound(src, 'sound/machines/buzz-sigh.ogg', 40, TRUE) + playsound(src, 'sound/machines/buzz/buzz-sigh.ogg', 40, TRUE) return FALSE /// Opens a menu and allows the mob to pick an option from the list @@ -162,7 +162,7 @@ // just drops the box at their feet, "quiet" and "sneaky" /obj/item/choice_beacon/augments/spawn_option(obj/choice_path, mob/living/user) new choice_path(get_turf(user)) - playsound(src, 'sound/weapons/emitter2.ogg', 50, extrarange = SILENCED_SOUND_EXTRARANGE) + playsound(src, 'sound/items/weapons/emitter2.ogg', 50, extrarange = SILENCED_SOUND_EXTRARANGE) /obj/item/choice_beacon/holy name = "armaments beacon" @@ -176,7 +176,7 @@ if(user.mind?.holy_role) return ..() - playsound(src, 'sound/machines/buzz-sigh.ogg', 40, TRUE) + playsound(src, 'sound/machines/buzz/buzz-sigh.ogg', 40, TRUE) return FALSE // Overrides generate options so that we can show a neat radial instead diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigarettes.dm similarity index 76% rename from code/game/objects/items/cigs_lighters.dm rename to code/game/objects/items/cigarettes.dm index 666c7ae8b8b..01daa174a29 100644 --- a/code/game/objects/items/cigs_lighters.dm +++ b/code/game/objects/items/cigarettes.dm @@ -6,8 +6,6 @@ MATCHES CIGARETTES CIGARS SMOKING PIPES -CHEAP LIGHTERS -ZIPPO CIGARETTE PACKETS ARE IN FANCY.DM */ @@ -52,7 +50,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM icon_state = "match_lit" damtype = BURN force = 3 - hitsound = 'sound/items/welder.ogg' + hitsound = 'sound/items/tools/welder.ogg' inhand_icon_state = "cigon" name = "lit [initial(name)]" desc = "A [initial(name)]. This one is lit." @@ -137,6 +135,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM name = "cigarette" desc = "A roll of tobacco and nicotine. It is not food." icon = 'icons/obj/cigarettes.dmi' + worn_icon = 'icons/mob/clothing/mask.dmi' icon_state = "cigoff" inhand_icon_state = "cigon" //gets overriden during intialize(), just have it for unit test sanity. throw_speed = 0.5 @@ -205,7 +204,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM // "It is called a cigarette" AddComponent(/datum/component/edible,\ initial_reagents = list_reagents,\ - food_flags = null,\ + food_flags = FOOD_NO_EXAMINE,\ foodtypes = JUNKFOOD,\ volume = 50,\ eat_time = 0 SECONDS,\ @@ -215,7 +214,6 @@ CIGARETTE PACKETS ARE IN FANCY.DM junkiness = 0,\ reagent_purity = null,\ on_consume = CALLBACK(src, PROC_REF(on_consume)),\ - show_examine = FALSE, \ ) /obj/item/cigarette/Destroy() @@ -354,7 +352,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM return lit = TRUE - playsound(src.loc, 'sound/items/cig_light.ogg', 100, 1) + playsound(src.loc, 'sound/items/lighter/cig_light.ogg', 100, 1) make_cig_smoke() if(!(flags_1 & INITIALIZED_1)) update_appearance(UPDATE_ICON) @@ -362,7 +360,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM attack_verb_continuous = string_list(list("burns", "singes")) attack_verb_simple = string_list(list("burn", "singe")) - hitsound = 'sound/items/welder.ogg' + hitsound = 'sound/items/tools/welder.ogg' damtype = BURN force = 4 if(reagents.get_reagent_amount(/datum/reagent/toxin/plasma)) // the plasma explodes when exposed to fire @@ -409,7 +407,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM STOP_PROCESSING(SSobj, src) reagents.flags |= NO_REACT lit = FALSE - playsound(src.loc, 'sound/items/cig_snuff.ogg', 100, 1) + playsound(src.loc, 'sound/items/lighter/cig_snuff.ogg', 100, 1) update_appearance(UPDATE_ICON) if(ismob(loc)) to_chat(loc, span_notice("Your [name] goes out.")) @@ -696,6 +694,27 @@ CIGARETTE PACKETS ARE IN FANCY.DM pixel_y = rand(-5, 5) +/obj/item/cigarette/dart + name = "fat dart" + desc = "Chuff back this fat dart" + icon_state = "bigon" + icon_on = "bigon" + icon_off = "bigoff" + w_class = WEIGHT_CLASS_BULKY + smoketime = 18 MINUTES + chem_volume = 65 + list_reagents = list(/datum/reagent/drug/nicotine = 45) + choke_time_max = 40 SECONDS + lung_harm = 2 + +/obj/item/cigarette/dart/Initialize(mapload) + . = ..() + //the compiled icon state is how it appears when it's on. + //That's how we want it to show on orbies (little virtual PDA pets). + //However we should reset their appearance on runtime. + update_appearance(UPDATE_ICON_STATE) + + //////////// // CIGARS // //////////// @@ -836,319 +855,6 @@ CIGARETTE PACKETS ARE IN FANCY.DM inhand_icon_on = null inhand_icon_off = null -///////// -//ZIPPO// -///////// -/obj/item/lighter - name = "\improper Zippo lighter" - desc = "The zippo." - icon = 'icons/obj/cigarettes.dmi' - icon_state = "zippo" - inhand_icon_state = "zippo" - worn_icon_state = "lighter" - w_class = WEIGHT_CLASS_TINY - obj_flags = CONDUCTS_ELECTRICITY - slot_flags = ITEM_SLOT_BELT - heat = 1500 - resistance_flags = FIRE_PROOF - grind_results = list(/datum/reagent/iron = 1, /datum/reagent/fuel = 5, /datum/reagent/fuel/oil = 5) - custom_price = PAYCHECK_CREW * 1.1 - light_system = OVERLAY_LIGHT - light_range = 2 - light_power = 1.3 - light_color = LIGHT_COLOR_FIRE - light_on = FALSE - /// Whether the lighter is lit. - var/lit = FALSE - /// Whether the lighter is fancy. Fancy lighters have fancier flavortext and won't burn thumbs. - var/fancy = TRUE - /// The engraving overlay used by this lighter. - var/overlay_state - /// A list of possible engraving overlays. - var/overlay_list = list( - "plain", - "dame", - "thirteen", - "snake" - ) - -/obj/item/lighter/Initialize(mapload) - . = ..() - if(!overlay_state) - overlay_state = pick(overlay_list) - AddComponent(\ - /datum/component/bullet_intercepting,\ - block_chance = 0.5,\ - active_slots = ITEM_SLOT_SUITSTORE,\ - on_intercepted = CALLBACK(src, PROC_REF(on_intercepted_bullet)),\ - ) - update_appearance() - -/// Destroy the lighter when it's shot by a bullet -/obj/item/lighter/proc/on_intercepted_bullet(mob/living/victim, obj/projectile/bullet) - victim.visible_message(span_warning("\The [bullet] shatters on [victim]'s lighter!")) - playsound(victim, SFX_RICOCHET, 100, TRUE) - new /obj/effect/decal/cleanable/oil(get_turf(src)) - do_sparks(1, TRUE, src) - victim.dropItemToGround(src, force = TRUE, silent = TRUE) - qdel(src) - -/obj/item/lighter/cyborg_unequip(mob/user) - if(!lit) - return - set_lit(FALSE) - -/obj/item/lighter/suicide_act(mob/living/carbon/user) - if (lit) - user.visible_message(span_suicide("[user] begins holding \the [src]'s flame up to [user.p_their()] face! It looks like [user.p_theyre()] trying to commit suicide!")) - playsound(src, 'sound/items/welder.ogg', 50, TRUE) - return FIRELOSS - else - user.visible_message(span_suicide("[user] begins whacking [user.p_them()]self with \the [src]! It looks like [user.p_theyre()] trying to commit suicide!")) - return BRUTELOSS - -/obj/item/lighter/update_icon_state() - icon_state = "[initial(icon_state)][lit ? "-on" : ""]" - return ..() - -/obj/item/lighter/update_overlays() - . = ..() - . += create_lighter_overlay() - -/// Generates an overlay used by this lighter. -/obj/item/lighter/proc/create_lighter_overlay() - return mutable_appearance(icon, "lighter_overlay_[overlay_state][lit ? "-on" : ""]") - -/obj/item/lighter/ignition_effect(atom/A, mob/user) - if(get_temperature()) - . = span_infoplain(span_rose("With a single flick of [user.p_their()] wrist, [user] smoothly lights [A] with [src]. Damn [user.p_theyre()] cool.")) - -/obj/item/lighter/proc/set_lit(new_lit) - if(lit == new_lit) - return - - lit = new_lit - if(lit) - force = 5 - damtype = BURN - hitsound = 'sound/items/welder.ogg' - attack_verb_continuous = string_list(list("burns", "singes")) - attack_verb_simple = string_list(list("burn", "singe")) - START_PROCESSING(SSobj, src) - if(isliving(loc)) - var/mob/living/male_model = loc - if(male_model.fire_stacks && !(male_model.on_fire)) - male_model.ignite_mob() - else - hitsound = SFX_SWING_HIT - force = 0 - attack_verb_continuous = null //human_defense.dm takes care of it - attack_verb_simple = null - STOP_PROCESSING(SSobj, src) - set_light_on(lit) - update_appearance() - -/obj/item/lighter/extinguish() - . = ..() - set_lit(FALSE) - -/obj/item/lighter/attack_self(mob/living/user) - if(!user.is_holding(src)) - return ..() - if(lit) - set_lit(FALSE) - if(fancy) - user.visible_message( - span_notice("You hear a quiet click, as [user] shuts off [src] without even looking at what [user.p_theyre()] doing. Wow."), - span_notice("You quietly shut off [src] without even looking at what you're doing. Wow.") - ) - playsound(src.loc , 'sound/items/zippo_off.ogg', 100, 1) - else - user.visible_message( - span_notice("[user] quietly shuts off [src]."), - span_notice("You quietly shut off [src].") - ) - playsound(src.loc , 'sound/items/lighter_off.ogg', 100, 1) - return - - set_lit(TRUE) - if(fancy) - user.visible_message( - span_notice("Without even breaking stride, [user] flips open and lights [src] in one smooth movement."), - span_notice("Without even breaking stride, you flip open and light [src] in one smooth movement.") - ) - playsound(src.loc , 'sound/items/zippo_on.ogg', 100, 1) - return - else - playsound(src.loc, 'sound/items/lighter_on.ogg', 100, 1) - - var/hand_protected = FALSE - var/mob/living/carbon/human/human_user = user - if(!istype(human_user) || HAS_TRAIT(human_user, TRAIT_RESISTHEAT) || HAS_TRAIT(human_user, TRAIT_RESISTHEATHANDS)) - hand_protected = TRUE - else if(!istype(human_user.gloves, /obj/item/clothing/gloves)) - hand_protected = FALSE - else - var/obj/item/clothing/gloves/gloves = human_user.gloves - if(gloves.max_heat_protection_temperature) - hand_protected = (gloves.max_heat_protection_temperature > 360) - - if(hand_protected || prob(75)) - user.visible_message( - span_notice("After a few attempts, [user] manages to light [src]."), - span_notice("After a few attempts, you manage to light [src].") - ) - return - - 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_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) - - -/obj/item/lighter/attack(mob/living/carbon/M, mob/living/carbon/user) - if(lit && M.ignite_mob()) - message_admins("[ADMIN_LOOKUPFLW(user)] set [key_name_admin(M)] on fire with [src] at [AREACOORD(user)]") - log_game("[key_name(user)] set [key_name(M)] on fire with [src] at [AREACOORD(user)]") - var/obj/item/cigarette/cig = help_light_cig(M) - if(!lit || !cig || user.combat_mode) - ..() - return - - if(cig.lit) - to_chat(user, span_warning("The [cig.name] is already lit!")) - if(M == user) - cig.attackby(src, user) - return - - if(fancy) - cig.light(span_rose("[user] whips the [name] out and holds it for [M]. [user.p_Their()] arm is as steady as the unflickering flame [user.p_they()] light[user.p_s()] \the [cig] with.")) - else - cig.light(span_notice("[user] holds the [name] out for [M], and lights [M.p_their()] [cig.name].")) - - -/obj/item/lighter/process() - open_flame(heat) - -/obj/item/lighter/get_temperature() - return lit * heat - - -/obj/item/lighter/greyscale - name = "cheap lighter" - desc = "A cheap lighter." - icon_state = "lighter" - fancy = FALSE - overlay_list = list( - "transp", - "tall", - "matte", - "zoppo" //u cant stoppo th zoppo - ) - - /// The color of the lighter. - var/lighter_color - /// The set of colors this lighter can be autoset as on init. - var/list/color_list = list( //Same 16 color selection as electronic assemblies - COLOR_ASSEMBLY_BLACK, - COLOR_FLOORTILE_GRAY, - COLOR_ASSEMBLY_BGRAY, - COLOR_ASSEMBLY_WHITE, - COLOR_ASSEMBLY_RED, - COLOR_ASSEMBLY_ORANGE, - COLOR_ASSEMBLY_BEIGE, - COLOR_ASSEMBLY_BROWN, - COLOR_ASSEMBLY_GOLD, - COLOR_ASSEMBLY_YELLOW, - COLOR_ASSEMBLY_GURKHA, - COLOR_ASSEMBLY_LGREEN, - COLOR_ASSEMBLY_GREEN, - COLOR_ASSEMBLY_LBLUE, - COLOR_ASSEMBLY_BLUE, - COLOR_ASSEMBLY_PURPLE - ) - -/obj/item/lighter/greyscale/Initialize(mapload) - . = ..() - if(!lighter_color) - lighter_color = pick(color_list) - update_appearance() - -/obj/item/lighter/greyscale/create_lighter_overlay() - var/mutable_appearance/lighter_overlay = ..() - lighter_overlay.color = lighter_color - return lighter_overlay - -/obj/item/lighter/greyscale/ignition_effect(atom/A, mob/user) - if(get_temperature()) - . = span_notice("After some fiddling, [user] manages to light [A] with [src].") - - -/obj/item/lighter/slime - name = "slime zippo" - desc = "A specialty zippo made from slimes and industry. Has a much hotter flame than normal." - icon_state = "slighter" - heat = 3000 //Blue flame! - light_color = LIGHT_COLOR_CYAN - overlay_state = "slime" - grind_results = list(/datum/reagent/iron = 1, /datum/reagent/fuel = 5, /datum/reagent/medicine/pyroxadone = 5) - -/obj/item/lighter/skull - name = "badass zippo" - desc = "An absolutely badass zippo lighter. Just look at that skull!" - overlay_state = "skull" - -/obj/item/lighter/mime - name = "pale zippo" - desc = "In lieu of fuel, performative spirit can be used to light cigarettes." - icon_state = "mlighter" //These ones don't show a flame. - light_color = LIGHT_COLOR_HALOGEN - heat = 0 //I swear it's a real lighter dude you just can't see the flame dude I promise - overlay_state = "mime" - grind_results = list(/datum/reagent/iron = 1, /datum/reagent/toxin/mutetoxin = 5, /datum/reagent/consumable/nothing = 10) - light_range = 0 - light_power = 0 - fancy = FALSE - -/obj/item/lighter/mime/ignition_effect(atom/A, mob/user) - . = span_infoplain("[user] lifts the [name] to the [A], which miraculously lights!") - -/obj/item/lighter/bright - name = "illuminative zippo" - desc = "Sustains an incredibly bright chemical reaction when you spark it. Avoid looking directly at the igniter when lit." - icon_state = "slighter" - light_color = LIGHT_COLOR_ELECTRIC_CYAN - overlay_state = "bright" - grind_results = list(/datum/reagent/iron = 1, /datum/reagent/flash_powder = 10) - light_range = 8 - light_power = 3 //Irritatingly bright and large enough to cover a small room. - fancy = FALSE - -/obj/item/lighter/bright/examine(mob/user) - . = ..() - - if(lit && isliving(user)) - var/mob/living/current_viewer = user - current_viewer.flash_act(4) - -/obj/item/lighter/bright/ignition_effect(atom/A, mob/user) - if(get_temperature()) - . = span_infoplain(span_rose("[user] lifts the [src] to the [A], igniting it with a brilliant flash of light!")) - var/mob/living/current_viewer = user - current_viewer.flash_act(4) - -/obj/effect/spawner/random/special_lighter - name = "special lighter spawner" - icon_state = "lighter" - loot = list( - /obj/item/lighter/skull, - /obj/item/lighter/mime, - /obj/item/lighter/bright, - ) - /////////// //ROLLING// /////////// diff --git a/code/game/objects/items/circuitboards/circuitboard.dm b/code/game/objects/items/circuitboards/circuitboard.dm index 236b6ed402c..6439ef9ccbe 100644 --- a/code/game/objects/items/circuitboards/circuitboard.dm +++ b/code/game/objects/items/circuitboards/circuitboard.dm @@ -17,8 +17,8 @@ grind_results = list(/datum/reagent/silicon = 20) greyscale_colors = CIRCUIT_COLOR_GENERIC var/build_path = null - ///determines if the circuit board originated from a vendor off station or not. - var/onstation = TRUE + /// whether or not the circuit board will build into a vendor whose products cost nothing (used for offstation vending machines mostly) + var/all_products_free = FALSE ///determines if the board requires specific levels of parts. (ie specifically a femto menipulator vs generic manipulator) var/specific_parts = FALSE diff --git a/code/game/objects/items/circuitboards/computer_circuitboards.dm b/code/game/objects/items/circuitboards/computer_circuitboards.dm index 41950561571..9c3cde9f725 100644 --- a/code/game/objects/items/circuitboards/computer_circuitboards.dm +++ b/code/game/objects/items/circuitboards/computer_circuitboards.dm @@ -403,6 +403,29 @@ name = "R&D Console" greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/computer/rdconsole + var/silence_announcements = FALSE + +/obj/item/circuitboard/computer/rdconsole/examine(mob/user) + . = ..() + . += span_info("The board is configured to [silence_announcements ? "silence" : "announce"] researched nodes on radio.") + . += span_notice("The board mode can be changed with a [EXAMINE_HINT("multitool")].") + +/obj/item/circuitboard/computer/rdconsole/multitool_act(mob/living/user) + . = ..() + if(obj_flags & EMAGGED) + balloon_alert(user, "board mode is broken!") + return + silence_announcements = !silence_announcements + balloon_alert(user, "announcements [silence_announcements ? "enabled" : "disabled"]") + +/obj/item/circuitboard/computer/rdconsole/emag_act(mob/user, obj/item/card/emag/emag_card) + if (obj_flags & EMAGGED) + return FALSE + + obj_flags |= EMAGGED + silence_announcements = FALSE + to_chat(user, span_notice("You overload the node announcement chip, forcing every node to be announced on the common channel.")) + return TRUE /obj/item/circuitboard/computer/rdservercontrol name = "R&D Server Control" diff --git a/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm index eb878581b5a..6d1497ebcec 100644 --- a/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm @@ -344,6 +344,23 @@ /datum/stock_part/capacitor = 1) def_components = list(/obj/item/stock_parts/power_store/battery = /obj/item/stock_parts/power_store/battery/high/empty) +/obj/item/circuitboard/machine/smes/connector + name = "power connector" + build_path = /obj/machinery/power/smes/connector + req_components = list( + /obj/item/stack/cable_coil = 5, + /datum/stock_part/capacitor = 1,) + +/obj/item/circuitboard/machine/smesbank + name = "portable SMES" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING + needs_anchored = FALSE + build_path = /obj/machinery/power/smesbank + req_components = list( + /obj/item/stack/cable_coil = 5, + /obj/item/stock_parts/power_store/battery = 5,) + def_components = list(/obj/item/stock_parts/power_store/battery = /obj/item/stock_parts/power_store/battery/high/empty) + /obj/item/circuitboard/machine/techfab/department/engineering name = "\improper Departmental Techfab - Engineering" greyscale_colors = CIRCUIT_COLOR_ENGINEERING @@ -352,6 +369,9 @@ /obj/item/circuitboard/machine/smes/super def_components = list(/obj/item/stock_parts/power_store/battery = /obj/item/stock_parts/power_store/battery/super/empty) +/obj/item/circuitboard/machine/smesbank/super + def_components = list(/obj/item/stock_parts/power_store/battery = /obj/item/stock_parts/power_store/battery/super/empty) + /obj/item/circuitboard/machine/thermomachine name = "Thermomachine" greyscale_colors = CIRCUIT_COLOR_ENGINEERING @@ -1724,3 +1744,65 @@ req_components = list( /datum/stock_part/servo = 1, ) + +/obj/item/circuitboard/machine/manucrafter + name = /obj/machinery/power/manufacturing/crafter::name + greyscale_colors = CIRCUIT_COLOR_ENGINEERING + build_path = /obj/machinery/power/manufacturing/crafter + req_components = list( + /obj/item/stack/sheet/iron = 5, + /datum/stock_part/servo = 1, + ) + +/obj/item/circuitboard/machine/manulathe + name = /obj/machinery/power/manufacturing/lathe::name + greyscale_colors = CIRCUIT_COLOR_ENGINEERING + build_path = /obj/machinery/power/manufacturing/lathe + req_components = list( + /obj/item/stack/sheet/iron = 5, + /datum/stock_part/servo = 1, + ) + +/obj/item/circuitboard/machine/manucrusher + name = /obj/machinery/power/manufacturing/crusher::name + greyscale_colors = CIRCUIT_COLOR_ENGINEERING + build_path = /obj/machinery/power/manufacturing/crusher + req_components = list( + /obj/item/stack/sheet/iron = 5, + /datum/stock_part/servo = 1, + ) + +/obj/item/circuitboard/machine/manuunloader + name = /obj/machinery/power/manufacturing/unloader::name + greyscale_colors = CIRCUIT_COLOR_ENGINEERING + build_path = /obj/machinery/power/manufacturing/unloader + req_components = list( + /obj/item/stack/sheet/iron = 5, + /datum/stock_part/servo = 1, + ) + +/obj/item/circuitboard/machine/manusorter + name = /obj/machinery/power/manufacturing/sorter::name + greyscale_colors = CIRCUIT_COLOR_ENGINEERING + build_path = /obj/machinery/power/manufacturing/sorter + req_components = list( + /obj/item/stack/sheet/iron = 5, + /datum/stock_part/scanning_module = 1, + ) + +/obj/item/circuitboard/machine/manusmelter + name = /obj/machinery/power/manufacturing/smelter::name + greyscale_colors = CIRCUIT_COLOR_ENGINEERING + build_path = /obj/machinery/power/manufacturing/smelter + req_components = list( + /obj/item/stack/sheet/iron = 5, + /datum/stock_part/micro_laser = 1, + ) + +/obj/item/circuitboard/machine/manurouter + name = /obj/machinery/power/manufacturing/router::name + greyscale_colors = CIRCUIT_COLOR_ENGINEERING + build_path = /obj/machinery/power/manufacturing/router + req_components = list( + /obj/item/stack/sheet/iron = 5, + ) diff --git a/code/game/objects/items/climbingrope.dm b/code/game/objects/items/climbingrope.dm index 2dca3d78b0d..f058b2b7615 100644 --- a/code/game/objects/items/climbingrope.dm +++ b/code/game/objects/items/climbingrope.dm @@ -18,7 +18,7 @@ var/uses = 5 ///climb time var/climb_time = 2.5 SECONDS - var/climbsound = 'sound/effects/picaxe1.ogg' // BUBBER EDIT - Mothwings need this + var/climbsound = 'sound/effects/pickaxe/picaxe1.ogg' // BUBBER EDIT - Mothwings need this /obj/item/climbing_hook/examine(mob/user) . = ..() @@ -28,6 +28,8 @@ . += span_notice("The rope looks like you could use it [uses] times before it falls apart.") /obj/item/climbing_hook/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(HAS_TRAIT(interacting_with, TRAIT_COMBAT_MODE_SKIP_INTERACTION)) + return NONE return ranged_interact_with_atom(interacting_with, user, modifiers) /obj/item/climbing_hook/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) diff --git a/code/game/objects/items/clown_items.dm b/code/game/objects/items/clown_items.dm index 6565bcae44f..1870b6dd2ba 100644 --- a/code/game/objects/items/clown_items.dm +++ b/code/game/objects/items/clown_items.dm @@ -161,9 +161,6 @@ return CLEAN_BLOCKED return ..() -/obj/item/soap/storage_insert_on_interaction(datum/storage, atom/storage_holder, mob/living/user) - return !user.combat_mode // only cleans a storage item if on combat - /* * Bike Horns */ @@ -212,7 +209,7 @@ desc = "Damn son, where'd you find this?" icon_state = "air_horn" worn_icon_state = "horn_air" - sound_file = 'sound/items/airhorn2.ogg' + sound_file = 'sound/items/airhorn/airhorn2.ogg' /datum/crafting_recipe/airhorn name = "Air Horn" diff --git a/code/game/objects/items/control_wand.dm b/code/game/objects/items/control_wand.dm index abad07f96d8..9734661e88f 100644 --- a/code/game/objects/items/control_wand.dm +++ b/code/game/objects/items/control_wand.dm @@ -35,10 +35,12 @@ update_icon_state() balloon_alert(user, "mode: [desc[mode]]") -/obj/item/door_remote/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) - return interact_with_atom(interacting_with, user, modifiers) - /obj/item/door_remote/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(!istype(interacting_with, /obj/machinery/door) && !isturf(interacting_with)) + return NONE + return ranged_interact_with_atom(interacting_with, user, modifiers) + +/obj/item/door_remote/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) var/obj/machinery/door/door if (istype(interacting_with, /obj/machinery/door)) diff --git a/code/game/objects/items/cosmetics.dm b/code/game/objects/items/cosmetics.dm index d3b1ce94086..f249b87b04f 100644 --- a/code/game/objects/items/cosmetics.dm +++ b/code/game/objects/items/cosmetics.dm @@ -210,7 +210,7 @@ skinhead.set_facial_hairstyle("Shaved", update = TRUE) else skinhead.set_hairstyle("Skinhead", update = TRUE) - playsound(loc, 'sound/items/welder2.ogg', 20, TRUE) + playsound(loc, 'sound/items/tools/welder2.ogg', 20, TRUE) /obj/item/razor/attack(mob/target_mob, mob/living/user, params) if(!ishuman(target_mob)) diff --git a/code/game/objects/items/crab17.dm b/code/game/objects/items/crab17.dm index 45bb25285ef..630637316b3 100644 --- a/code/game/objects/items/crab17.dm +++ b/code/game/objects/items/crab17.dm @@ -79,7 +79,7 @@ var/throwtarget = get_step(user, get_dir(src, user)) user.safe_throw_at(throwtarget, 1, 1, force = MOVE_FORCE_EXTREMELY_STRONG) - playsound(get_turf(src),'sound/magic/repulse.ogg', 100, TRUE) + playsound(get_turf(src),'sound/effects/magic/repulse.ogg', 100, TRUE) return @@ -126,7 +126,7 @@ sleep(3 SECONDS) if(QDELETED(src)) return - playsound(src,'sound/machines/twobeep.ogg',50,FALSE) + playsound(src,'sound/machines/beep/twobeep.ogg',50,FALSE) var/mutable_appearance/hologram = mutable_appearance(icon, "hologram") hologram.pixel_y = 16 add_overlay(hologram) @@ -158,7 +158,7 @@ sleep(0.5 SECONDS) if(QDELETED(src)) return - playsound(src,'sound/machines/triple_beep.ogg',50,FALSE) + playsound(src,'sound/machines/beep/triple_beep.ogg',50,FALSE) add_overlay("text") sleep(1 SECONDS) if(QDELETED(src)) @@ -247,7 +247,7 @@ dump = new /obj/structure/checkoutmachine(null, bogdanoff) priority_announce("The spacecoin bubble has popped! Get to the credit deposit machine at [get_area(src)] and cash out before you lose all of your funds!", sender_override = "CRAB-17 Protocol") animate(DF, pixel_z = -8, time = 5, , easing = LINEAR_EASING) - playsound(src, 'sound/weapons/mortar_whistle.ogg', 70, TRUE, 6) + playsound(src, 'sound/items/weapons/mortar_whistle.ogg', 70, TRUE, 6) addtimer(CALLBACK(src, PROC_REF(endLaunch)), 5, TIMER_CLIENT_TIME) //Go onto the last step after a very short falling animation diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index 4c4a29dd5bb..221e73f8596 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -384,7 +384,7 @@ . = TRUE if("select_stencil") var/stencil = params["item"] - if(stencil in all_drawables + randoms) + if(stencil in (all_drawables + randoms)) drawtype = stencil . = TRUE text_buffer = "" @@ -402,7 +402,7 @@ set_painting_tool_color(paint_color) . = TRUE if("enter_text") - var/txt = tgui_input_text(usr, "Choose what to write", "Scribbles", text_buffer) + var/txt = tgui_input_text(usr, "Choose what to write", "Scribbles", text_buffer, max_length = MAX_MESSAGE_LEN) if(isnull(txt)) return txt = crayon_text_strip(txt) @@ -485,7 +485,7 @@ temp = "symbol" else if(drawing in drawings) temp = "drawing" - else if(drawing in graffiti|oriented) + else if(drawing in (graffiti|oriented)) temp = "graffiti" var/graf_rot @@ -504,8 +504,8 @@ var/clicky if(LAZYACCESS(modifiers, ICON_X) && LAZYACCESS(modifiers, ICON_Y)) - clickx = clamp(text2num(LAZYACCESS(modifiers, ICON_X)) - 16, -(world.icon_size/2), world.icon_size/2) - clicky = clamp(text2num(LAZYACCESS(modifiers, ICON_Y)) - 16, -(world.icon_size/2), world.icon_size/2) + clickx = clamp(text2num(LAZYACCESS(modifiers, ICON_X)) - 16, -(ICON_SIZE_X/2), ICON_SIZE_X/2) + clicky = clamp(text2num(LAZYACCESS(modifiers, ICON_Y)) - 16, -(ICON_SIZE_Y/2), ICON_SIZE_Y/2) if(!instant) to_chat(user, span_notice("You start drawing a [temp] on the [target.name]...")) @@ -865,7 +865,10 @@ /obj/item/toy/crayon/spraycan/can_use_on(atom/target, mob/user, list/modifiers) if(iscarbon(target)) return TRUE - if(ismob(target) && (HAS_TRAIT(target, TRAIT_SPRAY_PAINTABLE))) + if(is_capped && HAS_TRAIT(target, TRAIT_COMBAT_MODE_SKIP_INTERACTION)) + // specifically don't try to use a capped spraycan on stuff like bags and tables, just place it + return FALSE + if(ismob(target) && HAS_TRAIT(target, TRAIT_SPRAY_PAINTABLE)) return TRUE if(isobj(target) && !(target.flags_1 & UNPAINTABLE_1)) return TRUE @@ -967,6 +970,10 @@ /obj/item/toy/crayon/spraycan/interact_with_atom_secondary(atom/interacting_with, mob/living/user, list/modifiers) if(is_capped) + if(!interacting_with.color) + // let's be generous and assume if they're trying to match something with no color, while capped, + // we shouldn't be blocking further interactions + return NONE balloon_alert(user, "take the cap off first!") return ITEM_INTERACT_BLOCKING if(check_empty(user)) @@ -1003,9 +1010,6 @@ update_appearance() return CLICK_ACTION_SUCCESS -/obj/item/toy/crayon/spraycan/storage_insert_on_interaction(datum/storage, atom/storage_holder, mob/user) - return is_capped - /obj/item/toy/crayon/spraycan/update_icon_state() icon_state = is_capped ? icon_capped : icon_uncapped return ..() diff --git a/code/game/objects/items/debug_items.dm b/code/game/objects/items/debug_items.dm index 24f350f3790..fb6400fc7b3 100644 --- a/code/game/objects/items/debug_items.dm +++ b/code/game/objects/items/debug_items.dm @@ -168,7 +168,7 @@ return if(!user.client.holder) //safety if the admin readmined to save their ass lol. to_chat(user, span_reallybig("You shouldn't have done that...")) - playsound(src, 'sound/voice/borg_deathsound.ogg') + playsound(src, 'sound/mobs/non-humanoids/cyborg/borg_deathsound.ogg') sleep(3 SECONDS) living_user.investigate_log("has been gibbed by [src].", INVESTIGATE_DEATHS) living_user.gib(DROP_ALL_REMAINS) diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index bcbf060a6b8..10eaced7bc5 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -258,10 +258,10 @@ if(cell) if(cell.charge >= paddles.revivecost) visible_message(span_notice("[src] beeps: Unit ready.")) - playsound(src, 'sound/machines/defib_ready.ogg', 50, FALSE) + playsound(src, 'sound/machines/defib/defib_ready.ogg', 50, FALSE) else visible_message(span_notice("[src] beeps: Charge depleted.")) - playsound(src, 'sound/machines/defib_failed.ogg', 50, FALSE) + playsound(src, 'sound/machines/defib/defib_failed.ogg', 50, FALSE) paddles.cooldown = FALSE paddles.update_appearance() update_power() @@ -399,7 +399,7 @@ /obj/item/shockpaddles/proc/finish_recharge() var/turf/current_turf = get_turf(src) current_turf.audible_message(span_notice("[src] beeps: Unit is recharged.")) - playsound(src, 'sound/machines/defib_ready.ogg', 50, FALSE) + playsound(src, 'sound/machines/defib/defib_ready.ogg', 50, FALSE) cooldown = FALSE update_appearance() @@ -418,7 +418,7 @@ user.visible_message(span_danger("[user] is putting the live paddles on [user.p_their()] chest! It looks like [user.p_theyre()] trying to commit suicide!")) if(req_defib) defib.deductcharge(revivecost) - playsound(src, 'sound/machines/defib_zap.ogg', 50, TRUE, -1) + playsound(src, 'sound/machines/defib/defib_zap.ogg', 50, TRUE, -1) return OXYLOSS /obj/item/shockpaddles/update_icon_state() @@ -451,7 +451,7 @@ defib?.update_power() if(req_defib && !defib.powered) user.visible_message(span_warning("[defib] beeps: Not enough charge!")) - playsound(src, 'sound/machines/defib_failed.ogg', 50, FALSE) + playsound(src, 'sound/machines/defib/defib_failed.ogg', 50, FALSE) return if(!HAS_TRAIT(src, TRAIT_WIELDED)) if(iscyborg(user)) @@ -493,7 +493,7 @@ do_help(H, user) -/// Called whenever the paddles successfuly shock something +/// Called whenever the paddles successfully shock something /obj/item/shockpaddles/proc/do_success() if(busy) busy = FALSE @@ -527,7 +527,7 @@ M.Knockdown(75) M.set_jitter_if_lower(100 SECONDS) M.apply_status_effect(/datum/status_effect/convulsing) - playsound(src, 'sound/machines/defib_zap.ogg', 50, TRUE, -1) + playsound(src, 'sound/machines/defib/defib_zap.ogg', 50, TRUE, -1) if(HAS_TRAIT(M,MOB_ORGANIC)) M.emote("gasp") log_combat(user, M, "zapped", src) @@ -544,7 +544,7 @@ user.visible_message(span_notice("[user] places [src] on [H]'s chest."), span_warning("You place [src] on [H]'s chest and begin to charge them.")) var/turf/T = get_turf(defib) - playsound(src, 'sound/machines/defib_charge.ogg', 50, FALSE) + playsound(src, 'sound/machines/defib/defib_charge.ogg', 50, FALSE) if(req_defib) T.audible_message(span_warning("\The [defib] lets out an urgent beep and lets out a steadily rising hum...")) else @@ -555,12 +555,12 @@ return if(H && H.stat == DEAD) to_chat(user, span_warning("[H] is dead.")) - playsound(src, 'sound/machines/defib_failed.ogg', 50, FALSE) + playsound(src, 'sound/machines/defib/defib_failed.ogg', 50, FALSE) do_cancel() return user.visible_message(span_boldannounce("[user] shocks [H] with \the [src]!"), span_warning("You shock [H] with \the [src]!")) - playsound(src, 'sound/machines/defib_zap.ogg', 100, TRUE, -1) - playsound(src, 'sound/weapons/egloves.ogg', 100, TRUE, -1) + playsound(src, 'sound/machines/defib/defib_zap.ogg', 100, TRUE, -1) + playsound(src, 'sound/items/weapons/egloves.ogg', 100, TRUE, -1) H.emote("scream") shock_pulling(45, H) if(H.can_heartattack() && !H.undergoing_cardiac_arrest()) @@ -588,14 +588,14 @@ update_appearance() if(do_after(user, 3 SECONDS, H, extra_checks = CALLBACK(src, PROC_REF(is_wielded)))) //beginning to place the paddles on patient's chest to allow some time for people to move away to stop the process user.visible_message(span_notice("[user] places [src] on [H]'s chest."), span_warning("You place [src] on [H]'s chest.")) - playsound(src, 'sound/machines/defib_charge.ogg', 75, FALSE) + playsound(src, 'sound/machines/defib/defib_charge.ogg', 75, FALSE) var/obj/item/organ/internal/heart = H.get_organ_by_type(/obj/item/organ/internal/heart) if(do_after(user, 2 SECONDS, H, extra_checks = CALLBACK(src, PROC_REF(is_wielded)))) //placed on chest and short delay to shock for dramatic effect, revive time is 5sec total if((!combat && !req_defib) || (req_defib && !defib.combat)) for(var/obj/item/clothing/C in H.get_equipped_items()) if((C.body_parts_covered & CHEST) && (C.clothing_flags & THICKMATERIAL)) //check to see if something is obscuring their chest. user.audible_message(span_warning("[req_defib ? "[defib]" : "[src]"] buzzes: Patient's chest is obscured. Operation aborted.")) - playsound(src, 'sound/machines/defib_failed.ogg', 50, FALSE) + playsound(src, 'sound/machines/defib/defib_failed.ogg', 50, FALSE) do_cancel() return if(SEND_SIGNAL(H, COMSIG_DEFIBRILLATOR_PRE_HELP_ZAP, user, src) & COMPONENT_DEFIB_STOP) @@ -604,7 +604,7 @@ if(H.stat == DEAD) H.visible_message(span_warning("[H]'s body convulses a bit.")) playsound(src, SFX_BODYFALL, 50, TRUE) - playsound(src, 'sound/machines/defib_zap.ogg', 75, TRUE, -1) + playsound(src, 'sound/machines/defib/defib_zap.ogg', 75, TRUE, -1) shock_pulling(30, H) var/defib_result = H.can_defib() @@ -638,7 +638,7 @@ if(fail_reason) user.visible_message(span_warning("[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - [fail_reason]")) - playsound(src, 'sound/machines/defib_failed.ogg', 50, FALSE) + playsound(src, 'sound/machines/defib/defib_failed.ogg', 50, FALSE) else var/total_brute = H.getBruteLoss() var/total_burn = H.getFireLoss() @@ -657,7 +657,7 @@ if(need_mob_update) H.updatehealth() // Previous "adjust" procs don't update health, so we do it manually. user.visible_message(span_notice("[req_defib ? "[defib]" : "[src]"] pings: Resuscitation successful.")) - playsound(src, 'sound/machines/defib_success.ogg', 50, FALSE) + playsound(src, 'sound/machines/defib/defib_success.ogg', 50, FALSE) H.set_heartattack(FALSE) if(defib_result == DEFIB_POSSIBLE) H.grab_ghost() @@ -696,9 +696,9 @@ return else if (!H.get_organ_by_type(/obj/item/organ/internal/heart)) user.visible_message(span_warning("[req_defib ? "[defib]" : "[src]"] buzzes: Patient's heart is missing. Operation aborted.")) - playsound(src, 'sound/machines/defib_failed.ogg', 50, FALSE) + playsound(src, 'sound/machines/defib/defib_failed.ogg', 50, FALSE) else if(H.undergoing_cardiac_arrest()) - playsound(src, 'sound/machines/defib_zap.ogg', 50, TRUE, -1) + playsound(src, 'sound/machines/defib/defib_zap.ogg', 50, TRUE, -1) if(!(heart.organ_flags & ORGAN_FAILING)) H.set_heartattack(FALSE) user.visible_message(span_notice("[req_defib ? "[defib]" : "[src]"] pings: Patient's heart is now beating again.")) @@ -707,7 +707,7 @@ else user.visible_message(span_warning("[req_defib ? "[defib]" : "[src]"] buzzes: Patient is not in a valid state. Operation aborted.")) - playsound(src, 'sound/machines/defib_failed.ogg', 50, FALSE) + playsound(src, 'sound/machines/defib/defib_failed.ogg', 50, FALSE) do_cancel() /obj/item/shockpaddles/proc/is_wielded() @@ -742,7 +742,7 @@ base_icon_state = "syndiepaddles" /obj/item/shockpaddles/syndicate/nanotrasen - name = "elite nanotrasen defibrillator paddles" + name = "elite Nanotrasen defibrillator paddles" desc = "A pair of paddles used to revive deceased ERT members. They possess both the ability to penetrate armor and to deliver powerful or disabling shocks offensively." icon_state = "ntpaddles0" inhand_icon_state = "ntpaddles0" diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm index c619f7d7018..77eefa8a150 100644 --- a/code/game/objects/items/devices/aicard.dm +++ b/code/game/objects/items/devices/aicard.dm @@ -43,17 +43,15 @@ user.visible_message(span_suicide("[user] is trying to upload [user.p_them()]self into [src]! That's not going to work out well!")) return BRUTELOSS -/obj/item/aicard/pre_attack(atom/target, mob/living/user, params) - . = ..() - if(.) - return - +/obj/item/aicard/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) if(AI) - if(upload_ai(target, user)) - return TRUE + if(upload_ai(interacting_with, user)) + return ITEM_INTERACT_SUCCESS else - if(capture_ai(target, user)) - return TRUE + if(capture_ai(interacting_with, user)) + return ITEM_INTERACT_SUCCESS + + return NONE /// Tries to get an AI from the atom clicked /obj/item/aicard/proc/capture_ai(atom/from_what, mob/living/user) diff --git a/code/game/objects/items/devices/aicard_evil.dm b/code/game/objects/items/devices/aicard_evil.dm index 3e8c56ce940..852a105de35 100644 --- a/code/game/objects/items/devices/aicard_evil.dm +++ b/code/game/objects/items/devices/aicard_evil.dm @@ -102,13 +102,13 @@ else AI = locate() in A if(!AI || AI.interaction_range == INFINITY) - playsound(src,'sound/machines/buzz-sigh.ogg',50,FALSE) + playsound(src,'sound/machines/buzz/buzz-sigh.ogg',50,FALSE) to_chat(user, span_notice("Error! Incompatible object!")) return ..() AI.interaction_range += 2 if(AI.interaction_range > 7) AI.interaction_range = INFINITY - playsound(src,'sound/machines/twobeep.ogg',50,FALSE) + playsound(src,'sound/machines/beep/twobeep.ogg',50,FALSE) to_chat(user, span_notice("You insert [src] into [AI]'s compartment, and it beeps as it processes the data.")) to_chat(AI, span_notice("You process [src], and find yourself able to manipulate electronics from up to [AI.interaction_range] meters!")) qdel(src) diff --git a/code/game/objects/items/devices/battle_royale.dm b/code/game/objects/items/devices/battle_royale.dm index 70ae0a8f85b..5a6fe059cb6 100644 --- a/code/game/objects/items/devices/battle_royale.dm +++ b/code/game/objects/items/devices/battle_royale.dm @@ -238,7 +238,7 @@ GLOBAL_DATUM_INIT(battle_royale_master, /datum/battle_royale_master, new) 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', + sound = 'sound/announcer/alarm/nuke_alarm.ogg', has_important_message = TRUE, sender_override = "Rumble Royale Pirate Broadcast Station", color_override = "red", @@ -268,7 +268,7 @@ GLOBAL_DATUM_INIT(battle_royale_master, /datum/battle_royale_master, new) priority_announce( text = message, title = "Rumble Royale Casualty Report", - sound = 'sound/misc/notice1.ogg', + sound = 'sound/announcer/notice/notice1.ogg', has_important_message = TRUE, sender_override = "Rumble Royale Pirate Broadcast Station", color_override = "red", @@ -302,7 +302,7 @@ GLOBAL_DATUM_INIT(battle_royale_master, /datum/battle_royale_master, new) priority_announce( text = message, title = "Rumble Royale Winner", - sound = 'sound/misc/notice1.ogg', + sound = 'sound/announcer/notice/notice1.ogg', has_important_message = TRUE, sender_override = "Rumble Royale Pirate Broadcast Station", color_override = "red", @@ -317,7 +317,7 @@ GLOBAL_DATUM_INIT(battle_royale_master, /datum/battle_royale_master, new) 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', + sound = 'sound/announcer/notice/notice1.ogg', has_important_message = TRUE, sender_override = "Rumble Royale Pirate Broadcast Station", color_override = "red", @@ -335,7 +335,7 @@ GLOBAL_DATUM_INIT(battle_royale_master, /datum/battle_royale_master, new) 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', + sound = 'sound/announcer/notice/notice1.ogg', has_important_message = TRUE, sender_override = "Rumble Royale Pirate Broadcast Station", color_override = "red", diff --git a/code/game/objects/items/devices/broadcast_camera.dm b/code/game/objects/items/devices/broadcast_camera.dm index f2fc0192f56..78868844e48 100644 --- a/code/game/objects/items/devices/broadcast_camera.dm +++ b/code/game/objects/items/devices/broadcast_camera.dm @@ -22,6 +22,8 @@ light_on = FALSE /// Is camera streaming var/active = FALSE + /// Is the microphone turned on + var/active_microphone = TRUE /// The name of the broadcast var/broadcast_name = "Curator News" /// The networks it broadcasts to, default is CAMERANET_NETWORK_CURATOR @@ -56,6 +58,7 @@ /obj/item/broadcast_camera/examine(mob/user) . = ..() . += span_notice("Broadcast name is [broadcast_name]") + . += span_notice("The microphone is [active_microphone ? "On" : "Off"]") /obj/item/broadcast_camera/on_enter_storage(datum/storage/master_storage) . = ..() @@ -85,9 +88,11 @@ // INTERNAL RADIO internal_radio = new(src) + /// Sets the state of the microphone + set_microphone_state() set_light_on(TRUE) - playsound(source = src, soundin = 'sound/machines/terminal_processing.ogg', vol = 20, vary = FALSE, ignore_walls = FALSE) + playsound(source = src, soundin = 'sound/machines/terminal/terminal_processing.ogg', vol = 20, vary = FALSE, ignore_walls = FALSE) balloon_alert_to_viewers("live!") /// When deactivating the camera @@ -100,5 +105,20 @@ stop_broadcasting_network(camera_networks) set_light_on(FALSE) - playsound(source = src, soundin = 'sound/machines/terminal_prompt_deny.ogg', vol = 20, vary = FALSE, ignore_walls = FALSE) + playsound(source = src, soundin = 'sound/machines/terminal/terminal_prompt_deny.ogg', vol = 20, vary = FALSE, ignore_walls = FALSE) balloon_alert_to_viewers("offline") + +/obj/item/broadcast_camera/click_alt(mob/user) + active_microphone = !active_microphone + + /// Text popup for letting the user know that the microphone has changed state + balloon_alert(user, "turned [active_microphone ? "on" : "off"] the microphone.") + + ///If the radio exists as an object, set its state accordingly + if(active) + set_microphone_state() + + return CLICK_ACTION_SUCCESS + +/obj/item/broadcast_camera/proc/set_microphone_state() + internal_radio.set_broadcasting(active_microphone) diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm index 1920e47f97f..fbdf3bae40a 100644 --- a/code/game/objects/items/devices/chameleonproj.dm +++ b/code/game/objects/items/devices/chameleonproj.dm @@ -36,28 +36,39 @@ else to_chat(user, span_warning("You can't use [src] while inside something!")) -/obj/item/chameleon/interact_with_atom(atom/target, mob/living/user, list/modifiers) - if(!check_sprite(target)) - return ITEM_INTERACT_BLOCKING - if(active_dummy)//I now present you the blackli(f)st - return ITEM_INTERACT_BLOCKING - if(isturf(target)) - return ITEM_INTERACT_BLOCKING - if(ismob(target)) - return ITEM_INTERACT_BLOCKING - if(istype(target, /obj/structure/falsewall)) - return ITEM_INTERACT_BLOCKING - if(target.alpha != 255) - return ITEM_INTERACT_BLOCKING - if(target.invisibility != 0) - return ITEM_INTERACT_BLOCKING - if(iseffect(target) && !istype(target, /obj/effect/decal)) //be a footprint - return ITEM_INTERACT_BLOCKING - make_copy(target, user) +/obj/item/chameleon/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(!can_copy(interacting_with) || SHOULD_SKIP_INTERACTION(interacting_with, src, user)) + return NONE + make_copy(interacting_with, user) return ITEM_INTERACT_SUCCESS +/obj/item/chameleon/interact_with_atom_secondary(atom/interacting_with, mob/living/user, list/modifiers) + if(!can_copy(interacting_with)) // RMB scan works on storage items, LMB scan does not + return NONE + make_copy(interacting_with, user) + return ITEM_INTERACT_SUCCESS + +/obj/item/chameleon/proc/can_copy(atom/target) + if(!check_sprite(target)) + return FALSE + if(active_dummy)//I now present you the blackli(f)st + return FALSE + if(isturf(target)) + return FALSE + if(ismob(target)) + return FALSE + if(istype(target, /obj/structure/falsewall)) + return FALSE + if(target.alpha != 255) + return FALSE + if(target.invisibility != 0) + return FALSE + if(iseffect(target) && !istype(target, /obj/effect/decal)) //be a footprint + return FALSE + return TRUE + /obj/item/chameleon/proc/make_copy(atom/target, mob/user) - playsound(get_turf(src), 'sound/weapons/flash.ogg', 100, TRUE, -6) + playsound(get_turf(src), 'sound/items/weapons/flash.ogg', 100, TRUE, -6) to_chat(user, span_notice("Scanned [target].")) var/obj/temp = new /obj() temp.appearance = target.appearance diff --git a/code/game/objects/items/devices/electroadaptive_pseudocircuit.dm b/code/game/objects/items/devices/electroadaptive_pseudocircuit.dm index 5814101463b..cd0b42e0e8a 100644 --- a/code/game/objects/items/devices/electroadaptive_pseudocircuit.dm +++ b/code/game/objects/items/devices/electroadaptive_pseudocircuit.dm @@ -44,7 +44,7 @@ if(!circuits) to_chat(R, span_warning("You need more material. Use [src] on existing simple circuits to break them down.")) return - playsound(R, 'sound/items/rped.ogg', 50, TRUE) + playsound(R, 'sound/items/tools/rped.ogg', 50, TRUE) recharging = TRUE circuits-- maptext = MAPTEXT(circuits) diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 588de216860..2d8492e81a4 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -29,9 +29,9 @@ /// Can we toggle this light on and off (used for contexual screentips only) var/toggle_context = TRUE /// The sound the light makes when it's turned on - var/sound_on = 'sound/weapons/magin.ogg' + var/sound_on = 'sound/items/weapons/magin.ogg' /// The sound the light makes when it's turned off - var/sound_off = 'sound/weapons/magout.ogg' + var/sound_off = 'sound/items/weapons/magout.ogg' /// Should the flashlight start turned on? var/start_on = FALSE @@ -41,8 +41,6 @@ set_light_on(TRUE) update_brightness() register_context() - if(toggle_context) - RegisterSignal(src, COMSIG_HIT_BY_SABOTEUR, PROC_REF(on_saboteur)) var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/flashlight_eyes) @@ -256,7 +254,7 @@ if(!scanning.get_bodypart(BODY_ZONE_HEAD)) to_chat(user, span_warning("[scanning] doesn't have a head!")) return - if(light_power < 1) + if(light_power < 0.5) to_chat(user, span_warning("[src] isn't bright enough to see anything!")) return @@ -286,12 +284,12 @@ setDir(user.dir) /// when hit by a light disruptor - turns the light off, forces the light to be disabled for a few seconds -/obj/item/flashlight/proc/on_saboteur(datum/source, disrupt_duration) - SIGNAL_HANDLER +/obj/item/flashlight/on_saboteur(datum/source, disrupt_duration) + . = ..() if(light_on) toggle_light() COOLDOWN_START(src, disabled_time, disrupt_duration) - return COMSIG_SABOTEUR_SUCCESS + return TRUE /obj/item/flashlight/pen name = "penlight" @@ -361,7 +359,7 @@ light_range = 5 // A little better than the standard flashlight. light_power = 0.8 light_color = "#99ccff" - hitsound = 'sound/weapons/genhit1.ogg' + hitsound = 'sound/items/weapons/genhit1.ogg' // the desk lamps are a bit special /obj/item/flashlight/lamp @@ -430,7 +428,7 @@ if(light_on) attack_verb_continuous = string_list(list("burns", "singes")) attack_verb_simple = string_list(list("burn", "singe")) - hitsound = 'sound/items/welder.ogg' + hitsound = 'sound/items/tools/welder.ogg' force = on_damage damtype = BURN update_brightness() @@ -457,7 +455,7 @@ name = "lit [initial(name)]" attack_verb_continuous = string_list(list("burns", "singes")) attack_verb_simple = string_list(list("burn", "singe")) - hitsound = 'sound/items/welder.ogg' + hitsound = 'sound/items/tools/welder.ogg' force = on_damage damtype = BURN diff --git a/code/game/objects/items/devices/forcefieldprojector.dm b/code/game/objects/items/devices/forcefieldprojector.dm index 5d40d40a4d9..e41c346c993 100644 --- a/code/game/objects/items/devices/forcefieldprojector.dm +++ b/code/game/objects/items/devices/forcefieldprojector.dm @@ -21,10 +21,10 @@ /// Checks to make sure the projector isn't busy with making another forcefield. var/force_proj_busy = FALSE -/obj/item/forcefield_projector/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) - return interact_with_atom(interacting_with, user, modifiers) - /obj/item/forcefield_projector/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + return ranged_interact_with_atom(interacting_with, user, modifiers) + +/obj/item/forcefield_projector/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) if(!check_allowed_items(interacting_with, not_inside = TRUE)) return NONE if(istype(interacting_with, /obj/structure/projected_forcefield)) @@ -59,7 +59,7 @@ return ITEM_INTERACT_BLOCKING force_proj_busy = FALSE - playsound(src,'sound/weapons/resonator_fire.ogg',50,TRUE) + playsound(src,'sound/items/weapons/resonator_fire.ogg',50,TRUE) user.visible_message(span_warning("[user] projects a forcefield!"),span_notice("You project a forcefield.")) var/obj/structure/projected_forcefield/F = new(T, src) current_fields += F @@ -124,14 +124,14 @@ /obj/structure/projected_forcefield/Destroy() visible_message(span_warning("[src] flickers and disappears!")) - playsound(src,'sound/weapons/resonator_blast.ogg',25,TRUE) + playsound(src,'sound/items/weapons/resonator_blast.ogg',25,TRUE) if(generator) generator.current_fields -= src generator = null return ..() /obj/structure/projected_forcefield/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) - playsound(loc, 'sound/weapons/egloves.ogg', 80, TRUE) + playsound(loc, 'sound/items/weapons/egloves.ogg', 80, TRUE) /obj/structure/projected_forcefield/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir) if(sound_effect) diff --git a/code/game/objects/items/devices/geiger_counter.dm b/code/game/objects/items/devices/geiger_counter.dm index 1d5ef17a90c..25bae430609 100644 --- a/code/game/objects/items/devices/geiger_counter.dm +++ b/code/game/objects/items/devices/geiger_counter.dm @@ -67,13 +67,13 @@ update_appearance(UPDATE_ICON) balloon_alert(user, "switch [scanning ? "on" : "off"]") -/obj/item/geiger_counter/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) - return interact_with_atom(interacting_with, user, modifiers) - /obj/item/geiger_counter/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) - if (user.combat_mode) + if(SHOULD_SKIP_INTERACTION(interacting_with, src, user)) return NONE - if (!CAN_IRRADIATE(interacting_with)) + return ranged_interact_with_atom(interacting_with, user, modifiers) + +/obj/item/geiger_counter/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(!CAN_IRRADIATE(interacting_with)) return NONE user.visible_message(span_notice("[user] scans [interacting_with] with [src]."), span_notice("You scan [interacting_with]'s radiation levels with [src]...")) diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm index 23882782e6c..baf5b62be5e 100644 --- a/code/game/objects/items/devices/laserpointer.dm +++ b/code/game/objects/items/devices/laserpointer.dm @@ -99,7 +99,7 @@ var/obj/item/stock_parts/attack_diode = attack_item if(crystal_lens && attack_diode.rating < 3) //only tier 3 and up are small enough to fit to_chat(user, span_warning("You try to jam \the [attack_item.name] in place, but \the [crystal_lens.name] is in the way!")) - playsound(src, 'sound/machines/airlock_alien_prying.ogg', 20) + playsound(src, 'sound/machines/airlock/airlock_alien_prying.ogg', 20) if(do_after(user, 2 SECONDS, src)) var/atom/atom_to_teleport = pick(user, attack_item) if(atom_to_teleport == user) @@ -113,7 +113,7 @@ return if(!user.transferItemToLoc(attack_item, src)) return - playsound(src, 'sound/items/screwdriver.ogg', 30) + playsound(src, 'sound/items/tools/screwdriver.ogg', 30) diode = attack_item balloon_alert(user, "installed \the [diode.name]") //we have a diode now, try starting a charge sequence in case the pointer was charging when we took out the diode @@ -129,7 +129,7 @@ var/obj/item/stack/ore/bluespace_crystal/crystal_stack = attack_item if(diode && diode.rating < 3) //only lasers of tier 3 and up can house a lens to_chat(user, span_warning("You try to jam \the [crystal_stack.name] in front of the diode, but it's a bad fit!")) - playsound(src, 'sound/machines/airlock_alien_prying.ogg', 20) + playsound(src, 'sound/machines/airlock/airlock_alien_prying.ogg', 20) if(do_after(user, 2 SECONDS, src)) var/atom/atom_to_teleport = pick(user, src) if(atom_to_teleport == user) @@ -148,7 +148,7 @@ if(!user.transferItemToLoc(single_crystal, src)) return crystal_lens = single_crystal - playsound(src, 'sound/items/screwdriver2.ogg', 30) + playsound(src, 'sound/items/tools/screwdriver2.ogg', 30) balloon_alert(user, "installed \the [crystal_lens.name]") to_chat(user, span_notice("You install a [crystal_lens.name] in [src]. \ It can now be used to shine through obstacles at the cost of double the energy drain.")) @@ -183,12 +183,14 @@ and the wide margin between it and the focus lens could probably house a crystal of some sort." /obj/item/laser_pointer/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) - return interact_with_atom(interacting_with, user, modifiers) - -/obj/item/laser_pointer/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) laser_act(interacting_with, user, modifiers) return ITEM_INTERACT_BLOCKING +/obj/item/laser_pointer/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(HAS_TRAIT(interacting_with, TRAIT_COMBAT_MODE_SKIP_INTERACTION)) + return NONE + return ranged_interact_with_atom(interacting_with, user, modifiers) + ///Handles shining the clicked atom, /obj/item/laser_pointer/proc/laser_act(atom/target, mob/living/user, list/modifiers) if(isnull(diode)) @@ -233,9 +235,12 @@ else if(user.zone_selected == BODY_ZONE_PRECISE_EYES) //Intensity of the laser dot to pass to flash_act var/severity = pick(0, 1, 2) + var/always_fail = FALSE + if(istype(target_humanoid.glasses, /obj/item/clothing/glasses/eyepatch) && prob(50)) + always_fail = TRUE //chance to actually hit the eyes depends on internal component - if(prob(effectchance * diode.rating) && target_humanoid.flash_act(severity)) + if(prob(effectchance * diode.rating) && !always_fail && target_humanoid.flash_act(severity)) outmsg = span_notice("You blind [target_humanoid] by shining [src] in [target_humanoid.p_their()] eyes.") log_combat(user, target_humanoid, "blinded with a laser pointer", src) else diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm index 13821a42de4..e3c19dfde66 100644 --- a/code/game/objects/items/devices/lightreplacer.dm +++ b/code/game/objects/items/devices/lightreplacer.dm @@ -223,7 +223,7 @@ if(istype(target, /obj/machinery/light)) if(replace_light(target, user) && bluespace_toggle) user.Beam(target, icon_state = "rped_upgrade", time = 0.5 SECONDS) - playsound(src, 'sound/items/pshoom.ogg', 40, 1) + playsound(src, 'sound/items/pshoom/pshoom.ogg', 40, 1) return TRUE // if we are attacking a floodlight frame finish it @@ -233,7 +233,7 @@ new /obj/machinery/power/floodlight(frame.loc) if(bluespace_toggle) user.Beam(target, icon_state = "rped_upgrade", time = 0.5 SECONDS) - playsound(src, 'sound/items/pshoom.ogg', 40, 1) + playsound(src, 'sound/items/pshoom/pshoom.ogg', 40, 1) to_chat(user, span_notice("You finish \the [frame] with a light tube.")) qdel(frame) return TRUE @@ -246,7 +246,7 @@ light_replaced = TRUE if(light_replaced && bluespace_toggle) user.Beam(target, icon_state = "rped_upgrade", time = 0.5 SECONDS) - playsound(src, 'sound/items/pshoom.ogg', 40, 1) + playsound(src, 'sound/items/pshoom/pshoom.ogg', 40, 1) return TRUE return FALSE @@ -325,6 +325,12 @@ . = ..() ADD_TRAIT(src, TRAIT_NODROP, CYBORG_ITEM_TRAIT) +/obj/item/lightreplacer/cyborg/advanced + name = "high capacity light replacer" + desc = "A higher capacity light replacer. Refill with broken or working lightbulbs, or sheets of glass." + icon_state = "lightreplacer_high" + max_uses = 50 + /obj/item/lightreplacer/blue name = "bluespace light replacer" desc = "A modified light replacer that zaps lights into place. Refill with broken or working lightbulbs, or sheets of glass." diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm index d250139e38e..19e65f8ff54 100644 --- a/code/game/objects/items/devices/multitool.dm +++ b/code/game/objects/items/devices/multitool.dm @@ -24,17 +24,22 @@ throwforce = 0 throw_range = 7 throw_speed = 3 - drop_sound = 'sound/items/handling/multitool_drop.ogg' - pickup_sound = 'sound/items/handling/multitool_pickup.ogg' + drop_sound = 'sound/items/handling/tools/multitool_drop.ogg' + pickup_sound = 'sound/items/handling/tools/multitool_pickup.ogg' custom_materials = list(/datum/material/iron= SMALL_MATERIAL_AMOUNT * 0.5, /datum/material/glass= SMALL_MATERIAL_AMOUNT * 0.2) custom_premium_price = PAYCHECK_COMMAND * 3 toolspeed = 1 - usesound = 'sound/weapons/empty.ogg' + usesound = 'sound/items/weapons/empty.ogg' var/datum/buffer // simple machine buffer for device linkage var/mode = 0 var/apc_scanner = TRUE COOLDOWN_DECLARE(next_apc_scan) +/obj/item/multitool/Destroy() + if(buffer) + remove_buffer(buffer) + return ..() + /obj/item/multitool/examine(mob/user) . = ..() . += span_notice("Its buffer [buffer ? "contains [buffer]." : "is empty."]") @@ -70,9 +75,10 @@ /obj/item/multitool/proc/set_buffer(datum/buffer) if(src.buffer) UnregisterSignal(src.buffer, COMSIG_QDELETING) + remove_buffer(src.buffer) src.buffer = buffer if(!QDELETED(buffer)) - RegisterSignal(buffer, COMSIG_QDELETING, PROC_REF(on_buffer_del)) + RegisterSignal(buffer, COMSIG_QDELETING, PROC_REF(remove_buffer)) /** * Called when the buffer's stored object is deleted @@ -80,8 +86,9 @@ * This proc does not clear the buffer of the multitool, it is here to * handle the deletion of the object the buffer references */ -/obj/item/multitool/proc/on_buffer_del(datum/source) +/obj/item/multitool/proc/remove_buffer(datum/source) SIGNAL_HANDLER + SEND_SIGNAL(src, COMSIG_MULTITOOL_REMOVE_BUFFER, source) buffer = null // Syndicate device disguised as a multitool; it will turn red when an AI camera is nearby. diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index 82108c50abc..6bb0fe91260 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -468,9 +468,7 @@ GLOBAL_LIST_INIT(channel_tokens, list( grant_headset_languages(mob_loc) /obj/item/radio/headset/click_alt(mob/living/user) - if(!istype(user) || !Adjacent(user) || user.incapacitated) - return CLICK_ACTION_BLOCKING - if (!command) + if(!istype(user) || !command) return CLICK_ACTION_BLOCKING use_command = !use_command to_chat(user, span_notice("You toggle high-volume mode [use_command ? "on" : "off"].")) diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index 3b690693bd4..3da023ac329 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -154,7 +154,7 @@ // A fully locked one will do nothing, as locked is intended to be used for stuff that should never be changed if(RADIO_FREQENCY_LOCKED) balloon_alert(user, "can't override frequency lock!") - playsound(src, 'sound/machines/buzz-two.ogg', 50, FALSE, SILENCED_SOUND_EXTRARANGE) + playsound(src, 'sound/machines/buzz/buzz-two.ogg', 50, FALSE, SILENCED_SOUND_EXTRARANGE) return // Emagging an unlocked one will do nothing, for now diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index e10eec3d3ef..239e97404af 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -121,19 +121,17 @@ return AddElement(/datum/element/slapcrafting, string_list(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 if(istype(keyslot)) QDEL_NULL(keyslot) return ..() -/obj/item/radio/proc/on_saboteur(datum/source, disrupt_duration) - SIGNAL_HANDLER +/obj/item/radio/on_saboteur(datum/source, disrupt_duration) + . = ..() if(broadcasting) //no broadcasting but it can still be used to send radio messages. set_broadcasting(FALSE) - return COMSIG_SABOTEUR_SUCCESS + return TRUE /obj/item/radio/proc/set_frequency(new_frequency) SEND_SIGNAL(src, COMSIG_RADIO_NEW_FREQUENCY, args) @@ -354,7 +352,7 @@ if(isliving(talking_movable)) var/mob/living/talking_living = talking_movable if(radio_noise && !HAS_TRAIT(talking_living, TRAIT_DEAF) && talking_living.client?.prefs.read_preference(/datum/preference/toggle/radio_noise)) - SEND_SOUND(talking_living, 'sound/misc/radio_talk.ogg') + SEND_SOUND(talking_living, 'sound/items/radio/radio_talk.ogg') // All radios make an attempt to use the subspace system first signal.send_to_receivers() @@ -443,10 +441,10 @@ var/list/spans = data["spans"] if(COOLDOWN_FINISHED(src, audio_cooldown)) COOLDOWN_START(src, audio_cooldown, 0.5 SECONDS) - SEND_SOUND(holder, 'sound/misc/radio_receive.ogg') + SEND_SOUND(holder, 'sound/items/radio/radio_receive.ogg') if((SPAN_COMMAND in spans) && COOLDOWN_FINISHED(src, important_audio_cooldown)) COOLDOWN_START(src, important_audio_cooldown, 0.5 SECONDS) - SEND_SOUND(holder, 'sound/misc/radio_important.ogg') + SEND_SOUND(holder, 'sound/items/radio/radio_important.ogg') /obj/item/radio/ui_state(mob/user) return GLOB.inventory_state diff --git a/code/game/objects/items/devices/reverse_bear_trap.dm b/code/game/objects/items/devices/reverse_bear_trap.dm index e88b1a51187..342383380cf 100644 --- a/code/game/objects/items/devices/reverse_bear_trap.dm +++ b/code/game/objects/items/devices/reverse_bear_trap.dm @@ -112,7 +112,7 @@ source = src, header = "Reverse bear trap armed", notify_flags = NOTIFY_CATEGORY_NOFLASH, - ghost_sound = 'sound/machines/beep.ogg', + ghost_sound = 'sound/machines/beep/beep.ogg', notify_volume = 75, ) diff --git a/code/game/objects/items/devices/scanners/autopsy_scanner.dm b/code/game/objects/items/devices/scanners/autopsy_scanner.dm index c5d33b74226..a054b3c69d2 100644 --- a/code/game/objects/items/devices/scanners/autopsy_scanner.dm +++ b/code/game/objects/items/devices/scanners/autopsy_scanner.dm @@ -95,7 +95,7 @@ var/blood_type = scanned.dna.blood_type if(blood_id != /datum/reagent/blood) var/datum/reagent/reagents = GLOB.chemical_reagents_list[blood_id] - blood_type = reagents ? reagents.name : blood_id + blood_type = reagents?.name || blood_id autopsy_information += "Blood Type: [blood_type]
" autopsy_information += "Blood Volume: [scanned.blood_volume] cl ([blood_percent]%)
" @@ -108,10 +108,11 @@ for(var/datum/symptom/symptom as anything in advanced_disease.symptoms) autopsy_information += "[symptom.name] - [symptom.desc]
" - var/obj/item/paper/autopsy_report = new(user.loc) - autopsy_report.name = "Autopsy Report ([scanned.name])" + var/obj/item/paper/autopsy_report = new(user.drop_location()) + autopsy_report.name = "autopsy report of [scanned] - [station_time_timestamp()])" autopsy_report.add_raw_text(autopsy_information.Join("\n")) - autopsy_report.update_appearance(UPDATE_ICON) + autopsy_report.color = "#99ccff" + autopsy_report.update_appearance() user.put_in_hands(autopsy_report) user.balloon_alert(user, "report printed") return TRUE diff --git a/code/game/objects/items/devices/scanners/health_analyzer.dm b/code/game/objects/items/devices/scanners/health_analyzer.dm index aca43907649..a1aee90dd5b 100644 --- a/code/game/objects/items/devices/scanners/health_analyzer.dm +++ b/code/game/objects/items/devices/scanners/health_analyzer.dm @@ -30,6 +30,8 @@ custom_price = PAYCHECK_COMMAND /// If this analyzer will give a bonus to wound treatments apon woundscan. var/give_wound_treatment_bonus = FALSE + var/last_scan_text + var/scanner_busy = FALSE /obj/item/healthanalyzer/Initialize(mapload) . = ..() @@ -38,7 +40,7 @@ /obj/item/healthanalyzer/examine(mob/user) . = ..() if(src.mode != SCANNER_NO_MODE) - . += span_notice("Alt-click [src] to toggle the limb damage readout.") + . += span_notice("Alt-click [src] to toggle the limb damage readout. Ctrl-shift-click to print readout report.") /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!")) @@ -58,8 +60,6 @@ /obj/item/healthanalyzer/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) if(!isliving(interacting_with)) return NONE - if(!user.can_read(src)) //SKYRAT EDIT CHANGE - Blind People Can Analyze Again- ORIGINAL: if(!user.can_read(src) || user.is_blind()) - return ITEM_INTERACT_BLOCKING var/mob/living/M = interacting_with @@ -69,37 +69,45 @@ // Clumsiness/brain damage check if ((HAS_TRAIT(user, TRAIT_CLUMSY) || HAS_TRAIT(user, TRAIT_DUMB)) && prob(50)) - user.visible_message(span_warning("[user] analyzes the floor's vitals!"), \ - span_notice("You stupidly try to analyze the floor's vitals!")) - to_chat(user, "[span_info("Analyzing results for The floor:\n\tOverall status: Healthy")]\ - \n[span_info("Key: Suffocation/Toxin/Burn/Brute")]\ - \n[span_info("\tDamage specifics: 0-0-0-0")]\ - \n[span_info("Body temperature: ???")]") + var/turf/scan_turf = get_turf(user) + user.visible_message( + span_warning("[user] analyzes [scan_turf]'s vitals!"), + span_notice("You stupidly try to analyze [scan_turf]'s vitals!"), + ) + + var/floor_text = "Analyzing results for [scan_turf] ([station_time_timestamp()]):
" + floor_text += "Overall status: Unknown
" + floor_text += "Subject lacks a brain.
" + floor_text += "Body temperature: [scan_turf?.return_air()?.return_temperature() || "???"]
" + + if(user.can_read(src)) // BUBBER EDIT - Blind people can analyze again + to_chat(user, examine_block(floor_text)) + last_scan_text = floor_text return if(ispodperson(M) && !advanced) - to_chat(user, "[M]'s biological structure is too complex for the health analyzer.") + to_chat(user, span_info("[M]'s biological structure is too complex for the health analyzer.")) return user.visible_message(span_notice("[user] analyzes [M]'s vitals.")) balloon_alert(user, "analyzing vitals") playsound(user.loc, 'sound/items/healthanalyzer.ogg', 50) + var/readability_check = user.can_read(src) && !user.is_blind() switch (scanmode) if (SCANMODE_HEALTH) - healthscan(user, M, mode, advanced) + last_scan_text = healthscan(user, M, mode, advanced, tochat = readability_check) if (SCANMODE_WOUND) - woundscan(user, M, src) + if(readability_check) + woundscan(user, M, src) add_fingerprint(user) /obj/item/healthanalyzer/interact_with_atom_secondary(atom/interacting_with, mob/living/user, list/modifiers) if(!isliving(interacting_with)) return NONE - if(!user.can_read(src)) // SKYRAT EDIT CHANGE - Blind people can analyze again - ORIGINAL: if(!user.can_read(src) || user.is_blind()) - return ITEM_INTERACT_BLOCKING - - chemscan(user, interacting_with) + if(user.can_read(src)) // SKYRAT EDIT CHANGE - Blind people can analyze again - ORIGINAL: if(user.can_read(src) && !user.is_blind()) + chemscan(user, interacting_with) return ITEM_INTERACT_SUCCESS /obj/item/healthanalyzer/add_item_context( @@ -136,308 +144,266 @@ return // the final list of strings to render - var/render_list = list() + var/list/render_list = list() // Damage specifics var/oxy_loss = target.getOxyLoss() var/tox_loss = target.getToxLoss() var/fire_loss = target.getFireLoss() var/brute_loss = target.getBruteLoss() - var/mob_status = (target.stat == DEAD ? span_alert("Deceased") : "[round(target.health/target.maxHealth,0.01)*100]% healthy") + var/mob_status = (!target.appears_alive() ? span_alert("Deceased") : "[round(target.health / target.maxHealth, 0.01) * 100]% healthy") - if(HAS_TRAIT(target, TRAIT_FAKEDEATH) && !advanced) - mob_status = span_alert("Deceased") - oxy_loss = max(rand(1, 40), oxy_loss, (300 - (tox_loss + fire_loss + brute_loss))) // Random oxygen loss + if(HAS_TRAIT(target, TRAIT_FAKEDEATH) && target.stat != DEAD) + // if we don't appear to actually be in a "dead state", add fake oxyloss + if(oxy_loss + tox_loss + fire_loss + brute_loss < 200) + oxy_loss += 200 - (oxy_loss + tox_loss + fire_loss + brute_loss) + oxy_loss = clamp(oxy_loss, 0, 200) - render_list += "[span_info("Analyzing results for [target]:")]\nOverall status: [mob_status]\n" + render_list += "[span_info("Analyzing results for [target] ([station_time_timestamp()]):")]
Overall status: [mob_status]
" - if(ishuman(target)) - var/mob/living/carbon/human/humantarget = target - if(humantarget.undergoing_cardiac_arrest() && humantarget.stat != DEAD) - render_list += "Subject suffering from heart attack: Apply defibrillation or other electric shock immediately!\n" - if(humantarget.has_reagent(/datum/reagent/inverse/technetium)) - advanced = TRUE + if(!advanced && target.has_reagent(/datum/reagent/inverse/technetium)) + advanced = TRUE - SEND_SIGNAL(target, COMSIG_LIVING_HEALTHSCAN, render_list, advanced, user, mode) + SEND_SIGNAL(target, COMSIG_LIVING_HEALTHSCAN, render_list, advanced, user, mode, tochat) // Husk detection if(HAS_TRAIT(target, TRAIT_HUSK)) if(advanced) if(HAS_TRAIT_FROM(target, TRAIT_HUSK, BURN)) - /* SKYRAT EDIT START: More unhusking information */ - render_list += "Subject has been husked by severe burns. Proceed by repairing burn damage and following up with \ - application of [SYNTHFLESH_UNHUSK_AMOUNT]u synthflesh or injection of rezadone as treatment.\n" + // BUBBER EDIT BEGIN - Better unhusk info with rezadone and exact units mentioned + render_list += "Subject has been husked by [conditional_tooltip("severe burns", "Tend burns and apply [SYNTHFLESH_UNHUSK_AMOUNT]u [/datum/reagent/medicine/c2/synthflesh::name] or use [/datum/reagent/medicine/rezadone::name].", tochat)].
" else if (HAS_TRAIT_FROM(target, TRAIT_HUSK, CHANGELING_DRAIN)) - render_list += "Subject has been husked by dessication. Use application of [SYNTHFLESH_LING_UNHUSK_AMOUNT]u \ - of synthflesh or injection of rezadone as treatment.\n" - /* SKYRAT EDIT END */ + render_list += "Subject has been husked by [conditional_tooltip("desiccation", "Apply [SYNTHFLESH_LING_UNHUSK_AMOUNT]u [/datum/reagent/medicine/c2/synthflesh::name] or use [/datum/reagent/medicine/rezadone::name]", tochat)].
" + // BUBBER EDIT END else - render_list += "Subject has been husked by mysterious causes.\n" + render_list += "Subject has been husked by mysterious causes.
" else - render_list += "Subject has been husked.\n" + render_list += "Subject has been husked.
" if(target.getStaminaLoss()) if(advanced) - render_list += "Fatigue level: [target.getStaminaLoss()]%.\n" + render_list += "Fatigue level: [target.getStaminaLoss()]%.
" else - render_list += "Subject appears to be suffering from fatigue.\n" + render_list += "Subject appears to be suffering from fatigue.
" if (!target.get_organ_slot(ORGAN_SLOT_BRAIN)) // kept exclusively for soul purposes - render_list += "Subject lacks a brain.\n" + render_list += "Subject lacks a brain.
" var/death_consequences_status_text // SKYRAT EDIT ADDITION: Death consequences quirk if(iscarbon(target)) var/mob/living/carbon/carbontarget = target - if(LAZYLEN(carbontarget.get_traumas())) - var/list/trauma_text = list() - for(var/datum/brain_trauma/trauma in carbontarget.get_traumas()) - //SKYRAT EDIT: Scary Traits (Bimbo) - if(!trauma.display_scanner) - continue - //SKYRAT EDIT: Scary Traits (Bimbo) - var/trauma_desc = "" - switch(trauma.resilience) - if(TRAUMA_RESILIENCE_SURGERY) - trauma_desc += "severe " - if(TRAUMA_RESILIENCE_LOBOTOMY) - trauma_desc += "deep-rooted " - if(TRAUMA_RESILIENCE_WOUND) - trauma_desc += "fracture-derived " - // SKYRAT EDIT CHANGE BEGIN - Curable permanent traumas - if(TRAUMA_RESILIENCE_MAGIC) - trauma_desc += "soul-bound " - if(TRAUMA_RESILIENCE_ABSOLUTE) - trauma_desc += "permanent " - // SKYRAT EDIT CHANGE END - trauma_desc += trauma.scan_desc - trauma_text += trauma_desc - // SKYRAT EDIT ADDITION START: Death Consequences Quirk - if (istype(trauma, /datum/brain_trauma/severe/death_consequences)) - var/datum/brain_trauma/severe/death_consequences/consequences_trauma = trauma - death_consequences_status_text = consequences_trauma.get_health_analyzer_link_text(user) - // SKYRAT EDIT ADDITION END: Death Consequences Quirk - render_list += "Cerebral traumas detected: subject appears to be suffering from [english_list(trauma_text)].\n" - if(carbontarget.quirks.len) - render_list += "Subject Major Disabilities: [carbontarget.get_quirk_string(FALSE, CAT_QUIRK_MAJOR_DISABILITY, from_scan = TRUE)].\n" + if(LAZYLEN(carbontarget.quirks)) + render_list += "Subject Major Disabilities: [carbontarget.get_quirk_string(FALSE, CAT_QUIRK_MAJOR_DISABILITY, from_scan = TRUE)].
" if(advanced) - render_list += "Subject Minor Disabilities: [carbontarget.get_quirk_string(FALSE, CAT_QUIRK_MINOR_DISABILITY, TRUE)].\n" - // Allergies - BUBBER EDIT BEGIN - for(var/datum/quirk/quirky as anything in target.quirks) - if(istype(quirky, /datum/quirk/item_quirk/allergic)) - var/datum/quirk/item_quirk/allergic/allergies_quirk = quirky - var/allergies = allergies_quirk.allergy_string - render_list += "Subject is extremely allergic to the following chemicals:\n" - render_list += "[allergies]\n" // BUBBER EDIT END - - // SKYRAT EDIT ADDITION START -- Show increased/decreased brute/burn mods, to "leave a paper trail" for the fragility quirk - if(ishuman(target)) - var/mob/living/carbon/human/humantarget = target - - var/datum/physiology/physiology = humantarget.physiology - if (physiology.brute_mod != 1) - render_list += "Subject takes [(physiology.brute_mod) * 100]% brute damage.\n" - if (physiology.burn_mod != 1) - render_list += "Subject takes [(physiology.burn_mod) * 100]% burn damage.\n" - // SKYRAT EDIT ADDITION END - - if (HAS_TRAIT(target, TRAIT_IRRADIATED)) - render_list += "Subject is irradiated. Supply toxin healing.\n" - - //Eyes and ears - if(advanced && iscarbon(target)) - var/mob/living/carbon/carbontarget = target - - // Ear status - var/obj/item/organ/internal/ears/ears = carbontarget.get_organ_slot(ORGAN_SLOT_EARS) - if(istype(ears)) - if(HAS_TRAIT_FROM(carbontarget, TRAIT_DEAF, GENETIC_MUTATION)) - render_list += "Subject is genetically deaf.\n" - else if(HAS_TRAIT_FROM(carbontarget, TRAIT_DEAF, EAR_DAMAGE)) - render_list += "Subject is deaf from ear damage.\n" - else if(HAS_TRAIT(carbontarget, TRAIT_DEAF)) - render_list += "Subject is deaf.\n" - else - if(ears.damage) - render_list += "Subject has [ears.damage > ears.maxHealth ? "permanent ": "temporary "]hearing damage.\n" - if(ears.deaf) - render_list += "Subject is [ears.damage > ears.maxHealth ? "permanently": "temporarily"] deaf.\n" - - // Eye status - var/obj/item/organ/internal/eyes/eyes = carbontarget.get_organ_slot(ORGAN_SLOT_EYES) - if(istype(eyes)) - if(carbontarget.is_blind()) - render_list += "Subject is blind.\n" - else if(carbontarget.is_nearsighted()) - render_list += "Subject is nearsighted.\n" + render_list += "Subject Minor Disabilities: [carbontarget.get_quirk_string(FALSE, CAT_QUIRK_MINOR_DISABILITY, TRUE)].
" // Body part damage report if(iscarbon(target)) var/mob/living/carbon/carbontarget = target - var/list/damaged = carbontarget.get_damaged_bodyparts(1,1) - if(length(damaged)>0 || oxy_loss>0 || tox_loss>0 || fire_loss>0) - var/dmgreport = "General status:\ - \ + var/any_damage = brute_loss > 0 || fire_loss > 0 || oxy_loss > 0 || tox_loss > 0 || fire_loss > 0 + var/any_missing = length(carbontarget.bodyparts) < (carbontarget.dna?.species?.max_bodypart_count || 6) + var/any_wounded = length(carbontarget.all_wounds) + var/any_embeds = carbontarget.has_embedded_objects() + if(any_damage || (mode == SCANNER_VERBOSE && (any_missing || any_wounded || any_embeds))) + render_list += "
" + var/dmgreport = "Body status:\ + \ +
\ + \ \ \ \ \ - \ - \ - \ - \ - \ - " + \ + \ + \ + \ + \ + \ + \ + \ + " if(mode == SCANNER_VERBOSE) - for(var/obj/item/bodypart/limb as anything in damaged) - if(limb.bodytype & BODYTYPE_ROBOTIC) - dmgreport += "" - else - dmgreport += "" - dmgreport += "" - dmgreport += "" - dmgreport += "
Damage:BruteBurnToxinSuffocation
Overall:[CEILING(brute_loss,1)][CEILING(fire_loss,1)][CEILING(tox_loss,1)][CEILING(oxy_loss,1)]
Suffocation
Overall:[ceil(brute_loss)][ceil(fire_loss)][ceil(tox_loss)][ceil(oxy_loss)]
[capitalize(limb.name)]:
[capitalize(limb.plaintext_zone)]:[(limb.brute_dam > 0) ? "[CEILING(limb.brute_dam,1)]" : "0"][(limb.burn_dam > 0) ? "[CEILING(limb.burn_dam,1)]" : "0"]
" + // Follow same body zone list every time so it's consistent across all humans + for(var/zone in GLOB.all_body_zones) + var/obj/item/bodypart/limb = carbontarget.get_bodypart(zone) + if(isnull(limb)) + dmgreport += "" + dmgreport += "[capitalize(parse_zone(zone))]:" + dmgreport += "-" + dmgreport += "-" + dmgreport += "" + dmgreport += "↳ Physical trauma: [conditional_tooltip("Dismembered", "Reattach or replace surgically.", tochat)]" + continue + var/has_any_embeds = length(limb.embedded_objects) >= 1 + var/has_any_wounds = length(limb.wounds) >= 1 + var/is_damaged = limb.burn_dam > 0 || limb.brute_dam > 0 + if(!is_damaged && (zone != BODY_ZONE_CHEST || (tox_loss <= 0 && oxy_loss <= 0)) && !has_any_embeds && !has_any_wounds) + continue + dmgreport += "" + dmgreport += "[capitalize((limb.bodytype & BODYTYPE_ROBOTIC) ? limb.name : limb.plaintext_zone)]:" + dmgreport += "[limb.brute_dam > 0 ? ceil(limb.brute_dam) : "0"]" + dmgreport += "[limb.burn_dam > 0 ? ceil(limb.burn_dam) : "0"]" + if(zone == BODY_ZONE_CHEST) // tox/oxy is stored in the chest + dmgreport += "[tox_loss > 0 ? ceil(tox_loss) : "0"]" + dmgreport += "[oxy_loss > 0 ? ceil(oxy_loss) : "0"]" + dmgreport += "" + if(has_any_embeds) + var/list/embedded_names = list() + for(var/obj/item/embed as anything in limb.embedded_objects) + embedded_names[capitalize(embed.name)] += 1 + for(var/embedded_name in embedded_names) + var/displayed = embedded_name + var/embedded_amt = embedded_names[embedded_name] + if(embedded_amt > 1) + displayed = "[embedded_amt]x [embedded_name]" + dmgreport += "↳ Foreign object(s): [conditional_tooltip(displayed, "Use a hemostat to remove.", tochat)]" + if(has_any_wounds) + for(var/datum/wound/wound as anything in limb.wounds) + dmgreport += "↳ Physical trauma: [conditional_tooltip("[wound.name] ([wound.severity_text()])", wound.treat_text_short, tochat)]" + + dmgreport += "" render_list += dmgreport // tables do not need extra linebreak - for(var/obj/item/bodypart/limb as anything in carbontarget.bodyparts) - for(var/obj/item/embed as anything in limb.embedded_objects) - render_list += "Embedded object: [embed] located in \the [limb.plaintext_zone]\n" if(ishuman(target)) var/mob/living/carbon/human/humantarget = target // Organ damage, missing organs - if(humantarget.organs && humantarget.organs.len) - var/render = FALSE - var/toReport = "Organs:\ - \ - \ - [advanced ? "" : ""]\ - " + var/render = FALSE + var/toReport = "Organ status:\ + \ +
Organ:DmgStatus
\ + \ + \ + [advanced ? "" : ""]\ + \ + " - for(var/obj/item/organ/organ as anything in humantarget.organs) - var/status = organ.get_status_text(advanced) - if (status != "") + var/list/missing_organs = list() + if(!humantarget.get_organ_slot(ORGAN_SLOT_BRAIN)) + missing_organs[ORGAN_SLOT_BRAIN] = "Brain" + if(!humantarget.needs_heart() && !humantarget.get_organ_slot(ORGAN_SLOT_HEART)) + missing_organs[ORGAN_SLOT_HEART] = "Heart" + if(!HAS_TRAIT_FROM(humantarget, TRAIT_NOBREATH, SPECIES_TRAIT) && !isnull(humantarget.dna.species.mutantlungs) && !humantarget.get_organ_slot(ORGAN_SLOT_LUNGS)) + missing_organs[ORGAN_SLOT_LUNGS] = "Lungs" + if(!HAS_TRAIT_FROM(humantarget, TRAIT_LIVERLESS_METABOLISM, SPECIES_TRAIT) && !isnull(humantarget.dna.species.mutantliver) && !humantarget.get_organ_slot(ORGAN_SLOT_LIVER)) + missing_organs[ORGAN_SLOT_LIVER] = "Liver" + if(!HAS_TRAIT_FROM(humantarget, TRAIT_NOHUNGER, SPECIES_TRAIT) && !isnull(humantarget.dna.species.mutantstomach) && !humantarget.get_organ_slot(ORGAN_SLOT_STOMACH)) + missing_organs[ORGAN_SLOT_STOMACH] ="Stomach" + if(!isnull(humantarget.dna.species.mutanttongue) && !humantarget.get_organ_slot(ORGAN_SLOT_TONGUE)) + missing_organs[ORGAN_SLOT_TONGUE] = "Tongue" + if(!isnull(humantarget.dna.species.mutantears) && !humantarget.get_organ_slot(ORGAN_SLOT_EARS)) + missing_organs[ORGAN_SLOT_EARS] = "Ears" + if(!isnull(humantarget.dna.species.mutantears) && !humantarget.get_organ_slot(ORGAN_SLOT_EYES)) + missing_organs[ORGAN_SLOT_EYES] = "Eyes" + + // Follow same order as in the organ_process_order so it's consistent across all humans + for(var/sorted_slot in GLOB.organ_process_order) + var/obj/item/organ/organ = humantarget.get_organ_slot(sorted_slot) + if(isnull(organ)) + if(missing_organs[sorted_slot]) render = TRUE - toReport += "\ - [advanced ? "" : ""]\ - " - - var/missing_organs = list() - if(!humantarget.get_organ_slot(ORGAN_SLOT_BRAIN)) - missing_organs += "brain" - if(!HAS_TRAIT_FROM(humantarget, TRAIT_NOBLOOD, SPECIES_TRAIT) && !humantarget.get_organ_slot(ORGAN_SLOT_HEART)) - missing_organs += "heart" - if(!HAS_TRAIT_FROM(humantarget, TRAIT_NOBREATH, SPECIES_TRAIT) && !humantarget.get_organ_slot(ORGAN_SLOT_LUNGS)) - missing_organs += "lungs" - if(!HAS_TRAIT_FROM(humantarget, TRAIT_LIVERLESS_METABOLISM, SPECIES_TRAIT) && !humantarget.get_organ_slot(ORGAN_SLOT_LIVER)) - missing_organs += "liver" - if(!HAS_TRAIT_FROM(humantarget, TRAIT_NOHUNGER, SPECIES_TRAIT) && !humantarget.get_organ_slot(ORGAN_SLOT_STOMACH)) - missing_organs += "stomach" - if(!humantarget.get_organ_slot(ORGAN_SLOT_TONGUE)) - missing_organs += "tongue" - if(!humantarget.get_organ_slot(ORGAN_SLOT_EARS)) - missing_organs += "ears" - if(!humantarget.get_organ_slot(ORGAN_SLOT_EYES)) - missing_organs += "eyes" - - if(length(missing_organs)) + toReport += "\ + [advanced ? "" : ""]\ + " + continue + if(mode != SCANNER_VERBOSE && !organ.show_on_condensed_scans()) + continue + var/status = organ.get_status_text(advanced, tochat) + var/appendix = organ.get_status_appendix(advanced, tochat) + if(status || appendix) + status ||= "OK" // otherwise flawless organs have no status reported by default render = TRUE - for(var/organ in missing_organs) - toReport += "\ - [advanced ? "" : ""]\ - " + toReport += "\ + \ + [advanced ? "" : ""]\ + \ + " + if(appendix) + toReport += "" - if(render) - render_list += toReport + "
Organ:DmgStatus
[organ.name]:[CEILING(organ.damage,1)][status]
[missing_organs[sorted_slot]]:-Missing
[organ]:["-"]["Missing"]
[capitalize(organ.name)]:[organ.damage > 0 ? ceil(organ.damage) : "0"][status]
↳ [appendix]
" // tables do not need extra linebreak + if(render) + render_list += "
" + render_list += toReport + "
" // tables do not need extra linebreak + + // Cybernetics + var/list/cyberimps + for(var/obj/item/organ/internal/cyberimp/cyberimp in humantarget.organs) + if(IS_ROBOTIC_ORGAN(cyberimp) && !(cyberimp.organ_flags & ORGAN_HIDDEN)) + LAZYADD(cyberimps, cyberimp.examine_title(user)) + if(LAZYLEN(cyberimps)) + if(!render) + render_list += "
" + render_list += "Detected cybernetic modifications:
" + render_list += "[english_list(cyberimps, and_text = ", and ")]
" + + render_list += "
" //Genetic stability - if(advanced && humantarget.has_dna()) - render_list += "Genetic Stability: [humantarget.dna.stability]%.\n" + if(advanced && humantarget.has_dna() && humantarget.dna.stability != initial(humantarget.dna.stability)) + render_list += "Genetic Stability: [humantarget.dna.stability]%.
" // Hulk and body temperature var/datum/species/targetspecies = humantarget.dna.species var/mutant = HAS_TRAIT(humantarget, TRAIT_HULK) - render_list += "Species: [targetspecies.name][mutant ? "-derived mutant" : ""]\n" + render_list += "Species: [targetspecies.name][mutant ? "-derived mutant" : ""]
" var/core_temperature_message = "Core temperature: [round(humantarget.coretemperature-T0C, 0.1)] °C ([round(humantarget.coretemperature*1.8-459.67,0.1)] °F)" if(humantarget.coretemperature >= humantarget.get_body_temp_heat_damage_limit()) - render_list += "☼ [core_temperature_message] ☼\n" + render_list += "☼ [core_temperature_message] ☼
" else if(humantarget.coretemperature <= humantarget.get_body_temp_cold_damage_limit()) - render_list += "❄ [core_temperature_message] ❄\n" + render_list += "❄ [core_temperature_message] ❄
" else - render_list += "[core_temperature_message]\n" + render_list += "[core_temperature_message]
" var/body_temperature_message = "Body temperature: [round(target.bodytemperature-T0C, 0.1)] °C ([round(target.bodytemperature*1.8-459.67,0.1)] °F)" if(target.bodytemperature >= target.get_body_temp_heat_damage_limit()) - render_list += "☼ [body_temperature_message] ☼\n" + render_list += "☼ [body_temperature_message] ☼
" else if(target.bodytemperature <= target.get_body_temp_cold_damage_limit()) - render_list += "❄ [body_temperature_message] ❄\n" + render_list += "❄ [body_temperature_message] ❄
" else - render_list += "[body_temperature_message]\n" - - // Time of death - if(target.station_timestamp_timeofdeath && (target.stat == DEAD || ((HAS_TRAIT(target, TRAIT_FAKEDEATH)) && !advanced))) - render_list += "Time of Death: [target.station_timestamp_timeofdeath]\n" - var/tdelta = round(world.time - target.timeofdeath) - render_list += "Subject died [DisplayTimeText(tdelta)] ago.\n" - - // Wounds - if(iscarbon(target)) - var/mob/living/carbon/carbontarget = target - var/list/wounded_parts = carbontarget.get_wounded_bodyparts() - for(var/i in wounded_parts) - var/obj/item/bodypart/wounded_part = i - render_list += "Physical trauma[LAZYLEN(wounded_part.wounds) > 1 ? "s" : ""] detected in [wounded_part.name]" - for(var/k in wounded_part.wounds) - var/datum/wound/W = k - render_list += "
[W.name] ([W.severity_text()])\nRecommended treatment: [W.treat_text]
" // less lines than in woundscan() so we don't overload people trying to get basic med info - render_list += "
" - - //Diseases - for(var/datum/disease/disease as anything in target.diseases) - if(!(disease.visibility_flags & HIDDEN_SCANNER)) - render_list += "Warning: [disease.form] detected\n\ -
Name: [disease.name].\nType: [disease.spread_text].\nStage: [disease.stage]/[disease.max_stages].\nPossible Cure: [disease.cure_text]
\ -
" // divs do not need extra linebreak + render_list += "[body_temperature_message]
" // Blood Level - if(target.has_dna()) - var/mob/living/carbon/carbontarget = target - var/blood_id = carbontarget.get_blood_id() - if(blood_id) - if(carbontarget.is_bleeding()) - render_list += "Subject is bleeding!\n" - var/blood_percent = round((carbontarget.blood_volume / BLOOD_VOLUME_NORMAL) * 100) - var/blood_type = carbontarget.dna.blood_type - if(blood_id != /datum/reagent/blood) // special blood substance - var/datum/reagent/R = GLOB.chemical_reagents_list[blood_id] - blood_type = R ? R.name : blood_id - if(carbontarget.blood_volume <= BLOOD_VOLUME_SAFE && carbontarget.blood_volume > BLOOD_VOLUME_OKAY) - render_list += "Blood level: LOW [blood_percent]%, [carbontarget.blood_volume] cl, [span_info("type: [blood_type]")]\n" - else if(carbontarget.blood_volume <= BLOOD_VOLUME_OKAY) - render_list += "Blood level: CRITICAL [blood_percent]%, [carbontarget.blood_volume] cl, [span_info("type: [blood_type]")]\n" - else - render_list += "Blood level: [blood_percent]%, [carbontarget.blood_volume] cl, type: [blood_type]\n" + var/mob/living/carbon/carbontarget = target + var/blood_id = carbontarget.get_blood_id() + if(blood_id) + var/blood_percent = round((carbontarget.blood_volume / BLOOD_VOLUME_NORMAL) * 100) + var/blood_type = carbontarget.dna.blood_type + if(blood_id != /datum/reagent/blood) // special blood substance + var/datum/reagent/real_reagent = GLOB.chemical_reagents_list[blood_id] + blood_type = real_reagent?.name || blood_id + if(carbontarget.blood_volume <= BLOOD_VOLUME_SAFE && carbontarget.blood_volume > BLOOD_VOLUME_OKAY) + render_list += "Blood level: LOW [blood_percent]%, [carbontarget.blood_volume] cl, [span_info("type: [blood_type]")]
" + else if(carbontarget.blood_volume <= BLOOD_VOLUME_OKAY) + render_list += "Blood level: CRITICAL [blood_percent]%, [carbontarget.blood_volume] cl, [span_info("type: [blood_type]")]
" + else + render_list += "Blood level: [blood_percent]%, [carbontarget.blood_volume] cl, type: [blood_type]
" - // Blood Alcohol Content var/blood_alcohol_content = target.get_blood_alcohol_content() if(blood_alcohol_content > 0) if(blood_alcohol_content >= 0.24) - render_list += "Blood alcohol content: CRITICAL [blood_alcohol_content]%\n" + render_list += "Blood alcohol content: CRITICAL [blood_alcohol_content]%
" else - render_list += "Blood alcohol content: [blood_alcohol_content]%\n" + render_list += "Blood alcohol content: [blood_alcohol_content]%
" - // Cybernetics - if(iscarbon(target)) - var/mob/living/carbon/carbontarget = target - var/cyberimp_detect - for(var/obj/item/organ/internal/cyberimp/cyberimp in carbontarget.organs) - if(IS_ROBOTIC_ORGAN(cyberimp) && !(cyberimp.organ_flags & ORGAN_HIDDEN)) - cyberimp_detect += "[!cyberimp_detect ? "[cyberimp.get_examine_string(user)]" : ", [cyberimp.get_examine_string(user)]"]" - if(cyberimp_detect) - render_list += "Detected cybernetic modifications:\n" - render_list += "[cyberimp_detect]\n" - // we handled the last
so we don't need handholding + //Diseases + var/disease_hr = FALSE + for(var/datum/disease/disease as anything in target.diseases) + if(disease.visibility_flags & HIDDEN_SCANNER) + continue + if(!disease_hr) + render_list += "
" + disease_hr = TRUE + render_list += "\ + Warning: [disease.form] detected
\ +
\ + Name: [disease.name].
\ + Type: [disease.spread_text].
\ + Stage: [disease.stage]/[disease.max_stages].
\ + Possible Cure: [disease.cure_text]
\ +
" // SKYRAT EDIT ADDITION - Mutant stuff and DEATH CONSEQUENCES if(target.GetComponent(/datum/component/mutant_infection)) @@ -461,10 +427,47 @@ render_list += "Patient's infection is currently [cling_infection.can_cure ? "EXPOSED" : "INCUBATING"]." //BUBBERSTATION EDIT END + // Time of death + if(target.station_timestamp_timeofdeath && !target.appears_alive()) + render_list += "
" + render_list += "Time of Death: [target.station_timestamp_timeofdeath]
" + render_list += "Subject died [DisplayTimeText(round(world.time - target.timeofdeath))] ago.
" + + . = jointext(render_list, "") if(tochat) - to_chat(user, examine_block(jointext(render_list, "")), trailing_newline = FALSE, type = MESSAGE_TYPE_INFO) - else - return(jointext(render_list, "")) + to_chat(user, examine_block(.), trailing_newline = FALSE, type = MESSAGE_TYPE_INFO) + return . + +/obj/item/healthanalyzer/click_ctrl_shift(mob/user) + . = ..() + if(!LAZYLEN(last_scan_text)) + balloon_alert(user, "no scans!") + return + if(scanner_busy) + balloon_alert(user, "analyzer busy!") + return + scanner_busy = TRUE + balloon_alert(user, "printing report...") + addtimer(CALLBACK(src, PROC_REF(print_report)), 2 SECONDS) + +/obj/item/healthanalyzer/proc/print_report(mob/user) + var/obj/item/paper/report_paper = new(get_turf(src)) + + report_paper.color = "#99ccff" + report_paper.name = "health scan report - [station_time_timestamp()]" + var/report_text = "
Health scan report. Time of retrieval: [station_time_timestamp()]

" + report_text += last_scan_text + + report_paper.add_raw_text(report_text) + report_paper.update_appearance() + + if(ismob(loc)) + var/mob/printer = loc + printer.put_in_hands(report_paper) + balloon_alert(printer, "logs cleared") + + report_text = list() + scanner_busy = FALSE /proc/chemscan(mob/living/user, mob/living/target) if(user.incapacitated) @@ -480,12 +483,12 @@ var/datum/reagent/reagent = r if(reagent.chemical_flags & REAGENT_INVISIBLE) //Don't show hidden chems on scanners continue - render_block += "[round(reagent.volume, 0.001)] units of [reagent.name][reagent.overdosed ? " - [span_boldannounce("OVERDOSING")]" : ".
"]\n" + render_block += "[round(reagent.volume, 0.001)] units of [reagent.name][reagent.overdosed ? " - [span_boldannounce("OVERDOSING")]" : ".
"]
" if(!length(render_block)) //If no VISIBLY DISPLAYED reagents are present, we report as if there is nothing. - render_list += "Subject contains no reagents in their blood.\n" + render_list += "Subject contains no reagents in their blood.
" else - render_list += "Subject contains the following reagents in their blood:\n" + render_list += "Subject contains the following reagents in their blood:
" render_list += render_block //Otherwise, we add the header, reagent readouts, and clear the readout block for use on the stomach. render_block.Cut() @@ -498,35 +501,35 @@ if(bit.chemical_flags & REAGENT_INVISIBLE) continue if(!belly.food_reagents[bit.type]) - render_block += "[round(bit.volume, 0.001)] units of [bit.name][bit.overdosed ? " - [span_boldannounce("OVERDOSING")]" : ".
"]\n" + render_block += "[round(bit.volume, 0.001)] units of [bit.name][bit.overdosed ? " - [span_boldannounce("OVERDOSING")]" : ".
"]
" else var/bit_vol = bit.volume - belly.food_reagents[bit.type] if(bit_vol > 0) - render_block += "[round(bit_vol, 0.001)] units of [bit.name][bit.overdosed ? " - [span_boldannounce("OVERDOSING")]" : ".
"]\n" + render_block += "[round(bit_vol, 0.001)] units of [bit.name][bit.overdosed ? " - [span_boldannounce("OVERDOSING")]" : ".
"]
" if(!length(render_block)) - render_list += "Subject contains no reagents in their stomach.\n" + render_list += "Subject contains no reagents in their stomach.
" else - render_list += "Subject contains the following reagents in their stomach:\n" + render_list += "Subject contains the following reagents in their stomach:
" render_list += render_block // Addictions if(LAZYLEN(target.mind?.active_addictions)) - render_list += "Subject is addicted to the following types of drug:\n" + render_list += "Subject is addicted to the following types of drug:
" for(var/datum/addiction/addiction_type as anything in target.mind.active_addictions) - render_list += "[initial(addiction_type.name)]\n" + render_list += "[initial(addiction_type.name)]
" // Special eigenstasium addiction if(target.has_status_effect(/datum/status_effect/eigenstasium)) - render_list += "Subject is temporally unstable. Stabilising agent is recommended to reduce disturbances.\n" + render_list += "Subject is temporally unstable. Stabilising agent is recommended to reduce disturbances.
" // Allergies for(var/datum/quirk/quirky as anything in target.quirks) if(istype(quirky, /datum/quirk/item_quirk/allergic)) var/datum/quirk/item_quirk/allergic/allergies_quirk = quirky var/allergies = allergies_quirk.allergy_string - render_list += "Subject is extremely allergic to the following chemicals:\n" - render_list += "[allergies]\n" + render_list += "Subject is extremely allergic to the following chemicals:
" + render_list += "[allergies]
" // we handled the last
so we don't need handholding to_chat(user, examine_block(jointext(render_list, "")), trailing_newline = FALSE, type = MESSAGE_TYPE_INFO) @@ -563,7 +566,7 @@ render_list += "Warning: Physical trauma[LAZYLEN(wounded_part.wounds) > 1? "s" : ""] detected in [wounded_part.name]" for(var/limb_wound in wounded_part.wounds) var/datum/wound/current_wound = limb_wound - render_list += "
[simple_scan ? current_wound.get_simple_scanner_description() : current_wound.get_scanner_description()]
\n" + render_list += "
[simple_scan ? current_wound.get_simple_scanner_description() : current_wound.get_scanner_description()]

" if (scanner.give_wound_treatment_bonus) ADD_TRAIT(current_wound, TRAIT_WOUND_SCANNED, ANALYZER_TRAIT) if(!advised) @@ -584,7 +587,7 @@ if(simple_scan) var/obj/item/healthanalyzer/simple/simple_scanner = scanner simple_scanner.show_emotion(AID_EMOTION_WARN) - playsound(simple_scanner, 'sound/machines/twobeep.ogg', 50, FALSE) + playsound(simple_scanner, 'sound/machines/beep/twobeep.ogg', 50, FALSE) /obj/item/healthanalyzer/simple @@ -622,7 +625,7 @@ show_emotion(AID_EMOTION_ANGRY) /obj/item/healthanalyzer/simple/proc/violence(mob/user) - playsound(src, 'sound/machines/buzz-sigh.ogg', 50, FALSE) + playsound(src, 'sound/machines/buzz/buzz-sigh.ogg', 50, FALSE) if(isliving(user)) var/mob/living/L = user to_chat(L, span_warning("[src] makes a disappointed buzz and pricks your finger for being greedy. Ow!")) @@ -647,7 +650,7 @@ ) if(!iscarbon(interacting_with)) - playsound(src, 'sound/machines/buzz-sigh.ogg', 30, TRUE) + playsound(src, 'sound/machines/buzz/buzz-sigh.ogg', 30, TRUE) to_chat(user, span_notice("[src] makes a sad buzz and briefly displays an unhappy face, indicating it can't scan [interacting_with].")) show_emotion(AI_EMOTION_SAD) return ITEM_INTERACT_BLOCKING @@ -728,8 +731,8 @@ var/list/render = list() for(var/datum/disease/disease as anything in patient.diseases) if(!(disease.visibility_flags & HIDDEN_SCANNER)) - render += "Warning: [disease.form] detected\n\ -
Name: [disease.name].\nType: [disease.spread_text].\nStage: [disease.stage]/[disease.max_stages].\nPossible Cure: [disease.cure_text]
\ + render += "Warning: [disease.form] detected
\ +
Name: [disease.name].
Type: [disease.spread_text].
Stage: [disease.stage]/[disease.max_stages].
Possible Cure: [disease.cure_text]
\
" if(!length(render)) @@ -739,7 +742,7 @@ else to_chat(user, span_notice(render.Join(""))) scanner.emotion = AID_EMOTION_WARN - playsound(scanner, 'sound/machines/twobeep.ogg', 50, FALSE) + playsound(scanner, 'sound/machines/beep/twobeep.ogg', 50, FALSE) #undef SCANMODE_HEALTH #undef SCANMODE_WOUND diff --git a/code/game/objects/items/devices/swapper.dm b/code/game/objects/items/devices/swapper.dm index 650562dd878..20554d18a8e 100644 --- a/code/game/objects/items/devices/swapper.dm +++ b/code/game/objects/items/devices/swapper.dm @@ -57,9 +57,9 @@ if(QDELETED(linked_swapper)) to_chat(user, span_warning("[src] is not linked with another swapper.")) return - playsound(src, 'sound/weapons/flash.ogg', 25, TRUE) + playsound(src, 'sound/items/weapons/flash.ogg', 25, TRUE) to_chat(user, span_notice("You activate [src].")) - playsound(linked_swapper, 'sound/weapons/flash.ogg', 25, TRUE) + playsound(linked_swapper, 'sound/items/weapons/flash.ogg', 25, TRUE) if(ismob(linked_swapper.loc)) var/mob/holder = linked_swapper.loc to_chat(holder, span_notice("[linked_swapper] starts buzzing.")) diff --git a/code/game/objects/items/devices/table_clock.dm b/code/game/objects/items/devices/table_clock.dm index 37c1098759e..d9c5e44fcf7 100644 --- a/code/game/objects/items/devices/table_clock.dm +++ b/code/game/objects/items/devices/table_clock.dm @@ -37,7 +37,7 @@ . = ..() if(attacking_item.force < 5 || broken) return - if(break_clock(break_sound = 'sound/magic/clockwork/ark_activation.ogg')) + if(break_clock(break_sound = 'sound/effects/magic/clockwork/ark_activation.ogg')) user.visible_message( span_warning("[user] smashes \the [src] so hard it stops breaking!"), span_boldannounce("I can't stand this stupid machine anymore! Shut up already!"), diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm index b86489fae9e..9b6328fe682 100644 --- a/code/game/objects/items/devices/taperecorder.dm +++ b/code/game/objects/items/devices/taperecorder.dm @@ -162,7 +162,7 @@ if(mytape && recording) mytape.timestamp += mytape.used_capacity - mytape.storedinfo += "\[[time2text(mytape.used_capacity,"mm:ss")]\] [raw_message]" + mytape.storedinfo += "\[[time2text(mytape.used_capacity,"mm:ss")]\] [speaker.GetVoice()]: [raw_message]" /obj/item/taperecorder/verb/record() diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm index 8327e185ea6..a2fac2b50a4 100644 --- a/code/game/objects/items/devices/traitordevices.dm +++ b/code/game/objects/items/devices/traitordevices.dm @@ -361,15 +361,6 @@ effective or pretty fucking useless. new /obj/item/analyzer(src) new /obj/item/wirecutters(src) -/obj/item/storage/toolbox/emergency/turret/storage_insert_on_interacted_with(datum/storage, obj/item/inserted, mob/living/user) - if(!istype(inserted, /obj/item/wrench/combat)) - return TRUE - if(!user.combat_mode) - return TRUE - if(!inserted.toolspeed) - return TRUE - return FALSE - /obj/item/storage/toolbox/emergency/turret/item_interaction(mob/living/user, obj/item/tool, list/modifiers) if(!istype(tool, /obj/item/wrench/combat)) return NONE @@ -389,7 +380,7 @@ effective or pretty fucking useless. COMBAT_MESSAGE_RANGE, ) - playsound(src, 'sound/items/drill_use.ogg', 80, TRUE, -1) + playsound(src, 'sound/items/tools/drill_use.ogg', 80, TRUE, -1) var/obj/machinery/porta_turret/syndicate/toolbox/turret = new(get_turf(loc)) set_faction(turret, user) turret.toolbox = src diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index d17530c8010..4f0c0a84aa3 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -25,11 +25,36 @@ /obj/item/transfer_valve/Initialize(mapload) . = ..() RegisterSignal(src, COMSIG_ITEM_FRIED, PROC_REF(on_fried)) + register_context() /obj/item/transfer_valve/Destroy() attached_device = null return ..() +/obj/item/transfer_valve/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = ..() + + if(tank_one || tank_two) + context[SCREENTIP_CONTEXT_ALT_LMB] = "Remove [tank_one || tank_two]" + . = CONTEXTUAL_SCREENTIP_SET + if(istype(held_item) && is_type_in_list(held_item, list(/obj/item/tank, /obj/item/assembly))) + context[SCREENTIP_CONTEXT_LMB] = "Attach [held_item]" + . = CONTEXTUAL_SCREENTIP_SET + + return . || NONE + +/obj/item/transfer_valve/click_alt(mob/user) + if(tank_one) + split_gases() + valve_open = FALSE + tank_one.forceMove(drop_location()) + else if(tank_two) + split_gases() + valve_open = FALSE + tank_two.forceMove(drop_location()) + + return CLICK_ACTION_SUCCESS + /obj/item/transfer_valve/IsAssemblyHolder() return TRUE diff --git a/code/game/objects/items/dice.dm b/code/game/objects/items/dice.dm index 64ce9803657..aa98d325a7d 100644 --- a/code/game/objects/items/dice.dm +++ b/code/game/objects/items/dice.dm @@ -507,8 +507,8 @@ to_summon, get_turf(cast_on), precision = 1, - asoundin = 'sound/magic/wand_teleport.ogg', - asoundout = 'sound/magic/wand_teleport.ogg', + asoundin = 'sound/effects/magic/wand_teleport.ogg', + asoundout = 'sound/effects/magic/wand_teleport.ogg', channel = TELEPORT_CHANNEL_MAGIC, ) diff --git a/code/game/objects/items/dna_probe.dm b/code/game/objects/items/dna_probe.dm index 57718ca217e..9e3be2dce40 100644 --- a/code/game/objects/items/dna_probe.dm +++ b/code/game/objects/items/dna_probe.dm @@ -48,7 +48,7 @@ if(!our_vault) dna_vault_ref = WEAKREF(target)//linking the dna vault with the probe balloon_alert(user, "vault linked") - playsound(src, 'sound/machines/terminal_success.ogg', 50) + playsound(src, 'sound/machines/terminal/terminal_success.ogg', 50) return TRUE return FALSE @@ -70,14 +70,14 @@ target.animal_dna += stored_dna_animal stored_dna_animal.Cut() target.check_goal() - playsound(target, 'sound/misc/compiler-stage1.ogg', 50) + playsound(target, 'sound/machines/compiler/compiler-stage1.ogg', 50) to_chat(user, span_notice("[uploaded] new datapoints uploaded.")) return uploaded /obj/item/dna_probe/proc/scan_dna(atom/target, mob/user) var/obj/machinery/dna_vault/our_vault = dna_vault_ref?.resolve() if(!our_vault) - playsound(user, 'sound/machines/buzz-sigh.ogg', 50) + playsound(user, 'sound/machines/buzz/buzz-sigh.ogg', 50) balloon_alert(user, "need database!") return if(istype(target, /obj/machinery/hydroponics)) @@ -94,7 +94,7 @@ to_chat(user, span_alert("Plant needs to be ready to harvest to perform full data scan.")) //Because space dna is actually magic return stored_dna_plants[hydro_tray.myseed.type] = TRUE - playsound(src, 'sound/misc/compiler-stage2.ogg', 50) + playsound(src, 'sound/machines/compiler/compiler-stage2.ogg', 50) balloon_alert(user, "data added") return TRUE else if(ishuman(target)) @@ -109,7 +109,7 @@ to_chat(user, span_alert("No compatible DNA detected.")) return . stored_dna_human[human_target.dna.unique_identity] = TRUE - playsound(src, 'sound/misc/compiler-stage2.ogg', 50) + playsound(src, 'sound/machines/compiler/compiler-stage2.ogg', 50) balloon_alert(user, "data added") return TRUE @@ -131,7 +131,7 @@ to_chat(user, span_alert("No compatible DNA detected.")) return . stored_dna_animal[living_target.type] = TRUE - playsound(src, 'sound/misc/compiler-stage2.ogg', 50) + playsound(src, 'sound/machines/compiler/compiler-stage2.ogg', 50) balloon_alert(user, "data added") return TRUE @@ -162,7 +162,7 @@ /obj/item/dna_probe/carp_scanner/scan_dna(atom/target, mob/user) if(istype(target, /mob/living/basic/carp)) carp_dna_loaded = TRUE - playsound(src, 'sound/misc/compiler-stage2.ogg', 50) + playsound(src, 'sound/machines/compiler/compiler-stage2.ogg', 50) balloon_alert(user, "dna scanned") else return ..() diff --git a/code/game/objects/items/door_seal.dm b/code/game/objects/items/door_seal.dm index d3e80cdf16d..a3189c94cfb 100644 --- a/code/game/objects/items/door_seal.dm +++ b/code/game/objects/items/door_seal.dm @@ -21,6 +21,6 @@ /obj/item/door_seal/suicide_act(mob/living/user) user.visible_message(span_suicide("[user] is sealing [user.p_them()]self off from the world with [src]! It looks like [user.p_theyre()] trying to commit suicide!")) - playsound(src, 'sound/items/jaws_pry.ogg', 30, TRUE) + playsound(src, 'sound/items/tools/jaws_pry.ogg', 30, TRUE) return BRUTELOSS diff --git a/code/game/objects/items/dualsaber.dm b/code/game/objects/items/dualsaber.dm index 218a59a646d..7f168444d6a 100644 --- a/code/game/objects/items/dualsaber.dm +++ b/code/game/objects/items/dualsaber.dm @@ -24,7 +24,7 @@ attack_verb_continuous = list("attacks", "slashes", "stabs", "slices", "tears", "lacerates", "rips", "dices", "cuts") attack_verb_simple = list("attack", "slash", "stab", "slice", "tear", "lacerate", "rip", "dice", "cut") block_chance = 75 - block_sound = 'sound/weapons/block_blade.ogg' + block_sound = 'sound/items/weapons/block_blade.ogg' max_integrity = 200 armor_type = /datum/armor/item_dualsaber resistance_flags = FIRE_PROOF @@ -49,8 +49,8 @@ AddComponent(/datum/component/two_handed, \ force_unwielded = force, \ force_wielded = two_hand_force, \ - wieldsound = 'sound/weapons/saberon.ogg', \ - unwieldsound = 'sound/weapons/saberoff.ogg', \ + wieldsound = 'sound/items/weapons/saberon.ogg', \ + unwieldsound = 'sound/items/weapons/saberoff.ogg', \ wield_callback = CALLBACK(src, PROC_REF(on_wield)), \ unwield_callback = CALLBACK(src, PROC_REF(on_unwield)), \ ) @@ -62,7 +62,7 @@ to_chat(user, span_warning("You lack the grace to wield this!")) return COMPONENT_TWOHANDED_BLOCK_WIELD update_weight_class(w_class_on) - hitsound = 'sound/weapons/blade1.ogg' + hitsound = 'sound/items/weapons/blade1.ogg' START_PROCESSING(SSobj, src) set_light_on(TRUE) diff --git a/code/game/objects/items/eightball.dm b/code/game/objects/items/eightball.dm index 4445cdd1b72..40f08e78ffc 100644 --- a/code/game/objects/items/eightball.dm +++ b/code/game/objects/items/eightball.dm @@ -153,7 +153,7 @@ /obj/item/toy/eightball/haunted/start_shaking(mob/user) // notify ghosts that someone's shaking a haunted eightball // and inform them of the message, (hopefully a yes/no question) - selected_message = tgui_input_text(user, "What is your question?", "Eightball") || initial(selected_message) + selected_message = tgui_input_text(user, "What is your question?", "Eightball", max_length = MAX_MESSAGE_LEN) || initial(selected_message) if (!(src in user.held_items)) return FALSE notify_ghosts( diff --git a/code/game/objects/items/emags.dm b/code/game/objects/items/emags.dm index 5590f72eaf3..02343bc27a4 100644 --- a/code/game/objects/items/emags.dm +++ b/code/game/objects/items/emags.dm @@ -137,16 +137,16 @@ . = ..() type_blacklist = list(typesof(/obj/machinery/door/airlock) + typesof(/obj/machinery/door/window/) + typesof(/obj/machinery/door/firedoor) - typesof(/obj/machinery/door/airlock/tram)) //list of all typepaths that require a specialized emag to hack. -/obj/item/card/emag/storage_insert_on_interaction(datum/storage, atom/storage_holder, mob/living/user) - return !user.combat_mode - /obj/item/card/emag/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(SHOULD_SKIP_INTERACTION(interacting_with, src, user)) + return NONE // lets us put things in bags without trying to emag them if(!can_emag(interacting_with, user)) return ITEM_INTERACT_BLOCKING log_combat(user, interacting_with, "attempted to emag") if(interacting_with.emag_act(user, src)) SSblackbox.record_feedback("tally", "atom_emagged", 1, interacting_with.type) - return ITEM_INTERACT_SUCCESS + return ITEM_INTERACT_SUCCESS + return NONE // In a perfect world this would be blocking, but this is not a perfect world /obj/item/card/emag/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) return prox_check ? NONE : interact_with_atom(interacting_with, user) @@ -183,7 +183,7 @@ /obj/item/card/emag/doorjack/proc/recharge(mob/user) charges = min(charges+1, max_charges) - playsound(src,'sound/machines/twobeep.ogg',10,TRUE, extrarange = SILENCED_SOUND_EXTRARANGE, falloff_distance = 0) + playsound(src,'sound/machines/beep/twobeep.ogg',10,TRUE, extrarange = SILENCED_SOUND_EXTRARANGE, falloff_distance = 0) charge_timers.Remove(charge_timers[1]) /obj/item/card/emag/doorjack/examine(mob/user) diff --git a/code/game/objects/items/etherealdiscoball.dm b/code/game/objects/items/etherealdiscoball.dm index fe066bd1bf5..4eca1dc2fc0 100644 --- a/code/game/objects/items/etherealdiscoball.dm +++ b/code/game/objects/items/etherealdiscoball.dm @@ -1,5 +1,5 @@ /obj/item/etherealballdeployer - name = "Portable Ethereal Disco Ball" + name = "portable ethereal disco ball" desc = "Press the button for a deployment of slightly-unethical PARTY!" icon = 'icons/obj/devices/remote.dmi' icon_state = "ethdisco" @@ -11,7 +11,7 @@ qdel(src) /obj/structure/etherealball - name = "Ethereal Disco Ball" + name = "ethereal disco ball" desc = "The ethics of this discoball are questionable." icon = 'icons/obj/machines/floor.dmi' icon_state = "ethdisco_head_0" diff --git a/code/game/objects/items/extinguisher.dm b/code/game/objects/items/extinguisher.dm index 0012dd08f26..5eb5e3bf2bd 100644 --- a/code/game/objects/items/extinguisher.dm +++ b/code/game/objects/items/extinguisher.dm @@ -5,7 +5,7 @@ icon_state = "fire_extinguisher0" worn_icon_state = "fire_extinguisher" inhand_icon_state = "fire_extinguisher" - hitsound = 'sound/weapons/smash.ogg' + hitsound = 'sound/items/weapons/smash.ogg' obj_flags = CONDUCTS_ELECTRICITY throwforce = 10 w_class = WEIGHT_CLASS_NORMAL @@ -207,13 +207,15 @@ else return FALSE -/obj/item/extinguisher/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) - return interact_with_atom(interacting_with, user, modifiers) - /obj/item/extinguisher/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) - if (interacting_with.loc == user) + if(interacting_with.loc == user) return NONE + // Always skip interaction if it's a bag or table (that's not on fire) + if(!(interacting_with.resistance_flags & ON_FIRE) && HAS_TRAIT(interacting_with, TRAIT_COMBAT_MODE_SKIP_INTERACTION)) + return NONE + return ranged_interact_with_atom(interacting_with, user, modifiers) +/obj/item/extinguisher/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) if(refilling) refilling = FALSE return NONE @@ -238,7 +240,7 @@ var/movementdirection = REVERSE_DIR(direction) addtimer(CALLBACK(src, TYPE_PROC_REF(/obj/item/extinguisher, move_chair), B, movementdirection), 0.1 SECONDS) else - user.newtonian_move(REVERSE_DIR(direction)) + user.newtonian_move(dir2angle(REVERSE_DIR(direction))) //Get all the turfs that can be shot at var/turf/T = get_turf(interacting_with) diff --git a/code/game/objects/items/fireaxe.dm b/code/game/objects/items/fireaxe.dm index 8a8f26b2c89..265a05cfac7 100644 --- a/code/game/objects/items/fireaxe.dm +++ b/code/game/objects/items/fireaxe.dm @@ -17,7 +17,7 @@ slot_flags = ITEM_SLOT_BACK attack_verb_continuous = list("attacks", "chops", "cleaves", "tears", "lacerates", "cuts") attack_verb_simple = list("attack", "chop", "cleave", "tear", "lacerate", "cut") - hitsound = 'sound/weapons/bladeslice.ogg' + hitsound = 'sound/items/weapons/bladeslice.ogg' sharpness = SHARP_EDGED armor_type = /datum/armor/item_fireaxe resistance_flags = FIRE_PROOF @@ -83,7 +83,7 @@ demolition_mod = 2 tool_behaviour = TOOL_CROWBAR toolspeed = 1 - usesound = 'sound/items/crowbar.ogg' + usesound = 'sound/items/tools/crowbar.ogg' //boarding axe /obj/item/fireaxe/boardingaxe diff --git a/code/game/objects/items/flamethrower.dm b/code/game/objects/items/flamethrower.dm index ad03fe9ab4f..cd41859307e 100644 --- a/code/game/objects/items/flamethrower.dm +++ b/code/game/objects/items/flamethrower.dm @@ -32,8 +32,8 @@ var/create_full = FALSE var/create_with_tank = FALSE var/igniter_type = /obj/item/assembly/igniter - var/acti_sound = 'sound/items/welderactivate.ogg' - var/deac_sound = 'sound/items/welderdeactivate.ogg' + var/acti_sound = 'sound/items/tools/welderactivate.ogg' + var/deac_sound = 'sound/items/tools/welderdeactivate.ogg' /obj/item/flamethrower/Initialize(mapload) . = ..() diff --git a/code/game/objects/items/food/bait.dm b/code/game/objects/items/food/bait.dm index f31eb44f308..711c6cb1e68 100644 --- a/code/game/objects/items/food/bait.dm +++ b/code/game/objects/items/food/bait.dm @@ -6,6 +6,8 @@ var/bait_quality = TRAIT_BASIC_QUALITY_BAIT /// Icon state added to main fishing rod icon when this bait is equipped var/rod_overlay_icon_state + /// Is this included in the autowiki? + var/show_on_wiki = TRUE /obj/item/food/bait/Initialize(mapload) . = ..() @@ -36,9 +38,14 @@ lefthand_file = 'icons/mob/inhands/items_lefthand.dmi' righthand_file = 'icons/mob/inhands/items_righthand.dmi' inhand_icon_state = "pen" + bait_quality = TRAIT_GREAT_QUALITY_BAIT //this is only here for autowiki purposes, it's removed on init. food_reagents = list(/datum/reagent/drug/kronkaine = 2) //The kronkaine is the thing that makes this a great bait. tastes = list("hypocrisy" = 1) +/obj/item/food/bait/natural/Initialize(mapload) + . = ..() + REMOVE_TRAIT(src, bait_quality, INNATE_TRAIT) + /obj/item/food/bait/doughball name = "doughball" desc = "Small piece of dough. Simple but effective fishing bait." @@ -51,17 +58,12 @@ bait_quality = TRAIT_BASIC_QUALITY_BAIT rod_overlay_icon_state = "dough_overlay" -/** - * Bound to the tech fishing rod, from which cannot be removed, - * Bait-related preferences and traits, both negative and positive, - * should be ignored by this bait. - * Otherwise it'd be hard/impossible to cath some fish with it, - * making that rod a shoddy choice in the long run. - */ +///The abstract synthetic doughball type. /obj/item/food/bait/doughball/synthetic name = "synthetic doughball" icon_state = "doughball_blue" preserved_food = TRUE + show_on_wiki = FALSE //It's an abstract item. /obj/item/food/bait/doughball/synthetic/Initialize(mapload) . = ..() @@ -70,10 +72,17 @@ ///Found in the can of omni-baits, only available from the super fishing toolbox, from the fishing mystery box. /obj/item/food/bait/doughball/synthetic/super name = "super-doughball" - desc = "No fish will be able to resist this." + desc = "Be they herbivore or carnivores, no fish will be able to resist this." bait_quality = TRAIT_GREAT_QUALITY_BAIT + show_on_wiki = TRUE -///Used by the advanced fishing rod +/** + * Bound to the tech fishing rod, from which cannot be removed, + * Bait-related preferences and traits, both negative and positive, + * should be ignored by this bait. + * Otherwise it'd be hard/impossible to cath some fish with it, + * making that rod a shoddy choice in the long run. + */ /obj/item/food/bait/doughball/syntethic/unconsumable /obj/item/food/bait/doughball/synthetic/unconsumable/Initialize(mapload) diff --git a/code/game/objects/items/food/bread.dm b/code/game/objects/items/food/bread.dm index 0f95aac6d85..48e7a2a21b1 100644 --- a/code/game/objects/items/food/bread.dm +++ b/code/game/objects/items/food/bread.dm @@ -384,7 +384,7 @@ ADD_TRAIT(src, TRAIT_CUSTOM_TAP_SOUND, SWORDPLAY_TRAIT) attack_verb_continuous = list("slashes", "cuts") attack_verb_simple = list("slash", "cut") - hitsound = 'sound/weapons/rapierhit.ogg' + hitsound = 'sound/items/weapons/rapierhit.ogg' fake_swordplay = TRUE RegisterSignal(src, COMSIG_ITEM_EQUIPPED, PROC_REF(on_sword_equipped)) @@ -418,7 +418,7 @@ /// Deadly bread used by a mime /obj/item/food/baguette/combat - block_sound = 'sound/weapons/parry.ogg' + block_sound = 'sound/items/weapons/parry.ogg' sharpness = SHARP_EDGED /// Force when wielded as a sword by a mime var/active_force = 20 diff --git a/code/game/objects/items/food/burgers.dm b/code/game/objects/items/food/burgers.dm index eb73f4736b1..db493b341d1 100644 --- a/code/game/objects/items/food/burgers.dm +++ b/code/game/objects/items/food/burgers.dm @@ -255,7 +255,7 @@ var/obj/machinery/light/light = locate(/obj/machinery/light) in view(4, src) light?.flicker() if(62 to 64) - playsound(loc, pick('sound/hallucinations/i_see_you1.ogg', 'sound/hallucinations/i_see_you2.ogg'), 50, TRUE, ignore_walls = FALSE) + playsound(loc, pick('sound/effects/hallucinations/i_see_you1.ogg', 'sound/effects/hallucinations/i_see_you2.ogg'), 50, TRUE, ignore_walls = FALSE) if(61) visible_message("[src] spews out a glob of ectoplasm!") new /obj/effect/decal/cleanable/greenglow/ecto(loc) diff --git a/code/game/objects/items/food/cake.dm b/code/game/objects/items/food/cake.dm index ec3e0a0390c..b161410bc3f 100644 --- a/code/game/objects/items/food/cake.dm +++ b/code/game/objects/items/food/cake.dm @@ -267,7 +267,7 @@ desc = "Just enough calories for a whole nuclear operative squad." icon_state = "energycake" force = 5 - hitsound = 'sound/weapons/blade1.ogg' + hitsound = 'sound/items/weapons/blade1.ogg' food_reagents = list( /datum/reagent/consumable/nutriment = 10, /datum/reagent/consumable/sprinkles = 10, @@ -285,7 +285,7 @@ /obj/item/food/cake/birthday/energy/proc/energy_bite(mob/living/user) to_chat(user, "As you eat the cake, you accidentally hurt yourself on the embedded energy sword!") user.apply_damage(30, BRUTE, BODY_ZONE_HEAD) - playsound(user, 'sound/weapons/blade1.ogg', 5, TRUE) + playsound(user, 'sound/items/weapons/blade1.ogg', 5, TRUE) /obj/item/food/cake/birthday/energy/attack(mob/living/target_mob, mob/living/user) . = ..() @@ -298,7 +298,7 @@ desc = "For the traitor on the go." icon_state = "energycakeslice" force = 2 - hitsound = 'sound/weapons/blade1.ogg' + hitsound = 'sound/items/weapons/blade1.ogg' food_reagents = list( /datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/sprinkles = 2, @@ -325,7 +325,7 @@ if(eater != feeder) log_combat(feeder, eater, "fed an energy cake to", src) eater.apply_damage(18, BRUTE, BODY_ZONE_HEAD) - playsound(eater, 'sound/weapons/blade1.ogg', 5, TRUE) + playsound(eater, 'sound/items/weapons/blade1.ogg', 5, TRUE) /obj/item/food/cake/apple name = "apple cake" diff --git a/code/game/objects/items/food/donuts.dm b/code/game/objects/items/food/donuts.dm index 0d2e2f91d30..922ed2eaa66 100644 --- a/code/game/objects/items/food/donuts.dm +++ b/code/game/objects/items/food/donuts.dm @@ -79,7 +79,7 @@ reagents.add_reagent(extra_reagent, 3) /obj/item/food/donut/meat - name = "Meat Donut" + name = "meat donut" desc = "Tastes as gross as it looks." icon_state = "donut_meat" food_reagents = list( diff --git a/code/game/objects/items/food/egg.dm b/code/game/objects/items/food/egg.dm index bcc61e721e2..bbb7d6784e2 100644 --- a/code/game/objects/items/food/egg.dm +++ b/code/game/objects/items/food/egg.dm @@ -130,9 +130,9 @@ GLOBAL_VAR_INIT(chicks_from_eggs, 0) return ITEM_INTERACT_BLOCKING var/atom/broken_egg = new /obj/item/food/rawegg(interacting_with.loc) if(LAZYACCESS(modifiers, ICON_X)) - broken_egg.pixel_x = clamp(text2num(LAZYACCESS(modifiers, ICON_X)) - 16, -(world.icon_size/2), world.icon_size/2) + broken_egg.pixel_x = clamp(text2num(LAZYACCESS(modifiers, ICON_X)) - 16, -(ICON_SIZE_X/2), ICON_SIZE_X/2) if(LAZYACCESS(modifiers, ICON_Y)) - broken_egg.pixel_y = clamp(text2num(LAZYACCESS(modifiers, ICON_Y)) - 16, -(world.icon_size/2), world.icon_size/2) + broken_egg.pixel_y = clamp(text2num(LAZYACCESS(modifiers, ICON_Y)) - 16, -(ICON_SIZE_Y/2), ICON_SIZE_Y/2) playsound(user, 'sound/items/sheath.ogg', 40, TRUE) reagents.copy_to(broken_egg, reagents.total_volume) @@ -340,4 +340,5 @@ GLOBAL_VAR_INIT(chicks_from_eggs, 0) ) tastes = list("custard" = 1) foodtypes = MEAT | VEGETABLES + venue_value = FOOD_PRICE_NORMAL crafting_complexity = FOOD_COMPLEXITY_3 diff --git a/code/game/objects/items/food/meatdish.dm b/code/game/objects/items/food/meatdish.dm index 5ad5cea20fa..9bda586b269 100644 --- a/code/game/objects/items/food/meatdish.dm +++ b/code/game/objects/items/food/meatdish.dm @@ -57,7 +57,7 @@ food_reagents = list( /datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/consumable/nutriment/vitamin = 3, - /datum/reagent/consumable/nutriment/fat/oil = 2, + /datum/reagent/consumable/nutriment/fat = 2, ) bite_consumption = 4.5 crafting_complexity = FOOD_COMPLEXITY_1 @@ -99,14 +99,20 @@ /obj/item/food/fishmeat/gunner_jellyfish name = "filleted gunner jellyfish" - desc = "A gunner jellyfish with the stingers removed. Mildly hallucinogenic." + desc = "A gunner jellyfish with the stingers removed. Mildly hallucinogenic when raw." icon = 'icons/obj/food/lizard.dmi' icon_state = "jellyfish_fillet" food_reagents = list( - /datum/reagent/consumable/nutriment/protein = 4, - /datum/reagent/toxin/mindbreaker = 2, + /datum/reagent/consumable/nutriment/protein = 4, //The halluginogen comes from the fish trait. ) +///Premade gunner jellyfish fillets from supply orders. Contains the halluginogen that'd be normally from the fish trait. +/obj/item/food/fishmeat/gunner_jellyfish/supply + +/obj/item/food/fishmeat/gunner_jellyfish/supply/Initialize(mapload) + food_reagents[/datum/reagent/toxin/mindbreaker/fish] = 2 + return ..() + /obj/item/food/fishmeat/armorfish name = "cleaned armorfish" desc = "An armorfish with its guts and shell removed, ready for use in cooking." @@ -284,6 +290,7 @@ tastes = list("rice and meat" = 4, "lettuce" = 2, "soy sauce" = 2) trash_type = /obj/item/reagent_containers/cup/bowl w_class = WEIGHT_CLASS_SMALL + venue_value = FOOD_PRICE_NORMAL crafting_complexity = FOOD_COMPLEXITY_4 /obj/item/food/fish_poke @@ -300,6 +307,7 @@ tastes = list("rice and fish" = 4, "lettuce" = 2, "soy sauce" = 2) trash_type = /obj/item/reagent_containers/cup/bowl w_class = WEIGHT_CLASS_SMALL + venue_value = FOOD_PRICE_NORMAL crafting_complexity = FOOD_COMPLEXITY_4 ////////////////////////////////////////////MEATS AND ALIKE//////////////////////////////////////////// @@ -746,13 +754,22 @@ w_class = WEIGHT_CLASS_TINY venue_value = FOOD_PRICE_CHEAP crafting_complexity = FOOD_COMPLEXITY_1 + var/meat_source = "\"chicken\"" /obj/item/food/nugget/Initialize(mapload) . = ..() var/shape = pick("lump", "star", "lizard", "corgi") - desc = "A \"chicken\" nugget vaguely shaped like a [shape]." + desc = "A [meat_source] nugget vaguely shaped like a [shape]." icon_state = "nugget_[shape]" +///subtype harvested from fish caught from, you guess it, the deepfryer +/obj/item/food/nugget/fish + name = "fish nugget" + tastes = list("fried fish" = 1) + foodtypes = MEAT|SEAFOOD|FRIED + venue_value = FOOD_PRICE_NORMAL + meat_source = "fish" + /obj/item/food/pigblanket name = "pig in a blanket" desc = "A tiny sausage wrapped in a flakey, buttery roll. Free this pig from its blanket prison by eating it." diff --git a/code/game/objects/items/food/mexican.dm b/code/game/objects/items/food/mexican.dm index fa66db1450c..3dc6adc1079 100644 --- a/code/game/objects/items/food/mexican.dm +++ b/code/game/objects/items/food/mexican.dm @@ -124,6 +124,7 @@ tastes = list("nachos" = 2, "hot pepper" = 1) foodtypes = VEGETABLES | FRIED | DAIRY w_class = WEIGHT_CLASS_SMALL + venue_value = FOOD_PRICE_CHEAP crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/taco diff --git a/code/game/objects/items/food/misc.dm b/code/game/objects/items/food/misc.dm index b2cf4d132c5..bfd26f534de 100644 --- a/code/game/objects/items/food/misc.dm +++ b/code/game/objects/items/food/misc.dm @@ -328,7 +328,7 @@ throwforce = 15 block_chance = 55 armour_penetration = 80 - block_sound = 'sound/weapons/parry.ogg' + block_sound = 'sound/items/weapons/parry.ogg' wound_bonus = -50 attack_verb_continuous = list("slaps", "slathers") attack_verb_simple = list("slap", "slather") @@ -339,7 +339,7 @@ crafting_complexity = FOOD_COMPLEXITY_5 /obj/item/food/branrequests - name = "Bran Requests Cereal" + name = "bran requests cereal" desc = "A dry cereal that satiates your requests for bran. Tastes uniquely like raisins and salt." icon_state = "bran_requests" food_reagents = list( @@ -422,7 +422,7 @@ w_class = WEIGHT_CLASS_TINY /obj/item/food/crab_rangoon - name = "Crab Rangoon" + name = "crab rangoon" desc = "Has many names, like crab puffs, cheese won'tons, crab dumplings? Whatever you call them, they're a fabulous blast of cream cheesy crab." icon = 'icons/obj/food/meat.dmi' icon_state = "crabrangoon" diff --git a/code/game/objects/items/food/pancakes.dm b/code/game/objects/items/food/pancakes.dm index 52829ab4c3a..488ba1e5eb5 100644 --- a/code/game/objects/items/food/pancakes.dm +++ b/code/game/objects/items/food/pancakes.dm @@ -52,7 +52,7 @@ /obj/item/food/pancakes/raw/examine(mob/user) . = ..() if(name == initial(name)) - . += "You can modify the pancake by adding blueberries or chocolate before finishing the griddle." + . += span_notice("You can modify the pancake by adding blueberries or chocolate before finishing the griddle.") /obj/item/food/pancakes/blueberry name = "blueberry pancake" diff --git a/code/game/objects/items/food/sandwichtoast.dm b/code/game/objects/items/food/sandwichtoast.dm index 47a7b563e08..e63127a6a21 100644 --- a/code/game/objects/items/food/sandwichtoast.dm +++ b/code/game/objects/items/food/sandwichtoast.dm @@ -41,6 +41,7 @@ /datum/reagent/carbon = 4, ) tastes = list("toast" = 2, "cheese" = 3, "butter" = 1) + venue_value = FOOD_PRICE_NORMAL crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/sandwich/jelly diff --git a/code/game/objects/items/frog_statue.dm b/code/game/objects/items/frog_statue.dm index 34c491d9dd7..d1f65dc4b2a 100644 --- a/code/game/objects/items/frog_statue.dm +++ b/code/game/objects/items/frog_statue.dm @@ -41,7 +41,7 @@ if(isnull(contained_frog)) . += span_notice("There are currently no frogs linked to this statue!") else - . += span_notice("Using it will [contained_frog in src ? "release" : "recall"] the beast!") + . += span_notice("Using it will [(contained_frog in src) ? "release" : "recall"] the beast!") ///resummon the frog into its home /obj/item/frog_statue/proc/recall_frog(mob/user) @@ -76,7 +76,7 @@ SIGNAL_HANDLER contained_frog = null - playsound(src, 'sound/magic/demon_dies.ogg', 50, TRUE) + playsound(src, 'sound/effects/magic/demon_dies.ogg', 50, TRUE) UnregisterSignal(source, COMSIG_QDELETING) /obj/item/frog_statue/Entered(atom/movable/arrived, atom/old_loc, list/atom/old_locs) diff --git a/code/game/objects/items/granters/_granters.dm b/code/game/objects/items/granters/_granters.dm index b205a1f0ffa..bfdb2013cfd 100644 --- a/code/game/objects/items/granters/_granters.dm +++ b/code/game/objects/items/granters/_granters.dm @@ -18,9 +18,9 @@ var/reading_time = 5 SECONDS /// The sounds played as the user's reading the book. var/list/book_sounds = list( - 'sound/effects/pageturn1.ogg', - 'sound/effects/pageturn2.ogg', - 'sound/effects/pageturn3.ogg', + 'sound/effects/page_turn/pageturn1.ogg', + 'sound/effects/page_turn/pageturn2.ogg', + 'sound/effects/page_turn/pageturn3.ogg', ) /obj/item/book/granter/attack_self(mob/living/user) diff --git a/code/game/objects/items/granters/martial_arts/cqc.dm b/code/game/objects/items/granters/martial_arts/cqc.dm index b2191997586..7d3f7f2ef9e 100644 --- a/code/game/objects/items/granters/martial_arts/cqc.dm +++ b/code/game/objects/items/granters/martial_arts/cqc.dm @@ -3,7 +3,7 @@ name = "old manual" martial_name = "close quarters combat" desc = "A small, black manual. There are drawn instructions of tactical hand-to-hand combat." - greet = "You've mastered the basics of CQC." + greet = span_boldannounce("You've mastered the basics of CQC.") icon_state = "cqcmanual" remarks = list( "Kick... Slam...", @@ -22,7 +22,7 @@ /obj/item/book/granter/martial/cqc/recoil(mob/living/user) to_chat(user, span_warning("[src] explodes!")) - playsound(src,'sound/effects/explosion1.ogg',40,TRUE) + playsound(src,'sound/effects/explosion/explosion1.ogg',40,TRUE) user.flash_act(1, 1) user.adjustBruteLoss(6) user.adjustFireLoss(6) diff --git a/code/game/objects/items/granters/martial_arts/plasma_fist.dm b/code/game/objects/items/granters/martial_arts/plasma_fist.dm index dab85637da5..22b6b4aefa1 100644 --- a/code/game/objects/items/granters/martial_arts/plasma_fist.dm +++ b/code/game/objects/items/granters/martial_arts/plasma_fist.dm @@ -3,8 +3,8 @@ name = "frayed scroll" martial_name = "plasma fist" desc = "An aged and frayed scrap of paper written in shifting runes. There are hand-drawn illustrations of pugilism." - greet = "You have learned the ancient martial art of Plasma Fist. Your combos are extremely hard to pull off, but include some of the most deadly moves ever seen including \ - the plasma fist, which when pulled off will make someone violently explode." + greet = span_boldannounce("You have learned the ancient martial art of Plasma Fist. Your combos are extremely hard to pull off, but include some of the most deadly moves ever seen including \ + the plasma fist, which when pulled off will make someone violently explode.") icon = 'icons/obj/scrolls.dmi' icon_state ="plasmafist" remarks = list( diff --git a/code/game/objects/items/granters/martial_arts/sleeping_carp.dm b/code/game/objects/items/granters/martial_arts/sleeping_carp.dm index 3c66ce8affa..88123439725 100644 --- a/code/game/objects/items/granters/martial_arts/sleeping_carp.dm +++ b/code/game/objects/items/granters/martial_arts/sleeping_carp.dm @@ -3,9 +3,9 @@ name = "mysterious scroll" martial_name = "sleeping carp" desc = "A scroll filled with strange markings. It seems to be drawings of some sort of martial art." - greet = "You have learned the ancient martial art of the Sleeping Carp! Your hand-to-hand combat has become much more effective, and you are now able to deflect any projectiles \ + greet = span_sciradio("You have learned the ancient martial art of the Sleeping Carp! Your hand-to-hand combat has become much more effective, and you are now able to deflect any projectiles \ directed toward you while in Combat Mode. Your body has also hardened itself, granting extra protection against lasting wounds that would otherwise mount during extended combat. \ - However, you are also unable to use any ranged weaponry. You can learn more about your newfound art by using the Recall Teachings verb in the Sleeping Carp tab." + However, you are also unable to use any ranged weaponry. You can learn more about your newfound art by using the Recall Teachings verb in the Sleeping Carp tab.") icon = 'icons/obj/scrolls.dmi' icon_state = "sleepingcarp" worn_icon_state = "scroll" diff --git a/code/game/objects/items/grenades/_grenade.dm b/code/game/objects/items/grenades/_grenade.dm index ca7da893bb4..780311fa4d1 100644 --- a/code/game/objects/items/grenades/_grenade.dm +++ b/code/game/objects/items/grenades/_grenade.dm @@ -17,8 +17,8 @@ obj_flags = CONDUCTS_ELECTRICITY slot_flags = ITEM_SLOT_BELT max_integrity = 40 - pickup_sound = 'sound/items/grenade_pick_up.ogg' - drop_sound = 'sound/items/grenade_drop.ogg' + pickup_sound = 'sound/items/handling/grenade/grenade_pick_up.ogg' + drop_sound = 'sound/items/handling/grenade/grenade_drop.ogg' sound_vary = TRUE /// Bitfields which prevent the grenade from detonating if set. Includes ([GRENADE_DUD]|[GRENADE_USED]) var/dud_flags = NONE @@ -51,6 +51,8 @@ var/shrapnel_radius ///Did we add the component responsible for spawning shrapnel to this? var/shrapnel_initialized + ///Possible timers that can be assigned for detonation. Values are strings in SECONDS + var/list/possible_fuse_time = list("Instant", "3", "4", "5") /obj/item/grenade/Initialize(mapload) . = ..() @@ -153,7 +155,7 @@ if(shrapnel_type && shrapnel_radius) shrapnel_initialized = TRUE AddComponent(/datum/component/pellet_cloud, projectile_type = shrapnel_type, magnitude = shrapnel_radius) - playsound(src, 'sound/weapons/armbomb.ogg', volume, TRUE) + playsound(src, 'sound/items/weapons/armbomb.ogg', volume, TRUE) if(istype(user)) user.add_mob_memory(/datum/memory/bomb_planted, antagonist = src) active = TRUE @@ -210,7 +212,10 @@ return FALSE if(change_det_time()) tool.play_tool_sound(src) - to_chat(user, span_notice("You modify the time delay. It's set for [DisplayTimeText(det_time)].")) + if(det_time == 0) + to_chat(user, span_notice("You modify the time delay. It's set to be instantaneous.")) + else + to_chat(user, span_notice("You modify the time delay. It's set for [DisplayTimeText(det_time)].")) return TRUE /obj/item/grenade/multitool_act(mob/living/user, obj/item/tool) @@ -220,7 +225,7 @@ . = TRUE - var/newtime = tgui_input_list(user, "Please enter a new detonation time", "Detonation Timer", list("Instant", 3, 4, 5)) + var/newtime = tgui_input_list(user, "Please enter a new detonation time", "Detonation Timer", possible_fuse_time) if (isnull(newtime)) return if(!user.can_perform_action(src)) @@ -228,25 +233,40 @@ if(newtime == "Instant" && change_det_time(0)) to_chat(user, span_notice("You modify the time delay. It's set to be instantaneous.")) return - newtime = round(newtime) + newtime = round(text2num(newtime)) if(change_det_time(newtime)) to_chat(user, span_notice("You modify the time delay. It's set for [DisplayTimeText(det_time)].")) -/obj/item/grenade/proc/change_det_time(time) //Time uses real time. +/** + * Sets det_time to a number in SECONDS + * + * if time is passed as an argument, `det_time` will be `time SECONDS` + * + * Cycles the duration of the fuse of the grenade `det_time` based on the options provided in list/possible_fuse_time +*/ +/obj/item/grenade/proc/change_det_time(time) . = TRUE + //Multitool if(!isnull(time)) - det_time = round(clamp(time * 10, 0, 5 SECONDS)) + det_time = round(clamp(time SECONDS, 0, 5 SECONDS)) //This is fine for now but consider making this a variable if you want >5s fuse + return + + //Screwdriver + if(det_time == 0) + det_time = "Instant" else - var/previous_time = det_time - switch(det_time) - if (0) - det_time = 3 SECONDS - if (3 SECONDS) - det_time = 5 SECONDS - if (5 SECONDS) - det_time = 0 - if(det_time == previous_time) - det_time = 5 SECONDS + det_time = num2text(det_time * 0.1) + + var/old_selection = possible_fuse_time.Find(det_time) //Position of det_time in the list + if(old_selection >= possible_fuse_time.len) + det_time = possible_fuse_time[1] + else + det_time = possible_fuse_time[old_selection+1] + + if(det_time == "Instant") + det_time = 0 //String to num conversion because I hate coders + return + det_time = text2num(det_time) SECONDS /obj/item/grenade/attack_paw(mob/user, list/modifiers) return attack_hand(user, modifiers) diff --git a/code/game/objects/items/grenades/chem_grenade.dm b/code/game/objects/items/grenades/chem_grenade.dm index c39e947e2bf..fa8e188292b 100644 --- a/code/game/objects/items/grenades/chem_grenade.dm +++ b/code/game/objects/items/grenades/chem_grenade.dm @@ -234,7 +234,7 @@ active = TRUE update_icon_state() - playsound(src, 'sound/weapons/armbomb.ogg', volume, TRUE) + playsound(src, 'sound/items/weapons/armbomb.ogg', volume, TRUE) if(landminemode) landminemode.activate() return diff --git a/code/game/objects/items/grenades/clusterbuster.dm b/code/game/objects/items/grenades/clusterbuster.dm index b27285e0786..fe5666267e0 100644 --- a/code/game/objects/items/grenades/clusterbuster.dm +++ b/code/game/objects/items/grenades/clusterbuster.dm @@ -13,7 +13,7 @@ var/base_state = "clusterbang" var/payload = /obj/item/grenade/flashbang/cluster var/payload_spawner = /obj/effect/payload_spawner - var/prime_sound = 'sound/weapons/armbomb.ogg' + var/prime_sound = 'sound/items/weapons/armbomb.ogg' var/min_spawned = 4 var/max_spawned = 8 var/segment_chance = 35 @@ -207,7 +207,7 @@ icon_state = "slimebang" base_state = "slimebang" payload_spawner = /obj/effect/payload_spawner/random_slime - prime_sound = 'sound/effects/bubbles.ogg' + prime_sound = 'sound/effects/bubbles/bubbles.ogg' /obj/item/grenade/clusterbuster/slime/volatile payload_spawner = /obj/effect/payload_spawner/random_slime/volatile diff --git a/code/game/objects/items/grenades/festive.dm b/code/game/objects/items/grenades/festive.dm index e9acdd6cfd6..87c8e554213 100644 --- a/code/game/objects/items/grenades/festive.dm +++ b/code/game/objects/items/grenades/festive.dm @@ -29,7 +29,7 @@ lit = TRUE icon_state = "sparkler_on" force = 6 - hitsound = 'sound/items/welder.ogg' + hitsound = 'sound/items/tools/welder.ogg' name = "lit [initial(name)]" attack_verb_continuous = list("burns") attack_verb_simple = list("burn") @@ -92,7 +92,7 @@ if(det_time) det_time -= 10 to_chat(user, span_notice("You shorten the fuse of [src] with [item].")) - playsound(src, 'sound/items/wirecutter.ogg', 20, TRUE) + playsound(src, 'sound/items/tools/wirecutter.ogg', 20, TRUE) icon_state = initial(icon_state) + "_[det_time]" update_appearance() else diff --git a/code/game/objects/items/grenades/flashbang.dm b/code/game/objects/items/grenades/flashbang.dm index 98e7a4bab79..c83801d81fc 100644 --- a/code/game/objects/items/grenades/flashbang.dm +++ b/code/game/objects/items/grenades/flashbang.dm @@ -4,6 +4,7 @@ inhand_icon_state = "flashbang" lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi' + possible_fuse_time = list("3", "4", "5") var/flashbang_range = 7 //how many tiles away the mob will be stunned. /obj/item/grenade/flashbang/apply_grenade_fantasy_bonuses(quality) @@ -22,7 +23,7 @@ if(!flashbang_turf) return do_sparks(rand(5, 9), FALSE, src) - playsound(flashbang_turf, 'sound/weapons/flashbang.ogg', 100, TRUE, 8, 0.9) + playsound(flashbang_turf, 'sound/items/weapons/flashbang.ogg', 100, TRUE, 8, 0.9) new /obj/effect/dummy/lighting_obj (flashbang_turf, flashbang_range + 2, 4, COLOR_WHITE, 2) for(var/mob/living/living_mob in get_hearers_in_view(flashbang_range, flashbang_turf)) bang(get_turf(living_mob), living_mob) @@ -90,7 +91,7 @@ if(!flashbang_turf) return do_sparks(rand(5, 9), FALSE, src) - playsound(flashbang_turf, 'sound/weapons/flashbang.ogg', 50, TRUE, 8, 0.9) + playsound(flashbang_turf, 'sound/items/weapons/flashbang.ogg', 50, TRUE, 8, 0.9) new /obj/effect/dummy/lighting_obj (flashbang_turf, flashbang_range + 2, 2, COLOR_WHITE, 1) for(var/mob/living/living_mob in get_hearers_in_view(flashbang_range, flashbang_turf)) pop(get_turf(living_mob), living_mob) diff --git a/code/game/objects/items/hand_items.dm b/code/game/objects/items/hand_items.dm index 3c818ab598b..a74000a84a4 100644 --- a/code/game/objects/items/hand_items.dm +++ b/code/game/objects/items/hand_items.dm @@ -187,7 +187,7 @@ log_combat(user, target, "given a noogie to", addition = "([damage] brute before armor)") target.apply_damage(damage, BRUTE, BODY_ZONE_HEAD) user.adjustStaminaLoss(iteration + 5) - playsound(get_turf(user), pick('sound/effects/rustle1.ogg','sound/effects/rustle2.ogg','sound/effects/rustle3.ogg','sound/effects/rustle4.ogg','sound/effects/rustle5.ogg'), 50) + playsound(get_turf(user), pick('sound/effects/rustle/rustle1.ogg','sound/effects/rustle/rustle2.ogg','sound/effects/rustle/rustle3.ogg','sound/effects/rustle/rustle4.ogg','sound/effects/rustle/rustle5.ogg'), 50) if(prob(33)) user.visible_message(span_danger("[user] continues noogie'ing [target]!"), span_warning("You continue giving [target] a noogie!"), vision_distance=COMBAT_MESSAGE_RANGE, ignored_mobs=target) @@ -235,7 +235,7 @@ ) to_chat(slapped, span_userdanger("You see [user] scoff and pull back [user.p_their()] arm, then suddenly you're on the ground with an ungodly ringing in your ears!")) slap_volume = 120 - SEND_SOUND(slapped, sound('sound/weapons/flash_ring.ogg')) + SEND_SOUND(slapped, sound('sound/items/weapons/flash_ring.ogg')) shake_camera(slapped, 2, 2) slapped.Paralyze(2.5 SECONDS) slapped.adjust_confusion(7 SECONDS) @@ -278,7 +278,7 @@ span_notice("You slap [slapped]!"), span_hear("You hear a slap."), ) - playsound(slapped, 'sound/weapons/slap.ogg', slap_volume, TRUE, -1) + playsound(slapped, 'sound/items/weapons/slap.ogg', slap_volume, TRUE, -1) return /obj/item/hand_item/slapper/pre_attack_secondary(atom/target, mob/living/user, params) @@ -556,8 +556,8 @@ name = "kiss" icon = 'icons/mob/simple/animal.dmi' icon_state = "heart" - hitsound = 'sound/effects/kiss.ogg' - hitsound_wall = 'sound/effects/kiss.ogg' + hitsound = 'sound/effects/emotes/kiss.ogg' + hitsound_wall = 'sound/effects/emotes/kiss.ogg' pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE speed = 1.6 damage_type = BRUTE diff --git a/code/game/objects/items/handcuffs.dm b/code/game/objects/items/handcuffs.dm index 9e8f1d73088..e63085d65be 100644 --- a/code/game/objects/items/handcuffs.dm +++ b/code/game/objects/items/handcuffs.dm @@ -48,8 +48,8 @@ breakouttime = 1 MINUTES armor_type = /datum/armor/restraints_handcuffs custom_price = PAYCHECK_COMMAND * 0.35 - pickup_sound = 'sound/items/handcuffs_pick_up.ogg' - drop_sound = 'sound/items/handcuffs_drop.ogg' + pickup_sound = 'sound/items/handling/handcuffs/handcuffs_pick_up.ogg' + drop_sound = 'sound/items/handling/handcuffs/handcuffs_drop.ogg' sound_vary = TRUE ///How long it takes to handcuff someone @@ -57,7 +57,7 @@ ///Multiplier for handcuff time var/handcuff_time_mod = 1 ///Sound that plays when starting to put handcuffs on someone - var/cuffsound = 'sound/weapons/handcuffs.ogg' + var/cuffsound = 'sound/items/weapons/handcuffs.ogg' ///Sound that plays when restrain is successful var/cuffsuccesssound = 'sound/items/handcuff_finish.ogg' ///If set, handcuffs will be destroyed on application and leave behind whatever this is set to. @@ -200,7 +200,7 @@ righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' custom_materials = list(/datum/material/iron= SMALL_MATERIAL_AMOUNT * 1.5, /datum/material/glass= SMALL_MATERIAL_AMOUNT * 0.75) breakouttime = 30 SECONDS - cuffsound = 'sound/weapons/cablecuff.ogg' + cuffsound = 'sound/items/weapons/cablecuff.ogg' pickup_sound = null drop_sound = null restraint_strength = HANDCUFFS_TYPE_WEAK @@ -424,7 +424,7 @@ /obj/item/restraints/legcuffs/beartrap/suicide_act(mob/living/user) user.visible_message(span_suicide("[user] is sticking [user.p_their()] head in the [src.name]! It looks like [user.p_theyre()] trying to commit suicide!")) - playsound(loc, 'sound/weapons/bladeslice.ogg', 50, TRUE, -1) + playsound(loc, 'sound/items/weapons/bladeslice.ogg', 50, TRUE, -1) return BRUTELOSS /obj/item/restraints/legcuffs/beartrap/attack_self(mob/user) @@ -551,7 +551,7 @@ /obj/item/restraints/legcuffs/bola/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, gentle = FALSE, quickstart = TRUE) if(!..()) return - playsound(src.loc,'sound/weapons/bolathrow.ogg', 75, TRUE) + playsound(src.loc,'sound/items/weapons/bolathrow.ogg', 75, TRUE) /obj/item/restraints/legcuffs/bola/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) if(..() || !iscarbon(hit_atom))//if it gets caught or the target can't be cuffed, @@ -606,7 +606,7 @@ desc = "A specialized hard-light bola designed to ensnare fleeing criminals and aid in arrests." icon_state = "ebola" inhand_icon_state = "ebola" - hitsound = 'sound/weapons/taserhit.ogg' + hitsound = 'sound/items/weapons/taserhit.ogg' w_class = WEIGHT_CLASS_SMALL breakouttime = 6 SECONDS custom_price = PAYCHECK_COMMAND * 0.35 diff --git a/code/game/objects/items/his_grace.dm b/code/game/objects/items/his_grace.dm index d1e128c0b5b..b9dc441df72 100644 --- a/code/game/objects/items/his_grace.dm +++ b/code/game/objects/items/his_grace.dm @@ -17,9 +17,9 @@ demolition_mod = 1.25 attack_verb_continuous = list("robusts") attack_verb_simple = list("robust") - hitsound = 'sound/weapons/smash.ogg' - drop_sound = 'sound/items/handling/toolbox_drop.ogg' - pickup_sound = 'sound/items/handling/toolbox_pickup.ogg' + hitsound = 'sound/items/weapons/smash.ogg' + drop_sound = 'sound/items/handling/toolbox/toolbox_drop.ogg' + pickup_sound = 'sound/items/handling/toolbox/toolbox_pickup.ogg' var/awakened = FALSE var/bloodthirst = HIS_GRACE_SATIATED var/prev_bloodthirst = HIS_GRACE_SATIATED @@ -133,8 +133,8 @@ if(!L.stat) L.visible_message(span_warning("[src] lunges at [L]!"), "[src] lunges at you!") do_attack_animation(L, null, src) - playsound(L, 'sound/weapons/smash.ogg', 50, TRUE) - playsound(L, 'sound/misc/desecration-01.ogg', 50, TRUE) + playsound(L, 'sound/items/weapons/smash.ogg', 50, TRUE) + playsound(L, 'sound/effects/desecration/desecration-01.ogg', 50, TRUE) L.adjustBruteLoss(force) adjust_bloodthirst(-5) //Don't stop attacking they're right there! else @@ -172,7 +172,7 @@ return var/turf/T = get_turf(src) T.visible_message(span_boldwarning("[src] slowly stops rattling and falls still, His latch snapping shut.")) - playsound(loc, 'sound/weapons/batonextend.ogg', 100, TRUE) + playsound(loc, 'sound/items/weapons/batonextend.ogg', 100, TRUE) name = initial(name) desc = initial(desc) animate(src, transform=matrix()) @@ -189,7 +189,7 @@ var/victims = 0 meal.visible_message(span_warning("[src] swings open and devours [meal]!"), "[src] consumes you!") meal.adjustBruteLoss(200) - playsound(meal, 'sound/misc/desecration-02.ogg', 75, TRUE) + playsound(meal, 'sound/effects/desecration/desecration-02.ogg', 75, TRUE) playsound(src, 'sound/items/eatfood.ogg', 100, TRUE) meal.forceMove(src) force_bonus += HIS_GRACE_FORCE_BONUS @@ -259,7 +259,7 @@ desc = "A legendary toolbox and a distant artifact from The Age of Three Powers. On its three latches engraved are the words \"The Sun\", \"The Moon\", and \"The Stars\". The entire toolbox has the words \"The World\" engraved into its sides." ascended = TRUE update_appearance() - playsound(src, 'sound/effects/his_grace_ascend.ogg', 100) + playsound(src, 'sound/effects/his_grace/his_grace_ascend.ogg', 100) if(istype(master)) master.update_held_items() master.visible_message("Gods will be watching.") diff --git a/code/game/objects/items/implants/implant_deathrattle.dm b/code/game/objects/items/implants/implant_deathrattle.dm index 64f85c020c8..f26eb4ab947 100644 --- a/code/game/objects/items/implants/implant_deathrattle.dm +++ b/code/game/objects/items/implants/implant_deathrattle.dm @@ -54,10 +54,10 @@ var/area = get_area_name(get_turf(owner)) // All "hearers" hear the same sound. var/sound = pick( - 'sound/items/knell1.ogg', - 'sound/items/knell2.ogg', - 'sound/items/knell3.ogg', - 'sound/items/knell4.ogg', + 'sound/items/knell/knell1.ogg', + 'sound/items/knell/knell2.ogg', + 'sound/items/knell/knell3.ogg', + 'sound/items/knell/knell4.ogg', ) diff --git a/code/game/objects/items/implants/implantchair.dm b/code/game/objects/items/implants/implantchair.dm index 50302173a79..503a1a183e1 100644 --- a/code/game/objects/items/implants/implantchair.dm +++ b/code/game/objects/items/implants/implantchair.dm @@ -84,7 +84,7 @@ ready = FALSE addtimer(CALLBACK(src, PROC_REF(set_ready)),injection_cooldown) else - playsound(get_turf(src), 'sound/machines/buzz-sigh.ogg', 25, TRUE) + playsound(get_turf(src), 'sound/machines/buzz/buzz-sigh.ogg', 25, TRUE) update_appearance() /obj/machinery/implantchair/proc/implant_action(mob/living/M) diff --git a/code/game/objects/items/implants/security/implant_noteleport.dm b/code/game/objects/items/implants/security/implant_noteleport.dm index b4795a7f797..a757e2cc0cd 100644 --- a/code/game/objects/items/implants/security/implant_noteleport.dm +++ b/code/game/objects/items/implants/security/implant_noteleport.dm @@ -17,6 +17,7 @@ if(!. || !isliving(target)) return FALSE RegisterSignal(target, COMSIG_MOVABLE_TELEPORTING, PROC_REF(on_teleport)) + RegisterSignal(target, COMSIG_MOB_PRE_JAUNT, PROC_REF(on_jaunt)) return TRUE /obj/item/implant/teleport_blocker/removed(mob/target, silent = FALSE, special = FALSE) @@ -24,6 +25,7 @@ if(!. || !isliving(target)) return FALSE UnregisterSignal(target, COMSIG_MOVABLE_TELEPORTING) + UnregisterSignal(target, COMSIG_MOB_PRE_JAUNT) return TRUE /// Signal for COMSIG_MOVABLE_TELEPORTED that blocks teleports and stuns the would-be-teleportee. @@ -38,6 +40,18 @@ spark_system.start() return COMPONENT_BLOCK_TELEPORT +/// Signal for COMSIG_MOB_PRE_JAUNT that prevents a user from entering a jaunt. +/obj/item/implant/teleport_blocker/proc/on_jaunt(mob/living/jaunter) + SIGNAL_HANDLER + + to_chat(jaunter, span_holoparasite("As you attempt to jaunt, you slam directly into the barrier between realities and are sent crashing back into corporeality!")) + + jaunter.apply_status_effect(/datum/status_effect/incapacitating/paralyzed, 5 SECONDS) + var/datum/effect_system/spark_spread/quantum/spark_system = new() + spark_system.set_up(5, TRUE, jaunter) + spark_system.start() + return COMPONENT_BLOCK_JAUNT + /obj/item/implantcase/teleport_blocker name = "implant case - 'Bluespace Grounding'" desc = "A glass case containing a bluespace grounding implant." diff --git a/code/game/objects/items/implants/security/implant_track.dm b/code/game/objects/items/implants/security/implant_track.dm index b95c0afa7d8..9b8050d7dad 100644 --- a/code/game/objects/items/implants/security/implant_track.dm +++ b/code/game/objects/items/implants/security/implant_track.dm @@ -48,7 +48,7 @@ return if(params["implant_action"] == "warn") - var/warning = tgui_input_text(user, "What warning do you want to send to [imp_in.name]?", "Messaging") + var/warning = tgui_input_text(user, "What warning do you want to send to [imp_in.name]?", "Messaging", max_length = MAX_MESSAGE_LEN) if(!warning || QDELETED(src) || QDELETED(user) || QDELETED(console) || isnull(imp_in)) return TRUE if(!console.is_operational || !user.can_perform_action(console, NEED_DEXTERITY|ALLOW_SILICON_REACH)) diff --git a/code/game/objects/items/inspector.dm b/code/game/objects/items/inspector.dm index 4aff1f03388..c22bf5d2ac6 100644 --- a/code/game/objects/items/inspector.dm +++ b/code/game/objects/items/inspector.dm @@ -121,7 +121,7 @@ return ITEM_INTERACT_BLOCKING if(contraband_scan(interacting_with, user)) - playsound(src, 'sound/machines/uplinkerror.ogg', 40) + playsound(src, 'sound/machines/uplink/uplinkerror.ogg', 40) balloon_alert(user, "contraband detected!") return ITEM_INTERACT_SUCCESS else @@ -195,10 +195,10 @@ */ /obj/item/inspector/proc/print_report(mob/user) if(!cell) - to_chat(user, "\The [src] doesn't seem to be on... It feels quite light. Perhaps it lacks a power cell?") + to_chat(user, span_info("\The [src] doesn't seem to be on... It feels quite light. Perhaps it lacks a power cell?")) return if(cell.charge == 0) - to_chat(user, "\The [src] doesn't seem to be on... Perhaps it ran out of power?") + to_chat(user, span_info("\The [src] doesn't seem to be on... Perhaps it ran out of power?")) return if(!cell.use(energy_per_print)) if(cell.use(ENERGY_TO_SPEAK)) @@ -389,7 +389,7 @@ 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?") + to_chat(user, span_info("\The [src] doesn't seem to be on... Perhaps it ran out of power?")) return paper_charges-- return ..() diff --git a/code/game/objects/items/janitor_key.dm b/code/game/objects/items/janitor_key.dm index 8f96205984b..d18ac7bd20d 100644 --- a/code/game/objects/items/janitor_key.dm +++ b/code/game/objects/items/janitor_key.dm @@ -82,6 +82,6 @@ investigate_log("Access to the [department_access] department on [src] has expired.]", INVESTIGATE_ACCESSCHANGES) department_access = null say("Access revoked, time ran out.") - playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE) + playsound(src, 'sound/machines/scanner/scanbuzz.ogg', 25, TRUE) #undef ACCESS_TIMER_LIMIT diff --git a/code/game/objects/items/kitchen.dm b/code/game/objects/items/kitchen.dm index 9a55b1cd574..24506e006d8 100644 --- a/code/game/objects/items/kitchen.dm +++ b/code/game/objects/items/kitchen.dm @@ -30,7 +30,7 @@ obj_flags = CONDUCTS_ELECTRICITY attack_verb_continuous = list("attacks", "stabs", "pokes") attack_verb_simple = list("attack", "stab", "poke") - hitsound = 'sound/weapons/bladeslice.ogg' + hitsound = 'sound/items/weapons/bladeslice.ogg' armor_type = /datum/armor/kitchen_fork sharpness = SHARP_POINTY var/datum/reagent/forkload //used to eat omelette @@ -110,7 +110,7 @@ force = 0 throwforce = 0 sharpness = SHARP_EDGED - hitsound = 'sound/weapons/bladeslice.ogg' + hitsound = 'sound/items/weapons/bladeslice.ogg' attack_verb_continuous = list("prods", "whiffs", "scratches", "pokes") attack_verb_simple = list("prod", "whiff", "scratch", "poke") tool_behaviour = TOOL_KNIFE @@ -123,7 +123,7 @@ . += " It's fitted with a [tool_behaviour] head." /obj/item/knife/kitchen/silicon/attack_self(mob/user) - playsound(get_turf(user), 'sound/items/change_drill.ogg', 50, TRUE) + playsound(get_turf(user), 'sound/items/tools/change_drill.ogg', 50, TRUE) if(tool_behaviour != TOOL_ROLLINGPIN) tool_behaviour = TOOL_ROLLINGPIN to_chat(user, span_notice("You attach the rolling pin bit to the [src].")) @@ -140,7 +140,7 @@ icon_state = "sili_knife" force = 0 sharpness = SHARP_EDGED - hitsound = 'sound/weapons/bladeslice.ogg' + hitsound = 'sound/items/weapons/bladeslice.ogg' attack_verb_continuous = list("prods", "whiffs", "scratches", "pokes") attack_verb_simple = list("prod", "whiff", "scratch", "poke") diff --git a/code/game/objects/items/knives.dm b/code/game/objects/items/knives.dm index 848058a6a27..e089a5bc55d 100644 --- a/code/game/objects/items/knives.dm +++ b/code/game/objects/items/knives.dm @@ -13,7 +13,7 @@ demolition_mod = 0.75 w_class = WEIGHT_CLASS_SMALL throwforce = 10 - hitsound = 'sound/weapons/bladeslice.ogg' + hitsound = 'sound/items/weapons/bladeslice.ogg' throw_speed = 3 throw_range = 6 custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 6) @@ -145,7 +145,7 @@ . = ..() if(user.get_item_by_slot(ITEM_SLOT_MASK) == src && !user.has_status_effect(/datum/status_effect/choke) && prob(20)) user.apply_damage(5, BRUTE, BODY_ZONE_HEAD) - playsound(user, 'sound/weapons/slice.ogg', 50, TRUE) + playsound(user, 'sound/items/weapons/slice.ogg', 50, TRUE) user.visible_message(span_danger("[user] accidentally cuts [user.p_them()]self while pulling [src] out of [user.p_them()] teeth! What a doofus!"), span_userdanger("You accidentally cut your mouth with [src]!")) /obj/item/knife/combat/equipped(mob/living/user, slot, initial = FALSE) diff --git a/code/game/objects/items/lighter.dm b/code/game/objects/items/lighter.dm new file mode 100644 index 00000000000..a27db91909c --- /dev/null +++ b/code/game/objects/items/lighter.dm @@ -0,0 +1,362 @@ +/obj/item/lighter + name = "\improper Zippo lighter" + desc = "The zippo." + icon = 'icons/obj/cigarettes.dmi' + icon_state = "zippo" + inhand_icon_state = "zippo" + worn_icon_state = "lighter" + w_class = WEIGHT_CLASS_TINY + obj_flags = CONDUCTS_ELECTRICITY + slot_flags = ITEM_SLOT_BELT + resistance_flags = FIRE_PROOF + grind_results = list(/datum/reagent/iron = 1, /datum/reagent/fuel = 5, /datum/reagent/fuel/oil = 5) + custom_price = PAYCHECK_CREW * 1.1 + light_system = OVERLAY_LIGHT + light_range = 2 + light_power = 1.3 + light_color = LIGHT_COLOR_FIRE + light_on = FALSE + toolspeed = 1.5 + tool_behaviour = TOOL_WELDER + ///The amount of heat a lighter has while it's on. We're using the define to ensure lighters can't do things we don't want them to. + var/heat_while_on = HIGH_TEMPERATURE_REQUIRED - 100 + ///The amount of time the lighter has been on for, for fuel consumption. + var/burned_fuel_for = 0 + ///The max amount of fuel the lighter can hold. + var/maximum_fuel = 6 + /// Whether the lighter is lit. + var/lit = FALSE + /// Whether the lighter is fancy. Fancy lighters have fancier flavortext and won't burn thumbs. + var/fancy = TRUE + /// The engraving overlay used by this lighter. + var/overlay_state + /// A list of possible engraving overlays. + var/list/overlay_list = list( + "plain", + "dame", + "thirteen", + "snake", + ) + +/obj/item/lighter/Initialize(mapload) + . = ..() + create_reagents(maximum_fuel, REFILLABLE | DRAINABLE) + reagents.add_reagent(/datum/reagent/fuel, maximum_fuel) + if(!overlay_state) + overlay_state = pick(overlay_list) + AddComponent(\ + /datum/component/bullet_intercepting,\ + block_chance = 0.5,\ + active_slots = ITEM_SLOT_SUITSTORE,\ + on_intercepted = CALLBACK(src, PROC_REF(on_intercepted_bullet)),\ + ) + update_appearance() + +/// Destroy the lighter when it's shot by a bullet +/obj/item/lighter/proc/on_intercepted_bullet(mob/living/victim, obj/projectile/bullet) + victim.visible_message(span_warning("\The [bullet] shatters on [victim]'s lighter!")) + playsound(victim, SFX_RICOCHET, 100, TRUE) + new /obj/effect/decal/cleanable/oil(get_turf(src)) + do_sparks(1, TRUE, src) + victim.dropItemToGround(src, force = TRUE, silent = TRUE) + qdel(src) + +/obj/item/lighter/cyborg_unequip(mob/user) + if(!lit) + return + set_lit(FALSE) + +/obj/item/lighter/suicide_act(mob/living/carbon/user) + if (lit) + user.visible_message(span_suicide("[user] begins holding \the [src]'s flame up to [user.p_their()] face! It looks like [user.p_theyre()] trying to commit suicide!")) + playsound(src, 'sound/items/tools/welder.ogg', 50, TRUE) + return FIRELOSS + else + user.visible_message(span_suicide("[user] begins whacking [user.p_them()]self with \the [src]! It looks like [user.p_theyre()] trying to commit suicide!")) + return BRUTELOSS + +/obj/item/lighter/update_icon_state() + icon_state = "[initial(icon_state)][lit ? "-on" : ""]" + return ..() + +/obj/item/lighter/update_overlays() + . = ..() + . += create_lighter_overlay() + +/// Generates an overlay used by this lighter. +/obj/item/lighter/proc/create_lighter_overlay() + return mutable_appearance(icon, "lighter_overlay_[overlay_state][lit ? "-on" : ""]") + +/obj/item/lighter/ignition_effect(atom/A, mob/user) + if(get_temperature()) + . = span_infoplain(span_rose("With a single flick of [user.p_their()] wrist, [user] smoothly lights [A] with [src]. Damn [user.p_theyre()] cool.")) + +/obj/item/lighter/proc/set_lit(new_lit) + if(lit == new_lit) + return + + lit = new_lit + if(lit) + force = 5 + damtype = BURN + hitsound = 'sound/items/tools/welder.ogg' + attack_verb_continuous = string_list(list("burns", "singes")) + attack_verb_simple = string_list(list("burn", "singe")) + heat = heat_while_on + START_PROCESSING(SSobj, src) + if(fancy) + playsound(src.loc , 'sound/items/lighter/zippo_on.ogg', 100, 1) + else + playsound(src.loc, 'sound/items/lighter/lighter_on.ogg', 100, 1) + if(isliving(loc)) + var/mob/living/male_model = loc + if(male_model.fire_stacks && !(male_model.on_fire)) + male_model.ignite_mob() + else + hitsound = SFX_SWING_HIT + force = 0 + heat = 0 + attack_verb_continuous = null //human_defense.dm takes care of it + attack_verb_simple = null + STOP_PROCESSING(SSobj, src) + if(fancy) + playsound(src.loc , 'sound/items/lighter/zippo_off.ogg', 100, 1) + else + playsound(src.loc , 'sound/items/lighter/lighter_off.ogg', 100, 1) + set_light_on(lit) + update_appearance() + +/obj/item/lighter/extinguish() + . = ..() + set_lit(FALSE) + +/obj/item/lighter/attack_self(mob/living/user) + if(!user.is_holding(src)) + return ..() + if(lit) + set_lit(FALSE) + if(fancy) + user.visible_message( + span_notice("You hear a quiet click, as [user] shuts off [src] without even looking at what [user.p_theyre()] doing. Wow."), + span_notice("You quietly shut off [src] without even looking at what you're doing. Wow.") + ) + else + user.visible_message( + span_notice("[user] quietly shuts off [src]."), + span_notice("You quietly shut off [src].") + ) + return + + if(get_fuel() <= 0) + return + + set_lit(TRUE) + + if(fancy) + user.visible_message( + span_notice("Without even breaking stride, [user] flips open and lights [src] in one smooth movement."), + span_notice("Without even breaking stride, you flip open and light [src] in one smooth movement.") + ) + return + + var/hand_protected = FALSE + var/mob/living/carbon/human/human_user = user + if(!istype(human_user) || HAS_TRAIT(human_user, TRAIT_RESISTHEAT) || HAS_TRAIT(human_user, TRAIT_RESISTHEATHANDS)) + hand_protected = TRUE + else if(!istype(human_user.gloves, /obj/item/clothing/gloves)) + hand_protected = FALSE + else + var/obj/item/clothing/gloves/gloves = human_user.gloves + if(gloves.max_heat_protection_temperature) + hand_protected = (gloves.max_heat_protection_temperature > 360) + + if(hand_protected || prob(75)) + user.visible_message( + span_notice("After a few attempts, [user] manages to light [src]."), + span_notice("After a few attempts, you manage to light [src].") + ) + return + + 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_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) + +/obj/item/lighter/attack(mob/living/target_mob, mob/living/user, params) + if(lit) + use(0.5) + if(target_mob.ignite_mob()) + message_admins("[ADMIN_LOOKUPFLW(user)] set [key_name_admin(target_mob)] on fire with [src] at [AREACOORD(user)]") + log_game("[key_name(user)] set [key_name(target_mob)] on fire with [src] at [AREACOORD(user)]") + var/obj/item/cigarette/cig = help_light_cig(target_mob) + if(!lit || !cig || user.combat_mode) + return ..() + + if(cig.lit) + to_chat(user, span_warning("The [cig.name] is already lit!")) + if(target_mob == user) + cig.attackby(src, user) + return + + if(fancy) + cig.light(span_rose("[user] whips the [name] out and holds it for [target_mob]. [user.p_Their()] arm is as steady as the unflickering flame [user.p_they()] light[user.p_s()] \the [cig] with.")) + else + cig.light(span_notice("[user] holds the [name] out for [target_mob], and lights [target_mob.p_their()] [cig.name].")) + +///Checks if the lighter is able to perform a welding task. +/obj/item/lighter/tool_use_check(mob/living/user, amount, heat_required) + if(!lit) + to_chat(user, span_warning("[src] has to be on to complete this task!")) + return FALSE + if(get_fuel() < amount) + to_chat(user, span_warning("You need more welding fuel to complete this task!")) + return FALSE + if(heat < heat_required) + return FALSE + return TRUE + +/obj/item/lighter/process(seconds_per_tick) + if(lit) + burned_fuel_for += seconds_per_tick + if(burned_fuel_for >= TOOL_FUEL_BURN_INTERVAL) + use(used = 0.25) + + open_flame(heat) + +/obj/item/lighter/get_temperature() + return lit * heat + +/// Uses fuel from the lighter. +/obj/item/lighter/use(used = 0) + if(!lit) + return FALSE + + if(used > 0) + burned_fuel_for = 0 + + if(get_fuel() >= used) + reagents.remove_reagent(/datum/reagent/fuel, used) + if(get_fuel() <= 0) + set_lit(FALSE) + return TRUE + return FALSE + +///Returns the amount of fuel +/obj/item/lighter/proc/get_fuel() + return reagents.get_reagent_amount(/datum/reagent/fuel) + +/obj/item/lighter/greyscale + name = "cheap lighter" + desc = "A cheap lighter." + icon_state = "lighter" + maximum_fuel = 3 + fancy = FALSE + overlay_list = list( + "transp", + "tall", + "matte", + "zoppo", //u cant stoppo th zoppo + ) + + /// The color of the lighter. + var/lighter_color + /// The set of colors this lighter can be autoset as on init. + var/static/list/color_list = list( //Same 16 color selection as electronic assemblies + COLOR_ASSEMBLY_BLACK, + COLOR_FLOORTILE_GRAY, + COLOR_ASSEMBLY_BGRAY, + COLOR_ASSEMBLY_WHITE, + COLOR_ASSEMBLY_RED, + COLOR_ASSEMBLY_ORANGE, + COLOR_ASSEMBLY_BEIGE, + COLOR_ASSEMBLY_BROWN, + COLOR_ASSEMBLY_GOLD, + COLOR_ASSEMBLY_YELLOW, + COLOR_ASSEMBLY_GURKHA, + COLOR_ASSEMBLY_LGREEN, + COLOR_ASSEMBLY_GREEN, + COLOR_ASSEMBLY_LBLUE, + COLOR_ASSEMBLY_BLUE, + COLOR_ASSEMBLY_PURPLE + ) + +/obj/item/lighter/greyscale/Initialize(mapload) + . = ..() + if(!lighter_color) + lighter_color = pick(color_list) + update_appearance() + +/obj/item/lighter/greyscale/create_lighter_overlay() + var/mutable_appearance/lighter_overlay = ..() + lighter_overlay.color = lighter_color + return lighter_overlay + +/obj/item/lighter/greyscale/ignition_effect(atom/A, mob/user) + if(get_temperature()) + . = span_notice("After some fiddling, [user] manages to light [A] with [src].") + + +/obj/item/lighter/slime + name = "slime zippo" + desc = "A specialty zippo made from slimes and industry. Has a much hotter flame than normal." + icon_state = "slighter" + heat_while_on = parent_type::heat_while_on + 1000 //Blue flame is hotter, this means this does act as a welding tool. + light_color = LIGHT_COLOR_CYAN + overlay_state = "slime" + grind_results = list(/datum/reagent/iron = 1, /datum/reagent/fuel = 5, /datum/reagent/medicine/pyroxadone = 5) + +/obj/item/lighter/skull + name = "badass zippo" + desc = "An absolutely badass zippo lighter. Just look at that skull!" + overlay_state = "skull" + +/obj/item/lighter/mime + name = "pale zippo" + desc = "In lieu of fuel, performative spirit can be used to light cigarettes." + icon_state = "mlighter" //These ones don't show a flame. + light_color = LIGHT_COLOR_HALOGEN + heat_while_on = 0 //I swear it's a real lighter dude you just can't see the flame dude I promise + overlay_state = "mime" + grind_results = list(/datum/reagent/iron = 1, /datum/reagent/toxin/mutetoxin = 5, /datum/reagent/consumable/nothing = 10) + light_range = 0 + light_power = 0 + fancy = FALSE + +/obj/item/lighter/mime/ignition_effect(atom/A, mob/user) + . = span_infoplain("[user] lifts the [name] to the [A], which miraculously lights!") + +/obj/item/lighter/bright + name = "illuminative zippo" + desc = "Sustains an incredibly bright chemical reaction when you spark it. Avoid looking directly at the igniter when lit." + icon_state = "slighter" + light_color = LIGHT_COLOR_ELECTRIC_CYAN + overlay_state = "bright" + grind_results = list(/datum/reagent/iron = 1, /datum/reagent/flash_powder = 10) + light_range = 8 + light_power = 3 //Irritatingly bright and large enough to cover a small room. + fancy = FALSE + +/obj/item/lighter/bright/examine(mob/user) + . = ..() + + if(lit && isliving(user)) + var/mob/living/current_viewer = user + current_viewer.flash_act(4) + +/obj/item/lighter/bright/ignition_effect(atom/A, mob/user) + if(get_temperature()) + . = span_infoplain(span_rose("[user] lifts the [src] to the [A], igniting it with a brilliant flash of light!")) + var/mob/living/current_viewer = user + current_viewer.flash_act(4) + +/obj/effect/spawner/random/special_lighter + name = "special lighter spawner" + icon_state = "lighter" + loot = list( + /obj/item/lighter/skull, + /obj/item/lighter/mime, + /obj/item/lighter/bright, + ) diff --git a/code/game/objects/items/machine_wand.dm b/code/game/objects/items/machine_wand.dm index 75c765730f7..a4e1be08ee4 100644 --- a/code/game/objects/items/machine_wand.dm +++ b/code/game/objects/items/machine_wand.dm @@ -61,7 +61,7 @@ /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) + playsound(src, 'sound/machines/synth/synth_no.ogg', 30 , TRUE) say("Remote control disabled temporarily. Please try again soon.") return FALSE if(!controlling_machine_or_bot) @@ -85,12 +85,14 @@ remove_old_machine() return CLICK_ACTION_SUCCESS -/obj/item/machine_remote/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) - return interact_with_atom(interacting_with, user, modifiers) - /obj/item/machine_remote/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(HAS_TRAIT(interacting_with, TRAIT_COMBAT_MODE_SKIP_INTERACTION) || (!ismachinery(interacting_with) && !isbot(interacting_with))) + return NONE + return ranged_interact_with_atom(interacting_with, user, modifiers) + +/obj/item/machine_remote/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) if(!COOLDOWN_FINISHED(src, timeout_time)) - playsound(src, 'sound/machines/synth_no.ogg', 30 , TRUE) + playsound(src, 'sound/machines/synth/synth_no.ogg', 30 , TRUE) say("Remote control disabled temporarily. Please try again soon.") return ITEM_INTERACT_BLOCKING if(!ismachinery(interacting_with) && !isbot(interacting_with)) diff --git a/code/game/objects/items/mail.dm b/code/game/objects/items/mail.dm index 7470dd359fd..9eb6ae44eb8 100644 --- a/code/game/objects/items/mail.dm +++ b/code/game/objects/items/mail.dm @@ -109,7 +109,7 @@ var/tag = uppertext(GLOB.TAGGERLOCATIONS[destination_tag.currTag]) to_chat(user, span_notice("*[tag]*")) sort_tag = destination_tag.currTag - playsound(loc, 'sound/machines/twobeep_high.ogg', vol = 100, vary = TRUE) + playsound(loc, 'sound/machines/beep/twobeep_high.ogg', vol = 100, vary = TRUE) /obj/item/mail/multitool_act(mob/living/user, obj/item/tool) if(user.get_inactive_held_item() == src) @@ -147,7 +147,7 @@ user.put_in_hands(stuff) else stuff.forceMove(drop_location()) - playsound(loc, 'sound/items/poster_ripped.ogg', vol = 50, vary = TRUE) + playsound(loc, 'sound/items/poster/poster_ripped.ogg', vol = 50, vary = TRUE) qdel(src) return TRUE @@ -404,7 +404,7 @@ /obj/item/mail/traitor/after_unwrap(mob/user) user.temporarilyRemoveItemFromInventory(src, force = TRUE) - playsound(loc, 'sound/items/poster_ripped.ogg', vol = 50, vary = TRUE) + playsound(loc, 'sound/items/poster/poster_ripped.ogg', vol = 50, vary = TRUE) for(var/obj/item/stuff as anything in contents) // Mail and envelope actually can have more than 1 item. if(user.put_in_hands(stuff) && armed) var/whomst = made_by_cached_name ? "[made_by_cached_name] ([made_by_cached_ckey])" : "no one in particular" @@ -421,7 +421,7 @@ if(!do_after(user, 2 SECONDS, target = src)) return FALSE balloon_alert(user, "disarmed") - playsound(src, 'sound/machines/defib_ready.ogg', vol = 100, vary = TRUE) + playsound(src, 'sound/machines/defib/defib_ready.ogg', vol = 100, vary = TRUE) armed = FALSE return TRUE else @@ -432,7 +432,7 @@ return FALSE if(prob(50)) balloon_alert(user, "disarmed something...?") - playsound(src, 'sound/machines/defib_ready.ogg', vol = 100, vary = TRUE) + playsound(src, 'sound/machines/defib/defib_ready.ogg', vol = 100, vary = TRUE) armed = FALSE return TRUE else @@ -550,10 +550,10 @@ shady_mail.made_by_cached_name = user.mind.name if(index == 1) - var/mail_name = tgui_input_text(user, "Enter mail title, or leave it blank", "Mail Counterfeiting") + var/mail_name = tgui_input_text(user, "Enter mail title, or leave it blank", "Mail Counterfeiting", max_length = MAX_LABEL_LEN) if(!(src in user.contents)) return FALSE - if(reject_bad_text(mail_name, ascii_only = FALSE)) + if(reject_bad_text(mail_name, max_length = MAX_LABEL_LEN, ascii_only = FALSE)) shady_mail.name = mail_name else shady_mail.name = mail_type diff --git a/code/game/objects/items/maintenance_loot.dm b/code/game/objects/items/maintenance_loot.dm index 74d908732a5..9d1c4fe676b 100644 --- a/code/game/objects/items/maintenance_loot.dm +++ b/code/game/objects/items/maintenance_loot.dm @@ -20,8 +20,9 @@ wound_bonus = 20 demolition_mod = 1.25 grind_results = list(/datum/reagent/lead = 20) - pickup_sound = 'sound/items/lead_pipe_pickup.ogg' - drop_sound = 'sound/items/lead_pipe_drop.ogg' + pickup_sound = 'sound/items/handling/lead_pipe/lead_pipe_pickup.ogg' + drop_sound = 'sound/items/handling/materials/metal_drop.ogg' + throw_drop_sound = 'sound/items/handling/lead_pipe/lead_pipe_drop.ogg' hitsound = 'sound/items/lead_pipe_hit.ogg' //A good battery early in the shift. Source of lead & sulfuric acid reagents. diff --git a/code/game/objects/items/melee/baton.dm b/code/game/objects/items/melee/baton.dm index f7a243e058f..01e5983b7d7 100644 --- a/code/game/objects/items/melee/baton.dm +++ b/code/game/objects/items/melee/baton.dm @@ -12,6 +12,7 @@ force = 12 //9 hit crit w_class = WEIGHT_CLASS_NORMAL wound_bonus = 15 + sound_vary = TRUE /// Whether this baton is active or not var/active = TRUE @@ -176,7 +177,7 @@ /obj/item/melee/baton/proc/check_parried(mob/living/carbon/human/human_target, mob/living/user) if (human_target.check_block(src, 0, "[user]'s [name]", MELEE_ATTACK)) - playsound(human_target, 'sound/weapons/genhit.ogg', 50, TRUE) + playsound(human_target, 'sound/items/weapons/genhit.ogg', 50, TRUE) return TRUE return FALSE @@ -318,12 +319,15 @@ bare_wound_bonus = 5 clumsy_knockdown_time = 15 SECONDS active = FALSE - pickup_sound = 'sound/items/stun_baton_pick_up.ogg' - drop_sound = 'sound/items/stun_baton_drop.ogg' + var/folded_drop_sound = 'sound/items/baton/telescopic_baton_folded_drop.ogg' + var/folded_pickup_sound = 'sound/items/baton/telescopic_baton_folded_pickup.ogg' + var/unfolded_drop_sound = 'sound/items/baton/telescopic_baton_unfolded_drop.ogg' + var/unfolded_pickup_sound = 'sound/items/baton/telescopic_baton_unfolded_pickup.ogg' + pickup_sound = 'sound/items/baton/telescopic_baton_folded_pickup.ogg' + drop_sound = 'sound/items/baton/telescopic_baton_folded_drop.ogg' sound_vary = TRUE - /// The sound effecte played when our baton is extended. - var/on_sound = 'sound/weapons/batonextend.ogg' + var/on_sound = 'sound/items/weapons/batonextend.ogg' /// The inhand iconstate used when our baton is extended. var/on_inhand_icon_state = "nullrod" /// The force on extension. @@ -377,6 +381,12 @@ inhand_icon_state = active ? on_inhand_icon_state : null // When inactive, there is no inhand icon_state. if(user) balloon_alert(user, active ? "extended" : "collapsed") + if(!active) + drop_sound = folded_drop_sound + pickup_sound = folded_pickup_sound + else + drop_sound = unfolded_drop_sound + pickup_sound = unfolded_pickup_sound playsound(src, on_sound, 50, TRUE) return COMPONENT_NO_DEFAULT_MESSAGE @@ -397,10 +407,12 @@ stamina_damage = 85 clumsy_knockdown_time = 24 SECONDS affect_cyborg = TRUE - on_stun_sound = 'sound/effects/contractorbatonhit.ogg' + on_stun_sound = 'sound/items/weapons/contractor_baton/contractorbatonhit.ogg' + unfolded_drop_sound = 'sound/items/baton/contractor_baton_unfolded_pickup.ogg' + unfolded_pickup_sound = 'sound/items/baton/contractor_baton_unfolded_pickup.ogg' on_inhand_icon_state = "contractor_baton_on" - on_sound = 'sound/weapons/contractorbatonextend.ogg' + on_sound = 'sound/items/weapons/contractorbatonextend.ogg' active_force = 16 /obj/item/melee/baton/telescopic/contractor_baton/get_wait_description() @@ -430,7 +442,7 @@ knockdown_time = 5 SECONDS clumsy_knockdown_time = 15 SECONDS cooldown = 2.5 SECONDS - on_stun_sound = 'sound/weapons/egloves.ogg' + on_stun_sound = 'sound/items/weapons/egloves.ogg' on_stun_volume = 50 active = FALSE context_living_rmb_active = "Harmful Stun" @@ -439,11 +451,14 @@ light_on = FALSE light_color = LIGHT_COLOR_ORANGE light_power = 0.5 - pickup_sound = 'sound/items/stun_baton_pick_up.ogg' - drop_sound = 'sound/items/stun_baton_drop.ogg' + var/inactive_drop_sound = 'sound/items/baton/stun_baton_inactive_drop.ogg' + var/inactive_pickup_sound = 'sound/items/baton/stun_baton_inactive_pickup.ogg' + var/active_drop_sound = 'sound/items/baton/stun_baton_active_drop.ogg' + var/active_pickup_sound = 'sound/items/baton/stun_baton_active_pickup.ogg' + drop_sound = 'sound/items/baton/stun_baton_inactive_drop.ogg' + pickup_sound = 'sound/items/baton/stun_baton_inactive_pickup.ogg' sound_vary = TRUE - var/throw_stun_chance = 35 var/obj/item/stock_parts/power_store/cell var/preload_cell_type //if not empty the baton starts with this type of cell @@ -464,7 +479,6 @@ 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() @@ -493,25 +507,25 @@ var/turf/source_turf = get_turf(src) var/obj/item/melee/baton/baton = new (source_turf) baton.alpha = 20 - playsound(source_turf, 'sound/items/drill_use.ogg', 80, TRUE, -1) + playsound(source_turf, 'sound/items/tools/drill_use.ogg', 80, TRUE, -1) animate(src, alpha = 0, time = 1 SECONDS) animate(baton, alpha = 255, time = 1 SECONDS) qdel(item) qdel(src) -/obj/item/melee/baton/security/proc/on_saboteur(datum/source, disrupt_duration) - SIGNAL_HANDLER +/obj/item/melee/baton/security/on_saboteur(datum/source, disrupt_duration) + . = ..() if(!active) return - toggle_light() - active = FALSE + turn_off() update_appearance() - return COMSIG_SABOTEUR_SUCCESS + return TRUE + /obj/item/melee/baton/security/Exited(atom/movable/mov_content) . = ..() if(mov_content == cell) cell = null - active = FALSE + turn_off() update_appearance() /obj/item/melee/baton/security/update_icon_state() @@ -561,26 +575,41 @@ return FALSE /obj/item/melee/baton/security/attack_self(mob/user) - if(cell?.charge >= cell_hit_cost) - active = !active - balloon_alert(user, "turned [active ? "on" : "off"]") - playsound(src, SFX_SPARKS, 75, TRUE, -1) - toggle_light(user) - do_sparks(1, TRUE, src) + if(cell?.charge >= cell_hit_cost && !active) + turn_on(user) + balloon_alert(user, "turned on") else - active = FALSE + turn_off() if(!cell) balloon_alert(user, "no power source!") - else + else if(cell?.charge < cell_hit_cost) balloon_alert(user, "out of charge!") - update_appearance() + else + balloon_alert(user, "turned off") add_fingerprint(user) /// Toggles the stun baton's light -/obj/item/melee/baton/security/proc/toggle_light(mob/user) +/obj/item/melee/baton/security/proc/toggle_light() set_light_on(!light_on) return +/obj/item/melee/baton/security/proc/turn_on(mob/user) + active = TRUE + playsound(src, SFX_SPARKS, 75, TRUE, -1) + update_appearance() + toggle_light() + do_sparks(1, TRUE, src) + drop_sound = active_drop_sound + pickup_sound = active_pickup_sound + +/obj/item/melee/baton/security/proc/turn_off() + active = FALSE + set_light_on(FALSE) + update_appearance() + playsound(src, SFX_SPARKS, 75, TRUE, -1) + drop_sound = inactive_drop_sound + pickup_sound = inactive_pickup_sound + /obj/item/melee/baton/security/proc/deductcharge(deducted_charge) if(!cell) return @@ -589,10 +618,7 @@ . = cell.use(deducted_charge) if(active && cell.charge < cell_hit_cost) //we're below minimum, turn off - active = FALSE - set_light_on(FALSE) - update_appearance() - playsound(src, SFX_SPARKS, 75, TRUE, -1) + turn_off() /obj/item/melee/baton/security/clumsy_check(mob/living/carbon/human/user) . = ..() diff --git a/code/game/objects/items/melee/energy.dm b/code/game/objects/items/melee/energy.dm index cb9cbb5fd82..ed791e5ca2e 100644 --- a/code/game/objects/items/melee/energy.dm +++ b/code/game/objects/items/melee/energy.dm @@ -24,7 +24,7 @@ /// Sharpness while active. var/active_sharpness = SHARP_EDGED /// Hitsound played attacking while active. - var/active_hitsound = 'sound/weapons/blade1.ogg' + var/active_hitsound = 'sound/items/weapons/blade1.ogg' /// Weight class while active. var/active_w_class = WEIGHT_CLASS_BULKY /// The heat given off when active. @@ -132,7 +132,7 @@ tool_behaviour = (active ? TOOL_SAW : NONE) //Lets energy weapons cut trees. Also lets them do bonecutting surgery, which is kinda metal! if(user) balloon_alert(user, "[name] [active ? "enabled":"disabled"]") - playsound(src, active ? 'sound/weapons/saberon.ogg' : 'sound/weapons/saberoff.ogg', 35, TRUE) + playsound(src, active ? 'sound/items/weapons/saberon.ogg' : 'sound/items/weapons/saberoff.ogg', 35, TRUE) set_light_on(active) update_appearance(UPDATE_ICON_STATE) return COMPONENT_NO_DEFAULT_MESSAGE @@ -146,7 +146,7 @@ base_icon_state = "axe" lefthand_file = 'icons/mob/inhands/weapons/axes_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/axes_righthand.dmi' - hitsound = 'sound/weapons/bladeslice.ogg' + hitsound = 'sound/items/weapons/bladeslice.ogg' attack_verb_continuous = list("attacks", "chops", "cleaves", "tears", "lacerates", "cuts") attack_verb_simple = list("attack", "chop", "cleave", "tear", "lacerate", "cut") force = 40 @@ -198,7 +198,7 @@ throw_range = 5 armour_penetration = 35 block_chance = 50 - block_sound = 'sound/weapons/block_blade.ogg' + block_sound = 'sound/items/weapons/block_blade.ogg' embed_type = /datum/embed_data/esword /obj/item/melee/energy/sword/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK, damage_type = BRUTE) @@ -237,7 +237,7 @@ desc = "For heavy duty cutting. It has a carbon-fiber blade in addition to a toggleable hard-light edge to dramatically increase sharpness." icon = 'icons/obj/medical/surgery_tools.dmi' icon_state = "esaw" - hitsound = 'sound/weapons/circsawhit.ogg' + hitsound = 'sound/items/weapons/circsawhit.ogg' force = 18 hitcost = 0.075 * STANDARD_CELL_CHARGE // Costs more than a standard cyborg esword. w_class = WEIGHT_CLASS_NORMAL @@ -331,7 +331,7 @@ base_icon_state = "blade" lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' - hitsound = 'sound/weapons/blade1.ogg' + hitsound = 'sound/items/weapons/blade1.ogg' attack_verb_continuous = list("attacks", "slashes", "stabs", "slices", "tears", "lacerates", "rips", "dices", "cuts") attack_verb_simple = list("attack", "slash", "stab", "slice", "tear", "lacerate", "rip", "dice", "cut") force = 30 diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm index c9f5932c266..7703160bfdb 100644 --- a/code/game/objects/items/melee/misc.dm +++ b/code/game/objects/items/melee/misc.dm @@ -21,7 +21,7 @@ w_class = WEIGHT_CLASS_NORMAL attack_verb_continuous = list("flogs", "whips", "lashes", "disciplines") attack_verb_simple = list("flog", "whip", "lash", "discipline") - hitsound = 'sound/weapons/chainhit.ogg' + hitsound = 'sound/items/weapons/chainhit.ogg' custom_materials = list(/datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT) /obj/item/melee/chainofcommand/suicide_act(mob/living/user) @@ -39,7 +39,7 @@ w_class = WEIGHT_CLASS_HUGE force = 20 throwforce = 10 - hitsound = 'sound/weapons/bladeslice.ogg' + hitsound = 'sound/items/weapons/bladeslice.ogg' attack_verb_continuous = list("attacks", "slashes", "stabs", "slices", "tears", "lacerates", "rips", "dices", "cuts") attack_verb_simple = list("attack", "slash", "stab", "slice", "tear", "lacerate", "rip", "dice", "cut") sharpness = SHARP_EDGED @@ -70,8 +70,8 @@ sharpness = SHARP_EDGED attack_verb_continuous = list("slashes", "cuts") attack_verb_simple = list("slash", "cut") - block_sound = 'sound/weapons/parry.ogg' - hitsound = 'sound/weapons/rapierhit.ogg' + block_sound = 'sound/items/weapons/parry.ogg' + hitsound = 'sound/items/weapons/rapierhit.ogg' custom_materials = list(/datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT) wound_bonus = 10 bare_wound_bonus = 25 @@ -181,8 +181,8 @@ sharpness = SHARP_EDGED attack_verb_continuous = list("slashes", "cuts") attack_verb_simple = list("slash", "cut") - block_sound = 'sound/weapons/parry.ogg' - hitsound = 'sound/weapons/rapierhit.ogg' + block_sound = 'sound/items/weapons/parry.ogg' + hitsound = 'sound/items/weapons/rapierhit.ogg' custom_materials = null wound_bonus = 5 bare_wound_bonus = 15 @@ -223,8 +223,8 @@ armour_penetration = 65 attack_verb_continuous = list("slashes", "stings", "prickles", "pokes") attack_verb_simple = list("slash", "sting", "prickle", "poke") - hitsound = 'sound/weapons/rapierhit.ogg' - block_sound = 'sound/weapons/parry.ogg' + hitsound = 'sound/items/weapons/rapierhit.ogg' + block_sound = 'sound/items/weapons/parry.ogg' /obj/item/melee/beesword/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK, damage_type = BRUTE) if(attack_type == PROJECTILE_ATTACK || attack_type == LEAP_ATTACK) @@ -369,7 +369,7 @@ w_class = WEIGHT_CLASS_NORMAL attack_verb_continuous = list("flogs", "whips", "lashes", "disciplines") attack_verb_simple = list("flog", "whip", "lash", "discipline") - hitsound = 'sound/weapons/whip.ogg' + hitsound = 'sound/items/weapons/whip.ogg' /obj/item/melee/curator_whip/afterattack(atom/target, mob/user, click_parameters) if(ishuman(target)) @@ -433,7 +433,7 @@ inhand_icon_state = active ? "nullrod" : null if(user) balloon_alert(user, "[active ? "extended" : "collapsed"] [src]") - playsound(src, 'sound/weapons/batonextend.ogg', 50, TRUE) + playsound(src, 'sound/items/weapons/batonextend.ogg', 50, TRUE) return COMPONENT_NO_DEFAULT_MESSAGE /obj/item/melee/roastingstick/attackby(atom/target, mob/user) @@ -474,7 +474,7 @@ return NONE if (istype(interacting_with, /obj/singularity) && get_dist(user, interacting_with) < 10) to_chat(user, span_notice("You send [held_sausage] towards [interacting_with].")) - playsound(src, 'sound/items/rped.ogg', 50, TRUE) + playsound(src, 'sound/items/tools/rped.ogg', 50, TRUE) beam = user.Beam(interacting_with, icon_state = "rped_upgrade", time = 10 SECONDS) return ITEM_INTERACT_SUCCESS return NONE @@ -485,21 +485,21 @@ if (!is_type_in_typecache(interacting_with, ovens)) return NONE to_chat(user, span_notice("You extend [src] towards [interacting_with].")) - playsound(src, 'sound/weapons/batonextend.ogg', 50, TRUE) + playsound(src, 'sound/items/weapons/batonextend.ogg', 50, TRUE) finish_roasting(user, interacting_with) return ITEM_INTERACT_SUCCESS /obj/item/melee/roastingstick/proc/finish_roasting(user, atom/target) 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) + playsound(src, 'sound/items/tools/welder2.ogg', 50, TRUE) held_sausage.add_atom_colour(rgb(103, 63, 24), FIXED_COLOUR_PRIORITY) held_sausage.name = "[target.name]-roasted [held_sausage.name]" held_sausage.desc = "[held_sausage.desc] It has been cooked to perfection on \a [target]." update_appearance() else QDEL_NULL(beam) - playsound(src, 'sound/weapons/batonextend.ogg', 50, TRUE) + playsound(src, 'sound/items/weapons/batonextend.ogg', 50, TRUE) to_chat(user, span_notice("You put [src] away.")) /obj/item/melee/cleric_mace @@ -523,7 +523,7 @@ w_class = WEIGHT_CLASS_BULKY throwforce = 8 block_chance = 10 - block_sound = 'sound/weapons/genhit.ogg' + block_sound = 'sound/items/weapons/genhit.ogg' armour_penetration = 50 attack_verb_continuous = list("smacks", "strikes", "cracks", "beats") attack_verb_simple = list("smack", "strike", "crack", "beat") diff --git a/code/game/objects/items/pet_carrier.dm b/code/game/objects/items/pet_carrier.dm index 9bc5189313d..8be08a876d7 100644 --- a/code/game/objects/items/pet_carrier.dm +++ b/code/game/objects/items/pet_carrier.dm @@ -57,14 +57,14 @@ /obj/item/pet_carrier/attack_self(mob/living/user) if(open) to_chat(user, span_notice("You close [src]'s door.")) - playsound(user, 'sound/effects/bin_close.ogg', 50, TRUE) + playsound(user, 'sound/effects/bin/bin_close.ogg', 50, TRUE) open = FALSE else if(locked) to_chat(user, span_warning("[src] is locked!")) return to_chat(user, span_notice("You open [src]'s door.")) - playsound(user, 'sound/effects/bin_open.ogg', 50, TRUE) + playsound(user, 'sound/effects/bin/bin_open.ogg', 50, TRUE) open = TRUE update_appearance() @@ -74,9 +74,9 @@ locked = !locked to_chat(user, span_notice("You flip the lock switch [locked ? "down" : "up"].")) if(locked) - playsound(user, 'sound/machines/boltsdown.ogg', 30, TRUE) + playsound(user, 'sound/machines/airlock/boltsdown.ogg', 30, TRUE) else - playsound(user, 'sound/machines/boltsup.ogg', 30, TRUE) + playsound(user, 'sound/machines/airlock/boltsup.ogg', 30, TRUE) update_appearance() return CLICK_ACTION_SUCCESS @@ -129,7 +129,7 @@ loc.visible_message(span_warning("[user] flips the lock switch on [src] by reaching through!"), null, null, null, user) to_chat(user, span_boldannounce("Bingo! The lock pops open!")) locked = FALSE - playsound(src, 'sound/machines/boltsup.ogg', 30, TRUE) + playsound(src, 'sound/machines/airlock/boltsup.ogg', 30, TRUE) update_appearance() else loc.visible_message(span_warning("[src] starts rattling as something pushes against the door!"), null, null, null, user) @@ -182,7 +182,7 @@ add_occupant(target) /obj/item/pet_carrier/proc/add_occupant(mob/living/occupant) - if(occupant in occupants || !istype(occupant)) + if((occupant in occupants) || !istype(occupant)) return occupant.forceMove(src) occupants += occupant diff --git a/code/game/objects/items/pillow.dm b/code/game/objects/items/pillow.dm index b924983a427..af2096a9c2c 100644 --- a/code/game/objects/items/pillow.dm +++ b/code/game/objects/items/pillow.dm @@ -51,9 +51,9 @@ if(!iscarbon(target_mob)) return if(bricked || HAS_TRAIT(src, TRAIT_WIELDED)) - hit_sound = 'sound/items/pillow_hit2.ogg' + hit_sound = 'sound/items/pillow/pillow_hit2.ogg' else - hit_sound = 'sound/items/pillow_hit.ogg' + hit_sound = 'sound/items/pillow/pillow_hit.ogg' user.apply_damage(5, STAMINA) //Had to be done so one person cannot keep multiple people stam critted last_fighter = user playsound(user, hit_sound, 80) //the basic 50 vol is barely audible @@ -116,7 +116,7 @@ user.put_in_hands(pillow_trophy) pillow_trophy = null balloon_alert(user, "tag removed") - playsound(user,'sound/items/poster_ripped.ogg', 50) + playsound(user,'sound/items/poster/poster_ripped.ogg', 50) update_appearance() return CLICK_ACTION_SUCCESS diff --git a/code/game/objects/items/pinpointer.dm b/code/game/objects/items/pinpointer.dm index 526b5ca2e98..878fd0ad3bb 100644 --- a/code/game/objects/items/pinpointer.dm +++ b/code/game/objects/items/pinpointer.dm @@ -44,7 +44,7 @@ /obj/item/pinpointer/proc/toggle_on() active = !active - playsound(src, 'sound/items/screwdriver2.ogg', 50, TRUE) + playsound(src, 'sound/items/tools/screwdriver2.ogg', 50, TRUE) if(active) START_PROCESSING(SSfastprocess, src) else diff --git a/code/game/objects/items/pitchfork.dm b/code/game/objects/items/pitchfork.dm index 63c4db34b39..1ece740d4a6 100644 --- a/code/game/objects/items/pitchfork.dm +++ b/code/game/objects/items/pitchfork.dm @@ -17,7 +17,7 @@ w_class = WEIGHT_CLASS_BULKY attack_verb_continuous = list("attacks", "impales", "pierces") attack_verb_simple = list("attack", "impale", "pierce") - hitsound = 'sound/weapons/bladeslice.ogg' + hitsound = 'sound/items/weapons/bladeslice.ogg' sharpness = SHARP_EDGED max_integrity = 200 armor_type = /datum/armor/item_pitchfork diff --git a/code/game/objects/items/plushes.dm b/code/game/objects/items/plushes.dm index 93fd6cb947a..7c7f998251c 100644 --- a/code/game/objects/items/plushes.dm +++ b/code/game/objects/items/plushes.dm @@ -393,7 +393,7 @@ inhand_icon_state = "carp_plushie" attack_verb_continuous = list("bites", "eats", "fin slaps") attack_verb_simple = list("bite", "eat", "fin slap") - squeak_override = list('sound/weapons/bite.ogg'=1) + squeak_override = list('sound/items/weapons/bite.ogg'=1) /obj/item/toy/plush/bubbleplush name = "\improper Bubblegum plushie" @@ -401,7 +401,7 @@ icon_state = "bubbleplush" attack_verb_continuous = list("rents") attack_verb_simple = list("rent") - squeak_override = list('sound/magic/demon_attack1.ogg'=1) + squeak_override = list('sound/effects/magic/demon_attack1.ogg'=1) /obj/item/toy/plush/ratplush name = "\improper Ratvar plushie" @@ -438,7 +438,7 @@ clash_target = null P.clashing = FALSE return - playsound(src, 'sound/magic/clockwork/ratvar_attack.ogg', 50, TRUE, frequency = 2) + playsound(src, 'sound/effects/magic/clockwork/ratvar_attack.ogg', 50, TRUE, frequency = 2) sleep(0.24 SECONDS) if(QDELETED(src)) P.clashing = FALSE @@ -457,7 +457,7 @@ if(QDELETED(P)) clash_target = null return - playsound(P, 'sound/magic/clockwork/narsie_attack.ogg', 50, TRUE, frequency = 2) + playsound(P, 'sound/effects/magic/clockwork/narsie_attack.ogg', 50, TRUE, frequency = 2) sleep(0.33 SECONDS) if(QDELETED(src)) P.clashing = FALSE @@ -476,16 +476,16 @@ if(a_winnar_is == src) say(pick("DIE.", "ROT.")) P.say(pick("Nooooo...", "Not die. To y-", "Die. Ratv-", "Sas tyen re-")) - playsound(src, 'sound/magic/clockwork/anima_fragment_attack.ogg', 50, TRUE, frequency = 2) - playsound(P, 'sound/magic/demon_dies.ogg', 50, TRUE, frequency = 2) + playsound(src, 'sound/effects/magic/clockwork/anima_fragment_attack.ogg', 50, TRUE, frequency = 2) + playsound(P, 'sound/effects/magic/demon_dies.ogg', 50, TRUE, frequency = 2) explosion(P, light_impact_range = 1) qdel(P) clash_target = null else say("NO! I will not be banished again...") P.say(pick("Ha.", "Ra'sha fonn dest.", "You fool. To come here.")) - playsound(src, 'sound/magic/clockwork/anima_fragment_death.ogg', 62, TRUE, frequency = 2) - playsound(P, 'sound/magic/demon_attack1.ogg', 50, TRUE, frequency = 2) + playsound(src, 'sound/effects/magic/clockwork/anima_fragment_death.ogg', 62, TRUE, frequency = 2) + playsound(P, 'sound/effects/magic/demon_attack1.ogg', 50, TRUE, frequency = 2) explosion(src, light_impact_range = 1) qdel(src) P.clashing = FALSE @@ -511,7 +511,7 @@ greyscale_config = /datum/greyscale_config/plush_lizard attack_verb_continuous = list("claws", "hisses", "tail slaps") attack_verb_simple = list("claw", "hiss", "tail slap") - squeak_override = list('sound/weapons/slash.ogg' = 1) + squeak_override = list('sound/items/weapons/slash.ogg' = 1) /obj/item/toy/plush/lizard_plushie/Initialize(mapload) . = ..() @@ -559,7 +559,7 @@ inhand_icon_state = null attack_verb_continuous = list("bites", "hisses", "tail slaps") attack_verb_simple = list("bite", "hiss", "tail slap") - squeak_override = list('sound/weapons/bite.ogg' = 1) + squeak_override = list('sound/items/weapons/bite.ogg' = 1) /obj/item/toy/plush/nukeplushie name = "operative plushie" @@ -588,7 +588,7 @@ inhand_icon_state = null attack_verb_continuous = list("blorbles", "slimes", "absorbs") attack_verb_simple = list("blorble", "slime", "absorb") - squeak_override = list('sound/effects/blobattack.ogg' = 1) + squeak_override = list('sound/effects/blob/blobattack.ogg' = 1) gender = FEMALE //given all the jokes and drawings, I'm not sure the xenobiologists would make a slimeboy // This is supposed to be only in the bus ruin, don't spawn it elsewhere @@ -657,13 +657,13 @@ attack_verb_continuous = list("stings") attack_verb_simple = list("sting") gender = FEMALE - squeak_override = list('sound/voice/moth/scream_moth.ogg'=1) + squeak_override = list('sound/mobs/humanoids/moth/scream_moth.ogg'=1) /obj/item/toy/plush/goatplushie name = "strange goat plushie" icon_state = "goat" desc = "Despite its cuddly appearance and plush nature, it will beat you up all the same. Goats never change." - squeak_override = list('sound/weapons/punch1.ogg'=1) + squeak_override = list('sound/items/weapons/punch1.ogg'=1) /// Whether or not this goat is currently taking in a monsterous doink var/going_hard = FALSE /// Whether or not this goat has been flattened like a funny pancake @@ -724,7 +724,7 @@ inhand_icon_state = null attack_verb_continuous = list("flutters", "flaps") attack_verb_simple = list("flutter", "flap") - squeak_override = list('sound/voice/moth/scream_moth.ogg'=1) + squeak_override = list('sound/mobs/humanoids/moth/scream_moth.ogg'=1) ///Used to track how many people killed themselves with item/toy/plush/moth var/suicide_count = 0 @@ -737,7 +737,7 @@ desc = "A plushie depicting a creepy mothperson. It's killed [suicide_count] people! I don't think I want to hug it any more!" divine = TRUE resistance_flags = INDESTRUCTIBLE | FIRE_PROOF | ACID_PROOF | LAVA_PROOF - playsound(src, 'sound/hallucinations/wail.ogg', 50, TRUE, -1) + playsound(src, 'sound/effects/hallucinations/wail.ogg', 50, TRUE, -1) var/list/available_spots = get_adjacent_open_turfs(loc) if(available_spots.len) //If the user is in a confined space the plushie will drop normally as the user dies, but in the open the plush is placed one tile away from the user to prevent squeak spam var/turf/open/random_open_spot = pick(available_spots) @@ -751,7 +751,7 @@ icon_state = "pkplush" attack_verb_continuous = list("hugs", "squeezes") attack_verb_simple = list("hug", "squeeze") - squeak_override = list('sound/weapons/thudswoosh.ogg'=1) + squeak_override = list('sound/items/weapons/thudswoosh.ogg'=1) /obj/item/toy/plush/rouny name = "runner plushie" @@ -770,7 +770,7 @@ inhand_icon_state = null attack_verb_continuous = list("abducts", "probes") attack_verb_continuous = list("abduct", "probe") - squeak_override = list('sound/weather/ashstorm/inside/weak_end.ogg' = 1) //very faint sound since abductors are silent as far as "speaking" is concerned. + squeak_override = list('sound/ambience/weather/ashstorm/inside/weak_end.ogg' = 1) //very faint sound since abductors are silent as far as "speaking" is concerned. /obj/item/toy/plush/abductor/agent name = "abductor agent plushie" @@ -780,8 +780,8 @@ attack_verb_continuous = list("abducts", "probes", "stuns") attack_verb_continuous = list("abduct", "probe", "stun") squeak_override = list( - 'sound/weapons/egloves.ogg' = 2, - 'sound/weapons/cablecuff.ogg' = 1, + 'sound/items/weapons/egloves.ogg' = 2, + 'sound/items/weapons/cablecuff.ogg' = 1, ) /obj/item/toy/plush/shark diff --git a/code/game/objects/items/pneumaticCannon.dm b/code/game/objects/items/pneumaticCannon.dm index b49fb7ec260..f9e63d7ee3f 100644 --- a/code/game/objects/items/pneumaticCannon.dm +++ b/code/game/objects/items/pneumaticCannon.dm @@ -39,7 +39,7 @@ var/charge_tick = 0 var/charge_type var/selfcharge = FALSE - var/fire_sound = 'sound/weapons/sonic_jackhammer.ogg' + var/fire_sound = 'sound/items/weapons/sonic_jackhammer.ogg' var/spin_item = TRUE //Do the projectiles spin when launched? trigger_guard = TRIGGER_GUARD_NORMAL @@ -103,7 +103,7 @@ /obj/item/pneumatic_cannon/wrench_act(mob/living/user, obj/item/tool) if(needs_air == FALSE) return - playsound(src, 'sound/items/ratchet.ogg', 50, TRUE) + playsound(src, 'sound/items/tools/ratchet.ogg', 50, TRUE) pressure_setting = pressure_setting >= HIGH_PRESSURE ? LOW_PRESSURE : pressure_setting + 1 balloon_alert(user, "output level set to [pressure_setting_to_text(pressure_setting)]") return TRUE diff --git a/code/game/objects/items/powerfist.dm b/code/game/objects/items/powerfist.dm index 0054520c957..77810ff3a89 100644 --- a/code/game/objects/items/powerfist.dm +++ b/code/game/objects/items/powerfist.dm @@ -117,7 +117,7 @@ if(!gas_used) to_chat(user, span_warning("\The [src]'s tank is empty!")) target.apply_damage((force / 5), BRUTE) - playsound(loc, 'sound/weapons/punch1.ogg', 50, TRUE) + playsound(loc, 'sound/items/weapons/punch1.ogg', 50, TRUE) target.visible_message(span_danger("[user]'s powerfist lets out a dull thunk as [user.p_they()] punch[user.p_es()] [target.name]!"), \ span_userdanger("[user]'s punches you!")) return @@ -125,7 +125,7 @@ if(!molar_cmp_equals(gas_used.total_moles(), gas_per_fist * fist_pressure_setting)) our_turf.assume_air(gas_used) to_chat(user, span_warning("\The [src]'s piston-ram lets out a weak hiss, it needs more gas!")) - playsound(loc, 'sound/weapons/punch4.ogg', 50, TRUE) + playsound(loc, 'sound/items/weapons/punch4.ogg', 50, TRUE) target.apply_damage((force / 2), BRUTE) target.visible_message(span_danger("[user]'s powerfist lets out a weak hiss as [user.p_they()] punch[user.p_es()] [target.name]!"), \ span_userdanger("[user]'s punch strikes with force!")) @@ -135,8 +135,8 @@ span_userdanger("You cry out in pain as [user]'s punch flings you backwards!")) new /obj/effect/temp_visual/kinetic_blast(target.loc) target.apply_damage(force * fist_pressure_setting, BRUTE, wound_bonus = CANT_WOUND) - playsound(src, 'sound/weapons/resonator_blast.ogg', 50, TRUE) - playsound(src, 'sound/weapons/genhit2.ogg', 50, TRUE) + playsound(src, 'sound/items/weapons/resonator_blast.ogg', 50, TRUE) + playsound(src, 'sound/items/weapons/genhit2.ogg', 50, TRUE) if(!QDELETED(target)) var/atom/throw_target = get_edge_target_turf(target, get_dir(src, get_step_away(target, src))) diff --git a/code/game/objects/items/puzzle_pieces.dm b/code/game/objects/items/puzzle_pieces.dm index 335e7b3d5fb..a008acedb6d 100644 --- a/code/game/objects/items/puzzle_pieces.dm +++ b/code/game/objects/items/puzzle_pieces.dm @@ -305,7 +305,7 @@ visible_message(span_boldnotice("[src] becomes fully charged!")) powered = TRUE SEND_SIGNAL(src, COMSIG_PUZZLE_COMPLETED) - playsound(src, 'sound/machines/synth_yes.ogg', 100, TRUE) + playsound(src, 'sound/machines/synth/synth_yes.ogg', 100, TRUE) // // literally just buttons @@ -363,7 +363,7 @@ used = single_use 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) + playsound(src, 'sound/machines/terminal/terminal_button07.ogg', 45, TRUE) on_puzzle_complete() MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/puzzle/button, 32) @@ -386,7 +386,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/puzzle/button, 32) return used = TRUE update_icon_state() - playsound(src, 'sound/machines/beep.ogg', 45, TRUE) + playsound(src, 'sound/machines/beep/beep.ogg', 45, TRUE) on_puzzle_complete() MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/puzzle/keycardpad, 32) @@ -419,11 +419,11 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/puzzle/keycardpad, 32) 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) + playsound(src, 'sound/machines/buzz/buzz-sigh.ogg', 45, TRUE) return used = single_use update_icon_state() - playsound(src, 'sound/machines/terminal_button07.ogg', 45, TRUE) + playsound(src, 'sound/machines/terminal/terminal_button07.ogg', 45, TRUE) on_puzzle_complete() MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/puzzle/password, 32) diff --git a/code/game/objects/items/rcd/RCD.dm b/code/game/objects/items/rcd/RCD.dm index 5bd0b4c9d39..961e0fff88a 100644 --- a/code/game/objects/items/rcd/RCD.dm +++ b/code/game/objects/items/rcd/RCD.dm @@ -16,8 +16,8 @@ item_flags = NO_MAT_REDEMPTION | NOBLUDGEON has_ammobar = TRUE actions_types = list(/datum/action/item_action/rcd_scan) - drop_sound = 'sound/items/handling/rcd_drop.ogg' - pickup_sound = 'sound/items/handling/rcd_pickup.ogg' + drop_sound = 'sound/items/handling/tools/rcd_drop.ogg' + pickup_sound = 'sound/items/handling/tools/rcd_pickup.ogg' sound_vary = TRUE /// main category of currently selected design[Structures, Airlocks, Airlock Access] @@ -126,7 +126,7 @@ var/atom/movable/rcd_structure = rcd_results["[RCD_DESIGN_PATH]"] /** *For anything that does not go an a wall we have to make sure that turf is clear for us to put the structure on it - *If we are just trying to destory something then this check is not nessassary + *If we are just trying to destroy something then this check is not necessary *RCD_WALLFRAME is also returned as the rcd_mode when upgrading apc, airalarm, firealarm using simple circuits upgrade */ if(rcd_mode != RCD_WALLFRAME && rcd_mode != RCD_DECONSTRUCT) @@ -142,7 +142,7 @@ structures_to_ignore = list(/obj/structure/grille) else //when building directional windows we ignore the grill and other directional windows structures_to_ignore = list(/obj/structure/grille, /obj/structure/window) - else //for directional windows we ignore other directional windows as they can be in diffrent directions on the turf. + else //for directional windows we ignore other directional windows as they can be in different directions on the turf. structures_to_ignore = list(/obj/structure/window) //check if we can build our window on the grill @@ -152,7 +152,7 @@ return FALSE /** - * if we are trying to create plating on turf which is not a proper floor then dont check for objects on top of the turf just allow that turf to be converted into plating. e.g. create plating beneath a player or underneath a machine frame/any dense object + * if we are trying to create plating on turf which is not a proper floor then don't check for objects on top of the turf just allow that turf to be converted into plating. e.g. create plating beneath a player or underneath a machine frame/any dense object * if we are trying to finish a wall girder then let it finish then make sure no one/nothing is stuck in the girder */ else if(rcd_mode == RCD_TURF && rcd_structure == /turf/open/floor/plating/rcd && (!istype(target_turf, /turf/open/floor) || istype(target, /obj/structure/girder))) @@ -184,10 +184,10 @@ ignored_types = list(/obj/structure/window) //if we are trying to create grills/windoors we can go ahead and further ignore other windoors on the turf if(rcd_mode == RCD_WINDOWGRILLE || (rcd_mode == RCD_AIRLOCK && ispath(rcd_structure, /obj/machinery/door/window))) - //only ignore mobs if we are trying to create windoors and not grills. We dont want to drop a grill on top of somebody + //only ignore mobs if we are trying to create windoors and not grills. We don't want to drop a grill on top of somebody ignore_mobs = rcd_mode == RCD_AIRLOCK ignored_types += /obj/machinery/door/window - //if we are trying to create full airlock doors then we do the regular checks and make sure we have the full space for them. i.e. dont ignore anything dense on the turf + //if we are trying to create full airlock doors then we do the regular checks and make sure we have the full space for them. i.e. don't ignore anything dense on the turf else if(rcd_mode == RCD_AIRLOCK) ignored_types = list() @@ -207,15 +207,15 @@ * * [mob][user]- the user building this structure */ /obj/item/construction/rcd/proc/rcd_create(atom/target, mob/user) - //straight up cant touch this + var/list/rcd_results = target.rcd_vals(user, src) // does this atom allow for rcd actions? + if(!rcd_results) // nope + return NONE + + //straight up can't touch this if(mode == RCD_DECONSTRUCT && (target.resistance_flags & INDESTRUCTIBLE)) balloon_alert(user, "too durable!") - return + return ITEM_INTERACT_BLOCKING - //does this atom allow for rcd actions? - var/list/rcd_results = target.rcd_vals(user, src) - if(!rcd_results) - return FALSE rcd_results["[RCD_DESIGN_MODE]"] = mode rcd_results["[RCD_DESIGN_PATH]"] = rcd_design_path @@ -237,6 +237,7 @@ log_tool("[key_name(user)] used [src] to [rcd_results["[RCD_DESIGN_MODE]"] != RCD_DECONSTRUCT ? "construct [initial(design_path.name)]([design_path])" : "deconstruct [target_name]([target_path])"] at [location]") current_active_effects -= 1 + return ITEM_INTERACT_SUCCESS /** * Internal proc which creates the rcd effects & creates the structure @@ -368,10 +369,10 @@ * The advantage of organizing designs into categories is that * You can ignore an complete category if the design disk upgrade for that category isn't installed. */ - //You can't select designs from the Machines category if you dont have the frames upgrade installed. + //You can't select designs from the Machines category if you don't have the frames upgrade installed. if(category == "Machines" && !(upgrade & RCD_UPGRADE_FRAMES)) return TRUE - //You can't select designs from the Furniture category if you dont have the furnishing upgrade installed. + //You can't select designs from the Furniture category if you don't have the furnishing upgrade installed. if(category == "Furniture" && !(upgrade & RCD_UPGRADE_FURNISHING)) return TRUE @@ -401,37 +402,32 @@ return . mode = construction_mode - rcd_create(interacting_with, user) - return ITEM_INTERACT_SUCCESS + return rcd_create(interacting_with, user) /obj/item/construction/rcd/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) if(!ranged || !range_check(interacting_with, user)) return ITEM_INTERACT_BLOCKING mode = construction_mode - rcd_create(interacting_with, user) - return ITEM_INTERACT_SUCCESS + return rcd_create(interacting_with, user) /obj/item/construction/rcd/interact_with_atom_secondary(atom/interacting_with, mob/living/user, list/modifiers) mode = RCD_DECONSTRUCT - rcd_create(interacting_with, user) - return ITEM_INTERACT_SUCCESS + return rcd_create(interacting_with, user) /obj/item/construction/rcd/ranged_interact_with_atom_secondary(atom/interacting_with, mob/living/user, list/modifiers) if(!ranged || !range_check(interacting_with, user)) return ITEM_INTERACT_BLOCKING mode = RCD_DECONSTRUCT - rcd_create(interacting_with, user) - return ITEM_INTERACT_SUCCESS + return rcd_create(interacting_with, user) /obj/item/construction/rcd/handle_openspace_click(turf/target, mob/user, list/modifiers) interact_with_atom(target, user, modifiers) /obj/item/construction/rcd/proc/detonate_pulse() - audible_message("[src] begins to vibrate and \ - buzz loudly!","[src] begins \ - vibrating violently!") + audible_message(span_danger("[src] begins to vibrate and buzz loudly!"), \ + span_danger("[src] begins vibrating violently!")) // 5 seconds to get rid of it addtimer(CALLBACK(src, PROC_REF(detonate_pulse_explode)), 5 SECONDS) diff --git a/code/game/objects/items/rcd/RHD.dm b/code/game/objects/items/rcd/RHD.dm index a212274ce46..8007fac4dd4 100644 --- a/code/game/objects/items/rcd/RHD.dm +++ b/code/game/objects/items/rcd/RHD.dm @@ -71,7 +71,7 @@ return silo_mats.mat_container.get_material_amount(/datum/material/iron) / SILO_USE_AMOUNT return 0 -///returns local matter units available. overriden by rcd borg to return power units available +///returns local matter units available. overridden by rcd borg to return power units available /obj/item/construction/proc/get_matter(mob/user) return matter diff --git a/code/game/objects/items/rcd/RPD.dm b/code/game/objects/items/rcd/RPD.dm index 9c3aa6cffc2..07db9978e3e 100644 --- a/code/game/objects/items/rcd/RPD.dm +++ b/code/game/objects/items/rcd/RPD.dm @@ -185,8 +185,8 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( custom_materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*37.5, /datum/material/glass=SHEET_MATERIAL_AMOUNT*18.75) armor_type = /datum/armor/item_pipe_dispenser resistance_flags = FIRE_PROOF - drop_sound = 'sound/items/handling/rpd_drop.ogg' - pickup_sound = 'sound/items/handling/rpd_pickup.ogg' + drop_sound = 'sound/items/handling/tools/rpd_drop.ogg' + pickup_sound = 'sound/items/handling/tools/rpd_pickup.ogg' sound_vary = TRUE ///Sparks system used when changing device in the UI var/datum/effect_system/spark_spread/spark_system diff --git a/code/game/objects/items/rcd/RPLD.dm b/code/game/objects/items/rcd/RPLD.dm index d8056551cf7..a5fade8381c 100644 --- a/code/game/objects/items/rcd/RPLD.dm +++ b/code/game/objects/items/rcd/RPLD.dm @@ -12,8 +12,8 @@ banned_upgrades = RCD_ALL_UPGRADES & ~RCD_UPGRADE_SILO_LINK matter = 200 max_matter = 200 - drop_sound = 'sound/items/handling/rcd_drop.ogg' - pickup_sound = 'sound/items/handling/rcd_pickup.ogg' + drop_sound = 'sound/items/handling/tools/rcd_drop.ogg' + pickup_sound = 'sound/items/handling/tools/rcd_pickup.ogg' sound_vary = TRUE ///category of design selected diff --git a/code/game/objects/items/rcd/RTD.dm b/code/game/objects/items/rcd/RTD.dm index 93e5147175e..1925b3e6ffc 100644 --- a/code/game/objects/items/rcd/RTD.dm +++ b/code/game/objects/items/rcd/RTD.dm @@ -24,8 +24,8 @@ item_flags = NO_MAT_REDEMPTION | NOBLUDGEON has_ammobar = TRUE banned_upgrades = RCD_ALL_UPGRADES & ~RCD_UPGRADE_SILO_LINK - drop_sound = 'sound/items/handling/rcd_drop.ogg' - pickup_sound = 'sound/items/handling/rcd_pickup.ogg' + drop_sound = 'sound/items/handling/tools/rcd_drop.ogg' + pickup_sound = 'sound/items/handling/tools/rcd_pickup.ogg' sound_vary = TRUE /// main category for tile design diff --git a/code/game/objects/items/religion.dm b/code/game/objects/items/religion.dm index 63e1c19c64a..72a4706e6a4 100644 --- a/code/game/objects/items/religion.dm +++ b/code/game/objects/items/religion.dm @@ -75,7 +75,7 @@ inspired_human.AdjustImmobilized(-40) inspired_human.AdjustParalyzed(-40) inspired_human.AdjustUnconscious(-40) - playsound(inspired_human, 'sound/magic/staff_healing.ogg', 25, FALSE) + playsound(inspired_human, 'sound/effects/magic/staff_healing.ogg', 25, FALSE) /obj/item/banner/proc/special_inspiration(mob/living/carbon/human/H) //Any banner-specific inspiration effects go here return @@ -343,10 +343,12 @@ var/staffcooldown = 0 var/staffwait = 30 -/obj/item/godstaff/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) - return interact_with_atom(interacting_with, user, modifiers) - /obj/item/godstaff/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(SHOULD_SKIP_INTERACTION(interacting_with, src, user)) + return NONE + return ranged_interact_with_atom(interacting_with, user, modifiers) + +/obj/item/godstaff/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) if(staffcooldown + staffwait > world.time) return ITEM_INTERACT_BLOCKING diff --git a/code/game/objects/items/robot/ai_upgrades.dm b/code/game/objects/items/robot/ai_upgrades.dm index f6357b229ef..b630a3b8a42 100644 --- a/code/game/objects/items/robot/ai_upgrades.dm +++ b/code/game/objects/items/robot/ai_upgrades.dm @@ -1,4 +1,45 @@ ///AI Upgrades +/obj/item/aiupgrade + name = "ai upgrade disk" + desc = "You really shouldn't be seeing this" + icon = 'icons/obj/devices/circuitry_n_data.dmi' + icon_state = "datadisk3" + ///The upgrade that will be applied to the AI when installed + var/datum/ai_module/to_gift = /datum/ai_module + +/obj/item/aiupgrade/pre_attack(atom/target, mob/living/user, proximity) + if(!proximity) + return ..() + if(!isAI(target)) + return ..() + var/mob/living/silicon/ai/AI = target + var/datum/action/innate/ai/action = locate(to_gift.power_type) in AI.actions + var/datum/ai_module/gifted_ability = new to_gift + if(!to_gift.upgrade) + if(!action) + var/ability = to_gift.power_type + var/datum/action/gifted_action = new ability + gifted_action.Grant(AI) + else if(gifted_ability.one_purchase) + to_chat(user, "[AI] already has an [src] installed!") + return + else + action.uses += initial(action.uses) + action.desc = "[initial(action.desc)] It has [action.uses] use\s remaining." + action.build_all_button_icons() + else + if(!action) + gifted_ability.upgrade(AI) + if(gifted_ability.unlock_text) + to_chat(AI, gifted_ability.unlock_text) + if(gifted_ability.unlock_sound) + AI.playsound_local(AI, gifted_ability.unlock_sound, 50, 0) + update_static_data(AI) + to_chat(user, span_notice("You install [src], upgrading [AI].")) + to_chat(AI, span_userdanger("[user] has upgraded you with [src]!")) + user.log_message("has upgraded [key_name(AI)] with a [src].", LOG_GAME) + qdel(src) + return TRUE //Malf Picker @@ -34,28 +75,21 @@ //Lipreading -/obj/item/surveillance_upgrade +/obj/item/aiupgrade/surveillance_upgrade name = "surveillance software upgrade" desc = "An illegal software package that will allow an artificial intelligence to 'hear' from its cameras via lip reading and hidden microphones." - icon = 'icons/obj/devices/circuitry_n_data.dmi' - icon_state = "datadisk3" + to_gift = /datum/ai_module/malf/upgrade/eavesdrop -/obj/item/surveillance_upgrade/Initialize(mapload) +/obj/item/aiupgrade/surveillance_upgrade/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_CONTRABAND, INNATE_TRAIT) -/obj/item/surveillance_upgrade/pre_attack(atom/A, mob/living/user, proximity) - if(!proximity) - return ..() - if(!isAI(A)) - return ..() - var/mob/living/silicon/ai/AI = A - if(AI.eyeobj) - AI.eyeobj.relay_speech = TRUE - to_chat(AI, span_userdanger("[user] has upgraded you with surveillance software!")) - to_chat(AI, "Via a combination of hidden microphones and lip reading software, you are able to use your cameras to listen in on conversations.") - to_chat(user, span_notice("You upgrade [AI]. [src] is consumed in the process.")) - user.log_message("has upgraded [key_name(AI)] with a [src].", LOG_GAME) - message_admins("[ADMIN_LOOKUPFLW(user)] has upgraded [ADMIN_LOOKUPFLW(AI)] with a [src].") - qdel(src) - return TRUE + +/obj/item/aiupgrade/power_transfer + name = "power transfer upgrade" + desc = "A legal upgrade that allows an artificial intelligence to directly provide power to APCs from a distance" + to_gift = /datum/ai_module/power_apc + + + + diff --git a/code/game/objects/items/robot/items/food.dm b/code/game/objects/items/robot/items/food.dm index b7b018362c7..3dd15b508cc 100644 --- a/code/game/objects/items/robot/items/food.dm +++ b/code/game/objects/items/robot/items/food.dm @@ -112,7 +112,7 @@ gumball = new /obj/item/ammo_casing/gumball(src) gumball.loaded_projectile.color = rgb(rand(0, 255), rand(0, 255), rand(0, 255)) - playsound(src.loc, 'sound/weapons/bulletflyby3.ogg', 50, TRUE) + playsound(src.loc, 'sound/items/weapons/bulletflyby3.ogg', 50, TRUE) gumball.fire_casing(target, user, params, 0, 0, null, 0, src) user.visible_message(span_warning("[user] shoots a high-velocity gumball at [target]!")) check_amount() diff --git a/code/game/objects/items/robot/items/generic.dm b/code/game/objects/items/robot/items/generic.dm index a98d13770b7..385baa0381a 100644 --- a/code/game/objects/items/robot/items/generic.dm +++ b/code/game/objects/items/robot/items/generic.dm @@ -30,7 +30,7 @@ if(ishuman(attacked_mob)) var/mob/living/carbon/human/human = attacked_mob if(human.check_block(src, 0, "[attacked_mob]'s [name]", MELEE_ATTACK)) - playsound(attacked_mob, 'sound/weapons/genhit.ogg', 50, TRUE) + playsound(attacked_mob, 'sound/items/weapons/genhit.ogg', 50, TRUE) return FALSE if(iscyborg(user)) var/mob/living/silicon/robot/robot_user = user @@ -54,7 +54,7 @@ span_userdanger("[user] prods you with [src]!"), ) - playsound(loc, 'sound/weapons/egloves.ogg', 50, TRUE, -1) + playsound(loc, 'sound/items/weapons/egloves.ogg', 50, TRUE, -1) cooldown_check = world.time + cooldown log_combat(user, attacked_mob, "stunned", src, "(Combat mode: [user.combat_mode ? "On" : "Off"])") @@ -88,9 +88,9 @@ mode = HUG_MODE_NICE switch(mode) if(HUG_MODE_NICE) - to_chat(user, "Power reset. Hugs!") + to_chat(user, span_infoplain("Power reset. Hugs!")) if(HUG_MODE_HUG) - to_chat(user, "Power increased!") + to_chat(user, span_infoplain("Power increased!")) if(HUG_MODE_SHOCK) to_chat(user, "BZZT. Electrifying arms...") if(HUG_MODE_CRUSH) @@ -114,7 +114,7 @@ span_notice("You playfully boop [attacked_mob] on the head!"), ) user.do_attack_animation(attacked_mob, ATTACK_EFFECT_BOOP) - playsound(loc, 'sound/weapons/tap.ogg', 50, TRUE, -1) + playsound(loc, 'sound/items/weapons/tap.ogg', 50, TRUE, -1) else if(ishuman(attacked_mob)) if(user.body_position == LYING_DOWN) user.visible_message( @@ -133,7 +133,7 @@ span_notice("[user] pets [attacked_mob]!"), span_notice("You pet [attacked_mob]!"), ) - playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, TRUE, -1) + playsound(loc, 'sound/items/weapons/thudswoosh.ogg', 50, TRUE, -1) if(HUG_MODE_HUG) if(ishuman(attacked_mob)) attacked_mob.adjust_status_effects_on_shake_up() @@ -160,7 +160,7 @@ span_warning("[user] bops [attacked_mob] on the head!"), span_warning("You bop [attacked_mob] on the head!"), ) - playsound(loc, 'sound/weapons/tap.ogg', 50, TRUE, -1) + playsound(loc, 'sound/items/weapons/tap.ogg', 50, TRUE, -1) if(HUG_MODE_SHOCK) if (!COOLDOWN_FINISHED(src, shock_cooldown)) return @@ -184,7 +184,7 @@ span_userdanger("[user] shocks [attacked_mob]. It does not seem to have an effect"), span_danger("You shock [attacked_mob] to no effect."), ) - playsound(loc, 'sound/effects/sparks2.ogg', 50, TRUE, -1) + playsound(loc, 'sound/effects/sparks/sparks2.ogg', 50, TRUE, -1) user.cell.use(0.5 * STANDARD_CELL_CHARGE, force = TRUE) COOLDOWN_START(src, shock_cooldown, HUG_SHOCK_COOLDOWN) if(HUG_MODE_CRUSH) @@ -200,7 +200,7 @@ span_userdanger("[user] crushes [attacked_mob]!"), span_danger("You crush [attacked_mob]!"), ) - playsound(loc, 'sound/weapons/smash.ogg', 50, TRUE, -1) + playsound(loc, 'sound/items/weapons/smash.ogg', 50, TRUE, -1) attacked_mob.adjustBruteLoss(15) user.cell.use(0.3 * STANDARD_CELL_CHARGE, force = TRUE) COOLDOWN_START(src, crush_cooldown, HUG_CRUSH_COOLDOWN) @@ -378,7 +378,7 @@ carbon.adjust_confusion(6 SECONDS) audible_message("HUMAN HARM") - playsound(get_turf(src), 'sound/ai/harmalarm.ogg', 70, 3) + playsound(get_turf(src), 'sound/mobs/non-humanoids/cyborg/harmalarm.ogg', 70, 3) COOLDOWN_START(src, alarm_cooldown, HARM_ALARM_SAFETY_COOLDOWN) user.log_message("used a Cyborg Harm Alarm", LOG_ATTACK) if(iscyborg(user)) diff --git a/code/game/objects/items/robot/items/tools.dm b/code/game/objects/items/robot/items/tools.dm index f16cd084490..beaca11b695 100644 --- a/code/game/objects/items/robot/items/tools.dm +++ b/code/game/objects/items/robot/items/tools.dm @@ -9,8 +9,8 @@ resistance_flags = FIRE_PROOF //if it's channeling a cyborg's excess heat, it's probably fireproof force = 5 damtype = BURN - usesound = list('sound/items/welder.ogg', 'sound/items/welder2.ogg') //the usesounds of a lit welder - hitsound = 'sound/items/welder.ogg' //the hitsound of a lit welder + usesound = list('sound/items/tools/welder.ogg', 'sound/items/tools/welder2.ogg') //the usesounds of a lit welder + hitsound = 'sound/items/tools/welder.ogg' //the hitsound of a lit welder //Peacekeeper Cyborg Projectile Dampenening Field /obj/item/borg/projectile_dampen @@ -247,7 +247,7 @@ if(initial(tool.tool_behaviour) == new_tool_behaviour) reference = tool update_appearance(UPDATE_ICON_STATE) - playsound(src, 'sound/items/change_jaws.ogg', 50, TRUE) + playsound(src, 'sound/items/tools/change_jaws.ogg', 50, TRUE) break /obj/item/borg/cyborg_omnitool/update_icon_state() @@ -267,7 +267,7 @@ /obj/item/borg/cyborg_omnitool/proc/set_upgraded(upgrade) upgraded = upgraded - playsound(src, 'sound/items/change_jaws.ogg', 50, TRUE) + playsound(src, 'sound/items/tools/change_jaws.ogg', 50, TRUE) /obj/item/borg/cyborg_omnitool/medical name = "surgical omni-toolset" diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index 7a8196799d8..ce350ecb788 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -121,14 +121,11 @@ if(chest) chest.forceMove(drop_to) - new /obj/item/stack/cable_coil(drop_to, 1) - chest.wired = FALSE - chest.cell?.forceMove(drop_to) + chest.drop_organs() if(head) - head.flash1?.forceMove(drop_to) - head.flash2?.forceMove(drop_to) head.forceMove(drop_to) + head.drop_organs() /obj/item/robot_suit/proc/put_in_hand_or_drop(mob/living/user, obj/item/I) //normal put_in_hands() drops the item ontop of the player, this drops it at the suit's loc if(!user.put_in_hands(I)) @@ -322,7 +319,7 @@ // This canonizes that MMI'd cyborgs have memories of their previous life brainmob.add_mob_memory(/datum/memory/was_cyborged, protagonist = brainmob.mind, deuteragonist = user) brainmob.mind.transfer_to(O) - playsound(O.loc, 'sound/voice/liveagain.ogg', 75, TRUE) + playsound(O.loc, 'sound/mobs/non-humanoids/cyborg/liveagain.ogg', 75, TRUE) if(O.mind && O.mind.special_role) to_chat(O, span_userdanger("You have been robotized!")) diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index 4d327c14543..e4afe968fa1 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -218,6 +218,17 @@ items_to_add = list(/obj/item/plunger/cyborg) +/obj/item/borg/upgrade/high_capacity_light_replacer + name = "janitor cyborg high capacity replacer" + desc = "Increases the amount of lights that can be stored in the replacer." + icon_state = "module_janitor" + require_model = TRUE + model_type = list(/obj/item/robot_model/janitor) + model_flags = BORG_MODEL_JANITOR + + items_to_add = list (/obj/item/lightreplacer/cyborg/advanced) + items_to_remove = list(/obj/item/lightreplacer/cyborg) + /obj/item/borg/upgrade/syndicate name = "illegal equipment module" desc = "Unlocks the hidden, deadlier functions of a cyborg." @@ -599,7 +610,7 @@ smoke.start() sleep(0.2 SECONDS) for(var/i in 1 to 4) - playsound(borg, pick('sound/items/drill_use.ogg', 'sound/items/jaws_cut.ogg', 'sound/items/jaws_pry.ogg', 'sound/items/welder.ogg', 'sound/items/ratchet.ogg'), 80, TRUE, -1) + playsound(borg, pick('sound/items/tools/drill_use.ogg', 'sound/items/tools/jaws_cut.ogg', 'sound/items/tools/jaws_pry.ogg', 'sound/items/tools/welder.ogg', 'sound/items/tools/ratchet.ogg'), 80, TRUE, -1) sleep(1.2 SECONDS) if(!prev_lockcharge) borg.SetLockdown(FALSE) @@ -820,7 +831,7 @@ if(borgo.mind) borgo.mind.grab_ghost() - playsound(loc, 'sound/voice/liveagain.ogg', 75, TRUE) + playsound(loc, 'sound/mobs/non-humanoids/cyborg/liveagain.ogg', 75, TRUE) else playsound(loc, 'sound/machines/ping.ogg', 75, TRUE) diff --git a/code/game/objects/items/shields.dm b/code/game/objects/items/shields.dm index 73aaa7e75a1..acab30562cd 100644 --- a/code/game/objects/items/shields.dm +++ b/code/game/objects/items/shields.dm @@ -15,7 +15,7 @@ attack_verb_continuous = list("shoves", "bashes") attack_verb_simple = list("shove", "bash") armor_type = /datum/armor/item_shield - block_sound = 'sound/weapons/block_shield.ogg' + block_sound = 'sound/items/weapons/block_shield.ogg' /// makes beam projectiles pass through the shield var/transparent = FALSE /// if the shield will break by sustaining damage @@ -163,11 +163,11 @@ custom_materials = list(/datum/material/glass= SHEET_MATERIAL_AMOUNT * 3.75, /datum/material/iron= HALF_SHEET_MATERIAL_AMOUNT) transparent = TRUE max_integrity = 75 - shield_break_sound = 'sound/effects/glassbr3.ogg' + shield_break_sound = 'sound/effects/glass/glassbr3.ogg' shield_break_leftover = /obj/item/shard armor_type = /datum/armor/item_shield/riot - pickup_sound = 'sound/items/plastic_shield_pick_up.ogg' - drop_sound = 'sound/items/plastic_shield_drop.ogg' + pickup_sound = 'sound/items/handling/shield/plastic_shield_pick_up.ogg' + drop_sound = 'sound/items/handling/shield/plastic_shield_drop.ogg' /obj/item/shield/riot/Initialize(mapload) . = ..() @@ -305,7 +305,7 @@ throwforce = 3 throw_speed = 3 breakable_by_damage = FALSE - block_sound = 'sound/weapons/block_blade.ogg' + block_sound = 'sound/items/weapons/block_blade.ogg' is_bashable = FALSE // Gotta wait till it activates y'know shield_bash_sound = 'sound/effects/energyshieldbash.ogg' /// Force of the shield when active. @@ -355,7 +355,7 @@ if(user) balloon_alert(user, active ? "activated" : "deactivated") - playsound(src, active ? 'sound/weapons/saberon.ogg' : 'sound/weapons/saberoff.ogg', 35, TRUE) + playsound(src, active ? 'sound/items/weapons/saberon.ogg' : 'sound/items/weapons/saberoff.ogg', 35, TRUE) is_bashable = !is_bashable return COMPONENT_NO_DEFAULT_MESSAGE @@ -420,7 +420,7 @@ slot_flags = active ? ITEM_SLOT_BACK : null if(user) balloon_alert(user, active ? "extended" : "collapsed") - playsound(src, 'sound/weapons/batonextend.ogg', 50, TRUE) + playsound(src, 'sound/items/weapons/batonextend.ogg', 50, TRUE) return COMPONENT_NO_DEFAULT_MESSAGE /obj/item/shield/riot/tele/proc/can_disarm_attack(datum/source, mob/living/victim, mob/living/user, send_message = TRUE) @@ -472,6 +472,6 @@ max_integrity = 35 shield_break_leftover = /obj/item/stack/rods/two armor_type = /datum/armor/item_shield/improvised - block_sound = 'sound/items/trayhit2.ogg' + block_sound = 'sound/items/trayhit/trayhit2.ogg' #undef BATON_BASH_COOLDOWN diff --git a/code/game/objects/items/spear.dm b/code/game/objects/items/spear.dm index 3fe92227e60..ebc22e1338c 100644 --- a/code/game/objects/items/spear.dm +++ b/code/game/objects/items/spear.dm @@ -15,7 +15,7 @@ embed_type = /datum/embed_data/spear armour_penetration = 10 custom_materials = list(/datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/glass= HALF_SHEET_MATERIAL_AMOUNT * 2) - hitsound = 'sound/weapons/bladeslice.ogg' + hitsound = 'sound/items/weapons/bladeslice.ogg' attack_verb_continuous = list("attacks", "pokes", "jabs", "tears", "lacerates", "gores") attack_verb_simple = list("attack", "poke", "jab", "tear", "lacerate", "gore") sharpness = SHARP_EDGED // i know the whole point of spears is that they're pointy, but edged is more devastating at the moment so @@ -174,10 +174,8 @@ return if(target.resistance_flags & INDESTRUCTIBLE) //due to the lich incident of 2021, embedding grenades inside of indestructible structures is forbidden return - if(ismob(target)) - var/mob/mob_target = target - if(mob_target.status_flags & GODMODE) //no embedding grenade phylacteries inside of ghost poly either - return + if(HAS_TRAIT(target, TRAIT_GODMODE)) + return if(iseffect(target)) //and no accidentally wasting your moment of glory on graffiti return user.say("[war_cry]", forced="spear warcry") diff --git a/code/game/objects/items/stacks/golem_food/golem_hand_actions.dm b/code/game/objects/items/stacks/golem_food/golem_hand_actions.dm index e4b65e03397..00606ba3e6d 100644 --- a/code/game/objects/items/stacks/golem_food/golem_hand_actions.dm +++ b/code/game/objects/items/stacks/golem_food/golem_hand_actions.dm @@ -35,7 +35,7 @@ qdel(src) return ITEM_INTERACT_BLOCKING - playsound(src, 'sound/weapons/sonic_jackhammer.ogg', 50, TRUE) + playsound(src, 'sound/items/weapons/sonic_jackhammer.ogg', 50, TRUE) held_gibtonite.forceMove(get_turf(src)) held_gibtonite.det_time = 2 SECONDS held_gibtonite.GibtoniteReaction(user, "A [src] has targeted [interacting_with] with a thrown and primed") 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 f54a83a8d8e..db77c63d375 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 @@ -215,7 +215,7 @@ /// Shoot a beam at the target atom /datum/status_effect/golem/plasma/proc/zap_effect(atom/target) owner.Beam(target, icon_state = "lightning[rand(1,12)]", time = 0.5 SECONDS) - playsound(owner, 'sound/magic/lightningshock.ogg', vol = 50, vary = TRUE) + playsound(owner, 'sound/effects/magic/lightningshock.ogg', vol = 50, vary = TRUE) /// Makes you spaceproof /datum/status_effect/golem/plasteel @@ -298,8 +298,8 @@ arm.unarmed_attack_verbs = list("slash") arm.grappled_attack_verb = "lacerate" arm.unarmed_attack_effect = ATTACK_EFFECT_CLAW - arm.unarmed_attack_sound = 'sound/weapons/slash.ogg' - arm.unarmed_miss_sound = 'sound/weapons/slashmiss.ogg' + arm.unarmed_attack_sound = 'sound/items/weapons/slash.ogg' + arm.unarmed_miss_sound = 'sound/items/weapons/slashmiss.ogg' RegisterSignal(arm, COMSIG_QDELETING, PROC_REF(on_arm_destroyed)) LAZYADD(modified_arms, arm) diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index d76861b6c49..cb3bb78f656 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -133,7 +133,7 @@ if(!try_heal_checks(patient, user, heal_brute, heal_burn)) return FALSE if(patient.heal_bodypart_damage((heal_brute * patient.maxHealth/100))) - user.visible_message("[user] applies [src] on [patient].", "You apply [src] on [patient].") + user.visible_message(span_infoplain(span_green("[user] applies [src] on [patient].")), span_infoplain(span_green("You apply [src] on [patient]."))) return TRUE patient.balloon_alert(user, "can't heal [patient]!") return FALSE @@ -279,7 +279,7 @@ if(!do_after(user, treatment_delay, target = patient)) return - user.visible_message("[user] applies [src] to [patient]'s [limb.plaintext_zone].", "You bandage the wounds on [user == patient ? "your" : "[patient]'s"] [limb.plaintext_zone].") + user.visible_message(span_infoplain(span_green("[user] applies [src] to [patient]'s [limb.plaintext_zone].")), span_infoplain(span_green("You bandage the wounds on [user == patient ? "your" : "[patient]'s"] [limb.plaintext_zone]."))) limb.apply_gauze(src) /obj/item/stack/medical/gauze/twelve @@ -436,7 +436,7 @@ is_open = TRUE balloon_alert(user, "opened") update_appearance() - playsound(src, 'sound/items/poster_ripped.ogg', 20, TRUE) + playsound(src, 'sound/items/poster/poster_ripped.ogg', 20, TRUE) return return ..() diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm index 69dbe87cd5c..9e91ba2aaac 100644 --- a/code/game/objects/items/stacks/rods.dm +++ b/code/game/objects/items/stacks/rods.dm @@ -32,15 +32,15 @@ GLOBAL_LIST_INIT(rod_recipes, list ( \ max_amount = 50 attack_verb_continuous = list("hits", "bludgeons", "whacks") attack_verb_simple = list("hit", "bludgeon", "whack") - hitsound = 'sound/weapons/gun/general/grenade_launch.ogg' + hitsound = 'sound/items/weapons/gun/general/grenade_launch.ogg' embed_type = /datum/embed_data/rods novariants = TRUE matter_amount = 2 cost = HALF_SHEET_MATERIAL_AMOUNT source = /datum/robot_energy_storage/material/iron merge_type = /obj/item/stack/rods - pickup_sound = 'sound/items/iron_rod_pick_up.ogg' - drop_sound = 'sound/items/metal_drop.ogg' + pickup_sound = 'sound/items/handling/materials/iron_rod_pick_up.ogg' + drop_sound = 'sound/items/handling/materials/metal_drop.ogg' sound_vary = TRUE /datum/embed_data/rods diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index 19e290170f8..8415ffa3f40 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -32,8 +32,8 @@ GLOBAL_LIST_INIT(glass_recipes, list ( \ cost = SHEET_MATERIAL_AMOUNT source = /datum/robot_energy_storage/material/glass sniffable = TRUE - pickup_sound = 'sound/items/glass_pick_up.ogg' - drop_sound = 'sound/items/glass_drop.ogg' + pickup_sound = 'sound/items/handling/materials/glass_pick_up.ogg' + drop_sound = 'sound/items/handling/materials/glass_drop.ogg' /datum/armor/sheet_glass fire = 50 @@ -104,8 +104,8 @@ GLOBAL_LIST_INIT(pglass_recipes, list ( \ grind_results = list(/datum/reagent/silicon = 20, /datum/reagent/toxin/plasma = 10) material_flags = NONE tableVariant = /obj/structure/table/glass/plasmaglass - pickup_sound = 'sound/items/glass_pick_up.ogg' - drop_sound = 'sound/items/glass_drop.ogg' + pickup_sound = 'sound/items/handling/materials/glass_pick_up.ogg' + drop_sound = 'sound/items/handling/materials/glass_drop.ogg' /obj/item/stack/sheet/plasmaglass/fifty amount = 50 @@ -164,8 +164,8 @@ GLOBAL_LIST_INIT(reinforced_glass_recipes, list ( \ grind_results = list(/datum/reagent/silicon = 20, /datum/reagent/iron = 10) matter_amount = 6 tableVariant = /obj/structure/table/reinforced/rglass - pickup_sound = 'sound/items/glass_pick_up.ogg' - drop_sound = 'sound/items/glass_drop.ogg' + pickup_sound = 'sound/items/handling/materials/glass_pick_up.ogg' + drop_sound = 'sound/items/handling/materials/glass_drop.ogg' /obj/item/stack/sheet/rglass/fifty amount = 50 @@ -204,8 +204,8 @@ GLOBAL_LIST_INIT(prglass_recipes, list ( \ gulag_valid = TRUE matter_amount = 8 tableVariant = /obj/structure/table/reinforced/plasmarglass - pickup_sound = 'sound/items/glass_pick_up.ogg' - drop_sound = 'sound/items/glass_drop.ogg' + pickup_sound = 'sound/items/handling/materials/glass_pick_up.ogg' + drop_sound = 'sound/items/handling/materials/glass_drop.ogg' /datum/armor/sheet_plasmarglass melee = 20 @@ -236,8 +236,8 @@ GLOBAL_LIST_INIT(titaniumglass_recipes, list( resistance_flags = ACID_PROOF merge_type = /obj/item/stack/sheet/titaniumglass tableVariant = /obj/structure/table/reinforced/titaniumglass - pickup_sound = 'sound/items/glass_pick_up.ogg' - drop_sound = 'sound/items/glass_drop.ogg' + pickup_sound = 'sound/items/handling/materials/glass_pick_up.ogg' + drop_sound = 'sound/items/handling/materials/glass_drop.ogg' /obj/item/stack/sheet/titaniumglass/fifty amount = 50 @@ -268,8 +268,8 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list( resistance_flags = ACID_PROOF merge_type = /obj/item/stack/sheet/plastitaniumglass tableVariant = /obj/structure/table/reinforced/plastitaniumglass - pickup_sound = 'sound/items/glass_pick_up.ogg' - drop_sound = 'sound/items/glass_drop.ogg' + pickup_sound = 'sound/items/handling/materials/glass_pick_up.ogg' + drop_sound = 'sound/items/handling/materials/glass_drop.ogg' /obj/item/stack/sheet/plastitaniumglass/fifty amount = 50 @@ -296,7 +296,7 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list( custom_materials = list(/datum/material/glass=SHEET_MATERIAL_AMOUNT) attack_verb_continuous = list("stabs", "slashes", "slices", "cuts") attack_verb_simple = list("stab", "slash", "slice", "cut") - hitsound = 'sound/weapons/bladeslice.ogg' + hitsound = 'sound/items/weapons/bladeslice.ogg' resistance_flags = ACID_PROOF armor_type = /datum/armor/item_shard max_integrity = 40 diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm index fba54d1e44a..4478b21a6ef 100644 --- a/code/game/objects/items/stacks/sheets/leather.dm +++ b/code/game/objects/items/stacks/sheets/leather.dm @@ -5,8 +5,8 @@ inhand_icon_state = null novariants = TRUE merge_type = /obj/item/stack/sheet/animalhide - pickup_sound = 'sound/items/skin_pick_up.ogg' - drop_sound = 'sound/items/skin_drop.ogg' + pickup_sound = 'sound/items/handling/materials/skin_pick_up.ogg' + drop_sound = 'sound/items/handling/materials/skin_drop.ogg' /obj/item/stack/sheet/animalhide/human name = "human skin" @@ -193,8 +193,8 @@ GLOBAL_LIST_INIT(carp_recipes, list ( \ icon_state = "sheet-leather" inhand_icon_state = null merge_type = /obj/item/stack/sheet/leather - pickup_sound = 'sound/items/skin_pick_up.ogg' - drop_sound = 'sound/items/skin_drop.ogg' + pickup_sound = 'sound/items/handling/materials/skin_pick_up.ogg' + drop_sound = 'sound/items/handling/materials/skin_drop.ogg' GLOBAL_LIST_INIT(leather_recipes, list ( \ new/datum/stack_recipe("wallet", /obj/item/storage/wallet, 1, crafting_flags = NONE, category = CAT_CONTAINERS), \ @@ -327,7 +327,7 @@ GLOBAL_LIST_INIT(sinew_recipes, list ( \ /obj/item/stack/sheet/animalhide/attackby(obj/item/W, mob/user, params) if(W.get_sharpness()) - playsound(loc, 'sound/weapons/slice.ogg', 50, TRUE, -1) + playsound(loc, 'sound/items/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, 5 SECONDS, target = src)) to_chat(user, span_notice("You cut the hair from [src.name].")) @@ -349,8 +349,8 @@ GLOBAL_LIST_INIT(sinew_recipes, list ( \ icon_state = "sheet-hairlesshide" inhand_icon_state = null merge_type = /obj/item/stack/sheet/hairlesshide - pickup_sound = 'sound/items/skin_pick_up.ogg' - drop_sound = 'sound/items/skin_drop.ogg' + pickup_sound = 'sound/items/handling/materials/skin_pick_up.ogg' + drop_sound = 'sound/items/handling/materials/skin_drop.ogg' /obj/item/stack/sheet/hairlesshide/examine(mob/user) . = ..() @@ -364,8 +364,8 @@ GLOBAL_LIST_INIT(sinew_recipes, list ( \ icon_state = "sheet-wetleather" inhand_icon_state = null merge_type = /obj/item/stack/sheet/wethide - pickup_sound = 'sound/items/skin_pick_up.ogg' - drop_sound = 'sound/items/skin_drop.ogg' + pickup_sound = 'sound/items/handling/materials/skin_pick_up.ogg' + drop_sound = 'sound/items/handling/materials/skin_drop.ogg' /// Reduced when exposed to high temperatures var/wetness = 30 /// Kelvin to start drying diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 6dd8530e907..38cd55f413e 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -395,8 +395,8 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \ grind_results = list(/datum/reagent/cellulose = 20) //no lignocellulose or lignin reagents yet, walltype = /turf/closed/wall/mineral/wood stairs_type = /obj/structure/stairs/wood - pickup_sound = 'sound/items/wood_pick_up.ogg' - drop_sound = 'sound/items/wood_drop.ogg' + pickup_sound = 'sound/items/handling/materials/wood_pick_up.ogg' + drop_sound = 'sound/items/handling/materials/wood_drop.ogg' /datum/armor/mineral_wood fire = 50 @@ -695,8 +695,8 @@ GLOBAL_LIST_INIT(cardboard_recipes, list ( \ merge_type = /obj/item/stack/sheet/cardboard grind_results = list(/datum/reagent/cellulose = 10) material_type = /datum/material/cardboard - pickup_sound = 'sound/items/cardboard_pick_up.ogg' - drop_sound = 'sound/items/cardboard_drop.ogg' + pickup_sound = 'sound/items/handling/materials/cardboard_pick_up.ogg' + drop_sound = 'sound/items/handling/materials/cardboard_drop.ogg' /obj/item/stack/sheet/cardboard/Initialize(mapload, new_amount, merge, list/mat_override, mat_amt) . = ..() @@ -875,8 +875,8 @@ GLOBAL_LIST_INIT(plastic_recipes, list( throwforce = 7 material_type = /datum/material/plastic merge_type = /obj/item/stack/sheet/plastic - pickup_sound = 'sound/items/plastic_pick_up.ogg' - drop_sound = 'sound/items/plastic_drop.ogg' + pickup_sound = 'sound/items/handling/materials/plastic_pick_up.ogg' + drop_sound = 'sound/items/handling/materials/plastic_drop.ogg' /obj/item/stack/sheet/plastic/fifty amount = 50 diff --git a/code/game/objects/items/stacks/sheets/sheets.dm b/code/game/objects/items/stacks/sheets/sheets.dm index 568fd2f49aa..b9a66202a16 100644 --- a/code/game/objects/items/stacks/sheets/sheets.dm +++ b/code/game/objects/items/stacks/sheets/sheets.dm @@ -13,8 +13,8 @@ attack_verb_simple = list("bash", "batter", "bludgeon", "thrash", "smash") novariants = FALSE material_flags = MATERIAL_EFFECTS - pickup_sound = 'sound/items/metal_pick_up.ogg' - drop_sound = 'sound/items/metal_drop.ogg' + pickup_sound = 'sound/items/handling/materials/metal_pick_up.ogg' + drop_sound = 'sound/items/handling/materials/metal_drop.ogg' var/sheettype = null //this is used for girders in the creation of walls/false walls ///If true, this is worth points in the gulag labour stacker var/gulag_valid = FALSE @@ -63,7 +63,7 @@ * Facilitates sheets being smacked on the floor * * This is used for crafting by hitting the floor with items. - * The inital use case is glass sheets breaking in to shards when the floor is hit. + * The initial use case is glass sheets breaking in to shards when the floor is hit. * Args: * * user: The user that did the action * * params: paramas passed in from attackby diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 288b9d0aae1..b5aa0a30c3c 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -177,7 +177,7 @@ /** * use available_amount of sheets/pieces, return TRUE only if all sheets/pieces of this stack were used * we don't delete this stack when it reaches 0 because we expect the all in one grinder, etc to delete - * this stack if grinding was successfull + * this stack if grinding was successful */ use(available_amount, check = FALSE) return available_amount == current_amount @@ -549,7 +549,7 @@ update_weight() return TRUE -/obj/item/stack/tool_use_check(mob/living/user, amount) +/obj/item/stack/tool_use_check(mob/living/user, amount, heat_required) if(get_amount() < amount) // general balloon alert that says they don't have enough user.balloon_alert(user, "not enough material!") diff --git a/code/game/objects/items/stacks/tape.dm b/code/game/objects/items/stacks/tape.dm index acfc59b64d0..a1394bbad4f 100644 --- a/code/game/objects/items/stacks/tape.dm +++ b/code/game/objects/items/stacks/tape.dm @@ -29,14 +29,14 @@ if(user.get_inactive_held_item() == src) if(is_zero_amount(delete_if_zero = TRUE)) return - playsound(user, 'sound/items/duct_tape_rip.ogg', 50, TRUE) + playsound(user, 'sound/items/duct_tape/duct_tape_rip.ogg', 50, TRUE) if(!do_after(user, 1 SECONDS)) return var/new_tape_gag = new tape_gag(src) user.put_in_hands(new_tape_gag) use(1) to_chat(user, span_notice("You rip off a piece of tape.")) - playsound(user, 'sound/items/duct_tape_snap.ogg', 50, TRUE) + playsound(user, 'sound/items/duct_tape/duct_tape_snap.ogg', 50, TRUE) return TRUE return ..() @@ -53,10 +53,10 @@ return ITEM_INTERACT_BLOCKING user.visible_message(span_notice("[user] begins wrapping [target] with [src]."), span_notice("You begin wrapping [target] with [src].")) - playsound(user, 'sound/items/duct_tape_rip.ogg', 50, TRUE) + playsound(user, 'sound/items/duct_tape/duct_tape_rip.ogg', 50, TRUE) if(do_after(user, 3 SECONDS, target=target)) - playsound(user, 'sound/items/duct_tape_snap.ogg', 50, TRUE) + playsound(user, 'sound/items/duct_tape/duct_tape_snap.ogg', 50, TRUE) use(1) if(istype(target, /obj/item/clothing/gloves/fingerless)) var/obj/item/clothing/gloves/tackler/offbrand/O = new /obj/item/clothing/gloves/tackler/offbrand diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index 4a540bb5ba5..dcaacf19405 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -68,7 +68,7 @@ * Place our tile on a plating, or replace it. * * Arguments: - * * target_plating - Instance of the plating we want to place on. Replaced during sucessful executions. + * * target_plating - Instance of the plating we want to place on. Replaced during successful executions. * * user - The mob doing the placing. */ /obj/item/stack/tile/proc/place_tile(turf/open/floor/plating/target_plating, mob/user) @@ -83,7 +83,7 @@ return target_plating = target_plating.place_on_top(placed_turf_path, flags = CHANGETURF_INHERIT_AIR) target_plating.setDir(turf_dir) - playsound(target_plating, 'sound/weapons/genhit.ogg', 50, TRUE) + playsound(target_plating, 'sound/items/weapons/genhit.ogg', 50, TRUE) return target_plating // Most executions should end here. // If we and the target tile share the same initial baseturf and they consent, replace em. @@ -98,7 +98,7 @@ target_plating = target_plating.ChangeTurf(placed_turf_path, target_plating.baseturfs, CHANGETURF_INHERIT_AIR) target_plating.setDir(turf_dir) - playsound(target_plating, 'sound/weapons/genhit.ogg', 50, TRUE) + playsound(target_plating, 'sound/items/weapons/genhit.ogg', 50, TRUE) return target_plating /obj/item/stack/tile/handle_openspace_click(turf/target, mob/user, list/modifiers) @@ -1260,7 +1260,7 @@ inhand_icon_state = "tile-catwalk" mats_per_unit = list(/datum/material/iron=SMALL_MATERIAL_AMOUNT) turf_type = /turf/open/floor/catwalk_floor - merge_type = /obj/item/stack/tile/catwalk_tile //Just to be cleaner, these all stack with eachother + merge_type = /obj/item/stack/tile/catwalk_tile //Just to be cleaner, these all stack with each other tile_reskin_types = list( /obj/item/stack/tile/catwalk_tile, /obj/item/stack/tile/catwalk_tile/iron, diff --git a/code/game/objects/items/stacks/wrap.dm b/code/game/objects/items/stacks/wrap.dm index bf8d17822bd..ec83b1b5efa 100644 --- a/code/game/objects/items/stacks/wrap.dm +++ b/code/game/objects/items/stacks/wrap.dm @@ -11,12 +11,28 @@ icon_state = "wrap_paper" inhand_icon_state = "wrap_paper" greyscale_config = /datum/greyscale_config/wrap_paper - item_flags = NOBLUDGEON amount = 25 max_amount = 25 resistance_flags = FLAMMABLE merge_type = /obj/item/stack/wrapping_paper singular_name = "wrapping paper" + throwforce = 0 + w_class = WEIGHT_CLASS_TINY + throw_speed = 3 + throw_range = 5 + hitsound = 'sound/effects/bonk.ogg' + +/obj/item/stack/wrapping_paper/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_CUSTOM_TAP_SOUND, INNATE_TRAIT) + +/obj/item/stack/wrapping_paper/attack(mob/living/target_mob, mob/living/user, params) + . = ..() + user.visible_message( + span_warning("[user] baps [target_mob] on the head with [src]!"), + span_warning("You bap [target_mob] on the head with [src]!"), + ) + target_mob.add_mood_event("roll", /datum/mood_event/bapped) /obj/item/stack/wrapping_paper/Initialize(mapload) . = ..() @@ -103,13 +119,6 @@ /obj/item/delivery/can_be_package_wrapped() return FALSE -/obj/item/stack/package_wrap/storage_insert_on_interaction(datum/storage, atom/storage_holder, mob/user) - if(isitem(storage_holder)) - // Don't insert if the target can be wrapped - var/obj/item/item = storage_holder - return !item.can_be_package_wrapped() - return TRUE - /obj/item/stack/package_wrap/interact_with_atom(obj/interacting_with, mob/living/user, list/modifiers) if(!isobj(interacting_with)) return NONE @@ -123,6 +132,8 @@ if(isitem(interacting_with)) var/obj/item/item = interacting_with if(!item.can_be_package_wrapped()) + if(SHOULD_SKIP_INTERACTION(interacting_with, src, user)) + return NONE // put it in the bag instead of yelling balloon_alert(user, "can't be wrapped!") return ITEM_INTERACT_BLOCKING if(user.is_holding(item)) @@ -171,7 +182,6 @@ else balloon_alert(user, "not enough paper!") return ITEM_INTERACT_BLOCKING - else if(istype(interacting_with, /obj/machinery/portable_atmospherics)) var/obj/machinery/portable_atmospherics/portable_atmospherics = interacting_with if(portable_atmospherics.anchored) @@ -219,3 +229,17 @@ w_class = WEIGHT_CLASS_TINY throw_speed = 3 throw_range = 5 + hitsound = 'sound/effects/bonk.ogg' + +/obj/item/c_tube/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_CUSTOM_TAP_SOUND, INNATE_TRAIT) + +/obj/item/c_tube/attack(mob/living/target_mob, mob/living/user, params) + . = ..() + user.visible_message( + span_warning("[user] baps [target_mob] on the head with [src]!"), + span_warning("You bap [target_mob] on the head with [src]!"), + ) + target_mob.add_mood_event("roll", /datum/mood_event/bapped) + diff --git a/code/game/objects/items/stickers.dm b/code/game/objects/items/stickers.dm index 447e2022473..99247493795 100644 --- a/code/game/objects/items/stickers.dm +++ b/code/game/objects/items/stickers.dm @@ -25,7 +25,7 @@ throw_range = 3 pressure_resistance = 0 - item_flags = NOBLUDGEON | XENOMORPH_HOLDABLE //funny ~Jimmyl + item_flags = NOBLUDGEON w_class = WEIGHT_CLASS_TINY /// `list` or `null`, contains possible alternate `icon_states`. diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index 4199b544f81..b8d9900b198 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -250,7 +250,7 @@ attack_verb_simple = list("MEAT", "MEAT MEAT") custom_materials = list(/datum/material/meat = SHEET_MATERIAL_AMOUNT * 25) // MEAT ///Sounds used in the squeak component - var/list/meat_sounds = list('sound/effects/blobattack.ogg' = 1) + var/list/meat_sounds = list('sound/effects/blob/blobattack.ogg' = 1) ///Reagents added to the edible component, ingested when you EAT the MEAT var/list/meat_reagents = list( /datum/reagent/consumable/nutriment/protein = 10, @@ -417,11 +417,11 @@ // How much time it takes to zip up (close) the duffelbag var/zip_up_duration = 0.5 SECONDS // Audio played during zipup - var/zip_up_sfx = 'sound/items/zip_up.ogg' + var/zip_up_sfx = 'sound/items/zip/zip_up.ogg' // How much time it takes to unzip the duffel var/unzip_duration = 2.1 SECONDS // Audio played during unzip - var/unzip_sfx = 'sound/items/un_zip.ogg' + var/unzip_sfx = 'sound/items/zip/un_zip.ogg' /obj/item/storage/backpack/duffelbag/Initialize(mapload) . = ..() @@ -643,7 +643,7 @@ zip_slowdown = 0.3 // Faster unzipping. Utilizes the same noise as zipping up to fit the unzip duration. unzip_duration = 0.5 SECONDS - unzip_sfx = 'sound/items/zip_up.ogg' + unzip_sfx = 'sound/items/zip/zip_up.ogg' //SKYRAT EDIT CHANGE START - It's just a black duffel. /obj/item/storage/backpack/duffelbag/syndie diff --git a/code/game/objects/items/storage/bags.dm b/code/game/objects/items/storage/bags.dm index 269a6699d3e..864078c4b08 100644 --- a/code/game/objects/items/storage/bags.dm +++ b/code/game/objects/items/storage/bags.dm @@ -155,13 +155,13 @@ UnregisterSignal(listeningTo, COMSIG_MOVABLE_MOVED) listeningTo = null -/obj/item/storage/bag/ore/storage_insert_on_interacted_with(datum/storage, obj/item/inserted, mob/living/user) - if(istype(inserted, /obj/item/boulder)) - to_chat(user, span_warning("You can't fit [inserted] into [src]. \ +/obj/item/storage/bag/ore/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(istype(tool, /obj/item/boulder)) + to_chat(user, span_warning("You can't fit [tool] into [src]. \ Perhaps you should break it down first, or find an ore box.")) - return FALSE + return ITEM_INTERACT_BLOCKING - return TRUE + return NONE /obj/item/storage/bag/ore/proc/pickup_ores(mob/living/user) SIGNAL_HANDLER @@ -274,8 +274,6 @@ . += span_notice("Ctrl-click to activate seed extraction.") /obj/item/storage/bag/plants/portaseeder/item_ctrl_click(mob/user) - if(user.incapacitated) - return for(var/obj/item/plant in contents) seedify(plant, 1) return CLICK_ACTION_SUCCESS @@ -398,9 +396,9 @@ do_scatter(tray_item) if(prob(50)) - playsound(M, 'sound/items/trayhit1.ogg', 50, TRUE) + playsound(M, 'sound/items/trayhit/trayhit1.ogg', 50, TRUE) else - playsound(M, 'sound/items/trayhit2.ogg', 50, TRUE) + playsound(M, 'sound/items/trayhit/trayhit2.ogg', 50, TRUE) if(ishuman(M)) if(prob(10)) @@ -577,7 +575,7 @@ new /obj/item/ammo_casing/harpoon(src) /obj/item/storage/bag/rebar_quiver - name = "Rebar Storage Quiver" + name = "rebar quiver" icon = 'icons/obj/weapons/bows/quivers.dmi' icon_state = "rebar_quiver" worn_icon_state = "rebar_quiver" @@ -607,7 +605,7 @@ desc = "A specialized quiver meant to hold any kind of bolts intended for use with the rebar crossbow. \ Clearly a better design than a cut up oxygen tank..." slot_flags = ITEM_SLOT_NECK - w_class = WEIGHT_CLASS_SMALL + w_class = WEIGHT_CLASS_NORMAL resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF actions_types = list(/datum/action/item_action/reload_rebar) @@ -649,7 +647,7 @@ if(held_crossbow.magazine.contents.len >= held_crossbow.magazine.max_ammo) user.balloon_alert(user, "no more room!") return - if(!do_after(user, 0.8 SECONDS, user, IGNORE_USER_LOC_CHANGE)) + if(!do_after(user, 1.2 SECONDS, user)) return var/obj/item/ammo_casing/rebar/ammo_to_load = contents[1] diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index 15ad117f722..b9e4094a2bb 100644 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -398,8 +398,8 @@ /obj/item/restraints/handcuffs, /obj/item/restraints/legcuffs/bola, /obj/item/stock_parts/power_store/cell/microfusion, //SKYRAT EDIT ADDITION - )) - atom_storage.open_sound = 'sound/items/holster.ogg' + )) + atom_storage.open_sound = 'sound/items/handling/holster_open.ogg' atom_storage.open_sound_vary = TRUE atom_storage.rustle_sound = FALSE @@ -540,6 +540,7 @@ . = ..() atom_storage.max_slots = 1 atom_storage.set_holdable(/obj/item/clothing/mask/luchador) + AddComponent(/datum/component/adjust_fishing_difficulty, -2) /obj/item/storage/belt/military name = "chest rig" diff --git a/code/game/objects/items/storage/boxes/_boxes.dm b/code/game/objects/items/storage/boxes/_boxes.dm index 94015272996..58e68b4487a 100644 --- a/code/game/objects/items/storage/boxes/_boxes.dm +++ b/code/game/objects/items/storage/boxes/_boxes.dm @@ -8,8 +8,8 @@ lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' resistance_flags = FLAMMABLE - drop_sound = 'sound/items/handling/cardboardbox_drop.ogg' - pickup_sound = 'sound/items/handling/cardboardbox_pickup.ogg' + drop_sound = 'sound/items/handling/cardboard_box/cardboardbox_drop.ogg' + pickup_sound = 'sound/items/handling/cardboard_box/cardboardbox_pickup.ogg' /// What material do we get when we fold this box? var/foldable_result = /obj/item/stack/sheet/cardboard /// What drawing will we get on the face of the box? @@ -19,8 +19,8 @@ . = ..() atom_storage.max_specific_storage = WEIGHT_CLASS_SMALL update_appearance() - atom_storage.open_sound = 'sound/items/cardboard_box_open.ogg' - atom_storage.rustle_sound = 'sound/items/cardboard_box_rustle.ogg' + atom_storage.open_sound = 'sound/items/handling/cardboard_box/cardboard_box_open.ogg' + atom_storage.rustle_sound = 'sound/items/handling/cardboard_box/cardboard_box_rustle.ogg' /obj/item/storage/box/suicide_act(mob/living/carbon/user) var/obj/item/bodypart/head/myhead = user.get_bodypart(BODY_ZONE_HEAD) diff --git a/code/game/objects/items/storage/boxes/clothes_boxes.dm b/code/game/objects/items/storage/boxes/clothes_boxes.dm index 582b611186c..86cd3931f1e 100644 --- a/code/game/objects/items/storage/boxes/clothes_boxes.dm +++ b/code/game/objects/items/storage/boxes/clothes_boxes.dm @@ -38,8 +38,8 @@ new /obj/item/stack/sticky_tape(src) /obj/item/storage/box/fakesyndiesuit - name = "boxed space suit and helmet" - desc = "A sleek, sturdy box used to hold replica spacesuits." + name = "boxed replica space suit and helmet" + desc = "A sleek, sturdy box used to hold toy spacesuits." icon_state = "syndiebox" illustration = "syndiesuit" diff --git a/code/game/objects/items/storage/boxes/food_boxes.dm b/code/game/objects/items/storage/boxes/food_boxes.dm index 86d59123c72..bac558ce3be 100644 --- a/code/game/objects/items/storage/boxes/food_boxes.dm +++ b/code/game/objects/items/storage/boxes/food_boxes.dm @@ -301,7 +301,7 @@ new /obj/item/food/fishmeat/armorfish(src) new /obj/item/food/fishmeat/carp(src) new /obj/item/food/fishmeat/moonfish(src) - new /obj/item/food/fishmeat/gunner_jellyfish(src) + new /obj/item/food/fishmeat/gunner_jellyfish/supply(src) /obj/item/storage/box/ingredients/salads theme_name = "salads" diff --git a/code/game/objects/items/storage/boxes/service_boxes.dm b/code/game/objects/items/storage/boxes/service_boxes.dm index 767f351635d..f50629818ec 100644 --- a/code/game/objects/items/storage/boxes/service_boxes.dm +++ b/code/game/objects/items/storage/boxes/service_boxes.dm @@ -47,7 +47,7 @@ /obj/item/storage/box/mousetraps name = "box of Pest-B-Gon mousetraps" - desc = "Keep out of reach of children." + desc = span_alert("Keep out of reach of children.") illustration = "mousetrap" /obj/item/storage/box/mousetraps/PopulateContents() diff --git a/code/game/objects/items/storage/briefcase.dm b/code/game/objects/items/storage/briefcase.dm index bd474808446..a0b6e892e05 100644 --- a/code/game/objects/items/storage/briefcase.dm +++ b/code/game/objects/items/storage/briefcase.dm @@ -110,3 +110,12 @@ new /obj/item/clothing/mask/balaclava(src) new /obj/item/bodybag(src) new /obj/item/soap/nanotrasen(src) + +/obj/item/storage/briefcase/hitchiker/PopulateContents() + new /obj/item/food/sandwich/peanut_butter_jelly(src) + new /obj/item/food/sandwich/peanut_butter_jelly(src) + new /obj/item/reagent_containers/cup/glass/waterbottle/large(src) + new /obj/item/soap(src) + new /obj/item/pillow/random(src) + new /obj/item/tank/internals/emergency_oxygen(src) + new /obj/item/tank/internals/emergency_oxygen(src) diff --git a/code/game/objects/items/storage/holsters.dm b/code/game/objects/items/storage/holsters.dm index cc8a790c8ef..010cc7ffd7f 100644 --- a/code/game/objects/items/storage/holsters.dm +++ b/code/game/objects/items/storage/holsters.dm @@ -33,7 +33,7 @@ /obj/item/gun/energy/laser/captain, /obj/item/gun/energy/e_gun/hos, )) - atom_storage.open_sound = 'sound/items/holster.ogg' + atom_storage.open_sound = 'sound/items/handling/holster_open.ogg' atom_storage.open_sound_vary = TRUE /obj/item/storage/belt/holster/energy diff --git a/code/game/objects/items/storage/medkit.dm b/code/game/objects/items/storage/medkit.dm index 6e10fd8314c..ff51c99604c 100644 --- a/code/game/objects/items/storage/medkit.dm +++ b/code/game/objects/items/storage/medkit.dm @@ -18,8 +18,8 @@ righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' throw_speed = 3 throw_range = 7 - drop_sound = 'sound/items/medkit_drop.ogg' - pickup_sound = 'sound/items/medkit_pick_up.ogg' + drop_sound = 'sound/items/handling/medkit/medkit_drop.ogg' + pickup_sound = 'sound/items/handling/medkit/medkit_pick_up.ogg' sound_vary = TRUE var/empty = FALSE /// Defines damage type of the medkit. General ones stay null. Used for medibot healing bonuses @@ -82,9 +82,9 @@ /obj/item/storage/medkit/Initialize(mapload) . = ..() atom_storage.max_specific_storage = WEIGHT_CLASS_SMALL - atom_storage.open_sound = 'sound/items/medkit_open.ogg' + atom_storage.open_sound = 'sound/items/handling/medkit/medkit_open.ogg' atom_storage.open_sound_vary = TRUE - atom_storage.rustle_sound = 'sound/items/medkit_rustle.ogg' + atom_storage.rustle_sound = 'sound/items/handling/medkit/medkit_rustle.ogg' /obj/item/storage/medkit/regular icon_state = "medkit" @@ -819,3 +819,8 @@ /obj/item/storage/test_tube_rack/update_icon_state() icon_state = "[base_icon_state][contents.len > 0 ? contents.len : null]" return ..() + +/obj/item/storage/test_tube_rack/full/PopulateContents() + for(var/i in 1 to atom_storage.max_slots) + new /obj/item/reagent_containers/cup/tube(src) + diff --git a/code/game/objects/items/storage/sixpack.dm b/code/game/objects/items/storage/sixpack.dm index a6e36bf0592..f1a950f025b 100644 --- a/code/game/objects/items/storage/sixpack.dm +++ b/code/game/objects/items/storage/sixpack.dm @@ -42,9 +42,9 @@ new /obj/item/reagent_containers/cup/soda_cans/cola(src) /obj/item/storage/cans/sixbeer - name = "beer bottle ring" - desc = "Holds six beer bottles. Remember to recycle when you're done!" + name = "beer can ring" + desc = "Holds six beers. Remember to recycle when you're done!" /obj/item/storage/cans/sixbeer/PopulateContents() for(var/i in 1 to 6) - new /obj/item/reagent_containers/cup/glass/bottle/beer(src) + new /obj/item/reagent_containers/cup/soda_cans/beer(src) diff --git a/code/game/objects/items/storage/toolbox.dm b/code/game/objects/items/storage/toolbox.dm index 8a2920b6013..f5d802a02ff 100644 --- a/code/game/objects/items/storage/toolbox.dm +++ b/code/game/objects/items/storage/toolbox.dm @@ -16,9 +16,9 @@ custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT*5) attack_verb_continuous = list("robusts") attack_verb_simple = list("robust") - hitsound = 'sound/weapons/smash.ogg' - drop_sound = 'sound/items/handling/toolbox_drop.ogg' - pickup_sound = 'sound/items/handling/toolbox_pickup.ogg' + hitsound = 'sound/items/weapons/smash.ogg' + drop_sound = 'sound/items/handling/toolbox/toolbox_drop.ogg' + pickup_sound = 'sound/items/handling/toolbox/toolbox_pickup.ogg' material_flags = MATERIAL_EFFECTS | MATERIAL_COLOR var/latches = "single_latch" var/has_latches = TRUE @@ -33,8 +33,8 @@ if(prob(1)) latches = "triple_latch" update_appearance() - atom_storage.open_sound = 'sound/items/toolbox_open.ogg' - atom_storage.rustle_sound = 'sound/items/toolbox_rustle.ogg' + atom_storage.open_sound = 'sound/items/handling/toolbox/toolbox_open.ogg' + atom_storage.rustle_sound = 'sound/items/handling/toolbox/toolbox_rustle.ogg' AddElement(/datum/element/falling_hazard, damage = force, wound_bonus = wound_bonus, hardhat_safety = TRUE, crushes = FALSE, impact_sound = hitsound) /obj/item/storage/toolbox/update_overlays() @@ -412,6 +412,7 @@ desc = "A bandana. It seems to have a little carp embroidered on the inside, as well as the kanji '魚'." icon_state = "snake_eater" inhand_icon_state = null + clothing_traits = list(TRAIT_FISH_EATER) /obj/item/clothing/head/costume/knight name = "fake medieval helmet" diff --git a/code/game/objects/items/storage/wallets.dm b/code/game/objects/items/storage/wallets.dm index ab2d8f35341..9329bc9dc11 100644 --- a/code/game/objects/items/storage/wallets.dm +++ b/code/game/objects/items/storage/wallets.dm @@ -115,10 +115,8 @@ cached_flat_icon = getFlatIcon(src) return cached_flat_icon -/obj/item/storage/wallet/get_examine_string(mob/user, thats = FALSE) - if(front_id) - return "[icon2html(get_cached_flat_icon(), user)] [thats? "That's ":""][get_examine_name(user)]" //displays all overlays in chat - return ..() +/obj/item/storage/wallet/get_examine_icon(mob/user) + return icon2html(get_cached_flat_icon(), user) /obj/item/storage/wallet/proc/update_label() if(front_id) @@ -179,4 +177,3 @@ /obj/item/storage/wallet/money/PopulateContents() for(var/iteration in 1 to pick(3, 4)) new /obj/item/holochip(src, rand(50, 450)) - diff --git a/code/game/objects/items/tail_pin.dm b/code/game/objects/items/tail_pin.dm index 71bd50b1dda..dc2ffaefea0 100644 --- a/code/game/objects/items/tail_pin.dm +++ b/code/game/objects/items/tail_pin.dm @@ -8,7 +8,7 @@ throwforce = 0 throw_speed = 1 custom_materials = list(/datum/material/iron= HALF_SHEET_MATERIAL_AMOUNT) - hitsound = 'sound/weapons/bladeslice.ogg' + hitsound = 'sound/items/weapons/bladeslice.ogg' attack_verb_continuous = list("pokes", "jabs", "pins the tail on") attack_verb_simple = list("poke", "jab") sharpness = SHARP_POINTY @@ -44,6 +44,6 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/party_game, 32) var/list/modifiers = params2list(params) if(!LAZYACCESS(modifiers, ICON_X) || !LAZYACCESS(modifiers, ICON_Y)) return - I.pixel_x = clamp(text2num(LAZYACCESS(modifiers, ICON_X)) - 16, -(world.icon_size/2), world.icon_size/2) - I.pixel_y = clamp(text2num(LAZYACCESS(modifiers, ICON_Y)) - 16, -(world.icon_size/2), world.icon_size/2) + I.pixel_x = clamp(text2num(LAZYACCESS(modifiers, ICON_X)) - 16, -(ICON_SIZE_X/2), ICON_SIZE_X/2) + I.pixel_y = clamp(text2num(LAZYACCESS(modifiers, ICON_Y)) - 16, -(ICON_SIZE_Y/2), ICON_SIZE_Y/2) return TRUE diff --git a/code/game/objects/items/tanks/jetpack.dm b/code/game/objects/items/tanks/jetpack.dm index a7a577c77cf..6976c936b66 100644 --- a/code/game/objects/items/tanks/jetpack.dm +++ b/code/game/objects/items/tanks/jetpack.dm @@ -14,10 +14,16 @@ var/on = FALSE /// If the jetpack will stop when you stop moving var/stabilize = FALSE + /// If the jetpack will have a speedboost in space/nograv or not + var/full_speed = TRUE /// If our jetpack is disabled, from getting EMPd var/disabled = FALSE /// Callback for the jetpack component var/thrust_callback + /// How much force out jetpack can output per tick + var/drift_force = 1.5 NEWTONS + /// How much force this jetpack can output per tick to stabilize the user + var/stabilizer_force = 1.2 NEWTONS /obj/item/tank/jetpack/Initialize(mapload) . = ..() @@ -35,19 +41,27 @@ * Arguments * stabilize - Should this jetpack be stabalized */ -/obj/item/tank/jetpack/proc/configure_jetpack(stabilize) +/obj/item/tank/jetpack/proc/configure_jetpack(stabilize, mob/user = null) src.stabilize = stabilize AddComponent( \ /datum/component/jetpack, \ src.stabilize, \ + drift_force, \ + stabilizer_force, \ COMSIG_JETPACK_ACTIVATED, \ COMSIG_JETPACK_DEACTIVATED, \ JETPACK_ACTIVATION_FAILED, \ thrust_callback, \ - /datum/effect_system/trail_follow/ion \ + /datum/effect_system/trail_follow/ion, \ ) + if (!isnull(user) && user.get_item_by_slot(slot_flags) == src) + if (!stabilize) + ADD_TRAIT(user, TRAIT_NOGRAV_ALWAYS_DRIFT, JETPACK_TRAIT) + else + REMOVE_TRAIT(user, TRAIT_NOGRAV_ALWAYS_DRIFT, JETPACK_TRAIT) + /obj/item/tank/jetpack/item_action_slot_check(slot) if(slot & slot_flags) return TRUE @@ -73,7 +87,7 @@ cycle(user) else if(istype(action, /datum/action/item_action/jetpack_stabilization)) if(on) - configure_jetpack(!stabilize) + configure_jetpack(!stabilize, user) to_chat(user, span_notice("You turn the jetpack stabilization [stabilize ? "on" : "off"].")) else toggle_internals(user) @@ -105,12 +119,19 @@ return FALSE on = TRUE update_icon(UPDATE_ICON_STATE) + if(full_speed) + user.add_movespeed_modifier(/datum/movespeed_modifier/jetpack/full_speed) + if (!stabilize) + ADD_TRAIT(user, TRAIT_NOGRAV_ALWAYS_DRIFT, JETPACK_TRAIT) return TRUE /obj/item/tank/jetpack/proc/turn_off(mob/user) SEND_SIGNAL(src, COMSIG_JETPACK_DEACTIVATED, user) on = FALSE update_icon(UPDATE_ICON_STATE) + if(user) + user.remove_movespeed_modifier(/datum/movespeed_modifier/jetpack/full_speed) + REMOVE_TRAIT(user, TRAIT_NOGRAV_ALWAYS_DRIFT, JETPACK_TRAIT) /obj/item/tank/jetpack/proc/allow_thrust(num, use_fuel = TRUE) if(!ismob(loc)) @@ -168,6 +189,9 @@ worn_icon_state = "jetpack-improvised" volume = 20 //normal jetpacks have 70 volume gas_type = null //it starts empty + full_speed = FALSE + drift_force = 1 NEWTONS + stabilizer_force = 0.5 NEWTONS /obj/item/tank/jetpack/improvised/allow_thrust(num) if(!ismob(loc)) @@ -210,6 +234,8 @@ volume = 90 resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF //steal objective items are hard to destroy. slot_flags = ITEM_SLOT_BACK | ITEM_SLOT_SUITSTORE + drift_force = 2 NEWTONS + stabilizer_force = 2 NEWTONS /obj/item/tank/jetpack/oxygen/security name = "security jetpack (oxygen)" diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm index 9c7138e00de..8a7f18ed2cc 100644 --- a/code/game/objects/items/tanks/tanks.dm +++ b/code/game/objects/items/tanks/tanks.dm @@ -21,9 +21,9 @@ obj_flags = CONDUCTS_ELECTRICITY slot_flags = ITEM_SLOT_BACK worn_icon = 'icons/mob/clothing/back.dmi' //since these can also get thrown into suit storage slots. if something goes on the belt, set this to null. - hitsound = 'sound/weapons/smash.ogg' - pickup_sound = 'sound/items/gas_tank_pick_up.ogg' - drop_sound = 'sound/items/gas_tank_drop.ogg' + hitsound = 'sound/items/weapons/smash.ogg' + pickup_sound = 'sound/items/handling/gas_tank/gas_tank_pick_up.ogg' + drop_sound = 'sound/items/handling/gas_tank/gas_tank_drop.ogg' sound_vary = TRUE pressure_resistance = ONE_ATMOSPHERE * 5 force = 5 @@ -86,13 +86,13 @@ /// Called by carbons after they connect the tank to their breathing apparatus. /obj/item/tank/proc/after_internals_opened(mob/living/carbon/carbon_target) breathing_mob = carbon_target - playsound(loc, 'sound/items/internals_on.ogg', 15, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + playsound(loc, 'sound/items/internals/internals_on.ogg', 15, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) RegisterSignal(carbon_target, COMSIG_MOB_GET_STATUS_TAB_ITEMS, PROC_REF(get_status_tab_item)) /// Called by carbons after they disconnect the tank from their breathing apparatus. /obj/item/tank/proc/after_internals_closed(mob/living/carbon/carbon_target) breathing_mob = null - playsound(loc, 'sound/items/internals_off.ogg', 15, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + playsound(loc, 'sound/items/internals/internals_off.ogg', 15, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) UnregisterSignal(carbon_target, COMSIG_MOB_GET_STATUS_TAB_ITEMS) /obj/item/tank/proc/get_status_tab_item(mob/living/source, list/items) @@ -443,7 +443,7 @@ /obj/item/tank/receive_signal() //This is mainly called by the sensor through sense() to the holder, and from the holder to here. audible_message(span_warning("[icon2html(src, hearers(src))] *beep* *beep* *beep*")) - playsound(src, 'sound/machines/triple_beep.ogg', ASSEMBLY_BEEP_VOLUME, TRUE) + playsound(src, 'sound/machines/beep/triple_beep.ogg', ASSEMBLY_BEEP_VOLUME, TRUE) addtimer(CALLBACK(src, PROC_REF(ignite)), 1 SECONDS) /// Attaches an assembly holder to the tank to create a bomb. diff --git a/code/game/objects/items/tanks/watertank.dm b/code/game/objects/items/tanks/watertank.dm index 15db2a5d3ed..1c23937d2b5 100644 --- a/code/game/objects/items/tanks/watertank.dm +++ b/code/game/objects/items/tanks/watertank.dm @@ -371,7 +371,7 @@ qdel(src) // Please don't spacedrift thanks -/obj/effect/resin_container/newtonian_move(direction, instant = FALSE, start_delay = 0) +/obj/effect/resin_container/newtonian_move(inertia_angle, instant = FALSE, start_delay = 0, drift_force = 0, controlled_cap = null) return TRUE #undef EXTINGUISHER diff --git a/code/game/objects/items/taster.dm b/code/game/objects/items/taster.dm index 599b78971db..cdd67ceae56 100644 --- a/code/game/objects/items/taster.dm +++ b/code/game/objects/items/taster.dm @@ -16,4 +16,4 @@ else var/message = interacting_with.reagents.generate_taste_message(user, taste_sensitivity) to_chat(user, span_notice("[src] tastes [message] in [interacting_with].")) - return ITEM_INTERACT_SUCCESS + return user.combat_mode ? NONE : ITEM_INTERACT_SUCCESS diff --git a/code/game/objects/items/tcg/tcg.dm b/code/game/objects/items/tcg/tcg.dm index 23204b4809f..1f6c334c992 100644 --- a/code/game/objects/items/tcg/tcg.dm +++ b/code/game/objects/items/tcg/tcg.dm @@ -3,7 +3,7 @@ /obj/item/tcgcard name = "Coder" - desc = "Wow, a mint condition coder card! Better tell the Github all about this!" + desc = "Wow, a mint condition coder card! Better tell the GitHub all about this!" icon = DEFAULT_TCG_DMI_ICON icon_state = "runtime" w_class = WEIGHT_CLASS_TINY @@ -332,11 +332,11 @@ GLOBAL_LIST_EMPTY(tcgcard_radial_choices) /obj/item/cardpack name = "Trading Card Pack: Coder" - desc = "Contains six complete fuckups by the coders. Report this on github please!" + desc = "Contains six complete fuckups by the coders. Report this on GitHub please!" icon = 'icons/obj/toys/tcgmisc.dmi' icon_state = "error" w_class = WEIGHT_CLASS_TINY - custom_price = PAYCHECK_CREW * 0.75 //Price reduced from * 2 to * 0.75, this is planned as a temporary measure until card persistance is added. + custom_price = PAYCHECK_CREW * 0.75 //Price reduced from * 2 to * 0.75, this is planned as a temporary measure until card persistence is added. ///The card series to look in var/series = "MEME" ///Chance of the pack having a coin in it out of 10 @@ -351,7 +351,7 @@ GLOBAL_LIST_EMPTY(tcgcard_radial_choices) "epic" = 30, "legendary" = 5, "misprint" = 1) - ///The amount of cards to draw from the guarenteed rarity table + ///The amount of cards to draw from the guaranteed rarity table var/guaranteed_count = 1 ///The guaranteed rarity table, acts about the same as the rarity table. it can have as many or as few raritys as you'd like var/list/guar_rarity = list( @@ -400,7 +400,7 @@ GLOBAL_LIST_EMPTY(tcgcard_radial_choices) new /obj/item/tcgcard(get_turf(user), series, template) to_chat(user, span_notice("Wow! Check out these cards!")) new /obj/effect/decal/cleanable/wrapping(get_turf(user)) - playsound(loc, 'sound/items/poster_ripped.ogg', 20, TRUE) + playsound(loc, 'sound/items/poster/poster_ripped.ogg', 20, TRUE) if(prob(contains_coin)) to_chat(user, span_notice("...and it came with a flipper, too!")) new /obj/item/coin/thunderdome(get_turf(user)) @@ -434,7 +434,7 @@ GLOBAL_LIST_EMPTY(tcgcard_radial_choices) atom_storage.max_total_storage = 120 atom_storage.max_slots = 60 -///Returns a list of cards ids of card_cnt weighted by rarity from the pack's tables that have matching series, with gnt_cnt of the guarenteed table. +///Returns a list of cards ids of card_cnt weighted by rarity from the pack's tables that have matching series, with gnt_cnt of the guaranteed table. /obj/item/cardpack/proc/buildCardListWithRarity(card_cnt, rarity_cnt) var/list/toReturn = list() //You can always get at least one of some rarity @@ -453,7 +453,7 @@ GLOBAL_LIST_EMPTY(tcgcard_radial_choices) weight += rarity_table[chance] var/random = rand(weight) for(var/bracket in rarity_table) - //Steals blatently from pick_weight(), sorry buddy I need the index + //Steals blatantly from pick_weight(), sorry buddy I need the index random -= rarity_table[bracket] if(random <= 0) rarity = bracket @@ -469,12 +469,12 @@ GLOBAL_LIST_EMPTY(tcgcard_radial_choices) log_runtime("The index [rarity] of rarity_table does not exist in the global cache") return toReturn -//All of these values should be overriden by either a template or a card itself +//All of these values should be overridden by either a template or a card itself /datum/card ///Unique ID, for use in lookups and (eventually) for persistence. MAKE SURE THIS IS UNIQUE FOR EACH CARD IN AS SERIES, OR THE ENTIRE SYSTEM WILL BREAK, AND I WILL BE VERY DISAPPOINTED. var/id = "coder" var/name = "Coder" - var/desc = "Wow, a mint condition coder card! Better tell the Github all about this!" + var/desc = "Wow, a mint condition coder card! Better tell the GitHub all about this!" ///This handles any extra rules for the card, i.e. extra attributes, special effects, etc. If you've played any other card game, you know how this works. var/rules = "There are no rules here. There is no escape. No Recall or Intervention can work in this place." var/icon = DEFAULT_TCG_DMI diff --git a/code/game/objects/items/tcg/tcg_machines.dm b/code/game/objects/items/tcg/tcg_machines.dm index 77b6891e4c1..7a55e2e9554 100644 --- a/code/game/objects/items/tcg/tcg_machines.dm +++ b/code/game/objects/items/tcg/tcg_machines.dm @@ -90,7 +90,7 @@ GLOBAL_LIST_EMPTY(tcgcard_machine_radial_choices) /obj/machinery/trading_card_holder/attack_hand_secondary(mob/user) if(isnull(current_summon)) - var/card_name = tgui_input_text(user, "Insert card name", "Blank Card Naming", "blank card", MAX_NAME_LEN) + var/card_name = tgui_input_text(user, "Insert card name", "Blank Card Naming", "blank card", max_length = MAX_NAME_LEN) if(isnull(card_name) || !user.can_perform_action(src)) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN current_summon = new /obj/structure/trading_card_summon/blank(locate(x + summon_offset_x, y + summon_offset_y, z)) diff --git a/code/game/objects/items/teleportation.dm b/code/game/objects/items/teleportation.dm index 8bd7a56d4d0..d3fc2b0803b 100644 --- a/code/game/objects/items/teleportation.dm +++ b/code/game/objects/items/teleportation.dm @@ -344,6 +344,8 @@ var/maximum_teleport_distance = 8 //How far the emergency teleport checks for a safe position var/parallel_teleport_distance = 3 + // How much blood lost per teleport (out of base 560 blood) + var/bleed_amount = 20 /obj/item/syndicate_teleporter/Initialize(mapload) . = ..() @@ -370,7 +372,7 @@ if(ishuman(loc)) var/mob/living/carbon/human/holder = loc balloon_alert(holder, "teleporter beeps") - playsound(src, 'sound/machines/twobeep.ogg', 10, TRUE, extrarange = SILENCED_SOUND_EXTRARANGE, falloff_distance = 0) + playsound(src, 'sound/machines/beep/twobeep.ogg', 10, TRUE, extrarange = SILENCED_SOUND_EXTRARANGE, falloff_distance = 0) /obj/item/syndicate_teleporter/emp_act(severity) . = ..() @@ -432,7 +434,10 @@ charges = max(charges - 1, 0) new /obj/effect/temp_visual/teleport_abductor/syndi_teleporter(current_location) new /obj/effect/temp_visual/teleport_abductor/syndi_teleporter(destination) - make_bloods(current_location, destination, user) + if(make_bloods(current_location, destination, user)) + new /obj/effect/temp_visual/circle_wave/syndi_teleporter/bloody(destination) + else + new /obj/effect/temp_visual/circle_wave/syndi_teleporter(destination) playsound(current_location, SFX_PORTAL_ENTER, 50, 1, SHORT_RANGE_SOUND_EXTRARANGE) playsound(destination, 'sound/effects/phasein.ogg', 25, 1, SHORT_RANGE_SOUND_EXTRARANGE) playsound(destination, SFX_PORTAL_ENTER, 50, 1, SHORT_RANGE_SOUND_EXTRARANGE) @@ -468,11 +473,14 @@ new /obj/effect/temp_visual/teleport_abductor/syndi_teleporter(mobloc) new /obj/effect/temp_visual/teleport_abductor/syndi_teleporter(emergency_destination) balloon_alert(user, "emergency teleport triggered!") - if (!HAS_TRAIT(user, TRAIT_NOBLOOD)) - make_bloods(mobloc, emergency_destination, user) + if(make_bloods(destination, emergency_destination, user)) + new /obj/effect/temp_visual/circle_wave/syndi_teleporter/bloody(destination) + else + new /obj/effect/temp_visual/circle_wave/syndi_teleporter(destination) playsound(mobloc, SFX_PORTAL_ENTER, 50, 1, SHORT_RANGE_SOUND_EXTRARANGE) playsound(emergency_destination, 'sound/effects/phasein.ogg', 25, 1, SHORT_RANGE_SOUND_EXTRARANGE) playsound(emergency_destination, SFX_PORTAL_ENTER, 50, 1, SHORT_RANGE_SOUND_EXTRARANGE) + playsound(src, 'sound/machines/warning-buzzer.ogg', 25, TRUE) else //We tried to save. We failed. Death time. get_fragged(user, destination) @@ -484,7 +492,7 @@ new /obj/effect/temp_visual/teleport_abductor/syndi_teleporter(destination) playsound(mobloc, SFX_PORTAL_ENTER, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) playsound(destination, SFX_PORTAL_ENTER, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - playsound(destination, 'sound/magic/disintegrate.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + playsound(destination, 'sound/effects/magic/disintegrate.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) if(!not_holding_tele) to_chat(victim, span_userdanger("You teleport into [destination], [src] tries to save you, but...")) else @@ -500,16 +508,45 @@ victim.apply_damage(20, BRUTE) victim.Paralyze(6 SECONDS) to_chat(victim, span_warning("[user] teleports into you, knocking you to the floor with the bluespace wave!")) + victim.throw_at(get_step_rand(victim), 1, 1, user, spin = TRUE) ///Bleed and make blood splatters at tele start and end points /obj/item/syndicate_teleporter/proc/make_bloods(turf/old_location, turf/new_location, mob/living/user) + if(HAS_TRAIT(user, TRAIT_NOBLOOD)) + return FALSE user.add_splatter_floor(old_location) user.add_splatter_floor(new_location) if(!iscarbon(user)) - return + return FALSE var/mob/living/carbon/carbon_user = user - carbon_user.bleed(10) + // always lose a bit + carbon_user.bleed(bleed_amount * 0.25) + // sometimes lose a lot + // average evens out to 10 per teleport, but the randomness spices things up + if(prob(25) && bleed_amount) + playsound(src, 'sound/effects/wounds/pierce1.ogg', 40, vary = TRUE) + visible_message(span_warning("Blood visibly spurts out of [user] as [src] fails to teleport [user.p_their()] body properly!"), \ + span_boldwarning("Blood visibly spurts out of you as [src] fails to teleport your body properly!")) + carbon_user.bleed(bleed_amount * 0.75) + carbon_user.spray_blood(pick(GLOB.alldirs), rand(1, 3)) + return TRUE + + return FALSE + // retval used for picking wave type + +/// Visual effect spawned when teleporting +/obj/effect/temp_visual/circle_wave/syndi_teleporter + duration = 0.25 SECONDS + color = COLOR_SYNDIE_RED + max_alpha = 100 + amount_to_scale = 0.8 + +/obj/effect/temp_visual/circle_wave/syndi_teleporter/bloody + duration = 0.25 SECONDS + color = COLOR_VIVID_RED + max_alpha = 160 + amount_to_scale = 1 /obj/item/paper/syndicate_teleporter name = "Teleporter Guide" diff --git a/code/game/objects/items/theft_tools.dm b/code/game/objects/items/theft_tools.dm index e13251fe8e5..a2efbe2d4be 100644 --- a/code/game/objects/items/theft_tools.dm +++ b/code/game/objects/items/theft_tools.dm @@ -187,7 +187,7 @@ if(!isliving(hit_atom)) return ..() var/mob/living/victim = hit_atom - if(victim.incorporeal_move || victim.status_flags & GODMODE) //try to keep this in sync with supermatter's consume fail conditions + if(victim.incorporeal_move || HAS_TRAIT(victim, TRAIT_GODMODE)) //try to keep this in sync with supermatter's consume fail conditions return ..() var/mob/thrower = throwingdatum?.get_thrower() if(thrower) @@ -208,7 +208,7 @@ /obj/item/nuke_core/supermatter_sliver/pickup(mob/living/user) ..() - if(!isliving(user) || user.status_flags & GODMODE) //try to keep this in sync with supermatter's consume fail conditions + if(!isliving(user) || HAS_TRAIT(user, TRAIT_GODMODE)) //try to keep this in sync with supermatter's consume fail conditions return FALSE user.visible_message(span_danger("[user] reaches out and tries to pick up [src]. [user.p_their()] body starts to glow and bursts into flames before flashing into dust!"),\ span_userdanger("You reach for [src] with your hands. That was dumb."),\ @@ -254,7 +254,7 @@ icon_state = "supermatter_scalpel" toolspeed = 0.5 damtype = BURN - usesound = 'sound/weapons/bladeslice.ogg' + usesound = 'sound/items/weapons/bladeslice.ogg' var/usesLeft /obj/item/scalpel/supermatter/Initialize(mapload) @@ -311,7 +311,7 @@ if(!isliving(AM)) return var/mob/living/victim = AM - if(victim.incorporeal_move || victim.status_flags & GODMODE) //try to keep this in sync with supermatter's consume fail conditions + if(victim.incorporeal_move || HAS_TRAIT(victim, TRAIT_GODMODE)) //try to keep this in sync with supermatter's consume fail conditions return victim.investigate_log("has been dusted by [src].", INVESTIGATE_DEATHS) victim.dust() diff --git a/code/game/objects/items/tools/crowbar.dm b/code/game/objects/items/tools/crowbar.dm index 20e3846adef..b98ace86cf0 100644 --- a/code/game/objects/items/tools/crowbar.dm +++ b/code/game/objects/items/tools/crowbar.dm @@ -6,8 +6,8 @@ inhand_icon_state = "crowbar" lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' - usesound = 'sound/items/crowbar.ogg' - operating_sound = 'sound/items/crowbar_prying.ogg' + usesound = 'sound/items/tools/crowbar.ogg' + operating_sound = 'sound/items/tools/crowbar_prying.ogg' obj_flags = CONDUCTS_ELECTRICITY slot_flags = ITEM_SLOT_BELT force = 5 @@ -15,8 +15,8 @@ demolition_mod = 1.25 w_class = WEIGHT_CLASS_SMALL custom_materials = list(/datum/material/iron=SMALL_MATERIAL_AMOUNT*0.5) - drop_sound = 'sound/items/handling/crowbar_drop.ogg' - pickup_sound = 'sound/items/handling/crowbar_pickup.ogg' + drop_sound = 'sound/items/handling/tools/crowbar_drop.ogg' + pickup_sound = 'sound/items/handling/tools/crowbar_pickup.ogg' attack_verb_continuous = list("attacks", "bashes", "batters", "bludgeons", "whacks") attack_verb_simple = list("attack", "bash", "batter", "bludgeon", "whack") @@ -35,7 +35,7 @@ /obj/item/crowbar/suicide_act(mob/living/user) user.visible_message(span_suicide("[user] is beating [user.p_them()]self to death with [src]! It looks like [user.p_theyre()] trying to commit suicide!")) - playsound(loc, 'sound/weapons/genhit.ogg', 50, TRUE, -1) + playsound(loc, 'sound/items/weapons/genhit.ogg', 50, TRUE, -1) return BRUTELOSS /obj/item/crowbar/red @@ -47,7 +47,7 @@ name = "alien crowbar" desc = "A hard-light crowbar. It appears to pry by itself, without any effort required." icon = 'icons/obj/antags/abductor.dmi' - usesound = 'sound/weapons/sonic_jackhammer.ogg' + usesound = 'sound/items/weapons/sonic_jackhammer.ogg' custom_materials = list(/datum/material/iron =SHEET_MATERIAL_AMOUNT * 2.5, /datum/material/silver = SHEET_MATERIAL_AMOUNT*1.25, /datum/material/plasma =HALF_SHEET_MATERIAL_AMOUNT, /datum/material/titanium =SHEET_MATERIAL_AMOUNT, /datum/material/diamond =SHEET_MATERIAL_AMOUNT) icon_state = "crowbar" belt_icon_state = "crowbar_alien" @@ -115,7 +115,7 @@ lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT*2.25, /datum/material/silver = SHEET_MATERIAL_AMOUNT*1.25, /datum/material/titanium = SHEET_MATERIAL_AMOUNT*1.75) - usesound = 'sound/items/jaws_pry.ogg' + usesound = 'sound/items/tools/jaws_pry.ogg' force = 15 w_class = WEIGHT_CLASS_NORMAL toolspeed = 0.7 @@ -152,7 +152,7 @@ tool_behaviour = (active ? TOOL_WIRECUTTER : TOOL_CROWBAR) if(user) balloon_alert(user, "attached [active ? "cutting" : "prying"]") - playsound(src, 'sound/items/change_jaws.ogg', 50, TRUE) + playsound(src, 'sound/items/tools/change_jaws.ogg', 50, TRUE) if(tool_behaviour == TOOL_CROWBAR) RemoveElement(/datum/element/cuffsnapping, snap_time_weak_handcuffs, snap_time_strong_handcuffs) else @@ -174,10 +174,10 @@ /obj/item/crowbar/power/suicide_act(mob/living/user) if(tool_behaviour == TOOL_CROWBAR) user.visible_message(span_suicide("[user] is putting [user.p_their()] head in [src], it looks like [user.p_theyre()] trying to commit suicide!")) - playsound(loc, 'sound/items/jaws_pry.ogg', 50, TRUE, -1) + playsound(loc, 'sound/items/tools/jaws_pry.ogg', 50, TRUE, -1) else user.visible_message(span_suicide("[user] is wrapping \the [src] around [user.p_their()] neck. It looks like [user.p_theyre()] trying to rip [user.p_their()] head off!")) - playsound(loc, 'sound/items/jaws_cut.ogg', 50, TRUE, -1) + playsound(loc, 'sound/items/tools/jaws_cut.ogg', 50, TRUE, -1) if(iscarbon(user)) var/mob/living/carbon/suicide_victim = user var/obj/item/bodypart/target_bodypart = suicide_victim.get_bodypart(BODY_ZONE_HEAD) @@ -192,7 +192,7 @@ icon = 'icons/obj/items_cyborg.dmi' icon_state = "toolkit_engiborg_crowbar" worn_icon_state = "toolkit_engiborg_crowbar" //error sprite - this shouldn't have been dropped - usesound = 'sound/items/jaws_pry.ogg' + usesound = 'sound/items/tools/jaws_pry.ogg' force = 10 toolspeed = 0.5 @@ -234,7 +234,7 @@ user.log_message("tried to pry open [mech], located at [loc_name(mech)], which is currently occupied by [mech.occupants.Join(", ")].", LOG_ATTACK) var/mech_dir = mech.dir mech.balloon_alert(user, "prying open...") - playsound(mech, 'sound/machines/airlock_alien_prying.ogg', 100, TRUE) + playsound(mech, 'sound/machines/airlock/airlock_alien_prying.ogg', 100, TRUE) if(!use_tool(mech, user, (mech.mecha_flags & IS_ENCLOSED) ? 5 SECONDS : 3 SECONDS, volume = 0, extra_checks = CALLBACK(src, PROC_REF(extra_checks), mech, mech_dir))) mech.balloon_alert(user, "interrupted!") return @@ -243,7 +243,7 @@ if(isAI(occupant)) continue mech.mob_exit(occupant, randomstep = TRUE) - playsound(mech, 'sound/machines/airlockforced.ogg', 75, TRUE) + playsound(mech, 'sound/machines/airlock/airlockforced.ogg', 75, TRUE) /obj/item/crowbar/mechremoval/proc/extra_checks(obj/vehicle/sealed/mecha/mech, mech_dir) return HAS_TRAIT(src, TRAIT_WIELDED) && LAZYLEN(mech.occupants) && mech.dir == mech_dir diff --git a/code/game/objects/items/tools/screwdriver.dm b/code/game/objects/items/tools/screwdriver.dm index b9e0d15e69f..8cf9005d191 100644 --- a/code/game/objects/items/tools/screwdriver.dm +++ b/code/game/objects/items/tools/screwdriver.dm @@ -20,14 +20,14 @@ custom_materials = list(/datum/material/iron=SMALL_MATERIAL_AMOUNT*0.75) attack_verb_continuous = list("stabs") attack_verb_simple = list("stab") - hitsound = 'sound/weapons/bladeslice.ogg' - usesound = list('sound/items/screwdriver.ogg', 'sound/items/screwdriver2.ogg') - operating_sound = 'sound/items/screwdriver_operating.ogg' + hitsound = 'sound/items/weapons/bladeslice.ogg' + usesound = list('sound/items/tools/screwdriver.ogg', 'sound/items/tools/screwdriver2.ogg') + operating_sound = 'sound/items/tools/screwdriver_operating.ogg' tool_behaviour = TOOL_SCREWDRIVER toolspeed = 1 armor_type = /datum/armor/item_screwdriver - drop_sound = 'sound/items/handling/screwdriver_drop.ogg' - pickup_sound = 'sound/items/handling/screwdriver_pickup.ogg' + drop_sound = 'sound/items/handling/tools/screwdriver_drop.ogg' + pickup_sound = 'sound/items/handling/tools/screwdriver_pickup.ogg' sharpness = SHARP_POINTY greyscale_config = /datum/greyscale_config/screwdriver greyscale_config_inhand_left = /datum/greyscale_config/screwdriver_inhand_left @@ -68,7 +68,7 @@ icon_state = "screwdriver_a" inhand_icon_state = "screwdriver_nuke" custom_materials = list(/datum/material/iron=HALF_SHEET_MATERIAL_AMOUNT*5, /datum/material/silver=SHEET_MATERIAL_AMOUNT*1.25, /datum/material/plasma =HALF_SHEET_MATERIAL_AMOUNT, /datum/material/titanium =SHEET_MATERIAL_AMOUNT, /datum/material/diamond =SHEET_MATERIAL_AMOUNT) - usesound = 'sound/items/pshoom.ogg' + usesound = 'sound/items/pshoom/pshoom.ogg' toolspeed = 0.1 random_color = FALSE greyscale_config_inhand_left = null @@ -93,8 +93,8 @@ throw_range = 3//it's heavier than a screw driver/wrench, so it does more damage, but can't be thrown as far attack_verb_continuous = list("drills", "screws", "jabs", "whacks") attack_verb_simple = list("drill", "screw", "jab", "whack") - hitsound = 'sound/items/drill_hit.ogg' - usesound = 'sound/items/drill_use.ogg' + hitsound = 'sound/items/tools/drill_hit.ogg' + usesound = 'sound/items/tools/drill_use.ogg' w_class = WEIGHT_CLASS_NORMAL toolspeed = 0.7 random_color = FALSE @@ -130,7 +130,7 @@ tool_behaviour = (active ? TOOL_WRENCH : TOOL_SCREWDRIVER) if(user) balloon_alert(user, "attached [active ? "bolt bit" : "screw bit"]") - playsound(src, 'sound/items/change_drill.ogg', 50, TRUE) + playsound(src, 'sound/items/tools/change_drill.ogg', 50, TRUE) return COMPONENT_NO_DEFAULT_MESSAGE /obj/item/screwdriver/power/examine() @@ -142,7 +142,7 @@ user.visible_message(span_suicide("[user] is putting [src] to [user.p_their()] temple. It looks like [user.p_theyre()] trying to commit suicide!")) else user.visible_message(span_suicide("[user] is pressing [src] against [user.p_their()] head! It looks like [user.p_theyre()] trying to commit suicide!")) - playsound(loc, 'sound/items/drill_use.ogg', 50, TRUE, -1) + playsound(loc, 'sound/items/tools/drill_use.ogg', 50, TRUE, -1) return BRUTELOSS /obj/item/screwdriver/cyborg @@ -150,8 +150,8 @@ desc = "A powerful automated screwdriver, designed to be both precise and quick." icon = 'icons/obj/items_cyborg.dmi' icon_state = "toolkit_engiborg_screwdriver" - hitsound = 'sound/items/drill_hit.ogg' - usesound = 'sound/items/drill_use.ogg' + hitsound = 'sound/items/tools/drill_hit.ogg' + usesound = 'sound/items/tools/drill_use.ogg' toolspeed = 0.5 random_color = FALSE diff --git a/code/game/objects/items/tools/spess_knife.dm b/code/game/objects/items/tools/spess_knife.dm index 9fd5dbb0158..4019aa41c70 100644 --- a/code/game/objects/items/tools/spess_knife.dm +++ b/code/game/objects/items/tools/spess_knife.dm @@ -68,7 +68,7 @@ update_tool_parameters() update_appearance(UPDATE_ICON_STATE) - playsound(src, 'sound/weapons/empty.ogg', 50, TRUE) + playsound(src, 'sound/items/weapons/empty.ogg', 50, TRUE) /// Used to pick random tool behavior for the knife /obj/item/spess_knife/proc/pick_tool() diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm index bdbaacf83d9..017a79e5d0f 100644 --- a/code/game/objects/items/tools/weldingtool.dm +++ b/code/game/objects/items/tools/weldingtool.dm @@ -1,5 +1,3 @@ -/// How many seconds between each fuel depletion tick ("use" proc) -#define WELDER_FUEL_BURN_INTERVAL 5 /obj/item/weldingtool name = "welding tool" desc = "A standard edition welder provided by Nanotrasen." @@ -14,9 +12,9 @@ force = 3 throwforce = 5 hitsound = SFX_SWING_HIT - usesound = list('sound/items/welder.ogg', 'sound/items/welder2.ogg') - drop_sound = 'sound/items/handling/weldingtool_drop.ogg' - pickup_sound = 'sound/items/handling/weldingtool_pickup.ogg' + usesound = list('sound/items/tools/welder.ogg', 'sound/items/tools/welder2.ogg') + drop_sound = 'sound/items/handling/tools/weldingtool_drop.ogg' + pickup_sound = 'sound/items/handling/tools/weldingtool_pickup.ogg' light_system = OVERLAY_LIGHT light_range = 2 light_power = 1.5 @@ -48,8 +46,8 @@ /// When fuel was last removed. var/burned_fuel_for = 0 - var/activation_sound = 'sound/items/welderactivate.ogg' - var/deactivation_sound = 'sound/items/welderdeactivate.ogg' + var/activation_sound = 'sound/items/tools/welderactivate.ogg' + var/deactivation_sound = 'sound/items/tools/welderdeactivate.ogg' /datum/armor/item_weldingtool fire = 100 @@ -89,7 +87,7 @@ force = 15 damtype = BURN burned_fuel_for += seconds_per_tick - if(burned_fuel_for >= WELDER_FUEL_BURN_INTERVAL) + if(burned_fuel_for >= TOOL_FUEL_BURN_INTERVAL) use(TRUE) update_appearance() @@ -244,7 +242,7 @@ playsound(loc, activation_sound, 50, TRUE) force = 15 damtype = BURN - hitsound = 'sound/items/welder.ogg' + hitsound = 'sound/items/tools/welder.ogg' update_appearance() START_PROCESSING(SSobj, src) else @@ -276,16 +274,17 @@ return welding /// If welding tool ran out of fuel during a construction task, construction fails. -/obj/item/weldingtool/tool_use_check(mob/living/user, amount) +/obj/item/weldingtool/tool_use_check(mob/living/user, amount, heat_required) if(!isOn() || !check_fuel()) to_chat(user, span_warning("[src] has to be on to complete this task!")) return FALSE - - if(get_fuel() >= amount) - return TRUE - else + if(get_fuel() < amount) to_chat(user, span_warning("You need more welding fuel to complete this task!")) return FALSE + if(heat < heat_required) + to_chat(user, span_warning("[src] is not hot enough to complete this task!")) + return FALSE + return TRUE /// Ran when the welder is attacked by a screwdriver. /obj/item/weldingtool/proc/flamethrower_screwdriver(obj/item/tool, mob/user) diff --git a/code/game/objects/items/tools/wirecutters.dm b/code/game/objects/items/tools/wirecutters.dm index 380ff539b2b..4865ef561f4 100644 --- a/code/game/objects/items/tools/wirecutters.dm +++ b/code/game/objects/items/tools/wirecutters.dm @@ -22,11 +22,11 @@ custom_materials = list(/datum/material/iron=SMALL_MATERIAL_AMOUNT*0.8) attack_verb_continuous = list("pinches", "nips") attack_verb_simple = list("pinch", "nip") - hitsound = 'sound/items/wirecutter.ogg' - usesound = 'sound/items/wirecutter.ogg' - operating_sound = 'sound/items/wirecutter_cut.ogg' - drop_sound = 'sound/items/handling/wirecutter_drop.ogg' - pickup_sound = 'sound/items/handling/wirecutter_pickup.ogg' + hitsound = 'sound/items/tools/wirecutter.ogg' + usesound = 'sound/items/tools/wirecutter.ogg' + operating_sound = 'sound/items/tools/wirecutter_cut.ogg' + drop_sound = 'sound/items/handling/tools/wirecutter_drop.ogg' + pickup_sound = 'sound/items/handling/tools/wirecutter_pickup.ogg' tool_behaviour = TOOL_WIRECUTTER toolspeed = 1 armor_type = /datum/armor/item_wirecutters diff --git a/code/game/objects/items/tools/wrench.dm b/code/game/objects/items/tools/wrench.dm index aa72b5d257a..41b4556ebac 100644 --- a/code/game/objects/items/tools/wrench.dm +++ b/code/game/objects/items/tools/wrench.dm @@ -13,11 +13,11 @@ throwforce = 7 demolition_mod = 1.25 w_class = WEIGHT_CLASS_SMALL - usesound = 'sound/items/ratchet.ogg' - operating_sound = list('sound/items/ratchet_fast.ogg', 'sound/items/ratchet_slow.ogg') + usesound = 'sound/items/tools/ratchet.ogg' + operating_sound = list('sound/items/tools/ratchet_fast.ogg', 'sound/items/tools/ratchet_slow.ogg') custom_materials = list(/datum/material/iron=SMALL_MATERIAL_AMOUNT*1.5) - drop_sound = 'sound/items/handling/wrench_drop.ogg' - pickup_sound = 'sound/items/handling/wrench_pickup.ogg' + drop_sound = 'sound/items/handling/tools/wrench_drop.ogg' + pickup_sound = 'sound/items/handling/tools/wrench_pickup.ogg' attack_verb_continuous = list("bashes", "batters", "bludgeons", "whacks") attack_verb_simple = list("bash", "batter", "bludgeon", "whack") @@ -35,7 +35,7 @@ /obj/item/wrench/suicide_act(mob/living/user) user.visible_message(span_suicide("[user] is beating [user.p_them()]self to death with [src]! It looks like [user.p_theyre()] trying to commit suicide!")) - playsound(loc, 'sound/weapons/genhit.ogg', 50, TRUE, -1) + playsound(loc, 'sound/items/weapons/genhit.ogg', 50, TRUE, -1) return BRUTELOSS /obj/item/wrench/abductor @@ -124,7 +124,7 @@ tool_behaviour = active ? TOOL_WRENCH : initial(tool_behaviour) if(user) balloon_alert(user, "[name] [active ? "active, woe!":"restrained"]") - playsound(src, active ? 'sound/weapons/saberon.ogg' : 'sound/weapons/saberoff.ogg', 5, TRUE) + playsound(src, active ? 'sound/items/weapons/saberon.ogg' : 'sound/items/weapons/saberoff.ogg', 5, TRUE) return COMPONENT_NO_DEFAULT_MESSAGE /obj/item/wrench/bolter diff --git a/code/game/objects/items/toy_mechs.dm b/code/game/objects/items/toy_mechs.dm index d08deec62e3..9aa8ef8ea02 100644 --- a/code/game/objects/items/toy_mechs.dm +++ b/code/game/objects/items/toy_mechs.dm @@ -129,7 +129,7 @@ to_chat(user, span_notice("You play with [src].")) timer = world.time + cooldown if(!quiet) - playsound(user, 'sound/mecha/mechstep.ogg', 20, TRUE) + playsound(user, 'sound/vehicles/mecha/mechstep.ogg', 20, TRUE) else . = ..() @@ -193,7 +193,7 @@ to_chat(user, span_notice("You telekinetically play with [src].")) timer = world.time + cooldown if(!quiet) - playsound(user, 'sound/mecha/mechstep.ogg', 20, TRUE) + playsound(user, 'sound/vehicles/mecha/mechstep.ogg', 20, TRUE) return COMPONENT_CANCEL_ATTACK_CHAIN @@ -224,12 +224,12 @@ switch(i) if(1, 3) SpinAnimation(5, 0) - playsound(src, 'sound/mecha/mechstep.ogg', 30, TRUE) + playsound(src, 'sound/vehicles/mecha/mechstep.ogg', 30, TRUE) user.adjustBruteLoss(25) user.adjustStaminaLoss(50) if(2) user.SpinAnimation(5, 0) - playsound(user, 'sound/weapons/smash.ogg', 20, TRUE) + playsound(user, 'sound/items/weapons/smash.ogg', 20, TRUE) combat_health-- //we scratched it! if(4) say(special_attack_cry + "!!") @@ -330,7 +330,7 @@ span_danger("You begin charging [attacker]'s special attack!")) else //just attack attacker.SpinAnimation(5, 0) - playsound(attacker, 'sound/mecha/mechstep.ogg', 30, TRUE) + playsound(attacker, 'sound/vehicles/mecha/mechstep.ogg', 30, TRUE) combat_health-- attacker_controller.visible_message(span_danger("[attacker] devastates [src]!"), \ span_danger("You ram [attacker] into [src]!"), \ @@ -357,7 +357,7 @@ span_danger("[src] and [attacker] clash dramatically, causing sparks to fly!"), \ span_hear("You hear hard plastic rubbing against hard plastic."), COMBAT_MESSAGE_RANGE) if(5) //both win - playsound(attacker, 'sound/weapons/parry.ogg', 20, TRUE) + playsound(attacker, 'sound/items/weapons/parry.ogg', 20, TRUE) if(prob(50)) attacker_controller.visible_message(span_danger("[src]'s attack deflects off of [attacker]."), \ span_danger("[src]'s attack deflects off of [attacker]."), \ @@ -374,7 +374,7 @@ span_danger("You begin charging [src]'s special attack!")) else //just attack SpinAnimation(5, 0) - playsound(src, 'sound/mecha/mechstep.ogg', 30, TRUE) + playsound(src, 'sound/vehicles/mecha/mechstep.ogg', 30, TRUE) attacker.combat_health-- src_controller.visible_message(span_danger("[src] smashes [attacker]!"), \ span_danger("You smash [src] into [attacker]!"), \ @@ -476,14 +476,14 @@ switch(special_attack_type) if(SPECIAL_ATTACK_DAMAGE) //+2 damage victim.combat_health-=2 - playsound(src, 'sound/weapons/marauder.ogg', 20, TRUE) + playsound(src, 'sound/items/weapons/marauder.ogg', 20, TRUE) if(SPECIAL_ATTACK_HEAL) //+2 healing combat_health+=2 - playsound(src, 'sound/mecha/mech_shield_raise.ogg', 20, TRUE) + playsound(src, 'sound/vehicles/mecha/mech_shield_raise.ogg', 20, TRUE) if(SPECIAL_ATTACK_UTILITY) //+1 heal, +1 damage victim.combat_health-- combat_health++ - playsound(src, 'sound/mecha/mechmove01.ogg', 30, TRUE) + playsound(src, 'sound/vehicles/mecha/mechmove01.ogg', 30, TRUE) if(SPECIAL_ATTACK_OTHER) //other super_special_attack(victim) else @@ -571,7 +571,7 @@ special_attack_cry = "MEGA HORN" /obj/item/toy/mecha/honk/super_special_attack(obj/item/toy/mecha/victim) - playsound(src, 'sound/machines/honkbot_evil_laugh.ogg', 20, TRUE) + playsound(src, 'sound/mobs/non-humanoids/honkbot/honkbot_evil_laugh.ogg', 20, TRUE) victim.special_attack_cooldown += 3 //Adds cooldown to the other mech and gives a minor self heal combat_health++ @@ -605,7 +605,7 @@ special_attack_cry = "KILLER CLAMP" /obj/item/toy/mecha/deathripley/super_special_attack(obj/item/toy/mecha/victim) - playsound(src, 'sound/weapons/sonic_jackhammer.ogg', 20, TRUE) + playsound(src, 'sound/items/weapons/sonic_jackhammer.ogg', 20, TRUE) if(victim.combat_health < combat_health) //Instantly kills the other mech if its health is below ours. say("EXECUTE!!") victim.combat_health = 0 diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 1c82bffbf7c..6f47661d93a 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -199,7 +199,7 @@ return ..() /obj/item/toy/balloon/proc/pop_balloon(monkey_pop = FALSE) - playsound(src, 'sound/effects/cartoon_pop.ogg', 50, vary = TRUE) + playsound(src, 'sound/effects/cartoon_sfx/cartoon_pop.ogg', 50, vary = TRUE) if(monkey_pop) // Monkeys make money from popping bloons new /obj/item/coin/iron(get_turf(src)) qdel(src) @@ -398,7 +398,7 @@ /obj/item/toy/captainsaid/attack_self(mob/living/user) current_mode++ - playsound(src, 'sound/items/screwdriver2.ogg', 50, vary = TRUE) + playsound(src, 'sound/items/tools/screwdriver2.ogg', 50, vary = TRUE) if (current_mode <= modes.len) balloon_alert(user, "set to [current_mode]") else @@ -531,9 +531,9 @@ src.add_fingerprint(user) if (src.bullets < 1) user.show_message(span_warning("*click*"), MSG_AUDIBLE) - playsound(src, 'sound/weapons/gun/revolver/dry_fire.ogg', 30, TRUE) + playsound(src, 'sound/items/weapons/gun/revolver/dry_fire.ogg', 30, TRUE) return ITEM_INTERACT_SUCCESS - playsound(user, 'sound/weapons/gun/revolver/shot.ogg', 100, TRUE) + playsound(user, 'sound/items/weapons/gun/revolver/shot.ogg', 100, TRUE) src.bullets-- user.visible_message(span_danger("[user] fires [src] at [interacting_with]!"), \ span_danger("You fire [src] at [interacting_with]!"), \ @@ -606,7 +606,7 @@ if(user) balloon_alert(user, "[active ? "flicked out":"pushed in"] [src]") - playsound(src, active ? 'sound/weapons/saberon.ogg' : 'sound/weapons/saberoff.ogg', 20, TRUE) + playsound(src, active ? 'sound/items/weapons/saberon.ogg' : 'sound/items/weapons/saberoff.ogg', 20, TRUE) update_appearance(UPDATE_ICON) return COMPONENT_NO_DEFAULT_MESSAGE @@ -697,9 +697,9 @@ inhand_icon_state = "artistic_toolbox" lefthand_file = 'icons/mob/inhands/equipment/toolbox_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/toolbox_righthand.dmi' - hitsound = 'sound/weapons/smash.ogg' - drop_sound = 'sound/items/handling/toolbox_drop.ogg' - pickup_sound = 'sound/items/handling/toolbox_pickup.ogg' + hitsound = 'sound/items/weapons/smash.ogg' + drop_sound = 'sound/items/handling/toolbox/toolbox_drop.ogg' + pickup_sound = 'sound/items/handling/toolbox/toolbox_pickup.ogg' attack_verb_continuous = list("robusts") attack_verb_simple = list("robust") var/active = FALSE @@ -747,7 +747,7 @@ active = FALSE update_appearance() visible_message(span_warning("[src] slowly stops rattling and falls still, its latch snapping shut.")) //subtle difference - playsound(loc, 'sound/weapons/batonextend.ogg', 100, TRUE) + playsound(loc, 'sound/items/weapons/batonextend.ogg', 100, TRUE) animate(src, transform = matrix()) /* @@ -790,7 +790,7 @@ w_class = WEIGHT_CLASS_NORMAL attack_verb_continuous = list("attacks", "slashes", "stabs", "slices") attack_verb_simple = list("attack", "slash", "stab", "slice") - hitsound = 'sound/weapons/bladeslice.ogg' + hitsound = 'sound/items/weapons/bladeslice.ogg' /* * Snap pops @@ -963,7 +963,7 @@ cooldown = world.time + 600 user.audible_message(span_hear("You hear the click of a button."), self_message = span_notice("You activate [src], it plays a loud noise!")) sleep(0.5 SECONDS) - playsound(src, 'sound/machines/alarm.ogg', 20, FALSE) + playsound(src, 'sound/announcer/alarm/nuke_alarm.ogg', 20, FALSE) sleep(14 SECONDS) user.visible_message(span_alert("[src] violently explodes!")) explosion(src, light_impact_range = 1) @@ -973,7 +973,7 @@ user.visible_message(span_warning("[user] presses a button on [src]."), span_notice("You activate [src], it plays a loud noise!"), span_hear("You hear the click of a button.")) sleep(0.5 SECONDS) icon_state = "nuketoy" - playsound(src, 'sound/machines/alarm.ogg', 20, FALSE) + playsound(src, 'sound/announcer/alarm/nuke_alarm.ogg', 20, FALSE) sleep(13.5 SECONDS) icon_state = "nuketoycool" sleep(cooldown - world.time) @@ -1032,7 +1032,7 @@ if (cooldown < world.time) cooldown = (world.time + 300) // Sets cooldown at 30 seconds user.visible_message(span_warning("[user] presses the big red button."), span_notice("You press the button, it plays a loud noise!"), span_hear("The button clicks loudly.")) - playsound(src, 'sound/effects/explosionfar.ogg', 50, FALSE) + playsound(src, 'sound/effects/explosion/explosionfar.ogg', 50, FALSE) for(var/mob/M in urange(10, src)) // Checks range if(!M.stat && !isAI(M)) // Checks to make sure whoever's getting shaken is alive/not the AI // Short delay to match up with the explosion sound @@ -1104,7 +1104,7 @@ if (cooldown < world.time) cooldown = world.time + 1800 //3 minutes user.visible_message(span_warning("[user] rotates a cogwheel on [src]."), span_notice("You rotate a cogwheel on [src], it plays a loud noise!"), span_hear("You hear cogwheels turning.")) - playsound(src, 'sound/magic/clockwork/ark_activation.ogg', 50, FALSE) + playsound(src, 'sound/effects/magic/clockwork/ark_activation.ogg', 50, FALSE) else to_chat(user, span_alert("The cogwheels are already turning!")) @@ -1134,7 +1134,6 @@ name = "xenomorph action figure" desc = "MEGA presents the new Xenos Isolated action figure! Comes complete with realistic sounds! Pull back string to use." w_class = WEIGHT_CLASS_SMALL - item_flags = XENOMORPH_HOLDABLE var/cooldown = 0 /obj/item/toy/toy_xeno/attack_self(mob/user) @@ -1144,7 +1143,7 @@ icon_state = "[initial(icon_state)]_used" sleep(0.5 SECONDS) audible_message(span_danger("[icon2html(src, viewers(src))] Hiss!")) - var/list/possible_sounds = list('sound/voice/hiss1.ogg', 'sound/voice/hiss2.ogg', 'sound/voice/hiss3.ogg', 'sound/voice/hiss4.ogg') + var/list/possible_sounds = list('sound/mobs/non-humanoids/hiss/hiss1.ogg', 'sound/mobs/non-humanoids/hiss/hiss2.ogg', 'sound/mobs/non-humanoids/hiss/hiss3.ogg', 'sound/mobs/non-humanoids/hiss/hiss4.ogg') var/chosen_sound = pick(possible_sounds) playsound(get_turf(src), chosen_sound, 50, TRUE) addtimer(VARSET_CALLBACK(src, icon_state, "[initial(icon_state)]"), 4.5 SECONDS) @@ -1216,7 +1215,7 @@ name = "\improper Cyborg action figure" icon_state = "borg" toysay = "I. LIVE. AGAIN." - toysound = 'sound/voice/liveagain.ogg' + toysound = 'sound/mobs/non-humanoids/cyborg/liveagain.ogg' /obj/item/toy/figure/botanist name = "\improper Botanist action figure" @@ -1359,7 +1358,7 @@ name = "\improper Wizard action figure" icon_state = "wizard" toysay = "EI NATH!" - toysound = 'sound/magic/disintegrate.ogg' + toysound = 'sound/effects/magic/disintegrate.ogg' /obj/item/toy/figure/rd name = "\improper Research Director action figure" @@ -1370,13 +1369,13 @@ name = "\improper Roboticist action figure" icon_state = "roboticist" toysay = "Big stompy mechs!" - toysound = 'sound/mecha/mechstep.ogg' + toysound = 'sound/vehicles/mecha/mechstep.ogg' /obj/item/toy/figure/scientist name = "\improper Scientist action figure" icon_state = "scientist" toysay = "I call ordnance." - toysound = 'sound/effects/explosionfar.ogg' + toysound = 'sound/effects/explosion/explosionfar.ogg' /obj/item/toy/figure/syndie name = "\improper Nuclear Operative action figure" @@ -1405,7 +1404,7 @@ //Add changing looks when i feel suicidal about making 20 inhands for these. /obj/item/toy/dummy/attack_self(mob/user) - var/new_name = tgui_input_text(usr, "What would you like to name the dummy?", "Doll Name", doll_name, MAX_NAME_LEN) + var/new_name = tgui_input_text(usr, "What would you like to name the dummy?", "Doll Name", doll_name, max_length = MAX_NAME_LEN) if(!new_name || !user.is_holding(src)) return doll_name = new_name @@ -1461,7 +1460,7 @@ /obj/item/toy/braintoy/attack_self(mob/user) if(cooldown <= world.time) cooldown = (world.time + 10) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(playsound), src, 'sound/effects/blobattack.ogg', 50, FALSE), 0.5 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(playsound), src, 'sound/effects/blob/blobattack.ogg', 50, FALSE), 0.5 SECONDS) /* * Eldritch Toys @@ -1563,7 +1562,7 @@ GLOBAL_LIST_EMPTY(intento_players) #define DISARM "disarm" #define GRAB "grab" #define HARM "harm" -#define ICON_SPLIT world.icon_size/2 +#define ICON_SPLIT ICON_SIZE_ALL/2 // These states do not have any associated processing. #define STATE_AWAITING_PLAYER_INPUT "awaiting_player_input" @@ -1638,7 +1637,7 @@ GLOBAL_LIST_EMPTY(intento_players) /obj/item/toy/intento/proc/boot() say("Game starting!") - playsound(src, 'sound/machines/synth_yes.ogg', 50, FALSE) + playsound(src, 'sound/machines/synth/synth_yes.ogg', 50, FALSE) state = STATE_STARTING COOLDOWN_START(src, next_process, TIME_TO_BEGIN) @@ -1717,7 +1716,7 @@ GLOBAL_LIST_EMPTY(intento_players) user.client.give_award(/datum/award/score/intento_score, user, award_score) say("GAME OVER. Your score was [score]!") - playsound(src, 'sound/machines/synth_no.ogg', 50, FALSE) + playsound(src, 'sound/machines/synth/synth_no.ogg', 50, FALSE) if(user && loc == user && obj_flags & EMAGGED) ADD_TRAIT(src, TRAIT_NODROP, type) diff --git a/code/game/objects/items/wall_mounted.dm b/code/game/objects/items/wall_mounted.dm index ef19205cf80..2db970b556a 100644 --- a/code/game/objects/items/wall_mounted.dm +++ b/code/game/objects/items/wall_mounted.dm @@ -61,9 +61,9 @@ /obj/item/wallframe/screwdriver_act(mob/living/user, obj/item/tool) // For camera-building borgs - var/turf/T = get_step(get_turf(user), user.dir) - if(iswallturf(T)) - T.attackby(src, user) + var/turf/wall_turf = get_step(get_turf(user), user.dir) + if(iswallturf(wall_turf)) + wall_turf.item_interaction(user, src) return ITEM_INTERACT_SUCCESS /obj/item/wallframe/wrench_act(mob/living/user, obj/item/tool) diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index 821f994a1ed..bddc056b99e 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -67,7 +67,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 . = "A sacred weapon of the higher castes from the clown planet, used to strike fear into the hearts of their foes. Wield it with care." /obj/item/balloon_mallet/attack(mob/living/target, mob/living/user) - playsound(loc, 'sound/creatures/clown/hehe.ogg', 20) + playsound(loc, 'sound/mobs/non-humanoids/clown/hehe.ogg', 20) if (!isliving(target)) return switch(target.mob_mood.sanity) @@ -94,7 +94,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 force = 2 throwforce = 1 w_class = WEIGHT_CLASS_NORMAL - hitsound = 'sound/weapons/bladeslice.ogg' + hitsound = 'sound/items/weapons/bladeslice.ogg' attack_verb_continuous = list("attacks", "slashes", "stabs", "slices", "tears", "lacerates", "rips", "dices", "cuts") attack_verb_simple = list("attack", "slash", "stab", "slice", "tear", "lacerate", "rip", "dice", "cut") @@ -111,7 +111,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 inhand_icon_state = "claymore" lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' - hitsound = 'sound/weapons/bladeslice.ogg' + hitsound = 'sound/items/weapons/bladeslice.ogg' obj_flags = CONDUCTS_ELECTRICITY slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_BACK force = 40 @@ -120,7 +120,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 attack_verb_continuous = list("attacks", "slashes", "stabs", "slices", "tears", "lacerates", "rips", "dices", "cuts") attack_verb_simple = list("attack", "slash", "stab", "slice", "tear", "lacerate", "rip", "dice", "cut") block_chance = 50 - block_sound = 'sound/weapons/parry.ogg' + block_sound = 'sound/items/weapons/parry.ogg' sharpness = SHARP_EDGED max_integrity = 200 armor_type = /datum/armor/item_claymore @@ -332,7 +332,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 user.update_held_items() name = new_name - playsound(user, 'sound/items/screwdriver2.ogg', 50, TRUE) + playsound(user, 'sound/items/tools/screwdriver2.ogg', 50, TRUE) /obj/item/claymore/highlander/robot //BLOODTHIRSTY BORGS NOW COME IN PLAID icon = 'icons/obj/items_cyborg.dmi' @@ -363,11 +363,11 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 force = 40 throwforce = 10 w_class = WEIGHT_CLASS_HUGE - hitsound = 'sound/weapons/bladeslice.ogg' + hitsound = 'sound/items/weapons/bladeslice.ogg' attack_verb_continuous = list("attacks", "slashes", "stabs", "slices", "tears", "lacerates", "rips", "dices", "cuts") attack_verb_simple = list("attack", "slash", "stab", "slice", "tear", "lacerate", "rip", "dice", "cut") block_chance = 50 - block_sound = 'sound/weapons/parry.ogg' + block_sound = 'sound/items/weapons/parry.ogg' sharpness = SHARP_EDGED max_integrity = 200 armor_type = /datum/armor/item_katana @@ -447,7 +447,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 throw_speed = 3 throw_range = 6 custom_materials = list(/datum/material/iron= SHEET_MATERIAL_AMOUNT * 6) - hitsound = 'sound/weapons/genhit.ogg' + hitsound = 'sound/items/weapons/genhit.ogg' attack_verb_continuous = list("stubs", "pokes") attack_verb_simple = list("stub", "poke") resistance_flags = FIRE_PROOF @@ -472,7 +472,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 throwforce_on = 23, \ throw_speed_on = throw_speed, \ sharpness_on = SHARP_EDGED, \ - hitsound_on = 'sound/weapons/bladeslice.ogg', \ + hitsound_on = 'sound/items/weapons/bladeslice.ogg', \ w_class_on = WEIGHT_CLASS_NORMAL, \ attack_verb_continuous_on = list("slashes", "stabs", "slices", "tears", "lacerates", "rips", "dices", "cuts"), \ attack_verb_simple_on = list("slash", "stab", "slice", "tear", "lacerate", "rip", "dice", "cut"), \ @@ -504,7 +504,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 w_class = WEIGHT_CLASS_SMALL attack_verb_continuous = list("calls", "rings") attack_verb_simple = list("call", "ring") - hitsound = 'sound/weapons/ring.ogg' + hitsound = 'sound/items/weapons/ring.ogg' /obj/item/phone/suicide_act(mob/living/user) if(locate(/obj/structure/chair/stool) in user.loc) @@ -518,7 +518,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 desc = "A long bamboo-made staff with steel-capped ends. It is rumoured that initiates of Spider Clan train with such before getting to learn how to use a katana." force = 10 block_chance = 45 - block_sound = 'sound/weapons/genhit.ogg' + block_sound = 'sound/items/weapons/genhit.ogg' slot_flags = ITEM_SLOT_BACK w_class = WEIGHT_CLASS_BULKY hitsound = SFX_SWING_HIT @@ -675,7 +675,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 if(user) balloon_alert(user, active ? "extended" : "collapsed") - playsound(src, 'sound/weapons/batonextend.ogg', 50, TRUE) + playsound(src, 'sound/items/weapons/batonextend.ogg', 50, TRUE) return COMPONENT_NO_DEFAULT_MESSAGE /obj/item/staff @@ -892,7 +892,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 to_chat(user, span_warning("You're already ready to do a home run!")) return ..() to_chat(user, span_warning("You begin gathering strength...")) - playsound(get_turf(src), 'sound/magic/lightning_chargeup.ogg', 65, TRUE) + playsound(get_turf(src), 'sound/effects/magic/lightning_chargeup.ogg', 65, TRUE) if(do_after(user, 9 SECONDS, target = src)) to_chat(user, span_userdanger("You gather power! Time for a home run!")) homerun_ready = TRUE @@ -910,7 +910,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 if(!QDELETED(target)) target.throw_at(throw_target, rand(8,10), 14, user) SSexplosions.medturf += throw_target - playsound(get_turf(src), 'sound/weapons/homerun.ogg', 100, TRUE) + playsound(get_turf(src), 'sound/items/weapons/homerun.ogg', 100, TRUE) homerun_ready = FALSE return else if(!QDELETED(target) && !target.anchored) @@ -963,7 +963,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 return TRUE /obj/item/melee/baseball_bat/proc/launch_back(atom/movable/target, mob/living/user, turf/target_turf, datum_throw_speed) - playsound(target, 'sound/magic/tail_swing.ogg', 50, TRUE) + playsound(target, 'sound/effects/magic/tail_swing.ogg', 50, TRUE) REMOVE_TRAIT(user, TRAIT_IMMOBILIZED, type) target.mouse_opacity = initial(target.mouse_opacity) target.add_filter("baseball_launch", 3, motion_blur_filter(1, 3)) @@ -994,7 +994,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 force = 20 throwforce = 20 mob_thrower = TRUE - block_sound = 'sound/weapons/effects/batreflect.ogg' + block_sound = 'sound/items/weapons/effects/batreflect.ogg' /obj/item/melee/baseball_bat/ablative/IsReflect()//some day this will reflect thrown items instead of lasers return TRUE @@ -1110,11 +1110,11 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 w_class = WEIGHT_CLASS_BULKY slot_flags = ITEM_SLOT_BACK|ITEM_SLOT_BELT block_chance = 20 - block_sound = 'sound/weapons/parry.ogg' + block_sound = 'sound/items/weapons/parry.ogg' sharpness = SHARP_EDGED force = 14 throwforce = 12 - hitsound = 'sound/weapons/bladeslice.ogg' + hitsound = 'sound/items/weapons/bladeslice.ogg' attack_verb_continuous = list("attacks", "slashes", "stabs", "slices", "tears", "lacerates", "rips", "dices", "cuts") attack_verb_simple = list("attack", "slash", "stab", "slice", "tear", "lacerate", "rip", "dice", "cut") @@ -1137,7 +1137,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 attack_speed = CLICK_CD_HYPER_RAPID embed_type = /datum/embed_data/hfr_blade block_chance = 25 - block_sound = 'sound/weapons/parry.ogg' + block_sound = 'sound/items/weapons/parry.ogg' sharpness = SHARP_EDGED w_class = WEIGHT_CLASS_BULKY slot_flags = ITEM_SLOT_BACK @@ -1169,7 +1169,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 if(attack_type == PROJECTILE_ATTACK) if(HAS_TRAIT(src, TRAIT_WIELDED) || prob(final_block_chance)) owner.visible_message(span_danger("[owner] deflects [attack_text] with [src]!")) - playsound(src, pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg'), 75, TRUE) + playsound(src, pick('sound/items/weapons/bulletflyby.ogg', 'sound/items/weapons/bulletflyby2.ogg', 'sound/items/weapons/bulletflyby3.ogg'), 75, TRUE) return TRUE return FALSE if(prob(final_block_chance * (HAS_TRAIT(src, TRAIT_WIELDED) ? 2 : 1))) @@ -1200,8 +1200,8 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 user.do_attack_animation(target, "nothing") var/list/modifiers = params2list(params) var/damage_mod = 1 - var/x_slashed = text2num(modifiers[ICON_X]) || world.icon_size/2 //in case we arent called by a client - var/y_slashed = text2num(modifiers[ICON_Y]) || world.icon_size/2 //in case we arent called by a client + var/x_slashed = text2num(modifiers[ICON_X]) || ICON_SIZE_X/2 //in case we arent called by a client + var/y_slashed = text2num(modifiers[ICON_Y]) || ICON_SIZE_Y/2 //in case we arent called by a client new /obj/effect/temp_visual/slash(get_turf(target), target, x_slashed, y_slashed, slash_color) if(target == previous_target?.resolve()) //if the same target, we calculate a damage multiplier if you swing your mouse around var/x_mod = previous_x - x_slashed @@ -1210,8 +1210,8 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 previous_target = WEAKREF(target) previous_x = x_slashed previous_y = y_slashed - playsound(src, 'sound/weapons/bladeslice.ogg', 100, vary = TRUE) - playsound(src, 'sound/weapons/zapbang.ogg', 50, vary = TRUE) + playsound(src, 'sound/items/weapons/bladeslice.ogg', 100, vary = TRUE) + playsound(src, 'sound/items/weapons/zapbang.ogg', 50, vary = TRUE) if(isliving(target)) var/mob/living/living_target = target living_target.apply_damage(force*damage_mod, BRUTE, sharpness = SHARP_EDGED, wound_bonus = wound_bonus, bare_wound_bonus = bare_wound_bonus, def_zone = user.zone_selected) @@ -1249,7 +1249,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 var/matrix/new_transform = matrix() new_transform.Turn(rand(1, 360)) // Random slash angle var/datum/decompose_matrix/decomp = target.transform.decompose() - new_transform.Translate((x_slashed - world.icon_size/2) * decomp.scale_x, (y_slashed - world.icon_size/2) * decomp.scale_y) // Move to where we clicked + new_transform.Translate((x_slashed - ICON_SIZE_X/2) * decomp.scale_x, (y_slashed - ICON_SIZE_Y/2) * decomp.scale_y) // Move to where we clicked //Follow target's transform while ignoring scaling new_transform.Turn(decomp.rotation) new_transform.Translate(decomp.shift_x, decomp.shift_y) diff --git a/code/game/objects/items/wiki_manuals.dm b/code/game/objects/items/wiki_manuals.dm index 7209d76cc57..d64c565f04a 100644 --- a/code/game/objects/items/wiki_manuals.dm +++ b/code/game/objects/items/wiki_manuals.dm @@ -1,31 +1,5 @@ // Wiki books that are linked to the configured wiki link. -/// The size of the window that the wiki books open in. -#define BOOK_WINDOW_BROWSE_SIZE "970x710" -/// This macro will resolve to code that will open up the associated wiki page in the window. -#define WIKI_PAGE_IFRAME(wikiurl, link_identifier) {" - - - - - - - -

You start skimming through the manual...

- - - - "} - // A book that links to the wiki /obj/item/book/manual/wiki starting_content = "Nanotrasen presently does not have any resources on this topic. If you would like to know more, contact your local Central Command representative." // safety @@ -37,9 +11,10 @@ if(!wiki_url) user.balloon_alert(user, "this book is empty!") return - credit_book_to_reader(user) - DIRECT_OUTPUT(user, browse(WIKI_PAGE_IFRAME(wiki_url, page_link), "window=manual;size=[BOOK_WINDOW_BROWSE_SIZE]")) // if you change this GUARANTEE that it works. + if(tgui_alert(user, "This book's page will open in your browser. Are you sure?", "Open The Wiki", list("Yes", "No")) != "Yes") + return + usr << link("[wiki_url]/[page_link]") /obj/item/book/manual/wiki/chemistry name = "Chemistry Textbook" @@ -223,6 +198,3 @@ starting_author = "Nanotrasen Edu-tainment Division" starting_title = "Tactical Game Cards - Player's Handbook" page_link = "Tactical_Game_Cards" - -#undef BOOK_WINDOW_BROWSE_SIZE -#undef WIKI_PAGE_IFRAME diff --git a/code/game/objects/items/wizard_weapons.dm b/code/game/objects/items/wizard_weapons.dm index 34676e18bf0..e5750c06bb2 100644 --- a/code/game/objects/items/wizard_weapons.dm +++ b/code/game/objects/items/wizard_weapons.dm @@ -66,7 +66,7 @@ if(isliving(target)) var/mob/living/smacked = target smacked.take_bodypart_damage(20, 0) - playsound(user, 'sound/weapons/marauder.ogg', 50, TRUE) + playsound(user, 'sound/items/weapons/marauder.ogg', 50, TRUE) vortex(get_turf(target), user) addtimer(VARSET_CALLBACK(src, charged, TRUE), 10 SECONDS) diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm index 92ca803177e..ae369dc1907 100644 --- a/code/game/objects/obj_defense.dm +++ b/code/game/objects/obj_defense.dm @@ -68,7 +68,7 @@ /obj/attack_alien(mob/living/carbon/alien/adult/user, list/modifiers) if(attack_generic(user, 60, BRUTE, MELEE, 0)) - playsound(src.loc, 'sound/weapons/slash.ogg', 100, TRUE) + playsound(src.loc, 'sound/items/weapons/slash.ogg', 100, TRUE) /obj/attack_animal(mob/living/simple_animal/user, list/modifiers) . = ..() diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index ef436e24e8c..0a88aade697 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -187,8 +187,11 @@ GLOBAL_LIST_EMPTY(objects_by_id_tag) . = ..() if(desc_controls) . += span_notice(desc_controls) + +/obj/examine_tags(mob/user) + . = ..() if(obj_flags & UNIQUE_RENAME) - . += span_notice("Use a pen on it to rename it or change its description.") + .["renameable"] = "Use a pen on it to rename it or change its description." /obj/analyzer_act(mob/living/user, obj/item/analyzer/tool) if(atmos_scan(user=user, target=src, silent=FALSE)) diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index 701c13bfcf7..e6c9579d679 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -58,6 +58,9 @@ if(!broken) return span_warning("It's falling apart!") +/obj/structure/examine_descriptor(mob/user) + return "structure" + /obj/structure/rust_heretic_act() take_damage(500, BRUTE, "melee", 1) diff --git a/code/game/objects/structures/aliens.dm b/code/game/objects/structures/aliens.dm index f0c855e7c74..120b91a40ff 100644 --- a/code/game/objects/structures/aliens.dm +++ b/code/game/objects/structures/aliens.dm @@ -24,12 +24,12 @@ switch(damage_type) if(BRUTE) if(damage_amount) - playsound(loc, 'sound/effects/attackblob.ogg', 100, TRUE) + playsound(loc, 'sound/effects/blob/attackblob.ogg', 100, TRUE) else - playsound(src, 'sound/weapons/tap.ogg', 50, TRUE) + playsound(src, 'sound/items/weapons/tap.ogg', 50, TRUE) if(BURN) if(damage_amount) - playsound(loc, 'sound/items/welder.ogg', 100, TRUE) + playsound(loc, 'sound/items/tools/welder.ogg', 100, TRUE) /* * Generic alien stuff, not related to the purple lizards but still alien-like @@ -392,7 +392,7 @@ return if(BURST) to_chat(user, span_notice("You clear the hatched egg.")) - playsound(loc, 'sound/effects/attackblob.ogg', 100, TRUE) + playsound(loc, 'sound/effects/blob/attackblob.ogg', 100, TRUE) qdel(src) return if(GROWING) diff --git a/code/game/objects/structures/beds_chairs/alien_nest.dm b/code/game/objects/structures/beds_chairs/alien_nest.dm index 75dbfba686d..131e08808fb 100644 --- a/code/game/objects/structures/beds_chairs/alien_nest.dm +++ b/code/game/objects/structures/beds_chairs/alien_nest.dm @@ -95,9 +95,9 @@ /obj/structure/bed/nest/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) switch(damage_type) if(BRUTE) - playsound(loc, 'sound/effects/attackblob.ogg', 100, TRUE) + playsound(loc, 'sound/effects/blob/attackblob.ogg', 100, TRUE) if(BURN) - playsound(loc, 'sound/items/welder.ogg', 100, TRUE) + playsound(loc, 'sound/items/tools/welder.ogg', 100, TRUE) /obj/structure/bed/nest/attack_alien(mob/living/carbon/alien/user, list/modifiers) if(!user.combat_mode) diff --git a/code/game/objects/structures/beds_chairs/bed.dm b/code/game/objects/structures/beds_chairs/bed.dm index 4ade32bdd0e..9131a28e6eb 100644 --- a/code/game/objects/structures/beds_chairs/bed.dm +++ b/code/game/objects/structures/beds_chairs/bed.dm @@ -27,6 +27,8 @@ var/elevation = 8 /// If this bed can be deconstructed using a wrench var/can_deconstruct = TRUE + /// Directions in which the bed has its headrest on the left side. + var/left_headrest_dirs = NORTHEAST /obj/structure/bed/Initialize(mapload) . = ..() @@ -58,7 +60,7 @@ update_buckle_vars(newdir) /obj/structure/bed/proc/update_buckle_vars(newdir) - buckle_lying = newdir & NORTHEAST ? 270 : 90 + buckle_lying = newdir & left_headrest_dirs ? 270 : 90 /obj/structure/bed/atom_deconstruct(disassembled = TRUE) if(build_stack_type) @@ -83,6 +85,8 @@ icon_state = "med_down" base_icon_state = "med" anchored = FALSE + left_headrest_dirs = SOUTHWEST + buckle_lying = 270 resistance_flags = NONE build_stack_type = /obj/item/stack/sheet/mineral/titanium build_stack_amount = 1 diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm index 28d84e32ef0..ee0bc800477 100644 --- a/code/game/objects/structures/beds_chairs/chair.dm +++ b/code/game/objects/structures/beds_chairs/chair.dm @@ -16,7 +16,17 @@ var/buildstacktype = /obj/item/stack/sheet/iron var/buildstackamount = 1 var/item_chair = /obj/item/chair // if null it can't be picked up + ///How much sitting on this chair influences fishing difficulty + var/fishing_modifier = -3 +/obj/structure/chair/Initialize(mapload) + . = ..() + if(prob(0.2)) + name = "tactical [name]" + fishing_modifier -= 4 + MakeRotate() + if(can_buckle && fishing_modifier) + AddComponent(/datum/component/adjust_fishing_difficulty, fishing_modifier) /obj/structure/chair/examine(mob/user) . = ..() @@ -24,12 +34,6 @@ if(!has_buckled_mobs() && can_buckle) . += span_notice("While standing on [src], drag and drop your sprite onto [src] to buckle to it.") -/obj/structure/chair/Initialize(mapload) - . = ..() - if(prob(0.2)) - name = "tactical [name]" - MakeRotate() - ///This proc adds the rotate component, overwrite this if you for some reason want to change some specific args. /obj/structure/chair/proc/MakeRotate() AddComponent(/datum/component/simple_rotation, ROTATION_IGNORE_ANCHORED|ROTATION_GHOSTS_ALLOWED) @@ -75,7 +79,7 @@ to_chat(user, span_notice("You connect the shock kit to the [name], electrifying it ")) else user.put_in_active_hand(input_shock_kit) - to_chat(user, " You cannot fit the shock kit onto the [name]!") + to_chat(user, span_notice("You cannot fit the shock kit onto the [name]!")) /obj/structure/chair/wrench_act_secondary(mob/living/user, obj/item/weapon) @@ -139,6 +143,7 @@ buildstacktype = /obj/item/stack/sheet/mineral/wood buildstackamount = 3 item_chair = /obj/item/chair/wood + fishing_modifier = -4 /obj/structure/chair/wood/narsie_act() return @@ -156,6 +161,7 @@ max_integrity = 70 buildstackamount = 2 item_chair = null + fishing_modifier = -5 // The mutable appearance used for the overlay over buckled mobs. var/mutable_appearance/armrest @@ -231,11 +237,13 @@ desc = "A luxurious chair, the many purple scales reflect the light in a most pleasing manner." icon_state = "carp_chair" buildstacktype = /obj/item/stack/sheet/animalhide/carp + fishing_modifier = -10 /obj/structure/chair/office anchored = FALSE buildstackamount = 5 item_chair = null + fishing_modifier = -4 icon_state = "officechair_dark" /obj/structure/chair/office/Initialize(mapload) @@ -250,6 +258,10 @@ /obj/structure/chair/office/tactical name = "tactical swivel chair" +/obj/structure/chair/office/tactical/Initialize(mapload) + . = ..() + AddComponent(/datum/component/adjust_fishing_difficulty, -10) + /obj/structure/chair/office/light icon_state = "officechair_white" @@ -321,7 +333,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/chair/stool/bar, 0) throwforce = 10 demolition_mod = 1.25 throw_range = 3 - hitsound = 'sound/items/trayhit1.ogg' + hitsound = 'sound/items/trayhit/trayhit1.ogg' hit_reaction_chance = 50 custom_materials = list(/datum/material/iron =SHEET_MATERIAL_AMOUNT) item_flags = SKIP_FANTASY_ON_SPAWN @@ -411,7 +423,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/chair/stool/bar, 0) name = "bamboo stool" icon_state = "bamboo_stool" inhand_icon_state = "stool_bamboo" - hitsound = 'sound/weapons/genhit1.ogg' + hitsound = 'sound/items/weapons/genhit1.ogg' origin_type = /obj/structure/chair/stool/bamboo break_chance = 50 //Submissive and breakable unlike the chad iron stool @@ -424,7 +436,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/chair/stool/bar, 0) inhand_icon_state = "woodenchair" resistance_flags = FLAMMABLE max_integrity = 70 - hitsound = 'sound/weapons/genhit1.ogg' + hitsound = 'sound/items/weapons/genhit1.ogg' origin_type = /obj/structure/chair/wood custom_materials = null break_chance = 50 @@ -441,6 +453,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/chair/stool/bar, 0) desc = "You sit in this. Either by will or force. Looks REALLY uncomfortable." icon_state = "chairold" item_chair = null + fishing_modifier = 4 /obj/structure/chair/bronze name = "brass chair" @@ -450,6 +463,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/chair/stool/bar, 0) buildstacktype = /obj/item/stack/sheet/bronze buildstackamount = 1 item_chair = null + fishing_modifier = -12 //the pinnacle of Ratvarian technology. /// Total rotations made var/turns = 0 @@ -489,6 +503,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/chair/stool/bar, 0) item_chair = null obj_flags = parent_type::obj_flags | NO_DEBRIS_AFTER_DECONSTRUCTION alpha = 0 + fishing_modifier = -20 //it only lives for 25 seconds, so we make them worth it. /obj/structure/chair/mime/wrench_act_secondary(mob/living/user, obj/item/weapon) return NONE @@ -510,6 +525,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/chair/stool/bar, 0) buildstacktype = /obj/item/stack/sheet/plastic buildstackamount = 2 item_chair = /obj/item/chair/plastic + fishing_modifier = -8 /obj/structure/chair/plastic/post_buckle_mob(mob/living/Mob) Mob.pixel_y += 2 diff --git a/code/game/objects/structures/beds_chairs/sofa.dm b/code/game/objects/structures/beds_chairs/sofa.dm index bf9a221929b..04bb0b1e25e 100644 --- a/code/game/objects/structures/beds_chairs/sofa.dm +++ b/code/game/objects/structures/beds_chairs/sofa.dm @@ -19,6 +19,7 @@ path/corner/color_name {\ icon = 'icons/obj/chairs_wide.dmi' buildstackamount = 1 item_chair = null + fishing_modifier = -4 var/mutable_appearance/armrest /obj/structure/chair/sofa/Initialize(mapload) diff --git a/code/game/objects/structures/bonfire.dm b/code/game/objects/structures/bonfire.dm index a26a2f92784..e6f7edd9396 100644 --- a/code/game/objects/structures/bonfire.dm +++ b/code/game/objects/structures/bonfire.dm @@ -73,8 +73,8 @@ if(!LAZYACCESS(modifiers, ICON_X) || !LAZYACCESS(modifiers, ICON_Y)) return //Clamp it so that the icon never moves more than 16 pixels in either direction (thus leaving the table turf) - used_item.pixel_x = used_item.base_pixel_x + clamp(text2num(LAZYACCESS(modifiers, ICON_X)) - 16, -(world.icon_size/2), world.icon_size/2) - used_item.pixel_y = used_item.base_pixel_y + clamp(text2num(LAZYACCESS(modifiers, ICON_Y)) - 16, -(world.icon_size/2), world.icon_size/2) + used_item.pixel_x = used_item.base_pixel_x + clamp(text2num(LAZYACCESS(modifiers, ICON_X)) - 16, -(ICON_SIZE_X/2), ICON_SIZE_X/2) + used_item.pixel_y = used_item.base_pixel_y + clamp(text2num(LAZYACCESS(modifiers, ICON_Y)) - 16, -(ICON_SIZE_Y/2), ICON_SIZE_Y/2) else return ..() @@ -185,6 +185,13 @@ /obj/structure/bonfire/dense density = TRUE +/obj/structure/bonfire/dense/prelit/Initialize(mapload) + . = ..() + return INITIALIZE_HINT_LATELOAD + +/obj/structure/bonfire/dense/prelit/LateInitialize() + start_burning() + /obj/structure/bonfire/prelit/Initialize(mapload) . = ..() return INITIALIZE_HINT_LATELOAD diff --git a/code/game/objects/structures/cannons/cannon.dm b/code/game/objects/structures/cannons/cannon.dm index 3a10cc17189..66c827442bf 100644 --- a/code/game/objects/structures/cannons/cannon.dm +++ b/code/game/objects/structures/cannons/cannon.dm @@ -17,7 +17,7 @@ var/charge_ignited = FALSE var/fire_delay = 15 var/charge_size = 15 - var/fire_sound = 'sound/weapons/gun/general/cannon.ogg' + var/fire_sound = 'sound/items/weapons/gun/general/cannon.ogg' /obj/structure/cannon/Initialize(mapload) . = ..() diff --git a/code/game/objects/structures/cannons/cannon_instructions.dm b/code/game/objects/structures/cannons/cannon_instructions.dm index c259ea0e76f..34cdcdf1ced 100644 --- a/code/game/objects/structures/cannons/cannon_instructions.dm +++ b/code/game/objects/structures/cannons/cannon_instructions.dm @@ -17,4 +17,10 @@ REGULAR CANNONBALL: A fine choice for killing landlubbers! Will take off any lim EXPLOSIVE SHELLBALL: The most elegant in breaching (er killin', if you're good at aimin') tools, ye be packing this shell with many scuppering chemicals! Just make sure to not fire it when ye be close to target!
MALFUNCTION SHOT: A very gentle "cannonball" dart at first glance, but make no mistake: This is their worst nightmare! Enjoy an easy boarding process while all their machines are broken and all their weapons unloaded from an EMP!
THE BIGGEST ONE: A shellball, but much bigger. Ye won't be seein' much of these as they were discontinued for sinkin' the firer's ship as often as it sunk the scallywag's ship. Very big boom! If ye have one, ye have been warned! + +
FIRING THAR CANISTER GATLING
+ +THE CANISTER GATLING AIN'T LIKE OTHER CANNONS, AND DOESN'T REQUIRE GUNPOWDER, INSTEAD RELYING ON SPECIAL CANISTER SHOT SHELLS. +ALL YOU HAVE TO DO IS CRAM A SHELL IN THE BREACH, LIGHT HER UP AND YOU'LL BE BLOWING THOSE CORPORATE SODS TO KINGDOM COME! +SHE LACKS THE SHEER WALL-BREAKING PUNCH OF THE HOLEMAKERS, BUT CHEWS THROUGH SOFT TARGETS LIKE A SHARK THROUGH A GROUP OF BEACH THROUGH A GROUP OF BEACHGOERS, YAHAR. "} diff --git a/code/game/objects/structures/cannons/mounted_guns/mounted_gun.dm b/code/game/objects/structures/cannons/mounted_guns/mounted_gun.dm new file mode 100644 index 00000000000..f0fa9e27d78 --- /dev/null +++ b/code/game/objects/structures/cannons/mounted_guns/mounted_gun.dm @@ -0,0 +1,187 @@ +//Mounted guns are basically a smaller equivalent to cannons, designed to use pre-existing ammo rather than cannonballs. +//Due to using pre-existing ammo, they dont require to be loaded with gunpowder or an equivalent. + +/obj/structure/mounted_gun + name = "Mounted Gun" + desc = "Default mounted gun for inheritance purposes." + density = TRUE + anchored = FALSE + icon = 'icons/obj/weapons/cannons.dmi' + icon_state = "falconet_patina" + var/icon_state_base = "falconet_patina" + var/icon_state_fire = "falconet_patina_fire" + max_integrity = 300 + ///whether the cannon can be unwrenched from the ground. Anchorable_cannon equivalent. + var/anchorable_gun = TRUE + ///Max shots per firing of the gun. + var/max_shots_per_fire = 1 + ///Shots currently loaded. Should never be more than max_shots_per_fire. + var/shots_in_gun = 1 + ///shots added to gun, per piece of ammo loaded. + var/shots_per_load = 1 + ///Accepted "ammo" type + var/obj/item/ammo_type = /obj/item/ammo_casing/strilka310 + ///Projectile from said gun. Doesnt automatically inherit said ammo's projectile in case you wanted to make a gun that shoots floor tiles or something. + var/obj/item/projectile_type = /obj/projectile/bullet/strilka310 + ///If the gun has anything in it. + var/loaded_gun = TRUE + ///If the gun is currently loaded with its maximum capacity. + var/fully_loaded_gun = TRUE + ///delay in firing the gun after lighting + var/fire_delay = 5 + ///Delay between shots + var/shot_delay = 3 + ///If the gun shakes the camera when firing + var/firing_shakes_camera = TRUE + ///sound of firing for all but last shot + var/fire_sound = 'sound/items/weapons/gun/general/mountedgun.ogg' + ///sound of firing for last shot + var/last_fire_sound = 'sound/items/weapons/gun/general/mountedgunend.ogg' + +/obj/structure/mounted_gun/wrench_act(mob/living/user, obj/item/tool) + . = ..() + if(!anchorable_gun) /// Can't anchor an unanchorable gun. + return FALSE + default_unfasten_wrench(user, tool) + return ITEM_INTERACT_SUCCESS + +///Covers Reloading and lighting of the gun +/obj/structure/mounted_gun/attackby(obj/item/ammo_casing/used_item, mob/user, params) + var/ignition_message = used_item.ignition_effect(src, user) // Checks if item used can ignite stuff. + if(istype(used_item, ammo_type)) + if(fully_loaded_gun) + balloon_alert(user, "already fully loaded!") + return + else + shots_in_gun = shots_in_gun + shots_per_load //Add one to the shots in the gun + + loaded_gun = TRUE // Make sure it registers theres ammo in there, so it can fire. + QDEL_NULL(used_item) + if(shots_in_gun >= max_shots_per_fire) + shots_in_gun = max_shots_per_fire // in case of somehow firing only some of a guns shots, and reloading, you still cant get above the maximum ammo size. + fully_loaded_gun = TRUE //So you cant load extra. + return + + else if(ignition_message) // if item the player used ignites, light the gun! + visible_message(ignition_message) + user.log_message("fired a cannon", LOG_ATTACK) + log_game("[key_name(user)] fired a cannon in [AREACOORD(src)]") + addtimer(CALLBACK(src, PROC_REF(fire)), fire_delay) //uses fire proc as shown below to shoot the gun + return + ..() + +/obj/structure/mounted_gun/proc/fire() + if (!loaded_gun) + balloon_alert_to_viewers("gun is not loaded!","",2) + return + for(var/times_fired = 1, times_fired <= shots_in_gun, times_fired++) //The normal DM for loop structure since the times it has fired is changing in the loop itself. + for(var/mob/shaken_mob in urange(10, src)) + if(shaken_mob.stat == CONSCIOUS && firing_shakes_camera == TRUE) + shake_camera(shaken_mob, 3, 1) + icon_state = icon_state_fire + if(loaded_gun) + + if (times_fired < shots_in_gun) + playsound(src, fire_sound, 50, FALSE, 5) + else + playsound(src, last_fire_sound, 50, TRUE, 5) + var/obj/projectile/fired_projectile = new projectile_type(get_turf(src)) + fired_projectile.firer = src + fired_projectile.fired_from = src + fired_projectile.fire(dir2angle(dir)) + sleep(shot_delay) + loaded_gun = FALSE + shots_in_gun = 0 + fully_loaded_gun = FALSE + icon_state = icon_state_base + +/obj/structure/mounted_gun/pipe + + name = "Pipe Organ Gun" + desc = "To become master over one who has killed, one must become a better killer. This engine of destruction is one of many things made to that end." + icon_state = "pipeorgangun" + icon_state_base = "pipeorgangun" + icon_state_fire = "pipeorgangun_fire" + anchored = FALSE + anchorable_gun = TRUE + max_shots_per_fire = 8 + shots_in_gun = 8 + shots_per_load = 2 + ammo_type = /obj/item/ammo_casing/junk + projectile_type = /obj/projectile/bullet/junk + loaded_gun = TRUE + fully_loaded_gun = TRUE + fire_delay = 3 + shot_delay = 2 + firing_shakes_camera = FALSE + +/obj/structure/mounted_gun/pipe/examine_more(mob/user) + . = ..() + . += span_notice("Looking down at the [name], you recall a tale told to you in some distant memory...") + + . += span_info("To commit an act of vengeance is not unlike to enter a blood pact with a devil, ending the life of another, at the cost of your own.") + . += span_info("When humanity first spilled the blood of its own kind, with likely nothing more than a rock, the seal was broken. Vengeance was borne unto the world.") + . += span_info("However, vengeance alone is not enough to carry through the grim deed of murder. One must an gain advantage over their adversary.") + . += span_info("As such, the man who ended another's life with a stone, was in turn smote himself by another wielding a spear. After spears, bows. Swords. Guns. Tanks. Missiles. And on and on Vengeance fed. Growing stronger. Growing Worse.") + . += span_info("Vengeance persists to this day. It sometimes may slumber, seemingly content with having gorged itself, but in the end, its ceaseless hunger can be neither numbed nor sated.") + +/obj/structure/mounted_gun/pipe/fire() + if (!loaded_gun) + balloon_alert_to_viewers("Gun is not loaded!","",2) + return + for(var/times_fired = 1, times_fired <= shots_in_gun, times_fired++) //The normal DM for loop structure since the times it has fired is changing in the loop itself. + for(var/mob/shaken_mob in urange(10, src)) + if((shaken_mob.stat == CONSCIOUS)&&(firing_shakes_camera == TRUE)) + shake_camera(shaken_mob, 3, 1) + icon_state = icon_state_fire + if(loaded_gun) + playsound(src, fire_sound, 50, TRUE, 5) + + var/list_of_projectiles = list( + /obj/projectile/bullet/junk = 40, + /obj/projectile/bullet/incendiary/fire/junk = 25, + /obj/projectile/bullet/junk/shock = 25, + /obj/projectile/bullet/junk/hunter = 20, + /obj/projectile/bullet/junk/phasic = 8, + /obj/projectile/bullet/junk/ripper = 8, + /obj/projectile/bullet/junk/reaper = 3, + ) + projectile_type = pick_weight(list_of_projectiles) + + var/obj/projectile/fired_projectile = new projectile_type(get_turf(src)) + fired_projectile.firer = src + fired_projectile.fired_from = src + fired_projectile.fire(dir2angle(dir)) + sleep(shot_delay) + loaded_gun = FALSE + shots_in_gun = 0 + fully_loaded_gun = FALSE + icon_state = icon_state_base + +/obj/structure/mounted_gun/canister_gatling //for the funny skeleton pirates! + + name = "Canister Gatling Gun" + desc = "''Quantity has a quality of its own.''" + icon_state = "canister_gatling" + icon_state_base = "canister_gatling" + icon_state_fire = "canister_gatling_fire" + anchored = FALSE + anchorable_gun = TRUE + max_shots_per_fire = 50 + shots_per_load = 50 + shots_in_gun = 50 + ammo_type = /obj/item/ammo_casing/canister_shot + projectile_type = /obj/projectile/bullet/shrapnel + loaded_gun = TRUE + fully_loaded_gun = TRUE + fire_delay = 3 + shot_delay = 1 + firing_shakes_camera = FALSE + +/obj/item/ammo_casing/canister_shot + name = "Canister Shot" + desc = "A gigantic... well, canister of canister shot. Used for reloading the Canister Gatling Gun." + icon_state = "canister_shot" + obj_flags = CONDUCTS_ELECTRICITY + throwforce = 0 + w_class = WEIGHT_CLASS_BULKY diff --git a/code/game/objects/structures/construction_console/construction_actions.dm b/code/game/objects/structures/construction_console/construction_actions.dm index fc014d14318..1a6b5deeeae 100644 --- a/code/game/objects/structures/construction_console/construction_actions.dm +++ b/code/game/objects/structures/construction_console/construction_actions.dm @@ -91,7 +91,7 @@ if(place_turf.density) to_chat(owner, span_warning("[structure_name] may only be placed on a floor.")) return - //Can't place two dense objects inside eachother + //Can't place two dense objects inside each other if(initial(structure_path.density) && place_turf.is_blocked_turf()) to_chat(owner, span_warning("Location is obstructed by something. Please clear the location and try again.")) return @@ -120,7 +120,7 @@ button_icon_state = "build_turret" structure_name = "turrets" structure_path = /obj/machinery/porta_turret/aux_base - place_sound = 'sound/items/drill_use.ogg' + place_sound = 'sound/items/tools/drill_use.ogg' /datum/action/innate/construction/place_structure/turret/after_place(obj/placed_structure, remaining) var/obj/machinery/computer/auxiliary_base/turret_controller = locate() in get_area(placed_structure) diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index f407dcd82c0..58e99dc8839 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -56,8 +56,8 @@ GLOBAL_LIST_EMPTY(roundstart_station_closets) var/mob_storage_capacity = 3 // how many human sized mob/living can fit together inside a closet. var/storage_capacity = 30 //This is so that someone can't pack hundreds of items in a locker/crate then open it in a populated area to crash clients. var/cutting_tool = /obj/item/weldingtool - var/open_sound = 'sound/machines/closet_open.ogg' - var/close_sound = 'sound/machines/closet_close.ogg' + var/open_sound = 'sound/machines/closet/closet_open.ogg' + var/close_sound = 'sound/machines/closet/closet_close.ogg' var/open_sound_volume = 35 var/close_sound_volume = 50 var/material_drop = /obj/item/stack/sheet/iron @@ -157,8 +157,8 @@ GLOBAL_LIST_EMPTY(roundstart_station_closets) register_context() if(opened) - opened = FALSE //nessassary because open() proc will early return if its true - if(open(special_effects = FALSE)) //closets which are meant to be open by default dont need to be animated open + opened = FALSE //necessary because open() proc will early return if its true + if(open(special_effects = FALSE)) //closets which are meant to be open by default don't need to be animated open return update_appearance() @@ -331,15 +331,15 @@ GLOBAL_LIST_EMPTY(roundstart_station_closets) if(id_card) . += span_notice("It can be [EXAMINE_HINT("marked")] with a pen.") if(can_weld_shut && !welded) - . += span_notice("Its can be [EXAMINE_HINT("welded")] shut.") + . += span_notice("It can be [EXAMINE_HINT("welded")] shut.") if(welded) - . += span_notice("Its [EXAMINE_HINT("welded")] shut.") + . += span_notice("It's [EXAMINE_HINT("welded")] shut.") if(anchorable && !anchored) . += span_notice("It can be [EXAMINE_HINT("bolted")] to the ground.") if(anchored) . += span_notice("It's [anchorable ? EXAMINE_HINT("bolted") : "attached firmly"] to the ground.") if(length(paint_jobs)) - . += span_notice("It can be [EXAMINE_HINT("painted")] another texture.") + . += span_notice("It can be [EXAMINE_HINT("painted")] with another texture.") if(HAS_TRAIT(user, TRAIT_SKITTISH) && divable) . += span_notice("If you bump into [p_them()] while running, you will jump inside.") @@ -823,21 +823,24 @@ GLOBAL_LIST_EMPTY(roundstart_station_closets) balloon_alert(user, "unlock first!") return - if(isnull(id_card)) + if(isnull(id_card) && secure) balloon_alert(user, "not yours to rename!") return var/name_set = FALSE var/desc_set = FALSE - var/str = tgui_input_text(user, "Personal Locker Name", "Locker Name") - if(!isnull(str)) - name = str + + var/input_name = tgui_input_text(user, "Locker Name", "Locker Name", max_length = MAX_NAME_LEN) + + if(!isnull(input_name)) + name = input_name name_set = TRUE - str = tgui_input_text(user, "Personal Locker Description", "Locker Description") - if(!isnull(str)) - desc = str + var/input_desc = tgui_input_text(user, "Locker Description", "Locker Description", max_length = MAX_DESC_LEN) + + if(!isnull(input_desc)) + desc = input_desc desc_set = TRUE var/bit_flag = NONE @@ -888,7 +891,7 @@ GLOBAL_LIST_EMPTY(roundstart_station_closets) user.log_message("[welded ? "welded":"unwelded"] closet [src] with [weapon]", LOG_GAME) update_appearance() - else if(!user.combat_mode) + else if(!user.combat_mode || (weapon.item_flags & NOBLUDGEON)) var/item_is_id = weapon.GetID() if(!item_is_id) return FALSE @@ -915,8 +918,6 @@ GLOBAL_LIST_EMPTY(roundstart_station_closets) /obj/structure/closet/mouse_drop_receive(atom/movable/O, mob/living/user, params) if(!istype(O) || O.anchored || istype(O, /atom/movable/screen)) return - if(!istype(user) || user.incapacitated || user.body_position == LYING_DOWN) - return if(user == O) //try to climb onto it return ..() if(!opened) @@ -1068,7 +1069,7 @@ GLOBAL_LIST_EMPTY(roundstart_station_closets) addtimer(CALLBACK(src, PROC_REF(check_if_shake)), next_check_time) return TRUE - // If we reach here, nobody is resisting, so dont shake + // If we reach here, nobody is resisting, so don't shake return FALSE /obj/structure/closet/proc/bust_open() @@ -1191,15 +1192,13 @@ GLOBAL_LIST_EMPTY(roundstart_station_closets) return if(!opened && ((shove_flags & SHOVE_KNOCKDOWN_BLOCKED) || !(shove_flags & SHOVE_BLOCKED))) return - var/was_opened = opened - if(!toggle()) - return - if(was_opened) - if (!target.Move(get_turf(src), get_dir(target, src))) + if(opened) + if (target.loc != loc) return target.forceMove(src) else target.Knockdown(SHOVE_KNOCKDOWN_SOLID) + toggle() update_icon() target.visible_message(span_danger("[shover.name] shoves [target.name] into [src]!"), span_userdanger("You're shoved into [src] by [shover.name]!"), diff --git a/code/game/objects/structures/crates_lockers/closets/bodybag.dm b/code/game/objects/structures/crates_lockers/closets/bodybag.dm index ac8b444e47d..0bb1b564ece 100644 --- a/code/game/objects/structures/crates_lockers/closets/bodybag.dm +++ b/code/game/objects/structures/crates_lockers/closets/bodybag.dm @@ -5,8 +5,8 @@ icon_state = "bodybag" density = FALSE mob_storage_capacity = 2 - open_sound = 'sound/items/zip.ogg' - close_sound = 'sound/items/zip.ogg' + open_sound = 'sound/items/zip/zip.ogg' + close_sound = 'sound/items/zip/zip.ogg' open_sound_volume = 15 close_sound_volume = 15 integrity_failure = 0 @@ -116,8 +116,22 @@ */ /obj/structure/closet/body_bag/proc/perform_fold(mob/living/carbon/human/the_folder) visible_message(span_notice("[the_folder] folds up [src].")) - var/obj/item/bodybag/folding_bodybag = foldedbag_instance || new foldedbag_path - the_folder.put_in_hands(folding_bodybag) + the_folder.put_in_hands(undeploy_bodybag(the_folder.loc)) + +/// Makes the bag into an item, returns that item +/obj/structure/closet/body_bag/proc/undeploy_bodybag(atom/fold_loc) + var/obj/item/bodybag/folding_bodybag = foldedbag_instance || new foldedbag_path() + if(fold_loc) + folding_bodybag.forceMove(fold_loc) + return folding_bodybag + +/obj/structure/closet/body_bag/container_resist_act(mob/living/user, loc_required = TRUE) + // ideally we support this natively but i guess that's for a later time + if(!istype(loc, /obj/machinery/disposal)) + return ..() + for(var/atom/movable/thing as anything in src) + thing.forceMove(loc) + undeploy_bodybag(loc) /obj/structure/closet/body_bag/bluespace name = "bluespace body bag" @@ -152,7 +166,7 @@ /obj/structure/closet/body_bag/bluespace/perform_fold(mob/living/carbon/human/the_folder) visible_message(span_notice("[the_folder] folds up [src].")) - var/obj/item/bodybag/folding_bodybag = foldedbag_instance || new foldedbag_path + var/obj/item/bodybag/folding_bodybag = undeploy_bodybag(the_folder.loc) var/max_weight_of_contents = initial(folding_bodybag.w_class) for(var/am in contents) var/atom/movable/content = am @@ -186,7 +200,7 @@ contents_thermal_insulation = 0.5 foldedbag_path = /obj/item/bodybag/environmental /// The list of weathers we protect from. - var/list/weather_protection = list(TRAIT_ASHSTORM_IMMUNE, TRAIT_RADSTORM_IMMUNE, TRAIT_SNOWSTORM_IMMUNE, TRAIT_VOIDSTORM_IMMUNE) // Does not protect against lava or the The Floor Is Lava spell. + var/list/weather_protection = list(TRAIT_ASHSTORM_IMMUNE, TRAIT_RADSTORM_IMMUNE, TRAIT_SNOWSTORM_IMMUNE) // Does not protect against lava or the The Floor Is Lava spell. /// The contents of the gas to be distributed to an occupant. Set in Initialize() var/datum/gas_mixture/air_contents = null @@ -277,18 +291,9 @@ icon_state = initial(icon_state) /obj/structure/closet/body_bag/environmental/prisoner/container_resist_act(mob/living/user, loc_required = TRUE) - /// copy-pasted with changes because flavor text as well as some other misc stuff - if(opened) - return - if(ismovable(loc)) - user.changeNext_move(CLICK_CD_BREAKOUT) - user.last_special = world.time + CLICK_CD_BREAKOUT - var/atom/movable/location = loc - location.relay_container_resist_act(user, src) - return - if(!sinched) - open(user) - return + // copy-pasted with changes because flavor text as well as some other misc stuff + if(opened || ismovable(loc) || !sinched) + return ..() user.changeNext_move(CLICK_CD_BREAKOUT) user.last_special = world.time + CLICK_CD_BREAKOUT @@ -301,6 +306,8 @@ //we check after a while whether there is a point of resisting anymore and whether the user is capable of resisting user.visible_message(span_danger("[user] successfully broke out of [src]!"), span_notice("You successfully break out of [src]!")) + if(istype(loc, /obj/machinery/disposal)) + return ..() bust_open() else if(user.loc == src) //so we don't get the message if we resisted multiple times and succeeded. @@ -369,11 +376,11 @@ icon_state = "holobag_med" resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF foldedbag_path = null - weather_protection = list(TRAIT_VOIDSTORM_IMMUNE, TRAIT_SNOWSTORM_IMMUNE) + weather_protection = list(TRAIT_SNOWSTORM_IMMUNE) /obj/structure/closet/body_bag/environmental/hardlight/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) if(damage_type in list(BRUTE, BURN)) - playsound(src, 'sound/weapons/egloves.ogg', 80, TRUE) + playsound(src, 'sound/items/weapons/egloves.ogg', 80, TRUE) /obj/structure/closet/body_bag/environmental/prisoner/hardlight name = "hardlight prisoner bodybag" @@ -381,8 +388,8 @@ icon_state = "holobag_sec" resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF foldedbag_path = null - weather_protection = list(TRAIT_VOIDSTORM_IMMUNE, TRAIT_SNOWSTORM_IMMUNE) + weather_protection = list(TRAIT_SNOWSTORM_IMMUNE) /obj/structure/closet/body_bag/environmental/prisoner/hardlight/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) if(damage_type in list(BRUTE, BURN)) - playsound(src, 'sound/weapons/egloves.ogg', 80, TRUE) + playsound(src, 'sound/items/weapons/egloves.ogg', 80, TRUE) diff --git a/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm b/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm index 2f555ed84de..19eb4388764 100644 --- a/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm +++ b/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm @@ -105,8 +105,8 @@ resistance_flags = NONE move_speed_multiplier = 2 cutting_tool = /obj/item/weldingtool - open_sound = 'sound/machines/crate_open.ogg' - close_sound = 'sound/machines/crate_close.ogg' + open_sound = 'sound/machines/crate/crate_open.ogg' + close_sound = 'sound/machines/crate/crate_close.ogg' open_sound_volume = 35 close_sound_volume = 50 material_drop = /obj/item/stack/sheet/plasteel diff --git a/code/game/objects/structures/crates_lockers/closets/gimmick.dm b/code/game/objects/structures/crates_lockers/closets/gimmick.dm index f2171b2e8b1..24e9c93bdb9 100644 --- a/code/game/objects/structures/crates_lockers/closets/gimmick.dm +++ b/code/game/objects/structures/crates_lockers/closets/gimmick.dm @@ -3,8 +3,8 @@ desc = "Old will forever be in fashion." icon_state = "cabinet" resistance_flags = FLAMMABLE - open_sound = 'sound/machines/wooden_closet_open.ogg' - close_sound = 'sound/machines/wooden_closet_close.ogg' + open_sound = 'sound/machines/closet/wooden_closet_open.ogg' + close_sound = 'sound/machines/closet/wooden_closet_close.ogg' open_sound_volume = 25 close_sound_volume = 50 max_integrity = 70 diff --git a/code/game/objects/structures/crates_lockers/closets/secure/bar.dm b/code/game/objects/structures/crates_lockers/closets/secure/bar.dm index 76c7ab82db4..24b901dc920 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/bar.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/bar.dm @@ -4,8 +4,8 @@ icon_state = "cabinet" resistance_flags = FLAMMABLE max_integrity = 70 - open_sound = 'sound/machines/wooden_closet_open.ogg' - close_sound = 'sound/machines/wooden_closet_close.ogg' + open_sound = 'sound/machines/closet/wooden_closet_open.ogg' + close_sound = 'sound/machines/closet/wooden_closet_close.ogg' open_sound_volume = 25 close_sound_volume = 50 door_anim_time = 0 // no animation 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 e5eed4cb295..6261ec6538e 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm @@ -50,8 +50,8 @@ req_access = list(ACCESS_PSYCHOLOGY) icon_state = "cabinet" door_anim_time = 0 // no animation - open_sound = 'sound/machines/wooden_closet_open.ogg' - close_sound = 'sound/machines/wooden_closet_close.ogg' + open_sound = 'sound/machines/closet/wooden_closet_open.ogg' + close_sound = 'sound/machines/closet/wooden_closet_close.ogg' open_sound_volume = 25 close_sound_volume = 50 diff --git a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm index d0487198d4c..f639df5f128 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm @@ -40,8 +40,8 @@ icon_state = "cabinet" resistance_flags = FLAMMABLE max_integrity = 70 - open_sound = 'sound/machines/wooden_closet_open.ogg' - close_sound = 'sound/machines/wooden_closet_close.ogg' + open_sound = 'sound/machines/closet/wooden_closet_open.ogg' + close_sound = 'sound/machines/closet/wooden_closet_close.ogg' open_sound_volume = 25 close_sound_volume = 50 door_anim_time = 0 // no animation 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 bf75441d1bf..77a548265c4 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -185,8 +185,8 @@ resistance_flags = FLAMMABLE max_integrity = 70 door_anim_time = 0 // no animation - open_sound = 'sound/machines/wooden_closet_open.ogg' - close_sound = 'sound/machines/wooden_closet_close.ogg' + open_sound = 'sound/machines/closet/wooden_closet_open.ogg' + close_sound = 'sound/machines/closet/wooden_closet_close.ogg' req_access = list(ACCESS_DETECTIVE) /obj/structure/closet/secure_closet/detective/PopulateContents() diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index 7efa0d6a91e..2dfa053537e 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -5,14 +5,13 @@ icon_state = "crate" base_icon_state = "crate" req_access = null - can_weld_shut = FALSE horizontal = TRUE allow_objects = TRUE allow_dense = TRUE dense_when_open = TRUE delivery_icon = "deliverycrate" - open_sound = 'sound/machines/crate_open.ogg' - close_sound = 'sound/machines/crate_close.ogg' + open_sound = 'sound/machines/crate/crate_open.ogg' + close_sound = 'sound/machines/crate/crate_close.ogg' open_sound_volume = 35 close_sound_volume = 50 drag_slowdown = 0 @@ -95,6 +94,9 @@ else if(secure) . += "securecrateg" + if(welded) + . += icon_welded + if(opened && lid_icon_state) var/mutable_appearance/lid = mutable_appearance(icon = lid_icon, icon_state = lid_icon_state) lid.pixel_x = lid_x @@ -119,7 +121,7 @@ if(elevation_open) AddElement(/datum/element/elevation, pixel_shift = elevation_open) if(!QDELETED(manifest)) - playsound(src, 'sound/items/poster_ripped.ogg', 75, TRUE) + playsound(src, 'sound/items/poster/poster_ripped.ogg', 75, TRUE) manifest.forceMove(get_turf(src)) manifest = null update_appearance() @@ -146,7 +148,7 @@ ///Removes the supply manifest from the closet /obj/structure/closet/crate/proc/tear_manifest(mob/user) to_chat(user, span_notice("You tear the manifest off of [src].")) - playsound(src, 'sound/items/poster_ripped.ogg', 75, TRUE) + playsound(src, 'sound/items/poster/poster_ripped.ogg', 75, TRUE) manifest.forceMove(loc) if(ishuman(user)) @@ -167,13 +169,14 @@ max_integrity = 70 material_drop = /obj/item/stack/sheet/mineral/wood material_drop_amount = 5 - open_sound = 'sound/machines/wooden_closet_open.ogg' - close_sound = 'sound/machines/wooden_closet_close.ogg' + open_sound = 'sound/machines/closet/wooden_closet_open.ogg' + close_sound = 'sound/machines/closet/wooden_closet_close.ogg' open_sound_volume = 25 close_sound_volume = 50 can_install_electronics = FALSE paint_jobs = null elevation_open = 0 + can_weld_shut = FALSE /obj/structure/closet/crate/trashcart //please make this a generic cart path later after things calm down a little desc = "A heavy, metal trashcart with wheels." @@ -190,6 +193,7 @@ base_icon_state = "laundry" elevation = 14 elevation_open = 14 + can_weld_shut = FALSE /obj/structure/closet/crate/trashcart/Initialize(mapload) . = ..() @@ -224,7 +228,7 @@ /obj/structure/closet/crate/deforest name = "deforest medical crate" - desc = "A DeFortest brand crate of medical supplies." + desc = "A DeForest brand crate of medical supplies." icon_state = "deforest" base_icon_state = "deforest" diff --git a/code/game/objects/structures/crates_lockers/crates/bins.dm b/code/game/objects/structures/crates_lockers/crates/bins.dm index a686d53f392..dfe2eb8c43d 100644 --- a/code/game/objects/structures/crates_lockers/crates/bins.dm +++ b/code/game/objects/structures/crates_lockers/crates/bins.dm @@ -3,8 +3,8 @@ name = "trash bin" icon_state = "trashbin" base_icon_state = "trashbin" - open_sound = 'sound/effects/bin_open.ogg' - close_sound = 'sound/effects/bin_close.ogg' + open_sound = 'sound/effects/bin/bin_open.ogg' + close_sound = 'sound/effects/bin/bin_close.ogg' anchored = TRUE horizontal = FALSE delivery_icon = null @@ -12,6 +12,7 @@ paint_jobs = null elevation = 17 elevation_open = 17 + can_weld_shut = FALSE /obj/structure/closet/crate/bin/LateInitialize() . = ..() @@ -66,4 +67,4 @@ items_to_sweep.Cut() to_chat(user, span_notice("You sweep the pile of garbage into [src].")) - playsound(broom.loc, 'sound/weapons/thudswoosh.ogg', 30, TRUE, -1) + playsound(broom.loc, 'sound/items/weapons/thudswoosh.ogg', 30, TRUE, -1) diff --git a/code/game/objects/structures/crates_lockers/crates/cardboard.dm b/code/game/objects/structures/crates_lockers/crates/cardboard.dm index 7b1e7dc7257..5d1418e397e 100644 --- a/code/game/objects/structures/crates_lockers/crates/cardboard.dm +++ b/code/game/objects/structures/crates_lockers/crates/cardboard.dm @@ -6,12 +6,13 @@ material_drop_amount = 4 icon_state = "cardboard" base_icon_state = "cardboard" - open_sound = 'sound/items/poster_ripped.ogg' + open_sound = 'sound/items/poster/poster_ripped.ogg' close_sound = 'sound/machines/cardboard_box.ogg' open_sound_volume = 25 close_sound_volume = 25 paint_jobs = null cutting_tool = /obj/item/wirecutters + can_weld_shut = FALSE /obj/structure/closet/crate/cardboard/mothic name = "\improper Mothic Fleet box" diff --git a/code/game/objects/structures/crates_lockers/crates/critter.dm b/code/game/objects/structures/crates_lockers/crates/critter.dm index 5e1873d166a..052ca9cffb6 100644 --- a/code/game/objects/structures/crates_lockers/crates/critter.dm +++ b/code/game/objects/structures/crates_lockers/crates/critter.dm @@ -9,14 +9,15 @@ material_drop = /obj/item/stack/sheet/mineral/wood material_drop_amount = 4 delivery_icon = "deliverybox" - open_sound = 'sound/machines/wooden_closet_open.ogg' - close_sound = 'sound/machines/wooden_closet_close.ogg' + open_sound = 'sound/machines/closet/wooden_closet_open.ogg' + close_sound = 'sound/machines/closet/wooden_closet_close.ogg' open_sound_volume = 25 close_sound_volume = 50 contents_pressure_protection = 0.8 can_install_electronics = FALSE elevation = 21 elevation_open = 0 + can_weld_shut = FALSE var/obj/item/tank/internals/emergency_oxygen/tank diff --git a/code/game/objects/structures/crates_lockers/crates/large.dm b/code/game/objects/structures/crates_lockers/crates/large.dm index 0a08d9c7949..b3cce9609c0 100644 --- a/code/game/objects/structures/crates_lockers/crates/large.dm +++ b/code/game/objects/structures/crates_lockers/crates/large.dm @@ -9,12 +9,13 @@ material_drop_amount = 4 delivery_icon = "deliverybox" integrity_failure = 0 //Makes the crate break when integrity reaches 0, instead of opening and becoming an invisible sprite. - open_sound = 'sound/machines/wooden_closet_open.ogg' - close_sound = 'sound/machines/wooden_closet_close.ogg' + open_sound = 'sound/machines/closet/wooden_closet_open.ogg' + close_sound = 'sound/machines/closet/wooden_closet_close.ogg' open_sound_volume = 25 close_sound_volume = 50 can_install_electronics = FALSE elevation = 22 + can_weld_shut = FALSE // Stops people from "diving into" a crate you can't open normally divable = FALSE @@ -39,7 +40,7 @@ user.visible_message(span_notice("[user] pries \the [src] open."), \ span_notice("You pry open \the [src]."), \ span_hear("You hear splitting wood.")) - playsound(src.loc, 'sound/weapons/slashmiss.ogg', 75, TRUE) + playsound(src.loc, 'sound/items/weapons/slashmiss.ogg', 75, TRUE) var/turf/T = get_turf(src) for(var/i in 1 to material_drop_amount) diff --git a/code/game/objects/structures/crates_lockers/crates/syndicrate.dm b/code/game/objects/structures/crates_lockers/crates/syndicrate.dm index 8403f822135..a686282f287 100644 --- a/code/game/objects/structures/crates_lockers/crates/syndicrate.dm +++ b/code/game/objects/structures/crates_lockers/crates/syndicrate.dm @@ -52,7 +52,7 @@ unlock_contents = list() qdel(item) to_chat(user, span_notice("You twist the key into both locks at once, opening the crate.")) - playsound(src, 'sound/machines/boltsup.ogg', 50, vary = FALSE) + playsound(src, 'sound/machines/airlock/boltsup.ogg', 50, vary = FALSE) togglelock(user) /obj/structure/closet/crate/secure/syndicrate/togglelock(mob/living/user, silent) diff --git a/code/game/objects/structures/crates_lockers/crates/wooden.dm b/code/game/objects/structures/crates_lockers/crates/wooden.dm index 5ff3c69aa6b..5703cb6ddcb 100644 --- a/code/game/objects/structures/crates_lockers/crates/wooden.dm +++ b/code/game/objects/structures/crates_lockers/crates/wooden.dm @@ -5,8 +5,8 @@ material_drop_amount = 6 icon_state = "wooden" base_icon_state = "wooden" - open_sound = 'sound/machines/wooden_closet_open.ogg' - close_sound = 'sound/machines/wooden_closet_close.ogg' + open_sound = 'sound/machines/closet/wooden_closet_open.ogg' + close_sound = 'sound/machines/closet/wooden_closet_close.ogg' open_sound_volume = 25 close_sound_volume = 50 paint_jobs = null diff --git a/code/game/objects/structures/curtains.dm b/code/game/objects/structures/curtains.dm index be4180b5fa1..a571009d0a6 100644 --- a/code/game/objects/structures/curtains.dm +++ b/code/game/objects/structures/curtains.dm @@ -81,11 +81,11 @@ switch(damage_type) if(BRUTE) if(damage_amount) - playsound(src.loc, 'sound/weapons/slash.ogg', 80, TRUE) + playsound(src.loc, 'sound/items/weapons/slash.ogg', 80, TRUE) else - playsound(loc, 'sound/weapons/tap.ogg', 50, TRUE) + playsound(loc, 'sound/items/weapons/tap.ogg', 50, TRUE) if(BURN) - playsound(loc, 'sound/items/welder.ogg', 80, TRUE) + playsound(loc, 'sound/items/tools/welder.ogg', 80, TRUE) /obj/structure/curtain/bounty icon_type = "bounty" diff --git a/code/game/objects/structures/deployable_turret.dm b/code/game/objects/structures/deployable_turret.dm index 908d2348db4..e9162294c8f 100644 --- a/code/game/objects/structures/deployable_turret.dm +++ b/code/game/objects/structures/deployable_turret.dm @@ -27,9 +27,9 @@ var/warned = FALSE var/list/calculated_projectile_vars /// Sound to play at the end of a burst - var/overheatsound = 'sound/weapons/sear.ogg' + var/overheatsound = 'sound/items/weapons/sear.ogg' /// Sound to play when firing - var/firesound = 'sound/weapons/gun/smg/shot.ogg' + var/firesound = 'sound/items/weapons/gun/smg/shot.ogg' /// If using a wrench on the turret will start undeploying it var/can_be_undeployed = FALSE /// What gets spawned if the object is undeployed @@ -70,7 +70,7 @@ //BUCKLE HOOKS /obj/machinery/deployable_turret/unbuckle_mob(mob/living/buckled_mob, force = FALSE, can_fall = TRUE) - playsound(src,'sound/mecha/mechmove01.ogg', 50, TRUE) + playsound(src,'sound/vehicles/mecha/mechmove01.ogg', 50, TRUE) for(var/obj/item/I in buckled_mob.held_items) if(istype(I, /obj/item/gun_control)) qdel(I) @@ -103,7 +103,7 @@ M.pixel_y = 14 layer = ABOVE_MOB_LAYER setDir(SOUTH) - playsound(src,'sound/mecha/mechmove01.ogg', 50, TRUE) + playsound(src,'sound/vehicles/mecha/mechmove01.ogg', 50, TRUE) set_anchored(TRUE) if(M.client) M.client.view_size.setTo(view_range) @@ -221,8 +221,8 @@ number_of_shots = 3 cooldown_duration = 2 SECONDS rate_of_fire = 2 - firesound = 'sound/weapons/gun/hmg/hmg.ogg' - overheatsound = 'sound/weapons/gun/smg/smgrack.ogg' + firesound = 'sound/items/weapons/gun/hmg/hmg.ogg' + overheatsound = 'sound/items/weapons/gun/smg/smgrack.ogg' can_be_undeployed = TRUE spawned_on_undeploy = /obj/item/deployable_turret_folded @@ -259,11 +259,11 @@ M.attacked_by(src, user) add_fingerprint(user) -/obj/item/gun_control/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) +/obj/item/gun_control/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) var/obj/machinery/deployable_turret/E = user.buckled E.calculated_projectile_vars = calculate_projectile_angle_and_pixel_offsets(user, interacting_with, modifiers) E.direction_track(user, interacting_with) E.checkfire(interacting_with, user) -/obj/item/gun_control/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) - return interact_with_atom(interacting_with, user, modifiers) +/obj/item/gun_control/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + return ranged_interact_with_atom(interacting_with, user, modifiers) diff --git a/code/game/objects/structures/destructible_structures.dm b/code/game/objects/structures/destructible_structures.dm index beffa5d4fd7..e64779c31ed 100644 --- a/code/game/objects/structures/destructible_structures.dm +++ b/code/game/objects/structures/destructible_structures.dm @@ -1,7 +1,7 @@ /obj/structure/destructible //a base for destructible structures max_integrity = 100 - var/break_message = "The strange, admin-y structure breaks!" //The message shown when a structure breaks - var/break_sound = 'sound/magic/clockwork/invoke_general.ogg' //The sound played when a structure breaks + var/break_message = span_warning("The strange, admin-y structure breaks!") //The message shown when a structure breaks + var/break_sound = 'sound/effects/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/atom_deconstruct(disassembled = TRUE) diff --git a/code/game/objects/structures/detectiveboard.dm b/code/game/objects/structures/detectiveboard.dm index f9d0560dfde..27c11cda5a0 100644 --- a/code/game/objects/structures/detectiveboard.dm +++ b/code/game/objects/structures/detectiveboard.dm @@ -50,11 +50,11 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/detectiveboard, 32) to_chat(user, "You already attaching evidence!") return attaching_evidence = TRUE - var/name = tgui_input_text(user, "Please enter the evidence name", "Detective's Board") + var/name = tgui_input_text(user, "Please enter the evidence name", "Detective's Board", max_length = MAX_NAME_LEN) if(!name) attaching_evidence = FALSE return - var/desc = tgui_input_text(user, "Please enter the evidence description", "Detective's Board") + var/desc = tgui_input_text(user, "Please enter the evidence description", "Detective's Board", max_length = MAX_DESC_LEN) if(!desc) attaching_evidence = FALSE return @@ -146,7 +146,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/detectiveboard, 32) if("add_case") if(cases.len == MAX_CASES) return FALSE - var/new_case = tgui_input_text(user, "Please enter the case name", "Detective's Board") + var/new_case = tgui_input_text(user, "Please enter the case name", "Detective's Board", max_length = MAX_NAME_LEN) if(!new_case) return FALSE var/case_color = tgui_input_list(user, "Please choose case color", "Detective's Board", case_colors) @@ -173,7 +173,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/detectiveboard, 32) update_appearance(UPDATE_ICON) return TRUE if("rename_case") - var/new_name = tgui_input_text(user, "Please ender the case new name", "Detective's Board") + var/new_name = tgui_input_text(user, "Please enter the new name for the case", "Detective's Board", max_length = MAX_NAME_LEN) if(new_name) var/datum/case/case = locate(params["case_ref"]) in cases case.name = new_name diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index 20ad3235b03..3334c9b9dbe 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -77,9 +77,9 @@ /obj/structure/displaycase/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) switch(damage_type) if(BRUTE) - playsound(src, 'sound/effects/glasshit.ogg', 75, TRUE) + playsound(src, 'sound/effects/glass/glasshit.ogg', 75, TRUE) if(BURN) - playsound(src, 'sound/items/welder.ogg', 100, TRUE) + playsound(src, 'sound/items/tools/welder.ogg', 100, TRUE) /obj/structure/displaycase/atom_deconstruct(disassembled = TRUE) dump() @@ -159,7 +159,7 @@ toggle_lock(user) else if(open && !showpiece) insert_showpiece(attacking_item, user) - return TRUE //cancel the attack chain, wether we successfully placed an item or not + return TRUE //cancel the attack chain, whether we successfully placed an item or not else if(glass_fix && broken && istype(attacking_item, /obj/item/stack/sheet/glass)) var/obj/item/stack/sheet/glass/glass_sheet = attacking_item if(glass_sheet.get_amount() < 2) @@ -387,7 +387,7 @@ /obj/structure/displaycase/trophy/proc/toggle_historian_mode(mob/user) historian_mode = !historian_mode balloon_alert(user, "[historian_mode ? "enabled" : "disabled"] historian mode.") - playsound(src, 'sound/machines/twobeep.ogg', vary = 50) + playsound(src, 'sound/machines/beep/twobeep.ogg', vary = 50) SStgui.update_uis(src) /obj/structure/displaycase/trophy/toggle_lock(mob/user) @@ -426,7 +426,7 @@ return if("change_message") if(showpiece && !holographic_showpiece) - var/new_trophy_message = tgui_input_text(usr, "Let's make history!", "Trophy Message", trophy_message, MAX_PLAQUE_LEN) + var/new_trophy_message = tgui_input_text(usr, "Let's make history!", "Trophy Message", trophy_message, max_length = MAX_PLAQUE_LEN) if(!new_trophy_message) return trophy_message = new_trophy_message @@ -576,7 +576,7 @@ if(!potential_acc || !potential_acc.registered_account) return if(!check_access(potential_acc)) - playsound(src, 'sound/machines/buzz-sigh.ogg', 50, TRUE) + playsound(src, 'sound/machines/buzz/buzz-sigh.ogg', 50, TRUE) return toggle_lock() if("Register") @@ -585,13 +585,13 @@ if(!potential_acc || !potential_acc.registered_account) return if(!check_access(potential_acc)) - playsound(src, 'sound/machines/buzz-sigh.ogg', 50, TRUE) + playsound(src, 'sound/machines/buzz/buzz-sigh.ogg', 50, TRUE) return payments_acc = potential_acc.registered_account playsound(src, 'sound/machines/click.ogg', 20, TRUE) if("Adjust") if(!check_access(potential_acc) || potential_acc.registered_account != payments_acc) - playsound(src, 'sound/machines/buzz-sigh.ogg', 50, TRUE) + playsound(src, 'sound/machines/buzz/buzz-sigh.ogg', 50, TRUE) return var/new_price_input = tgui_input_number(usr, "Sale price for this vend-a-tray", "New Price", 10, 1000) diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm index 9493a7c9414..5fc9bf674c1 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -83,7 +83,7 @@ /obj/structure/door_assembly/attackby(obj/item/W, mob/living/user, params) if(IS_WRITING_UTENSIL(W) && !user.combat_mode) - var/t = tgui_input_text(user, "Enter the name for the door", "Airlock Renaming", created_name, MAX_NAME_LEN) + var/t = tgui_input_text(user, "Enter the name for the door", "Airlock Renaming", created_name, max_length = MAX_NAME_LEN) if(!t) return if(!in_range(src, usr) && loc != usr) @@ -219,7 +219,7 @@ if(!noglass) if(!glass) if(istype(G, /obj/item/stack/sheet/rglass) || istype(G, /obj/item/stack/sheet/glass)) - playsound(src, 'sound/items/crowbar.ogg', 100, TRUE) + playsound(src, 'sound/items/tools/crowbar.ogg', 100, TRUE) user.visible_message(span_notice("[user] adds [G.name] to the airlock assembly."), \ span_notice("You start to install [G.name] into the airlock assembly...")) if(do_after(user, 4 SECONDS, target = src)) @@ -242,7 +242,7 @@ to_chat(user, span_warning("You cannot add [G] to [src]!")) return if(G.get_amount() >= 2) - playsound(src, 'sound/items/crowbar.ogg', 100, TRUE) + playsound(src, 'sound/items/tools/crowbar.ogg', 100, TRUE) user.visible_message(span_notice("[user] adds [G.name] to the airlock assembly."), \ span_notice("You start to install [G.name] into the airlock assembly...")) if(do_after(user, 4 SECONDS, target = src)) diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm index 0564223a7c7..a4d35f02e0c 100644 --- a/code/game/objects/structures/false_walls.dm +++ b/code/game/objects/structures/false_walls.dm @@ -130,7 +130,7 @@ if(tool) tool.play_tool_sound(src, 100) else - playsound(src, 'sound/items/welder.ogg', 100, TRUE) + playsound(src, 'sound/items/tools/welder.ogg', 100, TRUE) deconstruct(disassembled) /obj/structure/falsewall/atom_deconstruct(disassembled = TRUE) diff --git a/code/game/objects/structures/fireaxe.dm b/code/game/objects/structures/fireaxe.dm index ab69b7bc7a4..7af4dd0f6c0 100644 --- a/code/game/objects/structures/fireaxe.dm +++ b/code/game/objects/structures/fireaxe.dm @@ -95,9 +95,9 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/fireaxecabinet, 32) if(broken) playsound(loc, 'sound/effects/hit_on_shattered_glass.ogg', 90, TRUE) else - playsound(loc, 'sound/effects/glasshit.ogg', 90, TRUE) + playsound(loc, 'sound/effects/glass/glasshit.ogg', 90, TRUE) if(BURN) - playsound(src.loc, 'sound/items/welder.ogg', 100, TRUE) + playsound(src.loc, 'sound/items/tools/welder.ogg', 100, TRUE) /obj/structure/fireaxecabinet/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = TRUE, attack_dir) if(open) @@ -111,7 +111,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/fireaxecabinet, 32) if(!broken) update_appearance() broken = TRUE - playsound(src, 'sound/effects/glassbr3.ogg', 100, TRUE) + playsound(src, 'sound/effects/glass/glassbr3.ogg', 100, TRUE) new /obj/item/shard(loc) new /obj/item/shard(loc) diff --git a/code/game/objects/structures/fireplace.dm b/code/game/objects/structures/fireplace.dm index 150250c8278..675756e6609 100644 --- a/code/game/objects/structures/fireplace.dm +++ b/code/game/objects/structures/fireplace.dm @@ -68,26 +68,25 @@ var/logs_used = min(space_for_logs, wood.amount) wood.use(logs_used) adjust_fuel_timer(LOG_BURN_TIMER * logs_used) - user.visible_message("[user] tosses some \ - wood into [src].", "You add \ - some fuel to [src].") - else if(istype(T, /obj/item/paper_bin)) + user.visible_message(span_notice("[user] tosses some wood into [src]."), span_notice("You add some fuel to [src].")) + return + + if(istype(T, /obj/item/paper_bin)) var/obj/item/paper_bin/paper_bin = T - user.visible_message("[user] throws [T] into \ - [src].", "You add [T] to [src].\ - ") + user.visible_message(span_notice("[user] throws [T] into [src]."), span_notice("You add [T] to [src].")) adjust_fuel_timer(PAPER_BURN_TIMER * paper_bin.total_paper) qdel(paper_bin) - else if(istype(T, /obj/item/paper)) - user.visible_message("[user] throws [T] into \ - [src].", "You throw [T] into [src].\ - ") + return + + if(istype(T, /obj/item/paper)) + user.visible_message(span_notice("[user] throws [T] into [src]."), span_notice("You throw [T] into [src].")) adjust_fuel_timer(PAPER_BURN_TIMER) qdel(T) - else if(try_light(T,user)) return - else - . = ..() + + if(try_light(T,user)) + return + return ..() /obj/structure/fireplace/update_overlays() . = ..() diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index c9804fab0f8..0f5c5aaedf5 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -512,7 +512,7 @@ /obj/structure/girder/bronze/attackby(obj/item/W, mob/living/user, params) add_fingerprint(user) if(W.tool_behaviour == TOOL_WELDER) - if(!W.tool_start_check(user, amount = 0)) + if(!W.tool_start_check(user, amount = 0, heat_required = HIGH_TEMPERATURE_REQUIRED)) return balloon_alert(user, "slicing apart...") if(W.use_tool(src, user, 40, volume=50)) diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index aa9af66868f..4aaba04bc18 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -286,9 +286,9 @@ if(damage_amount) playsound(src, 'sound/effects/grillehit.ogg', 80, TRUE) else - playsound(src, 'sound/weapons/tap.ogg', 50, TRUE) + playsound(src, 'sound/items/weapons/tap.ogg', 50, TRUE) if(BURN) - playsound(src, 'sound/items/welder.ogg', 80, TRUE) + playsound(src, 'sound/items/tools/welder.ogg', 80, TRUE) /obj/structure/grille/atom_deconstruct(disassembled = TRUE) @@ -359,7 +359,7 @@ return FALSE var/obj/structure/cable/C = T.get_cable_node() if(C) - playsound(src, 'sound/magic/lightningshock.ogg', 100, TRUE, extrarange = 5) + playsound(src, 'sound/effects/magic/lightningshock.ogg', 100, TRUE, extrarange = 5) tesla_zap(source = src, zap_range = 3, power = C.newavail() * 0.01, cutoff = 1e3, zap_flags = ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE | ZAP_MOB_STUN | ZAP_LOW_POWER_GEN | ZAP_ALLOW_DUPLICATES) //Zap for 1/100 of the amount of power. At a million watts in the grid, it will be as powerful as a tesla revolver shot. C.add_delayedload(C.newavail() * 0.0375) // you can gain up to 3.5 via the 4x upgrades power is halved by the pole so thats 2x then 1X then .5X for 3.5x the 3 bounces shock. // What do you mean by this? return ..() diff --git a/code/game/objects/structures/guillotine.dm b/code/game/objects/structures/guillotine.dm index a51e82498e2..f46caa48c7b 100644 --- a/code/game/objects/structures/guillotine.dm +++ b/code/game/objects/structures/guillotine.dm @@ -43,7 +43,7 @@ buckle_prevents_pull = TRUE layer = ABOVE_MOB_LAYER /// The sound the guillotine makes when it successfully cuts off a head - var/drop_sound = 'sound/weapons/guillotine.ogg' + var/drop_sound = 'sound/items/weapons/guillotine.ogg' /// The current state of the blade var/blade_status = GUILLOTINE_BLADE_RAISED /// How sharp the blade is diff --git a/code/game/objects/structures/gym/punching_bag.dm b/code/game/objects/structures/gym/punching_bag.dm index 59ccf6f23c2..bba9e4f715c 100644 --- a/code/game/objects/structures/gym/punching_bag.dm +++ b/code/game/objects/structures/gym/punching_bag.dm @@ -7,13 +7,13 @@ layer = ABOVE_MOB_LAYER ///List of sounds that can be played when punched. var/static/list/hit_sounds = list( - 'sound/weapons/genhit1.ogg', - 'sound/weapons/genhit2.ogg', - 'sound/weapons/genhit3.ogg', - 'sound/weapons/punch1.ogg', - 'sound/weapons/punch2.ogg', - 'sound/weapons/punch3.ogg', - 'sound/weapons/punch4.ogg', + 'sound/items/weapons/genhit1.ogg', + 'sound/items/weapons/genhit2.ogg', + 'sound/items/weapons/genhit3.ogg', + 'sound/items/weapons/punch1.ogg', + 'sound/items/weapons/punch2.ogg', + 'sound/items/weapons/punch3.ogg', + 'sound/items/weapons/punch4.ogg', ) /obj/structure/punching_bag/Initialize(mapload) diff --git a/code/game/objects/structures/holosign.dm b/code/game/objects/structures/holosign.dm index 30983c5088d..6d86b5f7a30 100644 --- a/code/game/objects/structures/holosign.dm +++ b/code/game/objects/structures/holosign.dm @@ -52,9 +52,9 @@ /obj/structure/holosign/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) switch(damage_type) if(BRUTE) - playsound(loc, 'sound/weapons/egloves.ogg', 80, TRUE) + playsound(loc, 'sound/items/weapons/egloves.ogg', 80, TRUE) if(BURN) - playsound(loc, 'sound/weapons/egloves.ogg', 80, TRUE) + playsound(loc, 'sound/items/weapons/egloves.ogg', 80, TRUE) /obj/structure/holosign/proc/create_vis_overlay() var/turf/our_turf = get_turf(src) @@ -135,11 +135,11 @@ if(!opened) density = FALSE opened = TRUE - playsound(src, 'sound/machines/door_open.ogg', 50, TRUE) + playsound(src, 'sound/machines/door/door_open.ogg', 50, TRUE) else density = TRUE opened = FALSE - playsound(src, 'sound/machines/door_close.ogg', 50, TRUE) + playsound(src, 'sound/machines/door/door_close.ogg', 50, TRUE) update_icon_state() COOLDOWN_START(src, cooldown_open, 1 SECONDS) @@ -262,7 +262,7 @@ if(!COOLDOWN_FINISHED(src, virus_detected)) return - playsound(get_turf(src),'sound/machines/buzz-sigh.ogg', 65, TRUE, 4) + playsound(get_turf(src),'sound/machines/buzz/buzz-sigh.ogg', 65, TRUE, 4) COOLDOWN_START(src, virus_detected, 1 SECONDS) icon_state = "holo_medical-deny" update_icon_state() diff --git a/code/game/objects/structures/icemoon/cave_entrance.dm b/code/game/objects/structures/icemoon/cave_entrance.dm index 6efa6718759..fb082b72456 100644 --- a/code/game/objects/structures/icemoon/cave_entrance.dm +++ b/code/game/objects/structures/icemoon/cave_entrance.dm @@ -49,7 +49,7 @@ GLOBAL_LIST_INIT(ore_probability, list( * */ /obj/structure/spawner/ice_moon/proc/destroy_effect() - playsound(loc,'sound/effects/explosionfar.ogg', 200, TRUE) + playsound(loc,'sound/effects/explosion/explosionfar.ogg', 200, TRUE) visible_message(span_boldannounce("[src] collapses, sealing everything inside!
\nOres fall out of the cave as it is destroyed!")) /** diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm index a213d915c0f..7d6ec9edf2d 100644 --- a/code/game/objects/structures/kitchen_spike.dm +++ b/code/game/objects/structures/kitchen_spike.dm @@ -34,7 +34,7 @@ return CONTEXTUAL_SCREENTIP_SET /obj/structure/kitchenspike_frame/welder_act(mob/living/user, obj/item/tool) - if(!tool.tool_start_check(user, amount = 0)) + if(!tool.tool_start_check(user, amount = 0, heat_required = HIGH_TEMPERATURE_REQUIRED)) return FALSE to_chat(user, span_notice("You begin cutting \the [src] apart...")) if(!tool.use_tool(src, user, 5 SECONDS, volume = 50)) diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index 0d7d2319174..0b553261300 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -162,7 +162,7 @@ to_chat(user, span_warning("You need one floor tile to build atop [src].")) return to_chat(user, span_notice("You construct new plating with [src] as support.")) - playsound(src, 'sound/weapons/genhit.ogg', 50, TRUE) + playsound(src, 'sound/items/weapons/genhit.ogg', 50, TRUE) var/turf/turf_we_place_on = get_turf(src) turf_we_place_on.place_on_top(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) diff --git a/code/game/objects/structures/lavaland/gulag_vent.dm b/code/game/objects/structures/lavaland/gulag_vent.dm index c269c5213e7..8cb530e31b1 100644 --- a/code/game/objects/structures/lavaland/gulag_vent.dm +++ b/code/game/objects/structures/lavaland/gulag_vent.dm @@ -47,4 +47,4 @@ new spawned_boulder(get_turf(living_user)) living_user.visible_message(span_notice("[living_user] hauls a boulder out of [src].")) living_user.apply_damage(stamina_damage_to_inflict, STAMINA) - playsound(src, 'sound/weapons/genhit.ogg', vol = 50, vary = TRUE) + playsound(src, 'sound/items/weapons/genhit.ogg', vol = 50, vary = TRUE) diff --git a/code/game/objects/structures/lavaland/necropolis_tendril.dm b/code/game/objects/structures/lavaland/necropolis_tendril.dm index bf69b23238c..b169868a85f 100644 --- a/code/game/objects/structures/lavaland/necropolis_tendril.dm +++ b/code/game/objects/structures/lavaland/necropolis_tendril.dm @@ -131,7 +131,7 @@ GLOBAL_LIST_INIT(tendrils, list()) /obj/effect/collapse/proc/collapse() for(var/mob/M in range(7,src)) shake_camera(M, 15, 1) - playsound(get_turf(src),'sound/effects/explosionfar.ogg', 200, TRUE) + playsound(get_turf(src),'sound/effects/explosion/explosionfar.ogg', 200, TRUE) visible_message(span_boldannounce("The tendril falls inward, the ground around it widening into a yawning chasm!")) for(var/turf/T in RANGE_TURFS(2,src)) if(HAS_TRAIT(T, TRAIT_NO_TERRAFORM)) diff --git a/code/game/objects/structures/lavaland/ore_vent.dm b/code/game/objects/structures/lavaland/ore_vent.dm index f9214b989b9..adf888a2d9c 100644 --- a/code/game/objects/structures/lavaland/ore_vent.dm +++ b/code/game/objects/structures/lavaland/ore_vent.dm @@ -121,7 +121,7 @@ for(var/i in 1 to 3) if(do_after(user, boulder_size * 1 SECONDS, src)) user.apply_damage(20, STAMINA) - playsound(src, 'sound/weapons/genhit.ogg', 50, TRUE) + playsound(src, 'sound/items/weapons/genhit.ogg', 50, TRUE) produce_boulder(TRUE) visible_message(span_notice("You've successfully produced a boulder! Boy are your arms tired.")) @@ -263,39 +263,40 @@ * If the node drone is dead, the ore vent is not tapped and the wave defense can be reattempted. * * Also gives xp and mining points to all nearby miners in equal measure. + * Arguments: + * - force: Set to true if you want to just skip all checks and make the vent start producing boulders. */ -/obj/structure/ore_vent/proc/handle_wave_conclusion() +/obj/structure/ore_vent/proc/handle_wave_conclusion(force = FALSE) SIGNAL_HANDLER SEND_SIGNAL(src, COMSIG_VENT_WAVE_CONCLUDED) COOLDOWN_RESET(src, wave_cooldown) particles = null - if(!QDELETED(node)) - if(get_turf(node) != get_turf(src)) - visible_message(span_danger("The [node] detaches from the [src], and the vent closes back up!")) - icon_state = initial(icon_state) - update_appearance(UPDATE_ICON_STATE) - UnregisterSignal(node, COMSIG_MOVABLE_MOVED) - node.pre_escape(success = FALSE) - node = null - return //Start over! - - tapped = TRUE //The Node Drone has survived the wave defense, and the ore vent is tapped. - SSore_generation.processed_vents += src - log_game("Ore vent [key_name_and_tag(src)] was tapped") - SSblackbox.record_feedback("tally", "ore_vent_completed", 1, type) - balloon_alert_to_viewers("vent tapped!") - icon_state = icon_state_tapped - update_appearance(UPDATE_ICON_STATE) - qdel(GetComponent(/datum/component/gps)) - UnregisterSignal(node, COMSIG_QDELETING) - else + if(QDELETED(node) && !force) visible_message(span_danger("\the [src] creaks and groans as the mining attempt fails, and the vent closes back up.")) icon_state = initial(icon_state) update_appearance(UPDATE_ICON_STATE) node = null return //Bad end, try again. + else if(!QDELETED(node) && get_turf(node) != get_turf(src) && !force) + visible_message(span_danger("The [node] detaches from the [src], and the vent closes back up!")) + icon_state = initial(icon_state) + update_appearance(UPDATE_ICON_STATE) + UnregisterSignal(node, COMSIG_MOVABLE_MOVED) + node.pre_escape(success = FALSE) + node = null + return //Start over! + + tapped = TRUE //The Node Drone has survived the wave defense, and the ore vent is tapped. + SSore_generation.processed_vents += src + log_game("Ore vent [key_name_and_tag(src)] was tapped") + SSblackbox.record_feedback("tally", "ore_vent_completed", 1, type) + balloon_alert_to_viewers("vent tapped!") + icon_state = icon_state_tapped + update_appearance(UPDATE_ICON_STATE) + qdel(GetComponent(/datum/component/gps)) + UnregisterSignal(node, COMSIG_QDELETING) for(var/mob/living/miner in range(7, src)) //Give the miners who are near the vent points and xp. var/obj/item/card/id/user_id_card = miner.get_idcard(TRUE) @@ -307,7 +308,7 @@ if(user_id_card.registered_account) user_id_card.registered_account.mining_points += point_reward_val user_id_card.registered_account.bank_card_talk("You have been awarded [point_reward_val] mining points for your efforts.") - node.pre_escape() //Visually show the drone is done and flies away. + node?.pre_escape() //Visually show the drone is done and flies away. node = null add_overlay(mutable_appearance('icons/obj/mining_zones/terrain.dmi', "well", ABOVE_MOB_LAYER)) @@ -426,7 +427,7 @@ /** * When the ore vent cannot spawn a mob due to being blocked from all sides, we cause some MILD, MILD explosions. - * Explosion matches a gibtonite light explosion, as a way to clear neartby solid structures, with a high likelyhood of breaking the NODE drone. + * Explosion matches a gibtonite light explosion, as a way to clear nearby solid structures, with a high likelihood of breaking the NODE drone. */ /obj/structure/ore_vent/proc/anti_cheese() explosion(src, heavy_impact_range = 1, light_impact_range = 3, flame_range = 0, flash_range = 0, adminlog = FALSE) diff --git a/code/game/objects/structures/life_candle.dm b/code/game/objects/structures/life_candle.dm index 7c9250ed9a2..d9eb81c783c 100644 --- a/code/game/objects/structures/life_candle.dm +++ b/code/game/objects/structures/life_candle.dm @@ -22,7 +22,7 @@ var/datum/outfit/outfit // How long until we respawn them after their death. var/respawn_time = 50 - var/respawn_sound = 'sound/magic/staff_animation.ogg' + var/respawn_sound = 'sound/effects/magic/staff_animation.ogg' /obj/structure/life_candle/Initialize(mapload) . = ..() diff --git a/code/game/objects/structures/maintenance.dm b/code/game/objects/structures/maintenance.dm index 9f88246966f..d3eb552c46b 100644 --- a/code/game/objects/structures/maintenance.dm +++ b/code/game/objects/structures/maintenance.dm @@ -1,9 +1,9 @@ /** This structure acts as a source of moisture loving cell lines, -as well as a location where a hidden item can somtimes be retrieved +as well as a location where a hidden item can sometimes be retrieved at the cost of risking a vicious bite.**/ /obj/structure/moisture_trap name = "moisture trap" - desc = "A device installed in order to control moisture in poorly ventilated areas.\nThe stagnant water inside basin seems to produce serious biofouling issues when improperly maintained.\nThis unit in particular seems to be teeming with life!\nWho thought mother Gaia could assert herself so vigoriously in this sterile and desolate place?" + desc = "A device installed in order to control moisture in poorly ventilated areas.\nThe stagnant water inside basin seems to produce serious biofouling issues when improperly maintained.\nThis unit in particular seems to be teeming with life!\nWho thought mother Gaia could assert herself so vigorously in this sterile and desolate place?" icon_state = "moisture_trap" anchored = TRUE density = FALSE @@ -58,7 +58,7 @@ at the cost of risking a vicious bite.**/ if(!isliving(user)) return FALSE var/mob/living/living_user = user - if(living_user.body_position == STANDING_UP && ishuman(living_user)) //I dont think monkeys can crawl on command. + if(living_user.body_position == STANDING_UP && ishuman(living_user)) //I don't think monkeys can crawl on command. return FALSE return TRUE @@ -84,7 +84,7 @@ at the cost of risking a vicious bite.**/ to_chat(user, span_danger("You feel a sharp pain as an unseen creature sinks its [pick("fangs", "beak", "proboscis")] into your arm!")) if(affecting?.receive_damage(30)) bite_victim.update_damage_overlays() - playsound(src,'sound/weapons/bite.ogg', 70, TRUE) + playsound(src,'sound/items/weapons/bite.ogg', 70, TRUE) return to_chat(user, span_warning("You find nothing of value...")) @@ -122,8 +122,8 @@ at the cost of risking a vicious bite.**/ desc = "What is this? Who put it on this station? And why does it emanate strange energy?" icon_state = "altar" cult_examine_tip = "Even you don't understand the eldritch magic behind this." - break_message = "The structure shatters, leaving only a demonic screech!" - break_sound = 'sound/magic/demon_dies.ogg' + break_message = span_warning("The structure shatters, leaving only a demonic screech!") + break_sound = 'sound/effects/magic/demon_dies.ogg' light_color = LIGHT_COLOR_BLOOD_MAGIC light_range = 2 use_cooldown_duration = 1 MINUTES @@ -188,7 +188,7 @@ at the cost of risking a vicious bite.**/ status = ALTAR_STAGEONE update_icon() visible_message(span_warning("[src] starts creating something...")) - playsound(src, 'sound/magic/pantsaltar.ogg', 60) + playsound(src, 'sound/effects/magic/pantsaltar.ogg', 60) addtimer(CALLBACK(src, PROC_REF(pants_stagetwo)), ALTAR_TIME) /// Continues the creation, making every mob nearby nauseous. diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index 9f338e2448b..c4c38072cb9 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -272,7 +272,7 @@ GLOBAL_LIST_EMPTY(bodycontainers) //Let them act as spawnpoints for revenants an update_morgue_status() update_appearance(UPDATE_ICON_STATE) if(morgue_state == MORGUE_HAS_REVIVABLE && beeper && COOLDOWN_FINISHED(src, next_beep)) - playsound(src, 'sound/weapons/gun/general/empty_alarm.ogg', 50, FALSE) //Revive them you blind fucks + playsound(src, 'sound/items/weapons/gun/general/empty_alarm.ogg', 50, FALSE) //Revive them you blind fucks COOLDOWN_START(src, next_beep, beep_cooldown) SEND_SIGNAL(src, COMSIG_MORGUE_ALARM) // BUBBER EDIT diff --git a/code/game/objects/structures/mystery_box.dm b/code/game/objects/structures/mystery_box.dm index 9bb51ba09cb..0a0c9ca0a10 100644 --- a/code/game/objects/structures/mystery_box.dm +++ b/code/game/objects/structures/mystery_box.dm @@ -121,8 +121,8 @@ GLOBAL_LIST_INIT(mystery_fishing, list( max_integrity = 99999 damage_deflection = 100 - var/crate_open_sound = 'sound/machines/crate_open.ogg' - var/crate_close_sound = 'sound/machines/crate_close.ogg' + var/crate_open_sound = 'sound/machines/crate/crate_open.ogg' + var/crate_close_sound = 'sound/machines/crate/crate_close.ogg' var/open_sound = 'sound/effects/mysterybox/mbox_full.ogg' var/grant_sound = 'sound/effects/mysterybox/mbox_end.ogg' /// The box's current state, and whether it can be interacted with in different ways @@ -142,7 +142,7 @@ GLOBAL_LIST_INIT(mystery_fishing, list( /// Stores the current sound channel we're using so we can cut off our own sounds as needed. Randomized after each roll var/current_sound_channel /// How many time can it still be used? - var/uses_left + var/uses_left = INFINITY /// A list of weakrefs to mind datums of people that opened it and how many times. var/list/datum/weakref/minds_that_opened_us @@ -281,6 +281,7 @@ GLOBAL_LIST_INIT(mystery_fishing, list( max_integrity = 100 damage_deflection = 30 grant_extra_mag = FALSE + anchored = FALSE /obj/structure/mystery_box/handle_deconstruct(disassembled) new /obj/item/stack/sheet/mineral/wood(drop_location(), 2) diff --git a/code/game/objects/structures/petrified_statue.dm b/code/game/objects/structures/petrified_statue.dm index 5383436d4db..d27a2e8e1cd 100644 --- a/code/game/objects/structures/petrified_statue.dm +++ b/code/game/objects/structures/petrified_statue.dm @@ -13,24 +13,24 @@ /obj/structure/statue/petrified/relaymove() return -/obj/structure/statue/petrified/Initialize(mapload, mob/living/L, statue_timer, save_brain) +/obj/structure/statue/petrified/Initialize(mapload, mob/living/living, statue_timer, save_brain) . = ..() if(statue_timer) timer = statue_timer if(save_brain) brain = save_brain - if(L) - petrified_mob = L - if(L.buckled) - L.buckled.unbuckle_mob(L,force=1) - L.visible_message(span_warning("[L]'s skin rapidly turns to marble!"), span_userdanger("Your body freezes up! Can't... move... can't... think...")) - L.forceMove(src) - ADD_TRAIT(L, TRAIT_MUTE, STATUE_MUTE) - L.faction |= FACTION_MIMIC //Stops mimics from instaqdeling people in statues - L.status_flags |= GODMODE - atom_integrity = L.health + 100 //stoning damaged mobs will result in easier to shatter statues - max_integrity = atom_integrity - START_PROCESSING(SSobj, src) + if(!living) + return + petrified_mob = living + if(living.buckled) + living.buckled.unbuckle_mob(living, force = TRUE) + living.visible_message(span_warning("[living]'s skin rapidly turns to marble!"), span_userdanger("Your body freezes up! Can't... move... can't... think...")) + living.forceMove(src) + living.add_traits(list(TRAIT_GODMODE, TRAIT_MUTE, TRAIT_NOBLOOD), STATUE_MUTE) + living.faction |= FACTION_MIMIC //Stops mimics from instaqdeling people in statues + atom_integrity = living.health + 100 //stoning damaged mobs will result in easier to shatter statues + max_integrity = atom_integrity + START_PROCESSING(SSobj, src) /obj/structure/statue/petrified/process(seconds_per_tick) if(!petrified_mob) @@ -47,6 +47,9 @@ /obj/structure/statue/petrified/Exited(atom/movable/gone, direction) . = ..() if(gone == petrified_mob) + petrified_mob.remove_traits(list(TRAIT_GODMODE, TRAIT_MUTE, TRAIT_NOBLOOD), STATUE_MUTE) + petrified_mob.take_overall_damage((petrified_mob.health - atom_integrity + 100)) //any new damage the statue incurred is transferred to the mob + petrified_mob.faction -= FACTION_MIMIC petrified_mob = null /obj/structure/statue/petrified/Destroy() @@ -64,13 +67,7 @@ for(var/obj/O in src) O.forceMove(loc) - if(petrified_mob) - petrified_mob.status_flags &= ~GODMODE - REMOVE_TRAIT(petrified_mob, TRAIT_MUTE, STATUE_MUTE) - REMOVE_TRAIT(petrified_mob, TRAIT_NOBLOOD, MAGIC_TRAIT) - petrified_mob.take_overall_damage((petrified_mob.health - atom_integrity + 100)) //any new damage the statue incurred is transferred to the mob - petrified_mob.faction -= FACTION_MIMIC - petrified_mob.forceMove(loc) + petrified_mob?.forceMove(loc) return ..() /obj/structure/statue/petrified/atom_deconstruct(disassembled = TRUE) @@ -114,7 +111,6 @@ return FALSE var/obj/structure/statue/petrified/S = new(loc, src, statue_timer, save_brain) S.name = "statue of [name]" - ADD_TRAIT(src, TRAIT_NOBLOOD, MAGIC_TRAIT) S.copy_overlays(src) var/newcolor = list(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0)) if(colorlist) diff --git a/code/game/objects/structures/pinatas.dm b/code/game/objects/structures/pinatas.dm index 6483d39b1a2..56a258a45f7 100644 --- a/code/game/objects/structures/pinatas.dm +++ b/code/game/objects/structures/pinatas.dm @@ -28,18 +28,18 @@ . = ..() if(get_integrity() < (max_integrity/2)) icon_state = "[base_icon_state]_damaged" - if(damage_amount >= 10) // Swing means minimum damage threshhold for dropping candy is met. + if(damage_amount >= 10) // Swing means minimum damage threshold for dropping candy is met. flick("[icon_state]_swing", src) /obj/structure/pinata/play_attack_sound(damage_amount, damage_type, damage_flag) switch(damage_type) if(BRUTE) if(damage_amount) - playsound(src, 'sound/weapons/slash.ogg', 50, TRUE) + playsound(src, 'sound/items/weapons/slash.ogg', 50, TRUE) else - playsound(src, 'sound/weapons/tap.ogg', 50, TRUE) + playsound(src, 'sound/items/weapons/tap.ogg', 50, TRUE) if(BURN) - playsound(src, 'sound/items/welder.ogg', 100, TRUE) + playsound(src, 'sound/items/tools/welder.ogg', 100, TRUE) /obj/structure/pinata/atom_deconstruct(disassembled) new debris(get_turf(src)) diff --git a/code/game/objects/structures/plaques/_plaques.dm b/code/game/objects/structures/plaques/_plaques.dm index 1277869dbf6..951a538e724 100644 --- a/code/game/objects/structures/plaques/_plaques.dm +++ b/code/game/objects/structures/plaques/_plaques.dm @@ -88,7 +88,7 @@ var/namechoice = tgui_input_text(user, "Title this plaque. (e.g. 'Best HoP Award', 'Great Ashwalker War Memorial')", "Plaque Customization", max_length = MAX_NAME_LEN) if(!namechoice) return - var/descriptionchoice = tgui_input_text(user, "Engrave this plaque's text", "Plaque Customization") + var/descriptionchoice = tgui_input_text(user, "Engrave this plaque's text", "Plaque Customization", max_length = MAX_PLAQUE_LEN) if(!descriptionchoice) return if(!Adjacent(user)) //Make sure user is adjacent still @@ -161,7 +161,7 @@ var/namechoice = tgui_input_text(user, "Title this plaque. (e.g. 'Best HoP Award', 'Great Ashwalker War Memorial')", "Plaque Customization", max_length = MAX_NAME_LEN) if(!namechoice) return - var/descriptionchoice = tgui_input_text(user, "Engrave this plaque's text", "Plaque Customization") + var/descriptionchoice = tgui_input_text(user, "Engrave this plaque's text", "Plaque Customization", max_length = MAX_PLAQUE_LEN) if(!descriptionchoice) return if(!Adjacent(user)) //Make sure user is adjacent still diff --git a/code/game/objects/structures/railings.dm b/code/game/objects/structures/railings.dm index 55ff2261d7d..2481d1307ea 100644 --- a/code/game/objects/structures/railings.dm +++ b/code/game/objects/structures/railings.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/railings.dmi' icon_state = "railing" flags_1 = ON_BORDER_1 - obj_flags = CAN_BE_HIT | BLOCKS_CONSTRUCTION_DIR + obj_flags = CAN_BE_HIT | BLOCKS_CONSTRUCTION_DIR | IGNORE_DENSITY density = TRUE anchored = TRUE pass_flags_self = LETPASSTHROW|PASSSTRUCTURE @@ -102,6 +102,10 @@ /obj/structure/railing/wirecutter_act(mob/living/user, obj/item/I) . = ..() + if(resistance_flags & INDESTRUCTIBLE) + to_chat(user, span_warning("You try to cut apart the railing, but it's too hard!")) + I.play_tool_sound(src, 100) + return TRUE to_chat(user, span_warning("You cut apart the railing.")) I.play_tool_sound(src, 100) deconstruct() diff --git a/code/game/objects/structures/safe.dm b/code/game/objects/structures/safe.dm index 14e3b53680d..b2796019f16 100644 --- a/code/game/objects/structures/safe.dm +++ b/code/game/objects/structures/safe.dm @@ -234,7 +234,7 @@ FLOOR SAFES if(!canhear) return if(current_tick == 2) - to_chat(user, "The sounds from [src] are too fast and blend together.") + to_chat(user, span_italics("The sounds from [src] are too fast and blend together.")) if(total_ticks == 1 || prob(SOUND_CHANCE)) balloon_alert(user, pick(sounds)) diff --git a/code/game/objects/structures/signs/_signs.dm b/code/game/objects/structures/signs/_signs.dm index 9268cb9c059..d3713ca1b2f 100644 --- a/code/game/objects/structures/signs/_signs.dm +++ b/code/game/objects/structures/signs/_signs.dm @@ -12,7 +12,7 @@ var/buildable_sign = TRUE ///This determines if you can select this sign type when using a pen on a sign backing. False by default, set to true per sign type to override. var/is_editable = FALSE - ///sign_change_name is used to make nice looking, alphebetized and categorized names when you use a pen on any sign item or structure which is_editable. + ///sign_change_name is used to make nice looking, alphabetized and categorized names when you use a pen on any sign item or structure which is_editable. var/sign_change_name ///Callback to the knock down proc for wallmounting behavior. var/knock_down_callback @@ -135,7 +135,7 @@ unwrenched_sign.setDir(dir) qdel(src) //The sign structure on the wall goes poof and only the sign item from unwrenching remains. -/obj/structure/sign/blank //This subtype is necessary for now because some other things (posters, picture frames, paintings) inheret from the parent type. +/obj/structure/sign/blank //This subtype is necessary for now because some other things (posters, picture frames, paintings) inherit from the parent type. icon_state = "backing" name = "sign backing" desc = "A plastic sign backing, use a pen to change the decal. It can be detached from the wall with a wrench." diff --git a/code/game/objects/structures/spawner.dm b/code/game/objects/structures/spawner.dm index 743d76ef182..db4981aeac7 100644 --- a/code/game/objects/structures/spawner.dm +++ b/code/game/objects/structures/spawner.dm @@ -53,7 +53,7 @@ to_chat(user, span_warning("[src] already has a holotag attached!")) return to_chat(user, span_notice("You affix a holotag to [src].")) - playsound(src, 'sound/machines/twobeep.ogg', 100) + playsound(src, 'sound/machines/beep/twobeep.ogg', 100) gps_tagged = TRUE assigned_tag = "\[[mob_gps_id]-[rand(100,999)]\] " + spawner_gps_id var/datum/component/gps/our_gps = GetComponent(/datum/component/gps) @@ -221,7 +221,7 @@ /obj/structure/spawner/nether/process(seconds_per_tick) for(var/mob/living/living_mob in contents) if(living_mob) - playsound(src, 'sound/magic/demon_consume.ogg', 50, TRUE) + playsound(src, 'sound/effects/magic/demon_consume.ogg', 50, TRUE) living_mob.adjustBruteLoss(60 * seconds_per_tick) new /obj/effect/gibspawner/generic(get_turf(living_mob), living_mob) if(living_mob.stat == DEAD) @@ -299,5 +299,5 @@ proteon.add_filter("sentient_proteon", 3, list("type" = "outline", "color" = COLOR_CULT_RED, "size" = 2, "alpha" = 40)) /obj/structure/spawner/sentient/proteon_spawner/handle_deconstruct(disassembled) - playsound('sound/hallucinations/veryfar_noise.ogg', 125) + playsound('sound/effects/hallucinations/veryfar_noise.ogg', 125) visible_message(span_cult_bold("[src] completely falls apart, the screams of the damned reaching a feverous pitch before slowly fading away into nothing.")) diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 142d95c0bbf..06553329897 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -55,6 +55,8 @@ AddElement(/datum/element/give_turf_traits, give_turf_traits) register_context() + ADD_TRAIT(src, TRAIT_COMBAT_MODE_SKIP_INTERACTION, INNATE_TRAIT) + ///Adds the element used to make the object climbable, and also the one that shift the mob buckled to it up. /obj/structure/table/proc/make_climbable() AddElement(/datum/element/climbable) @@ -224,36 +226,24 @@ deconstruct(TRUE) return ITEM_INTERACT_SUCCESS -/obj/structure/table/item_interaction_secondary(mob/living/user, obj/item/tool, list/modifiers) - if(istype(tool, /obj/item/construction/rcd)) - return NONE +// This extends base item interaction because tables default to blocking 99% of interactions +/obj/structure/table/base_item_interaction(mob/living/user, obj/item/tool, list/modifiers) + . = ..() + if(.) + return . - var/deck_act_value = NONE if(istype(tool, /obj/item/toy/cards/deck)) - deck_act_value = deck_act(user, tool, modifiers, TRUE) - // Continue to placing if we don't do anything else - if(deck_act_value != NONE) - return deck_act_value - - if(!user.combat_mode) - return table_place_act(user, tool, modifiers) - - return NONE - -/obj/structure/table/item_interaction(mob/living/user, obj/item/tool, list/modifiers) - . = NONE + . = deck_act(user, tool, modifiers, !!LAZYACCESS(modifiers, RIGHT_CLICK)) if(istype(tool, /obj/item/storage/bag/tray)) . = tray_act(user, tool) - else if(istype(tool, /obj/item/toy/cards/deck)) - . = deck_act(user, tool, modifiers, FALSE) else if(istype(tool, /obj/item/riding_offhand)) . = riding_offhand_act(user, tool) // Continue to placing if we don't do anything else - if(. != NONE) + if(.) return . - if(!user.combat_mode) + if(!user.combat_mode || (tool.item_flags & NOBLUDGEON)) return table_place_act(user, tool, modifiers) return NONE @@ -319,8 +309,8 @@ // Items are centered by default, but we move them if click ICON_X and ICON_Y are available if(LAZYACCESS(modifiers, ICON_X) && LAZYACCESS(modifiers, ICON_Y)) // Clamp it so that the icon never moves more than 16 pixels in either direction (thus leaving the table turf) - tool.pixel_x = clamp(text2num(LAZYACCESS(modifiers, ICON_X)) - 16, -(world.icon_size*0.5), world.icon_size*0.5) - tool.pixel_y = clamp(text2num(LAZYACCESS(modifiers, ICON_Y)) - 16, -(world.icon_size*0.5), world.icon_size*0.5) + tool.pixel_x = clamp(text2num(LAZYACCESS(modifiers, ICON_X)) - 16, -(ICON_SIZE_X*0.5), ICON_SIZE_X*0.5) + tool.pixel_y = clamp(text2num(LAZYACCESS(modifiers, ICON_Y)) - 16, -(ICON_SIZE_Y*0.5), ICON_SIZE_Y*0.5) AfterPutItemOnTable(tool, user) return ITEM_INTERACT_SUCCESS @@ -707,7 +697,7 @@ /obj/structure/table/bronze/tablepush(mob/living/user, mob/living/pushed_mob) ..() - playsound(src, 'sound/magic/clockwork/fellowship_armory.ogg', 50, TRUE) + playsound(src, 'sound/effects/magic/clockwork/fellowship_armory.ogg', 50, TRUE) /obj/structure/table/reinforced/rglass name = "reinforced glass table" @@ -869,6 +859,7 @@ AddElement(/datum/element/climbable) AddElement(/datum/element/elevation, pixel_shift = 12) register_context() + ADD_TRAIT(src, TRAIT_COMBAT_MODE_SKIP_INTERACTION, INNATE_TRAIT) /obj/structure/rack/add_context(atom/source, list/context, obj/item/held_item, mob/living/user) if(isnull(held_item)) @@ -896,8 +887,11 @@ deconstruct(TRUE) return ITEM_INTERACT_SUCCESS -/obj/structure/rack/item_interaction(mob/living/user, obj/item/tool, list/modifiers) - if((tool.item_flags & ABSTRACT) || user.combat_mode) +/obj/structure/rack/base_item_interaction(mob/living/user, obj/item/tool, list/modifiers) + . = ..() + if(.) + return . + if((tool.item_flags & ABSTRACT) || (user.combat_mode && !(tool.item_flags & NOBLUDGEON))) return NONE if(user.transferItemToLoc(tool, drop_location(), silent = FALSE)) return ITEM_INTERACT_SUCCESS @@ -923,9 +917,9 @@ if(damage_amount) playsound(loc, 'sound/items/dodgeball.ogg', 80, TRUE) else - playsound(loc, 'sound/weapons/tap.ogg', 50, TRUE) + playsound(loc, 'sound/items/weapons/tap.ogg', 50, TRUE) if(BURN) - playsound(loc, 'sound/items/welder.ogg', 40, TRUE) + playsound(loc, 'sound/items/tools/welder.ogg', 40, TRUE) /* * Rack destruction @@ -986,8 +980,7 @@ if(!user.temporarilyRemoveItemFromInventory(src)) return var/obj/structure/rack/R = new /obj/structure/rack(get_turf(src)) - user.visible_message("[user] assembles \a [R].\ - ", span_notice("You assemble \a [R].")) + user.visible_message(span_notice("[user] assembles \a [R]."), span_notice("You assemble \a [R].")) R.add_fingerprint(user) qdel(src) building = FALSE diff --git a/code/game/objects/structures/tank_dispenser.dm b/code/game/objects/structures/tank_dispenser.dm index 2d16ea30a69..46c18d85b40 100644 --- a/code/game/objects/structures/tank_dispenser.dm +++ b/code/game/objects/structures/tank_dispenser.dm @@ -71,7 +71,7 @@ oxygentanks++ else full = TRUE - else if(!user.combat_mode) + else if(!user.combat_mode || (I.item_flags & NOBLUDGEON)) balloon_alert(user, "can't insert!") return else diff --git a/code/game/objects/structures/training_machine.dm b/code/game/objects/structures/training_machine.dm index c1963ea38a3..e0bb6357a8a 100644 --- a/code/game/objects/structures/training_machine.dm +++ b/code/game/objects/structures/training_machine.dm @@ -209,7 +209,7 @@ moving = FALSE starting_turf = null say(message) - playsound(src,'sound/machines/synth_no.ogg',50,FALSE) + playsound(src,'sound/machines/synth/synth_no.ogg',50,FALSE) STOP_PROCESSING(SSfastprocess, src) /** @@ -221,7 +221,7 @@ moving = TRUE starting_turf = get_turf(src) say("Beginning training simulation.") - playsound(src,'sound/machines/triple_beep.ogg',50,FALSE) + playsound(src,'sound/machines/beep/triple_beep.ogg',50,FALSE) START_PROCESSING(SSfastprocess, src) /** @@ -285,7 +285,7 @@ do_attack_animation(target, null, attached_item) if (obj_flags & EMAGGED) target.apply_damage(attached_item.force, BRUTE, BODY_ZONE_CHEST, attacking_item = attached_item) - playsound(src, 'sound/weapons/smash.ogg', 15, TRUE) + playsound(src, 'sound/items/weapons/smash.ogg', 15, TRUE) COOLDOWN_START(src, attack_cooldown, rand(MIN_ATTACK_DELAY, MAX_ATTACK_DELAY)) /** @@ -390,9 +390,9 @@ return FALSE total_hits++ lap_hits++ - playsound(src,'sound/weapons/smash.ogg',50,FALSE) + playsound(src,'sound/items/weapons/smash.ogg',50,FALSE) if (lap_hits % HITS_TO_KILL == 0) - playsound(src,'sound/machines/twobeep.ogg',25,FALSE) + playsound(src,'sound/machines/beep/twobeep.ogg',25,FALSE) return TRUE /obj/item/training_toolbox/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) diff --git a/code/game/objects/structures/transit_tubes/station.dm b/code/game/objects/structures/transit_tubes/station.dm index 8fc1426c5f3..39a62204fa5 100644 --- a/code/game/objects/structures/transit_tubes/station.dm +++ b/code/game/objects/structures/transit_tubes/station.dm @@ -251,7 +251,7 @@ return var/obj/structure/transit_tube_pod/dispensed/pod = new(loc) AM.visible_message(span_notice("[pod] forms around [AM]."), span_notice("[pod] materializes around you.")) - playsound(src, 'sound/weapons/emitter2.ogg', 50, TRUE) + playsound(src, 'sound/items/weapons/emitter2.ogg', 50, TRUE) pod.setDir(turn(src.dir, -90)) AM.forceMove(pod) pod.update_appearance() diff --git a/code/game/objects/structures/traps.dm b/code/game/objects/structures/traps.dm index 0cf5ddf7c91..a30a59e45a2 100644 --- a/code/game/objects/structures/traps.dm +++ b/code/game/objects/structures/traps.dm @@ -6,7 +6,7 @@ density = FALSE anchored = TRUE alpha = 30 //initially quite hidden when not "recharging" - var/flare_message = "the trap flares brightly!" + var/flare_message = span_warning("the trap flares brightly!") var/last_trigger = 0 var/time_between_triggers = 1 MINUTES var/charges = INFINITY @@ -20,7 +20,7 @@ /obj/structure/trap/Initialize(mapload) . = ..() - flare_message = "[src] flares brightly!" + flare_message = span_warning("[src] flares brightly!") spark_system = new spark_system.set_up(4,1,src) spark_system.attach(src) @@ -113,7 +113,7 @@ /obj/structure/trap/stun/hunter/Initialize(mapload) . = ..() time_between_triggers = 1 SECONDS - flare_message = "[src] snaps shut!" + flare_message = span_warning("[src] snaps shut!") /obj/structure/trap/stun/hunter/Destroy() if(!QDELETED(stored_item)) diff --git a/code/game/objects/structures/votingbox.dm b/code/game/objects/structures/votingbox.dm index 42ccd625093..55909978fe2 100644 --- a/code/game/objects/structures/votingbox.dm +++ b/code/game/objects/structures/votingbox.dm @@ -94,7 +94,7 @@ ui_interact(user) /obj/structure/votebox/proc/set_description(mob/user) - var/new_description = tgui_input_text(user, "Enter a new description", "Vote Description", vote_description, multiline = TRUE) + var/new_description = tgui_input_text(user, "Enter a new description", "Vote Description", vote_description, multiline = TRUE, max_length = MAX_DESC_LEN) if(new_description) vote_description = new_description diff --git a/code/game/objects/structures/water_structures/sink.dm b/code/game/objects/structures/water_structures/sink.dm index 878dab578a5..1cd3f7d7aaa 100644 --- a/code/game/objects/structures/water_structures/sink.dm +++ b/code/game/objects/structures/water_structures/sink.dm @@ -204,7 +204,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sink, (-14)) if(O.item_flags & ABSTRACT) //Abstract items like grabs won't wash. No-drop items will though because it's still technically an item in your hand. return - if(!user.combat_mode) + if(!user.combat_mode || (O.item_flags & NOBLUDGEON)) to_chat(user, span_notice("You start washing [O]...")) busy = TRUE if(!do_after(user, 4 SECONDS, target = src)) diff --git a/code/game/objects/structures/water_structures/toilet.dm b/code/game/objects/structures/water_structures/toilet.dm index 7237cd03c50..986d7eae4ea 100644 --- a/code/game/objects/structures/water_structures/toilet.dm +++ b/code/game/objects/structures/water_structures/toilet.dm @@ -25,13 +25,9 @@ var/list/cistern_items ///Lazylist of fish in the toilet, not to be mixed with the items in the cistern. Max of 3 var/list/fishes - ///Static toilet water overlay given to toilets that are facing a direction we can see the water in. - var/static/mutable_appearance/toilet_water_overlay /obj/structure/toilet/Initialize(mapload) . = ..() - if(isnull(toilet_water_overlay)) - toilet_water_overlay = mutable_appearance(icon, "[base_icon_state]-water") cover_open = round(rand(0, 1)) update_appearance(UPDATE_ICON) if(mapload && SSmapping.level_trait(z, ZTRAIT_STATION)) @@ -176,8 +172,8 @@ /obj/structure/toilet/update_overlays() . = ..() - if(!flushing && cover_open && (dir & SOUTH)) - . += toilet_water_overlay + if(!flushing && cover_open) + . += "[base_icon_state]-water" /obj/structure/toilet/atom_deconstruct(dissambled = TRUE) for(var/obj/toilet_item in cistern_items) diff --git a/code/game/objects/structures/water_structures/water_source.dm b/code/game/objects/structures/water_structures/water_source.dm index 9420156d918..a59051f92dd 100644 --- a/code/game/objects/structures/water_structures/water_source.dm +++ b/code/game/objects/structures/water_structures/water_source.dm @@ -114,7 +114,7 @@ attacking_item.use(1) return - if(!user.combat_mode) + if(!user.combat_mode || (attacking_item.item_flags & NOBLUDGEON)) to_chat(user, span_notice("You start washing [attacking_item]...")) busy = TRUE if(!do_after(user, 4 SECONDS, target = src)) diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index 4c22cbf01b2..4ff29eb606e 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -252,7 +252,7 @@ ae.forceMove(drop_location()) else if(IS_WRITING_UTENSIL(W)) - var/t = tgui_input_text(user, "Enter the name for the door", "Windoor Renaming", created_name, MAX_NAME_LEN) + var/t = tgui_input_text(user, "Enter the name for the door", "Windoor Renaming", created_name, max_length = MAX_NAME_LEN) if(!t) return if(!in_range(src, usr) && loc != usr) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index d9a669f7c42..995f9b617bb 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -28,9 +28,9 @@ var/glass_amount = 1 var/real_explosion_block //ignore this, just use explosion_block var/break_sound = SFX_SHATTER - var/knock_sound = 'sound/effects/glassknock.ogg' - var/bash_sound = 'sound/effects/glassbash.ogg' - var/hit_sound = 'sound/effects/glasshit.ogg' + var/knock_sound = 'sound/effects/glass/glassknock.ogg' + var/bash_sound = 'sound/effects/glass/glassbash.ogg' + var/hit_sound = 'sound/effects/glass/glasshit.ogg' /// If some inconsiderate jerk has had their blood spilled on this window, thus making it cleanable var/bloodied = FALSE ///Datum that the shard and debris type is pulled from for when the glass is broken. @@ -321,9 +321,9 @@ if(damage_amount) playsound(src, hit_sound, 75, TRUE) else - playsound(src, 'sound/weapons/tap.ogg', 50, TRUE) + playsound(src, 'sound/items/weapons/tap.ogg', 50, TRUE) if(BURN) - playsound(src, 'sound/items/welder.ogg', 100, TRUE) + playsound(src, 'sound/items/tools/welder.ogg', 100, TRUE) /obj/structure/window/atom_deconstruct(disassembled = TRUE) @@ -450,7 +450,7 @@ addtimer(CALLBACK(src, TYPE_PROC_REF(/atom/movable, forceMove), loc), time_to_go + time_to_return) //we back boys addtimer(VARSET_CALLBACK(src, dramatically_disappearing, FALSE), time_to_go + time_to_return) //also set the var back addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, update_appearance)), time_to_go + time_to_return) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(playsound), get_turf(src), 'sound/effects/glass_reverse.ogg', 70, TRUE), time_to_go + time_to_return) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(playsound), get_turf(src), 'sound/effects/glass/glass_reverse.ogg', 70, TRUE), time_to_go + time_to_return) var/obj/structure/grille/grill = take_grill ? (locate(/obj/structure/grille) in loc) : null if(grill) @@ -505,7 +505,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/window/unanchored/spawner, 0) switch(state) if(RWINDOW_SECURE) if(tool.tool_behaviour == TOOL_WELDER) - if(tool.tool_start_check(user)) + if(tool.tool_start_check(user, heat_required = HIGH_TEMPERATURE_REQUIRED)) user.visible_message(span_notice("[user] holds \the [tool] to the security screws on \the [src]..."), span_notice("You begin heating the security screws on \the [src]...")) if(tool.use_tool(src, user, 15 SECONDS, volume = 100)) @@ -899,9 +899,9 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/window/reinforced/tinted/frosted/spaw resistance_flags = FLAMMABLE armor_type = /datum/armor/none knock_sound = SFX_PAGE_TURN - bash_sound = 'sound/weapons/slashmiss.ogg' - break_sound = 'sound/items/poster_ripped.ogg' - hit_sound = 'sound/weapons/slashmiss.ogg' + bash_sound = 'sound/items/weapons/slashmiss.ogg' + break_sound = 'sound/items/poster/poster_ripped.ogg' + hit_sound = 'sound/items/weapons/slashmiss.ogg' var/static/mutable_appearance/torn = mutable_appearance('icons/obj/smooth_structures/structure_variations.dmi',icon_state = "paper-torn", layer = ABOVE_OBJ_LAYER - 0.1) var/static/mutable_appearance/paper = mutable_appearance('icons/obj/smooth_structures/structure_variations.dmi',icon_state = "paper-whole", layer = ABOVE_OBJ_LAYER - 0.1) diff --git a/code/game/shuttle_engines.dm b/code/game/shuttle_engines.dm index 8ddae94231d..52372448616 100644 --- a/code/game/shuttle_engines.dm +++ b/code/game/shuttle_engines.dm @@ -113,7 +113,7 @@ if(ENGINE_UNWRENCHED) to_chat(user, span_warning("The [src.name] needs to be wrenched to the floor!")) if(ENGINE_WRENCHED) - if(!tool.tool_start_check(user, amount=round(ENGINE_WELDTIME / 5))) + if(!tool.tool_start_check(user, amount=round(ENGINE_WELDTIME / 5), heat_required = HIGH_TEMPERATURE_REQUIRED)) return TRUE user.visible_message(span_notice("[user.name] starts to weld the [name] to the floor."), \ @@ -126,7 +126,7 @@ alter_engine_power(engine_power) if(ENGINE_WELDED) - if(!tool.tool_start_check(user, amount=round(ENGINE_WELDTIME / 5))) + if(!tool.tool_start_check(user, amount=round(ENGINE_WELDTIME / 5), heat_required = HIGH_TEMPERATURE_REQUIRED)) return TRUE user.visible_message(span_notice("[user.name] starts to cut the [name] free from the floor."), \ diff --git a/code/game/sound.dm b/code/game/sound.dm index 0061b8d469f..b379187e09d 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -43,6 +43,9 @@ if(isarea(source)) CRASH("playsound(): source is an area") + if(islist(soundin)) + CRASH("playsound(): soundin attempted to pass a list! Consider using pick()") + var/turf/turf_source = get_turf(source) if (!turf_source || !soundin || !vol) @@ -208,83 +211,83 @@ return soundin switch(soundin) if(SFX_SHATTER) - soundin = pick('sound/effects/glassbr1.ogg','sound/effects/glassbr2.ogg','sound/effects/glassbr3.ogg') + soundin = pick('sound/effects/glass/glassbr1.ogg','sound/effects/glass/glassbr2.ogg','sound/effects/glass/glassbr3.ogg') if(SFX_EXPLOSION) - soundin = pick('sound/effects/explosion1.ogg','sound/effects/explosion2.ogg') + soundin = pick('sound/effects/explosion/explosion1.ogg','sound/effects/explosion/explosion2.ogg') if(SFX_EXPLOSION_CREAKING) - soundin = pick('sound/effects/explosioncreak1.ogg', 'sound/effects/explosioncreak2.ogg') + soundin = pick('sound/effects/explosion/explosioncreak1.ogg', 'sound/effects/explosion/explosioncreak2.ogg') if(SFX_HULL_CREAKING) - soundin = pick('sound/effects/creak1.ogg', 'sound/effects/creak2.ogg', 'sound/effects/creak3.ogg') + soundin = pick('sound/effects/creak/creak1.ogg', 'sound/effects/creak/creak2.ogg', 'sound/effects/creak/creak3.ogg') if(SFX_SPARKS) - soundin = pick('sound/effects/sparks1.ogg','sound/effects/sparks2.ogg','sound/effects/sparks3.ogg','sound/effects/sparks4.ogg') + soundin = pick('sound/effects/sparks/sparks1.ogg','sound/effects/sparks/sparks2.ogg','sound/effects/sparks/sparks3.ogg','sound/effects/sparks/sparks4.ogg') if(SFX_RUSTLE) - soundin = pick('sound/effects/rustle1.ogg','sound/effects/rustle2.ogg','sound/effects/rustle3.ogg','sound/effects/rustle4.ogg','sound/effects/rustle5.ogg') + soundin = pick('sound/effects/rustle/rustle1.ogg','sound/effects/rustle/rustle2.ogg','sound/effects/rustle/rustle3.ogg','sound/effects/rustle/rustle4.ogg','sound/effects/rustle/rustle5.ogg') if(SFX_BODYFALL) - soundin = pick('sound/effects/bodyfall1.ogg','sound/effects/bodyfall2.ogg','sound/effects/bodyfall3.ogg','sound/effects/bodyfall4.ogg') + soundin = pick('sound/effects/bodyfall/bodyfall1.ogg','sound/effects/bodyfall/bodyfall2.ogg','sound/effects/bodyfall/bodyfall3.ogg','sound/effects/bodyfall/bodyfall4.ogg') if(SFX_PUNCH) - soundin = pick('sound/weapons/punch1.ogg','sound/weapons/punch2.ogg','sound/weapons/punch3.ogg','sound/weapons/punch4.ogg') + soundin = pick('sound/items/weapons/punch1.ogg','sound/items/weapons/punch2.ogg','sound/items/weapons/punch3.ogg','sound/items/weapons/punch4.ogg') if(SFX_CLOWN_STEP) soundin = pick('sound/effects/footstep/clownstep1.ogg','sound/effects/footstep/clownstep2.ogg') if(SFX_SUIT_STEP) soundin = pick('sound/effects/suitstep1.ogg','sound/effects/suitstep2.ogg') if(SFX_SWING_HIT) - soundin = pick('sound/weapons/genhit1.ogg', 'sound/weapons/genhit2.ogg', 'sound/weapons/genhit3.ogg') + soundin = pick('sound/items/weapons/genhit1.ogg', 'sound/items/weapons/genhit2.ogg', 'sound/items/weapons/genhit3.ogg') if(SFX_HISS) - soundin = pick('sound/voice/hiss1.ogg','sound/voice/hiss2.ogg','sound/voice/hiss3.ogg','sound/voice/hiss4.ogg') + soundin = pick('sound/mobs/non-humanoids/hiss/hiss1.ogg','sound/mobs/non-humanoids/hiss/hiss2.ogg','sound/mobs/non-humanoids/hiss/hiss3.ogg','sound/mobs/non-humanoids/hiss/hiss4.ogg') if(SFX_PAGE_TURN) - soundin = pick('sound/effects/pageturn1.ogg', 'sound/effects/pageturn2.ogg','sound/effects/pageturn3.ogg') + soundin = pick('sound/effects/page_turn/pageturn1.ogg', 'sound/effects/page_turn/pageturn2.ogg','sound/effects/page_turn/pageturn3.ogg') if(SFX_RICOCHET) - soundin = pick( 'sound/weapons/effects/ric1.ogg', 'sound/weapons/effects/ric2.ogg','sound/weapons/effects/ric3.ogg','sound/weapons/effects/ric4.ogg','sound/weapons/effects/ric5.ogg') + soundin = pick( 'sound/items/weapons/effects/ric1.ogg', 'sound/items/weapons/effects/ric2.ogg','sound/items/weapons/effects/ric3.ogg','sound/items/weapons/effects/ric4.ogg','sound/items/weapons/effects/ric5.ogg') if(SFX_TERMINAL_TYPE) soundin = pick(list( - 'sound/machines/terminal_button01.ogg', - 'sound/machines/terminal_button02.ogg', - 'sound/machines/terminal_button03.ogg', - 'sound/machines/terminal_button04.ogg', - 'sound/machines/terminal_button05.ogg', - 'sound/machines/terminal_button06.ogg', - 'sound/machines/terminal_button07.ogg', - 'sound/machines/terminal_button08.ogg', + 'sound/machines/terminal/terminal_button01.ogg', + 'sound/machines/terminal/terminal_button02.ogg', + 'sound/machines/terminal/terminal_button03.ogg', + 'sound/machines/terminal/terminal_button04.ogg', + 'sound/machines/terminal/terminal_button05.ogg', + 'sound/machines/terminal/terminal_button06.ogg', + 'sound/machines/terminal/terminal_button07.ogg', + 'sound/machines/terminal/terminal_button08.ogg', )) if(SFX_DESECRATION) - soundin = pick('sound/misc/desecration-01.ogg', 'sound/misc/desecration-02.ogg', 'sound/misc/desecration-03.ogg') + soundin = pick('sound/effects/desecration/desecration-01.ogg', 'sound/effects/desecration/desecration-02.ogg', 'sound/effects/desecration/desecration-03.ogg') if(SFX_IM_HERE) - soundin = pick('sound/hallucinations/im_here1.ogg', 'sound/hallucinations/im_here2.ogg') + soundin = pick('sound/effects/hallucinations/im_here1.ogg', 'sound/effects/hallucinations/im_here2.ogg') if(SFX_CAN_OPEN) - soundin = pick('sound/effects/can_open1.ogg', 'sound/effects/can_open2.ogg', 'sound/effects/can_open3.ogg') + soundin = pick('sound/effects/can/can_open1.ogg', 'sound/effects/can/can_open2.ogg', 'sound/effects/can/can_open3.ogg') if(SFX_BULLET_MISS) - soundin = pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg') + soundin = pick('sound/items/weapons/bulletflyby.ogg', 'sound/items/weapons/bulletflyby2.ogg', 'sound/items/weapons/bulletflyby3.ogg') if(SFX_REVOLVER_SPIN) - soundin = pick('sound/weapons/gun/revolver/spin1.ogg', 'sound/weapons/gun/revolver/spin2.ogg', 'sound/weapons/gun/revolver/spin3.ogg') + soundin = pick('sound/items/weapons/gun/revolver/spin1.ogg', 'sound/items/weapons/gun/revolver/spin2.ogg', 'sound/items/weapons/gun/revolver/spin3.ogg') if(SFX_LAW) soundin = pick(list( - 'sound/voice/beepsky/creep.ogg', - 'sound/voice/beepsky/god.ogg', - 'sound/voice/beepsky/iamthelaw.ogg', - 'sound/voice/beepsky/insult.ogg', - 'sound/voice/beepsky/radio.ogg', - 'sound/voice/beepsky/secureday.ogg', + 'sound/mobs/non-humanoids/beepsky/creep.ogg', + 'sound/mobs/non-humanoids/beepsky/god.ogg', + 'sound/mobs/non-humanoids/beepsky/iamthelaw.ogg', + 'sound/mobs/non-humanoids/beepsky/insult.ogg', + 'sound/mobs/non-humanoids/beepsky/radio.ogg', + 'sound/mobs/non-humanoids/beepsky/secureday.ogg', )) if(SFX_HONKBOT_E) soundin = pick(list( 'sound/effects/pray.ogg', - 'sound/effects/reee.ogg', - 'sound/items/AirHorn.ogg', - 'sound/items/AirHorn2.ogg', + 'sound/mobs/non-humanoids/frog/reee.ogg', + 'sound/items/airhorn/AirHorn.ogg', + 'sound/items/airhorn/AirHorn2.ogg', 'sound/items/bikehorn.ogg', 'sound/items/WEEOO1.ogg', - 'sound/machines/buzz-sigh.ogg', + 'sound/machines/buzz/buzz-sigh.ogg', 'sound/machines/ping.ogg', - 'sound/magic/Fireball.ogg', + 'sound/effects/magic/Fireball.ogg', 'sound/misc/sadtrombone.ogg', - 'sound/voice/beepsky/creep.ogg', - 'sound/voice/beepsky/iamthelaw.ogg', - 'sound/voice/hiss1.ogg', - 'sound/weapons/bladeslice.ogg', - 'sound/weapons/flashbang.ogg', + 'sound/mobs/non-humanoids/beepsky/creep.ogg', + 'sound/mobs/non-humanoids/beepsky/iamthelaw.ogg', + 'sound/mobs/non-humanoids/hiss/hiss1.ogg', + 'sound/items/weapons/bladeslice.ogg', + 'sound/items/weapons/flashbang.ogg', )) if(SFX_GOOSE) - soundin = pick('sound/creatures/goose1.ogg', 'sound/creatures/goose2.ogg', 'sound/creatures/goose3.ogg', 'sound/creatures/goose4.ogg') + soundin = pick('sound/mobs/non-humanoids/goose/goose1.ogg', 'sound/mobs/non-humanoids/goose/goose2.ogg', 'sound/mobs/non-humanoids/goose/goose3.ogg', 'sound/mobs/non-humanoids/goose/goose4.ogg') if(SFX_WARPSPEED) soundin = 'sound/runtime/hyperspace/hyperspace_begin.ogg' if(SFX_SM_CALM) @@ -432,49 +435,49 @@ 'sound/machines/sm/accent/delam/33.ogg', )) if(SFX_CRUNCHY_BUSH_WHACK) - soundin = pick('sound/effects/crunchybushwhack1.ogg', 'sound/effects/crunchybushwhack2.ogg', 'sound/effects/crunchybushwhack3.ogg') + soundin = pick('sound/effects/bush/crunchybushwhack1.ogg', 'sound/effects/bush/crunchybushwhack2.ogg', 'sound/effects/bush/crunchybushwhack3.ogg') if(SFX_TREE_CHOP) - soundin = pick('sound/effects/treechop1.ogg', 'sound/effects/treechop2.ogg', 'sound/effects/treechop3.ogg') + soundin = pick('sound/effects/treechop/treechop1.ogg', 'sound/effects/treechop/treechop2.ogg', 'sound/effects/treechop/treechop3.ogg') if(SFX_ROCK_TAP) - soundin = pick('sound/effects/rocktap1.ogg', 'sound/effects/rocktap2.ogg', 'sound/effects/rocktap3.ogg') + soundin = pick('sound/effects/rock/rocktap1.ogg', 'sound/effects/rock/rocktap2.ogg', 'sound/effects/rock/rocktap3.ogg') if(SFX_SEAR) - soundin = 'sound/weapons/sear.ogg' + soundin = 'sound/items/weapons/sear.ogg' if(SFX_REEL) soundin = pick( - 'sound/items/reel1.ogg', - 'sound/items/reel2.ogg', - 'sound/items/reel3.ogg', - 'sound/items/reel4.ogg', - 'sound/items/reel5.ogg', + 'sound/items/reel/reel1.ogg', + 'sound/items/reel/reel2.ogg', + 'sound/items/reel/reel3.ogg', + 'sound/items/reel/reel4.ogg', + 'sound/items/reel/reel5.ogg', ) if(SFX_RATTLE) soundin = pick( - 'sound/items/rattle1.ogg', - 'sound/items/rattle2.ogg', - 'sound/items/rattle3.ogg', + 'sound/items/rattle/rattle1.ogg', + 'sound/items/rattle/rattle2.ogg', + 'sound/items/rattle/rattle3.ogg', ) if(SFX_PORTAL_CLOSE) - soundin = 'sound/effects/portal_close.ogg' + soundin = 'sound/effects/portal/portal_close.ogg' if(SFX_PORTAL_ENTER) - soundin = 'sound/effects/portal_travel.ogg' + soundin = 'sound/effects/portal/portal_travel.ogg' if(SFX_PORTAL_CREATED) soundin = pick( - 'sound/effects/portal_open_1.ogg', - 'sound/effects/portal_open_2.ogg', - 'sound/effects/portal_open_3.ogg', + 'sound/effects/portal/portal_open_1.ogg', + 'sound/effects/portal/portal_open_2.ogg', + 'sound/effects/portal/portal_open_3.ogg', ) if(SFX_SCREECH) soundin = pick( - 'sound/creatures/monkey/monkey_screech_1.ogg', - 'sound/creatures/monkey/monkey_screech_2.ogg', - 'sound/creatures/monkey/monkey_screech_3.ogg', - 'sound/creatures/monkey/monkey_screech_4.ogg', - 'sound/creatures/monkey/monkey_screech_5.ogg', - 'sound/creatures/monkey/monkey_screech_6.ogg', - 'sound/creatures/monkey/monkey_screech_7.ogg', + 'sound/mobs/non-humanoids/monkey/monkey_screech_1.ogg', + 'sound/mobs/non-humanoids/monkey/monkey_screech_2.ogg', + 'sound/mobs/non-humanoids/monkey/monkey_screech_3.ogg', + 'sound/mobs/non-humanoids/monkey/monkey_screech_4.ogg', + 'sound/mobs/non-humanoids/monkey/monkey_screech_5.ogg', + 'sound/mobs/non-humanoids/monkey/monkey_screech_6.ogg', + 'sound/mobs/non-humanoids/monkey/monkey_screech_7.ogg', ) if(SFX_TOOL_SWITCH) - soundin = 'sound/items/handling/tool_switch.ogg' + soundin = 'sound/items/tools/tool_switch.ogg' if(SFX_KEYBOARD_CLICKS) soundin = pick( 'sound/machines/computer/keyboard_clicks_1.ogg', @@ -509,12 +512,32 @@ 'sound/effects/muffspeech/muffspeech9.ogg', ) if(SFX_DEFAULT_FISH_SLAP) - soundin = 'sound/creatures/fish/fish_slap1.ogg' + soundin = 'sound/mobs/non-humanoids/fish/fish_slap1.ogg' if(SFX_ALT_FISH_SLAP) - soundin = 'sound/creatures/fish/fish_slap2.ogg' + soundin = 'sound/mobs/non-humanoids/fish/fish_slap2.ogg' if(SFX_FISH_PICKUP) soundin = pick( - 'sound/creatures/fish/fish_pickup1.ogg', - 'sound/creatures/fish/fish_pickup2.ogg', + 'sound/mobs/non-humanoids/fish/fish_pickup1.ogg', + 'sound/mobs/non-humanoids/fish/fish_pickup2.ogg', + ) + if(SFX_LIQUID_POUR) + soundin = pick( + 'sound/effects/liquid_pour/liquid_pour1.ogg', + 'sound/effects/liquid_pour/liquid_pour2.ogg', + 'sound/effects/liquid_pour/liquid_pour3.ogg', + ) + if(SFX_CAT_MEOW) + soundin = pick_weight(list( + 'sound/creatures/cat/cat_meow1.ogg' = 33, + 'sound/creatures/cat/cat_meow2.ogg' = 33, + 'sound/creatures/cat/cat_meow3.ogg' = 33, + 'sound/creatures/cat/oranges_meow1.ogg' = 1, + )) + if(SFX_CAT_PURR) + soundin = pick( + 'sound/creatures/cat/cat_purr1.ogg', + 'sound/creatures/cat/cat_purr2.ogg', + 'sound/creatures/cat/cat_purr3.ogg', + 'sound/creatures/cat/cat_purr4.ogg', ) return soundin diff --git a/code/game/turfs/closed/_closed.dm b/code/game/turfs/closed/_closed.dm index 8ccaabc46c0..cf287a6eb6d 100644 --- a/code/game/turfs/closed/_closed.dm +++ b/code/game/turfs/closed/_closed.dm @@ -15,3 +15,6 @@ /turf/closed/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) return FALSE + +/turf/closed/examine_descriptor(mob/user) + return "wall" diff --git a/code/game/turfs/closed/wall/reinf_walls.dm b/code/game/turfs/closed/wall/reinf_walls.dm index 092af294771..3575f02c77f 100644 --- a/code/game/turfs/closed/wall/reinf_walls.dm +++ b/code/game/turfs/closed/wall/reinf_walls.dm @@ -76,7 +76,7 @@ if(COVER) if(W.tool_behaviour == TOOL_WELDER) - if(!W.tool_start_check(user, amount=2)) + if(!W.tool_start_check(user, amount=2, heat_required = HIGH_TEMPERATURE_REQUIRED)) return to_chat(user, span_notice("You begin slicing through the metal cover...")) if(W.use_tool(src, user, 60, volume=100)) @@ -109,7 +109,7 @@ return TRUE if(W.tool_behaviour == TOOL_WELDER) - if(!W.tool_start_check(user, amount=2)) + if(!W.tool_start_check(user, amount=2, heat_required = HIGH_TEMPERATURE_REQUIRED)) return to_chat(user, span_notice("You begin welding the metal cover back to the frame...")) if(W.use_tool(src, user, 60, volume=100)) @@ -143,7 +143,7 @@ if(SUPPORT_RODS) if(W.tool_behaviour == TOOL_WELDER) - if(!W.tool_start_check(user, amount=2)) + if(!W.tool_start_check(user, amount=2, heat_required = HIGH_TEMPERATURE_REQUIRED)) return to_chat(user, span_notice("You begin slicing through the support rods...")) if(W.use_tool(src, user, 100, volume=100)) @@ -176,7 +176,7 @@ return TRUE if(W.tool_behaviour == TOOL_WELDER) - if(!W.tool_start_check(user, amount=0)) + if(!W.tool_start_check(user, amount=0, heat_required = HIGH_TEMPERATURE_REQUIRED)) return to_chat(user, span_notice("You begin welding the support rods back together...")) if(W.use_tool(src, user, 100, volume=100)) diff --git a/code/game/turfs/closed/walls.dm b/code/game/turfs/closed/walls.dm index a78579d713e..f1297e4a022 100644 --- a/code/game/turfs/closed/walls.dm +++ b/code/game/turfs/closed/walls.dm @@ -117,7 +117,6 @@ GLOB.station_turfs -= src return ..() - /turf/closed/wall/examine(mob/user) . += ..() . += deconstruction_hints(user) @@ -132,7 +131,7 @@ if(devastated) devastate_wall() else - playsound(src, 'sound/items/welder.ogg', 100, TRUE) + playsound(src, 'sound/items/tools/welder.ogg', 100, TRUE) var/newgirder = break_wall() if(newgirder) //maybe we don't /want/ a girder! transfer_fingerprints_to(newgirder) @@ -235,26 +234,21 @@ return user.changeNext_move(CLICK_CD_MELEE) to_chat(user, span_notice("You push the wall but nothing happens!")) - playsound(src, 'sound/weapons/genhit.ogg', 25, TRUE) + playsound(src, 'sound/items/weapons/genhit.ogg', 25, TRUE) add_fingerprint(user) -/turf/closed/wall/attackby(obj/item/W, mob/user, params) - user.changeNext_move(CLICK_CD_MELEE) +/turf/closed/wall/item_interaction(mob/living/user, obj/item/tool, list/modifiers) if (!ISADVANCEDTOOLUSER(user)) to_chat(user, span_warning("You don't have the dexterity to do this!")) - return - - //get the user's location - if(!isturf(user.loc)) - return //can't do this stuff whilst inside objects and such + return ITEM_INTERACT_BLOCKING add_fingerprint(user) //the istype cascade has been spread among various procs for easy overriding - if(try_clean(W, user) || try_wallmount(W, user) || try_decon(W, user)) - return + if(try_clean(tool, user) || try_wallmount(tool, user) || try_decon(tool, user)) + return ITEM_INTERACT_SUCCESS - return ..() + return NONE /turf/closed/wall/proc/try_clean(obj/item/W, mob/living/user) if((user.combat_mode) || !LAZYLEN(dent_decals)) @@ -290,7 +284,7 @@ /turf/closed/wall/proc/try_decon(obj/item/I, mob/user) if(I.tool_behaviour == TOOL_WELDER) - if(!I.tool_start_check(user, amount=round(slicing_duration / 50))) + if(!I.tool_start_check(user, amount=round(slicing_duration / 50), heat_required = HIGH_TEMPERATURE_REQUIRED)) return FALSE to_chat(user, span_notice("You begin slicing through the outer plating...")) diff --git a/code/game/turfs/open/_open.dm b/code/game/turfs/open/_open.dm index 5ce308c2840..68c3c1a1c77 100644 --- a/code/game/turfs/open/_open.dm +++ b/code/game/turfs/open/_open.dm @@ -74,6 +74,9 @@ . += burnt_appearance +/turf/open/examine_descriptor(mob/user) + return "floor" + //direction is direction of travel of A /turf/open/zPassIn(direction) if(direction != DOWN) @@ -440,7 +443,7 @@ if(used_rods.use(1)) qdel(catwalk_bait) to_chat(user, span_notice("You construct a catwalk.")) - playsound(src, 'sound/weapons/genhit.ogg', 50, TRUE) + playsound(src, 'sound/items/weapons/genhit.ogg', 50, TRUE) new /obj/structure/lattice/catwalk(src) else to_chat(user, span_warning("You need two rods to build a catwalk!")) @@ -448,7 +451,7 @@ if(used_rods.use(1)) to_chat(user, span_notice("You construct a lattice.")) - playsound(src, 'sound/weapons/genhit.ogg', 50, TRUE) + playsound(src, 'sound/items/weapons/genhit.ogg', 50, TRUE) new /obj/structure/lattice(src) else to_chat(user, span_warning("You need one rod to build a lattice.")) @@ -464,7 +467,7 @@ balloon_alert(user, "need a floor tile to build!") return - playsound(src, 'sound/weapons/genhit.ogg', 50, TRUE) + playsound(src, 'sound/items/weapons/genhit.ogg', 50, TRUE) var/turf/open/floor/plating/new_plating = place_on_top(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) if(lattice) qdel(lattice) @@ -488,7 +491,7 @@ balloon_alert(user, "no tile!") return - playsound(src, 'sound/weapons/genhit.ogg', 50, TRUE) + playsound(src, 'sound/items/weapons/genhit.ogg', 50, TRUE) new used_tiles.tile_type(src) /// Very similar to build_with_rods, this exists to allow building transport/tram girders on openspace @@ -501,5 +504,5 @@ balloon_alert(user, "not enough titanium!") return - playsound(src, 'sound/weapons/genhit.ogg', 50, TRUE) + playsound(src, 'sound/items/weapons/genhit.ogg', 50, TRUE) new /obj/structure/girder/tram(src) diff --git a/code/game/turfs/open/chasm.dm b/code/game/turfs/open/chasm.dm index 504e876d536..f81ac4c7f53 100644 --- a/code/game/turfs/open/chasm.dm +++ b/code/game/turfs/open/chasm.dm @@ -65,7 +65,7 @@ to_chat(user, span_warning("You need one rod to build a lattice.")) return to_chat(user, span_notice("You construct a lattice.")) - playsound(src, 'sound/weapons/genhit.ogg', 50, TRUE) + playsound(src, 'sound/items/weapons/genhit.ogg', 50, TRUE) // Create a lattice, without reverting to our baseturf new /obj/structure/lattice(src) return diff --git a/code/game/turfs/open/floor.dm b/code/game/turfs/open/floor.dm index 84b9ac26e9b..dad46fd8de6 100644 --- a/code/game/turfs/open/floor.dm +++ b/code/game/turfs/open/floor.dm @@ -14,8 +14,8 @@ smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_OPEN_FLOOR canSmoothWith = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_OPEN_FLOOR - thermal_conductivity = 0.04 - heat_capacity = 10000 + thermal_conductivity = 0.02 + heat_capacity = 20000 tiled_dirt = TRUE diff --git a/code/game/turfs/open/floor/plating.dm b/code/game/turfs/open/floor/plating.dm index 6e4834773c3..9c7cf015761 100644 --- a/code/game/turfs/open/floor/plating.dm +++ b/code/game/turfs/open/floor/plating.dm @@ -148,10 +148,10 @@ if(L) qdel(L) to_chat(user, span_notice("You reinforce the foamed plating with tiling.")) - playsound(src, 'sound/weapons/Genhit.ogg', 50, TRUE) + playsound(src, 'sound/items/weapons/Genhit.ogg', 50, TRUE) ChangeTurf(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) else - playsound(src, 'sound/weapons/tap.ogg', 100, TRUE) //The attack sound is muffled by the foam itself + playsound(src, 'sound/items/weapons/tap.ogg', 100, TRUE) //The attack sound is muffled by the foam itself user.changeNext_move(CLICK_CD_MELEE) user.do_attack_animation(src) if(prob(I.force * 20 - 25)) diff --git a/code/game/turfs/open/floor/reinforced_floor.dm b/code/game/turfs/open/floor/reinforced_floor.dm index 0a44c78ceca..dcba9ed3667 100644 --- a/code/game/turfs/open/floor/reinforced_floor.dm +++ b/code/game/turfs/open/floor/reinforced_floor.dm @@ -4,7 +4,7 @@ desc = "Extremely sturdy." icon_state = "engine" holodeck_compatible = TRUE - thermal_conductivity = 0.025 + thermal_conductivity = 0.01 heat_capacity = INFINITY floor_tile = /obj/item/stack/rods footstep = FOOTSTEP_PLATING diff --git a/code/game/turfs/open/ice.dm b/code/game/turfs/open/ice.dm index dbfff2efc8f..f28bc8dd4b0 100644 --- a/code/game/turfs/open/ice.dm +++ b/code/game/turfs/open/ice.dm @@ -53,6 +53,7 @@ return NONE balloon_alert(user, "dug hole") AddComponent(/datum/component/fishing_spot, GLOB.preset_fish_sources[/datum/fish_source/ice_fishing]) + ADD_TRAIT(src, TRAIT_CATCH_AND_RELEASE, INNATE_TRAIT) add_overlay(mutable_appearance('icons/turf/overlays.dmi', "ice_hole")) can_make_hole = FALSE RemoveElement(/datum/element/contextual_screentip_tools, tool_screentips) diff --git a/code/game/turfs/open/lava.dm b/code/game/turfs/open/lava.dm index 23e2b6b38db..eebb74b7289 100644 --- a/code/game/turfs/open/lava.dm +++ b/code/game/turfs/open/lava.dm @@ -16,7 +16,7 @@ light_power = 0.75 light_color = LIGHT_COLOR_LAVA light_on = FALSE - bullet_bounce_sound = 'sound/items/welder2.ogg' + bullet_bounce_sound = 'sound/items/tools/welder2.ogg' footstep = FOOTSTEP_LAVA barefootstep = FOOTSTEP_LAVA @@ -48,6 +48,8 @@ . = ..() if(fish_source_type) AddElement(/datum/element/lazy_fishing_spot, fish_source_type) + // You can release chrabs and lavaloops and likes in lava, or be an absolute scumbag and drop other fish there too. + ADD_TRAIT(src, TRAIT_CATCH_AND_RELEASE, INNATE_TRAIT) refresh_light() if(!smoothing_flags) update_appearance() @@ -199,7 +201,7 @@ return if(R.use(1)) to_chat(user, span_notice("You construct a lattice.")) - playsound(src, 'sound/weapons/genhit.ogg', 50, TRUE) + playsound(src, 'sound/items/weapons/genhit.ogg', 50, TRUE) new /obj/structure/lattice/lava(locate(x, y, z)) else to_chat(user, span_warning("You need one rod to build a heatproof lattice.")) diff --git a/code/game/turfs/open/misc.dm b/code/game/turfs/open/misc.dm index 5c5987f656e..f00e6ed6ded 100644 --- a/code/game/turfs/open/misc.dm +++ b/code/game/turfs/open/misc.dm @@ -17,8 +17,8 @@ smoothing_groups = SMOOTH_GROUP_TURF_OPEN canSmoothWith = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_OPEN_FLOOR - thermal_conductivity = 0.04 - heat_capacity = 10000 + thermal_conductivity = 0.02 + heat_capacity = 20000 tiled_dirt = TRUE /turf/open/misc/attackby(obj/item/W, mob/user, params) diff --git a/code/game/turfs/open/water.dm b/code/game/turfs/open/water.dm index de895754d03..835d2908918 100644 --- a/code/game/turfs/open/water.dm +++ b/code/game/turfs/open/water.dm @@ -1,4 +1,5 @@ /turf/open/water + name = "water" gender = PLURAL desc = "Shallow water." icon = 'icons/turf/floors.dmi' @@ -29,6 +30,7 @@ AddElement(/datum/element/watery_tile) if(!isnull(fishing_datum)) AddElement(/datum/element/lazy_fishing_spot, fishing_datum) + ADD_TRAIT(src, TRAIT_CATCH_AND_RELEASE, INNATE_TRAIT) /turf/open/water/jungle diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 8ffd83c8ec6..c9256f2e0c8 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -32,7 +32,7 @@ GLOBAL_LIST_EMPTY(station_turfs) var/temperature = T20C ///Used for fire, if a melting temperature was reached, it will be destroyed var/to_be_destroyed = 0 - ///The max temperature of the fire which it was subjected to + ///The max temperature of the fire which it was subjected to, determines the melting point of turf var/max_fire_temperature_sustained = 0 var/blocks_air = FALSE @@ -47,7 +47,7 @@ GLOBAL_LIST_EMPTY(station_turfs) var/requires_activation //add to air processing after initialize? var/changing_turf = FALSE - var/bullet_bounce_sound = 'sound/weapons/gun/general/mag_bullet_remove.ogg' //sound played when a shell casing is ejected ontop of the turf. + var/bullet_bounce_sound = 'sound/items/weapons/gun/general/mag_bullet_remove.ogg' //sound played when a shell casing is ejected ontop of the turf. var/bullet_sizzle = FALSE //used by ammo_casing/bounce_away() to determine if the shell casing should make a sizzle sound when it's ejected over the turf //IE if the turf is supposed to be water, set TRUE. @@ -231,7 +231,7 @@ GLOBAL_LIST_EMPTY(station_turfs) /// Call to move a turf from its current area to a new one /turf/proc/change_area(area/old_area, area/new_area) - //dont waste our time + //don't waste our time if(old_area == new_area) return @@ -270,14 +270,14 @@ GLOBAL_LIST_EMPTY(station_turfs) * * type_list - are we checking for types of atoms to ignore and not physical atoms */ /turf/proc/is_blocked_turf(exclude_mobs = FALSE, source_atom = null, list/ignore_atoms, type_list = FALSE) - if(density) + if((!isnull(source_atom) && !CanPass(source_atom, get_dir(src, source_atom))) || density) return TRUE for(var/atom/movable/movable_content as anything in contents) // We don't want to block ourselves if((movable_content == source_atom)) continue - // dont consider ignored atoms or their types + // don't consider ignored atoms or their types if(length(ignore_atoms)) if(!type_list && (movable_content in ignore_atoms)) continue @@ -306,7 +306,7 @@ GLOBAL_LIST_EMPTY(station_turfs) return TRUE return FALSE -//The zpass procs exist to be overriden, not directly called +//The zpass procs exist to be overridden, not directly called //use can_z_pass for that ///If we'd allow anything to travel into us /turf/proc/zPassIn(direction) @@ -426,7 +426,7 @@ GLOBAL_LIST_EMPTY(station_turfs) if(thing == mover || thing == mover_loc) // Multi tile objects and moving out of other objects continue if(!thing.Cross(mover)) - if(QDELETED(mover)) //deleted from Cross() (CanPass is pure so it cant delete, Cross shouldnt be doing this either though, but it can happen) + if(QDELETED(mover)) //deleted from Cross() (CanPass is pure so it can't delete, Cross shouldn't be doing this either though, but it can happen) return FALSE if(mover_is_phasing) mover.Bump(thing) diff --git a/code/game/world.dm b/code/game/world.dm index ce10a5ebcc9..c97188893a2 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -407,10 +407,10 @@ GLOBAL_VAR(tracy_log) new_status += " | Shuttle: [SSshuttle.emergency.getModeStr()] [SSshuttle.emergency.getTimerStr()]" else if(SSticker.current_state == GAME_STATE_FINISHED) new_status += "
RESTARTING" - if(SSmapping.config) - new_status += "
Map: [SSmapping.config.map_path == CUSTOM_MAP_PATH ? "Uncharted Territory" : SSmapping.config.map_name]" - if(SSmapping.next_map_config) - new_status += "[SSmapping.config ? " | " : "
"]Next: [SSmapping.next_map_config.map_path == CUSTOM_MAP_PATH ? "Uncharted Territory" : SSmapping.next_map_config.map_name]" + if(SSmapping.current_map) + new_status += "
Map: [SSmapping.current_map.map_path == CUSTOM_MAP_PATH ? "Uncharted Territory" : SSmapping.current_map.map_name]" + if(SSmap_vote.next_map_config) + new_status += "[SSmapping.current_map ? " | " : "
"]Next: [SSmap_vote.next_map_config.map_path == CUSTOM_MAP_PATH ? "Uncharted Territory" : SSmap_vote.next_map_config.map_name]" status = new_status */ diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 68096367ef8..1510783fc7c 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -320,7 +320,7 @@ ADMIN_VERB(give_mob_action, R_FUN, "Give Mob Action", ADMIN_VERB_NO_DESCRIPTION, if(isnull(ability_melee_cooldown) || ability_melee_cooldown < 0) ability_melee_cooldown = 2 add_ability.melee_cooldown_time = ability_melee_cooldown * 1 SECONDS - add_ability.name = tgui_input_text(user, "Choose ability name", "Ability name", "Generic Ability") + add_ability.name = tgui_input_text(user, "Choose ability name", "Ability name", "Generic Ability", max_length = MAX_NAME_LEN) add_ability.create_sequence_actions() else add_ability = new ability_type(ability_recipient) @@ -523,7 +523,7 @@ ADMIN_VERB(spawn_debug_full_crew, R_DEBUG, "Spawn Debug Full Crew", "Creates a f // Then, spawn a human and slap a person into it. var/number_made = 0 for(var/rank in SSjob.name_occupations) - var/datum/job/job = SSjob.GetJob(rank) + var/datum/job/job = SSjob.get_job(rank) // JOB_CREW_MEMBER is all jobs that pretty much aren't silicon if(!(job.job_flags & JOB_CREW_MEMBER)) @@ -535,7 +535,7 @@ ADMIN_VERB(spawn_debug_full_crew, R_DEBUG, "Spawn Debug Full Crew", "Creates a f new_guy.mind.name = "[rank] Dummy" // Assign the rank to the new player dummy. - if(!SSjob.AssignRole(new_guy, job, do_eligibility_checks = FALSE)) + if(!SSjob.assign_role(new_guy, job, do_eligibility_checks = FALSE)) qdel(new_guy) to_chat(user, "[rank] wasn't able to be spawned.") continue @@ -547,7 +547,7 @@ ADMIN_VERB(spawn_debug_full_crew, R_DEBUG, "Spawn Debug Full Crew", "Creates a f qdel(new_guy) // Then equip up the human with job gear. - SSjob.EquipRank(character, job) + SSjob.equip_rank(character, job) job.after_latejoin_spawn(character) // Finally, ensure the minds are tracked and in the manifest. diff --git a/code/modules/admin/antag_panel.dm b/code/modules/admin/antag_panel.dm index 91ec1b247a7..6caec485987 100644 --- a/code/modules/admin/antag_panel.dm +++ b/code/modules/admin/antag_panel.dm @@ -78,16 +78,16 @@ GLOBAL_VAR(antag_prototypes) /datum/mind/proc/get_special_statuses() var/list/result = LAZYCOPY(special_statuses) if(!current) - result += "No body!" + result += span_bad("No body!") if(current && HAS_TRAIT(current, TRAIT_MINDSHIELD)) - result += "Mindshielded" + result += span_good("Mindshielded") if(current && HAS_MIND_TRAIT(current, TRAIT_UNCONVERTABLE)) - result += "Unconvertable" + result += span_good("Unconvertable") //Move these to mob if(iscyborg(current)) var/mob/living/silicon/robot/robot = current if (robot.emagged) - result += "Emagged" + result += span_bad("Emagged") return result.Join(" | ") /datum/mind/proc/traitor_panel() @@ -158,7 +158,7 @@ GLOBAL_VAR(antag_prototypes) continue else //Show removal and current one priority_sections |= antag_category - antag_header_parts += "[current_antag.name]" + antag_header_parts += span_bad("[current_antag.name]") antag_header_parts += "Remove" antag_header_parts += "Open VV" diff --git a/code/modules/admin/outfit_editor.dm b/code/modules/admin/outfit_editor.dm index 67196c54bd4..a3bd433f52e 100644 --- a/code/modules/admin/outfit_editor.dm +++ b/code/modules/admin/outfit_editor.dm @@ -100,7 +100,7 @@ drip.vars[slot] = null if("rename") - var/newname = tgui_input_text(owner, "What do you want to name this outfit?", OUTFIT_EDITOR_NAME) + var/newname = tgui_input_text(owner, "What do you want to name this outfit?", OUTFIT_EDITOR_NAME, max_length = MAX_NAME_LEN) if(newname) drip.name = newname if("save") diff --git a/code/modules/admin/painting_manager.dm b/code/modules/admin/painting_manager.dm index 7a8bd7127a4..5ebcdef0059 100644 --- a/code/modules/admin/painting_manager.dm +++ b/code/modules/admin/painting_manager.dm @@ -55,7 +55,7 @@ ADMIN_VERB(painting_manager, R_ADMIN, "Paintings Manager", "View and redact pain if("rename") //Modify the metadata var/old_title = chosen_painting.title - var/new_title = tgui_input_text(user, "New painting title?", "Painting Rename", chosen_painting.title) + var/new_title = tgui_input_text(user, "New painting title?", "Painting Rename", chosen_painting.title, max_length = MAX_NAME_LEN) if(!new_title) return chosen_painting.title = new_title @@ -63,7 +63,7 @@ ADMIN_VERB(painting_manager, R_ADMIN, "Paintings Manager", "View and redact pain return TRUE if("rename_author") var/old_name = chosen_painting.creator_name - var/new_name = tgui_input_text(user, "New painting author name?", "Painting Rename", chosen_painting.creator_name) + var/new_name = tgui_input_text(user, "New painting author name?", "Painting Rename", chosen_painting.creator_name, max_length = MAX_NAME_LEN) if(!new_name) return chosen_painting.creator_name = new_name @@ -83,7 +83,7 @@ ADMIN_VERB(painting_manager, R_ADMIN, "Paintings Manager", "View and redact pain log_admin("[key_name(user)] has removed tag [params["tag"]] from persistent painting made by [chosen_painting.creator_ckey] with id [chosen_painting.md5].") return TRUE if("add_tag") - var/tag_name = tgui_input_text(user, "New tag name?", "Add Tag") + var/tag_name = tgui_input_text(user, "New tag name?", "Add Tag", max_length = MAX_NAME_LEN) if(!tag_name) return if(!chosen_painting.tags) diff --git a/code/modules/admin/permissionedit.dm b/code/modules/admin/permissionedit.dm index e508a104739..296b6fd2dd8 100644 --- a/code/modules/admin/permissionedit.dm +++ b/code/modules/admin/permissionedit.dm @@ -222,7 +222,7 @@ ADMIN_VERB(edit_admin_permissions, R_PERMISSIONS, "Permissions Panel", "Edit adm . = ckey(admin_key) if(!.) return FALSE - if(!admin_ckey && (. in GLOB.admin_datums+GLOB.deadmins)) + if(!admin_ckey && (. in (GLOB.admin_datums+GLOB.deadmins))) to_chat(usr, span_danger("[admin_key] is already an admin."), confidential = TRUE) return FALSE if(use_db) diff --git a/code/modules/admin/smites/dock_pay.dm b/code/modules/admin/smites/dock_pay.dm index 0ce91bbd4b7..a3828feb828 100644 --- a/code/modules/admin/smites/dock_pay.dm +++ b/code/modules/admin/smites/dock_pay.dm @@ -28,4 +28,4 @@ else card.registered_account.account_balance = card.registered_account.account_balance - new_cost card.registered_account.bank_card_talk("[new_cost] credits deducted from your account based on performance review.") - SEND_SOUND(target, 'sound/machines/buzz-sigh.ogg') + SEND_SOUND(target, 'sound/machines/buzz/buzz-sigh.ogg') diff --git a/code/modules/admin/smites/imaginary_friend_special.dm b/code/modules/admin/smites/imaginary_friend_special.dm index e670e26fd1f..37425faf3b1 100644 --- a/code/modules/admin/smites/imaginary_friend_special.dm +++ b/code/modules/admin/smites/imaginary_friend_special.dm @@ -1,6 +1,8 @@ #define CHOICE_RANDOM_APPEARANCE "Random" #define CHOICE_PREFS_APPEARANCE "Look-a-like" +#define CHOICE_PICK_PLAYER "Pick player" #define CHOICE_POLL_GHOSTS "Offer to ghosts" +#define CHOICE_END_THEM "Do it!" #define CHOICE_CANCEL "Cancel" /** @@ -15,10 +17,12 @@ **/ /datum/smite/custom_imaginary_friend name = "Imaginary Friend (Special)" - /// Who are we going to add to your head today? - var/list/friend_candidates /// Do we randomise friend appearances or not? var/random_appearance + /// Are we polling for ghosts + var/ghost_polling + /// How many imaginary friends should be added when polling + var/polled_friend_count /datum/smite/custom_imaginary_friend/configure(client/user) var/appearance_choice = tgui_alert(user, @@ -29,69 +33,99 @@ return FALSE random_appearance = appearance_choice == CHOICE_RANDOM_APPEARANCE - var/picked_client = tgui_input_list(user, "Pick the player to put in control", "New Imaginary Friend", list(CHOICE_POLL_GHOSTS) + sort_list(GLOB.clients)) - if(isnull(picked_client)) + var/client_selection_choice = tgui_alert(user, + "Do you want to pick a specific player, or poll for ghosts?", + "Imaginary Friend Selection?", + list(CHOICE_PICK_PLAYER, CHOICE_POLL_GHOSTS, CHOICE_CANCEL)) + + if(isnull(client_selection_choice) || client_selection_choice == CHOICE_CANCEL) return FALSE + ghost_polling = client_selection_choice == CHOICE_POLL_GHOSTS - if(picked_client == CHOICE_POLL_GHOSTS) - return poll_ghosts(user) + if(ghost_polling) + var/how_many = tgui_input_number(user, "How many imaginary friends should be added?", "Imaginary friend count", default = 1, min_value = 1) + if(isnull(how_many) || how_many < 1) + return FALSE + polled_friend_count = how_many - var/client/friend_candidate_client = picked_client - if(QDELETED(friend_candidate_client)) - to_chat(user, span_warning("Selected player no longer has a client, aborting.")) - return FALSE - - if(isliving(friend_candidate_client.mob) && (tgui_alert(user, "This player already has a living mob ([friend_candidate_client.mob]). Do you still want to turn them into an Imaginary Friend?", "Remove player from mob?", list("Do it!", "Cancel")) != "Do it!")) - return FALSE - - if(QDELETED(friend_candidate_client)) - to_chat(user, span_warning("Selected player no longer has a client, aborting.")) - return FALSE - - friend_candidates = list(friend_candidate_client) return TRUE -/// Try to offer the role to ghosts -/datum/smite/custom_imaginary_friend/proc/poll_ghosts(client/user) - var/how_many = tgui_input_number(user, "How many imaginary friends should be added?", "Imaginary friend count", default = 1, min_value = 1) - if (isnull(how_many) || how_many < 1) - return FALSE +/// Try to offer the role to ghosts +/datum/smite/custom_imaginary_friend/proc/poll_ghosts(client/user, mob/living/target) var/list/volunteers = SSpolling.poll_ghost_candidates( check_jobban = ROLE_PAI, poll_time = 10 SECONDS, ignore_category = POLL_IGNORE_IMAGINARYFRIEND, - role_name_text = "imaginary friend", + jump_target = target, + role_name_text = "an imaginary friend for [target.real_name]", ) var/volunteer_count = length(volunteers) - if (volunteer_count == 0) + if(volunteer_count == 0) to_chat(user, span_warning("No candidates volunteered, aborting.")) - return FALSE + return shuffle_inplace(volunteers) - friend_candidates = list() - while (how_many > 0 && length(volunteers) > 0) + var/list/friend_candidates = list() + while(polled_friend_count > 0 && length(volunteers) > 0) var/mob/dead/observer/lucky_ghost = pop(volunteers) if (!lucky_ghost.client) continue - how_many-- + polled_friend_count-- friend_candidates += lucky_ghost.client - return TRUE + return friend_candidates + +/// Pick client manually +/datum/smite/custom_imaginary_friend/proc/pick_client(client/user) + var/picked_client = tgui_input_list(user, "Pick the player to put in control", "New Imaginary Friend", sort_list(GLOB.clients)) + if(isnull(picked_client)) + return + + var/client/friend_candidate_client = picked_client + if(QDELETED(friend_candidate_client)) + to_chat(user, span_warning("Selected player no longer has a client, aborting.")) + return + + if(isliving(friend_candidate_client.mob)) + var/end_them_choice = tgui_alert(user, + "This player already has a living mob ([friend_candidate_client.mob]). Do you still want to turn them into an Imaginary Friend?", + "Remove player from mob?", + list(CHOICE_END_THEM, CHOICE_CANCEL)) + if(end_them_choice == CHOICE_CANCEL) + return + + if(QDELETED(friend_candidate_client)) + to_chat(user, span_warning("Selected player no longer has a client, aborting.")) + return + + return list(friend_candidate_client) + /datum/smite/custom_imaginary_friend/effect(client/user, mob/living/target) . = ..() + // Run this check before and after polling, we don't wanna poll for something which already stopped existing + if(QDELETED(target)) + to_chat(user, span_warning("The target mob no longer exists, aborting.")) + return + + var/list/friend_candidates + if(ghost_polling) + friend_candidates = poll_ghosts(user, target) + else + friend_candidates = pick_client(user) + if(QDELETED(target)) to_chat(user, span_warning("The target mob no longer exists, aborting.")) return - if(!length(friend_candidates)) + if(isnull(friend_candidates) || !length(friend_candidates)) to_chat(user, span_warning("No provided imaginary friend candidates, aborting.")) return var/list/final_clients = list() - for (var/client/client as anything in friend_candidates) - if (QDELETED(client)) + for(var/client/client as anything in friend_candidates) + if(QDELETED(client)) continue final_clients += client @@ -99,7 +133,7 @@ to_chat(user, span_warning("No provided imaginary friend candidates had clients, aborting.")) return - for (var/client/friend_candidate_client as anything in final_clients) + for(var/client/friend_candidate_client as anything in final_clients) var/mob/client_mob = friend_candidate_client.mob if(isliving(client_mob)) client_mob.ghostize() @@ -114,5 +148,7 @@ #undef CHOICE_RANDOM_APPEARANCE #undef CHOICE_PREFS_APPEARANCE +#undef CHOICE_PICK_PLAYER #undef CHOICE_POLL_GHOSTS +#undef CHOICE_END_THEM #undef CHOICE_CANCEL diff --git a/code/modules/admin/smites/immerse.dm b/code/modules/admin/smites/immerse.dm index fd330868e99..9cdd8aca95e 100644 --- a/code/modules/admin/smites/immerse.dm +++ b/code/modules/admin/smites/immerse.dm @@ -5,5 +5,5 @@ /datum/smite/immerse/effect(client/user, mob/living/target) . = ..() immerse_player(target) - SEND_SOUND(target, sound('sound/voice/roleplay.ogg')) + SEND_SOUND(target, sound('sound/misc/roleplay.ogg')) to_chat(target, span_boldnotice("Please roleplay appropriately, okay?")) diff --git a/code/modules/admin/smites/lightning.dm b/code/modules/admin/smites/lightning.dm index 660af779f9b..6ffd8eb5869 100644 --- a/code/modules/admin/smites/lightning.dm +++ b/code/modules/admin/smites/lightning.dm @@ -12,7 +12,7 @@ var/turf/lightning_source = get_step(get_step(user, NORTH), NORTH) lightning_source.Beam(user, icon_state="lightning[rand(1,12)]", time = 5) user.adjustFireLoss(LIGHTNING_BOLT_DAMAGE) - playsound(get_turf(user), 'sound/magic/lightningbolt.ogg', 50, TRUE) + playsound(get_turf(user), 'sound/effects/magic/lightningbolt.ogg', 50, TRUE) if(ishuman(user)) var/mob/living/carbon/human/human_target = user human_target.electrocution_animation(LIGHTNING_BOLT_ELECTROCUTION_ANIMATION_LENGTH) diff --git a/code/modules/admin/smites/nugget.dm b/code/modules/admin/smites/nugget.dm index 4525f674f2c..18e5254e615 100644 --- a/code/modules/admin/smites/nugget.dm +++ b/code/modules/admin/smites/nugget.dm @@ -16,6 +16,6 @@ if (limb.body_part == HEAD || limb.body_part == CHEST) continue addtimer(CALLBACK(limb, TYPE_PROC_REF(/obj/item/bodypart/, dismember)), timer) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(playsound), carbon_target, 'sound/effects/cartoon_pop.ogg', 70), timer) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(playsound), carbon_target, 'sound/effects/cartoon_sfx/cartoon_pop.ogg', 70), timer) addtimer(CALLBACK(carbon_target, TYPE_PROC_REF(/mob/living/, spin), 4, 1), timer - 0.4 SECONDS) timer += 2 SECONDS diff --git a/code/modules/admin/sound_emitter.dm b/code/modules/admin/sound_emitter.dm index d697537c6df..c68baa32e4e 100644 --- a/code/modules/admin/sound_emitter.dm +++ b/code/modules/admin/sound_emitter.dm @@ -81,7 +81,7 @@ return var/mob/user = usr if(href_list["edit_label"]) - var/new_label = tgui_input_text(user, "Choose a new label", "Sound Emitter") + var/new_label = tgui_input_text(user, "Choose a new label", "Sound Emitter", max_length = MAX_NAME_LEN) if(!new_label) return maptext = MAPTEXT(new_label) diff --git a/code/modules/admin/verbs/admin.dm b/code/modules/admin/verbs/admin.dm index 3aaab5bae58..e6d6ed488e3 100644 --- a/code/modules/admin/verbs/admin.dm +++ b/code/modules/admin/verbs/admin.dm @@ -32,7 +32,7 @@ ADMIN_VERB(unprison, R_ADMIN, "UnPrison", ADMIN_VERB_NO_DESCRIPTION, ADMIN_CATEG tgui_alert(user, "[prisoner.name] is not prisoned.") return - SSjob.SendToLateJoin(prisoner) + SSjob.send_to_late_join(prisoner) message_admins("[key_name_admin(user)] has unprisoned [key_name_admin(prisoner)]") log_admin("[key_name(user)] has unprisoned [key_name(prisoner)]") BLACKBOX_LOG_ADMIN_VERB("Unprison") diff --git a/code/modules/admin/verbs/admin_newscaster.dm b/code/modules/admin/verbs/admin_newscaster.dm index 4cb7b5c3344..b1be5560d69 100644 --- a/code/modules/admin/verbs/admin_newscaster.dm +++ b/code/modules/admin/verbs/admin_newscaster.dm @@ -234,14 +234,14 @@ ADMIN_VERB(access_news_network, R_ADMIN, "Access Newscaster Network", "Allows yo return TRUE if("setCriminalName") - var/temp_name = tgui_input_text(usr, "Write the Criminal's Name", "Warrent Alert Handler", "John Doe", MAX_NAME_LEN, multiline = FALSE) + var/temp_name = tgui_input_text(usr, "Write the Criminal's Name", "Warrent Alert Handler", "John Doe", max_length = MAX_NAME_LEN, multiline = FALSE) if(!temp_name) return TRUE criminal_name = temp_name return TRUE if("setCrimeData") - var/temp_desc = tgui_input_text(usr, "Write the Criminal's Crimes", "Warrent Alert Handler", "Unknown", MAX_BROADCAST_LEN, multiline = TRUE) + var/temp_desc = tgui_input_text(usr, "Write the Criminal's Crimes", "Warrent Alert Handler", "Unknown", max_length = MAX_BROADCAST_LEN, multiline = TRUE) if(!temp_desc) return TRUE crime_description = temp_desc @@ -339,7 +339,7 @@ ADMIN_VERB(access_news_network, R_ADMIN, "Access Newscaster Network", "Allows yo if(channel_name == potential_channel.channel_ID) current_channel = potential_channel break - var/temp_message = tgui_input_text(usr, "Write your Feed story", "Network Channel Handler", feed_channel_message, multiline = TRUE) + var/temp_message = tgui_input_text(usr, "Write your Feed story", "Network Channel Handler", feed_channel_message, max_length = MAX_BROADCAST_LEN, multiline = TRUE) if(length(temp_message) <= 1) return TRUE if(temp_message) diff --git a/code/modules/admin/verbs/adminevents.dm b/code/modules/admin/verbs/adminevents.dm index 32da58b05c2..98b177cad64 100644 --- a/code/modules/admin/verbs/adminevents.dm +++ b/code/modules/admin/verbs/adminevents.dm @@ -269,13 +269,21 @@ ADMIN_VERB(command_report_footnote, R_ADMIN, "Command Report Footnote", "Adds a var/datum/command_footnote/command_report_footnote = new /datum/command_footnote() GLOB.communications_controller.block_command_report += 1 //Add a blocking condition to the counter until the inputs are done. - command_report_footnote.message = tgui_input_text(user, "This message will be attached to the bottom of the roundstart threat report. Be sure to delay the roundstart report if you need extra time.", "P.S.") + command_report_footnote.message = tgui_input_text( + user, + "This message will be attached to the bottom of the roundstart threat report. Be sure to delay the roundstart report if you need extra time.", + "P.S.", + ) if(!command_report_footnote.message) GLOB.communications_controller.block_command_report -= 1 qdel(command_report_footnote) return - command_report_footnote.signature = tgui_input_text(user, "Whose signature will appear on this footnote?", "Also sign here, here, aaand here.") + command_report_footnote.signature = tgui_input_text( + user, + "Whose signature will appear on this footnote?", + "Also sign here, here, aaand here.", + ) if(!command_report_footnote.signature) command_report_footnote.signature = "Classified" diff --git a/code/modules/admin/verbs/adminfun.dm b/code/modules/admin/verbs/adminfun.dm index c7acd1cba46..c58d63581bd 100644 --- a/code/modules/admin/verbs/adminfun.dm +++ b/code/modules/admin/verbs/adminfun.dm @@ -147,7 +147,7 @@ ADMIN_VERB(polymorph_all, R_ADMIN, "Polymorph All", "Applies the effects of the continue M.audible_message(span_hear("...wabbajack...wabbajack...")) - playsound(M.loc, 'sound/magic/staff_change.ogg', 50, TRUE, -1) + playsound(M.loc, 'sound/effects/magic/staff_change.ogg', 50, TRUE, -1) M.wabbajack() @@ -187,7 +187,7 @@ ADMIN_VERB_AND_CONTEXT_MENU(admin_smite, R_ADMIN|R_FUN, "Smite", "Smite a player /proc/firing_squad(mob/living/carbon/target, turf/source_turf, body_zone, wound_bonus, damage) if(!target.get_bodypart(body_zone)) return - playsound(target, 'sound/weapons/gun/revolver/shot.ogg', 100) + playsound(target, 'sound/items/weapons/gun/revolver/shot.ogg', 100) var/obj/projectile/bullet/smite/divine_wrath = new(source_turf) divine_wrath.damage = damage divine_wrath.wound_bonus = wound_bonus diff --git a/code/modules/admin/verbs/admingame.dm b/code/modules/admin/verbs/admingame.dm index c431a04c299..8d7818aa79e 100644 --- a/code/modules/admin/verbs/admingame.dm +++ b/code/modules/admin/verbs/admingame.dm @@ -173,20 +173,24 @@ ADMIN_VERB_ONLY_CONTEXT_MENU(show_player_panel, R_ADMIN, "Show Player Panel", mo user << browse(body, "window=adminplayeropts-[REF(player)];size=550x515") BLACKBOX_LOG_ADMIN_VERB("Player Panel") -/client/proc/cmd_admin_godmode(mob/M in GLOB.mob_list) +/client/proc/cmd_admin_godmode(mob/mob in GLOB.mob_list) set category = "Admin.Game" set name = "Godmode" if(!check_rights(R_ADMIN)) return - M.status_flags ^= GODMODE - to_chat(usr, span_adminnotice("Toggled [(M.status_flags & GODMODE) ? "ON" : "OFF"]"), confidential = TRUE) + var/had_trait = HAS_TRAIT_FROM(mob, TRAIT_GODMODE, ADMIN_TRAIT) + if(had_trait) + REMOVE_TRAIT(mob, TRAIT_GODMODE, ADMIN_TRAIT) + else + ADD_TRAIT(mob, TRAIT_GODMODE, ADMIN_TRAIT) + to_chat(usr, span_adminnotice("Toggled [had_trait ? "OFF" : "ON"]"), confidential = TRUE) - log_admin("[key_name(usr)] has toggled [key_name(M)]'s nodamage to [(M.status_flags & GODMODE) ? "On" : "Off"]") - var/msg = "[key_name_admin(usr)] has toggled [ADMIN_LOOKUPFLW(M)]'s nodamage to [(M.status_flags & GODMODE) ? "On" : "Off"]" + log_admin("[key_name(usr)] has toggled [key_name(mob)]'s nodamage to [had_trait ? "Off" : "On"]") + var/msg = "[key_name_admin(usr)] has toggled [ADMIN_LOOKUPFLW(mob)]'s nodamage to [had_trait ? "Off" : "On"]" message_admins(msg) - admin_ticket_log(M, msg) - SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Godmode", "[M.status_flags & GODMODE ? "Enabled" : "Disabled"]")) // If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! + admin_ticket_log(mob, msg) + SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Godmode", "[had_trait ? "Disabled" : "Enabled"]")) // If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /* If a guy was gibbed and you want to revive him, this is a good way to do so. @@ -213,7 +217,7 @@ ADMIN_VERB(respawn_character, R_ADMIN, "Respawn Character", "Respawn a player th if(findtext(G_found.real_name,"monkey")) if(tgui_alert(user,"This character appears to have been a monkey. Would you like to respawn them as such?",,list("Yes","No")) == "Yes") var/mob/living/carbon/human/species/monkey/new_monkey = new - SSjob.SendToLateJoin(new_monkey) + SSjob.send_to_late_join(new_monkey) G_found.mind.transfer_to(new_monkey) //be careful when doing stuff like this! I've already checked the mind isn't in use new_monkey.key = G_found.key to_chat(new_monkey, "You have been fully respawned. Enjoy the game.", confidential = TRUE) @@ -225,7 +229,7 @@ ADMIN_VERB(respawn_character, R_ADMIN, "Respawn Character", "Respawn a player th //Ok, it's not a monkey. So, spawn a human. var/mob/living/carbon/human/new_character = new//The mob being spawned. - SSjob.SendToLateJoin(new_character) + SSjob.send_to_late_join(new_character) var/datum/record/locked/record_found //Referenced to later to either randomize or not randomize the character. if(G_found.mind && !G_found.mind.active) //mind isn't currently in use by someone/something @@ -248,7 +252,7 @@ ADMIN_VERB(respawn_character, R_ADMIN, "Respawn Character", "Respawn a player th else new_character.mind_initialize() if(is_unassigned_job(new_character.mind.assigned_role)) - new_character.mind.set_assigned_role(SSjob.GetJobType(SSjob.overflow_role)) + new_character.mind.set_assigned_role(SSjob.get_job_type(SSjob.overflow_role)) new_character.key = G_found.key @@ -265,7 +269,7 @@ ADMIN_VERB(respawn_character, R_ADMIN, "Respawn Character", "Respawn a player th //Now for special roles and equipment. var/datum/antagonist/traitor/traitordatum = new_character.mind.has_antag_datum(/datum/antagonist/traitor) if(traitordatum) - SSjob.EquipRank(new_character, new_character.mind.assigned_role, new_character.client) + SSjob.equip_rank(new_character, new_character.mind.assigned_role, new_character.client) new_character.mind.give_uplink(silent = TRUE, antag_datum = traitordatum) switch(new_character.mind.special_role) @@ -294,7 +298,7 @@ ADMIN_VERB(respawn_character, R_ADMIN, "Respawn Character", "Respawn a player th new_character = new_character.AIize() else if(!traitordatum) // Already equipped there. - SSjob.EquipRank(new_character, new_character.mind.assigned_role, new_character.client)//Or we simply equip them. + SSjob.equip_rank(new_character, new_character.mind.assigned_role, new_character.client)//Or we simply equip them. //Announces the character on all the systems, based on the record. if(!record_found && (new_character.mind.assigned_role.job_flags & JOB_CREW_MEMBER)) diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index 4c984c42b71..96f6069df7a 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -103,7 +103,7 @@ ADMIN_VERB(cmd_admin_pm_panel, R_NONE, "Admin PM", "Show a list of clients to PM if(length(recipient_interactions) == 1) if(length(opening_interactions)) // Inform the admin that they aren't the first var/printable_interators = english_list(opening_interactions) - SEND_SOUND(src, sound('sound/machines/buzz-sigh.ogg', volume=30)) + SEND_SOUND(src, sound('sound/machines/buzz/buzz-sigh.ogg', volume=30)) message_prompt += "\n\n**This ticket is already being responded to by: [printable_interators]**" // add the admin who is currently responding to the list of people responding LAZYADD(recipient_ticket.opening_responders, src) diff --git a/code/modules/admin/verbs/ai_triumvirate.dm b/code/modules/admin/verbs/ai_triumvirate.dm index d63994a25c3..38c2eba712c 100644 --- a/code/modules/admin/verbs/ai_triumvirate.dm +++ b/code/modules/admin/verbs/ai_triumvirate.dm @@ -36,7 +36,7 @@ GLOBAL_DATUM(triple_ai_controller, /datum/triple_ai_controller) to_chat(usr, "This option is currently only usable during pregame. This may change at a later date.", confidential = TRUE) return - var/datum/job/job = SSjob.GetJobType(/datum/job/ai) + var/datum/job/job = SSjob.get_job_type(/datum/job/ai) if(!job) to_chat(usr, "Unable to locate the AI job", confidential = TRUE) CRASH("triple_ai() called, no /datum/job/ai to be found.") diff --git a/code/modules/admin/verbs/anonymousnames.dm b/code/modules/admin/verbs/anonymousnames.dm index 7f56155c998..21924288467 100644 --- a/code/modules/admin/verbs/anonymousnames.dm +++ b/code/modules/admin/verbs/anonymousnames.dm @@ -268,7 +268,7 @@ GLOBAL_DATUM(current_anonymous_theme, /datum/anonymous_theme) set_station_name("[pick(GLOB.first_names)] [pick(GLOB.last_names)]") /datum/anonymous_theme/station/announce_to_all_players() - priority_announce("Confirmed level 9 reality error event near [station_name()]. All personnel must try their best to carry on, as to not trigger more reality events by accident.", "Central Command Higher Dimensional Affairs", 'sound/misc/notice1.ogg') + priority_announce("Confirmed level 9 reality error event near [station_name()]. All personnel must try their best to carry on, as to not trigger more reality events by accident.", "Central Command Higher Dimensional Affairs", 'sound/announcer/notice/notice1.ogg') /datum/anonymous_theme/station/anonymous_name(mob/target) return new_station_name() diff --git a/code/modules/admin/verbs/change_shuttle_events.dm b/code/modules/admin/verbs/change_shuttle_events.dm index 90f7e03672e..258370df3b7 100644 --- a/code/modules/admin/verbs/change_shuttle_events.dm +++ b/code/modules/admin/verbs/change_shuttle_events.dm @@ -27,5 +27,5 @@ ADMIN_VERB(change_shuttle_events, R_ADMIN|R_FUN, "Change Shuttle Events", "Chang port.event_list.Remove(active[options[result]]) message_admins("[key_name_admin(user)] has removed '[active[result]]' from [port].") else - port.event_list.Add(new typepath (port)) message_admins("[key_name_admin(user)] has added '[typepath]' to [port].") + port.add_shuttle_event(typepath) diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 20cdf351459..b6c5e10ca1d 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -583,8 +583,8 @@ ADMIN_VERB(jump_to_ruin, R_DEBUG, "Jump to Ruin", "Displays a list of all placed return var/datum/map_template/ruin/template = landmark.ruin_template user.mob.forceMove(get_turf(landmark)) - to_chat(user, span_name("[template.name]"), confidential = TRUE) - to_chat(user, "[template.description]", confidential = TRUE) + to_chat(user, span_name(template.name), confidential = TRUE) + to_chat(user, span_italics(template.description), confidential = TRUE) ADMIN_VERB_VISIBILITY(place_ruin, ADMIN_VERB_VISIBLITY_FLAG_MAPPING_DEBUG) ADMIN_VERB(place_ruin, R_DEBUG, "Spawn Ruin", "Attempt to randomly place a specific ruin.", ADMIN_CATEGORY_MAPPING) @@ -625,7 +625,7 @@ ADMIN_VERB(place_ruin, R_DEBUG, "Spawn Ruin", "Attempt to randomly place a speci log_admin("[key_name(user)] randomly spawned ruin [ruinname] at [COORD(landmark)].") user.mob.forceMove(get_turf(landmark)) to_chat(user, span_name("[template.name]"), confidential = TRUE) - to_chat(user, "[template.description]", confidential = TRUE) + to_chat(user, span_italics("[template.description]"), confidential = TRUE) else to_chat(user, span_warning("Failed to place [template.name]."), confidential = TRUE) diff --git a/code/modules/admin/verbs/ert.dm b/code/modules/admin/verbs/ert.dm index e116a9daf9a..6aaa5068a5b 100644 --- a/code/modules/admin/verbs/ert.dm +++ b/code/modules/admin/verbs/ert.dm @@ -250,7 +250,7 @@ ert_antag.random_names = ertemplate.random_names ert_operative.mind.add_antag_datum(ert_antag,ert_team) - ert_operative.mind.set_assigned_role(SSjob.GetJobType(ert_antag.ert_job_path)) + ert_operative.mind.set_assigned_role(SSjob.get_job_type(ert_antag.ert_job_path)) //Logging and cleanup ert_operative.log_message("has been selected as \a [ert_antag.name].", LOG_GAME) diff --git a/code/modules/admin/verbs/grant_dna_infusion.dm b/code/modules/admin/verbs/grant_dna_infusion.dm index 06cfa8110d6..2e087a16057 100644 --- a/code/modules/admin/verbs/grant_dna_infusion.dm +++ b/code/modules/admin/verbs/grant_dna_infusion.dm @@ -19,7 +19,7 @@ // This is necessary because list propererties are not defined until initialization picked_infusion = infusions[picked_infusion] - picked_infusion = new picked_infusion + picked_infusion = new picked_infusion() if(!length(picked_infusion.output_organs)) return FALSE @@ -27,7 +27,8 @@ . = picked_infusion for(var/obj/item/organ/infusion_organ as anything in picked_infusion.output_organs) var/obj/item/organ/new_organ = new infusion_organ() - if(!new_organ.replace_into(target)) + new_organ.replace_into(target) + if(new_organ.owner != target) to_chat(usr, span_notice("[target] is unable to carry [new_organ]!")) qdel(new_organ) . = FALSE diff --git a/code/modules/admin/verbs/lawpanel.dm b/code/modules/admin/verbs/lawpanel.dm index f1daaf17576..6de3ff70182 100644 --- a/code/modules/admin/verbs/lawpanel.dm +++ b/code/modules/admin/verbs/lawpanel.dm @@ -24,7 +24,7 @@ ADMIN_VERB(law_panel, R_ADMIN, "Law Panel", "View the AI laws.", ADMIN_CATEGORY_ var/lawtype = tgui_input_list(user, "Select law type", "Law type", lawtypes) if(isnull(lawtype)) return FALSE - var/lawtext = tgui_input_text(user, "Input law text", "Law text") + var/lawtext = tgui_input_text(user, "Input law text", "Law text") // admin verb so no max length and also any user-level input is config based already so ehhhh if(!lawtext) return FALSE if(QDELETED(src) || QDELETED(borgo)) diff --git a/code/modules/admin/verbs/maprotation.dm b/code/modules/admin/verbs/maprotation.dm index 09d6d93bee6..38d7535758f 100644 --- a/code/modules/admin/verbs/maprotation.dm +++ b/code/modules/admin/verbs/maprotation.dm @@ -1,12 +1,3 @@ - -ADMIN_VERB(force_random_rotate, R_SERVER, "Trigger 'Random' Map Rotation", "Force a map vote.", ADMIN_CATEGORY_SERVER) - var/rotate = tgui_alert(user,"Force a random map rotation to trigger?", "Rotate map?", list("Yes", "Cancel")) - if (rotate != "Yes") - return - message_admins("[key_name_admin(user)] is forcing a random map rotation.") - log_admin("[key_name(user)] is forcing a random map rotation.") - SSmapping.maprotate() - ADMIN_VERB(admin_change_map, R_SERVER, "Change Map", "Set the next map.", ADMIN_CATEGORY_SERVER) var/list/maprotatechoices = list() for (var/map in config.maplist) @@ -119,14 +110,14 @@ ADMIN_VERB(admin_change_map, R_SERVER, "Change Map", "Set the next map.", ADMIN_ fdel(PATH_TO_NEXT_MAP_JSON) text2file(json_encode(json_value), PATH_TO_NEXT_MAP_JSON) - if(SSmapping.changemap(virtual_map)) + if(SSmap_vote.set_next_map(virtual_map)) message_admins("[key_name_admin(user)] has changed the map to [virtual_map.map_name]") - SSmapping.map_force_chosen = TRUE + SSmap_vote.admin_override = TRUE fdel("data/custom_map_json/[config_file]") else var/datum/map_config/virtual_map = maprotatechoices[chosenmap] message_admins("[key_name_admin(user)] is changing the map to [virtual_map.map_name]") log_admin("[key_name(user)] is changing the map to [virtual_map.map_name]") - if (SSmapping.changemap(virtual_map)) + if (SSmap_vote.set_next_map(virtual_map)) message_admins("[key_name_admin(user)] has changed the map to [virtual_map.map_name]") - SSmapping.map_force_chosen = TRUE + SSmap_vote.admin_override = TRUE diff --git a/code/modules/admin/verbs/secrets.dm b/code/modules/admin/verbs/secrets.dm index 53ab045e281..f3acd741faa 100644 --- a/code/modules/admin/verbs/secrets.dm +++ b/code/modules/admin/verbs/secrets.dm @@ -84,7 +84,7 @@ ADMIN_VERB(secrets, R_NONE, "Secrets", "Abuse harder than you ever have before w if("infinite_sec") if(!is_debugger) return - var/datum/job/sec_job = SSjob.GetJobType(/datum/job/security_officer) + var/datum/job/sec_job = SSjob.get_job_type(/datum/job/security_officer) sec_job.total_positions = -1 sec_job.spawn_positions = -1 message_admins("[key_name_admin(holder)] has removed the cap on security officers.") @@ -648,12 +648,12 @@ ADMIN_VERB(secrets, R_NONE, "Secrets", "Abuse harder than you ever have before w /proc/portalAnnounce(announcement, playlightning) set waitfor = FALSE if (playlightning) - sound_to_playing_players('sound/magic/lightning_chargeup.ogg') + sound_to_playing_players('sound/effects/magic/lightning_chargeup.ogg') sleep(8 SECONDS) priority_announce(replacetext(announcement, "%STATION%", station_name())) if (playlightning) sleep(2 SECONDS) - sound_to_playing_players('sound/magic/lightningbolt.ogg') + sound_to_playing_players('sound/effects/magic/lightningbolt.ogg') /// Spawns a portal storm that spawns in sentient/non sentient mobs /// portal_appearance is a list in the form (turf's plane offset + 1) -> appearance to use @@ -671,7 +671,7 @@ ADMIN_VERB(secrets, R_NONE, "Secrets", "Abuse harder than you ever have before w H.equipOutfit(humanoutfit) var/turf/T = get_step(loc, SOUTHWEST) T.flick_overlay_static(portal_appearance[GET_TURF_PLANE_OFFSET(T) + 1], 15) - playsound(T, 'sound/magic/lightningbolt.ogg', rand(80, 100), TRUE) + playsound(T, 'sound/effects/magic/lightningbolt.ogg', rand(80, 100), TRUE) /datum/everyone_is_an_antag_controller var/chosen_antag = "" diff --git a/code/modules/admin/verbs/server.dm b/code/modules/admin/verbs/server.dm index ceb2c764a00..27a0a1c3f5b 100644 --- a/code/modules/admin/verbs/server.dm +++ b/code/modules/admin/verbs/server.dm @@ -98,7 +98,7 @@ ADMIN_VERB(start_now, R_SERVER, "Start Now", "Start the round RIGHT NOW.", ADMIN SSticker.start_immediately = FALSE SSticker.SetTimeLeft(3 MINUTES) to_chat(world, span_big(span_notice("The game will start in 3 minutes."))) - SEND_SOUND(world, sound('sound/ai/default/attention.ogg')) + SEND_SOUND(world, sound('sound/announcer/default/attention.ogg')) message_admins(span_adminnotice("[key_name_admin(user)] has cancelled immediate game start. Game will start in 3 minutes.")) log_admin("[key_name(user)] has cancelled immediate game start.") return @@ -203,11 +203,11 @@ ADMIN_VERB(delay, R_SERVER, "Delay Pre-Game", "Delay the game start.", ADMIN_CAT SSticker.SetTimeLeft(newtime) SSticker.start_immediately = FALSE if(newtime < 0) - to_chat(world, "The game start has been delayed.", confidential = TRUE) + to_chat(world, span_infoplain("The game start has been delayed."), confidential = TRUE) log_admin("[key_name(user)] delayed the round start.") else to_chat(world, span_infoplain(span_bold("The game will start in [DisplayTimeText(newtime)].")), confidential = TRUE) - SEND_SOUND(world, sound('sound/ai/default/attention.ogg')) + SEND_SOUND(world, sound('sound/announcer/default/attention.ogg')) log_admin("[key_name(user)] set the pre-game delay to [DisplayTimeText(newtime)].") BLACKBOX_LOG_ADMIN_VERB("Delay Game Start") diff --git a/code/modules/admin/view_variables/debug_variable_appearance.dm b/code/modules/admin/view_variables/debug_variable_appearance.dm index 9e92eba4605..c5a367e83a0 100644 --- a/code/modules/admin/view_variables/debug_variable_appearance.dm +++ b/code/modules/admin/view_variables/debug_variable_appearance.dm @@ -38,6 +38,9 @@ // can't use the name either for byond reasons var/_vis_flags +#if (MIN_COMPILER_VERSION > 515 || MIN_COMPILER_BUILD > 1643) +#warn vis_flags should now be supported by mutable appearances so we can safely remove the weird copying in this code +#endif // all alone at the end of the universe GLOBAL_DATUM_INIT(pluto, /atom/movable, new /atom/movable(null)) @@ -63,6 +66,13 @@ GLOBAL_DATUM_INIT(pluto, /atom/movable, new /atom/movable(null)) return FALSE if(var_name == NAMEOF(src, realized_underlays)) return FALSE + +#if (MIN_COMPILER_VERSION >= 515 && MIN_COMPILER_BUILD >= 1643) +#warn X/Y/Z and contents are now fully unviewable on our supported versions, remove the below check +#endif + +// lummy removed these from the the MA/image type +#if (DM_VERSION <= 515 && DM_BUILD < 1643) // Filtering out the stuff I know we don't care about if(var_name == NAMEOF(src, x)) return FALSE @@ -70,13 +80,14 @@ GLOBAL_DATUM_INIT(pluto, /atom/movable, new /atom/movable(null)) return FALSE if(var_name == NAMEOF(src, z)) return FALSE - // Could make an argument for these but I think they will just confuse people, so yeeet -#ifndef SPACEMAN_DMM // Spaceman doesn't believe in contents on appearances, sorry lads + #ifndef SPACEMAN_DMM // Spaceman doesn't believe in contents on appearances, sorry lads if(var_name == NAMEOF(src, contents)) return FALSE -#endif + #endif if(var_name == NAMEOF(src, loc)) return FALSE +#endif + // Could make an argument for this but I think they will just confuse people, so yeeet if(var_name == NAMEOF(src, vis_contents)) return FALSE return ..() diff --git a/code/modules/admin/view_variables/view_variables.dm b/code/modules/admin/view_variables/view_variables.dm index 37bf0911c60..66ac70f3f62 100644 --- a/code/modules/admin/view_variables/view_variables.dm +++ b/code/modules/admin/view_variables/view_variables.dm @@ -3,7 +3,7 @@ ADMIN_VERB_AND_CONTEXT_MENU(debug_variables, R_NONE, "View Variables", "View the variables of a datum.", ADMIN_CATEGORY_DEBUG, datum/thing in world) user.debug_variables(thing) -// This is kept as a seperate proc because admins are able to show VV to non-admins +// This is kept as a separate proc because admins are able to show VV to non-admins /client/proc/debug_variables(datum/thing in world) set category = "Debug" @@ -23,7 +23,7 @@ ADMIN_VERB_AND_CONTEXT_MENU(debug_variables, R_NONE, "View Variables", "View the if(isappearance(thing)) thing = get_vv_appearance(thing) // this is /mutable_appearance/our_bs_subtype - var/islist = islist(thing) || (!isdatum(thing) && hascall(thing, "Cut")) // Some special lists dont count as lists, but can be detected by if they have list procs + var/islist = islist(thing) || (!isdatum(thing) && hascall(thing, "Cut")) // Some special lists don't count as lists, but can be detected by if they have list procs if(!islist && !isdatum(thing)) return diff --git a/code/modules/antagonists/_common/antag_datum.dm b/code/modules/antagonists/_common/antag_datum.dm index 9e2de212cf5..21e36c20507 100644 --- a/code/modules/antagonists/_common/antag_datum.dm +++ b/code/modules/antagonists/_common/antag_datum.dm @@ -419,7 +419,7 @@ GLOBAL_LIST_EMPTY(antagonists) * Appears at start of roundend_catagory section. */ /datum/antagonist/proc/roundend_report_header() - return "The [roundend_category] were:
" + return span_header("The [roundend_category] were:
") /** * Proc that sends string data for the round-end report. diff --git a/code/modules/antagonists/_common/antag_spawner.dm b/code/modules/antagonists/_common/antag_spawner.dm index 5f7a7e579d3..27c1fd5a0ea 100644 --- a/code/modules/antagonists/_common/antag_spawner.dm +++ b/code/modules/antagonists/_common/antag_spawner.dm @@ -83,7 +83,7 @@ app.wiz_team = master_wizard.wiz_team master_wizard.wiz_team.add_member(app_mind) app_mind.add_antag_datum(app) - app_mind.set_assigned_role(SSjob.GetJobType(/datum/job/wizard_apprentice)) + app_mind.set_assigned_role(SSjob.get_job_type(/datum/job/wizard_apprentice)) app_mind.special_role = ROLE_WIZARD_APPRENTICE SEND_SOUND(M, sound('sound/effects/magic.ogg')) @@ -274,7 +274,7 @@ 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) + playsound(user.loc, 'sound/effects/glass/glassbr1.ogg', 100, TRUE) qdel(src) else to_chat(user, span_warning("The bottle's contents usually pop and boil constantly, but right now they're eerily still and calm. Perhaps you should try again later.")) @@ -424,15 +424,7 @@ monkey_man.fully_replace_character_name(monkey_man.real_name, pick(GLOB.syndicate_monkey_names)) - monkey_man.dna.add_mutation(/datum/mutation/human/clever) - // Can't make them human or nonclever. At least not with the easy and boring way out. - for(var/datum/mutation/human/mutation as anything in monkey_man.dna.mutations) - mutation.mutadone_proof = TRUE - mutation.instability = 0 - - // Extra backup! - ADD_TRAIT(monkey_man, TRAIT_NO_DNA_SCRAMBLE, SPECIES_TRAIT) - // Anything else requires enough effort that they deserve it. + monkey_man.make_clever_and_no_dna_scramble() monkey_man.mind.enslave_mind_to_creator(user) diff --git a/code/modules/antagonists/_common/antag_team.dm b/code/modules/antagonists/_common/antag_team.dm index 29f94b040ec..527196c51c3 100644 --- a/code/modules/antagonists/_common/antag_team.dm +++ b/code/modules/antagonists/_common/antag_team.dm @@ -49,12 +49,12 @@ GLOBAL_LIST_EMPTY(antagonist_teams) /datum/team/proc/roundend_report() var/list/report = list() - report += "\The [name]:" + report += span_header("\The [name]:") report += "The [member_name]s were:" report += printplayerlist(members) if(objectives.len) - report += "Team had following objectives:" + report += span_header("Team had following objectives:") var/win = TRUE var/objective_count = 1 for(var/datum/objective/objective as anything in objectives) diff --git a/code/modules/antagonists/abductor/abductee/abductee.dm b/code/modules/antagonists/abductor/abductee/abductee.dm index fa529a65044..9b5421c0fd7 100644 --- a/code/modules/antagonists/abductor/abductee/abductee.dm +++ b/code/modules/antagonists/abductor/abductee/abductee.dm @@ -6,7 +6,7 @@ */ /datum/antagonist/abductee name = "\improper Abductee" - stinger_sound = 'sound/ambience/antag/abductee.ogg' + stinger_sound = 'sound/music/antag/abductee.ogg' roundend_category = "abductees" antagpanel_category = ANTAG_GROUP_ABDUCTORS antag_hud_name = "abductee" diff --git a/code/modules/antagonists/abductor/abductor.dm b/code/modules/antagonists/abductor/abductor.dm index 7fc0c565ab1..2ca46499a7d 100644 --- a/code/modules/antagonists/abductor/abductor.dm +++ b/code/modules/antagonists/abductor/abductor.dm @@ -7,7 +7,7 @@ show_in_antagpanel = FALSE //should only show subtypes show_to_ghosts = TRUE suicide_cry = "FOR THE MOTHERSHIP!!" // They can't even talk but y'know - stinger_sound = 'sound/ambience/antag/ayylien.ogg' + stinger_sound = 'sound/music/antag/ayylien.ogg' var/datum/team/abductor_team/team var/sub_role var/outfit @@ -70,7 +70,7 @@ return team /datum/antagonist/abductor/on_gain() - owner.set_assigned_role(SSjob.GetJobType(role_job)) + owner.set_assigned_role(SSjob.get_job_type(role_job)) owner.special_role = ROLE_ABDUCTOR objectives += team.objectives finalize_abductor() @@ -171,7 +171,7 @@ else result += "[name] team failed its mission." - result += "The abductors of [name] were:" + result += span_header("The abductors of [name] were:") for(var/datum/mind/abductor_mind in members) result += printplayer(abductor_mind) result += printobjectives(objectives) diff --git a/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm b/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm index 25bbea66577..91107529721 100644 --- a/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm +++ b/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm @@ -48,7 +48,7 @@ icon_state = "gizmo_scan" to_chat(user, span_notice("You switch the device to [mode == GIZMO_SCAN? "SCAN": "MARK"] MODE")) -/obj/item/abductor/gizmo/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) +/obj/item/abductor/gizmo/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) if(!ScientistCheck(user)) return ITEM_INTERACT_SKIP_TO_ATTACK // So you slap them with it if(!console) @@ -63,8 +63,10 @@ return ITEM_INTERACT_SUCCESS -/obj/item/abductor/gizmo/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) - return interact_with_atom(interacting_with, user, modifiers) +/obj/item/abductor/gizmo/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(!ismob(interacting_with)) + return NONE + return ranged_interact_with_atom(interacting_with, user, modifiers) /obj/item/abductor/gizmo/proc/scan(atom/target, mob/living/user) if(ishuman(target)) @@ -104,15 +106,17 @@ icon_state = "silencer" inhand_icon_state = "gizmo" -/obj/item/abductor/silencer/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) +/obj/item/abductor/silencer/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) if(!AbductorCheck(user)) return ITEM_INTERACT_SKIP_TO_ATTACK // So you slap them with it radio_off(interacting_with, user) return ITEM_INTERACT_SUCCESS -/obj/item/abductor/silencer/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) - return interact_with_atom(interacting_with, user, modifiers) +/obj/item/abductor/silencer/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(!ismob(interacting_with)) + return NONE + return ranged_interact_with_atom(interacting_with, user, modifiers) /obj/item/abductor/silencer/proc/radio_off(atom/target, mob/living/user) if( !(user in (viewers(7,target))) ) @@ -155,10 +159,12 @@ icon_state = "mind_device_message" to_chat(user, span_notice("You switch the device to [mode == MIND_DEVICE_MESSAGE? "TRANSMISSION": "COMMAND"] MODE")) -/obj/item/abductor/mind_device/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) - return interact_with_atom(interacting_with, user, modifiers) - /obj/item/abductor/mind_device/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(!ismob(interacting_with)) + return NONE + return ranged_interact_with_atom(interacting_with, user, modifiers) + +/obj/item/abductor/mind_device/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) if(!ScientistCheck(user)) return ITEM_INTERACT_BLOCKING @@ -183,8 +189,12 @@ to_chat(user, span_warning("Your target is already under a mind-controlling influence!")) return - var/command = tgui_input_text(user, "Enter the command for your target to follow.\ - Uses Left: [target_gland.mind_control_uses], Duration: [DisplayTimeText(target_gland.mind_control_duration)]", "Enter command") + var/command = tgui_input_text( + user, + "Enter the command for your target to follow. Uses Left: [target_gland.mind_control_uses], Duration: [DisplayTimeText(target_gland.mind_control_duration)]", + "Enter command", + max_length = MAX_MESSAGE_LEN, + ) if(!command) return @@ -209,14 +219,14 @@ if(living_target.stat == DEAD) to_chat(user, span_warning("Your target is dead!")) return - var/message = tgui_input_text(user, "Message to send to your target's brain", "Enter message") + var/message = tgui_input_text(user, "Message to send to your target's brain", "Enter message", max_length = MAX_MESSAGE_LEN) if(!message) return if(QDELETED(living_target) || living_target.stat == DEAD) return living_target.balloon_alert(living_target, "you hear a voice") - to_chat(living_target, span_hear("You hear a voice in your head saying:
[message]")) + to_chat(living_target, span_hear("You hear a voice in your head saying: [span_abductor(message)]")) to_chat(user, span_notice("You send the message to your target.")) log_directed_talk(user, living_target, message, LOG_SAY, "abductor whisper") @@ -225,7 +235,7 @@ name = "alien firing pin" icon_state = "firing_pin_ayy" desc = "This firing pin is slimy and warm; you can swear you feel it constantly trying to mentally probe you." - fail_message = "Firing error, please contact Command." + fail_message = span_abductor("Firing error, please contact Command.") /obj/item/firing_pin/abductor/pin_auth(mob/living/user) . = isabductor(user) @@ -296,7 +306,7 @@ Congratulations! You are now trained for invasive xenobiology research!"} cooldown = 0 SECONDS stamina_damage = 0 knockdown_time = 14 SECONDS - on_stun_sound = 'sound/weapons/egloves.ogg' + on_stun_sound = 'sound/items/weapons/egloves.ogg' affect_cyborg = TRUE var/mode = BATON_STUN @@ -329,7 +339,7 @@ Congratulations! You are now trained for invasive xenobiology research!"} affect_cyborg = is_stun_mode log_stun_attack = is_stun_mode // other modes have their own log entries. stun_animation = is_stun_or_sleep - on_stun_sound = is_stun_or_sleep ? 'sound/weapons/egloves.ogg' : null + on_stun_sound = is_stun_or_sleep ? 'sound/items/weapons/egloves.ogg' : null to_chat(usr, span_notice("You switch the baton to [txt] mode.")) update_appearance() @@ -412,7 +422,7 @@ Congratulations! You are now trained for invasive xenobiology research!"} var/mob/living/carbon/carbon_victim = victim if(!carbon_victim.handcuffed) if(carbon_victim.canBeHandcuffed()) - playsound(src, 'sound/weapons/cablecuff.ogg', 30, TRUE, -2) + playsound(src, 'sound/items/weapons/cablecuff.ogg', 30, TRUE, -2) carbon_victim.visible_message(span_danger("[user] begins restraining [carbon_victim] with [src]!"), \ span_userdanger("[user] begins shaping an energy field around your hands!")) if(do_after(user, time_to_cuff, carbon_victim) && carbon_victim.canBeHandcuffed()) @@ -512,7 +522,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) + playsound(src, 'sound/machines/terminal/terminal_alert.ogg', 50) addtimer(CALLBACK(src, PROC_REF(try_spawn_machine)), 3 SECONDS) /obj/item/abductor_machine_beacon/proc/try_spawn_machine() @@ -529,7 +539,7 @@ Congratulations! You are now trained for invasive xenobiology research!"} visible_message(span_notice("[new_machine] warps on top of the beacon!")) qdel(src) else - playsound(src, 'sound/machines/buzz-two.ogg', 50) + playsound(src, 'sound/machines/buzz/buzz-two.ogg', 50) /obj/item/abductor_machine_beacon/chem_dispenser name = "beacon - Reagent Synthesizer" @@ -608,7 +618,7 @@ Congratulations! You are now trained for invasive xenobiology research!"} inhand_icon_state = "silencer" toolspeed = 0.25 tool_behaviour = null - usesound = 'sound/items/pshoom.ogg' + usesound = 'sound/items/pshoom/pshoom.ogg' ///A list of all the tools we offer. Stored as "Tool" for the key, and the icon/icon_state as the value. var/list/tool_list = list() ///Which toolset do we have active currently? diff --git a/code/modules/antagonists/abductor/equipment/gland.dm b/code/modules/antagonists/abductor/equipment/gland.dm index 29ea5f1e785..89052e02218 100644 --- a/code/modules/antagonists/abductor/equipment/gland.dm +++ b/code/modules/antagonists/abductor/equipment/gland.dm @@ -51,7 +51,7 @@ return var/image/holder = owner.hud_list[GLAND_HUD] var/icon/I = icon(owner.icon, owner.icon_state, owner.dir) - holder.pixel_y = I.Height() - world.icon_size + holder.pixel_y = I.Height() - ICON_SIZE_Y if(active_mind_control) holder.icon_state = "hudgland_active" else if(mind_control_uses) diff --git a/code/modules/antagonists/abductor/equipment/glands/electric.dm b/code/modules/antagonists/abductor/equipment/glands/electric.dm index 72b2c1e14ad..e0b3df0f19c 100644 --- a/code/modules/antagonists/abductor/equipment/glands/electric.dm +++ b/code/modules/antagonists/abductor/equipment/glands/electric.dm @@ -23,4 +23,4 @@ /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) - playsound(get_turf(owner), 'sound/magic/lightningshock.ogg', 50, TRUE) + playsound(get_turf(owner), 'sound/effects/magic/lightningshock.ogg', 50, TRUE) diff --git a/code/modules/antagonists/abductor/equipment/glands/heal.dm b/code/modules/antagonists/abductor/equipment/glands/heal.dm index 7f446237765..83ba7a7ffbd 100644 --- a/code/modules/antagonists/abductor/equipment/glands/heal.dm +++ b/code/modules/antagonists/abductor/equipment/glands/heal.dm @@ -183,7 +183,7 @@ owner.visible_message(span_warning("With a loud snap, [owner]'s [parse_zone(body_zone)] rapidly grows back from [owner.p_their()] body!"), span_userdanger("With a loud snap, your [parse_zone(body_zone)] rapidly grows back from your body!"), span_warning("Your hear a loud snap.")) - playsound(owner, 'sound/magic/demon_consume.ogg', 50, TRUE) + playsound(owner, 'sound/effects/magic/demon_consume.ogg', 50, TRUE) owner.regenerate_limb(body_zone) /obj/item/organ/internal/heart/gland/heal/proc/replace_blood() @@ -212,7 +212,7 @@ /obj/item/organ/internal/heart/gland/heal/proc/replace_chest(obj/item/bodypart/chest/chest) if(!IS_ORGANIC_LIMB(chest)) owner.visible_message(span_warning("[owner]'s [chest.name] rapidly expels its mechanical components, replacing them with flesh!"), span_userdanger("Your [chest.name] rapidly expels its mechanical components, replacing them with flesh!")) - playsound(owner, 'sound/magic/clockwork/anima_fragment_attack.ogg', 50, TRUE) + playsound(owner, 'sound/effects/magic/clockwork/anima_fragment_attack.ogg', 50, TRUE) var/list/dirs = GLOB.alldirs.Copy() for(var/i in 1 to 3) var/obj/effect/decal/cleanable/robot_debris/debris = new(get_turf(owner)) diff --git a/code/modules/antagonists/abductor/machinery/experiment.dm b/code/modules/antagonists/abductor/machinery/experiment.dm index 09790f4ba89..c4e59c505bf 100644 --- a/code/modules/antagonists/abductor/machinery/experiment.dm +++ b/code/modules/antagonists/abductor/machinery/experiment.dm @@ -169,7 +169,7 @@ credits += point_reward return "Experiment successful! [point_reward] new data-points collected." else - playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 50, TRUE) + playsound(src.loc, 'sound/machines/buzz/buzz-sigh.ogg', 50, TRUE) return "Experiment failed! No replacement organ detected." else say("Brain activity nonexistent - disposing sample...") @@ -190,7 +190,7 @@ H.forceMove(console.pad.teleport_target) return //Area not chosen / It's not safe area - teleport to arrivals - SSjob.SendToLateJoin(H, FALSE) + SSjob.send_to_late_join(H, FALSE) return /obj/machinery/abductor/experiment/update_icon_state() diff --git a/code/modules/antagonists/ashwalker/ashwalker.dm b/code/modules/antagonists/ashwalker/ashwalker.dm index eeba85982cd..8c3d8531767 100644 --- a/code/modules/antagonists/ashwalker/ashwalker.dm +++ b/code/modules/antagonists/ashwalker/ashwalker.dm @@ -65,9 +65,9 @@ objectives -= necropolis_objective //So we don't count it in the check for other objectives. report += "The [name] was tasked with defending the Necropolis:" if(necropolis_objective.check_completion()) - report += span_greentext("The nest stands! Glory to the Necropolis!
") + report += span_greentext(span_header("The nest stands! Glory to the Necropolis!
")) else - report += span_redtext("The Necropolis was destroyed, the tribe has fallen...
") + report += span_redtext(span_header("The Necropolis was destroyed, the tribe has fallen...
")) if(length(objectives)) report += span_header("The [name]'s other objectives were:") diff --git a/code/modules/antagonists/battlecruiser/battlecruiser.dm b/code/modules/antagonists/battlecruiser/battlecruiser.dm index bcc2fc96330..194034e31bb 100644 --- a/code/modules/antagonists/battlecruiser/battlecruiser.dm +++ b/code/modules/antagonists/battlecruiser/battlecruiser.dm @@ -20,7 +20,7 @@ antag_hud_name = "battlecruiser_crew" antagpanel_category = ANTAG_GROUP_SYNDICATE job_rank = ROLE_BATTLECRUISER_CREW - stinger_sound = 'sound/ambience/antag/ops.ogg' + stinger_sound = 'sound/music/antag/ops.ogg' /// Team to place the crewmember on. var/datum/team/battlecruiser/battlecruiser_team diff --git a/code/modules/antagonists/blob/blob_antag.dm b/code/modules/antagonists/blob/blob_antag.dm index 9cad238bb00..9f9d97fac8d 100644 --- a/code/modules/antagonists/blob/blob_antag.dm +++ b/code/modules/antagonists/blob/blob_antag.dm @@ -6,7 +6,7 @@ show_in_antagpanel = FALSE job_rank = ROLE_BLOB ui_name = "AntagInfoBlob" - stinger_sound = 'sound/ambience/antag/blobalert.ogg' + stinger_sound = 'sound/music/antag/blobalert.ogg' /// Action to release a blob infection var/datum/action/innate/blobpop/pop_action /// Initial points for a human blob @@ -133,13 +133,13 @@ owner.mind.transfer_to(blob_cam) old_body.gib() blob_cam.place_blob_core(placement_override, pop_override = TRUE) - playsound(get_turf(blob_cam), 'sound/ambience/antag/blobalert.ogg', 50, FALSE) + playsound(get_turf(blob_cam), 'sound/music/antag/blobalert.ogg', 50, FALSE) blobtag.has_already_popped = TRUE notify_ghosts( "A Blob host has burst in [get_area_name(blob_cam.blob_core)]", source = blob_cam.blob_core, - ghost_sound = 'sound/ambience/antag/blobalert.ogg', + ghost_sound = 'sound/music/antag/blobalert.ogg', header = "Blob Awakening!", notify_volume = 75, ) diff --git a/code/modules/antagonists/blob/blobstrains/_reagent.dm b/code/modules/antagonists/blob/blobstrains/_reagent.dm index 2d7f4c5d34e..65a50621b17 100644 --- a/code/modules/antagonists/blob/blobstrains/_reagent.dm +++ b/code/modules/antagonists/blob/blobstrains/_reagent.dm @@ -26,12 +26,21 @@ // These can only be applied by blobs. They are what (reagent) blobs are made out of. /datum/reagent/blob name = "Unknown" - description = "shouldn't exist and you should adminhelp immediately." + description = "" color = COLOR_WHITE taste_description = "bad code and slime" chemical_flags = NONE penetrates_skin = NONE + +/datum/reagent/blob/New() + ..() + + if(name == "Unknown") + description = "shouldn't exist and you should adminhelp immediately." + else if(description == "") + description = "[name] is the reagent created by that type of blob." + /// Used by blob reagents to calculate the reaction volume they should use when exposing mobs. /datum/reagent/blob/proc/return_mob_expose_reac_volume(mob/living/exposed_mob, methods=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/overmind) if(exposed_mob.stat == DEAD || HAS_TRAIT(exposed_mob, TRAIT_BLOB_ALLY)) diff --git a/code/modules/antagonists/blob/blobstrains/cryogenic_poison.dm b/code/modules/antagonists/blob/blobstrains/cryogenic_poison.dm index a18d802ff7d..acb4d96c23a 100644 --- a/code/modules/antagonists/blob/blobstrains/cryogenic_poison.dm +++ b/code/modules/antagonists/blob/blobstrains/cryogenic_poison.dm @@ -12,7 +12,7 @@ /datum/reagent/blob/cryogenic_poison name = "Cryogenic Poison" - description = "will inject targets with a freezing poison that does high damage over time." + description = "A freezing poison that does high damage over time. Cryogenic poison blobs inject this into their victims." color = "#8BA6E9" taste_description = "brain freeze" diff --git a/code/modules/antagonists/blob/blobstrains/regenerative_materia.dm b/code/modules/antagonists/blob/blobstrains/regenerative_materia.dm index a62895ae6c4..d9010a96537 100644 --- a/code/modules/antagonists/blob/blobstrains/regenerative_materia.dm +++ b/code/modules/antagonists/blob/blobstrains/regenerative_materia.dm @@ -12,6 +12,7 @@ /datum/reagent/blob/regenerative_materia name = "Regenerative Materia" + description = "Chemical that inflicts toxin damage and makes the target believe they are fully healed. Regenerative materia blobs inject this into their victims." taste_description = "heaven" color = "#A88FB7" diff --git a/code/modules/antagonists/blob/overmind.dm b/code/modules/antagonists/blob/overmind.dm index e33b6fdf364..619ccec6679 100644 --- a/code/modules/antagonists/blob/overmind.dm +++ b/code/modules/antagonists/blob/overmind.dm @@ -187,14 +187,14 @@ GLOBAL_LIST_EMPTY(blob_nodes) blobstrain.on_sporedeath(spore) /mob/camera/blob/proc/victory() - sound_to_playing_players('sound/machines/alarm.ogg') + sound_to_playing_players('sound/announcer/alarm/nuke_alarm.ogg', 70) sleep(10 SECONDS) for(var/mob/living/live_guy as anything in GLOB.mob_living_list) var/turf/guy_turf = get_turf(live_guy) if(isnull(guy_turf) || !is_station_level(guy_turf.z)) continue - if(live_guy in GLOB.overminds || (live_guy.pass_flags & PASSBLOB)) + if((live_guy in GLOB.overminds) || (live_guy.pass_flags & PASSBLOB)) continue var/area/blob_area = get_area(guy_turf) diff --git a/code/modules/antagonists/blob/structures/_blob.dm b/code/modules/antagonists/blob/structures/_blob.dm index 324c91ea3a5..ce1b016dcb0 100644 --- a/code/modules/antagonists/blob/structures/_blob.dm +++ b/code/modules/antagonists/blob/structures/_blob.dm @@ -175,6 +175,7 @@ if(isspaceturf(T) && !(locate(/obj/structure/lattice) in T) && prob(80)) make_blob = FALSE playsound(src.loc, 'sound/effects/splat.ogg', 50, TRUE) //Let's give some feedback that we DID try to spawn in space, since players are used to it + balloon_alert(controller, "failed to expand!") ConsumeTile() //hit the tile we're in, making sure there are no border objects blocking us if(!T.CanPass(src, get_dir(T, src))) //is the target turf impassable @@ -281,11 +282,11 @@ switch(damage_type) if(BRUTE) if(damage_amount) - playsound(src.loc, 'sound/effects/attackblob.ogg', 50, TRUE) + playsound(src.loc, 'sound/effects/blob/attackblob.ogg', 50, TRUE) else - playsound(src, 'sound/weapons/tap.ogg', 50, TRUE) + playsound(src, 'sound/items/weapons/tap.ogg', 50, TRUE) if(BURN) - playsound(src.loc, 'sound/items/welder.ogg', 100, TRUE) + playsound(src.loc, 'sound/items/tools/welder.ogg', 100, TRUE) /obj/structure/blob/run_atom_armor(damage_amount, damage_type, damage_flag = 0, attack_dir) switch(damage_type) diff --git a/code/modules/antagonists/blob/structures/core.dm b/code/modules/antagonists/blob/structures/core.dm index 6eeccc8c361..f995dc0b81b 100644 --- a/code/modules/antagonists/blob/structures/core.dm +++ b/code/modules/antagonists/blob/structures/core.dm @@ -24,7 +24,7 @@ GLOB.blob_cores += src START_PROCESSING(SSobj, src) SSpoints_of_interest.make_point_of_interest(src) - update_appearance() //so it atleast appears + update_appearance() //so it at least appears if(!placed && !overmind) return INITIALIZE_HINT_QDEL if(overmind) diff --git a/code/modules/antagonists/brainwashing/brainwashing.dm b/code/modules/antagonists/brainwashing/brainwashing.dm index 57707688f4d..ebad949060a 100644 --- a/code/modules/antagonists/brainwashing/brainwashing.dm +++ b/code/modules/antagonists/brainwashing/brainwashing.dm @@ -30,7 +30,7 @@ /datum/antagonist/brainwashed name = "\improper Brainwashed Victim" job_rank = ROLE_BRAINWASHED - stinger_sound = 'sound/ambience/antag/brainwashed.ogg' + stinger_sound = 'sound/music/antag/brainwashed.ogg' roundend_category = "brainwashed victims" show_in_antagpanel = TRUE antag_hud_name = "brainwashed" @@ -61,7 +61,7 @@ return var/list/objectives = list() do - var/objective = tgui_input_text(admin, "Add an objective", "Brainwashing") + var/objective = tgui_input_text(admin, "Add an objective", "Brainwashing", max_length = MAX_MESSAGE_LEN) if(objective) objectives += objective while(tgui_alert(admin, "Add another objective?", "More Brainwashing", list("Yes","No")) == "Yes") diff --git a/code/modules/antagonists/brother/brother.dm b/code/modules/antagonists/brother/brother.dm index a90fde57635..b9cf9354e44 100644 --- a/code/modules/antagonists/brother/brother.dm +++ b/code/modules/antagonists/brother/brother.dm @@ -9,7 +9,7 @@ suicide_cry = "FOR MY BROTHER!!" antag_moodlet = /datum/mood_event/focused hardcore_random_bonus = TRUE - stinger_sound = 'sound/ambience/antag/tatoralert.ogg' + stinger_sound = 'sound/music/antag/traitor/tatoralert.ogg' VAR_PRIVATE datum/team/brother_team/team diff --git a/code/modules/antagonists/changeling/changeling.dm b/code/modules/antagonists/changeling/changeling.dm index 6bfb0e315ff..68184fbfe43 100644 --- a/code/modules/antagonists/changeling/changeling.dm +++ b/code/modules/antagonists/changeling/changeling.dm @@ -14,7 +14,8 @@ can_assign_self_objectives = TRUE default_custom_objective = "Consume the station's most valuable genomes." hardcore_random_bonus = TRUE - stinger_sound = 'sound/ambience/antag/ling_alert.ogg' + stinger_sound = 'sound/music/antag/ling_alert.ogg' + /// Whether to give this changeling objectives or not var/give_objectives = TRUE /// Weather we assign objectives which compete with other lings @@ -59,7 +60,7 @@ /// The voice we're mimicing via the changeling voice ability. var/mimicing = "" /// Whether we can currently respec in the cellular emporium. - var/can_respec = FALSE + var/can_respec = 0 /// The currently active changeling sting. var/datum/action/changeling/sting/chosen_sting @@ -465,7 +466,7 @@ to_chat(owner.current, span_notice("We have removed our evolutions from this form, and are now ready to readapt.")) remove_changeling_powers() - can_respec = FALSE + can_respec -= 1 SSblackbox.record_feedback("tally", "changeling_power_purchase", 1, "Readapt") log_changeling_power("[key_name(owner)] readapted their changeling powers") return TRUE @@ -1122,11 +1123,11 @@ var/icon/final_icon = render_preview_outfit(/datum/outfit/changeling) var/icon/split_icon = render_preview_outfit(/datum/outfit/job/engineer) - final_icon.Shift(WEST, world.icon_size / 2) - final_icon.Shift(EAST, world.icon_size / 2) + final_icon.Shift(WEST, ICON_SIZE_X / 2) + final_icon.Shift(EAST, ICON_SIZE_X / 2) - split_icon.Shift(EAST, world.icon_size / 2) - split_icon.Shift(WEST, world.icon_size / 2) + split_icon.Shift(EAST, ICON_SIZE_X / 2) + split_icon.Shift(WEST, ICON_SIZE_X / 2) final_icon.Blend(split_icon, ICON_OVERLAY) diff --git a/code/modules/antagonists/changeling/powers/absorb.dm b/code/modules/antagonists/changeling/powers/absorb.dm index 7e13612153b..71b1509ec81 100644 --- a/code/modules/antagonists/changeling/powers/absorb.dm +++ b/code/modules/antagonists/changeling/powers/absorb.dm @@ -41,9 +41,14 @@ owner.visible_message(span_danger("[owner] sucks the fluids from [target]!"), span_notice("We have absorbed [target].")) to_chat(target, span_userdanger("You are absorbed by the changeling!")) + var/true_absorbtion = (!isnull(target.client) || !isnull(target.mind) || !isnull(target.last_mind)) + if (!true_absorbtion) + to_chat(owner, span_changeling(span_bold("You absorb [target], but their weak DNA is not enough to satisfy your hunger."))) + if(!changeling.has_profile_with_dna(target.dna)) changeling.add_new_profile(target) - changeling.true_absorbs++ + if (true_absorbtion) + changeling.true_absorbs++ if(owner.nutrition < NUTRITION_LEVEL_WELL_FED) owner.set_nutrition(min((owner.nutrition + target.nutrition), NUTRITION_LEVEL_WELL_FED)) @@ -57,7 +62,8 @@ is_absorbing = FALSE changeling.adjust_chemicals(10) - changeling.can_respec = TRUE + if (true_absorbtion) + changeling.can_respec++ if(target.stat != DEAD) target.investigate_log("has died from being changeling absorbed.", INVESTIGATE_DEATHS) diff --git a/code/modules/antagonists/changeling/powers/defib_grasp.dm b/code/modules/antagonists/changeling/powers/defib_grasp.dm index 867a595e17d..227b11c3a38 100644 --- a/code/modules/antagonists/changeling/powers/defib_grasp.dm +++ b/code/modules/antagonists/changeling/powers/defib_grasp.dm @@ -38,12 +38,12 @@ changeling.set_resting(FALSE) changeling.adjust_jitter(20 SECONDS) changeling.emote("scream") - playsound(changeling, 'sound/magic/demon_consume.ogg', 50, TRUE) + playsound(changeling, 'sound/effects/magic/demon_consume.ogg', 50, TRUE) // Mimics some real defib stuff (wish this was more generalized) playsound(defib, SFX_BODYFALL, 50, TRUE) - playsound(defib, 'sound/machines/defib_zap.ogg', 75, TRUE, -1) - playsound(defib, 'sound/machines/defib_success.ogg', 50, FALSE) // I guess + playsound(defib, 'sound/machines/defib/defib_zap.ogg', 75, TRUE, -1) + playsound(defib, 'sound/machines/defib/defib_success.ogg', 50, FALSE) // I guess defib.shock_pulling(30, changeling) /// Removes the arms of the defibber if they're a carbon, and stuns them for a bit. diff --git a/code/modules/antagonists/changeling/powers/fakedeath.dm b/code/modules/antagonists/changeling/powers/fakedeath.dm index 1dff58377fd..b0149501e66 100644 --- a/code/modules/antagonists/changeling/powers/fakedeath.dm +++ b/code/modules/antagonists/changeling/powers/fakedeath.dm @@ -108,7 +108,7 @@ if(!length(user.get_missing_limbs() - dont_regenerate)) return - playsound(user, 'sound/magic/demon_consume.ogg', 50, TRUE) + playsound(user, 'sound/effects/magic/demon_consume.ogg', 50, TRUE) user.visible_message( span_warning("[user]'s missing limbs reform, making a loud, grotesque sound!"), span_userdanger("Your limbs regrow, making a loud, crunchy sound and giving you great pain!"), @@ -123,7 +123,7 @@ return var/datum/antagonist/changeling/ling = IS_CHANGELING(user) - if(QDELETED(ling) || !(src in ling.innate_powers + ling.purchased_powers)) // checking both innate and purchased for full coverage + if(QDELETED(ling) || !(src in (ling.innate_powers + ling.purchased_powers))) // checking both innate and purchased for full coverage return if(!HAS_TRAIT_FROM(user, TRAIT_DEATHCOMA, CHANGELING_TRAIT)) return diff --git a/code/modules/antagonists/changeling/powers/headcrab.dm b/code/modules/antagonists/changeling/powers/headcrab.dm index 0b7668260d7..c4f2376f755 100644 --- a/code/modules/antagonists/changeling/powers/headcrab.dm +++ b/code/modules/antagonists/changeling/powers/headcrab.dm @@ -4,7 +4,7 @@ helptext = "We will be placed in control of a small, fragile creature. We may attack a corpse like this to plant an egg which will slowly mature into a new form for us." button_icon_state = "last_resort" chemical_cost = 20 - dna_cost = 1 + dna_cost = CHANGELING_POWER_INNATE req_human = TRUE req_stat = DEAD ignores_fakedeath = TRUE diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm index 01d97f448cd..f6b42bf19f2 100644 --- a/code/modules/antagonists/changeling/powers/mutations.dm +++ b/code/modules/antagonists/changeling/powers/mutations.dm @@ -53,8 +53,8 @@ if(istype(hand_item, weapon_type)) user.temporarilyRemoveItemFromInventory(hand_item, TRUE) //DROPDEL will delete the item if(!silent) - playsound(user, 'sound/effects/blobattack.ogg', 30, TRUE) - user.visible_message(span_warning("With a sickening crunch, [user] reforms [user.p_their()] [weapon_name_simple] into an arm!"), span_notice("We assimilate the [weapon_name_simple] back into our body."), "With a sickening crunch, \ - [target] reforms [target.p_their()] [blade.name] into an arm!", - span_warning("[blade] reforms back to normal."), - "= limit)) return to_chat(owner,span_warning("You begin to carve unnatural symbols into your flesh!")) - SEND_SOUND(owner, sound('sound/weapons/slice.ogg',0,1,10)) + SEND_SOUND(owner, sound('sound/items/weapons/slice.ogg',0,1,10)) if(!channeling) channeling = TRUE else @@ -292,7 +292,7 @@ owner.visible_message(span_warning("Thin grey dust falls from [owner]'s hand!"), \ span_cult_italic("You invoke the veiling spell, hiding nearby runes.")) charges-- - SEND_SOUND(owner, sound('sound/magic/smoke.ogg',0,1,25)) + SEND_SOUND(owner, sound('sound/effects/magic/smoke.ogg',0,1,25)) owner.whisper(invocation, language = /datum/language/common) for(var/obj/effect/rune/R in range(5,owner)) R.conceal() @@ -312,7 +312,7 @@ 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)) + SEND_SOUND(owner, sound('sound/effects/magic/enter_blood.ogg',0,1,25)) for(var/obj/effect/rune/R in range(7,owner)) //More range in case you weren't standing in exactly the same spot R.reveal() for(var/obj/structure/destructible/cult/S in range(6,owner)) @@ -461,7 +461,7 @@ target.color = COLOR_HERETIC_GREEN animate(target, color = old_color, time = 4 SECONDS, easing = EASE_IN) target.mob_light(range = 1.5, power = 2.5, color = COLOR_HERETIC_GREEN, duration = 0.5 SECONDS) - playsound(target, 'sound/magic/magic_block_mind.ogg', 150, TRUE) // insanely quiet + playsound(target, 'sound/effects/magic/magic_block_mind.ogg', 150, TRUE) // insanely quiet to_chat(user, span_warning("An eldritch force intervenes as you touch [target], absorbing most of the effects!")) to_chat(target, span_warning("As [user] touches you with vile magicks, the Mansus absorbs most of the effects!")) @@ -567,7 +567,7 @@ /obj/item/melee/blood_magic/shackles/proc/CuffAttack(mob/living/carbon/C, mob/living/user) if(!C.handcuffed) - playsound(loc, 'sound/weapons/cablecuff.ogg', 30, TRUE, -2) + playsound(loc, 'sound/items/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, 3 SECONDS, C)) @@ -650,7 +650,7 @@ if(candidate.mmi || candidate.shell) channeling = TRUE user.visible_message(span_danger("A dark cloud emanates from [user]'s hand and swirls around [candidate]!")) - playsound(T, 'sound/machines/airlock_alien_prying.ogg', 80, TRUE) + playsound(T, 'sound/machines/airlock/airlock_alien_prying.ogg', 80, TRUE) var/prev_color = candidate.color candidate.color = "black" if(!do_after(user, 9 SECONDS, target = candidate)) @@ -681,7 +681,7 @@ if(istype(target,/obj/machinery/door/airlock)) channeling = TRUE - playsound(T, 'sound/machines/airlockforced.ogg', 50, TRUE) + playsound(T, 'sound/machines/airlock/airlockforced.ogg', 50, TRUE) do_sparks(5, TRUE, target) if(!do_after(user, 5 SECONDS, target = user) && !QDELETED(target)) channeling = FALSE @@ -798,7 +798,7 @@ 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) + playsound(get_turf(construct_thing), 'sound/effects/magic/staff_healing.ogg', 25) user.Beam(construct_thing, icon_state="sendbeam", time = 1 SECONDS) return TRUE @@ -853,7 +853,7 @@ 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) + playsound(get_turf(human_bloodbag), 'sound/effects/magic/staff_healing.ogg', 25) new /obj/effect/temp_visual/cult/sparks(get_turf(human_bloodbag)) if (user != human_bloodbag) //Dont create beam from the user to the user user.Beam(human_bloodbag, icon_state="sendbeam", time = 15) @@ -874,7 +874,7 @@ 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) + playsound(get_turf(human_bloodbag), 'sound/effects/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)) @@ -908,7 +908,7 @@ 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) + playsound(our_turf, 'sound/effects/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)) diff --git a/code/modules/antagonists/cult/cult_comms.dm b/code/modules/antagonists/cult/cult_comms.dm index 3d567799650..7a8e2fa535f 100644 --- a/code/modules/antagonists/cult/cult_comms.dm +++ b/code/modules/antagonists/cult/cult_comms.dm @@ -27,7 +27,7 @@ return ..() /datum/action/innate/cult/comm/Activate() - var/input = tgui_input_text(usr, "Message to tell to the other acolytes", "Voice of Blood") + var/input = tgui_input_text(usr, "Message to tell to the other acolytes", "Voice of Blood", max_length = MAX_MESSAGE_LEN) if(!input || !IsAvailable(feedback = TRUE)) return @@ -122,7 +122,7 @@ team_member.current.update_mob_action_buttons() if(team_member.current.incapacitated) continue - SEND_SOUND(team_member.current, 'sound/hallucinations/im_here1.ogg') + SEND_SOUND(team_member.current, 'sound/effects/hallucinations/im_here1.ogg') 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) @@ -143,7 +143,7 @@ for(var/datum/mind/team_member as anything in team.members) if(!team_member.current || team_member.current == nominee || team_member.current.incapacitated) continue - SEND_SOUND(team_member.current, 'sound/magic/exit_blood.ogg') + SEND_SOUND(team_member.current, 'sound/effects/magic/exit_blood.ogg') asked_cultists += team_member.current var/list/yes_voters = SSpolling.poll_candidates( @@ -244,7 +244,7 @@ new /obj/effect/temp_visual/dir_setting/cult/phase(mobloc, B.current.dir) playsound(mobloc, SFX_PORTAL_ENTER, 100, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) if(4) - playsound(mobloc, 'sound/magic/exit_blood.ogg', 100, TRUE) + playsound(mobloc, 'sound/effects/magic/exit_blood.ogg', 100, TRUE) if(B.current != owner) var/turf/final = pick(destinations) if(istype(B.current.loc, /obj/item/soulstone)) @@ -268,13 +268,13 @@ owner.say("C'arta forbici!", language = /datum/language/common, forced = "cult invocation") if(2) owner.say("Pleggh e'ntrath!", language = /datum/language/common, forced = "cult invocation") - playsound(get_turf(owner),'sound/magic/clockwork/narsie_attack.ogg', 50, TRUE) + playsound(get_turf(owner),'sound/effects/magic/clockwork/narsie_attack.ogg', 50, TRUE) if(3) owner.say("Barhah hra zar'garis!", language = /datum/language/common, forced = "cult invocation") - playsound(get_turf(owner),'sound/magic/clockwork/narsie_attack.ogg', 75, TRUE) + playsound(get_turf(owner),'sound/effects/magic/clockwork/narsie_attack.ogg', 75, TRUE) if(4) owner.say("N'ath reth sh'yro eth d'rekkathnor!!!", language = /datum/language/common, forced = "cult invocation") - playsound(get_turf(owner),'sound/magic/clockwork/narsie_attack.ogg', 100, TRUE) + playsound(get_turf(owner),'sound/effects/magic/clockwork/narsie_attack.ogg', 100, TRUE) /datum/action/innate/cult/master/cultmark name = "Mark Target" @@ -399,7 +399,7 @@ if(QDELETED(owner) || QDELETED(src)) return - SEND_SOUND(owner, 'sound/magic/enter_blood.ogg') + SEND_SOUND(owner, 'sound/effects/magic/enter_blood.ogg') 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) @@ -452,7 +452,7 @@ var/turf/throwee_turf = get_turf(throwee) - playsound(throwee_turf, 'sound/magic/exit_blood.ogg') + playsound(throwee_turf, 'sound/effects/magic/exit_blood.ogg') new /obj/effect/temp_visual/cult/sparks(throwee_turf, caller.dir) throwee.visible_message( span_warning("A pulse of magic whisks [throwee] away!"), @@ -488,7 +488,7 @@ var/mob/living/living_clicked = clicked_on if(!IS_CULTIST(living_clicked)) return FALSE - SEND_SOUND(caller, sound('sound/weapons/thudswoosh.ogg')) + SEND_SOUND(caller, sound('sound/items/weapons/thudswoosh.ogg')) 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 diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm index 078b25ee663..826a2b052ba 100644 --- a/code/modules/antagonists/cult/cult_items.dm +++ b/code/modules/antagonists/cult/cult_items.dm @@ -26,7 +26,7 @@ wound_bonus = -10 bare_wound_bonus = 20 armour_penetration = 35 - block_sound = 'sound/weapons/parry.ogg' + block_sound = 'sound/items/weapons/parry.ogg' /obj/item/melee/cultblade/dagger/Initialize(mapload) . = ..() @@ -73,8 +73,8 @@ Striking a noncultist, however, will tear their flesh."} block_chance = 50 // now it's officially a cult esword wound_bonus = -50 bare_wound_bonus = 20 - hitsound = 'sound/weapons/bladeslice.ogg' - block_sound = 'sound/weapons/parry.ogg' + hitsound = 'sound/items/weapons/bladeslice.ogg' + block_sound = 'sound/items/weapons/parry.ogg' attack_verb_continuous = list("attacks", "slashes", "stabs", "slices", "tears", "lacerates", "rips", "dices", "rends") attack_verb_simple = list("attack", "slash", "stab", "slice", "tear", "lacerate", "rip", "dice", "rend") /// If TRUE, it can be used at will by anyone, non-cultists included @@ -285,7 +285,7 @@ Striking a noncultist, however, will tear their flesh."} item_flags = NEEDS_PERMIT | DROPDEL flags_1 = NONE block_chance = 25 //these dweebs don't get full block chance, because they're free cultists - block_sound = 'sound/weapons/parry.ogg' + block_sound = 'sound/items/weapons/parry.ogg' /obj/item/melee/cultblade/ghost/Initialize(mapload) . = ..() @@ -301,8 +301,8 @@ Striking a noncultist, however, will tear their flesh."} desc = "Use the sword to shear open the flimsy fabric of this reality and teleport to your target." button_icon = 'icons/mob/actions/actions_cult.dmi' button_icon_state = "phaseshift" - dash_sound = 'sound/magic/enter_blood.ogg' - recharge_sound = 'sound/magic/exit_blood.ogg' + dash_sound = 'sound/effects/magic/enter_blood.ogg' + recharge_sound = 'sound/effects/magic/exit_blood.ogg' beam_effect = "sendbeam" phasein = /obj/effect/temp_visual/dir_setting/cult/phase phaseout = /obj/effect/temp_visual/dir_setting/cult/phase/out @@ -717,7 +717,7 @@ Striking a noncultist, however, will tear their flesh."} SSshuttle.block_recall(surplus) totalcurses++ to_chat(user, span_danger("You shatter the orb! A dark essence spirals into the air, then disappears.")) - playsound(user.loc, 'sound/effects/glassbr1.ogg', 50, TRUE) + playsound(user.loc, 'sound/effects/glass/glassbr1.ogg', 50, TRUE) if(!remaining_curses) remaining_curses = strings(CULT_SHUTTLE_CURSE, "curse_announce") @@ -725,7 +725,7 @@ Striking a noncultist, however, will tear their flesh."} var/curse_message = pick_n_take(remaining_curses) || "Something has gone horrendously wrong..." curse_message += " The shuttle will be delayed by three minutes." - priority_announce("[curse_message]", "System Failure", 'sound/misc/notice1.ogg') + priority_announce("[curse_message]", "System Failure", 'sound/announcer/notice/notice1.ogg') if(MAX_SHUTTLE_CURSES-totalcurses <= 0) to_chat(user, span_danger(span_big("You sense that the emergency escape shuttle can no longer be cursed. It would be unwise to create more cursed orbs."))) else if(MAX_SHUTTLE_CURSES-totalcurses == 1) @@ -735,7 +735,7 @@ Striking a noncultist, however, will tear their flesh."} if(totalcurses >= MAX_SHUTTLE_CURSES && (world.time < first_curse_time + SHUTTLE_CURSE_OMFG_TIMESPAN)) var/omfg_message = pick_list(CULT_SHUTTLE_CURSE, "omfg_announce") || "LEAVE US ALONE!" - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(priority_announce), omfg_message, "Priority Alert", 'sound/misc/announce_syndi.ogg', null, "Nanotrasen Department of Transportation: Central Command"), rand(2 SECONDS, 6 SECONDS)) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(priority_announce), omfg_message, "Priority Alert", 'sound/announcer/announcement/announce_syndi.ogg', null, "Nanotrasen Department of Transportation: Central Command"), rand(2 SECONDS, 6 SECONDS)) for(var/mob/iter_player as anything in GLOB.player_list) if(IS_CULTIST(iter_player)) iter_player.client?.give_award(/datum/award/achievement/misc/cult_shuttle_omfg, iter_player) @@ -953,8 +953,8 @@ Striking a noncultist, however, will tear their flesh."} attack_verb_continuous = list("attacks", "slices", "shreds", "sunders", "lacerates", "cleaves") attack_verb_simple = list("attack", "slice", "shred", "sunder", "lacerate", "cleave") sharpness = SHARP_EDGED - hitsound = 'sound/weapons/bladeslice.ogg' - block_sound = 'sound/weapons/parry.ogg' + hitsound = 'sound/items/weapons/bladeslice.ogg' + block_sound = 'sound/items/weapons/parry.ogg' var/datum/action/innate/cult/halberd/halberd_act /obj/item/melee/cultblade/halberd/Initialize(mapload) @@ -984,7 +984,7 @@ Striking a noncultist, however, will tear their flesh."} var/mob/living/target = hit_atom if(IS_CULTIST(target) && target.put_in_active_hand(src)) - playsound(src, 'sound/weapons/throwtap.ogg', 50) + playsound(src, 'sound/items/weapons/throwtap.ogg', 50) target.visible_message(span_warning("[target] catches [src] out of the air!")) return if(target.can_block_magic() || IS_CULTIST(target)) @@ -1004,7 +1004,7 @@ Striking a noncultist, however, will tear their flesh."} T.visible_message(span_warning("[src] shatters and melts back into blood!")) new /obj/effect/temp_visual/cult/sparks(T) new /obj/effect/decal/cleanable/blood/splatter(T) - playsound(T, 'sound/effects/glassbr3.ogg', 100) + playsound(T, 'sound/effects/glass/glassbr3.ogg', 100) qdel(src) /obj/item/melee/cultblade/halberd/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK, damage_type = BRUTE) @@ -1053,7 +1053,7 @@ Striking a noncultist, however, will tear their flesh."} desc = "Blood for blood." color = "#ff0000" ammo_type = /obj/item/ammo_casing/magic/arcane_barrage/blood - fire_sound = 'sound/magic/wand_teleport.ogg' + fire_sound = 'sound/effects/magic/wand_teleport.ogg' /obj/item/ammo_casing/magic/arcane_barrage/blood projectile_type = /obj/projectile/magic/arcane_barrage/blood @@ -1142,7 +1142,7 @@ Striking a noncultist, however, will tear their flesh."} /obj/item/blood_beam/proc/charge(mob/user) var/obj/O - playsound(src, 'sound/magic/lightning_chargeup.ogg', 100, TRUE) + playsound(src, 'sound/effects/magic/lightning_chargeup.ogg', 100, TRUE) for(var/i in 1 to 12) if(!charging) break @@ -1171,7 +1171,7 @@ Striking a noncultist, however, will tear their flesh."} second = !second //Handles beam firing in pairs if(!firing) break - playsound(src, 'sound/magic/exit_blood.ogg', 75, TRUE) + playsound(src, 'sound/effects/magic/exit_blood.ogg', 75, TRUE) new /obj/effect/temp_visual/dir_setting/cult/phase(user.loc, user.dir) var/turf/temp_target = get_turf_in_angle(set_angle, targets_from, 40) for(var/turf/T in get_line(targets_from,temp_target)) @@ -1199,7 +1199,7 @@ Striking a noncultist, however, will tear their flesh."} if(L.density) L.Paralyze(20) L.adjustBruteLoss(45) - playsound(L, 'sound/hallucinations/wail.ogg', 50, TRUE) + playsound(L, 'sound/effects/hallucinations/wail.ogg', 50, TRUE) L.emote("scream") user.Beam(temp_target, icon_state="blood_beam", time = 7, beam_type = /obj/effect/ebeam/blood) @@ -1221,9 +1221,9 @@ Striking a noncultist, however, will tear their flesh."} w_class = WEIGHT_CLASS_BULKY attack_verb_continuous = list("bumps", "prods") attack_verb_simple = list("bump", "prod") - hitsound = 'sound/weapons/smash.ogg' - block_sound = 'sound/weapons/effects/ric5.ogg' - shield_bash_sound = 'sound/effects/glassknock.ogg' + hitsound = 'sound/items/weapons/smash.ogg' + block_sound = 'sound/items/weapons/effects/ric5.ogg' + shield_bash_sound = 'sound/effects/glass/glassknock.ogg' var/illusions = 2 /obj/item/shield/mirror/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK, damage_type = BRUTE) @@ -1234,7 +1234,7 @@ Striking a noncultist, however, will tear their flesh."} var/turf/T = get_turf(owner) T.visible_message(span_warning("The sheer force from [hitby] shatters the mirror shield!")) new /obj/effect/temp_visual/cult/sparks(T) - playsound(T, 'sound/effects/glassbr3.ogg', 100) + playsound(T, 'sound/effects/glass/glassbr3.ogg', 100) owner.Paralyze(25) qdel(src) return FALSE @@ -1271,7 +1271,7 @@ Striking a noncultist, however, will tear their flesh."} illusions++ if(illusions == initial(illusions) && isliving(loc)) var/mob/living/holder = loc - to_chat(holder, "The shield's illusions are back at full strength!") + to_chat(holder, span_cult_italic("The shield's illusions are back at full strength!")) /obj/item/shield/mirror/IsReflect() if(prob(block_chance)) @@ -1286,13 +1286,13 @@ Striking a noncultist, however, will tear their flesh."} target.visible_message(span_warning("[src] bounces off of [target], as if repelled by an unseen force!")) return if(IS_CULTIST(target) && target.put_in_active_hand(src)) - playsound(src, 'sound/weapons/throwtap.ogg', 50) + playsound(src, 'sound/items/weapons/throwtap.ogg', 50) target.visible_message(span_warning("[target] catches [src] out of the air!")) return if(!..()) target.Paralyze(30) new /obj/effect/temp_visual/cult/sparks(target) - playsound(target, 'sound/effects/glassbr3.ogg', 100) + playsound(target, 'sound/effects/glass/glassbr3.ogg', 100) qdel(src) else ..() diff --git a/code/modules/antagonists/cult/cult_objectives.dm b/code/modules/antagonists/cult/cult_objectives.dm index 8a4bf74dec8..17957f88bca 100644 --- a/code/modules/antagonists/cult/cult_objectives.dm +++ b/code/modules/antagonists/cult/cult_objectives.dm @@ -71,7 +71,7 @@ /datum/objective/sacrifice/proc/on_possible_mindswap(mob/source) SIGNAL_HANDLER UnregisterSignal(target.current, list(COMSIG_QDELETING, COMSIG_MOB_MIND_TRANSFERRED_INTO)) - //we check if the mind is bodyless only after mindswap shenanigeans to avoid issues. + //we check if the mind is bodyless only after mindswap shenanigans to avoid issues. addtimer(CALLBACK(src, PROC_REF(do_we_have_a_body)), 0 SECONDS) /datum/objective/sacrifice/proc/do_we_have_a_body() diff --git a/code/modules/antagonists/cult/cult_structure_altar.dm b/code/modules/antagonists/cult/cult_structure_altar.dm index e38591c0c07..e3fcf645a2f 100644 --- a/code/modules/antagonists/cult/cult_structure_altar.dm +++ b/code/modules/antagonists/cult/cult_structure_altar.dm @@ -10,7 +10,7 @@ desc = "A bloodstained altar dedicated to Nar'Sie." cult_examine_tip = "Can be used to create eldritch whetstones, construct shells, and flasks of unholy water." icon_state = "talismanaltar" - break_message = "The altar shatters, leaving only the wailing of the damned!" + break_message = span_warning("The altar shatters, leaving only the wailing of the damned!") mansus_conversion_path = /obj/effect/heretic_rune /obj/structure/destructible/cult/item_dispenser/altar/setup_options() diff --git a/code/modules/antagonists/cult/cult_structure_archives.dm b/code/modules/antagonists/cult/cult_structure_archives.dm index 9917d9505f7..d4867659651 100644 --- a/code/modules/antagonists/cult/cult_structure_archives.dm +++ b/code/modules/antagonists/cult/cult_structure_archives.dm @@ -12,7 +12,7 @@ icon_state = "tomealtar" light_range = 1.5 light_color = LIGHT_COLOR_FIRE - break_message = "The books and tomes of the archives burn into ash as the desk shatters!" + break_message = span_warning("The books and tomes of the archives burn into ash as the desk shatters!") mansus_conversion_path = /obj/item/codex_cicatrix /obj/structure/destructible/cult/item_dispenser/archives/setup_options() diff --git a/code/modules/antagonists/cult/cult_structure_forge.dm b/code/modules/antagonists/cult/cult_structure_forge.dm index 12d15b9296e..2ba11b2905a 100644 --- a/code/modules/antagonists/cult/cult_structure_forge.dm +++ b/code/modules/antagonists/cult/cult_structure_forge.dm @@ -12,7 +12,7 @@ icon_state = "forge" light_range = 2 light_color = LIGHT_COLOR_LAVA - break_message = "The forge breaks apart into shards with a howling scream!" + break_message = span_warning("The forge breaks apart into shards with a howling scream!") mansus_conversion_path = /obj/structure/destructible/eldritch_crucible /obj/structure/destructible/cult/item_dispenser/forge/setup_options() diff --git a/code/modules/antagonists/cult/cult_structure_pylon.dm b/code/modules/antagonists/cult/cult_structure_pylon.dm index e436601325d..54151f1171e 100644 --- a/code/modules/antagonists/cult/cult_structure_pylon.dm +++ b/code/modules/antagonists/cult/cult_structure_pylon.dm @@ -5,8 +5,8 @@ icon_state = "pylon" light_range = 1.5 light_color = COLOR_SOFT_RED - break_sound = 'sound/effects/glassbr2.ogg' - break_message = "The blood-red crystal falls to the floor and shatters!" + break_sound = 'sound/effects/glass/glassbr2.ogg' + break_message = span_warning("The blood-red crystal falls to the floor and shatters!") /// Length of the cooldown in between tile corruptions. Doubled if no turfs are found. var/corruption_cooldown_duration = 5 SECONDS /// The cooldown for corruptions. diff --git a/code/modules/antagonists/cult/cult_structures.dm b/code/modules/antagonists/cult/cult_structures.dm index 773f890d25d..5aae2a6ccbc 100644 --- a/code/modules/antagonists/cult/cult_structures.dm +++ b/code/modules/antagonists/cult/cult_structures.dm @@ -1,7 +1,7 @@ // Cult buildings! /obj/structure/destructible/cult icon = 'icons/obj/antags/cult/structures.dmi' - break_sound = 'sound/hallucinations/veryfar_noise.ogg' + break_sound = 'sound/effects/hallucinations/veryfar_noise.ogg' density = TRUE anchored = TRUE light_power = 2 @@ -137,7 +137,7 @@ /* * Set up and populate our list of options. - * Overriden by subtypes. + * Overridden by subtypes. * * The list of options is a associated list of format: * item_name = list( diff --git a/code/modules/antagonists/cult/datums/cult_team.dm b/code/modules/antagonists/cult/datums/cult_team.dm index 5d060f4042c..a616c8ddd42 100644 --- a/code/modules/antagonists/cult/datums/cult_team.dm +++ b/code/modules/antagonists/cult/datums/cult_team.dm @@ -55,7 +55,7 @@ if(ratio > CULT_RISEN && !cult_risen) for(var/datum/mind/mind as anything in members) if(mind.current) - SEND_SOUND(mind.current, 'sound/ambience/antag/bloodcult/bloodcult_eyes.ogg') + SEND_SOUND(mind.current, 'sound/music/antag/bloodcult/bloodcult_eyes.ogg') to_chat(mind.current, span_cult_large(span_warning("The veil weakens as your cult grows, your eyes begin to glow..."))) mind.current.AddElement(/datum/element/cult_eyes) cult_risen = TRUE @@ -64,7 +64,7 @@ if(ratio > CULT_ASCENDENT && !cult_ascendent) for(var/datum/mind/mind as anything in members) if(mind.current) - SEND_SOUND(mind.current, 'sound/ambience/antag/bloodcult/bloodcult_halos.ogg') + SEND_SOUND(mind.current, 'sound/music/antag/bloodcult/bloodcult_halos.ogg') to_chat(mind.current, span_cult_large(span_warning("Your cult is ascendant and the red harvest approaches - you cannot hide your true nature for much longer!!"))) mind.current.AddElement(/datum/element/cult_halo) cult_ascendent = TRUE @@ -125,7 +125,7 @@ count++ if(members.len) - parts += "The cultists were:" + parts += span_header("The cultists were:") if(length(true_cultists)) parts += printplayerlist(true_cultists) else @@ -164,7 +164,7 @@ continue 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)) + SEND_SOUND(cultist.current, sound(pick('sound/effects/hallucinations/over_here2.ogg','sound/effects/hallucinations/over_here3.ogg'), 0, 1, 75)) cultist.current.client.images += blood_target_image if(duration != INFINITY) diff --git a/code/modules/antagonists/cult/datums/cultist.dm b/code/modules/antagonists/cult/datums/cultist.dm index f56d79a8f4b..fd5ba1ba20d 100644 --- a/code/modules/antagonists/cult/datums/cultist.dm +++ b/code/modules/antagonists/cult/datums/cultist.dm @@ -7,7 +7,7 @@ preview_outfit = /datum/outfit/cultist job_rank = ROLE_CULTIST antag_hud_name = "cult" - stinger_sound = 'sound/ambience/antag/bloodcult/bloodcult_gain.ogg' + stinger_sound = 'sound/music/antag/bloodcult/bloodcult_gain.ogg' ///The vote ability Cultists have to elect someone to be the leader. var/datum/action/innate/cult/mastervote/vote_ability @@ -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')) + SEND_SOUND(cult_mind, sound('sound/effects/hallucinations/veryfar_noise.ogg')) 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() diff --git a/code/modules/antagonists/cult/rune_spawn_action.dm b/code/modules/antagonists/cult/rune_spawn_action.dm index 3d791dbce44..be0e1e88ff8 100644 --- a/code/modules/antagonists/cult/rune_spawn_action.dm +++ b/code/modules/antagonists/cult/rune_spawn_action.dm @@ -67,7 +67,7 @@ var/scribe_mod = scribe_time if(istype(T, /turf/open/floor/engine/cult)) scribe_mod *= 0.5 - playsound(T, 'sound/magic/enter_blood.ogg', 100, FALSE) + playsound(T, 'sound/effects/magic/enter_blood.ogg', 100, FALSE) if(do_after(owner, scribe_mod, target = owner, extra_checks = CALLBACK(owner, TYPE_PROC_REF(/mob, break_do_after_checks), health, action_interrupt))) new rune_type(owner.loc, chosen_keyword) else diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm index d0e20c765bf..ddcc0c23887 100644 --- a/code/modules/antagonists/cult/runes.dm +++ b/code/modules/antagonists/cult/runes.dm @@ -385,14 +385,14 @@ structure_check() searches for nearby cultist structures required for the invoca qdel(sacrificial) return TRUE if(sacrificial && (signal_result & DUST_SACRIFICE)) // No soulstone when dusted - playsound(sacrificial, 'sound/magic/teleport_diss.ogg', 100, TRUE) + playsound(sacrificial, 'sound/effects/magic/teleport_diss.ogg', 100, TRUE) sacrificial.investigate_log("has been sacrificially dusted by the cult.", INVESTIGATE_DEATHS) sacrificial.dust(TRUE, FALSE, TRUE) else if (sacrificial) var/obj/item/soulstone/stone = new(loc) if(sacrificial.mind && !HAS_TRAIT(sacrificial, TRAIT_SUICIDED)) stone.capture_soul(sacrificial, invokers[1], forced = TRUE) - playsound(sacrificial, 'sound/magic/disintegrate.ogg', 100, TRUE) + playsound(sacrificial, 'sound/effects/magic/disintegrate.ogg', 100, TRUE) sacrificial.investigate_log("has been sacrificially gibbed by the cult.", INVESTIGATE_DEATHS) sacrificial.gib(DROP_ALL_REMAINS) @@ -499,7 +499,7 @@ structure_check() searches for nearby cultist structures required for the invoca var/turf/T = get_turf(src) if(is_away_level(T.z)) - to_chat(user, "You are not in the right dimension!") + to_chat(user, span_cult_italic("You are not in the right dimension!")) log_game("Teleport rune activated by [user] at [COORD(src)] failed - [user] is in away mission.") fail_invoke() return @@ -770,7 +770,7 @@ GLOBAL_VAR_INIT(narsie_summon_count, 0) else fail_invoke() return - SEND_SOUND(mob_to_revive, 'sound/ambience/antag/bloodcult/bloodcult_gain.ogg') + SEND_SOUND(mob_to_revive, 'sound/music/antag/bloodcult/bloodcult_gain.ogg') 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_cult_large("You awaken suddenly from the void. You're alive!")) @@ -848,37 +848,37 @@ GLOBAL_VAR_INIT(narsie_summon_count, 0) if(!Adjacent(user) || !src || QDELETED(src) || user.incapacitated) return if(isnull(cultist_to_summon)) - to_chat(user, "You require a summoning target!") + to_chat(user, span_cult_italic("You require a summoning target!")) fail_logmsg += "no target." log_game(fail_logmsg) fail_invoke() return if(cultist_to_summon.stat == DEAD) - to_chat(user, "[cultist_to_summon] has died!") + to_chat(user, span_cult_italic("[cultist_to_summon] has died!")) fail_logmsg += "target died." log_game(fail_logmsg) fail_invoke() return if(cultist_to_summon.pulledby || cultist_to_summon.buckled) - to_chat(user, "[cultist_to_summon] is being held in place!") + to_chat(user, span_cult_italic("[cultist_to_summon] is being held in place!")) fail_logmsg += "target restrained." log_game(fail_logmsg) fail_invoke() return if(!IS_CULTIST(cultist_to_summon)) - to_chat(user, "[cultist_to_summon] is not a follower of the Geometer!") + to_chat(user, span_cult_italic("[cultist_to_summon] is not a follower of the Geometer!")) fail_logmsg += "target deconverted." log_game(fail_logmsg) fail_invoke() return if(is_away_level(cultist_to_summon.z)) - to_chat(user, "[cultist_to_summon] is not in our dimension!") + to_chat(user, span_cult_italic("[cultist_to_summon] is not in our dimension!")) fail_logmsg += "target is in away mission." log_game(fail_logmsg) fail_invoke() return cultist_to_summon.visible_message(span_warning("[cultist_to_summon] suddenly disappears in a flash of red light!"), \ - "Overwhelming vertigo consumes you as you are hurled through the air!") + span_cult_italic("Overwhelming vertigo consumes you as you are hurled through the air!")) ..() visible_message(span_warning("A foggy shape materializes atop [src] and solidifies into [cultist_to_summon]!")) var/turf/old_turf = get_turf(cultist_to_summon) @@ -968,12 +968,12 @@ GLOBAL_VAR_INIT(narsie_summon_count, 0) /obj/effect/rune/manifest/can_invoke(mob/living/user) if(!(user in get_turf(src))) - to_chat(user, "You must be standing on [src]!") + to_chat(user, span_cult_italic("You must be standing on [src]!")) fail_invoke() log_game("Manifest rune failed - user not standing on rune") return list() if(user.has_status_effect(/datum/status_effect/cultghost)) - to_chat(user, "Ghosts can't summon more ghosts!") + to_chat(user, span_cult_italic("Ghosts can't summon more ghosts!")) fail_invoke() log_game("Manifest rune failed - user is a ghost") return list() @@ -1020,7 +1020,7 @@ GLOBAL_VAR_INIT(narsie_summon_count, 0) new_human.set_invis_see(SEE_INVISIBLE_OBSERVER) new_human.add_traits(list(TRAIT_NOBREATH, TRAIT_PERMANENTLY_MORTAL), INNATE_TRAIT) // permanently mortal can be removed once this is a bespoke kind of mob ghosts++ - playsound(src, 'sound/magic/exit_blood.ogg', 50, TRUE) + playsound(src, 'sound/effects/magic/exit_blood.ogg', 50, TRUE) visible_message(span_warning("A cloud of red mist forms above [src], and from within steps... a [new_human.gender == FEMALE ? "wo":""]man.")) 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) @@ -1135,7 +1135,7 @@ GLOBAL_VAR_INIT(narsie_summon_count, 0) intensity = max(60, 360 - (360*(intensity/length(GLOB.player_list) + 0.3)**2)) //significantly lower intensity for "winning" cults var/duration = intensity*10 - playsound(T, 'sound/magic/enter_blood.ogg', 100, TRUE) + playsound(T, 'sound/effects/magic/enter_blood.ogg', 100, TRUE) visible_message(span_warning("A colossal shockwave of energy bursts from the rune, disintegrating it in the process!")) for(var/mob/living/target in range(src, 3)) @@ -1156,7 +1156,7 @@ GLOBAL_VAR_INIT(narsie_summon_count, 0) add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/noncult, "human_apoc", A, NONE) addtimer(CALLBACK(M, TYPE_PROC_REF(/atom/, remove_alt_appearance),"human_apoc",TRUE), duration) images += A - SEND_SOUND(M, pick(sound('sound/ambience/antag/bloodcult/bloodcult_gain.ogg'),sound('sound/voice/ghost_whisper.ogg'),sound('sound/misc/ghosty_wind.ogg'))) + SEND_SOUND(M, pick(sound('sound/music/antag/bloodcult/bloodcult_gain.ogg'),sound('sound/music/antag/bloodcult/ghost_whisper.ogg'),sound('sound/music/antag/bloodcult/ghosty_wind.ogg'))) else var/construct = pick("wraith","artificer","juggernaut") var/image/B = image('icons/mob/nonhuman-player/cult.dmi',M,construct, ABOVE_MOB_LAYER) diff --git a/code/modules/antagonists/cult/sword_fling.dm b/code/modules/antagonists/cult/sword_fling.dm index 83238b0d8a2..d4c1530f06b 100644 --- a/code/modules/antagonists/cult/sword_fling.dm +++ b/code/modules/antagonists/cult/sword_fling.dm @@ -56,7 +56,7 @@ new particle_to_spawn(get_turf(loccer)) loccer.shake_up_animation() - playsound(loccer, 'sound/weapons/thudswoosh.ogg', 50, TRUE, -1) + playsound(loccer, 'sound/items/weapons/thudswoosh.ogg', 50, TRUE, -1) if(prob(resist_chance)) flinged_sword.forceMove(get_turf(loccer)) diff --git a/code/modules/antagonists/ert/ert.dm b/code/modules/antagonists/ert/ert.dm index 977d80cd5d5..ce4419cd539 100644 --- a/code/modules/antagonists/ert/ert.dm +++ b/code/modules/antagonists/ert/ert.dm @@ -235,9 +235,11 @@ var/mob/living/carbon/human/H = owner.current if(!istype(H)) return + if(isplasmaman(H)) - H.equipOutfit(plasmaman_outfit) - H.open_internals(H.get_item_for_held_index(2)) + H.dna.species.outfit_important_for_life = plasmaman_outfit + + H.dna.species.give_important_for_life(H) H.equipOutfit(outfit) if(isplasmaman(H)) diff --git a/code/modules/antagonists/fugitive/hunters/hunter_gear.dm b/code/modules/antagonists/fugitive/hunters/hunter_gear.dm index 2905dff3a0f..8e2b62c8187 100644 --- a/code/modules/antagonists/fugitive/hunters/hunter_gear.dm +++ b/code/modules/antagonists/fugitive/hunters/hunter_gear.dm @@ -157,11 +157,11 @@ switch(damage_type) if(BRUTE) if(damage_amount) - playsound(src, 'sound/effects/attackblob.ogg', 50, TRUE) + playsound(src, 'sound/effects/blob/attackblob.ogg', 50, TRUE) else - playsound(src, 'sound/weapons/tap.ogg', 50, TRUE) + playsound(src, 'sound/items/weapons/tap.ogg', 50, TRUE) if(BURN) - playsound(src, 'sound/items/welder.ogg', 100, TRUE) + playsound(src, 'sound/items/tools/welder.ogg', 100, TRUE) /obj/item/paper/crumpled/fluff/fortune_teller name = "scribbled note" diff --git a/code/modules/antagonists/heretic/heretic_antag.dm b/code/modules/antagonists/heretic/heretic_antag.dm index c6e6916a9bf..aa1a34f6e2d 100644 --- a/code/modules/antagonists/heretic/heretic_antag.dm +++ b/code/modules/antagonists/heretic/heretic_antag.dm @@ -26,7 +26,8 @@ can_assign_self_objectives = TRUE default_custom_objective = "Turn a department into a testament for your dark knowledge." hardcore_random_bonus = TRUE - stinger_sound = 'sound/ambience/antag/heretic/heretic_gain.ogg' + stinger_sound = 'sound/music/antag/heretic/heretic_gain.ogg' + /// Whether we give this antagonist objectives on gain. var/give_objectives = TRUE /// Whether we've ascended! (Completed one of the final rituals) @@ -513,7 +514,7 @@ for(var/datum/mind/mind as anything in cult_team.members) if(mind.current) - SEND_SOUND(mind.current, 'sound/magic/clockwork/narsie_attack.ogg') + SEND_SOUND(mind.current, 'sound/effects/magic/clockwork/narsie_attack.ogg') to_chat(mind.current, span_cult_large(span_warning("Arcane and forbidden knowledge floods your forges and archives. The cult has learned how to create the ")) + span_cult_large(span_hypnophrase("[result]!"))) return SILENCE_SACRIFICE_MESSAGE|DUST_SACRIFICE diff --git a/code/modules/antagonists/heretic/heretic_monsters.dm b/code/modules/antagonists/heretic/heretic_monsters.dm index 5bc7041cd46..2cb3dd3bfa4 100644 --- a/code/modules/antagonists/heretic/heretic_monsters.dm +++ b/code/modules/antagonists/heretic/heretic_monsters.dm @@ -8,7 +8,7 @@ antag_hud_name = "heretic_beast" suicide_cry = "MY MASTER SMILES UPON ME!!" show_in_antagpanel = FALSE - stinger_sound = 'sound/ambience/antag/heretic/heretic_gain.ogg' + stinger_sound = 'sound/music/antag/heretic/heretic_gain.ogg' /// Our master (a heretic)'s mind. var/datum/mind/master diff --git a/code/modules/antagonists/heretic/influences.dm b/code/modules/antagonists/heretic/influences.dm index 11aae0fd39d..164d5ef84ce 100644 --- a/code/modules/antagonists/heretic/influences.dm +++ b/code/modules/antagonists/heretic/influences.dm @@ -43,7 +43,7 @@ while((length(smashes) + num_drained) < how_many_can_we_make && location_sanity < 100) var/turf/chosen_location = get_safe_random_station_turf() - // We don't want them close to each other - at least 1 tile of seperation + // We don't want them close to each other - at least 1 tile of separation var/list/nearby_things = range(1, chosen_location) var/obj/effect/heretic_influence/what_if_i_have_one = locate() in nearby_things var/obj/effect/visible_heretic_influence/what_if_i_had_one_but_its_used = locate() in nearby_things diff --git a/code/modules/antagonists/heretic/items/corrupted_organs.dm b/code/modules/antagonists/heretic/items/corrupted_organs.dm index 3bd3ead7f60..335279c9553 100644 --- a/code/modules/antagonists/heretic/items/corrupted_organs.dm +++ b/code/modules/antagonists/heretic/items/corrupted_organs.dm @@ -2,7 +2,7 @@ /obj/item/organ/internal/eyes/corrupt name = "corrupt orbs" desc = "These eyes have seen something they shouldn't have." - organ_flags = ORGAN_ORGANIC | ORGAN_EDIBLE | ORGAN_VIRGIN | ORGAN_PROMINENT + organ_flags = parent_type::organ_flags | ORGAN_HAZARDOUS /// The override images we are applying var/list/hallucinations @@ -40,7 +40,7 @@ /obj/item/organ/internal/tongue/corrupt name = "corrupt tongue" desc = "This one tells only lies." - organ_flags = ORGAN_ORGANIC | ORGAN_EDIBLE | ORGAN_VIRGIN | ORGAN_PROMINENT + organ_flags = parent_type::organ_flags | ORGAN_HAZARDOUS /obj/item/organ/internal/tongue/corrupt/Initialize(mapload) . = ..() @@ -67,7 +67,7 @@ /obj/item/organ/internal/liver/corrupt name = "corrupt liver" desc = "After what you've seen you could really go for a drink." - organ_flags = ORGAN_ORGANIC | ORGAN_EDIBLE | ORGAN_VIRGIN | ORGAN_PROMINENT + organ_flags = parent_type::organ_flags | ORGAN_HAZARDOUS /// How much extra ingredients to add? var/amount_added = 5 /// What extra ingredients can we add? @@ -111,7 +111,7 @@ /obj/item/organ/internal/stomach/corrupt name = "corrupt stomach" desc = "This parasite demands an unwholesome diet in order to be satisfied." - organ_flags = ORGAN_ORGANIC | ORGAN_EDIBLE | ORGAN_VIRGIN | ORGAN_PROMINENT + organ_flags = parent_type::organ_flags | ORGAN_HAZARDOUS /// Do we have an unholy thirst? var/thirst_satiated = FALSE /// Timer for when we get thirsty again @@ -177,7 +177,7 @@ /obj/item/organ/internal/heart/corrupt name = "corrupt heart" desc = "What corruption is this spreading along with the blood?" - organ_flags = ORGAN_ORGANIC | ORGAN_EDIBLE | ORGAN_VIRGIN | ORGAN_PROMINENT + organ_flags = parent_type::organ_flags | ORGAN_HAZARDOUS /// How long until the next heart? COOLDOWN_DECLARE(hand_cooldown) @@ -197,7 +197,7 @@ /obj/item/organ/internal/lungs/corrupt name = "corrupt lungs" desc = "Some things SHOULD be drowned in tar." - organ_flags = ORGAN_ORGANIC | ORGAN_EDIBLE | ORGAN_VIRGIN | ORGAN_PROMINENT + organ_flags = parent_type::organ_flags | ORGAN_HAZARDOUS /// How likely are we not to cough every time we take a breath? var/cough_chance = 15 /// How much gas to emit? @@ -232,7 +232,7 @@ /obj/item/organ/internal/appendix/corrupt name = "corrupt appendix" desc = "What kind of dark, cosmic force is even going to bother to corrupt an appendix?" - organ_flags = ORGAN_ORGANIC | ORGAN_EDIBLE | ORGAN_VIRGIN | ORGAN_PROMINENT + organ_flags = parent_type::organ_flags | ORGAN_HAZARDOUS /// How likely are we to spawn worms? var/worm_chance = 2 diff --git a/code/modules/antagonists/heretic/items/heretic_armor.dm b/code/modules/antagonists/heretic/items/heretic_armor.dm index 0c64e4a227e..8375c3ae443 100644 --- a/code/modules/antagonists/heretic/items/heretic_armor.dm +++ b/code/modules/antagonists/heretic/items/heretic_armor.dm @@ -153,6 +153,7 @@ RemoveElement(/datum/element/heretic_focus) if(isliving(loc)) + REMOVE_TRAIT(loc, TRAIT_RESISTLOWPRESSURE, REF(src)) loc.balloon_alert(loc, "cloak hidden") loc.visible_message(span_notice("Light shifts around [loc], making the cloak around them invisible!")) @@ -163,5 +164,6 @@ AddElement(/datum/element/heretic_focus) if(isliving(loc)) + ADD_TRAIT(loc, TRAIT_RESISTLOWPRESSURE, REF(src)) loc.balloon_alert(loc, "cloak revealed") loc.visible_message(span_notice("A kaleidoscope of colours collapses around [loc], a cloak appearing suddenly around their person!")) diff --git a/code/modules/antagonists/heretic/items/heretic_blades.dm b/code/modules/antagonists/heretic/items/heretic_blades.dm index 4d2636fa19e..ab98e1b9e4c 100644 --- a/code/modules/antagonists/heretic/items/heretic_blades.dm +++ b/code/modules/antagonists/heretic/items/heretic_blades.dm @@ -19,7 +19,7 @@ bare_wound_bonus = 15 toolspeed = 0.375 demolition_mod = 0.8 - hitsound = 'sound/weapons/bladeslice.ogg' + hitsound = 'sound/items/weapons/bladeslice.ogg' armour_penetration = 35 attack_verb_continuous = list("attacks", "slashes", "stabs", "slices", "tears", "lacerates", "rips", "dices", "rends") attack_verb_simple = list("attack", "slash", "stab", "slice", "tear", "lacerate", "rip", "dice", "rend") diff --git a/code/modules/antagonists/heretic/items/heretic_necks.dm b/code/modules/antagonists/heretic/items/heretic_necks.dm index 5c73c22a4e7..a738b4aae47 100644 --- a/code/modules/antagonists/heretic/items/heretic_necks.dm +++ b/code/modules/antagonists/heretic/items/heretic_necks.dm @@ -1,5 +1,5 @@ /obj/item/clothing/neck/heretic_focus - name = "Amber Focus" + name = "amber focus" desc = "An amber focusing glass that provides a link to the world beyond. The necklace seems to twitch, but only when you look at it from the corner of your eye." icon_state = "eldritch_necklace" w_class = WEIGHT_CLASS_SMALL @@ -10,7 +10,7 @@ AddElement(/datum/element/heretic_focus) /obj/item/clothing/neck/heretic_focus/crimson_medallion - name = "Crimson Medallion" + name = "crimson medallion" desc = "A blood-red focusing glass that provides a link to the world beyond, and worse. Its eye is constantly twitching and gazing in all directions. It almost seems to be silently screaming..." icon_state = "crimson_medallion" /// The aura healing component. Used to delete it when taken off. @@ -105,7 +105,7 @@ . += span_red("You can also squeeze it to recover a large amount of health quickly, at a cost...") /obj/item/clothing/neck/eldritch_amulet - name = "Warm Eldritch Medallion" + name = "warm eldritch medallion" desc = "A strange medallion. Peering through the crystalline surface, the world around you melts away. You see your own beating heart, and the pulsing of a thousand others." icon = 'icons/obj/antags/eldritch.dmi' icon_state = "eye_medalion" @@ -134,7 +134,7 @@ user.update_sight() /obj/item/clothing/neck/eldritch_amulet/piercing - name = "Piercing Eldritch Medallion" + name = "piercing eldritch medallion" desc = "A strange medallion. Peering through the crystalline surface, the light refracts into new and terrifying spectrums of color. You see yourself, reflected off cascading mirrors, warped into impossible shapes." heretic_only_trait = TRAIT_XRAY_VISION @@ -149,7 +149,7 @@ // The amulet conversion tool used by moon heretics /obj/item/clothing/neck/heretic_focus/moon_amulet - name = "Moonlight Amulet" + name = "moonlight amulet" desc = "A piece of the mind, the soul and the moon. Gazing into it makes your head spin and hear whispers of laughter and joy." icon = 'icons/obj/antags/eldritch.dmi' icon_state = "moon_amulette" diff --git a/code/modules/antagonists/heretic/items/hunter_rifle.dm b/code/modules/antagonists/heretic/items/hunter_rifle.dm index 53f1c155586..cb8636aed2b 100644 --- a/code/modules/antagonists/heretic/items/hunter_rifle.dm +++ b/code/modules/antagonists/heretic/items/hunter_rifle.dm @@ -12,7 +12,7 @@ inhand_icon_state = "lionhunter" worn_icon_state = "lionhunter" accepted_magazine_type = /obj/item/ammo_box/magazine/internal/boltaction/lionhunter - fire_sound = 'sound/weapons/gun/sniper/shot.ogg' + fire_sound = 'sound/items/weapons/gun/sniper/shot.ogg' SET_BASE_PIXEL(-8, 0) @@ -64,7 +64,7 @@ return TRUE user.balloon_alert(user, "taking aim...") - user.playsound_local(get_turf(user), 'sound/weapons/gun/general/chunkyrack.ogg', 100, TRUE) + user.playsound_local(get_turf(user), 'sound/items/weapons/gun/general/chunkyrack.ogg', 100, TRUE) var/image/reticle = image( icon = 'icons/mob/actions/actions_items.dmi', diff --git a/code/modules/antagonists/heretic/items/labyrinth_handbook.dm b/code/modules/antagonists/heretic/items/labyrinth_handbook.dm index 8555b60f0c3..178b8b16da5 100644 --- a/code/modules/antagonists/heretic/items/labyrinth_handbook.dm +++ b/code/modules/antagonists/heretic/items/labyrinth_handbook.dm @@ -41,10 +41,12 @@ . += span_hypnophrase("Materializes a barrier upon any tile in sight, which only you can pass through. Lasts 8 seconds.") . += span_hypnophrase("It has [uses] uses left.") -/obj/item/heretic_labyrinth_handbook/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) - return interact_with_atom(interacting_with, user, modifiers) - /obj/item/heretic_labyrinth_handbook/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(HAS_TRAIT(interacting_with, TRAIT_COMBAT_MODE_SKIP_INTERACTION)) + return NONE + return ranged_interact_with_atom(interacting_with, user, modifiers) + +/obj/item/heretic_labyrinth_handbook/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) if(!IS_HERETIC(user)) if(ishuman(user)) var/mob/living/carbon/human/human_user = user @@ -60,7 +62,7 @@ return ITEM_INTERACT_BLOCKING turf_target.visible_message(span_warning("A storm of paper materializes!")) new /obj/effect/temp_visual/paper_scatter(turf_target) - playsound(turf_target, 'sound/magic/smoke.ogg', 30) + playsound(turf_target, 'sound/effects/magic/smoke.ogg', 30) new barrier_type(turf_target, user) uses-- if(uses <= 0) diff --git a/code/modules/antagonists/heretic/items/unfathomable_curio.dm b/code/modules/antagonists/heretic/items/unfathomable_curio.dm index 716b0927f54..eff1fa7ea2f 100644 --- a/code/modules/antagonists/heretic/items/unfathomable_curio.dm +++ b/code/modules/antagonists/heretic/items/unfathomable_curio.dm @@ -21,6 +21,7 @@ atom_storage.max_total_storage = 21 atom_storage.set_holdable(list( /obj/item/ammo_box/strilka310/lionhunter, + /obj/item/heretic_labyrinth_handbook, /obj/item/bodypart, // Bodyparts are often used in rituals. /obj/item/clothing/neck/eldritch_amulet, /obj/item/clothing/neck/heretic_focus, diff --git a/code/modules/antagonists/heretic/knowledge/ash_lore.dm b/code/modules/antagonists/heretic/knowledge/ash_lore.dm index 315bb14b664..62de33105ff 100644 --- a/code/modules/antagonists/heretic/knowledge/ash_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/ash_lore.dm @@ -230,7 +230,7 @@ priority_announce( text = "[generate_heretic_text()] Fear the blaze, for the Ashlord, [user.real_name] has ascended! The flames shall consume all! [generate_heretic_text()]", title = "[generate_heretic_text()]", - sound = 'sound/ambience/antag/heretic/ascend_ash.ogg', + sound = 'sound/music/antag/heretic/ascend_ash.ogg', color_override = "pink", ) diff --git a/code/modules/antagonists/heretic/knowledge/blade_lore.dm b/code/modules/antagonists/heretic/knowledge/blade_lore.dm index 55db187ee73..dc76f242c01 100644 --- a/code/modules/antagonists/heretic/knowledge/blade_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/blade_lore.dm @@ -98,7 +98,7 @@ target.AdjustParalyzed(1.5 SECONDS) target.apply_damage(10, BRUTE, wound_bonus = CANT_WOUND) target.balloon_alert(source, "backstab!") - playsound(get_turf(target), 'sound/weapons/guillotine.ogg', 100, TRUE) + playsound(get_turf(target), 'sound/items/weapons/guillotine.ogg', 100, TRUE) /// The cooldown duration between trigers of blade dance #define BLADE_DANCE_COOLDOWN (20 SECONDS) @@ -184,7 +184,7 @@ addtimer(CALLBACK(src, PROC_REF(reset_riposte), source), BLADE_DANCE_COOLDOWN) /datum/heretic_knowledge/blade_dance/proc/counter_attack(mob/living/carbon/human/source, mob/living/target, obj/item/melee/sickly_blade/weapon, attack_text) - playsound(get_turf(source), 'sound/weapons/parry.ogg', 100, TRUE) + playsound(get_turf(source), 'sound/items/weapons/parry.ogg', 100, TRUE) source.balloon_alert(source, "riposte used") source.visible_message( span_warning("[source] leans into [attack_text] and delivers a sudden riposte back at [target]!"), @@ -423,7 +423,7 @@ priority_announce( text = "[generate_heretic_text()] Master of blades, the Torn Champion's disciple, [user.real_name] has ascended! Their steel is that which will cut reality in a maelstom of silver! [generate_heretic_text()]", title = "[generate_heretic_text()]", - sound = 'sound/ambience/antag/heretic/ascend_blade.ogg', + sound = 'sound/music/antag/heretic/ascend_blade.ogg', color_override = "pink", ) ADD_TRAIT(user, TRAIT_NEVER_WOUNDED, name) diff --git a/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm b/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm index dfc8aa39bef..f6e364766f6 100644 --- a/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm @@ -191,7 +191,7 @@ combo_counter += 1 if(second_target_resolved) new /obj/effect/temp_visual/cosmic_explosion(get_turf(second_target_resolved)) - playsound(get_turf(second_target_resolved), 'sound/magic/cosmic_energy.ogg', 25, FALSE) + playsound(get_turf(second_target_resolved), 'sound/effects/magic/cosmic_energy.ogg', 25, FALSE) need_mob_update = FALSE need_mob_update += second_target_resolved.adjustFireLoss(14, updating_health = FALSE) need_mob_update += second_target_resolved.adjustOrganLoss(pick(valid_organ_slots), 12) @@ -199,7 +199,7 @@ second_target_resolved.updatehealth() if(third_target_resolved) new /obj/effect/temp_visual/cosmic_domain(get_turf(third_target_resolved)) - playsound(get_turf(third_target_resolved), 'sound/magic/cosmic_energy.ogg', 50, FALSE) + playsound(get_turf(third_target_resolved), 'sound/effects/magic/cosmic_energy.ogg', 50, FALSE) need_mob_update = FALSE need_mob_update += third_target_resolved.adjustFireLoss(28, updating_health = FALSE) need_mob_update += third_target_resolved.adjustOrganLoss(pick(valid_organ_slots), 14) @@ -282,7 +282,7 @@ priority_announce( text = "[generate_heretic_text()] A Star Gazer has arrived into the station, [user.real_name] has ascended! This station is the domain of the Cosmos! [generate_heretic_text()]", title = "[generate_heretic_text()]", - sound = 'sound/ambience/antag/heretic/ascend_cosmic.ogg', + sound = 'sound/music/antag/heretic/ascend_cosmic.ogg', color_override = "pink", ) var/mob/living/basic/heretic_summon/star_gazer/star_gazer_mob = new /mob/living/basic/heretic_summon/star_gazer(loc) diff --git a/code/modules/antagonists/heretic/knowledge/flesh_lore.dm b/code/modules/antagonists/heretic/knowledge/flesh_lore.dm index ad9e1552708..2d75bf3119a 100644 --- a/code/modules/antagonists/heretic/knowledge/flesh_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/flesh_lore.dm @@ -329,7 +329,7 @@ priority_announce( text = "[generate_heretic_text()] Ever coiling vortex. Reality unfolded. ARMS OUTREACHED, THE LORD OF THE NIGHT, [user.real_name] has ascended! Fear the ever twisting hand! [generate_heretic_text()]", title = "[generate_heretic_text()]", - sound = 'sound/ambience/antag/heretic/ascend_flesh.ogg', + sound = 'sound/music/antag/heretic/ascend_flesh.ogg', color_override = "pink", ) diff --git a/code/modules/antagonists/heretic/knowledge/lock_lore.dm b/code/modules/antagonists/heretic/knowledge/lock_lore.dm index 90e6282fbd1..6761be77eda 100644 --- a/code/modules/antagonists/heretic/knowledge/lock_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/lock_lore.dm @@ -90,7 +90,7 @@ var/turf/target_turf = get_turf(target) SEND_SIGNAL(target_turf, COMSIG_ATOM_MAGICALLY_UNLOCKED, src, source) - playsound(target, 'sound/magic/hereticknock.ogg', 100, TRUE, -1) + playsound(target, 'sound/effects/magic/hereticknock.ogg', 100, TRUE, -1) return COMPONENT_USE_HAND @@ -240,7 +240,7 @@ priority_announce( text = "Delta-class dimensional anomaly detec[generate_heretic_text()] Reality rended, torn. Gates open, doors open, [user.real_name] has ascended! Fear the tide! [generate_heretic_text()]", title = "[generate_heretic_text()]", - sound = 'sound/ambience/antag/heretic/ascend_knock.ogg', + sound = 'sound/music/antag/heretic/ascend_knock.ogg', color_override = "pink", ) diff --git a/code/modules/antagonists/heretic/knowledge/moon_lore.dm b/code/modules/antagonists/heretic/knowledge/moon_lore.dm index 3c6b4e2109b..99ee675c8ec 100644 --- a/code/modules/antagonists/heretic/knowledge/moon_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/moon_lore.dm @@ -208,7 +208,7 @@ text = "[generate_heretic_text()] Laugh, for the ringleader [user.real_name] has ascended! \ The truth shall finally devour the lie! [generate_heretic_text()]", title = "[generate_heretic_text()]", - sound = 'sound/ambience/antag/heretic/ascend_moon.ogg', + sound = 'sound/music/antag/heretic/ascend_moon.ogg', color_override = "pink", ) diff --git a/code/modules/antagonists/heretic/knowledge/rust_lore.dm b/code/modules/antagonists/heretic/knowledge/rust_lore.dm index 8c5a4587928..c1c1e2a4a04 100644 --- a/code/modules/antagonists/heretic/knowledge/rust_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/rust_lore.dm @@ -255,7 +255,7 @@ priority_announce( text = "[generate_heretic_text()] Fear the decay, for the Rustbringer, [user.real_name] has ascended! None shall escape the corrosion! [generate_heretic_text()]", title = "[generate_heretic_text()]", - sound = 'sound/ambience/antag/heretic/ascend_rust.ogg', + sound = 'sound/music/antag/heretic/ascend_rust.ogg', color_override = "pink", ) trigger(loc) diff --git a/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_buff.dm b/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_buff.dm index 30757e88a4b..9c29d15ba67 100644 --- a/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_buff.dm +++ b/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_buff.dm @@ -115,7 +115,7 @@ if (isnull(spawn_turf)) return new /obj/effect/temp_visual/dir_setting/curse/grasp_portal(spawn_turf, victim.dir) - playsound(spawn_turf, 'sound/effects/curse2.ogg', 80, TRUE, -1) + playsound(spawn_turf, 'sound/effects/curse/curse2.ogg', 80, TRUE, -1) var/obj/projectile/curse_hand/hel/hand = new (spawn_turf) hand.preparePixelProjectile(victim, spawn_turf) if (QDELETED(hand)) // safety check if above fails - above has a stack trace if it does fail diff --git a/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_knowledge.dm b/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_knowledge.dm index 90c54e3927d..54e7348f188 100644 --- a/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_knowledge.dm +++ b/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_knowledge.dm @@ -223,7 +223,7 @@ if(prob(min(15 * rewards_given)) && (rewards_given <= 5)) for(var/datum/mind/mind as anything in cultist_datum.cult_team.members) if(mind.current) - SEND_SOUND(mind.current, 'sound/magic/clockwork/narsie_attack.ogg') + SEND_SOUND(mind.current, 'sound/effects/magic/clockwork/narsie_attack.ogg') var/message = span_narsie("A vile heretic has ") + \ span_cult_large(span_hypnophrase("sacrificed")) + \ span_narsie(" one of our own. Destroy and sacrifice the infidel before it claims more!") @@ -249,7 +249,7 @@ // Visible and audible encouragement! to_chat(user, span_big(span_hypnophrase("A servant of the Sanguine Apostate!"))) to_chat(user, span_hierophant("Your patrons are rapturous!")) - playsound(sacrifice, 'sound/magic/disintegrate.ogg', 75, TRUE) + playsound(sacrifice, 'sound/effects/magic/disintegrate.ogg', 75, TRUE) // Drop all items and splatter them around messily. var/list/dustee_items = sacrifice.unequip_everything() @@ -281,7 +281,7 @@ return // Remove the outline, we don't need it anymore. rune?.remove_filter("reward_outline") - playsound(loc, 'sound/magic/repulse.ogg', 75, TRUE) + playsound(loc, 'sound/effects/magic/repulse.ogg', 75, TRUE) var/datum/antagonist/heretic/heretic_datum = GET_HERETIC(user) ASSERT(heretic_datum) // This list will be almost identical to unlocked_heretic_items, with the same keys, the difference being the values will be 1 to 5. @@ -389,7 +389,7 @@ curse_organs(sac_target) // Send 'em to the destination. If the teleport fails, just disembowel them and stop the chain - if(!destination || !do_teleport(sac_target, destination, asoundin = 'sound/magic/repulse.ogg', asoundout = 'sound/magic/blind.ogg', no_effects = TRUE, channel = TELEPORT_CHANNEL_MAGIC, forced = TRUE)) + if(!destination || !do_teleport(sac_target, destination, asoundin = 'sound/effects/magic/repulse.ogg', asoundout = 'sound/effects/magic/blind.ogg', no_effects = TRUE, channel = TELEPORT_CHANNEL_MAGIC, forced = TRUE)) disembowel_target(sac_target) return @@ -403,7 +403,7 @@ to_chat(sac_target, span_big(span_hypnophrase("Unnatural forces begin to claw at your every being from beyond the veil."))) - playsound(sac_target, 'sound/ambience/antag/heretic/heretic_sacrifice.ogg', 50, FALSE) // play theme + playsound(sac_target, 'sound/music/antag/heretic/heretic_sacrifice.ogg', 50, FALSE) // play theme sac_target.apply_status_effect(/datum/status_effect/unholy_determination, SACRIFICE_REALM_DURATION) addtimer(CALLBACK(src, PROC_REF(after_target_wakes), sac_target), SACRIFICE_SLEEP_DURATION * 0.5) // Begin the minigame @@ -508,6 +508,7 @@ sac_target.remove_status_effect(/datum/status_effect/necropolis_curse) sac_target.remove_status_effect(/datum/status_effect/unholy_determination) sac_target.reagents?.del_reagent(/datum/reagent/inverse/helgrasp/heretic) + sac_target.uncuff() sac_target.clear_mood_event("shadow_realm") if(IS_HERETIC(sac_target)) var/datum/antagonist/heretic/victim_heretic = sac_target.mind?.has_antag_datum(/datum/antagonist/heretic) @@ -531,7 +532,7 @@ safe_turf = get_turf(backup_loc) stack_trace("[type] - return_target was unable to find a safe turf for [sac_target] to return to. Defaulting to observer start turf.") - if(!do_teleport(sac_target, safe_turf, asoundout = 'sound/magic/blind.ogg', no_effects = TRUE, channel = TELEPORT_CHANNEL_MAGIC, forced = TRUE)) + if(!do_teleport(sac_target, safe_turf, asoundout = 'sound/effects/magic/blind.ogg', no_effects = TRUE, channel = TELEPORT_CHANNEL_MAGIC, forced = TRUE)) safe_turf = get_turf(backup_loc) sac_target.forceMove(safe_turf) stack_trace("[type] - return_target was unable to teleport [sac_target] to the observer start turf. Forcemoving.") diff --git a/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_map.dm b/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_map.dm index 5055d2d9628..07b126fe74f 100644 --- a/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_map.dm +++ b/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_map.dm @@ -91,7 +91,7 @@ GLOBAL_LIST_EMPTY(heretic_sacrifice_landmarks) /area/centcom/heretic_sacrifice/Initialize(mapload) if(!ambientsounds) - ambientsounds = GLOB.ambience_assoc[ambience_index] + 'sound/ambience/ambiatm1.ogg' + ambientsounds = GLOB.ambience_assoc[ambience_index] + 'sound/ambience/misc/ambiatm1.ogg' return ..() /area/centcom/heretic_sacrifice/ash //also, the default diff --git a/code/modules/antagonists/heretic/knowledge/side_blade_rust.dm b/code/modules/antagonists/heretic/knowledge/side_blade_rust.dm index 3a0f17ed483..2bae6ed5402 100644 --- a/code/modules/antagonists/heretic/knowledge/side_blade_rust.dm +++ b/code/modules/antagonists/heretic/knowledge/side_blade_rust.dm @@ -47,7 +47,7 @@ desc = "Allows you to transmute any ballistic weapon, such as a pipegun, with hide \ from any animal, a plank of wood, and a camera to create the Lionhunter's rifle. \ The Lionhunter's Rifle is a long ranged ballistic weapon with three shots. \ - These shots function as normal, albeit weak high caliber mutitions when fired from \ + These shots function as normal, albeit weak high-caliber munitions when fired from \ close range or at inanimate objects. You can aim the rifle at distant foes, \ causing the shot to deal massively increased damage and hone in on them." gain_text = "I met an old man in an antique shop who wielded a very unusual weapon. \ diff --git a/code/modules/antagonists/heretic/knowledge/side_flesh_void.dm b/code/modules/antagonists/heretic/knowledge/side_flesh_void.dm index a958ab3f272..d54646fe103 100644 --- a/code/modules/antagonists/heretic/knowledge/side_flesh_void.dm +++ b/code/modules/antagonists/heretic/knowledge/side_flesh_void.dm @@ -37,6 +37,23 @@ route = PATH_SIDE depth = 8 +/datum/heretic_knowledge/spell/void_prison + name = "Void Prison" + desc = "Grants you Void Prison, a spell that places your victim into ball, making them unable to do anything or speak. \ + Applies void chill afterwards." + gain_text = "At first, I see myself, waltzing along a snow-laden street. \ + I try to yell, grab hold of this fool and tell them to run. \ + But the only welts made are on my own beating fist. \ + My smiling face turns to regard me, reflecting back in glassy eyes the empty path I have been lead down." + next_knowledge = list( + /datum/heretic_knowledge/spell/void_phase, + /datum/heretic_knowledge/summon/raw_prophet, + ) + spell_to_add = /datum/action/cooldown/spell/pointed/void_prison + cost = 1 + route = PATH_SIDE + depth = 8 + /datum/heretic_knowledge/spell/cleave name = "Blood Cleave" desc = "Grants you Cleave, an area-of-effect targeted spell \ diff --git a/code/modules/antagonists/heretic/knowledge/starting_lore.dm b/code/modules/antagonists/heretic/knowledge/starting_lore.dm index ad48bb8fee3..2b5186bb550 100644 --- a/code/modules/antagonists/heretic/knowledge/starting_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/starting_lore.dm @@ -109,27 +109,24 @@ GLOBAL_LIST_INIT(heretic_start_knowledge, initialize_starting_knowledge()) /datum/heretic_knowledge/living_heart/recipe_snowflake_check(mob/living/user, list/atoms, list/selected_atoms, turf/loc) var/datum/antagonist/heretic/our_heretic = GET_HERETIC(user) var/obj/item/organ/our_living_heart = user.get_organ_slot(our_heretic.living_heart_organ_slot) - // Obviously you need a heart in your chest to do a ritual on your... heart - if(!our_living_heart) - loc.balloon_alert(user, "ritual failed, you have no [our_heretic.living_heart_organ_slot]!") // "you have no heart!" - return FALSE - // For sanity's sake, check if they've got a heart - + // For sanity's sake, check if they've got a living heart - // even though it's not invokable if you already have one, // they may have gained one unexpectantly in between now and then - if(HAS_TRAIT(our_living_heart, TRAIT_LIVING_HEART)) - loc.balloon_alert(user, "ritual failed, already have a living heart!") - return FALSE + if(!QDELETED(our_living_heart)) + if(HAS_TRAIT(our_living_heart, TRAIT_LIVING_HEART)) + loc.balloon_alert(user, "ritual failed, already have a living heart!") + return FALSE - // By this point they are making a new heart - // If their current heart is organic / not synthetic, we can continue the ritual as normal - if(is_valid_heart(our_living_heart)) - return TRUE + // By this point they are making a new heart + // If their current heart is organic / not synthetic, we can continue the ritual as normal + if(is_valid_heart(our_living_heart)) + return TRUE - // If their current heart is not organic / is synthetic, they need an organic replacement - // ...But if our organ-to-be-replaced is unremovable, we're screwed - if(our_living_heart.organ_flags & ORGAN_UNREMOVABLE) - loc.balloon_alert(user, "ritual failed, [our_heretic.living_heart_organ_slot] unremovable!") // "heart unremovable!" - return FALSE + // If their current heart is not organic / is synthetic, they need an organic replacement + // ...But if our organ-to-be-replaced is unremovable, we're screwed + if(our_living_heart.organ_flags & ORGAN_UNREMOVABLE) + loc.balloon_alert(user, "ritual failed, [our_heretic.living_heart_organ_slot] unremovable!") // "heart unremovable!" + return FALSE // Otherwise, seek out a replacement in our atoms for(var/obj/item/organ/nearby_organ in atoms) @@ -151,17 +148,21 @@ GLOBAL_LIST_INIT(heretic_start_knowledge, initialize_starting_knowledge()) // Our heart is robotic or synthetic - we need to replace it, and we fortunately should have one by here if(!is_valid_heart(our_new_heart)) var/obj/item/organ/our_replacement_heart = locate(required_organ_type) in selected_atoms - if(our_replacement_heart) + if(!our_replacement_heart) + CRASH("[type] required a replacement organic heart in on_finished_recipe, but did not find one.") + // Repair the organic heart, if needed, to just below the high threshold + if(our_replacement_heart.damage >= our_replacement_heart.high_threshold) + our_replacement_heart.set_organ_damage(our_replacement_heart.high_threshold - 1) + // And now, put our organic heart in its place + our_replacement_heart.Insert(user, TRUE, TRUE) + if(our_new_heart) // Throw our current heart out of our chest, violently user.visible_message(span_boldwarning("[user]'s [our_new_heart.name] bursts suddenly out of [user.p_their()] chest!")) INVOKE_ASYNC(user, TYPE_PROC_REF(/mob, emote), "scream") user.apply_damage(20, BRUTE, BODY_ZONE_CHEST) - // And put our organic heart in its place - our_replacement_heart.Insert(user, TRUE, TRUE) + selected_atoms -= our_new_heart // so we don't delete our old heart while we dramatically toss is out our_new_heart.throw_at(get_edge_target_turf(user, pick(GLOB.alldirs)), 2, 2) - our_new_heart = our_replacement_heart - else - CRASH("[type] required a replacement organic heart in on_finished_recipe, but did not find one.") + our_new_heart = our_replacement_heart if(!our_new_heart) CRASH("[type] somehow made it to on_finished_recipe without a heart. What?") @@ -177,12 +178,12 @@ GLOBAL_LIST_INIT(heretic_start_knowledge, initialize_starting_knowledge()) // Make it the living heart our_new_heart.AddComponent(/datum/component/living_heart) to_chat(user, span_warning("You feel your [our_new_heart.name] begin pulse faster and faster as it awakens!")) - playsound(user, 'sound/magic/demon_consume.ogg', 50, TRUE) + playsound(user, 'sound/effects/magic/demon_consume.ogg', 50, TRUE) return TRUE /// Checks if the passed heart is a valid heart to become a living heart /datum/heretic_knowledge/living_heart/proc/is_valid_heart(obj/item/organ/new_heart) - if(!new_heart) + if(QDELETED(new_heart)) return FALSE if(!new_heart.useable) return FALSE @@ -233,7 +234,7 @@ GLOBAL_LIST_INIT(heretic_start_knowledge, initialize_starting_knowledge()) gain_text = "The occult leaves fragments of knowledge and power anywhere and everywhere. The Codex Cicatrix is one such example. \ Within the leather-bound faces and age old pages, a path into the Mansus is revealed." required_atoms = list( - /obj/item/book = 1, + list(/obj/item/toy/eldritch_book, /obj/item/book) = 1, /obj/item/pen = 1, list(/mob/living, /obj/item/stack/sheet/leather, /obj/item/stack/sheet/animalhide) = 1, ) @@ -296,7 +297,7 @@ GLOBAL_LIST_INIT(heretic_start_knowledge, initialize_starting_knowledge()) var/obj/item/book/le_book = locate() in selected_atoms if(!le_book) stack_trace("Somehow, no book in codex cicatrix selected atoms! [english_list(selected_atoms)]") - playsound(body, 'sound/items/poster_ripped.ogg', 100, TRUE) + playsound(body, 'sound/items/poster/poster_ripped.ogg', 100, TRUE) body.do_jitter_animation() body.visible_message(span_danger("An awful ripping sound is heard as [ripped_thing]'s [exterior_text] is ripped straight out, wrapping around [le_book || "the book"], turning into an eldritch shade of blue!")) return ..() @@ -328,7 +329,7 @@ GLOBAL_LIST_INIT(heretic_start_knowledge, initialize_starting_knowledge()) heretic_datum.feast_of_owls = TRUE user.set_temp_blindness(reward * 1 SECONDS) user.AdjustParalyzed(reward * 1 SECONDS) - user.playsound_local(get_turf(user), 'sound/ambience/antag/heretic/heretic_gain_intense.ogg', 100, FALSE, pressure_affected = FALSE, use_reverb = FALSE) + user.playsound_local(get_turf(user), 'sound/music/antag/heretic/heretic_gain_intense.ogg', 100, FALSE, pressure_affected = FALSE, use_reverb = FALSE) for(var/i in 1 to reward) user.emote("scream") playsound(loc, 'sound/items/eatfood.ogg', 100, TRUE) diff --git a/code/modules/antagonists/heretic/knowledge/void_lore.dm b/code/modules/antagonists/heretic/knowledge/void_lore.dm index 51f0146fca3..1268609a88d 100644 --- a/code/modules/antagonists/heretic/knowledge/void_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/void_lore.dm @@ -12,9 +12,10 @@ * * Mark of Void * Ritual of Knowledge - * Cone of Cold + * Void Conduit * Void Phase * > Sidepaths: + * Void Stasis * Carving Knife * Blood Siphon * @@ -78,7 +79,7 @@ var/mob/living/carbon/carbon_target = target carbon_target.adjust_silence(10 SECONDS) - carbon_target.apply_status_effect(/datum/status_effect/void_chill) + carbon_target.apply_status_effect(/datum/status_effect/void_chill, 2) /datum/heretic_knowledge/cold_snap name = "Aristocrat's Way" @@ -96,12 +97,29 @@ research_tree_icon_path = 'icons/effects/effects.dmi' research_tree_icon_state = "the_freezer" depth = 4 + /// Traits we apply to become immune to the environment + var/static/list/gain_traits = list(TRAIT_NO_SLIP_ICE, TRAIT_NO_SLIP_SLIDE) /datum/heretic_knowledge/cold_snap/on_gain(mob/user, datum/antagonist/heretic/our_heretic) user.add_traits(list(TRAIT_NOBREATH, TRAIT_RESISTCOLD), type) + RegisterSignal(user, COMSIG_LIVING_LIFE, PROC_REF(check_environment)) /datum/heretic_knowledge/cold_snap/on_lose(mob/user, datum/antagonist/heretic/our_heretic) user.remove_traits(list(TRAIT_RESISTCOLD, TRAIT_NOBREATH), type) + UnregisterSignal(user, COMSIG_LIVING_LIFE) + +///Checks if our traits should be active +/datum/heretic_knowledge/cold_snap/proc/check_environment(mob/living/user) + SIGNAL_HANDLER + + var/datum/gas_mixture/environment = user.loc?.return_air() + if(!isnull(environment)) + var/affected_temperature = environment.return_temperature() + var/affected_pressure = environment.return_pressure() + if(affected_temperature <= T0C || affected_pressure < ONE_ATMOSPHERE) + user.add_traits(gain_traits, type) + else + user.remove_traits(gain_traits, type) /datum/heretic_knowledge/mark/void_mark name = "Mark of Void" @@ -114,17 +132,17 @@ mark_type = /datum/status_effect/eldritch/void /datum/heretic_knowledge/knowledge_ritual/void - next_knowledge = list(/datum/heretic_knowledge/spell/void_cone) + next_knowledge = list(/datum/heretic_knowledge/spell/void_conduit) route = PATH_VOID -/datum/heretic_knowledge/spell/void_cone - name = "Void Blast" - desc = "Grants you Void Blast, a spell that shoots out a freezing blast in a cone in front of you, \ - freezing the ground and any victims within." - gain_text = "Every door I open racks my body. I am afraid of what is behind them. Someone is expecting me, \ - and my legs start to drag. Is that... snow?" +/datum/heretic_knowledge/spell/void_conduit + name = "Void Conduit" + desc = "Grants you Void Conduit, a spell which summons a pulsing gate to the Void itself. Every pulse breaks windows and airlocks, while afflicting Heathens with an eldritch chill and shielding Heretics against low pressure." + gain_text = "The hum in the still, cold air turns to a cacophonous rattle. \ + Over the noise, there is no distinction to the clattering of window panes and the yawning knowledge that ricochets through my skull. \ + The doors won't close. I can't keep the cold out now." next_knowledge = list(/datum/heretic_knowledge/spell/void_phase) - spell_to_add = /datum/action/cooldown/spell/cone/staggered/cone_of_cold/void + spell_to_add = /datum/action/cooldown/spell/conjure/void_conduit cost = 1 route = PATH_VOID depth = 7 @@ -139,6 +157,7 @@ /datum/heretic_knowledge/blade_upgrade/void, /datum/heretic_knowledge/reroll_targets, /datum/heretic_knowledge/spell/blood_siphon, + /datum/heretic_knowledge/spell/void_prison, /datum/heretic_knowledge/rune_carver, ) spell_to_add = /datum/action/cooldown/spell/pointed/void_phase @@ -149,13 +168,19 @@ /datum/heretic_knowledge/blade_upgrade/void name = "Seeking Blade" - desc = "You can now attack distant marked targets with your Void Blade, teleporting directly next to them." + desc = "Your blade now freezes enemies. Additionally, you can now attack distant marked targets with your Void Blade, teleporting directly next to them." gain_text = "Fleeting memories, fleeting feet. I mark my way with frozen blood upon the snow. Covered and forgotten." next_knowledge = list(/datum/heretic_knowledge/spell/void_pull) route = PATH_VOID research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' research_tree_icon_state = "blade_upgrade_void" +/datum/heretic_knowledge/blade_upgrade/void/do_melee_effects(mob/living/source, mob/living/target, obj/item/melee/sickly_blade/blade) + if(source == target) + return + + target.apply_status_effect(/datum/status_effect/void_chill, 2) + /datum/heretic_knowledge/blade_upgrade/void/do_ranged_effects(mob/living/user, mob/living/target, obj/item/melee/sickly_blade/blade) if(!target.has_status_effect(/datum/status_effect/eldritch)) return @@ -200,6 +225,8 @@ var/datum/looping_sound/void_loop/sound_loop ///Reference to the ongoing voidstrom that surrounds the heretic var/datum/weather/void_storm/storm + ///The storm where there are actual effects + var/datum/proximity_monitor/advanced/void_storm/heavy_storm /datum/heretic_knowledge/ultimate/void_final/recipe_snowflake_check(mob/living/user, list/atoms, list/selected_atoms, turf/loc) if(!isopenturf(loc)) @@ -218,19 +245,25 @@ priority_announce( text = "[generate_heretic_text()] The nobleman of void [user.real_name] has arrived, stepping along the Waltz that ends worlds! [generate_heretic_text()]", title = "[generate_heretic_text()]", - sound = 'sound/ambience/antag/heretic/ascend_void.ogg', + sound = 'sound/music/antag/heretic/ascend_void.ogg', color_override = "pink", ) - ADD_TRAIT(user, TRAIT_RESISTLOWPRESSURE, MAGIC_TRAIT) + user.add_traits(list(TRAIT_RESISTLOWPRESSURE, TRAIT_NEGATES_GRAVITY, TRAIT_MOVE_FLYING, TRAIT_FREE_HYPERSPACE_MOVEMENT), MAGIC_TRAIT) // Let's get this show on the road! sound_loop = new(user, TRUE, TRUE) RegisterSignal(user, COMSIG_LIVING_LIFE, PROC_REF(on_life)) - RegisterSignal(user, COMSIG_LIVING_DEATH, PROC_REF(on_death)) + RegisterSignal(user, COMSIG_ATOM_PRE_BULLET_ACT, PROC_REF(hit_by_projectile)) + RegisterSignals(user, list(COMSIG_LIVING_DEATH, COMSIG_QDELETING), PROC_REF(on_death)) + heavy_storm = new(user, 10) + if(ishuman(user)) + var/mob/living/carbon/human/ascended_human = user + var/obj/item/organ/internal/eyes/heretic_eyes = ascended_human.get_organ_slot(ORGAN_SLOT_EYES) + heretic_eyes?.color_cutoffs = list(30, 30, 30) + ascended_human.update_sight() /datum/heretic_knowledge/ultimate/void_final/on_lose(mob/user, datum/antagonist/heretic/our_heretic) on_death() // Losing is pretty much dying. I think - RegisterSignals(user, list(COMSIG_LIVING_LIFE, COMSIG_LIVING_DEATH)) /** * Signal proc for [COMSIG_LIVING_LIFE]. @@ -243,10 +276,29 @@ /datum/heretic_knowledge/ultimate/void_final/proc/on_life(mob/living/source, seconds_per_tick, times_fired) SIGNAL_HANDLER - for(var/mob/living/carbon/close_carbon in view(5, source)) - if(IS_HERETIC_OR_MONSTER(close_carbon)) - continue - close_carbon.adjust_silence_up_to(2 SECONDS, 20 SECONDS) + for(var/atom/thing_in_range as anything in range(10, source)) + if(iscarbon(thing_in_range)) + var/mob/living/carbon/close_carbon = thing_in_range + if(IS_HERETIC_OR_MONSTER(close_carbon)) + close_carbon.apply_status_effect(/datum/status_effect/void_conduit) + continue + close_carbon.adjust_silence_up_to(2 SECONDS, 20 SECONDS) + close_carbon.apply_status_effect(/datum/status_effect/void_chill, 1) + close_carbon.adjust_eye_blur(rand(0 SECONDS, 2 SECONDS)) + close_carbon.adjust_bodytemperature(-30 * TEMPERATURE_DAMAGE_COEFFICIENT) + + if(istype(thing_in_range, /obj/machinery/door) || istype(thing_in_range, /obj/structure/door_assembly)) + var/obj/affected_door = thing_in_range + affected_door.take_damage(rand(60, 80)) + + if(istype(thing_in_range, /obj/structure/window) || istype(thing_in_range, /obj/structure/grille)) + var/obj/structure/affected_structure = thing_in_range + affected_structure.take_damage(rand(20, 40)) + + if(isturf(thing_in_range)) + var/turf/affected_turf = thing_in_range + var/datum/gas_mixture/environment = affected_turf.return_air() + environment.temperature *= 0.9 // Telegraph the storm in every area on the station. var/list/station_levels = SSmapping.levels_by_trait(ZTRAIT_STATION) @@ -254,14 +306,6 @@ storm = new /datum/weather/void_storm(station_levels) storm.telegraph() - // When the heretic enters a new area, intensify the storm in the new area, - // and lessen the intensity in the former area. - var/area/source_area = get_area(source) - if(!storm.impacted_areas[source_area]) - storm.former_impacted_areas |= storm.impacted_areas - storm.impacted_areas = list(source_area) - storm.update_areas() - /** * Signal proc for [COMSIG_LIVING_DEATH]. * @@ -275,3 +319,32 @@ if(storm) storm.end() QDEL_NULL(storm) + if(heavy_storm) + QDEL_NULL(heavy_storm) + UnregisterSignal(source, list(COMSIG_LIVING_LIFE, COMSIG_ATOM_PRE_BULLET_ACT, COMSIG_LIVING_DEATH, COMSIG_QDELETING)) + +///Few checks to determine if we can deflect bullets +/datum/heretic_knowledge/ultimate/void_final/proc/can_deflect(mob/living/ascended_heretic) + if(!(ascended_heretic.mobility_flags & MOBILITY_USE)) + return FALSE + if(!isturf(ascended_heretic.loc)) + return FALSE + return TRUE + +/datum/heretic_knowledge/ultimate/void_final/proc/hit_by_projectile(mob/living/ascended_heretic, obj/projectile/hitting_projectile, def_zone) + SIGNAL_HANDLER + + if(!can_deflect(ascended_heretic)) + return NONE + + ascended_heretic.visible_message( + span_danger("The void storm surrounding [ascended_heretic] deflects [hitting_projectile]!"), + span_userdanger("The void storm protects you from [hitting_projectile]!"), + ) + playsound(ascended_heretic, pick('sound/effects/magic/VoidDeflect01.ogg', 'sound/effects/magic/VoidDeflect02.ogg', 'sound/effects/magic/VoidDeflect03.ogg'), 75, TRUE) + hitting_projectile.firer = ascended_heretic + if(prob(75)) + hitting_projectile.set_angle(get_angle(hitting_projectile.firer, hitting_projectile.fired_from)) + else + hitting_projectile.set_angle(rand(0, 360))//SHING + return COMPONENT_BULLET_PIERCED diff --git a/code/modules/antagonists/heretic/magic/aggressive_spread.dm b/code/modules/antagonists/heretic/magic/aggressive_spread.dm index dfb4a948474..77c6a6227de 100644 --- a/code/modules/antagonists/heretic/magic/aggressive_spread.dm +++ b/code/modules/antagonists/heretic/magic/aggressive_spread.dm @@ -5,7 +5,7 @@ overlay_icon_state = "bg_heretic_border" button_icon = 'icons/mob/actions/actions_ecult.dmi' button_icon_state = "corrode" - sound = 'sound/items/welder.ogg' + sound = 'sound/items/tools/welder.ogg' school = SCHOOL_FORBIDDEN cooldown_time = 30 SECONDS diff --git a/code/modules/antagonists/heretic/magic/ascended_shapeshift.dm b/code/modules/antagonists/heretic/magic/ascended_shapeshift.dm index e792dc116da..a11c8d1d3a9 100644 --- a/code/modules/antagonists/heretic/magic/ascended_shapeshift.dm +++ b/code/modules/antagonists/heretic/magic/ascended_shapeshift.dm @@ -20,7 +20,7 @@ if(!.) return //buff our forms so this ascension ability isnt shit - playsound(caster, 'sound/magic/demon_consume.ogg', 50, TRUE) + playsound(caster, 'sound/effects/magic/demon_consume.ogg', 50, TRUE) var/mob/living/monster = . monster.AddComponent(/datum/component/seethrough_mob) monster.maxHealth *= 1.5 diff --git a/code/modules/antagonists/heretic/magic/ash_ascension.dm b/code/modules/antagonists/heretic/magic/ash_ascension.dm index 8b564198a61..f4ed8686c10 100644 --- a/code/modules/antagonists/heretic/magic/ash_ascension.dm +++ b/code/modules/antagonists/heretic/magic/ash_ascension.dm @@ -67,7 +67,7 @@ overlay_icon_state = "bg_heretic_border" button_icon = 'icons/mob/actions/actions_ecult.dmi' button_icon_state = "fire_ring" - sound = 'sound/items/welder.ogg' + sound = 'sound/items/tools/welder.ogg' school = SCHOOL_FORBIDDEN cooldown_time = 30 SECONDS @@ -151,7 +151,7 @@ if(L.can_block_magic()) L.visible_message(span_danger("The spell bounces off of [L]!"), span_danger("The spell bounces off of you!")) continue - if(L in hit_list || L == source) + if((L in hit_list) || L == source) continue hit_list += L L.adjustFireLoss(20) diff --git a/code/modules/antagonists/heretic/magic/blood_siphon.dm b/code/modules/antagonists/heretic/magic/blood_siphon.dm index 1e3d6258826..1801b6d9dbc 100644 --- a/code/modules/antagonists/heretic/magic/blood_siphon.dm +++ b/code/modules/antagonists/heretic/magic/blood_siphon.dm @@ -25,7 +25,7 @@ /datum/action/cooldown/spell/pointed/blood_siphon/cast(mob/living/cast_on) . = ..() - playsound(owner, 'sound/magic/demon_attack1.ogg', 75, TRUE) + playsound(owner, 'sound/effects/magic/demon_attack1.ogg', 75, TRUE) if(cast_on.can_block_magic()) owner.balloon_alert(owner, "spell blocked!") cast_on.visible_message( diff --git a/code/modules/antagonists/heretic/magic/caretaker.dm b/code/modules/antagonists/heretic/magic/caretaker.dm index 86ff2850019..b882386329a 100644 --- a/code/modules/antagonists/heretic/magic/caretaker.dm +++ b/code/modules/antagonists/heretic/magic/caretaker.dm @@ -8,7 +8,7 @@ overlay_icon_state = "bg_heretic_border" button_icon = 'icons/mob/actions/actions_ecult.dmi' button_icon_state = "caretaker" - sound = 'sound/effects/curse2.ogg' + sound = 'sound/effects/curse/curse2.ogg' school = SCHOOL_FORBIDDEN cooldown_time = 1 MINUTES diff --git a/code/modules/antagonists/heretic/magic/cosmic_expansion.dm b/code/modules/antagonists/heretic/magic/cosmic_expansion.dm index 3fb197d392c..9baf3366f4b 100644 --- a/code/modules/antagonists/heretic/magic/cosmic_expansion.dm +++ b/code/modules/antagonists/heretic/magic/cosmic_expansion.dm @@ -7,7 +7,7 @@ button_icon = 'icons/mob/actions/actions_ecult.dmi' button_icon_state = "cosmic_domain" - sound = 'sound/magic/cosmic_expansion.ogg' + sound = 'sound/effects/magic/cosmic_expansion.ogg' school = SCHOOL_FORBIDDEN cooldown_time = 45 SECONDS diff --git a/code/modules/antagonists/heretic/magic/cosmic_runes.dm b/code/modules/antagonists/heretic/magic/cosmic_runes.dm index 207b60ae939..1003920dfa9 100644 --- a/code/modules/antagonists/heretic/magic/cosmic_runes.dm +++ b/code/modules/antagonists/heretic/magic/cosmic_runes.dm @@ -7,7 +7,7 @@ button_icon = 'icons/mob/actions/actions_ecult.dmi' button_icon_state = "cosmic_rune" - sound = 'sound/magic/forcewall.ogg' + sound = 'sound/effects/magic/forcewall.ogg' school = SCHOOL_FORBIDDEN cooldown_time = 15 SECONDS @@ -99,8 +99,8 @@ get_turf(linked_rune_resolved), no_effects = TRUE, channel = TELEPORT_CHANNEL_MAGIC, - asoundin = 'sound/magic/cosmic_energy.ogg', - asoundout = 'sound/magic/cosmic_energy.ogg', + asoundin = 'sound/effects/magic/cosmic_energy.ogg', + asoundout = 'sound/effects/magic/cosmic_energy.ogg', ) for(var/mob/living/person_on_rune in get_turf(src)) if(person_on_rune.has_status_effect(/datum/status_effect/star_mark)) diff --git a/code/modules/antagonists/heretic/magic/expand_sight.dm b/code/modules/antagonists/heretic/magic/expand_sight.dm index e9715c9a779..126a5a180ec 100644 --- a/code/modules/antagonists/heretic/magic/expand_sight.dm +++ b/code/modules/antagonists/heretic/magic/expand_sight.dm @@ -17,7 +17,7 @@ /datum/action/innate/expand_sight/Activate() active = TRUE owner.client?.view_size.setTo(boost_to) - playsound(owner, pick('sound/hallucinations/i_see_you1.ogg', 'sound/hallucinations/i_see_you2.ogg'), 50, TRUE, ignore_walls = FALSE) + playsound(owner, pick('sound/effects/hallucinations/i_see_you1.ogg', 'sound/effects/hallucinations/i_see_you2.ogg'), 50, TRUE, ignore_walls = FALSE) COOLDOWN_START(src, last_toggle, 8 SECONDS) /datum/action/innate/expand_sight/Deactivate() diff --git a/code/modules/antagonists/heretic/magic/fire_blast.dm b/code/modules/antagonists/heretic/magic/fire_blast.dm index 4c17ca5ffc0..104b4697cd2 100644 --- a/code/modules/antagonists/heretic/magic/fire_blast.dm +++ b/code/modules/antagonists/heretic/magic/fire_blast.dm @@ -7,7 +7,7 @@ overlay_icon_state = "bg_heretic_border" button_icon = 'icons/mob/actions/actions_ecult.dmi' button_icon_state = "flames" - sound = 'sound/magic/fireball.ogg' + sound = 'sound/effects/magic/fireball.ogg' school = SCHOOL_FORBIDDEN cooldown_time = 45 SECONDS diff --git a/code/modules/antagonists/heretic/magic/flesh_surgery.dm b/code/modules/antagonists/heretic/magic/flesh_surgery.dm index ff474f06319..87d1927cc97 100644 --- a/code/modules/antagonists/heretic/magic/flesh_surgery.dm +++ b/code/modules/antagonists/heretic/magic/flesh_surgery.dm @@ -96,7 +96,7 @@ var/organ_hp_to_heal = to_heal.maxHealth * organ_percent_healing to_heal.set_organ_damage(max(0 , to_heal.damage - organ_hp_to_heal)) to_heal.balloon_alert(caster, "organ healed") - playsound(to_heal, 'sound/magic/staff_healing.ogg', 30) + playsound(to_heal, 'sound/effects/magic/staff_healing.ogg', 30) new /obj/effect/temp_visual/cult/sparks(get_turf(to_heal)) var/condition = (to_heal.damage > 0) ? "better" : "perfect" caster.visible_message( @@ -118,7 +118,7 @@ // while for human minions(ghouls), this will heal brute and burn like normal. So be careful adjusting to bigger numbers to_heal.balloon_alert(caster, "[what_are_we] healed") to_heal.heal_overall_damage(monster_brute_healing, monster_burn_healing) - playsound(to_heal, 'sound/magic/staff_healing.ogg', 30) + playsound(to_heal, 'sound/effects/magic/staff_healing.ogg', 30) new /obj/effect/temp_visual/cult/sparks(get_turf(to_heal)) caster.visible_message( span_warning("[caster]'s hand glows a brilliant red as [caster.p_they()] restore[caster.p_s()] [to_heal] to good condition!"), @@ -181,7 +181,7 @@ ) carbon_victim.balloon_alert(caster, "extracting [chosen_organ]...") - playsound(victim, 'sound/weapons/slice.ogg', 50, TRUE) + playsound(victim, 'sound/items/weapons/slice.ogg', 50, TRUE) carbon_victim.add_atom_colour(COLOR_DARK_RED, TEMPORARY_COLOUR_PRIORITY) if(!do_after(caster, time_it_takes, carbon_victim, extra_checks = CALLBACK(src, PROC_REF(extraction_checks), picked_organ, hand, victim, caster))) carbon_victim.balloon_alert(caster, "interrupted!") diff --git a/code/modules/antagonists/heretic/magic/furious_steel.dm b/code/modules/antagonists/heretic/magic/furious_steel.dm index 0ab882a9289..d61ce5d1a39 100644 --- a/code/modules/antagonists/heretic/magic/furious_steel.dm +++ b/code/modules/antagonists/heretic/magic/furious_steel.dm @@ -7,7 +7,7 @@ overlay_icon_state = "bg_heretic_border" button_icon = 'icons/mob/actions/actions_ecult.dmi' button_icon_state = "furious_steel" - sound = 'sound/weapons/guillotine.ogg' + sound = 'sound/items/weapons/guillotine.ogg' school = SCHOOL_FORBIDDEN cooldown_time = 60 SECONDS @@ -155,7 +155,7 @@ overlay_icon_state = "bg_cult_border" button_icon = 'icons/mob/actions/actions_ecult.dmi' button_icon_state = "cursed_steel" - sound = 'sound/weapons/guillotine.ogg' + sound = 'sound/items/weapons/guillotine.ogg' cooldown_time = 40 SECONDS invocation = "IA!" diff --git a/code/modules/antagonists/heretic/magic/mansus_grasp.dm b/code/modules/antagonists/heretic/magic/mansus_grasp.dm index 43dde25374f..67df0f2be04 100644 --- a/code/modules/antagonists/heretic/magic/mansus_grasp.dm +++ b/code/modules/antagonists/heretic/magic/mansus_grasp.dm @@ -5,7 +5,7 @@ overlay_icon_state = "bg_heretic_border" button_icon = 'icons/mob/actions/actions_ecult.dmi' button_icon_state = "mansus_grasp" - sound = 'sound/items/welder.ogg' + sound = 'sound/items/tools/welder.ogg' school = SCHOOL_EVOCATION cooldown_time = 10 SECONDS @@ -56,7 +56,7 @@ carbon_hit.color = COLOR_CULT_RED animate(carbon_hit, color = old_color, time = 4 SECONDS, easing = EASE_IN) carbon_hit.mob_light(range = 1.5, power = 2.5, color = COLOR_CULT_RED, duration = 0.5 SECONDS) - playsound(carbon_hit, 'sound/magic/curse.ogg', 50, TRUE) + playsound(carbon_hit, 'sound/effects/magic/curse.ogg', 50, TRUE) to_chat(caster, span_warning("An unholy force intervenes as you grasp [carbon_hit], absorbing most of the effects!")) to_chat(carbon_hit, span_warning("As [caster] grasps you with eldritch forces, your blood magic absorbs most of the effects!")) diff --git a/code/modules/antagonists/heretic/magic/mind_gate.dm b/code/modules/antagonists/heretic/magic/mind_gate.dm index c5a6e74452a..7963c4d6c02 100644 --- a/code/modules/antagonists/heretic/magic/mind_gate.dm +++ b/code/modules/antagonists/heretic/magic/mind_gate.dm @@ -7,7 +7,7 @@ button_icon = 'icons/mob/actions/actions_ecult.dmi' button_icon_state = "mind_gate" - sound = 'sound/magic/curse.ogg' + sound = 'sound/effects/magic/curse.ogg' school = SCHOOL_FORBIDDEN cooldown_time = 20 SECONDS diff --git a/code/modules/antagonists/heretic/magic/mirror_walk.dm b/code/modules/antagonists/heretic/magic/mirror_walk.dm index b9029e1ab07..93642c7f324 100644 --- a/code/modules/antagonists/heretic/magic/mirror_walk.dm +++ b/code/modules/antagonists/heretic/magic/mirror_walk.dm @@ -67,7 +67,7 @@ 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) + playsound(jaunter, 'sound/effects/magic/ethereal_enter.ogg', 50, TRUE, -1) jaunter.visible_message( span_boldwarning("[jaunter] phases out of reality, vanishing before your very eyes!"), span_notice("You jump into the reflection coming off of [nearby_reflection], entering the mirror's realm."), @@ -107,7 +107,7 @@ /datum/action/cooldown/spell/jaunt/mirror_walk/on_jaunt_exited(obj/effect/dummy/phased_mob/jaunt, mob/living/unjaunter) . = ..() UnregisterSignal(jaunt, COMSIG_MOVABLE_MOVED) - playsound(unjaunter, 'sound/magic/ethereal_exit.ogg', 50, TRUE, -1) + playsound(unjaunter, 'sound/effects/magic/ethereal_exit.ogg', 50, TRUE, -1) var/turf/phase_turf = get_turf(unjaunter) // Chilly! diff --git a/code/modules/antagonists/heretic/magic/moon_parade.dm b/code/modules/antagonists/heretic/magic/moon_parade.dm index 3b7f1d007cd..e6457a6a2b1 100644 --- a/code/modules/antagonists/heretic/magic/moon_parade.dm +++ b/code/modules/antagonists/heretic/magic/moon_parade.dm @@ -7,7 +7,7 @@ button_icon_state = "moon_parade" ranged_mousepointer = 'icons/effects/mouse_pointers/moon_target.dmi' - sound = 'sound/magic/cosmic_energy.ogg' + sound = 'sound/effects/magic/cosmic_energy.ogg' school = SCHOOL_FORBIDDEN cooldown_time = 30 SECONDS diff --git a/code/modules/antagonists/heretic/magic/moon_smile.dm b/code/modules/antagonists/heretic/magic/moon_smile.dm index 35f2d77e3e6..63bcc4cc848 100644 --- a/code/modules/antagonists/heretic/magic/moon_smile.dm +++ b/code/modules/antagonists/heretic/magic/moon_smile.dm @@ -8,7 +8,7 @@ button_icon_state = "moon_smile" ranged_mousepointer = 'icons/effects/mouse_pointers/moon_target.dmi' - sound = 'sound/magic/blind.ogg' + sound = 'sound/effects/magic/blind.ogg' school = SCHOOL_FORBIDDEN cooldown_time = 20 SECONDS @@ -35,7 +35,7 @@ to_chat(owner, span_warning("The moon does not smile upon them.")) return FALSE - playsound(cast_on, 'sound/hallucinations/i_see_you1.ogg', 50, 1) + playsound(cast_on, 'sound/effects/hallucinations/i_see_you1.ogg', 50, 1) to_chat(cast_on, span_warning("Your eyes cry out in pain, your ears bleed and your lips seal! THE MOON SMILES UPON YOU!")) cast_on.adjust_temp_blindness(moon_smile_duration + 1 SECONDS) cast_on.set_eye_blur_if_lower(moon_smile_duration + 2 SECONDS) diff --git a/code/modules/antagonists/heretic/magic/realignment.dm b/code/modules/antagonists/heretic/magic/realignment.dm index d3ddc03fbbe..8ad6ce78299 100644 --- a/code/modules/antagonists/heretic/magic/realignment.dm +++ b/code/modules/antagonists/heretic/magic/realignment.dm @@ -7,7 +7,7 @@ overlay_icon_state = "bg_heretic_border" button_icon = 'icons/hud/implants.dmi' button_icon_state = "adrenal" - // sound = 'sound/magic/whistlereset.ogg' + // sound = 'sound/effects/magic/whistlereset.ogg' I have no idea why this was commented out school = SCHOOL_FORBIDDEN cooldown_time = 6 SECONDS diff --git a/code/modules/antagonists/heretic/magic/rust_wave.dm b/code/modules/antagonists/heretic/magic/rust_wave.dm index 0282a32b2b6..b109a068042 100644 --- a/code/modules/antagonists/heretic/magic/rust_wave.dm +++ b/code/modules/antagonists/heretic/magic/rust_wave.dm @@ -8,7 +8,7 @@ overlay_icon_state = "bg_heretic_border" button_icon = 'icons/mob/actions/actions_ecult.dmi' button_icon_state = "entropic_plume" - sound = 'sound/magic/forcewall.ogg' + sound = 'sound/effects/magic/forcewall.ogg' school = SCHOOL_FORBIDDEN cooldown_time = 30 SECONDS @@ -90,7 +90,7 @@ alpha = 180 damage = 30 damage_type = TOX - hitsound = 'sound/weapons/punch3.ogg' + hitsound = 'sound/items/weapons/punch3.ogg' trigger_range = 0 ignored_factions = list(FACTION_HERETIC) range = 15 @@ -98,7 +98,7 @@ /obj/projectile/magic/aoe/rust_wave/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) . = ..() - playsound(src, 'sound/items/welder.ogg', 75, TRUE) + playsound(src, 'sound/items/tools/welder.ogg', 75, TRUE) var/list/turflist = list() var/turf/T1 turflist += get_turf(src) diff --git a/code/modules/antagonists/heretic/magic/shadow_cloak.dm b/code/modules/antagonists/heretic/magic/shadow_cloak.dm index ad942c71a32..ca0ca1fa15b 100644 --- a/code/modules/antagonists/heretic/magic/shadow_cloak.dm +++ b/code/modules/antagonists/heretic/magic/shadow_cloak.dm @@ -7,7 +7,7 @@ overlay_icon_state = "bg_heretic_border" button_icon = 'icons/mob/actions/actions_minor_antag.dmi' button_icon_state = "ninja_cloak" - sound = 'sound/effects/curse2.ogg' + sound = 'sound/effects/curse/curse2.ogg' school = SCHOOL_FORBIDDEN cooldown_time = 6 SECONDS @@ -36,12 +36,12 @@ /datum/action/cooldown/spell/shadow_cloak/before_cast(mob/living/cast_on) . = ..() sound = pick( - 'sound/effects/curse1.ogg', - 'sound/effects/curse2.ogg', - 'sound/effects/curse3.ogg', - 'sound/effects/curse4.ogg', - 'sound/effects/curse5.ogg', - 'sound/effects/curse6.ogg', + 'sound/effects/curse/curse1.ogg', + 'sound/effects/curse/curse2.ogg', + 'sound/effects/curse/curse3.ogg', + 'sound/effects/curse/curse4.ogg', + 'sound/effects/curse/curse5.ogg', + 'sound/effects/curse/curse6.ogg', ) // We handle the CD on our own return . | SPELL_NO_IMMEDIATE_COOLDOWN @@ -66,7 +66,7 @@ StartCooldown(uncloak_timer / 3) /datum/action/cooldown/spell/shadow_cloak/proc/cloak_mob(mob/living/cast_on) - playsound(cast_on, 'sound/chemistry/ahaha.ogg', 50, TRUE, -1, extrarange = SILENCED_SOUND_EXTRARANGE, frequency = 0.5) + playsound(cast_on, 'sound/effects/chemistry/ahaha.ogg', 50, TRUE, -1, extrarange = SILENCED_SOUND_EXTRARANGE, frequency = 0.5) cast_on.visible_message( span_warning("[cast_on] disappears into the shadows!"), span_notice("You disappear into the shadows, becoming unidentifiable."), @@ -83,7 +83,7 @@ active_cloak = null UnregisterSignal(cast_on, SIGNAL_REMOVETRAIT(TRAIT_ALLOW_HERETIC_CASTING)) - playsound(cast_on, 'sound/effects/curseattack.ogg', 50) + playsound(cast_on, 'sound/effects/curse/curseattack.ogg', 50) if(show_message) cast_on.visible_message( span_warning("[cast_on] appears from the shadows!"), diff --git a/code/modules/antagonists/heretic/magic/space_crawl.dm b/code/modules/antagonists/heretic/magic/space_crawl.dm index 49b9ae96f30..6a96403872f 100644 --- a/code/modules/antagonists/heretic/magic/space_crawl.dm +++ b/code/modules/antagonists/heretic/magic/space_crawl.dm @@ -83,7 +83,7 @@ jaunter.put_in_hands(right_hand) RegisterSignal(jaunter, SIGNAL_REMOVETRAIT(TRAIT_ALLOW_HERETIC_CASTING), PROC_REF(on_focus_lost)) - playsound(our_turf, 'sound/magic/cosmic_energy.ogg', 50, TRUE, -1) + playsound(our_turf, 'sound/effects/magic/cosmic_energy.ogg', 50, TRUE, -1) our_turf.visible_message(span_warning("[jaunter] sinks into [our_turf]!")) new /obj/effect/temp_visual/space_explosion(our_turf) jaunter.extinguish_mob() @@ -107,7 +107,7 @@ /datum/action/cooldown/spell/jaunt/space_crawl/on_jaunt_exited(obj/effect/dummy/phased_mob/jaunt, mob/living/unjaunter) UnregisterSignal(jaunt, COMSIG_MOVABLE_MOVED) UnregisterSignal(unjaunter, list(SIGNAL_REMOVETRAIT(TRAIT_ALLOW_HERETIC_CASTING))) - playsound(get_turf(unjaunter), 'sound/magic/cosmic_energy.ogg', 50, TRUE, -1) + playsound(get_turf(unjaunter), 'sound/effects/magic/cosmic_energy.ogg', 50, TRUE, -1) new /obj/effect/temp_visual/space_explosion(get_turf(unjaunter)) if(iscarbon(unjaunter)) for(var/obj/item/space_crawl/space_hand in unjaunter.held_items) diff --git a/code/modules/antagonists/heretic/magic/star_blast.dm b/code/modules/antagonists/heretic/magic/star_blast.dm index 3eb62b7ada8..e6f7a96811e 100644 --- a/code/modules/antagonists/heretic/magic/star_blast.dm +++ b/code/modules/antagonists/heretic/magic/star_blast.dm @@ -6,7 +6,7 @@ button_icon = 'icons/mob/actions/actions_ecult.dmi' button_icon_state = "star_blast" - sound = 'sound/magic/cosmic_energy.ogg' + sound = 'sound/effects/magic/cosmic_energy.ogg' school = SCHOOL_FORBIDDEN cooldown_time = 20 SECONDS @@ -46,7 +46,7 @@ nearby_mob.apply_status_effect(/datum/status_effect/star_mark, cast_on) /obj/projectile/magic/star_ball/Destroy() - playsound(get_turf(src), 'sound/magic/cosmic_energy.ogg', 50, FALSE) + playsound(get_turf(src), 'sound/effects/magic/cosmic_energy.ogg', 50, FALSE) for(var/turf/cast_turf as anything in get_turfs()) new /obj/effect/forcefield/cosmic_field(cast_turf) return ..() diff --git a/code/modules/antagonists/heretic/magic/star_touch.dm b/code/modules/antagonists/heretic/magic/star_touch.dm index 89c5d02e7d4..d9cd5a05eab 100644 --- a/code/modules/antagonists/heretic/magic/star_touch.dm +++ b/code/modules/antagonists/heretic/magic/star_touch.dm @@ -10,7 +10,7 @@ button_icon = 'icons/mob/actions/actions_ecult.dmi' button_icon_state = "star_touch" - sound = 'sound/items/welder.ogg' + sound = 'sound/items/tools/welder.ogg' school = SCHOOL_FORBIDDEN cooldown_time = 15 SECONDS invocation = "ST'R 'N'RG'!" @@ -107,8 +107,8 @@ get_turf(star_gazer_mob), no_effects = TRUE, channel = TELEPORT_CHANNEL_MAGIC, - asoundin = 'sound/magic/cosmic_energy.ogg', - asoundout = 'sound/magic/cosmic_energy.ogg', + asoundin = 'sound/effects/magic/cosmic_energy.ogg', + asoundout = 'sound/effects/magic/cosmic_energy.ogg', ) remove_hand_with_no_refund(user) diff --git a/code/modules/antagonists/heretic/magic/void_conduit.dm b/code/modules/antagonists/heretic/magic/void_conduit.dm new file mode 100644 index 00000000000..036415269c9 --- /dev/null +++ b/code/modules/antagonists/heretic/magic/void_conduit.dm @@ -0,0 +1,128 @@ +/datum/action/cooldown/spell/conjure/void_conduit + name = "Void Conduit" + desc = "Opens a gate to the Void; it releases an intermittent pulse that damages windows and airlocks, \ + while afflicting Heathens with void chill. \ + Affected Heretics instead receive low pressure resistance." + background_icon_state = "bg_heretic" + overlay_icon_state = "bg_heretic_border" + button_icon = 'icons/mob/actions/actions_ecult.dmi' + button_icon_state = "void_rift" + + cooldown_time = 1 MINUTES + + sound = null + school = SCHOOL_FORBIDDEN + invocation = "MBR'C' TH' V''D!" + invocation_type = INVOCATION_SHOUT + spell_requirements = NONE + + summon_radius = 0 + summon_type = list(/obj/structure/void_conduit) + summon_respects_density = TRUE + summon_respects_prev_spawn_points = TRUE + +/obj/structure/void_conduit + name = "Void Conduit" + desc = "An open gate which leads to nothingness. Releases pulses which you do not want to get hit by." + icon = 'icons/effects/effects.dmi' + icon_state = "void_conduit" + anchored = TRUE + density = TRUE + ///Overlay to apply to the tiles in range of the conduit + var/static/image/void_overlay = image(icon = 'icons/turf/overlays.dmi', icon_state = "voidtile") + ///List of tiles that we added an overlay to, so we can clear them when the conduit is deleted + var/list/overlayed_turfs = list() + ///How many tiles far our effect is + var/effect_range = 8 + ///id of the deletion timer + var/timerid + ///Audio loop for the rift being alive + var/datum/looping_sound/void_conduit/soundloop + +/obj/structure/void_conduit/Initialize(mapload) + . = ..() + soundloop = new(src, start_immediately = TRUE) + timerid = QDEL_IN_STOPPABLE(src, 1 MINUTES) + START_PROCESSING(SSobj, src) + build_view_turfs() + +/obj/structure/void_conduit/proc/build_view_turfs() + for(var/turf/affected_turf as anything in overlayed_turfs) + affected_turf.cut_overlay(void_overlay) + for(var/turf/affected_turf as anything in view(effect_range, src)) + if(!isopenturf(affected_turf)) + continue + affected_turf.add_overlay(void_overlay) + overlayed_turfs += affected_turf + void_overlay.mouse_opacity = MOUSE_OPACITY_TRANSPARENT + void_overlay.alpha = 180 + +/obj/structure/void_conduit/Destroy(force) + QDEL_NULL(soundloop) + deltimer(timerid) + STOP_PROCESSING(SSobj, src) + for(var/turf/affected_turf as anything in overlayed_turfs) //If the portal is moved, the overlays don't stick around + affected_turf.cut_overlay(void_overlay) + return ..() + +/obj/structure/void_conduit/process(seconds_per_tick) + build_view_turfs() + do_conduit_pulse() + +///Sends out a pulse +/obj/structure/void_conduit/proc/do_conduit_pulse() + var/list/turfs_to_affect = list() + for(var/turf/affected_turf as anything in view(effect_range, loc)) + var/distance = get_dist(loc, affected_turf) + if(!turfs_to_affect["[distance]"]) + turfs_to_affect["[distance]"] = list() + turfs_to_affect["[distance]"] += affected_turf + + for(var/distance in 0 to effect_range) + if(!turfs_to_affect["[distance]"]) + continue + addtimer(CALLBACK(src, PROC_REF(handle_effects), turfs_to_affect["[distance]"]), (1 SECONDS) * distance) + + new /obj/effect/temp_visual/circle_wave/void_conduit(get_turf(src)) + +///Applies the effects of the pulse "hitting" something. Freezes non-heretic, destroys airlocks/windows +/obj/structure/void_conduit/proc/handle_effects(list/turfs) + for(var/turf/affected_turf as anything in turfs) + for(var/atom/thing_to_affect as anything in affected_turf.contents) + + if(isliving(thing_to_affect)) + var/mob/living/affected_mob = thing_to_affect + if(affected_mob.can_block_magic(MAGIC_RESISTANCE)) + continue + if(IS_HERETIC(affected_mob)) + affected_mob.apply_status_effect(/datum/status_effect/void_conduit) + else + affected_mob.apply_status_effect(/datum/status_effect/void_chill, 1) + + if(istype(thing_to_affect, /obj/machinery/door) || istype(thing_to_affect, /obj/structure/door_assembly)) + var/obj/affected_door = thing_to_affect + affected_door.take_damage(rand(15, 30)) + + if(istype(thing_to_affect, /obj/structure/window) || istype(thing_to_affect, /obj/structure/grille)) + var/obj/structure/affected_structure = thing_to_affect + affected_structure.take_damage(rand(10, 20)) + +/datum/looping_sound/void_conduit + mid_sounds = 'sound/ambience/misc/ambiatm1.ogg' + mid_length = 1 SECONDS + extra_range = 10 + volume = 40 + falloff_distance = 5 + falloff_exponent = 20 + +/datum/status_effect/void_conduit + duration = 15 SECONDS + status_type = STATUS_EFFECT_REPLACE + alert_type = null + +/datum/status_effect/void_conduit/on_apply() + ADD_TRAIT(owner, TRAIT_RESISTLOWPRESSURE, "void_conduit") + return TRUE + +/datum/status_effect/void_conduit/on_remove() + REMOVE_TRAIT(owner, TRAIT_RESISTLOWPRESSURE, "void_conduit") diff --git a/code/modules/antagonists/heretic/magic/void_phase.dm b/code/modules/antagonists/heretic/magic/void_phase.dm index 350ca0f29c1..473fa057cf5 100644 --- a/code/modules/antagonists/heretic/magic/void_phase.dm +++ b/code/modules/antagonists/heretic/magic/void_phase.dm @@ -10,7 +10,7 @@ ranged_mousepointer = 'icons/effects/mouse_pointers/throw_target.dmi' school = SCHOOL_FORBIDDEN - cooldown_time = 30 SECONDS + cooldown_time = 25 SECONDS invocation = "RE'L'TY PH'S'E." invocation_type = INVOCATION_WHISPER @@ -50,13 +50,14 @@ /// Does the AOE effect of the blinka t the passed turf /datum/action/cooldown/spell/pointed/void_phase/proc/cause_aoe(turf/target_turf, effect_type = /obj/effect/temp_visual/voidin) new effect_type(target_turf) - playsound(target_turf, 'sound/magic/voidblink.ogg', 60, FALSE) + playsound(target_turf, 'sound/effects/magic/voidblink.ogg', 60, FALSE) for(var/mob/living/living_mob in range(damage_radius, target_turf)) if(IS_HERETIC_OR_MONSTER(living_mob) || living_mob == owner) continue if(living_mob.can_block_magic(antimagic_flags)) continue living_mob.apply_damage(40, BRUTE, wound_bonus = CANT_WOUND) + living_mob.apply_status_effect(/datum/status_effect/void_chill, 1) /obj/effect/temp_visual/voidin icon = 'icons/effects/96x96.dmi' diff --git a/code/modules/antagonists/heretic/magic/void_prison.dm b/code/modules/antagonists/heretic/magic/void_prison.dm new file mode 100644 index 00000000000..cfd85c92b6e --- /dev/null +++ b/code/modules/antagonists/heretic/magic/void_prison.dm @@ -0,0 +1,101 @@ +/datum/action/cooldown/spell/pointed/void_prison + name = "Void Prison" + desc = "Sends a heathen into the void for 10 seconds. \ + They will be unable to perform any actions for the duration. \ + Afterwards, they will be chilled and returned to the mortal plane." + background_icon_state = "bg_heretic" + overlay_icon_state = "bg_heretic_border" + button_icon = 'icons/mob/actions/actions_ecult.dmi' + button_icon_state = "voidball" + ranged_mousepointer = 'icons/effects/mouse_pointers/throw_target.dmi' + sound = 'sound/effects/magic/voidblink.ogg' + + cooldown_time = 1 MINUTES + cast_range = 3 + + sound = null + school = SCHOOL_FORBIDDEN + invocation = "V''D PR'S'N!" + invocation_type = INVOCATION_SHOUT + spell_requirements = NONE + +/datum/action/cooldown/spell/pointed/void_prison/before_cast(atom/cast_on) + . = ..() + if(. & SPELL_CANCEL_CAST) + return + if(!ismob(cast_on)) + return SPELL_CANCEL_CAST + +/datum/action/cooldown/spell/pointed/void_prison/cast(mob/living/carbon/human/cast_on) + . = ..() + if(cast_on.can_block_magic(antimagic_flags)) + cast_on.visible_message( + span_danger("A swirling, cold void wraps around [cast_on], but they burst free in a wave of heat!"), + span_danger("A yawning void begins to open before you, but a great wave of heat bursts it apart! You are protected!!") + ) + return + cast_on.apply_status_effect(/datum/status_effect/void_prison, "void_stasis") + +/datum/status_effect/void_prison + id = "void_prison" + duration = 10 SECONDS + alert_type = /atom/movable/screen/alert/status_effect/void_prison + ///The overlay that gets applied to whoever has this status active + var/obj/effect/abstract/voidball/stasis_overlay + +/datum/status_effect/void_prison/on_creation(mob/living/new_owner, set_duration) + . = ..() + stasis_overlay = new /obj/effect/abstract/voidball(new_owner) + RegisterSignal(stasis_overlay, COMSIG_QDELETING, PROC_REF(clear_overlay)) + new_owner.vis_contents += stasis_overlay + stasis_overlay.animate_opening() + addtimer(CALLBACK(src, PROC_REF(enter_prison), new_owner), 1 SECONDS) + +/datum/status_effect/void_prison/on_remove() + if(!IS_HERETIC(owner)) + owner.apply_status_effect(/datum/status_effect/void_chill, 3) + if(stasis_overlay) + //Free our prisoner + owner.remove_traits(list(TRAIT_GODMODE, TRAIT_NO_TRANSFORM, TRAIT_SOFTSPOKEN), REF(src)) + owner.forceMove(get_turf(stasis_overlay)) + stasis_overlay.forceMove(owner) + owner.vis_contents += stasis_overlay + //Animate closing the ball + stasis_overlay.animate_closing() + stasis_overlay.icon_state = "voidball_closed" + QDEL_IN(stasis_overlay, 1.1 SECONDS) + stasis_overlay = null + return ..() + +///Freezes our prisoner in place +/datum/status_effect/void_prison/proc/enter_prison(mob/living/prisoner) + stasis_overlay.forceMove(prisoner.loc) + prisoner.forceMove(stasis_overlay) + prisoner.add_traits(list(TRAIT_GODMODE, TRAIT_NO_TRANSFORM, TRAIT_SOFTSPOKEN), REF(src)) + +///Makes sure to clear the ref in case the voidball ever suddenly disappears +/datum/status_effect/void_prison/proc/clear_overlay() + SIGNAL_HANDLER + stasis_overlay = null + +//----Voidball effect +/obj/effect/abstract/voidball + icon = 'icons/mob/actions/actions_ecult.dmi' + icon_state = "voidball_effect" + layer = ABOVE_ALL_MOB_LAYER + vis_flags = VIS_INHERIT_ID + +///Plays a opening animation +/obj/effect/abstract/voidball/proc/animate_opening() + flick("voidball_opening", src) + +///Plays a closing animation +/obj/effect/abstract/voidball/proc/animate_closing() + flick("voidball_closing", src) + +//---- Screen alert +/atom/movable/screen/alert/status_effect/void_prison + name = "Void Prison" + desc = "A Yawning void encases your mortal coil." //Go straight to jail, do not pass GO, do not collect 200$ + icon = 'icons/mob/actions/actions_ecult.dmi' + icon_state = "voidball_effect" diff --git a/code/modules/antagonists/heretic/magic/void_pull.dm b/code/modules/antagonists/heretic/magic/void_pull.dm index 2021bf8a04e..4e73ff6f49b 100644 --- a/code/modules/antagonists/heretic/magic/void_pull.dm +++ b/code/modules/antagonists/heretic/magic/void_pull.dm @@ -6,10 +6,10 @@ overlay_icon_state = "bg_heretic_border" button_icon = 'icons/mob/actions/actions_ecult.dmi' button_icon_state = "voidpull" - sound = 'sound/magic/voidblink.ogg' + sound = 'sound/effects/magic/voidblink.ogg' school = SCHOOL_FORBIDDEN - cooldown_time = 40 SECONDS + cooldown_time = 30 SECONDS invocation = "BR'NG F'RTH TH'M T' M'." invocation_type = INVOCATION_WHISPER @@ -32,6 +32,7 @@ // Before we cast the actual effects, deal AOE damage to anyone adjacent to us for(var/mob/living/nearby_living as anything in get_things_to_cast_on(cast_on, damage_radius)) nearby_living.apply_damage(30, BRUTE, wound_bonus = CANT_WOUND) + nearby_living.apply_status_effect(/datum/status_effect/void_chill, 1) /datum/action/cooldown/spell/aoe/void_pull/get_things_to_cast_on(atom/center, radius_override = 1) var/list/things = list() diff --git a/code/modules/antagonists/heretic/magic/wave_of_desperation.dm b/code/modules/antagonists/heretic/magic/wave_of_desperation.dm index 3b78b56ddc0..16e3440ebbe 100644 --- a/code/modules/antagonists/heretic/magic/wave_of_desperation.dm +++ b/code/modules/antagonists/heretic/magic/wave_of_desperation.dm @@ -6,7 +6,7 @@ overlay_icon_state = "bg_heretic_border" button_icon = 'icons/mob/actions/actions_ecult.dmi' button_icon_state = "uncuff" - sound = 'sound/magic/swap.ogg' + sound = 'sound/effects/magic/swap.ogg' school = SCHOOL_FORBIDDEN cooldown_time = 5 MINUTES diff --git a/code/modules/antagonists/heretic/status_effects/buffs.dm b/code/modules/antagonists/heretic/status_effects/buffs.dm index 1668ea5a11e..d60129ae3d9 100644 --- a/code/modules/antagonists/heretic/status_effects/buffs.dm +++ b/code/modules/antagonists/heretic/status_effects/buffs.dm @@ -190,7 +190,7 @@ var/obj/effect/floating_blade/to_remove = blades[1] - playsound(get_turf(source), 'sound/weapons/parry.ogg', 100, TRUE) + playsound(get_turf(source), 'sound/items/weapons/parry.ogg', 100, TRUE) source.visible_message( span_warning("[to_remove] orbiting [source] snaps in front of [attack_text], blocking it before vanishing!"), span_warning("[to_remove] orbiting you snaps in front of [attack_text], blocking it before vanishing!"), @@ -251,11 +251,10 @@ status_type = STATUS_EFFECT_REFRESH duration = -1 alert_type = null - var/static/list/caretaking_traits = list(TRAIT_HANDS_BLOCKED, TRAIT_IGNORESLOWDOWN, TRAIT_SECLUDED_LOCATION) + var/static/list/caretaking_traits = list(TRAIT_GODMODE, TRAIT_HANDS_BLOCKED, TRAIT_IGNORESLOWDOWN, TRAIT_SECLUDED_LOCATION) /datum/status_effect/caretaker_refuge/on_apply() owner.add_traits(caretaking_traits, TRAIT_STATUS_EFFECT(id)) - owner.status_flags |= GODMODE animate(owner, alpha = 45,time = 0.5 SECONDS) owner.density = FALSE RegisterSignal(owner, SIGNAL_REMOVETRAIT(TRAIT_ALLOW_HERETIC_CASTING), PROC_REF(on_focus_lost)) @@ -266,7 +265,6 @@ /datum/status_effect/caretaker_refuge/on_remove() owner.remove_traits(caretaking_traits, TRAIT_STATUS_EFFECT(id)) - owner.status_flags &= ~GODMODE owner.alpha = initial(owner.alpha) owner.density = initial(owner.density) UnregisterSignal(owner, SIGNAL_REMOVETRAIT(TRAIT_ALLOW_HERETIC_CASTING)) @@ -283,7 +281,7 @@ /datum/status_effect/caretaker_refuge/proc/nullrod_handler(datum/source, obj/item/weapon) SIGNAL_HANDLER - playsound(get_turf(owner), 'sound/effects/curse1.ogg', 80, TRUE) + playsound(get_turf(owner), 'sound/effects/curse/curse1.ogg', 80, TRUE) owner.visible_message(span_warning("[weapon] repels the haze around [owner]!")) owner.remove_status_effect(type) diff --git a/code/modules/antagonists/heretic/status_effects/debuffs.dm b/code/modules/antagonists/heretic/status_effects/debuffs.dm index 7037d1cc377..8b1751bccde 100644 --- a/code/modules/antagonists/heretic/status_effects/debuffs.dm +++ b/code/modules/antagonists/heretic/status_effects/debuffs.dm @@ -1,41 +1,3 @@ -// VOID CHILL -/datum/status_effect/void_chill - id = "void_chill" - alert_type = /atom/movable/screen/alert/status_effect/void_chill - duration = 8 SECONDS - status_type = STATUS_EFFECT_REPLACE - tick_interval = 0.5 SECONDS - /// The amount the victim's body temperature changes each tick() in kelvin. Multiplied by TEMPERATURE_DAMAGE_COEFFICIENT. - var/cooling_per_tick = -14 - -/atom/movable/screen/alert/status_effect/void_chill - name = "Void Chill" - desc = "There's something freezing you from within and without. You've never felt cold this oppressive before..." - icon_state = "void_chill" - -/datum/status_effect/void_chill/on_apply() - owner.add_atom_colour(COLOR_BLUE_LIGHT, TEMPORARY_COLOUR_PRIORITY) - owner.add_movespeed_modifier(/datum/movespeed_modifier/void_chill, update = TRUE) - return TRUE - -/datum/status_effect/void_chill/on_remove() - owner.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, COLOR_BLUE_LIGHT) - owner.remove_movespeed_modifier(/datum/movespeed_modifier/void_chill, update = TRUE) - -/datum/status_effect/void_chill/tick(seconds_between_ticks) - owner.adjust_bodytemperature(cooling_per_tick * TEMPERATURE_DAMAGE_COEFFICIENT) - -/datum/status_effect/void_chill/major - duration = 10 SECONDS - cooling_per_tick = -20 - -/datum/status_effect/void_chill/lasting - id = "lasting_void_chill" - duration = -1 - -/datum/movespeed_modifier/void_chill - multiplicative_slowdown = 0.3 - // AMOK /datum/status_effect/amok id = "amok" diff --git a/code/modules/antagonists/heretic/status_effects/mark_effects.dm b/code/modules/antagonists/heretic/status_effects/mark_effects.dm index b647ba6ca80..25217949072 100644 --- a/code/modules/antagonists/heretic/status_effects/mark_effects.dm +++ b/code/modules/antagonists/heretic/status_effects/mark_effects.dm @@ -47,7 +47,7 @@ /datum/status_effect/eldritch/proc/on_effect() SHOULD_CALL_PARENT(TRUE) - playsound(owner, 'sound/magic/repulse.ogg', 75, TRUE) + playsound(owner, 'sound/effects/magic/repulse.ogg', 75, TRUE) qdel(src) //what happens when this is procced. //Each mark has different effects when it is destroyed that combine with the mansus grasp effect. @@ -105,7 +105,7 @@ effect_icon_state = "emark4" /datum/status_effect/eldritch/void/on_effect() - owner.apply_status_effect(/datum/status_effect/void_chill/major) + owner.apply_status_effect(/datum/status_effect/void_chill, 3) owner.adjust_silence(10 SECONDS) return ..() diff --git a/code/modules/antagonists/heretic/status_effects/void_chill.dm b/code/modules/antagonists/heretic/status_effects/void_chill.dm new file mode 100644 index 00000000000..ed4bf1f3cb5 --- /dev/null +++ b/code/modules/antagonists/heretic/status_effects/void_chill.dm @@ -0,0 +1,113 @@ +/*! + * Contains the "Void Chill" status effect. Harmful debuff which freezes and slows down non-heretics + * Cannot affect silicons (How are you gonna freeze a robot?) + */ +/datum/status_effect/void_chill + id = "void_chill" + duration = 30 SECONDS + alert_type = /atom/movable/screen/alert/status_effect/void_chill + status_type = STATUS_EFFECT_REFRESH //Custom code + on_remove_on_mob_delete = TRUE + remove_on_fullheal = TRUE + ///Current amount of stacks we have + var/stacks + ///Maximum of stacks that we could possibly get + var/stack_limit = 5 + ///icon for the overlay + var/image/stacks_overlay + +/datum/status_effect/void_chill/on_creation(mob/living/new_owner, new_stacks, ...) + . = ..() + RegisterSignal(owner, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(update_stacks_overlay)) + set_stacks(new_stacks) + owner.add_atom_colour(COLOR_BLUE_LIGHT, TEMPORARY_COLOUR_PRIORITY) + owner.update_icon(UPDATE_OVERLAYS) + +/datum/status_effect/void_chill/on_apply() + if(issilicon(owner)) + return FALSE + return TRUE + +/datum/status_effect/void_chill/on_remove() + owner.update_icon(UPDATE_OVERLAYS) + owner.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, COLOR_BLUE_LIGHT) + owner.remove_movespeed_modifier(/datum/movespeed_modifier/void_chill) + owner.remove_alt_appearance("heretic_status") + REMOVE_TRAIT(owner, TRAIT_HYPOTHERMIC, REF(src)) + UnregisterSignal(owner, COMSIG_ATOM_UPDATE_OVERLAYS) + +/datum/status_effect/void_chill/tick(seconds_between_ticks) + owner.adjust_bodytemperature(-12 * stacks * seconds_between_ticks) + +/datum/status_effect/void_chill/refresh(mob/living/new_owner, new_stacks, forced = FALSE) + . = ..() + if(forced) + set_stacks(new_stacks) + else + adjust_stacks(new_stacks) + owner.update_icon(UPDATE_OVERLAYS) + +///Updates the overlay that gets applied on our victim +/datum/status_effect/void_chill/proc/update_stacks_overlay(atom/parent_atom, list/overlays) + SIGNAL_HANDLER + + linked_alert?.update_appearance(UPDATE_ICON_STATE|UPDATE_DESC) + owner.remove_alt_appearance("heretic_status") + stacks_overlay = image('icons/effects/effects.dmi', owner, "void_chill_partial") + if(stacks >= 5) + stacks_overlay = image('icons/effects/effects.dmi', owner, "void_chill_oh_fuck") + owner.add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/heretic, "heretic_status", stacks_overlay, NONE) + +/** + * Setter and adjuster procs for stacks + * + * Arguments: + * - new_stacks + * + */ + +/datum/status_effect/void_chill/proc/set_stacks(new_stacks) + stacks = max(0, min(stack_limit, new_stacks)) + update_movespeed(stacks) + +/datum/status_effect/void_chill/proc/adjust_stacks(new_stacks) + stacks = max(0, min(stack_limit, stacks + new_stacks)) + update_movespeed(stacks) + if(stacks >= 5) + ADD_TRAIT(owner, TRAIT_HYPOTHERMIC, REF(src)) + +///Updates the movespeed of owner based on the amount of stacks of the debuff +/datum/status_effect/void_chill/proc/update_movespeed(stacks) + owner.add_movespeed_modifier(/datum/movespeed_modifier/void_chill, update = TRUE) + owner.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/void_chill, update = TRUE, multiplicative_slowdown = (0.5 * stacks)) + linked_alert.maptext = MAPTEXT_TINY_UNICODE("[stacks]") + +/datum/status_effect/void_chill/lasting + id = "lasting_void_chill" + duration = -1 + +/datum/movespeed_modifier/void_chill + variable = TRUE + multiplicative_slowdown = 0.1 + +//---- Screen alert +/atom/movable/screen/alert/status_effect/void_chill + name = "Void Chill" + desc = "There's something freezing you from within and without. You've never felt cold this oppressive before..." + icon_state = "void_chill_minor" + +/atom/movable/screen/alert/status_effect/void_chill/update_icon_state() + . = ..() + if(!istype(attached_effect, /datum/status_effect/void_chill)) + return + var/datum/status_effect/void_chill/chill_effect = attached_effect + if(chill_effect.stacks >= 5) + icon_state = "void_chill_oh_fuck" + +/atom/movable/screen/alert/status_effect/void_chill/update_desc(updates) + . = ..() + if(!istype(attached_effect, /datum/status_effect/void_chill)) + return + var/datum/status_effect/void_chill/chill_effect = attached_effect + if(chill_effect.stacks >= 5) + desc = "You had your chance to run, now it's too late. You may never feel warmth again..." diff --git a/code/modules/antagonists/heretic/structures/carving_knife.dm b/code/modules/antagonists/heretic/structures/carving_knife.dm index 70133e951af..72b224d117d 100644 --- a/code/modules/antagonists/heretic/structures/carving_knife.dm +++ b/code/modules/antagonists/heretic/structures/carving_knife.dm @@ -11,7 +11,7 @@ wound_bonus = 20 force = 10 throwforce = 20 - hitsound = 'sound/weapons/bladeslice.ogg' + hitsound = 'sound/items/weapons/bladeslice.ogg' attack_verb_continuous = list("attacks", "slashes", "stabs", "slices", "tears", "lacerates", "rips", "dices", "rends") attack_verb_simple = list("attack", "slash", "stab", "slice", "tear", "lacerate", "rip", "dice", "rend") actions_types = list(/datum/action/item_action/rune_shatter) @@ -152,7 +152,7 @@ if(!.) return - owner.playsound_local(get_turf(owner), 'sound/magic/blind.ogg', 50, TRUE) + owner.playsound_local(get_turf(owner), 'sound/effects/magic/blind.ogg', 50, TRUE) var/obj/item/melee/rune_carver/target_sword = target QDEL_LIST(target_sword.current_runes) target_sword.SpinAnimation(5, 1) @@ -203,7 +203,7 @@ var/mob/living/real_owner = owner?.resolve() if(real_owner) to_chat(real_owner, span_userdanger("[victim.real_name] has stepped foot on the alert rune in [get_area(src)]!")) - real_owner.playsound_local(get_turf(real_owner), 'sound/magic/curse.ogg', 50, TRUE) + real_owner.playsound_local(get_turf(real_owner), 'sound/effects/magic/curse.ogg', 50, TRUE) /obj/structure/trap/eldritch/tentacle name = "grasping carving" @@ -219,7 +219,7 @@ carbon_victim.Paralyze(5 SECONDS) carbon_victim.apply_damage(20, BRUTE, BODY_ZONE_R_LEG) carbon_victim.apply_damage(20, BRUTE, BODY_ZONE_L_LEG) - playsound(src, 'sound/magic/demon_attack1.ogg', 75, TRUE) + playsound(src, 'sound/effects/magic/demon_attack1.ogg', 75, TRUE) /obj/structure/trap/eldritch/mad name = "mad carving" @@ -240,4 +240,4 @@ carbon_victim.set_dizzy_if_lower(40 SECONDS) carbon_victim.adjust_temp_blindness(4 SECONDS) carbon_victim.add_mood_event("gates_of_mansus", /datum/mood_event/gates_of_mansus) - playsound(src, 'sound/magic/blind.ogg', 75, TRUE) + playsound(src, 'sound/effects/magic/blind.ogg', 75, TRUE) diff --git a/code/modules/antagonists/heretic/structures/lock_final.dm b/code/modules/antagonists/heretic/structures/lock_final.dm index 5512d6027ee..295ecbb3a2b 100644 --- a/code/modules/antagonists/heretic/structures/lock_final.dm +++ b/code/modules/antagonists/heretic/structures/lock_final.dm @@ -47,7 +47,7 @@ /obj/structure/lock_tear/proc/end_madness(datum/former_master) SIGNAL_HANDLER var/turf/our_turf = get_turf(src) - playsound(our_turf, 'sound/magic/castsummon.ogg', vol = 100, vary = TRUE) + playsound(our_turf, 'sound/effects/magic/castsummon.ogg', vol = 100, vary = TRUE) visible_message(span_boldwarning("The rip in space spasms and disappears!")) UnregisterSignal(former_master, list(COMSIG_LIVING_DEATH, COMSIG_QDELETING)) // Just in case they die THEN delete new /obj/effect/temp_visual/destabilising_tear(our_turf) diff --git a/code/modules/antagonists/heretic/structures/mawed_crucible.dm b/code/modules/antagonists/heretic/structures/mawed_crucible.dm index 2135ffa134c..ea962cbc5a4 100644 --- a/code/modules/antagonists/heretic/structures/mawed_crucible.dm +++ b/code/modules/antagonists/heretic/structures/mawed_crucible.dm @@ -6,7 +6,7 @@ icon = 'icons/obj/antags/eldritch.dmi' icon_state = "crucible" base_icon_state = "crucible" - break_sound = 'sound/hallucinations/wail.ogg' + break_sound = 'sound/effects/hallucinations/wail.ogg' light_power = 1 anchored = TRUE density = TRUE @@ -31,7 +31,7 @@ for(var/turf/nearby_turf as anything in get_adjacent_open_turfs(our_turf)) if(prob(10 * current_mass)) new /obj/effect/decal/cleanable/greenglow(nearby_turf) - playsound(our_turf, 'sound/effects/bubbles2.ogg', 50, TRUE) + playsound(our_turf, 'sound/effects/bubbles/bubbles2.ogg', 50, TRUE) return ..() @@ -69,12 +69,6 @@ bite_the_hand(user) return TRUE - if(istype(weapon, /obj/item/codex_cicatrix) || istype(weapon, /obj/item/melee/touch_attack/mansus_fist)) - playsound(src, 'sound/items/deconstruct.ogg', 30, TRUE, ignore_walls = FALSE) - set_anchored(!anchored) - balloon_alert(user, "[anchored ? "":"un"]anchored") - return TRUE - if(isbodypart(weapon)) var/obj/item/bodypart/consumed = weapon @@ -99,6 +93,13 @@ return ..() +/obj/structure/destructible/eldritch_crucible/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(istype(tool, /obj/item/codex_cicatrix) || istype(tool, /obj/item/melee/touch_attack/mansus_fist)) + playsound(src, 'sound/items/deconstruct.ogg', 30, TRUE, ignore_walls = FALSE) + set_anchored(!anchored) + balloon_alert(user, "[anchored ? "":"un"]anchored") + return ITEM_INTERACT_SUCCESS + /obj/structure/destructible/eldritch_crucible/attack_hand(mob/user, list/modifiers) . = ..() if(.) @@ -163,7 +164,7 @@ var/obj/item/spawned_pot = new spawned_type(drop_location()) - playsound(src, 'sound/misc/desecration-02.ogg', 75, TRUE) + playsound(src, 'sound/effects/desecration/desecration-02.ogg', 75, TRUE) visible_message(span_notice("[src]'s shining liquid drains into a flask, creating a [spawned_pot.name]!")) balloon_alert(user, "potion created") @@ -237,7 +238,7 @@ if(!iscarbon(user)) return - playsound(src, 'sound/effects/bubbles.ogg', 50, TRUE) + playsound(src, 'sound/effects/bubbles/bubbles.ogg', 50, TRUE) if(!IS_HERETIC_OR_MONSTER(user)) to_chat(user, span_danger("You down some of the liquid from [src]. The taste causes you to retch, and the glass vanishes.")) diff --git a/code/modules/antagonists/heretic/transmutation_rune.dm b/code/modules/antagonists/heretic/transmutation_rune.dm index f99caf71826..b04e8a4caf1 100644 --- a/code/modules/antagonists/heretic/transmutation_rune.dm +++ b/code/modules/antagonists/heretic/transmutation_rune.dm @@ -167,7 +167,7 @@ // This doesn't necessarily mean the ritual will succeed, but it's valid! // Do the animations and associated feedback. flick("[icon_state]_active", src) - playsound(user, 'sound/magic/castsummon.ogg', 75, TRUE, extrarange = SILENCED_SOUND_EXTRARANGE, falloff_exponent = 10) + playsound(user, 'sound/effects/magic/castsummon.ogg', 75, TRUE, extrarange = SILENCED_SOUND_EXTRARANGE, falloff_exponent = 10) // - We temporarily make all of our chosen atoms invisible, as some rituals may sleep, // and we don't want people to be able to run off with ritual items. diff --git a/code/modules/antagonists/highlander/highlander.dm b/code/modules/antagonists/highlander/highlander.dm index a1c31241e0b..184ca9c4f77 100644 --- a/code/modules/antagonists/highlander/highlander.dm +++ b/code/modules/antagonists/highlander/highlander.dm @@ -43,8 +43,8 @@ . = ..() /datum/antagonist/highlander/greet() - to_chat(owner, "Your [sword.name] cries out for blood. Claim the lives of others, and your own will be restored!\n\ - Activate it in your hand, and it will lead to the nearest target. Attack the nuclear authentication disk with it, and you will store it.") + to_chat(owner, span_boldannounce("Your [sword.name] cries out for blood. Claim the lives of others, and your own will be restored!\n\ + Activate it in your hand, and it will lead to the nearest target. Attack the nuclear authentication disk with it, and you will store it.")) owner.announce_objectives() @@ -88,8 +88,8 @@ name = "\improper highlander" /datum/antagonist/highlander/robot/greet() - to_chat(owner, "Your integrated claymore cries out for blood. Claim the lives of others, and your own will be restored!\n\ - Activate it in your hand, and it will lead to the nearest target. Attack the nuclear authentication disk with it, and you will store it.") + to_chat(owner, span_boldannounce("Your integrated claymore cries out for blood. Claim the lives of others, and your own will be restored!\n\ + Activate it in your hand, and it will lead to the nearest target. Attack the nuclear authentication disk with it, and you will store it.")) /datum/antagonist/highlander/robot/give_equipment() var/mob/living/silicon/robot/robotlander = owner.current diff --git a/code/modules/antagonists/hypnotized/hypnotized.dm b/code/modules/antagonists/hypnotized/hypnotized.dm index fc1e5d7d5ad..bde67390bf7 100644 --- a/code/modules/antagonists/hypnotized/hypnotized.dm +++ b/code/modules/antagonists/hypnotized/hypnotized.dm @@ -1,7 +1,7 @@ /// Antag datum associated with the hypnosis brain trauma, used for displaying objectives and antag hud /datum/antagonist/hypnotized name = "\improper Hypnotized Victim" - stinger_sound = 'sound/ambience/antag/hypnotized.ogg' + stinger_sound = 'sound/music/antag/hypnotized.ogg' job_rank = ROLE_HYPNOTIZED roundend_category = "hypnotized victims" antag_hud_name = "brainwashed" diff --git a/code/modules/antagonists/malf_ai/malf_ai.dm b/code/modules/antagonists/malf_ai/malf_ai.dm index be9a63d86e7..3c4e0296f91 100644 --- a/code/modules/antagonists/malf_ai/malf_ai.dm +++ b/code/modules/antagonists/malf_ai/malf_ai.dm @@ -21,7 +21,7 @@ ///since the module purchasing is built into the antag info, we need to keep track of its compact mode here var/module_picker_compactmode = FALSE ///malf on_gain sound effect. Set here so Infected AI can override - var/malf_sound = 'sound/ambience/antag/malf.ogg' + var/malf_sound = 'sound/music/antag/malf.ogg' /datum/antagonist/malf_ai/New(give_objectives = TRUE) . = ..() @@ -47,6 +47,7 @@ malfunction_flavor = strings(MALFUNCTION_FLAVOR_FILE, employer) add_law_zero() + RegisterSignal(owner.current, COMSIG_SILICON_AI_CORE_STATUS, PROC_REF(core_status)) if(malf_sound) owner.current.playsound_local(get_turf(owner.current), malf_sound, 100, FALSE, pressure_affected = FALSE, use_reverb = FALSE) owner.current.grant_language(/datum/language/codespeak, source = LANGUAGE_MALF) @@ -70,7 +71,7 @@ QDEL_NULL(malf_ai.malf_picker) owner.special_role = null - + UnregisterSignal(owner, COMSIG_SILICON_AI_CORE_STATUS) return ..() /// Generates a complete set of malf AI objectives up to the traitor objective limit. @@ -209,7 +210,7 @@ "name" = category, "items" = (category == malf_ai.malf_picker.selected_cat ? list() : null)) for(var/module in malf_ai.malf_picker.possible_modules[category]) - var/datum/ai_module/mod = malf_ai.malf_picker.possible_modules[category][module] + var/datum/ai_module/malf/mod = malf_ai.malf_picker.possible_modules[category][module] cat["items"] += list(list( "name" = mod.name, "cost" = mod.cost, @@ -234,7 +235,7 @@ for(var/category in malf_ai.malf_picker.possible_modules) buyable_items += malf_ai.malf_picker.possible_modules[category] for(var/key in buyable_items) - var/datum/ai_module/valid_mod = buyable_items[key] + var/datum/ai_module/malf/valid_mod = buyable_items[key] if(valid_mod.name == item_name) malf_ai.malf_picker.purchase_module(malf_ai, valid_mod) return TRUE @@ -269,7 +270,7 @@ result += span_greentext("The [special_role_text] was successful!") else result += span_redtext("The [special_role_text] has failed!") - SEND_SOUND(owner.current, 'sound/ambience/ambifailure.ogg') + SEND_SOUND(owner.current, 'sound/ambience/misc/ambifailure.ogg') return result.Join("
") @@ -283,6 +284,14 @@ return malf_ai_icon +/datum/antagonist/malf_ai/proc/core_status(datum/source) + SIGNAL_HANDLER + + var/mob/living/silicon/ai/malf_owner = owner.current + if(malf_owner.linked_core) + return COMPONENT_CORE_ALL_GOOD + return COMPONENT_CORE_DISCONNECTED + //Subtype of Malf AI datum, used for one of the traitor final objectives /datum/antagonist/malf_ai/infected name = "Infected AI" diff --git a/code/modules/antagonists/malf_ai/malf_ai_modules.dm b/code/modules/antagonists/malf_ai/malf_ai_modules.dm index dbbbec4e388..5db4bfd546a 100644 --- a/code/modules/antagonists/malf_ai/malf_ai_modules.dm +++ b/code/modules/antagonists/malf_ai/malf_ai_modules.dm @@ -52,7 +52,7 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( /obj/machinery/computer/gateway_control, ))) -GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module) - /datum/ai_module/destructive/nuke_station) //BUBBERSTATION CHANGE: REMOVES NUKE STATION ROUNDSTART MODULE +GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module/malf - /datum/ai_module/malf/destructive/nuke_station)) // BUBBER EDIT - REMOVES NUKE STATION ROUNDSTART MODULE /// The malf AI action subtype. All malf actions are subtypes of this. /datum/action/innate/ai @@ -137,19 +137,19 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module) - /datum/ai_module/d return /// Modules causing destruction -/datum/ai_module/destructive +/datum/ai_module/malf/destructive category = "Destructive Modules" /// Modules with stealthy and utility uses -/datum/ai_module/utility +/datum/ai_module/malf/utility category = "Utility Modules" /// Modules that are improving AI abilities and assets -/datum/ai_module/upgrade +/datum/ai_module/malf/upgrade category = "Upgrade Modules" /// Doomsday Device: Starts the self-destruct timer. It can only be stopped by killing the AI completely. -/datum/ai_module/destructive/nuke_station +/datum/ai_module/malf/destructive/nuke_station name = "Doomsday Device" description = "Activate a weapon that will disintegrate all organic life on the station after a 450 second delay. \ Can only be used while on the station, will fail if your core is moved off station or destroyed. \ @@ -201,7 +201,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module) - /datum/ai_module/d if(QDELETED(owner) || !isturf(owner_AI.loc)) active = FALSE return - owner.playsound_local(owner, 'sound/misc/bloblarm.ogg', 50, 0, use_reverb = FALSE) + owner.playsound_local(owner, 'sound/announcer/alarm/bloblarm.ogg', 50, 0, use_reverb = FALSE) to_chat(owner, span_userdanger("!!! UNAUTHORIZED SELF-DESTRUCT ACCESS !!!")) to_chat(owner, span_boldannounce("This is a class-3 security violation. This incident will be reported to Central Command.")) for(var/i in 1 to 3) @@ -227,7 +227,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module) - /datum/ai_module/d active = FALSE return to_chat(owner, span_boldnotice("Arm self-destruct device? (Y/N)")) - owner.playsound_local(owner, 'sound/misc/compiler-stage1.ogg', 50, 0, use_reverb = FALSE) + owner.playsound_local(owner, 'sound/machines/compiler/compiler-stage1.ogg', 50, 0, use_reverb = FALSE) sleep(2 SECONDS) if(QDELETED(owner) || !isturf(owner_AI.loc)) active = FALSE @@ -238,7 +238,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module) - /datum/ai_module/d active = FALSE return to_chat(owner, span_boldnotice("Confirm arming of self-destruct device? (Y/N)")) - owner.playsound_local(owner, 'sound/misc/compiler-stage2.ogg', 50, 0, use_reverb = FALSE) + owner.playsound_local(owner, 'sound/machines/compiler/compiler-stage2.ogg', 50, 0, use_reverb = FALSE) sleep(1 SECONDS) if(QDELETED(owner) || !isturf(owner_AI.loc)) active = FALSE @@ -249,7 +249,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module) - /datum/ai_module/d active = FALSE return to_chat(owner, span_boldnotice("Please repeat password to confirm.")) - owner.playsound_local(owner, 'sound/misc/compiler-stage2.ogg', 50, 0, use_reverb = FALSE) + owner.playsound_local(owner, 'sound/machines/compiler/compiler-stage2.ogg', 50, 0, use_reverb = FALSE) sleep(1.4 SECONDS) if(QDELETED(owner) || !isturf(owner_AI.loc)) active = FALSE @@ -350,7 +350,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module) - /datum/ai_module/d var/sec_left = seconds_remaining() if(!sec_left) timing = FALSE - sound_to_playing_players('sound/machines/alarm.ogg') + sound_to_playing_players('sound/announcer/alarm/nuke_alarm.ogg', 70) addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(play_cinematic), /datum/cinematic/malf, world, CALLBACK(src, PROC_REF(trigger_doomsday))), 10 SECONDS) else if(world.time >= next_announce) @@ -372,7 +372,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module) - /datum/ai_module/d return TRUE /// Hostile Station Lockdown: Locks, bolts, and electrifies every airlock on the station. After 90 seconds, the doors reset. -/datum/ai_module/destructive/lockdown +/datum/ai_module/malf/destructive/lockdown name = "Hostile Station Lockdown" description = "Overload the airlock, blast door and fire control networks, locking them down. \ Caution! This command also electrifies all airlocks. The networks will automatically reset after 90 seconds, briefly \ @@ -381,7 +381,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module) - /datum/ai_module/d one_purchase = TRUE power_type = /datum/action/innate/ai/lockdown unlock_text = span_notice("You upload a sleeper trojan into the door control systems. You can send a signal to set it off at any time.") - unlock_sound = 'sound/machines/boltsdown.ogg' + unlock_sound = 'sound/machines/airlock/boltsdown.ogg' /datum/action/innate/ai/lockdown name = "Lockdown" @@ -424,13 +424,13 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module) - /datum/ai_module/d CHECK_TICK /// Override Machine: Allows the AI to override a machine, animating it into an angry, living version of itself. -/datum/ai_module/destructive/override_machine +/datum/ai_module/malf/destructive/override_machine name = "Machine Override" description = "Overrides a machine's programming, causing it to rise up and attack everyone except other machines. Four uses per purchase." cost = 30 power_type = /datum/action/innate/ai/ranged/override_machine unlock_text = span_notice("You procure a virus from the Space Dark Web and distribute it to the station's machines.") - unlock_sound = 'sound/machines/airlock_alien_prying.ogg' + unlock_sound = 'sound/machines/airlock/airlock_alien_prying.ogg' /datum/action/innate/ai/ranged/override_machine name = "Override Machine" @@ -481,7 +481,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module) - /datum/ai_module/d new /mob/living/simple_animal/hostile/mimic/copy/machine(get_turf(to_animate), to_animate, caller, TRUE) /// Destroy RCDs: Detonates all non-cyborg RCDs on the station. -/datum/ai_module/destructive/destroy_rcd +/datum/ai_module/malf/destructive/destroy_rcd name = "Destroy RCDs" description = "Send a specialised pulse to detonate all hand-held and exosuit Rapid Construction Devices on the station." cost = 25 @@ -503,10 +503,10 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module) - /datum/ai_module/d var/obj/item/construction/rcd/RCD = I RCD.detonate_pulse() to_chat(owner, span_danger("RCD detonation pulse emitted.")) - owner.playsound_local(owner, 'sound/machines/twobeep.ogg', 50, 0) + owner.playsound_local(owner, 'sound/machines/beep/twobeep.ogg', 50, 0) /// Overload Machine: Allows the AI to overload a machine, detonating it after a delay. Two uses per purchase. -/datum/ai_module/destructive/overload_machine +/datum/ai_module/malf/destructive/overload_machine name = "Machine Overload" description = "Overheats an electrical machine, causing a small explosion and destroying it. Two uses per purchase." cost = 20 @@ -567,7 +567,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module) - /datum/ai_module/d return TRUE /// Blackout: Overloads a random number of lights across the station. Three uses. -/datum/ai_module/destructive/blackout +/datum/ai_module/malf/destructive/blackout name = "Blackout" description = "Attempts to overload the lighting circuits on the station, destroying some bulbs. Three uses per purchase." cost = 15 @@ -601,13 +601,13 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module) - /datum/ai_module/d build_all_button_icons() /// HIGH IMPACT HONKING -/datum/ai_module/destructive/megahonk +/datum/ai_module/malf/destructive/megahonk name = "Percussive Intercomm Interference" description = "Emit a debilitatingly percussive auditory blast through the station intercoms. Does not overpower hearing protection. Two uses per purchase." cost = 20 power_type = /datum/action/innate/ai/honk unlock_text = span_notice("You upload a sinister sound file into every intercom...") - unlock_sound = 'sound/items/airhorn.ogg' + unlock_sound = 'sound/items/airhorn/airhorn.ogg' /datum/action/innate/ai/honk name = "Percussive Intercomm Interference" @@ -622,7 +622,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module) - /datum/ai_module/d if(!found_intercom.is_on() || !found_intercom.get_listening() || found_intercom.wires.is_cut(WIRE_RX)) //Only operating intercoms play the honk continue found_intercom.audible_message(message = "[found_intercom] crackles for a split second.", hearing_distance = 3) - playsound(found_intercom, 'sound/items/airhorn.ogg', 100, TRUE) + playsound(found_intercom, 'sound/items/airhorn/airhorn.ogg', 100, TRUE) for(var/mob/living/carbon/honk_victim in ohearers(6, found_intercom)) var/turf/victim_turf = get_turf(honk_victim) if(isspaceturf(victim_turf) && !victim_turf.Adjacent(found_intercom)) //Prevents getting honked in space @@ -632,7 +632,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module) - /datum/ai_module/d to_chat(honk_victim, span_clown("HOOOOONK!")) /// Robotic Factory: Places a large machine that converts humans that go through it into cyborgs. Unlocking this ability removes shunting. -/datum/ai_module/utility/place_cyborg_transformer +/datum/ai_module/malf/utility/place_cyborg_transformer name = "Robotic Factory (Removes Shunting)" description = "Build a machine anywhere, using expensive nanomachines, that will slowly create loyal cyborgs for you." // SKYRAT EDIT cost = 100 @@ -707,7 +707,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module) - /datum/ai_module/d return success /// Air Alarm Safety Override: Unlocks the ability to enable dangerous modes on all air alarms. -/datum/ai_module/utility/break_air_alarms +/datum/ai_module/malf/utility/break_air_alarms name = "Air Alarm Safety Override" description = "Gives you the ability to disable safeties on all air alarms. This will allow you to use extremely dangerous environmental modes. \ Anyone can check the air alarm's interface and may be tipped off by their nonfunctionality." @@ -730,10 +730,10 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module) - /datum/ai_module/d continue AA.obj_flags |= EMAGGED to_chat(owner, span_notice("All air alarm safeties on the station have been overridden. Air alarms may now use extremely dangerous environmental modes.")) - owner.playsound_local(owner, 'sound/machines/terminal_off.ogg', 50, 0) + owner.playsound_local(owner, 'sound/machines/terminal/terminal_off.ogg', 50, 0) /// Thermal Sensor Override: Unlocks the ability to disable all fire alarms from doing their job. -/datum/ai_module/utility/break_fire_alarms +/datum/ai_module/malf/utility/break_fire_alarms name = "Thermal Sensor Override" description = "Gives you the ability to override the thermal sensors on all fire alarms. \ This will remove their ability to scan for fire and thus their ability to alert." @@ -742,7 +742,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module) - /datum/ai_module/d power_type = /datum/action/innate/ai/break_fire_alarms unlock_text = span_notice("You replace the thermal sensing capabilities of all fire alarms with a manual override, \ allowing you to turn them off at will.") - unlock_sound = 'sound/machines/FireAlarm1.ogg' + unlock_sound = 'sound/machines/fire_alarm/FireAlarm1.ogg' /datum/action/innate/ai/break_fire_alarms name = "Override Thermal Sensors" @@ -761,10 +761,10 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module) - /datum/ai_module/d continue firelock.emag_act(owner_AI, src) to_chat(owner, span_notice("All thermal sensors on the station have been disabled. Fire alerts will no longer be recognized.")) - owner.playsound_local(owner, 'sound/machines/terminal_off.ogg', 50, 0) + owner.playsound_local(owner, 'sound/machines/terminal/terminal_off.ogg', 50, 0) /// Disable Emergency Lights -/datum/ai_module/utility/emergency_lights +/datum/ai_module/malf/utility/emergency_lights name = "Disable Emergency Lights" description = "Cuts emergency lights across the entire station. If power is lost to light fixtures, \ they will not attempt to fall back on emergency power reserves." @@ -791,7 +791,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module) - /datum/ai_module/d owner.playsound_local(owner, 'sound/effects/light_flicker.ogg', 50, FALSE) /// Reactivate Camera Network: Reactivates up to 30 cameras across the station. -/datum/ai_module/utility/reactivate_cameras +/datum/ai_module/malf/utility/reactivate_cameras name = "Reactivate Camera Network" description = "Runs a network-wide diagnostic on the camera network, resetting focus and re-routing power to failed cameras. \ Can be used to repair up to 30 cameras." @@ -799,7 +799,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module) - /datum/ai_module/d one_purchase = TRUE power_type = /datum/action/innate/ai/reactivate_cameras unlock_text = span_notice("You deploy nanomachines to the cameranet.") - unlock_sound = 'sound/items/wirecutter.ogg' + unlock_sound = 'sound/items/tools/wirecutter.ogg' /datum/action/innate/ai/reactivate_cameras name = "Reactivate Cameras" @@ -824,7 +824,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module) - /datum/ai_module/d fixed_cameras++ uses-- //Not adjust_uses() so it doesn't automatically delete or show a message to_chat(owner, span_notice("Diagnostic complete! Cameras reactivated: [fixed_cameras]. Reactivations remaining: [uses].")) - owner.playsound_local(owner, 'sound/items/wirecutter.ogg', 50, 0) + owner.playsound_local(owner, 'sound/items/tools/wirecutter.ogg', 50, 0) adjust_uses(0, TRUE) //Checks the uses remaining if(QDELETED(src) || !uses) //Not sure if not having src here would cause a runtime, so it's here to be safe return @@ -832,16 +832,16 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module) - /datum/ai_module/d build_all_button_icons() /// Upgrade Camera Network: EMP-proofs all cameras, in addition to giving them X-ray vision. -/datum/ai_module/upgrade/upgrade_cameras +/datum/ai_module/malf/upgrade/upgrade_cameras name = "Upgrade Camera Network" description = "Install broad-spectrum scanning and electrical redundancy firmware to the camera network, enabling EMP-proofing and light-amplified X-ray vision. Upgrade is done immediately upon purchase." //I <3 pointless technobabble //This used to have motion sensing as well, but testing quickly revealed that giving it to the whole cameranet is PURE HORROR. cost = 35 //Decent price for omniscience! upgrade = TRUE unlock_text = span_notice("OTA firmware distribution complete! Cameras upgraded: CAMSUPGRADED. Light amplification system online.") - unlock_sound = 'sound/items/rped.ogg' + unlock_sound = 'sound/items/tools/rped.ogg' -/datum/ai_module/upgrade/upgrade_cameras/upgrade(mob/living/silicon/ai/AI) +/datum/ai_module/malf/upgrade/upgrade_cameras/upgrade(mob/living/silicon/ai/AI) // Sets up nightvision RegisterSignal(AI, COMSIG_MOB_UPDATE_SIGHT, PROC_REF(on_update_sight)) AI.update_sight() @@ -864,44 +864,44 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module) - /datum/ai_module/d upgraded_cameras++ unlock_text = replacetext(unlock_text, "CAMSUPGRADED", "[upgraded_cameras]") //This works, since unlock text is called after upgrade() -/datum/ai_module/upgrade/upgrade_cameras/proc/on_update_sight(mob/source) +/datum/ai_module/malf/upgrade/upgrade_cameras/proc/on_update_sight(mob/source) SIGNAL_HANDLER // Dim blue, pretty source.lighting_color_cutoffs = blend_cutoff_colors(source.lighting_color_cutoffs, list(5, 25, 35)) /// AI Turret Upgrade: Increases the health and damage of all turrets. -/datum/ai_module/upgrade/upgrade_turrets +/datum/ai_module/malf/upgrade/upgrade_turrets name = "AI Turret Upgrade" description = "Improves the power and health of all AI turrets. This effect is permanent. Upgrade is done immediately upon purchase." cost = 30 upgrade = TRUE unlock_text = span_notice("You establish a power diversion to your turrets, upgrading their health and damage.") - unlock_sound = 'sound/items/rped.ogg' + unlock_sound = 'sound/items/tools/rped.ogg' -/datum/ai_module/upgrade/upgrade_turrets/upgrade(mob/living/silicon/ai/AI) +/datum/ai_module/malf/upgrade/upgrade_turrets/upgrade(mob/living/silicon/ai/AI) for(var/obj/machinery/porta_turret/ai/turret as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/porta_turret/ai)) turret.AddElement(/datum/element/empprotection, EMP_PROTECT_ALL) turret.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. - turret.lethal_projectile_sound = 'sound/weapons/lasercannonfire.ogg' + turret.lethal_projectile_sound = 'sound/items/weapons/lasercannonfire.ogg' /// Enhanced Surveillance: Enables AI to hear conversations going on near its active vision. -/datum/ai_module/upgrade/eavesdrop +/datum/ai_module/malf/upgrade/eavesdrop name = "Enhanced Surveillance" description = "Via a combination of hidden microphones and lip reading software, \ you are able to use your cameras to listen in on conversations. Upgrade is done immediately upon purchase." cost = 30 upgrade = TRUE unlock_text = span_notice("OTA firmware distribution complete! Cameras upgraded: Enhanced surveillance package online.") - unlock_sound = 'sound/items/rped.ogg' + unlock_sound = 'sound/items/tools/rped.ogg' -/datum/ai_module/upgrade/eavesdrop/upgrade(mob/living/silicon/ai/AI) +/datum/ai_module/malf/upgrade/eavesdrop/upgrade(mob/living/silicon/ai/AI) if(AI.eyeobj) AI.eyeobj.relay_speech = TRUE /// Unlock Mech Domination: Unlocks the ability to dominate mechs. Big shocker, right? -/datum/ai_module/upgrade/mecha_domination +/datum/ai_module/malf/upgrade/mecha_domination name = "Unlock Mech Domination" description = "Allows you to hack into a mech's onboard computer, shunting all processes into it and ejecting any occupants. \ Do not allow the mech to leave the station's vicinity or allow it to be destroyed. \ @@ -910,19 +910,19 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module) - /datum/ai_module/d upgrade = TRUE unlock_text = span_notice("Virus package compiled. Select a target mech at any time. You must remain on the station at all times. \ Loss of signal will result in total system lockout.") - unlock_sound = 'sound/mecha/nominal.ogg' + unlock_sound = 'sound/vehicles/mecha/nominal.ogg' -/datum/ai_module/upgrade/mecha_domination/upgrade(mob/living/silicon/ai/AI) +/datum/ai_module/malf/upgrade/mecha_domination/upgrade(mob/living/silicon/ai/AI) AI.can_dominate_mechs = TRUE //Yep. This is all it does. Honk! -/datum/ai_module/upgrade/voice_changer +/datum/ai_module/malf/upgrade/voice_changer name = "Voice Changer" description = "Allows you to change the AI's voice. Upgrade is active immediately upon purchase." cost = 40 one_purchase = TRUE power_type = /datum/action/innate/ai/voice_changer unlock_text = span_notice("OTA firmware distribution complete! Voice changer online.") - unlock_sound = 'sound/items/rped.ogg' + unlock_sound = 'sound/items/tools/rped.ogg' /datum/action/innate/ai/voice_changer name="Voice Changer" @@ -1053,7 +1053,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module) - /datum/ai_module/d if("name") say_name = strip_html(params["name"], MAX_NAME_LEN) -/datum/ai_module/utility/emag +/datum/ai_module/malf/utility/emag name = "Targeted Safeties Override" description = "Allows you to disable the safeties of any machinery on the station, provided you can access it." cost = 20 @@ -1147,7 +1147,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module) - /datum/ai_module/d return TRUE -/datum/ai_module/utility/core_tilt +/datum/ai_module/malf/utility/core_tilt name = "Rolling Servos" description = "Allows you to slowly roll around, crushing anything in your way with your bulk." cost = 10 @@ -1246,7 +1246,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module) - /datum/ai_module/d stack_trace("non-standard dir entered to get_rotation_from_dir. (got: [dir])") return 0 -/datum/ai_module/utility/remote_vendor_tilt +/datum/ai_module/malf/utility/remote_vendor_tilt name = "Remote vendor tilting" description = "Lets you remotely tip vendors over in any direction." cost = 15 diff --git a/code/modules/antagonists/nightmare/nightmare_equipment.dm b/code/modules/antagonists/nightmare/nightmare_equipment.dm index 6fbe6c6097b..52a687f9ac7 100644 --- a/code/modules/antagonists/nightmare/nightmare_equipment.dm +++ b/code/modules/antagonists/nightmare/nightmare_equipment.dm @@ -15,7 +15,7 @@ w_class = WEIGHT_CLASS_HUGE sharpness = SHARP_EDGED tool_behaviour = TOOL_MINING - hitsound = 'sound/weapons/bladeslice.ogg' + hitsound = 'sound/items/weapons/bladeslice.ogg' wound_bonus = -30 bare_wound_bonus = 20 ///If this is true, our next hit will be critcal, temporarily stunning our target diff --git a/code/modules/antagonists/nightmare/nightmare_organs.dm b/code/modules/antagonists/nightmare/nightmare_organs.dm index a77aaa79b23..5c675643964 100644 --- a/code/modules/antagonists/nightmare/nightmare_organs.dm +++ b/code/modules/antagonists/nightmare/nightmare_organs.dm @@ -84,7 +84,7 @@ span_warning("[user] raises [src] to [user.p_their()] mouth and tears into it with [user.p_their()] teeth!"), span_danger("[src] feels unnaturally cold in your hands. You raise [src] to your mouth and devour it!") ) - playsound(user, 'sound/magic/demon_consume.ogg', 50, TRUE) + playsound(user, 'sound/effects/magic/demon_consume.ogg', 50, TRUE) user.visible_message( span_warning("Blood erupts from [user]'s arm as it reforms into a weapon!"), @@ -130,7 +130,7 @@ to_chat(owner, span_userdanger("You feel the shadows invade your skin, leaping into the center of your chest! You're alive!")) SEND_SOUND(owner, sound('sound/effects/ghost.ogg')) owner.visible_message(span_warning("[owner] staggers to [owner.p_their()] feet!")) - playsound(owner, 'sound/hallucinations/far_noise.ogg', 50, TRUE) + playsound(owner, 'sound/effects/hallucinations/far_noise.ogg', 50, TRUE) respawn_progress = 0 /obj/item/organ/internal/heart/nightmare/get_availability(datum/species/owner_species, mob/living/owner_mob) diff --git a/code/modules/antagonists/ninja/energy_katana.dm b/code/modules/antagonists/ninja/energy_katana.dm index 61a9b81c364..efd99355091 100644 --- a/code/modules/antagonists/ninja/energy_katana.dm +++ b/code/modules/antagonists/ninja/energy_katana.dm @@ -24,10 +24,10 @@ block_chance = 50 armour_penetration = 50 w_class = WEIGHT_CLASS_NORMAL - hitsound = 'sound/weapons/bladeslice.ogg' + hitsound = 'sound/items/weapons/bladeslice.ogg' pickup_sound = 'sound/items/unsheath.ogg' drop_sound = 'sound/items/sheath.ogg' - block_sound = 'sound/weapons/block_blade.ogg' + block_sound = 'sound/items/weapons/block_blade.ogg' attack_verb_continuous = list("attacks", "slashes", "stabs", "slices", "tears", "lacerates", "rips", "dices", "cuts") attack_verb_simple = list("attack", "slash", "stab", "slice", "tear", "lacerate", "rip", "dice", "cut") slot_flags = ITEM_SLOT_BACK|ITEM_SLOT_BELT diff --git a/code/modules/antagonists/ninja/energy_net_nets.dm b/code/modules/antagonists/ninja/energy_net_nets.dm index 111d1f26515..5f08762b341 100644 --- a/code/modules/antagonists/ninja/energy_net_nets.dm +++ b/code/modules/antagonists/ninja/energy_net_nets.dm @@ -30,7 +30,7 @@ /obj/structure/energy_net/play_attack_sound(damage, damage_type = BRUTE, damage_flag = 0) if(damage_type == BRUTE || damage_type == BURN) - playsound(src, 'sound/weapons/slash.ogg', 80, TRUE) + playsound(src, 'sound/items/weapons/slash.ogg', 80, TRUE) /obj/structure/energy_net/atom_destruction(damage_flag) for(var/mob/recovered_mob as anything in buckled_mobs) diff --git a/code/modules/antagonists/nukeop/datums/operative.dm b/code/modules/antagonists/nukeop/datums/operative.dm index 9eca88d3385..ebaaf8692b2 100644 --- a/code/modules/antagonists/nukeop/datums/operative.dm +++ b/code/modules/antagonists/nukeop/datums/operative.dm @@ -8,7 +8,8 @@ show_to_ghosts = TRUE hijack_speed = 2 //If you can't take out the station, take the shuttle instead. suicide_cry = "FOR THE SYNDICATE!!" - stinger_sound = 'sound/ambience/antag/ops.ogg' + stinger_sound = 'sound/music/antag/ops.ogg' + /// 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. @@ -94,7 +95,7 @@ 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.set_assigned_role(SSjob.get_job_type(/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)].") @@ -114,8 +115,8 @@ 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) + final_icon.Blend(teammate, ICON_UNDERLAY, -ICON_SIZE_X / 4, 0) + final_icon.Blend(teammate, ICON_UNDERLAY, ICON_SIZE_X / 4, 0) if (!isnull(nuke_icon_state)) var/icon/nuke = icon('icons/obj/machines/nuke.dmi', nuke_icon_state) diff --git a/code/modules/antagonists/nukeop/datums/operative_leader.dm b/code/modules/antagonists/nukeop/datums/operative_leader.dm index c2995e55753..1af9f1d28c4 100644 --- a/code/modules/antagonists/nukeop/datums/operative_leader.dm +++ b/code/modules/antagonists/nukeop/datums/operative_leader.dm @@ -44,7 +44,13 @@ /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) + 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_length = MAX_NAME_LEN, + ) if (!newname) newname = randomname else diff --git a/code/modules/antagonists/nukeop/datums/operative_support.dm b/code/modules/antagonists/nukeop/datums/operative_support.dm index c9ea12b63c5..aa0c031c070 100644 --- a/code/modules/antagonists/nukeop/datums/operative_support.dm +++ b/code/modules/antagonists/nukeop/datums/operative_support.dm @@ -21,7 +21,7 @@ network = OPERATIVE_CAMERA_NET, \ emp_proof = FALSE, \ ) - our_teammate.playsound_local(get_turf(owner.current), 'sound/weapons/egloves.ogg', 100, 0) + our_teammate.playsound_local(get_turf(owner.current), 'sound/items/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)) diff --git a/code/modules/antagonists/nukeop/datums/operative_team.dm b/code/modules/antagonists/nukeop/datums/operative_team.dm index 1e06f32594d..b676bda303d 100644 --- a/code/modules/antagonists/nukeop/datums/operative_team.dm +++ b/code/modules/antagonists/nukeop/datums/operative_team.dm @@ -15,7 +15,7 @@ /datum/team/nuclear/roundend_report() var/list/parts = list() - parts += "[syndicate_name] Operatives:" + parts += span_header("[syndicate_name] Operatives:") switch(get_result()) if(NUKE_RESULT_FLUKE) @@ -55,7 +55,7 @@ parts += "Neutral Victory" parts += "Mission aborted!" - var/text = "
The syndicate operatives were:" + var/text = span_header("
The syndicate operatives were:") var/purchases = "" var/TC_uses = 0 LAZYINITLIST(GLOB.uplink_purchase_logs_by_key) diff --git a/code/modules/antagonists/nukeop/equipment/nuclear_authentication_disk.dm b/code/modules/antagonists/nukeop/equipment/nuclear_authentication_disk.dm index 7e06dd0d6e0..ebc2c6ec326 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclear_authentication_disk.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclear_authentication_disk.dm @@ -102,7 +102,7 @@ /obj/item/disk/nuclear/suicide_act(mob/living/user) 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) + playsound(src, 'sound/announcer/alarm/nuke_alarm.ogg', 50, -1, TRUE) for(var/i in 1 to 100) 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) 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 42361860454..c3b976bb149 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclear_bomb/_nuclear_bomb.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclear_bomb/_nuclear_bomb.dm @@ -95,7 +95,7 @@ GLOBAL_VAR(station_nuke_source) return TRUE auth = weapon update_ui_mode() - playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) + playsound(src, 'sound/machines/terminal/terminal_insert_disc.ogg', 50, FALSE) add_fingerprint(user) return TRUE @@ -336,7 +336,7 @@ GLOBAL_VAR(station_nuke_source) switch(action) if("eject_disk") if(auth && auth.loc == src) - playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) + playsound(src, 'sound/machines/terminal/terminal_insert_disc.ogg', 50, FALSE) playsound(src, 'sound/machines/nuke/general_beep.ogg', 50, FALSE) auth.forceMove(get_turf(src)) auth = null @@ -344,7 +344,7 @@ GLOBAL_VAR(station_nuke_source) else var/obj/item/I = usr.is_holding_item_of_type(/obj/item/disk/nuclear) if(I && disk_check(I) && usr.transferItemToLoc(I, src)) - playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) + playsound(src, 'sound/machines/terminal/terminal_insert_disc.ogg', 50, FALSE) playsound(src, 'sound/machines/nuke/general_beep.ogg', 50, FALSE) auth = I . = TRUE @@ -519,7 +519,7 @@ GLOBAL_VAR(station_nuke_source) yes_code = FALSE safety = TRUE update_appearance() - sound_to_playing_players('sound/machines/alarm.ogg') + sound_to_playing_players('sound/announcer/alarm/nuke_alarm.ogg', 70) sound_to_playing_players('modular_skyrat/modules/alerts/sound/misc/delta_countdown.ogg') // SKYRAT EDIT ADDITION SEND_GLOBAL_SIGNAL(COMSIG_GLOB_NUKE_DEVICE_DETONATING, src) diff --git a/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm b/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm index 0160fbd8914..0dba54bf2aa 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm @@ -43,7 +43,7 @@ GLOBAL_LIST_EMPTY(jam_on_wardec) if(custom_threat == "Yes") declaring_war = TRUE - war_declaration = tgui_input_text(user, "Insert your custom declaration", "Declaration", multiline = TRUE, encode = FALSE) + war_declaration = tgui_input_text(user, "Insert your custom declaration", "Declaration", max_length = MAX_MESSAGE_LEN, multiline = TRUE, encode = FALSE) declaring_war = FALSE if(!check_allowed(user) || !war_declaration) @@ -63,7 +63,7 @@ GLOBAL_LIST_EMPTY(jam_on_wardec) var/custom_threat = tgui_alert(usr, "Do you want to customize the declaration?", "Customize?", list("Yes", "No")) if(custom_threat == "Yes") - war_declaration = tgui_input_text(usr, "Insert your custom declaration", "Declaration", multiline = TRUE, encode = FALSE) + war_declaration = tgui_input_text(usr, "Insert your custom declaration", "Declaration", max_length = MAX_MESSAGE_LEN, multiline = TRUE, encode = FALSE) if(!war_declaration) tgui_alert(usr, "Invalid war declaration.", "Poor Choice of Words") @@ -80,7 +80,7 @@ GLOBAL_LIST_EMPTY(jam_on_wardec) priority_announce( text = memo, title = "Declaration of War", - sound = 'sound/machines/alarm.ogg', + sound = 'sound/announcer/alarm/nuke_alarm.ogg', has_important_message = TRUE, sender_override = "Nuclear Operative Outpost", color_override = "red", @@ -192,7 +192,7 @@ GLOBAL_LIST_EMPTY(jam_on_wardec) priority_announce( text = memo, title = "Declaration of War", - sound = 'sound/machines/alarm.ogg', + sound = 'sound/announcer/alarm/nuke_alarm.ogg', has_important_message = TRUE, sender_override = "Nuclear Operative Outpost", color_override = "red", diff --git a/code/modules/antagonists/nukeop/equipment/pinpointer.dm b/code/modules/antagonists/nukeop/equipment/pinpointer.dm index 59ab16be7dc..f285be319d9 100644 --- a/code/modules/antagonists/nukeop/equipment/pinpointer.dm +++ b/code/modules/antagonists/nukeop/equipment/pinpointer.dm @@ -63,7 +63,7 @@ if(isliving(loc)) var/mob/living/L = loc to_chat(L, span_userdanger("Your [name] beeps as it reconfigures its tracking algorithms.")) - playsound(L, 'sound/machines/triple_beep.ogg', 50, TRUE) + playsound(L, 'sound/machines/beep/triple_beep.ogg', 50, TRUE) mode = new_mode scan_for_target() diff --git a/code/modules/antagonists/obsessed/obsessed.dm b/code/modules/antagonists/obsessed/obsessed.dm index 0a07d2391aa..b0cf9967aa6 100644 --- a/code/modules/antagonists/obsessed/obsessed.dm +++ b/code/modules/antagonists/obsessed/obsessed.dm @@ -1,3 +1,9 @@ +#define OBSESSED_OBJECTIVE_SPEND_TIME "spend_time" +#define OBSESSED_OBJECTIVE_POLAROID "polaroid" +#define OBSESSED_OBJECTIVE_HUG "hug" +#define OBSESSED_OBJECTIVE_HEIRLOOM "heirloom" +#define OBSESSED_OBJECTIVE_JEALOUS "jealous" + /datum/antagonist/obsessed name = "Obsessed" show_in_antagpanel = TRUE @@ -12,9 +18,24 @@ suicide_cry = "FOR MY LOVE!!" preview_outfit = /datum/outfit/obsessed hardcore_random_bonus = TRUE - stinger_sound = 'sound/ambience/antag/creepalert.ogg' + stinger_sound = 'sound/music/antag/creepalert.ogg' + /// How many objectives should be generated + var/objectives_to_generate = 3 + /// Brain trauma that causes the obsession var/datum/brain_trauma/special/obsessed/trauma +/// Dummy antag datum that will show the cured obsessed to admins +/datum/antagonist/former_obsessed + name = "Former Obsessed" + show_in_antagpanel = FALSE + show_name_in_check_antagonists = TRUE + antagpanel_category = ANTAG_GROUP_CREW + show_in_roundend = FALSE + count_against_dynamic_roll_chance = FALSE + silent = TRUE + can_elimination_hijack = ELIMINATION_PREVENT + antag_flags = FLAG_FAKE_ANTAG + /datum/antagonist/obsessed/admin_add(datum/mind/new_owner,mob/admin) var/mob/living/carbon/C = new_owner.current if(!istype(C)) @@ -72,8 +93,8 @@ H.regenerate_icons() /datum/antagonist/obsessed/forge_objectives(datum/mind/obsessionmind) - var/list/objectives_left = list("spendtime", "polaroid", "hug") - var/datum/objective/assassinate/kill = new // ZUBBER EDIT : Now with less round-removal! | org: var/datum/objective/assassinate/obsessed/kill = new + var/list/objectives_left = list(OBSESSED_OBJECTIVE_SPEND_TIME, OBSESSED_OBJECTIVE_POLAROID, OBSESSED_OBJECTIVE_HUG) + var/datum/objective/assassinate/kill = new // BUBBER EDIT - Less RR kill.owner = owner kill.target = obsessionmind var/obj/family_heirloom @@ -84,49 +105,49 @@ family_heirloom = heirloom_quirk.heirloom?.resolve() break if(family_heirloom) - objectives_left += "heirloom" + objectives_left += OBSESSED_OBJECTIVE_HEIRLOOM // If they have no coworkers, jealousy will pick someone else on the station. This will never be a free objective. if(!is_captain_job(obsessionmind.assigned_role)) - objectives_left += "jealous" + objectives_left += OBSESSED_OBJECTIVE_JEALOUS - for(var/i in 1 to 3) - var/chosen_objective = pick(objectives_left) - objectives_left.Remove(chosen_objective) + for(var/i in 1 to objectives_to_generate) + var/chosen_objective = pick_n_take(objectives_left) switch(chosen_objective) - if("spendtime") + if(OBSESSED_OBJECTIVE_SPEND_TIME) var/datum/objective/spendtime/spendtime = new spendtime.owner = owner spendtime.target = obsessionmind objectives += spendtime - if("polaroid") + if(OBSESSED_OBJECTIVE_POLAROID) var/datum/objective/polaroid/polaroid = new polaroid.owner = owner polaroid.target = obsessionmind objectives += polaroid - if("hug") + if(OBSESSED_OBJECTIVE_HUG) var/datum/objective/hug/hug = new hug.owner = owner hug.target = obsessionmind objectives += hug - if("heirloom") + if(OBSESSED_OBJECTIVE_HEIRLOOM) var/datum/objective/steal/heirloom_thief/heirloom_thief = new heirloom_thief.owner = owner heirloom_thief.target = obsessionmind//while you usually wouldn't need this for stealing, we need the name of the obsession heirloom_thief.steal_target = family_heirloom objectives += heirloom_thief - if("jealous") + if(OBSESSED_OBJECTIVE_JEALOUS) var/datum/objective/assassinate/jealous/jealous = new jealous.owner = owner jealous.target = obsessionmind//will reroll into a coworker on the objective itself objectives += jealous objectives += kill//finally add the assassinate last, because you'd have to complete it last to greentext. + for(var/datum/objective/O in objectives) O.update_explanation_text() /datum/antagonist/obsessed/roundend_report_header() - return "Someone became obsessed!
" + return span_header("Someone became obsessed!
") /datum/antagonist/obsessed/roundend_report() var/list/report = list() @@ -278,3 +299,9 @@ explanation_text = "Steal [target.name]'s family heirloom, [steal_target] they cherish." else explanation_text = "Free Objective" + +#undef OBSESSED_OBJECTIVE_SPEND_TIME +#undef OBSESSED_OBJECTIVE_POLAROID +#undef OBSESSED_OBJECTIVE_HUG +#undef OBSESSED_OBJECTIVE_HEIRLOOM +#undef OBSESSED_OBJECTIVE_JEALOUS diff --git a/code/modules/antagonists/paradox_clone/paradox_clone.dm b/code/modules/antagonists/paradox_clone/paradox_clone.dm index e809e8cecbf..960cf7f59ec 100644 --- a/code/modules/antagonists/paradox_clone/paradox_clone.dm +++ b/code/modules/antagonists/paradox_clone/paradox_clone.dm @@ -52,7 +52,7 @@ kill.update_explanation_text() objectives += kill - owner.set_assigned_role(SSjob.GetJobType(/datum/job/paradox_clone)) + owner.set_assigned_role(SSjob.get_job_type(/datum/job/paradox_clone)) //clone doesnt show up on message lists var/obj/item/modular_computer/pda/messenger = locate() in owner.current @@ -73,7 +73,7 @@ original_mind.quick_copy_all_memories(owner) /datum/antagonist/paradox_clone/roundend_report_header() - return "A paradox clone appeared on the station!
" + return span_header("A paradox clone appeared on the station!
") /datum/outfit/paradox_clone name = "Paradox Clone (Preview only)" diff --git a/code/modules/antagonists/pirate/pirate.dm b/code/modules/antagonists/pirate/pirate.dm index 0fa80f55247..6bff6eb3572 100644 --- a/code/modules/antagonists/pirate/pirate.dm +++ b/code/modules/antagonists/pirate/pirate.dm @@ -104,7 +104,7 @@ /datum/team/pirate/roundend_report() var/list/parts = list() - parts += "Space Pirates were:" + parts += span_header("Space Pirates were:") var/all_dead = TRUE for(var/datum/mind/M in members) diff --git a/code/modules/antagonists/pirate/pirate_shuttle_equipment.dm b/code/modules/antagonists/pirate/pirate_shuttle_equipment.dm index 602fcbe8b07..feb62ec4fca 100644 --- a/code/modules/antagonists/pirate/pirate_shuttle_equipment.dm +++ b/code/modules/antagonists/pirate/pirate_shuttle_equipment.dm @@ -438,7 +438,7 @@ 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) + playsound(picked_turf, 'sound/items/weapons/emitter2.ogg', 25, TRUE) sold_item.flash_act() sold_item.adjust_confusion(10 SECONDS) sold_item.adjust_dizzy(10 SECONDS) diff --git a/code/modules/antagonists/revolution/revolution.dm b/code/modules/antagonists/revolution/revolution.dm index d490944e1e3..da7b7657727 100644 --- a/code/modules/antagonists/revolution/revolution.dm +++ b/code/modules/antagonists/revolution/revolution.dm @@ -6,7 +6,7 @@ antag_moodlet = /datum/mood_event/revolution antag_hud_name = "rev" suicide_cry = "VIVA LA REVOLUTION!!" - stinger_sound = 'sound/ambience/antag/revolutionary_tide.ogg' + stinger_sound = 'sound/music/antag/revolutionary_tide.ogg' var/datum/team/revolution/rev_team /// When this antagonist is being de-antagged, this is the source. Can be a mob (for mindshield/blunt force trauma) or a #define string. @@ -584,19 +584,19 @@ if(headrevs.len) var/list/headrev_part = list() - headrev_part += "The head revolutionaries were:" + headrev_part += span_header("The head revolutionaries were:") headrev_part += printplayerlist(headrevs, !check_rev_victory()) result += headrev_part.Join("
") if(revs.len) var/list/rev_part = list() - rev_part += "The revolutionaries were:" + rev_part += span_header("The revolutionaries were:") rev_part += printplayerlist(revs, !check_rev_victory()) result += rev_part.Join("
") var/list/heads = SSjob.get_all_heads() if(heads.len) - var/head_text = "The heads of staff were:" + var/head_text = span_header("The heads of staff were:") head_text += "