diff --git a/.editorconfig b/.editorconfig index 471170c449ec3c..76242b39e596af 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,10 +1,13 @@ +# http://editorconfig.org +root = true + [*] indent_style = tab indent_size = 4 +end_of_line = lf charset = utf-8 trim_trailing_whitespace = true insert_final_newline = true -end_of_line = lf [*.yml] indent_style = space diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 0ef110cffd6c83..e678497f5e6178 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -45,6 +45,7 @@ /code/modules/preferences_menu.dm @Mothblocks /code/modules/preferences_savefile.dm @Mothblocks /tgui/packages/tgui/interfaces/PreferencesMenu/ @Mothblocks +/tools/screenshot-test-comparison/ @Mothblocks # MrMelbert diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index d6fee02b2e0b45..cb2c14bd64c2b8 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -191,3 +191,9 @@ Unless overridden or a non standard git binary is used the line ending settings Note: VSC requires an [extension](https://marketplace.visualstudio.com/items?itemName=EditorConfig.EditorConfig) to take advantage of editorconfig. Github actions that require additional configuration are disabled on the repository until ACTION_ENABLER secret is created with non-empty value. + +## Using the Maintainer Role Ping in Discord + +This role `@Maintainer` is pingable as a compromise reached with the server host MrStonedOne over the auto-stale system we presently have in the codebase. It should be used only to ping Maintainers when your PR has had the "Stale" label applied. Using it before then can be met with escalating timeouts and referral to /tg/station's Discord moderators for further infractions. + +Feel free to engage and obtain general feedback in the Coding General channel without the role ping before your PR goes stale to build interest and get reviews. diff --git a/.github/guides/STYLE.md b/.github/guides/STYLE.md index c0670159cd569d..ab4efa495c334a 100644 --- a/.github/guides/STYLE.md +++ b/.github/guides/STYLE.md @@ -5,7 +5,8 @@ This is the style you must follow when writing code. It's important to note that 2. [Paths and Inheritence](#paths-and-inheritence) 3. [Variables](#variables) 4. [Procs](#procs) -5. [Things that do not matter](#things-that-do-not-matter) +5. [Macros](#macros) +6. [Things that do not matter](#things-that-do-not-matter) ## General Guidelines @@ -399,6 +400,331 @@ turn_on(power_usage = 30) // Fine! set_invincible(FALSE) // Fine! Boolean parameters don't always need to be named. In this case, it is obvious what it means. ``` +## Macros + +Macros are, in essence, direct copy and pastes into the code. They are one of the few zero cost abstractions we have in DM, and you will see them often. Macros have strange syntax requirements, so if you see lots of backslashes and semicolons and braces that you wouldn't normally see, that is why. + +This section will assume you understand the following concepts: + +### Language - Hygienic +We say a macro is [**hygienic**](https://en.wikipedia.org/wiki/Hygienic_macro) if, generally, it does not rely on input not given to it directly through the call site, and does not affect the call site outside of it in a way that could not be easily reused somewhere else. + +An example of a non-hygienic macro is: + +```dm +#define GET_HEALTH(health_percent) ((##health_percent) * max_health) +``` + +In here, we rely on the external `max_health` value. + +Here are two examples of non-hygienic macros, because it affects its call site: + +```dm +#define DECLARE_MOTH(name) var/mob/living/moth/moth = new(##name) +#define RETURN_IF(condition) if (condition) { return; } +``` + +### Language - Side effects/Pure +We say something has [**side effects**](https://en.wikipedia.org/wiki/Side_effect_(computer_science)) if it mutates anything outside of itself. We say something is **pure** if it does not. + +For example, this has no side effects, and is pure: +```dm +#define MOTH_MAX_HEALTH 500 +``` + +This, however, performs a side effect of updating the health: +```dm +#define MOTH_SET_HEALTH(moth, new_health) ##moth.set_health(##new_health) +``` + +Now that you're caught up on the terms, let's get into the guidelines. + +### Naming +With little exception, macros should be SCREAMING_SNAKE_CASE. + +### Put macro segments inside parentheses where possible. +This will save you from bugs down the line with operator precedence. + +For example, the following macro: + +```dm +#define MINIMUM_TEMPERATURE_FOR_SUPERCONDUCTION T20C + 10 +``` + +...will break when order of operations comes into play: + +```dm +var/temperature = MINIMUM_TEMPERATURE_FOR_SUPERCONDUCTION * 50 + +// ...is preprocessed as... +var/temperature = T20C + 10 * 50 // Oh no! T20C + 500! +``` + +This is [a real bug that tends to come up](https://github.com/tgstation/tgstation/pull/37116), so to prevent it, we defensively wrap macro bodies with parentheses where possible. + +```dm +// Phew! +#define MINIMUM_TEMPERATURE_FOR_SUPERCONDUCTION (T20C + 10) +``` + +The same goes for arguments passed to a macro... + +``` +// Guarantee +#define CALCULATE_TEMPERATURE(base) (T20C + (##base)) +``` + +### Be hygienic where reasonably possible + +Consider the previously mentioned non-hygienic macro: + +```dm +#define GET_HEALTH(health_percent) ((##health_percent) * max_health) +``` + +This relies on "max_health", but it is not obviously clear what the source is. This will also become worse if we *do* want to change where we get the source from. This would be preferential as: + +```dm +#define GET_HEALTH(source, health_percent) ((##health_percent) * (##source).max_health) +``` + +When a macro can't be hygienic, such as in the case where a macro is preferred to do something like define a variable, it should still do its best to rely only on input given to it: + +```dm +#define DECLARE_MOTH(name) var/mob/living/moth/moth = new(##name) +``` + +...would ideally be written as... + +```dm +#define DECLARE_MOTH(var_name, name) var/mob/living/moth/##var_name = new(##name) +``` + +As usual, exceptions exist--for instance, accessing a global like a subsystem within a macro is generally acceptable. + +### Preserve hygiene using double underscores (`__`) and `do...while (FALSE)` + +Some macros will want to create variables for themselves, and not the consumer. For instance, consider this macro: + +```dm +#define HOW_LONG(proc_to_call) \ + var/current_time = world.time; \ + ##proc_to_call(); \ + world.log << "That took [world.time - current_time] deciseconds to complete."; +``` + +There are two problems here. + +One is that it is unhygienic. The `current_time` variable is leaking into the call site. + +The second is that this will create weird errors if `current_time` is a variable that already exists, for instance: + +```dm +var/current_time = world.time + +HOW_LONG(make_soup) // This will error! +``` + +If this seems unlikely to you, then also consider that this: + +```dm +HOW_LONG(make_soup) +HOW_LONG(eat_soup) +``` + +...will also error, since they are both declaring the same variable! + +There is a way to solve both of these, and it is through both the `do...while (FALSE)` pattern and by using `__` for variable names. + +This code would change to look like: + +```dm +#define HOW_LONG(proc_to_call) \ + do { \ + var/__current_time = world.time; \ + ##proc_to_call(); \ + world.log << "That took [world.time - current_time] deciseconds to complete."; \ + } while (FALSE) +``` + +The point of the `do...while (FALSE)` here is to **create another scope**. It is impossible for `__current_time` to be used outside of the define itself. If you haven't seen `do...while` syntax before, it is just saying "do this while the condition is true", and by passing `FALSE`, we ensure it will only run once. + +### Keep anything you use more than once in variables + +Remember that macros are just pastes. This means that, if you're not thinking, you can end up [creating some really weird macros by reusing variables](https://github.com/tgstation/tgstation/pull/55074). + +```dm +#define TEST_ASSERT_EQUAL(a, b) \ + if ((##a) != (##b)) { \ + return Fail("Expected [##a] to be equal to [##b]."); \ + } +``` + +This code may look benign, but consider the following code: + +```dm +/// Deal damage to the mob, and return their new health +/mob/living/proc/attack_mob(damage) + health -= damage + say("Ouch!") + return health + +// Later, in a test, assuming mobs start at 100 health +TEST_ASSERT_EQUAL(victim.attack_mob(20), 60) +``` + +We're only dealing 20 damage to the mob, so it'll have 80 health left. But the test will fail, and report `Expected 60 to be equal to 60.` + +Uh oh! That's because this compiled to: + +```dm +if ((victim.attack_mob(20)) != 60) + return Fail("Expected [victim.attack_mob(20)] to be equal to [60].") +``` + +It's running the proc twice! + +To fix this, we need to make sure the proc only runs once, by creating a variable for it, and using our `do...while (FALSE)` pattern we learned earlier. + +```dm +#define TEST_ASSERT_EQUAL(a, b) \ + do { \ + var/__a_value = ##a; + var/__b_value = ##b; + + if (__a_value != __b_value) { \ + return Fail("Expected [__a_value] to be equal to [__b_value]."); \ + } \ + } while (FALSE) +``` + +Now our code correctly reports `Expected 80 to be equal to 60`. + +### ...but if you must be unhygienic, try to restrict the scope. + +This guideline can make some code look extremely noisy if you are writing a large proc, or using the macro a large amount of times. + +In this case, if your macro is only used by one proc, define the macro in that proc, ideally after whatever variables it uses. + +```dm +/proc/some_complex_proc() + var/counter = 0 + + #define MY_NECESSARY_MACRO counter += 5; do_something(counter); + + // My complex code that uses MY_NECESSARY_MACRO here... + + #undef MY_NECESSARY_MACRO +``` + +### Don't perform work in an unsuspecting macro + +Suppose we have the following macro: + +```dm +#define PARTY_LIGHT_COLOR (pick(COLOR_BLUE, COLOR_RED, COLOR_GREEN)) +``` + +When this is used, it'll look like: + +```dm +set_color(PARTY_LIGHT_COLOR) +``` + +Because of how common using defines as constants is, this would seemingly imply the same thing! It does not look like any code should be executing at all. This code would preferably look like: + +```dm +set_color(PARTY_LIGHT_COLOR()) +``` + +...which *does* imply some work is happening. + +BYOND does not support `#define PARTY_LIGHT_COLOR()`, so instead we would write the define as: + +```dm +#define PARTY_LIGHT_COLOR(...) (pick(COLOR_BLUE, COLOR_RED, COLOR_GREEN)) +``` + +### `#undef` any macros you create, unless they are needed elsewhere + +We do not want macros to leak outside their file, this will create odd dependencies that are based on the filenames. Thus, you should `#undef` any macro you make. + +```dm +// Start of corn.dm +#define CORN_KERNELS 5 + +// All my brilliant corn code + +#undef CORN_KERNELS +``` + +It is often preferable for your `#define` and `#undef` to surround the code that actually uses them, for instance: + +```dm +/obj/item/corn + name = "yummy corn" + +#define CORN_HEALTH_GAIN 5 + +/obj/item/corn/proc/eat(mob/living/consumer) + consumer.health += CORN_HEALTH_GAIN // yum + +#undef CORN_HEALTH_GAIN + +// My other corn code +``` + +If you want other files to use macros, put them in somewhere such as a file in `__DEFINES`. That way, the files are included in a consistent order: + +```dm +#include "__DEFINES/my_defines.dm" // Will always be included first, because of the underscores +#include "game/my_object.dm" // This will be able to consistently use defines put in my_defines.dm +``` + +### Use `##` to help with ambiguities + +Especially with complex macros, it might not be immediately obvious what's part of the macro and what isn't. + +```dm +#define CALL_PROC_COMPLEX(source, proc_name) \ + if (source.is_ready()) { \ + source.proc_name(); \ + } +``` + +`source` and `proc_name` are both going to be directly pasted in, but they look just like any other normal code, and so it makes reading this macro a bit harder. + +Consider instead: + +```dm +#define CALL_PROC_COMPLEX(source, proc_name) \ + if (##source.is_ready()) { \ + ##source.##proc_name(); \ + } +``` + +`##` will paste in the define parameter directly, and makes it more clear what belongs to the macro. + +This is the most subjective of all the guidelines here, as it might just create visual noise in very simple macros, so use your best judgment. + +### For impure/unhygienic defines, use procs/normal code when reasonable + +Sometimes the best macro is one that doesn't exist at all. Macros can make some code fairly hard to maintain, due to their very weird syntax restrictions, and can be generally fairly mysterious, and hurt readability. Thus, if you don't have a strong reason to use a macro, consider just writing the code out normally or using a proc. + +```dm +#define SWORD_HIT(sword, victim) { /* Ugly backslashes! */ \ + ##sword.attack(##victim); /* Ugly semicolons! */ \ + ##victim.say("Ouch!"); /* Even ugly comments! */ \ +} +``` + +This is a fairly egregious macro, and would be better off just written like: +```dm +/obj/item/sword/proc/hit(mob/victim) + attack(victim) + victim.say("Ouch!") +``` + ## Things that do not matter The following coding styles are not only not enforced at all, but are generally frowned upon to change for little to no reason: diff --git a/.github/workflows/ci_suite.yml b/.github/workflows/ci_suite.yml index fee04d66517c1a..86baaafacbd097 100644 --- a/.github/workflows/ci_suite.yml +++ b/.github/workflows/ci_suite.yml @@ -14,12 +14,12 @@ jobs: steps: - uses: actions/checkout@v2 - name: Restore SpacemanDMM cache - uses: actions/cache@v2 + uses: actions/cache@v3 with: path: ~/SpacemanDMM key: ${{ runner.os }}-spacemandmm-${{ secrets.CACHE_PURGE_KEY }} - name: Restore Yarn cache - uses: actions/cache@v2 + uses: actions/cache@v3 with: path: tgui/.yarn/cache key: ${{ runner.os }}-yarn-${{ secrets.CACHE_PURGE_KEY }}-${{ hashFiles('tgui/yarn.lock') }} @@ -57,7 +57,7 @@ jobs: steps: - uses: actions/checkout@v2 - name: Restore BYOND cache - uses: actions/cache@v2 + uses: actions/cache@v3 with: path: ~/BYOND key: ${{ runner.os }}-byond-${{ secrets.CACHE_PURGE_KEY }} @@ -106,7 +106,7 @@ jobs: steps: - uses: actions/checkout@v2 - name: Restore BYOND cache - uses: actions/cache@v2 + uses: actions/cache@v3 with: path: ~/BYOND key: ${{ runner.os }}-byond-${{ secrets.CACHE_PURGE_KEY }} @@ -132,6 +132,48 @@ jobs: run: | source $HOME/BYOND/byond/bin/byondsetup bash tools/ci/run_server.sh ${{ matrix.map }} + - name: Upload screenshot tests + if: always() + uses: actions/upload-artifact@v3 + with: + name: test_artifacts_${{ matrix.map }} + path: data/screenshots_new/ + retention-days: 1 + + compare_screenshots: + if: "!contains(github.event.head_commit.message, '[ci skip]') && always()" + needs: [run_all_tests] + name: Compare Screenshot Tests + runs-on: ubuntu-20.04 + steps: + - uses: actions/checkout@v2 + # If we ever add more artifacts, this is going to break, but it'll be obvious. + - name: Download screenshot tests + uses: actions/download-artifact@v3 + with: + path: artifacts + - name: ls -R + run: ls -R artifacts + - name: Setup screenshot comparison + run: npm i + working-directory: tools/screenshot-test-comparison + - name: Run screenshot comparison + run: node tools/screenshot-test-comparison/index.js artifacts code/modules/unit_tests/screenshots artifacts/screenshot_comparisons + # workflow_run does not give you the PR it ran on, + # even through the thing literally named "matching pull requests". + # However, in GraphQL, you can check if the check suite was ran + # by a specific PR, so trusting the (user controlled) action here is okay, + # as long as we check it later in show_screenshot_test_results + - name: Save PR ID + if: failure() && github.event.pull_request + run: | + echo ${{ github.event.pull_request.number }} > artifacts/screenshot_comparisons/pull_request_number.txt + - name: Upload bad screenshots + if: failure() + uses: actions/upload-artifact@v3 + with: + name: bad-screenshots + path: artifacts/screenshot_comparisons test_windows: if: "!contains(github.event.head_commit.message, '[ci skip]')" @@ -140,7 +182,7 @@ jobs: steps: - uses: actions/checkout@v2 - name: Restore Yarn cache - uses: actions/cache@v2 + uses: actions/cache@v3 with: path: tgui/.yarn/cache key: ${{ runner.os }}-yarn-${{ secrets.CACHE_PURGE_KEY }}-${{ hashFiles('tgui/yarn.lock') }} diff --git a/.github/workflows/show_screenshot_test_results.yml b/.github/workflows/show_screenshot_test_results.yml new file mode 100644 index 00000000000000..3e9125510b7be3 --- /dev/null +++ b/.github/workflows/show_screenshot_test_results.yml @@ -0,0 +1,43 @@ +# This is a separate workflow so that it can access secrets, which are necessary +# because we need to be able to upload the images and post a comment. +# In the event this workflow fails, the screenshot test results are still +# available as an artifact of the screenshot test comparison workflow itself. +# This simply provides necessary quality of life. +name: Show Screenshot Test Results +on: + workflow_run: + workflows: [CI Suite] + types: + - completed +jobs: + show_screenshot_test_results: + if: "!contains(github.event.head_commit.message, '[ci skip]')" + name: Show Screenshot Test Results + runs-on: ubuntu-20.04 + steps: + - name: "Check for ARTIFACTS_FILE_HOUSE_KEY" + id: secrets_set + env: + ENABLER_SECRET: ${{ secrets.ARTIFACTS_FILE_HOUSE_KEY }} + run: | + unset SECRET_EXISTS + if [ -n "$ENABLER_SECRET" ]; then SECRET_EXISTS=true ; fi + echo "::set-output name=SECRETS_ENABLED::$SECRET_EXISTS" + - name: Checkout + if: steps.secrets_set.outputs.SECRETS_ENABLED + uses: actions/checkout@v3 + - name: Prepare module + if: steps.secrets_set.outputs.SECRETS_ENABLED + run: | + # This is needed because node-fetch needs import and doesn't work with require :/ + echo "{\"type\": \"module\"}" > package.json + npm install node-fetch + - name: Show screenshot test results + if: steps.secrets_set.outputs.SECRETS_ENABLED + uses: actions/github-script@v6 + env: + FILE_HOUSE_KEY: ${{ secrets.ARTIFACTS_FILE_HOUSE_KEY }} + with: + script: | + const { showScreenshotTestResults } = await import('${{ github.workspace }}/tools/ci/show_screenshot_test_results.js') + await showScreenshotTestResults({ github, context, exec }) diff --git a/.gitignore b/.gitignore index 44537f0a6b7a07..10cdcfb1349f0b 100644 --- a/.gitignore +++ b/.gitignore @@ -197,5 +197,8 @@ Temporary Items /tools/LinuxOneShot/TGS_Instances /tools/LinuxOneShot/TGS_Logs -# Autowiki -/tools/autowiki/node_modules +# JavaScript tools +**/node_modules + +# Screenshot tests +/artifacts diff --git a/.vscode/extensions.json b/.vscode/extensions.json index fa017edecf4288..79a1a64683a3b3 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -6,6 +6,7 @@ "dbaeumer.vscode-eslint", "stylemistake.auto-comment-blocks", "Donkie.vscode-tgstation-test-adapter", - "anturk.dmi-editor" + "anturk.dmi-editor", + "esbenp.prettier-vscode" ] } diff --git a/.vscode/settings.json b/.vscode/settings.json index 4fa80598987471..ef34e7edea3232 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,8 +1,7 @@ { "eslint.nodePath": "./tgui/.yarn/sdks", - "eslint.workingDirectories": [ - "./tgui" - ], + "eslint.workingDirectories": ["./tgui"], + "prettier.prettierPath": "./tgui/.yarn/sdks/prettier/index.js", "typescript.tsdk": "./tgui/.yarn/sdks/typescript/lib", "typescript.enablePromptUseWorkspaceTsdk": true, "search.exclude": { @@ -17,12 +16,28 @@ "gitlens.advanced.blame.customArguments": ["-w"], "tgstationTestExplorer.project.resultsType": "json", "[javascript]": { - "editor.rulers": [80] + "editor.rulers": [80], + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true + }, + "[javascriptreact]": { + "editor.rulers": [80], + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true }, "[typescript]": { - "editor.rulers": [80] + "editor.rulers": [80], + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true + }, + "[typescriptreact]": { + "editor.rulers": [80], + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true }, "[scss]": { - "editor.rulers": [80] + "editor.rulers": [80], + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true } } diff --git a/_maps/RandomRuins/IceRuins/icemoon_surface_bughabitat.dmm b/_maps/RandomRuins/IceRuins/icemoon_surface_bughabitat.dmm index 10bfe7e86f13a0..631e90c97207f7 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_surface_bughabitat.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_surface_bughabitat.dmm @@ -1,7 +1,7 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "as" = ( /obj/machinery/door/airlock/public, -/turf/closed/mineral/random/snow, +/turf/open/misc/snow, /area/icemoon/surface/outdoors/nospawn) "ax" = ( /obj/effect/turf_decal/stripes/white/line{ diff --git a/_maps/RandomRuins/IceRuins/icemoon_surface_engioutpost.dmm b/_maps/RandomRuins/IceRuins/icemoon_surface_engioutpost.dmm index efde996d5b3f20..8d7dba274e08a6 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_surface_engioutpost.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_surface_engioutpost.dmm @@ -548,14 +548,8 @@ /obj/item/mod/control/pre_equipped/engineering, /obj/effect/decal/cleanable/blood/old, /obj/structure/cable, -/turf/open/floor/iron{ - icon_state = "damaged3" - }, -/area/ruin/planetengi) -"cM" = ( -/turf/open/floor/iron{ - icon_state = "damaged2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron, /area/ruin/planetengi) "cN" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, @@ -609,9 +603,8 @@ /turf/open/floor/iron, /area/ruin/planetengi) "cW" = ( -/turf/open/floor/iron{ - icon_state = "damaged1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron, /area/ruin/planetengi) "cX" = ( /obj/structure/cable, @@ -623,9 +616,8 @@ "cY" = ( /obj/item/stack/sheet/plasmarglass, /obj/item/card/id/advanced/engioutpost, -/turf/open/floor/iron{ - icon_state = "damaged4" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron, /area/ruin/planetengi) "cZ" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ @@ -677,9 +669,8 @@ /area/ruin/planetengi) "dk" = ( /obj/effect/turf_decal/trimline/yellow/filled/line, -/turf/open/floor/iron{ - icon_state = "damaged5" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron, /area/ruin/planetengi) "dl" = ( /obj/effect/mob_spawn/corpse/human/engineer/mod, @@ -1149,7 +1140,7 @@ bH bZ cj bB -cM +cW cY dj cG diff --git a/_maps/RandomRuins/IceRuins/icemoon_surface_pizza.dmm b/_maps/RandomRuins/IceRuins/icemoon_surface_pizza.dmm index 90e43fe3044169..f25618b81a7040 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_surface_pizza.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_surface_pizza.dmm @@ -990,9 +990,7 @@ }, /obj/effect/turf_decal/tile/neutral, /obj/machinery/light/warm/directional/north, -/obj/structure/sign/departments/restroom{ - pixel_y = 32 - }, +/obj/structure/sign/departments/restroom/directional/north, /turf/open/floor/iron/dark/side{ dir = 5 }, diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_homestead.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_homestead.dmm index 8049227634a2b8..99d821da9ef362 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_homestead.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_homestead.dmm @@ -36,8 +36,8 @@ /area/icemoon/underground/explored) "hM" = ( /obj/structure/barricade/wooden/crude/snow, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood{ - icon_state = "wood-broken7"; initial_gas_mix = "ICEMOON_ATMOS" }, /area/ruin/powered/shuttle) @@ -108,8 +108,8 @@ /area/ruin/powered/shuttle) "uA" = ( /obj/structure/barricade/wooden/snowed, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood{ - icon_state = "wood-broken6"; initial_gas_mix = "ICEMOON_ATMOS" }, /area/ruin/powered/shuttle) @@ -252,13 +252,6 @@ initial_gas_mix = "ICEMOON_ATMOS" }, /area/ruin/powered/shuttle) -"Hy" = ( -/obj/structure/barricade/wooden/crude/snow, -/turf/open/floor/wood{ - icon_state = "wood-broken"; - initial_gas_mix = "ICEMOON_ATMOS" - }, -/area/ruin/powered/shuttle) "HF" = ( /obj/effect/decal/cleanable/blood/gibs, /obj/effect/decal/cleanable/blood/innards, @@ -361,20 +354,6 @@ /obj/machinery/hydroponics/soil, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/icemoon/underground/explored) -"Ux" = ( -/obj/structure/barricade/wooden/snowed, -/turf/open/floor/wood{ - icon_state = "wood-broken3"; - initial_gas_mix = "ICEMOON_ATMOS" - }, -/area/ruin/powered/shuttle) -"Vf" = ( -/obj/structure/barricade/wooden/snowed, -/turf/open/floor/wood{ - icon_state = "wood-broken"; - initial_gas_mix = "ICEMOON_ATMOS" - }, -/area/ruin/powered/shuttle) "VV" = ( /obj/structure/bonfire, /turf/open/misc/asteroid/snow/icemoon, @@ -474,7 +453,7 @@ Sv Sv qd Ht -Vf +uA El zT ol @@ -567,7 +546,7 @@ Sv sF sF sF -Hy +hM wN Zg ng @@ -616,7 +595,7 @@ Ht ol ol ol -Ux +uA ol ol ol diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_library.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_library.dmm index 70a002aac68f78..fd05447fea4571 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_library.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_library.dmm @@ -74,13 +74,6 @@ initial_gas_mix = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) -"aq" = ( -/obj/structure/fluff/paper/stack, -/turf/open/floor/wood{ - icon_state = "wood-broken"; - initial_gas_mix = "ICEMOON_ATMOS" - }, -/area/ruin/unpowered/buried_library) "ar" = ( /turf/open/floor/cult, /area/ruin/unpowered/buried_library) @@ -115,12 +108,6 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating/icemoon, /area/ruin/unpowered/buried_library) -"aB" = ( -/turf/open/floor/wood{ - icon_state = "wood-broken6"; - initial_gas_mix = "ICEMOON_ATMOS" - }, -/area/ruin/unpowered/buried_library) "aC" = ( /obj/item/feather, /turf/open/misc/asteroid/snow/icemoon, @@ -276,8 +263,8 @@ /obj/structure/fluff/paper{ dir = 1 }, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood{ - icon_state = "wood-broken7"; initial_gas_mix = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) @@ -319,8 +306,8 @@ /area/ruin/unpowered/buried_library) "bk" = ( /obj/structure/fluff/paper/stack, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood{ - icon_state = "wood-broken4"; initial_gas_mix = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) @@ -364,26 +351,6 @@ /obj/item/stack/sheet/mineral/wood, /turf/closed/mineral/random/snow, /area/icemoon/underground/unexplored) -"bv" = ( -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/wood{ - icon_state = "wood-broken4"; - initial_gas_mix = "ICEMOON_ATMOS" - }, -/area/ruin/unpowered/buried_library) -"bw" = ( -/turf/open/floor/wood{ - icon_state = "wood-broken3"; - initial_gas_mix = "ICEMOON_ATMOS" - }, -/area/ruin/unpowered/buried_library) -"bx" = ( -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/wood{ - icon_state = "wood-broken5"; - initial_gas_mix = "ICEMOON_ATMOS" - }, -/area/ruin/unpowered/buried_library) "by" = ( /obj/structure/statue/bronze/marx, /turf/open/floor/carpet/black{ @@ -416,59 +383,17 @@ initial_gas_mix = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) -"bD" = ( -/turf/open/floor/wood{ - icon_state = "wood-broken5"; - initial_gas_mix = "ICEMOON_ATMOS" - }, -/area/ruin/unpowered/buried_library) -"bE" = ( -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/wood{ - icon_state = "wood-broken"; - initial_gas_mix = "ICEMOON_ATMOS" - }, -/area/ruin/unpowered/buried_library) -"bF" = ( -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/wood{ - icon_state = "wood-broken3"; - initial_gas_mix = "ICEMOON_ATMOS" - }, -/area/ruin/unpowered/buried_library) -"bG" = ( -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/wood{ - icon_state = "wood-broken6"; - initial_gas_mix = "ICEMOON_ATMOS" - }, -/area/ruin/unpowered/buried_library) -"bH" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/fluff/paper, -/turf/open/floor/wood{ - icon_state = "wood-broken4"; - initial_gas_mix = "ICEMOON_ATMOS" - }, -/area/ruin/unpowered/buried_library) "bI" = ( /obj/effect/decal/cleanable/dirt/dust, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood{ - icon_state = "wood-broken7"; - initial_gas_mix = "ICEMOON_ATMOS" - }, -/area/ruin/unpowered/buried_library) -"bJ" = ( -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/wood{ - icon_state = "wood-broken2"; initial_gas_mix = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) "bK" = ( /obj/item/stack/sheet/mineral/wood, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood{ - icon_state = "wood-broken5"; initial_gas_mix = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) @@ -476,8 +401,8 @@ /obj/structure/fluff/paper{ dir = 10 }, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood{ - icon_state = "wood-broken3"; initial_gas_mix = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) @@ -485,29 +410,29 @@ /obj/structure/fluff/paper{ dir = 1 }, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood{ - icon_state = "wood-broken5"; initial_gas_mix = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) "bN" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/structure/fluff/paper, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood{ - icon_state = "wood-broken5"; initial_gas_mix = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) "bP" = ( /obj/item/paper/crumpled/bloody/fluff/stations/lavaland/library/warning, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood{ - icon_state = "wood-broken3"; initial_gas_mix = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) "bQ" = ( +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood{ - icon_state = "wood-broken7"; initial_gas_mix = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) @@ -629,7 +554,7 @@ ak av bg ah -bH +bN ah ak ac @@ -672,12 +597,12 @@ ac ak au ak -bx +bI aR -bE +bI aA ao -bw +bQ ah aZ ah @@ -702,7 +627,7 @@ aG aD aX an -bx +bI ae bI ah @@ -729,7 +654,7 @@ aD bB ak ae -bJ +bI ae bI ac @@ -777,7 +702,7 @@ an aD aD by -bG +bI aw ao ae @@ -794,7 +719,7 @@ ab aI ar al -aq +bk aE af aD @@ -819,11 +744,11 @@ am aJ aW ay -aB +bQ ah ao ae -bv +bI ae af an @@ -875,7 +800,7 @@ aL ah aA ah -bF +bI ah ak ak @@ -896,7 +821,7 @@ al al bd ah -bv +bI ah ao aV @@ -921,9 +846,9 @@ ad ac be bf -bw +bQ aP -bD +bQ aR ae an diff --git a/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm b/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm index 61d13b3100274f..051605ad5e8db9 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm @@ -143,9 +143,8 @@ /obj/structure/girder{ damage_deflection = 22 }, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/ruin/powered/beach) "cm" = ( /obj/structure/fluff/beach_umbrella/engine, @@ -192,9 +191,7 @@ /turf/open/floor/wood, /area/ruin/powered/beach) "dj" = ( -/obj/structure/sign/warning/gas_mask{ - pixel_y = 32 - }, +/obj/structure/sign/warning/gas_mask/directional/north, /turf/open/misc/beach/sand, /area/ruin/powered/beach) "ek" = ( @@ -405,9 +402,7 @@ /turf/closed/wall/mineral/sandstone, /area/ruin/powered/beach) "lT" = ( -/obj/structure/sign/warning/gas_mask{ - pixel_y = 32 - }, +/obj/structure/sign/warning/gas_mask/directional/north, /turf/open/floor/plating, /area/ruin/powered/beach) "me" = ( @@ -470,9 +465,7 @@ /area/ruin/powered/beach) "pE" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, -/obj/structure/sign/warning/gas_mask{ - pixel_x = -32 - }, +/obj/structure/sign/warning/gas_mask/directional/west, /turf/open/floor/plating, /area/ruin/powered/beach) "pS" = ( @@ -713,9 +706,8 @@ "yk" = ( /obj/machinery/light/small/directional/east, /obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/ruin/powered/beach) "yN" = ( /obj/machinery/vending/dinnerware, @@ -844,9 +836,7 @@ /turf/open/misc/beach/sand, /area/ruin/powered/beach) "Cq" = ( -/obj/structure/sign/departments/restroom{ - pixel_x = 32 - }, +/obj/structure/sign/departments/restroom/directional/east, /turf/open/floor/wood, /area/ruin/powered/beach) "Cs" = ( @@ -1004,9 +994,8 @@ /obj/item/toy/beach_ball/holoball/dodgeball, /obj/item/toy/beach_ball/holoball/dodgeball, /obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/ruin/powered/beach) "Hn" = ( /obj/machinery/light/directional/south, @@ -1139,9 +1128,7 @@ /area/ruin/powered/beach) "Mb" = ( /obj/effect/turf_decal/sand, -/obj/structure/sign/warning/no_smoking/circle{ - pixel_x = 32 - }, +/obj/structure/sign/warning/no_smoking/circle/directional/east, /turf/open/misc/beach/sand, /area/ruin/powered/beach) "Md" = ( @@ -1235,9 +1222,7 @@ /area/ruin/powered/beach) "Qf" = ( /obj/effect/turf_decal/sand, -/obj/structure/sign/departments/botany{ - pixel_y = -32 - }, +/obj/structure/sign/departments/botany/directional/south, /turf/open/misc/beach/sand, /area/ruin/powered/beach) "Qx" = ( @@ -1379,9 +1364,8 @@ /turf/open/floor/sepia, /area/ruin/powered/beach) "Ui" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/ruin/powered/beach) "Uk" = ( /obj/structure/sign/barsign, @@ -1400,9 +1384,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/ruin/powered/beach) "Vl" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, @@ -1436,11 +1419,6 @@ "VO" = ( /turf/open/floor/pod/dark, /area/ruin/powered/beach) -"Wa" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, -/area/ruin/powered/beach) "Wd" = ( /obj/structure/table/wood, /obj/item/reagent_containers/pill/happy, @@ -1640,7 +1618,7 @@ aj aj aj as -Wa +Ui as pE mh diff --git a/_maps/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm b/_maps/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm index a22f8e4e9e7a06..19dae9592bfeb0 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm @@ -704,6 +704,7 @@ /area/ruin/powered/clownplanet) "Or" = ( /obj/machinery/light/directional/east, +/obj/effect/mapping_helpers/no_lava, /turf/open/misc/asteroid/basalt/lava_land_surface, /area/ruin/powered/clownplanet) "QT" = ( @@ -1779,7 +1780,7 @@ cc cc Zg QT -QT +gX QT QT gX @@ -1813,7 +1814,7 @@ aa aa aa QT -gX +QT QT QT QT diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_envy.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_envy.dmm index cfabd8b950e7b1..e7afbb5e3a1fd2 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_envy.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_envy.dmm @@ -21,9 +21,8 @@ /obj/structure/mirror/directional/east{ icon_state = "mirror_broke" }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/ruin/unpowered) "g" = ( /obj/effect/decal/cleanable/blood/tracks, @@ -59,15 +58,13 @@ /turf/open/floor/plating, /area/ruin/unpowered) "n" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/ruin/unpowered) "o" = ( /obj/structure/mirror/directional/west, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/ruin/unpowered) "p" = ( /obj/machinery/door/airlock/hatch, diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_gluttony.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_gluttony.dmm index 5111ae46435b7e..04325fd6eb37b5 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_gluttony.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_gluttony.dmm @@ -6,7 +6,7 @@ }, /obj/structure/stone_tile/surrounding/cracked, /obj/effect/mob_spawn/corpse/human/skeleton, -/turf/open/lava/smooth/lava_land_surface, +/turf/open/indestructible/necropolis, /area/lavaland/surface/outdoors) "aO" = ( /obj/structure/stone_tile/surrounding_tile/burnt{ @@ -95,7 +95,7 @@ /obj/structure/stone_tile/surrounding_tile/cracked{ dir = 8 }, -/turf/open/lava/smooth/lava_land_surface, +/turf/open/indestructible/necropolis, /area/lavaland/surface/outdoors) "hV" = ( /obj/structure/stone_tile/center/burnt, @@ -108,7 +108,7 @@ /obj/structure/stone_tile/surrounding_tile/burnt{ dir = 8 }, -/turf/open/lava/smooth/lava_land_surface, +/turf/open/misc/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) "ie" = ( /obj/item/veilrender/vealrender, @@ -130,7 +130,7 @@ /obj/structure/stone_tile/surrounding_tile/cracked{ dir = 1 }, -/turf/open/lava/smooth/lava_land_surface, +/turf/open/misc/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) "jM" = ( /turf/closed/indestructible/necropolis, @@ -182,7 +182,7 @@ /obj/structure/stone_tile/surrounding/cracked{ dir = 1 }, -/turf/open/lava/smooth/lava_land_surface, +/turf/open/misc/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) "nT" = ( /turf/closed/indestructible/riveted/boss, @@ -226,6 +226,9 @@ /obj/structure/stone_tile/block/burnt, /turf/open/indestructible/necropolis, /area/ruin/powered/gluttony) +"rv" = ( +/turf/open/indestructible/necropolis, +/area/lavaland/surface/outdoors) "vU" = ( /obj/structure/stone_tile/surrounding_tile/burnt{ dir = 1 @@ -268,7 +271,7 @@ /obj/structure/stone_tile/block/burnt{ dir = 4 }, -/turf/open/lava/smooth/lava_land_surface, +/turf/open/misc/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) "zr" = ( /obj/structure/stone_tile/block/burnt{ @@ -304,6 +307,12 @@ /obj/effect/decal/cleanable/blood/gibs/torso, /turf/open/indestructible/necropolis, /area/ruin/powered/gluttony) +"CR" = ( +/obj/structure/stone_tile/block/burnt{ + dir = 4 + }, +/turf/open/indestructible/necropolis, +/area/lavaland/surface/outdoors) "CU" = ( /obj/effect/gluttony, /obj/structure/stone_tile/slab/cracked, @@ -311,7 +320,7 @@ /area/ruin/powered/gluttony) "DB" = ( /obj/structure/stone_tile/slab/burnt, -/turf/open/lava/smooth/lava_land_surface, +/turf/open/indestructible/necropolis, /area/lavaland/surface/outdoors) "DH" = ( /obj/structure/headpike/bone, @@ -322,7 +331,7 @@ /obj/structure/stone_tile/surrounding/cracked{ dir = 6 }, -/turf/open/lava/smooth/lava_land_surface, +/turf/open/indestructible/necropolis, /area/lavaland/surface/outdoors) "Eq" = ( /obj/structure/stone_tile/surrounding_tile/burnt, @@ -341,7 +350,7 @@ /obj/structure/stone_tile/surrounding_tile/cracked{ dir = 1 }, -/turf/open/lava/smooth/lava_land_surface, +/turf/open/indestructible/necropolis, /area/lavaland/surface/outdoors) "Fi" = ( /obj/effect/decal/cleanable/blood/gibs/down, @@ -394,7 +403,7 @@ /obj/structure/stone_tile/block/burnt{ dir = 8 }, -/turf/open/lava/smooth/lava_land_surface, +/turf/open/misc/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) "Ol" = ( /obj/effect/decal/cleanable/blood/footprints{ @@ -676,7 +685,7 @@ ls ls eN vU -MH +rv MH MH DH @@ -725,7 +734,7 @@ Ck Eq Sr fY -zd +CR zd nM Zu diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_pride.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_pride.dmm index ea5fc6a1031217..6ed4b294d41767 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_pride.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_pride.dmm @@ -9,13 +9,16 @@ /obj/structure/stone_tile/block/burnt{ dir = 8 }, -/turf/open/lava/smooth, +/turf/open/lava/smooth/weak, /area/ruin/powered/pride) "i" = ( /obj/structure/mirror/directional/east, -/turf/open/lava/smooth, +/turf/open/lava/smooth/weak, /area/ruin/powered/pride) "j" = ( +/obj/structure/mirror/magic/pride{ + pixel_y = -6 + }, /turf/closed/wall/mineral/silver, /area/ruin/powered/pride) "k" = ( @@ -34,7 +37,7 @@ "q" = ( /obj/structure/mirror/directional/east, /obj/structure/stone_tile/surrounding_tile, -/turf/open/lava/smooth, +/turf/open/lava/smooth/weak, /area/ruin/powered/pride) "r" = ( /turf/open/floor/mineral/silver, @@ -48,32 +51,23 @@ /obj/structure/stone_tile/surrounding_tile{ dir = 8 }, -/turf/open/lava/smooth, +/turf/open/lava/smooth/weak, /area/ruin/powered/pride) "u" = ( /obj/structure/stone_tile/block/burnt{ dir = 4 }, -/turf/open/lava/smooth, +/turf/open/lava/smooth/weak, /area/ruin/powered/pride) -"x" = ( -/obj/structure/stone_tile/burnt{ - dir = 4 - }, -/obj/structure/stone_tile{ - dir = 8 - }, -/turf/open/lava/smooth/lava_land_surface, -/area/lavaland/surface/outdoors) "y" = ( /obj/structure/stone_tile/center, /obj/structure/stone_tile/surrounding, -/turf/open/lava/smooth, +/turf/open/lava/smooth/weak, /area/ruin/powered/pride) "z" = ( /obj/structure/stone_tile/center, /obj/structure/stone_tile/surrounding/burnt, -/turf/open/lava/smooth, +/turf/open/lava/smooth/weak, /area/ruin/powered/pride) "B" = ( /obj/structure/stone_tile/center, @@ -84,24 +78,11 @@ /obj/structure/stone_tile/surrounding_tile{ dir = 8 }, -/turf/open/lava/smooth, +/turf/open/lava/smooth/weak, /area/ruin/powered/pride) "G" = ( /turf/closed/wall/mineral/cult, /area/ruin/powered/pride) -"H" = ( -/obj/structure/mirror/magic/pride{ - pixel_y = 26 - }, -/turf/open/floor/mineral/silver, -/area/ruin/powered/pride) -"J" = ( -/obj/structure/stone_tile{ - dir = 1 - }, -/obj/structure/stone_tile, -/turf/open/lava/smooth/lava_land_surface, -/area/lavaland/surface/outdoors) "K" = ( /obj/structure/mirror/directional/east, /obj/structure/stone_tile/center, @@ -112,20 +93,20 @@ /obj/structure/stone_tile/surrounding_tile{ dir = 8 }, -/turf/open/lava/smooth, +/turf/open/lava/smooth/weak, /area/ruin/powered/pride) "N" = ( /obj/structure/stone_tile/center, /obj/structure/stone_tile/surrounding/burnt, /obj/machinery/door/airlock/cult/unruned/friendly, -/turf/open/lava/smooth, +/turf/open/lava/smooth/weak, /area/ruin/powered/pride) "O" = ( /obj/structure/mirror/directional/west, /obj/structure/stone_tile/surrounding_tile{ dir = 8 }, -/turf/open/lava/smooth, +/turf/open/lava/smooth/weak, /area/ruin/powered/pride) "R" = ( /obj/structure/mirror/directional/west, @@ -137,7 +118,7 @@ dir = 8 }, /obj/structure/stone_tile/surrounding_tile, -/turf/open/lava/smooth, +/turf/open/lava/smooth/weak, /area/ruin/powered/pride) "S" = ( /obj/structure/stone_tile/block, @@ -147,17 +128,17 @@ /obj/structure/stone_tile/surrounding_tile{ dir = 1 }, -/turf/open/lava/smooth, +/turf/open/lava/smooth/weak, /area/ruin/powered/pride) "U" = ( /obj/structure/stone_tile/block{ dir = 8 }, -/turf/open/lava/smooth, +/turf/open/lava/smooth/weak, /area/ruin/powered/pride) "X" = ( /obj/structure/mirror/directional/west, -/turf/open/lava/smooth, +/turf/open/lava/smooth/weak, /area/ruin/powered/pride) "Y" = ( /turf/closed/indestructible/riveted/boss, @@ -166,7 +147,7 @@ /obj/structure/stone_tile/block{ dir = 4 }, -/turf/open/lava/smooth, +/turf/open/lava/smooth/weak, /area/ruin/powered/pride) (1,1,1) = {" @@ -208,7 +189,7 @@ X X X G -x +c a "} (4,1,1) = {" @@ -230,7 +211,7 @@ c c G j -H +r S y z @@ -264,7 +245,7 @@ i i i Y -J +c a "} (8,1,1) = {" diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm index 5046c068a3d973..5ad4ded8b41606 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm @@ -943,19 +943,13 @@ /turf/open/floor/plating, /area/ruin/syndicate_lava_base/cargo) "gf" = ( -/obj/structure/sign/warning/vacuum{ - pixel_y = -32 - }, +/obj/structure/sign/warning/vacuum/directional/south, /obj/machinery/light/small/directional/south, /turf/open/floor/plating, /area/ruin/syndicate_lava_base/cargo) "gg" = ( -/obj/structure/sign/warning/fire{ - pixel_y = 32 - }, -/obj/structure/sign/warning/xeno_mining{ - pixel_y = -32 - }, +/obj/structure/sign/warning/fire/directional/north, +/obj/structure/sign/warning/xeno_mining/directional/south, /turf/open/floor/plating, /area/ruin/syndicate_lava_base/cargo) "gh" = ( @@ -1219,9 +1213,7 @@ /area/ruin/syndicate_lava_base/virology) "hv" = ( /obj/machinery/disposal/bin, -/obj/structure/sign/warning/deathsposal{ - pixel_x = 32 - }, +/obj/structure/sign/warning/deathsposal/directional/east, /obj/effect/turf_decal/stripes/red/box, /obj/structure/disposalpipe/trunk{ dir = 1 @@ -1307,9 +1299,7 @@ /turf/open/floor/plating, /area/ruin/syndicate_lava_base/virology) "hI" = ( -/obj/structure/sign/warning/vacuum{ - pixel_x = -32 - }, +/obj/structure/sign/warning/vacuum/directional/west, /turf/open/floor/plating, /area/ruin/syndicate_lava_base/main) "hJ" = ( @@ -1318,9 +1308,7 @@ /area/ruin/syndicate_lava_base/main) "hK" = ( /obj/machinery/light/small/directional/east, -/obj/structure/sign/warning/fire{ - pixel_x = 32 - }, +/obj/structure/sign/warning/fire/directional/east, /obj/structure/closet/emcloset/anchored, /obj/item/tank/internals/emergency_oxygen/engi, /obj/item/flashlight/seclite, @@ -1905,9 +1893,7 @@ dir = 8 }, /obj/machinery/power/smes/engineering, -/obj/structure/sign/warning/electric_shock{ - pixel_x = -32 - }, +/obj/structure/sign/warning/electric_shock/directional/west, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -1963,9 +1949,8 @@ pixel_x = -6; pixel_y = 6 }, -/turf/open/floor/wood{ - icon_state = "wood-broken4" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/ruin/syndicate_lava_base/bar) "lk" = ( /obj/structure/table/wood, @@ -2171,9 +2156,7 @@ /turf/closed/wall/mineral/plastitanium/explosive, /area/ruin/syndicate_lava_base/arrivals) "mq" = ( -/obj/structure/sign/warning/vacuum{ - pixel_x = -32 - }, +/obj/structure/sign/warning/vacuum/directional/west, /turf/open/floor/plating, /area/ruin/syndicate_lava_base/arrivals) "mr" = ( @@ -2181,9 +2164,7 @@ /area/ruin/syndicate_lava_base/arrivals) "ms" = ( /obj/machinery/light/small/directional/east, -/obj/structure/sign/warning/fire{ - pixel_x = 32 - }, +/obj/structure/sign/warning/fire/directional/east, /obj/structure/closet/emcloset/anchored, /obj/item/tank/internals/emergency_oxygen/engi, /obj/item/flashlight/seclite, @@ -2474,9 +2455,7 @@ /turf/open/floor/iron/white, /area/ruin/syndicate_lava_base/medbay) "ou" = ( -/obj/structure/sign/warning/explosives/alt{ - pixel_x = 32 - }, +/obj/structure/sign/warning/explosives/alt/directional/east, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/structure/cable, /turf/open/floor/circuit/red, @@ -2512,12 +2491,8 @@ /turf/open/floor/engine/vacuum, /area/ruin/syndicate_lava_base/engineering) "oD" = ( -/obj/structure/sign/warning/xeno_mining{ - pixel_x = -32 - }, -/obj/structure/sign/warning/fire{ - pixel_x = 32 - }, +/obj/structure/sign/warning/xeno_mining/directional/west, +/obj/structure/sign/warning/fire/directional/east, /turf/open/floor/plating, /area/ruin/syndicate_lava_base/arrivals) "oF" = ( @@ -2529,9 +2504,7 @@ /turf/open/floor/engine/vacuum, /area/ruin/syndicate_lava_base/engineering) "oI" = ( -/obj/structure/sign/warning/vacuum{ - pixel_x = -32 - }, +/obj/structure/sign/warning/vacuum/directional/west, /obj/machinery/light/small/directional/west, /turf/open/floor/plating, /area/ruin/syndicate_lava_base/arrivals) @@ -4722,9 +4695,7 @@ "ZG" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/structure/sign/warning/radiation/rad_area{ - pixel_y = -32 - }, +/obj/structure/sign/warning/radiation/rad_area/directional/south, /obj/effect/turf_decal/stripes, /obj/structure/closet/radiation, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/mistake_feasible.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/mistake_feasible.dmm index f9e58d789099b0..c7c8a0ec1a97ae 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/mistake_feasible.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/mistake_feasible.dmm @@ -77,9 +77,7 @@ /turf/open/floor/plating, /area/ruin/syndicate_lava_base/testlab) "n" = ( -/obj/structure/sign/warning/explosives/alt{ - pixel_x = -32 - }, +/obj/structure/sign/warning/explosives/alt/directional/west, /turf/open/floor/engine, /area/ruin/syndicate_lava_base/testlab) "p" = ( @@ -236,9 +234,7 @@ /turf/open/floor/plating, /area/ruin/syndicate_lava_base/testlab) "P" = ( -/obj/structure/sign/warning/explosives/alt{ - pixel_x = 32 - }, +/obj/structure/sign/warning/explosives/alt/directional/east, /turf/open/floor/engine, /area/ruin/syndicate_lava_base/testlab) "R" = ( diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/mistake_inevitable.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/mistake_inevitable.dmm index 0d49990e549222..99bd3adaa9fa74 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/mistake_inevitable.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/mistake_inevitable.dmm @@ -28,9 +28,7 @@ /turf/open/floor/engine, /area/ruin/syndicate_lava_base/testlab) "dO" = ( -/obj/structure/sign/warning/explosives/alt{ - pixel_x = -32 - }, +/obj/structure/sign/warning/explosives/alt/directional/west, /obj/machinery/atmospherics/components/tank/nitrogen{ dir = 4; initialize_directions = 4 @@ -124,9 +122,7 @@ /turf/open/floor/plating, /area/ruin/syndicate_lava_base/testlab) "iQ" = ( -/obj/structure/sign/warning/explosives/alt{ - pixel_y = -32 - }, +/obj/structure/sign/warning/explosives/alt/directional/south, /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /turf/open/floor/engine, /area/ruin/syndicate_lava_base/testlab) diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/mistake_unlikely.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/mistake_unlikely.dmm index 0fcc9265705301..f838e4e9bb8128 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/mistake_unlikely.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/mistake_unlikely.dmm @@ -43,9 +43,7 @@ /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/testlab) "A" = ( -/obj/structure/sign/warning/explosives/alt{ - pixel_x = 32 - }, +/obj/structure/sign/warning/explosives/alt/directional/east, /obj/structure/closet/firecloset, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ dir = 8 diff --git a/_maps/RandomRuins/SpaceRuins/DJstation.dmm b/_maps/RandomRuins/SpaceRuins/DJstation.dmm index 35026f647e7557..483173c630e45d 100644 --- a/_maps/RandomRuins/SpaceRuins/DJstation.dmm +++ b/_maps/RandomRuins/SpaceRuins/DJstation.dmm @@ -145,9 +145,7 @@ /turf/template_noop, /area/template_noop) "V" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_y = -32 - }, +/obj/structure/sign/warning/vacuum/external/directional/south, /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/ruin/space/djstation/service) diff --git a/_maps/RandomRuins/SpaceRuins/DJstation/kitchen_1.dmm b/_maps/RandomRuins/SpaceRuins/DJstation/kitchen_1.dmm index 6e5babb7e6f822..439cabfcc067b4 100644 --- a/_maps/RandomRuins/SpaceRuins/DJstation/kitchen_1.dmm +++ b/_maps/RandomRuins/SpaceRuins/DJstation/kitchen_1.dmm @@ -59,9 +59,8 @@ /obj/structure/disposalpipe/trunk{ dir = 4 }, -/turf/open/floor/plating/airless{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating/airless, /area/ruin/space/djstation) "D" = ( /obj/structure/disposalpipe/segment{ diff --git a/_maps/RandomRuins/SpaceRuins/DJstation/kitchen_2.dmm b/_maps/RandomRuins/SpaceRuins/DJstation/kitchen_2.dmm index 4d8b25ee4650ac..817b9651c6fee4 100644 --- a/_maps/RandomRuins/SpaceRuins/DJstation/kitchen_2.dmm +++ b/_maps/RandomRuins/SpaceRuins/DJstation/kitchen_2.dmm @@ -9,21 +9,14 @@ /area/space/nearstation) "h" = ( /obj/structure/girder, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" - }, -/area/ruin/space/djstation) -"k" = ( -/turf/open/floor/plating/airless{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/space/djstation) "o" = ( /obj/structure/table_frame, /obj/machinery/light/broken/directional/east, -/turf/open/floor/plating/airless{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating/airless, /area/ruin/space/djstation) "r" = ( /obj/structure/lattice, @@ -68,25 +61,18 @@ /obj/structure/barricade/wooden, /turf/template_noop, /area/template_noop) -"S" = ( -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" - }, -/area/ruin/space/djstation) "V" = ( /obj/structure/lattice, /turf/template_noop, /area/space/nearstation) "W" = ( -/turf/open/floor/plating/airless{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/space/djstation) "X" = ( /obj/structure/girder, -/turf/open/floor/plating/airless{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating/airless, /area/ruin/space/djstation) (1,1,1) = {" @@ -128,7 +114,7 @@ a (4,1,1) = {" a a -k +W V a V @@ -154,8 +140,8 @@ a a L o -k -S +W +W X a e diff --git a/_maps/RandomRuins/SpaceRuins/DJstation/kitchen_3.dmm b/_maps/RandomRuins/SpaceRuins/DJstation/kitchen_3.dmm index 054b32d2746bb8..ebd8d7a821185e 100644 --- a/_maps/RandomRuins/SpaceRuins/DJstation/kitchen_3.dmm +++ b/_maps/RandomRuins/SpaceRuins/DJstation/kitchen_3.dmm @@ -27,9 +27,8 @@ /obj/structure/disposaloutlet{ dir = 1 }, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/space/djstation) "F" = ( /obj/structure/disposalpipe/segment, diff --git a/_maps/RandomRuins/SpaceRuins/DJstation/quarters_4.dmm b/_maps/RandomRuins/SpaceRuins/DJstation/quarters_4.dmm index d32ccf93094f03..8e632403b36697 100644 --- a/_maps/RandomRuins/SpaceRuins/DJstation/quarters_4.dmm +++ b/_maps/RandomRuins/SpaceRuins/DJstation/quarters_4.dmm @@ -7,9 +7,8 @@ /area/ruin/space/djstation) "g" = ( /obj/structure/girder, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/space/djstation) "h" = ( /obj/structure/lattice, @@ -33,27 +32,20 @@ /area/template_noop) "q" = ( /obj/structure/girder, -/turf/open/floor/plating/airless{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating/airless, /area/ruin/space/djstation) "t" = ( /turf/open/floor/iron/freezer/airless, /area/ruin/space/djstation) -"w" = ( -/turf/open/floor/plating/airless{ - icon_state = "platingdmg2" - }, -/area/ruin/space/djstation) "x" = ( /obj/item/bedsheet/random, /turf/open/floor/plating/airless, /area/ruin/space/djstation) "A" = ( /obj/structure/bed, -/turf/open/floor/plating/airless{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating/airless, /area/ruin/space/djstation) "C" = ( /obj/structure/lattice, @@ -64,9 +56,8 @@ /turf/open/floor/plating/airless, /area/ruin/space/djstation) "J" = ( -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/space/djstation) "M" = ( /obj/structure/lattice, @@ -105,9 +96,8 @@ pixel_x = 4; pixel_y = -10 }, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/space/djstation) (1,1,1) = {" @@ -139,7 +129,7 @@ a U U U -w +J x g E diff --git a/_maps/RandomRuins/SpaceRuins/DJstation/solars_1.dmm b/_maps/RandomRuins/SpaceRuins/DJstation/solars_1.dmm index 2a37e6ca604438..98c3d08508a9a7 100644 --- a/_maps/RandomRuins/SpaceRuins/DJstation/solars_1.dmm +++ b/_maps/RandomRuins/SpaceRuins/DJstation/solars_1.dmm @@ -23,14 +23,12 @@ pixel_x = 3; pixel_y = 3 }, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/space/djstation/solars) "n" = ( -/turf/open/floor/plating/airless{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/space/djstation/solars) "t" = ( /obj/structure/lattice, @@ -64,9 +62,8 @@ pixel_x = -8; pixel_y = -3 }, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/space/djstation/solars) "O" = ( /obj/structure/lattice/catwalk, diff --git a/_maps/RandomRuins/SpaceRuins/TheDerelict.dmm b/_maps/RandomRuins/SpaceRuins/TheDerelict.dmm index 60ce7ffa4b80e8..04ae025ea73264 100644 --- a/_maps/RandomRuins/SpaceRuins/TheDerelict.dmm +++ b/_maps/RandomRuins/SpaceRuins/TheDerelict.dmm @@ -3,9 +3,8 @@ /turf/template_noop, /area/template_noop) "af" = ( -/turf/open/floor/plating/airless{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/solars/derelict_starboard) "al" = ( /obj/structure/table, @@ -225,24 +224,17 @@ /turf/open/floor/iron, /area/ruin/space/derelict/solar_control) "bs" = ( -/turf/open/floor/iron{ - icon_state = "damaged1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron, /area/ruin/space/derelict/solar_control) "bt" = ( /obj/machinery/door/window, /turf/open/floor/iron, /area/ruin/space/derelict/bridge/ai_upload) -"bu" = ( -/turf/open/floor/iron{ - icon_state = "damaged5" - }, -/area/ruin/space/derelict/solar_control) "bv" = ( /obj/item/stock_parts/matter_bin, -/turf/open/floor/iron{ - icon_state = "damaged4" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron, /area/ruin/space/derelict/solar_control) "bw" = ( /obj/structure/rack, @@ -261,32 +253,16 @@ "bz" = ( /turf/open/floor/iron/airless, /area/ruin/space/derelict/bridge/ai_upload) -"bB" = ( -/turf/open/floor/iron{ - icon_state = "damaged2" - }, -/area/ruin/space/derelict/solar_control) "bC" = ( /obj/item/stack/cable_coil/cut, -/turf/open/floor/iron{ - icon_state = "damaged3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron, /area/ruin/space/derelict/solar_control) "bD" = ( /obj/structure/rack, /obj/item/circuitboard/machine/cryo_tube, /turf/open/floor/iron, /area/ruin/space/derelict/bridge/ai_upload) -"bE" = ( -/turf/open/floor/iron/airless{ - icon_state = "damaged4" - }, -/area/ruin/space/derelict/bridge/ai_upload) -"bF" = ( -/turf/open/floor/iron/airless{ - icon_state = "damaged3" - }, -/area/ruin/space/derelict/bridge/ai_upload) "bG" = ( /obj/machinery/light/directional/north, /turf/open/floor/iron/airless, @@ -296,9 +272,8 @@ /turf/open/floor/iron/airless, /area/ruin/space/derelict/bridge/ai_upload) "bK" = ( -/turf/open/floor/iron/airless{ - icon_state = "damaged2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/derelict/bridge/ai_upload) "bO" = ( /turf/open/floor/plating/airless, @@ -367,22 +342,15 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/iron, /area/ruin/space/derelict/solar_control) -"co" = ( -/turf/open/floor/iron/airless{ - icon_state = "damaged2" - }, -/area/ruin/space/derelict/gravity_generator) "cp" = ( /obj/machinery/light/small/directional/north, -/turf/open/floor/iron/airless{ - icon_state = "damaged5" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/derelict/gravity_generator) "cq" = ( /obj/item/stock_parts/manipulator, -/turf/open/floor/iron/airless{ - icon_state = "damaged2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/derelict/gravity_generator) "cs" = ( /turf/closed/wall, @@ -393,20 +361,13 @@ /turf/open/floor/iron, /area/ruin/space/derelict/bridge/access) "cu" = ( -/turf/open/floor/iron/airless{ - icon_state = "damaged4" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/derelict/gravity_generator) "cv" = ( /obj/item/stack/ore/slag, -/turf/open/floor/iron/airless{ - icon_state = "damaged4" - }, -/area/ruin/space/derelict/gravity_generator) -"cw" = ( -/turf/open/floor/iron/airless{ - icon_state = "damaged5" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/derelict/gravity_generator) "cx" = ( /turf/open/floor/iron, @@ -442,14 +403,11 @@ /area/ruin/space/derelict/bridge/access) "cG" = ( /obj/item/screwdriver, -/turf/open/floor/iron/airless{ - icon_state = "damaged5" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/derelict/gravity_generator) "cH" = ( -/obj/machinery/gravity_generator/main/station{ - on = 0 - }, +/obj/machinery/gravity_generator/main, /turf/open/floor/iron/airless, /area/ruin/space/derelict/gravity_generator) "cM" = ( @@ -461,9 +419,8 @@ /area/ruin/space/derelict/gravity_generator) "cP" = ( /obj/item/stack/cable_coil/cut, -/turf/open/floor/iron/airless{ - icon_state = "damaged4" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/derelict/gravity_generator) "cQ" = ( /obj/machinery/power/apc/auto_name/directional/south, @@ -691,16 +648,6 @@ }, /turf/open/floor/iron, /area/ruin/space/derelict/bridge) -"dO" = ( -/turf/open/floor/iron/airless{ - icon_state = "damaged3" - }, -/area/ruin/space/derelict/singularity_engine) -"dP" = ( -/turf/open/floor/iron/airless{ - icon_state = "damaged4" - }, -/area/ruin/space/derelict/singularity_engine) "dR" = ( /obj/machinery/light/small/directional/north, /obj/item/stack/cable_coil/cut, @@ -713,11 +660,6 @@ "dW" = ( /turf/open/floor/plating/airless, /area/ruin/space/derelict/singularity_engine) -"dX" = ( -/turf/open/floor/iron/airless{ - icon_state = "damaged5" - }, -/area/ruin/space/derelict/singularity_engine) "dZ" = ( /obj/item/reagent_containers/food/drinks/bottle/beer, /turf/open/floor/iron, @@ -743,36 +685,20 @@ "ee" = ( /obj/structure/window/reinforced, /obj/machinery/portable_atmospherics/canister/plasma, -/turf/open/floor/iron/airless{ - icon_state = "damaged3" - }, -/area/ruin/space/derelict/singularity_engine) -"ef" = ( -/obj/structure/window/reinforced, -/turf/open/floor/iron/airless{ - icon_state = "damaged5" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/derelict/singularity_engine) "eh" = ( /obj/structure/window/reinforced, -/turf/open/floor/iron/airless{ - icon_state = "damaged4" - }, -/area/ruin/space/derelict/singularity_engine) -"ei" = ( -/obj/structure/window/reinforced, -/turf/open/floor/iron/airless{ - icon_state = "damaged3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/derelict/singularity_engine) "ej" = ( /turf/open/floor/iron, /area/ruin/space/derelict/gravity_generator) "ek" = ( /obj/structure/closet/radiation, -/obj/structure/sign/warning/radiation/rad_area{ - pixel_x = 32 - }, +/obj/structure/sign/warning/radiation/rad_area/directional/east, /turf/open/floor/iron, /area/ruin/space/derelict/gravity_generator) "el" = ( @@ -780,9 +706,8 @@ /area/ruin/space/derelict/gravity_generator) "em" = ( /obj/machinery/light/small/directional/west, -/turf/open/floor/iron/airless{ - icon_state = "damaged2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/derelict/singularity_engine) "en" = ( /obj/machinery/power/emitter{ @@ -829,9 +754,8 @@ /turf/closed/wall/r_wall, /area/ruin/space/derelict/singularity_engine) "ez" = ( -/turf/open/floor/iron/airless{ - icon_state = "damaged2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/derelict/singularity_engine) "eB" = ( /obj/machinery/door/window/left/directional/east{ @@ -859,15 +783,8 @@ /area/ruin/space/derelict/bridge) "eF" = ( /obj/item/storage/toolbox/syndicate, -/turf/open/floor/iron/airless{ - icon_state = "damaged2" - }, -/area/ruin/space/derelict/singularity_engine) -"eG" = ( -/obj/item/stack/cable_coil/cut, -/turf/open/floor/iron/airless{ - icon_state = "damaged4" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/derelict/singularity_engine) "eJ" = ( /obj/structure/window/reinforced{ @@ -882,9 +799,8 @@ /area/ruin/space/derelict/bridge) "eN" = ( /obj/item/paper/fluff/ruins/thederelict/nukie_objectives, -/turf/open/floor/iron/airless{ - icon_state = "damaged2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/derelict/singularity_engine) "eO" = ( /obj/structure/window/reinforced{ @@ -926,9 +842,8 @@ desc = "This guy seemed to have died in terrible way! Half his remains are dust."; name = "Syndicate agent remains" }, -/turf/open/floor/iron/airless{ - icon_state = "damaged2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/derelict/singularity_engine) "eY" = ( /obj/item/clothing/suit/space/eva, @@ -938,12 +853,6 @@ /obj/item/stack/rods, /turf/open/floor/plating/airless, /area/ruin/space/derelict/singularity_engine) -"fa" = ( -/obj/item/shard, -/turf/open/floor/iron/airless{ - icon_state = "damaged5" - }, -/area/ruin/space/derelict/singularity_engine) "fb" = ( /obj/structure/grille, /turf/open/floor/plating/airless, @@ -976,14 +885,6 @@ }, /turf/open/floor/iron, /area/ruin/space/derelict/bridge) -"fj" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/iron/airless{ - icon_state = "damaged2" - }, -/area/ruin/space/derelict/singularity_engine) "fk" = ( /obj/item/clothing/head/helmet/space/eva, /turf/open/floor/plating/airless, @@ -1031,9 +932,8 @@ dir = 8 }, /obj/machinery/light/small/directional/west, -/turf/open/floor/iron/airless{ - icon_state = "damaged2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/derelict/singularity_engine) "fs" = ( /obj/structure/window/reinforced{ @@ -1048,12 +948,6 @@ }, /turf/open/floor/plating/airless, /area/ruin/space/derelict/singularity_engine) -"fu" = ( -/obj/item/stack/cable_coil/cut, -/turf/open/floor/iron/airless{ - icon_state = "damaged5" - }, -/area/ruin/space/derelict/singularity_engine) "fw" = ( /obj/effect/mob_spawn/ghost_role/drone/derelict, /turf/open/floor/iron/airless, @@ -1101,25 +995,22 @@ /area/ruin/space/derelict/bridge/access) "fG" = ( /obj/item/stack/cable_coil/cut, -/turf/open/floor/iron/airless{ - icon_state = "damaged3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/derelict/singularity_engine) "fI" = ( /obj/effect/spawner/structure/window/hollow/reinforced/directional{ dir = 10 }, -/turf/open/floor/iron/airless{ - icon_state = "damaged2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/derelict/singularity_engine) "fJ" = ( /obj/structure/window/reinforced{ dir = 8 }, -/turf/open/floor/iron/airless{ - icon_state = "damaged3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/derelict/singularity_engine) "fK" = ( /obj/machinery/door/window, @@ -1132,27 +1023,10 @@ }, /turf/open/floor/plating/airless, /area/ruin/space/derelict/singularity_engine) -"fO" = ( -/obj/item/shard{ - icon_state = "medium" - }, -/turf/open/floor/iron/airless{ - icon_state = "damaged5" - }, -/area/ruin/space/derelict/singularity_engine) "fP" = ( /obj/structure/grille, -/turf/open/floor/iron/airless{ - icon_state = "damaged3" - }, -/area/ruin/space/derelict/singularity_engine) -"fQ" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/iron/airless{ - icon_state = "damaged4" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/derelict/singularity_engine) "fR" = ( /obj/machinery/door/airlock/maintenance{ @@ -1169,23 +1043,14 @@ /obj/structure/cable, /turf/open/floor/iron/airless, /area/ruin/space/derelict/bridge/access) -"fU" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/iron/airless{ - icon_state = "damaged3" - }, -/area/ruin/space/derelict/singularity_engine) "fV" = ( /obj/item/screwdriver, /turf/open/floor/plating/airless, /area/ruin/space/derelict/singularity_engine) "fW" = ( /obj/item/stack/rods, -/turf/open/floor/iron/airless{ - icon_state = "damaged2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/derelict/singularity_engine) "fX" = ( /obj/item/shard{ @@ -1197,17 +1062,10 @@ "fZ" = ( /turf/closed/wall, /area/ruin/space/derelict/hallway/primary) -"ga" = ( -/obj/item/stack/cable_coil/cut, -/turf/open/floor/iron/airless{ - icon_state = "damaged3" - }, -/area/ruin/space/derelict/hallway/primary) "gb" = ( /obj/structure/cable, -/turf/open/floor/iron/airless{ - icon_state = "damaged2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/derelict/hallway/primary) "gc" = ( /obj/structure/cable, @@ -1243,14 +1101,8 @@ /turf/open/floor/plating/airless, /area/ruin/space/derelict/hallway/primary) "gm" = ( -/turf/open/floor/iron/airless{ - icon_state = "damaged3" - }, -/area/ruin/space/derelict/hallway/primary) -"gn" = ( -/turf/open/floor/iron/airless{ - icon_state = "damaged2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/derelict/hallway/primary) "go" = ( /turf/open/floor/iron/airless, @@ -1266,9 +1118,8 @@ /obj/structure/window/reinforced{ dir = 4 }, -/turf/open/floor/iron/airless{ - icon_state = "damaged2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/derelict/singularity_engine) "gt" = ( /obj/effect/spawner/structure/window/hollow/reinforced/directional{ @@ -1285,24 +1136,17 @@ }, /turf/open/floor/plating/airless, /area/ruin/space/derelict/singularity_engine) -"gz" = ( -/turf/open/floor/iron/airless{ - icon_state = "floorscorched2" - }, -/area/ruin/space/derelict/hallway/primary) "gA" = ( /obj/machinery/light/small/directional/south, /turf/open/floor/iron/airless, /area/ruin/space/derelict/hallway/primary) "gC" = ( -/turf/open/floor/iron/airless{ - icon_state = "floorscorched2" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/iron/airless, /area/ruin/unpowered/no_grav) "gD" = ( -/turf/open/floor/iron/airless{ - icon_state = "damaged2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/unpowered/no_grav) "gE" = ( /obj/effect/spawner/structure/window/hollow/reinforced/middle{ @@ -1318,9 +1162,8 @@ /obj/item/shard{ icon_state = "medium" }, -/turf/open/floor/iron/airless{ - icon_state = "damaged2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/derelict/singularity_engine) "gJ" = ( /obj/structure/grille/broken, @@ -1328,9 +1171,8 @@ /area/ruin/space/derelict/singularity_engine) "gK" = ( /obj/machinery/light/small/directional/east, -/turf/open/floor/iron/airless{ - icon_state = "damaged3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/derelict/singularity_engine) "gL" = ( /turf/open/floor/plating/airless, @@ -1343,11 +1185,6 @@ /obj/structure/grille, /turf/open/floor/iron/airless, /area/ruin/space/derelict/hallway/primary) -"gP" = ( -/turf/open/floor/iron/airless{ - icon_state = "damaged3" - }, -/area/ruin/unpowered/no_grav) "gQ" = ( /obj/item/stock_parts/matter_bin, /obj/structure/lattice, @@ -1390,9 +1227,8 @@ /area/ruin/space/derelict/singularity_engine) "hb" = ( /obj/machinery/light/small/directional/south, -/turf/open/floor/iron/airless{ - icon_state = "damaged2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/derelict/hallway/primary) "hc" = ( /obj/structure/lattice, @@ -1440,22 +1276,19 @@ /area/ruin/space/derelict/medical/chapel) "ho" = ( /obj/item/shard, -/turf/open/floor/iron/airless{ - icon_state = "damaged2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/derelict/singularity_engine) "hp" = ( -/turf/open/floor/iron/airless{ - icon_state = "floorscorched2" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/iron/airless, /area/ruin/space/derelict/arrival) "hq" = ( /turf/open/floor/plating/airless, /area/ruin/space/derelict/arrival) "hr" = ( -/turf/open/floor/iron/airless{ - icon_state = "damaged3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/derelict/arrival) "ht" = ( /obj/machinery/light/small/directional/south, @@ -1501,11 +1334,6 @@ }, /turf/open/floor/plating/airless, /area/ruin/space/derelict/singularity_engine) -"hD" = ( -/turf/open/floor/iron/airless{ - icon_state = "damaged4" - }, -/area/ruin/space/derelict/hallway/primary) "hE" = ( /obj/machinery/door/window{ dir = 8 @@ -1541,9 +1369,8 @@ /area/ruin/space/derelict/medical) "hL" = ( /obj/structure/frame/computer, -/turf/open/floor/iron/airless{ - icon_state = "damaged3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/derelict/medical) "hM" = ( /obj/machinery/light/directional/north, @@ -1554,9 +1381,8 @@ /area/ruin/space/derelict/medical) "hN" = ( /obj/machinery/light/small/directional/south, -/turf/open/floor/iron/airless{ - icon_state = "damaged4" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/derelict/singularity_engine) "hP" = ( /turf/open/floor/plating, @@ -1588,14 +1414,8 @@ /turf/open/floor/iron/white/airless, /area/ruin/space/derelict/medical) "hX" = ( -/turf/open/floor/iron/airless{ - icon_state = "damaged2" - }, -/area/ruin/space/derelict/medical) -"hY" = ( -/turf/open/floor/iron/airless{ - icon_state = "damaged3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/derelict/medical) "hZ" = ( /obj/structure/window/reinforced{ @@ -1630,9 +1450,8 @@ /area/ruin/space/derelict/medical/chapel) "ik" = ( /obj/structure/chair, -/turf/open/floor/iron/airless{ - icon_state = "damaged3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/derelict/medical) "im" = ( /obj/item/storage/box/lights/mixed, @@ -1644,9 +1463,8 @@ /area/ruin/space/derelict/singularity_engine) "ip" = ( /obj/item/stack/cable_coil/cut, -/turf/open/floor/iron/airless{ - icon_state = "damaged2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/derelict/hallway/primary) "ir" = ( /obj/structure/chair{ @@ -1731,15 +1549,13 @@ /area/ruin/space/derelict/medical) "iM" = ( /obj/item/stack/medical/bruise_pack, -/turf/open/floor/iron/airless{ - icon_state = "damaged2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/derelict/medical) "iN" = ( /obj/item/stack/medical/ointment, -/turf/open/floor/iron/airless{ - icon_state = "damaged3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/derelict/medical) "iO" = ( /obj/machinery/light/directional/east, @@ -1819,17 +1635,10 @@ /obj/item/stack/cable_coil/cut, /turf/open/floor/iron/white/airless, /area/ruin/space/derelict/medical) -"jj" = ( -/obj/item/stack/cable_coil/cut, -/turf/open/floor/iron/airless{ - icon_state = "damaged3" - }, -/area/ruin/space/derelict/medical) "jk" = ( /obj/item/reagent_containers/glass/beaker, -/turf/open/floor/iron/airless{ - icon_state = "damaged3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/derelict/medical) "jm" = ( /obj/structure/window/reinforced{ @@ -1855,9 +1664,8 @@ /area/ruin/unpowered/no_grav) "jr" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/iron/airless{ - icon_state = "damaged2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/derelict/hallway/primary) "js" = ( /obj/machinery/light/small/directional/east, @@ -1906,9 +1714,8 @@ /area/ruin/space/derelict/medical) "jD" = ( /obj/item/stack/cable_coil/cut, -/turf/open/floor/iron/airless{ - icon_state = "damaged2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/derelict/medical) "jE" = ( /obj/machinery/door/airlock/medical{ @@ -1993,14 +1800,12 @@ /area/ruin/space/derelict/arrival) "jX" = ( /obj/structure/cable, -/turf/open/floor/iron/airless{ - icon_state = "floorscorched1" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/iron/airless, /area/ruin/space/derelict/hallway/primary) "jY" = ( -/turf/open/floor/iron/airless{ - icon_state = "floorscorched1" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/iron/airless, /area/ruin/space/derelict/hallway/primary) "jZ" = ( /obj/machinery/light/small/directional/north, @@ -2052,9 +1857,8 @@ /area/ruin/space/derelict/medical/chapel) "km" = ( /obj/item/stack/cable_coil/cut, -/turf/open/floor/iron/airless{ - icon_state = "floorscorched1" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/iron/airless, /area/ruin/space/derelict/hallway/primary) "ko" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on, @@ -2274,11 +2078,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/airless, /area/ruin/space/derelict/hallway/primary) -"lG" = ( -/turf/open/floor/iron/airless{ - icon_state = "damaged5" - }, -/area/ruin/space/derelict/hallway/primary) "lH" = ( /obj/item/ammo_casing/a357, /turf/open/floor/iron/airless, @@ -2411,9 +2210,8 @@ /turf/open/floor/plating/airless, /area/ruin/space/derelict/atmospherics) "mk" = ( -/turf/open/floor/iron/airless{ - icon_state = "floorscorched1" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/iron/airless, /area/ruin/space/derelict/atmospherics) "ml" = ( /obj/structure/window/fulltile, @@ -2423,27 +2221,12 @@ /obj/structure/window/reinforced, /turf/open/floor/iron/airless, /area/ruin/space/derelict/atmospherics) -"mp" = ( -/turf/open/floor/iron/airless{ - icon_state = "damaged5" - }, -/area/ruin/space/derelict/atmospherics) "mq" = ( +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron{ - icon_state = "damaged2"; initial_gas_mix = "TEMP=2.7" }, /area/ruin/space/derelict/atmospherics) -"mr" = ( -/turf/open/floor/iron/airless{ - icon_state = "damaged3" - }, -/area/ruin/space/derelict/atmospherics) -"ms" = ( -/turf/open/floor/iron/airless{ - icon_state = "damaged4" - }, -/area/ruin/space/derelict/atmospherics) "mt" = ( /obj/structure/window/fulltile, /turf/template_noop, @@ -2506,9 +2289,8 @@ /turf/open/floor/plating/airless, /area/ruin/space/derelict/atmospherics) "mG" = ( -/turf/open/floor/iron/airless{ - icon_state = "damaged2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/derelict/atmospherics) "mI" = ( /obj/structure/cable, @@ -2528,11 +2310,6 @@ }, /turf/open/floor/iron/airless, /area/ruin/space/derelict/atmospherics) -"mN" = ( -/turf/open/floor/iron/airless{ - icon_state = "damaged1" - }, -/area/ruin/space/derelict/atmospherics) "mP" = ( /obj/machinery/portable_atmospherics/pump, /turf/open/floor/plating/airless, @@ -2744,11 +2521,6 @@ /obj/structure/cable, /turf/open/floor/iron/airless, /area/ruin/space/derelict/se_solar) -"nQ" = ( -/turf/open/floor/iron/airless{ - icon_state = "damaged4" - }, -/area/ruin/space/derelict/se_solar) "nR" = ( /turf/open/floor/iron/airless, /area/ruin/space/derelict/se_solar) @@ -2794,9 +2566,8 @@ /area/ruin/space/derelict/se_solar) "oa" = ( /obj/item/paper/fluff/ruins/thederelict/syndie_mission, -/turf/open/floor/iron/airless{ - icon_state = "damaged2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/derelict/se_solar) "ob" = ( /obj/machinery/light/small/directional/east, @@ -2855,19 +2626,12 @@ name = "Derelict Solar Array" }, /obj/structure/cable, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg3" - }, -/area/ruin/solars/derelict_aft) -"oq" = ( -/turf/open/floor/plating/airless{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/solars/derelict_aft) "oy" = ( -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/solars/derelict_aft) "oz" = ( /obj/structure/lattice/catwalk, @@ -2879,11 +2643,6 @@ }, /turf/open/floor/iron, /area/ruin/space/derelict/bridge) -"oU" = ( -/turf/open/floor/iron/airless{ - icon_state = "damaged2" - }, -/area/space/nearstation) "oY" = ( /obj/machinery/door/airlock/vault/derelict, /obj/structure/cable, @@ -3033,39 +2792,30 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/iron/airless, /area/ruin/space/derelict/hallway/primary) -"wz" = ( -/turf/open/floor/iron/airless{ - icon_state = "floorscorched2" - }, -/area/space/nearstation) "wK" = ( -/turf/open/floor/iron/airless{ - icon_state = "damaged3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/derelict/se_solar) "xa" = ( /obj/structure/table, /obj/effect/spawner/random/maintenance, -/turf/open/floor/iron/airless{ - icon_state = "damaged2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/derelict/singularity_engine) "xI" = ( /obj/structure/table, /obj/machinery/light/small/directional/east, /obj/effect/spawner/random/maintenance, -/turf/open/floor/iron/airless{ - icon_state = "damaged2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/derelict/singularity_engine) "yd" = ( /obj/effect/spawner/random/structure/crate_abandoned, /turf/open/floor/iron/airless, /area/ruin/space/derelict/bridge/access) "yj" = ( -/turf/open/floor/iron/airless{ - icon_state = "damaged3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/space/nearstation) "yE" = ( /obj/structure/table, @@ -3107,16 +2857,9 @@ /area/ruin/space/derelict/solar_control) "zp" = ( /obj/effect/spawner/random/maintenance, -/turf/open/floor/iron/airless{ - icon_state = "damaged5" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/derelict/singularity_engine) -"zw" = ( -/obj/effect/spawner/random/maintenance, -/turf/open/floor/iron/airless{ - icon_state = "damaged4" - }, -/area/space/nearstation) "zB" = ( /obj/structure/table, /obj/machinery/power/apc/auto_name/directional/south, @@ -3139,9 +2882,8 @@ /turf/open/floor/iron/airless, /area/ruin/space/derelict/hallway/primary/port) "zN" = ( -/turf/open/floor/iron/airless{ - icon_state = "floorscorched1" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/iron/airless, /area/space/nearstation) "Av" = ( /obj/item/stack/rods, @@ -3191,9 +2933,8 @@ /area/ruin/unpowered/no_grav) "CZ" = ( /obj/item/clothing/suit/space/eva, -/turf/open/floor/iron/airless{ - icon_state = "damaged2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/derelict/bridge/ai_upload) "Dh" = ( /obj/structure/grille, @@ -3235,9 +2976,8 @@ /area/ruin/space/derelict/bridge/ai_upload) "Ef" = ( /obj/structure/cable, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/solars/derelict_starboard) "El" = ( /obj/structure/chair/stool/directional/west, @@ -3260,11 +3000,6 @@ }, /turf/open/floor/plating, /area/ruin/space/derelict/medical/chapel) -"Ff" = ( -/turf/open/floor/iron/airless{ - icon_state = "damaged5" - }, -/area/space/nearstation) "Fu" = ( /obj/item/shard{ icon_state = "medium" @@ -3290,9 +3025,8 @@ /area/ruin/space/derelict/solar_control) "GD" = ( /obj/structure/cable, -/turf/open/floor/iron/airless{ - icon_state = "damaged4" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/derelict/bridge/ai_upload) "GI" = ( /obj/item/stack/cable_coil/cut, @@ -3397,9 +3131,8 @@ desc = "This guy seemed to have died in terrible way! Half his remains are dust."; name = "Syndicate agent remains" }, -/turf/open/floor/iron/airless{ - icon_state = "damaged2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/derelict/bridge/ai_upload) "Kl" = ( /obj/structure/girder, @@ -3439,9 +3172,8 @@ "LG" = ( /obj/item/aicard, /obj/structure/cable, -/turf/open/floor/iron/airless{ - icon_state = "damaged2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/derelict/bridge/ai_upload) "LX" = ( /obj/machinery/power/smes/engineering{ @@ -3457,9 +3189,8 @@ "ME" = ( /obj/structure/window/reinforced, /obj/effect/spawner/random/maintenance, -/turf/open/floor/iron/airless{ - icon_state = "damaged4" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/derelict/singularity_engine) "MG" = ( /obj/item/stack/ore/iron, @@ -3545,9 +3276,8 @@ dir = 8 }, /obj/effect/spawner/random/maintenance, -/turf/open/floor/iron/airless{ - icon_state = "damaged2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/derelict/medical) "Pr" = ( /obj/structure/window/fulltile, @@ -3590,9 +3320,8 @@ /area/ruin/space/derelict/bridge/access) "Rd" = ( /obj/item/stack/cable_coil, -/turf/open/floor/iron/airless{ - icon_state = "damaged4" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/derelict/singularity_engine) "Rr" = ( /obj/structure/table, @@ -3619,9 +3348,8 @@ /area/ruin/space/derelict/gravity_generator) "RL" = ( /obj/effect/spawner/random/maintenance, -/turf/open/floor/iron/airless{ - icon_state = "damaged2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/space/nearstation) "Sm" = ( /obj/structure/table, @@ -3670,9 +3398,8 @@ /area/ruin/space/derelict/hallway/primary/port) "VT" = ( /obj/machinery/light/small/directional/east, -/turf/open/floor/iron/airless{ - icon_state = "damaged2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/space/nearstation) "VV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, @@ -3684,17 +3411,6 @@ /obj/item/pen, /turf/open/floor/iron, /area/ruin/space/derelict/arrival) -"Xq" = ( -/obj/item/stack/cable_coil/cut, -/turf/open/floor/iron/airless{ - icon_state = "damaged2" - }, -/area/ruin/space/derelict/singularity_engine) -"Xr" = ( -/turf/open/floor/iron/airless{ - icon_state = "damaged4" - }, -/area/space/nearstation) "Xu" = ( /obj/structure/closet/crate, /obj/item/stack/sheet/iron/fifty, @@ -5512,7 +5228,7 @@ gX yH gL mJ -gn +gm gL rk rk @@ -5624,10 +5340,10 @@ jy jM jX gL -gn +gm gL gm -gn +gm rk rk rk @@ -6534,7 +6250,7 @@ go wr fZ jY -lG +gm go gL gL @@ -6620,8 +6336,8 @@ rk dr dr ez -dO -dX +ez +ez ez ez dr @@ -6631,7 +6347,7 @@ aa aU hz hz -hY +hX ik hX iM @@ -6734,8 +6450,8 @@ dr dr fG fE -fU -fU +gs +gs gs dr dr @@ -6746,7 +6462,7 @@ hA hz hz Qv -hY +hX hX hI jf @@ -6845,7 +6561,7 @@ dr dr dr dr -Xq +fG fd ft ft @@ -6935,7 +6651,7 @@ Bw Bw IF IF -zw +RL aa aa rk @@ -6954,18 +6670,18 @@ ee ev dW ez -dO ez ez ez ez ez -dP ez -dO ez -dO -dX +ez +ez +ez +ez +ez dW dW hB @@ -6973,7 +6689,7 @@ rk IF hz hz -hY +hX hX hX jD @@ -6991,7 +6707,7 @@ lr IP go fZ -hD +gm gm gL gL @@ -7063,22 +6779,22 @@ Kb rk dr dr -ef +eh ev ez -dP -dX -dO ez ez ez -dP -dP -dX -dP +ez +ez +ez +ez +ez +ez +ez ez gI -dP +ez gY Bw rk @@ -7087,8 +6803,8 @@ IF IF IF IF -hY -hY +hX +hX jE jO go @@ -7104,12 +6820,12 @@ lr IP go fZ -gn +gm gL -gn +gm go fZ -gn +gm gL gL md @@ -7175,18 +6891,18 @@ Kb sg dr dr -dO +ez ME ev ez -dX -dO +ez +ez eW fq fq fI ez -dP +ez eZ gt fq @@ -7201,7 +6917,7 @@ aa aa IF hz -jj +jD hv fZ go @@ -7288,18 +7004,18 @@ aa rk dr dr -dP +ez eh ev ez -dO +ez eW -fj +fJ fr -fj +fJ fJ dW -dX +ez gh gj dW @@ -7330,13 +7046,13 @@ go go go fZ -lG +gm go go gm fZ go -gn +gm go mW mU @@ -7408,15 +7124,15 @@ eF eN eX fk -dP -dP +ez +ez dW dW dW dW dW dW -dO +ez dW gJ dW @@ -7515,10 +7231,10 @@ cl dr dr dR -dO +ez dW -dP -dO +ez +ez eY fl dW @@ -7528,9 +7244,9 @@ dW dW dW dW -dO -dX -dO +ez +ez +ez fb ho ez @@ -7621,17 +7337,17 @@ aa MG cu cu -cw +cu cO cY df ds dB dW -ei +eh ex -dO -dX +ez +ez eZ dW dW @@ -7646,7 +7362,7 @@ dW gS ft ez -dO +ez ez dr dr @@ -7731,7 +7447,7 @@ aa rk aa rk -co +cu cv cG cO @@ -7743,8 +7459,8 @@ cl da da dr -eG -dO +fG +ez dW dW dW @@ -7756,17 +7472,17 @@ aa aa dW dW -dO ez -dO -dP +ez +ez +ez hN dr im dr hv iD -gP +gD jp fZ go @@ -7845,7 +7561,7 @@ rk aa cl cp -cw +cu cH cO cO @@ -7858,7 +7574,7 @@ ej dr ez dW -fa +ho dW dW dW @@ -7869,11 +7585,11 @@ aa aa dW dW -dP ez -dO -dP -dX +ez +ez +ez +ez dW in dr @@ -7957,7 +7673,7 @@ Bw Gf aa cl -co +cu cu cu cP @@ -7981,19 +7697,19 @@ aa aa aa dW -dP -dX +ez +ez ez fW -dP -dO +ez +ez dr ux dr iQ ay ay -gP +gD fZ go go @@ -8011,7 +7727,7 @@ lt lt lt ls -mN +mG mG lt lt @@ -8073,7 +7789,7 @@ cl cq cu So -co +cu cu dc di @@ -8094,11 +7810,11 @@ aa aa aa dW -dO +ez eh gZ ez -dO +ez ez dr dr @@ -8120,12 +7836,12 @@ lN Qt PR MS -mp +mG ls ls lt ls -mN +mG lt ls mG @@ -8196,7 +7912,7 @@ dW em dW ez -dO +ez fb fm dW @@ -8208,7 +7924,7 @@ dW dW dW dW -ei +eh ev ez ez @@ -8234,7 +7950,7 @@ ES VV mk mq -mp +mG lt lt lt @@ -8305,11 +8021,11 @@ rk rk dr dr -dO -dO ez -dO -dO +ez +ez +ez +ez fc fm dW @@ -8323,7 +8039,7 @@ dW dW eh ev -dO +ez ez dr dr @@ -8346,12 +8062,12 @@ ly ly lx lx -mr +mG lt lt lt lt -ms +mG lt lt lt @@ -8418,11 +8134,11 @@ aa rk dr dr -dX -dO -dX -dP -dO +ez +ez +ez +ez +ez fd fn fs @@ -8436,8 +8152,8 @@ dW gK gS ew -dP -dO +ez +ez dr dr rk @@ -8459,13 +8175,13 @@ lP ls lP lP -mr +mG lt -mr -mr mG -mN -mp +mG +mG +mG +mG lx lx md @@ -8531,11 +8247,11 @@ Kb IF dr dr -dO -dO -Xq +ez +ez +fG Rd -dO +ez ez fd ft @@ -8548,9 +8264,9 @@ gw gE gE gT -dO -dX -dP +ez +ez +ez dr dr rk @@ -8572,12 +8288,12 @@ lx lx lx lx -ms +mG mt mG mG -mp -mp +mG +mG mt lx aa @@ -8648,9 +8364,9 @@ dr en ez ez -dX -dP -dO +ez +ez +ez ez dW dW @@ -8658,10 +8374,10 @@ ez ez dW ez -dP -dX -dP -dO +ez +ez +ez +ez ez dr dr @@ -8761,19 +8477,19 @@ dr eo dW ez -dO -dX -dP -fu ez ez -fO +ez +fG +ez +ez +gI fW ez ez -dP ez -dP +ez +ez ez ez dr @@ -8784,7 +8500,7 @@ iD aa aa jo -gP +gD gD fZ go @@ -8879,10 +8595,10 @@ dr dr dr dr -dO +ez fP fX -dO +ez fb dr dr @@ -8993,8 +8709,8 @@ dr dr dr ez -fQ -fQ +fJ +fJ gj fJ dr @@ -9106,9 +8822,9 @@ rk dr dr dW -dO -dO -dX +ez +ez +ez ez dr dr @@ -9119,7 +8835,7 @@ aa gL mJ gm -gn +gm fZ go go @@ -9343,10 +9059,10 @@ gl gL gm gm -gn +gm ip -gn -gn +gm +gm go go go @@ -9454,10 +9170,10 @@ gl mJ gm gm -gn -gn -gn -gn +gm +gm +gm +gm go fZ go @@ -9672,12 +9388,12 @@ yd fF fx cs -ga +ip gl -ga +ip fZ -gn -gn +gm +gm go fZ go @@ -9756,7 +9472,7 @@ bj bj bj ax -bE +bK GD LG am @@ -9787,23 +9503,23 @@ fx fR gb gm -gz +jY fZ gL gL go fZ -gz -gn -gn +jY +gm +gm fZ -gz +jY go go jr go gc -gn +gm ko go gk @@ -9899,25 +9615,25 @@ fx fx cs gb -gn -gn +gm +gm gF gL -gn +gm go go -gn +gm gL -gn +gm fZ -gn +gm gL go go go gb go -gn +gm go UY fZ @@ -9985,7 +9701,7 @@ ax bz zf aa -bF +bK YQ ax aa @@ -10016,23 +9732,23 @@ go go fZ fZ -gn -gn +gm +gm fZ -gz -gz +jY +jY gL -gz -gz -gz +jY +jY +jY go js gL gc go -gn +gm go -gn +gm fZ KN zJ @@ -10095,7 +9811,7 @@ bj bj bj ax -bF +bK Kf CZ bZ @@ -10133,7 +9849,7 @@ go hb fZ fZ -gz +jY gk gk gk @@ -10170,7 +9886,7 @@ mZ nB nB nB -nQ +wK nR nR oh @@ -10245,13 +9961,13 @@ gM go go fZ -gz -hD +jY +gm gk yj -wz -wz -Xr +zN +zN +yj gk go gc @@ -10260,7 +9976,7 @@ kq go UY aa -oU +yj IF rk rk @@ -10291,7 +10007,7 @@ nV nB aa aa -oq +oy GI aa GI @@ -10322,7 +10038,7 @@ bj bj ax bO -bE +bK bO bO zI @@ -10358,13 +10074,13 @@ gN go fZ fZ -gz -gz +jY +jY gk -wz -Xr -Ff -wz +zN +yj +yj +zN gk gk jQ @@ -10471,11 +10187,11 @@ fZ fZ fZ fZ -hD +gm gL gk yj -wz +zN aa aa IF @@ -10584,11 +10300,11 @@ rc fZ fZ fZ -gz +jY gL gk -Xr -wz +yj +zN aa aa rk @@ -11377,7 +11093,7 @@ gW hp hq gV -Ff +yj aa aa aa @@ -11490,7 +11206,7 @@ gW hp hp gV -oU +yj aa aa aa @@ -11597,14 +11313,14 @@ aa aa aa IF -wz +zN cz gW hq hr gV -Ff -Ff +yj +yj aa aa aa @@ -11718,7 +11434,7 @@ hr gV IF rk -Xr +yj aa aa rk @@ -11788,8 +11504,8 @@ bh aB aQ br -bu -bB +bs +bs br aB aB @@ -11830,7 +11546,7 @@ hr hq gV Bk -Xr +yj rk yj gV @@ -12048,7 +11764,7 @@ aa aa IF IF -oU +yj cz gV hd @@ -12162,7 +11878,7 @@ aa IF IF sg -wz +zN gV he hd @@ -12275,7 +11991,7 @@ IF IF IF zN -oU +yj gV hf yE @@ -12386,7 +12102,7 @@ aa IF IF cz -wz +zN cz yj gV @@ -12725,7 +12441,7 @@ aa IF IF IF -oU +yj cz tH gW diff --git a/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm b/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm index 45b5d6b305e66b..ef2f00da5986a1 100644 --- a/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm +++ b/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm @@ -15,9 +15,7 @@ /turf/open/floor/plating, /area/ruin/space/has_grav/derelictoutpost/cargobay) "af" = ( -/obj/structure/sign/warning/vacuum{ - pixel_y = 32 - }, +/obj/structure/sign/warning/vacuum/directional/north, /obj/effect/decal/cleanable/cobweb, /turf/open/floor/iron, /area/ruin/space/has_grav/derelictoutpost/cargobay) @@ -28,9 +26,7 @@ /turf/open/floor/plating, /area/ruin/space/has_grav/derelictoutpost/cargobay) "ah" = ( -/obj/structure/sign/warning/vacuum{ - pixel_y = 32 - }, +/obj/structure/sign/warning/vacuum/directional/north, /turf/open/floor/iron, /area/ruin/space/has_grav/derelictoutpost/cargobay) "ai" = ( @@ -293,9 +289,7 @@ /turf/open/floor/iron, /area/ruin/space/has_grav/derelictoutpost) "bk" = ( -/obj/structure/sign/warning/vacuum{ - pixel_y = 32 - }, +/obj/structure/sign/warning/vacuum/directional/north, /turf/open/floor/iron, /area/ruin/space/has_grav/derelictoutpost) "bl" = ( @@ -323,9 +317,7 @@ "bo" = ( /obj/structure/alien/weeds/creature, /obj/structure/glowshroom/single, -/obj/structure/sign/warning/vacuum{ - pixel_y = 32 - }, +/obj/structure/sign/warning/vacuum/directional/north, /obj/effect/decal/cleanable/blood/old{ dir = 4; icon_state = "trails_1"; diff --git a/_maps/RandomRuins/SpaceRuins/caravanambush.dmm b/_maps/RandomRuins/SpaceRuins/caravanambush.dmm index 6ea109dd643069..64fab0ad93c133 100644 --- a/_maps/RandomRuins/SpaceRuins/caravanambush.dmm +++ b/_maps/RandomRuins/SpaceRuins/caravanambush.dmm @@ -57,11 +57,6 @@ }, /turf/template_noop, /area/template_noop) -"ak" = ( -/turf/open/floor/plating/airless{ - icon_state = "platingdmg2" - }, -/area/shuttle/caravan/freighter3) "an" = ( /obj/structure/lattice, /obj/structure/fluff/broken_flooring{ @@ -249,9 +244,8 @@ /turf/open/floor/iron/dark/airless, /area/shuttle/caravan/freighter2) "bd" = ( -/turf/open/floor/plating/airless{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/shuttle/caravan/freighter3) "bg" = ( /obj/effect/decal/cleanable/dirt, @@ -269,18 +263,16 @@ dir = 4 }, /obj/effect/gibspawner/human, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/shuttle/caravan/freighter2) "bi" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 }, -/turf/open/floor/iron/airless{ - icon_state = "floorscorched1" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/iron/airless, /area/shuttle/caravan/freighter2) "bl" = ( /mob/living/simple_animal/hostile/carp, @@ -346,9 +338,8 @@ /obj/item/stack/cable_coil{ amount = 1 }, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/unpowered) "fZ" = ( /turf/closed/wall/mineral/titanium, @@ -423,8 +414,7 @@ /area/shuttle/caravan/freighter3) "gy" = ( /obj/machinery/light/small/directional/west, -/obj/structure/sign/warning/vacuum{ - pixel_x = -32; +/obj/structure/sign/warning/vacuum/directional/west{ pixel_y = 32 }, /obj/effect/decal/cleanable/dirt, @@ -473,9 +463,8 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless{ - icon_state = "floorscorched1" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/iron/airless, /area/shuttle/caravan/freighter3) "gW" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ @@ -528,9 +517,8 @@ id = "caravantrade2_cargo_port"; name = "Cargo Blast Door" }, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/shuttle/caravan/freighter2) "hp" = ( /obj/effect/decal/cleanable/dirt, @@ -545,9 +533,8 @@ id = "caravantrade2_cargo_port"; name = "Cargo Blast Door" }, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/shuttle/caravan/freighter2) "hr" = ( /obj/machinery/door/poddoor/preopen{ @@ -614,9 +601,8 @@ }, /area/shuttle/caravan/freighter3) "hB" = ( -/turf/open/floor/iron/airless{ - icon_state = "damaged2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/shuttle/caravan/freighter3) "hQ" = ( /obj/structure/shuttle/engine/propulsion/burst/left{ @@ -627,9 +613,8 @@ "hS" = ( /obj/effect/turf_decal/bot_white, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless{ - icon_state = "damaged5" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/shuttle/caravan/freighter2) "hT" = ( /obj/effect/turf_decal/bot_white, @@ -641,13 +626,6 @@ /obj/item/ammo_casing/shotgun/stunslug, /turf/open/floor/iron/dark/airless, /area/shuttle/caravan/freighter2) -"hU" = ( -/obj/effect/turf_decal/bot_white, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless{ - icon_state = "damaged2" - }, -/area/shuttle/caravan/freighter2) "hV" = ( /obj/effect/turf_decal/bot_white, /obj/effect/decal/cleanable/dirt, @@ -671,8 +649,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small/directional/west, -/obj/structure/sign/warning/vacuum{ - pixel_x = -32; +/obj/structure/sign/warning/vacuum/directional/west{ pixel_y = 32 }, /turf/open/floor/plating/airless, @@ -701,9 +678,8 @@ /area/shuttle/caravan/freighter3) "ia" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/iron/airless{ - icon_state = "damaged2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/shuttle/caravan/freighter3) "ib" = ( /obj/effect/turf_decal/box/white/corners{ @@ -718,9 +694,8 @@ "ic" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless{ - icon_state = "damaged5" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/shuttle/caravan/freighter3) "id" = ( /obj/effect/turf_decal/box/white/corners, @@ -756,9 +731,8 @@ dir = 8 }, /obj/item/shard, -/turf/open/floor/iron/airless{ - icon_state = "damaged3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/shuttle/caravan/freighter3) "io" = ( /obj/structure/shuttle/engine/propulsion/burst{ @@ -784,9 +758,8 @@ /turf/open/floor/plating/airless, /area/shuttle/caravan/freighter2) "is" = ( -/turf/open/floor/iron/airless{ - icon_state = "damaged2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/shuttle/caravan/freighter2) "it" = ( /obj/effect/decal/cleanable/dirt, @@ -799,9 +772,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/turf/open/floor/iron/airless{ - icon_state = "damaged3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/shuttle/caravan/freighter2) "iv" = ( /obj/effect/decal/cleanable/dirt, @@ -820,31 +792,27 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 10 }, -/turf/open/floor/iron/airless{ - icon_state = "floorscorched1" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/iron/airless, /area/shuttle/caravan/freighter2) "iy" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/fluff/broken_flooring{ icon_state = "pile" }, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/shuttle/caravan/freighter2) "iz" = ( /obj/item/shard, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/shuttle/caravan/freighter3) "iA" = ( /obj/machinery/meter, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/shuttle/caravan/freighter3) "iB" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ @@ -856,9 +824,8 @@ "iC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless{ - icon_state = "floorscorched1" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/iron/airless, /area/shuttle/caravan/freighter3) "iD" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ @@ -937,9 +904,8 @@ "jb" = ( /obj/effect/turf_decal/bot_white, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless{ - icon_state = "damaged3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/shuttle/caravan/freighter3) "jc" = ( /obj/effect/turf_decal/bot_white, @@ -959,8 +925,7 @@ /area/shuttle/caravan/freighter3) "je" = ( /obj/machinery/light/small/directional/west, -/obj/structure/sign/warning/vacuum{ - pixel_x = -32; +/obj/structure/sign/warning/vacuum/directional/west{ pixel_y = -32 }, /obj/effect/decal/cleanable/dirt, @@ -1057,9 +1022,8 @@ /area/shuttle/caravan/freighter2) "jK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/iron/airless{ - icon_state = "floorscorched1" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/iron/airless, /area/shuttle/caravan/freighter2) "jL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ @@ -1072,9 +1036,8 @@ /turf/open/floor/iron/airless, /area/shuttle/caravan/freighter2) "jN" = ( -/turf/open/floor/iron/airless{ - icon_state = "floorscorched1" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/iron/airless, /area/shuttle/caravan/freighter2) "jO" = ( /obj/effect/decal/cleanable/dirt, @@ -1146,8 +1109,7 @@ "kb" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small/directional/west, -/obj/structure/sign/warning/vacuum{ - pixel_x = -32; +/obj/structure/sign/warning/vacuum/directional/west{ pixel_y = -32 }, /turf/open/floor/iron/dark/airless, @@ -1158,15 +1120,13 @@ /obj/item/tank/internals/oxygen, /obj/item/radio, /obj/item/clothing/mask/gas, -/turf/open/floor/iron/airless{ - icon_state = "damaged5" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/shuttle/caravan/freighter2) "kd" = ( /obj/structure/grille/broken, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/shuttle/caravan/freighter2) "ke" = ( /obj/effect/decal/cleanable/dirt, @@ -1224,9 +1184,8 @@ /area/ruin/unpowered) "lD" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/unpowered) "tH" = ( /obj/structure/shuttle/engine/propulsion/burst{ @@ -3668,7 +3627,7 @@ af af af hq -hU +hS it js js @@ -5282,7 +5241,7 @@ aN hv ia iA -ak +bd ap aa aa diff --git a/_maps/RandomRuins/SpaceRuins/clownplanet.dmm b/_maps/RandomRuins/SpaceRuins/clownplanet.dmm index 5bc83adeda50b5..59d7af0d49aef2 100644 --- a/_maps/RandomRuins/SpaceRuins/clownplanet.dmm +++ b/_maps/RandomRuins/SpaceRuins/clownplanet.dmm @@ -356,9 +356,8 @@ /area/ruin/powered/clownplanet) "bj" = ( /obj/structure/mineral_door/wood, -/turf/open/floor/wood{ - icon_state = "wood-broken5" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/ruin/powered/clownplanet) "bk" = ( /obj/effect/spawner/random/vending/snackvend, diff --git a/_maps/RandomRuins/SpaceRuins/crashedship.dmm b/_maps/RandomRuins/SpaceRuins/crashedship.dmm index 21990bbebfdba5..882d3e297952b7 100644 --- a/_maps/RandomRuins/SpaceRuins/crashedship.dmm +++ b/_maps/RandomRuins/SpaceRuins/crashedship.dmm @@ -10,9 +10,8 @@ /turf/open/floor/bamboo, /area/awaymission/bmpship/fore) "aH" = ( -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/awaymission/bmpship/midship) "aM" = ( /obj/effect/turf_decal/stripes/line{ @@ -22,15 +21,13 @@ dir = 8 }, /obj/structure/firelock_frame, -/turf/open/floor/mineral/plastitanium/airless{ - icon_state = "plastitanium_dam3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/mineral/plastitanium/airless, /area/awaymission/bmpship/midship) "bc" = ( /obj/effect/decal/cleanable/glass, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/awaymission/bmpship/midship) "bj" = ( /obj/machinery/door/airlock/security/glass{ @@ -75,14 +72,12 @@ }, /obj/structure/door_assembly/door_assembly_com, /obj/structure/cable, -/turf/open/floor/mineral/plastitanium/airless{ - icon_state = "plastitanium_dam2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/mineral/plastitanium/airless, /area/awaymission/bmpship/fore) "dD" = ( -/turf/open/floor/plating/airless{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/awaymission/bmpship/fore) "dZ" = ( /obj/item/stack/ore/glass, @@ -131,15 +126,13 @@ /area/awaymission/bmpship/midship) "fA" = ( /obj/machinery/light/broken/directional/south, -/turf/open/floor/iron/airless{ - icon_state = "damaged4" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/awaymission/bmpship/fore) "fI" = ( /obj/structure/closet/mini_fridge, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/bmpship/fore) "fQ" = ( /turf/open/floor/iron, @@ -193,9 +186,8 @@ /area/awaymission/bmpship/aft) "iI" = ( /obj/structure/grille/broken, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/awaymission/bmpship/aft) "iU" = ( /obj/effect/turf_decal/trimline/neutral/filled/line, @@ -207,15 +199,9 @@ /obj/structure/cable, /obj/machinery/light/broken/directional/east, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/awaymission/bmpship/aft) -"iY" = ( -/turf/open/floor/iron/airless{ - icon_state = "damaged5" - }, -/area/awaymission/bmpship/midship) "ja" = ( /turf/closed/mineral/random/high_chance, /area/awaymission/bmpship/fore) @@ -224,9 +210,8 @@ /area/template_noop) "km" = ( /obj/structure/girder/displaced, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/awaymission/bmpship/midship) "kM" = ( /obj/item/bedsheet/yellow, @@ -236,9 +221,8 @@ /obj/item/shard{ icon_state = "medium" }, -/turf/open/floor/plating/airless{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating/airless, /area/awaymission/bmpship/fore) "le" = ( /obj/structure/lattice, @@ -266,11 +250,6 @@ }, /turf/open/floor/iron/airless, /area/awaymission/bmpship/midship) -"lG" = ( -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" - }, -/area/awaymission/bmpship/aft) "lR" = ( /obj/effect/turf_decal/trimline/neutral/line, /turf/open/floor/iron, @@ -285,11 +264,6 @@ /obj/item/gps/spaceruin, /turf/open/floor/catwalk_floor, /area/awaymission/bmpship/aft) -"mN" = ( -/turf/open/floor/plating/airless{ - icon_state = "platingdmg2" - }, -/area/awaymission/bmpship/midship) "mP" = ( /obj/machinery/door/firedoor/closed, /obj/effect/turf_decal/stripes/line, @@ -318,23 +292,20 @@ dir = 9 }, /obj/effect/turf_decal/trimline/brown/corner, -/turf/open/floor/plating/airless{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating/airless, /area/awaymission/bmpship/aft) "nk" = ( -/turf/open/floor/iron/airless{ - icon_state = "damaged4" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/awaymission/bmpship/midship) "nl" = ( /turf/open/floor/plating/airless, /area/awaymission/bmpship/fore) "nI" = ( /obj/structure/girder/displaced, -/turf/open/floor/plating/airless{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating/airless, /area/awaymission/bmpship/aft) "nY" = ( /obj/effect/turf_decal/bot, @@ -433,9 +404,8 @@ /area/awaymission/bmpship/midship) "pZ" = ( /obj/structure/girder/displaced, -/turf/open/floor/plating/airless{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating/airless, /area/awaymission/bmpship/midship) "qm" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, @@ -474,9 +444,8 @@ /turf/open/misc/asteroid, /area/awaymission/bmpship/fore) "qO" = ( -/turf/open/floor/plating/airless{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating/airless, /area/awaymission/bmpship/aft) "rb" = ( /turf/open/floor/iron/airless, @@ -556,9 +525,8 @@ /turf/open/floor/plating, /area/awaymission/bmpship/fore) "ut" = ( -/turf/open/floor/iron/airless{ - icon_state = "damaged3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/awaymission/bmpship/aft) "uz" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -615,11 +583,6 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/plating/airless, /area/awaymission/bmpship/midship) -"xt" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, -/area/awaymission/bmpship/fore) "xy" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -661,9 +624,8 @@ /turf/open/floor/iron/airless, /area/awaymission/bmpship/midship) "yk" = ( -/turf/open/floor/iron/airless{ - icon_state = "damaged2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/awaymission/bmpship/fore) "yB" = ( /obj/effect/turf_decal/stripes/line{ @@ -685,13 +647,6 @@ dir = 8 }, /area/awaymission/bmpship/aft) -"za" = ( -/obj/structure/grille/broken, -/obj/effect/decal/cleanable/glass, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" - }, -/area/awaymission/bmpship/midship) "zg" = ( /obj/item/stack/tile/wood, /turf/template_noop, @@ -699,9 +654,8 @@ "zm" = ( /obj/structure/table/wood, /obj/effect/spawner/random/decoration, -/turf/open/floor/wood/parquet{ - icon_state = "wood_parquet-broken" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood/parquet, /area/awaymission/bmpship/fore) "zA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -733,9 +687,8 @@ /area/awaymission/bmpship/midship) "Af" = ( /obj/item/chair, -/turf/open/floor/plating/airless{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating/airless, /area/awaymission/bmpship/aft) "Ak" = ( /obj/structure/cable, @@ -753,9 +706,8 @@ /area/awaymission/bmpship) "AF" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating/airless{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating/airless, /area/awaymission/bmpship/aft) "AM" = ( /obj/effect/turf_decal/stripes/line{ @@ -797,15 +749,13 @@ /area/awaymission/bmpship/aft) "BS" = ( /obj/structure/girder, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/awaymission/bmpship/midship) "Cg" = ( /obj/structure/grille/broken, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/awaymission/bmpship/midship) "Cj" = ( /obj/effect/turf_decal/trimline/brown/filled/warning{ @@ -928,11 +878,6 @@ dir = 1 }, /area/awaymission/bmpship/aft) -"Fi" = ( -/turf/open/floor/plating/airless{ - icon_state = "platingdmg3" - }, -/area/awaymission/bmpship/midship) "Fy" = ( /obj/effect/turf_decal/trimline/blue/filled/warning{ dir = 1 @@ -983,9 +928,8 @@ /area/awaymission/bmpship/aft) "GM" = ( /obj/effect/spawner/random/structure/girder, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/awaymission/bmpship/aft) "Hb" = ( /obj/structure/shuttle/engine/heater{ @@ -1024,18 +968,16 @@ "HZ" = ( /obj/structure/grille/broken, /obj/item/shard, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/awaymission/bmpship/fore) "ID" = ( /obj/item/stack/rods, /turf/template_noop, /area/template_noop) "IG" = ( -/turf/open/floor/wood/parquet{ - icon_state = "wood_parquet-broken3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood/parquet, /area/awaymission/bmpship/fore) "IM" = ( /obj/item/shard, @@ -1043,9 +985,8 @@ /turf/template_noop, /area/template_noop) "IR" = ( -/turf/open/floor/plating/airless{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/awaymission/bmpship/aft) "Jr" = ( /obj/effect/turf_decal/stripes/line, @@ -1054,17 +995,11 @@ }, /turf/open/floor/iron/dark/side/airless, /area/awaymission/bmpship/midship) -"Jv" = ( -/turf/open/floor/iron/airless{ - icon_state = "damaged1" - }, -/area/awaymission/bmpship/midship) "Jy" = ( /obj/structure/grille/broken, /obj/effect/decal/cleanable/glass, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/awaymission/bmpship/midship) "JN" = ( /obj/effect/turf_decal/stripes/line{ @@ -1109,9 +1044,8 @@ pixel_x = -7; pixel_y = 2 }, -/turf/open/floor/iron/airless{ - icon_state = "damaged1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/awaymission/bmpship/aft) "KD" = ( /turf/open/misc/asteroid, @@ -1172,9 +1106,8 @@ /area/awaymission/bmpship/aft) "Mi" = ( /obj/structure/table_frame/wood, -/turf/open/floor/wood/parquet{ - icon_state = "wood_parquet-broken4" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood/parquet, /area/awaymission/bmpship/fore) "Mw" = ( /obj/structure/cable, @@ -1200,9 +1133,8 @@ dir = 9 }, /obj/effect/turf_decal/trimline/brown/corner, -/turf/open/floor/plating/airless{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating/airless, /area/awaymission/bmpship/midship) "NB" = ( /obj/effect/turf_decal/trimline/white/filled/warning{ @@ -1244,14 +1176,10 @@ /obj/structure/cable, /turf/open/floor/mineral/plastitanium, /area/awaymission/bmpship/aft) -"OF" = ( -/turf/closed/wall/mineral/titanium/nodiagonal, -/area/template_noop) "OZ" = ( /obj/structure/door_assembly/door_assembly_mhatch, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/awaymission/bmpship/aft) "Pb" = ( /obj/effect/turf_decal/trimline/blue/filled/warning, @@ -1288,14 +1216,12 @@ /area/awaymission/bmpship/midship) "Qy" = ( /obj/structure/door_assembly/door_assembly_com, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/awaymission/bmpship/midship) "RA" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/bmpship/fore) "RL" = ( /obj/effect/turf_decal/stripes/line{ @@ -1309,11 +1235,6 @@ "RU" = ( /turf/closed/mineral/random/high_chance, /area/awaymission/bmpship) -"Sa" = ( -/turf/open/floor/iron/airless{ - icon_state = "damaged3" - }, -/area/awaymission/bmpship/midship) "Tj" = ( /obj/effect/turf_decal/trimline/neutral/filled/shrink_ccw, /obj/structure/cable, @@ -1321,15 +1242,13 @@ /turf/open/floor/iron, /area/awaymission/bmpship/aft) "To" = ( -/turf/open/floor/iron/airless{ - icon_state = "floorscorched2" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/iron/airless, /area/awaymission/bmpship/midship) "Ty" = ( /obj/effect/spawner/random/structure/girder, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/awaymission/bmpship/midship) "TP" = ( /obj/effect/turf_decal/trimline/blue/filled/warning{ @@ -1343,9 +1262,8 @@ /obj/effect/turf_decal/trimline/yellow/filled/end{ dir = 4 }, -/turf/open/floor/iron/airless{ - icon_state = "floorscorched2" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/iron/airless, /area/awaymission/bmpship/aft) "Uk" = ( /obj/effect/turf_decal/trimline/blue/filled/warning{ @@ -1377,18 +1295,16 @@ /area/awaymission/bmpship/midship) "US" = ( /obj/machinery/light/broken/directional/north, -/turf/open/floor/iron/airless{ - icon_state = "damaged2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/awaymission/bmpship/midship) "Vp" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ dir = 8 }, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/awaymission/bmpship/midship) "VH" = ( /obj/effect/turf_decal/stripes/line{ @@ -1398,14 +1314,12 @@ dir = 8 }, /obj/structure/door_assembly/door_assembly_med, -/turf/open/floor/mineral/plastitanium/airless{ - icon_state = "plastitanium_dam4" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/mineral/plastitanium/airless, /area/awaymission/bmpship/midship) "VL" = ( -/turf/open/floor/plating/airless{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating/airless, /area/awaymission/bmpship/midship) "Wi" = ( /obj/machinery/light/broken/directional/south, @@ -1449,9 +1363,8 @@ dir = 8 }, /obj/structure/firelock_frame, -/turf/open/floor/mineral/plastitanium/airless{ - icon_state = "plastitanium_dam5" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/mineral/plastitanium/airless, /area/awaymission/bmpship/fore) "Yp" = ( /obj/effect/turf_decal/siding/wood{ @@ -1470,9 +1383,8 @@ /area/awaymission/bmpship/fore) "Zl" = ( /obj/machinery/power/floodlight, -/turf/open/floor/plating/airless{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating/airless, /area/awaymission/bmpship/aft) "Zm" = ( /obj/item/stack/ore/diamond, @@ -1483,11 +1395,6 @@ /obj/structure/cable, /turf/open/floor/iron/airless, /area/awaymission/bmpship/fore) -"ZL" = ( -/turf/open/floor/plating/airless{ - icon_state = "platingdmg3" - }, -/area/awaymission/bmpship/aft) (1,1,1) = {" kc @@ -1787,7 +1694,7 @@ hI uF qO IR -ZL +IR kc kc kc @@ -1897,7 +1804,7 @@ Mg Gv yL yL -lG +IR kc IR kc @@ -1954,7 +1861,7 @@ uF uF uF uF -lG +IR fm GM kc @@ -2034,10 +1941,10 @@ nY Ff Ye bj -lG +IR fc fc -lG +IR sr IR vX @@ -2072,7 +1979,7 @@ fc kc kc uF -lG +IR fc kc kc @@ -2092,7 +1999,7 @@ Oy uF uF mb -ZL +IR uF uF lg @@ -2114,7 +2021,7 @@ kc kc ID kc -za +Jy rb iU OZ @@ -2180,8 +2087,8 @@ zg KF kc fc -mN -Jv +aH +nk mb fc kc @@ -2208,7 +2115,7 @@ fc fc zg Ty -iY +nk MC kc kc @@ -2226,8 +2133,8 @@ kc kc kc Xu -za -Sa +Jy +nk HT Vp fp @@ -2311,7 +2218,7 @@ kc rm xb fp -iY +nk gH fp uf @@ -2341,16 +2248,16 @@ UA UA Yl di -OF -OF -OF +fp +fp +fp fp Gf yB AM Cg To -Fi +aH VL qu kc @@ -2483,7 +2390,7 @@ EA EA cY wi -xt +RA um IG YU diff --git a/_maps/RandomRuins/SpaceRuins/deepstorage.dmm b/_maps/RandomRuins/SpaceRuins/deepstorage.dmm index 53835ba98e8ef4..a7dd773f8e8a5d 100644 --- a/_maps/RandomRuins/SpaceRuins/deepstorage.dmm +++ b/_maps/RandomRuins/SpaceRuins/deepstorage.dmm @@ -2180,9 +2180,7 @@ dir = 4 }, /obj/machinery/light/small/directional/north, -/obj/structure/sign/warning/secure_area{ - pixel_y = 32 - }, +/obj/structure/sign/warning/secure_area/directional/north, /obj/effect/turf_decal/stripes/corner{ dir = 4 }, @@ -2208,9 +2206,7 @@ c_tag = "Bunker entrance"; network = list("bunker1") }, -/obj/structure/sign/warning/secure_area{ - pixel_y = 32 - }, +/obj/structure/sign/warning/secure_area/directional/north, /obj/effect/turf_decal/stripes/corner{ dir = 1 }, @@ -2233,9 +2229,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible{ dir = 4 }, -/obj/structure/sign/warning/electric_shock{ - pixel_y = 32 - }, +/obj/structure/sign/warning/electric_shock/directional/north, /obj/structure/cable, /turf/open/floor/plating, /area/ruin/space/has_grav/deepstorage/power) @@ -2373,9 +2367,7 @@ /obj/machinery/power/terminal{ dir = 1 }, -/obj/structure/sign/warning/electric_shock{ - pixel_y = -32 - }, +/obj/structure/sign/warning/electric_shock/directional/south, /obj/structure/cable, /turf/open/floor/plating, /area/ruin/space/has_grav/deepstorage/power) @@ -2542,9 +2534,7 @@ dir = 5 }, /obj/machinery/autolathe, -/obj/structure/sign/warning/radiation{ - pixel_x = -32 - }, +/obj/structure/sign/warning/radiation/directional/west, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage/power) @@ -2830,10 +2820,7 @@ /area/ruin/space/has_grav/deepstorage/dorm) "Az" = ( /obj/structure/cable, -/obj/machinery/power/apc/ten_k{ - name = "Pharmacy APC"; - pixel_x = 25 - }, +/obj/machinery/power/apc/ten_k/directional/east, /turf/open/floor/engine, /area/ruin/space/has_grav/deepstorage/pharmacy) "AI" = ( diff --git a/_maps/RandomRuins/SpaceRuins/derelict1.dmm b/_maps/RandomRuins/SpaceRuins/derelict1.dmm deleted file mode 100644 index d2fe31b72c242d..00000000000000 --- a/_maps/RandomRuins/SpaceRuins/derelict1.dmm +++ /dev/null @@ -1,1043 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/template_noop, -/area/template_noop) -"b" = ( -/obj/structure/lattice, -/turf/template_noop, -/area/template_noop) -"c" = ( -/turf/closed/wall, -/area/ruin/unpowered) -"d" = ( -/obj/structure/alien/weeds, -/obj/structure/alien/resin/membrane, -/turf/open/floor/plating/airless, -/area/ruin/unpowered) -"e" = ( -/obj/structure/girder, -/obj/structure/alien/weeds, -/turf/open/floor/plating/airless, -/area/ruin/unpowered) -"f" = ( -/obj/structure/alien/weeds, -/turf/open/floor/plating/airless, -/area/ruin/unpowered) -"g" = ( -/obj/structure/alien/weeds, -/obj/structure/table_frame, -/turf/open/floor/plating/airless, -/area/ruin/unpowered) -"h" = ( -/obj/structure/alien/weeds/node, -/turf/open/floor/plating/airless, -/area/ruin/unpowered) -"i" = ( -/obj/structure/alien/weeds, -/obj/structure/bed/nest, -/turf/open/floor/plating/airless, -/area/ruin/unpowered) -"j" = ( -/obj/structure/alien/weeds, -/obj/structure/bed/nest, -/obj/effect/decal/remains/human, -/turf/open/floor/plating/airless, -/area/ruin/unpowered) -"k" = ( -/obj/structure/alien/resin/wall, -/turf/open/floor/plating/airless, -/area/ruin/unpowered) -"l" = ( -/obj/structure/alien/resin/membrane, -/turf/open/floor/plating/airless, -/area/ruin/unpowered) -"m" = ( -/obj/structure/alien/weeds, -/obj/structure/table, -/turf/open/floor/plating/airless, -/area/ruin/unpowered) -"n" = ( -/obj/structure/alien/weeds, -/obj/effect/decal/remains/robot, -/turf/open/floor/plating/airless, -/area/ruin/unpowered) -"o" = ( -/obj/structure/alien/weeds/node, -/obj/structure/table, -/turf/open/floor/plating/airless, -/area/ruin/unpowered) -"p" = ( -/obj/structure/girder, -/turf/open/floor/plating/airless, -/area/ruin/unpowered) -"q" = ( -/turf/open/floor/plating/airless, -/area/ruin/unpowered) -"r" = ( -/obj/structure/alien/weeds, -/obj/structure/bed/nest, -/obj/effect/decal/remains/xeno, -/turf/open/floor/plating/airless, -/area/ruin/unpowered) - -(1,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -b -b -b -a -a -"} -(2,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -b -p -p -p -c -a -"} -(3,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -b -b -c -q -q -c -a -"} -(4,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -b -b -q -q -q -q -c -b -"} -(5,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -b -q -q -q -q -c -b -"} -(6,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -c -q -q -q -q -p -b -"} -(7,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -c -q -q -q -c -q -b -b -"} -(8,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -b -b -q -q -q -b -b -b -a -"} -(9,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -b -b -b -b -b -b -a -a -a -"} -(10,1,1) = {" -a -a -a -a -a -b -b -a -a -a -a -a -a -a -a -a -a -a -a -b -b -a -b -b -b -a -a -a -a -"} -(11,1,1) = {" -a -a -a -a -b -b -b -b -b -a -a -a -b -b -b -b -b -b -a -a -a -a -a -a -a -a -a -a -a -"} -(12,1,1) = {" -a -a -a -b -b -b -b -k -c -a -a -b -b -b -b -b -b -a -a -a -a -a -a -a -a -a -a -a -a -"} -(13,1,1) = {" -a -a -a -b -b -b -k -f -f -e -a -c -d -p -b -b -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(14,1,1) = {" -a -a -b -b -b -k -f -f -f -c -c -c -f -c -b -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(15,1,1) = {" -a -a -b -b -b -k -f -i -f -c -m -m -f -c -b -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(16,1,1) = {" -a -a -b -b -e -f -h -f -f -e -f -h -f -c -c -c -c -a -a -a -a -a -a -a -a -a -a -a -a -"} -(17,1,1) = {" -a -a -a -c -f -f -f -f -f -c -j -f -f -c -h -f -e -b -a -a -a -a -a -a -a -a -a -a -a -"} -(18,1,1) = {" -a -a -a -c -c -c -c -c -f -c -f -j -f -c -f -f -l -b -b -a -a -a -a -a -a -a -a -a -a -"} -(19,1,1) = {" -a -a -b -c -g -f -f -f -f -f -f -f -f -f -f -f -f -l -q -b -a -a -a -a -a -a -a -a -a -"} -(20,1,1) = {" -a -b -b -c -h -f -f -f -f -f -f -f -f -f -f -f -r -d -b -b -a -a -a -a -a -a -a -a -a -"} -(21,1,1) = {" -b -b -b -c -c -c -c -c -f -c -f -f -f -c -f -f -f -d -b -b -a -a -a -a -a -a -a -a -a -"} -(22,1,1) = {" -b -b -b -d -f -f -f -f -f -c -f -f -i -c -i -g -d -b -b -a -a -a -a -a -a -a -a -a -a -"} -(23,1,1) = {" -b -b -b -c -i -f -h -f -f -c -f -h -f -c -c -c -h -b -b -a -a -a -a -a -a -a -a -a -a -"} -(24,1,1) = {" -a -a -b -c -j -f -f -f -f -e -i -f -f -k -q -b -b -b -b -a -a -a -a -a -a -a -a -a -a -"} -(25,1,1) = {" -a -a -b -c -c -c -f -f -f -c -f -i -k -q -p -b -b -b -a -a -a -a -a -a -a -a -a -a -a -"} -(26,1,1) = {" -a -a -a -a -b -c -c -f -n -c -c -c -q -b -b -b -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(27,1,1) = {" -a -a -a -a -b -b -c -m -o -c -a -a -b -b -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(28,1,1) = {" -a -a -a -a -b -b -l -l -p -p -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(29,1,1) = {" -a -a -a -a -b -b -b -b -b -b -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(30,1,1) = {" -a -a -a -a -b -b -b -b -b -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(31,1,1) = {" -a -a -a -a -a -b -b -b -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} diff --git a/_maps/RandomRuins/SpaceRuins/derelict6.dmm b/_maps/RandomRuins/SpaceRuins/derelict6.dmm index 9220bcae7e2a46..12a23bd4eae93c 100644 --- a/_maps/RandomRuins/SpaceRuins/derelict6.dmm +++ b/_maps/RandomRuins/SpaceRuins/derelict6.dmm @@ -14,12 +14,6 @@ /obj/structure/lattice, /turf/template_noop, /area/template_noop) -"ad" = ( -/obj/structure/girder, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg2" - }, -/area/ruin/unpowered) "ae" = ( /obj/item/stack/sheet/iron, /obj/structure/lattice, @@ -35,11 +29,6 @@ "ag" = ( /turf/open/floor/iron/airless, /area/ruin/unpowered) -"ah" = ( -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" - }, -/area/ruin/unpowered) "ai" = ( /turf/closed/wall, /area/ruin/unpowered) @@ -52,9 +41,8 @@ /area/template_noop) "ak" = ( /obj/item/stack/rods, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/unpowered) "al" = ( /obj/structure/fluff/broken_flooring{ @@ -74,20 +62,8 @@ /area/ruin/unpowered) "ao" = ( /obj/structure/closet/emcloset, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg3" - }, -/area/ruin/unpowered) -"ap" = ( -/turf/open/floor/plating/airless{ - icon_state = "platingdmg3" - }, -/area/ruin/unpowered) -"aq" = ( -/obj/structure/girder, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/unpowered) "ar" = ( /obj/structure/girder, @@ -95,20 +71,13 @@ /area/ruin/unpowered) "as" = ( /obj/item/stack/sheet/iron, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/unpowered) "at" = ( /obj/item/stack/rods, /turf/open/floor/iron/airless, /area/ruin/unpowered) -"au" = ( -/obj/item/stack/sheet/iron, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg3" - }, -/area/ruin/unpowered) "av" = ( /obj/effect/decal/remains/human, /turf/open/floor/iron/airless, @@ -123,9 +92,8 @@ /area/ruin/unpowered) "ay" = ( /obj/item/stack/tile/iron/base, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/unpowered) "az" = ( /obj/structure/fluff/broken_flooring{ @@ -143,12 +111,6 @@ }, /turf/template_noop, /area/template_noop) -"aB" = ( -/obj/item/stack/tile/iron/base, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" - }, -/area/ruin/unpowered) "aC" = ( /obj/machinery/light/broken/directional/south, /turf/open/floor/iron/airless, @@ -159,9 +121,8 @@ /obj/effect/turf_decal/tile/bar{ dir = 1 }, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/unpowered) "aE" = ( /obj/structure/door_assembly/door_assembly_mhatch{ @@ -234,9 +195,8 @@ /area/ruin/unpowered) "aP" = ( /obj/machinery/light/broken/directional/north, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/unpowered) "aQ" = ( /obj/item/stack/tile/iron/base, @@ -260,16 +220,14 @@ "aU" = ( /obj/structure/table/wood, /obj/item/shard, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/unpowered) "aV" = ( /obj/structure/table/wood, /obj/item/plate, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/unpowered) "aW" = ( /obj/structure/table, @@ -315,15 +273,8 @@ /turf/open/floor/iron/airless, /area/ruin/unpowered) "be" = ( -/turf/open/floor/plating/airless{ - icon_state = "platingdmg2" - }, -/area/ruin/unpowered) -"bg" = ( -/obj/item/stack/sheet/iron, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/unpowered) "bh" = ( /obj/machinery/light/broken/directional/west, @@ -333,9 +284,8 @@ "bi" = ( /obj/item/stack/sheet/iron, /obj/item/clothing/head/chefhat, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/unpowered) "bj" = ( /obj/item/plate, @@ -344,21 +294,18 @@ /area/ruin/unpowered) "bk" = ( /obj/structure/table_frame/wood, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/unpowered) "bl" = ( /obj/structure/girder, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/unpowered) "bm" = ( /obj/item/chair, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/unpowered) "bo" = ( /obj/item/stack/rods, @@ -367,22 +314,14 @@ "bp" = ( /obj/item/stack/sheet/iron, /obj/structure/girder, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" - }, -/area/ruin/unpowered) -"bq" = ( -/obj/item/stack/tile/iron/base, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/unpowered) "br" = ( /obj/structure/girder, /obj/item/stack/sheet/iron, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/unpowered) "bt" = ( /obj/structure/fluff/broken_flooring{ @@ -571,7 +510,7 @@ aa aa aa ac -ap +be aw ag ag @@ -594,11 +533,11 @@ aa aa aa bw -ad +bl ag ag ag -ah +be be be be @@ -616,19 +555,19 @@ aa aa aa ac -ap -ap +be +be at bD ag ai ai ai -aq -ah -bg bl -ah +be +as +bl +be ay be ac @@ -648,10 +587,10 @@ aE aH aQ aH -ap -ap -ah -ah +be +be +be +be be be aa @@ -661,7 +600,7 @@ aa aa ac ac -ap +be am ai ag @@ -673,9 +612,9 @@ ai ai ai ai -aq +bl bp -ah +be as ac aa @@ -684,8 +623,8 @@ aa aa ac ac -ap -ah +be +be ai av ag @@ -696,8 +635,8 @@ aR aW aW bh -ap -ap +be +be br ac ac @@ -707,9 +646,9 @@ aa aa aa aa -ap -ah -aq +be +be +bl ag aw ag @@ -719,8 +658,8 @@ aR aR aR bi -ap -bq +be +ay bl ac ac @@ -742,9 +681,9 @@ aR aR ba bj -au -ap -aq +as +be +bl ac ac ab @@ -821,7 +760,7 @@ ac (15,1,1) = {" aa aa -ad +bl ai ai ai @@ -831,10 +770,10 @@ ag aF aN aT -ah +be aM aT -au +as be ai ac @@ -844,8 +783,8 @@ aa (16,1,1) = {" aa ac -ap -ap +be +be ao ai ag @@ -856,10 +795,10 @@ aO bI ac be -ap +be ac -au -aq +as +bl aa aa aa @@ -869,7 +808,7 @@ aa ac bx ak -ap +be ai ag ag @@ -877,8 +816,8 @@ ag ai aM aU -aB -ap +ay +be bk bm az @@ -891,19 +830,19 @@ aa aa aa ae -ap -ap -aq +be +be +bl ag ag aC ai aM -ap -ap -ap +be +be +be ac -ap +be ac aa aa @@ -915,17 +854,17 @@ aa aa aa bz -ap +be ai ag ag ag ai aP -ap +be ac be -ap +be aZ aa aa @@ -938,16 +877,16 @@ aa aa aa ac -ap +be ai ag ag ag ai -ap +be aV aD -ap +be ac ac aa @@ -967,9 +906,9 @@ ag ag ag ai -au -ap -ap +as +be +be aY ac ac @@ -985,14 +924,14 @@ aa aa aa ac -ap +be aw at ag ai ai ai -aq +bl ac aa bo diff --git a/_maps/RandomRuins/SpaceRuins/derelict7.dmm b/_maps/RandomRuins/SpaceRuins/derelict7.dmm index 6b8d7cbd270e52..38e315e8d35dec 100644 --- a/_maps/RandomRuins/SpaceRuins/derelict7.dmm +++ b/_maps/RandomRuins/SpaceRuins/derelict7.dmm @@ -25,11 +25,6 @@ /obj/structure/door_assembly/door_assembly_med, /turf/template_noop, /area/ruin/space/has_grav) -"dy" = ( -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" - }, -/area/ruin/space/has_grav) "dV" = ( /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -49,24 +44,21 @@ /area/ruin/space/has_grav) "eX" = ( /obj/item/stack/rods, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/space/has_grav) "fc" = ( /obj/structure/disposalpipe/broken{ dir = 8 }, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/space/has_grav) "fW" = ( /obj/effect/spawner/random/medical/patient_stretcher, /obj/effect/spawner/random/medical/minor_healing, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/space/has_grav) "gi" = ( /obj/effect/spawner/random/structure/girder, @@ -98,12 +90,6 @@ /obj/item/stack/rods, /turf/template_noop, /area/template_noop) -"hl" = ( -/obj/item/stack/rods, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg2" - }, -/area/ruin/space/has_grav) "iB" = ( /obj/effect/turf_decal/tile/yellow{ dir = 4 @@ -130,14 +116,12 @@ /area/template_noop) "lU" = ( /obj/item/stack/tile/iron, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/space/has_grav) "mM" = ( -/turf/open/floor/iron/airless{ - icon_state = "damaged3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/has_grav) "nf" = ( /turf/open/floor/iron/airless, @@ -147,9 +131,8 @@ /turf/template_noop, /area/template_noop) "ox" = ( -/turf/open/floor/plating/airless{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/space/has_grav) "oy" = ( /obj/effect/turf_decal/tile/yellow{ @@ -172,9 +155,8 @@ /area/ruin/space/has_grav) "pc" = ( /obj/effect/spawner/random/engineering/tank, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/space/has_grav) "pd" = ( /obj/structure/lattice, @@ -182,9 +164,8 @@ /turf/template_noop, /area/template_noop) "pr" = ( -/turf/open/floor/plating/airless{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating/airless, /area/ruin/space/has_grav) "pR" = ( /obj/item/reagent_containers/pill/maintenance, @@ -218,33 +199,25 @@ /obj/structure/grille/broken, /obj/effect/decal/cleanable/glass, /obj/item/stack/rods, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/space/has_grav) "tH" = ( /obj/item/stack/tile/iron, /obj/item/stack/rods, /turf/template_noop, /area/template_noop) -"tR" = ( -/turf/open/floor/iron/airless{ - icon_state = "damaged5" - }, -/area/ruin/space/has_grav) "uB" = ( /obj/structure/disposalpipe/broken{ dir = 1 }, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/space/has_grav) "vW" = ( /obj/structure/extinguisher_cabinet/directional/north, -/turf/open/floor/iron/airless{ - icon_state = "damaged2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/has_grav) "wz" = ( /obj/structure/lattice, @@ -252,11 +225,6 @@ /obj/item/stack/sheet/iron, /turf/template_noop, /area/template_noop) -"wI" = ( -/turf/open/floor/plating/airless{ - icon_state = "platingdmg3" - }, -/area/ruin/space/has_grav) "wJ" = ( /obj/structure/lattice, /obj/item/shard, @@ -272,16 +240,10 @@ }, /turf/open/floor/plating/airless, /area/ruin/space/has_grav) -"yO" = ( -/turf/open/floor/iron/airless{ - icon_state = "damaged2" - }, -/area/ruin/space/has_grav) "zw" = ( /obj/effect/spawner/random/structure/table_or_rack, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/space/has_grav) "AV" = ( /turf/open/floor/wood/airless, @@ -294,9 +256,8 @@ /obj/structure/disposalpipe/broken{ dir = 4 }, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/space/has_grav) "Ca" = ( /obj/machinery/medical_kiosk, @@ -341,9 +302,8 @@ /obj/structure/frame/machine, /obj/item/circuitboard/machine/vendor, /obj/machinery/light/broken/directional/south, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/space/has_grav) "DY" = ( /turf/template_noop, @@ -355,24 +315,17 @@ /area/template_noop) "EE" = ( /obj/effect/spawner/random/trash/botanical_waste, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/space/has_grav) "Fv" = ( /obj/item/stack/sheet/iron, /turf/template_noop, /area/template_noop) -"FQ" = ( -/turf/open/floor/iron/airless{ - icon_state = "damaged1" - }, -/area/ruin/space/has_grav) "Gb" = ( /obj/item/shard, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/space/has_grav) "GP" = ( /obj/structure/table/wood, @@ -396,9 +349,8 @@ "IE" = ( /obj/structure/grille/broken, /obj/effect/decal/cleanable/glass, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/space/has_grav) "IR" = ( /obj/effect/decal/cleanable/glass, @@ -408,9 +360,8 @@ "Jy" = ( /obj/structure/closet, /obj/effect/spawner/random/maintenance/three, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/space/has_grav) "JI" = ( /obj/structure/door_assembly, @@ -426,15 +377,8 @@ /obj/structure/disposalpipe/broken{ dir = 8 }, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" - }, -/area/ruin/space/has_grav) -"Ke" = ( -/obj/item/stack/rods, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/space/has_grav) "Kt" = ( /obj/structure/disposalpipe/broken{ @@ -454,11 +398,6 @@ /obj/item/stack/rods, /turf/open/floor/wood/airless, /area/ruin/space/has_grav) -"Lj" = ( -/turf/open/floor/iron/airless{ - icon_state = "damaged4" - }, -/area/ruin/space/has_grav) "My" = ( /obj/machinery/cell_charger, /obj/structure/table, @@ -536,9 +475,8 @@ /area/ruin/space/has_grav) "Sz" = ( /obj/item/wallframe/firealarm, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/space/has_grav) "SE" = ( /obj/structure/disposalpipe/segment{ @@ -561,9 +499,8 @@ "Vn" = ( /obj/effect/decal/cleanable/glass, /obj/structure/grille, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/space/has_grav) "We" = ( /obj/structure/lattice, @@ -572,15 +509,13 @@ /area/template_noop) "Wr" = ( /obj/structure/door_assembly/door_assembly_mai, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/space/has_grav) "WX" = ( /obj/effect/spawner/random/vending/colavend, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/space/has_grav) "Yt" = ( /obj/effect/turf_decal/tile/blue, @@ -616,7 +551,7 @@ DY (2,1,1) = {" DY eP -wI +ox eP eP Pi @@ -653,21 +588,21 @@ Si uB jk hf -wI +ox jk Cc ox "} (5,1,1) = {" -wI +ox Ua nf -Lj +mM SE Sz CT wJ -dy +ox mM eX lQ @@ -676,7 +611,7 @@ wJ (6,1,1) = {" CT gi -tR +mM nf JN QV @@ -724,10 +659,10 @@ rt Ua nf CT -FQ +mM pd Jy -wI +ox oP CT DY @@ -735,7 +670,7 @@ DY "} (10,1,1) = {" CT -hl +eX eP vW BX @@ -764,12 +699,12 @@ eP DY "} (12,1,1) = {" -dy +ox rt gi CT xk -dy +ox eP pR hf @@ -780,7 +715,7 @@ DY "} (13,1,1) = {" QV -wI +ox eP tk lQ @@ -816,7 +751,7 @@ nf QV wz Qw -dy +ox GP bS AV @@ -827,8 +762,8 @@ DY gi eP Tb -tR -Ke +mM +eX Et WX eP @@ -842,7 +777,7 @@ DY CT Cg Co -yO +mM ox DY Di @@ -879,7 +814,7 @@ Vn rN eP lQ -Ke +eX Pi DY "} @@ -904,7 +839,7 @@ CT oy iB Lc -Ke +eX CT ox Lc @@ -935,7 +870,7 @@ eP eP CT CT -dy +ox oX gX eP @@ -949,7 +884,7 @@ DY Pi gi DY -wI +ox NM CT CT @@ -966,7 +901,7 @@ CT pr CT CT -dy +ox DY DY DY diff --git a/_maps/RandomRuins/SpaceRuins/derelict8.dmm b/_maps/RandomRuins/SpaceRuins/derelict8.dmm index 2483161b82428a..f65b7303d1651a 100644 --- a/_maps/RandomRuins/SpaceRuins/derelict8.dmm +++ b/_maps/RandomRuins/SpaceRuins/derelict8.dmm @@ -74,9 +74,8 @@ /area/ruin/space/has_grav) "kA" = ( /obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/ruin/space/has_grav) "lj" = ( /obj/structure/cable, @@ -108,9 +107,8 @@ /area/ruin/space/has_grav) "uG" = ( /obj/effect/spawner/random/trash/mess, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/space/has_grav) "uV" = ( /obj/effect/turf_decal/tile/neutral{ @@ -121,12 +119,6 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/iron/dark/textured, /area/ruin/space/has_grav) -"vw" = ( -/obj/structure/cable, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg3" - }, -/area/ruin/space/has_grav) "wM" = ( /obj/structure/lattice, /obj/structure/girder/displaced, @@ -159,9 +151,8 @@ /turf/template_noop, /area/template_noop) "zt" = ( -/turf/open/floor/plating/airless{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/space/has_grav) "zF" = ( /obj/structure/closet/crate, @@ -207,12 +198,6 @@ /obj/effect/spawner/random/engineering/tank, /turf/open/floor/plating/airless, /area/ruin/space/has_grav) -"Gq" = ( -/obj/structure/girder/displaced, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg2" - }, -/area/ruin/space/has_grav) "Jy" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -315,9 +300,8 @@ "Qp" = ( /obj/effect/spawner/random/trash/mess, /obj/structure/cable, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/space/has_grav) "Qs" = ( /obj/effect/turf_decal/stripes/line, @@ -326,12 +310,6 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/iron, /area/ruin/space/has_grav) -"Sp" = ( -/obj/structure/cable, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" - }, -/area/ruin/space/has_grav) "SL" = ( /obj/effect/spawner/random/trash/mess, /obj/structure/cable, @@ -358,15 +336,13 @@ /area/ruin/space/has_grav) "WV" = ( /obj/structure/cable, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/space/has_grav) "Xw" = ( /obj/structure/girder/displaced, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/space/has_grav) "XC" = ( /obj/effect/spawner/structure/window/reinforced/tinted, @@ -416,7 +392,7 @@ Cp Cp Cp Cp -Sp +WV OD Nl OD @@ -517,7 +493,7 @@ OO Jy Yp Ym -vw +WV Nl Px es @@ -591,12 +567,12 @@ Cp (14,1,1) = {" Cp Cp -Gq +Xw Yp Yp Yp Yp -vw +WV Xw bY dm diff --git a/_maps/RandomRuins/SpaceRuins/derelict_sulaco.dmm b/_maps/RandomRuins/SpaceRuins/derelict_sulaco.dmm new file mode 100644 index 00000000000000..93c7ade2950f29 --- /dev/null +++ b/_maps/RandomRuins/SpaceRuins/derelict_sulaco.dmm @@ -0,0 +1,1549 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"ag" = ( +/obj/machinery/door/airlock/command/glass{ + name = "Bridge Office" + }, +/turf/open/floor/iron/smooth, +/area/ruin/unpowered) +"bI" = ( +/obj/structure/alien/weeds, +/obj/item/chair/plastic, +/turf/open/floor/iron/airless, +/area/ruin/unpowered) +"bO" = ( +/obj/structure/alien/weeds, +/obj/structure/bed/nest, +/turf/open/floor/iron/airless, +/area/ruin/unpowered) +"bU" = ( +/obj/structure/alien/weeds, +/obj/effect/decal/cleanable/xenoblood/xgibs/limb, +/turf/open/floor/iron/airless, +/area/ruin/unpowered) +"cH" = ( +/obj/effect/turf_decal/tile/red/half{ + dir = 1 + }, +/obj/machinery/light/red/directional/north, +/turf/open/floor/iron/smooth, +/area/ruin/unpowered) +"dk" = ( +/obj/structure/alien/weeds, +/obj/structure/alien/resin/wall, +/turf/open/floor/plating/airless, +/area/ruin/unpowered) +"dD" = ( +/obj/structure/chair/office{ + dir = 1 + }, +/turf/open/floor/iron/smooth, +/area/ruin/unpowered) +"dM" = ( +/obj/structure/window/reinforced/spawner/west, +/obj/machinery/computer/terminal{ + dir = 4 + }, +/turf/open/floor/pod/light, +/area/ruin/unpowered) +"eU" = ( +/obj/structure/window/reinforced/spawner/east, +/obj/item/rack_parts, +/turf/open/floor/circuit/off, +/area/ruin/unpowered) +"fd" = ( +/obj/structure/frame/machine, +/obj/effect/turf_decal/tile/red/fourcorners, +/turf/open/floor/iron/smooth, +/area/ruin/unpowered) +"fI" = ( +/obj/machinery/photocopier, +/turf/open/floor/pod/light, +/area/ruin/unpowered) +"fP" = ( +/obj/structure/table/reinforced, +/turf/open/floor/carpet, +/area/ruin/unpowered) +"gx" = ( +/obj/structure/alien/weeds, +/obj/structure/closet, +/turf/open/floor/iron/airless, +/area/ruin/unpowered) +"gI" = ( +/obj/structure/alien/weeds, +/obj/item/chair/plastic, +/turf/open/floor/plating/airless, +/area/ruin/unpowered) +"gL" = ( +/obj/structure/table/reinforced, +/obj/item/kirbyplants{ + pixel_y = 10 + }, +/obj/effect/turf_decal/tile/red/anticorner{ + dir = 1 + }, +/obj/machinery/camera/directional/north{ + network = list() + }, +/turf/open/floor/iron/smooth, +/area/ruin/unpowered) +"hi" = ( +/turf/template_noop, +/area/template_noop) +"hp" = ( +/obj/machinery/atmospherics/components/unary/vent_pump, +/turf/open/floor/wood, +/area/ruin/unpowered) +"hy" = ( +/obj/machinery/door/airlock/command/glass{ + name = "Captain's Quarters" + }, +/turf/open/floor/wood, +/area/ruin/unpowered) +"hT" = ( +/obj/structure/alien/weeds/node, +/turf/open/floor/iron/airless, +/area/ruin/unpowered) +"hU" = ( +/obj/structure/table/reinforced, +/obj/item/paper_bin, +/obj/item/pen/fountain, +/turf/open/floor/pod/light, +/area/ruin/unpowered) +"hV" = ( +/turf/open/floor/iron/smooth, +/area/ruin/unpowered) +"ia" = ( +/obj/machinery/door/airlock/command/glass{ + name = "Bridge" + }, +/obj/effect/turf_decal/tile/red/half{ + dir = 1 + }, +/turf/open/floor/iron/smooth_edge{ + dir = 1 + }, +/area/ruin/unpowered) +"ib" = ( +/obj/structure/alien/weeds, +/obj/machinery/light/red/directional/west, +/turf/open/floor/iron/airless, +/area/ruin/unpowered) +"iB" = ( +/mob/living/simple_animal/pet/cat{ + name = "Jonesy" + }, +/turf/open/floor/wood, +/area/ruin/unpowered) +"jo" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/turf/open/floor/pod/light, +/area/ruin/unpowered) +"jq" = ( +/obj/structure/window/reinforced/spawner/east, +/obj/structure/window/reinforced/spawner, +/obj/item/circuitboard/machine/telecomms/processor, +/obj/item/rack_parts, +/turf/open/floor/circuit/off, +/area/ruin/unpowered) +"jI" = ( +/obj/machinery/door/window/brigdoor/left/directional/south, +/turf/open/floor/pod/light, +/area/ruin/unpowered) +"kd" = ( +/obj/structure/window/reinforced/spawner, +/obj/item/stack/cable_coil/cut, +/obj/structure/frame/machine, +/turf/open/floor/circuit/off, +/area/ruin/unpowered) +"lq" = ( +/obj/machinery/door/airlock/maintenance/external{ + name = "Bridge Maintenance" + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"lr" = ( +/obj/structure/alien/weeds, +/obj/effect/decal/cleanable/xenoblood/xgibs/up, +/turf/open/floor/plating/airless, +/area/ruin/unpowered) +"lS" = ( +/obj/structure/alien/weeds, +/obj/structure/alien/resin/wall, +/turf/open/floor/iron/airless, +/area/ruin/unpowered) +"mg" = ( +/obj/structure/table/reinforced, +/obj/item/computer_hardware/printer, +/turf/open/floor/pod/light, +/area/ruin/unpowered) +"mi" = ( +/obj/structure/stairs/west, +/obj/machinery/door/window/brigdoor/left/directional/east, +/turf/open/floor/plating, +/area/ruin/unpowered) +"mu" = ( +/obj/structure/frame/computer{ + dir = 1 + }, +/turf/open/floor/pod/light, +/area/ruin/unpowered) +"mB" = ( +/obj/structure/chair/office{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red/half{ + dir = 1 + }, +/turf/open/floor/iron/smooth, +/area/ruin/unpowered) +"na" = ( +/obj/structure/window/reinforced/spawner/east, +/obj/item/stack/cable_coil/cut, +/obj/structure/frame/machine, +/turf/open/floor/circuit/off, +/area/ruin/unpowered) +"nn" = ( +/obj/structure/alien/weeds/node, +/obj/effect/decal/cleanable/xenoblood, +/turf/open/floor/plating/airless, +/area/ruin/unpowered) +"np" = ( +/obj/structure/window/reinforced/spawner/west, +/obj/structure/window/reinforced/spawner, +/obj/structure/table/reinforced, +/turf/open/floor/pod/light, +/area/ruin/unpowered) +"nJ" = ( +/obj/machinery/pdapainter, +/turf/open/floor/wood, +/area/ruin/unpowered) +"ob" = ( +/obj/structure/alien/weeds, +/obj/structure/bed/nest, +/obj/machinery/light/red/directional/east, +/turf/open/floor/iron/airless, +/area/ruin/unpowered) +"pj" = ( +/obj/structure/stairs/west, +/obj/machinery/door/window/brigdoor/right/directional/east, +/turf/open/floor/plating, +/area/ruin/unpowered) +"pv" = ( +/obj/machinery/door/airlock/command/glass{ + name = "Captain's Quarters" + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"pF" = ( +/obj/machinery/camera/directional/south{ + network = list() + }, +/obj/machinery/light/small/broken/directional/south, +/turf/open/floor/plating, +/area/ruin/unpowered) +"qf" = ( +/obj/machinery/light/red/directional/east, +/obj/structure/mirror/directional/east, +/turf/open/floor/iron/showroomfloor, +/area/ruin/unpowered) +"qS" = ( +/obj/effect/turf_decal/tile/red/half, +/turf/open/floor/iron/smooth_edge, +/area/ruin/unpowered) +"qY" = ( +/obj/machinery/door/window/brigdoor/left/directional/east, +/turf/open/floor/pod/light, +/area/ruin/unpowered) +"rb" = ( +/obj/structure/window/reinforced/spawner/west, +/obj/structure/window/reinforced/spawner/north, +/obj/machinery/computer/terminal, +/obj/effect/turf_decal/tile/red/half{ + dir = 8 + }, +/turf/open/floor/iron/smooth, +/area/ruin/unpowered) +"ri" = ( +/obj/effect/turf_decal/tile/red/half, +/obj/machinery/light/red/directional/south, +/turf/open/floor/iron/smooth, +/area/ruin/unpowered) +"rA" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber{ + dir = 8 + }, +/turf/open/floor/wood, +/area/ruin/unpowered) +"rJ" = ( +/obj/machinery/light/red/directional/south, +/turf/open/floor/wood, +/area/ruin/unpowered) +"rM" = ( +/turf/closed/wall/r_wall, +/area/ruin/unpowered) +"rZ" = ( +/obj/machinery/door/airlock/command/glass{ + name = "Bridge" + }, +/obj/effect/turf_decal/tile/red/half, +/turf/open/floor/iron/smooth_edge, +/area/ruin/unpowered) +"sr" = ( +/obj/structure/table/wood, +/obj/item/megaphone/command, +/turf/open/floor/wood, +/area/ruin/unpowered) +"sI" = ( +/obj/effect/turf_decal/tile/red/anticorner{ + dir = 8 + }, +/turf/open/floor/iron/smooth, +/area/ruin/unpowered) +"tm" = ( +/obj/structure/frame/computer{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red/anticorner{ + dir = 8 + }, +/turf/open/floor/iron/smooth, +/area/ruin/unpowered) +"ur" = ( +/obj/structure/sink/greyscale{ + dir = 8; + pixel_x = 12 + }, +/turf/open/floor/iron/showroomfloor, +/area/ruin/unpowered) +"uP" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/ruin/unpowered) +"uW" = ( +/obj/structure/window/reinforced/spawner/north, +/turf/template_noop, +/area/ruin/unpowered) +"vi" = ( +/obj/structure/window/reinforced/spawner/west, +/obj/structure/window/reinforced/spawner/north, +/obj/structure/frame/computer{ + dir = 4 + }, +/turf/open/floor/iron/smooth, +/area/ruin/unpowered) +"vl" = ( +/obj/structure/frame/computer{ + dir = 1 + }, +/turf/open/floor/carpet, +/area/ruin/unpowered) +"vJ" = ( +/obj/structure/table/reinforced, +/obj/item/gun/energy/dueling, +/obj/effect/turf_decal/tile/red/fourcorners, +/turf/open/floor/iron/smooth, +/area/ruin/unpowered) +"vW" = ( +/turf/open/floor/plating/airless, +/area/ruin/unpowered) +"yb" = ( +/obj/item/bedsheet/brown, +/obj/structure/bed, +/turf/open/floor/wood, +/area/ruin/unpowered) +"ym" = ( +/obj/structure/window/reinforced/spawner, +/turf/template_noop, +/area/ruin/unpowered) +"yt" = ( +/obj/item/circuitboard/machine/telecomms/processor, +/turf/open/floor/circuit/off, +/area/ruin/unpowered) +"yS" = ( +/obj/structure/window/reinforced/spawner, +/obj/structure/frame/computer{ + dir = 1 + }, +/turf/open/floor/pod/light, +/area/ruin/unpowered) +"zw" = ( +/obj/structure/alien/weeds, +/turf/open/floor/iron/airless, +/area/ruin/unpowered) +"zA" = ( +/obj/effect/turf_decal/tile/red/half{ + dir = 1 + }, +/turf/open/floor/iron/smooth_edge{ + dir = 1 + }, +/area/ruin/unpowered) +"zH" = ( +/obj/structure/window/reinforced/spawner/west, +/obj/structure/window/reinforced/spawner, +/obj/structure/frame/computer{ + dir = 4 + }, +/turf/open/floor/iron/smooth, +/area/ruin/unpowered) +"Aa" = ( +/obj/machinery/light/red/directional/east, +/turf/open/floor/iron/smooth, +/area/ruin/unpowered) +"Bk" = ( +/obj/structure/window/reinforced/spawner/east, +/obj/structure/window/reinforced/spawner/north, +/obj/structure/table/reinforced, +/obj/item/wallframe/button{ + pixel_x = -8; + pixel_y = 9 + }, +/obj/item/wallframe/button{ + pixel_x = -8; + pixel_y = -3 + }, +/turf/open/floor/pod/light, +/area/ruin/unpowered) +"Br" = ( +/obj/structure/window/reinforced/spawner/north, +/obj/structure/window/reinforced/spawner/east, +/obj/machinery/computer/terminal, +/turf/open/floor/iron/smooth, +/area/ruin/unpowered) +"BQ" = ( +/turf/open/floor/pod/light, +/area/ruin/unpowered) +"CU" = ( +/obj/structure/window/reinforced/spawner, +/obj/structure/window/reinforced/spawner/east, +/obj/structure/table/reinforced, +/obj/item/wallframe/button{ + pixel_x = -8; + pixel_y = 9 + }, +/obj/item/wallframe/button{ + pixel_x = -8; + pixel_y = -3 + }, +/obj/item/wallframe/button{ + pixel_x = 5; + pixel_y = -3 + }, +/obj/item/wallframe/button{ + pixel_x = 5; + pixel_y = 9 + }, +/turf/open/floor/pod/light, +/area/ruin/unpowered) +"CV" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/brigdoor/left/directional/west, +/obj/machinery/door/window/left/directional/east, +/turf/open/floor/iron/smooth, +/area/ruin/unpowered) +"Ek" = ( +/obj/machinery/door/airlock/maintenance/external{ + name = "Bridge Maintenance" + }, +/turf/open/floor/plating/airless, +/area/ruin/unpowered) +"EQ" = ( +/obj/effect/turf_decal/tile/red/anticorner{ + dir = 8 + }, +/obj/machinery/camera/directional/south{ + network = list() + }, +/turf/open/floor/iron/smooth, +/area/ruin/unpowered) +"Fo" = ( +/obj/machinery/light/red/directional/west, +/turf/open/floor/iron/smooth, +/area/ruin/unpowered) +"FM" = ( +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/plating, +/area/ruin/unpowered) +"FP" = ( +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/plating, +/area/ruin/unpowered) +"Hc" = ( +/turf/open/floor/iron/showroomfloor, +/area/ruin/unpowered) +"Hj" = ( +/obj/machinery/door/window/brigdoor/left/directional/north, +/turf/open/floor/pod/light, +/area/ruin/unpowered) +"HC" = ( +/obj/structure/table/wood, +/obj/item/computer_hardware/printer, +/obj/machinery/light/small/broken/directional/east, +/turf/open/floor/wood, +/area/ruin/unpowered) +"In" = ( +/obj/effect/turf_decal/tile/red/anticorner{ + dir = 1 + }, +/turf/open/floor/iron/smooth, +/area/ruin/unpowered) +"It" = ( +/obj/effect/turf_decal/tile/red/half{ + dir = 1 + }, +/turf/open/floor/iron/smooth, +/area/ruin/unpowered) +"IW" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/iron/smooth, +/area/ruin/unpowered) +"Jr" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp, +/turf/open/floor/wood, +/area/ruin/unpowered) +"JT" = ( +/obj/machinery/camera/directional/west{ + network = list() + }, +/turf/open/floor/carpet, +/area/ruin/unpowered) +"Ke" = ( +/obj/structure/window/reinforced/spawner/west, +/obj/machinery/computer/terminal{ + dir = 4 + }, +/turf/open/floor/iron/smooth, +/area/ruin/unpowered) +"Kq" = ( +/obj/structure/alien/weeds, +/obj/effect/decal/cleanable/xenoblood/xgibs/larva, +/turf/open/floor/plating/airless, +/area/ruin/unpowered) +"Ky" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber{ + dir = 1 + }, +/turf/open/floor/iron/smooth, +/area/ruin/unpowered) +"KI" = ( +/obj/machinery/door/airlock/command/glass{ + name = "Captain's Washroom" + }, +/turf/open/floor/iron/showroomfloor, +/area/ruin/unpowered) +"KY" = ( +/obj/structure/window/reinforced/spawner/north, +/obj/structure/window/reinforced/spawner/west, +/obj/item/circuitboard/machine/telecomms/hub, +/obj/item/stack/cable_coil/cut, +/obj/structure/frame/machine, +/turf/open/floor/circuit/off, +/area/ruin/unpowered) +"Lm" = ( +/obj/item/stack/cable_coil/cut, +/turf/open/floor/circuit/off, +/area/ruin/unpowered) +"Lr" = ( +/obj/structure/window/reinforced/spawner/north, +/obj/item/stack/cable_coil/cut, +/turf/open/floor/circuit/off, +/area/ruin/unpowered) +"LS" = ( +/turf/open/floor/plating, +/area/ruin/unpowered) +"Mk" = ( +/obj/effect/turf_decal/tile/red/half, +/turf/open/floor/iron/smooth, +/area/ruin/unpowered) +"ME" = ( +/obj/structure/window/reinforced/spawner/north, +/obj/structure/window/reinforced/spawner/east, +/obj/item/circuitboard/machine/telecomms/relay, +/obj/structure/frame/machine, +/turf/open/floor/circuit/off, +/area/ruin/unpowered) +"MG" = ( +/obj/structure/frame/machine, +/turf/open/floor/pod/light, +/area/ruin/unpowered) +"Oo" = ( +/obj/structure/alien/weeds, +/turf/open/floor/plating/airless, +/area/ruin/unpowered) +"Pq" = ( +/obj/structure/window/reinforced/spawner/north, +/obj/structure/window/reinforced/spawner/east, +/obj/machinery/computer/terminal, +/obj/machinery/light/red/directional/north, +/obj/effect/turf_decal/tile/red/fourcorners, +/turf/open/floor/iron/smooth, +/area/ruin/unpowered) +"Qp" = ( +/obj/machinery/atmospherics/components/unary/vent_pump, +/turf/open/floor/iron/smooth, +/area/ruin/unpowered) +"QP" = ( +/obj/structure/window/reinforced/spawner/west, +/obj/item/circuitboard/machine/telecomms/bus, +/obj/item/rack_parts, +/turf/open/floor/circuit/off, +/area/ruin/unpowered) +"RH" = ( +/obj/structure/frame/computer, +/obj/effect/turf_decal/tile/red/anticorner{ + dir = 1 + }, +/turf/open/floor/iron/smooth, +/area/ruin/unpowered) +"RZ" = ( +/obj/structure/frame/machine, +/obj/machinery/light/red/directional/north, +/obj/effect/turf_decal/tile/red/fourcorners, +/turf/open/floor/iron/smooth, +/area/ruin/unpowered) +"SD" = ( +/obj/structure/closet/crate/large, +/obj/structure/sign/poster/official/terragov{ + pixel_x = 32 + }, +/turf/open/floor/wood, +/area/ruin/unpowered) +"SF" = ( +/obj/structure/frame/computer, +/turf/open/floor/pod/light, +/area/ruin/unpowered) +"SW" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/iron/smooth, +/area/ruin/unpowered) +"TI" = ( +/obj/structure/frame/computer{ + dir = 1 + }, +/obj/machinery/light/red/directional/south, +/obj/effect/turf_decal/tile/red/fourcorners, +/turf/open/floor/iron/smooth, +/area/ruin/unpowered) +"Ub" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/turf/open/floor/iron/smooth, +/area/ruin/unpowered) +"UH" = ( +/obj/structure/alien/weeds, +/obj/machinery/camera/directional/west{ + network = list() + }, +/turf/open/floor/iron/airless, +/area/ruin/unpowered) +"UQ" = ( +/obj/structure/alien/weeds, +/obj/machinery/light/red/directional/east, +/turf/open/floor/iron/airless, +/area/ruin/unpowered) +"UX" = ( +/obj/machinery/light/red/directional/west, +/turf/open/floor/carpet, +/area/ruin/unpowered) +"VO" = ( +/turf/open/floor/wood, +/area/ruin/unpowered) +"VT" = ( +/obj/structure/window/reinforced/spawner/north, +/obj/machinery/computer/terminal, +/turf/open/floor/pod/light, +/area/ruin/unpowered) +"WC" = ( +/obj/structure/alien/weeds, +/obj/effect/decal/cleanable/xenoblood/xgibs/limb, +/turf/open/floor/plating/airless, +/area/ruin/unpowered) +"WH" = ( +/obj/structure/window/reinforced/spawner, +/obj/structure/window/reinforced/spawner/east, +/obj/machinery/computer/terminal{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red/fourcorners, +/turf/open/floor/iron/smooth, +/area/ruin/unpowered) +"WN" = ( +/obj/structure/window/reinforced/spawner/north, +/obj/structure/window/reinforced/spawner/west, +/obj/structure/table/reinforced, +/turf/open/floor/pod/light, +/area/ruin/unpowered) +"WR" = ( +/obj/structure/window/reinforced/spawner, +/obj/structure/window/reinforced/spawner/west, +/obj/machinery/computer/terminal{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red/fourcorners, +/turf/open/floor/iron/smooth, +/area/ruin/unpowered) +"Xg" = ( +/obj/structure/chair/office, +/obj/effect/turf_decal/tile/red/half, +/turf/open/floor/iron/smooth, +/area/ruin/unpowered) +"XC" = ( +/obj/structure/curtain, +/obj/item/soap/deluxe, +/obj/machinery/shower{ + dir = 1 + }, +/turf/open/floor/iron/showroomfloor, +/area/ruin/unpowered) +"YA" = ( +/obj/machinery/door/window/brigdoor/left/directional/west, +/obj/item/stack/cable_coil/cut, +/turf/open/floor/circuit/off, +/area/ruin/unpowered) +"YO" = ( +/obj/structure/toilet{ + dir = 4 + }, +/turf/open/floor/iron/showroomfloor, +/area/ruin/unpowered) +"YQ" = ( +/obj/structure/window/reinforced/spawner/west, +/obj/structure/window/reinforced/spawner, +/obj/item/circuitboard/machine/teleporter_hub, +/turf/open/floor/circuit/off, +/area/ruin/unpowered) +"ZL" = ( +/obj/structure/window/reinforced/spawner/west, +/obj/structure/window/reinforced/spawner/north, +/obj/machinery/computer/terminal, +/obj/effect/turf_decal/tile/red/fourcorners, +/turf/open/floor/iron/smooth, +/area/ruin/unpowered) +"ZP" = ( +/turf/open/floor/carpet, +/area/ruin/unpowered) +"ZZ" = ( +/obj/structure/lattice, +/turf/template_noop, +/area/template_noop) + +(1,1,1) = {" +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +"} +(2,1,1) = {" +hi +hi +hi +hi +hi +hi +rM +rM +uP +uP +uP +uP +uP +rM +rM +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +"} +(3,1,1) = {" +hi +hi +hi +hi +hi +hi +rM +fd +In +vi +Ke +zH +sI +vJ +rM +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +"} +(4,1,1) = {" +hi +hi +hi +hi +hi +hi +rM +RZ +It +hV +Ub +hV +Xg +TI +rM +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +"} +(5,1,1) = {" +hi +hi +hi +hi +hi +rM +rM +RH +SW +hV +hV +hV +IW +tm +rM +rM +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +"} +(6,1,1) = {" +hi +hi +hi +hi +hi +rM +gL +SW +Qp +BQ +BQ +BQ +Ky +IW +EQ +rM +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +"} +(7,1,1) = {" +hi +hi +hi +hi +rM +rM +cH +hV +BQ +fI +hU +mg +BQ +hV +ri +rM +rM +hi +hi +hi +hi +hi +hi +hi +hi +hi +"} +(8,1,1) = {" +hi +hi +hi +hi +rM +ZL +mB +hV +mu +WN +dM +np +SF +hV +Xg +WR +rM +hi +hi +hi +hi +hi +hi +hi +hi +hi +"} +(9,1,1) = {" +hi +hi +hi +hi +rM +Pq +It +hV +mu +VT +jo +yS +MG +hV +Mk +WH +rM +hi +hi +hi +hi +hi +hi +hi +hi +hi +"} +(10,1,1) = {" +hi +hi +hi +hi +rM +rb +SW +hV +BQ +Hj +BQ +jI +BQ +hV +Mk +WR +rM +hi +hi +hi +hi +hi +hi +hi +hi +hi +"} +(11,1,1) = {" +hi +hi +hi +hi +rM +Br +dD +hV +BQ +Bk +qY +CU +BQ +hV +Xg +WH +rM +hi +hi +hi +hi +hi +hi +hi +hi +hi +"} +(12,1,1) = {" +hi +hi +rM +rM +rM +rM +rM +mi +pj +uW +hi +ym +mi +pj +rM +rM +rM +rM +rM +rM +hi +hi +hi +hi +hi +hi +"} +(13,1,1) = {" +hi +Oo +dk +hT +bO +ib +UH +Oo +Oo +ZZ +hi +hi +gI +Oo +ib +lS +rM +FP +LS +rM +hi +hi +hi +hi +hi +hi +"} +(14,1,1) = {" +hi +ZZ +dk +zw +zw +bU +zw +lr +hi +hi +hi +hi +hi +Oo +bO +zw +lq +LS +pF +rM +hi +hi +hi +hi +hi +hi +"} +(15,1,1) = {" +hi +ZZ +dk +zw +zw +zw +bO +WC +hi +hi +hi +hi +hi +Oo +zw +hT +rM +LS +LS +rM +hi +hi +hi +hi +hi +hi +"} +(16,1,1) = {" +hi +ZZ +dk +zw +hT +bO +zw +WC +ZZ +hi +hi +ZZ +ZZ +nn +zw +bO +rM +FM +LS +rM +hi +hi +hi +hi +hi +hi +"} +(17,1,1) = {" +hi +Oo +dk +UQ +zw +zw +bI +Oo +Kq +hi +hi +hi +Oo +Oo +zw +bU +rM +rM +pv +rM +hi +hi +hi +hi +hi +hi +"} +(18,1,1) = {" +hi +hi +rM +rM +KY +QP +YA +YQ +dk +dk +dk +dk +dk +bI +ob +gx +rM +sr +rJ +rM +rM +hi +hi +hi +hi +hi +"} +(19,1,1) = {" +hi +hi +hi +rM +Lr +Lm +yt +kd +rM +rZ +rM +ia +rM +rM +rM +rM +rM +Jr +iB +yb +rM +rM +rM +rM +hi +hi +"} +(20,1,1) = {" +hi +hi +hi +rM +ME +eU +na +jq +rM +qS +Fo +zA +rM +UX +JT +ZP +hy +VO +VO +VO +rM +YO +XC +rM +hi +hi +"} +(21,1,1) = {" +hi +hi +hi +rM +uP +uP +uP +uP +rM +qS +hV +zA +ag +ZP +ZP +vl +rM +rA +hp +VO +KI +Hc +Hc +lq +vW +hi +"} +(22,1,1) = {" +hi +hi +hi +hi +hi +hi +hi +hi +rM +qS +Aa +zA +rM +fP +ZP +vl +rM +nJ +HC +SD +rM +qf +ur +rM +vW +hi +"} +(23,1,1) = {" +hi +hi +hi +hi +hi +hi +hi +hi +rM +rZ +rM +ia +rM +uP +CV +uP +rM +rM +rM +rM +rM +rM +rM +rM +ZZ +hi +"} +(24,1,1) = {" +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +rM +hi +hi +hi +hi +hi +hi +vW +vW +hi +"} +(25,1,1) = {" +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +rM +ZZ +ZZ +ZZ +hi +ZZ +ZZ +vW +vW +hi +"} +(26,1,1) = {" +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +Ek +hi +hi +hi +hi +hi +hi +hi +vW +hi +"} +(27,1,1) = {" +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +rM +hi +hi +hi +hi +hi +hi +hi +hi +hi +"} +(28,1,1) = {" +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +rM +hi +hi +hi +hi +hi +hi +hi +hi +hi +"} +(29,1,1) = {" +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +hi +"} diff --git a/_maps/RandomRuins/SpaceRuins/hellfactory.dmm b/_maps/RandomRuins/SpaceRuins/hellfactory.dmm index 42c87b6bac78fb..002fafc87c637a 100644 --- a/_maps/RandomRuins/SpaceRuins/hellfactory.dmm +++ b/_maps/RandomRuins/SpaceRuins/hellfactory.dmm @@ -720,10 +720,8 @@ /obj/effect/turf_decal{ dir = 9 }, -/turf/open/floor/plating{ - broken = 1; - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/ruin/space/has_grav/hellfactory) "cv" = ( /obj/effect/turf_decal{ @@ -744,10 +742,8 @@ dir = 1 }, /obj/effect/turf_decal/caution/stand_clear/white, -/turf/open/floor/plating{ - broken = 1; - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/ruin/space/has_grav/hellfactory) "cy" = ( /obj/effect/turf_decal{ @@ -786,47 +782,37 @@ "cF" = ( /obj/effect/turf_decal/delivery/white, /obj/machinery/door/poddoor, -/turf/open/floor/plating{ - broken = 1; - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/ruin/space/has_grav/hellfactory) "cG" = ( /obj/effect/turf_decal/delivery/white, /obj/effect/turf_decal/delivery/red, /obj/item/stack/tile/iron/base, /obj/machinery/door/poddoor, -/turf/open/floor/plating{ - broken = 1; - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/ruin/space/has_grav/hellfactory) "cH" = ( /obj/effect/turf_decal/delivery/white, /obj/structure/grille/broken, /obj/machinery/door/poddoor, -/turf/open/floor/plating{ - broken = 1; - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/ruin/space/has_grav/hellfactory) "cI" = ( /obj/effect/turf_decal/delivery/white, /obj/effect/turf_decal/delivery/red, /obj/machinery/door/poddoor, -/turf/open/floor/plating{ - broken = 1; - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/ruin/space/has_grav/hellfactory) "cJ" = ( /obj/effect/turf_decal/delivery/white, /obj/item/stack/tile/iron/base, /obj/machinery/door/poddoor, -/turf/open/floor/plating{ - broken = 1; - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/ruin/space/has_grav/hellfactory) "cK" = ( /obj/machinery/power/port_gen/pacman, diff --git a/_maps/RandomRuins/SpaceRuins/hilbertresearchfacility.dmm b/_maps/RandomRuins/SpaceRuins/hilbertresearchfacility.dmm index 9b0765f7f1536e..e2ea28c10dd197 100644 --- a/_maps/RandomRuins/SpaceRuins/hilbertresearchfacility.dmm +++ b/_maps/RandomRuins/SpaceRuins/hilbertresearchfacility.dmm @@ -96,9 +96,7 @@ /obj/item/clothing/glasses/meson, /obj/item/clothing/head/hardhat, /obj/effect/turf_decal/box, -/obj/structure/sign/warning/docking{ - pixel_x = -32 - }, +/obj/structure/sign/warning/docking/directional/west, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/hilbertresearchfacility) "cQ" = ( @@ -116,9 +114,7 @@ /obj/item/clothing/glasses/meson, /obj/item/clothing/head/hardhat, /obj/effect/turf_decal/box, -/obj/structure/sign/warning/docking{ - pixel_x = 32 - }, +/obj/structure/sign/warning/docking/directional/east, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/hilbertresearchfacility) "db" = ( @@ -324,13 +320,12 @@ /obj/structure/fluff/tram_rail{ dir = 1 }, -/obj/structure/industrial_lift/tram{ - icon_state = "titanium_white"; - initial_id = "middle_part_hilbert" - }, /obj/machinery/door/window/survival_pod{ dir = 1 }, +/obj/structure/industrial_lift/tram{ + icon_state = "titanium_white" + }, /turf/open/floor/engine, /area/ruin/space/has_grav/powered/hilbertresearchfacility) "hQ" = ( @@ -341,9 +336,7 @@ /area/ruin/space/has_grav/powered/hilbertresearchfacility) "hT" = ( /obj/effect/decal/cleanable/dirt/dust, -/obj/structure/sign/warning/biohazard{ - pixel_y = 32 - }, +/obj/structure/sign/warning/biohazard/directional/north, /turf/open/floor/wood, /area/ruin/space/has_grav/powered/hilbertresearchfacility) "hW" = ( @@ -467,13 +460,13 @@ /turf/open/floor/glass, /area/ruin/space/has_grav/powered/hilbertresearchfacility) "kK" = ( -/obj/structure/industrial_lift/tram{ - icon_state = "titanium_white"; - initial_id = "middle_part_hilbert" - }, /obj/structure/window/reinforced/survival_pod{ dir = 4 }, +/obj/structure/industrial_lift/tram{ + icon_state = "titanium_white" + }, +/obj/effect/landmark/lift_id/hilbert, /turf/open/floor/engine, /area/ruin/space/has_grav/powered/hilbertresearchfacility) "kO" = ( @@ -567,9 +560,7 @@ /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/hilbertresearchfacility) "nk" = ( -/obj/structure/sign/departments/botany{ - pixel_x = -32 - }, +/obj/structure/sign/departments/botany/directional/west, /obj/effect/turf_decal/trimline/green/mid_joiner{ dir = 8 }, @@ -596,9 +587,7 @@ /turf/open/floor/plating/airless, /area/ruin/unpowered/no_grav) "nB" = ( -/obj/structure/sign/departments/chemistry{ - pixel_y = 32 - }, +/obj/structure/sign/departments/chemistry/directional/north, /obj/effect/turf_decal/trimline/blue/arrow_cw{ dir = 1 }, @@ -612,9 +601,7 @@ /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/hilbertresearchfacility) "nU" = ( -/obj/structure/sign/warning/docking{ - pixel_x = -32 - }, +/obj/structure/sign/warning/docking/directional/west, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/hilbertresearchfacility) "oi" = ( @@ -664,20 +651,18 @@ /area/ruin/space/has_grav/powered/hilbertresearchfacility) "pE" = ( /obj/effect/landmark/tram/middle_part/hilbert, -/obj/structure/industrial_lift/tram/central{ - icon_state = "titanium_white"; - initial_id = "middle_part_hilbert"; - tram_id = "tram_hilbert" - }, -/obj/machinery/computer/tram_controls{ - dir = 8; - tram_id = "tram_hilbert" - }, /obj/machinery/light/floor{ brightness = 2; bulb_colour = "#deefff"; bulb_power = 0.6 }, +/obj/machinery/computer/tram_controls{ + dir = 8; + specific_lift_id = "tram_hilbert" + }, +/obj/structure/industrial_lift/tram{ + icon_state = "titanium_white" + }, /turf/open/floor/engine, /area/ruin/space/has_grav/powered/hilbertresearchfacility) "pI" = ( @@ -694,9 +679,7 @@ /turf/open/floor/mineral/titanium/tiled/purple, /area/ruin/space/has_grav/powered/hilbertresearchfacility) "qb" = ( -/obj/structure/sign/warning/docking{ - pixel_x = 32 - }, +/obj/structure/sign/warning/docking/directional/east, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/hilbertresearchfacility) "qd" = ( @@ -782,9 +765,7 @@ "rW" = ( /obj/machinery/light/cold/directional/east, /obj/effect/decal/cleanable/dirt/dust, -/obj/structure/sign/warning{ - pixel_x = 32 - }, +/obj/structure/sign/warning/directional/east, /turf/open/floor/mineral/titanium/tiled/purple, /area/ruin/space/has_grav/powered/hilbertresearchfacility) "sj" = ( @@ -830,9 +811,7 @@ /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/hilbertresearchfacility) "ua" = ( -/obj/structure/sign/warning/docking{ - pixel_y = -32 - }, +/obj/structure/sign/warning/docking/directional/south, /turf/open/floor/iron/grimy, /area/ruin/space/has_grav/powered/hilbertresearchfacility) "uf" = ( @@ -1122,9 +1101,7 @@ /obj/effect/turf_decal/trimline/brown/mid_joiner{ dir = 1 }, -/obj/structure/sign/departments/cargo{ - pixel_y = 32 - }, +/obj/structure/sign/departments/cargo/directional/north, /obj/machinery/button/tram{ id = "middle_part_hilbert"; pixel_y = 4 @@ -1189,9 +1166,7 @@ /obj/effect/turf_decal/trimline/yellow/mid_joiner{ dir = 1 }, -/obj/structure/sign/warning/explosives{ - pixel_y = 32 - }, +/obj/structure/sign/warning/explosives/directional/north, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/hilbertresearchfacility) "AX" = ( @@ -1652,13 +1627,12 @@ /turf/open/floor/mineral/titanium/tiled/purple, /area/ruin/space/has_grav/powered/hilbertresearchfacility) "Kv" = ( -/obj/structure/industrial_lift/tram{ - icon_state = "titanium_white"; - initial_id = "middle_part_hilbert" - }, /obj/structure/window/reinforced/survival_pod{ dir = 8 }, +/obj/structure/industrial_lift/tram{ + icon_state = "titanium_white" + }, /turf/open/floor/engine, /area/ruin/space/has_grav/powered/hilbertresearchfacility) "KC" = ( @@ -1666,27 +1640,25 @@ /area/ruin/space/has_grav/powered/hilbertresearchfacility) "KF" = ( /obj/structure/fluff/tram_rail, -/obj/structure/industrial_lift/tram{ - icon_state = "titanium_purple"; - initial_id = "middle_part_hilbert" +/obj/structure/window/reinforced/survival_pod{ + dir = 8 }, -/obj/structure/shuttle/engine/propulsion/in_wall{ +/obj/structure/window/reinforced/survival_pod, +/obj/structure/shuttle/engine/propulsion/in_wall/tram{ dir = 8; pixel_x = -32 }, -/obj/structure/window/reinforced/survival_pod{ - dir = 8 +/obj/structure/industrial_lift/tram{ + icon_state = "titanium_purple" }, -/obj/structure/window/reinforced/survival_pod, /turf/open/floor/engine, /area/ruin/space/has_grav/powered/hilbertresearchfacility) "KI" = ( /obj/structure/fluff/tram_rail, +/obj/machinery/door/window/survival_pod, /obj/structure/industrial_lift/tram{ - icon_state = "titanium_white"; - initial_id = "middle_part_hilbert" + icon_state = "titanium_white" }, -/obj/machinery/door/window/survival_pod, /turf/open/floor/engine, /area/ruin/space/has_grav/powered/hilbertresearchfacility) "KJ" = ( @@ -1695,18 +1667,17 @@ /area/ruin/unpowered/no_grav) "KK" = ( /obj/structure/fluff/tram_rail, -/obj/structure/industrial_lift/tram{ - icon_state = "titanium_purple"; - initial_id = "middle_part_hilbert" +/obj/structure/window/reinforced/survival_pod{ + dir = 4 }, -/obj/structure/shuttle/engine/propulsion/in_wall{ +/obj/structure/window/reinforced/survival_pod, +/obj/structure/shuttle/engine/propulsion/in_wall/tram{ dir = 4; pixel_x = 32 }, -/obj/structure/window/reinforced/survival_pod{ - dir = 4 +/obj/structure/industrial_lift/tram{ + icon_state = "titanium_purple" }, -/obj/structure/window/reinforced/survival_pod, /turf/open/floor/engine, /area/ruin/space/has_grav/powered/hilbertresearchfacility) "KL" = ( @@ -1787,20 +1758,19 @@ /obj/structure/fluff/tram_rail{ dir = 1 }, -/obj/structure/industrial_lift/tram{ - icon_state = "titanium_purple"; - initial_id = "middle_part_hilbert" - }, -/obj/structure/shuttle/engine/propulsion/in_wall{ - dir = 8; - pixel_x = -32 - }, /obj/structure/window/reinforced/survival_pod{ dir = 8 }, /obj/structure/window/reinforced/survival_pod{ dir = 1 }, +/obj/structure/shuttle/engine/propulsion/in_wall/tram{ + dir = 8; + pixel_x = -32 + }, +/obj/structure/industrial_lift/tram{ + icon_state = "titanium_purple" + }, /turf/open/floor/engine, /area/ruin/space/has_grav/powered/hilbertresearchfacility) "MX" = ( @@ -1968,9 +1938,7 @@ /turf/open/floor/mineral/titanium/white, /area/ruin/space/has_grav/powered/hilbertresearchfacility) "Rk" = ( -/obj/structure/sign/departments/evac{ - pixel_y = -32 - }, +/obj/structure/sign/departments/evac/directional/south, /obj/effect/turf_decal/trimline/white/arrow_cw, /obj/effect/turf_decal/trimline/white/mid_joiner, /turf/open/floor/mineral/plastitanium, @@ -1994,20 +1962,19 @@ /obj/structure/fluff/tram_rail{ dir = 1 }, -/obj/structure/industrial_lift/tram{ - icon_state = "titanium_purple"; - initial_id = "middle_part_hilbert" - }, -/obj/structure/shuttle/engine/propulsion/in_wall{ - dir = 4; - pixel_x = 32 - }, /obj/structure/window/reinforced/survival_pod{ dir = 4 }, /obj/structure/window/reinforced/survival_pod{ dir = 1 }, +/obj/structure/shuttle/engine/propulsion/in_wall/tram{ + dir = 4; + pixel_x = 32 + }, +/obj/structure/industrial_lift/tram{ + icon_state = "titanium_purple" + }, /turf/open/floor/engine, /area/ruin/space/has_grav/powered/hilbertresearchfacility) "RE" = ( @@ -2029,9 +1996,7 @@ "Sa" = ( /obj/effect/turf_decal/trimline/purple/arrow_cw, /obj/effect/turf_decal/trimline/purple/mid_joiner, -/obj/structure/sign/departments/xenobio{ - pixel_y = -32 - }, +/obj/structure/sign/departments/xenobio/directional/south, /obj/item/grown/log/tree{ pixel_y = 4 }, diff --git a/_maps/RandomRuins/SpaceRuins/listeningstation.dmm b/_maps/RandomRuins/SpaceRuins/listeningstation.dmm index 457c99dfde3017..0f3b499d960183 100644 --- a/_maps/RandomRuins/SpaceRuins/listeningstation.dmm +++ b/_maps/RandomRuins/SpaceRuins/listeningstation.dmm @@ -1,617 +1,640 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"aa" = ( -/turf/template_noop, -/area/template_noop) -"ab" = ( -/turf/closed/mineral/random, -/area/ruin/unpowered/no_grav) "ac" = ( -/turf/closed/wall, +/obj/structure/sign/poster/official/nanotrasen_logo{ + pixel_y = 32 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/iron, /area/ruin/space/has_grav/listeningstation) "ad" = ( -/obj/machinery/computer/message_monitor, /obj/machinery/airalarm/syndicate{ - dir = 1; - pixel_y = 24 + dir = 8; + pixel_x = -24 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/item/paper/monitorkey, -/turf/open/floor/iron/dark, +/obj/structure/closet/crate/secure/freezer/commsagent, +/turf/open/floor/plating, /area/ruin/space/has_grav/listeningstation) -"af" = ( -/obj/structure/rack{ - dir = 8 +"ae" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 }, -/obj/item/clothing/mask/gas{ - pixel_x = -3; - pixel_y = 3 +/obj/item/wallframe/button{ + pixel_x = 7; + pixel_y = -7; + name = "Busted Button"; + desc = "Someone appears to have broken this button off it's frame. Not likely to be useful where you found it." }, -/obj/effect/turf_decal/stripes/line, -/obj/item/clothing/mask/gas, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/listeningstation) -"ag" = ( -/turf/closed/wall/r_wall, +/turf/open/floor/iron, /area/ruin/space/has_grav/listeningstation) -"ah" = ( -/obj/machinery/computer/camera_advanced{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/newscaster/directional/north, -/obj/item/radio/intercom/directional/west{ - freerange = 1 +"ap" = ( +/obj/structure/marker_beacon/cerulean, +/obj/structure/sign/nanotrasen{ + pixel_y = -32 }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/listeningstation) -"ak" = ( -/obj/machinery/telecomms/relay/preset/ruskie{ - use_power = 0 +/obj/structure/sign/nanotrasen{ + pixel_x = 32 }, +/turf/open/floor/plating/airless, +/area/ruin/unpowered/no_grav) +"aP" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted, /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron/dark, +/turf/open/floor/iron, /area/ruin/space/has_grav/listeningstation) -"al" = ( -/obj/structure/table, -/obj/item/storage/toolbox/syndicate, -/obj/item/flashlight{ - pixel_y = -12 - }, +"aR" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/listeningstation) -"an" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/machinery/door/airlock/external/ruin{ - id_tag = "syndie_listeningpost_external" - }, -/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, /obj/structure/cable, /turf/open/floor/plating, /area/ruin/space/has_grav/listeningstation) -"ao" = ( -/obj/machinery/light/small/directional/south, -/obj/structure/sign/warning/vacuum{ - pixel_y = 32 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +"be" = ( +/obj/structure/bed/maint, +/obj/item/bedsheet/syndie, +/obj/item/paper/fluff/ruins/listeningstation/reports/october, /turf/open/floor/plating, /area/ruin/space/has_grav/listeningstation) -"ap" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 +"by" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/item/multitool{ + pixel_x = 8; + pixel_y = 3 }, -/obj/machinery/door/airlock/external/ruin{ - id_tag = "syndie_listeningpost_external" +/obj/structure/table, +/obj/item/toy/cards/deck/syndicate{ + pixel_x = -5; + pixel_y = 1 }, -/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, -/obj/structure/cable, /turf/open/floor/plating, /area/ruin/space/has_grav/listeningstation) -"aq" = ( -/obj/structure/curtain, -/obj/machinery/shower{ - pixel_y = 14 +"bC" = ( +/obj/structure/table/wood, +/obj/item/paper/fluff/ruins/listeningstation/reports/november, +/obj/item/crowbar/red, +/obj/machinery/airalarm/syndicate{ + dir = 8; + pixel_x = -24 }, -/obj/machinery/light/small/directional/south, -/obj/item/soap, +/turf/open/floor/iron/grimy, +/area/ruin/space/has_grav/listeningstation) +"ca" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/showroomfloor, +/obj/structure/table, +/obj/item/storage/photo_album/listeningstation, +/turf/open/floor/iron/small, /area/ruin/space/has_grav/listeningstation) -"ar" = ( -/obj/structure/sink{ - dir = 8; - pixel_x = 11 - }, -/obj/structure/toilet{ - pixel_y = 18 +"ch" = ( +/obj/structure/sign/nanotrasen{ + pixel_y = 32 }, -/obj/structure/mirror/directional/east, +/obj/structure/lattice/catwalk, +/obj/structure/marker_beacon/cerulean, +/turf/template_noop, +/area/ruin/unpowered/no_grav) +"cj" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/showroomfloor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/small, /area/ruin/space/has_grav/listeningstation) -"as" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/computer/med_data/syndie{ - dir = 4; - req_access = list("syndicate") +"cq" = ( +/obj/effect/turf_decal/bot, +/obj/item/weldingtool/largetank, +/obj/item/wrench, +/obj/item/clothing/head/welding, +/obj/structure/rack, +/turf/open/floor/plating, +/area/ruin/space/has_grav/listeningstation) +"ct" = ( +/obj/machinery/atmospherics/pipe/smart/simple/supply/visible/layer4, +/turf/open/floor/plating, +/area/ruin/space/has_grav/listeningstation) +"cU" = ( +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/obj/machinery/door/airlock/centcom{ + name = "Nanotrasen Real Locked Door"; + desc = "Truly, a marvel of modern engineering." }, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/listeningstation) -"av" = ( -/obj/structure/extinguisher_cabinet/directional/east, -/obj/structure/table, -/obj/item/paper_bin, -/obj/item/paper/fluff/ruins/listeningstation/reports/november, -/obj/item/pen, -/turf/open/floor/iron/dark, +"db" = ( +/obj/structure/cable, +/turf/open/floor/plating, /area/ruin/space/has_grav/listeningstation) -"aw" = ( -/obj/structure/table, -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high, -/obj/item/stack/cable_coil{ - pixel_x = 3; - pixel_y = -7 +"dg" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 4 }, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/syndicate{ - dir = 8; - pixel_x = -24 - }, -/turf/open/floor/iron/dark, +/obj/structure/table, +/obj/item/storage/medkit/regular, +/obj/item/clothing/neck/stethoscope, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, /area/ruin/space/has_grav/listeningstation) -"ay" = ( -/obj/machinery/door/airlock{ - name = "Toilet" +"dv" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 }, -/turf/open/floor/iron/showroomfloor, +/turf/open/floor/plating, /area/ruin/space/has_grav/listeningstation) -"az" = ( -/obj/structure/filingcabinet, -/obj/item/paper/fluff/ruins/listeningstation/reports/april, -/obj/item/paper/fluff/ruins/listeningstation/reports/may, -/obj/item/paper/fluff/ruins/listeningstation/reports/june, -/obj/item/paper/fluff/ruins/listeningstation/reports/july, -/obj/item/paper/fluff/ruins/listeningstation/reports/august, +"dC" = ( +/obj/structure/table, /obj/item/paper/fluff/ruins/listeningstation/reports/september, -/obj/item/paper/fluff/ruins/listeningstation/reports/october, -/obj/item/paper/fluff/ruins/listeningstation/receipt, -/obj/effect/decal/cleanable/dirt, -/obj/item/paper/fluff/ruins/listeningstation/odd_report, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/listeningstation) -"aB" = ( -/obj/structure/rack{ - dir = 8 +/obj/item/storage/box/donkpockets{ + pixel_x = -2; + pixel_y = 6 + }, +/obj/item/storage/box/donkpockets{ + pixel_x = 2 }, -/obj/item/multitool, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/small, +/area/ruin/space/has_grav/listeningstation) +"dW" = ( +/obj/structure/cable, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, +/turf/open/floor/iron/small, /area/ruin/space/has_grav/listeningstation) -"aC" = ( -/obj/structure/rack{ - dir = 8; - layer = 2.9 - }, -/obj/item/mining_scanner, -/obj/item/pickaxe, +"eR" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, /area/ruin/space/has_grav/listeningstation) -"aE" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/tank_dispenser/oxygen{ - oxygentanks = 4 +"eW" = ( +/obj/structure/table, +/obj/item/reagent_containers/food/drinks/bottle/beer/almost_empty{ + name = "Use To Avert Loneliness"; + desc = "It's been used..."; + pixel_x = 8 }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 +/obj/item/reagent_containers/spray/cleaner{ + pixel_x = -6 }, -/turf/open/floor/mineral/plastitanium, +/turf/open/floor/plating, /area/ruin/space/has_grav/listeningstation) -"aF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +"fG" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/closed/wall/r_wall, /area/ruin/space/has_grav/listeningstation) -"aG" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/on{ - dir = 8; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/turf/open/floor/plating/airless, +"gc" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/plating, /area/ruin/space/has_grav/listeningstation) -"aI" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, +"gl" = ( +/obj/effect/spawner/random/trash/mess, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/grimy, +/area/ruin/space/has_grav/listeningstation) +"gJ" = ( +/obj/structure/table/wood, +/obj/item/seeds/potato, +/obj/item/ammo_box/magazine/m9mm, +/turf/open/floor/iron/grimy, +/area/ruin/space/has_grav/listeningstation) +"hk" = ( +/obj/structure/bookcase/random, +/turf/open/floor/iron/grimy, /area/ruin/space/has_grav/listeningstation) -"aL" = ( -/obj/item/bombcore/badmin{ - anchored = 1; - invisibility = 100 +"hm" = ( +/obj/item/toy/waterballoon{ + name = "Donk Corporation's Emergency Air Supply Balloon"; + desc = "The efficacy of this product is doubted." }, -/turf/closed/wall, +/turf/open/misc/asteroid/airless, +/area/ruin/unpowered/no_grav) +"hK" = ( +/obj/structure/extinguisher_cabinet/directional/south, +/obj/machinery/hydroponics/soil, +/turf/open/floor/iron, /area/ruin/space/has_grav/listeningstation) -"aO" = ( -/obj/machinery/light/small/directional/west, -/obj/structure/closet/crate, -/obj/item/stack/sheet/iron/twenty, -/obj/item/stack/sheet/glass{ - amount = 10 +"iU" = ( +/obj/structure/toilet{ + pixel_y = 18 }, -/obj/item/stack/rods/ten, -/obj/effect/turf_decal/stripes/line, /obj/effect/decal/cleanable/dirt, -/obj/item/storage/box/lights/bulbs, -/obj/item/stack/sheet/mineral/plasma{ - amount = 30 +/obj/item/soap/syndie, +/obj/structure/sign/poster/contraband/gorlex_recruitment{ + pixel_x = -32 }, -/obj/item/stock_parts/cell/high, -/obj/structure/cable, -/turf/open/floor/plating, +/obj/machinery/light/very_dim/directional/east, +/turf/open/floor/iron/showroomfloor, /area/ruin/space/has_grav/listeningstation) -"aP" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 +"jr" = ( +/obj/machinery/power/port_gen/pacman{ + anchored = 1 }, -/turf/open/floor/iron, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plating, /area/ruin/space/has_grav/listeningstation) -"aQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 6; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 +"kG" = ( +/obj/machinery/atmospherics/components/unary/passive_vent/layer2{ + desc = "Doesn't seem to be connected to anything." }, /turf/open/floor/iron, /area/ruin/space/has_grav/listeningstation) -"aR" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/door/airlock{ - name = "Personal Quarters" +"kK" = ( +/obj/machinery/atmospherics/components/tank/air, +/obj/effect/turf_decal/bot, +/obj/structure/cable, +/turf/open/floor/plating, +/area/ruin/space/has_grav/listeningstation) +"lk" = ( +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/item/radio/intercom/directional/east, +/obj/machinery/computer/camera_advanced{ + dir = 8 }, -/turf/open/floor/iron, +/turf/open/floor/iron/dark, /area/ruin/space/has_grav/listeningstation) -"aS" = ( +"lu" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 +/obj/item/toy/balloon/syndicate, +/turf/open/floor/plating, +/area/ruin/space/has_grav/listeningstation) +"lE" = ( +/obj/structure/sign/warning/explosives/alt/directional/north, +/obj/machinery/syndicatebomb/self_destruct{ + anchored = 1 }, -/obj/effect/turf_decal/tile/red{ - dir = 4 +/obj/machinery/door/window/brigdoor{ + dir = 2; + req_access = list("syndicate"); + name = "Self Destruct Option" }, +/obj/machinery/light/small/red/directional/north, +/turf/open/floor/circuit/red, +/area/ruin/space/has_grav/listeningstation) +"nG" = ( +/obj/effect/decal/cleanable/blood/drip, +/obj/structure/table, +/obj/item/camera, /turf/open/floor/iron, /area/ruin/space/has_grav/listeningstation) -"aT" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 +"nX" = ( +/obj/machinery/door/airlock/centcom{ + name = "Syndicate Secure Airlock System"; + desc = "Truly, a marvel of modern engineering." }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron, +/obj/structure/cable, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/turf/open/floor/iron/dark, /area/ruin/space/has_grav/listeningstation) -"aU" = ( -/obj/machinery/airalarm/syndicate{ - dir = 1; - pixel_y = 24 +"oW" = ( +/obj/machinery/telecomms/relay/preset/ruskie{ + use_power = 0 }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 1 +/obj/structure/cable, +/turf/open/floor/plating, +/area/ruin/space/has_grav/listeningstation) +"qD" = ( +/obj/machinery/door/airlock/external/ruin{ + id_tag = "syndie_listeningpost_external_interior" }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "syndicate_comms_base" }, -/obj/effect/baseturf_helper/asteroid/airless, -/obj/effect/turf_decal/tile/red{ +/obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/effect/turf_decal/tile/red{ +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable, +/turf/open/floor/plating, +/area/ruin/space/has_grav/listeningstation) +"qN" = ( +/obj/machinery/atmospherics/components/binary/valve/layer4, +/obj/effect/spawner/random/trash/mess, +/turf/open/floor/plating, +/area/ruin/space/has_grav/listeningstation) +"rc" = ( +/obj/machinery/power/terminal{ dir = 4 }, -/obj/structure/cable, -/turf/open/floor/iron, +/obj/structure/reagent_dispensers/fueltank, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plating, /area/ruin/space/has_grav/listeningstation) -"aV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 1 +"rr" = ( +/obj/machinery/door/airlock{ + name = "Emergency Backup" }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/grimy, +/area/ruin/space/has_grav/listeningstation) +"rE" = ( +/obj/structure/cable, +/turf/open/floor/plating/airless, +/area/ruin/unpowered/no_grav) +"rG" = ( +/turf/closed/wall, +/area/ruin/space/has_grav/listeningstation) +"ta" = ( +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/structure/sign/poster/contraband/random/directional/west, +/obj/item/kirbyplants/random, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/listeningstation) +"tf" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/small, +/area/ruin/space/has_grav/listeningstation) +"tl" = ( +/obj/structure/marker_beacon/cerulean, +/turf/open/floor/plating/airless, +/area/ruin/unpowered/no_grav) +"tm" = ( +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/machinery/airalarm/syndicate{ dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 + pixel_x = 24 }, -/obj/effect/turf_decal/tile/red{ - dir = 1 +/obj/machinery/computer/message_monitor{ + dir = 8 }, -/obj/effect/turf_decal/tile/red{ - dir = 4 +/obj/item/paper/monitorkey, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/listeningstation) +"uI" = ( +/obj/machinery/airalarm/away{ + dir = 1; + pixel_y = 23 }, -/obj/structure/cable, -/obj/machinery/light/small/directional/north, +/obj/effect/decal/cleanable/blood/old, /turf/open/floor/iron, /area/ruin/space/has_grav/listeningstation) -"aW" = ( -/obj/machinery/firealarm/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 +"vC" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/spawner/random/trash/cigbutt, +/turf/open/floor/iron/small, +/area/ruin/space/has_grav/listeningstation) +"vI" = ( +/turf/closed/mineral/random, +/area/ruin/unpowered/no_grav) +"vP" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/secure_closet/medical1{ + req_access = list("syndicate") }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 1; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 +/obj/item/paper/fluff/ruins/listeningstation/reports/september, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/ruin/space/has_grav/listeningstation) +"wk" = ( +/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/ruin/space/has_grav/listeningstation) +"wm" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/small, +/area/ruin/space/has_grav/listeningstation) +"wy" = ( +/obj/structure/marker_beacon/cerulean, +/obj/structure/sign/nanotrasen{ + pixel_y = 32 }, -/obj/effect/turf_decal/tile/red{ - dir = 1 +/obj/structure/sign/nanotrasen{ + pixel_x = 32 }, -/obj/effect/turf_decal/tile/red{ - dir = 4 +/turf/open/floor/plating/airless, +/area/ruin/unpowered/no_grav) +"xh" = ( +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/machinery/computer/med_data/syndie{ + dir = 2; + req_access = list("syndicate") }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/listeningstation) +"xn" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, /obj/structure/cable, /turf/open/floor/iron, /area/ruin/space/has_grav/listeningstation) -"aX" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 +"xp" = ( +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/structure/table/reinforced, +/obj/machinery/computer/libraryconsole/bookmanagement, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/listeningstation) +"xY" = ( +/obj/structure/sink{ + dir = 8; + pixel_x = 11; + pixel_y = -2 }, -/obj/effect/turf_decal/tile/red{ +/obj/machinery/shower{ dir = 1 }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/mirror/directional/east, +/turf/open/floor/iron/showroomfloor, +/area/ruin/space/has_grav/listeningstation) +"ym" = ( /obj/structure/cable, -/turf/open/floor/iron, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, /area/ruin/space/has_grav/listeningstation) -"ba" = ( -/obj/structure/chair/stool/directional/west, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 +"yx" = ( +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/structure/cable, +/obj/structure/chair/office{ + dir = 4 }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/listeningstation) +"yB" = ( +/obj/structure/table, +/obj/item/folder/red, +/obj/item/pen/red, /turf/open/floor/iron, /area/ruin/space/has_grav/listeningstation) -"bb" = ( -/obj/effect/turf_decal/stripes/red/corner, -/obj/machinery/light/small/directional/east, -/obj/machinery/airalarm/syndicate{ - dir = 4; - pixel_x = 24 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ +"yH" = ( +/obj/machinery/power/apc/syndicate{ dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 + name = "Syndicate Listening Post APC"; + pixel_x = 25 }, -/turf/open/floor/iron, +/obj/structure/cable, +/turf/open/floor/plating, /area/ruin/space/has_grav/listeningstation) -"bc" = ( -/obj/machinery/light/small/directional/south, -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/emcloset/anchored, -/obj/effect/decal/cleanable/dirt, +"yK" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, /turf/open/floor/iron, /area/ruin/space/has_grav/listeningstation) -"bd" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +"zo" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/ruin/space/has_grav/listeningstation) -"be" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +"zp" = ( +/turf/closed/wall, +/area/ruin/unpowered/no_grav) +"zv" = ( +/obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/structure/extinguisher_cabinet/directional/south, -/turf/open/floor/iron, -/area/ruin/space/has_grav/listeningstation) -"bf" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 +/obj/machinery/atmospherics/pipe/smart/simple/supply/visible/layer4{ + dir = 6 }, -/turf/open/floor/iron/white/corner, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/ruin/space/has_grav/listeningstation) -"bg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 +"zV" = ( +/obj/structure/sign/nanotrasen{ + pixel_y = -32 }, -/turf/open/floor/iron/white/side, +/obj/structure/cable, +/turf/open/floor/plating/airless, +/area/ruin/unpowered/no_grav) +"zZ" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/turf/open/floor/iron, /area/ruin/space/has_grav/listeningstation) -"bi" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 5; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 +"AP" = ( +/obj/machinery/door/airlock/external/ruin{ + id_tag = "syndie_listeningpost_external" }, -/turf/open/floor/iron/grimy, -/area/ruin/space/has_grav/listeningstation) -"bk" = ( -/obj/effect/turf_decal/stripes/red/line{ - dir = 4 +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "syndicate_comms_base" }, -/obj/effect/turf_decal/caution/red{ +/obj/structure/fans/tiny, +/obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, -/turf/open/floor/iron, +/obj/structure/cable, +/turf/open/floor/plating, /area/ruin/space/has_grav/listeningstation) -"bl" = ( -/obj/machinery/syndicatebomb/self_destruct{ - anchored = 1 - }, -/obj/machinery/door/window/brigdoor{ - dir = 8; - req_access = list("syndicate") +"AV" = ( +/turf/template_noop, +/area/template_noop) +"BJ" = ( +/obj/machinery/washing_machine{ + pixel_x = 4 }, -/obj/structure/sign/warning/explosives/alt{ - pixel_x = 32 +/obj/structure/sign/poster/contraband/random/directional/north, +/obj/structure/window{ + dir = 8 }, -/turf/open/floor/circuit/red, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/small, /area/ruin/space/has_grav/listeningstation) -"bm" = ( -/obj/machinery/door/airlock/maintenance, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, +"BX" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/ash, /turf/open/floor/plating, /area/ruin/space/has_grav/listeningstation) -"bn" = ( -/obj/structure/sign/departments/medbay/alt, -/turf/closed/wall, -/area/ruin/space/has_grav/listeningstation) -"bo" = ( -/obj/machinery/door/firedoor, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 +"Cc" = ( +/obj/structure/table, +/obj/item/toy/figure/dsquad{ + pixel_x = -7 }, -/obj/machinery/door/airlock/medical/glass{ - name = "Medbay" +/obj/structure/desk_bell{ + pixel_y = -1; + pixel_x = 9 }, -/turf/open/floor/iron/white, +/turf/open/floor/iron, /area/ruin/space/has_grav/listeningstation) -"bp" = ( -/obj/effect/turf_decal/stripes/red/corner{ - dir = 8 +"Cw" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/meter/layer4, +/turf/open/floor/plating, +/area/ruin/space/has_grav/listeningstation) +"CU" = ( +/obj/structure/table, +/obj/item/food/chocolatebar{ + pixel_y = 8 }, -/obj/machinery/door/airlock{ - name = "Cabin" +/obj/item/storage/fancy/cigarettes/cigpack_syndicate{ + pixel_x = -3 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 +/obj/item/lighter{ + pixel_x = 7; + pixel_y = -3 }, -/turf/open/floor/iron, +/turf/open/floor/plating, /area/ruin/space/has_grav/listeningstation) -"bq" = ( -/obj/machinery/power/smes{ - charge = 5e+006 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 6 +"Dp" = ( +/obj/structure/table, +/obj/item/flashlight/lantern/syndicate{ + light_on = 1 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/plating, +/turf/open/floor/iron, /area/ruin/space/has_grav/listeningstation) -"br" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/power/apc/syndicate{ - dir = 4; - name = "Syndicate Listening Post APC"; - pixel_x = 25 +"Dv" = ( +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/structure/table, +/obj/item/flashlight{ + pixel_y = -12 }, +/obj/item/storage/toolbox/syndicate, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/listeningstation) +"DC" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating, +/obj/effect/decal/cleanable/ash, +/turf/open/floor/iron/small, /area/ruin/space/has_grav/listeningstation) -"bs" = ( -/obj/structure/closet/crate/freezer, -/obj/item/reagent_containers/blood/o_minus{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/reagent_containers/blood/o_minus, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/turf/open/floor/iron/white/side{ - dir = 9 +"Eb" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 4 }, +/obj/item/paper/pamphlet/centcom/visitor_info, +/turf/open/floor/iron, /area/ruin/space/has_grav/listeningstation) -"bt" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 9; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/turf/open/floor/iron/white/side{ - dir = 5 +"Ey" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/closet/emcloset/anchored, +/obj/machinery/atmospherics/pipe/layer_manifold/visible{ + dir = 4 }, +/turf/open/floor/plating, /area/ruin/space/has_grav/listeningstation) -"bu" = ( -/obj/effect/decal/cleanable/dirt, +"ED" = ( +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/listeningstation) +"EK" = ( +/obj/item/paper/fluff/ruins/listeningstation/reports/june, +/turf/open/misc/asteroid/airless, +/area/ruin/unpowered/no_grav) +"Fy" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/closet/secure_closet/medical1{ - req_access = null; - req_access = list("syndicate") - }, -/turf/open/floor/iron/white, +/turf/open/floor/iron, /area/ruin/space/has_grav/listeningstation) -"bv" = ( -/obj/structure/bookcase/random, -/turf/open/floor/iron/grimy, +"FV" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, /area/ruin/space/has_grav/listeningstation) -"bw" = ( +"GR" = ( /obj/structure/closet{ icon_door = "black"; name = "wardrobe" @@ -642,98 +665,38 @@ pixel_y = -1 }, /obj/effect/decal/cleanable/dirt, -/obj/item/storage/photo_album, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/grimy, -/area/ruin/space/has_grav/listeningstation) -"bx" = ( -/obj/effect/mob_spawn/ghost_role/human/lavaland_syndicate/comms/space{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, /turf/open/floor/iron/grimy, /area/ruin/space/has_grav/listeningstation) -"by" = ( -/obj/machinery/power/terminal{ - dir = 1 - }, -/obj/structure/reagent_dispensers/fueltank, -/obj/item/clothing/head/welding, -/obj/item/weldingtool/largetank, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/plating, -/area/ruin/space/has_grav/listeningstation) -"bz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/space/has_grav/listeningstation) -"bB" = ( -/obj/structure/sink{ - dir = 8; - pixel_x = 11 - }, -/obj/machinery/iv_drip, -/obj/machinery/airalarm/syndicate{ - pixel_y = -24 - }, +"It" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/turf/open/floor/iron/white/side{ - dir = 6 - }, +/obj/structure/chair/stool/directional/north, +/obj/structure/sign/poster/contraband/random/directional/west, +/turf/open/floor/iron/small, /area/ruin/space/has_grav/listeningstation) -"bC" = ( -/obj/machinery/power/port_gen/pacman{ - anchored = 1 - }, -/obj/effect/turf_decal/bot, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/item/wrench, +"IG" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, -/turf/open/floor/plating, -/area/ruin/space/has_grav/listeningstation) -"bD" = ( -/obj/structure/table/wood, -/obj/item/ammo_box/magazine/m9mm, -/obj/item/paper/fluff/ruins/listeningstation/briefing, -/turf/open/floor/iron/grimy, -/area/ruin/space/has_grav/listeningstation) -"bF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/meter, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating, -/area/ruin/space/has_grav/listeningstation) -"bH" = ( -/obj/machinery/atmospherics/components/tank/air{ - dir = 1 +/obj/structure/reagent_dispensers/plumbed{ + name = "Syndicate Ceritified Drinking Water"; + desc = "Who knew water could taste so good?" }, -/obj/effect/turf_decal/bot, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating, /area/ruin/space/has_grav/listeningstation) -"bJ" = ( -/obj/docking_port/stationary{ - dir = 4; - dwidth = 6; - height = 7; - id = "caravansyndicate3_listeningpost"; - name = "Syndicate Listening Post"; - width = 15 +"Jj" = ( +/obj/structure/lattice/catwalk, +/obj/structure/marker_beacon/cerulean, +/obj/structure/sign/nanotrasen{ + pixel_y = -32 }, +/turf/template_noop, +/area/ruin/unpowered/no_grav) +"JB" = ( +/turf/closed/wall/r_wall, +/area/ruin/space/has_grav/listeningstation) +"JD" = ( /obj/docking_port/stationary{ - dir = 4; + dir = 8; dwidth = 4; height = 5; id = "caravansyndicate1_listeningpost"; @@ -742,1523 +705,930 @@ }, /turf/template_noop, /area/template_noop) -"bU" = ( +"KG" = ( +/obj/structure/curtain, /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, +/turf/open/floor/iron/showroomfloor, /area/ruin/space/has_grav/listeningstation) -"dd" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 10; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 +"Lq" = ( +/obj/effect/spawner/random/trash/cigbutt, +/turf/open/floor/plating, +/area/ruin/space/has_grav/listeningstation) +"LA" = ( +/obj/item/chair/wood, +/obj/machinery/light/dim/directional/north, +/turf/open/floor/iron, +/area/ruin/space/has_grav/listeningstation) +"LR" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair/sofa/right{ + dir = 4 }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, /area/ruin/space/has_grav/listeningstation) -"iB" = ( -/obj/structure/table, -/obj/machinery/firealarm/directional/west, -/obj/machinery/microwave, -/obj/effect/turf_decal/tile/neutral/fourcorners, +"LU" = ( +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/listeningstation) -"lb" = ( -/obj/structure/chair/office{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, +"Mt" = ( +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/listeningstation) -"of" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate/bin, +"MS" = ( /obj/structure/extinguisher_cabinet/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/plating, +/area/ruin/space/has_grav/listeningstation) +"MT" = ( +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/item/mining_scanner, +/obj/item/pickaxe, +/obj/item/clothing/mask/gas, +/obj/structure/rack, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/listeningstation) -"ud" = ( -/obj/structure/table, -/obj/machinery/light/small/directional/west, -/obj/item/storage/box/donkpockets{ - pixel_x = -2; - pixel_y = 6 - }, -/obj/item/storage/box/donkpockets{ - pixel_y = 3 - }, -/obj/item/storage/box/donkpockets{ - pixel_x = 2 +"MY" = ( +/obj/machinery/door/airlock/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/plating, +/area/ruin/space/has_grav/listeningstation) +"Ni" = ( +/obj/machinery/computer/security/telescreen/entertainment/directional/south, +/obj/structure/closet/secure_closet/freezer/empty/open, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/small, +/area/ruin/space/has_grav/listeningstation) +"NO" = ( +/obj/machinery/power/smes{ + charge = 5e+006 }, -/obj/item/food/chocolatebar, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/poster/contraband/random{ - pixel_x = -32 +/obj/effect/turf_decal/stripes/line{ + dir = 10 }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, +/obj/structure/cable, +/turf/open/floor/plating, /area/ruin/space/has_grav/listeningstation) -"yv" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 +"NY" = ( +/obj/effect/mob_spawn/corpse/human/syndicatecommando/lessenedgear, +/turf/open/misc/asteroid/airless, +/area/ruin/unpowered/no_grav) +"Om" = ( +/obj/effect/turf_decal/bot, +/obj/structure/cable, +/obj/machinery/suit_storage_unit/open{ + name = "Empty E.V.A. Suit Storage"; + desc = "There's no suit inside." }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, +/obj/item/paper/fluff/ruins/listeningstation/reports/august, +/turf/open/floor/plating, /area/ruin/space/has_grav/listeningstation) -"Di" = ( -/obj/machinery/washing_machine{ - pixel_x = 4 +"Oo" = ( +/obj/structure/cable, +/obj/effect/mob_spawn/ghost_role/human/lavaland_syndicate/comms/space{ + dir = 4 }, -/obj/structure/window{ +/turf/open/floor/iron/grimy, +/area/ruin/space/has_grav/listeningstation) +"OS" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/small, +/area/ruin/space/has_grav/listeningstation) +"QE" = ( +/obj/structure/barricade/wooden/crude, +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/ruin/space/has_grav/listeningstation) +"QI" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/red/directional/south, +/turf/open/floor/plating, +/area/ruin/space/has_grav/listeningstation) +"RB" = ( +/obj/structure/closet/crate/bin, /obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/small, /area/ruin/space/has_grav/listeningstation) -"FN" = ( -/obj/machinery/light/small/directional/east, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, +"RK" = ( /obj/structure/cable, -/obj/machinery/button/door/directional/east{ - id = "syndie_listeningpost_external"; - name = "External Bolt Control"; - normaldoorcontrol = 1; - req_access = list("syndicate"); - specialfunctions = 4 +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 }, -/turf/open/floor/iron/dark, +/obj/machinery/light/warm/directional/south, +/turf/open/floor/iron/grimy, /area/ruin/space/has_grav/listeningstation) -"FQ" = ( -/obj/effect/spawner/random/vending/snackvend{ - hacked = 1 - }, -/obj/effect/decal/cleanable/dirt, +"RP" = ( +/obj/structure/table, +/obj/machinery/microwave, +/turf/open/floor/iron/small, +/area/ruin/space/has_grav/listeningstation) +"Sx" = ( +/obj/structure/cable, /obj/effect/decal/cleanable/dirt, -/obj/structure/sign/poster/contraband/random{ - pixel_x = 32 - }, -/obj/effect/turf_decal/tile/red{ +/obj/effect/turf_decal/stripes/line{ dir = 1 }, -/turf/open/floor/iron, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/small, /area/ruin/space/has_grav/listeningstation) -"Hs" = ( +"Sz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/ruin/space/has_grav/listeningstation) +"SB" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/ruin/space/has_grav/listeningstation) +"SK" = ( +/obj/effect/turf_decal/tile/red/opposingcorners, /obj/structure/table, -/obj/machinery/computer/security/telescreen/entertainment/directional/west, -/obj/item/reagent_containers/food/drinks/bottle/beer{ - pixel_x = -4; - pixel_y = 14 - }, -/obj/item/reagent_containers/food/drinks/bottle/beer{ - pixel_x = 3; - pixel_y = 11 - }, -/obj/item/storage/fancy/cigarettes/cigpack_syndicate{ - pixel_x = -3 - }, -/obj/item/lighter{ - pixel_x = 7; - pixel_y = -3 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/item/paper/fluff/ruins/listeningstation/briefing, +/obj/machinery/newscaster/directional/east, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/listeningstation) -"KA" = ( -/obj/machinery/computer/arcade/orion_trail, -/obj/effect/turf_decal/tile/neutral/fourcorners, +"SQ" = ( +/obj/structure/lattice/catwalk, +/obj/structure/marker_beacon/cerulean, +/obj/structure/sign/nanotrasen{ + pixel_x = -32 + }, +/turf/template_noop, +/area/ruin/unpowered/no_grav) +"TK" = ( +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/machinery/firealarm/directional/east, +/obj/structure/filingcabinet, +/obj/item/paper/fluff/ruins/listeningstation/receipt, +/obj/item/paper/fluff/ruins/listeningstation/reports/may, +/obj/item/paper/fluff/ruins/listeningstation/reports/april, +/obj/item/paper/fluff/ruins/listeningstation/reports/march, +/obj/item/paper/fluff/ruins/listeningstation/reports/july, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/listeningstation) -"KR" = ( -/obj/effect/turf_decal/stripes/line{ +"TO" = ( +/obj/structure/cable, +/obj/structure/chair/sofa/left{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/plating, +/area/ruin/space/has_grav/listeningstation) +"Uh" = ( +/obj/effect/turf_decal/bot_red, +/obj/structure/tank_frame, +/turf/open/floor/plating, +/area/ruin/space/has_grav/listeningstation) +"Uu" = ( +/obj/structure/sign/warning/vacuum/external/directional/west, +/obj/machinery/light/red/directional/east, +/obj/structure/cable, +/turf/open/floor/plating, +/area/ruin/space/has_grav/listeningstation) +"UI" = ( +/obj/structure/cable, +/turf/open/floor/iron, +/area/ruin/space/has_grav/listeningstation) +"Va" = ( +/obj/effect/turf_decal/tile/red/opposingcorners, /obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/listeningstation) -"Op" = ( +"Vz" = ( +/obj/machinery/computer/arcade/orion_trail, +/turf/open/floor/plating, +/area/ruin/space/has_grav/listeningstation) +"VB" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/components/unary/passive_vent/layer2{ + dir = 8 + }, +/turf/template_noop, +/area/ruin/unpowered/no_grav) +"VH" = ( /obj/structure/table, -/obj/item/storage/medkit/regular, -/obj/item/clothing/neck/stethoscope, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/white/side{ - dir = 10 +/obj/item/paper_bin, +/obj/item/pen/edagger, +/obj/item/reagent_containers/food/drinks/waterbottle{ + pixel_x = 10; + pixel_y = 16 }, +/turf/open/floor/plating, /area/ruin/space/has_grav/listeningstation) -"Sv" = ( +"VK" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 8; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 +/obj/structure/closet/crate/freezer, +/obj/item/reagent_containers/blood/o_minus, +/obj/item/reagent_containers/blood/o_minus{ + pixel_x = -3; + pixel_y = 3 }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/turf/open/floor/iron/dark, +/turf/open/floor/iron, /area/ruin/space/has_grav/listeningstation) -"UL" = ( -/obj/effect/spawner/random/vending/colavend{ - hacked = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white/corner{ - dir = 8 +"WD" = ( +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high, +/obj/item/stack/cable_coil{ + pixel_x = 3; + pixel_y = 10 }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark, /area/ruin/space/has_grav/listeningstation) -"UX" = ( -/obj/structure/table/reinforced, -/obj/machinery/firealarm/directional/north, +"WW" = ( +/obj/effect/baseturf_helper/asteroid/airless, +/turf/closed/wall/r_wall, +/area/ruin/space/has_grav/listeningstation) +"XQ" = ( +/obj/structure/sign/departments/medbay/alt/directional/north, /obj/effect/decal/cleanable/dirt, -/obj/machinery/computer/libraryconsole/bookmanagement, -/turf/open/floor/iron/dark, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/iv_drip, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, /area/ruin/space/has_grav/listeningstation) -"VD" = ( -/obj/machinery/door/firedoor, +"Yf" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/door/airlock/hatch{ - name = "Telecommunications" +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 }, -/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, +/turf/open/floor/iron/small, /area/ruin/space/has_grav/listeningstation) -"Xo" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 +"Yz" = ( +/turf/open/floor/plating/airless, +/area/ruin/unpowered/no_grav) +"YV" = ( +/obj/item/stack/sheet/iron/twenty, +/obj/item/stack/sheet/glass{ + amount = 10 }, -/obj/machinery/door/airlock/hatch{ - name = "E.V.A. Equipment" +/obj/item/stack/rods/ten, +/obj/effect/decal/cleanable/dirt, +/obj/item/storage/box/lights/bulbs, +/obj/item/stack/sheet/mineral/plasma{ + amount = 30 }, -/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, -/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/item/stock_parts/cell/high, +/obj/machinery/light/small/directional/east, +/obj/structure/closet/crate, +/obj/effect/turf_decal/delivery, /obj/structure/cable, -/turf/open/floor/iron/dark, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/open/floor/plating, /area/ruin/space/has_grav/listeningstation) -"Xr" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, +"Zj" = ( +/obj/structure/cable, +/obj/machinery/firealarm/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/small, /area/ruin/space/has_grav/listeningstation) (1,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +AV +AV +AV +AV +AV +AV +AV +AV +AV +AV +AV +AV +AV +AV +AV +AV +AV +AV +AV +AV +AV +AV +AV "} (2,1,1) = {" -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +AV +AV +AV +AV +AV +AV +AV +AV +AV +AV +AV +JD +AV +AV +AV +AV +AV +AV +AV +AV +AV +AV +AV "} (3,1,1) = {" -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -ab -ab -ab -aa -aa -aa -aa +AV +AV +AV +AV +AV +vI +vI +vI +vI +zp +wy +rE +ap +zp +vI +AV +AV +AV +AV +AV +AV +AV +AV "} (4,1,1) = {" -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa +AV +AV +AV +AV +vI +vI +vI +vI +vI +zp +zp +rE +zp +zp +vI +vI +vI +vI +vI +AV +AV +AV +AV "} (5,1,1) = {" -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa +AV +AV +AV +AV +vI +vI +vI +vI +vI +vI +Yz +rE +vI +vI +vI +vI +vI +vI +vI +vI +vI +AV +AV "} (6,1,1) = {" -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa +AV +AV +AV +AV +AV +vI +vI +vI +vI +vI +tl +rE +vI +vI +vI +JB +JB +JB +JB +JB +vI +AV +AV "} (7,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa +AV +AV +AV +AV +vI +vI +vI +vI +vI +vI +vI +rE +rE +zp +vI +JB +gJ +bC +Oo +JB +vI +AV +AV "} (8,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa +AV +AV +AV +AV +vI +vI +vI +vI +vI +vI +vI +Yz +rE +Yz +vI +JB +GR +gl +RK +JB +zp +ch +AV "} (9,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa +AV +AV +AV +vI +vI +JB +JB +JB +JB +JB +vI +Yz +rE +tl +vI +JB +hk +oW +rr +JB +vI +AV +AV "} (10,1,1) = {" -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa +AV +AV +vI +vI +vI +JB +Fy +Dp +hK +JB +vI +Yz +zV +zp +vI +JB +rG +rG +QE +JB +vI +AV +AV "} (11,1,1) = {" -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +AV +AV +vI +vI +vI +JB +LA +Cc +yK +JB +JB +JB +AP +WW +vI +JB +VK +vP +OS +JB +vI +AV +AV "} (12,1,1) = {" -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +AV +AV +vI +vI +vI +JB +ac +yB +zZ +UI +qD +Uu +aR +JB +vI +JB +XQ +zo +ym +JB +vI +AV +AV "} (13,1,1) = {" -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa +AV +AV +vI +vI +vI +JB +uI +Eb +xn +kG +JB +JB +JB +JB +JB +JB +dg +aP +vC +JB +vI +AV +AV "} (14,1,1) = {" -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa +AV +AV +vI +vI +vI +JB +ae +UI +UI +nG +JB +lE +MS +It +ad +by +cj +db +Sz +JB +vI +vI +AV "} (15,1,1) = {" -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa +AV +Jj +zp +NY +hm +JB +JB +cU +JB +JB +JB +JB +eW +eR +eR +cj +dv +TO +LR +JB +vI +vI +AV "} (16,1,1) = {" -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa +AV +AV +vI +EK +vI +JB +MT +ED +ta +Dv +WD +rG +RB +SB +FV +ca +BX +dW +QI +JB +vI +vI +AV "} (17,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa +AV +AV +vI +vI +vI +JB +xh +Va +yx +LU +Mt +nX +Sx +vC +ym +tf +ym +ym +Ni +JB +vI +vI +AV "} (18,1,1) = {" -aa -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -ac -ac -ac -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa +AV +AV +vI +vI +vI +JB +xp +SK +lk +tm +TK +rG +Zj +wm +Sz +VH +FV +DC +CU +JB +vI +vI +AV "} (19,1,1) = {" -aa -ab -ab -ab -ab -ab -ab -ab -ab -ac -aq -ac -of -iB -Hs -ud -ac -ac -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa +AV +AV +vI +vI +vI +JB +rG +rG +rG +rG +rG +rG +MY +Vz +Yf +FV +lu +db +RP +JB +vI +vI +AV "} (20,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ar -ay -aI -aP -ba -KA -ac -bv -ac -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab +AV +AV +vI +vI +vI +JB +be +zv +qN +ct +SB +Cw +wk +rG +BJ +Lq +wm +yH +dC +JB +vI +AV +AV "} (21,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -Di -aQ -bb -bk -bp -bi -bw -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab +AV +AV +vI +vI +vI +JB +JB +Uh +rc +jr +cq +Ey +gc +rG +rG +rG +KG +JB +JB +JB +vI +AV +AV "} (22,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ac -ac -ah -as -ac -ac -aR -ac -bl -ac -bx -bD -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab +AV +AV +vI +vI +vI +vI +JB +JB +NO +Om +kK +YV +IG +rG +iU +KG +xY +JB +vI +vI +vI +AV +AV "} (23,1,1) = {" -aa -ab -ab -ab -ab -ab -ab -ac -ad -lb -bU -az -ac -aS -ac -ac -ac -ac -ac -ac -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab +AV +AV +AV +vI +vI +vI +vI +JB +JB +JB +JB +JB +fG +JB +JB +JB +JB +JB +vI +vI +vI +AV +AV "} (24,1,1) = {" -aa -ab -ab -ab -ab -ab -ab -ac -UX -Xr -dd -yv -VD -aT -bc -ac -bq -by -aO -bC -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab +AV +AV +AV +AV +vI +vI +vI +vI +vI +vI +vI +zp +VB +vI +vI +vI +vI +vI +vI +vI +vI +AV +AV "} (25,1,1) = {" -aa -ab -ab -ab -ab -ab -ab -ac -ac -ak -av -aB -ac -aU -bd -bm -br -bz -bF -bH -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -"} -(26,1,1) = {" -aa -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -aL -aV -be -ac -ac -ac -ac -ac -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -"} -(27,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ac -ac -al -aw -aC -ac -aW -bf -bn -bs -Op -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -"} -(28,1,1) = {" -aa -aa -aa -aa -ab -ab -ab -ac -af -KR -FN -Sv -Xo -aX -bg -bo -bt -bB -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -"} -(29,1,1) = {" -aa -aa -aa -aa -aa -ab -ab -ac -ac -an -ac -aE -ac -FQ -UL -ac -bu -ac -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(30,1,1) = {" -aa -aa -aa -aa -aa -ab -ab -ab -ag -ao -ag -aF -ag -ac -ac -ac -ac -ac -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(31,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ag -ap -ag -aG -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(32,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -bJ -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +AV +AV +AV +AV +AV +AV +AV +AV +AV +AV +AV +SQ +AV +AV +AV +AV +AV +AV +AV +AV +AV +AV +AV "} diff --git a/_maps/RandomRuins/SpaceRuins/mechtransport.dmm b/_maps/RandomRuins/SpaceRuins/mechtransport.dmm index cce1f8fe75f728..9e986bbdb3ab85 100644 --- a/_maps/RandomRuins/SpaceRuins/mechtransport.dmm +++ b/_maps/RandomRuins/SpaceRuins/mechtransport.dmm @@ -153,16 +153,6 @@ /obj/item/stack/tile/iron/base, /turf/open/floor/mineral/titanium/yellow/airless, /area/ruin/space/has_grav/powered/mechtransport) -"M" = ( -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" - }, -/area/ruin/space/has_grav/powered/mechtransport) -"N" = ( -/turf/open/floor/plating/airless{ - icon_state = "platingdmg2" - }, -/area/ruin/space/has_grav/powered/mechtransport) "O" = ( /obj/structure/mecha_wreckage/odysseus, /turf/open/floor/mineral/titanium/yellow/airless, @@ -176,9 +166,8 @@ /turf/open/floor/mineral/titanium/airless, /area/ruin/space/has_grav/powered/mechtransport) "R" = ( -/turf/open/floor/plating/airless{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/space/has_grav/powered/mechtransport) "S" = ( /obj/item/stack/rods, @@ -207,7 +196,7 @@ d d G I -M +R P T T @@ -241,7 +230,7 @@ w F w H -N +R I I T diff --git a/_maps/RandomRuins/SpaceRuins/oldAIsat.dmm b/_maps/RandomRuins/SpaceRuins/oldAIsat.dmm index 2ee5ddaf2dfe19..64d21cbad7582e 100644 --- a/_maps/RandomRuins/SpaceRuins/oldAIsat.dmm +++ b/_maps/RandomRuins/SpaceRuins/oldAIsat.dmm @@ -75,14 +75,8 @@ /turf/open/floor/iron/airless, /area/ruin/tcommsat_oldaisat) "ar" = ( -/turf/open/floor/iron/airless{ - icon_state = "damaged2" - }, -/area/ruin/tcommsat_oldaisat) -"as" = ( -/turf/open/floor/iron/airless{ - icon_state = "damaged3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/tcommsat_oldaisat) "at" = ( /obj/structure/lattice, @@ -2638,7 +2632,7 @@ ag cn az ar -as +ar ar az cD @@ -2753,7 +2747,7 @@ cg bw ac ag -as +ar cs ar ag @@ -3208,7 +3202,7 @@ aa ab ah ac -as +ar ar az aY @@ -3268,7 +3262,7 @@ aa ac ab ac -as +ar ar aZ bj @@ -3327,7 +3321,7 @@ aa ab ab ac -as +ar ar ba bk diff --git a/_maps/RandomRuins/SpaceRuins/oldstation.dmm b/_maps/RandomRuins/SpaceRuins/oldstation.dmm index 600f424cd89b42..9c24342f7735f1 100644 --- a/_maps/RandomRuins/SpaceRuins/oldstation.dmm +++ b/_maps/RandomRuins/SpaceRuins/oldstation.dmm @@ -272,7 +272,6 @@ /obj/structure/window/reinforced/spawner/north, /obj/structure/window/reinforced/spawner/west, /obj/structure/alien/weeds, -/mob/living/simple_animal/hostile/alien, /turf/open/floor/iron/dark, /area/ruin/space/ancientstation/delta/ai) "bg" = ( @@ -284,10 +283,8 @@ /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/bridge) "bh" = ( -/obj/machinery/computer{ - desc = "A computer long since rendered non-functional due to lack of maintenance. Spitting out error messages."; - dir = 4; - name = "Broken Computer" +/obj/machinery/computer/old{ + dir = 4 }, /obj/structure/window/reinforced, /obj/structure/window/reinforced{ @@ -411,7 +408,6 @@ "bx" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/maintenance_hatch, -/obj/structure/cable, /turf/open/floor/plating, /area/ruin/space/ancientstation/charlie/hall) "by" = ( @@ -1253,13 +1249,18 @@ }, /area/ruin/space/ancientstation/delta/rnd) "eb" = ( -/obj/item/pipe_dispenser, -/obj/item/pipe_dispenser, -/obj/structure/closet/crate/engineering{ - name = "radiation suit crate" - }, /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small/broken/directional/south, +/obj/structure/closet/crate/secure/engineering{ + req_access = list("away_engineering") + }, +/obj/item/pipe_dispenser, +/obj/item/storage/bag/construction, +/obj/item/clothing/suit/hazardvest, +/obj/item/t_scanner, +/obj/item/screwdriver/power, +/obj/item/storage/belt/utility, +/obj/item/clothing/head/hardhat/weldhat, /turf/open/floor/plating, /area/ruin/space/ancientstation/beta/supermatter) "ec" = ( @@ -1459,6 +1460,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/machinery/autolathe, +/obj/machinery/duct, /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/rnd) "eC" = ( @@ -1467,7 +1469,6 @@ dir = 4; pixel_x = 24 }, -/obj/machinery/duct, /turf/open/floor/iron/white, /area/ruin/space/ancientstation/delta/rnd) "eD" = ( @@ -1479,7 +1480,6 @@ /obj/effect/turf_decal/tile/purple{ dir = 4 }, -/obj/machinery/duct, /turf/open/floor/iron/white, /area/ruin/space/ancientstation/delta/rnd) "eE" = ( @@ -1796,7 +1796,6 @@ "fw" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/directional/east, -/obj/machinery/duct, /turf/open/floor/iron/white, /area/ruin/space/ancientstation/delta/rnd) "fx" = ( @@ -1996,9 +1995,8 @@ /area/ruin/space/ancientstation/delta/ai) "gf" = ( /obj/structure/closet/crate/bin, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/space/ancientstation/beta/hall) "gg" = ( /obj/effect/spawner/structure/window/hollow/reinforced/directional{ @@ -2806,10 +2804,6 @@ pixel_x = -2; pixel_y = -2 }, -/obj/item/gun/energy/laser/retro/old{ - pixel_x = 2; - pixel_y = 2 - }, /obj/effect/turf_decal/tile/red{ dir = 1 }, @@ -2826,11 +2820,14 @@ "iA" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/rack, -/obj/item/clothing/suit/armor/vest/old, /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ dir = 8 }, +/obj/item/gun/energy/laser/retro/old{ + pixel_x = 2; + pixel_y = 2 + }, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/sec) "iB" = ( @@ -3238,7 +3235,6 @@ /obj/effect/turf_decal/tile/purple{ dir = 8 }, -/obj/machinery/duct, /turf/open/floor/iron/white, /area/ruin/space/ancientstation/delta/rnd) "jX" = ( @@ -3871,9 +3867,8 @@ /obj/item/shard{ icon_state = "medium" }, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/space/ancientstation/beta/medbay) "lY" = ( /obj/machinery/door/airlock/atmos/glass{ @@ -4093,6 +4088,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ dir = 10 }, +/obj/machinery/duct, /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/rnd) "mK" = ( @@ -4548,16 +4544,11 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/hall) -"nQ" = ( -/obj/item/stack/rods, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" - }, -/area/ruin/space/ancientstation/beta/hall) "nS" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/duct, /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/rnd) "nT" = ( @@ -4684,6 +4675,7 @@ }, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, +/obj/machinery/duct, /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/rnd) "oj" = ( @@ -4694,6 +4686,7 @@ /obj/item/stack/cable_coil, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, +/obj/machinery/duct, /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/rnd) "ok" = ( @@ -4922,9 +4915,8 @@ "oV" = ( /obj/item/stack/rods, /obj/effect/decal/cleanable/glass, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/space/ancientstation/beta/hall) "oW" = ( /obj/item/shard{ @@ -4935,9 +4927,8 @@ dir = 4; pixel_x = 24 }, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/space/ancientstation/beta/hall) "oX" = ( /obj/machinery/airalarm/all_access{ @@ -4951,18 +4942,16 @@ /area/ruin/space/ancientstation/delta/hall) "oY" = ( /obj/item/stack/rods, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/space/ancientstation/beta/hall) "oZ" = ( /obj/item/shard{ icon_state = "small" }, /obj/effect/decal/cleanable/glass, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/space/ancientstation/beta/hall) "pa" = ( /obj/item/stack/rods, @@ -5193,6 +5182,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/bridge) +"qx" = ( +/obj/structure/alien/weeds, +/obj/effect/decal/cleanable/blood/gibs/old, +/mob/living/simple_animal/hostile/alien, +/turf/open/floor/iron/dark, +/area/ruin/space/ancientstation/delta/ai) "qA" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -5300,15 +5295,15 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/table/glass, /obj/item/reagent_containers/glass/bottle{ - pixel_x = 8; - list_reagents = list(/datum/reagent/growthserum = 30); + pixel_x = 4; + list_reagents = list(/datum/reagent/growthserum=30); name = "Experimental solution"; renamedByPlayer = 1; pixel_y = 8 }, /obj/item/reagent_containers/glass/bottle{ pixel_x = -4; - list_reagents = list(/datum/reagent/consumable/nutriment/peptides = 30); + list_reagents = list(/datum/reagent/consumable/nutriment/peptides=30); name = "Solution for Molly"; renamedByPlayer = 1 }, @@ -5370,6 +5365,22 @@ /obj/effect/decal/cleanable/cobweb, /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/hall) +"sj" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/tank/internals/plasma/full{ + pixel_y = -6; + pixel_x = -6 + }, +/obj/item/assembly/igniter{ + pixel_x = -6; + pixel_y = 3 + }, +/obj/item/assembly/timer{ + pixel_y = -1; + pixel_x = 6 + }, +/turf/open/floor/plating, +/area/ruin/space/ancientstation/delta/hall) "sk" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/chair, @@ -5391,8 +5402,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, /obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=Charlie-Central-Hall-2"; - location = "Delta-Central-Hall-1" + codes_txt = "patrol;next_patrol=charlie-2"; + location = "charlie-1" }, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/hall) @@ -5677,9 +5688,8 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/item/shard/plasma, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/space/ancientstation/beta/supermatter) "vm" = ( /obj/effect/spawner/structure/window/hollow/reinforced/middle{ @@ -5746,9 +5756,8 @@ "vO" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/extinguisher_cabinet/directional/south, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/space/ancientstation/beta/supermatter) "vS" = ( /obj/structure/table/glass, @@ -5824,12 +5833,14 @@ "wg" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small/directional/east, -/obj/item/assembly/flash/handheld, -/obj/item/assembly/flash/handheld, -/obj/item/storage/box/firingpins, /obj/structure/closet/crate/secure/weapon{ req_access = list("away_sec") }, +/obj/item/knife/combat, +/obj/item/clothing/suit/armor/vest/old, +/obj/item/gun/ballistic/rifle/boltaction, +/obj/item/ammo_box/a762, +/obj/item/ammo_box/a762, /turf/open/floor/plating, /area/ruin/space/ancientstation/delta/hall) "wi" = ( @@ -5941,9 +5952,8 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber{ dir = 4 }, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/space/ancientstation/beta/supermatter) "xj" = ( /obj/machinery/door/airlock/science{ @@ -5976,8 +5986,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/duct, /obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=Delta-Central-Hall-2"; - location = "Delta-Central-Hall-1" + codes_txt = "patrol;next_patrol=delta-2"; + location = "delta-1" }, /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/hall) @@ -6201,11 +6211,6 @@ "zL" = ( /turf/closed/mineral/random, /area/ruin/space/ancientstation/delta/hall) -"zY" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/duct, -/turf/open/floor/iron/white, -/area/ruin/space/ancientstation/delta/rnd) "Aa" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -6383,8 +6388,8 @@ /obj/structure/cable, /obj/machinery/duct, /obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=Charlie-Central-Hall-3"; - location = "Delta-Central-Hall-2" + codes_txt = "patrol;next_patrol=charlie-3"; + location = "charlie-2" }, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/hall) @@ -6604,9 +6609,8 @@ dir = 1 }, /obj/effect/decal/cleanable/greenglow, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/space/ancientstation/beta/supermatter) "DJ" = ( /obj/effect/decal/cleanable/dirt, @@ -6662,7 +6666,7 @@ /area/ruin/space/ancientstation/delta/rnd) "El" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/gravity_generator/main/station/off, +/obj/machinery/gravity_generator/main/off, /turf/open/floor/iron/diagonal, /area/ruin/space/ancientstation/beta/gravity) "En" = ( @@ -6778,8 +6782,8 @@ dir = 10 }, /obj/machinery/navbeacon{ - location = "Delta-Central-Hall-0"; - codes_txt = "patrol;next_patrol=Delta-Central-Hall-1" + location = "delta-0"; + codes_txt = "patrol;next_patrol=delta-1" }, /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/hall) @@ -6905,9 +6909,8 @@ /obj/effect/decal/cleanable/glass/plasma, /obj/structure/cable, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/space/ancientstation/beta/supermatter) "FR" = ( /obj/effect/decal/cleanable/dirt, @@ -7084,8 +7087,8 @@ /obj/machinery/duct, /obj/structure/cable, /obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=Charlie-Central-Hall-0"; - location = "Charlie-Central-Hall-3" + codes_txt = "patrol;next_patrol=charlie-0"; + location = "charlie-3" }, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/hall) @@ -7179,10 +7182,6 @@ dir = 4 }, /area/ruin/space/ancientstation/delta/biolab) -"HZ" = ( -/obj/structure/lattice, -/turf/closed/mineral/plasma, -/area/space/nearstation) "Ia" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/l3closet/scientist, @@ -7190,6 +7189,7 @@ dir = 1 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/duct, /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/biolab) "Ic" = ( @@ -7247,6 +7247,9 @@ }, /turf/open/floor/iron, /area/ruin/space/ancientstation/beta/hall) +"ID" = ( +/turf/closed/mineral/gibtonite, +/area/space/nearstation) "IL" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/directional/south, @@ -7393,8 +7396,8 @@ dir = 1 }, /obj/machinery/navbeacon{ - location = "Charlie-Central-Hall-0"; - codes_txt = "patrol;next_patrol=Charlie-Central-Hall-1" + location = "charlie-0"; + codes_txt = "patrol;next_patrol=charlie-1" }, /obj/structure/cable, /turf/open/floor/iron, @@ -7509,10 +7512,6 @@ /obj/structure/sign/warning/test_chamber/directional/south, /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/hall) -"Kz" = ( -/obj/structure/lattice, -/turf/closed/mineral/random, -/area/space/nearstation) "KG" = ( /obj/machinery/light/directional/east, /obj/structure/table/reinforced, @@ -7522,9 +7521,8 @@ "KI" = ( /obj/item/stack/rods, /obj/structure/cable, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/space/ancientstation/beta/supermatter) "KK" = ( /obj/structure/cable, @@ -7547,9 +7545,8 @@ "KP" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating/airless{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating/airless, /area/ruin/space/ancientstation/beta/supermatter) "KV" = ( /obj/machinery/firealarm/directional/south, @@ -7577,7 +7574,7 @@ /area/ruin/space/ancientstation/delta/hall) "Lg" = ( /obj/effect/decal/cleanable/dirt, -/turf/closed/mineral/random, +/turf/closed/mineral/diamond, /area/space/nearstation) "Lh" = ( /obj/structure/window/reinforced, @@ -7722,9 +7719,8 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/window/plasma/spawner/east, /obj/structure/cable, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/space/ancientstation/beta/supermatter) "Mu" = ( /obj/effect/decal/cleanable/dirt, @@ -7745,20 +7741,6 @@ /obj/structure/girder/displaced, /turf/open/floor/plating/airless, /area/ruin/space/ancientstation/beta/supermatter) -"ML" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/machinery/duct, -/turf/open/floor/iron/white, -/area/ruin/space/ancientstation/delta/rnd) "MM" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -7805,11 +7787,6 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/plating, /area/ruin/space/ancientstation/beta/supermatter) -"Nl" = ( -/obj/item/shard, -/obj/structure/lattice, -/turf/template_noop, -/area/space/nearstation) "Np" = ( /obj/effect/decal/cleanable/blood/xtracks{ dir = 10 @@ -7826,9 +7803,7 @@ /area/ruin/space/ancientstation/beta/supermatter) "Nu" = ( /obj/effect/decal/cleanable/generic, -/obj/structure/sign/warning/radiation/rad_area{ - pixel_y = 32 - }, +/obj/structure/sign/warning/radiation/rad_area/directional/north, /turf/open/floor/engine/airless, /area/ruin/space/ancientstation/beta/supermatter) "Nz" = ( @@ -8057,10 +8032,6 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/machinery/door/firedoor, -/obj/item/pen/red{ - pixel_x = 8; - pixel_y = 12 - }, /obj/machinery/duct, /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/hall) @@ -8153,8 +8124,8 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=Delta-Central-Hall-0"; - location = "Delta-Central-Hall-3" + codes_txt = "patrol;next_patrol=delta-0"; + location = "delta-3" }, /obj/machinery/duct, /turf/open/floor/iron, @@ -8173,9 +8144,7 @@ icon_state = "plant-25" }, /obj/effect/decal/cleanable/dirt, -/obj/structure/sign/departments/restroom{ - pixel_y = 32 - }, +/obj/structure/sign/departments/restroom/directional/north, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/hall) @@ -8305,7 +8274,7 @@ }, /obj/machinery/computer/atmos_control{ dir = 4; - atmos_chambers = list("beta-o2" = "Beta Oxygen Supply", "beta-n2" = "Beta Nitrogen Supply") + atmos_chambers = list("beta-o2"="Beta Oxygen Supply","beta-n2"="Beta Nitrogen Supply") }, /turf/open/floor/iron, /area/ruin/space/ancientstation/beta/atmos) @@ -8609,7 +8578,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, /obj/effect/decal/cleanable/dirt, -/obj/machinery/duct, /obj/effect/decal/cleanable/dirt, /obj/machinery/firealarm/directional/south, /turf/open/floor/iron, @@ -8636,6 +8604,20 @@ /obj/structure/cable, /turf/open/floor/iron/solarpanel/airless, /area/ruin/solars/ancientstation/charlie/solars) +"Uc" = ( +/obj/effect/decal/cleanable/shreds, +/obj/structure/alien/weeds, +/obj/structure/closet/crate/secure/science{ + req_access = list("away_science") + }, +/obj/item/relic, +/obj/item/transfer_valve, +/obj/item/raw_anomaly_core/bluespace, +/obj/item/raw_anomaly_core/random, +/obj/item/clothing/suit/toggle/labcoat/science, +/obj/item/reagent_containers/food/drinks/soda_cans/dr_gibb, +/turf/open/floor/iron/dark, +/area/ruin/space/ancientstation/delta/ai) "Uj" = ( /obj/structure/girder, /turf/closed/mineral/random, @@ -8647,9 +8629,8 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber{ dir = 1 }, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/space/ancientstation/beta/supermatter) "Un" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -8744,6 +8725,11 @@ /obj/structure/cable, /turf/open/floor/plating, /area/ruin/space/ancientstation/charlie/storage) +"VP" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/duct, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/delta/rnd) "VT" = ( /obj/effect/decal/cleanable/dirt, /obj/item/shard/plasma{ @@ -8825,9 +8811,7 @@ }, /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small/directional/north, -/obj/structure/sign/warning/radiation/rad_area{ - pixel_y = 32 - }, +/obj/structure/sign/warning/radiation/rad_area/directional/north, /turf/open/floor/iron/diagonal, /area/ruin/space/ancientstation/beta/gravity) "WI" = ( @@ -9117,8 +9101,8 @@ dir = 9 }, /obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=Delta-Central-Hall-3"; - location = "Delta-Central-Hall-2" + codes_txt = "patrol;next_patrol=delta-3"; + location = "delta-2" }, /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/hall) @@ -10475,7 +10459,7 @@ UP UP UP Uj -nQ +oY gO AK ow @@ -10552,11 +10536,11 @@ oJ lW YH Jg -Kz -Kz -Kz -HZ -HZ +UP +UP +UP +Uu +Uu Yp nm nu @@ -11198,7 +11182,7 @@ aa aa aa Jg -Kz +UP Jg kQ cr @@ -11350,7 +11334,7 @@ KI pR LG rm -Jg +UP Jg aa aa @@ -11416,7 +11400,7 @@ MH Jf rm rm -Jg +UP Jg aa aa @@ -11481,7 +11465,7 @@ Vl Zc Zc rm -Jg +rm Jg Jg aa @@ -11537,7 +11521,7 @@ mw aa aa aa -Nl +aa aa aa aa @@ -14762,7 +14746,7 @@ ag ag cG cZ -cZ +Uc ad bE bE @@ -15034,7 +15018,7 @@ En Ao SV SM -jL +VP mI nS nS @@ -15099,7 +15083,7 @@ bE op Ao wx -ML +di oD og lF @@ -15165,7 +15149,7 @@ bE oq IL bD -zY +kw fu hE gP @@ -15231,7 +15215,7 @@ bE En Ao wx -zY +kw fv lF gQ @@ -15300,7 +15284,7 @@ bD eD fw eC -zY +kw jW sJ bD @@ -15549,7 +15533,7 @@ aa ad ar aE -aH +qx ag gk Ws @@ -15588,7 +15572,7 @@ aa aa aa aa -aa +UP aa aa aa @@ -15641,7 +15625,7 @@ vy rp Ij dh -dh +sj bE aa aa @@ -15654,8 +15638,8 @@ aa aa ab aa -aa -aa +UP +UP aa aa aa @@ -15719,9 +15703,9 @@ aa aa aa aa -aa -aa -aa +UP +UP +UP aa aa aa @@ -15784,11 +15768,11 @@ aa aa aa aa -aa -aa -aa -aa -aa +UP +UP +ID +UP +UP aa aa aa @@ -15851,10 +15835,10 @@ aa aa aa aa -aa -aa -aa -aa +UP +UP +UP +UP aa aa aa @@ -15918,8 +15902,8 @@ aa aa aa aa -aa -aa +UP +UP aa aa aa diff --git a/_maps/RandomRuins/SpaceRuins/oldteleporter.dmm b/_maps/RandomRuins/SpaceRuins/oldteleporter.dmm index 0983576091bc8e..6bc84e11a7b7bf 100644 --- a/_maps/RandomRuins/SpaceRuins/oldteleporter.dmm +++ b/_maps/RandomRuins/SpaceRuins/oldteleporter.dmm @@ -15,16 +15,10 @@ "e" = ( /turf/open/floor/iron/airless, /area/ruin/space/oldteleporter) -"f" = ( -/turf/open/floor/iron/airless{ - icon_state = "damaged2" - }, -/area/ruin/space/oldteleporter) "g" = ( /obj/structure/light_construct/small/directional/north, -/turf/open/floor/iron/airless{ - icon_state = "damaged3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/oldteleporter) "h" = ( /obj/machinery/computer/teleporter{ @@ -50,9 +44,8 @@ /turf/open/floor/iron/airless, /area/ruin/space/oldteleporter) "m" = ( -/turf/open/floor/iron/airless{ - icon_state = "damaged4" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/oldteleporter) "n" = ( /obj/machinery/power/apc/auto_name/directional/south, @@ -192,7 +185,7 @@ a b c d -f +m e j e @@ -223,7 +216,7 @@ d c e k -f +m d c "} diff --git a/_maps/RandomRuins/SpaceRuins/onehalf.dmm b/_maps/RandomRuins/SpaceRuins/onehalf.dmm index b797eb73bb3efe..20e509a3c1efde 100644 --- a/_maps/RandomRuins/SpaceRuins/onehalf.dmm +++ b/_maps/RandomRuins/SpaceRuins/onehalf.dmm @@ -113,9 +113,8 @@ /area/ruin/space/has_grav/onehalf/hallway) "ay" = ( /obj/structure/table_frame, -/turf/open/floor/iron/airless{ - icon_state = "damaged3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/has_grav/onehalf/hallway) "az" = ( /obj/machinery/washing_machine, @@ -167,15 +166,9 @@ /obj/item/stack/rods, /turf/template_noop, /area/ruin/space/has_grav/onehalf/hallway) -"aI" = ( -/turf/open/floor/plating/airless{ - icon_state = "platingdmg3" - }, -/area/ruin/space/has_grav/onehalf/hallway) "aJ" = ( -/turf/open/floor/iron/airless{ - icon_state = "damaged5" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/has_grav/onehalf/hallway) "aK" = ( /obj/machinery/iv_drip, @@ -241,14 +234,8 @@ /area/template_noop) "aT" = ( /obj/structure/cable, -/turf/open/floor/iron/airless{ - icon_state = "damaged3" - }, -/area/ruin/space/has_grav/onehalf/hallway) -"aU" = ( -/turf/open/floor/iron/airless{ - icon_state = "damaged1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/has_grav/onehalf/hallway) "aV" = ( /obj/machinery/door/airlock/medical/glass, @@ -356,36 +343,24 @@ /area/ruin/space/has_grav/onehalf/drone_bay) "bf" = ( /obj/item/stack/sheet/iron, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/space/has_grav/onehalf/hallway) "bg" = ( /obj/structure/disposalpipe/broken{ dir = 4 }, /obj/item/stack/cable_coil/cut, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/space/has_grav/onehalf/hallway) "bh" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, /obj/structure/cable, -/turf/open/floor/iron/airless{ - icon_state = "damaged3" - }, -/area/ruin/space/has_grav/onehalf/hallway) -"bi" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron/airless{ - icon_state = "damaged5" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/has_grav/onehalf/hallway) "bj" = ( /obj/structure/disposalpipe/segment{ @@ -399,9 +374,8 @@ dir = 4 }, /obj/structure/cable, -/turf/open/floor/iron/airless{ - icon_state = "damaged1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/has_grav/onehalf/hallway) "bm" = ( /obj/structure/disposalpipe/junction{ @@ -471,17 +445,15 @@ /obj/structure/disposalpipe/broken{ dir = 4 }, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/space/has_grav/onehalf/hallway) "bw" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/iron/airless{ - icon_state = "damaged3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/has_grav/onehalf/hallway) "bx" = ( /obj/structure/disposalpipe/segment{ @@ -494,9 +466,8 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/iron/airless{ - icon_state = "damaged1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/has_grav/onehalf/hallway) "bz" = ( /obj/structure/disposalpipe/segment{ @@ -506,14 +477,6 @@ /obj/structure/cable, /turf/open/floor/iron/airless, /area/ruin/space/has_grav/onehalf/hallway) -"bA" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/airless{ - icon_state = "damaged4" - }, -/area/ruin/space/has_grav/onehalf/hallway) "bB" = ( /obj/structure/disposalpipe/segment, /obj/structure/disposalpipe/segment{ @@ -572,21 +535,18 @@ /area/ruin/space/has_grav/onehalf/hallway) "bL" = ( /obj/structure/closet/emcloset, -/turf/open/floor/iron/airless{ - icon_state = "damaged4" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/has_grav/onehalf/hallway) "bM" = ( /obj/machinery/vending/coffee, -/turf/open/floor/iron/airless{ - icon_state = "damaged4" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/has_grav/onehalf/hallway) "bN" = ( /obj/machinery/vending/snack, -/turf/open/floor/iron/airless{ - icon_state = "damaged2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/has_grav/onehalf/hallway) "bO" = ( /obj/structure/disposalpipe/trunk{ @@ -607,11 +567,6 @@ "bR" = ( /turf/closed/wall/r_wall, /area/ruin/space/has_grav/onehalf/hallway) -"bS" = ( -/turf/open/floor/iron/airless{ - icon_state = "damaged2" - }, -/area/ruin/space/has_grav/onehalf/hallway) "bT" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/iron/airless, @@ -623,17 +578,11 @@ /obj/item/stack/sheet/iron, /turf/template_noop, /area/template_noop) -"bW" = ( -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" - }, -/area/ruin/space/has_grav/onehalf/hallway) "bX" = ( /obj/structure/disposalpipe/segment, /obj/item/stack/rods, -/turf/open/floor/iron/airless{ - icon_state = "damaged5" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/has_grav/onehalf/hallway) "bY" = ( /obj/structure/grille, @@ -686,9 +635,8 @@ dir = 1 }, /obj/item/shard, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/space/has_grav/onehalf/hallway) "ci" = ( /obj/structure/lattice, @@ -781,9 +729,8 @@ /area/ruin/space/has_grav/onehalf/hallway) "cu" = ( /obj/structure/disposalpipe/segment, -/turf/open/floor/iron/airless{ - icon_state = "damaged5" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/ruin/space/has_grav/onehalf/hallway) "cv" = ( /obj/structure/girder/reinforced, @@ -867,9 +814,8 @@ /turf/template_noop, /area/ruin/space/has_grav/onehalf/hallway) "cL" = ( -/turf/open/floor/plating/airless{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/space/has_grav/onehalf/hallway) "cM" = ( /obj/machinery/light/directional/west, @@ -880,11 +826,6 @@ /obj/item/stack/sheet/plasteel, /turf/template_noop, /area/template_noop) -"cP" = ( -/turf/open/floor/iron/airless{ - icon_state = "damaged3" - }, -/area/ruin/space/has_grav/onehalf/hallway) "cQ" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -937,16 +878,14 @@ /area/ruin/space/has_grav/onehalf/bridge) "dc" = ( /obj/structure/grille/broken, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/space/has_grav/onehalf/hallway) "dd" = ( /obj/structure/grille, /obj/item/shard, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/ruin/space/has_grav/onehalf/hallway) "dh" = ( /obj/item/stack/sheet/plasteel, @@ -1049,7 +988,7 @@ aa ae ak ax -aI +cL ax bg bw @@ -1076,7 +1015,7 @@ aT bh bw ak -bW +cL aa aa aa @@ -1094,8 +1033,8 @@ ab ak az aJ -aU -bi +aJ +bh bx bL bK @@ -1183,7 +1122,7 @@ an aB aM ag -bi +bh bx bP aj @@ -1205,7 +1144,7 @@ ag ag ag ag -bi +bh bx bQ aw @@ -1250,9 +1189,9 @@ ap ap aW bj -bA -bS -bW +bw +aJ +cL ax ct cK @@ -1279,7 +1218,7 @@ ch cu cD cL -cP +aJ aJ dd ad diff --git a/_maps/RandomRuins/SpaceRuins/spacehotel.dmm b/_maps/RandomRuins/SpaceRuins/spacehotel.dmm index 5f43ef30fd2ada..f081d21bf4eb8c 100644 --- a/_maps/RandomRuins/SpaceRuins/spacehotel.dmm +++ b/_maps/RandomRuins/SpaceRuins/spacehotel.dmm @@ -471,16 +471,12 @@ /turf/open/floor/iron/solarpanel/airless, /area/ruin/space/has_grav/hotel) "eI" = ( -/obj/structure/sign/warning/no_smoking/circle{ - pixel_y = 32 - }, +/obj/structure/sign/warning/no_smoking/circle/directional/north, /turf/open/floor/iron/grimy, /area/ruin/space/has_grav/hotel) "eK" = ( /obj/structure/chair/wood, -/obj/structure/sign/warning/no_smoking/circle{ - pixel_y = 32 - }, +/obj/structure/sign/warning/no_smoking/circle/directional/north, /turf/open/floor/iron/grimy, /area/ruin/space/has_grav/hotel/bar) "eR" = ( @@ -853,9 +849,7 @@ /obj/effect/turf_decal/siding/wood{ dir = 8 }, -/obj/structure/musician/piano{ - icon_state = "piano" - }, +/obj/structure/musician/piano, /turf/open/floor/stone, /area/ruin/space/has_grav/hotel/bar) "id" = ( @@ -886,9 +880,7 @@ "iq" = ( /obj/effect/turf_decal/siding/wood, /obj/structure/chair/comfy, -/obj/structure/sign/warning/no_smoking/circle{ - pixel_y = 32 - }, +/obj/structure/sign/warning/no_smoking/circle/directional/north, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/hotel) "is" = ( @@ -1053,9 +1045,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/sign/warning/no_smoking/circle{ - pixel_y = 32 - }, +/obj/structure/sign/warning/no_smoking/circle/directional/north, /turf/open/floor/wood, /area/ruin/space/has_grav/hotel/bar) "jf" = ( @@ -1527,9 +1517,7 @@ "ne" = ( /obj/effect/turf_decal/siding/wood, /obj/structure/chair, -/obj/structure/sign/warning/no_smoking/circle{ - pixel_y = 32 - }, +/obj/structure/sign/warning/no_smoking/circle/directional/north, /turf/open/floor/wood/large, /area/ruin/space/has_grav/hotel/dock) "nf" = ( @@ -1572,9 +1560,7 @@ /turf/open/floor/iron/dark, /area/ruin/space/has_grav/hotel/dock) "no" = ( -/obj/structure/sign/warning/no_smoking/circle{ - pixel_y = 32 - }, +/obj/structure/sign/warning/no_smoking/circle/directional/north, /turf/open/floor/wood/tile, /area/ruin/space/has_grav/hotel) "ns" = ( @@ -3380,9 +3366,7 @@ /area/ruin/space/has_grav/hotel/guestroom/room_1) "JG" = ( /obj/machinery/firealarm/directional/east, -/obj/structure/sign/warning/no_smoking/circle{ - pixel_y = 32 - }, +/obj/structure/sign/warning/no_smoking/circle/directional/north, /turf/open/floor/iron/sepia, /area/ruin/space/has_grav/hotel/pool) "JL" = ( @@ -4096,9 +4080,7 @@ /area/ruin/space/has_grav/hotel/workroom) "Tm" = ( /obj/machinery/oven, -/obj/structure/sign/warning/no_smoking/circle{ - pixel_y = 32 - }, +/obj/structure/sign/warning/no_smoking/circle/directional/north, /obj/machinery/camera/directional/north{ c_tag = "Kitchen"; network = list("spacehotel") diff --git a/_maps/RandomRuins/SpaceRuins/thelizardsgas.dmm b/_maps/RandomRuins/SpaceRuins/thelizardsgas.dmm index a7d0330ac28601..1f07cd0f25d5e8 100644 --- a/_maps/RandomRuins/SpaceRuins/thelizardsgas.dmm +++ b/_maps/RandomRuins/SpaceRuins/thelizardsgas.dmm @@ -206,9 +206,7 @@ /area/ruin/space/has_grav/thelizardsgas) "xb" = ( /obj/structure/cable, -/obj/structure/sign/warning/fire{ - pixel_y = 32 - }, +/obj/structure/sign/warning/fire/directional/north, /turf/open/floor/iron/white/side, /area/ruin/space/has_grav/thelizardsgas) "xy" = ( @@ -220,9 +218,8 @@ /turf/open/floor/plating, /area/ruin/space/has_grav/thelizardsgas) "yU" = ( -/obj/structure/sign/warning/no_smoking{ - desc = "An incredibly bad idea."; - pixel_y = 32 +/obj/structure/sign/warning/no_smoking/directional/north{ + desc = "An incredibly bad idea." }, /turf/template_noop, /area/template_noop) @@ -388,9 +385,7 @@ /turf/closed/wall/r_wall, /area/ruin/space/has_grav/thelizardsgas) "LT" = ( -/obj/structure/sign/warning/electric_shock{ - pixel_y = 32 - }, +/obj/structure/sign/warning/electric_shock/directional/north, /obj/machinery/suit_storage_unit/standard_unit, /obj/machinery/power/terminal{ dir = 4 @@ -426,12 +421,9 @@ /area/ruin/space/has_grav/thelizardsgas) "Pb" = ( /obj/machinery/atmospherics/pipe/smart/simple/yellow/hidden, -/obj/structure/sign/warning/vacuum{ - pixel_x = 32 - }, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/structure/sign/warning/vacuum/directional/east, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/ruin/space/has_grav/thelizardsgas) "Pi" = ( /obj/effect/turf_decal/tile/dark{ diff --git a/_maps/RandomRuins/SpaceRuins/vaporwave.dmm b/_maps/RandomRuins/SpaceRuins/vaporwave.dmm index e988f85602bee7..689769d2d35e04 100644 --- a/_maps/RandomRuins/SpaceRuins/vaporwave.dmm +++ b/_maps/RandomRuins/SpaceRuins/vaporwave.dmm @@ -28,7 +28,7 @@ /turf/open/floor/holofloor/beach, /area/ruin/space/has_grav/powered/aesthetic) "i" = ( -/obj/structure/musician/piano, +/obj/effect/spawner/random/structure/musician/piano/random_piano, /obj/structure/window{ dir = 8 }, diff --git a/_maps/RandomZLevels/SnowCabin.dmm b/_maps/RandomZLevels/SnowCabin.dmm index cdc35a8bcedd09..2a2f2348444f33 100644 --- a/_maps/RandomZLevels/SnowCabin.dmm +++ b/_maps/RandomZLevels/SnowCabin.dmm @@ -185,9 +185,8 @@ /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/effect/baseturf_helper/asteroid/snow, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/awaymission/cabin) "aF" = ( /obj/machinery/power/apc/auto_name/directional/north, @@ -237,9 +236,8 @@ }, /obj/structure/cable, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/awaymission/cabin) "aN" = ( /obj/structure/chair/wood{ @@ -272,9 +270,8 @@ name = "geothermal generator" }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/awaymission/cabin) "aR" = ( /obj/machinery/door/window/right/directional/west{ @@ -728,7 +725,6 @@ /obj/structure/cable, /obj/structure/musician/piano{ desc = "Very theatrical."; - icon_state = "piano"; name = "theatre piano" }, /turf/open/floor/wood, @@ -859,9 +855,8 @@ /area/awaymission/cabin) "cT" = ( /obj/vehicle/ridden/atv, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/cabin) "cU" = ( /obj/machinery/light/directional/north, @@ -873,15 +868,13 @@ /area/awaymission/cabin) "cW" = ( /obj/item/shovel, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/cabin) "cX" = ( /obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/cabin) "cZ" = ( /turf/open/floor/plating/snowed/snow_cabin, @@ -996,9 +989,8 @@ "du" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/awaymission/cabin) "dv" = ( /obj/structure{ @@ -1011,9 +1003,8 @@ }, /obj/structure/cable, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/awaymission/cabin) "dw" = ( /mob/living/simple_animal/hostile/bear/snow{ @@ -1162,9 +1153,8 @@ /area/awaymission/cabin) "ec" = ( /obj/machinery/light/directional/south, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/awaymission/cabin) "ed" = ( /obj/effect/decal/cleanable/dirt, @@ -2113,9 +2103,7 @@ "hf" = ( /obj/machinery/space_heater, /obj/effect/decal/remains/robot, -/obj/structure/sign/warning/fire{ - pixel_y = 32 - }, +/obj/structure/sign/warning/fire/directional/north, /obj/machinery/space_heater, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, @@ -2225,9 +2213,8 @@ /obj/item/lightreplacer, /obj/item/storage/toolbox/mechanical, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/awaymission/cabin) "hx" = ( /obj/structure/cable, @@ -3037,35 +3024,9 @@ /obj/item/bedsheet/dorms, /turf/open/floor/wood, /area/awaymission/cabin/caves) -"ko" = ( -/turf/open/floor/wood/freezing{ - icon_state = "wood-broken" - }, -/area/awaymission/cabin/caves) -"kp" = ( -/turf/open/floor/wood/freezing{ - icon_state = "wood-broken4" - }, -/area/awaymission/cabin/caves) -"kq" = ( -/turf/open/floor/wood/freezing{ - icon_state = "wood-broken5" - }, -/area/awaymission/cabin/caves) -"kr" = ( -/turf/open/floor/wood/freezing{ - icon_state = "wood-broken3" - }, -/area/awaymission/cabin/caves) -"ks" = ( -/turf/open/floor/wood/freezing{ - icon_state = "wood-broken2" - }, -/area/awaymission/cabin/caves) "ku" = ( -/turf/open/floor/wood/freezing{ - icon_state = "wood-broken7" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood/freezing, /area/awaymission/cabin/caves) "kE" = ( /obj/structure/closet, @@ -3344,9 +3305,8 @@ /turf/open/floor/plating/snowed/smoothed, /area/awaymission/cabin/caves) "mw" = ( -/obj/structure/sign/warning{ - name = "\improper SAWBLADE WARNING"; - pixel_x = -32 +/obj/structure/sign/warning/directional/west{ + name = "\improper SAWBLADE WARNING" }, /turf/open/floor/plating/snowed/snow_cabin, /area/awaymission/cabin/snowforest) @@ -4389,9 +4349,7 @@ /turf/open/misc/asteroid/snow/snow_cabin, /area/awaymission/cabin/caves) "Lt" = ( -/obj/structure/sign/warning/no_smoking{ - pixel_x = 32 - }, +/obj/structure/sign/warning/no_smoking/directional/east, /turf/open/floor/wood/freezing, /area/awaymission/cabin/lumbermill) "LE" = ( @@ -4650,7 +4608,7 @@ desc = "It looks like fancy glitter to me."; name = "icy wind" }, -/mob/living/simple_animal/hostile/statue{ +/mob/living/simple_animal/hostile/netherworld/statue{ desc = "Just a snowman. Just a snowman. Oh god, it's just a snowman."; faction = list("statue","mining"); health = 5000; @@ -4806,9 +4764,7 @@ }, /area/awaymission/cabin/caves) "Un" = ( -/obj/structure/sign/warning/no_smoking{ - pixel_x = -32 - }, +/obj/structure/sign/warning/no_smoking/directional/west, /turf/open/floor/wood/freezing, /area/awaymission/cabin/lumbermill) "Uu" = ( @@ -20995,8 +20951,8 @@ Oe Oe ki ki -kq -ks +ku +ku ki ki ki @@ -21250,7 +21206,7 @@ ab Oe Oe Oe -ko +ku ki ki ki @@ -24850,7 +24806,7 @@ ki ki ki ki -kr +ku Oe Oe gx @@ -25105,7 +25061,7 @@ Oe ki ki ki -kp +ku ki ki Oe diff --git a/_maps/RandomZLevels/TheBeach.dmm b/_maps/RandomZLevels/TheBeach.dmm index b368eb1ed5cc1a..21db0abda1e334 100644 --- a/_maps/RandomZLevels/TheBeach.dmm +++ b/_maps/RandomZLevels/TheBeach.dmm @@ -12,7 +12,7 @@ }, /area/awaymission/beach) "ac" = ( -/turf/open/water/beach, +/turf/open/water/beach/biodome, /area/awaymission/beach) "ad" = ( /turf/open/misc/beach/coastline_b{ @@ -141,7 +141,7 @@ /turf/open/misc/beach/sand, /area/awaymission/beach) "av" = ( -/turf/open/water/beach{ +/turf/open/water/beach/biodome{ desc = "What's the difference?"; name = "coastline water" }, @@ -208,7 +208,7 @@ pixel_x = -16; pixel_y = 1 }, -/turf/open/water/beach, +/turf/open/water/beach/biodome, /area/awaymission/beach) "aK" = ( /mob/living/simple_animal/crab, @@ -936,7 +936,7 @@ /obj/item/clothing/head/collectable/paper{ desc = "What looks like an ordinary paper hat is actually a rare and valuable collector's edition paper hat. Keep away from fire, Curators, and ocean waves." }, -/turf/open/water/beach, +/turf/open/water/beach/biodome, /area/awaymission/beach) "da" = ( /mob/living/simple_animal/parrot, diff --git a/_maps/RandomZLevels/caves.dmm b/_maps/RandomZLevels/caves.dmm index fd1ce01e24c09e..ca38176f0877ff 100644 --- a/_maps/RandomZLevels/caves.dmm +++ b/_maps/RandomZLevels/caves.dmm @@ -128,7 +128,7 @@ amount = 25 }, /obj/item/coin/antagtoken, -/obj/item/book/granter/spell/summonitem{ +/obj/item/book/granter/action/spell/summonitem{ name = "\proper an extremely flamboyant book" }, /turf/open/floor/engine/cult{ @@ -496,9 +496,8 @@ }, /area/awaymission/caves/research) "cE" = ( -/obj/structure/sign/warning/vacuum{ - name = "\improper LOW AIR AREA"; - pixel_x = 32 +/obj/structure/sign/warning/vacuum/directional/east{ + name = "\improper LOW AIR AREA" }, /obj/item/stack/rods, /turf/open/floor/iron{ @@ -601,9 +600,8 @@ }, /area/awaymission/caves/research) "cZ" = ( -/obj/structure/sign/warning/vacuum{ - name = "\improper LOW AIR AREA"; - pixel_x = 32 +/obj/structure/sign/warning/vacuum/directional/east{ + name = "\improper LOW AIR AREA" }, /turf/open/floor/iron{ initial_gas_mix = "n2=23;o2=14;TEMP=2.7" @@ -1120,9 +1118,7 @@ /turf/open/floor/iron, /area/awaymission/caves/bmp_asteroid) "fL" = ( -/obj/structure/sign/departments/exam_room{ - pixel_y = 32 - }, +/obj/structure/sign/departments/exam_room/directional/north, /turf/open/floor/iron, /area/awaymission/caves/bmp_asteroid) "fN" = ( @@ -1422,9 +1418,7 @@ }, /area/awaymission/caves/bmp_asteroid/level_two) "kw" = ( -/obj/structure/sign/warning/xeno_mining{ - pixel_y = -32 - }, +/obj/structure/sign/warning/xeno_mining/directional/south, /turf/open/misc/asteroid/basalt{ initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, @@ -1776,10 +1770,9 @@ }, /area/awaymission/caves/bmp_asteroid/level_two) "DO" = ( -/obj/structure/sign/warning/pods{ +/obj/structure/sign/warning/pods/directional/west{ desc = "A warning sign which warns of potential mech traffic to and from different levels of the mine."; - name = "\improper MECH TUNNEL PASSAGE A1 TO A2"; - pixel_x = -32 + name = "\improper MECH TUNNEL PASSAGE A1 TO A2" }, /obj/machinery/light/small/directional/west, /turf/open/misc/asteroid/basalt{ @@ -1853,10 +1846,9 @@ /area/awaymission/caves/bmp_asteroid/level_three) "Jp" = ( /obj/machinery/light/small/built/directional/east, -/obj/structure/sign/warning/pods{ +/obj/structure/sign/warning/pods/directional/east{ desc = "A warning sign which warns of potential mech traffic to and from different levels of the mine."; - name = "\improper MECH TUNNEL PASSAGE B1 TO A2"; - pixel_x = 32 + name = "\improper MECH TUNNEL PASSAGE B1 TO A2" }, /turf/open/misc/asteroid/basalt{ initial_gas_mix = "n2=23;o2=14;TEMP=2.7" @@ -1882,9 +1874,7 @@ }, /area/awaymission/caves/bmp_asteroid/level_two) "Ls" = ( -/obj/structure/sign/departments/medbay{ - pixel_x = -32 - }, +/obj/structure/sign/departments/medbay/directional/west, /turf/open/misc/asteroid/basalt{ initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, @@ -2005,10 +1995,9 @@ }, /area/awaymission/caves/bmp_asteroid/level_four) "Rp" = ( -/obj/structure/sign/warning/pods{ +/obj/structure/sign/warning/pods/directional/east{ desc = "A warning sign which warns of potential mech traffic to and from different levels of the mine."; - name = "\improper MECH TUNNEL PASSAGE A2 TO B1"; - pixel_x = 32 + name = "\improper MECH TUNNEL PASSAGE A2 TO B1" }, /obj/machinery/light/small/built/directional/east, /turf/open/misc/asteroid/basalt{ @@ -2080,10 +2069,9 @@ /area/awaymission/caves/bmp_asteroid) "WL" = ( /obj/machinery/light/small/directional/west, -/obj/structure/sign/warning/pods{ +/obj/structure/sign/warning/pods/directional/west{ desc = "A warning sign which warns of potential mech traffic to and from different levels of the mine."; - name = "\improper MECH TUNNEL PASSAGE A2 TO A1"; - pixel_x = -32 + name = "\improper MECH TUNNEL PASSAGE A2 TO A1" }, /turf/open/misc/asteroid/basalt{ initial_gas_mix = "n2=23;o2=14;TEMP=2.7" diff --git a/_maps/RandomZLevels/moonoutpost19.dmm b/_maps/RandomZLevels/moonoutpost19.dmm index b06b0fb6ef6055..d837a5a50e69f9 100644 --- a/_maps/RandomZLevels/moonoutpost19.dmm +++ b/_maps/RandomZLevels/moonoutpost19.dmm @@ -622,18 +622,16 @@ req_access = null; req_access = list("syndicate") }, +/obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/iron{ dir = 8; heat_capacity = 1e+006; - icon_state = "floorscorched2"; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "ce" = ( -/obj/structure/sign/warning/biohazard{ - pixel_y = 32 - }, +/obj/structure/sign/warning/biohazard/directional/north, /obj/structure/alien/weeds/node, /obj/effect/turf_decal/stripes/corner{ dir = 4 @@ -685,9 +683,9 @@ /area/awaymission/moonoutpost19/syndicate) "cj" = ( /obj/structure/chair/stool/directional/south, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating{ - heat_capacity = 1e+006; - icon_state = "platingdmg3" + heat_capacity = 1e+006 }, /area/awaymission/moonoutpost19/syndicate) "ck" = ( @@ -843,9 +841,9 @@ }, /area/awaymission/moonoutpost19/syndicate) "cA" = ( +/obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating{ - heat_capacity = 1e+006; - icon_state = "panelscorched" + heat_capacity = 1e+006 }, /area/awaymission/moonoutpost19/syndicate) "cB" = ( @@ -1036,15 +1034,6 @@ temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) -"cR" = ( -/turf/open/floor/iron{ - dir = 8; - heat_capacity = 1e+006; - icon_state = "damaged4"; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) "cS" = ( /obj/machinery/airalarm/directional/east{ pixel_x = 23; @@ -1098,24 +1087,6 @@ temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) -"cW" = ( -/turf/open/floor/iron{ - dir = 8; - heat_capacity = 1e+006; - icon_state = "damaged2"; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) -"cX" = ( -/turf/open/floor/iron{ - dir = 8; - heat_capacity = 1e+006; - icon_state = "damaged3"; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) "cY" = ( /obj/structure/closet/crate, /obj/item/stack/sheet/iron{ @@ -1281,10 +1252,10 @@ }, /area/awaymission/moonoutpost19/syndicate) "do" = ( +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron{ dir = 8; heat_capacity = 1e+006; - icon_state = "damaged1"; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, @@ -1296,9 +1267,9 @@ /obj/item/mining_scanner, /obj/item/shovel, /obj/item/pickaxe, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating{ heat_capacity = 1e+006; - icon_state = "platingdmg3"; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, @@ -1404,10 +1375,9 @@ /turf/closed/mineral/random, /area/awaymission/moonoutpost19/main) "dB" = ( -/obj/structure/sign/warning/vacuum{ +/obj/structure/sign/warning/vacuum/directional/south{ desc = "A warning sign which reads 'HOSTILE ATMOSPHERE AHEAD'"; - name = "\improper HOSTILE ATMOSPHERE AHEAD"; - pixel_y = -32 + name = "\improper HOSTILE ATMOSPHERE AHEAD" }, /obj/machinery/portable_atmospherics/canister/oxygen, /obj/effect/turf_decal/stripes/line{ @@ -1420,9 +1390,9 @@ }, /area/awaymission/moonoutpost19/syndicate) "dC" = ( +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating{ heat_capacity = 1e+006; - icon_state = "platingdmg1"; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, @@ -1746,9 +1716,9 @@ name = "S.U.P.E.R.P.A.C.M.A.N.-type portable generator" }, /obj/structure/cable, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating{ - heat_capacity = 1e+006; - icon_state = "platingdmg2" + heat_capacity = 1e+006 }, /area/awaymission/moonoutpost19/research) "eU" = ( @@ -1803,9 +1773,9 @@ /area/awaymission/moonoutpost19/research) "eZ" = ( /obj/structure/cable, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating{ - heat_capacity = 1e+006; - icon_state = "platingdmg1" + heat_capacity = 1e+006 }, /area/awaymission/moonoutpost19/research) "fa" = ( @@ -2219,9 +2189,7 @@ }, /area/awaymission/moonoutpost19/research) "fX" = ( -/obj/structure/sign/warning/biohazard{ - pixel_x = 32 - }, +/obj/structure/sign/warning/biohazard/directional/east, /obj/structure/alien/weeds, /obj/effect/turf_decal/tile/purple, /obj/structure/cable, @@ -2287,9 +2255,9 @@ }, /area/awaymission/moonoutpost19/research) "gg" = ( +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating{ - heat_capacity = 1e+006; - icon_state = "platingdmg3" + heat_capacity = 1e+006 }, /area/awaymission/moonoutpost19/research) "gi" = ( @@ -2462,9 +2430,9 @@ "gx" = ( /obj/structure/table, /obj/item/paper/fluff/awaymissions/moonoutpost19/log/ivan, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating{ - heat_capacity = 1e+006; - icon_state = "platingdmg3" + heat_capacity = 1e+006 }, /area/awaymission/moonoutpost19/research) "gy" = ( @@ -2602,9 +2570,9 @@ "gN" = ( /obj/item/stack/rods, /obj/structure/cable, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating{ - heat_capacity = 1e+006; - icon_state = "platingdmg3" + heat_capacity = 1e+006 }, /area/awaymission/moonoutpost19/research) "gO" = ( @@ -2845,9 +2813,9 @@ "hp" = ( /obj/effect/decal/cleanable/oil, /obj/structure/cable, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating{ - heat_capacity = 1e+006; - icon_state = "platingdmg3" + heat_capacity = 1e+006 }, /area/awaymission/moonoutpost19/research) "hq" = ( @@ -2992,9 +2960,9 @@ /obj/structure/closet/crate, /obj/item/storage/box/lights/mixed, /obj/item/poster/random_contraband, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating{ - heat_capacity = 1e+006; - icon_state = "platingdmg1" + heat_capacity = 1e+006 }, /area/awaymission/moonoutpost19/research) "hL" = ( @@ -3084,9 +3052,9 @@ /area/awaymission/moonoutpost19/arrivals) "hW" = ( /obj/structure/cable, +/obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating{ - heat_capacity = 1e+006; - icon_state = "panelscorched" + heat_capacity = 1e+006 }, /area/awaymission/moonoutpost19/research) "hX" = ( @@ -3570,22 +3538,10 @@ pixel_x = -3; pixel_y = 6 }, +/obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/iron{ dir = 8; - heat_capacity = 1e+006; - icon_state = "floorscorched2" - }, -/area/awaymission/moonoutpost19/arrivals) -"iW" = ( -/obj/structure/table, -/obj/machinery/microwave{ - pixel_x = -3; - pixel_y = 6 - }, -/turf/open/floor/iron{ - dir = 8; - heat_capacity = 1e+006; - icon_state = "floorscorched1" + heat_capacity = 1e+006 }, /area/awaymission/moonoutpost19/arrivals) "iX" = ( @@ -3634,10 +3590,10 @@ }, /area/awaymission/moonoutpost19/arrivals) "je" = ( +/obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/iron{ dir = 8; - heat_capacity = 1e+006; - icon_state = "floorscorched2" + heat_capacity = 1e+006 }, /area/awaymission/moonoutpost19/arrivals) "jf" = ( @@ -3730,10 +3686,10 @@ desc = "A plastic potted plant."; pixel_y = 3 }, +/obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/iron{ dir = 8; - heat_capacity = 1e+006; - icon_state = "floorscorched1" + heat_capacity = 1e+006 }, /area/awaymission/moonoutpost19/arrivals) "jr" = ( @@ -3766,10 +3722,10 @@ /area/awaymission/moonoutpost19/arrivals) "jv" = ( /obj/structure/extinguisher_cabinet/directional/north, +/obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/iron{ dir = 8; - heat_capacity = 1e+006; - icon_state = "floorscorched1" + heat_capacity = 1e+006 }, /area/awaymission/moonoutpost19/arrivals) "jw" = ( @@ -3777,16 +3733,14 @@ /obj/structure/sign/poster/contraband/eat{ pixel_y = 32 }, +/obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/iron{ dir = 8; - heat_capacity = 1e+006; - icon_state = "floorscorched2" + heat_capacity = 1e+006 }, /area/awaymission/moonoutpost19/arrivals) "jx" = ( -/obj/structure/sign/departments/science{ - pixel_y = 32 - }, +/obj/structure/sign/departments/science/directional/north, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/purple{ dir = 1 @@ -3827,9 +3781,9 @@ /area/awaymission/moonoutpost19/arrivals) "jA" = ( /obj/effect/spawner/structure/window/reinforced, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating{ heat_capacity = 1e+006; - icon_state = "platingdmg1"; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, @@ -3914,10 +3868,10 @@ "jL" = ( /obj/structure/noticeboard/directional/north, /obj/item/paper/fluff/awaymissions/moonoutpost19/food_specials, +/obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/iron{ dir = 8; - heat_capacity = 1e+006; - icon_state = "floorscorched1" + heat_capacity = 1e+006 }, /area/awaymission/moonoutpost19/arrivals) "jM" = ( @@ -4045,20 +3999,20 @@ /area/awaymission/moonoutpost19/arrivals) "kc" = ( /obj/structure/cable, +/obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/iron{ dir = 8; heat_capacity = 1e+006; - icon_state = "floorscorched2"; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "kd" = ( /obj/structure/cable, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron{ dir = 8; heat_capacity = 1e+006; - icon_state = "damaged1"; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, @@ -4083,31 +4037,11 @@ temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) -"kg" = ( -/obj/structure/cable, -/turf/open/floor/iron{ - dir = 8; - heat_capacity = 1e+006; - icon_state = "floorscorched1"; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 - }, -/area/awaymission/moonoutpost19/arrivals) "kh" = ( /obj/structure/cable, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating{ heat_capacity = 1e+006; - icon_state = "platingdmg1"; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 - }, -/area/awaymission/moonoutpost19/arrivals) -"ki" = ( -/obj/structure/cable, -/turf/open/floor/iron{ - dir = 8; - heat_capacity = 1e+006; - icon_state = "damaged3"; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, @@ -4269,10 +4203,10 @@ }, /area/awaymission/moonoutpost19/arrivals) "kB" = ( +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron{ dir = 8; heat_capacity = 1e+006; - icon_state = "damaged2"; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, @@ -4288,10 +4222,10 @@ /obj/effect/decal/remains/human{ desc = "They look like human remains. The skeleton is curled up in fetal position with the hands placed near the throat." }, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron{ dir = 8; heat_capacity = 1e+006; - icon_state = "damaged4"; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, @@ -4304,15 +4238,6 @@ temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) -"kF" = ( -/turf/open/floor/iron{ - dir = 8; - heat_capacity = 1e+006; - icon_state = "damaged5"; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 - }, -/area/awaymission/moonoutpost19/arrivals) "kG" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -4405,9 +4330,9 @@ "kQ" = ( /obj/structure/grille/broken, /obj/item/stack/rods, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating{ heat_capacity = 1e+006; - icon_state = "platingdmg3"; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, @@ -4604,12 +4529,6 @@ heat_capacity = 1e+006 }, /area/awaymission/moonoutpost19/arrivals) -"lp" = ( -/turf/open/floor/plating{ - heat_capacity = 1e+006; - icon_state = "platingdmg3" - }, -/area/awaymission/moonoutpost19/arrivals) "lq" = ( /obj/machinery/light/small/directional/west, /obj/structure/table, @@ -4798,12 +4717,6 @@ heat_capacity = 1e+006 }, /area/awaymission/moonoutpost19/arrivals) -"lP" = ( -/turf/open/floor/plating{ - heat_capacity = 1e+006; - icon_state = "platingdmg1" - }, -/area/awaymission/moonoutpost19/arrivals) "lQ" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock{ @@ -5180,10 +5093,10 @@ dir = 8; icon_state = "ltrails_1" }, +/obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/iron{ dir = 8; heat_capacity = 1e+006; - icon_state = "floorscorched2"; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, @@ -5306,20 +5219,20 @@ /turf/open/floor/mineral/titanium/blue, /area/awaymission/moonoutpost19/arrivals) "ni" = ( +/obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/iron{ dir = 8; heat_capacity = 1e+006; - icon_state = "floorscorched2"; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "nj" = ( /obj/machinery/firealarm/directional/east, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron{ dir = 8; heat_capacity = 1e+006; - icon_state = "damaged2"; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, @@ -5338,10 +5251,9 @@ }, /area/awaymission/moonoutpost19/arrivals) "nm" = ( -/obj/structure/sign/warning/vacuum{ +/obj/structure/sign/warning/vacuum/directional/north{ desc = "A warning sign which reads 'HOSTILE ATMOSPHERE AHEAD'"; - name = "\improper HOSTILE ATMOSPHERE AHEAD"; - pixel_y = 32 + name = "\improper HOSTILE ATMOSPHERE AHEAD" }, /turf/open/floor/plating{ heat_capacity = 1e+006 @@ -5372,18 +5284,18 @@ c_tag = "Dormitories"; network = list("mo19") }, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron{ dir = 8; heat_capacity = 1e+006; - icon_state = "damaged1"; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "nr" = ( +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating{ - heat_capacity = 1e+006; - icon_state = "platingdmg2" + heat_capacity = 1e+006 }, /area/awaymission/moonoutpost19/arrivals) "ns" = ( @@ -5495,9 +5407,9 @@ dir = 8; icon_state = "ltrails_2" }, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating{ heat_capacity = 1e+006; - icon_state = "platingdmg1"; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, @@ -5508,9 +5420,9 @@ dir = 8; icon_state = "ltrails_2" }, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating{ heat_capacity = 1e+006; - icon_state = "platingdmg3"; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, @@ -5571,16 +5483,15 @@ /area/awaymission/moonoutpost19/arrivals) "nJ" = ( /obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating{ - heat_capacity = 1e+006; - icon_state = "platingdmg3" + heat_capacity = 1e+006 }, /area/awaymission/moonoutpost19/arrivals) "nK" = ( -/obj/structure/sign/warning/vacuum{ +/obj/structure/sign/warning/vacuum/directional/west{ desc = "A warning sign which reads 'HOSTILE ATMOSPHERE AHEAD'"; - name = "\improper HOSTILE ATMOSPHERE AHEAD"; - pixel_x = -32 + name = "\improper HOSTILE ATMOSPHERE AHEAD" }, /turf/open/floor/plating{ heat_capacity = 1e+006 @@ -5653,10 +5564,10 @@ "nS" = ( /obj/structure/table, /obj/item/toy/cards/deck, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron{ dir = 8; heat_capacity = 1e+006; - icon_state = "damaged1"; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, @@ -5700,10 +5611,10 @@ /obj/structure/chair/comfy/black{ dir = 8 }, +/obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/iron{ dir = 8; heat_capacity = 1e+006; - icon_state = "floorscorched2"; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, @@ -6086,9 +5997,7 @@ }, /area/awaymission/moonoutpost19/arrivals) "zR" = ( -/obj/structure/sign/warning/secure_area{ - pixel_y = 32 - }, +/obj/structure/sign/warning/secure_area/directional/north, /obj/effect/turf_decal/stripes/corner{ dir = 1 }, @@ -6195,9 +6104,7 @@ }, /area/awaymission/moonoutpost19/main) "HP" = ( -/obj/structure/sign/warning/secure_area{ - pixel_x = 32 - }, +/obj/structure/sign/warning/secure_area/directional/east, /obj/structure/alien/weeds, /obj/effect/turf_decal/tile/purple, /obj/structure/cable, @@ -6236,9 +6143,7 @@ }, /area/awaymission/moonoutpost19/main) "Jr" = ( -/obj/structure/sign/warning/secure_area{ - pixel_y = 32 - }, +/obj/structure/sign/warning/secure_area/directional/north, /obj/machinery/shower{ dir = 4; name = "emergency shower" @@ -38286,7 +38191,7 @@ wq wq wq jA -kg +kc kE io wq @@ -38544,7 +38449,7 @@ wq iT jB kh -kF +kB io wq wq @@ -38800,7 +38705,7 @@ wq wq wq jC -ki +kd kG io wq @@ -39579,7 +39484,7 @@ lJ mh mx mQ -kF +kB nj mh ny @@ -40043,8 +39948,8 @@ bO ca cp ca -cR -cW +do +do ca ca du @@ -40301,7 +40206,7 @@ cb cq cF cS -cX +do cF do aU @@ -40609,7 +40514,7 @@ hJ hJ hJ hI -lp +nr hI hJ hJ @@ -40859,7 +40764,7 @@ jH jV kI kV -lp +nr lM lN lN @@ -41637,7 +41542,7 @@ wq wq hI nm -lP +nr hI hJ hJ @@ -41888,7 +41793,7 @@ jF jF kY hJ -lP +nr hI wq wq @@ -44708,7 +44613,7 @@ wq wq wq hI -iW +iV iX jQ kq diff --git a/_maps/RandomZLevels/research.dmm b/_maps/RandomZLevels/research.dmm index 7efdf40f548c81..9feabab416cc82 100644 --- a/_maps/RandomZLevels/research.dmm +++ b/_maps/RandomZLevels/research.dmm @@ -215,20 +215,10 @@ }, /turf/open/floor/plating, /area/awaymission/research/interior/engineering) -"aS" = ( -/turf/open/floor/iron{ - icon_state = "damaged4" - }, -/area/awaymission/research/interior/engineering) "aT" = ( /mob/living/simple_animal/hostile/syndicate/melee/sword, /turf/open/floor/plating, /area/awaymission/research/interior/engineering) -"aU" = ( -/turf/open/floor/iron{ - icon_state = "damaged1" - }, -/area/awaymission/research/interior/engineering) "aW" = ( /obj/machinery/light/directional/east, /obj/structure/tank_dispenser, @@ -249,30 +239,15 @@ }, /turf/open/floor/iron/white, /area/awaymission/research/interior/engineering) -"bb" = ( -/obj/item/shard{ - icon_state = "small" - }, -/turf/open/floor/iron{ - icon_state = "damaged4" - }, -/area/awaymission/research/interior/engineering) -"bc" = ( -/turf/open/floor/iron{ - icon_state = "damaged5" - }, -/area/awaymission/research/interior/engineering) "bd" = ( -/turf/open/floor/iron{ - icon_state = "damaged3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron, /area/awaymission/research/interior/engineering) "be" = ( /obj/item/stack/rods, /obj/item/ammo_casing/c45, -/turf/open/floor/iron{ - icon_state = "damaged5" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron, /area/awaymission/research/interior/engineering) "bf" = ( /turf/closed/wall/mineral/plastitanium{ @@ -281,9 +256,8 @@ /area/awaymission/research/interior/engineering) "bg" = ( /obj/effect/decal/cleanable/blood, -/turf/open/floor/iron{ - icon_state = "damaged5" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron, /area/awaymission/research/interior/engineering) "bi" = ( /obj/structure/table, @@ -321,16 +295,14 @@ /obj/item/shard{ icon_state = "small" }, -/turf/open/floor/iron{ - icon_state = "damaged5" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron, /area/awaymission/research/interior/engineering) "bs" = ( /obj/item/ammo_casing/c45, /obj/effect/decal/cleanable/blood/drip, -/turf/open/floor/iron{ - icon_state = "damaged5" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron, /area/awaymission/research/interior/engineering) "bw" = ( /obj/structure/table, @@ -481,9 +453,7 @@ /turf/open/floor/iron/white, /area/awaymission/research/interior/engineering) "bP" = ( -/obj/structure/sign/warning/vacuum{ - pixel_x = 32 - }, +/obj/structure/sign/warning/vacuum/directional/east, /turf/open/floor/plating, /area/awaymission/research/interior/maint) "bQ" = ( @@ -514,9 +484,7 @@ /turf/open/floor/iron/dark, /area/awaymission/research/interior/gateway) "bV" = ( -/obj/structure/sign/warning/no_smoking/circle{ - pixel_x = -32 - }, +/obj/structure/sign/warning/no_smoking/circle/directional/west, /obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/yellow{ dir = 4 @@ -578,9 +546,8 @@ /obj/effect/mob_spawn/corpse/human/syndicatesoldier{ brute_damage = 200 }, -/turf/open/floor/iron{ - icon_state = "damaged3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron, /area/awaymission/research/interior/engineering) "ch" = ( /obj/machinery/light/small/directional/east, @@ -636,9 +603,8 @@ brute_damage = 200 }, /obj/effect/decal/cleanable/blood, -/turf/open/floor/iron{ - icon_state = "damaged4" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron, /area/awaymission/research/interior) "cs" = ( /obj/machinery/door/airlock/engineering{ @@ -675,9 +641,8 @@ /area/awaymission/research/interior/maint) "cA" = ( /obj/item/ammo_casing/c46x30mm, -/turf/open/floor/iron{ - icon_state = "damaged4" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron, /area/awaymission/research/interior) "cC" = ( /obj/effect/turf_decal/tile/yellow{ @@ -706,16 +671,14 @@ /turf/open/floor/plating, /area/awaymission/research/interior/maint) "cM" = ( -/turf/open/floor/iron{ - icon_state = "damaged4" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron, /area/awaymission/research/interior) "cN" = ( /obj/item/ammo_casing/c9mm, /obj/effect/decal/cleanable/blood/drip, -/turf/open/floor/iron{ - icon_state = "damaged4" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron, /area/awaymission/research/interior) "cP" = ( /obj/effect/mob_spawn/corpse/human/nanotrasensoldier{ @@ -1134,9 +1097,8 @@ /area/awaymission/research/interior/cryo) "eD" = ( /obj/structure/barricade/security, -/turf/open/floor/iron{ - icon_state = "damaged4" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron, /area/awaymission/research/interior/cryo) "eE" = ( /obj/structure/reagent_dispensers/fueltank, @@ -2382,10 +2344,6 @@ }, /turf/open/floor/iron/white, /area/awaymission/research/interior/medbay) -"ji" = ( -/obj/machinery/door/airlock/glass_large, -/turf/closed/mineral, -/area/awaymission/research/exterior) "jj" = ( /obj/structure/dresser, /turf/open/floor/wood, @@ -3236,15 +3194,11 @@ /area/awaymission/research/exterior) "mg" = ( /obj/structure/closet/emcloset, -/obj/structure/sign/warning/vacuum{ - pixel_y = 32 - }, +/obj/structure/sign/warning/vacuum/directional/north, /turf/open/floor/plating, /area/awaymission/research/interior/escapepods) "mh" = ( -/obj/structure/sign/warning/pods{ - pixel_x = -32 - }, +/obj/structure/sign/warning/pods/directional/west, /obj/effect/turf_decal/tile/green, /turf/open/floor/iron/white, /area/awaymission/research/interior/escapepods) @@ -3437,9 +3391,7 @@ /turf/open/floor/iron/white, /area/awaymission/research/interior/escapepods) "mI" = ( -/obj/structure/sign/warning/pods{ - pixel_x = -32 - }, +/obj/structure/sign/warning/pods/directional/west, /obj/effect/turf_decal/tile/green, /obj/effect/turf_decal/tile/green{ dir = 4 @@ -3535,9 +3487,7 @@ /turf/open/floor/iron/white, /area/awaymission/research/interior/escapepods) "mU" = ( -/obj/structure/sign/warning/vacuum{ - pixel_y = -32 - }, +/obj/structure/sign/warning/vacuum/directional/south, /obj/machinery/light/directional/south, /obj/effect/turf_decal/tile/green{ dir = 1 @@ -3558,9 +3508,7 @@ /turf/open/floor/iron/white, /area/awaymission/research/interior/escapepods) "mW" = ( -/obj/structure/sign/warning/vacuum{ - pixel_y = -32 - }, +/obj/structure/sign/warning/vacuum/directional/south, /obj/effect/turf_decal/tile/green{ dir = 1 }, @@ -34966,7 +34914,7 @@ ad ad ad ad -ji +ad ad ad ad @@ -41873,8 +41821,8 @@ al al al al -aS -bb +bd +br gL bG ar @@ -42131,7 +42079,7 @@ ap an aJ nf -bc +bd EV bH ar @@ -43158,7 +43106,7 @@ al al al al -aU +bd bg QI bL diff --git a/_maps/RandomZLevels/snowdin.dmm b/_maps/RandomZLevels/snowdin.dmm index a999e425816bc8..6819771907a915 100644 --- a/_maps/RandomZLevels/snowdin.dmm +++ b/_maps/RandomZLevels/snowdin.dmm @@ -75,9 +75,8 @@ /obj/structure/bed{ dir = 4 }, -/turf/open/floor/wood{ - icon_state = "wood-broken" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/awaymission/snowdin/post/cavern1) "aw" = ( /obj/machinery/computer, @@ -176,9 +175,8 @@ pixel_x = 5; pixel_y = 5 }, -/turf/open/floor/wood{ - icon_state = "wood-broken" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/awaymission/snowdin/post/dorm) "aR" = ( /obj/structure/bed, @@ -265,9 +263,8 @@ /obj/structure/sign/poster/contraband/kudzu{ pixel_y = 32 }, -/turf/open/floor/wood{ - icon_state = "wood-broken" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/awaymission/snowdin/post/dorm) "bb" = ( /obj/structure/bed, @@ -309,9 +306,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 6 }, -/turf/open/floor/wood{ - icon_state = "wood-broken" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/awaymission/snowdin/post/dorm) "bj" = ( /obj/effect/decal/remains/human, @@ -436,9 +432,8 @@ pixel_y = 5 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/wood{ - icon_state = "wood-broken" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/awaymission/snowdin/post/dorm) "bB" = ( /obj/item/stack/sheet/mineral/plastitanium, @@ -583,9 +578,8 @@ id_tag = "snowdindormhydro2"; name = "Rachel Migro's Private Quarters" }, -/turf/open/floor/wood{ - icon_state = "wood-broken" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/awaymission/snowdin/post/dorm) "bU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ @@ -609,9 +603,8 @@ }, /obj/machinery/door/firedoor, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/research) "bW" = ( /obj/machinery/door/firedoor, @@ -797,9 +790,8 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/dorm) "cz" = ( /obj/machinery/door/airlock/public/glass{ @@ -833,9 +825,8 @@ /turf/open/floor/iron, /area/awaymission/snowdin/post/research) "cC" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/research) "cD" = ( /obj/structure/closet/crate{ @@ -1102,9 +1093,8 @@ pixel_y = 5 }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/dorm) "dd" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ @@ -1141,9 +1131,8 @@ pixel_x = 5; pixel_y = 5 }, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/dorm) "dg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ @@ -1245,9 +1234,8 @@ /area/awaymission/snowdin/post/kitchen) "ds" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/kitchen) "dt" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, @@ -1395,17 +1383,15 @@ "dV" = ( /obj/effect/decal/cleanable/food/egg_smudge, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/kitchen) "dW" = ( /obj/structure/table, /obj/machinery/reagentgrinder, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/kitchen) "dX" = ( /turf/open/floor/plating/snowed/smoothed, @@ -1470,9 +1456,8 @@ }, /obj/effect/landmark/awaystart, /obj/item/bedsheet/red, -/turf/open/floor/wood{ - icon_state = "wood-broken" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/awaymission/snowdin/post/dorm) "ei" = ( /obj/effect/baseturf_helper/asteroid/snow, @@ -1590,9 +1575,8 @@ /area/awaymission/snowdin/outside) "eF" = ( /obj/structure/mineral_door/wood, -/turf/open/floor/wood{ - icon_state = "wood-broken" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/awaymission/snowdin/outside) "eG" = ( /obj/structure/barricade/wooden, @@ -1654,9 +1638,8 @@ dir = 6 }, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/dorm) "eS" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ @@ -1697,9 +1680,8 @@ pixel_x = 5; pixel_y = 5 }, -/turf/open/floor/wood{ - icon_state = "wood-broken" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/awaymission/snowdin/post/dorm) "eV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ @@ -1998,9 +1980,8 @@ "fP" = ( /obj/structure/table, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/hydro) "fQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, @@ -2065,9 +2046,8 @@ pixel_x = 4; pixel_y = 4 }, -/turf/open/floor/wood{ - icon_state = "wood-broken" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/awaymission/snowdin/outside) "ga" = ( /obj/structure/barricade/wooden/snowed, @@ -2265,9 +2245,8 @@ /turf/open/floor/iron/cafeteria, /area/awaymission/snowdin/post/messhall) "gC" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/messhall) "gD" = ( /turf/open/floor/plating, @@ -2293,9 +2272,8 @@ }, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/hydro) "gG" = ( /obj/machinery/hydroponics/constructable, @@ -2329,9 +2307,8 @@ pixel_x = 5; pixel_y = 5 }, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/hydro) "gM" = ( /obj/item/stack/cable_coil{ @@ -2559,21 +2536,14 @@ /turf/open/floor/iron, /area/awaymission/snowdin/post/hydro) "hx" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/hydro) "hy" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/awaymission/snowdin/post/hydro) -"hz" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, -/area/awaymission/snowdin/post/hydro) "hA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ piping_layer = 4; @@ -2823,9 +2793,8 @@ pixel_x = 5; pixel_y = 5 }, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/hydro) "ic" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, @@ -3017,9 +2986,8 @@ }, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post) "iw" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ @@ -3031,13 +2999,10 @@ pixel_x = 5; pixel_y = 5 }, -/obj/structure/sign/departments/medbay{ - pixel_y = 32 - }, +/obj/structure/sign/departments/medbay/directional/north, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post) "ix" = ( /obj/effect/turf_decal/tile/neutral{ @@ -3136,11 +3101,6 @@ "iJ" = ( /turf/open/floor/iron, /area/awaymission/snowdin/post/hydro) -"iK" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, -/area/awaymission/snowdin/post/hydro) "iL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ piping_layer = 4; @@ -3239,9 +3199,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/garage) "iU" = ( /obj/machinery/door/airlock/public/glass{ @@ -3340,9 +3299,8 @@ /turf/open/misc/asteroid/snow, /area/awaymission/snowdin/cave) "jj" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/dorm) "jk" = ( /obj/machinery/door/airlock/public/glass{ @@ -3376,9 +3334,8 @@ }, /area/awaymission/snowdin/post) "jo" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post) "jp" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ @@ -3391,9 +3348,8 @@ dir = 8 }, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post) "jq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ @@ -3537,9 +3493,8 @@ /area/awaymission/snowdin/post/garage) "jF" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/garage) "jG" = ( /obj/effect/decal/cleanable/dirt, @@ -3639,9 +3594,8 @@ /area/awaymission/snowdin/post) "jW" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post) "jX" = ( /obj/effect/turf_decal/tile/neutral, @@ -3675,20 +3629,14 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/awaymission/snowdin/cave) -"kb" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, -/area/awaymission/snowdin/post/messhall) "kc" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ piping_layer = 4; pixel_x = 5; pixel_y = 5 }, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/messhall) "kd" = ( /obj/machinery/light/directional/east, @@ -3705,9 +3653,8 @@ /area/awaymission/snowdin/cave) "kf" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/hydro) "kg" = ( /obj/machinery/holopad, @@ -3734,9 +3681,8 @@ pixel_x = 5; pixel_y = 5 }, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/garage) "kj" = ( /obj/effect/decal/cleanable/dirt, @@ -3956,9 +3902,8 @@ /area/awaymission/snowdin/post/messhall) "kP" = ( /obj/item/trash/candy, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/messhall) "kQ" = ( /obj/effect/turf_decal/tile/green{ @@ -4030,9 +3975,8 @@ pixel_x = 5; pixel_y = 5 }, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/garage) "lb" = ( /obj/machinery/light/directional/west, @@ -4379,9 +4323,8 @@ dir = 9 }, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/hydro) "lH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ @@ -4422,9 +4365,8 @@ pixel_x = 5; pixel_y = 5 }, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/hydro) "lL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ @@ -4433,9 +4375,8 @@ pixel_x = 5; pixel_y = 5 }, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/hydro) "lM" = ( /obj/machinery/door/airlock/external/glass/ruin, @@ -4709,27 +4650,19 @@ "ms" = ( /obj/machinery/hydroponics/constructable, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/hydro) "mt" = ( /turf/open/floor/plating, /area/awaymission/snowdin/post/hydro) -"mu" = ( -/obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, -/area/awaymission/snowdin/post/hydro) "mv" = ( /obj/structure/sink{ dir = 8; pixel_x = 11 }, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/hydro) "mw" = ( /obj/structure/lattice/catwalk, @@ -4795,9 +4728,8 @@ pixel_x = 5; pixel_y = 5 }, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post) "mJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, @@ -4924,9 +4856,8 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 }, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post) "ne" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ @@ -5037,9 +4968,8 @@ /area/awaymission/snowdin/post/engineering) "nq" = ( /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/engineering) "nr" = ( /obj/structure/flora/bush/snow/style_random, @@ -5093,9 +5023,8 @@ /area/awaymission/snowdin/outside) "nz" = ( /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/hydro) "nA" = ( /obj/structure/reagent_dispensers/watertank/high, @@ -5283,9 +5212,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/structure/sign/warning/electric_shock{ - pixel_x = -32 - }, +/obj/structure/sign/warning/electric_shock/directional/west, /obj/structure/cable, /obj/machinery/power/smes/engineering, /turf/open/floor/plating, @@ -5550,9 +5477,7 @@ pixel_y = 3 }, /obj/item/storage/toolbox/mechanical, -/obj/structure/sign/warning/engine_safety{ - pixel_x = 32 - }, +/obj/structure/sign/warning/engine_safety/directional/east, /turf/open/floor/iron, /area/awaymission/snowdin/post/engineering) "oR" = ( @@ -5740,9 +5665,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible{ dir = 8 }, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/engineering) "pw" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible{ @@ -5929,17 +5853,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible{ dir = 1 }, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/engineering) "pY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible{ dir = 8 }, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/engineering) "pZ" = ( /obj/machinery/portable_atmospherics/scrubber, @@ -6021,9 +5943,8 @@ /turf/open/floor/iron/grimy, /area/awaymission/snowdin/post/cavern2) "ql" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/cavern2) "qm" = ( /obj/structure/table, @@ -6141,9 +6062,8 @@ dir = 10 }, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/engineering) "qB" = ( /obj/structure/cable, @@ -6267,9 +6187,8 @@ atmos_chambers = list("snowdinmix" = "Mix Chamber"); dir = 1 }, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/engineering) "qY" = ( /obj/effect/turf_decal/tile/yellow, @@ -6419,9 +6338,8 @@ /area/awaymission/snowdin/post/cavern2) "ry" = ( /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/cavern2) "rz" = ( /obj/structure/cable, @@ -6953,9 +6871,8 @@ /turf/open/floor/plating, /area/awaymission/snowdin/post/cavern1) "uk" = ( -/turf/open/floor/wood{ - icon_state = "wood-broken" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/awaymission/snowdin/post/cavern1) "ul" = ( /turf/open/floor/plating, @@ -7042,9 +6959,8 @@ }, /area/awaymission/snowdin/post/cavern1) "uF" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/cavern1) "uG" = ( /turf/open/floor/iron, @@ -7059,9 +6975,8 @@ /area/awaymission/snowdin/post/cavern1) "uM" = ( /obj/structure/table, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/cavern1) "uN" = ( /obj/structure/table, @@ -7083,9 +6998,8 @@ /area/awaymission/snowdin/post/cavern1) "uS" = ( /mob/living/simple_animal/hostile/skeleton/plasmaminer, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/cavern1) "uU" = ( /obj/item/chair, @@ -7371,9 +7285,7 @@ /turf/open/floor/plating, /area/awaymission/snowdin/post/mining_dock) "wH" = ( -/obj/structure/sign/warning/electric_shock{ - pixel_y = 32 - }, +/obj/structure/sign/warning/electric_shock/directional/north, /obj/structure/cable, /turf/open/floor/plating, /area/awaymission/snowdin/post/mining_dock) @@ -7436,9 +7348,7 @@ /area/awaymission/snowdin/post/mining_dock) "wU" = ( /obj/machinery/light/directional/north, -/obj/structure/sign/warning/docking{ - pixel_y = 32 - }, +/obj/structure/sign/warning/docking/directional/north, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -7478,9 +7388,8 @@ "xf" = ( /obj/effect/turf_decal/stripes/corner, /obj/effect/decal/cleanable/blood/old, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/mining_dock) "xg" = ( /obj/effect/turf_decal/stripes/line, @@ -7577,9 +7486,8 @@ pixel_y = 5 }, /obj/machinery/firealarm/directional/west, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post) "xx" = ( /obj/machinery/door/airlock/vault{ @@ -7590,9 +7498,8 @@ /turf/open/floor/iron, /area/awaymission/snowdin/post/mining_dock) "xy" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/mining_dock) "xz" = ( /obj/machinery/door/firedoor, @@ -7675,9 +7582,8 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/mining_dock) "xK" = ( /obj/docking_port/stationary{ @@ -7837,14 +7743,11 @@ /obj/structure/closet/crate, /obj/item/relic, /obj/item/relic, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/mining_dock) "yl" = ( -/obj/structure/sign/warning/no_smoking{ - pixel_x = -32 - }, +/obj/structure/sign/warning/no_smoking/directional/west, /turf/open/floor/plating, /area/awaymission/snowdin/post/mining_dock) "ym" = ( @@ -7944,9 +7847,8 @@ dir = 1 }, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/mining_dock) "yC" = ( /obj/effect/turf_decal/stripes/line{ @@ -7974,9 +7876,8 @@ dir = 1 }, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/mining_dock) "yF" = ( /obj/effect/turf_decal/weather/snow, @@ -8056,9 +7957,7 @@ /turf/open/floor/iron, /area/awaymission/snowdin/post/mining_dock) "yQ" = ( -/obj/structure/sign/warning/docking{ - pixel_y = -32 - }, +/obj/structure/sign/warning/docking/directional/south, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -8232,9 +8131,7 @@ piping_layer = 4 }, /obj/machinery/space_heater, -/obj/structure/sign/warning/xeno_mining{ - pixel_x = 32 - }, +/obj/structure/sign/warning/xeno_mining/directional/east, /obj/structure/cable, /turf/open/floor/plating, /area/awaymission/snowdin/post/mining_dock) @@ -8382,9 +8279,8 @@ /turf/open/floor/plating, /area/awaymission/snowdin/post/minipost) "Ai" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/minipost) "Aj" = ( /obj/effect/decal/cleanable/dirt, @@ -8488,9 +8384,8 @@ /area/awaymission/snowdin/outside) "AE" = ( /obj/item/pen, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/minipost) "AF" = ( /obj/structure/table, @@ -8541,9 +8436,8 @@ /area/awaymission/snowdin/post/minipost) "AN" = ( /obj/item/key/atv, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/minipost) "AO" = ( /obj/effect/turf_decal/tile/neutral, @@ -8636,9 +8530,8 @@ /area/awaymission/snowdin/post/minipost) "Bf" = ( /obj/machinery/space_heater, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/minipost) "Bh" = ( /obj/structure/lattice/catwalk, @@ -9603,9 +9496,7 @@ dir = 4; piping_layer = 4 }, -/obj/structure/sign/warning/xeno_mining{ - pixel_x = 32 - }, +/obj/structure/sign/warning/xeno_mining/directional/east, /turf/open/floor/plating, /area/awaymission/snowdin/post/mining_dock) "FL" = ( @@ -9864,9 +9755,8 @@ /turf/open/floor/plating, /area/awaymission/snowdin/post/mining_main) "GR" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/mining_main) "GS" = ( /obj/structure/window/reinforced/fulltile/ice, @@ -9900,9 +9790,8 @@ /area/awaymission/snowdin/post/mining_main/robotics) "GX" = ( /obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/mining_main/robotics) "GY" = ( /obj/effect/turf_decal/stripes/line, @@ -9936,9 +9825,8 @@ /turf/open/floor/plating, /area/awaymission/snowdin/post/mining_main/mechbay) "Hf" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/mining_main/mechbay) "Hg" = ( /obj/effect/decal/cleanable/dirt, @@ -9996,9 +9884,8 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/mining_main/robotics) "Hu" = ( /obj/machinery/holopad, @@ -10006,15 +9893,13 @@ /area/awaymission/snowdin/post/mining_main/robotics) "Hw" = ( /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/mining_dock) "Hx" = ( /obj/machinery/holopad, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/mining_dock) "Hy" = ( /obj/machinery/door/airlock/research/glass{ @@ -10046,9 +9931,8 @@ /area/awaymission/snowdin/post/mining_dock) "HD" = ( /obj/structure/table, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/mining_main) "HE" = ( /obj/structure/table, @@ -10123,9 +10007,8 @@ "HQ" = ( /obj/effect/turf_decal/stripes/line, /mob/living/simple_animal/hostile/netherworld/migo, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/mining_main/mechbay) "HR" = ( /obj/effect/turf_decal/stripes/corner{ @@ -10216,14 +10099,11 @@ /area/awaymission/snowdin/post/mining_dock) "Ie" = ( /obj/structure/barricade/sandbags, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/mining_dock) "If" = ( -/obj/structure/sign/warning/no_smoking{ - pixel_y = -32 - }, +/obj/structure/sign/warning/no_smoking/directional/south, /obj/machinery/light/directional/south, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -10385,14 +10265,11 @@ /area/awaymission/snowdin/post/mining_main) "II" = ( /obj/effect/decal/cleanable/oil, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/mining_main) "IJ" = ( -/obj/structure/sign/warning/electric_shock{ - pixel_x = 32 - }, +/obj/structure/sign/warning/electric_shock/directional/east, /turf/closed/wall, /area/awaymission/snowdin/post/mining_main/robotics) "IL" = ( @@ -10408,9 +10285,8 @@ /area/awaymission/snowdin/post/mining_dock) "IQ" = ( /obj/effect/spawner/random/structure/crate_abandoned, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/mining_dock) "IR" = ( /obj/effect/turf_decal/tile/neutral{ @@ -10477,9 +10353,8 @@ /area/awaymission/snowdin/post/mining_main) "IY" = ( /obj/machinery/light/directional/south, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/mining_main) "IZ" = ( /obj/effect/spawner/random/structure/crate_abandoned, @@ -10654,9 +10529,7 @@ /turf/open/floor/iron, /area/awaymission/snowdin/post/mining_main) "JA" = ( -/obj/structure/sign/warning/electric_shock{ - pixel_x = 32 - }, +/obj/structure/sign/warning/electric_shock/directional/east, /obj/structure/cable, /turf/open/floor/plating, /area/awaymission/snowdin/post/mining_dock) @@ -10902,9 +10775,7 @@ /turf/open/floor/plating, /area/awaymission/snowdin/post/mining_main) "Kl" = ( -/obj/structure/sign/warning/docking{ - pixel_x = 32 - }, +/obj/structure/sign/warning/docking/directional/east, /obj/effect/turf_decal/tile/brown{ dir = 1 }, @@ -11078,9 +10949,7 @@ /turf/open/floor/iron, /area/awaymission/snowdin/post/mining_dock) "KG" = ( -/obj/structure/sign/warning/docking{ - pixel_x = 32 - }, +/obj/structure/sign/warning/docking/directional/east, /turf/open/floor/plating, /area/awaymission/snowdin/post/mining_dock) "KH" = ( @@ -11128,12 +10997,9 @@ /turf/open/floor/iron, /area/awaymission/snowdin/post/mining_main) "KN" = ( -/obj/structure/sign/warning/docking{ - pixel_x = 32 - }, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/obj/structure/sign/warning/docking/directional/east, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/mining_main) "KO" = ( /obj/machinery/computer/shuttle/snowdin/mining{ @@ -11417,9 +11283,7 @@ /turf/open/misc/ice/smooth, /area/awaymission/snowdin/cave) "LZ" = ( -/obj/structure/sign/warning/docking{ - pixel_y = 32 - }, +/obj/structure/sign/warning/docking/directional/north, /obj/machinery/light/broken/directional/north, /turf/open/floor/engine/cult, /area/awaymission/snowdin/post/mining_dock) @@ -11999,9 +11863,8 @@ }, /obj/effect/decal/cleanable/dirt, /obj/structure/extinguisher_cabinet/directional/south, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/dorm) "Po" = ( /obj/machinery/airalarm/directional/north, @@ -12052,9 +11915,8 @@ /area/awaymission/snowdin/cave/cavern) "PI" = ( /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/cavern1) "PJ" = ( /obj/machinery/light/small/directional/south, @@ -12215,9 +12077,8 @@ pixel_y = 5 }, /obj/machinery/light/broken/directional/south, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post) "QD" = ( /obj/item/shard{ @@ -12472,9 +12333,8 @@ dir = 8 }, /obj/machinery/light/small/directional/east, -/turf/open/floor/wood{ - icon_state = "wood-broken" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/awaymission/snowdin/post/dorm) "RY" = ( /obj/item/key/atv, @@ -12522,17 +12382,14 @@ atmos_chambers = list("snowdinincin" = "Incinerator Chamber"); dir = 1 }, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/engineering) "Sk" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/structure/sign/warning/electric_shock{ - pixel_x = -32 - }, +/obj/structure/sign/warning/electric_shock/directional/west, /obj/machinery/power/smes/engineering, /obj/structure/cable, /turf/open/floor/plating, @@ -12774,9 +12631,7 @@ /area/awaymission/snowdin/outside) "Ts" = ( /obj/machinery/airalarm/directional/north, -/obj/structure/sign/warning/docking{ - pixel_x = 32 - }, +/obj/structure/sign/warning/docking/directional/east, /obj/effect/turf_decal/tile/brown{ dir = 1 }, @@ -12974,9 +12829,8 @@ "UA" = ( /obj/machinery/light/small/directional/east, /obj/structure/closet/cabinet, -/turf/open/floor/wood{ - icon_state = "wood-broken" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/awaymission/snowdin/post/cavern1) "UB" = ( /obj/machinery/power/apc/auto_name/directional/north, @@ -13655,9 +13509,7 @@ pixel_x = -8; pixel_y = 24 }, -/obj/structure/sign/warning/fire{ - pixel_y = -32 - }, +/obj/structure/sign/warning/fire/directional/south, /turf/open/floor/engine, /area/awaymission/snowdin/post/engineering) "YK" = ( @@ -13700,9 +13552,8 @@ "YZ" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/airalarm/directional/west, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/awaymission/snowdin/post/mining_main/mechbay) "Zb" = ( /obj/effect/gibspawner/generic, @@ -13763,9 +13614,7 @@ /turf/open/floor/iron/white, /area/awaymission/snowdin/post) "Zq" = ( -/obj/structure/sign/warning/no_smoking{ - pixel_y = 32 - }, +/obj/structure/sign/warning/no_smoking/directional/north, /obj/machinery/light/broken/directional/north, /turf/open/floor/engine/cult, /area/awaymission/snowdin/post/cavern2) @@ -25973,7 +25822,7 @@ gA gA Mj RH -kb +gC lz mn dO @@ -26743,7 +26592,7 @@ gA hV iF gD -kb +gC kO lC mo @@ -29311,12 +29160,12 @@ Nn gJ hy gH -iK +hx gH -hz +kf hy lI -mu +nz mR nz nX @@ -29566,11 +29415,11 @@ eD cd Vu gK -hz +kf gG iJ gI -hz +kf gI lK ms diff --git a/_maps/RandomZLevels/undergroundoutpost45.dmm b/_maps/RandomZLevels/undergroundoutpost45.dmm index 59571ba5c604ff..4aaa8b9237ecc6 100644 --- a/_maps/RandomZLevels/undergroundoutpost45.dmm +++ b/_maps/RandomZLevels/undergroundoutpost45.dmm @@ -5,14 +5,6 @@ "ab" = ( /turf/closed/indestructible/riveted, /area/awaymission/undergroundoutpost45/caves) -"ac" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - dir = 8; - heat_capacity = 1e+006; - icon_state = "damaged2" - }, -/area/awaymission/undergroundoutpost45/central) "ad" = ( /turf/closed/mineral/random/labormineral, /area/awaymission/undergroundoutpost45/caves) @@ -35,29 +27,23 @@ /area/awaymission/undergroundoutpost45/caves) "aj" = ( /obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron{ dir = 8; - heat_capacity = 1e+006; - icon_state = "damaged1" + heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/central) "ak" = ( /obj/machinery/light/small/broken/directional/west, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating{ - heat_capacity = 1e+006; - icon_state = "platingdmg1" + heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/central) "al" = ( +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating{ - heat_capacity = 1e+006; - icon_state = "platingdmg1" - }, -/area/awaymission/undergroundoutpost45/central) -"am" = ( -/turf/open/floor/plating{ - heat_capacity = 1e+006; - icon_state = "platingdmg3" + heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/central) "an" = ( @@ -70,10 +56,10 @@ /area/awaymission/undergroundoutpost45/central) "ap" = ( /obj/machinery/light/small/broken/directional/east, +/obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/iron{ dir = 8; - heat_capacity = 1e+006; - icon_state = "floorscorched2" + heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/central) "aq" = ( @@ -96,17 +82,17 @@ pixel_x = -6; pixel_y = -34 }, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron{ dir = 8; - heat_capacity = 1e+006; - icon_state = "damaged4" + heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/central) "ar" = ( +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron{ dir = 8; - heat_capacity = 1e+006; - icon_state = "damaged3" + heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/central) "as" = ( @@ -752,9 +738,9 @@ }, /area/awaymission/undergroundoutpost45/central) "bZ" = ( +/obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating{ - heat_capacity = 1e+006; - icon_state = "panelscorched" + heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/central) "ca" = ( @@ -788,15 +774,6 @@ heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/central) -"ce" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006; - icon_state = "platingdmg1" - }, -/area/awaymission/undergroundoutpost45/central) "cf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 @@ -844,9 +821,9 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, +/obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating{ - heat_capacity = 1e+006; - icon_state = "panelscorched" + heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/central) "cl" = ( @@ -854,9 +831,9 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating{ - heat_capacity = 1e+006; - icon_state = "platingdmg2" + heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/central) "cm" = ( @@ -873,9 +850,9 @@ dir = 10 }, /obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating{ - heat_capacity = 1e+006; - icon_state = "platingdmg1" + heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/central) "co" = ( @@ -990,9 +967,9 @@ /area/awaymission/undergroundoutpost45/central) "cC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating{ - heat_capacity = 1e+006; - icon_state = "platingdmg3" + heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/central) "cD" = ( @@ -1011,16 +988,9 @@ "cF" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /obj/structure/grille, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating{ - heat_capacity = 1e+006; - icon_state = "platingdmg3" - }, -/area/awaymission/undergroundoutpost45/central) -"cG" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/plating{ - heat_capacity = 1e+006; - icon_state = "platingdmg2" + heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/central) "cH" = ( @@ -1100,9 +1070,9 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ dir = 4 }, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating{ - heat_capacity = 1e+006; - icon_state = "platingdmg3" + heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/central) "cP" = ( @@ -1126,9 +1096,9 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ dir = 4 }, +/obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating{ - heat_capacity = 1e+006; - icon_state = "panelscorched" + heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/central) "cS" = ( @@ -1232,9 +1202,9 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 1 }, +/obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating{ - heat_capacity = 1e+006; - icon_state = "panelscorched" + heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/central) "de" = ( @@ -1271,18 +1241,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 6 }, +/obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating{ - heat_capacity = 1e+006; - icon_state = "panelscorched" + heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/central) "dj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating{ - heat_capacity = 1e+006; - icon_state = "platingdmg3" + heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/central) "dk" = ( @@ -1336,10 +1306,10 @@ dir = 8; pixel_x = -23 }, +/obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/iron{ dir = 8; - heat_capacity = 1e+006; - icon_state = "floorscorched1" + heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/central) "dx" = ( @@ -1559,9 +1529,9 @@ "dN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating{ - heat_capacity = 1e+006; - icon_state = "panelscorched" + heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/central) "dO" = ( @@ -1865,9 +1835,9 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 8 }, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating{ - heat_capacity = 1e+006; - icon_state = "platingdmg1" + heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/central) "ev" = ( @@ -2043,9 +2013,7 @@ "eV" = ( /obj/structure/closet/emcloset, /obj/item/clothing/mask/breath, -/obj/structure/sign/warning/vacuum/external{ - pixel_y = -32 - }, +/obj/structure/sign/warning/vacuum/external/directional/south, /turf/open/floor/plating{ heat_capacity = 1e+006 }, @@ -2336,9 +2304,9 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating{ - heat_capacity = 1e+006; - icon_state = "platingdmg1" + heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/central) "fA" = ( @@ -2444,15 +2412,6 @@ "fO" = ( /turf/closed/wall, /area/awaymission/undergroundoutpost45/crew_quarters) -"fP" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, -/turf/open/floor/plating{ - heat_capacity = 1e+006; - icon_state = "platingdmg2" - }, -/area/awaymission/undergroundoutpost45/central) "fQ" = ( /obj/structure/table/wood, /obj/machinery/newscaster/directional/south, @@ -2524,10 +2483,9 @@ /obj/structure/disposalpipe/trunk{ dir = 1 }, -/obj/structure/sign/warning/deathsposal{ +/obj/structure/sign/warning/deathsposal/directional/south{ desc = "A warning sign which reads 'DISPOSAL: LEADS TO EXTERIOR'"; - name = "\improper DISPOSAL: LEADS TO EXTERIOR"; - pixel_y = -32 + name = "\improper DISPOSAL: LEADS TO EXTERIOR" }, /turf/open/floor/iron/dark{ heat_capacity = 1e+006 @@ -2643,9 +2601,9 @@ dir = 5 }, /obj/structure/cable, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating{ - heat_capacity = 1e+006; - icon_state = "platingdmg1" + heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/central) "gq" = ( @@ -2821,9 +2779,9 @@ /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/structure/cable, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating{ - heat_capacity = 1e+006; - icon_state = "platingdmg1" + heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/central) "gU" = ( @@ -3078,9 +3036,9 @@ /area/awaymission/undergroundoutpost45/gateway) "hy" = ( /obj/machinery/portable_atmospherics/scrubber, +/obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating{ - heat_capacity = 1e+006; - icon_state = "panelscorched" + heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/gateway) "hz" = ( @@ -3667,19 +3625,19 @@ /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/structure/cable, +/obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating{ - heat_capacity = 1e+006; - icon_state = "panelscorched" + heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/central) "iO" = ( /obj/structure/table, /obj/item/radio/off, /obj/item/radio/off, +/obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/iron{ dir = 8; - heat_capacity = 1e+006; - icon_state = "floorscorched1" + heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/gateway) "iP" = ( @@ -3813,10 +3771,9 @@ /obj/structure/disposalpipe/trunk{ dir = 4 }, -/obj/structure/sign/warning/deathsposal{ +/obj/structure/sign/warning/deathsposal/directional/south{ desc = "A warning sign which reads 'DISPOSAL: LEADS TO EXTERIOR'"; - name = "\improper DISPOSAL: LEADS TO EXTERIOR"; - pixel_y = -32 + name = "\improper DISPOSAL: LEADS TO EXTERIOR" }, /turf/open/floor/iron/cafeteria{ dir = 5; @@ -4064,9 +4021,9 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/structure/cable, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating{ - heat_capacity = 1e+006; - icon_state = "platingdmg2" + heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/central) "jE" = ( @@ -4160,10 +4117,10 @@ /obj/structure/sign/poster/official/safety_internals{ pixel_y = 32 }, +/obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/iron{ dir = 8; - heat_capacity = 1e+006; - icon_state = "floorscorched1" + heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/crew_quarters) "jS" = ( @@ -4294,9 +4251,9 @@ dir = 4 }, /obj/structure/cable, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating{ - heat_capacity = 1e+006; - icon_state = "platingdmg1" + heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/central) "kc" = ( @@ -4489,9 +4446,9 @@ "kv" = ( /obj/structure/closet/emcloset, /obj/item/clothing/mask/breath, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating{ - heat_capacity = 1e+006; - icon_state = "platingdmg1" + heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/central) "kw" = ( @@ -4516,9 +4473,7 @@ /obj/structure/table, /obj/item/storage/belt/utility, /obj/item/clothing/head/welding, -/obj/structure/sign/warning/biohazard{ - pixel_y = 32 - }, +/obj/structure/sign/warning/biohazard/directional/north, /obj/item/assembly/prox_sensor, /obj/item/assembly/prox_sensor, /obj/effect/turf_decal/stripes/line{ @@ -4816,9 +4771,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 8 }, -/obj/structure/sign/departments/science{ - pixel_x = -32 - }, +/obj/structure/sign/departments/science/directional/west, /obj/effect/turf_decal/tile/purple{ dir = 8 }, @@ -5289,10 +5242,9 @@ /obj/structure/disposalpipe/trunk{ dir = 1 }, -/obj/structure/sign/warning/deathsposal{ +/obj/structure/sign/warning/deathsposal/directional/south{ desc = "A warning sign which reads 'DISPOSAL: LEADS TO EXTERIOR'"; - name = "\improper DISPOSAL: LEADS TO EXTERIOR"; - pixel_y = -32 + name = "\improper DISPOSAL: LEADS TO EXTERIOR" }, /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ @@ -5376,10 +5328,10 @@ }, /area/awaymission/undergroundoutpost45/gateway) "mc" = ( +/obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/iron{ dir = 8; - heat_capacity = 1e+006; - icon_state = "floorscorched1" + heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/gateway) "md" = ( @@ -6035,9 +5987,9 @@ dir = 4 }, /obj/structure/cable, +/obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating{ - heat_capacity = 1e+006; - icon_state = "panelscorched" + heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/research) "nu" = ( @@ -6715,9 +6667,9 @@ /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/structure/cable, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating{ - heat_capacity = 1e+006; - icon_state = "platingdmg3" + heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/research) "ox" = ( @@ -7050,9 +7002,9 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating{ - heat_capacity = 1e+006; - icon_state = "platingdmg1" + heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/research) "pd" = ( @@ -7060,10 +7012,9 @@ /obj/structure/disposalpipe/trunk{ dir = 4 }, -/obj/structure/sign/warning/deathsposal{ +/obj/structure/sign/warning/deathsposal/directional/south{ desc = "A warning sign which reads 'DISPOSAL: LEADS TO EXTERIOR'"; - name = "\improper DISPOSAL: LEADS TO EXTERIOR"; - pixel_y = -32 + name = "\improper DISPOSAL: LEADS TO EXTERIOR" }, /turf/open/floor/iron/cafeteria{ dir = 5; @@ -7137,16 +7088,6 @@ heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/engineering) -"pk" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/plating{ - heat_capacity = 1e+006; - icon_state = "platingdmg3" - }, -/area/awaymission/undergroundoutpost45/research) "pl" = ( /obj/item/kirbyplants{ layer = 5 @@ -7470,9 +7411,9 @@ "pZ" = ( /obj/structure/disposalpipe/segment, /obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating{ - heat_capacity = 1e+006; - icon_state = "platingdmg3" + heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/crew_quarters) "qb" = ( @@ -7518,9 +7459,9 @@ /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /obj/structure/cable, +/obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating{ - heat_capacity = 1e+006; - icon_state = "panelscorched" + heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/research) "qg" = ( @@ -7892,9 +7833,9 @@ /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/structure/cable, +/obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating{ - heat_capacity = 1e+006; - icon_state = "panelscorched" + heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/research) "qY" = ( @@ -7974,10 +7915,10 @@ "rh" = ( /obj/machinery/light/small/directional/west, /obj/machinery/firealarm/directional/west, +/obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/iron{ dir = 8; - heat_capacity = 1e+006; - icon_state = "floorscorched1" + heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/engineering) "ri" = ( @@ -8189,9 +8130,9 @@ /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /obj/structure/cable, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating{ - heat_capacity = 1e+006; - icon_state = "platingdmg2" + heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/research) "rz" = ( @@ -8221,9 +8162,9 @@ /obj/item/storage/box/lights/mixed, /obj/item/poster/random_contraband, /obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating{ - heat_capacity = 1e+006; - icon_state = "panelscorched" + heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/research) "rE" = ( @@ -8294,9 +8235,9 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating{ - heat_capacity = 1e+006; - icon_state = "platingdmg1" + heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/research) "rL" = ( @@ -8309,9 +8250,9 @@ /area/awaymission/undergroundoutpost45/crew_quarters) "rM" = ( /obj/structure/disposalpipe/segment, +/obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating{ - heat_capacity = 1e+006; - icon_state = "panelscorched" + heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/crew_quarters) "rN" = ( @@ -8735,10 +8676,9 @@ /obj/structure/disposalpipe/trunk{ dir = 1 }, -/obj/structure/sign/warning/deathsposal{ +/obj/structure/sign/warning/deathsposal/directional/south{ desc = "A warning sign which reads 'DISPOSAL: LEADS TO EXTERIOR'"; - name = "\improper DISPOSAL: LEADS TO EXTERIOR"; - pixel_y = -32 + name = "\improper DISPOSAL: LEADS TO EXTERIOR" }, /turf/open/floor/iron/white/corner{ dir = 4; @@ -9115,9 +9055,9 @@ dir = 4 }, /obj/structure/cable, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating{ - heat_capacity = 1e+006; - icon_state = "platingdmg3" + heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/research) "tj" = ( @@ -9145,9 +9085,9 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating{ - heat_capacity = 1e+006; - icon_state = "platingdmg1" + heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/research) "tm" = ( @@ -9431,9 +9371,9 @@ }, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating{ - heat_capacity = 1e+006; - icon_state = "platingdmg3" + heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/research) "tR" = ( @@ -9455,9 +9395,9 @@ dir = 4 }, /obj/structure/cable, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating{ - heat_capacity = 1e+006; - icon_state = "platingdmg2" + heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/research) "tT" = ( @@ -9469,9 +9409,9 @@ }, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, +/obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating{ - heat_capacity = 1e+006; - icon_state = "panelscorched" + heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/research) "tU" = ( @@ -9715,10 +9655,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible{ dir = 9 }, +/obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/iron{ dir = 8; - heat_capacity = 1e+006; - icon_state = "floorscorched2" + heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/engineering) "us" = ( @@ -9771,9 +9711,9 @@ "uy" = ( /obj/structure/closet, /obj/item/storage/belt/utility, +/obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating{ - heat_capacity = 1e+006; - icon_state = "panelscorched" + heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/crew_quarters) "uz" = ( @@ -9904,12 +9844,10 @@ "uN" = ( /obj/structure/closet/emcloset, /obj/item/clothing/mask/breath, -/obj/structure/sign/warning/vacuum/external{ - pixel_x = -32 - }, +/obj/structure/sign/warning/vacuum/external/directional/west, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating{ - heat_capacity = 1e+006; - icon_state = "platingdmg1" + heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/research) "uO" = ( @@ -9917,9 +9855,9 @@ dir = 1 }, /obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating{ - heat_capacity = 1e+006; - icon_state = "panelscorched" + heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/research) "uP" = ( @@ -9935,9 +9873,9 @@ /obj/structure/chair{ dir = 8 }, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating{ - heat_capacity = 1e+006; - icon_state = "platingdmg2" + heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/crew_quarters) "uR" = ( @@ -9948,9 +9886,9 @@ /area/awaymission/undergroundoutpost45/crew_quarters) "uS" = ( /obj/structure/disposalpipe/segment, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating{ - heat_capacity = 1e+006; - icon_state = "platingdmg3" + heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/crew_quarters) "uT" = ( @@ -10136,9 +10074,9 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating{ - heat_capacity = 1e+006; - icon_state = "platingdmg1" + heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/crew_quarters) "vp" = ( @@ -10401,10 +10339,10 @@ /obj/structure/sign/poster/official/build{ pixel_y = -32 }, +/obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/iron{ dir = 8; - heat_capacity = 1e+006; - icon_state = "floorscorched2" + heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/engineering) "vW" = ( @@ -10497,10 +10435,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ dir = 4 }, +/obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/iron{ dir = 8; - heat_capacity = 1e+006; - icon_state = "floorscorched1" + heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/mining) "wg" = ( @@ -10937,10 +10875,10 @@ pixel_x = -2; pixel_y = -1 }, +/obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/iron{ dir = 8; - heat_capacity = 1e+006; - icon_state = "floorscorched2" + heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/mining) "xE" = ( @@ -11102,10 +11040,10 @@ /obj/item/stack/sheet/mineral/plasma{ amount = 6 }, +/obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/iron{ dir = 8; - heat_capacity = 1e+006; - icon_state = "floorscorched1" + heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/mining) "xX" = ( @@ -11151,10 +11089,10 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 1 }, +/obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/iron{ dir = 8; - heat_capacity = 1e+006; - icon_state = "floorscorched1" + heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/mining) "yc" = ( @@ -11173,9 +11111,7 @@ /area/awaymission/undergroundoutpost45/mining) "ye" = ( /obj/machinery/light/small/directional/east, -/obj/structure/sign/warning/vacuum/external{ - pixel_x = 32 - }, +/obj/structure/sign/warning/vacuum/external/directional/east, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron{ @@ -11196,9 +11132,7 @@ dir = 8 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/sign/warning/no_smoking{ - pixel_x = 32 - }, +/obj/structure/sign/warning/no_smoking/directional/east, /turf/open/floor/iron/dark{ heat_capacity = 1e+006 }, @@ -11251,9 +11185,7 @@ pixel_y = 3 }, /obj/item/stock_parts/scanning_module, -/obj/structure/sign/warning/no_smoking{ - pixel_x = -32 - }, +/obj/structure/sign/warning/no_smoking/directional/west, /obj/effect/turf_decal/stripes/line{ dir = 1 }, @@ -11347,9 +11279,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/structure/sign/warning/electric_shock{ - pixel_y = -32 - }, +/obj/structure/sign/warning/electric_shock/directional/south, /obj/machinery/vending/engivend, /obj/machinery/camera/directional/south{ c_tag = "Engineering Foyer"; @@ -11462,9 +11392,7 @@ }, /area/awaymission/undergroundoutpost45/research) "Cy" = ( -/obj/structure/sign/warning/secure_area{ - pixel_y = 32 - }, +/obj/structure/sign/warning/secure_area/directional/north, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron{ heat_capacity = 1e+006 @@ -11487,9 +11415,7 @@ /obj/machinery/computer/monitor/secret{ name = "primary power monitoring console" }, -/obj/structure/sign/warning/no_smoking{ - pixel_x = -32 - }, +/obj/structure/sign/warning/no_smoking/directional/west, /obj/effect/turf_decal/tile/yellow{ dir = 1 }, @@ -11540,9 +11466,7 @@ pixel_y = -1 }, /obj/item/multitool, -/obj/structure/sign/warning/no_smoking{ - pixel_x = -32 - }, +/obj/structure/sign/warning/no_smoking/directional/west, /obj/effect/turf_decal/stripes/line{ dir = 4 }, @@ -11576,10 +11500,9 @@ /area/awaymission/undergroundoutpost45/engineering) "Ea" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/warning/secure_area{ +/obj/structure/sign/warning/secure_area/directional/south{ desc = "A warning sign which reads 'SERVER ROOM'."; - name = "SERVER ROOM"; - pixel_y = -32 + name = "SERVER ROOM" }, /turf/open/floor/plating{ heat_capacity = 1e+006 @@ -11685,10 +11608,9 @@ /area/awaymission/undergroundoutpost45/engineering) "Gq" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/warning/secure_area{ +/obj/structure/sign/warning/secure_area/directional/north{ desc = "A warning sign which reads 'SERVER ROOM'."; - name = "SERVER ROOM"; - pixel_y = 32 + name = "SERVER ROOM" }, /turf/open/floor/plating{ heat_capacity = 1e+006 @@ -11733,10 +11655,9 @@ "IK" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk, -/obj/structure/sign/warning/deathsposal{ +/obj/structure/sign/warning/deathsposal/directional/north{ desc = "A warning sign which reads 'DISPOSAL: LEADS TO EXTERIOR'"; - name = "\improper DISPOSAL: LEADS TO EXTERIOR"; - pixel_y = 32 + name = "\improper DISPOSAL: LEADS TO EXTERIOR" }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark{ @@ -11904,9 +11825,7 @@ /area/awaymission/undergroundoutpost45/central) "No" = ( /obj/machinery/door/firedoor, -/obj/structure/sign/warning/secure_area{ - pixel_y = 32 - }, +/obj/structure/sign/warning/secure_area/directional/north, /obj/machinery/door/poddoor/preopen{ id = "UO45_Engineering"; name = "Engineering Security Door" @@ -11958,9 +11877,7 @@ pixel_y = 25 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/sign/warning/no_smoking{ - pixel_x = -32 - }, +/obj/structure/sign/warning/no_smoking/directional/west, /obj/effect/turf_decal/stripes/line{ dir = 9 }, @@ -12022,10 +11939,9 @@ /obj/structure/disposalpipe/trunk{ dir = 4 }, -/obj/structure/sign/warning/deathsposal{ +/obj/structure/sign/warning/deathsposal/directional/west{ desc = "A warning sign which reads 'DISPOSAL: LEADS TO EXTERIOR'"; - name = "\improper DISPOSAL: LEADS TO EXTERIOR"; - pixel_x = -32 + name = "\improper DISPOSAL: LEADS TO EXTERIOR" }, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -12084,9 +12000,7 @@ /area/awaymission/undergroundoutpost45/caves) "QG" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/sign/warning/secure_area{ - pixel_x = -32 - }, +/obj/structure/sign/warning/secure_area/directional/west, /obj/effect/turf_decal/tile/purple{ dir = 1 }, @@ -12097,9 +12011,7 @@ "QX" = ( /obj/structure/table, /obj/item/storage/medkit/regular, -/obj/structure/sign/warning/biohazard{ - pixel_x = -32 - }, +/obj/structure/sign/warning/biohazard/directional/west, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron{ heat_capacity = 1e+006 @@ -12133,9 +12045,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ dir = 4 }, -/obj/structure/sign/warning/secure_area{ - pixel_x = 32 - }, +/obj/structure/sign/warning/secure_area/directional/east, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/yellow{ dir = 1 @@ -12203,9 +12113,7 @@ dir = 4 }, /obj/machinery/light/small/directional/west, -/obj/structure/sign/warning/secure_area{ - pixel_x = -32 - }, +/obj/structure/sign/warning/secure_area/directional/west, /turf/open/floor/iron/white{ heat_capacity = 1e+006 }, @@ -12223,9 +12131,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 1 }, -/obj/structure/sign/warning/secure_area{ - pixel_y = -32 - }, +/obj/structure/sign/warning/secure_area/directional/south, /obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/yellow{ dir = 4 @@ -12280,9 +12186,7 @@ dir = 1; name = "Unfiltered to Mix" }, -/obj/structure/sign/warning/no_smoking{ - pixel_x = 32 - }, +/obj/structure/sign/warning/no_smoking/directional/east, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron{ heat_capacity = 1e+006 @@ -12336,9 +12240,7 @@ "Xq" = ( /obj/structure/closet/firecloset, /obj/machinery/light/small/directional/south, -/obj/structure/sign/warning/secure_area{ - pixel_y = -32 - }, +/obj/structure/sign/warning/secure_area/directional/south, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron/white{ @@ -12429,9 +12331,7 @@ /obj/machinery/conveyor{ id = "UO45_mining" }, -/obj/structure/sign/warning/no_smoking{ - pixel_x = -32 - }, +/obj/structure/sign/warning/no_smoking/directional/west, /obj/effect/turf_decal/stripes/line{ dir = 4 }, @@ -41114,7 +41014,7 @@ aC bq bq bq -am +al bY aC al @@ -41664,7 +41564,7 @@ gz ns nN nj -pk +rK nN nN qX @@ -41889,7 +41789,7 @@ bP cb cq ct -cG +cC cq dk an @@ -42657,7 +42557,7 @@ aS bA aF bP -ce +dj aC cx cI @@ -43412,7 +43312,7 @@ ad ad ae ag -ac +aj ao bY as @@ -43670,7 +43570,7 @@ ad ae ag al -am +al ar as at @@ -43926,7 +43826,7 @@ ad ad ae ag -am +al ap fu ag @@ -48315,7 +48215,7 @@ Lz Lz an cS -ce +dj aC zX EP @@ -48838,7 +48738,7 @@ eF ct ct fz -fP +gQ gb gj gp diff --git a/_maps/icebox.json b/_maps/icebox.json index 3111fe96232307..e3aa9f20fe2f41 100644 --- a/_maps/icebox.json +++ b/_maps/icebox.json @@ -42,6 +42,7 @@ "No Parallax": true } ], + "orbit_shift_replacement": "Attention crew, it appears that someone on your outpost has shifted your planet into more dangerous territory.", "minetype": "none", "job_changes": { "Cook": { diff --git a/_maps/map_files/CTF/downtown.dmm b/_maps/map_files/CTF/downtown.dmm index 6f78f25171fa4c..6c846d55aa1ed5 100644 --- a/_maps/map_files/CTF/downtown.dmm +++ b/_maps/map_files/CTF/downtown.dmm @@ -50,9 +50,8 @@ /area/centcom/ctf) "bc" = ( /obj/structure/sign/poster/random/directional/west, -/turf/open/floor/wood{ - icon_state = "wood-broken" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/centcom/ctf) "bd" = ( /obj/effect/turf_decal/tile/bar{ @@ -455,9 +454,8 @@ /obj/structure/table/wood{ resistance_flags = 64 }, -/turf/open/floor/wood{ - icon_state = "wood-broken7" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/centcom/ctf) "iy" = ( /obj/effect/turf_decal/trimline/red/line{ @@ -486,11 +484,6 @@ /obj/effect/turf_decal/tile/blue, /turf/open/floor/iron/dark, /area/centcom/ctf) -"iQ" = ( -/turf/open/floor/wood{ - icon_state = "wood-broken4" - }, -/area/centcom/ctf) "iW" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -1668,9 +1661,8 @@ /turf/open/floor/iron/dark, /area/centcom/ctf) "Ie" = ( -/turf/open/floor/wood{ - icon_state = "wood-broken5" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/centcom/ctf) "Ij" = ( /obj/effect/turf_decal/trimline/red/line{ @@ -1840,11 +1832,6 @@ /obj/structure/flora/bush/flowers_yw/style_random, /turf/open/misc/grass, /area/centcom/ctf) -"KN" = ( -/turf/open/floor/wood{ - icon_state = "wood-broken6" - }, -/area/centcom/ctf) "KV" = ( /obj/effect/turf_decal/siding/white, /obj/effect/decal/cleanable/oil, @@ -4115,7 +4102,7 @@ nT dO oS UZ -iQ +Ie en WD Kh @@ -4188,7 +4175,7 @@ BH BH xf Bx -KN +Ie ql ql bs diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 96912d6f9db080..3eb526135d8b92 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -37,9 +37,7 @@ /area/station/service/theater) "aaG" = ( /obj/machinery/light/directional/east, -/obj/structure/sign/warning/no_smoking{ - pixel_x = 32 - }, +/obj/structure/sign/warning/no_smoking/directional/east, /obj/machinery/computer/mechpad{ dir = 8 }, @@ -146,9 +144,7 @@ /obj/structure/window/reinforced{ dir = 8 }, -/obj/structure/sign/warning/yes_smoking/circle{ - pixel_y = -32 - }, +/obj/structure/sign/warning/yes_smoking/circle/directional/south, /obj/machinery/light/small/directional/south, /obj/item/kirbyplants/dead{ name = "Lungie" @@ -390,7 +386,7 @@ /area/station/service/hydroponics) "aew" = ( /turf/open/floor/iron/cafeteria, -/area/station/security/prison) +/area/station/security/prison/mess) "aeE" = ( /obj/structure/table/reinforced, /obj/item/stack/package_wrap, @@ -478,6 +474,9 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/fore) +"afC" = ( +/turf/open/floor/iron, +/area/station/security/prison/visit) "afF" = ( /obj/effect/decal/cleanable/dirt, /turf/closed/wall, @@ -545,12 +544,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "agw" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood{ - icon_state = "wood-broken2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/service/abandoned_gambling_den) "agy" = ( /obj/structure/window/reinforced, @@ -588,7 +586,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/science/ordnance, /turf/open/floor/iron/dark/airless, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/freezerchamber) "agH" = ( /obj/machinery/conveyor{ dir = 1; @@ -689,9 +687,8 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/west, -/turf/open/floor/wood{ - icon_state = "wood-broken" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/service/library/abandoned) "ahQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -809,7 +806,7 @@ dir = 8 }, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/execution/transfer) "ajw" = ( /obj/structure/disposalpipe/trunk, /obj/structure/cable, @@ -849,7 +846,7 @@ /obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/science/misc_lab) +/area/station/science/explab) "akn" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -1120,7 +1117,8 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/construction, +/obj/effect/mapping_helpers/airlock/access/any/command/minisat, +/obj/effect/mapping_helpers/airlock/access/any/command/ai_upload, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) "anF" = ( @@ -1160,7 +1158,7 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/stripes/corner, /turf/open/floor/iron/dark, -/area/station/science/misc_lab) +/area/station/science/explab) "aoJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -1256,6 +1254,13 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /turf/open/floor/iron, /area/station/maintenance/starboard) +"apG" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/security/prison/garden) "apK" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/item/kirbyplants/random, @@ -1679,7 +1684,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "atV" = ( /obj/effect/landmark/blobstart, /obj/structure/cable, @@ -1775,7 +1780,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/airalarm/directional/south, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "auZ" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -1898,9 +1903,7 @@ /turf/open/floor/iron, /area/station/maintenance/starboard/greater) "awB" = ( -/obj/structure/sign/departments/court{ - pixel_x = 32 - }, +/obj/structure/sign/departments/court/directional/east, /obj/effect/turf_decal/tile/neutral, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -2068,7 +2071,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, -/area/station/security/prison) +/area/station/security/execution/transfer) "azE" = ( /obj/effect/turf_decal/tile/red{ dir = 1 @@ -2136,7 +2139,7 @@ normaldoorcontrol = 1 }, /turf/open/floor/iron, -/area/station/security/execution/transfer) +/area/station/security/processing) "aAA" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -2159,7 +2162,7 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/light/directional/south, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "aBc" = ( /obj/structure/chair/sofa/right, /turf/open/floor/carpet, @@ -2282,9 +2285,7 @@ "aCD" = ( /obj/structure/table/wood, /obj/item/flashlight/lamp, -/obj/structure/sign/warning/no_smoking{ - pixel_x = 32 - }, +/obj/structure/sign/warning/no_smoking/directional/east, /obj/structure/sign/poster/official/random/directional/south, /turf/open/floor/wood, /area/station/commons/vacant_room/office) @@ -2356,7 +2357,6 @@ /area/station/science/server) "aEr" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/east, /obj/machinery/conveyor/inverted{ dir = 10; id = "cargoload" @@ -2443,7 +2443,7 @@ /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/warning/vacuum, /turf/open/floor/plating, -/area/station/security/execution/transfer) +/area/station/security/processing) "aGa" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 9 @@ -2865,9 +2865,8 @@ /area/station/cargo/warehouse) "aMc" = ( /obj/machinery/light/small/directional/west, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/department/crew_quarters/bar) "aMd" = ( /obj/structure/filingcabinet/chestdrawer, @@ -2920,9 +2919,8 @@ /obj/structure/chair/comfy/brown{ dir = 4 }, -/turf/open/floor/wood{ - icon_state = "wood-broken3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/service/electronic_marketing_den) "aNd" = ( /obj/structure/chair/stool/directional/west, @@ -2942,9 +2940,7 @@ /turf/open/space/basic, /area/space/nearstation) "aNu" = ( -/obj/structure/sign/warning/pods{ - pixel_x = -32 - }, +/obj/structure/sign/warning/pods/directional/west, /obj/effect/turf_decal/stripes/line{ dir = 9 }, @@ -2965,9 +2961,8 @@ "aNV" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/airalarm/directional/north, -/turf/open/floor/wood{ - icon_state = "wood-broken2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/maintenance/port/fore) "aNY" = ( /obj/effect/decal/cleanable/dirt, @@ -3173,9 +3168,7 @@ /obj/effect/turf_decal/stripes/corner{ dir = 4 }, -/obj/structure/sign/warning/vacuum{ - pixel_y = 32 - }, +/obj/structure/sign/warning/vacuum/directional/north, /turf/open/floor/iron, /area/station/engineering/atmos/project) "aRp" = ( @@ -3277,7 +3270,7 @@ dir = 8 }, /turf/open/floor/plating/airless, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "aSO" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -3320,7 +3313,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "aTH" = ( /obj/structure/table/wood, /obj/item/folder/blue{ @@ -3417,7 +3410,7 @@ req_access = list("brig") }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "aVo" = ( /obj/machinery/computer/security/hos{ dir = 1 @@ -3641,7 +3634,7 @@ /area/station/maintenance/solars/port/fore) "aYP" = ( /turf/closed/wall/r_wall, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "aYR" = ( /obj/effect/decal/cleanable/oil, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -3704,7 +3697,7 @@ "bab" = ( /obj/machinery/newscaster/directional/west, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "bag" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ @@ -3959,7 +3952,7 @@ "bdd" = ( /obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/plating/airless, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "bdt" = ( /obj/structure/cable, /obj/structure/window/reinforced/plasma/spawner/west{ @@ -4081,7 +4074,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "bfy" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -4213,14 +4206,8 @@ /turf/open/floor/iron, /area/station/hallway/primary/central/fore) "bgU" = ( -/obj/docking_port/stationary{ - dir = 4; - dwidth = 3; - height = 5; - id = "mining_home"; - name = "mining shuttle bay"; - roundstart_template = /datum/map_template/shuttle/mining/delta; - width = 7 +/obj/docking_port/stationary/mining_home{ + dir = 4 }, /turf/open/space/basic, /area/space) @@ -4248,7 +4235,8 @@ /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ id = "roboticsprivacy"; - name = "Robotics Shutters" + name = "Robotics Shutters"; + dir = 4 }, /turf/open/floor/plating, /area/station/science/robotics/lab) @@ -4860,6 +4848,9 @@ }, /turf/open/floor/iron/white, /area/station/science/lab) +"bpC" = ( +/turf/closed/wall/r_wall, +/area/station/science/ordnance/burnchamber) "bpF" = ( /obj/structure/window/reinforced{ dir = 4 @@ -4959,9 +4950,7 @@ /turf/open/floor/iron/dark, /area/station/service/hydroponics) "bqI" = ( -/obj/structure/sign/warning/secure_area{ - pixel_x = -32 - }, +/obj/structure/sign/warning/secure_area/directional/west, /turf/open/space/basic, /area/space) "bqP" = ( @@ -5146,9 +5135,8 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "btF" = ( /obj/structure/lattice, @@ -5285,9 +5273,7 @@ /area/station/maintenance/fore) "bvs" = ( /obj/item/kirbyplants/random, -/obj/structure/sign/warning/no_smoking{ - pixel_y = 32 - }, +/obj/structure/sign/warning/no_smoking/directional/north, /obj/structure/cable, /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron/dark, @@ -5394,6 +5380,16 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"bwC" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "cmoshutter"; + name = "CMO Office Shutters"; + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/command/heads_quarters/cmo) "bwF" = ( /obj/structure/table/reinforced, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -5566,7 +5562,7 @@ }, /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/station/security/prison) +/area/station/security/prison/visit) "byX" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -5630,14 +5626,8 @@ /turf/open/floor/plating, /area/station/engineering/supermatter/room) "bAc" = ( -/obj/docking_port/stationary{ - dir = 8; - dwidth = 2; - height = 5; - id = "laborcamp_home"; - name = "fore bay 1"; - roundstart_template = /datum/map_template/shuttle/labour/delta; - width = 9 +/obj/docking_port/stationary/laborcamp_home{ + dir = 8 }, /turf/open/space/basic, /area/space) @@ -5743,7 +5733,8 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/door/firedoor, /obj/machinery/door/poddoor/shutters/window/preopen{ - id = "right_arrivals_shutters" + id = "right_arrivals_shutters"; + dir = 1 }, /obj/machinery/light/directional/west, /obj/effect/turf_decal/stripes/line, @@ -5756,9 +5747,7 @@ /area/station/hallway/secondary/entry) "bBR" = ( /obj/structure/lattice/catwalk, -/obj/structure/sign/warning/secure_area{ - pixel_x = 32 - }, +/obj/structure/sign/warning/secure_area/directional/east, /turf/open/space/basic, /area/space/nearstation) "bBS" = ( @@ -5803,7 +5792,8 @@ /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ id = "aicorewindow"; - name = "AI Core Shutters" + name = "AI Core Shutters"; + dir = 1 }, /obj/structure/cable, /turf/open/floor/plating, @@ -6394,7 +6384,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "bIm" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -6661,7 +6651,7 @@ dir = 1 }, /turf/open/floor/plating/airless, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "bMe" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -6704,8 +6694,9 @@ /area/station/science/xenobiology) "bNf" = ( /obj/machinery/light/directional/east, +/obj/structure/cable, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/visit) "bNt" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/toolcloset, @@ -6798,7 +6789,8 @@ }, /obj/machinery/door/poddoor/shutters/preopen{ id = "cafe_counter"; - name = "Kitchen Counter Shutters" + name = "Kitchen Counter Shutters"; + dir = 8 }, /turf/open/floor/iron/white/smooth_half{ dir = 1 @@ -6848,9 +6840,8 @@ /area/station/science/xenobiology) "bOR" = ( /obj/effect/spawner/random/trash/bin, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "bOS" = ( /obj/structure/cable, @@ -7106,9 +7097,7 @@ /area/station/security/office) "bRJ" = ( /obj/structure/lattice, -/obj/structure/sign/warning/secure_area{ - pixel_x = -32 - }, +/obj/structure/sign/warning/secure_area/directional/west, /turf/open/space/basic, /area/space/nearstation) "bRK" = ( @@ -7211,7 +7200,7 @@ dir = 4 }, /turf/open/floor/iron, -/area/station/security/execution/transfer) +/area/station/security/processing) "bSp" = ( /obj/effect/landmark/start/hangover, /obj/structure/table/wood, @@ -7265,7 +7254,7 @@ dir = 8 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/work) "bSx" = ( /obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ dir = 4 @@ -7278,6 +7267,14 @@ /obj/machinery/meter, /turf/open/floor/iron, /area/station/engineering/atmos) +"bSJ" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/north, +/turf/open/floor/iron, +/area/station/security/prison/visit) "bSN" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, @@ -7330,7 +7327,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "bTo" = ( /obj/effect/turf_decal/tile/blue, /turf/open/floor/iron/white, @@ -7355,7 +7352,7 @@ }, /obj/effect/turf_decal/delivery, /turf/open/floor/iron/dark, -/area/station/science/storage) +/area/station/science/ordnance/storage) "bTu" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/grimy, @@ -7441,7 +7438,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/science/ordnance, /turf/open/floor/iron/dark/airless, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/freezerchamber) "bUQ" = ( /obj/structure/chair/stool/directional/west, /turf/open/floor/iron, @@ -7465,9 +7462,8 @@ /area/station/service/kitchen) "bVi" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/department/engine/atmos) "bVq" = ( /obj/effect/turf_decal/stripes/line{ @@ -7488,9 +7484,8 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 }, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "bVI" = ( /obj/structure/disposalpipe/segment{ @@ -7555,6 +7550,12 @@ /obj/effect/landmark/blobstart, /turf/open/floor/plating, /area/station/service/library/abandoned) +"bWN" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/security/execution/transfer) "bWR" = ( /obj/structure/table/wood, /obj/item/camera, @@ -7646,15 +7647,13 @@ name = "Prison Blast Door" }, /obj/effect/decal/cleanable/dirt, -/obj/structure/sign/warning/pods{ - pixel_x = -32 - }, +/obj/structure/sign/warning/pods/directional/west, /obj/structure/cable, /obj/effect/turf_decal/delivery, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "bYV" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, @@ -7702,18 +7701,6 @@ /obj/effect/turf_decal/tile/red, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"bZR" = ( -/obj/structure/cable, -/obj/machinery/conveyor{ - dir = 8; - id = "cargounload" - }, -/obj/machinery/door/poddoor{ - id = "cargounload"; - name = "Supply Dock Unloading Door" - }, -/turf/open/floor/plating, -/area/station/cargo/storage) "bZX" = ( /obj/structure/cable, /obj/effect/turf_decal/stripes/line{ @@ -7966,6 +7953,15 @@ }, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) +"ccx" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "chapelprivacy"; + name = "Chapel Privacy Shutters"; + dir = 8 + }, +/turf/open/floor/plating, +/area/station/service/chapel/office) "ccA" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/neutral{ @@ -8022,7 +8018,7 @@ "cdm" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, -/area/station/security/execution/transfer) +/area/station/security/processing) "cdo" = ( /obj/machinery/power/apc/auto_name/directional/south, /obj/machinery/camera/directional/south{ @@ -8254,7 +8250,7 @@ dir = 4 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/garden) "cgg" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -8344,7 +8340,7 @@ /obj/structure/reagent_dispensers/watertank, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "chY" = ( /obj/machinery/door/poddoor/shutters/radiation/preopen{ id = "engsm"; @@ -8403,7 +8399,7 @@ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "ciD" = ( /obj/machinery/atmospherics/pipe/smart/simple/purple/visible, /obj/effect/turf_decal/tile/yellow{ @@ -8437,7 +8433,7 @@ dir = 1 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "cjd" = ( /obj/machinery/light_switch/directional/south, /obj/item/kirbyplants/random, @@ -8496,9 +8492,7 @@ dir = 5 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/sign/warning/electric_shock{ - pixel_x = 32 - }, +/obj/structure/sign/warning/electric_shock/directional/east, /turf/open/floor/iron, /area/station/engineering/gravity_generator) "ckB" = ( @@ -8586,7 +8580,7 @@ /obj/machinery/door/airlock/engineering/glass{ name = "Supermatter Engine Room" }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/construction, +/obj/effect/mapping_helpers/airlock/access/all/engineering/general, /turf/open/floor/iron, /area/station/engineering/main) "clx" = ( @@ -8749,7 +8743,8 @@ /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ id = "rndlab2"; - name = "Secondary Research and Development Shutter" + name = "Secondary Research and Development Shutter"; + dir = 4 }, /turf/open/floor/plating, /area/station/science/lab) @@ -8900,7 +8895,7 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/light/directional/east, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "cqr" = ( /obj/machinery/door/airlock/command/glass{ name = "Server Access" @@ -8979,7 +8974,7 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "crR" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, @@ -8988,9 +8983,8 @@ /obj/structure/chair/wood, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood{ - icon_state = "wood-broken7" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/service/abandoned_gambling_den) "csh" = ( /obj/effect/turf_decal/tile/blue{ @@ -9015,7 +9009,7 @@ dir = 4 }, /turf/open/floor/engine/vacuum, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "csw" = ( /turf/closed/wall, /area/station/service/hydroponics) @@ -9081,9 +9075,8 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small/directional/north, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/security/prison/safe) "cui" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -9247,7 +9240,7 @@ /obj/item/paper_bin, /obj/item/pen, /turf/open/floor/iron/dark, -/area/station/science/misc_lab) +/area/station/science/explab) "cwV" = ( /obj/effect/landmark/start/hangover, /obj/structure/disposalpipe/segment{ @@ -9472,7 +9465,7 @@ /obj/machinery/firealarm/directional/south, /obj/effect/turf_decal/tile/red/anticorner/contrasted, /turf/open/floor/iron, -/area/station/security/execution/transfer) +/area/station/security/processing) "cAw" = ( /obj/structure/cable, /obj/structure/rack, @@ -9538,7 +9531,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "cAU" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/monitored/oxygen_input{ dir = 4 @@ -9631,7 +9624,7 @@ dir = 4 }, /turf/open/floor/iron, -/area/station/security/execution/transfer) +/area/station/security/processing) "cBU" = ( /obj/effect/turf_decal/tile/blue{ dir = 8 @@ -9700,7 +9693,7 @@ /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "cCj" = ( -/obj/machinery/status_display/supply, +/obj/structure/sign/warning/vacuum, /turf/closed/wall, /area/station/cargo/storage) "cCn" = ( @@ -9772,9 +9765,8 @@ /obj/structure/railing/corner{ dir = 8 }, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "cCY" = ( /obj/effect/spawner/structure/window/reinforced/plasma, @@ -9892,9 +9884,8 @@ /area/station/maintenance/port/fore) "cEw" = ( /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "cEx" = ( /obj/effect/decal/cleanable/dirt, @@ -9969,7 +9960,7 @@ "cEV" = ( /obj/machinery/portable_atmospherics/canister/plasma, /turf/open/floor/iron/dark, -/area/station/science/storage) +/area/station/science/ordnance/storage) "cFe" = ( /obj/machinery/duct, /obj/effect/turf_decal/trimline/yellow/warning{ @@ -10007,7 +9998,7 @@ "cFC" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating/airless, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "cFF" = ( /turf/open/floor/engine{ name = "Holodeck Projector Floor" @@ -10036,7 +10027,7 @@ }, /obj/machinery/firealarm/directional/west, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "cGh" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -10165,9 +10156,7 @@ pixel_x = -4; pixel_y = 4 }, -/obj/structure/sign/warning/no_smoking{ - pixel_x = -32 - }, +/obj/structure/sign/warning/no_smoking/directional/west, /turf/open/floor/iron, /area/station/maintenance/department/engine/atmos) "cHH" = ( @@ -10258,7 +10247,7 @@ /obj/machinery/firealarm/directional/east, /obj/machinery/light_switch/directional/south, /turf/open/floor/iron/white, -/area/station/science/misc_lab/range) +/area/station/science/auxlab) "cJp" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/neutral{ @@ -10548,7 +10537,7 @@ /obj/effect/turf_decal/tile/red, /obj/machinery/firealarm/directional/north, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "cNv" = ( /obj/effect/landmark/start/hangover, /obj/effect/decal/cleanable/dirt, @@ -10791,7 +10780,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/visit) "cRW" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -10813,7 +10802,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/corner, /turf/open/floor/plating/airless, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "cSr" = ( /obj/machinery/atmospherics/components/trinary/mixer{ color = "#FFFF00" @@ -10860,7 +10849,7 @@ "cSQ" = ( /obj/machinery/atmospherics/components/tank, /turf/open/floor/iron/dark, -/area/station/science/storage) +/area/station/science/ordnance/storage) "cTi" = ( /obj/machinery/camera/directional/south{ c_tag = "Holodeck - Aft 1"; @@ -10927,9 +10916,7 @@ /area/station/science/lobby) "cUy" = ( /obj/structure/cable, -/obj/structure/sign/warning/no_smoking{ - pixel_y = 32 - }, +/obj/structure/sign/warning/no_smoking/directional/north, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/yellow{ dir = 4 @@ -10975,7 +10962,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/science/ordnance, /turf/open/floor/engine, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "cUQ" = ( /obj/structure/closet/emcloset, /obj/structure/cable, @@ -10983,7 +10970,7 @@ dir = 10 }, /turf/open/floor/iron, -/area/station/security/execution/transfer) +/area/station/security/processing) "cVe" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -11341,7 +11328,7 @@ dir = 9 }, /turf/open/floor/iron, -/area/station/science/misc_lab/range) +/area/station/science/auxlab) "dbK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/landmark/start/hangover, @@ -11382,17 +11369,15 @@ /obj/structure/table/wood, /obj/item/paper_bin, /obj/item/pen, -/turf/open/floor/wood{ - icon_state = "wood-broken2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/service/library/abandoned) "dbY" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "dbZ" = ( /obj/structure/rack, @@ -11497,6 +11482,7 @@ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/all/supply/mining, +/obj/structure/cable, /turf/open/floor/iron, /area/station/cargo/miningoffice) "ddv" = ( @@ -11722,7 +11708,7 @@ dir = 8 }, /turf/open/floor/iron/cafeteria, -/area/station/security/prison) +/area/station/security/prison/mess) "dgA" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ @@ -11785,7 +11771,8 @@ /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ id = "chemisttop"; - name = "Chemistry Lobby Shutters" + name = "Chemistry Lobby Shutters"; + dir = 1 }, /turf/open/floor/plating, /area/station/medical/pharmacy) @@ -11793,6 +11780,15 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/commons/dorms) +"dhN" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/obj/machinery/door/poddoor/preopen{ + id = "brigprison"; + name = "Prison Blast Door" + }, +/turf/open/floor/plating, +/area/station/security/prison/garden) "dhR" = ( /obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/plating, @@ -11818,7 +11814,8 @@ name = "Shared Engineering Storage" }, /obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/obj/effect/mapping_helpers/airlock/access/any/engineering/general, +/obj/effect/mapping_helpers/airlock/access/any/engineering/construction, /turf/open/floor/iron, /area/station/engineering/storage_shared) "djf" = ( @@ -12028,7 +12025,7 @@ dir = 4 }, /turf/open/floor/iron, -/area/station/security/execution/transfer) +/area/station/security/processing) "dlK" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -12049,13 +12046,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, -/area/station/security/prison/safe) -"dmo" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood{ - icon_state = "wood-broken" - }, -/area/station/service/abandoned_gambling_den) +/area/station/security/prison/toilet) "dmx" = ( /obj/machinery/door/airlock/research/glass{ name = "Xenobiology Kill Room" @@ -12228,7 +12219,7 @@ /obj/structure/bedsheetbin, /obj/structure/cable, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/work) "dql" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -12256,7 +12247,6 @@ /obj/structure/cable, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/blood/old, -/obj/machinery/door/firedoor, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 }, @@ -12294,7 +12284,7 @@ dir = 4 }, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/execution/transfer) "drj" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -12367,6 +12357,9 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron, /area/station/maintenance/port/fore) +"dsg" = ( +/turf/closed/wall, +/area/station/security/prison/work) "dsj" = ( /obj/structure/closet/secure_closet/engineering_personal, /obj/machinery/light/small/directional/south, @@ -12471,9 +12464,7 @@ "dtG" = ( /obj/structure/lattice, /obj/structure/grille, -/obj/structure/sign/warning/secure_area{ - pixel_x = 32 - }, +/obj/structure/sign/warning/secure_area/directional/east, /turf/open/space/basic, /area/space/nearstation) "dtS" = ( @@ -12576,11 +12567,15 @@ "duR" = ( /obj/machinery/door/poddoor/shutters/preopen{ id = "cmoshutter"; - name = "CMO Office Shutters" + name = "CMO Office Shutters"; + dir = 1 }, /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/command/heads_quarters/cmo) +"duX" = ( +/turf/closed/wall/r_wall, +/area/station/security/prison/visit) "dvu" = ( /obj/machinery/door/airlock/engineering{ name = "Starboard Quarter Solar Access" @@ -12702,13 +12697,10 @@ /obj/machinery/hydroponics/soil, /obj/item/cultivator, /obj/effect/decal/cleanable/dirt, -/obj/structure/sign/warning/electric_shock{ - pixel_x = 32 - }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/station/security/prison) +/obj/machinery/airalarm/directional/east, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/station/security/prison/garden) "dwX" = ( /obj/machinery/door/airlock/security/glass{ name = "Permabrig Cell 5" @@ -12836,9 +12828,7 @@ dir = 4; id = "garbage" }, -/obj/structure/sign/warning/vacuum{ - pixel_y = 32 - }, +/obj/structure/sign/warning/vacuum/directional/north, /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -12930,9 +12920,7 @@ }, /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/caution/stand_clear, -/obj/structure/sign/warning/fire{ - pixel_y = 32 - }, +/obj/structure/sign/warning/fire/directional/north, /obj/machinery/light/small/directional/north, /turf/open/floor/iron/half, /area/station/engineering/atmos) @@ -12989,9 +12977,7 @@ /turf/open/floor/plating, /area/station/maintenance/port/aft) "dBF" = ( -/obj/structure/sign/warning/no_smoking{ - pixel_x = 32 - }, +/obj/structure/sign/warning/no_smoking/directional/east, /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/station/maintenance/department/electrical) @@ -13319,7 +13305,8 @@ }, /obj/machinery/door/poddoor/shutters/preopen{ id = "rndlab2"; - name = "Secondary Research and Development Shutter" + name = "Secondary Research and Development Shutter"; + dir = 4 }, /obj/machinery/door/window/right/directional/east, /obj/effect/turf_decal/delivery, @@ -13348,9 +13335,8 @@ "dHe" = ( /obj/structure/closet, /obj/effect/spawner/random/maintenance/two, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "dHo" = ( /obj/structure/chair/office{ @@ -13387,13 +13373,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/science/research) -"dHK" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/warning/pods{ - name = "MINING POD" - }, -/turf/open/floor/plating, -/area/station/cargo/miningoffice) "dHM" = ( /obj/structure/table/reinforced, /obj/item/folder/red{ @@ -13592,7 +13571,7 @@ /obj/machinery/door/airlock/engineering{ name = "Engineering Break Room" }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/obj/effect/mapping_helpers/airlock/access/all/engineering/construction, /turf/open/floor/iron, /area/station/engineering/break_room) "dLg" = ( @@ -13630,6 +13609,9 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"dLL" = ( +/turf/open/floor/plating, +/area/station/security/prison/work) "dMs" = ( /obj/structure/table/wood, /obj/effect/decal/cleanable/dirt, @@ -13701,9 +13683,7 @@ /area/station/engineering/hallway) "dMR" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/warning/secure_area{ - pixel_x = -32 - }, +/obj/structure/sign/warning/secure_area/directional/west, /turf/open/floor/plating, /area/station/engineering/atmos/mix) "dNe" = ( @@ -13735,7 +13715,8 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/construction, +/obj/effect/mapping_helpers/airlock/access/any/command/minisat, +/obj/effect/mapping_helpers/airlock/access/any/command/ai_upload, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) "dNn" = ( @@ -13788,7 +13769,7 @@ /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "dOC" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/purple/fourcorners, @@ -13868,7 +13849,7 @@ }, /obj/machinery/firealarm/directional/west, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "dPp" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -14059,7 +14040,7 @@ }, /obj/item/radio/intercom/directional/north, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "dSv" = ( /obj/machinery/holopad, /obj/effect/turf_decal/bot, @@ -14114,6 +14095,10 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/maintenance/port/greater) +"dUj" = ( +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/security/execution/transfer) "dUl" = ( /obj/structure/table/wood, /obj/item/clipboard, @@ -14497,10 +14482,8 @@ /turf/open/floor/iron, /area/station/engineering/atmos/hfr_room) "ebf" = ( -/obj/structure/cable, -/obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/warning/vacuum, -/turf/open/floor/plating, +/turf/closed/wall, /area/station/cargo/miningoffice) "ebg" = ( /obj/machinery/light/directional/east, @@ -14552,6 +14535,12 @@ }, /turf/open/space, /area/space/nearstation) +"ech" = ( +/obj/machinery/light/small/directional/north, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron, +/area/station/security/prison/safe) "ecl" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "Maintenance Hatch" @@ -14593,7 +14582,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "edB" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -14700,7 +14689,8 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/door/firedoor, /obj/machinery/door/poddoor/shutters/window/preopen{ - id = "left_arrivals_shutters" + id = "left_arrivals_shutters"; + dir = 1 }, /obj/machinery/light/directional/west, /obj/effect/turf_decal/stripes/line{ @@ -14856,7 +14846,7 @@ dir = 1 }, /turf/open/floor/iron, -/area/station/science/misc_lab/range) +/area/station/science/auxlab) "ehD" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, /turf/open/floor/iron, @@ -15248,9 +15238,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, /obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible/layer4, -/obj/structure/sign/warning/secure_area{ - pixel_x = -32 - }, +/obj/structure/sign/warning/secure_area/directional/west, /turf/open/floor/iron, /area/station/engineering/supermatter/room) "enk" = ( @@ -15405,7 +15393,8 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/door/poddoor/shutters{ id = "mechbay"; - name = "Mech Bay Shutters" + name = "Mech Bay Shutters"; + dir = 4 }, /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -15525,7 +15514,7 @@ /obj/structure/window/reinforced{ dir = 8 }, -/obj/structure/musician/piano, +/obj/effect/spawner/random/structure/musician/piano/random_piano, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/service/theater/abandoned) @@ -15593,7 +15582,7 @@ /obj/effect/decal/cleanable/dirt, /mob/living/simple_animal/mouse/brown/tom, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/garden) "erS" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/neutral, @@ -15781,9 +15770,7 @@ "eux" = ( /obj/item/kirbyplants/random, /obj/machinery/light/directional/east, -/obj/structure/sign/warning/no_smoking{ - pixel_x = 32 - }, +/obj/structure/sign/warning/no_smoking/directional/east, /turf/open/floor/iron{ icon_state = "chapel" }, @@ -15855,7 +15842,8 @@ /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ id = "cmoshutter"; - name = "CMO Office Shutters" + name = "CMO Office Shutters"; + dir = 1 }, /turf/open/floor/plating, /area/station/command/heads_quarters/cmo) @@ -15941,7 +15929,7 @@ dir = 1 }, /turf/open/floor/iron, -/area/station/security/execution/transfer) +/area/station/security/processing) "ewQ" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden{ dir = 4 @@ -15999,9 +15987,8 @@ /area/station/engineering/atmos/pumproom) "exr" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood{ - icon_state = "wood-broken" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/service/library/abandoned) "exv" = ( /obj/item/clipboard, @@ -16158,7 +16145,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/science/ordnance, /turf/open/floor/iron, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "eze" = ( /obj/machinery/airalarm/directional/east, /turf/open/floor/iron/dark, @@ -16182,7 +16169,7 @@ dir = 1 }, /turf/open/floor/iron/white, -/area/station/science/misc_lab/range) +/area/station/science/auxlab) "ezn" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -16289,7 +16276,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/plating, -/area/station/security/prison) +/area/station/security/execution/transfer) "eBZ" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/external{ @@ -16422,7 +16409,7 @@ /obj/item/pen, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/security/prison) +/area/station/security/execution/transfer) "eDV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -16759,7 +16746,7 @@ "eJk" = ( /obj/machinery/portable_atmospherics/canister/nitrous_oxide, /turf/open/floor/iron/dark, -/area/station/science/storage) +/area/station/science/ordnance/storage) "eJq" = ( /obj/machinery/portable_atmospherics/pump, /obj/machinery/atmospherics/components/unary/portables_connector/visible{ @@ -16782,9 +16769,7 @@ /turf/open/floor/iron, /area/station/science/research/abandoned) "eJP" = ( -/obj/structure/sign/departments/lawyer{ - pixel_y = -32 - }, +/obj/structure/sign/departments/lawyer/directional/south, /obj/effect/turf_decal/tile/neutral, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -16817,7 +16802,8 @@ "eKh" = ( /obj/machinery/door/poddoor/shutters{ id = "service_maint_shutters"; - name = "Vacant Room Shutters" + name = "Vacant Room Shutters"; + dir = 4 }, /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -16873,12 +16859,11 @@ /turf/open/floor/iron, /area/station/engineering/supermatter/room) "eLa" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored{ - chamber_id = "ordnancegas1"; +/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/ordnance_burn_chamber_input{ dir = 4 }, /turf/open/floor/engine/vacuum, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "eLb" = ( /obj/machinery/air_sensor/plasma_tank, /turf/open/floor/engine/plasma, @@ -17013,7 +16998,7 @@ dir = 4 }, /turf/open/floor/iron, -/area/station/security/execution/transfer) +/area/station/security/processing) "eNt" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -17094,15 +17079,14 @@ /area/station/engineering/main) "eOl" = ( /obj/item/kirbyplants/random, -/obj/structure/sign/warning/pods{ - dir = 8; - pixel_y = -32 +/obj/structure/sign/warning/pods/directional/south{ + dir = 8 }, /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 4 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "eOn" = ( /obj/structure/cable, /obj/structure/closet/secure_closet/hydroponics, @@ -17159,7 +17143,7 @@ dir = 8 }, /turf/open/floor/plating/airless, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "eOy" = ( /obj/structure/closet/secure_closet/brig{ name = "Prisoner Locker" @@ -17168,7 +17152,7 @@ /obj/machinery/light/small/directional/west, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/security/prison) +/area/station/security/execution/transfer) "eOA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/grimy, @@ -17422,6 +17406,15 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/engineering/atmos) +"eSN" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/obj/machinery/door/poddoor/preopen{ + id = "brigprison"; + name = "Prison Blast Door" + }, +/turf/open/floor/plating, +/area/station/security/execution/transfer) "eSX" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -17446,7 +17439,8 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/door/firedoor, /obj/machinery/door/poddoor/shutters/window/preopen{ - id = "left_arrivals_shutters" + id = "left_arrivals_shutters"; + dir = 1 }, /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -17779,7 +17773,7 @@ /obj/machinery/light/small/directional/west, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/security/prison) +/area/station/security/execution/transfer) "eXJ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -17859,7 +17853,7 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, -/area/station/security/execution/transfer) +/area/station/security/processing) "eYy" = ( /obj/structure/cable, /obj/structure/closet/secure_closet/atmospherics, @@ -17927,6 +17921,12 @@ /obj/effect/turf_decal/tile/brown/anticorner/contrasted, /turf/open/floor/iron, /area/station/cargo/sorting) +"eZl" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/security/execution/transfer) "eZy" = ( /obj/item/kirbyplants/random, /obj/structure/cable, @@ -17998,9 +17998,8 @@ dir = 4 }, /obj/machinery/newscaster/directional/north, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/medical/break_room) "faQ" = ( /obj/effect/turf_decal/tile/blue/fourcorners, @@ -18025,7 +18024,7 @@ /obj/structure/table/reinforced, /obj/item/controller, /turf/open/floor/iron/dark, -/area/station/science/misc_lab) +/area/station/science/explab) "fbm" = ( /obj/effect/landmark/event_spawn, /obj/structure/cable, @@ -18147,7 +18146,7 @@ /obj/item/folder/blue, /obj/item/clothing/under/rank/centcom/commander, /obj/item/clothing/head/centhat{ - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0); + armor = list("melee"=0,"bullet"=0,"laser"=0,"energy"=0,"bomb"=0,"bio"=0); desc = "A replica hat of a Central Commander's attire. It has a small tag on it saying, 'It's good to be emperor.'"; name = "Replica CentCom hat" }, @@ -18220,7 +18219,7 @@ "fdr" = ( /obj/structure/sign/poster/random/directional/east, /turf/open/floor/engine, -/area/station/science/misc_lab) +/area/station/science/explab) "fdz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -18239,6 +18238,7 @@ /obj/effect/turf_decal/tile/red, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/airalarm/directional/south, /turf/open/floor/iron, /area/station/security/holding_cell) "fdK" = ( @@ -18262,7 +18262,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/construction, +/obj/effect/mapping_helpers/airlock/access/all/engineering/tech_storage, /turf/open/floor/iron, /area/station/engineering/storage/tech) "fdM" = ( @@ -18546,9 +18546,8 @@ /area/station/commons/dorms) "fgf" = ( /mob/living/basic/cockroach, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/department/crew_quarters/bar) "fgB" = ( /obj/structure/lattice/catwalk, @@ -18593,9 +18592,8 @@ /area/station/maintenance/port/fore) "fhe" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "fhg" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -18711,7 +18709,7 @@ /obj/machinery/light/directional/north, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/white, -/area/station/science/misc_lab/range) +/area/station/science/auxlab) "fiL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -18746,7 +18744,7 @@ dir = 1 }, /turf/open/floor/iron/white, -/area/station/science/storage) +/area/station/science/ordnance/storage) "fje" = ( /obj/structure/closet/firecloset, /obj/effect/turf_decal/delivery, @@ -18787,9 +18785,8 @@ /area/station/maintenance/starboard/aft) "fjQ" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "fjS" = ( /obj/machinery/portable_atmospherics/canister/nitrous_oxide{ @@ -18889,7 +18886,7 @@ /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, -/area/station/security/execution/transfer) +/area/station/security/processing) "fly" = ( /obj/machinery/power/shieldwallgen, /obj/effect/decal/cleanable/dirt, @@ -18945,7 +18942,7 @@ "fml" = ( /obj/machinery/airalarm/directional/north, /turf/open/floor/iron/white, -/area/station/science/misc_lab/range) +/area/station/science/auxlab) "fms" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -19051,7 +19048,7 @@ /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/security/prison) +/area/station/security/execution/transfer) "foq" = ( /obj/structure/cable, /obj/machinery/airalarm/directional/west, @@ -19190,6 +19187,9 @@ heat_capacity = 1e+006 }, /area/station/commons/fitness/recreation) +"fpK" = ( +/turf/open/floor/plating, +/area/station/security/prison/mess) "fpM" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -19201,15 +19201,14 @@ /obj/structure/chair/wood{ dir = 8 }, -/turf/open/floor/wood{ - icon_state = "wood-broken4" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/service/abandoned_gambling_den) "fpY" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/station/security/execution/transfer) +/area/station/security/processing) "fqa" = ( /obj/machinery/light/directional/west, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -19314,8 +19313,9 @@ pixel_x = 6; req_access = list("brig") }, +/obj/structure/cable, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/visit) "frL" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -19336,9 +19336,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "frS" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -19374,7 +19373,7 @@ pixel_y = 32 }, /turf/open/floor/iron/cafeteria, -/area/station/security/prison) +/area/station/security/prison/mess) "fsh" = ( /obj/structure/table, /obj/item/stack/sheet/iron/fifty, @@ -20023,9 +20022,7 @@ /turf/open/floor/iron, /area/station/engineering/lobby) "fzR" = ( -/obj/structure/sign/warning/electric_shock{ - pixel_y = 32 - }, +/obj/structure/sign/warning/electric_shock/directional/north, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -20164,9 +20161,7 @@ /area/station/commons/dorms) "fBj" = ( /obj/effect/turf_decal/tile/purple, -/obj/structure/sign/warning/secure_area{ - pixel_y = -32 - }, +/obj/structure/sign/warning/secure_area/directional/south, /turf/open/floor/iron/white, /area/station/science/research) "fBk" = ( @@ -20240,7 +20235,7 @@ /obj/structure/chair/stool/directional/south, /obj/item/radio/intercom/prison/directional/west, /turf/open/floor/iron/cafeteria, -/area/station/security/prison) +/area/station/security/prison/mess) "fCh" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -20258,7 +20253,7 @@ dir = 1 }, /turf/open/floor/iron, -/area/station/security/execution/transfer) +/area/station/security/processing) "fCP" = ( /obj/structure/table, /obj/machinery/cell_charger, @@ -20285,7 +20280,7 @@ dir = 6 }, /turf/open/floor/iron/white, -/area/station/science/storage) +/area/station/science/ordnance/storage) "fDm" = ( /obj/machinery/door/airlock/public/glass{ id_tag = "permabolt2"; @@ -20349,7 +20344,8 @@ /obj/machinery/door/firedoor, /obj/machinery/door/poddoor/shutters{ id = "teleporterhubshutters"; - name = "Teleporter Shutters" + name = "Teleporter Shutters"; + dir = 4 }, /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -20366,7 +20362,7 @@ /obj/item/radio/intercom/directional/west, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "fEI" = ( /obj/effect/spawner/structure/window/hollow/reinforced/directional{ dir = 9 @@ -20460,7 +20456,8 @@ "fGj" = ( /obj/machinery/door/firedoor, /obj/machinery/door/poddoor/shutters/window/preopen{ - id = "left_arrivals_shutters" + id = "left_arrivals_shutters"; + dir = 1 }, /obj/machinery/light/directional/east, /obj/effect/turf_decal/stripes/line{ @@ -20491,7 +20488,7 @@ pixel_y = -3 }, /turf/open/floor/iron/white, -/area/station/science/misc_lab/range) +/area/station/science/auxlab) "fGt" = ( /obj/machinery/light/directional/north, /obj/structure/tank_holder/extinguisher, @@ -20562,7 +20559,7 @@ }, /obj/effect/turf_decal/delivery, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "fHp" = ( /obj/machinery/light/directional/west, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -20596,9 +20593,8 @@ /obj/effect/turf_decal/siding/wood{ dir = 8 }, -/turf/open/floor/wood{ - icon_state = "wood-broken7" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/service/electronic_marketing_den) "fHE" = ( /obj/structure/table, @@ -20642,9 +20638,8 @@ /turf/open/floor/iron/grimy, /area/station/service/chapel) "fIf" = ( -/turf/open/floor/wood{ - icon_state = "wood-broken" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/service/electronic_marketing_den) "fIg" = ( /obj/structure/cable, @@ -20741,7 +20736,7 @@ dir = 1 }, /turf/open/floor/iron, -/area/station/security/execution/transfer) +/area/station/security/processing) "fJx" = ( /obj/machinery/hydroponics/constructable, /obj/effect/turf_decal/tile/blue{ @@ -20809,8 +20804,8 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, -/obj/machinery/door/airlock/external{ - name = "Supply Dock Airlock" +/obj/machinery/door/airlock/external/glass{ + name = "Supply Door Airlock" }, /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -20831,16 +20826,21 @@ /area/station/commons/fitness/recreation) "fKM" = ( /obj/structure/table/reinforced, -/obj/item/ai_module/reset, +/obj/item/ai_module/reset{ + pixel_y = 8; + pixel_x = 2 + }, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/item/radio/intercom/directional/west, /obj/machinery/status_display/evac/directional/south, +/obj/item/ai_module/supplied/freeform, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai_upload) "fKN" = ( /obj/machinery/door/poddoor/shutters{ id = "warehouse_shutters"; - name = "Warehouse Shutters" + name = "Warehouse Shutters"; + dir = 4 }, /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -21066,7 +21066,7 @@ /obj/effect/turf_decal/tile/red, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "fOP" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, @@ -21115,19 +21115,16 @@ /area/station/security/checkpoint/supply) "fPP" = ( /obj/machinery/washing_machine, -/obj/structure/sign/warning/electric_shock{ - pixel_x = 32 - }, /obj/machinery/light/directional/east, /obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/machinery/airalarm/directional/east, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/work) "fPS" = ( -/turf/open/floor/wood{ - icon_state = "wood-broken3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/security/detectives_office/private_investigators_office) "fQg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -21329,7 +21326,7 @@ /obj/structure/closet/firecloset, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "fTz" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -21375,7 +21372,7 @@ /obj/structure/reagent_dispensers/servingdish, /obj/item/clothing/head/chefhat, /turf/open/floor/iron/cafeteria, -/area/station/security/prison) +/area/station/security/prison/mess) "fUN" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/bot, @@ -21429,7 +21426,7 @@ pixel_y = 3 }, /turf/open/floor/iron/dark, -/area/station/science/misc_lab) +/area/station/science/explab) "fVQ" = ( /obj/structure/chair/office/light{ dir = 1 @@ -21451,7 +21448,7 @@ }, /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, -/area/station/security/execution/transfer) +/area/station/security/processing) "fWh" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -21659,12 +21656,12 @@ /area/station/hallway/secondary/exit/departure_lounge) "fZl" = ( /obj/machinery/plate_press, -/obj/structure/sign/warning/electric_shock{ - pixel_x = 32 - }, +/obj/structure/sign/warning/electric_shock/directional/east, /obj/effect/turf_decal/tile/yellow, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/south, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/work) "fZu" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/maintenance_hatch{ @@ -21694,7 +21691,7 @@ dir = 6 }, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "fZK" = ( /obj/structure/rack, /obj/item/gun/ballistic/shotgun/riot{ @@ -21818,9 +21815,7 @@ id = "justicechamber"; name = "Justice Chamber Blast Door" }, -/obj/structure/sign/warning/electric_shock{ - pixel_x = 32 - }, +/obj/structure/sign/warning/electric_shock/directional/east, /obj/structure/cable, /turf/open/floor/plating, /area/station/security/execution/education) @@ -22098,9 +22093,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/east, -/turf/open/floor/wood{ - icon_state = "wood-broken5" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/service/theater) "gfl" = ( /obj/structure/table/reinforced, @@ -22734,7 +22728,7 @@ "gnX" = ( /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron, -/area/station/security/execution/transfer) +/area/station/security/processing) "gnZ" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/xeno_spawn, @@ -22837,7 +22831,7 @@ "gpj" = ( /obj/effect/landmark/start/prisoner, /turf/open/floor/plating, -/area/station/security/prison) +/area/station/security/prison/work) "gpy" = ( /obj/structure/reflector/single, /turf/open/floor/plating, @@ -22869,6 +22863,11 @@ }, /turf/open/floor/iron, /area/station/medical/virology) +"gpJ" = ( +/obj/structure/window, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/security/prison/garden) "gpO" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -23145,7 +23144,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/start/prisoner, /turf/open/floor/iron/cafeteria, -/area/station/security/prison) +/area/station/security/prison/mess) "gtM" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -23245,7 +23244,7 @@ dir = 4 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "guY" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -23579,9 +23578,8 @@ /area/station/hallway/secondary/service) "gzf" = ( /obj/structure/disposalpipe/segment, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/department/crew_quarters/bar) "gzg" = ( /obj/effect/landmark/xeno_spawn, @@ -23625,7 +23623,7 @@ dir = 8 }, /turf/open/floor/iron, -/area/station/security/execution/transfer) +/area/station/security/processing) "gzQ" = ( /obj/machinery/door/airlock/security/glass{ name = "Permabrig Cell 3" @@ -23794,7 +23792,7 @@ /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "gCp" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -23832,7 +23830,7 @@ /obj/effect/turf_decal/stripes/line, /obj/effect/mapping_helpers/airlock/access/all/science/ordnance_storage, /turf/open/floor/iron/white, -/area/station/science/storage) +/area/station/science/ordnance/storage) "gCP" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock{ @@ -23879,9 +23877,7 @@ /obj/item/mmi, /obj/item/mmi, /obj/item/mmi, -/obj/structure/sign/departments/medbay/alt{ - pixel_y = -32 - }, +/obj/structure/sign/departments/medbay/alt/directional/south, /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/station/science/robotics/lab) @@ -23952,9 +23948,8 @@ /obj/structure/disposalpipe/segment{ dir = 10 }, -/turf/open/floor/wood{ - icon_state = "wood-broken5" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/service/theater) "gEi" = ( /obj/machinery/smartfridge/organ, @@ -24062,7 +24057,7 @@ }, /obj/item/pipe_dispenser, /turf/open/floor/iron/white, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "gEP" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -24099,7 +24094,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/science/ordnance_storage, /turf/open/floor/iron/white, -/area/station/science/mixing) +/area/station/science/ordnance) "gFb" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -24139,9 +24134,8 @@ /obj/structure/cable, /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/structure/steam_vent, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "gGc" = ( /obj/structure/cable, @@ -24305,7 +24299,7 @@ /obj/machinery/light/directional/west, /obj/machinery/airalarm/directional/north, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/visit) "gHS" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -24362,7 +24356,7 @@ dir = 1 }, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/execution/transfer) "gIJ" = ( /obj/machinery/gibber, /turf/open/floor/iron/dark/textured, @@ -24513,6 +24507,7 @@ /obj/machinery/flasher/directional/south{ id = "Cell 1" }, +/obj/structure/cable, /turf/open/floor/iron, /area/station/security/prison/safe) "gKS" = ( @@ -24548,15 +24543,13 @@ /obj/machinery/conveyor{ id = "cargodisposals" }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/cargo/sorting) "gLj" = ( /obj/effect/decal/cleanable/blood/old, -/turf/open/floor/wood{ - icon_state = "wood-broken6" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/service/library/abandoned) "gLu" = ( /obj/effect/turf_decal/tile/neutral, @@ -24603,7 +24596,7 @@ /obj/item/trash/popcorn, /obj/machinery/light/directional/west, /turf/open/floor/iron/cafeteria, -/area/station/security/prison) +/area/station/security/prison/mess) "gMl" = ( /obj/machinery/duct, /turf/open/floor/iron, @@ -24619,7 +24612,7 @@ /obj/machinery/portable_atmospherics/canister/carbon_dioxide, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, -/area/station/science/storage) +/area/station/science/ordnance/storage) "gMy" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/reagent_dispensers/watertank, @@ -24707,11 +24700,11 @@ /obj/machinery/light/directional/west, /obj/structure/reagent_dispensers/wall/peppertank/directional/west, /turf/open/floor/iron, -/area/station/security/execution/transfer) +/area/station/security/processing) "gNV" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, -/area/station/security/prison) +/area/station/security/prison/garden) "gOh" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -24867,7 +24860,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "gPG" = ( /obj/structure/weightmachine/weightlifter, /obj/effect/turf_decal/tile/brown/half/contrasted, @@ -24893,9 +24886,8 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "gPU" = ( /obj/effect/decal/cleanable/dirt, @@ -24954,7 +24946,7 @@ dir = 1 }, /turf/open/floor/iron, -/area/station/security/execution/transfer) +/area/station/security/processing) "gQz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -25002,9 +24994,7 @@ /turf/open/floor/iron, /area/station/construction/mining/aux_base) "gRu" = ( -/obj/structure/sign/warning/electric_shock{ - pixel_x = 32 - }, +/obj/structure/sign/warning/electric_shock/directional/east, /obj/machinery/status_display/ai/directional/north, /obj/structure/table/wood/fancy/blue, /obj/machinery/door/window{ @@ -25023,9 +25013,8 @@ /obj/structure/disposalpipe/segment{ dir = 9 }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/department/crew_quarters/bar) "gRE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -25198,9 +25187,8 @@ dir = 1 }, /obj/machinery/light/small/directional/south, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/medical/morgue) "gUW" = ( /obj/structure/chair/office{ @@ -25228,7 +25216,7 @@ "gVA" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/station/security/prison) +/area/station/security/execution/transfer) "gVP" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -25354,7 +25342,7 @@ /obj/effect/turf_decal/loading_area, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/science/misc_lab) +/area/station/science/explab) "gYj" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "Maintenance Hatch" @@ -25409,6 +25397,9 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/hallway/primary/fore) +"gZb" = ( +/turf/closed/wall, +/area/station/security/prison/toilet) "gZx" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -25445,7 +25436,7 @@ dir = 1 }, /turf/open/floor/iron, -/area/station/security/execution/transfer) +/area/station/security/processing) "gZW" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -25630,7 +25621,7 @@ }, /obj/structure/table/reinforced, /turf/open/floor/iron/white, -/area/station/science/misc_lab/range) +/area/station/science/auxlab) "hct" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line, @@ -25660,9 +25651,8 @@ "hcA" = ( /obj/structure/dresser, /obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/wood{ - icon_state = "wood-broken6" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/commons/dorms) "hcG" = ( /obj/structure/disposalpipe/segment{ @@ -25882,9 +25872,7 @@ name = "engineering camera"; network = list("ss13","engine") }, -/obj/structure/sign/warning/radiation{ - pixel_x = 32 - }, +/obj/structure/sign/warning/radiation/directional/east, /turf/open/floor/engine, /area/station/engineering/supermatter) "hfo" = ( @@ -25937,7 +25925,7 @@ /obj/structure/sign/departments/medbay/alt, /obj/structure/cable, /turf/open/floor/plating, -/area/station/security/prison) +/area/station/security/execution/transfer) "hgg" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -26196,9 +26184,8 @@ /area/station/engineering/atmos) "hkf" = ( /obj/machinery/airalarm/directional/south, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/department/crew_quarters/bar) "hkn" = ( /obj/structure/filingcabinet/chestdrawer, @@ -26363,6 +26350,15 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/service/hydroponics/garden) +"hpb" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/obj/machinery/door/poddoor/preopen{ + id = "brigprison"; + name = "Prison Blast Door" + }, +/turf/open/floor/plating, +/area/station/security/prison/visit) "hpj" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/blue{ @@ -26721,7 +26717,7 @@ "hvz" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "hvK" = ( /obj/effect/turf_decal/tile/purple{ dir = 1 @@ -26741,7 +26737,7 @@ req_access = list("rd") }, /turf/open/floor/iron/white, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "hvQ" = ( /obj/structure/disposalpipe/segment, /obj/item/kirbyplants/dead, @@ -26807,9 +26803,8 @@ "hwD" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/south, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "hwM" = ( /turf/closed/wall/r_wall, @@ -26824,9 +26819,7 @@ /turf/open/floor/plating, /area/station/command/heads_quarters/rd) "hxe" = ( -/obj/structure/sign/departments/psychology{ - pixel_x = 32 - }, +/obj/structure/sign/departments/psychology/directional/east, /obj/effect/turf_decal/tile/blue, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -26911,7 +26904,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "hyj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -27015,7 +27008,7 @@ }, /obj/item/soap/homemade, /turf/open/floor/iron/white, -/area/station/security/prison/safe) +/area/station/security/prison/toilet) "hAc" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/neutral{ @@ -27033,7 +27026,7 @@ dir = 4 }, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/execution/transfer) "hAm" = ( /obj/structure/chair/office, /obj/structure/sign/poster/random/directional/north, @@ -27070,7 +27063,7 @@ dir = 8 }, /turf/open/floor/plating, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "hAN" = ( /obj/machinery/light/directional/west, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -27151,9 +27144,8 @@ pixel_y = 32 }, /obj/effect/spawner/random/trash/mess, -/turf/open/floor/wood{ - icon_state = "wood-broken5" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/security/detectives_office/private_investigators_office) "hCE" = ( /obj/structure/cable, @@ -27174,7 +27166,7 @@ /obj/structure/training_machine, /obj/item/target/syndicate, /turf/open/floor/iron, -/area/station/science/misc_lab/range) +/area/station/science/auxlab) "hCX" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral{ @@ -27260,7 +27252,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "hEr" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, @@ -27502,7 +27494,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/plating, -/area/station/security/prison) +/area/station/security/execution/transfer) "hGY" = ( /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 1 @@ -27579,7 +27571,7 @@ dir = 4 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "hIH" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple{ dir = 10 @@ -27603,12 +27595,8 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/turf/open/floor/plating{ - initial_gas_mix = "o2=0.01;n2=0.01;TEMP=2.7"; - luminosity = 2; - temperature = 2.7 - }, -/area/station/security/prison) +/turf/open/floor/plating, +/area/station/security/execution/transfer) "hIP" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -27650,9 +27638,8 @@ name = "Cabin 1" }, /obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/wood{ - icon_state = "wood-broken7" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/commons/dorms) "hJh" = ( /obj/effect/turf_decal/tile/blue{ @@ -27797,7 +27784,7 @@ /obj/machinery/biogenerator, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/garden) "hJY" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/red{ @@ -27901,9 +27888,7 @@ /obj/structure/table/reinforced, /obj/item/clothing/mask/breath, /obj/item/clothing/mask/breath, -/obj/structure/sign/warning/no_smoking{ - pixel_y = 32 - }, +/obj/structure/sign/warning/no_smoking/directional/north, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/port/greater) @@ -27942,7 +27927,8 @@ }, /obj/machinery/door/firedoor, /obj/machinery/door/poddoor/shutters/window/preopen{ - id = "right_arrivals_shutters" + id = "right_arrivals_shutters"; + dir = 1 }, /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ @@ -27975,7 +27961,7 @@ }, /obj/effect/turf_decal/caution/stand_clear, /turf/open/floor/iron, -/area/station/security/execution/transfer) +/area/station/security/processing) "hNA" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet, @@ -28509,7 +28495,7 @@ /obj/machinery/portable_atmospherics/pump, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "hUB" = ( /obj/machinery/atmospherics/pipe/smart/simple/purple/visible, /obj/effect/turf_decal/tile/yellow{ @@ -28594,7 +28580,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "hVj" = ( /turf/open/floor/plating, /area/station/security/detectives_office/private_investigators_office) @@ -28822,7 +28808,7 @@ dir = 9 }, /turf/open/floor/plating/airless, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "hYJ" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -29022,6 +29008,9 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/service/abandoned_gambling_den) +"ibA" = ( +/turf/closed/wall/r_wall, +/area/station/security/prison/work) "ibG" = ( /obj/effect/landmark/event_spawn, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -29087,6 +29076,10 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/general, /turf/open/floor/iron, /area/station/engineering/main) +"icC" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/security/prison/garden) "icE" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -29163,7 +29156,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "icS" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/south, @@ -29233,7 +29226,7 @@ dir = 1 }, /turf/open/floor/iron/cafeteria, -/area/station/security/prison) +/area/station/security/prison/mess) "idu" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/decal/cleanable/dirt, @@ -29349,7 +29342,7 @@ dir = 8 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "ifK" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -29522,13 +29515,13 @@ dir = 8 }, /turf/open/floor/iron/white, -/area/station/science/storage) +/area/station/science/ordnance/storage) "ihD" = ( /obj/machinery/holopad, /obj/effect/turf_decal/bot, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, -/area/station/security/execution/transfer) +/area/station/security/processing) "ihF" = ( /obj/structure/flora/bush/fullgrass/style_random, /obj/structure/flora/bush/flowers_yw/style_random, @@ -29726,9 +29719,8 @@ dir = 8 }, /obj/machinery/light/small/directional/east, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/department/engine/atmos) "ike" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible, @@ -29969,9 +29961,8 @@ /turf/open/floor/iron/grimy, /area/station/command/corporate_showroom) "inp" = ( -/turf/open/floor/wood{ - icon_state = "wood-broken" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/service/theater/abandoned) "inq" = ( /obj/effect/decal/cleanable/dirt, @@ -30033,7 +30024,8 @@ /obj/machinery/door/firedoor, /obj/machinery/door/poddoor/shutters/preopen{ id = "chemisttop"; - name = "Chemistry Lobby Shutters" + name = "Chemistry Lobby Shutters"; + dir = 1 }, /obj/item/folder/yellow{ pixel_x = 5 @@ -30088,11 +30080,6 @@ /obj/machinery/pdapainter/engineering, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/ce) -"ioy" = ( -/turf/open/floor/wood{ - icon_state = "wood-broken2" - }, -/area/station/service/library/abandoned) "ioK" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet, @@ -30113,8 +30100,8 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, -/obj/machinery/door/airlock/external{ - name = "Supply Dock Airlock" +/obj/machinery/door/airlock/external/glass{ + name = "Supply Door Airlock" }, /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -30131,7 +30118,7 @@ }, /obj/machinery/meter/layer2, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "ipz" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -30149,7 +30136,7 @@ "ipC" = ( /obj/effect/spawner/random/vending/colavend, /turf/open/floor/iron/cafeteria, -/area/station/security/prison) +/area/station/security/prison/mess) "ipQ" = ( /turf/closed/wall, /area/station/command/bridge) @@ -30192,9 +30179,8 @@ /area/station/hallway/primary/central/aft) "iqr" = ( /obj/structure/chair/stool/bar/directional/south, -/turf/open/floor/wood{ - icon_state = "wood-broken" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/service/abandoned_gambling_den) "iqz" = ( /obj/structure/table/reinforced, @@ -30538,7 +30524,7 @@ /obj/machinery/power/apc/auto_name/directional/north, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "ivR" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible/layer4{ dir = 4 @@ -30590,10 +30576,6 @@ /obj/effect/turf_decal/tile/blue, /turf/open/floor/iron, /area/station/hallway/secondary/command) -"iwr" = ( -/obj/effect/spawner/structure/window/reinforced/tinted, -/turf/open/space/basic, -/area/station/commons/dorms) "iwy" = ( /obj/machinery/camera/directional/west{ c_tag = "Central Hallway - Aft Port"; @@ -30625,6 +30607,12 @@ }, /turf/open/floor/iron, /area/station/security/brig) +"iwQ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/security/prison) "iwW" = ( /obj/machinery/computer/cargo{ dir = 8 @@ -30724,7 +30712,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, -/area/station/security/execution/transfer) +/area/station/security/processing) "ixZ" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/holopad, @@ -30828,9 +30816,7 @@ /area/station/tcommsat/server) "izg" = ( /obj/machinery/light/small/directional/west, -/obj/structure/sign/warning/radiation{ - pixel_x = -32 - }, +/obj/structure/sign/warning/radiation/directional/west, /turf/open/floor/engine, /area/station/engineering/supermatter) "izj" = ( @@ -30926,7 +30912,7 @@ dir = 1 }, /turf/open/floor/iron, -/area/station/security/execution/transfer) +/area/station/security/processing) "iAb" = ( /obj/structure/bodycontainer/morgue, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -30996,7 +30982,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "iBp" = ( /obj/machinery/door/window/left/directional/north{ name = "Engineering Delivery"; @@ -31084,7 +31070,7 @@ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "iCZ" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -31205,7 +31191,7 @@ /area/station/science/research) "iEE" = ( /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/execution/transfer) "iET" = ( /obj/structure/cable, /obj/effect/landmark/start/hangover, @@ -31213,25 +31199,24 @@ /turf/open/floor/iron, /area/station/hallway/primary/central/fore) "iEV" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass{ - pixel_x = -3; - pixel_y = 15 - }, /obj/item/reagent_containers/food/drinks/drinkingglass/shotglass{ pixel_x = -6; pixel_y = 3 }, /obj/item/reagent_containers/food/drinks/bottle/beer{ desc = "Whatever it is, it reeks of foul, putrid froth."; - list_reagents = list(/datum/reagent/consumable/ethanol/bacchus_blessing = 15); + list_reagents = list(/datum/reagent/consumable/ethanol/bacchus_blessing=15); name = "Delta-Down"; pixel_x = 5; pixel_y = 5 }, -/turf/open/floor/wood{ - icon_state = "wood-broken4" +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/table/wood, +/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass{ + pixel_x = -6; + pixel_y = 3 }, +/turf/open/floor/wood, /area/station/commons/dorms) "iFf" = ( /obj/machinery/light/directional/east, @@ -31272,7 +31257,7 @@ dir = 8 }, /obj/effect/turf_decal/tile/yellow/fourcorners, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/obj/effect/mapping_helpers/airlock/access/any/engineering/general, /turf/open/floor/iron, /area/station/engineering/break_room) "iFv" = ( @@ -31384,7 +31369,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/construction, +/obj/effect/mapping_helpers/airlock/access/all/command/minisat, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) "iGU" = ( @@ -31455,7 +31440,8 @@ /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ id = "chemistbot"; - name = "Chemistry Side Shutters" + name = "Chemistry Side Shutters"; + dir = 8 }, /turf/open/floor/plating, /area/station/medical/pharmacy) @@ -31467,16 +31453,14 @@ /area/station/command/heads_quarters/hop) "iIM" = ( /obj/structure/table/wood/fancy, -/obj/item/book/granter/spell/smoke/lesser, +/obj/item/book/granter/action/spell/smoke/lesser, /obj/item/nullrod, /obj/item/organ/internal/heart, /obj/item/reagent_containers/food/drinks/bottle/holywater, /turf/open/floor/iron/grimy, /area/station/service/chapel/office) "iIN" = ( -/obj/structure/sign/warning/secure_area{ - pixel_y = 32 - }, +/obj/structure/sign/warning/secure_area/directional/north, /obj/machinery/light/directional/north, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, @@ -31544,16 +31528,13 @@ /obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ dir = 8 }, -/obj/structure/sign/warning/secure_area{ - pixel_y = -32 - }, +/obj/structure/sign/warning/secure_area/directional/south, /turf/open/space/basic, /area/space/nearstation) "iJR" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood{ - icon_state = "wood-broken3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/service/abandoned_gambling_den) "iJU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -31626,7 +31607,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/firealarm/directional/south, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "iKZ" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -31784,6 +31765,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/structure/cable, /turf/open/floor/iron, /area/station/cargo/miningoffice) "iNg" = ( @@ -31878,7 +31860,7 @@ /obj/machinery/power/apc/auto_name/directional/south, /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron, -/area/station/security/execution/transfer) +/area/station/security/processing) "iOj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/purple/visible, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -31916,7 +31898,8 @@ /area/station/science/research) "iOU" = ( /obj/machinery/door/poddoor/shutters{ - id = "portbow_maint_shutters" + id = "portbow_maint_shutters"; + dir = 1 }, /obj/structure/table/reinforced, /obj/item/paper_bin{ @@ -32008,9 +31991,7 @@ "iQj" = ( /obj/item/kirbyplants/random, /obj/effect/decal/cleanable/dirt, -/obj/structure/sign/warning/electric_shock{ - pixel_y = 32 - }, +/obj/structure/sign/warning/electric_shock/directional/north, /obj/machinery/light_switch/directional/west, /turf/open/floor/iron, /area/station/engineering/storage) @@ -32085,11 +32066,6 @@ }, /turf/open/floor/plating, /area/station/engineering/supermatter) -"iRB" = ( -/turf/open/floor/wood{ - icon_state = "wood-broken3" - }, -/area/station/service/library/abandoned) "iRJ" = ( /obj/structure/table/wood, /obj/item/flashlight/lamp, @@ -32109,7 +32085,7 @@ /area/station/cargo/storage) "iRS" = ( /turf/open/floor/engine/vacuum, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "iSb" = ( /obj/machinery/light/directional/east, /obj/effect/turf_decal/tile/neutral, @@ -32154,7 +32130,8 @@ /obj/structure/disposalpipe/segment, /obj/machinery/door/poddoor/shutters{ id = "custodialshutters"; - name = "Custodial Closet Shutters" + name = "Custodial Closet Shutters"; + dir = 1 }, /turf/open/floor/iron/dark/textured_half, /area/station/service/janitor) @@ -32222,6 +32199,7 @@ /obj/item/computer_hardware/hard_drive/portable/quartermaster, /obj/item/gps/mining, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/item/paper_bin/carbon, /turf/open/floor/iron, /area/station/cargo/qm) "iTV" = ( @@ -32487,7 +32465,7 @@ "iXL" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/science/misc_lab) +/area/station/science/explab) "iXM" = ( /obj/structure/cable, /obj/item/kirbyplants/random, @@ -32765,7 +32743,7 @@ dir = 8 }, /turf/open/floor/iron, -/area/station/security/execution/transfer) +/area/station/security/processing) "jbr" = ( /obj/structure/curtain/cloth/fancy/mechanical/start_closed{ desc = "A set of curtains serving as a fancy theater backdrop. They can only be opened by a button."; @@ -32994,8 +32972,9 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, /turf/open/floor/iron/cafeteria, -/area/station/security/prison) +/area/station/security/prison/mess) "jej" = ( /obj/machinery/power/smes, /obj/machinery/light/small/directional/south, @@ -33223,7 +33202,7 @@ dir = 5 }, /turf/open/floor/plating/airless, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "jgZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -33444,7 +33423,7 @@ req_access = list("brig") }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "jjA" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/hydroponics/constructable, @@ -33453,7 +33432,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/garden) "jjC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -33482,7 +33461,7 @@ dir = 8 }, /turf/open/floor/iron, -/area/station/security/execution/transfer) +/area/station/security/processing) "jjQ" = ( /obj/item/paper_bin, /obj/item/assembly/prox_sensor{ @@ -33513,7 +33492,7 @@ "jjV" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "jjX" = ( /obj/item/storage/medkit/fire, /obj/effect/turf_decal/bot, @@ -33803,7 +33782,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/science/misc_lab) +/area/station/science/explab) "jox" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -33846,7 +33825,7 @@ /obj/effect/turf_decal/tile/red, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "jpj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -33911,7 +33890,7 @@ dir = 4 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/visit) "jqs" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -33926,7 +33905,7 @@ /obj/structure/closet/bombcloset/security, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/security/prison) +/area/station/security/execution/transfer) "jrp" = ( /turf/closed/wall, /area/station/cargo/storage) @@ -33983,7 +33962,7 @@ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/science/misc_lab) +/area/station/science/explab) "jsr" = ( /obj/structure/table/reinforced, /obj/machinery/recharger, @@ -33997,7 +33976,7 @@ "jst" = ( /obj/item/radio/intercom/prison/directional/north, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/visit) "jsI" = ( /obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/green{ @@ -34167,7 +34146,7 @@ dir = 8 }, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "jvF" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -34197,7 +34176,7 @@ /obj/effect/turf_decal/stripes/line, /obj/structure/sign/poster/official/random/directional/south, /turf/open/floor/iron, -/area/station/science/misc_lab/range) +/area/station/science/auxlab) "jvQ" = ( /obj/effect/turf_decal/tile/yellow{ dir = 1 @@ -34362,7 +34341,7 @@ dir = 1 }, /turf/open/floor/iron, -/area/station/security/execution/transfer) +/area/station/security/processing) "jyb" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/research{ @@ -34388,9 +34367,7 @@ /turf/open/space, /area/space/nearstation) "jyi" = ( -/obj/structure/sign/warning/secure_area{ - pixel_x = 32 - }, +/obj/structure/sign/warning/secure_area/directional/east, /turf/closed/wall/r_wall, /area/station/maintenance/disposal/incinerator) "jyo" = ( @@ -34469,13 +34446,10 @@ /obj/machinery/hydroponics/soil, /obj/item/cultivator, /obj/effect/decal/cleanable/dirt, -/obj/structure/sign/warning/electric_shock{ - pixel_x = -32 - }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/station/security/prison) +/obj/structure/sign/warning/electric_shock/directional/west, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/station/security/prison/garden) "jzC" = ( /obj/structure/cable, /obj/machinery/light/directional/north, @@ -34608,9 +34582,7 @@ /area/station/maintenance/port/fore) "jBr" = ( /obj/machinery/light/small/directional/south, -/obj/structure/sign/warning/radiation{ - pixel_y = -32 - }, +/obj/structure/sign/warning/radiation/directional/south, /turf/open/floor/engine, /area/station/engineering/supermatter) "jBt" = ( @@ -34629,9 +34601,7 @@ name = "xenobiology camera"; network = list("ss13","xeno","rd") }, -/obj/structure/sign/warning/deathsposal{ - pixel_x = 32 - }, +/obj/structure/sign/warning/deathsposal/directional/east, /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/station/science/xenobiology) @@ -34648,13 +34618,6 @@ }, /turf/open/floor/iron, /area/station/engineering/main) -"jBH" = ( -/obj/structure/bookcase/random, -/obj/structure/sign/poster/ripped{ - pixel_y = -32 - }, -/turf/open/floor/iron, -/area/station/security/prison) "jBM" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/brown/anticorner/contrasted{ @@ -34675,7 +34638,7 @@ dir = 4 }, /turf/closed/wall/r_wall, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "jCa" = ( /obj/machinery/holopad, /obj/structure/cable, @@ -34931,8 +34894,7 @@ /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "jGh" = ( -/obj/structure/sign/departments/science{ - pixel_x = -32; +/obj/structure/sign/departments/science/directional/west{ pixel_y = 32 }, /obj/effect/turf_decal/tile/purple{ @@ -35170,9 +35132,7 @@ "jIV" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/smart/simple/orange/visible, -/obj/structure/sign/warning/secure_area{ - pixel_x = 32 - }, +/obj/structure/sign/warning/secure_area/directional/east, /turf/open/space/basic, /area/space/nearstation) "jJc" = ( @@ -35522,9 +35482,7 @@ "jNH" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small/directional/west, -/obj/structure/sign/warning/vacuum{ - pixel_x = -32 - }, +/obj/structure/sign/warning/vacuum/directional/west, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/security/execution/education) @@ -35563,16 +35521,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, -/area/station/science/misc_lab/range) +/area/station/science/auxlab) "jNS" = ( /obj/effect/decal/cleanable/cobweb, /obj/effect/turf_decal/stripes/corner{ dir = 8 }, /obj/effect/spawner/random/structure/crate, -/obj/structure/sign/warning/secure_area{ - pixel_x = -32 - }, +/obj/structure/sign/warning/secure_area/directional/west, /obj/structure/sign/nanotrasen{ pixel_y = 32 }, @@ -35589,7 +35545,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, -/area/station/science/misc_lab/range) +/area/station/science/auxlab) "jOg" = ( /obj/structure/cable, /obj/structure/rack, @@ -35841,7 +35797,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "jQI" = ( /obj/structure/window/reinforced{ dir = 1 @@ -35922,7 +35878,8 @@ /obj/machinery/door/firedoor, /obj/machinery/door/poddoor/shutters/preopen{ id = "chemisttop"; - name = "Chemistry Lobby Shutters" + name = "Chemistry Lobby Shutters"; + dir = 1 }, /obj/machinery/door/window/left/directional/north{ name = "Chemistry Desk" @@ -36056,9 +36013,7 @@ /area/station/engineering/atmos/project) "jUJ" = ( /obj/structure/table/glass, -/obj/structure/sign/warning/deathsposal{ - pixel_y = -32 - }, +/obj/structure/sign/warning/deathsposal/directional/south, /obj/item/paper_bin, /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -36151,7 +36106,8 @@ }, /obj/machinery/door/poddoor/shutters{ id = "construction"; - name = "Construction Shutters" + name = "Construction Shutters"; + dir = 8 }, /turf/open/floor/iron/textured, /area/station/construction/mining/aux_base) @@ -36179,11 +36135,9 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/security/execution/transfer) +/area/station/security/processing) "jWx" = ( -/obj/structure/sign/warning/electric_shock{ - pixel_x = 32 - }, +/obj/structure/sign/warning/electric_shock/directional/east, /obj/machinery/light/directional/east, /obj/effect/turf_decal/tile/red{ dir = 4 @@ -36467,9 +36421,7 @@ /area/space/nearstation) "jZq" = ( /obj/machinery/light/small/directional/south, -/obj/structure/sign/warning/vacuum{ - pixel_x = -32 - }, +/obj/structure/sign/warning/vacuum/directional/west, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/hallway) @@ -36683,7 +36635,7 @@ dir = 8 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/garden) "kch" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -36702,9 +36654,8 @@ /area/station/service/theater/abandoned) "kcS" = ( /obj/item/kirbyplants/random, -/turf/open/floor/wood{ - icon_state = "wood-broken5" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/service/theater/abandoned) "kcW" = ( /obj/structure/disposalpipe/segment, @@ -36789,7 +36740,7 @@ dir = 4 }, /turf/open/floor/iron/white, -/area/station/science/storage) +/area/station/science/ordnance/storage) "kdy" = ( /obj/structure/cable, /obj/effect/turf_decal/stripes/line{ @@ -36841,9 +36792,7 @@ /area/station/hallway/primary/fore) "kes" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, -/obj/structure/sign/warning/secure_area{ - pixel_x = -32 - }, +/obj/structure/sign/warning/secure_area/directional/west, /obj/machinery/camera/directional/west{ c_tag = "Atmospherics - Aft Tanks"; name = "atmospherics camera" @@ -37054,9 +37003,8 @@ /obj/machinery/power/emitter{ dir = 8 }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/engineering/supermatter/room) "kgi" = ( /obj/structure/table/reinforced, @@ -37168,7 +37116,7 @@ /obj/structure/cable, /obj/effect/turf_decal/tile/red, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "khE" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -37248,7 +37196,7 @@ pixel_y = 24 }, /turf/open/floor/iron/dark, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "kim" = ( /obj/machinery/light/directional/south, /obj/machinery/atmospherics/pipe/smart/manifold4w/brown/visible, @@ -37335,9 +37283,7 @@ "kjl" = ( /obj/item/kirbyplants/random, /obj/effect/decal/cleanable/dirt, -/obj/structure/sign/warning/electric_shock{ - pixel_y = -32 - }, +/obj/structure/sign/warning/electric_shock/directional/south, /obj/machinery/firealarm/directional/west, /turf/open/floor/iron, /area/station/engineering/storage) @@ -37403,7 +37349,7 @@ pixel_y = 2 }, /turf/open/floor/iron/dark, -/area/station/science/misc_lab) +/area/station/science/explab) "kkC" = ( /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron, @@ -37413,9 +37359,7 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 4 }, -/obj/structure/sign/warning/fire{ - pixel_x = 32 - }, +/obj/structure/sign/warning/fire/directional/east, /obj/structure/window/reinforced/plasma/spawner, /obj/machinery/power/port_gen/pacman/pre_loaded, /turf/open/floor/iron, @@ -37654,7 +37598,7 @@ /area/station/maintenance/starboard) "knV" = ( /turf/open/floor/plating/airless, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "knY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -37698,7 +37642,7 @@ }, /obj/effect/spawner/random/contraband/prison, /turf/open/floor/iron/white, -/area/station/security/prison/safe) +/area/station/security/prison/toilet) "koB" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -37807,7 +37751,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "kpX" = ( /obj/machinery/navbeacon{ codes_txt = "patrol;next_patrol=hall13"; @@ -37846,7 +37790,8 @@ }, /obj/machinery/door/firedoor, /obj/machinery/door/poddoor/shutters/window/preopen{ - id = "left_arrivals_shutters" + id = "left_arrivals_shutters"; + dir = 1 }, /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -37937,11 +37882,6 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/aisat/exterior) -"ksn" = ( -/turf/open/floor/wood{ - icon_state = "wood-broken5" - }, -/area/station/service/library/abandoned) "ksq" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple{ dir = 4 @@ -37958,7 +37898,7 @@ dir = 5 }, /turf/open/floor/iron, -/area/station/science/misc_lab/range) +/area/station/science/auxlab) "ksH" = ( /obj/machinery/duct, /obj/effect/decal/cleanable/dirt, @@ -38003,9 +37943,8 @@ "ktj" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/girder, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "ktt" = ( /obj/effect/decal/cleanable/dirt, @@ -38071,7 +38010,7 @@ /obj/effect/decal/cleanable/blood/old, /obj/effect/decal/remains/human, /turf/open/floor/plating/airless, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "kub" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/circuit/green, @@ -38137,9 +38076,8 @@ /area/station/engineering/gravity_generator) "kvj" = ( /obj/item/kirbyplants/random, -/turf/open/floor/wood{ - icon_state = "wood-broken7" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/service/library/abandoned) "kvq" = ( /obj/structure/disposalpipe/segment{ @@ -38245,6 +38183,9 @@ }, /turf/open/floor/iron, /area/station/security/prison) +"kxB" = ( +/turf/closed/wall/r_wall, +/area/station/security/processing) "kxC" = ( /obj/structure/closet/secure_closet/personal/cabinet, /obj/item/clothing/suit/jacket{ @@ -38315,7 +38256,7 @@ }, /obj/machinery/light/directional/east, /turf/open/floor/iron/white, -/area/station/science/storage) +/area/station/science/ordnance/storage) "kyx" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ @@ -38426,7 +38367,7 @@ /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/security/prison) +/area/station/security/execution/transfer) "kAD" = ( /obj/structure/sign/warning/electric_shock, /turf/closed/wall/r_wall, @@ -38481,6 +38422,16 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/commons/toilet/locker) +"kBI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/south, +/turf/open/floor/iron, +/area/station/security/prison/safe) "kBJ" = ( /obj/machinery/light/small/directional/north, /obj/effect/decal/cleanable/dirt, @@ -38505,9 +38456,8 @@ /turf/open/floor/wood, /area/station/service/electronic_marketing_den) "kCd" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "kCf" = ( /obj/structure/window/reinforced, @@ -38750,7 +38700,7 @@ dir = 4 }, /turf/open/floor/iron, -/area/station/security/execution/transfer) +/area/station/security/processing) "kFc" = ( /obj/machinery/light/directional/north, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -38772,7 +38722,7 @@ piping_layer = 2 }, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "kFr" = ( /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -39055,6 +39005,16 @@ /obj/structure/filingcabinet, /turf/open/floor/iron/dark, /area/station/service/library) +"kIJ" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "corporatelounge"; + name = "Corporate Lounge Shutters"; + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/command/corporate_showroom) "kIP" = ( /obj/item/radio/intercom/directional/south, /obj/structure/table/wood, @@ -39078,9 +39038,8 @@ "kIS" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/airalarm/directional/south, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "kJa" = ( /obj/structure/sign/poster/official/help_others{ @@ -39139,7 +39098,7 @@ "kJC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/cafeteria, -/area/station/security/prison) +/area/station/security/prison/mess) "kJH" = ( /obj/structure/chair/sofa/bench/right{ dir = 8 @@ -39152,9 +39111,8 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/engineering/supermatter/room) "kKa" = ( /obj/structure/cable, @@ -39412,7 +39370,7 @@ /obj/machinery/status_display/evac/directional/south, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/security/prison) +/area/station/security/execution/transfer) "kOI" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/status_display/evac/directional/north, @@ -39431,7 +39389,7 @@ /obj/effect/turf_decal/tile/red, /obj/machinery/newscaster/directional/north, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "kPj" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral/half/contrasted{ @@ -39454,7 +39412,7 @@ /obj/machinery/door/poddoor/massdriver_ordnance, /obj/structure/fans/tiny, /turf/open/floor/plating/airless, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "kPQ" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -39564,7 +39522,7 @@ /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/science/misc_lab) +/area/station/science/explab) "kRf" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 1 @@ -39572,7 +39530,7 @@ /obj/machinery/portable_atmospherics/canister, /obj/effect/turf_decal/box/red, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "kRi" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -39684,7 +39642,7 @@ dir = 4 }, /turf/open/floor/plating/airless, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "kSQ" = ( /obj/effect/decal/cleanable/dirt, /obj/item/kirbyplants/random, @@ -39695,7 +39653,6 @@ /area/station/maintenance/port/aft) "kSZ" = ( /obj/structure/filingcabinet/chestdrawer, -/obj/machinery/firealarm/directional/west, /obj/effect/turf_decal/tile/brown/anticorner/contrasted{ dir = 1 }, @@ -39761,7 +39718,8 @@ "kTU" = ( /obj/machinery/door/poddoor/shutters{ id = "mechbay"; - name = "Mech Bay Shutters" + name = "Mech Bay Shutters"; + dir = 4 }, /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -39951,7 +39909,7 @@ "kWf" = ( /obj/machinery/atmospherics/pipe/smart/simple/purple/visible, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "kWg" = ( /obj/structure/table/reinforced, /obj/machinery/button/door{ @@ -40028,9 +39986,7 @@ /obj/machinery/power/smes{ charge = 5e+006 }, -/obj/structure/sign/warning/electric_shock{ - pixel_y = 32 - }, +/obj/structure/sign/warning/electric_shock/directional/north, /obj/machinery/camera/directional/north{ c_tag = "AI Chamber - Fore"; name = "motion-sensitive ai camera"; @@ -40165,7 +40121,7 @@ /obj/machinery/airalarm/directional/south, /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron, -/area/station/security/execution/transfer) +/area/station/security/processing) "kYT" = ( /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -40229,16 +40185,15 @@ /obj/effect/decal/cleanable/oil, /obj/structure/reflector/single, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/engineering/supermatter/room) "kZz" = ( /obj/structure/table/reinforced, /obj/machinery/recharger, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/security/prison) +/area/station/security/execution/transfer) "kZP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/grimy, @@ -40265,11 +40220,6 @@ }, /turf/open/floor/iron, /area/station/security/checkpoint/science/research) -"lai" = ( -/turf/open/floor/wood{ - icon_state = "wood-broken4" - }, -/area/station/service/electronic_marketing_den) "las" = ( /obj/structure/disposalpipe/junction/flip{ dir = 1 @@ -40288,7 +40238,7 @@ dir = 9 }, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "lav" = ( /obj/effect/turf_decal/tile/yellow/half/contrasted, /turf/open/floor/iron, @@ -40487,7 +40437,7 @@ /obj/structure/window/reinforced/spawner/west, /obj/machinery/atmospherics/components/unary/portables_connector/visible/layer2, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "lcA" = ( /obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible{ dir = 4 @@ -40512,7 +40462,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, -/area/station/science/storage) +/area/station/science/ordnance/storage) "lcO" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/stripes/corner{ @@ -40549,9 +40499,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, /obj/machinery/disposal/bin, -/obj/structure/sign/warning/deathsposal{ - pixel_y = -32 - }, +/obj/structure/sign/warning/deathsposal/directional/south, /obj/effect/turf_decal/tile/yellow{ dir = 8 }, @@ -40629,7 +40577,7 @@ dir = 10 }, /turf/open/floor/iron, -/area/station/science/misc_lab/range) +/area/station/science/auxlab) "ldM" = ( /obj/structure/window/reinforced{ dir = 1 @@ -40764,7 +40712,7 @@ /turf/open/floor/iron/white/side{ dir = 1 }, -/area/station/security/prison) +/area/station/security/execution/transfer) "lgc" = ( /obj/machinery/light_switch/directional/north{ pixel_x = 6 @@ -40819,6 +40767,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/medical/virology) +"lgx" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/security/prison) "lgE" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -40836,7 +40791,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/mapping_helpers/airlock/access/all/science/genetics, /turf/open/floor/iron/dark, -/area/station/science/misc_lab) +/area/station/science/explab) "lgN" = ( /obj/machinery/door/window/brigdoor/left/directional/west{ name = "Captain's Bedroom"; @@ -41063,7 +41018,7 @@ /obj/item/transfer_valve, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "ljZ" = ( /obj/effect/turf_decal/tile/yellow, /turf/open/floor/iron/white, @@ -41118,7 +41073,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "lkx" = ( /obj/structure/sign/directions/engineering{ desc = "A sign that shows there are doors here. There are doors everywhere!"; @@ -41148,7 +41103,7 @@ dir = 10 }, /turf/open/floor/plating/airless, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "lkG" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -41285,7 +41240,7 @@ /area/station/ai_monitored/command/storage/eva) "lmq" = ( /turf/closed/wall/r_wall, -/area/station/science/misc_lab) +/area/station/science/explab) "lmM" = ( /obj/machinery/atmospherics/components/binary/pump/on{ dir = 8 @@ -41295,7 +41250,7 @@ }, /obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden, /turf/open/floor/engine, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "lmP" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden{ dir = 4 @@ -41429,7 +41384,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/power/apc/auto_name/directional/south, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "loi" = ( /obj/structure/grille/broken, /obj/effect/spawner/random/trash/caution_sign, @@ -41448,7 +41403,7 @@ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "loA" = ( /obj/effect/turf_decal/tile/purple, /obj/machinery/firealarm/directional/south, @@ -41467,9 +41422,7 @@ /obj/item/kirbyplants{ icon_state = "plant-21" }, -/obj/structure/sign/warning/bodysposal{ - pixel_x = 32 - }, +/obj/structure/sign/warning/bodysposal/directional/east, /obj/effect/turf_decal/tile/yellow{ dir = 4 }, @@ -41541,9 +41494,8 @@ }, /obj/item/newspaper, /obj/item/pen/red, -/turf/open/floor/wood{ - icon_state = "wood-broken2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/commons/dorms) "lpL" = ( /obj/structure/cable, @@ -41630,7 +41582,7 @@ dir = 4 }, /turf/open/floor/iron/white, -/area/station/science/storage) +/area/station/science/ordnance/storage) "lrM" = ( /obj/machinery/firealarm/directional/west, /obj/structure/disposalpipe/segment, @@ -41669,9 +41621,7 @@ /area/station/commons/dorms) "lss" = ( /obj/machinery/light/small/directional/north, -/obj/structure/sign/departments/medbay/alt{ - pixel_x = -32 - }, +/obj/structure/sign/departments/medbay/alt/directional/west, /turf/open/floor/iron/white, /area/station/medical/medbay/central) "lsH" = ( @@ -41742,9 +41692,8 @@ "ltT" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/security/prison) "ltV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -41944,7 +41893,7 @@ dir = 8 }, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/execution/transfer) "lwD" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -42037,7 +41986,7 @@ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/science/storage) +/area/station/science/ordnance/storage) "lxF" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -42112,7 +42061,7 @@ dir = 4 }, /turf/open/floor/iron, -/area/station/security/execution/transfer) +/area/station/security/processing) "lyx" = ( /obj/effect/turf_decal/delivery, /obj/machinery/computer/shuttle/mining/common, @@ -42146,13 +42095,22 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, /area/station/engineering/main) +"lzA" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "rndlab1"; + name = "Research and Development Shutter"; + dir = 1 + }, +/turf/open/floor/plating, +/area/station/science/lab) "lAa" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ dir = 9 }, /obj/structure/cable, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "lAd" = ( /obj/effect/turf_decal/bot, /obj/structure/tank_holder/extinguisher, @@ -42360,7 +42318,7 @@ /obj/effect/turf_decal/delivery, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, -/area/station/science/misc_lab/range) +/area/station/science/auxlab) "lCy" = ( /obj/structure/table/wood, /obj/item/book/manual/wiki/security_space_law, @@ -42426,7 +42384,7 @@ /area/station/maintenance/port/greater) "lDr" = ( /turf/open/floor/plating, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "lDV" = ( /obj/structure/sign/warning/secure_area, /turf/closed/wall, @@ -42928,9 +42886,8 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/department/engine/atmos) "lKy" = ( /obj/effect/turf_decal/tile/red{ @@ -43217,7 +43174,7 @@ /obj/item/raw_anomaly_core/random, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "lNL" = ( /turf/closed/wall, /area/station/tcommsat/server) @@ -43309,7 +43266,7 @@ /obj/item/compact_remote, /obj/item/compact_remote, /turf/open/floor/iron/dark, -/area/station/science/misc_lab) +/area/station/science/explab) "lPm" = ( /obj/machinery/telecomms/server/presets/service, /obj/effect/turf_decal/tile/green/anticorner/contrasted, @@ -43390,9 +43347,8 @@ }, /obj/structure/cable, /obj/machinery/light/small/directional/north, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "lQd" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -43539,7 +43495,7 @@ dir = 4 }, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/execution/transfer) "lRi" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment, @@ -43608,14 +43564,12 @@ dir = 1 }, /turf/open/floor/iron, -/area/station/security/execution/transfer) +/area/station/security/processing) "lSz" = ( /turf/closed/wall, /area/station/security/detectives_office) "lSC" = ( -/obj/structure/sign/departments/chemistry{ - pixel_x = -32 - }, +/obj/structure/sign/departments/chemistry/directional/west, /obj/effect/turf_decal/tile/blue{ dir = 8 }, @@ -43623,7 +43577,7 @@ /area/station/medical/medbay/central) "lSP" = ( /turf/closed/wall/r_wall, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "lTg" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/red{ @@ -43740,7 +43694,8 @@ /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ id = "cmoshutter"; - name = "CMO Office Shutters" + name = "CMO Office Shutters"; + dir = 8 }, /obj/structure/cable, /turf/open/floor/plating, @@ -43829,7 +43784,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/garden) "lWj" = ( /obj/structure/plasticflaps/opaque, /obj/effect/decal/cleanable/dirt, @@ -43910,9 +43865,8 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 }, -/turf/open/floor/wood{ - icon_state = "wood-broken6" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/service/theater/abandoned) "lWY" = ( /obj/structure/chair, @@ -43995,9 +43949,8 @@ "lYF" = ( /obj/machinery/light/small/directional/west, /obj/machinery/status_display/evac/directional/west, -/turf/open/floor/wood{ - icon_state = "wood-broken" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/service/theater/abandoned) "lYG" = ( /obj/structure/closet/l3closet/scientist, @@ -44142,7 +44095,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/door/airlock, /obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/service/theatre, +/obj/effect/mapping_helpers/airlock/access/all/service/general, /turf/open/floor/wood, /area/station/hallway/secondary/service) "mbe" = ( @@ -44155,7 +44108,7 @@ dir = 8 }, /turf/open/floor/iron, -/area/station/security/execution/transfer) +/area/station/security/processing) "mbp" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/blue/fourcorners, @@ -44216,7 +44169,7 @@ dir = 8 }, /turf/open/floor/iron, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "mcp" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ @@ -44368,7 +44321,7 @@ /obj/effect/turf_decal/delivery, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "mdM" = ( /obj/machinery/computer/med_data{ dir = 1 @@ -44402,9 +44355,7 @@ /area/station/medical/storage) "mee" = ( /obj/machinery/light/directional/west, -/obj/structure/sign/warning/secure_area{ - pixel_x = -32 - }, +/obj/structure/sign/warning/secure_area/directional/west, /obj/effect/turf_decal/tile/neutral{ dir = 8 }, @@ -44443,7 +44394,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "mez" = ( /obj/effect/turf_decal/trimline/yellow/line, /turf/open/floor/iron, @@ -44463,7 +44414,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "meG" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -44502,7 +44453,7 @@ "meY" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, -/area/station/science/misc_lab/range) +/area/station/science/auxlab) "meZ" = ( /obj/machinery/light/small/directional/east, /obj/structure/toilet{ @@ -44825,9 +44776,7 @@ /turf/open/floor/iron/dark, /area/station/service/library) "miV" = ( -/obj/structure/sign/warning/no_smoking{ - pixel_x = -32 - }, +/obj/structure/sign/warning/no_smoking/directional/west, /obj/effect/turf_decal/stripes/line{ dir = 8 }, @@ -44845,9 +44794,8 @@ "mjr" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "mjw" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, @@ -45063,9 +45011,8 @@ /obj/structure/chair/office{ dir = 4 }, -/turf/open/floor/wood{ - icon_state = "wood-broken5" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/service/library/abandoned) "mno" = ( /obj/structure/disposalpipe/segment, @@ -45103,9 +45050,7 @@ /turf/open/floor/plating/airless, /area/station/maintenance/port/greater) "mnM" = ( -/obj/structure/sign/warning/secure_area{ - pixel_x = -32 - }, +/obj/structure/sign/warning/secure_area/directional/west, /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -45155,15 +45100,13 @@ /area/station/service/chapel) "moo" = ( /obj/machinery/light/small/directional/south, -/obj/structure/sign/warning/secure_area{ - pixel_y = -32 - }, +/obj/structure/sign/warning/secure_area/directional/south, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ dir = 4 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "mop" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/plasticflaps/opaque, @@ -45273,12 +45216,6 @@ /obj/effect/landmark/start/botanist, /turf/open/floor/iron, /area/station/service/hydroponics) -"mpJ" = ( -/obj/structure/cable, -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/warning/vacuum, -/turf/open/floor/plating, -/area/station/cargo/storage) "mpL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/neutral/half{ @@ -45403,9 +45340,8 @@ /area/station/engineering/storage_shared) "mre" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "mrw" = ( /obj/effect/landmark/start/botanist, @@ -45457,7 +45393,7 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/structure/extinguisher_cabinet/directional/south, /turf/open/floor/iron/dark, -/area/station/security/prison) +/area/station/security/execution/transfer) "msx" = ( /obj/item/kirbyplants/random, /obj/structure/sign/poster/contraband/random/directional/south, @@ -45581,9 +45517,8 @@ dir = 8 }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/engineering/supermatter/room) "mtu" = ( /obj/structure/cable, @@ -45608,7 +45543,7 @@ }, /obj/machinery/meter, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "mtL" = ( /obj/structure/closet/secure_closet/miner, /obj/effect/decal/cleanable/dirt, @@ -45626,9 +45561,8 @@ /obj/item/paper_bin/construction, /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/maintenance, -/turf/open/floor/wood{ - icon_state = "wood-broken5" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/maintenance/port/fore) "muu" = ( /obj/structure/cable, @@ -45745,7 +45679,7 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/garden) "mvv" = ( /obj/machinery/conveyor{ dir = 4; @@ -45789,9 +45723,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/structure/sign/warning/radiation{ - pixel_y = -32 - }, +/obj/structure/sign/warning/radiation/directional/south, /turf/open/floor/iron, /area/station/engineering/supermatter/room) "mvO" = ( @@ -45827,11 +45759,9 @@ /area/station/medical/medbay/lobby) "mwm" = ( /turf/open/floor/iron, -/area/station/science/misc_lab/range) +/area/station/science/auxlab) "mwo" = ( -/obj/structure/sign/warning/no_smoking{ - pixel_x = -32 - }, +/obj/structure/sign/warning/no_smoking/directional/west, /obj/effect/turf_decal/stripes/line{ dir = 8 }, @@ -45918,15 +45848,12 @@ "mxA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "mxE" = ( /obj/structure/lattice, -/obj/structure/sign/warning/electric_shock{ - pixel_x = 32 - }, +/obj/structure/sign/warning/electric_shock/directional/east, /turf/open/space/basic, /area/space) "mxP" = ( @@ -46069,9 +45996,7 @@ /area/station/science/breakroom) "mAH" = ( /obj/item/kirbyplants/random, -/obj/structure/sign/warning/no_smoking{ - pixel_x = 32 - }, +/obj/structure/sign/warning/no_smoking/directional/east, /obj/machinery/light_switch/directional/east{ pixel_x = 21 }, @@ -46268,18 +46193,14 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/effect/mapping_helpers/airlock/access/all/supply/general, +/obj/effect/mapping_helpers/airlock/access/any/supply/mining, +/obj/effect/mapping_helpers/airlock/access/any/supply/shipping, /turf/open/floor/iron, /area/station/cargo/sorting) "mDm" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/cargo/miningoffice) -"mDn" = ( -/turf/open/floor/wood{ - icon_state = "wood-broken2" - }, -/area/station/security/detectives_office/private_investigators_office) "mDq" = ( /obj/structure/table/wood, /obj/effect/turf_decal/tile/red{ @@ -46296,11 +46217,9 @@ /turf/open/floor/iron, /area/station/commons/lounge) "mDv" = ( -/obj/machinery/air_sensor{ - chamber_id = "ordnancegas1" - }, +/obj/machinery/air_sensor/ordnance_burn_chamber, /turf/open/floor/engine/vacuum, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "mDw" = ( /obj/structure/chair{ dir = 4 @@ -46447,7 +46366,7 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark, -/area/station/science/misc_lab) +/area/station/science/explab) "mGm" = ( /obj/machinery/portable_atmospherics/canister, /obj/effect/turf_decal/bot, @@ -46457,12 +46376,10 @@ /turf/open/floor/iron, /area/station/engineering/atmos) "mGn" = ( -/obj/machinery/computer/atmos_control/noreconnect{ - atmos_chambers = list("ordnancegas1" = "Burn Chamber", "ordnancegas2" = "Freezer Chamber") - }, /obj/machinery/light/directional/north, +/obj/machinery/computer/atmos_control/ordnancemix, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "mGo" = ( /obj/effect/spawner/random/entertainment/arcade, /obj/effect/decal/cleanable/dirt, @@ -46568,7 +46485,8 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/door/firedoor, /obj/machinery/door/poddoor/shutters/window/preopen{ - id = "right_arrivals_shutters" + id = "right_arrivals_shutters"; + dir = 1 }, /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ @@ -46779,8 +46697,9 @@ /area/station/service/kitchen) "mKJ" = ( /obj/effect/decal/cleanable/dirt, +/obj/structure/cable, /turf/open/floor/iron/cafeteria, -/area/station/security/prison) +/area/station/security/prison/mess) "mKL" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -46891,7 +46810,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, -/area/station/science/storage) +/area/station/science/ordnance/storage) "mMr" = ( /obj/effect/turf_decal/stripes/end{ dir = 1 @@ -46958,9 +46877,7 @@ /area/station/engineering/gravity_generator) "mNG" = ( /obj/structure/bed/roller, -/obj/structure/sign/departments/chemistry{ - pixel_y = -32 - }, +/obj/structure/sign/departments/chemistry/directional/south, /obj/machinery/light/directional/south, /obj/machinery/camera/directional/south{ c_tag = "Medbay - Waiting Room"; @@ -47304,7 +47221,7 @@ dir = 1 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "mSp" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/oil, @@ -47408,9 +47325,7 @@ /turf/open/floor/iron/white, /area/station/science/lobby) "mUp" = ( -/obj/structure/sign/warning/electric_shock{ - pixel_y = 32 - }, +/obj/structure/sign/warning/electric_shock/directional/north, /obj/effect/turf_decal/tile/neutral{ dir = 4 }, @@ -47446,11 +47361,6 @@ }, /turf/open/floor/carpet, /area/station/medical/psychology) -"mVa" = ( -/turf/open/floor/wood{ - icon_state = "wood-broken7" - }, -/area/station/security/detectives_office/private_investigators_office) "mVB" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -47844,9 +47754,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "mZy" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -48008,9 +47917,8 @@ "ncp" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small/directional/east, -/turf/open/floor/wood{ - icon_state = "wood-broken5" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/service/library/abandoned) "ncr" = ( /obj/effect/spawner/structure/window/hollow/reinforced/directional{ @@ -48090,7 +47998,7 @@ dir = 6 }, /turf/open/floor/plating/airless, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "ndz" = ( /obj/machinery/shieldgen, /obj/effect/decal/cleanable/dirt, @@ -48112,7 +48020,8 @@ }, /obj/machinery/door/poddoor/shutters{ id = "warehouse_shutters"; - name = "Warehouse Shutters" + name = "Warehouse Shutters"; + dir = 4 }, /turf/open/floor/iron, /area/station/cargo/warehouse) @@ -48250,9 +48159,7 @@ /area/station/tcommsat/computer) "ngL" = ( /obj/item/kirbyplants/random, -/obj/structure/sign/warning/bodysposal{ - pixel_y = -32 - }, +/obj/structure/sign/warning/bodysposal/directional/south, /obj/effect/turf_decal/tile/blue{ dir = 8 }, @@ -48268,11 +48175,9 @@ /area/station/science/lobby) "nhi" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer2, -/obj/machinery/air_sensor{ - chamber_id = "ordnancegas2" - }, +/obj/machinery/air_sensor/ordnance_freezer_chamber, /turf/open/floor/iron/dark/airless, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/freezerchamber) "nhj" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -48311,9 +48216,8 @@ /turf/open/floor/iron/dark, /area/station/engineering/atmos) "nhI" = ( -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/engineering/supermatter/room) "nhJ" = ( /obj/structure/chair/comfy/black{ @@ -48422,7 +48326,6 @@ /turf/closed/wall, /area/station/maintenance/starboard/aft) "njF" = ( -/obj/structure/cable, /obj/effect/turf_decal/stripes/line{ dir = 6 }, @@ -48504,7 +48407,7 @@ "nkw" = ( /obj/structure/chair/stool/directional/east, /turf/open/floor/iron/cafeteria, -/area/station/security/prison) +/area/station/security/prison/mess) "nkG" = ( /obj/structure/table/wood/poker, /obj/effect/decal/cleanable/dirt, @@ -48531,9 +48434,8 @@ dir = 8 }, /obj/machinery/power/apc/auto_name/directional/east, -/turf/open/floor/wood{ - icon_state = "wood-broken2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/service/electronic_marketing_den) "nkU" = ( /obj/effect/turf_decal/tile/blue/half/contrasted, @@ -48638,7 +48540,7 @@ /obj/structure/railing{ dir = 8 }, -/obj/structure/musician/piano, +/obj/effect/spawner/random/structure/musician/piano/random_piano, /obj/machinery/door/firedoor/border_only{ dir = 8 }, @@ -48671,7 +48573,7 @@ }, /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron/dark, -/area/station/science/misc_lab) +/area/station/science/explab) "nnv" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -48699,7 +48601,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/plating/airless, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "nnR" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/security{ @@ -48748,7 +48650,7 @@ /obj/effect/turf_decal/tile/green, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/garden) "noh" = ( /obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -48978,7 +48880,7 @@ "nrA" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "nrI" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/conveyor_switch/oneway{ @@ -49032,7 +48934,7 @@ /obj/structure/table, /obj/item/trash/raisins, /turf/open/floor/iron/cafeteria, -/area/station/security/prison) +/area/station/security/prison/mess) "ntd" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, @@ -49073,7 +48975,7 @@ /obj/item/seeds/tower, /obj/structure/sign/poster/official/random/directional/north, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/garden) "ntU" = ( /obj/structure/table/reinforced, /obj/machinery/microwave, @@ -49156,9 +49058,8 @@ "nvr" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "nvu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -49209,7 +49110,7 @@ req_access = list("brig") }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "nvK" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/iron/white, @@ -49304,6 +49205,9 @@ /obj/effect/spawner/random/aimodule/harmful{ pixel_y = -16 }, +/obj/item/ai_module/reset/purge{ + pixel_y = 11 + }, /turf/open/floor/circuit/red, /area/station/ai_monitored/turret_protected/ai_upload) "nwY" = ( @@ -49401,7 +49305,7 @@ /obj/structure/cable, /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "nyv" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -49432,7 +49336,7 @@ /obj/structure/rack, /obj/item/storage/bag/plants/portaseeder, /obj/item/cultivator, -/obj/item/reagent_containers/glass/bucket, +/obj/item/reagent_containers/glass/watering_can, /obj/item/plant_analyzer, /obj/structure/sign/poster/contraband/kudzu{ pixel_y = -32 @@ -49497,9 +49401,8 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood{ - icon_state = "wood-broken3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/service/abandoned_gambling_den) "nzs" = ( /obj/effect/decal/cleanable/dirt, @@ -49532,7 +49435,8 @@ "nzP" = ( /obj/machinery/door/poddoor/shutters/preopen{ id = "hopline"; - name = "Queue Shutters" + name = "Queue Shutters"; + dir = 8 }, /obj/effect/turf_decal/loading_area{ dir = 8 @@ -49665,7 +49569,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "nBF" = ( /obj/structure/cable, /obj/machinery/computer/rdconsole, @@ -49857,7 +49761,7 @@ /obj/structure/cable, /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron, -/area/station/security/execution/transfer) +/area/station/security/processing) "nDt" = ( /obj/machinery/door/airlock/hatch{ name = "MiniSat Exterior Access" @@ -50035,7 +49939,7 @@ req_access = list("brig") }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "nGK" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -50097,6 +50001,7 @@ c_tag = "Permabrig - Kitchen Entrance"; network = list("ss13","prison") }, +/obj/machinery/airalarm/directional/east, /turf/open/floor/iron, /area/station/security/prison) "nHs" = ( @@ -50296,6 +50201,7 @@ "nJM" = ( /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/prison) "nJN" = ( @@ -50343,7 +50249,6 @@ /turf/open/floor/plating, /area/station/science/research/abandoned) "nKd" = ( -/obj/structure/cable, /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/cargo/storage) @@ -50450,11 +50355,13 @@ pixel_y = 30 }, /obj/structure/reagent_dispensers/watertank, -/obj/item/reagent_containers/glass/bucket, +/obj/item/reagent_containers/glass/watering_can, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/cobweb, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/west, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/garden) "nLJ" = ( /obj/structure/closet{ name = "Evidence Closet" @@ -50842,7 +50749,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "nQI" = ( /obj/structure/table/glass, /obj/item/stack/sheet/mineral/plasma, @@ -50908,10 +50815,14 @@ }, /turf/open/floor/iron, /area/station/maintenance/department/crew_quarters/bar) +"nRf" = ( +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/security/prison/work) "nRl" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/station/science/misc_lab) +/area/station/science/explab) "nRm" = ( /obj/machinery/light/small/directional/west, /obj/item/clothing/suit/caution, @@ -50922,7 +50833,7 @@ dir = 1 }, /turf/open/floor/iron/white, -/area/station/security/prison/safe) +/area/station/security/prison/toilet) "nRy" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -50955,7 +50866,7 @@ dir = 6 }, /turf/open/floor/plating/airless, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "nRZ" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -50965,7 +50876,7 @@ dir = 8 }, /turf/open/floor/iron, -/area/station/security/execution/transfer) +/area/station/security/processing) "nSh" = ( /obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/visible{ dir = 4 @@ -51004,7 +50915,7 @@ /obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/red, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "nSG" = ( /obj/machinery/recharge_station, /obj/effect/decal/cleanable/dirt, @@ -51316,7 +51227,7 @@ dir = 1 }, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/execution/transfer) "nWk" = ( /obj/structure/rack, /obj/item/book/manual/wiki/engineering_hacking{ @@ -51404,7 +51315,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/execution/transfer) "nXn" = ( /obj/machinery/hydroponics/constructable, /obj/effect/turf_decal/trimline/green/end{ @@ -51431,9 +51342,7 @@ /turf/open/floor/iron/checker, /area/station/hallway/secondary/service) "nXt" = ( -/obj/structure/sign/warning/secure_area{ - pixel_x = -32 - }, +/obj/structure/sign/warning/secure_area/directional/west, /obj/machinery/camera/directional/west{ c_tag = "Atmospherics - Fore Tanks"; name = "atmospherics camera" @@ -51602,7 +51511,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /turf/open/floor/iron/white, -/area/station/science/storage) +/area/station/science/ordnance/storage) "nZW" = ( /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -51831,9 +51740,8 @@ dir = 4 }, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/department/engine/atmos) "ocj" = ( /obj/effect/turf_decal/tile/yellow/anticorner/contrasted, @@ -52065,7 +51973,6 @@ /turf/open/floor/iron, /area/station/maintenance/port/fore) "ofm" = ( -/obj/structure/cable, /obj/machinery/light/directional/south, /obj/machinery/status_display/supply{ pixel_y = -32 @@ -52216,9 +52123,7 @@ /area/station/service/hydroponics) "ohh" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/sign/warning/no_smoking{ - pixel_x = 32 - }, +/obj/structure/sign/warning/no_smoking/directional/east, /obj/structure/tank_dispenser, /obj/machinery/camera/directional/east{ c_tag = "Engineering - Gear Storage"; @@ -52293,6 +52198,9 @@ /obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 4 }, +/obj/machinery/modular_computer/console/preset/id{ + dir = 8 + }, /turf/open/floor/iron, /area/station/cargo/qm) "oig" = ( @@ -52424,14 +52332,14 @@ dir = 6 }, /turf/open/floor/iron, -/area/station/science/misc_lab/range) +/area/station/science/auxlab) "okx" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/red, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/structure/extinguisher_cabinet/directional/north, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "okC" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, @@ -52554,11 +52462,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/medical/morgue) -"omM" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/security/prison) "omS" = ( /obj/structure/sign/poster/official/report_crimes{ pixel_x = -32 @@ -52640,9 +52543,7 @@ /turf/open/floor/iron, /area/station/security/brig) "onR" = ( -/obj/structure/sign/warning/secure_area{ - pixel_x = -32 - }, +/obj/structure/sign/warning/secure_area/directional/west, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/light/directional/west, /turf/open/floor/iron/dark, @@ -52783,12 +52684,6 @@ "opY" = ( /turf/open/floor/carpet, /area/station/command/heads_quarters/captain/private) -"oqd" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood{ - icon_state = "wood-broken4" - }, -/area/station/service/library/abandoned) "oqp" = ( /obj/structure/dresser, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -52850,9 +52745,8 @@ /area/station/maintenance/port/greater) "orh" = ( /obj/machinery/light/directional/west, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/security/prison) "orx" = ( /obj/effect/decal/cleanable/dirt, @@ -52948,8 +52842,7 @@ /turf/open/floor/iron, /area/station/hallway/secondary/entry) "otH" = ( -/obj/structure/sign/warning/electric_shock{ - pixel_x = 32; +/obj/structure/sign/warning/electric_shock/directional/east{ pixel_y = -32 }, /obj/structure/cable, @@ -52969,12 +52862,6 @@ /obj/machinery/portable_atmospherics/canister, /turf/open/floor/iron, /area/station/science/xenobiology) -"otS" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/cargo/storage) "otX" = ( /obj/structure/chair, /obj/effect/landmark/start/assistant, @@ -53055,7 +52942,7 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/loading_area, /turf/open/floor/iron/dark, -/area/station/science/misc_lab) +/area/station/science/explab) "ovH" = ( /obj/structure/rack, /obj/item/crowbar, @@ -53140,7 +53027,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "owj" = ( /obj/structure/rack, /obj/item/storage/toolbox/emergency, @@ -53154,7 +53041,7 @@ /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "owu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -53253,7 +53140,7 @@ /obj/effect/turf_decal/box, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "oxD" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/blue, @@ -53362,7 +53249,7 @@ /area/station/service/chapel) "oyG" = ( /turf/closed/wall, -/area/station/science/misc_lab) +/area/station/science/explab) "oyQ" = ( /turf/open/floor/plating, /area/station/maintenance/port/greater) @@ -53429,10 +53316,9 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/light/directional/east, /obj/item/radio/intercom/directional/east, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/station/security/prison) +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/station/security/prison/garden) "ozw" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -53464,9 +53350,7 @@ /obj/machinery/shieldgen, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/structure/sign/warning/no_smoking{ - pixel_y = 32 - }, +/obj/structure/sign/warning/no_smoking/directional/north, /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/station/engineering/main) @@ -53544,9 +53428,8 @@ /obj/effect/spawner/random/trash/hobo_squat, /obj/effect/spawner/random/trash/cigbutt, /obj/structure/sign/poster/random/directional/north, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/department/crew_quarters/bar) "oAD" = ( /obj/effect/decal/cleanable/dirt, @@ -53611,6 +53494,9 @@ /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/iron, /area/station/cargo/storage) +"oBx" = ( +/turf/open/floor/iron, +/area/station/security/prison/work) "oBM" = ( /obj/structure/chair/office{ dir = 4 @@ -53668,7 +53554,7 @@ dir = 8 }, /turf/open/floor/iron/dark, -/area/station/science/misc_lab) +/area/station/science/explab) "oCs" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -53691,7 +53577,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "oCz" = ( /obj/machinery/button/door/directional/north{ id = "portbow_maint_shutters"; @@ -53931,7 +53817,8 @@ /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ id = "rndlab1"; - name = "Research and Development Shutter" + name = "Research and Development Shutter"; + dir = 4 }, /turf/open/floor/plating, /area/station/science/lab) @@ -54171,7 +54058,7 @@ /obj/effect/turf_decal/delivery/white{ color = "#52B4E9" }, -/obj/item/reagent_containers/glass/bucket, +/obj/item/reagent_containers/glass/watering_can, /turf/open/floor/iron/dark/textured, /area/station/service/hydroponics) "oJx" = ( @@ -54289,8 +54176,7 @@ /area/station/service/theater) "oLl" = ( /obj/machinery/chem_master, -/obj/structure/sign/warning/no_smoking{ - pixel_x = -32; +/obj/structure/sign/warning/no_smoking/directional/west{ pixel_y = -32 }, /obj/effect/turf_decal/stripes/line, @@ -54429,14 +54315,14 @@ req_access = list("brig") }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "oNz" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 4 }, /obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden, /turf/open/floor/engine, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "oNA" = ( /obj/structure/disposalpipe/segment, /obj/structure/chair/office{ @@ -54478,9 +54364,8 @@ "oOb" = ( /obj/effect/decal/cleanable/dirt, /obj/item/kirbyplants/random, -/turf/open/floor/wood{ - icon_state = "wood-broken" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/service/library/abandoned) "oOh" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -54514,7 +54399,7 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron/dark, -/area/station/science/misc_lab) +/area/station/science/explab) "oOw" = ( /obj/structure/disposalpipe/segment, /obj/machinery/door/firedoor, @@ -54607,7 +54492,8 @@ "oPN" = ( /obj/machinery/door/poddoor/shutters/preopen{ id = "rndlab1"; - name = "Research and Development Shutter" + name = "Research and Development Shutter"; + dir = 1 }, /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -54632,7 +54518,8 @@ /obj/item/pen, /obj/machinery/door/poddoor/shutters/preopen{ id = "rdrnd"; - name = "Research and Development Shutters" + name = "Research and Development Shutters"; + dir = 8 }, /obj/machinery/door/window/left/directional/south{ dir = 4; @@ -54671,7 +54558,7 @@ /obj/item/folder/red, /obj/item/toy/gun, /obj/item/clothing/head/beret/sec{ - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0); + armor = list("melee"=0,"bullet"=0,"laser"=0,"energy"=0,"bomb"=0,"bio"=0); desc = "A replica beret resembling that of a special operations officer under Nanotrasen."; name = "replica officer's beret" }, @@ -54689,7 +54576,7 @@ dir = 8 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/work) "oQI" = ( /obj/structure/sign/nanotrasen, /turf/closed/wall/r_wall, @@ -54705,9 +54592,8 @@ /area/station/engineering/storage_shared) "oQO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/wood{ - icon_state = "wood-broken4" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/service/library/abandoned) "oQU" = ( /obj/effect/decal/cleanable/dirt, @@ -54734,9 +54620,8 @@ }, /obj/item/pushbroom, /obj/machinery/light_switch/directional/north, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/medical/morgue) "oRE" = ( /obj/effect/turf_decal/stripes/line{ @@ -54833,7 +54718,7 @@ /obj/machinery/door/window/left/directional/south, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, -/area/station/security/prison) +/area/station/security/prison/garden) "oSF" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -54933,7 +54818,7 @@ "oUc" = ( /obj/machinery/door/window/left/directional/north{ name = "Crate Return Access"; - req_access = list("mail_sorting") + req_access = list("shipping") }, /obj/effect/turf_decal/loading_area{ dir = 1 @@ -55113,6 +54998,16 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron, /area/station/maintenance/port/greater) +"oWt" = ( +/obj/structure/cable, +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "ceprivacy"; + name = "Chief's Privacy Shutters"; + dir = 1 + }, +/turf/open/floor/plating, +/area/station/command/heads_quarters/ce) "oWA" = ( /obj/structure/bed, /obj/item/bedsheet/mime, @@ -55319,9 +55214,7 @@ /area/station/service/theater) "oZg" = ( /obj/machinery/power/port_gen/pacman, -/obj/structure/sign/warning/electric_shock{ - pixel_y = 32 - }, +/obj/structure/sign/warning/electric_shock/directional/north, /obj/machinery/power/terminal{ dir = 8 }, @@ -55333,9 +55226,8 @@ /area/station/ai_monitored/turret_protected/aisat_interior) "oZi" = ( /obj/effect/spawner/random/structure/grille, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/department/crew_quarters/bar) "oZt" = ( /obj/machinery/telecomms/server/presets/supply, @@ -55365,7 +55257,7 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, -/area/station/security/execution/transfer) +/area/station/security/processing) "paj" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -55423,7 +55315,7 @@ pixel_x = 25 }, /turf/open/floor/iron/dark, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/freezerchamber) "pbF" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -55472,7 +55364,7 @@ dir = 4 }, /turf/open/floor/iron, -/area/station/science/misc_lab/range) +/area/station/science/auxlab) "pbU" = ( /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 8 @@ -55555,7 +55447,7 @@ /obj/machinery/atmospherics/components/binary/valve/digital, /obj/machinery/light_switch/directional/east, /turf/open/floor/iron/white, -/area/station/science/storage) +/area/station/science/ordnance/storage) "pdl" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -55697,7 +55589,8 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/obj/effect/mapping_helpers/airlock/access/any/engineering/construction, +/obj/effect/mapping_helpers/airlock/access/any/engineering/general, /turf/open/floor/iron, /area/station/engineering/lobby) "peK" = ( @@ -55740,7 +55633,7 @@ }, /obj/machinery/disposal/bin, /turf/open/floor/iron/white, -/area/station/science/storage) +/area/station/science/ordnance/storage) "pfq" = ( /obj/structure/chair/office/light{ dir = 4 @@ -55917,9 +55810,8 @@ /obj/machinery/atmospherics/components/trinary/filter{ dir = 1 }, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/department/engine/atmos) "phm" = ( /obj/effect/decal/cleanable/dirt, @@ -56033,9 +55925,7 @@ dir = 4 }, /obj/machinery/light/directional/west, -/obj/structure/sign/warning/secure_area{ - pixel_x = -32 - }, +/obj/structure/sign/warning/secure_area/directional/west, /turf/open/floor/iron/dark, /area/station/engineering/atmos) "piA" = ( @@ -56096,7 +55986,7 @@ /obj/effect/turf_decal/bot, /obj/machinery/module_duplicator, /turf/open/floor/iron/dark, -/area/station/science/misc_lab) +/area/station/science/explab) "pjN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -56211,12 +56101,8 @@ /obj/machinery/door/airlock/vault{ name = "Vault Door" }, -/obj/structure/sign/warning/electric_shock{ - pixel_y = -32 - }, -/obj/structure/sign/warning/secure_area{ - pixel_y = 32 - }, +/obj/structure/sign/warning/electric_shock/directional/south, +/obj/structure/sign/warning/secure_area/directional/north, /obj/effect/landmark/navigate_destination, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/stripes/line{ @@ -56321,6 +56207,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, /turf/open/floor/iron, /area/station/security/prison) "pma" = ( @@ -56405,7 +56292,7 @@ "pnL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, -/area/station/security/prison) +/area/station/security/prison/mess) "pnO" = ( /obj/structure/closet/athletic_mixed, /obj/effect/turf_decal/box/white, @@ -56456,7 +56343,7 @@ /obj/effect/turf_decal/tile/red, /obj/structure/extinguisher_cabinet/directional/north, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "poA" = ( /obj/item/kirbyplants/random, /obj/machinery/light_switch/directional/south, @@ -56549,7 +56436,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "pqF" = ( /obj/effect/landmark/event_spawn, /obj/effect/turf_decal/tile/purple{ @@ -56563,14 +56450,12 @@ "pqK" = ( /obj/machinery/washing_machine, /obj/effect/decal/cleanable/cobweb, -/obj/structure/sign/warning/electric_shock{ - pixel_x = -32 - }, +/obj/structure/sign/warning/electric_shock/directional/west, /obj/effect/turf_decal/tile/yellow{ dir = 1 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/work) "pqP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, @@ -56656,7 +56541,7 @@ dir = 1 }, /turf/open/floor/iron, -/area/station/security/execution/transfer) +/area/station/security/processing) "prZ" = ( /obj/effect/turf_decal/tile/neutral, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -56823,9 +56708,8 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, /obj/machinery/meter, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/department/engine/atmos) "puv" = ( /obj/structure/cable, @@ -56959,9 +56843,8 @@ "pwo" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/structure/crate_abandoned, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "pwr" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -57446,13 +57329,14 @@ /obj/structure/table/reinforced, /obj/machinery/door/poddoor/shutters{ id = "visitation"; - name = "Visitation Shutters" + name = "Visitation Shutters"; + dir = 4 }, /obj/machinery/door/window/right/directional/south{ dir = 4 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/visit) "pCQ" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -57506,15 +57390,13 @@ /turf/open/floor/iron/dark, /area/station/science/xenobiology) "pDi" = ( -/obj/structure/sign/warning/electric_shock{ - pixel_x = -32 - }, +/obj/structure/sign/warning/electric_shock/directional/west, /obj/machinery/light/directional/west, /obj/effect/turf_decal/tile/red{ dir = 4 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "pDz" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -57702,7 +57584,7 @@ pixel_x = 11 }, /turf/open/floor/iron/cafeteria, -/area/station/security/prison) +/area/station/security/prison/mess) "pFT" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -57725,6 +57607,7 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, /turf/open/floor/plating, /area/station/security/prison/safe) "pGo" = ( @@ -58029,7 +57912,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "pJR" = ( /obj/machinery/vending/wardrobe/cargo_wardrobe, /obj/effect/turf_decal/bot, @@ -58117,9 +58000,8 @@ /turf/open/floor/iron, /area/station/maintenance/port/greater) "pLb" = ( -/turf/open/floor/wood{ - icon_state = "wood-broken7" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/service/library/abandoned) "pLg" = ( /obj/effect/turf_decal/stripes/line, @@ -58238,7 +58120,7 @@ dir = 4 }, /turf/open/floor/iron, -/area/station/security/execution/transfer) +/area/station/security/processing) "pLP" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -58291,7 +58173,7 @@ "pMV" = ( /obj/machinery/atmospherics/components/binary/valve/digital, /turf/open/floor/iron/white, -/area/station/science/storage) +/area/station/science/ordnance/storage) "pMW" = ( /obj/effect/turf_decal/tile/neutral, /obj/machinery/status_display/evac/directional/south, @@ -58438,15 +58320,6 @@ /obj/machinery/status_display/evac/directional/north, /turf/open/floor/iron/dark, /area/station/service/library) -"pPD" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood{ - icon_state = "wood-broken7" - }, -/area/station/service/theater) "pPO" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -58532,9 +58405,7 @@ "pQv" = ( /obj/structure/bodycontainer/morgue, /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/sign/warning/no_smoking{ - pixel_x = -32 - }, +/obj/structure/sign/warning/no_smoking/directional/west, /turf/open/floor/iron/dark, /area/station/service/chapel/funeral) "pQF" = ( @@ -58624,7 +58495,8 @@ }, /obj/machinery/door/firedoor, /obj/machinery/door/poddoor/shutters/window/preopen{ - id = "right_arrivals_shutters" + id = "right_arrivals_shutters"; + dir = 1 }, /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ @@ -58927,7 +58799,7 @@ /obj/structure/cable, /obj/effect/turf_decal/tile/red, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "pVK" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -59076,7 +58948,7 @@ /obj/machinery/portable_atmospherics/canister/nitrous_oxide, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, -/area/station/science/storage) +/area/station/science/ordnance/storage) "pYl" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -59211,9 +59083,8 @@ /obj/structure/chair/comfy/brown{ dir = 8 }, -/turf/open/floor/wood{ - icon_state = "wood-broken5" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/service/electronic_marketing_den) "qaq" = ( /obj/structure/table, @@ -59313,7 +59184,7 @@ "qbU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/closed/wall/r_wall, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "qbW" = ( /obj/effect/landmark/start/hangover, /obj/structure/railing{ @@ -59375,11 +59246,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, /area/station/service/library/abandoned) -"qcT" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, -/area/station/security/prison) "qdc" = ( /obj/effect/landmark/start/hangover, /obj/structure/chair/sofa/bench{ @@ -59495,7 +59361,7 @@ /obj/machinery/firealarm/directional/south, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "qep" = ( /obj/machinery/shower{ dir = 4 @@ -59697,7 +59563,7 @@ dir = 1 }, /turf/open/floor/iron, -/area/station/security/execution/transfer) +/area/station/security/processing) "qhN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -59893,6 +59759,7 @@ /obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 4 }, +/obj/structure/cable, /turf/open/floor/iron, /area/station/cargo/miningoffice) "qkm" = ( @@ -60062,7 +59929,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/garden) "qmO" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -60140,9 +60007,8 @@ "qnu" = ( /obj/item/kirbyplants/random, /obj/machinery/airalarm/directional/south, -/turf/open/floor/wood{ - icon_state = "wood-broken3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/service/theater/abandoned) "qnv" = ( /obj/effect/turf_decal/stripes/white/line, @@ -60348,7 +60214,7 @@ /obj/machinery/research/anomaly_refinery, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "qqO" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, @@ -60474,10 +60340,11 @@ /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ id = "rdordnance"; - name = "Ordnance Lab Shutters" + name = "Ordnance Lab Shutters"; + dir = 8 }, /turf/open/floor/plating, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "qsA" = ( /obj/structure/cable, /turf/open/floor/wood, @@ -60540,7 +60407,7 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "qtg" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden, @@ -60549,7 +60416,7 @@ "qtk" = ( /obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/incinerator_ordmix, /turf/open/floor/engine, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "qts" = ( /obj/item/kirbyplants{ icon_state = "plant-21" @@ -60563,13 +60430,14 @@ "qtD" = ( /obj/structure/window, /obj/effect/decal/cleanable/dirt, +/obj/structure/cable, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/garden) "qtG" = ( /obj/machinery/computer/security/labor, /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron, -/area/station/security/execution/transfer) +/area/station/security/processing) "qtO" = ( /obj/effect/turf_decal/tile/neutral, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -60673,9 +60541,7 @@ /area/station/medical/virology) "quX" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/sign/warning/radiation{ - pixel_y = -32 - }, +/obj/structure/sign/warning/radiation/directional/south, /turf/open/floor/iron/dark, /area/station/engineering/gravity_generator) "quZ" = ( @@ -60690,7 +60556,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "qvh" = ( /obj/machinery/light/small/directional/east, /obj/effect/turf_decal/bot, @@ -60699,8 +60565,9 @@ "qvl" = ( /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/cafeteria, -/area/station/security/prison) +/area/station/security/prison/mess) "qvn" = ( /obj/structure/sign/warning/secure_area, /turf/closed/wall/r_wall, @@ -60752,7 +60619,6 @@ /turf/open/floor/iron/cafeteria, /area/station/service/cafeteria) "qvC" = ( -/obj/structure/cable, /obj/structure/disposalpipe/segment, /obj/effect/decal/cleanable/dirt, /obj/machinery/status_display/supply{ @@ -60805,7 +60671,7 @@ /obj/machinery/door/airlock/hatch{ name = "MiniSat Transit Tube Access" }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/construction, +/obj/effect/mapping_helpers/airlock/access/all/command/minisat, /turf/open/floor/iron/dark, /area/station/engineering/transit_tube) "qwz" = ( @@ -60825,14 +60691,11 @@ /obj/structure/table/wood, /obj/item/storage/briefcase, /obj/item/taperecorder, -/turf/open/floor/wood{ - icon_state = "wood-broken4" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/service/electronic_marketing_den) "qwO" = ( -/obj/structure/sign/warning/electric_shock{ - pixel_y = -32 - }, +/obj/structure/sign/warning/electric_shock/directional/south, /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark/telecomms, @@ -60993,9 +60856,8 @@ /obj/structure/cable, /obj/structure/extinguisher_cabinet/directional/east, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood{ - icon_state = "wood-broken5" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/service/theater) "qzA" = ( /obj/structure/cable, @@ -61013,14 +60875,7 @@ /turf/open/floor/iron, /area/station/command/heads_quarters/rd) "qzS" = ( -/obj/docking_port/stationary{ - dwidth = 3; - height = 5; - id = "commonmining_home"; - name = "SS13: Common Mining Dock"; - roundstart_template = /datum/map_template/shuttle/mining_common/meta; - width = 7 - }, +/obj/docking_port/stationary/mining_home/common, /turf/open/space/basic, /area/space) "qzY" = ( @@ -61059,6 +60914,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/structure/cable, /turf/open/floor/iron, /area/station/security/prison/safe) "qAx" = ( @@ -61154,7 +61010,7 @@ /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/security/prison) +/area/station/security/execution/transfer) "qBz" = ( /obj/structure/chair/office/light, /obj/structure/cable, @@ -61186,9 +61042,8 @@ "qBQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /mob/living/simple_animal/hostile/retaliate/goose/vomit, -/turf/open/floor/wood{ - icon_state = "wood-broken7" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/service/abandoned_gambling_den) "qBS" = ( /obj/structure/closet/wardrobe/miner, @@ -61250,7 +61105,7 @@ dir = 1 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/garden) "qCX" = ( /obj/structure/table/reinforced, /obj/machinery/door/firedoor, @@ -61288,6 +61143,14 @@ /obj/item/circuitboard/machine/chem_master, /turf/open/floor/iron/grimy, /area/station/maintenance/port/fore) +"qDK" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/loading_area{ + dir = 1 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/cargo/storage) "qDT" = ( /obj/structure/bookcase/manuals/engineering, /turf/open/floor/wood, @@ -61376,15 +61239,22 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/fore) +"qFN" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "roboticsprivacy"; + name = "Robotics Shutters"; + dir = 1 + }, +/turf/open/floor/plating, +/area/station/science/robotics/lab) "qFV" = ( /obj/machinery/vending/coffee, /turf/open/floor/iron, /area/station/hallway/primary/aft) "qFW" = ( /obj/machinery/porta_turret/ai, -/obj/structure/sign/warning/electric_shock{ - pixel_y = -32 - }, +/obj/structure/sign/warning/electric_shock/directional/south, /turf/open/floor/circuit/green, /area/station/ai_monitored/turret_protected/ai_upload) "qGm" = ( @@ -61604,7 +61474,8 @@ /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ id = "rdrnd"; - name = "Research and Development Shutters" + name = "Research and Development Shutters"; + dir = 8 }, /turf/open/floor/plating, /area/station/science/lab) @@ -61644,7 +61515,7 @@ /area/station/engineering/supermatter/room) "qJK" = ( /turf/closed/wall/r_wall, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "qJN" = ( /obj/machinery/button/door{ id = "brigwindows"; @@ -61883,9 +61754,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 5 }, -/obj/structure/sign/warning/pods{ - pixel_x = 32 - }, +/obj/structure/sign/warning/pods/directional/east, /turf/open/floor/iron, /area/station/hallway/secondary/entry) "qMY" = ( @@ -61957,7 +61826,7 @@ /obj/effect/turf_decal/delivery/white{ color = "#52B4E9" }, -/obj/item/reagent_containers/glass/bucket, +/obj/item/reagent_containers/glass/watering_can, /turf/open/floor/iron/dark/textured, /area/station/service/hydroponics) "qOk" = ( @@ -61978,9 +61847,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/landmark/start/hangover, /obj/machinery/requests_console/directional/east, -/turf/open/floor/wood{ - icon_state = "wood-broken" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/service/theater) "qOL" = ( /obj/structure/disposalpipe/segment{ @@ -62042,9 +61910,7 @@ /turf/open/floor/carpet/green, /area/station/commons/lounge) "qPF" = ( -/obj/structure/sign/warning/secure_area{ - pixel_x = 32 - }, +/obj/structure/sign/warning/secure_area/directional/east, /obj/structure/lattice, /turf/open/space/basic, /area/space/nearstation) @@ -62114,9 +61980,8 @@ "qQD" = ( /obj/item/kirbyplants/random, /obj/machinery/light/small/directional/south, -/turf/open/floor/wood{ - icon_state = "wood-broken3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/service/library/abandoned) "qQE" = ( /obj/effect/turf_decal/delivery, @@ -62156,7 +62021,7 @@ /obj/effect/decal/cleanable/dirt, /obj/item/clipboard, /turf/open/floor/iron/cafeteria, -/area/station/security/prison) +/area/station/security/prison/mess) "qRw" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -62258,9 +62123,7 @@ /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) "qTG" = ( -/obj/structure/sign/departments/medbay/alt{ - pixel_x = 32 - }, +/obj/structure/sign/departments/medbay/alt/directional/east, /obj/structure/table/glass, /obj/item/reagent_containers/glass/bottle/epinephrine, /obj/item/reagent_containers/glass/bottle/multiver{ @@ -62362,7 +62225,8 @@ "qVl" = ( /obj/machinery/door/poddoor/shutters{ id = "evashutters2"; - name = "E.V.A. Storage Shutters" + name = "E.V.A. Storage Shutters"; + dir = 1 }, /obj/effect/decal/cleanable/dirt, /obj/structure/barricade/wooden, @@ -62437,7 +62301,7 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/light/directional/east, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "qWU" = ( /obj/machinery/holopad, /obj/effect/turf_decal/tile/purple/fourcorners, @@ -62531,8 +62395,9 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/airalarm/directional/north, +/obj/structure/cable, /turf/open/floor/plating, -/area/station/security/prison/safe) +/area/station/security/prison/toilet) "qYx" = ( /obj/machinery/igniter/incinerator_atmos, /turf/open/floor/engine, @@ -62557,7 +62422,7 @@ dir = 4 }, /turf/closed/wall/r_wall, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "qYL" = ( /turf/closed/wall, /area/station/medical/morgue) @@ -62593,7 +62458,7 @@ dir = 4 }, /turf/open/floor/iron/dark/airless, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/freezerchamber) "qZM" = ( /obj/machinery/light/directional/north, /obj/structure/sign/nanotrasen{ @@ -62640,7 +62505,8 @@ /obj/machinery/door/firedoor, /obj/machinery/door/poddoor/shutters/preopen{ id = "chemistbot"; - name = "Chemistry Side Shutters" + name = "Chemistry Side Shutters"; + dir = 8 }, /obj/machinery/door/window/left/directional/south{ dir = 4; @@ -62703,7 +62569,7 @@ /obj/item/reagent_containers/food/condiment/enzyme, /obj/item/storage/fancy/egg_box, /turf/open/floor/iron/cafeteria, -/area/station/security/prison) +/area/station/security/prison/mess) "rbg" = ( /obj/effect/turf_decal/tile/purple{ dir = 8 @@ -62962,6 +62828,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/starboard) +"rev" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/security/processing) "rex" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced/tinted, @@ -62992,7 +62863,8 @@ /obj/structure/table/reinforced, /obj/machinery/door/poddoor/shutters{ id = "commissaryshutters"; - name = "Vacant Commissary Shutters" + name = "Vacant Commissary Shutters"; + dir = 4 }, /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -63065,7 +62937,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/item/radio/intercom/directional/south, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "rgf" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -63190,6 +63062,7 @@ /obj/effect/turf_decal/tile/purple/half/contrasted{ dir = 4 }, +/obj/structure/cable, /turf/open/floor/iron, /area/station/cargo/miningoffice) "rhx" = ( @@ -63197,17 +63070,22 @@ id = "brigprison"; name = "Prison Blast Door" }, -/obj/machinery/door/airlock/security/glass{ - name = "Permabrig Visitation" - }, -/obj/effect/turf_decal/delivery, /obj/effect/mapping_helpers/airlock/access/all/security/brig, /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/door/poddoor/preopen{ + id = "brigprison"; + name = "Prison Blast Door" + }, +/obj/machinery/door/airlock/security/glass{ + name = "Permabrig Visitation" + }, +/obj/effect/turf_decal/delivery, +/obj/structure/cable, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/visit) "rhy" = ( /obj/machinery/light/directional/west, /obj/effect/turf_decal/tile/blue{ @@ -63291,12 +63169,8 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/turf/open/floor/plating{ - initial_gas_mix = "o2=0.01;n2=0.01;TEMP=2.7"; - luminosity = 2; - temperature = 2.7 - }, -/area/station/security/prison) +/turf/open/floor/plating, +/area/station/security/execution/transfer) "riD" = ( /obj/structure/table/wood, /obj/item/clothing/gloves/color/fyellow, @@ -63457,7 +63331,8 @@ "rkE" = ( /obj/machinery/door/poddoor/shutters/preopen{ id = "chemisttop"; - name = "Chemistry Lobby Shutters" + name = "Chemistry Lobby Shutters"; + dir = 1 }, /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -63736,7 +63611,7 @@ dir = 1 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "rpZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -63757,7 +63632,7 @@ /obj/machinery/disposal/bin, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/science/misc_lab) +/area/station/science/explab) "rqm" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/maintenance_hatch{ @@ -63792,7 +63667,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/science/ordnance, /turf/open/floor/engine/vacuum, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "rqx" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -63802,8 +63677,10 @@ "rqO" = ( /obj/structure/table, /obj/item/kitchen/fork/plastic, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/south, /turf/open/floor/iron/cafeteria, -/area/station/security/prison) +/area/station/security/prison/mess) "rqW" = ( /obj/structure/cable, /obj/effect/landmark/start/hangover, @@ -64070,7 +63947,7 @@ }, /obj/machinery/door/firedoor, /obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/effect/mapping_helpers/airlock/access/all/engineering/construction, +/obj/effect/mapping_helpers/airlock/access/all/command/minisat, /turf/open/floor/iron/dark, /area/station/engineering/transit_tube) "rvC" = ( @@ -64214,7 +64091,7 @@ dir = 9 }, /turf/open/floor/iron, -/area/station/security/execution/transfer) +/area/station/security/processing) "rxW" = ( /obj/structure/cable, /obj/effect/turf_decal/stripes/line, @@ -64468,12 +64345,10 @@ /area/station/commons/locker) "rBI" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/warning/electric_shock{ - pixel_x = -32 - }, +/obj/structure/sign/warning/electric_shock/directional/west, /obj/structure/cable, /turf/open/floor/plating, -/area/station/security/execution/transfer) +/area/station/security/processing) "rBQ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -64512,7 +64387,8 @@ }, /obj/machinery/door/poddoor/shutters/preopen{ id = "rdrnd"; - name = "Research and Development Shutters" + name = "Research and Development Shutters"; + dir = 8 }, /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -64526,10 +64402,18 @@ /obj/effect/mapping_helpers/airlock/access/all/science/general, /turf/open/floor/iron, /area/station/science/lab) -"rCK" = ( -/obj/structure/sign/departments/court{ - pixel_y = -32 +"rCE" = ( +/obj/structure/cable, +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "ceprivacy"; + name = "Chief's Privacy Shutters"; + dir = 4 }, +/turf/open/floor/plating, +/area/station/command/heads_quarters/ce) +"rCK" = ( +/obj/structure/sign/departments/court/directional/south, /obj/effect/turf_decal/tile/neutral, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -64551,6 +64435,7 @@ /obj/machinery/holopad, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, /turf/open/floor/iron, /area/station/security/prison) "rDj" = ( @@ -64579,7 +64464,8 @@ }, /obj/machinery/door/poddoor/shutters/preopen{ id = "cafe_counter"; - name = "Kitchen Counter Shutters" + name = "Kitchen Counter Shutters"; + dir = 8 }, /obj/structure/displaycase/forsale/kitchen, /turf/open/floor/iron/white/smooth_half{ @@ -64664,7 +64550,7 @@ req_access = list("kitchen") }, /obj/item/storage/bag/plants, -/obj/item/reagent_containers/glass/bucket, +/obj/item/reagent_containers/glass/watering_can, /turf/open/floor/iron, /area/station/service/kitchen) "rES" = ( @@ -64880,10 +64766,9 @@ /turf/open/floor/plating, /area/station/engineering/atmos) "rHZ" = ( -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/station/security/prison) +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/station/security/execution/transfer) "rIa" = ( /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 4 @@ -64931,8 +64816,9 @@ dir = 8 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, /turf/open/floor/iron/cafeteria, -/area/station/security/prison) +/area/station/security/prison/mess) "rIK" = ( /obj/machinery/computer/security/telescreen/entertainment/directional/north, /obj/machinery/camera/directional/west{ @@ -64989,9 +64875,7 @@ /turf/open/floor/iron, /area/station/hallway/primary/central/aft) "rJv" = ( -/obj/structure/sign/departments/court{ - pixel_y = 32 - }, +/obj/structure/sign/departments/court/directional/north, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -65085,8 +64969,7 @@ }, /area/station/engineering/atmos) "rKq" = ( -/obj/structure/sign/departments/medbay/alt{ - pixel_x = 32; +/obj/structure/sign/departments/medbay/alt/directional/east{ pixel_y = -32 }, /obj/effect/turf_decal/tile/blue, @@ -65100,9 +64983,7 @@ /turf/open/floor/plating, /area/station/security/checkpoint/escape) "rKx" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_x = -32 - }, +/obj/structure/sign/warning/vacuum/external/directional/west, /obj/effect/turf_decal/tile/blue{ dir = 4 }, @@ -65476,7 +65357,7 @@ "rOk" = ( /obj/machinery/igniter/incinerator_ordmix, /turf/open/floor/engine/vacuum, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "rOn" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -65637,9 +65518,8 @@ pixel_y = 10 }, /obj/machinery/firealarm/directional/south, -/turf/open/floor/wood{ - icon_state = "wood-broken5" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/service/theater) "rQv" = ( /obj/machinery/space_heater, @@ -65785,16 +65665,15 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, -/turf/open/floor/wood{ - icon_state = "wood-broken2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/maintenance/starboard/aft) "rSD" = ( /obj/structure/closet/secure_closet/quartermaster, /obj/effect/turf_decal/stripes/line{ dir = 9 }, -/obj/item/radio/intercom/directional/west, +/obj/machinery/firealarm/directional/west, /turf/open/floor/iron, /area/station/cargo/qm) "rSJ" = ( @@ -65949,7 +65828,7 @@ }, /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron/white, -/area/station/science/storage) +/area/station/science/ordnance/storage) "rUp" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -65987,7 +65866,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, -/area/station/science/misc_lab/range) +/area/station/science/auxlab) "rUB" = ( /obj/machinery/suit_storage_unit/cmo, /obj/effect/turf_decal/stripes/line{ @@ -66035,7 +65914,7 @@ /area/station/service/library/abandoned) "rVi" = ( /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "rVq" = ( /obj/structure/sink{ dir = 4; @@ -66424,9 +66303,8 @@ /area/station/tcommsat/server) "sav" = ( /obj/item/flashlight/seclite, -/turf/open/floor/wood{ - icon_state = "wood-broken3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/commons/dorms) "saA" = ( /obj/effect/decal/cleanable/dirt, @@ -66481,7 +66359,7 @@ /obj/effect/turf_decal/stripes/line, /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "sbh" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -66490,9 +66368,7 @@ /area/station/security/interrogation) "sbi" = ( /obj/structure/cable, -/obj/structure/sign/departments/psychology{ - pixel_x = 32 - }, +/obj/structure/sign/departments/psychology/directional/east, /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 4 }, @@ -66610,7 +66486,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/science/research, /turf/open/floor/iron, -/area/station/science/misc_lab) +/area/station/science/explab) "scp" = ( /obj/machinery/portable_atmospherics/canister, /obj/effect/turf_decal/stripes/line{ @@ -66641,7 +66517,7 @@ /area/station/command/heads_quarters/captain) "sdg" = ( /turf/closed/wall/mineral/plastitanium, -/area/station/security/prison) +/area/station/security/execution/transfer) "sdi" = ( /obj/machinery/atmospherics/pipe/smart/manifold/supply/visible, /obj/effect/turf_decal/tile/yellow{ @@ -66713,7 +66589,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "sef" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -66742,8 +66618,7 @@ /turf/open/floor/iron/white, /area/station/command/heads_quarters/cmo) "ses" = ( -/obj/structure/sign/warning/electric_shock{ - pixel_x = -32; +/obj/structure/sign/warning/electric_shock/directional/west{ pixel_y = -32 }, /obj/structure/cable, @@ -66906,11 +66781,9 @@ /area/station/service/chapel) "shO" = ( /obj/machinery/light/small/directional/west, -/obj/structure/sign/warning/vacuum{ - pixel_x = 32 - }, +/obj/structure/sign/warning/vacuum/directional/east, /turf/open/floor/plating, -/area/station/security/prison) +/area/station/security/execution/transfer) "shR" = ( /obj/structure/closet/secure_closet/security/sec, /obj/effect/turf_decal/bot, @@ -66992,9 +66865,8 @@ }, /obj/machinery/light/small/directional/south, /obj/item/radio/intercom/directional/south, -/turf/open/floor/wood{ - icon_state = "wood-broken3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/hallway/secondary/service) "siF" = ( /obj/machinery/mineral/ore_redemption, @@ -67114,7 +66986,10 @@ dir = 8 }, /turf/open/floor/iron, -/area/station/security/execution/transfer) +/area/station/security/processing) +"sjC" = ( +/turf/closed/wall, +/area/station/security/processing) "sjG" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/structure/crate, @@ -67355,7 +67230,7 @@ /obj/structure/cable, /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "smO" = ( /obj/structure/sign/warning/electric_shock, /turf/closed/wall/r_wall, @@ -67400,7 +67275,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "snu" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/west, @@ -67548,7 +67423,7 @@ /obj/machinery/door/firedoor, /obj/effect/turf_decal/delivery, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "spq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/cafeteria, @@ -67785,8 +67660,7 @@ /turf/open/floor/iron/dark/textured, /area/station/engineering/storage) "stF" = ( -/obj/structure/sign/warning/electric_shock{ - pixel_x = -32; +/obj/structure/sign/warning/electric_shock/directional/west{ pixel_y = 32 }, /turf/open/space, @@ -67798,7 +67672,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /turf/open/floor/iron/white, -/area/station/science/storage) +/area/station/science/ordnance/storage) "stN" = ( /obj/structure/railing{ dir = 10 @@ -68079,9 +67953,8 @@ /obj/effect/landmark/blobstart, /obj/effect/landmark/event_spawn, /obj/structure/chair/stool/directional/west, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "sxR" = ( /obj/effect/turf_decal/delivery, @@ -68288,7 +68161,7 @@ /obj/item/storage/bag/tray/cafeteria, /obj/item/storage/box/drinkingglasses, /turf/open/floor/iron/cafeteria, -/area/station/security/prison) +/area/station/security/prison/mess) "sAS" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/shower{ @@ -68580,6 +68453,9 @@ /obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 1 }, +/obj/machinery/computer/security/telescreen/vault{ + pixel_y = 30 + }, /turf/open/floor/iron, /area/station/cargo/qm) "sEm" = ( @@ -68680,9 +68556,8 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 }, -/turf/open/floor/wood{ - icon_state = "wood-broken5" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/service/theater) "sFS" = ( /obj/structure/cable, @@ -68788,7 +68663,7 @@ /obj/machinery/light/directional/south, /obj/item/radio/intercom/prison/directional/south, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/work) "sHl" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -68923,7 +68798,7 @@ dir = 8 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "sIx" = ( /obj/machinery/door/airlock/medical/glass{ name = "Treatment Center" @@ -68968,9 +68843,6 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/door/airlock/mining{ - name = "Quartermaster's Office" - }, /obj/effect/turf_decal/stripes/line{ dir = 4 }, @@ -68979,6 +68851,9 @@ }, /obj/machinery/door/firedoor, /obj/effect/mapping_helpers/airlock/access/all/supply/qm, +/obj/machinery/door/airlock/command/glass{ + name = "Quartermaster's Office" + }, /turf/open/floor/iron, /area/station/cargo/qm) "sIP" = ( @@ -69073,10 +68948,9 @@ c_tag = "Permabrig - Garden"; network = list("ss13","prison") }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/station/security/prison) +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/station/security/prison/garden) "sJD" = ( /obj/structure/window/reinforced{ dir = 1 @@ -69207,7 +69081,7 @@ "sKJ" = ( /obj/structure/cable, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "sKP" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, @@ -69660,9 +69534,8 @@ /area/station/maintenance/department/electrical) "sQS" = ( /obj/machinery/light/small/directional/south, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "sQU" = ( /obj/effect/turf_decal/tile/brown/half/contrasted{ @@ -69905,9 +69778,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/structure/sign/warning/radiation{ - pixel_y = -32 - }, +/obj/structure/sign/warning/radiation/directional/south, /turf/open/floor/iron, /area/station/engineering/supermatter/room) "sVb" = ( @@ -69928,8 +69799,10 @@ }, /obj/machinery/light/small/directional/north, /obj/machinery/firealarm/directional/south, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, /turf/open/floor/iron/white, -/area/station/security/prison/safe) +/area/station/security/prison/toilet) "sVj" = ( /obj/machinery/announcement_system, /obj/machinery/status_display/ai/directional/west, @@ -69985,7 +69858,6 @@ /turf/open/floor/iron/dark, /area/station/maintenance/disposal/incinerator) "sWw" = ( -/obj/structure/cable, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/brown{ dir = 4 @@ -70010,6 +69882,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"sWC" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/security/prison/visit) "sWI" = ( /obj/machinery/camera/directional/east{ c_tag = "Central Hallway - Starboard"; @@ -70076,7 +69953,7 @@ dir = 4 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "sXd" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/security{ @@ -70167,7 +70044,7 @@ "sXZ" = ( /obj/machinery/door/poddoor/incinerator_ordmix, /turf/open/floor/engine/vacuum, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "sYk" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -70341,7 +70218,8 @@ }, /obj/machinery/door/poddoor/shutters/preopen{ id = "roboticsprivacy"; - name = "Robotics Shutters" + name = "Robotics Shutters"; + dir = 4 }, /obj/machinery/door/window/left/directional/west{ name = "Robotics Desk"; @@ -70446,9 +70324,8 @@ /obj/structure/disposalpipe/junction{ dir = 1 }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/department/crew_quarters/bar) "tbZ" = ( /obj/item/kirbyplants/random, @@ -70484,12 +70361,11 @@ /obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer2{ dir = 6 }, -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored{ - chamber_id = "ordnancegas2"; +/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/ordnance_freezer_chamber_input{ dir = 8 }, /turf/open/floor/iron/dark/airless, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/freezerchamber) "tcp" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/security/glass{ @@ -70574,7 +70450,7 @@ /obj/item/integrated_circuit/loaded/speech_relay, /obj/item/integrated_circuit/loaded/hello_world, /turf/open/floor/iron/dark, -/area/station/science/misc_lab) +/area/station/science/explab) "tdf" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral, @@ -70636,7 +70512,7 @@ }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "teA" = ( /obj/structure/displaycase/captain, /turf/open/floor/iron/grimy, @@ -70646,7 +70522,7 @@ dir = 9 }, /turf/open/floor/iron/dark/airless, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/freezerchamber) "teH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -70729,7 +70605,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "tgl" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -70740,7 +70616,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/work) "tgq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -70922,7 +70798,7 @@ dir = 4 }, /turf/open/floor/iron, -/area/station/security/execution/transfer) +/area/station/security/processing) "tiS" = ( /obj/machinery/vending/wardrobe/chef_wardrobe, /obj/effect/turf_decal/bot, @@ -71045,7 +70921,7 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/science/misc_lab) +/area/station/science/explab) "tlJ" = ( /obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ dir = 8 @@ -71140,11 +71016,10 @@ /area/station/command/bridge) "tmx" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/item/paper_bin/carbon, /obj/effect/turf_decal/tile/brown/anticorner/contrasted{ dir = 8 }, +/obj/machinery/pdapainter/supply, /turf/open/floor/iron, /area/station/cargo/qm) "tmy" = ( @@ -71201,7 +71076,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/construction, +/obj/effect/mapping_helpers/airlock/access/all/command/minisat, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) "tnL" = ( @@ -71317,7 +71192,7 @@ /obj/structure/closet/bombcloset, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "tpe" = ( /obj/structure/cable, /obj/effect/turf_decal/stripes/line{ @@ -71581,9 +71456,8 @@ "trS" = ( /obj/structure/table/wood/poker, /obj/effect/spawner/random/maintenance, -/turf/open/floor/wood{ - icon_state = "wood-broken5" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/service/abandoned_gambling_den) "trT" = ( /obj/machinery/ai_slipper{ @@ -71687,7 +71561,7 @@ /obj/item/wirecutters, /obj/effect/turf_decal/box, /obj/machinery/firealarm/directional/north, -/obj/item/reagent_containers/glass/bucket, +/obj/item/reagent_containers/glass/watering_can, /turf/open/floor/iron, /area/station/service/hydroponics) "tsU" = ( @@ -71807,9 +71681,7 @@ "ttQ" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small/directional/east, -/obj/structure/sign/warning/fire{ - pixel_x = 32 - }, +/obj/structure/sign/warning/fire/directional/east, /obj/effect/turf_decal/stripes/end{ dir = 4 }, @@ -71853,7 +71725,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/science/ordnance_storage, /turf/open/floor/iron/white, -/area/station/science/mixing) +/area/station/science/ordnance) "tun" = ( /obj/structure/chair{ dir = 4 @@ -72013,9 +71885,7 @@ pixel_y = 16 }, /obj/item/circular_saw, -/obj/structure/sign/warning/no_smoking{ - pixel_y = -32 - }, +/obj/structure/sign/warning/no_smoking/directional/south, /obj/structure/mirror/directional/east, /obj/effect/turf_decal/bot, /turf/open/floor/iron, @@ -72248,9 +72118,8 @@ "tzo" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "tzv" = ( /obj/structure/lattice/catwalk, @@ -72311,7 +72180,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/science/misc_lab) +/area/station/science/explab) "tAM" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 1; @@ -72348,15 +72217,14 @@ /obj/item/stock_parts/cell/high, /obj/structure/table/reinforced, /turf/open/floor/iron/dark, -/area/station/science/misc_lab) +/area/station/science/explab) "tBd" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/siding/wood{ dir = 8 }, -/turf/open/floor/wood{ - icon_state = "wood-broken2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/maintenance/port/fore) "tBg" = ( /obj/structure/table/reinforced, @@ -72367,9 +72235,7 @@ /turf/open/floor/iron, /area/station/security/warden) "tBi" = ( -/obj/structure/sign/warning/secure_area{ - pixel_y = 32 - }, +/obj/structure/sign/warning/secure_area/directional/north, /obj/machinery/light/directional/north, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/yellow/filled/line{ @@ -72508,11 +72374,12 @@ "tDk" = ( /obj/machinery/door/poddoor/shutters/preopen{ id = "rdordnance"; - name = "Ordnance Lab Shutters" + name = "Ordnance Lab Shutters"; + dir = 1 }, /obj/effect/spawner/structure/window/reinforced/plasma, /turf/open/floor/plating, -/area/station/science/storage) +/area/station/science/ordnance/storage) "tDs" = ( /turf/closed/wall, /area/station/service/electronic_marketing_den) @@ -72535,11 +72402,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/station/cargo/miningoffice) -"tDH" = ( -/obj/structure/cable, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/station/cargo/storage) "tDL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/red{ @@ -72748,9 +72610,7 @@ /turf/open/floor/wood, /area/station/maintenance/port/fore) "tFu" = ( -/obj/structure/sign/warning/secure_area{ - pixel_y = -32 - }, +/obj/structure/sign/warning/secure_area/directional/south, /obj/machinery/light/directional/south, /obj/effect/decal/cleanable/dirt, /obj/machinery/camera/directional/south{ @@ -72771,9 +72631,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/structure/sign/warning/engine_safety{ - pixel_y = -32 - }, +/obj/structure/sign/warning/engine_safety/directional/south, /obj/machinery/light/directional/south, /obj/effect/turf_decal/tile/yellow/half/contrasted, /turf/open/floor/iron, @@ -72862,7 +72720,7 @@ req_access = list("brig") }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "tHf" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, @@ -72899,9 +72757,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/door/firedoor, -/obj/machinery/door/airlock/mining{ - name = "Quartermaster's Quarters" - }, /obj/effect/turf_decal/stripes/line{ dir = 8 }, @@ -72909,6 +72764,9 @@ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/all/supply/qm, +/obj/machinery/door/airlock/command/glass{ + name = "Quartermaster's Office" + }, /turf/open/floor/iron, /area/station/cargo/qm) "tHC" = ( @@ -72984,8 +72842,9 @@ /obj/machinery/camera/directional/east{ c_tag = "Security - Visitation" }, +/obj/structure/cable, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/visit) "tJi" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -73196,8 +73055,7 @@ dir = 4; name = "Mix Outlet Pump" }, -/obj/structure/sign/warning/secure_area{ - pixel_x = -32; +/obj/structure/sign/warning/secure_area/directional/west{ pixel_y = -32 }, /obj/machinery/power/apc/auto_name/directional/south, @@ -73274,7 +73132,7 @@ dir = 8 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/visit) "tMF" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -73504,7 +73362,7 @@ /obj/structure/extinguisher_cabinet/directional/east, /obj/effect/turf_decal/tile/red/anticorner/contrasted, /turf/open/floor/iron, -/area/station/security/execution/transfer) +/area/station/security/processing) "tOP" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -73548,7 +73406,8 @@ /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ id = "lawyerprivacy"; - name = "Lawyer's Privacy Shutter" + name = "Lawyer's Privacy Shutter"; + dir = 1 }, /turf/open/floor/plating, /area/station/service/lawoffice) @@ -73569,7 +73428,7 @@ /area/station/science/genetics) "tPD" = ( /obj/machinery/biogenerator, -/obj/item/reagent_containers/glass/bucket, +/obj/item/reagent_containers/glass/watering_can, /turf/open/floor/iron/dark, /area/station/service/hydroponics/garden) "tPE" = ( @@ -73619,7 +73478,7 @@ /obj/item/gun/energy/laser/practice, /obj/item/gun/energy/laser/practice, /turf/open/floor/iron/white, -/area/station/science/misc_lab/range) +/area/station/science/auxlab) "tQP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -73783,7 +73642,7 @@ }, /obj/structure/cable, /turf/open/floor/iron, -/area/station/security/execution/transfer) +/area/station/security/processing) "tRO" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/brown{ @@ -73888,7 +73747,7 @@ /obj/effect/landmark/event_spawn, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, -/area/station/security/execution/transfer) +/area/station/security/processing) "tTy" = ( /obj/structure/table/reinforced, /obj/item/wrench, @@ -73959,11 +73818,9 @@ dir = 1 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/visit) "tVg" = ( -/obj/structure/sign/warning/electric_shock{ - pixel_x = 32 - }, +/obj/structure/sign/warning/electric_shock/directional/east, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 }, @@ -73989,11 +73846,9 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/structure/chair/stool/directional/east, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/visit) "tVs" = ( -/obj/structure/sign/departments/chemistry{ - pixel_y = 32 - }, +/obj/structure/sign/departments/chemistry/directional/north, /obj/effect/turf_decal/tile/yellow{ dir = 4 }, @@ -74052,7 +73907,8 @@ /obj/machinery/door/airlock/mining/glass{ name = "Delivery Office" }, -/obj/effect/mapping_helpers/airlock/access/all/supply/general, +/obj/effect/mapping_helpers/airlock/access/any/supply/shipping, +/obj/effect/mapping_helpers/airlock/access/any/supply/mining, /turf/open/floor/iron, /area/station/cargo/sorting) "tWg" = ( @@ -74208,9 +74064,8 @@ "tYo" = ( /obj/machinery/light/small/directional/south, /obj/effect/spawner/random/structure/tank_holder, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "tYu" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ @@ -74239,7 +74094,7 @@ dir = 5 }, /turf/open/floor/plating/airless, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "tYX" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -74408,9 +74263,8 @@ dir = 8 }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood{ - icon_state = "wood-broken6" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/hallway/secondary/service) "uaF" = ( /obj/structure/cable, @@ -74426,7 +74280,7 @@ dir = 4 }, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/execution/transfer) "uaR" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -74601,7 +74455,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "ucW" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -74684,7 +74538,7 @@ "udI" = ( /obj/machinery/portable_atmospherics/canister/nitrogen, /turf/open/floor/iron/dark, -/area/station/science/storage) +/area/station/science/ordnance/storage) "uec" = ( /obj/structure/cable, /obj/machinery/door/firedoor, @@ -74853,9 +74707,7 @@ /turf/open/floor/iron/white, /area/station/medical/pharmacy) "ugB" = ( -/obj/structure/sign/warning/secure_area{ - pixel_y = -32 - }, +/obj/structure/sign/warning/secure_area/directional/south, /obj/structure/table/reinforced, /obj/machinery/computer/security/telescreen/minisat{ dir = 1 @@ -74953,13 +74805,12 @@ /turf/open/floor/iron, /area/station/medical/virology) "uhC" = ( -/obj/structure/cable, /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 }, -/obj/machinery/door/airlock/external{ - name = "Supply Dock Airlock" +/obj/machinery/door/airlock/external/glass{ + name = "Supply Door Airlock" }, /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -75012,7 +74863,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating/airless, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "uif" = ( /obj/machinery/door/airlock/research{ name = "Ordnance Lab" @@ -75034,7 +74885,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/science/ordnance_storage, /turf/open/floor/iron, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "uil" = ( /obj/effect/decal/cleanable/oil, /obj/effect/turf_decal/delivery, @@ -75062,7 +74913,7 @@ /obj/machinery/portable_atmospherics/canister, /obj/effect/turf_decal/box/red, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "uiP" = ( /obj/machinery/atmospherics/pipe/smart/manifold/dark/visible, /obj/effect/turf_decal/stripes/line{ @@ -75097,7 +74948,7 @@ dir = 8 }, /turf/open/floor/iron, -/area/station/security/execution/transfer) +/area/station/security/processing) "uko" = ( /obj/structure/bookcase/random/fiction, /turf/open/floor/wood, @@ -75107,7 +74958,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/door/poddoor/shutters{ id = "custodialshutters"; - name = "Custodial Closet Shutters" + name = "Custodial Closet Shutters"; + dir = 1 }, /turf/open/floor/iron/dark/textured_half, /area/station/service/janitor) @@ -75136,7 +74988,7 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "ulb" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -75170,12 +75022,21 @@ /obj/machinery/door/firedoor/border_only, /turf/open/floor/wood, /area/station/service/theater) +"ulJ" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/obj/machinery/door/poddoor/preopen{ + id = "brigprison"; + name = "Prison Blast Door" + }, +/turf/open/floor/plating, +/area/station/security/prison/work) "ulN" = ( /obj/machinery/light/directional/north, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "ulQ" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -75421,7 +75282,7 @@ "uoK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/closed/wall/r_wall, -/area/station/science/storage) +/area/station/science/ordnance/burnchamber) "uoO" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -75669,7 +75530,7 @@ /area/station/maintenance/port/aft) "usu" = ( /turf/closed/wall/r_wall, -/area/station/science/storage) +/area/station/science/ordnance) "usB" = ( /obj/machinery/hydroponics/soil, /obj/effect/decal/cleanable/dirt, @@ -75677,10 +75538,9 @@ pixel_x = -30 }, /obj/machinery/light/directional/west, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/station/security/prison) +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/station/security/prison/garden) "usD" = ( /obj/structure/cable, /obj/effect/landmark/start/depsec/engineering, @@ -75716,7 +75576,7 @@ "usK" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, -/area/station/security/execution/transfer) +/area/station/security/processing) "usR" = ( /obj/structure/window/reinforced{ dir = 1 @@ -75745,7 +75605,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/security/execution/transfer) +/area/station/security/processing) "utN" = ( /obj/machinery/atmospherics/pipe/smart/simple/green/visible{ dir = 4 @@ -75933,7 +75793,7 @@ dir = 4 }, /turf/open/floor/iron, -/area/station/security/execution/transfer) +/area/station/security/processing) "uww" = ( /obj/structure/table/wood/poker, /obj/effect/decal/cleanable/dirt, @@ -75992,7 +75852,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/security/brig, /turf/open/floor/iron, -/area/station/security/execution/transfer) +/area/station/security/processing) "uxc" = ( /obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/purple, @@ -76126,7 +75986,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, -/area/station/science/misc_lab/range) +/area/station/science/auxlab) "uyf" = ( /obj/structure/table/reinforced, /obj/item/stock_parts/matter_bin{ @@ -76419,9 +76279,8 @@ "uDs" = ( /obj/effect/decal/cleanable/blood/old, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/wood{ - icon_state = "wood-broken" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/service/library/abandoned) "uDt" = ( /obj/effect/turf_decal/tile/blue, @@ -76699,7 +76558,6 @@ /turf/open/floor/iron/white, /area/station/science/lobby) "uIm" = ( -/obj/structure/cable, /obj/effect/turf_decal/delivery, /obj/structure/closet/crate{ icon_state = "crateopen" @@ -76737,7 +76595,7 @@ /area/station/commons/fitness/recreation) "uIO" = ( /turf/closed/wall/r_wall, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/freezerchamber) "uIR" = ( /obj/item/kirbyplants{ icon_state = "plant-21" @@ -76796,7 +76654,7 @@ network = list("ss13","rd") }, /turf/open/floor/iron/white, -/area/station/science/storage) +/area/station/science/ordnance/storage) "uKa" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple{ dir = 6 @@ -76902,7 +76760,7 @@ dir = 8 }, /turf/open/floor/iron/dark/airless, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/freezerchamber) "uLj" = ( /obj/machinery/holopad, /obj/effect/turf_decal/bot, @@ -76954,7 +76812,8 @@ /obj/machinery/door/firedoor, /obj/machinery/door/poddoor/shutters/preopen{ id = "cafe_counter"; - name = "Kitchen Counter Shutters" + name = "Kitchen Counter Shutters"; + dir = 8 }, /obj/structure/desk_bell{ pixel_x = -7; @@ -77028,7 +76887,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, -/area/station/security/prison/safe) +/area/station/security/prison/toilet) "uNr" = ( /obj/machinery/status_display/evac/directional/south, /obj/structure/cable, @@ -77327,9 +77186,8 @@ "uQh" = ( /obj/effect/decal/cleanable/dirt, /obj/item/radio/intercom/directional/east, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/commons/toilet/restrooms) "uQk" = ( /turf/open/floor/engine/o2, @@ -77349,9 +77207,7 @@ /turf/open/floor/iron, /area/station/commons/storage/primary) "uQx" = ( -/obj/structure/sign/warning/secure_area{ - pixel_y = -32 - }, +/obj/structure/sign/warning/secure_area/directional/south, /obj/effect/turf_decal/bot, /obj/structure/closet/l3closet/virology, /turf/open/floor/iron, @@ -77457,9 +77313,8 @@ c_tag = "Permabrig - Workroom"; network = list("ss13","prison") }, -/obj/item/radio/intercom/prison/directional/west, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/work) "uRU" = ( /obj/effect/turf_decal/tile/neutral, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -77505,7 +77360,7 @@ /obj/machinery/light/directional/east, /mob/living/simple_animal/mouse/white, /turf/open/floor/iron/cafeteria, -/area/station/security/prison) +/area/station/security/prison/mess) "uSp" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -77636,11 +77491,6 @@ }, /turf/open/floor/iron, /area/station/security/warden) -"uUz" = ( -/obj/structure/cable, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/station/cargo/miningoffice) "uUA" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/rack, @@ -77725,9 +77575,7 @@ /obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ dir = 5 }, -/obj/structure/sign/warning/secure_area{ - pixel_y = -32 - }, +/obj/structure/sign/warning/secure_area/directional/south, /obj/machinery/light/directional/south, /obj/effect/turf_decal/trimline/yellow/filled/line, /turf/open/floor/iron, @@ -77830,7 +77678,7 @@ /obj/machinery/light/directional/north, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "uWu" = ( /obj/machinery/door/window{ base_state = "rightsecure"; @@ -77890,14 +77738,14 @@ network = list("ss13","prison") }, /turf/open/floor/iron/cafeteria, -/area/station/security/prison) +/area/station/security/prison/mess) "uXw" = ( /obj/machinery/door/firedoor/heavy, /obj/effect/turf_decal/stripes/line{ dir = 8 }, /turf/open/floor/iron/white, -/area/station/science/storage) +/area/station/science/ordnance/storage) "uXB" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron{ @@ -78091,7 +77939,7 @@ dir = 4 }, /turf/open/floor/iron/white, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "uZY" = ( /obj/structure/cable, /obj/machinery/door/airlock/external{ @@ -78120,7 +77968,7 @@ dir = 4 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "vac" = ( /obj/structure/closet/l3closet/virology{ pixel_y = 1 @@ -78309,7 +78157,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "vcD" = ( /obj/effect/decal/cleanable/cobweb, /obj/effect/decal/cleanable/dirt, @@ -78476,9 +78324,7 @@ /turf/closed/wall, /area/station/medical/treatment_center) "veY" = ( -/obj/structure/sign/warning/secure_area{ - pixel_x = 32 - }, +/obj/structure/sign/warning/secure_area/directional/east, /turf/closed/wall/r_wall, /area/station/engineering/transit_tube) "vfk" = ( @@ -78518,7 +78364,7 @@ /obj/machinery/firealarm/directional/west, /obj/machinery/light/directional/west, /turf/open/floor/iron/white, -/area/station/science/storage) +/area/station/science/ordnance/storage) "vfP" = ( /obj/machinery/door/airlock/public/glass{ name = "Holodeck Access" @@ -78754,7 +78600,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /turf/open/floor/iron/white, -/area/station/science/storage) +/area/station/science/ordnance/storage) "viO" = ( /obj/structure/cable, /obj/effect/turf_decal/delivery, @@ -78823,6 +78669,9 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/science/research) +"vjV" = ( +/turf/open/floor/plating, +/area/station/security/execution/transfer) "vke" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -78991,7 +78840,8 @@ }, /obj/machinery/door/firedoor, /obj/machinery/door/poddoor/shutters/window/preopen{ - id = "left_arrivals_shutters" + id = "left_arrivals_shutters"; + dir = 1 }, /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -79000,10 +78850,9 @@ /turf/open/floor/iron, /area/station/hallway/secondary/entry) "vng" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, -/area/station/security/prison) +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/security/execution/transfer) "vno" = ( /turf/closed/wall, /area/station/service/kitchen/abandoned) @@ -79118,7 +78967,7 @@ }, /obj/machinery/airalarm/directional/north, /turf/open/floor/iron/white, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "voE" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -79134,7 +78983,7 @@ dir = 5 }, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "vpi" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -79149,7 +78998,8 @@ }, /obj/machinery/door/poddoor/shutters/preopen{ id = "cafe_counter"; - name = "Kitchen Counter Shutters" + name = "Kitchen Counter Shutters"; + dir = 8 }, /turf/open/floor/iron/white/smooth_half{ dir = 1 @@ -79237,7 +79087,7 @@ /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/firedoor/heavy, /turf/open/floor/plating, -/area/station/science/storage) +/area/station/science/ordnance/storage) "vqr" = ( /obj/machinery/computer/secure_data{ dir = 8 @@ -79282,7 +79132,7 @@ /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/south, /turf/open/floor/iron/white, -/area/station/science/misc_lab/range) +/area/station/science/auxlab) "vqJ" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -79311,10 +79161,13 @@ "vqM" = ( /obj/structure/reflector/single, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/engineering/supermatter/room) +"vqS" = ( +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/security/prison) "vqY" = ( /obj/effect/landmark/start/hangover, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -79357,7 +79210,7 @@ dir = 8 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/work) "vrN" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -79609,7 +79462,7 @@ dir = 10 }, /turf/open/floor/iron/white, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "vvJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -79700,9 +79553,8 @@ /obj/structure/disposalpipe/segment{ dir = 6 }, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/department/crew_quarters/bar) "vwC" = ( /obj/effect/decal/cleanable/dirt, @@ -79763,8 +79615,9 @@ "vwY" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/structure/chair/stool/directional/north, +/obj/machinery/airalarm/directional/west, /turf/open/floor/iron/cafeteria, -/area/station/security/prison) +/area/station/security/prison/mess) "vwZ" = ( /obj/structure/window/reinforced{ dir = 8 @@ -79827,7 +79680,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "vxL" = ( /obj/structure/barricade/wooden, /obj/effect/spawner/structure/window/reinforced, @@ -79953,7 +79806,7 @@ "vzF" = ( /obj/machinery/rnd/experimentor, /turf/open/floor/engine, -/area/station/science/misc_lab) +/area/station/science/explab) "vzK" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -80122,7 +79975,7 @@ "vBN" = ( /obj/machinery/portable_atmospherics/canister/carbon_dioxide, /turf/open/floor/iron/dark, -/area/station/science/storage) +/area/station/science/ordnance/storage) "vBR" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/structure/chair/office{ @@ -80212,9 +80065,7 @@ /turf/open/floor/iron/dark, /area/station/science/xenobiology) "vCD" = ( -/obj/structure/sign/warning/biohazard{ - pixel_y = -32 - }, +/obj/structure/sign/warning/biohazard/directional/south, /obj/effect/turf_decal/bot, /obj/machinery/shower{ dir = 4 @@ -80240,7 +80091,7 @@ }, /obj/item/multitool/circuit, /turf/open/floor/iron/dark, -/area/station/science/misc_lab) +/area/station/science/explab) "vCM" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -80269,7 +80120,7 @@ }, /obj/machinery/door/window/right/directional/north{ name = "Incoming Mail"; - req_access = list("mail_sorting") + req_access = list("shipping") }, /turf/open/floor/iron, /area/station/cargo/sorting) @@ -80381,7 +80232,7 @@ /obj/structure/window/reinforced, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "vEy" = ( /obj/machinery/telecomms/server/presets/medical, /obj/effect/turf_decal/tile/blue/anticorner/contrasted{ @@ -80410,7 +80261,7 @@ dir = 4 }, /turf/open/floor/plating/airless, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "vER" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/security/glass{ @@ -80427,7 +80278,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "vFa" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -80775,7 +80626,8 @@ "vKQ" = ( /obj/machinery/door/poddoor/shutters{ id = "construction"; - name = "Construction Shutters" + name = "Construction Shutters"; + dir = 8 }, /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -80851,9 +80703,8 @@ "vLC" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/wood{ - icon_state = "wood-broken" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/security/detectives_office/private_investigators_office) "vLH" = ( /obj/structure/table/reinforced, @@ -80896,7 +80747,7 @@ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "vLP" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -80967,9 +80818,8 @@ /area/station/medical/chemistry) "vMu" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood{ - icon_state = "wood-broken6" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/service/theater/abandoned) "vMx" = ( /obj/item/kirbyplants/random, @@ -81052,7 +80902,7 @@ dir = 8 }, /turf/open/floor/iron, -/area/station/science/misc_lab/range) +/area/station/science/auxlab) "vNB" = ( /obj/structure/table/optable, /obj/effect/decal/cleanable/blood/old, @@ -81070,7 +80920,7 @@ }, /obj/effect/turf_decal/box, /turf/open/floor/iron/dark, -/area/station/science/storage) +/area/station/science/ordnance/storage) "vNU" = ( /obj/structure/cable, /obj/machinery/firealarm/directional/south{ @@ -81544,7 +81394,7 @@ }, /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron, -/area/station/security/execution/transfer) +/area/station/security/processing) "vUJ" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/purple/fourcorners, @@ -81562,7 +81412,7 @@ /obj/effect/turf_decal/delivery, /obj/machinery/door/window/right/directional/south{ name = "Delivery Office Desk"; - req_access = list("mail_sorting") + req_access = list("shipping") }, /obj/structure/desk_bell{ pixel_x = 7 @@ -81743,7 +81593,7 @@ /area/station/hallway/secondary/service) "vWw" = ( /turf/closed/indestructible/opshuttle, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "vWA" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/structure/girder, @@ -81763,9 +81613,8 @@ /turf/open/floor/iron, /area/station/hallway/primary/starboard) "vXc" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/engineering/supermatter/room) "vXo" = ( /obj/effect/decal/cleanable/dirt, @@ -81936,7 +81785,7 @@ /obj/machinery/atmospherics/pipe/smart/simple/purple/visible, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "vZo" = ( /obj/machinery/smartfridge, /obj/effect/turf_decal/bot, @@ -82310,8 +82159,9 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, /turf/open/floor/iron/white, -/area/station/security/prison/safe) +/area/station/security/prison/toilet) "wda" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -82334,7 +82184,8 @@ /obj/item/storage/fancy/donut_box, /obj/machinery/door/poddoor/shutters/preopen{ id = "cafe_counter"; - name = "Kitchen Counter Shutters" + name = "Kitchen Counter Shutters"; + dir = 8 }, /turf/open/floor/iron/white/smooth_half{ dir = 1 @@ -82528,9 +82379,7 @@ /turf/open/floor/iron, /area/station/cargo/storage) "wfF" = ( -/obj/structure/sign/departments/medbay/alt{ - pixel_x = 32 - }, +/obj/structure/sign/departments/medbay/alt/directional/east, /obj/machinery/modular_computer/console/preset/civilian{ dir = 8 }, @@ -83079,7 +82928,7 @@ dir = 4 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "wnc" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/blood/old, @@ -83383,7 +83232,8 @@ /obj/structure/table/reinforced, /obj/machinery/door/poddoor/shutters{ id = "commissaryshutters"; - name = "Vacant Commissary Shutters" + name = "Vacant Commissary Shutters"; + dir = 4 }, /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -83475,7 +83325,7 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "wsD" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -83486,7 +83336,7 @@ "wsO" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer2, /turf/open/floor/iron/dark/airless, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/freezerchamber) "wte" = ( /obj/machinery/light/small/directional/south, /obj/effect/turf_decal/tile/brown/half/contrasted, @@ -83597,13 +83447,13 @@ dir = 4 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "wuP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /turf/open/floor/iron/white, -/area/station/science/storage) +/area/station/science/ordnance/storage) "wuZ" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -83661,9 +83511,7 @@ /turf/open/floor/iron, /area/station/cargo/storage) "wvf" = ( -/obj/structure/sign/warning/no_smoking/circle{ - pixel_y = -32 - }, +/obj/structure/sign/warning/no_smoking/circle/directional/south, /obj/machinery/camera/directional/south, /obj/machinery/disposal/bin, /obj/effect/turf_decal/box, @@ -84126,7 +83974,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "wAW" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -84617,7 +84465,7 @@ /obj/item/storage/bag/tray/cafeteria, /obj/item/storage/bag/tray/cafeteria, /turf/open/floor/plating, -/area/station/security/prison) +/area/station/security/prison/mess) "wJa" = ( /obj/machinery/light/small/directional/west, /turf/open/floor/engine/vacuum, @@ -84647,7 +84495,8 @@ "wJz" = ( /obj/machinery/door/firedoor, /obj/machinery/door/poddoor/shutters/window/preopen{ - id = "right_arrivals_shutters" + id = "right_arrivals_shutters"; + dir = 1 }, /obj/machinery/light/directional/east, /obj/effect/turf_decal/stripes/line, @@ -84717,7 +84566,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "wKl" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -84785,7 +84634,7 @@ dir = 5 }, /turf/open/floor/iron/white, -/area/station/science/storage) +/area/station/science/ordnance/storage) "wKV" = ( /obj/structure/table/reinforced, /obj/item/crowbar, @@ -84801,7 +84650,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/mapping_helpers/airlock/access/all/security/brig, /turf/open/floor/plating, -/area/station/security/prison) +/area/station/security/execution/transfer) "wLE" = ( /obj/machinery/door/firedoor/heavy, /obj/machinery/door/airlock/research{ @@ -84819,7 +84668,7 @@ /obj/effect/turf_decal/stripes/line, /obj/effect/mapping_helpers/airlock/access/all/science/ordnance, /turf/open/floor/iron, -/area/station/science/mixing) +/area/station/science/ordnance) "wLK" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ @@ -84885,7 +84734,7 @@ dir = 10 }, /turf/open/floor/plating/airless, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "wNk" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/delivery, @@ -85013,9 +84862,8 @@ "wPC" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/wood{ - icon_state = "wood-broken6" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/service/library/abandoned) "wPN" = ( /obj/structure/closet/crate, @@ -85026,6 +84874,8 @@ /obj/item/storage/dice, /obj/item/toy/cards/deck/tarot, /obj/machinery/light/directional/south, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/south, /turf/open/floor/iron, /area/station/security/prison) "wPV" = ( @@ -85357,7 +85207,7 @@ dir = 1 }, /turf/open/floor/plating/airless, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "wUE" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/half/contrasted{ @@ -85374,7 +85224,8 @@ "wUQ" = ( /obj/machinery/door/poddoor/shutters/preopen{ id = "hopline"; - name = "Queue Shutters" + name = "Queue Shutters"; + dir = 8 }, /obj/effect/landmark/event_spawn, /obj/machinery/ticket_machine/directional/north, @@ -85462,9 +85313,8 @@ dir = 8 }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood{ - icon_state = "wood-broken4" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/service/theater) "wWH" = ( /obj/machinery/door/firedoor, @@ -85527,7 +85377,7 @@ /obj/effect/turf_decal/stripes/line, /obj/effect/mapping_helpers/airlock/access/all/science/ordnance, /turf/open/floor/iron/dark/airless, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/freezerchamber) "wXq" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -85562,7 +85412,6 @@ /turf/closed/wall/r_wall, /area/station/medical/virology) "wYJ" = ( -/obj/structure/cable, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, @@ -85954,7 +85803,7 @@ dir = 8 }, /turf/open/floor/iron, -/area/station/security/execution/transfer) +/area/station/security/processing) "xds" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -86035,7 +85884,7 @@ dir = 1 }, /turf/open/floor/plating/airless, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "xee" = ( /obj/effect/turf_decal/tile/blue{ dir = 1 @@ -86090,9 +85939,7 @@ /obj/structure/closet/emcloset/anchored, /obj/effect/turf_decal/bot, /obj/machinery/light/small/directional/north, -/obj/structure/sign/warning/vacuum{ - pixel_y = 32 - }, +/obj/structure/sign/warning/vacuum/directional/north, /turf/open/floor/iron, /area/station/construction/mining/aux_base) "xev" = ( @@ -86181,11 +86028,9 @@ dir = 8 }, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/execution/transfer) "xfk" = ( -/obj/structure/sign/warning/secure_area{ - pixel_x = -32 - }, +/obj/structure/sign/warning/secure_area/directional/west, /obj/machinery/light/small/directional/west, /obj/structure/cable, /obj/effect/turf_decal/stripes/line{ @@ -86194,9 +86039,9 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "xfp" = ( -/obj/machinery/gravity_generator/main/station, +/obj/machinery/gravity_generator/main, /obj/effect/turf_decal/bot_white, /obj/effect/turf_decal/tile/neutral/half, /obj/effect/turf_decal/tile/neutral/half{ @@ -86228,6 +86073,12 @@ /obj/item/flashlight/lamp, /turf/open/floor/iron/grimy, /area/station/command/heads_quarters/ce) +"xgv" = ( +/turf/closed/wall/r_wall, +/area/station/science/ordnance/storage) +"xgA" = ( +/turf/closed/wall/r_wall, +/area/station/security/prison/garden) "xgE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/field/generator, @@ -86278,7 +86129,7 @@ dir = 4 }, /turf/open/floor/iron, -/area/station/security/execution/transfer) +/area/station/security/processing) "xhd" = ( /obj/effect/turf_decal/delivery, /turf/open/floor/iron, @@ -86314,7 +86165,7 @@ pixel_y = 7 }, /turf/open/floor/plating, -/area/station/security/prison) +/area/station/security/prison/mess) "xhp" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -86381,7 +86232,7 @@ }, /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron, -/area/station/security/execution/transfer) +/area/station/security/processing) "xhW" = ( /turf/closed/wall, /area/station/cargo/sorting) @@ -86529,6 +86380,9 @@ }, /turf/open/floor/iron/white, /area/station/science/lobby) +"xma" = ( +/turf/closed/wall, +/area/station/security/prison/visit) "xmc" = ( /obj/structure/rack, /obj/effect/decal/cleanable/dirt, @@ -86587,7 +86441,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "xna" = ( /obj/effect/turf_decal/siding/wood/corner{ dir = 4 @@ -86658,7 +86512,7 @@ /obj/effect/turf_decal/trimline/green/end{ dir = 1 }, -/obj/item/reagent_containers/glass/bucket, +/obj/item/reagent_containers/glass/watering_can, /obj/effect/turf_decal/trimline/green/mid_joiner{ dir = 8 }, @@ -86790,14 +86644,20 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron/dark, /area/station/commons/fitness/recreation) +"xpi" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/security/prison/work) "xpj" = ( /obj/machinery/hydroponics/soil, /obj/effect/decal/cleanable/dirt, /obj/item/shovel/spade, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/station/security/prison) +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/station/security/prison/garden) "xpm" = ( /obj/structure/window/reinforced, /obj/structure/window/reinforced{ @@ -86842,7 +86702,7 @@ pixel_y = -30 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/visit) "xpE" = ( /obj/effect/turf_decal/trimline/yellow/filled/warning{ dir = 4 @@ -86903,9 +86763,7 @@ dir = 8 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/sign/warning/secure_area{ - pixel_x = -32 - }, +/obj/structure/sign/warning/secure_area/directional/west, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/light/directional/west, /obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible, @@ -86938,6 +86796,7 @@ dir = 1 }, /obj/effect/turf_decal/caution/stand_clear, +/obj/structure/cable, /turf/open/floor/iron, /area/station/cargo/miningoffice) "xqW" = ( @@ -87031,9 +86890,8 @@ "xsp" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "xsq" = ( /obj/structure/table, @@ -87059,7 +86917,8 @@ /obj/item/clothing/head/chefhat, /obj/machinery/door/poddoor/shutters/preopen{ id = "cafe_counter"; - name = "Kitchen Counter Shutters" + name = "Kitchen Counter Shutters"; + dir = 8 }, /turf/open/floor/iron/white/smooth_half{ dir = 1 @@ -87069,6 +86928,7 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, /turf/open/floor/plating, /area/station/security/prison) "xsG" = ( @@ -87211,7 +87071,8 @@ }, /obj/machinery/door/poddoor/shutters/preopen{ id = "rndlab1"; - name = "Research and Development Shutter" + name = "Research and Development Shutter"; + dir = 1 }, /obj/effect/turf_decal/delivery, /obj/structure/desk_bell{ @@ -87396,9 +87257,6 @@ /obj/effect/mapping_helpers/airlock/access/all/command/eva, /turf/open/floor/iron, /area/station/ai_monitored/command/storage/eva) -"xwI" = ( -/turf/closed/wall/r_wall, -/area/station/science/mixing) "xwK" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -87501,7 +87359,7 @@ dir = 4 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "xxB" = ( /turf/closed/wall, /area/station/cargo/lobby) @@ -87520,8 +87378,12 @@ }, /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, +/obj/item/computer_hardware/hard_drive/portable/scipaper_program{ + pixel_x = 4; + pixel_y = 1 + }, /turf/open/floor/iron/white, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "xxH" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/moisture_trap, @@ -87565,9 +87427,7 @@ /obj/structure/disposalpipe/trunk{ dir = 1 }, -/obj/structure/sign/warning/deathsposal{ - pixel_y = -32 - }, +/obj/structure/sign/warning/deathsposal/directional/south, /obj/machinery/disposal/bin, /obj/effect/turf_decal/bot, /obj/machinery/light/directional/south, @@ -87749,10 +87609,10 @@ /obj/machinery/portable_atmospherics/scrubber, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "xAl" = ( /turf/closed/wall/r_wall, -/area/station/science/misc_lab/range) +/area/station/science/auxlab) "xAo" = ( /turf/closed/wall, /area/station/security/detectives_office/private_investigators_office) @@ -87798,7 +87658,7 @@ /obj/machinery/seed_extractor, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/garden) "xBj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/table/wood, @@ -87913,7 +87773,7 @@ /obj/machinery/component_printer, /obj/effect/turf_decal/bot, /turf/open/floor/iron/dark, -/area/station/science/misc_lab) +/area/station/science/explab) "xCC" = ( /obj/structure/table, /obj/effect/decal/cleanable/dirt, @@ -87936,7 +87796,7 @@ /obj/structure/cable, /obj/machinery/light/directional/south, /turf/open/floor/iron/white, -/area/station/science/storage) +/area/station/science/ordnance/storage) "xDc" = ( /obj/effect/landmark/start/hangover, /obj/effect/decal/cleanable/dirt, @@ -87966,7 +87826,7 @@ dir = 8 }, /turf/open/floor/iron/white, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "xDi" = ( /obj/machinery/status_display/evac/directional/south, /obj/machinery/camera/directional/south{ @@ -88097,7 +87957,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/security/brig, /turf/open/floor/iron, -/area/station/security/execution/transfer) +/area/station/security/processing) "xEA" = ( /obj/effect/landmark/event_spawn, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -88374,9 +88234,8 @@ /area/station/science/xenobiology) "xHW" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/engineering/supermatter/room) "xIb" = ( /obj/effect/turf_decal/bot, @@ -88432,6 +88291,7 @@ dir = 1 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/tech_storage, +/obj/effect/mapping_helpers/airlock/access/all/command/general, /turf/open/floor/iron, /area/station/engineering/storage/tech) "xJw" = ( @@ -88559,10 +88419,16 @@ /obj/structure/extinguisher_cabinet/directional/north{ pixel_x = 32 }, -/obj/item/radio/intercom/directional/east, +/obj/item/radio/intercom/directional/east{ + pixel_y = 3 + }, /obj/effect/turf_decal/tile/brown/anticorner/contrasted{ dir = 4 }, +/obj/machinery/keycard_auth/directional/east{ + pixel_x = 25; + pixel_y = -8 + }, /turf/open/floor/iron, /area/station/cargo/qm) "xLi" = ( @@ -88679,9 +88545,8 @@ /area/station/service/chapel/funeral) "xMQ" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/engineering/supermatter/room) "xMX" = ( /obj/structure/chair/office{ @@ -88826,7 +88691,7 @@ dir = 4 }, /turf/open/floor/iron, -/area/station/security/execution/transfer) +/area/station/security/processing) "xOv" = ( /obj/machinery/status_display/evac/directional/west, /obj/structure/table/wood, @@ -88914,7 +88779,7 @@ dir = 1 }, /turf/open/floor/iron, -/area/station/security/execution/transfer) +/area/station/security/processing) "xPt" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -88945,7 +88810,7 @@ /area/station/security/prison) "xPA" = ( /turf/open/floor/engine, -/area/station/science/misc_lab) +/area/station/science/explab) "xPM" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -88961,7 +88826,8 @@ "xPO" = ( /obj/machinery/door/poddoor/shutters{ id = "evashutters2"; - name = "E.V.A. Storage Shutters" + name = "E.V.A. Storage Shutters"; + dir = 1 }, /obj/structure/barricade/wooden, /obj/effect/turf_decal/stripes/line, @@ -89272,10 +89138,10 @@ dir = 8 }, /obj/machinery/light/directional/east, -/obj/machinery/status_display/ai/directional/east, /obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 4 }, +/obj/item/radio/intercom/directional/east, /turf/open/floor/iron, /area/station/cargo/qm) "xUL" = ( @@ -89304,7 +89170,7 @@ /obj/structure/table/reinforced, /obj/item/mmi, /turf/open/floor/iron/dark, -/area/station/science/misc_lab) +/area/station/science/explab) "xVa" = ( /obj/effect/landmark/start/hangover, /obj/effect/turf_decal/tile/neutral{ @@ -89477,7 +89343,7 @@ dir = 9 }, /turf/open/floor/plating/airless, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "xXm" = ( /obj/machinery/light/small/directional/south, /obj/machinery/camera/directional/south{ @@ -89516,9 +89382,7 @@ /turf/open/floor/iron, /area/station/science/research) "xXZ" = ( -/obj/structure/sign/warning/radiation{ - pixel_y = 32 - }, +/obj/structure/sign/warning/radiation/directional/north, /turf/open/floor/engine, /area/station/engineering/supermatter) "xYl" = ( @@ -89696,9 +89560,8 @@ /obj/effect/decal/cleanable/dirt, /obj/item/folder, /obj/item/pen, -/turf/open/floor/wood{ - icon_state = "wood-broken5" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/service/library/abandoned) "ybJ" = ( /obj/structure/disposalpipe/segment, @@ -89835,7 +89698,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "ydL" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -90109,7 +89972,7 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/portable_atmospherics/canister/oxygen, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "yhJ" = ( /turf/open/floor/plating/airless, /area/space/nearstation) @@ -90143,7 +90006,7 @@ dir = 1 }, /turf/open/floor/iron, -/area/station/science/misc_lab/range) +/area/station/science/auxlab) "yie" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -90405,7 +90268,7 @@ }, /obj/item/analyzer, /turf/open/floor/iron/white, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "ymi" = ( /obj/machinery/light/directional/south, /obj/item/kirbyplants/random, @@ -111911,7 +111774,7 @@ geZ rxm vWD hva -dmo +iJR pBY lEL nzq @@ -114693,7 +114556,7 @@ wbE wbE whv rdS -lBn +oWt xgt oTH gQV @@ -114950,7 +114813,7 @@ vPe oGb nvO blj -lBn +oWt rPn bIm ayh @@ -115466,7 +115329,7 @@ lGF tFM iBR iBR -lBn +rCE iBR iBR tqo @@ -119389,7 +119252,7 @@ pFd qQM vLI beE -oqd +exr uko wPC mmq @@ -119646,7 +119509,7 @@ brY dBs bvP sjK -ioy +pLb epp skP hww @@ -120420,7 +120283,7 @@ bWn mmq wgL pLI -iRB +pLb jhu gLj jPy @@ -120552,7 +120415,7 @@ tDs izG fIf oLz -lai +fIf msx oYs llW @@ -120674,7 +120537,7 @@ xcK qQM iMy sjK -ksn +pLb wgL wgL jPy @@ -121434,7 +121297,7 @@ swT sXZ sXZ sXZ -uIO +swT kzc wLE kzc @@ -121687,11 +121550,11 @@ cSQ vfK cEV cEV -usu +bpC iRS rOk iRS -uIO +bpC vxB ukS bfu @@ -121944,11 +121807,11 @@ cSQ rUa cEV cEV -usu +bpC eLa mDv cso -uIO +bpC owh qtb chV @@ -122201,11 +122064,11 @@ cSQ rUa udI udI -usu +bpC qYH rqo jBU -uIO +bpC ulN qtb lox @@ -122715,11 +122578,11 @@ vNK rUa vBN gMx -usu +bpC qYH cUL jBU -uIO +bpC ivN wsC ucE @@ -122966,7 +122829,7 @@ lSP qsy uif qsy -usu +xgv ihs uXw fjb @@ -123263,7 +123126,7 @@ qQM qQM kZc kZc -fmX +ccx kZc kZc qYo @@ -123486,7 +123349,7 @@ nZL viG wuP xCQ -xwI +usu mGn vLO rVi @@ -127005,7 +126868,7 @@ ffN vnU bTy eex -pPD +wWD byn wWD xLQ @@ -127082,7 +126945,7 @@ nCj kQf rLb apU -bhp +qFN jjQ jKq uGV @@ -127323,7 +127186,7 @@ lYL tMn fAp jHn -oGv +lzA wVy ldO lwD @@ -127339,7 +127202,7 @@ unL gaB sVI hxH -bhp +qFN tGp xzc bcp @@ -127837,7 +127700,7 @@ lYL mTS vTq mhV -oGv +lzA shW frS aET @@ -127853,7 +127716,7 @@ gXX rbu hJM bPG -bhp +qFN tGp hWG kny @@ -128078,7 +127941,7 @@ kxs oCs aad aad -lkg +kIJ rLQ jTu rsI @@ -128367,7 +128230,7 @@ dok dok dok rnQ -bhp +qFN wZW lZz evO @@ -128849,7 +128712,7 @@ ans fog qII kxs -lkg +kIJ fVd nOb nqP @@ -129877,7 +129740,7 @@ mpf vuz iwn jiC -lkg +kIJ fVd nhJ taO @@ -130648,7 +130511,7 @@ jiC oCs aad aad -lkg +kIJ ing dsz gDZ @@ -135735,7 +135598,7 @@ iGd iGd apY awl -otS +ivt iHf ggo oSJ @@ -135991,7 +135854,7 @@ egU jPz egU aEr -awl +qDK uIm iHf xdE @@ -136075,11 +135938,11 @@ syo gct cwe jhY -lUu +bwC pLt -lUu +bwC loe -lUu +bwC loe loe loe @@ -136235,21 +136098,21 @@ axr vQh hIs kic +tDx +tDx jrp -tDH -tDH -tDH +tDx xDW fKx -tDx +jrp ipu sSh -tDH -tDH -tDH -tDH -tDH -tDH +tDx +jrp +tDx +tDx +jrp +tDx cez sNy pDD @@ -136495,25 +136358,25 @@ kic aad aad aad -mpJ +tDx xEO bti cCj bti sJi -mpJ +tDx aad aad aad aad aad -rje +cez sEi buT jCx iTM tDU -rje +iHf jfO jBM xVv @@ -136521,7 +136384,7 @@ qkk rht rgC tDD -uUz +rWo aad aaa aaa @@ -136752,13 +136615,13 @@ kic aaa aaa aaa -tDH -bZR +tDx +xDW uhC -tDH +tDx uhC bFy -tDH +tDx aaa aaa aaa @@ -136770,15 +136633,15 @@ jGR eGI jGR ear -rje -uUz -uUz -dHK +iHf +rWo +rWo +rWo ddr rWo -uUz -uUz -uUz +rWo +rWo +rWo aad aaa aaa @@ -137027,13 +136890,13 @@ iwW uni oif hqC -rje +iHf aad -uUz +rWo juo iNd fvC -uUz +rWo aad aad aad @@ -137543,11 +137406,11 @@ rSD rje aad aaa -uUz -uUz +rWo +rWo dqv -uUz -uUz +rWo +rWo aaa aaa aaa @@ -139350,16 +139213,16 @@ aaa aad fpY fpY -qIH +kxB fpY uwS fpY -qIH +kxB fpY pLM fpY -gJk -gJk +sjC +sjC dCk dCk dCk @@ -139605,13 +139468,13 @@ aad aad aad aad -jrA +rev tRt gNS jbb xdh cUQ -qIH +kxB rxF xdh jbb @@ -139862,7 +139725,7 @@ lET hyE hyE hyE -qIH +kxB prL gzM nRZ @@ -140104,33 +139967,33 @@ aad aaa aaa aaa -qWZ -qWZ -qWZ -qWZ -qWZ -qWZ -omM -omM -qWZ -qWZ +qIH +qIH +qIH +qIH +qIH +qIH +jrA +jrA +qIH +qIH aaa lET euZ kgE vgA -qIH +kxB xha usK oZL xPm gnX -jrA +rev fJu eYx tTu vUI -jrA +rev pkN lim lim @@ -140366,28 +140229,28 @@ nWj xfi ajo lww -omM +jrA nSD sXc eDJ -qWZ +qIH aaa lET wEz uKI aBu -qIH +kxB qtG fWd utq fCA iNZ -qIH +kxB qhH ihD cdm xhT -qIH +kxB hOz hOz hOz @@ -140627,24 +140490,24 @@ lfP pJO lku kZz -qWZ +qIH aad lET wam khv jru -qIH +kxB gZT flx jWt fCA nDq -jrA +rev izV ixV jxT kYR -qIH +kxB hFT lnt qhX @@ -140883,25 +140746,25 @@ uaQ hga pVH iKX -qWZ -qWZ +qIH +qIH aaa lET xnm khv wGJ -qIH +kxB tiO eNq bSh eNq cAo -qIH +kxB uwv kFb lyk tON -qIH +kxB twP qUr lnx @@ -141122,43 +140985,43 @@ aaa aaa abj aad -qWZ -qWZ -hLe -hLe -hLe -hLe -qWZ -qWZ -qWZ +qIH +qIH +eSN +eSN +eSN +eSN +qIH +qIH +qIH wLe -qWZ -qWZ -qWZ -qWZ -qWZ -qWZ +qIH +qIH +qIH +qIH +qIH +qIH kPf meD -qWZ -qWZ -qWZ +qIH +qIH +qIH lET pWT pVm pgs -qIH -jrA -jrA +kxB +rev +rev xOu -jrA -jrA -qIH -qIH +rev +rev +kxB +kxB dlI -qIH -qIH -qIH +kxB +kxB +kxB iDc iuQ iDc @@ -141379,21 +141242,21 @@ qYo qYo qYo aaa -hLe -qkJ -gOo -gOo +eSN +dUj +bWN +bWN wnb -gOo +bWN pDi -gOo +bWN hIw vcm -gOo +bWN xxv guW cGe -gOo +bWN spe cja lku @@ -141636,7 +141499,7 @@ aaa aaa uHd aaa -hLe +eSN tez agu jjw @@ -141650,11 +141513,11 @@ snq agu nGc snq -ryY +eZl aVf meu meD -omM +jrA fHj tgd hdU @@ -142168,8 +142031,8 @@ pGl mSe poo meD -qWZ -qWZ +qIH +qIH vER cjN cjN @@ -142253,7 +142116,7 @@ nXH qXt twl rYN -mVa +fPS suz qmy hMH @@ -142408,7 +142271,7 @@ aaa uHd qYo mSe -cuB +ech aRS lTv eiC @@ -142425,7 +142288,7 @@ gKM mSe khA meD -qWZ +qIH dSe sIu cjN @@ -142678,11 +142541,11 @@ djI rnA lTv sZE -ixG +kBI mSe fOO auS -qWZ +qIH jqQ qBq hQq @@ -142766,7 +142629,7 @@ eFf nXH dEb lcm -mDn +fPS cjs ihp waK @@ -142939,9 +142802,9 @@ lMN mSe khA meD -qWZ -qWZ -omM +qIH +qIH +jrA cjN fSi sHr @@ -143177,15 +143040,15 @@ qYo aaa aaa qYo -qWZ -qWZ +xgA +xgA uWT qkJ ayH orh tWG nWw -vng +vqS rwn kho vcf @@ -143197,7 +143060,7 @@ qWZ khA meD eXG -qWZ +qIH aaa cjN qZM @@ -143431,15 +143294,15 @@ aaa aaa qYo qYo -qWZ -qWZ -qWZ -qWZ +xgA +xgA +xgA +xgA nLG sON qkJ rDe -vII +lgx nJM plT nJM @@ -143454,7 +143317,7 @@ hLe jpf lku kAx -omM +jrA aad cjN eyX @@ -143506,7 +143369,7 @@ yaI yaI unm ijp -iwr +ijp tKi yaI yaI @@ -143688,7 +143551,7 @@ aaa aaa uHd aaa -hLe +dhN jzm usB xpj @@ -143698,11 +143561,11 @@ bfs jdT vxr wAe -lTv +gZb wcX -lTv -lTv -lTv +gZb +gZb +gZb fiO kxA vII @@ -143711,7 +143574,7 @@ hLe khA meD msq -qWZ +qIH aaa hQq cXi @@ -143945,17 +143808,17 @@ uHd qYo uHd aaa -hLe +dhN mvr lWb -itW +apG qmL itW nJg jHw vxr jMs -lTv +gZb qYs dmd uNj @@ -143967,8 +143830,8 @@ xPz qWZ khA log -fiO -qWZ +gJk +qIH aad cjN fhw @@ -144202,7 +144065,7 @@ uHd aaa uHd aaa -hLe +dhN qCU gNV jjA @@ -144211,21 +144074,21 @@ vxr upM ibb bDw -jBH -lTv +jMs +gZb sVh -lTv +gZb kov hzT -fiO -fiO +xma +xma jqo -fiO -qWZ +xma +duX khA meD eOy -qWZ +qIH aaa cjN nRz @@ -144459,30 +144322,30 @@ xTK aaa qYo aaa -hLe +dhN cge gNV nof xBc -qcT +vqS vTP aNd -vxr +qkJ wPN -lTv -lTv -lTv -lTv -lTv -fiO +gZb +gZb +gZb +gZb +gZb +xma gHP -bGi +sWC xpx -qWZ +duX khA lku foo -omM +jrA aad cjN fSL @@ -144716,9 +144579,9 @@ uHd aaa uHd aaa -hLe +dhN erR -tWG +icC kce oSy edb @@ -144731,15 +144594,15 @@ qRk fCg gMh vwY -fiO +xma jst -bGi -vxr -hLe +sWC +afC +hpb khA meD kOG -qWZ +qIH aaa cjN kOA @@ -144973,30 +144836,30 @@ uHd qYo uHd aaa -hLe +dhN dwO ozu sJw -qtD +gpJ iiy tUB ryY xsF -bGi +iwQ jeh qvl qvl -tUB +fpK nkw -fiO +xma tVl cRQ tVf byL khA rfU -qWZ -qWZ +qIH +qIH aad aad kOA @@ -145230,10 +145093,10 @@ aaa aaa qYo qYo -qWZ -qWZ -qWZ -qWZ +xgA +xgA +xgA +xgA ntR pGj nIr @@ -145245,14 +145108,14 @@ nsR rIE mKJ rqO -fiO +xma pCN -fiO +xma pCN -qWZ +duX okx meD -omM +jrA aaa aad aaa @@ -145490,26 +145353,26 @@ aaa aaa aaa aaa -qWZ -qWZ -fiO -fiO +xgA +xgA +dsg +dsg bSu -fiO -fiO -fiO +dsg +dsg +dsg ipC kJC aew uXv -fiO -tMB -vxr +xma +bSJ +afC tMB -qWZ +duX cNr lku -omM +jrA aad aad aad @@ -145748,25 +145611,25 @@ uHd uHd qYo qYo -hLe +ulJ pqK gpj -itW +xpi uRT vrL -fiO +dsg fsa pnL gtL fUh -fiO +xma frG tIU bNf rhx bTn meD -omM +jrA aaa aad aaa @@ -146005,13 +145868,13 @@ qYo aaa aaa aaa -hLe +ulJ dqg tgn -itW -tUB +xpi +dLL sGT -fiO +dsg xhl dgx aew @@ -146023,7 +145886,7 @@ eHO eHO vaa eOl -qWZ +qIH aad aad aad @@ -146262,13 +146125,13 @@ uHd aaa aaa aaa -hLe +ulJ fPP -vxr +oBx oQD -vxr +nRf fZl -fiO +dsg rba pFS uSi @@ -146279,8 +146142,8 @@ mor tUs eHO hyg -omM -qWZ +jrA +qIH aad aaa aad @@ -146519,13 +146382,13 @@ uHd qYo uHd qYo -qWZ -qWZ -hLe -hLe -hLe -qWZ -qWZ +ibA +ibA +ulJ +ulJ +ulJ +ibA +ibA eHO eHO eHO @@ -146537,9 +146400,9 @@ mKL sXd sdV moo -qWZ -qWZ -qWZ +qIH +qIH +qIH aad aaa kOA @@ -147050,10 +146913,10 @@ mvn ufS eHO wKe -omM -qWZ -fiO -qWZ +jrA +qIH +gJk +qIH aad aad kOA @@ -147309,7 +147172,7 @@ eHO rpP rHZ ify -fiO +gJk aaa aad aaa @@ -147566,7 +147429,7 @@ eHO azB mSo smN -omM +jrA aaa aad aaa @@ -147821,9 +147684,9 @@ pdF rQv eHO wuM -tUB +vjV vng -fiO +gJk aaa aad aaa @@ -148080,7 +147943,7 @@ eHO gVA cAP gVA -fiO +gJk qYo xTK xTK @@ -148333,11 +148196,11 @@ qYo aaa aaa aad -fiO +gJk hIL hIL riA -fiO +gJk aaa aaa aaa @@ -148590,11 +148453,11 @@ vVc aaa xTK aad -fiO +gJk gVA atT gVA -fiO +gJk qYo qYo xTK @@ -148847,11 +148710,11 @@ aaa aaa xTK aad -fiO +gJk aaa xZM aaa -fiO +gJk aaa aaa aaa @@ -149104,11 +148967,11 @@ aaa aaa aaa aaa -fiO +gJk aaa aaa aaa -fiO +gJk aaa aaa aaa diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm index b6ce71bc6cb52c..1139dd71bee798 100644 --- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm +++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm @@ -36,16 +36,6 @@ /obj/item/flashlight/lamp/green, /turf/open/floor/carpet/red, /area/station/commons/vacant_room/office) -"aaV" = ( -/obj/machinery/door/airlock/maintenance, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/unres, -/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/morgue) "abb" = ( /obj/effect/turf_decal/weather/snow/corner{ dir = 5 @@ -57,9 +47,7 @@ /area/station/science/xenobiology) "abk" = ( /obj/machinery/light/small/directional/east, -/obj/structure/sign/warning/xeno_mining{ - pixel_x = 32 - }, +/obj/structure/sign/warning/xeno_mining/directional/east, /obj/effect/turf_decal/stripes/corner, /turf/open/floor/iron/smooth_large, /area/station/cargo/warehouse) @@ -95,6 +83,10 @@ /obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) +"abW" = ( +/obj/machinery/duct, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/morgue) "ace" = ( /obj/structure/table/wood, /turf/open/floor/wood, @@ -127,6 +119,9 @@ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 8 + }, /turf/open/floor/plating, /area/station/maintenance/department/crew_quarters/bar) "acE" = ( @@ -150,6 +145,14 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/station/service/chapel) +"acS" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) "adr" = ( /obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/yellow{ @@ -160,9 +163,8 @@ /area/station/hallway/primary/aft) "adC" = ( /obj/effect/decal/cleanable/blood/old, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/security/prison/safe) "adD" = ( /obj/structure/railing/corner{ @@ -180,7 +182,7 @@ dir = 1 }, /turf/open/openspace, -/area/station/science/mixing) +/area/station/science/ordnance/office) "aen" = ( /obj/machinery/atmospherics/pipe/smart/simple/green/visible{ dir = 5 @@ -225,10 +227,21 @@ /area/mine/living_quarters) "aeZ" = ( /obj/machinery/space_heater, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) +"afi" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/machinery/door/airlock/external{ + name = "MiniSat External Access" + }, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/access/any/command/minisat, +/obj/effect/mapping_helpers/airlock/access/any/command/ai_upload, +/turf/open/floor/plating, +/area/station/ai_monitored/turret_protected/aisat_interior) "afp" = ( /obj/machinery/air_sensor/nitrogen_tank, /turf/open/floor/engine/n2, @@ -236,20 +249,11 @@ "afu" = ( /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, /turf/open/floor/iron, -/area/station/science/mixing) +/area/station/science/ordnance) "afz" = ( /obj/effect/spawner/random/structure/crate, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"afJ" = ( -/obj/structure/table, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/item/storage/bag/tray, -/obj/machinery/duct, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "afK" = ( /obj/structure/cable, /turf/open/floor/iron/stairs/left{ @@ -382,6 +386,12 @@ }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) +"aig" = ( +/obj/effect/turf_decal/box/white{ + color = "#EFB341" + }, +/turf/open/floor/engine, +/area/station/engineering/atmos/hfr_room) "aij" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -517,8 +527,22 @@ /area/station/engineering/transit_tube) "alp" = ( /obj/machinery/airalarm/directional/north, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/simple/pink/visible/layer5{ + dir = 6 + }, +/obj/effect/turf_decal/trimline/dark_red/arrow_ccw{ + dir = 9 + }, +/obj/structure/cable, /turf/open/floor/iron, -/area/station/engineering/atmos/project) +/area/station/engineering/atmos/storage) "alv" = ( /obj/machinery/holopad, /obj/structure/cable, @@ -557,7 +581,7 @@ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "alT" = ( /turf/open/floor/carpet, /area/station/cargo/qm) @@ -572,9 +596,7 @@ dir = 4 }, /obj/machinery/light_switch/directional/west, -/obj/structure/sign/warning/bodysposal{ - pixel_y = 32 - }, +/obj/structure/sign/warning/bodysposal/directional/north, /obj/machinery/disposal/bin{ desc = "A pneumatic waste disposal unit. This one leads to the morgue."; name = "corpse disposal" @@ -588,6 +610,14 @@ }, /turf/open/floor/plating, /area/mine/storage) +"ama" = ( +/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8; + name = "N2O to Pure" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "amg" = ( /obj/effect/turf_decal/tile/yellow{ dir = 1 @@ -662,9 +692,10 @@ /area/station/command/heads_quarters/captain) "anE" = ( /obj/structure/sign/poster/random/directional/east, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/aft/lesser) "anI" = ( /obj/effect/turf_decal/stripes/line{ @@ -882,7 +913,7 @@ pixel_y = 8 }, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance/office) "aqy" = ( /obj/machinery/door/airlock/external, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -1053,6 +1084,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/machinery/camera/directional/south, /turf/open/floor/iron, /area/station/hallway/primary/starboard) "atl" = ( @@ -1074,13 +1106,6 @@ /obj/item/radio/intercom/directional/south, /turf/open/floor/iron, /area/station/hallway/primary/central) -"atw" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "aty" = ( /obj/structure/urinal/directional/north, /obj/effect/landmark/start/hangover, @@ -1246,22 +1271,16 @@ /turf/open/floor/iron/dark, /area/station/service/chapel) "avC" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, /obj/effect/landmark/event_spawn, -/obj/structure/disposalpipe/sorting/mail{ - dir = 4; - sortType = 20 +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/structure/disposalpipe/segment{ + dir = 4 }, /turf/open/floor/iron, /area/station/service/bar) "avI" = ( /obj/structure/ladder, -/obj/structure/sign/warning/cold_temp{ - pixel_x = 32 - }, +/obj/structure/sign/warning/cold_temp/directional/east, /obj/effect/turf_decal/stripes/line{ dir = 8 }, @@ -1299,15 +1318,7 @@ dir = 8 }, /turf/open/floor/iron/dark, -/area/station/science/mixing) -"axi" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/door/airlock/atmos{ - name = "Atmospherics" - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, -/turf/open/floor/plating, -/area/station/maintenance/aft/greater) +/area/station/science/ordnance) "axm" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 8 @@ -1381,6 +1392,13 @@ /obj/effect/spawner/random/structure/billboard/nanotrasen, /turf/open/lava/plasma/ice_moon, /area/icemoon/underground/explored) +"axL" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/project) "axM" = ( /obj/machinery/light/directional/east, /obj/machinery/camera/directional/east{ @@ -1391,7 +1409,17 @@ /area/station/engineering/atmos) "axT" = ( /obj/machinery/light/small/directional/south, -/turf/open/floor/plating, +/obj/machinery/atmospherics/pipe/smart/simple/pink/visible/layer5{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_red/arrow_ccw{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/dark_green/arrow_ccw, +/obj/machinery/atmospherics/pipe/smart/simple/violet/visible/layer1{ + dir = 4 + }, +/turf/open/floor/iron, /area/station/engineering/atmos) "axX" = ( /obj/structure/cable, @@ -1449,9 +1477,9 @@ /turf/open/lava/plasma/ice_moon, /area/icemoon/underground/explored) "ayJ" = ( -/obj/structure/table, /obj/effect/turf_decal/tile/red/full, -/obj/item/clothing/head/fedora, +/obj/structure/table, +/obj/item/clothing/mask/cigarette/cigar, /turf/open/floor/iron/large, /area/station/service/kitchen/diner) "azf" = ( @@ -1485,7 +1513,7 @@ dir = 10 }, /turf/open/floor/plating/icemoon, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "aAc" = ( /obj/effect/turf_decal/siding/wood{ dir = 6 @@ -1517,6 +1545,22 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/department/crew_quarters/bar) +"aAN" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/cable, +/obj/item/radio/intercom/directional/south, +/obj/effect/turf_decal/trimline/dark_blue/line, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/mix) +"aAT" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) "aAZ" = ( /obj/structure/cable, /obj/structure/railing, @@ -1525,9 +1569,8 @@ /obj/structure/disposalpipe/segment{ dir = 9 }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "aBh" = ( /obj/effect/spawner/structure/window, @@ -1614,9 +1657,8 @@ "aDj" = ( /obj/structure/table/wood, /obj/item/newspaper, -/turf/open/floor/wood{ - icon_state = "wood-broken2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/security/prison/rec) "aDo" = ( /obj/structure/chair/office{ @@ -1684,8 +1726,21 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"aDY" = ( +/obj/machinery/firealarm/directional/north, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/trimline/dark_red/arrow_ccw{ + dir = 1 + }, +/obj/machinery/atmospherics/components/binary/valve/digital/on{ + dir = 4; + name = "Exfiltrate Control" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/storage) "aEA" = ( /obj/structure/rack, /obj/item/clothing/mask/gas, @@ -1712,13 +1767,14 @@ /turf/open/floor/wood, /area/station/service/lawoffice) "aFl" = ( -/obj/structure/chair{ - dir = 8 - }, /obj/effect/turf_decal/siding/white{ - dir = 5 + dir = 1 }, -/obj/structure/sign/poster/random/directional/north, +/obj/structure/table, +/obj/effect/spawner/random/food_or_drink/donkpockets{ + pixel_y = 8 + }, +/obj/machinery/light/directional/north, /turf/open/floor/iron/white/smooth_large, /area/station/service/kitchen/diner) "aFr" = ( @@ -1793,15 +1849,12 @@ /turf/open/floor/iron/cafeteria, /area/mine/laborcamp) "aGn" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, /obj/effect/turf_decal/siding/wood{ dir = 8 }, /obj/structure/table/wood, /mob/living/carbon/human/species/monkey/punpun, +/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/service/bar) "aGr" = ( @@ -1846,9 +1899,8 @@ /area/mine/laborcamp) "aHd" = ( /obj/machinery/light/small/directional/west, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "aHz" = ( /obj/structure/cable, @@ -1904,6 +1956,21 @@ /obj/structure/sign/warning/secure_area, /turf/closed/wall/r_wall, /area/station/engineering/main) +"aIw" = ( +/obj/machinery/door/poddoor/shutters/window/preopen{ + dir = 4; + id = "Atmospherics HFR Shutters"; + name = "Atmospherics HFR Shutters" + }, +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/door/firedoor/heavy, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/hfr_room) "aIB" = ( /obj/effect/turf_decal/weather/snow/corner{ dir = 4 @@ -1927,7 +1994,7 @@ /turf/open/floor/iron/cafeteria{ dir = 8 }, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "aIK" = ( /obj/structure/closet/toolcloset, /obj/machinery/status_display/evac/directional/south, @@ -1988,7 +2055,7 @@ /area/station/security/prison/rec) "aJv" = ( /obj/structure/sign/warning/docking, -/turf/closed/wall/r_wall, +/turf/closed/wall, /area/station/maintenance/port/greater) "aJw" = ( /obj/structure/table, @@ -2202,7 +2269,7 @@ /obj/machinery/door/window/left/directional/east{ icon_state = "right"; name = "Incoming Mail"; - req_access = list("mail_sorting") + req_access = list("shipping") }, /obj/structure/disposalpipe/segment{ dir = 4 @@ -2252,11 +2319,7 @@ dir = 1 }, /turf/open/floor/iron, -/area/station/science/mixing) -"aMO" = ( -/obj/structure/sign/poster/random/directional/east, -/turf/closed/wall, -/area/station/service/kitchen) +/area/station/science/ordnance) "aMP" = ( /obj/effect/turf_decal/tile/yellow, /turf/open/floor/iron/white, @@ -2307,9 +2370,8 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "aNP" = ( /obj/structure/window/reinforced{ @@ -2423,6 +2485,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"aQd" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/dark_blue/line{ + dir = 6 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/mix) "aQe" = ( /obj/item/clothing/shoes/jackboots, /turf/open/floor/plating, @@ -2437,12 +2507,6 @@ dir = 1 }, /area/station/service/hydroponics) -"aQk" = ( -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, -/area/station/construction) "aQp" = ( /obj/structure/table, /obj/effect/spawner/random/trash/food_packaging, @@ -2714,7 +2778,7 @@ name = "Crumpled Memo" }, /turf/open/floor/iron/smooth, -/area/station/security/prison) +/area/station/security/execution/transfer) "aUr" = ( /obj/effect/turf_decal/bot, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -2729,7 +2793,8 @@ }, /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/obj/effect/mapping_helpers/airlock/access/any/engineering/construction, +/obj/effect/mapping_helpers/airlock/access/any/engineering/general, /turf/open/floor/iron, /area/station/engineering/storage_shared) "aUC" = ( @@ -2828,7 +2893,7 @@ pixel_x = 5 }, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance/office) "aVH" = ( /obj/structure/closet/emcloset, /obj/effect/turf_decal/tile/blue, @@ -2944,7 +3009,7 @@ dir = 8 }, /obj/structure/disposalpipe/segment{ - dir = 4 + dir = 9 }, /turf/open/floor/iron/large, /area/station/service/kitchen/diner) @@ -3024,9 +3089,7 @@ /obj/item/reagent_containers/glass/bottle/iodine{ pixel_x = 1 }, -/obj/structure/sign/warning/chem_diamond{ - pixel_x = -32 - }, +/obj/structure/sign/warning/chem_diamond/directional/west, /turf/open/floor/iron/dark/textured_edge{ dir = 8 }, @@ -3390,10 +3453,11 @@ /turf/open/floor/plating/icemoon, /area/station/engineering/atmos) "bed" = ( -/obj/structure/industrial_lift{ - id = "publicElevator" - }, /obj/machinery/light/floor, +/obj/structure/industrial_lift, +/obj/effect/landmark/lift_id{ + specific_lift_id = "publicElevator" + }, /turf/open/openspace, /area/station/commons/storage/mining) "beo" = ( @@ -3419,6 +3483,12 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/command/heads_quarters/hos) +"bew" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/engine, +/area/station/engineering/atmos/hfr_room) "beO" = ( /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, @@ -3467,6 +3537,22 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/science/breakroom) +"bfz" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible, +/obj/effect/turf_decal/trimline/dark_red/arrow_ccw{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/simple/pink/visible/layer5, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) "bfB" = ( /obj/item/kirbyplants/random, /obj/machinery/firealarm/directional/east, @@ -3480,7 +3566,7 @@ dir = 1 }, /turf/open/floor/iron/dark/airless, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/freezerchamber) "bfL" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -3553,7 +3639,7 @@ dir = 5 }, /turf/open/floor/plating/icemoon, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "bgZ" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -3626,6 +3712,11 @@ /obj/machinery/light/directional/west, /turf/open/floor/engine, /area/station/science/xenobiology) +"biK" = ( +/obj/machinery/airalarm/directional/north, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/project) "biL" = ( /obj/machinery/camera/directional/north{ c_tag = "Bridge East Entrance" @@ -3722,9 +3813,8 @@ /obj/structure/railing{ dir = 1 }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/department/medical/central) "bjE" = ( /obj/machinery/vending/games, @@ -3751,6 +3841,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, +/obj/machinery/duct, /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) "bkg" = ( @@ -3762,14 +3853,6 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/iron/cafeteria, /area/station/security/prison/work) -"bkl" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/obj/machinery/duct, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "bkC" = ( /obj/effect/turf_decal/tile/red/half/contrasted, /obj/structure/cable, @@ -3780,6 +3863,13 @@ }, /turf/open/floor/iron, /area/station/security/brig/upper) +"bkS" = ( +/obj/machinery/atmospherics/pipe/bridge_pipe/yellow/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/violet/visible/layer1, +/turf/open/floor/iron, +/area/station/engineering/atmos) "bkV" = ( /obj/effect/turf_decal/trimline/blue/filled/warning{ dir = 1 @@ -3806,6 +3896,9 @@ name = "High-Risk Modules"; req_access = list("captain") }, +/obj/item/ai_module/reset/purge{ + pixel_y = 11 + }, /turf/open/floor/circuit/red, /area/station/ai_monitored/turret_protected/ai_upload) "bkX" = ( @@ -3888,7 +3981,7 @@ /turf/open/floor/iron/white/side{ dir = 8 }, -/area/station/science/misc_lab) +/area/station/science/explab) "bmM" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -3945,9 +4038,10 @@ /turf/open/floor/iron, /area/station/engineering/storage_shared) "bnr" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/heater{ +/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ dir = 8 }, +/obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/station/engineering/atmos) "bnt" = ( @@ -4011,7 +4105,7 @@ /obj/machinery/holopad, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, -/area/station/science/misc_lab) +/area/station/science/explab) "bnW" = ( /obj/item/paper_bin{ pixel_x = 1; @@ -4033,14 +4127,28 @@ "boc" = ( /obj/machinery/light/small/directional/west, /obj/structure/closet/emcloset/anchored, -/obj/structure/sign/warning/gas_mask{ - pixel_x = -32 - }, +/obj/structure/sign/warning/gas_mask/directional/west, /turf/open/floor/plating, /area/station/engineering/main) "bol" = ( /turf/open/floor/iron/dark/textured, /area/station/security/prison) +"bow" = ( +/obj/structure/table/reinforced, +/obj/item/hfr_box/corner, +/obj/item/hfr_box/corner, +/obj/item/hfr_box/corner, +/obj/item/hfr_box/corner, +/obj/item/hfr_box/core{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/machinery/camera/directional/west{ + c_tag = "Atmospherics - HFR"; + name = "atmospherics camera" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/hfr_room) "boP" = ( /obj/machinery/firealarm/directional/west, /obj/machinery/light/directional/south, @@ -4086,7 +4194,7 @@ "bpz" = ( /obj/machinery/atmospherics/components/tank, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "bpD" = ( /obj/machinery/newscaster/directional/south, /turf/open/floor/iron/cafeteria{ @@ -4117,11 +4225,6 @@ "bqs" = ( /turf/closed/wall, /area/station/ai_monitored/command/storage/eva) -"bqD" = ( -/obj/machinery/light/small/directional/north, -/obj/machinery/griddle, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "bqF" = ( /obj/structure/chair{ dir = 4 @@ -4181,7 +4284,7 @@ /area/station/security/checkpoint/engineering) "brD" = ( /turf/open/floor/glass/reinforced, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "brL" = ( /obj/structure/railing/corner{ dir = 8 @@ -4218,9 +4321,7 @@ /obj/effect/turf_decal/stripes/red/line{ dir = 8 }, -/obj/structure/sign/warning/no_smoking{ - pixel_x = 32 - }, +/obj/structure/sign/warning/no_smoking/directional/east, /turf/open/floor/iron/textured, /area/station/engineering/atmos) "bst" = ( @@ -4343,6 +4444,15 @@ /obj/item/radio/intercom/directional/east, /turf/open/floor/wood, /area/station/service/library) +"btR" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron/white/corner, +/area/station/hallway/secondary/entry) "btU" = ( /turf/closed/wall, /area/station/medical/morgue) @@ -4369,6 +4479,15 @@ /mob/living/simple_animal/parrot/poly, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/ce) +"but" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/light_switch/directional/north, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) "buv" = ( /obj/machinery/atmospherics/pipe/multiz/scrubbers/visible/layer2{ color = "#ff0000"; @@ -4448,10 +4567,8 @@ /turf/open/floor/iron, /area/station/hallway/primary/starboard) "bvP" = ( -/obj/machinery/camera/directional/north{ - c_tag = "Starboard Primary Hallway 2" - }, -/obj/structure/chair, +/obj/structure/table, +/obj/item/candle, /turf/open/floor/iron, /area/station/hallway/primary/starboard) "bvS" = ( @@ -4688,7 +4805,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "bzJ" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/machinery/camera/directional/north{ @@ -4717,7 +4834,6 @@ /turf/open/floor/engine/plasma, /area/station/engineering/atmos) "bzY" = ( -/obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/door/airlock/mining/glass{ name = "Mining Dock" @@ -4732,9 +4848,8 @@ /area/station/security/prison/rec) "bAz" = ( /obj/structure/disposalpipe/segment, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/department/medical/central) "bAF" = ( /turf/open/floor/iron/chapel{ @@ -4807,9 +4922,8 @@ pixel_x = 1; pixel_y = 9 }, -/turf/open/floor/wood{ - icon_state = "wood-broken5" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/maintenance/aft/greater) "bAX" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -4889,7 +5003,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /turf/open/floor/iron, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "bCp" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/blue/opposingcorners{ @@ -5113,6 +5227,7 @@ dir = 8 }, /obj/machinery/camera/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/corner, /area/station/hallway/secondary/entry) "bFU" = ( @@ -5182,13 +5297,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/cafeteria, /area/station/command/heads_quarters/rd) +"bHg" = ( +/obj/effect/turf_decal/siding/white, +/turf/open/floor/iron/white/smooth_large, +/area/station/service/kitchen/diner) "bHj" = ( /obj/structure/window/reinforced{ dir = 4 }, /obj/machinery/portable_atmospherics/canister/oxygen, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "bHl" = ( /obj/machinery/turretid{ control_area = "/area/station/ai_monitored/turret_protected/aisat_interior"; @@ -5207,13 +5326,6 @@ /obj/structure/cable/multilayer/multiz, /turf/open/floor/plating, /area/station/maintenance/fore/greater) -"bHy" = ( -/obj/structure/chair/stool/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold/general/visible{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) "bHE" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/command/glass{ @@ -5234,6 +5346,19 @@ /obj/structure/chair/stool/directional/north, /turf/open/floor/plating, /area/station/maintenance/solars/starboard/fore) +"bHU" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/dark_red/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/dark_red/arrow_ccw{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/layer_manifold/general/visible{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) "bIa" = ( /obj/machinery/atmospherics/components/binary/pump/on{ dir = 8; @@ -5284,7 +5409,7 @@ "bJm" = ( /obj/item/radio/intercom/directional/north, /turf/open/floor/iron, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "bJq" = ( /obj/docking_port/stationary/random/icemoon{ dir = 4; @@ -5327,10 +5452,45 @@ }, /turf/open/floor/wood, /area/station/service/library) +"bJR" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Atmospherics Project Room West" + }, +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/trimline/dark_red/arrow_ccw{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/simple/pink/visible/layer5{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_green/arrow_ccw, +/obj/machinery/atmospherics/pipe/smart/simple/violet/visible/layer1{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage) +"bJS" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/station/maintenance/aft/lesser) "bKd" = ( /obj/structure/cable, /turf/open/floor/iron, /area/station/commons/storage/art) +"bKl" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/duct, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/morgue) "bKm" = ( /obj/machinery/vending/assist, /obj/structure/sign/poster/random/directional/west, @@ -5347,6 +5507,16 @@ /obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"bKw" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance/departmental, +/obj/effect/mapping_helpers/airlock/access/any/science/maintenance, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/aft/lesser) "bKN" = ( /obj/machinery/door/airlock/security/glass{ name = "Brig Control" @@ -5384,7 +5554,8 @@ /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ id = "kanyewest"; - name = "Privacy Shutters" + name = "Privacy Shutters"; + dir = 4 }, /obj/structure/cable, /turf/open/floor/plating, @@ -5481,9 +5652,6 @@ /obj/effect/mapping_helpers/airlock/access/all/command/gateway, /turf/open/floor/iron, /area/station/command/gateway) -"bMR" = ( -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "bMT" = ( /obj/structure/table/reinforced, /obj/effect/turf_decal/tile/yellow{ @@ -5534,12 +5702,17 @@ network = list("ss13","rd") }, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance/office) "bNj" = ( -/obj/structure/table, -/obj/machinery/microwave, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/light/dim/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/department/crew_quarters/bar) "bNx" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -5579,9 +5752,8 @@ /area/station/security/processing) "bOi" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "bOj" = ( /obj/machinery/door/airlock/maintenance, @@ -5701,7 +5873,7 @@ "bQf" = ( /obj/machinery/light/small/directional/west, /turf/open/floor/engine/vacuum, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "bQh" = ( /obj/item/radio/intercom/directional/north, /turf/open/floor/iron/dark/corner{ @@ -5810,10 +5982,9 @@ /turf/open/floor/iron, /area/mine/laborcamp) "bRP" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron/white/smooth_large, +/obj/effect/turf_decal/tile/red/full, +/obj/effect/spawner/random/engineering/tracking_beacon, +/turf/open/floor/iron/large, /area/station/service/kitchen/diner) "bRW" = ( /obj/machinery/shower{ @@ -5901,7 +6072,7 @@ /obj/machinery/door/firedoor, /obj/machinery/door/window/left/directional/west{ name = "Delivery Desk"; - req_access = list("mail_sorting") + req_access = list("shipping") }, /obj/effect/turf_decal/bot, /obj/structure/table/reinforced, @@ -5922,9 +6093,8 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, -/obj/machinery/atmospherics/components/binary/pump/off{ - dir = 1; - name = "O2 To Pure" +/obj/machinery/atmospherics/pipe/layer_manifold/general/visible{ + dir = 1 }, /turf/open/floor/iron, /area/station/engineering/atmos) @@ -5951,8 +6121,9 @@ name = "Atmospherics" }, /obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, +/obj/structure/disposalpipe/segment, /turf/open/floor/plating, -/area/station/maintenance/aft/greater) +/area/station/engineering/atmos/storage) "bVc" = ( /obj/machinery/recharger, /obj/structure/table, @@ -5999,7 +6170,7 @@ pixel_y = -2 }, /turf/open/floor/iron/dark, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "bVJ" = ( /obj/structure/cable, /obj/effect/turf_decal/stripes/line{ @@ -6045,6 +6216,14 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"bWw" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/table/wood, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/station/service/bar) "bWA" = ( /obj/machinery/button/flasher{ id = "hopflash"; @@ -6188,6 +6367,15 @@ /obj/effect/turf_decal/trimline/blue/filled/line, /turf/open/floor/iron/dark, /area/station/medical/storage) +"bYb" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "kitchencounter"; + name = "Kitchen Counter Shutters"; + dir = 2 + }, +/turf/open/floor/plating, +/area/station/service/kitchen) "bYc" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -6215,9 +6403,7 @@ /obj/machinery/conveyor{ id = "garbage" }, -/obj/structure/sign/warning/vacuum{ - pixel_x = -32 - }, +/obj/structure/sign/warning/vacuum/directional/west, /turf/open/floor/plating, /area/station/maintenance/disposal) "bYw" = ( @@ -6236,6 +6422,10 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/iron, /area/station/security/processing) +"bYI" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/engine, +/area/station/engineering/atmos/hfr_room) "bYK" = ( /obj/effect/landmark/start/chemist, /obj/structure/chair/office/light{ @@ -6294,7 +6484,7 @@ /area/station/hallway/primary/fore) "bZF" = ( /turf/closed/wall, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "bZG" = ( /obj/machinery/modular_computer/console/preset/civilian{ dir = 1 @@ -6323,6 +6513,15 @@ /obj/machinery/light/directional/east, /turf/open/floor/iron, /area/station/commons/fitness) +"cam" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/dark_blue/line{ + dir = 4 + }, +/obj/machinery/power/apc/auto_name/directional/east, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/mix) "cas" = ( /obj/structure/window/reinforced{ dir = 4 @@ -6410,12 +6609,13 @@ dir = 10 }, /area/mine/eva) -"cbR" = ( -/obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg2" +"cbL" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/heater{ + dir = 8 }, -/area/station/maintenance/fore/lesser) +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron, +/area/station/engineering/atmos) "cbS" = ( /obj/structure/rack, /obj/item/wrench, @@ -6425,6 +6625,24 @@ }, /turf/open/floor/iron/smooth, /area/station/maintenance/starboard/lesser) +"ccb" = ( +/obj/machinery/door/airlock/atmos/glass, +/obj/machinery/door/firedoor/heavy, +/obj/effect/turf_decal/trimline/yellow/corner, +/obj/effect/turf_decal/trimline/yellow/corner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/corner{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, +/turf/open/floor/iron/dark/smooth_half{ + dir = 1 + }, +/area/station/engineering/atmos/hfr_room) "cck" = ( /obj/structure/table/glass, /obj/machinery/light/directional/east, @@ -6577,9 +6795,7 @@ /turf/open/floor/circuit/green, /area/station/ai_monitored/turret_protected/ai_upload) "cdV" = ( -/obj/structure/sign/warning/vacuum{ - pixel_y = -32 - }, +/obj/structure/sign/warning/vacuum/directional/south, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 }, @@ -6654,11 +6870,10 @@ /turf/open/floor/iron, /area/mine/living_quarters) "cfx" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/iron/white/smooth_large, +/obj/effect/turf_decal/siding/white/corner, +/obj/effect/turf_decal/tile/red/full, +/obj/machinery/holopad, +/turf/open/floor/iron/large, /area/station/service/kitchen/diner) "cfC" = ( /obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible, @@ -6695,6 +6910,12 @@ }, /turf/open/floor/iron, /area/station/security/prison/mess) +"cgi" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/structure/table/reinforced, +/obj/item/storage/toolbox/mechanical, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/project) "cgo" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -6781,7 +7002,7 @@ dir = 1 }, /turf/open/floor/iron, -/area/station/science/mixing) +/area/station/science/ordnance) "chO" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -6918,9 +7139,8 @@ /turf/open/floor/plating, /area/station/maintenance/department/crew_quarters/bar) "cka" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/aft/lesser) "ckc" = ( /obj/machinery/door/firedoor, @@ -6945,6 +7165,23 @@ /obj/item/trash/sosjerky, /turf/open/floor/plating, /area/station/maintenance/fore/lesser) +"ckL" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/trimline/dark_green/line, +/obj/effect/turf_decal/trimline/dark_green/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/simple/violet/visible{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/mix) +"ckO" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "cll" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -6955,14 +7192,19 @@ /turf/open/floor/engine, /area/station/engineering/supermatter/room) "clo" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "kitchen"; - name = "Kitchen Shutters" - }, /obj/machinery/door/airlock{ name = "Kitchen" }, /obj/effect/mapping_helpers/airlock/access/all/service/kitchen, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "kitchencounter"; + name = "Kitchen Shutters"; + dir = 4 + }, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) "clq" = ( @@ -7071,17 +7313,10 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/external, /turf/open/floor/plating, /area/station/maintenance/aft/greater) -"cmr" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/warning/secure_area{ - pixel_y = -32 - }, -/turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat_interior) "cmu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, -/area/station/science/misc_lab) +/area/station/science/explab) "cmv" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -7139,7 +7374,7 @@ /obj/item/compact_remote, /obj/item/compact_remote, /turf/open/floor/iron/white/corner, -/area/station/science/misc_lab) +/area/station/science/explab) "cnx" = ( /obj/machinery/power/tracker, /obj/structure/cable, @@ -7172,9 +7407,7 @@ /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) "cnW" = ( -/obj/structure/sign/warning/fire{ - pixel_x = 32 - }, +/obj/structure/sign/warning/fire/directional/east, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) "col" = ( @@ -7185,10 +7418,17 @@ /turf/open/floor/iron/white, /area/station/maintenance/port/fore) "cop" = ( -/obj/machinery/light/directional/north, +/obj/effect/turf_decal/tile/red/full, +/obj/effect/turf_decal/siding/white{ + dir = 1 + }, +/obj/structure/chair{ + dir = 8 + }, /obj/structure/sign/poster/random/directional/north, -/turf/open/floor/iron/freezer, -/area/station/service/kitchen/coldroom) +/obj/machinery/light/directional/north, +/turf/open/floor/iron/large, +/area/station/service/kitchen/diner) "cow" = ( /obj/structure/cable, /obj/structure/extinguisher_cabinet/directional/north, @@ -7205,6 +7445,14 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"coJ" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 + }, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/north, +/turf/open/floor/iron/dark/textured_edge, +/area/station/security/prison) "coN" = ( /obj/machinery/camera/directional/south{ c_tag = "EVA South" @@ -7350,9 +7598,8 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/aft) "crn" = ( /obj/structure/disposalpipe/segment, @@ -7370,9 +7617,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/sign/warning/secure_area{ - pixel_y = 32 - }, +/obj/structure/sign/warning/secure_area/directional/north, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) "crR" = ( @@ -7497,10 +7742,6 @@ /obj/machinery/camera/directional/east{ c_tag = "Atmospherics East" }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Plasma to Pure" - }, /obj/effect/turf_decal/tile/purple{ dir = 4 }, @@ -7511,6 +7752,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 5 }, +/obj/machinery/atmospherics/pipe/layer_manifold/general/visible{ + dir = 4 + }, /turf/open/floor/iron, /area/station/engineering/atmos) "cum" = ( @@ -7544,9 +7788,8 @@ /obj/structure/chair/comfy/brown{ dir = 4 }, -/turf/open/floor/wood{ - icon_state = "wood-broken" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/maintenance/space_hut/cabin) "cuL" = ( /obj/structure/table/wood, @@ -7707,19 +7950,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply, /turf/open/floor/iron/white, /area/station/medical/virology) -"cxU" = ( -/obj/machinery/door/airlock{ - name = "Kitchen" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/access/all/service/kitchen, -/turf/open/floor/plating, -/area/station/maintenance/department/crew_quarters/bar) "cxV" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -7728,7 +7958,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /turf/open/floor/iron/white, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "cya" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/abandoned, @@ -7740,9 +7970,7 @@ /turf/open/floor/plating, /area/station/maintenance/port/fore) "cyd" = ( -/obj/structure/sign/warning/cold_temp{ - pixel_y = 32 - }, +/obj/structure/sign/warning/cold_temp/directional/north, /obj/structure/sign/warning/xeno_mining{ pixel_x = 29 }, @@ -7764,6 +7992,10 @@ /obj/effect/turf_decal/tile/blue/full, /turf/open/floor/iron/large, /area/station/medical/treatment_center) +"cyx" = ( +/obj/machinery/atmospherics/pipe/smart/simple/green/visible, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/project) "cyB" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -7802,16 +8034,6 @@ /obj/effect/mapping_helpers/airlock/access/all/supply/mining, /turf/open/floor/plating, /area/station/cargo/miningdock) -"cyU" = ( -/obj/structure/railing{ - dir = 4 - }, -/obj/structure/table, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "cyW" = ( /obj/machinery/camera/directional/north{ c_tag = "Arrivals Lounge" @@ -7871,9 +8093,8 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/fore/lesser) "czD" = ( /turf/closed/wall, @@ -7992,12 +8213,6 @@ /obj/effect/turf_decal/tile/green/full, /turf/open/floor/iron/dark/smooth_large, /area/station/medical/virology) -"cAY" = ( -/obj/structure/sign/warning/fire{ - pixel_y = 32 - }, -/turf/open/floor/glass/reinforced, -/area/station/science/mixing/hallway) "cBh" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -8211,7 +8426,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 }, -/obj/item/radio/intercom/prison/directional/north, +/obj/item/radio/intercom/directional/north, /turf/open/floor/iron/smooth_edge, /area/station/security/lockers) "cFt" = ( @@ -8221,10 +8436,10 @@ /obj/item/grenade/chem_grenade/cleaner, /obj/item/reagent_containers/spray/cleaner, /obj/machinery/requests_console/directional/south{ + assistance_requestable = 1; department = "Janitorial"; departmentType = 1; - name = "Janitorial Requests Console"; - assistance_requestable = 1 + name = "Janitorial Requests Console" }, /turf/open/floor/iron, /area/station/service/janitor) @@ -8241,7 +8456,7 @@ pixel_y = 9 }, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance/office) "cFE" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -8252,7 +8467,7 @@ /turf/open/floor/iron/cafeteria{ dir = 8 }, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "cFT" = ( /obj/structure/rack, /obj/item/crowbar/red, @@ -8284,9 +8499,8 @@ }, /obj/effect/spawner/random/medical/patient_stretcher, /obj/effect/decal/cleanable/blood/gibs/torso, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/security/prison/safe) "cGl" = ( /obj/machinery/power/apc/auto_name/directional/south, @@ -8320,11 +8534,15 @@ /obj/structure/sign/poster/official/random/directional/west, /turf/open/floor/iron, /area/station/security/prison/garden) +"cGV" = ( +/obj/structure/sign/warning/cold_temp/directional/north, +/obj/structure/sign/warning/gas_mask/directional/south, +/turf/open/floor/plating, +/area/station/maintenance/aft/lesser) "cGW" = ( /obj/structure/closet/emcloset, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/upper) "cGY" = ( /obj/machinery/computer/shuttle/mining, @@ -8488,7 +8706,8 @@ /obj/machinery/door/airlock/external{ name = "Engineering External Access" }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/obj/effect/mapping_helpers/airlock/access/any/engineering/construction, +/obj/effect/mapping_helpers/airlock/access/any/engineering/general, /turf/open/floor/plating, /area/station/engineering/storage_shared) "cJi" = ( @@ -8547,7 +8766,7 @@ dir = 6 }, /turf/open/openspace, -/area/station/science/mixing) +/area/station/science/ordnance/office) "cLo" = ( /obj/machinery/recharge_station, /turf/open/floor/iron, @@ -8579,6 +8798,10 @@ }, /turf/open/floor/iron/showroomfloor, /area/station/security/processing) +"cLC" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, +/turf/closed/wall/r_wall, +/area/station/engineering/atmos/mix) "cLD" = ( /obj/machinery/door/airlock/security/glass{ name = "Equipment Room" @@ -8688,7 +8911,8 @@ }, /obj/machinery/door/poddoor/shutters/preopen{ id = "robotics2"; - name = "Robotics Lab Shutters" + name = "Robotics Lab Shutters"; + dir = 4 }, /obj/item/folder/white, /obj/item/pen, @@ -8816,6 +9040,15 @@ /obj/machinery/mecha_part_fabricator, /turf/open/floor/iron, /area/station/science/robotics/lab) +"cOE" = ( +/obj/item/reagent_containers/glass/bucket, +/obj/structure/sink{ + dir = 4; + pixel_x = -12; + pixel_y = 2 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) "cOP" = ( /obj/structure/chair{ dir = 1; @@ -8888,9 +9121,7 @@ }, /area/mine/eva) "cQy" = ( -/obj/structure/sign/warning/electric_shock{ - pixel_y = -32 - }, +/obj/structure/sign/warning/electric_shock/directional/south, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -8903,18 +9134,15 @@ /turf/open/floor/iron/dark, /area/station/medical/morgue) "cQG" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/siding/white{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, /turf/open/floor/iron, /area/station/service/bar) "cRg" = ( @@ -9000,6 +9228,11 @@ /obj/item/queen_bee/bought, /turf/open/floor/grass, /area/station/service/hydroponics) +"cSg" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/grimy, +/area/station/maintenance/aft/greater) "cSj" = ( /obj/effect/turf_decal/weather/snow/corner, /turf/open/misc/dirt{ @@ -9009,9 +9242,8 @@ "cSk" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/chair/stool/directional/south, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "cSu" = ( /obj/structure/disposalpipe/segment{ @@ -9035,6 +9267,13 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/aft) +"cSz" = ( +/turf/closed/mineral/snowmountain/coldroom, +/area/icemoon/underground/explored) +"cSC" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/engineering/atmos/storage) "cSE" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -9048,18 +9287,11 @@ /turf/open/floor/engine, /area/station/engineering/supermatter/room) "cSJ" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/siding/white, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 }, /obj/effect/decal/cleanable/dirt/dust, -/obj/structure/sign/picture_frame/portrait/bar{ - pixel_y = -32 - }, +/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/service/bar) "cSM" = ( @@ -9112,6 +9344,12 @@ /obj/structure/cable, /turf/open/floor/iron/dark/textured, /area/station/security/prison/rec) +"cTw" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/dark_blue/corner, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/mix) "cTz" = ( /obj/machinery/door/airlock/maintenance, /obj/structure/barricade/wooden, @@ -9170,6 +9408,27 @@ /obj/machinery/space_heater, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"cUI" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/dark_blue/line{ + dir = 4 + }, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/mix) +"cUJ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "Atmospherics HFR Shutters" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/trimline/red/filled/warning{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/hfr_room) "cVc" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -9290,6 +9549,13 @@ /obj/machinery/space_heater, /turf/open/floor/plating, /area/station/commons/storage/emergency/port) +"cXH" = ( +/obj/machinery/light/small/directional/west, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 4 + }, +/turf/open/floor/plating/snowed/icemoon, +/area/station/maintenance/starboard/lesser) "cXS" = ( /obj/machinery/door/window/left/directional/east{ dir = 8; @@ -9316,7 +9582,7 @@ /area/station/science/xenobiology) "cXY" = ( /turf/closed/wall/r_wall, -/area/station/science/misc_lab) +/area/station/science/explab) "cXZ" = ( /obj/structure/table/wood, /obj/machinery/computer/security/wooden_tv, @@ -9351,6 +9617,13 @@ /obj/structure/ore_box, /turf/open/floor/iron/dark, /area/mine/eva) +"cYQ" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "cYR" = ( /obj/structure/window/reinforced{ dir = 1 @@ -9372,9 +9645,7 @@ /turf/open/floor/iron/dark/smooth_large, /area/station/medical/storage) "cYS" = ( -/obj/structure/sign/warning/electric_shock{ - pixel_y = 32 - }, +/obj/structure/sign/warning/electric_shock/directional/north, /obj/effect/turf_decal/stripes/corner{ dir = 1 }, @@ -9404,13 +9675,10 @@ /obj/machinery/atmospherics/pipe/smart/simple/dark/visible/layer1{ dir = 8 }, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, /turf/open/floor/iron, /area/station/engineering/atmos) "cZl" = ( -/obj/structure/sign/warning/biohazard{ - pixel_x = -32 - }, +/obj/structure/sign/warning/biohazard/directional/west, /turf/open/openspace, /area/station/medical/medbay/aft) "cZm" = ( @@ -9476,6 +9744,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/cafeteria, /area/station/security/prison/mess) +"daJ" = ( +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/smart/manifold/green/visible{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/project) "daM" = ( /obj/structure/closet/secure_closet/engineering_personal, /obj/machinery/airalarm/directional/north, @@ -9565,12 +9840,22 @@ /turf/open/floor/plating, /area/station/security/prison/safe) "dbN" = ( -/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/directional/south, /obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ dir = 4 }, +/obj/effect/turf_decal/trimline/dark_red/arrow_ccw{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/simple/pink/visible/layer5{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_green/arrow_ccw, +/obj/machinery/atmospherics/pipe/smart/simple/violet/visible/layer1{ + dir = 4 + }, /turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) +/area/station/engineering/atmos/storage) "dcb" = ( /obj/machinery/door/airlock/maintenance{ name = "Garden Maintenance" @@ -9744,9 +10029,8 @@ /obj/effect/turf_decal/siding/wood{ dir = 9 }, -/turf/open/floor/wood{ - icon_state = "wood-broken5" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/security/prison/rec) "dep" = ( /obj/effect/turf_decal/stripes/line, @@ -9822,7 +10106,7 @@ dir = 8 }, /turf/open/floor/iron/white, -/area/station/science/misc_lab) +/area/station/science/explab) "dgk" = ( /obj/effect/spawner/random/vending/snackvend, /obj/effect/turf_decal/stripes/line{ @@ -9860,7 +10144,7 @@ /turf/open/floor/iron/white/side{ dir = 4 }, -/area/station/science/misc_lab) +/area/station/science/explab) "dhk" = ( /obj/structure/table/reinforced, /obj/machinery/camera{ @@ -9904,9 +10188,11 @@ /turf/open/floor/iron/dark/side, /area/station/security/processing) "dhW" = ( -/obj/item/radio/intercom/directional/south, -/obj/structure/closet/secure_closet/freezer/fridge, -/turf/open/floor/iron/cafeteria, +/obj/effect/turf_decal/tile/blue/diagonal_edge, +/obj/structure/window/reinforced/spawner/east, +/obj/machinery/light/directional/south, +/obj/structure/closet/secure_closet/freezer/kitchen, +/turf/open/floor/iron/kitchen/diagonal, /area/station/service/kitchen) "dim" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -9919,7 +10205,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, /obj/effect/mapping_helpers/airlock/access/all/science/research, /turf/open/floor/iron/dark, -/area/station/science/misc_lab) +/area/station/science/explab) "dip" = ( /obj/machinery/holopad, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -9996,7 +10282,7 @@ /obj/item/hatchet, /obj/item/cultivator, /obj/item/crowbar, -/obj/item/reagent_containers/glass/bucket, +/obj/item/reagent_containers/glass/watering_can, /obj/item/plant_analyzer, /obj/machinery/firealarm/directional/west, /obj/effect/turf_decal/tile/green, @@ -10340,7 +10626,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /turf/open/floor/iron/smooth, -/area/station/security/prison) +/area/station/security/execution/transfer) "dos" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/junction{ dir = 4 @@ -10420,9 +10706,8 @@ /area/station/command/gateway) "dqp" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) "dqs" = ( /obj/structure/disposalpipe/segment, @@ -10430,15 +10715,12 @@ /turf/open/floor/iron, /area/station/hallway/primary/central) "dqt" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/tile/bar/opposingcorners, /obj/effect/turf_decal/siding/white{ dir = 4 }, -/obj/structure/extinguisher_cabinet/directional/east, -/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/iron, /area/station/service/bar) "dqw" = ( @@ -10450,10 +10732,13 @@ /turf/open/floor/iron, /area/mine/laborcamp) "dqF" = ( +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/structure/cable, /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/iron/cafeteria, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/kitchen/diagonal, /area/station/service/kitchen) "dqR" = ( /obj/machinery/computer/rdconsole, @@ -10466,6 +10751,12 @@ /obj/effect/turf_decal/tile/green, /turf/open/floor/iron, /area/station/command/bridge) +"dqU" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/service/kitchen/coldroom) "dqX" = ( /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -10512,14 +10803,11 @@ /turf/open/floor/circuit, /area/station/science/robotics/mechbay) "drD" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/service/bar) "drG" = ( @@ -10584,9 +10872,8 @@ /area/station/medical/virology) "dsE" = ( /obj/effect/spawner/random/trash/mess, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/aft) "dsO" = ( /obj/structure/railing/corner{ @@ -10677,9 +10964,8 @@ /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/light/small/broken/directional/north, /obj/machinery/vending/dinnerware, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/aft) "dtC" = ( /obj/effect/turf_decal/tile/neutral{ @@ -10714,7 +11000,7 @@ "dtV" = ( /obj/structure/cable, /turf/open/floor/iron/white/side, -/area/station/science/misc_lab) +/area/station/science/explab) "dtY" = ( /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -10854,9 +11140,8 @@ /area/station/security/brig) "dxa" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/aft/greater) "dxg" = ( /obj/structure/table, @@ -10878,14 +11163,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/wood, /area/station/commons/dorms) -"dxi" = ( -/obj/machinery/door/airlock/freezer{ - name = "Kitchen" - }, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/service/kitchen, -/turf/open/floor/iron/freezer, -/area/station/service/kitchen/coldroom) "dxj" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -10943,6 +11220,17 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"dyc" = ( +/obj/machinery/atmospherics/pipe/smart/simple/violet/visible{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/trimline/dark_green/line, +/obj/effect/turf_decal/trimline/dark_green/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/mix) "dye" = ( /obj/structure/table/wood/fancy/blue, /obj/effect/spawner/random/aimodule/neutral, @@ -10965,23 +11253,18 @@ /turf/open/floor/iron/dark, /area/station/security/courtroom) "dyn" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, /obj/structure/table, /obj/item/crowbar/large, /obj/item/storage/box/lights/mixed, /obj/item/clothing/glasses/meson, /obj/item/clothing/glasses/meson, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, /turf/open/floor/iron, /area/station/engineering/main) "dys" = ( -/obj/structure/sign/warning/secure_area{ - pixel_y = 32 - }, +/obj/structure/sign/warning/secure_area/directional/north, /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, /turf/open/floor/plating, @@ -11051,7 +11334,8 @@ /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ id = "gene_desk_shutters"; - name = "Genetics Shutters" + name = "Genetics Shutters"; + dir = 8 }, /turf/open/floor/plating, /area/station/science/genetics) @@ -11140,22 +11424,16 @@ /turf/closed/wall/r_wall, /area/station/security/prison/visit) "dBb" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 1; - name = "N2 to Airmix" - }, /obj/machinery/light/directional/south, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 1 + }, /turf/open/floor/iron, /area/station/engineering/atmos) "dBh" = ( /obj/machinery/telecomms/server/presets/medical, /turf/open/floor/iron/dark/telecomms, /area/station/tcommsat/server) -"dBi" = ( -/turf/open/floor/wood{ - icon_state = "wood-broken7" - }, -/area/station/maintenance/port/aft) "dBj" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 @@ -11359,13 +11637,9 @@ /turf/open/floor/iron, /area/station/command/bridge) "dEP" = ( -/obj/structure/kitchenspike, -/obj/item/radio/intercom/directional/south, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 - }, -/turf/open/floor/iron/freezer, -/area/station/service/kitchen/coldroom) +/obj/machinery/smartfridge/food, +/turf/closed/wall, +/area/station/service/kitchen) "dEQ" = ( /obj/machinery/camera/directional/east{ c_tag = "Public Mining Ladder" @@ -11500,7 +11774,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, -/area/station/science/mixing) +/area/station/science/ordnance) "dGi" = ( /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/ai_upload) @@ -11523,7 +11797,8 @@ /obj/structure/table/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ id = "briggate"; - name = "Security Shutters" + name = "Security Shutters"; + dir = 4 }, /obj/item/restraints/handcuffs, /obj/item/radio/off, @@ -11538,17 +11813,11 @@ /turf/open/floor/iron/dark, /area/station/security/checkpoint/auxiliary) "dHn" = ( -/obj/structure/table, /obj/effect/turf_decal/siding/white{ dir = 1 }, -/obj/item/reagent_containers/food/condiment/saltshaker{ - pixel_x = -3 - }, -/obj/item/reagent_containers/food/condiment/peppermill{ - pixel_x = 3 - }, -/obj/machinery/light/directional/north, +/obj/structure/chair, +/obj/structure/extinguisher_cabinet/directional/north, /turf/open/floor/iron/white/smooth_large, /area/station/service/kitchen/diner) "dHw" = ( @@ -11600,7 +11869,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /turf/open/floor/plating, -/area/station/security/prison) +/area/station/security/execution/transfer) "dIe" = ( /obj/structure/disposalpipe/segment, /obj/machinery/door/airlock{ @@ -11624,7 +11893,8 @@ }, /obj/machinery/door/poddoor/shutters/preopen{ id = "robotics"; - name = "Robotics Lab Shutters" + name = "Robotics Lab Shutters"; + dir = 1 }, /obj/machinery/door/firedoor, /obj/structure/desk_bell{ @@ -11634,7 +11904,17 @@ /area/station/science/robotics/lab) "dIs" = ( /obj/machinery/atmospherics/pipe/smart/simple/orange/visible, -/turf/open/floor/plating, +/obj/machinery/atmospherics/pipe/smart/simple/pink/visible/layer5{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_red/arrow_ccw{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/dark_green/arrow_ccw, +/obj/machinery/atmospherics/pipe/smart/simple/violet/visible/layer1{ + dir = 4 + }, +/turf/open/floor/iron, /area/station/engineering/atmos) "dIy" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ @@ -11661,9 +11941,8 @@ "dIR" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/construction) "dIS" = ( /obj/structure/disposalpipe/segment{ @@ -11680,9 +11959,8 @@ /area/station/science/xenobiology) "dIW" = ( /obj/machinery/light/small/directional/east, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/aft/lesser) "dIZ" = ( /obj/effect/turf_decal/trimline/green/filled/line{ @@ -11693,11 +11971,15 @@ /turf/open/floor/iron/dark, /area/station/medical/virology) "dJj" = ( -/obj/structure/sink/kitchen{ - pixel_y = 24 +/obj/effect/turf_decal/siding/white{ + dir = 1 }, -/turf/open/floor/iron/freezer, -/area/station/service/kitchen/coldroom) +/obj/machinery/duct, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white/smooth_large, +/area/station/service/kitchen/diner) "dJr" = ( /obj/effect/turf_decal/tile/purple{ dir = 1 @@ -11725,7 +12007,14 @@ "dJH" = ( /obj/machinery/airalarm/directional/east, /turf/open/floor/iron/dark, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) +"dJV" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 1 + }, +/obj/machinery/hydroponics/constructable, +/turf/open/floor/grass, +/area/station/maintenance/starboard/fore) "dJX" = ( /obj/structure/table, /obj/effect/turf_decal/tile/yellow{ @@ -11783,6 +12072,13 @@ }, /turf/open/floor/iron/textured, /area/station/security/brig) +"dKx" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/camera/autoname/directional/east, +/obj/structure/sign/warning/radiation/rad_area/directional/east, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/hfr_room) "dKC" = ( /obj/effect/spawner/structure/window/hollow/reinforced/middle{ dir = 4 @@ -11830,15 +12126,22 @@ "dLf" = ( /turf/closed/wall/r_wall, /area/station/cargo/storage) +"dLn" = ( +/obj/effect/turf_decal/arrows/white{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/engine, +/area/station/engineering/atmos/hfr_room) "dLq" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer2{ dir = 8 }, -/obj/machinery/air_sensor{ - chamber_id = "ordnancegas2" - }, +/obj/machinery/air_sensor/ordnance_freezer_chamber, /turf/open/floor/iron/dark/airless, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/freezerchamber) "dLH" = ( /obj/structure/fence{ dir = 1 @@ -11858,14 +12161,11 @@ "dLV" = ( /obj/effect/spawner/random/trash/mess, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/aft) "dMo" = ( -/obj/structure/sign/warning/no_smoking/circle{ - pixel_x = 32 - }, +/obj/structure/sign/warning/no_smoking/circle/directional/east, /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /obj/structure/sink{ dir = 8; @@ -11920,7 +12220,22 @@ "dMT" = ( /obj/machinery/portable_atmospherics/canister/plasma, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) +"dMV" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/project) +"dMW" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "briggate"; + name = "Security Shutters"; + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/security/checkpoint/auxiliary) "dMX" = ( /obj/structure/chair{ dir = 1; @@ -12010,6 +12325,12 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/cargo/sorting) +"dOB" = ( +/obj/structure/ladder, +/obj/effect/turf_decal/tile/neutral/diagonal_centre, +/obj/effect/turf_decal/tile/dark_blue/diagonal_edge, +/turf/open/floor/iron/dark/diagonal, +/area/station/engineering/atmos/storage) "dOC" = ( /obj/structure/closet/wardrobe/mixed, /turf/open/floor/plating, @@ -12111,6 +12432,10 @@ dir = 1 }, /area/station/maintenance/department/cargo) +"dQh" = ( +/obj/machinery/light/dim/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/department/crew_quarters/bar) "dQk" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/machinery/power/apc/auto_name/directional/west, @@ -12160,9 +12485,8 @@ /obj/machinery/shower{ dir = 1 }, -/obj/structure/sign/warning/gas_mask{ - desc = "A sign that warns of dangerous gasses in the air, instructing you to wear internals."; - pixel_y = -32 +/obj/structure/sign/warning/gas_mask/directional/south{ + desc = "A sign that warns of dangerous gasses in the air, instructing you to wear internals." }, /turf/open/floor/iron/smooth, /area/mine/eva/lower) @@ -12204,15 +12528,12 @@ /turf/open/floor/iron/white, /area/station/medical/virology) "dRK" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "kitchen"; - name = "Kitchen Shutters" +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/structure/disposalpipe/segment{ + dir = 6 }, -/obj/structure/displaycase/forsale/kitchen, -/obj/machinery/door/firedoor, -/obj/machinery/newscaster/directional/north, -/turf/open/floor/iron/cafeteria, +/obj/effect/landmark/start/cook, +/turf/open/floor/iron/kitchen/diagonal, /area/station/service/kitchen) "dSl" = ( /obj/structure/railing/corner{ @@ -12382,7 +12703,7 @@ dir = 8 }, /turf/open/floor/iron/white, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "dUG" = ( /obj/machinery/door/airlock/public/glass{ name = "Showers" @@ -12484,12 +12805,11 @@ /area/station/science/research) "dWA" = ( /obj/effect/turf_decal/tile/red/full, -/obj/structure/chair, /obj/effect/turf_decal/siding/white{ dir = 8 }, +/obj/structure/chair, /obj/machinery/light/directional/west, -/obj/structure/sign/poster/random/directional/west, /turf/open/floor/iron/large, /area/station/service/kitchen/diner) "dWB" = ( @@ -12609,6 +12929,12 @@ "dXT" = ( /turf/closed/wall/r_wall, /area/station/ai_monitored/turret_protected/aisat/hallway) +"dYa" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/dark_blue/line, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/mix) "dYn" = ( /obj/effect/turf_decal/tile/blue{ dir = 1 @@ -12640,9 +12966,8 @@ /area/station/commons/locker) "dYW" = ( /obj/structure/closet/firecloset, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/aft) "dYX" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -12674,6 +12999,13 @@ /obj/machinery/power/apc/auto_name/directional/west, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"dZQ" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8; + name = "Port to Infiltrate/Filter" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "dZS" = ( /obj/structure/railing/corner{ dir = 4 @@ -12768,10 +13100,10 @@ /turf/open/floor/iron, /area/station/maintenance/starboard/aft) "ebA" = ( +/obj/structure/flora/grass/green/style_random, /mob/living/simple_animal/pet/penguin/emperor{ name = "Club" }, -/obj/structure/flora/grass/green/style_random, /turf/open/misc/asteroid/snow/standard_air, /area/station/science/research) "ebB" = ( @@ -12789,9 +13121,7 @@ /obj/effect/turf_decal/caution{ dir = 4 }, -/obj/structure/sign/warning/cold_temp{ - pixel_y = 32 - }, +/obj/structure/sign/warning/cold_temp/directional/north, /turf/open/floor/iron/smooth, /area/station/cargo/drone_bay) "ecs" = ( @@ -12876,6 +13206,9 @@ /obj/structure/cable, /turf/open/floor/iron/large, /area/station/engineering/atmos/storage/gas) +"edN" = ( +/turf/open/genturf, +/area/icemoon/underground/unexplored/rivers/deep/shoreline) "edT" = ( /obj/structure/grille/broken, /turf/open/floor/plating, @@ -12897,6 +13230,13 @@ }, /turf/open/floor/iron, /area/station/command/heads_quarters/hop) +"eeg" = ( +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/start/cook, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) "eeF" = ( /obj/item/cigbutt/cigarbutt, /obj/effect/decal/cleanable/blood/old, @@ -12959,6 +13299,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 }, +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance/departmental, /obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) @@ -12987,6 +13328,13 @@ /obj/machinery/iv_drip, /turf/open/floor/iron/white, /area/station/medical/treatment_center) +"efL" = ( +/obj/effect/decal/cleanable/cobweb, +/obj/structure/cable, +/obj/structure/closet/secure_closet/atmospherics, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/dark, +/area/station/maintenance/disposal/incinerator) "efM" = ( /obj/structure/closet/crate/grave, /turf/open/misc/dirt{ @@ -13098,11 +13446,6 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/command/heads_quarters/hos) -"ehC" = ( -/turf/open/floor/wood{ - icon_state = "wood-broken7" - }, -/area/station/service/library) "ehJ" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -13110,12 +13453,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/engineering/engine_smes) -"ehK" = ( -/obj/structure/cable, -/turf/open/floor/wood{ - icon_state = "wood-broken3" - }, -/area/station/maintenance/fore/lesser) "ehM" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/red/warning{ @@ -13250,6 +13587,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"eja" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/engine, +/area/station/engineering/atmos/hfr_room) "ejn" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -13320,16 +13663,6 @@ /obj/machinery/light/directional/north, /turf/open/floor/iron/white, /area/station/medical/pharmacy) -"ekE" = ( -/obj/effect/turf_decal/siding/white{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/machinery/airalarm/directional/east, -/turf/open/floor/iron/white/smooth_large, -/area/station/service/kitchen/diner) "ekJ" = ( /obj/structure/stairs/east, /turf/open/floor/iron/dark/textured, @@ -13357,10 +13690,6 @@ /obj/machinery/bluespace_vendor/directional/north, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"elE" = ( -/obj/structure/cable, -/turf/open/floor/iron/grimy, -/area/station/ai_monitored/turret_protected/aisat_interior) "emp" = ( /turf/open/floor/iron/dark/side{ dir = 1 @@ -13503,6 +13832,12 @@ /obj/machinery/light/directional/north, /turf/open/floor/carpet, /area/station/service/theater) +"eqb" = ( +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 5 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/project) "eqc" = ( /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -13682,8 +14017,9 @@ "erQ" = ( /obj/machinery/portable_atmospherics/canister, /obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/bot, /turf/open/floor/iron, -/area/station/engineering/atmos/project) +/area/station/engineering/atmos/storage) "erY" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -13771,9 +14107,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 10 }, -/obj/structure/sign/warning/xeno_mining{ - pixel_y = -32 - }, +/obj/structure/sign/warning/xeno_mining/directional/south, /turf/open/floor/plating/elevatorshaft, /area/mine/storage) "etV" = ( @@ -13819,7 +14153,7 @@ network = list("ss13","rd") }, /turf/open/floor/iron, -/area/station/science/misc_lab) +/area/station/science/explab) "euF" = ( /obj/machinery/door/airlock/atmos{ name = "Atmospherics Maintenance" @@ -13876,11 +14210,9 @@ /turf/open/floor/iron/dark, /area/station/service/chapel) "ewN" = ( -/obj/machinery/deepfryer, -/obj/machinery/camera/directional/south{ - c_tag = "Service-Kitchen Top" - }, -/turf/open/floor/iron/cafeteria, +/obj/effect/turf_decal/tile/blue/diagonal_edge, +/obj/machinery/chem_master/condimaster, +/turf/open/floor/iron/kitchen/diagonal, /area/station/service/kitchen) "ewO" = ( /obj/effect/landmark/event_spawn, @@ -13890,6 +14222,9 @@ /obj/structure/cable, /turf/open/floor/wood, /area/station/hallway/secondary/service) +"ewZ" = ( +/turf/closed/wall/r_wall, +/area/station/science/ordnance/office) "exe" = ( /obj/effect/turf_decal/siding/yellow/end{ dir = 8 @@ -14005,17 +14340,6 @@ /obj/effect/mapping_helpers/airlock/access/all/medical/general, /turf/open/floor/iron/freezer, /area/station/medical/break_room) -"ezj" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/machinery/door/airlock/external{ - name = "MiniSat External Access" - }, -/obj/effect/mapping_helpers/airlock/access/all/command/ai_upload, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat_interior) "ezq" = ( /obj/structure/table, /obj/item/stamp, @@ -14042,14 +14366,6 @@ /obj/machinery/light/directional/north, /turf/open/floor/iron/dark/side, /area/station/security/processing) -"ezU" = ( -/obj/effect/turf_decal/tile/red/full, -/obj/effect/turf_decal/siding/white, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/large, -/area/station/service/kitchen/diner) "ezX" = ( /obj/structure/chair/stool/directional/north, /obj/effect/decal/cleanable/dirt, @@ -14079,7 +14395,7 @@ /obj/machinery/light/directional/north, /obj/machinery/firealarm/directional/north, /turf/open/floor/iron/white, -/area/station/science/mixing/hallway) +/area/station/science/ordnance) "eAw" = ( /obj/structure/cable/multilayer/multiz, /turf/open/floor/plating/snowed/icemoon, @@ -14122,17 +14438,9 @@ /turf/open/floor/iron/textured_half, /area/station/service/hydroponics) "eBm" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/siding/white{ - dir = 6 - }, -/obj/machinery/duct, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/effect/turf_decal/siding/white/corner, +/obj/machinery/firealarm/directional/south, /turf/open/floor/iron, /area/station/service/bar) "eBv" = ( @@ -14272,9 +14580,8 @@ /area/station/medical/storage) "eDe" = ( /mob/living/simple_animal/bot/secbot/beepsky, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/fore/lesser) "eDi" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -14398,12 +14705,8 @@ /turf/open/floor/iron/cafeteria, /area/station/hallway/secondary/exit/departure_lounge) "eFi" = ( -/obj/structure/sign/warning/cold_temp{ - pixel_y = -32 - }, -/obj/structure/sign/warning/gas_mask{ - pixel_y = 32 - }, +/obj/structure/sign/warning/cold_temp/directional/south, +/obj/structure/sign/warning/gas_mask/directional/north, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) "eFn" = ( @@ -14425,15 +14728,9 @@ /turf/closed/wall/ice, /area/icemoon/underground/explored) "eFx" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, /obj/structure/closet/radiation, -/obj/structure/sign/warning/electric_shock{ - pixel_y = 32 +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 }, /turf/open/floor/iron, /area/station/engineering/main) @@ -14442,7 +14739,7 @@ dir = 1 }, /turf/open/floor/iron, -/area/station/science/mixing) +/area/station/science/ordnance) "eFS" = ( /obj/machinery/door/airlock/maintenance{ name = "Mech Bay Maintenance" @@ -14457,6 +14754,11 @@ /obj/structure/chair/stool/directional/south, /turf/open/floor/wood, /area/station/commons/dorms) +"eGg" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/project) "eGj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/textured, @@ -14477,6 +14779,12 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/security/prison/visit) +"eGG" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/project) "eGK" = ( /obj/structure/closet, /obj/effect/spawner/random/entertainment/drugs, @@ -14752,14 +15060,6 @@ /obj/machinery/space_heater, /turf/open/floor/plating, /area/station/maintenance/fore/lesser) -"eKV" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/duct, -/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ - dir = 4 - }, -/turf/open/floor/iron/freezer, -/area/station/service/kitchen/coldroom) "eKW" = ( /obj/effect/turf_decal/trimline/yellow/filled/corner{ dir = 4 @@ -14832,6 +15132,7 @@ }, /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/east, +/obj/machinery/light/directional/east, /turf/open/floor/iron/white, /area/station/medical/surgery/aft) "eMr" = ( @@ -14868,6 +15169,14 @@ /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"eMY" = ( +/obj/effect/turf_decal/tile/neutral/diagonal_centre, +/obj/machinery/atmospherics/pipe/multiz/violet/visible{ + name = "Infiltrate" + }, +/obj/effect/turf_decal/tile/dark_green/diagonal_edge, +/turf/open/floor/iron/dark/diagonal, +/area/station/engineering/atmos/mix) "eNh" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -14922,7 +15231,7 @@ /obj/item/storage/box/firingpins, /obj/item/key/security, /obj/machinery/light/directional/east, -/obj/item/radio/intercom/prison/directional/east, +/obj/item/radio/intercom/directional/east, /turf/open/floor/iron/dark/textured, /area/station/ai_monitored/security/armory/upper) "eOc" = ( @@ -14986,7 +15295,7 @@ "ePj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, -/area/station/science/misc_lab) +/area/station/science/explab) "ePl" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/effect/turf_decal/tile/green{ @@ -15016,7 +15325,30 @@ /obj/effect/turf_decal/tile/brown, /turf/open/floor/iron, /area/station/cargo/qm) +"ePI" = ( +/obj/machinery/atmospherics/pipe/smart/simple/green/visible, +/obj/machinery/atmospherics/pipe/smart/simple/pink/visible/layer5{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/violet/visible/layer1{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"ePK" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/structure/railing/corner, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage) "ePP" = ( +/obj/structure/sign/warning/cold_temp/directional/west, +/obj/structure/sign/warning/gas_mask/directional/east, /turf/open/floor/plating, /area/station/engineering/atmos) "ePR" = ( @@ -15044,9 +15376,8 @@ pixel_x = -10; pixel_y = 2 }, -/turf/open/floor/wood{ - icon_state = "wood-broken5" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/maintenance/fore/lesser) "eQx" = ( /obj/effect/turf_decal/tile/neutral, @@ -15110,9 +15441,7 @@ /area/station/maintenance/department/medical/central) "eRA" = ( /obj/effect/turf_decal/bot, -/obj/structure/sign/warning/cold_temp{ - pixel_y = 32 - }, +/obj/structure/sign/warning/cold_temp/directional/north, /obj/structure/sign/warning/xeno_mining{ pixel_x = 29 }, @@ -15209,7 +15538,7 @@ "eTg" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "eTi" = ( /obj/machinery/telecomms/broadcaster/preset_left, /turf/open/floor/iron/dark/telecomms, @@ -15228,9 +15557,7 @@ /turf/open/floor/iron/large, /area/station/engineering/main) "eTG" = ( -/obj/structure/sign/warning/cold_temp{ - pixel_y = 32 - }, +/obj/structure/sign/warning/cold_temp/directional/north, /turf/open/floor/iron/smooth, /area/station/cargo/warehouse) "eTM" = ( @@ -15243,6 +15570,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) +"eTO" = ( +/obj/item/food/chococoin, +/obj/structure/closet/secure_closet/freezer/kitchen, +/turf/open/misc/ice/coldroom, +/area/station/service/kitchen/coldroom) "eTP" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -15250,11 +15582,6 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/maintenance/starboard/fore) -"eTX" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, -/area/station/maintenance/port/aft) "eTY" = ( /obj/structure/table, /obj/item/clothing/shoes/jackboots, @@ -15270,16 +15597,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"eUr" = ( -/obj/machinery/porta_turret/ai{ - dir = 4 - }, -/obj/structure/sign/warning/secure_area{ - pixel_x = 32 - }, -/obj/effect/turf_decal/tile/blue, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) "eUy" = ( /obj/machinery/computer/upload/ai{ dir = 1 @@ -15562,11 +15879,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, -/obj/structure/disposalpipe/sorting/mail{ - dir = 4; - sortType = 20 - }, /obj/machinery/duct, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/floor/iron, /area/station/hallway/secondary/service) "eYe" = ( @@ -15604,7 +15920,7 @@ }, /obj/machinery/airalarm/directional/east, /turf/open/floor/iron/dark/textured, -/area/station/security/prison) +/area/station/security/execution/transfer) "eYn" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 4 @@ -15623,7 +15939,8 @@ /obj/machinery/door/firedoor, /obj/machinery/door/poddoor/shutters{ id = "commissaryshutter"; - name = "Vacant Commissary Shutter" + name = "Vacant Commissary Shutter"; + dir = 4 }, /turf/open/floor/iron, /area/station/commons/vacant_room/commissary) @@ -15653,6 +15970,9 @@ /obj/effect/landmark/xeno_spawn, /turf/open/floor/iron/white, /area/station/maintenance/port/fore) +"eYH" = ( +/turf/closed/wall, +/area/station/engineering/atmos/hfr_room) "eYI" = ( /obj/structure/railing, /obj/effect/turf_decal/tile/neutral{ @@ -15707,6 +16027,12 @@ /obj/machinery/portable_atmospherics/canister/nitrous_oxide, /turf/open/floor/engine/n2o, /area/station/engineering/atmos) +"eZd" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/maintenance/three, +/obj/structure/closet/crate, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/morgue) "eZi" = ( /obj/machinery/drone_dispenser, /turf/open/floor/plating, @@ -15722,11 +16048,6 @@ }, /turf/open/floor/iron, /area/station/service/hydroponics) -"eZm" = ( -/obj/structure/disposalpipe/segment, -/obj/item/trash/raisins, -/turf/open/floor/plating, -/area/station/maintenance/aft/greater) "eZo" = ( /obj/structure/cable/multilayer/multiz, /turf/open/floor/plating, @@ -15760,6 +16081,18 @@ }, /turf/open/floor/iron, /area/station/cargo/sorting) +"eZC" = ( +/obj/machinery/door/airlock/maintenance_hatch, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/duct, +/obj/machinery/door/firedoor/heavy, +/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/morgue) "eZJ" = ( /obj/machinery/mineral/stacking_machine{ input_dir = 1; @@ -15773,6 +16106,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/engineering/main) +"eZR" = ( +/obj/structure/lattice/catwalk, +/turf/open/openspace, +/area/station/engineering/atmos/storage) "eZW" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -15813,11 +16150,6 @@ }, /turf/open/floor/iron/cafeteria, /area/station/command/heads_quarters/rd) -"faX" = ( -/obj/effect/turf_decal/tile/red/full, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/iron/large, -/area/station/service/kitchen/diner) "faZ" = ( /obj/structure/disposalpipe/sorting/mail/flip{ dir = 2; @@ -15845,7 +16177,7 @@ }, /obj/item/storage/box/prisoner, /turf/open/floor/iron/smooth, -/area/station/security/prison) +/area/station/security/execution/transfer) "fbh" = ( /obj/machinery/power/tracker, /obj/structure/cable, @@ -15877,19 +16209,15 @@ /area/station/maintenance/fore/greater) "fbI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/structure/sign/poster/random/directional/east, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) +/turf/open/floor/plating/snowed/coldroom, +/area/station/service/kitchen/coldroom) "fbP" = ( -/obj/structure/railing/corner, /obj/structure/table, -/obj/item/holosign_creator/robot_seat/restaurant, -/turf/open/floor/iron/cafeteria, +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/machinery/reagentgrinder{ + pixel_y = 9 + }, +/turf/open/floor/iron/kitchen/diagonal, /area/station/service/kitchen) "fct" = ( /obj/structure/table, @@ -15900,7 +16228,7 @@ /turf/open/floor/iron/white/side{ dir = 1 }, -/area/station/science/misc_lab) +/area/station/science/explab) "fcz" = ( /obj/machinery/vending/cigarette, /obj/machinery/light/small/directional/south, @@ -15923,9 +16251,8 @@ /area/station/commons/vacant_room/commissary) "fcF" = ( /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/fore/lesser) "fcN" = ( /obj/machinery/atmospherics/pipe/smart/manifold/general/visible{ @@ -15952,7 +16279,7 @@ }, /obj/machinery/light/directional/south, /turf/open/floor/engine, -/area/station/science/misc_lab) +/area/station/science/explab) "fcY" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -15987,7 +16314,8 @@ }, /obj/machinery/door/poddoor/shutters/window{ id = "drone_bay"; - name = "Drone Bay Shutters" + name = "Drone Bay Shutters"; + dir = 8 }, /obj/effect/turf_decal/trimline/yellow/mid_joiner, /obj/effect/turf_decal/trimline/yellow/mid_joiner{ @@ -16043,6 +16371,21 @@ /obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden, /turf/closed/wall, /area/station/medical/cryo) +"fex" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/pipe/smart/simple/pink/visible{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_red/line, +/obj/effect/turf_decal/trimline/dark_red/line{ + dir = 1 + }, +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/trimline/dark_blue/mid_joiner{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/mix) "fez" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/crate, @@ -16060,6 +16403,13 @@ /obj/machinery/airalarm/directional/east, /turf/open/floor/iron, /area/station/cargo/miningdock) +"feG" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) "feQ" = ( /obj/machinery/portable_atmospherics/canister/air, /turf/open/floor/plating, @@ -16157,6 +16507,19 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat/atmos) +"fgY" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/pipe/smart/simple/pink/visible{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_blue/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/dark_red/end{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/mix) "fhb" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -16186,6 +16549,16 @@ /obj/effect/turf_decal/loading_area, /turf/open/floor/iron, /area/station/cargo/lobby) +"fhx" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/railing{ + dir = 8 + }, +/turf/open/openspace, +/area/station/engineering/atmos/storage) "fhJ" = ( /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -16236,11 +16609,27 @@ /turf/open/floor/iron/white, /area/station/maintenance/fore/greater) "fib" = ( -/obj/machinery/door/airlock/atmos{ +/obj/machinery/door/airlock/atmos/glass{ name = "Atmospherics" }, /obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, -/turf/open/floor/plating, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/pink/visible/layer5{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_red/arrow_ccw{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/dark_green/arrow_ccw, +/obj/machinery/atmospherics/pipe/smart/simple/violet/visible/layer1{ + dir = 4 + }, +/turf/open/floor/iron, /area/station/engineering/atmos) "fii" = ( /obj/effect/spawner/structure/window/reinforced, @@ -16317,7 +16706,8 @@ /obj/structure/cable, /obj/machinery/door/poddoor/shutters/preopen{ id = "lower_chapel_shutters"; - name = "Graveyard Shutters" + name = "Graveyard Shutters"; + dir = 8 }, /turf/open/floor/plating, /area/station/service/chapel) @@ -16337,20 +16727,16 @@ "fju" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron, -/area/station/science/mixing) +/area/station/science/ordnance) "fjw" = ( /obj/machinery/smartfridge, /turf/closed/wall, /area/station/service/hydroponics) "fjy" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) +/obj/machinery/light/cold/directional/west, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/plating/snowed/coldroom, +/area/station/service/kitchen/coldroom) "fjC" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/wood/parquet, @@ -16420,12 +16806,24 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, -/obj/machinery/door/airlock/external{ - name = "Supply Dock Airlock" +/obj/machinery/door/airlock/external/glass{ + name = "Supply Door Airlock" }, /obj/effect/mapping_helpers/airlock/access/all/supply/general, /turf/open/floor/plating, /area/station/cargo/storage) +"fks" = ( +/obj/effect/spawner/random/structure/steam_vent, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/aft/lesser) +"fkv" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, +/area/station/engineering/atmos/hfr_room) "fkC" = ( /obj/machinery/light_switch/directional/north, /obj/item/storage/box/lights/mixed, @@ -16611,7 +17009,23 @@ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) +"fnS" = ( +/obj/structure/sign/warning/secure_area/directional/west, +/obj/machinery/porta_turret/ai{ + dir = 4 + }, +/obj/item/radio/intercom/directional/south{ + freerange = 1; + frequency = 1447; + listening = 0; + name = "Private Channel" + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat_interior) "fob" = ( /obj/structure/sink{ dir = 8; @@ -16630,9 +17044,7 @@ /turf/open/floor/iron/dark, /area/station/medical/storage) "foL" = ( -/obj/structure/sign/warning/secure_area{ - pixel_y = 32 - }, +/obj/structure/sign/warning/secure_area/directional/north, /obj/effect/turf_decal/stripes/red/line{ dir = 1 }, @@ -16669,7 +17081,7 @@ /obj/item/stack/sheet/mineral/plasma, /obj/machinery/firealarm/directional/north, /turf/open/floor/iron, -/area/station/science/misc_lab) +/area/station/science/explab) "fps" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 9 @@ -16726,7 +17138,7 @@ "fpG" = ( /obj/item/radio/intercom/directional/north, /turf/open/floor/iron/white, -/area/station/science/mixing/hallway) +/area/station/science/ordnance) "fpJ" = ( /obj/structure/fireaxecabinet/directional/west, /obj/machinery/suit_storage_unit/atmos, @@ -16745,7 +17157,7 @@ /area/station/hallway/secondary/service) "fqc" = ( /turf/open/floor/engine, -/area/station/science/misc_lab) +/area/station/science/explab) "fqn" = ( /obj/machinery/light/small/directional/east, /obj/machinery/light_switch/directional/east, @@ -16828,7 +17240,7 @@ pixel_x = 24 }, /turf/open/floor/iron/dark, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/freezerchamber) "frO" = ( /obj/machinery/suit_storage_unit/standard_unit, /obj/machinery/light/directional/south, @@ -16853,9 +17265,8 @@ "frQ" = ( /obj/effect/decal/cleanable/cobweb, /obj/effect/spawner/random/structure/crate, -/turf/open/floor/wood{ - icon_state = "wood-broken3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/maintenance/port/fore) "frS" = ( /obj/effect/spawner/structure/window/reinforced, @@ -16895,6 +17306,8 @@ /obj/structure/disposalpipe/segment{ dir = 5 }, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/south, /turf/open/floor/iron/dark, /area/station/science/breakroom) "fsO" = ( @@ -16971,6 +17384,11 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) +"ftZ" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/holopad, +/turf/open/floor/iron, +/area/station/engineering/atmos) "fue" = ( /obj/structure/table/wood, /obj/item/flashlight/lamp/green, @@ -17128,6 +17546,7 @@ }, /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/east, +/obj/machinery/light/directional/east, /turf/open/floor/iron/white, /area/station/medical/surgery/fore) "fxf" = ( @@ -17137,7 +17556,8 @@ /obj/machinery/door/firedoor, /obj/machinery/door/poddoor/shutters/window{ id = "chemistry_access_shutters"; - name = "Chemistry Access Shutters" + name = "Chemistry Access Shutters"; + dir = 4 }, /turf/open/floor/iron/white/textured, /area/station/medical/treatment_center) @@ -17148,9 +17568,7 @@ }, /obj/machinery/light/directional/north, /obj/effect/turf_decal/tile/yellow/full, -/obj/structure/sign/warning/no_smoking{ - pixel_y = 32 - }, +/obj/structure/sign/warning/no_smoking/directional/north, /turf/open/floor/iron/white/smooth_large, /area/station/medical/pharmacy) "fxl" = ( @@ -17171,9 +17589,7 @@ /turf/open/floor/wood, /area/station/commons/vacant_room/office) "fxK" = ( -/obj/structure/sign/warning/secure_area{ - pixel_x = -32 - }, +/obj/structure/sign/warning/secure_area/directional/west, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/blue{ dir = 1 @@ -17206,7 +17622,8 @@ /obj/machinery/door/firedoor, /obj/machinery/door/poddoor/shutters/window{ id = "chemistry_access_shutters"; - name = "Chemistry Access Shutters" + name = "Chemistry Access Shutters"; + dir = 4 }, /turf/open/floor/iron/white/textured, /area/station/medical/treatment_center) @@ -17269,7 +17686,7 @@ "fzD" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/red, -/obj/item/radio/intercom/prison/directional/east, +/obj/item/radio/intercom/directional/east, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -17304,9 +17721,7 @@ /turf/open/floor/iron/white, /area/station/science/genetics) "fzT" = ( -/obj/structure/sign/warning/cold_temp{ - pixel_y = 32 - }, +/obj/structure/sign/warning/cold_temp/directional/north, /obj/effect/spawner/structure/window/hollow/reinforced/end, /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) @@ -17405,6 +17820,22 @@ }, /turf/open/floor/iron/textured, /area/station/security/brig) +"fCe" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/trimline/dark_red/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/simple/pink/visible{ + dir = 10 + }, +/obj/effect/turf_decal/trimline/dark_blue/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/dark_red/line{ + dir = 5 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/mix) "fCw" = ( /obj/machinery/door/morgue{ name = "Relic Closet"; @@ -17438,9 +17869,8 @@ /turf/open/floor/plating, /area/station/engineering/supermatter/room) "fDv" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "fDB" = ( /obj/machinery/door/airlock/maintenance{ @@ -17468,12 +17898,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/central) -"fEh" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos/project) "fEA" = ( /obj/structure/cable, /obj/machinery/door/airlock/maintenance{ @@ -17597,8 +18021,6 @@ /obj/effect/turf_decal/tile/brown{ dir = 1 }, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/cable, /turf/open/floor/iron, /area/station/cargo/qm) "fGn" = ( @@ -17627,15 +18049,13 @@ pixel_y = -2 }, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance/office) "fGq" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/toilet{ dir = 8 }, -/obj/item/radio/intercom/prison/directional/east{ - frequency = 1359 - }, +/obj/item/radio/intercom/directional/east, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, @@ -17658,18 +18078,12 @@ dir = 1 }, /turf/open/floor/iron/white/side, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "fGO" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, /area/station/hallway/primary/port) -"fGT" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos/project) "fHb" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/warning/cold_temp, @@ -17747,7 +18161,7 @@ /obj/machinery/door/firedoor/heavy, /obj/effect/mapping_helpers/airlock/access/all/science/ordnance, /turf/open/floor/plating, -/area/station/science/mixing) +/area/station/science/ordnance) "fIs" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 @@ -17818,11 +18232,6 @@ }, /turf/open/floor/iron, /area/station/ai_monitored/command/storage/eva) -"fJI" = ( -/obj/machinery/firealarm/directional/east, -/obj/structure/closet/emcloset, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) "fJL" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/monitored/nitrogen_input{ dir = 1 @@ -17832,6 +18241,16 @@ "fJZ" = ( /turf/closed/wall/r_wall, /area/station/ai_monitored/command/storage/eva) +"fKe" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/trimline/dark_blue/line{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/mix) "fKf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, @@ -17909,6 +18328,13 @@ }, /turf/open/floor/iron/freezer, /area/station/maintenance/starboard/fore) +"fKQ" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/trimline/dark_blue/corner{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/mix) "fLb" = ( /obj/structure/sink{ dir = 8; @@ -17976,6 +18402,13 @@ /obj/structure/cable, /turf/open/floor/iron/dark/textured, /area/station/security/range) +"fLI" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) "fLP" = ( /obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ dir = 10 @@ -18035,9 +18468,8 @@ /area/station/medical/medbay/aft) "fMB" = ( /obj/effect/landmark/xeno_spawn, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/aft/greater) "fMJ" = ( /obj/structure/chair{ @@ -18113,12 +18545,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/commons/dorms) -"fNM" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on/coldroom{ - dir = 1 - }, -/turf/open/floor/iron/freezer, -/area/station/service/kitchen/coldroom) "fNN" = ( /obj/structure/cable, /turf/open/floor/engine, @@ -18213,19 +18639,15 @@ /turf/open/floor/plating, /area/station/hallway/secondary/exit/departure_lounge) "fPY" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/red/full, /obj/effect/turf_decal/siding/white{ dir = 1 }, -/obj/item/reagent_containers/food/condiment/saltshaker{ - pixel_x = -3 - }, -/obj/item/reagent_containers/food/condiment/peppermill{ - pixel_x = 3 +/obj/structure/chair{ + dir = 4 }, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/large, +/obj/structure/sign/poster/random/directional/north, +/obj/machinery/camera/autoname/directional/north, +/turf/open/floor/iron/white/smooth_large, /area/station/service/kitchen/diner) "fQc" = ( /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ @@ -18292,6 +18714,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply, /turf/open/floor/iron/dark, /area/station/medical/virology) +"fRA" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) "fRG" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -18349,7 +18778,7 @@ dir = 6 }, /turf/open/floor/plating/icemoon, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "fSj" = ( /obj/effect/decal/cleanable/oil, /turf/open/floor/plating, @@ -18360,6 +18789,13 @@ }, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) +"fSE" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/cable, +/obj/machinery/newscaster/directional/south, +/obj/effect/turf_decal/trimline/dark_blue/line, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/mix) "fTb" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -18397,10 +18833,6 @@ }, /turf/open/floor/iron/white, /area/station/science/xenobiology) -"fTw" = ( -/obj/effect/spawner/structure/window, -/turf/open/floor/plating, -/area/station/service/bar/atrium) "fTB" = ( /obj/machinery/power/turbine/core_rotor{ dir = 8; @@ -18449,6 +18881,15 @@ /obj/structure/closet/emcloset, /turf/open/floor/iron, /area/station/hallway/primary/port) +"fUA" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/cable, +/obj/machinery/light/directional/east, +/obj/effect/turf_decal/trimline/dark_blue/line{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/mix) "fUI" = ( /obj/structure/sign/warning/electric_shock, /turf/closed/wall/r_wall, @@ -18643,6 +19084,12 @@ /obj/machinery/light/directional/north, /turf/open/floor/iron/dark/corner, /area/station/security/processing) +"fXj" = ( +/obj/machinery/atmospherics/pipe/layer_manifold/general/visible{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "fXr" = ( /turf/open/floor/iron/white/corner{ dir = 8 @@ -18787,7 +19234,7 @@ dir = 8 }, /turf/open/floor/iron/dark, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "fZR" = ( /obj/machinery/door/window/right/directional/east{ base_state = "left"; @@ -18799,9 +19246,7 @@ /obj/item/folder/white, /obj/item/pen, /obj/machinery/door/firedoor, -/obj/structure/sign/warning/fire{ - pixel_x = -32 - }, +/obj/structure/sign/warning/fire/directional/west, /obj/structure/table/reinforced, /turf/open/floor/plating, /area/station/medical/treatment_center) @@ -18884,15 +19329,6 @@ }, /turf/open/floor/iron, /area/station/command/heads_quarters/rd) -"gaV" = ( -/obj/effect/turf_decal/siding/white{ - dir = 4 - }, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/iron/white/smooth_large, -/area/station/service/kitchen/diner) "gbq" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/light/small/directional/west, @@ -19041,8 +19477,12 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/corner, /area/station/hallway/secondary/entry) +"gdz" = ( +/turf/closed/wall/r_wall, +/area/station/science/ordnance/burnchamber) "gdC" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -19054,14 +19494,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) -"gdE" = ( -/obj/item/radio/intercom/directional/south, -/obj/machinery/light/small/directional/south, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat_interior) "gdP" = ( /obj/structure/cable, /turf/open/floor/plating, @@ -19106,9 +19538,7 @@ /area/station/maintenance/department/medical/central) "geS" = ( /obj/machinery/light/directional/west, -/obj/structure/sign/departments/chemistry{ - pixel_x = -32 - }, +/obj/structure/sign/departments/chemistry/directional/west, /obj/machinery/holopad, /obj/effect/turf_decal/box/white{ color = "#52B4E9" @@ -19127,9 +19557,7 @@ /turf/open/floor/plating, /area/station/maintenance/aft/lesser) "geZ" = ( -/obj/structure/sign/warning/gas_mask{ - pixel_y = -32 - }, +/obj/structure/sign/warning/gas_mask/directional/south, /obj/effect/spawner/random/trash/grille_or_waste, /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) @@ -19164,10 +19592,10 @@ /turf/open/floor/iron/checker, /area/station/science/lab) "gfU" = ( -/obj/structure/table, /obj/effect/turf_decal/siding/white{ dir = 8 }, +/obj/structure/table, /obj/item/reagent_containers/food/condiment/saltshaker{ pixel_x = -3 }, @@ -19181,7 +19609,7 @@ dir = 4 }, /turf/open/floor/iron/dark/textured, -/area/station/security/prison) +/area/station/security/execution/transfer) "ggc" = ( /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, @@ -19200,13 +19628,10 @@ /turf/open/floor/plating, /area/station/maintenance/port/greater) "ggp" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ +/obj/structure/cable, +/obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 8 }, -/obj/structure/cable, /turf/open/floor/iron/dark, /area/station/engineering/transit_tube) "ggG" = ( @@ -19214,22 +19639,13 @@ /turf/open/floor/iron, /area/station/engineering/storage_shared) "ggV" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/station/service/kitchen/diner) -"ghe" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 6 - }, -/obj/structure/table, -/obj/machinery/camera/directional/west{ - c_tag = "Service-Cold Room" - }, -/obj/machinery/processor{ - pixel_y = 6 +/obj/effect/turf_decal/tile/red/full, +/obj/effect/turf_decal/siding/white{ + dir = 10 }, -/turf/open/floor/iron/freezer, -/area/station/service/kitchen/coldroom) +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron/large, +/area/station/service/kitchen/diner) "ghl" = ( /obj/structure/industrial_lift, /turf/open/openspace, @@ -19237,6 +19653,10 @@ "ghx" = ( /turf/open/lava/plasma/ice_moon, /area/icemoon/underground/explored) +"ghy" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/aft/lesser) "ghE" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/red{ @@ -19315,11 +19735,9 @@ /turf/open/floor/iron/cafeteria{ dir = 8 }, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "giM" = ( -/obj/structure/sign/warning/secure_area{ - pixel_x = 32 - }, +/obj/structure/sign/warning/secure_area/directional/east, /obj/machinery/door/firedoor, /obj/machinery/door/poddoor/preopen{ id = "bridge blast"; @@ -19394,7 +19812,7 @@ dir = 8 }, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "gjq" = ( /turf/open/openspace/icemoon/keep_below, /area/icemoon/underground/explored) @@ -19441,6 +19859,12 @@ "gka" = ( /turf/closed/wall/r_wall, /area/station/engineering/supermatter/room) +"gkk" = ( +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/east, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) "gky" = ( /obj/structure/cable, /obj/effect/spawner/random/engineering/tracking_beacon, @@ -19486,11 +19910,9 @@ /turf/open/floor/iron/white, /area/station/medical/chemistry) "gkV" = ( -/obj/structure/sign/warning/test_chamber{ - pixel_y = -32 - }, +/obj/structure/sign/warning/test_chamber/directional/south, /turf/open/floor/iron, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "glc" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -19555,12 +19977,6 @@ }, /turf/open/floor/iron, /area/station/commons/vacant_room/commissary) -"gme" = ( -/obj/structure/table, -/obj/machinery/light/directional/west, -/obj/item/food/meat/slab/synthmeat, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "gmB" = ( /obj/structure/stairs/south{ dir = 1 @@ -19632,12 +20048,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible, /turf/open/floor/iron, /area/station/engineering/atmos) -"gnG" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/on/layer2{ - dir = 8 - }, -/turf/open/floor/plating/snowed/icemoon, -/area/station/ai_monitored/turret_protected/aisat_interior) "gnL" = ( /obj/structure/closet/bombcloset/security, /turf/open/floor/iron/smooth, @@ -19670,7 +20080,7 @@ "gof" = ( /obj/machinery/door/firedoor/border_only, /turf/open/floor/iron/white, -/area/station/science/mixing/hallway) +/area/station/science/ordnance) "goi" = ( /obj/machinery/light/directional/east, /obj/machinery/newscaster/directional/east, @@ -19717,9 +20127,8 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/aft) "gpp" = ( /turf/open/floor/iron, @@ -19772,7 +20181,7 @@ /obj/machinery/power/apc/auto_name/directional/east, /obj/structure/cable, /turf/open/floor/iron/dark, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "gqj" = ( /obj/structure/railing/corner{ dir = 1 @@ -19904,15 +20313,18 @@ "gst" = ( /turf/closed/wall, /area/station/commons/vacant_room/commissary) +"gsD" = ( +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/effect/turf_decal/siding/white{ + dir = 6 + }, +/turf/open/floor/iron, +/area/station/service/bar) "gsH" = ( /obj/machinery/light/small/directional/south, /turf/open/floor/iron, /area/station/maintenance/starboard/fore) -"gsO" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/warning/gas_mask, -/turf/open/floor/plating, -/area/station/cargo/storage) "gsT" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 4 @@ -19921,13 +20333,8 @@ /turf/open/floor/iron/white, /area/station/medical/medbay/aft) "gtd" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/siding/white/corner, /obj/machinery/duct, -/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/service/bar) "gtg" = ( @@ -19945,13 +20352,19 @@ }, /obj/machinery/disposal/bin, /turf/open/floor/iron, -/area/station/engineering/atmos/project) +/area/station/engineering/atmos/storage) "gtF" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 }, /turf/open/floor/iron/white, /area/station/science/xenobiology) +"gul" = ( +/obj/structure/rack, +/obj/item/crowbar, +/obj/item/picket_sign, +/turf/open/floor/plating, +/area/station/maintenance/aft/lesser) "gum" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -20001,9 +20414,7 @@ /turf/open/floor/iron, /area/station/hallway/primary/central) "gvw" = ( -/obj/structure/sign/warning/no_smoking{ - pixel_y = -32 - }, +/obj/structure/sign/warning/no_smoking/directional/south, /obj/machinery/light/directional/south, /turf/open/floor/circuit/telecomms/mainframe, /area/station/tcommsat/server) @@ -20011,14 +20422,14 @@ /obj/machinery/newscaster/directional/west, /turf/open/floor/iron/dark, /area/station/service/chapel) -"gvX" = ( -/obj/effect/turf_decal/siding/white{ - dir = 5 +"gvL" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8; + name = "Exfiltrate to Waste" }, -/obj/effect/landmark/start/hangover, -/obj/structure/chair/stool/bar/directional/east, -/turf/open/floor/iron/white/smooth_large, -/area/station/service/kitchen/diner) +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/mix) "gwm" = ( /obj/machinery/door/firedoor/heavy, /turf/open/floor/iron/white/side{ @@ -20026,14 +20437,31 @@ }, /area/station/science/research) "gwu" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, /obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ dir = 4 }, +/obj/machinery/door/airlock/atmos/glass{ + name = "Atmospherics" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, +/obj/effect/turf_decal/trimline/dark_red/arrow_ccw{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/simple/pink/visible/layer5{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_green/arrow_ccw, +/obj/machinery/atmospherics/pipe/smart/simple/violet/visible/layer1{ + dir = 4 + }, /turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) +/area/station/engineering/atmos/storage) "gwy" = ( /obj/effect/turf_decal/tile/brown{ dir = 8 @@ -20230,9 +20658,7 @@ /turf/open/floor/iron/large, /area/station/service/kitchen/diner) "gyu" = ( -/obj/structure/sign/warning/pods{ - pixel_x = 32 - }, +/obj/structure/sign/warning/pods/directional/east, /obj/effect/turf_decal/stripes/line{ dir = 6 }, @@ -20250,6 +20676,11 @@ }, /turf/open/floor/grass, /area/station/service/hydroponics) +"gyz" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/engineering/atmos/project) "gyG" = ( /obj/machinery/light/directional/south, /obj/effect/turf_decal/tile/red{ @@ -20277,7 +20708,6 @@ /obj/effect/turf_decal/stripes/line{ dir = 5 }, -/obj/item/radio/intercom/directional/south, /obj/item/clothing/glasses/meson/engine/tray, /obj/item/clothing/glasses/meson/engine/tray, /turf/open/floor/iron/showroomfloor, @@ -20296,9 +20726,7 @@ "gzJ" = ( /obj/structure/cable, /obj/machinery/light/small/directional/south, -/obj/structure/sign/warning/gas_mask{ - pixel_y = -32 - }, +/obj/structure/sign/warning/gas_mask/directional/south, /turf/open/floor/plating, /area/station/maintenance/port/aft) "gzN" = ( @@ -20335,7 +20763,7 @@ dir = 8 }, /turf/open/floor/engine, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "gAe" = ( /obj/effect/turf_decal/tile/brown{ dir = 8 @@ -20394,7 +20822,7 @@ }, /obj/structure/reagent_dispensers/watertank/high, /obj/effect/turf_decal/stripes/line, -/obj/item/reagent_containers/glass/bucket, +/obj/item/reagent_containers/glass/watering_can, /turf/open/floor/iron/half{ dir = 1 }, @@ -20403,6 +20831,13 @@ /obj/structure/falsewall, /turf/open/floor/plating, /area/station/security/prison) +"gBa" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/obj/effect/turf_decal/bot_red, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/project) "gBb" = ( /obj/machinery/door/window/left/directional/north{ base_state = "right"; @@ -20462,16 +20897,13 @@ /turf/open/floor/plating, /area/station/hallway/secondary/exit/departure_lounge) "gBR" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 +/obj/structure/closet/radiation, +/obj/structure/sign/warning/electric_shock{ + pixel_y = 32 }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ + dir = 1 }, -/obj/structure/closet/radiation, /turf/open/floor/iron, /area/station/engineering/main) "gBW" = ( @@ -20524,10 +20956,14 @@ /turf/open/floor/wood, /area/station/security/courtroom) "gDo" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/iron/cafeteria, +/obj/structure/table, +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/item/plate, +/obj/item/reagent_containers/food/condiment/enzyme{ + pixel_y = 6; + pixel_x = -7 + }, +/turf/open/floor/iron/kitchen/diagonal, /area/station/service/kitchen) "gDp" = ( /obj/structure/cable, @@ -20612,6 +21048,11 @@ }, /turf/open/floor/wood, /area/station/service/library) +"gEu" = ( +/obj/structure/sign/warning/secure_area/directional/west, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/ai_monitored/turret_protected/aisat/maint) "gEw" = ( /obj/machinery/suit_storage_unit/rd, /obj/effect/turf_decal/stripes/line{ @@ -20682,12 +21123,6 @@ /turf/open/floor/iron/cafeteria, /area/station/hallway/secondary/exit/departure_lounge) "gFe" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, /obj/machinery/light/directional/north, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -20699,6 +21134,9 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, /turf/open/floor/iron, /area/station/engineering/main) "gFf" = ( @@ -20734,16 +21172,12 @@ "gFX" = ( /turf/closed/wall, /area/icemoon/underground/explored) -"gFY" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, -/turf/open/floor/iron/freezer, -/area/station/service/kitchen/coldroom) "gGl" = ( /obj/machinery/doppler_array{ dir = 4 }, /turf/open/floor/iron, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "gGo" = ( /obj/effect/decal/cleanable/dirt, /obj/item/radio/intercom/directional/east, @@ -20842,14 +21276,11 @@ /turf/open/floor/iron/checker, /area/station/science/lab) "gIb" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, /obj/effect/turf_decal/siding/wood{ dir = 9 }, /obj/structure/table/wood, +/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/service/bar) "gIl" = ( @@ -20967,9 +21398,8 @@ /obj/structure/sign/poster/contraband/syndiemoth{ pixel_x = -32 }, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/security/prison/safe) "gKd" = ( /obj/machinery/door/airlock/external{ @@ -21010,9 +21440,7 @@ /obj/machinery/atmospherics/pipe/heat_exchanging/simple{ dir = 4 }, -/obj/structure/sign/warning/electric_shock{ - pixel_y = 32 - }, +/obj/structure/sign/warning/electric_shock/directional/north, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/surface/outdoors/nospawn) "gKG" = ( @@ -21026,9 +21454,8 @@ /obj/structure/disposalpipe/segment{ dir = 10 }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "gKQ" = ( /turf/closed/wall, @@ -21112,7 +21539,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, /obj/effect/mapping_helpers/airlock/access/all/science/research, /turf/open/floor/engine, -/area/station/science/misc_lab) +/area/station/science/explab) "gMe" = ( /obj/effect/turf_decal/tile/purple, /obj/machinery/light/directional/east, @@ -21143,6 +21570,7 @@ dir = 1 }, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, +/obj/effect/mapping_helpers/airlock/unres, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) "gMF" = ( @@ -21224,12 +21652,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/command/heads_quarters/cmo) -"gOx" = ( -/obj/structure/cable, -/turf/open/floor/wood{ - icon_state = "wood-broken4" - }, -/area/station/maintenance/fore/lesser) "gOy" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -21285,7 +21707,7 @@ /obj/structure/cable, /obj/structure/extinguisher_cabinet/directional/south, /turf/open/floor/iron/smooth, -/area/station/security/prison) +/area/station/security/execution/transfer) "gOU" = ( /obj/effect/spawner/structure/window/hollow/reinforced/middle{ dir = 1 @@ -21418,7 +21840,8 @@ /obj/machinery/door/airlock/external{ name = "Engineering External Access" }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/obj/effect/mapping_helpers/airlock/access/any/engineering/construction, +/obj/effect/mapping_helpers/airlock/access/any/engineering/general, /turf/open/floor/plating, /area/station/engineering/storage_shared) "gQE" = ( @@ -21506,6 +21929,10 @@ "gSy" = ( /turf/open/floor/iron, /area/station/security/prison/workout) +"gSz" = ( +/obj/structure/transit_tube/crossing/horizontal, +/turf/open/floor/plating/snowed/icemoon, +/area/icemoon/surface/outdoors/nospawn) "gSE" = ( /obj/machinery/biogenerator, /turf/open/floor/iron, @@ -21517,9 +21944,8 @@ "gSK" = ( /obj/structure/table/wood, /obj/item/soap/nanotrasen, -/turf/open/floor/wood{ - icon_state = "wood-broken7" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/maintenance/port/aft) "gSN" = ( /obj/effect/turf_decal/stripes/line{ @@ -21585,10 +22011,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /turf/open/floor/iron/white, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "gTK" = ( /turf/closed/wall, /area/station/engineering/engine_smes) +"gTU" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/trimline/dark_blue/line{ + dir = 6 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/mix) "gTW" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -21617,6 +22050,13 @@ }, /turf/open/lava/plasma/ice_moon, /area/icemoon/underground/explored) +"gUq" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/obj/structure/closet/emcloset, +/turf/open/floor/plating, +/area/station/service/kitchen/coldroom) "gUs" = ( /obj/effect/turf_decal/tile/red/anticorner/contrasted, /obj/structure/cable, @@ -21705,6 +22145,14 @@ }, /turf/open/floor/engine, /area/station/maintenance/disposal/incinerator) +"gVG" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/table, +/obj/item/flashlight/lamp{ + on = 0 + }, +/turf/open/floor/wood, +/area/station/maintenance/aft/greater) "gVO" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 1 @@ -21752,7 +22200,7 @@ "gWR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "gWX" = ( /obj/structure/chair{ dir = 4 @@ -21812,8 +22260,8 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 }, -/obj/machinery/door/airlock/external{ - name = "Supply Dock Airlock" +/obj/machinery/door/airlock/external/glass{ + name = "Supply Door Airlock" }, /obj/effect/mapping_helpers/airlock/access/all/supply/general, /turf/open/floor/plating, @@ -21880,9 +22328,9 @@ /turf/open/floor/plating/snowed/icemoon, /area/icemoon/surface/outdoors/nospawn) "gZb" = ( -/mob/living/carbon/human/species/monkey, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply, +/mob/living/carbon/human/species/monkey, /turf/open/floor/grass, /area/station/medical/virology) "gZl" = ( @@ -21951,9 +22399,14 @@ /turf/open/floor/iron, /area/station/commons/fitness) "gZK" = ( -/obj/machinery/chem_master/condimaster, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating/snowed/coldroom, +/area/station/service/kitchen/coldroom) "gZO" = ( /obj/effect/turf_decal/tile/yellow{ dir = 4 @@ -22032,10 +22485,9 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, -/obj/structure/sign/warning{ - pixel_y = 32 - }, +/obj/structure/sign/warning/directional/north, /obj/effect/mapping_helpers/airlock/access/any/science/maintenance, +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance/departmental, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) "haC" = ( @@ -22057,7 +22509,7 @@ dir = 6 }, /turf/open/floor/iron, -/area/station/science/misc_lab) +/area/station/science/explab) "hbp" = ( /obj/machinery/photocopier, /turf/open/floor/wood, @@ -22071,10 +22523,12 @@ /turf/open/floor/plating, /area/station/medical/pharmacy) "hbE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/landmark/start/cook, -/turf/open/floor/iron/cafeteria, +/obj/structure/table, +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/structure/closet/mini_fridge{ + name = "mini-fridge" + }, +/turf/open/floor/iron/kitchen/diagonal, /area/station/service/kitchen) "hbI" = ( /obj/machinery/recharger{ @@ -22099,9 +22553,8 @@ /area/station/service/chapel/office) "hbY" = ( /obj/effect/spawner/random/structure/crate, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "hce" = ( /obj/machinery/door/airlock{ @@ -22127,31 +22580,20 @@ /turf/open/floor/iron, /area/station/hallway/primary/central) "hcy" = ( -/obj/structure/closet/radiation, -/obj/effect/turf_decal/stripes/line{ +/obj/item/radio/intercom/directional/north, +/obj/machinery/atmospherics/pipe/smart/simple/general/visible{ dir = 6 }, -/obj/item/radio/intercom/directional/north, -/obj/item/analyzer, -/turf/open/floor/iron/showroomfloor, +/turf/open/floor/iron, /area/station/engineering/atmos) "hcL" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, /turf/open/floor/plating, /area/station/engineering/storage/tech) -"hcO" = ( -/obj/machinery/light/small/directional/west, -/obj/effect/turf_decal/weather/snow/corner{ - dir = 4 - }, -/turf/open/floor/plating/snowed/icemoon, -/area/station/maintenance/starboard/fore) "hcS" = ( /obj/effect/spawner/structure/window, -/obj/structure/sign/departments/xenobio{ - pixel_y = -32 - }, +/obj/structure/sign/departments/xenobio/directional/south, /turf/open/floor/plating, /area/station/science/xenobiology) "hdf" = ( @@ -22304,7 +22746,10 @@ /turf/open/floor/iron, /area/station/science/xenobiology) "heC" = ( -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, +/obj/machinery/atmospherics/pipe/bridge_pipe/yellow/visible, +/obj/machinery/atmospherics/pipe/smart/simple/pink/visible/layer5{ + dir = 4 + }, /turf/open/floor/iron, /area/station/engineering/atmos) "heX" = ( @@ -22372,7 +22817,8 @@ }, /obj/machinery/door/poddoor/shutters/preopen{ id = "gene_desk_shutters"; - name = "Genetics Shutters" + name = "Genetics Shutters"; + dir = 8 }, /obj/machinery/door/firedoor, /turf/open/floor/plating, @@ -22385,15 +22831,14 @@ /obj/machinery/door/poddoor/massdriver_ordnance, /obj/structure/fans/tiny, /turf/open/floor/plating, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "hgg" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 }, /obj/structure/sign/painting/large, -/turf/open/floor/wood{ - icon_state = "wood-broken5" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/security/prison/rec) "hgh" = ( /turf/closed/wall, @@ -22405,6 +22850,12 @@ /obj/structure/cable, /turf/open/floor/iron/grimy, /area/station/ai_monitored/turret_protected/aisat_interior) +"hgv" = ( +/obj/effect/turf_decal/siding/yellow{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/hfr_room) "hgx" = ( /obj/structure/closet/secure_closet/security, /obj/effect/turf_decal/tile/red{ @@ -22434,10 +22885,15 @@ /obj/item/radio/intercom/prison/directional/west, /turf/open/floor/iron/dark/textured, /area/station/security/prison) +"hgT" = ( +/obj/structure/marker_beacon/jade, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/explored) "hgX" = ( /obj/machinery/door/poddoor/shutters/preopen{ id = "rnd2"; - name = "Research Lab Shutters" + name = "Research Lab Shutters"; + dir = 8 }, /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -22457,9 +22913,7 @@ /obj/item/pickaxe, /obj/item/gps/mining, /obj/item/gps/mining, -/obj/structure/sign/warning/cold_temp{ - pixel_y = 32 - }, +/obj/structure/sign/warning/cold_temp/directional/north, /turf/open/floor/iron/smooth, /area/mine/eva) "hhr" = ( @@ -22491,9 +22945,7 @@ /obj/structure/disposalpipe/trunk{ dir = 1 }, -/obj/structure/sign/warning/bodysposal{ - pixel_y = -32 - }, +/obj/structure/sign/warning/bodysposal/directional/south, /turf/open/floor/iron/white, /area/station/medical/surgery/aft) "hhz" = ( @@ -22505,16 +22957,10 @@ }, /area/station/service/chapel/office) "hhE" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/freezer{ - name = "Cold Room" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/machinery/duct, -/obj/effect/mapping_helpers/airlock/access/all/service/kitchen, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen/coldroom) +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/machinery/oven, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) "hhT" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/trimline/yellow/filled/line{ @@ -22534,7 +22980,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/science/ordnance, /turf/open/floor/iron/dark, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/freezerchamber) "hic" = ( /obj/structure/window/reinforced{ dir = 8 @@ -22573,15 +23019,6 @@ /obj/machinery/rnd/production/circuit_imprinter/department/science, /turf/open/floor/iron/white, /area/station/science/robotics/lab) -"hiA" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/cable, -/obj/machinery/duct, -/turf/open/floor/iron/freezer, -/area/station/service/kitchen/coldroom) "hiF" = ( /obj/machinery/light/floor, /turf/open/floor/iron/white, @@ -22598,10 +23035,16 @@ /turf/open/floor/plating, /area/station/maintenance/fore/greater) "hjo" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/aft/greater) +"hjq" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/trimline/dark_blue/corner{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/mix) "hjt" = ( /obj/machinery/door/airlock/external{ glass = 1; @@ -22619,9 +23062,10 @@ /turf/open/floor/plating, /area/station/service/hydroponics/garden) "hjA" = ( -/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden, -/turf/closed/wall, -/area/station/service/kitchen/coldroom) +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/machinery/grill, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) "hjB" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -22631,14 +23075,14 @@ /turf/open/floor/plating, /area/station/maintenance/port/greater) "hjC" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, /obj/machinery/chem_master/condimaster{ desc = "Looks like a knock-off chem-master. Perhaps useful for separating liquids when mixing drinks precisely. Also dispenses condiments."; name = "HoochMaster Deluxe" }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/effect/turf_decal/siding/white/end{ + dir = 4 + }, /turf/open/floor/iron, /area/station/service/bar) "hjH" = ( @@ -22687,7 +23131,7 @@ dir = 6 }, /turf/open/floor/iron/white, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "hkt" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -22698,7 +23142,7 @@ "hkw" = ( /obj/machinery/portable_atmospherics/canister/carbon_dioxide, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "hkU" = ( /obj/effect/landmark/start/cargo_technician, /obj/structure/chair/office{ @@ -22818,6 +23262,10 @@ }, /turf/open/floor/iron/dark/textured, /area/station/security/prison) +"hnx" = ( +/obj/structure/sign/warning/secure_area/directional/east, +/turf/open/floor/plating, +/area/station/ai_monitored/turret_protected/aisat/maint) "hny" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible, /obj/effect/turf_decal/stripes/line{ @@ -22890,9 +23338,8 @@ /turf/open/floor/iron, /area/station/cargo/miningdock) "hoF" = ( -/obj/effect/landmark/event_spawn, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 9 +/obj/machinery/atmospherics/components/binary/pump{ + name = "Port to Infiltrate/Filter" }, /turf/open/floor/iron, /area/station/engineering/atmos) @@ -22924,7 +23371,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/science/ordnance, /turf/open/floor/iron/white, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "hpi" = ( /obj/effect/turf_decal/trimline, /obj/machinery/shower{ @@ -22945,9 +23392,8 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/department/medical/central) "hpx" = ( /obj/structure/marker_beacon/burgundy, @@ -23052,6 +23498,17 @@ }, /turf/open/floor/iron/dark, /area/station/security/checkpoint/engineering) +"hrp" = ( +/obj/effect/turf_decal/siding/yellow, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 9 + }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/hfr_room) "hrt" = ( /obj/structure/table/glass, /obj/item/shovel/spade, @@ -23125,9 +23582,8 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/structure/sign/warning/gas_mask{ - desc = "A sign that warns of dangerous gasses in the air, instructing you to wear internals."; - pixel_y = -32 +/obj/structure/sign/warning/gas_mask/directional/south{ + desc = "A sign that warns of dangerous gasses in the air, instructing you to wear internals." }, /obj/effect/mapping_helpers/airlock/access/all/supply/mining, /turf/open/floor/iron/large, @@ -23171,12 +23627,14 @@ /area/station/maintenance/port/aft) "hti" = ( /obj/structure/rack, -/obj/effect/spawner/random/maintenance/two, +/obj/item/crowbar, +/obj/item/pickaxe, +/obj/machinery/light/dim/directional/west, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) "htn" = ( -/obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/item/trash/raisins, /turf/open/floor/plating, /area/station/maintenance/aft/greater) "hto" = ( @@ -23232,7 +23690,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, -/area/station/science/misc_lab) +/area/station/science/explab) "huo" = ( /obj/effect/spawner/random/structure/steam_vent, /turf/open/floor/plating, @@ -23288,12 +23746,11 @@ /turf/open/floor/iron, /area/station/service/chapel) "huL" = ( -/obj/structure/extinguisher_cabinet/directional/south, /obj/machinery/camera/directional/south{ c_tag = "Atmospherics Project Room East" }, -/turf/open/floor/iron, -/area/station/engineering/atmos/project) +/turf/open/openspace, +/area/station/engineering/atmos/storage) "huN" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -23307,6 +23764,19 @@ }, /turf/open/floor/iron/white, /area/station/science/xenobiology) +"huR" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 1 + }, +/obj/machinery/door/poddoor/shutters/window/preopen{ + id = "Atmospherics Project Shutters"; + name = "Atmospherics Project Shutters"; + dir = 1 + }, +/obj/machinery/door/firedoor/heavy, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/project) "hvm" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -23419,8 +23889,11 @@ /turf/open/floor/iron, /area/station/security/brig/upper) "hxa" = ( -/obj/machinery/vending/wardrobe/chef_wardrobe, -/turf/open/floor/iron/cafeteria, +/obj/machinery/deepfryer, +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/machinery/light/directional/east, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/iron/kitchen/diagonal, /area/station/service/kitchen) "hxh" = ( /obj/effect/turf_decal/tile/red, @@ -23474,13 +23947,20 @@ dir = 1 }, /turf/open/floor/iron, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) +"hxQ" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/shower{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/blue, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/hfr_room) "hxX" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "hyd" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -23497,13 +23977,16 @@ /turf/open/floor/plating, /area/station/engineering/lobby) "hyG" = ( -/obj/structure/table, -/obj/machinery/airalarm/kitchen_cold_room{ - dir = 8; - pixel_x = -24 +/obj/effect/turf_decal/siding/white{ + dir = 1 }, -/turf/open/floor/iron/freezer, -/area/station/service/kitchen/coldroom) +/obj/structure/chair{ + dir = 4 + }, +/obj/machinery/newscaster/directional/north, +/obj/effect/landmark/start/hangover, +/turf/open/floor/iron/white/smooth_large, +/area/station/service/kitchen/diner) "hyM" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -23525,7 +24008,7 @@ "hyP" = ( /obj/structure/stairs/west, /turf/open/floor/iron/white, -/area/station/science/mixing/hallway) +/area/station/science/ordnance) "hyW" = ( /obj/item/toy/snowball{ pixel_x = -6; @@ -23560,6 +24043,7 @@ name = "Service Hall Maintenance" }, /obj/effect/mapping_helpers/airlock/access/all/service/general, +/obj/machinery/duct, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) "hzz" = ( @@ -23632,7 +24116,7 @@ /obj/machinery/light_switch/directional/north, /obj/structure/cable, /turf/open/floor/iron, -/area/station/science/misc_lab) +/area/station/science/explab) "hAm" = ( /turf/open/floor/iron/white/side{ dir = 4 @@ -23686,9 +24170,8 @@ /area/mine/living_quarters) "hBb" = ( /obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/construction) "hBr" = ( /obj/effect/turf_decal/tile/red/full, @@ -23715,15 +24198,9 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/cafeteria, /area/station/commons/dorms/laundry) -"hBH" = ( -/obj/structure/table, -/obj/item/clothing/mask/cigarette/cigar, -/turf/open/floor/iron/white/smooth_large, -/area/station/service/kitchen/diner) "hCa" = ( -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) "hCv" = ( /obj/structure/table, @@ -23811,7 +24288,8 @@ /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ id = "Courtroom"; - name = "Security Shutters" + name = "Security Shutters"; + dir = 1 }, /turf/open/floor/plating, /area/station/hallway/primary/fore) @@ -23893,10 +24371,6 @@ /turf/open/floor/plating, /area/station/maintenance/department/cargo) "hGa" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, /obj/effect/turf_decal/siding/wood{ dir = 8 }, @@ -23904,6 +24378,7 @@ dir = 4 }, /obj/structure/table/wood, +/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/service/bar) "hGf" = ( @@ -23929,9 +24404,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) "hGF" = ( /obj/structure/disposalpipe/sorting/mail/flip{ @@ -23955,6 +24429,16 @@ /obj/machinery/duct, /turf/open/floor/iron, /area/station/service/hydroponics) +"hGK" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/duct, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/morgue) "hGL" = ( /obj/effect/landmark/event_spawn, /obj/effect/turf_decal/bot, @@ -24060,18 +24544,16 @@ /obj/machinery/portable_atmospherics/canister/oxygen, /turf/open/floor/plating, /area/station/maintenance/department/cargo) -"hIZ" = ( -/obj/machinery/door/poddoor/shutters{ - id = "teledoor"; - name = "MiniSat Teleport Access" - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) "hJe" = ( -/obj/machinery/duct, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/sign/warning/cold_temp/directional/south, +/turf/open/floor/plating, +/area/station/maintenance/department/crew_quarters/bar) "hJi" = ( /obj/machinery/door/window/left/directional/north{ dir = 4; @@ -24175,20 +24657,14 @@ /obj/machinery/door/firedoor, /obj/machinery/door/poddoor/shutters{ id = "commissaryshutter"; - name = "Vacant Commissary Shutter" + name = "Vacant Commissary Shutter"; + dir = 4 }, /obj/structure/desk_bell{ pixel_x = 7 }, /turf/open/floor/iron, /area/station/commons/vacant_room/commissary) -"hKE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/start/cook, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/iron/white/smooth_large, -/area/station/service/kitchen/diner) "hKI" = ( /obj/effect/turf_decal/tile/green/half/contrasted, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -24209,6 +24685,18 @@ }, /turf/open/floor/iron, /area/station/security/brig/upper) +"hLl" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/red/filled/end{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/hfr_room) "hLs" = ( /obj/machinery/airalarm/directional/east, /obj/machinery/light/directional/east, @@ -24347,7 +24835,7 @@ }, /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating/icemoon, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "hNF" = ( /obj/structure/fence{ dir = 4 @@ -24371,11 +24859,18 @@ /turf/open/floor/iron, /area/station/hallway/secondary/entry) "hOa" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/white/smooth_large, -/area/station/service/kitchen/diner) +/obj/structure/table/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "kitchencounter"; + name = "Kitchen Counter Shutters"; + dir = 8 + }, +/obj/machinery/door/firedoor, +/obj/structure/desk_bell{ + pixel_x = 7 + }, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) "hOi" = ( /obj/machinery/telecomms/processor/preset_four, /turf/open/floor/iron/dark/telecomms, @@ -24451,7 +24946,14 @@ "hPp" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/station/science/mixing/hallway) +/area/station/science/ordnance) +"hPq" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 6 + }, +/obj/structure/lattice/catwalk, +/turf/open/openspace/icemoon/keep_below, +/area/icemoon/underground/explored) "hPs" = ( /turf/closed/wall/r_wall, /area/station/security/prison/work) @@ -24468,6 +24970,11 @@ /obj/effect/turf_decal/siding/brown, /turf/open/floor/iron, /area/station/cargo/drone_bay) +"hPL" = ( +/obj/structure/transit_tube/curved/flipped, +/obj/structure/cable, +/turf/open/floor/plating/snowed/icemoon, +/area/icemoon/surface/outdoors/nospawn) "hPQ" = ( /obj/structure/table, /obj/item/storage/toolbox/electrical{ @@ -24508,9 +25015,7 @@ /area/station/security/brig) "hQE" = ( /obj/structure/railing/corner, -/obj/structure/sign/warning/biohazard{ - pixel_x = -32 - }, +/obj/structure/sign/warning/biohazard/directional/west, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) "hQO" = ( @@ -24533,18 +25038,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/smooth_half, /area/station/security/brig/upper) -"hQV" = ( -/obj/structure/table, -/obj/item/food/grown/carrot{ - pixel_x = -6; - pixel_y = 10 - }, -/obj/item/food/grown/carrot{ - pixel_x = -2; - pixel_y = 3 - }, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "hRd" = ( /obj/structure/safe, /obj/item/clothing/head/bearpelt, @@ -24573,6 +25066,16 @@ /obj/effect/turf_decal/tile/red/anticorner/contrasted, /turf/open/floor/iron, /area/station/security/prison/visit) +"hRr" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/machinery/door/window/right/directional/east{ + dir = 4 + }, +/obj/structure/sign/warning/cold_temp/directional/south, +/turf/open/floor/plating/snowed/coldroom, +/area/station/service/kitchen/coldroom) "hRw" = ( /obj/structure/chair/wood{ dir = 8 @@ -24614,22 +25117,20 @@ /obj/effect/turf_decal/siding/thinplating/dark{ dir = 8 }, -/obj/structure/musician/piano, +/obj/effect/spawner/random/structure/musician/piano/random_piano, /obj/structure/sign/poster/random/directional/north, /turf/open/floor/carpet, /area/station/service/theater) "hSc" = ( -/obj/structure/sink/kitchen{ - pixel_y = 24 - }, +/obj/effect/turf_decal/tile/neutral/diagonal_edge, /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/iron/cafeteria, +/turf/open/floor/iron/kitchen/diagonal, /area/station/service/kitchen) "hSe" = ( /turf/open/floor/iron, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "hSi" = ( /obj/item/shard{ icon_state = "medium" @@ -24682,7 +25183,7 @@ "hSL" = ( /obj/machinery/igniter/incinerator_ordmix, /turf/open/floor/engine/vacuum, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "hSN" = ( /obj/effect/turf_decal/tile/brown, /obj/effect/turf_decal/tile/brown{ @@ -24722,14 +25223,11 @@ /turf/open/floor/plating, /area/station/maintenance/port/greater) "hTl" = ( -/obj/effect/turf_decal/tile/red/full, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/turf_decal/siding/white/corner{ - dir = 8 +/obj/effect/turf_decal/siding/white{ + dir = 4 }, -/turf/open/floor/iron/large, +/obj/structure/chair/stool/bar/directional/east, +/turf/open/floor/iron/white/smooth_large, /area/station/service/kitchen/diner) "hTm" = ( /obj/effect/turf_decal/stripes/line, @@ -24753,7 +25251,7 @@ dir = 6 }, /turf/open/floor/plating/icemoon, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "hTB" = ( /obj/structure/table, /obj/item/clothing/suit/jacket/leather{ @@ -24778,6 +25276,7 @@ "hTR" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/trash/grille_or_waste, +/obj/machinery/duct, /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) "hUe" = ( @@ -24816,11 +25315,16 @@ /area/mine/eva) "hUt" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, -/obj/item/radio/intercom/directional/east, /obj/machinery/camera{ c_tag = "Atmospherics South East"; dir = 6 }, +/obj/machinery/atmospherics/pipe/smart/simple/pink/visible/layer5{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/simple/violet/visible/layer1{ + dir = 1 + }, /turf/open/floor/iron, /area/station/engineering/atmos) "hUx" = ( @@ -24849,17 +25353,19 @@ "hUD" = ( /turf/closed/wall, /area/station/service/library) -"hUG" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) "hUK" = ( /obj/structure/railing{ dir = 4 }, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/underground/explored) +"hUQ" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/ai_monitored/turret_protected/aisat_interior) "hUV" = ( /obj/item/radio/intercom/directional/north, /obj/structure/closet/crate, @@ -24965,7 +25471,7 @@ /obj/machinery/light/directional/north, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "hXC" = ( /obj/machinery/vending/tool, /turf/open/floor/iron, @@ -25103,9 +25609,11 @@ /turf/open/floor/iron/smooth, /area/station/security/brig/upper) "hZA" = ( -/obj/machinery/holopad, -/obj/machinery/duct, -/turf/open/floor/iron/cafeteria, +/obj/structure/table, +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/item/book/manual/chef_recipes, +/obj/item/holosign_creator/robot_seat/restaurant, +/turf/open/floor/iron/kitchen/diagonal, /area/station/service/kitchen) "hZQ" = ( /obj/item/stack/sheet/iron/five, @@ -25131,9 +25639,7 @@ name = "Chemistry Lab Access Hatch"; req_access = list("plumbing") }, -/obj/structure/sign/departments/chemistry{ - pixel_y = 32 - }, +/obj/structure/sign/departments/chemistry/directional/north, /obj/structure/sign/warning/no_smoking{ pixel_x = -28 }, @@ -25215,6 +25721,13 @@ }, /turf/open/floor/plating, /area/station/construction/mining/aux_base) +"iaN" = ( +/obj/machinery/portable_atmospherics/canister, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage) "iaQ" = ( /obj/structure/table, /obj/item/analyzer, @@ -25303,7 +25816,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/science/ordnance, /turf/open/floor/iron/dark/airless, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/freezerchamber) "ibT" = ( /obj/structure/rack, /obj/machinery/light/directional/west, @@ -25334,12 +25847,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/security/prison/visit) -"icT" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron/white/smooth_large, -/area/station/service/kitchen/diner) "icV" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -25394,6 +25901,19 @@ /obj/effect/turf_decal/tile/bar, /turf/open/floor/iron, /area/station/service/bar) +"idG" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{ + dir = 1 + }, +/obj/machinery/meter, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/project) +"idM" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/camera/autoname/directional/south, +/obj/effect/turf_decal/trimline/dark_blue/line, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/mix) "idO" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -25427,9 +25947,8 @@ "ieC" = ( /obj/item/crowbar/red, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/aft/greater) "ieG" = ( /obj/effect/turf_decal/stripes/corner{ @@ -25443,13 +25962,14 @@ /turf/open/floor/plating, /area/station/maintenance/port/greater) "ieO" = ( -/obj/machinery/food_cart, -/obj/machinery/light/directional/south, -/obj/machinery/camera/directional/south{ - c_tag = "Service-Kitchen Bottom" +/mob/living/simple_animal/hostile/retaliate/goat{ + name = "Snowy Pete"; + desc = "Not known for their pleasant disposition. This one seems a bit more hardy to the cold."; + atmos_requirements = list("min_oxy"=1,"max_oxy"=0,"min_plas"=0,"max_plas"=1,"min_co2"=0,"max_co2"=5,"min_n2"=0,"max_n2"=0); + minbodytemp = 150 }, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) +/turf/open/misc/asteroid/snow/coldroom, +/area/station/service/kitchen/coldroom) "ieZ" = ( /obj/item/radio/intercom/directional/south, /obj/effect/turf_decal/tile/blue, @@ -25470,11 +25990,23 @@ /obj/machinery/status_display/evac/directional/north, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) +"ift" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/project) "ifA" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/warning/cold_temp, /turf/open/floor/plating/icemoon, /area/station/maintenance/solars/port/aft) +"ifE" = ( +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) "ifK" = ( /obj/machinery/door/airlock/maintenance, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -25554,7 +26086,7 @@ /obj/effect/landmark/navigate_destination, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/access/all/engineering/construction, +/obj/effect/mapping_helpers/airlock/access/all/engineering/tech_storage, /turf/open/floor/plating, /area/station/engineering/storage/tech) "igL" = ( @@ -25571,12 +26103,9 @@ name = "Chapel Maintenance External Airlock"; opacity = 0 }, -/obj/structure/sign/warning/cold_temp{ - pixel_y = 32 - }, -/obj/structure/sign/warning/gas_mask{ - desc = "A sign that warns of dangerous gasses in the air, instructing you to wear internals."; - pixel_y = -32 +/obj/structure/sign/warning/cold_temp/directional/north, +/obj/structure/sign/warning/gas_mask/directional/south{ + desc = "A sign that warns of dangerous gasses in the air, instructing you to wear internals." }, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/plating, @@ -25633,10 +26162,7 @@ /turf/open/floor/iron/dark, /area/station/service/chapel) "iim" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, +/obj/effect/turf_decal/tile/bar/opposingcorners, /obj/machinery/holopad, /turf/open/floor/iron, /area/station/service/bar) @@ -25648,6 +26174,9 @@ /obj/machinery/space_heater, /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) +"iix" = ( +/turf/open/genturf/alternative, +/area/icemoon/underground/unexplored/rivers) "iiy" = ( /obj/machinery/firealarm/directional/north, /obj/structure/chair{ @@ -25657,14 +26186,6 @@ /obj/machinery/airalarm/directional/east, /turf/open/floor/iron, /area/station/cargo/lobby) -"iiD" = ( -/obj/effect/turf_decal/tile/red/full, -/obj/effect/turf_decal/siding/white/corner{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/iron/large, -/area/station/service/kitchen/diner) "iiH" = ( /obj/machinery/door/airlock/security/glass{ id_tag = "innerbrig"; @@ -25733,7 +26254,16 @@ /area/station/security/prison/garden) "ijK" = ( /turf/open/floor/iron, -/area/station/science/misc_lab) +/area/station/science/explab) +"ijQ" = ( +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/structure/railing/corner{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage) "ijY" = ( /obj/structure/flora/rock/icy/style_random, /turf/open/misc/asteroid/snow/icemoon, @@ -25828,10 +26358,6 @@ /obj/structure/table/wood, /turf/open/floor/wood, /area/station/security/courtroom) -"ili" = ( -/obj/structure/marker_beacon/burgundy, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) "ily" = ( /turf/open/openspace, /area/station/science/xenobiology) @@ -25839,6 +26365,16 @@ /obj/machinery/light/directional/east, /turf/open/openspace, /area/station/security/prison) +"ilL" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/dark_red/arrow_ccw{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/simple/pink/visible/layer5{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) "ilN" = ( /obj/effect/spawner/structure/window/hollow/reinforced/middle{ dir = 1 @@ -25872,6 +26408,16 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/iron/white, /area/station/maintenance/port/fore) +"imA" = ( +/obj/effect/turf_decal/trimline/dark_red/filled/warning{ + dir = 4 + }, +/obj/machinery/atmospherics/components/binary/pump/off{ + dir = 8; + name = "Exfiltrate to Waste" + }, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) "imH" = ( /obj/structure/rack, /obj/effect/spawner/random/clothing/gloves, @@ -25885,10 +26431,21 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai_upload) +"imK" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/disposal/bin, +/obj/structure/cable, +/obj/structure/disposalpipe/trunk, +/turf/open/floor/iron/dark, +/area/station/maintenance/disposal/incinerator) "imT" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating/icemoon, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "imV" = ( /obj/structure/stairs/east, /obj/structure/railing{ @@ -25970,7 +26527,7 @@ /obj/structure/railing, /obj/structure/lattice/catwalk, /turf/open/openspace, -/area/station/science/mixing) +/area/station/science/ordnance/office) "ipa" = ( /obj/machinery/atmospherics/pipe/multiz/scrubbers/visible/layer2{ color = "#ff0000"; @@ -25997,9 +26554,7 @@ /turf/open/floor/iron/freezer, /area/mine/laborcamp) "ipi" = ( -/obj/structure/sign/warning/secure_area{ - pixel_x = 32 - }, +/obj/structure/sign/warning/secure_area/directional/east, /turf/open/floor/plating, /area/station/maintenance/aft/greater) "ipw" = ( @@ -26054,9 +26609,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/aft/greater) -"iqt" = ( -/turf/open/openspace, -/area/station/science/mixing/hallway) "iqC" = ( /obj/structure/table, /obj/item/flashlight/lamp, @@ -26074,7 +26626,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /turf/open/floor/iron/dark/textured, -/area/station/security/prison) +/area/station/security/execution/transfer) "irp" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -26217,7 +26769,7 @@ /turf/open/floor/iron/white/side{ dir = 4 }, -/area/station/science/misc_lab) +/area/station/science/explab) "isP" = ( /obj/effect/landmark/start/medical_doctor, /turf/open/floor/iron/white, @@ -26237,6 +26789,17 @@ }, /turf/open/lava/plasma/ice_moon, /area/icemoon/underground/explored) +"isY" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/airalarm/directional/south, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/hfr_room) "itb" = ( /obj/structure/table, /obj/item/storage/box/lights/mixed, @@ -26310,6 +26873,10 @@ dir = 1 }, /area/mine/eva/lower) +"iup" = ( +/obj/effect/spawner/random/trash/grille_or_waste, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) "iuq" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 9 @@ -26352,15 +26919,6 @@ }, /turf/open/floor/iron, /area/station/service/hydroponics) -"ivf" = ( -/obj/structure/sign/warning/fire{ - pixel_y = -32 - }, -/obj/machinery/camera/directional/south{ - c_tag = "Atmospherics Project Room West" - }, -/turf/open/floor/iron, -/area/station/engineering/atmos/project) "ivo" = ( /obj/machinery/airalarm/directional/east, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -26397,6 +26955,11 @@ }, /turf/open/floor/wood, /area/station/service/library) +"ivS" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/project) "ivW" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -26465,9 +27028,8 @@ /turf/open/floor/iron/white, /area/station/medical/cryo) "ixe" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/fore/lesser) "ixu" = ( /obj/machinery/camera/directional/north{ @@ -26483,6 +27045,9 @@ }, /turf/open/floor/sepia, /area/station/security/prison/rec) +"ixB" = ( +/turf/closed/wall/r_wall, +/area/station/engineering/atmos/project) "ixH" = ( /obj/structure/railing/corner{ dir = 1 @@ -26537,6 +27102,13 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"iys" = ( +/obj/structure/cable, +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/hfr_room) "iyx" = ( /obj/machinery/atmospherics/pipe/bridge_pipe/orange/visible, /obj/machinery/atmospherics/pipe/bridge_pipe/scrubbers/visible{ @@ -26558,7 +27130,7 @@ "iyG" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, -/area/station/science/misc_lab) +/area/station/science/explab) "iyI" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -26670,6 +27242,10 @@ /obj/item/wirecutters, /turf/open/floor/plating, /area/station/construction) +"iAr" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/project) "iAs" = ( /obj/structure/table, /obj/item/wirecutters, @@ -26862,11 +27438,6 @@ dir = 1 }, /area/station/hallway/secondary/service) -"iFd" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, -/area/station/maintenance/starboard/fore) "iFe" = ( /obj/structure/cable, /turf/open/floor/iron/dark/smooth_half, @@ -26880,9 +27451,6 @@ /area/station/security/warden) "iFl" = ( /obj/structure/table, -/obj/item/flashlight/lamp{ - on = 0 - }, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/wood, /area/station/maintenance/aft/greater) @@ -26893,6 +27461,10 @@ dir = 5 }, /area/station/maintenance/port/aft) +"iFr" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron, +/area/station/engineering/atmos) "iFs" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment{ @@ -26901,20 +27473,26 @@ /turf/open/floor/iron, /area/station/command/bridge) "iFz" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ +/obj/effect/turf_decal/siding/white{ dir = 1 }, -/obj/structure/disposalpipe/segment, -/obj/machinery/duct, -/obj/structure/cable, -/turf/open/floor/iron/freezer, -/area/station/service/kitchen/coldroom) +/obj/structure/table, +/obj/item/clothing/head/fedora, +/turf/open/floor/iron/white/smooth_large, +/area/station/service/kitchen/diner) "iFL" = ( /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, -/area/station/science/mixing) +/area/station/science/ordnance) +"iFU" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/trimline/dark_blue/line{ + dir = 10 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/mix) "iFX" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -26927,7 +27505,7 @@ dir = 4 }, /turf/open/floor/plating/icemoon, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "iGH" = ( /obj/effect/turf_decal/tile/blue{ dir = 8 @@ -26949,9 +27527,7 @@ /turf/open/floor/iron, /area/station/engineering/atmos) "iHr" = ( -/obj/structure/sign/warning/biohazard{ - pixel_y = 32 - }, +/obj/structure/sign/warning/biohazard/directional/north, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) "iHy" = ( @@ -27078,18 +27654,6 @@ dir = 4 }, /area/station/service/chapel) -"iIT" = ( -/obj/structure/sink/kitchen{ - pixel_y = 24 - }, -/obj/machinery/button/door/directional/north{ - id = "kitchen_counter"; - name = "Counter Shutters Control"; - pixel_x = -25; - req_access = list("kitchen") - }, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "iIW" = ( /obj/structure/table, /obj/item/plant_analyzer, @@ -27099,7 +27663,7 @@ "iJf" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, -/area/station/science/mixing) +/area/station/science/ordnance) "iJh" = ( /obj/machinery/airalarm/directional/east, /obj/effect/turf_decal/tile/yellow{ @@ -27135,11 +27699,6 @@ }, /turf/open/floor/iron, /area/station/commons/dorms/laundry) -"iJN" = ( -/obj/machinery/deepfryer, -/obj/item/radio/intercom/directional/south, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "iKk" = ( /obj/effect/landmark/xeno_spawn, /obj/structure/cable, @@ -27160,10 +27719,11 @@ /turf/open/floor/iron, /area/station/security/prison/mess) "iKC" = ( -/obj/machinery/holopad, -/obj/effect/landmark/start/cook, -/turf/open/floor/iron/freezer, -/area/station/service/kitchen/coldroom) +/obj/effect/turf_decal/tile/red/full, +/obj/effect/turf_decal/siding/white, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/large, +/area/station/service/kitchen/diner) "iKG" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -27202,6 +27762,13 @@ }, /turf/open/floor/iron/freezer, /area/station/commons/toilet/locker) +"iKZ" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/mix) "iLe" = ( /obj/item/radio/intercom/directional/north, /obj/structure/table/glass, @@ -27257,13 +27824,6 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) -"iLN" = ( -/obj/structure/sign/warning/secure_area{ - pixel_x = -32 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/maint) "iLU" = ( /obj/machinery/duct, /obj/effect/turf_decal/tile/blue{ @@ -27277,7 +27837,7 @@ /area/station/medical/virology) "iLW" = ( /turf/open/floor/iron, -/area/station/science/mixing) +/area/station/science/ordnance) "iLY" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple{ dir = 4 @@ -27285,16 +27845,12 @@ /turf/open/floor/plating/snowed/smoothed/icemoon, /area/icemoon/surface/outdoors/nospawn) "iMa" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red/full, /obj/effect/turf_decal/siding/white{ dir = 1 }, -/obj/effect/landmark/start/hangover, /obj/item/radio/intercom/directional/north, -/turf/open/floor/iron/large, +/obj/item/kirbyplants/random, +/turf/open/floor/iron/white/smooth_large, /area/station/service/kitchen/diner) "iMg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -27442,7 +27998,7 @@ name = "BOMB RANGE" }, /turf/closed/wall, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "iOc" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -27466,6 +28022,15 @@ /obj/effect/mapping_helpers/airlock/access/all/command/ai_upload, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) +"iOl" = ( +/obj/effect/turf_decal/box/corners{ + dir = 4 + }, +/obj/effect/turf_decal/box/corners{ + dir = 8 + }, +/turf/open/floor/engine, +/area/station/engineering/atmos/hfr_room) "iOs" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/airalarm/directional/south, @@ -27529,15 +28094,7 @@ }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, -/area/station/science/misc_lab) -"iPr" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/warning/secure_area{ - pixel_y = -32 - }, -/obj/structure/sign/warning/cold_temp, -/turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/science/explab) "iPx" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 9 @@ -27571,6 +28128,7 @@ /obj/effect/turf_decal/stripes/corner{ dir = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/entry) "iQt" = ( @@ -27600,6 +28158,12 @@ /obj/machinery/airalarm/directional/south, /turf/open/floor/iron, /area/station/science/xenobiology) +"iQP" = ( +/obj/structure/table, +/obj/item/stack/sheet/glass/fifty, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage) "iQQ" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -27659,19 +28223,8 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/iron, /area/station/engineering/atmos) -"iRB" = ( -/obj/machinery/light/directional/east, -/obj/structure/extinguisher_cabinet/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/computer/atmos_control/nocontrol/incinerator{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/maintenance/disposal/incinerator) "iRC" = ( -/obj/structure/sign/warning/electric_shock{ - pixel_y = 32 - }, +/obj/structure/sign/warning/electric_shock/directional/north, /obj/machinery/door/firedoor, /obj/effect/turf_decal/tile/blue{ dir = 1 @@ -27705,12 +28258,13 @@ }, /area/station/science/research) "iRQ" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/siding/white, /obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/machinery/airalarm/directional/south, +/obj/effect/turf_decal/siding/white, +/obj/machinery/camera/directional/south{ + c_tag = "Service-Bar 1" + }, /turf/open/floor/iron, /area/station/service/bar) "iRV" = ( @@ -27739,11 +28293,11 @@ "iSo" = ( /obj/effect/turf_decal/tile/red/anticorner, /obj/machinery/requests_console/directional/north{ + anon_tips_receiver = 1; + assistance_requestable = 1; department = "Security"; departmentType = 5; - name = "Security Requests Console"; - assistance_requestable = 1; - anon_tips_receiver = 1 + name = "Security Requests Console" }, /turf/open/floor/iron/dark/textured_corner{ dir = 1 @@ -27771,7 +28325,7 @@ }, /obj/machinery/door/firedoor, /turf/open/floor/iron/dark/textured, -/area/station/security/prison) +/area/station/security/execution/transfer) "iSW" = ( /obj/machinery/door/airlock/maintenance{ name = "Cargo Bay Maintenance" @@ -27813,9 +28367,8 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/aft) "iTY" = ( /obj/machinery/light/small/directional/east, @@ -27880,10 +28433,12 @@ /turf/open/floor/iron, /area/station/engineering/lobby) "iUA" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/department/chapel) +"iUE" = ( +/turf/open/floor/iron/dark, +/area/station/science/ordnance/office) "iUG" = ( /turf/open/floor/plating, /area/station/maintenance/fore/lesser) @@ -27927,6 +28482,13 @@ }, /turf/open/floor/iron, /area/mine/eva/lower) +"iVr" = ( +/obj/effect/turf_decal/trimline/yellow/filled/shrink_cw{ + dir = 4 + }, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/hfr_room) "iVA" = ( /obj/effect/landmark/start/shaft_miner, /turf/open/floor/iron, @@ -27972,9 +28534,8 @@ /area/station/medical/pharmacy) "iWl" = ( /obj/effect/spawner/random/structure/crate, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) "iWr" = ( /turf/closed/wall, @@ -28060,6 +28621,9 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/security/prison/visit) +"iXr" = ( +/turf/closed/wall/mineral/iron, +/area/station/engineering/atmos/mix) "iXu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment{ @@ -28106,6 +28670,9 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/spawner/random/structure/steam_vent, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/floor/plating, /area/station/maintenance/aft/greater) "iYb" = ( @@ -28198,6 +28765,15 @@ dir = 6 }, /area/station/science/xenobiology) +"iZS" = ( +/obj/effect/spawner/structure/window, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "rnd2"; + name = "Research Lab Shutters"; + dir = 4 + }, +/turf/open/floor/plating, +/area/station/science/research) "iZW" = ( /obj/structure/toilet{ pixel_y = 8 @@ -28234,11 +28810,12 @@ }, /obj/effect/turf_decal/delivery, /turf/open/floor/iron, -/area/station/science/mixing) +/area/station/science/ordnance) "jau" = ( /obj/machinery/door/poddoor/shutters/window{ id = "drone_bay"; - name = "Drone Bay Shutters" + name = "Drone Bay Shutters"; + dir = 8 }, /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -28393,9 +28970,7 @@ /area/station/security/checkpoint/customs/auxiliary) "jcj" = ( /obj/machinery/light/directional/south, -/obj/structure/sign/warning/electric_shock{ - pixel_y = -32 - }, +/obj/structure/sign/warning/electric_shock/directional/south, /obj/machinery/door/firedoor, /obj/effect/turf_decal/tile/blue{ dir = 8 @@ -28444,11 +29019,6 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) -"jda" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, -/area/station/maintenance/aft/lesser) "jdd" = ( /obj/structure/closet/firecloset, /obj/machinery/light/small/directional/north, @@ -28464,6 +29034,14 @@ /obj/item/flashlight/lamp, /turf/open/floor/iron/grimy, /area/station/commons/vacant_room/office) +"jdm" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/components/binary/pump/off/pink/visible{ + dir = 4; + name = "Exfiltrate to Port" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/mix) "jdq" = ( /obj/effect/turf_decal/tile/brown{ dir = 1 @@ -28476,11 +29054,11 @@ }, /obj/machinery/computer/security/qm, /obj/machinery/requests_console/directional/west{ + announcementConsole = 1; + assistance_requestable = 1; department = "Quartermaster's Desk"; name = "Quartermaster's Desk Requests Console"; - announcementConsole = 1; - supplies_requestable = 1; - assistance_requestable = 1 + supplies_requestable = 1 }, /turf/open/floor/iron, /area/station/cargo/qm) @@ -28496,6 +29074,11 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) +"jdL" = ( +/obj/structure/lattice, +/obj/structure/sign/warning/directional/south, +/turf/open/openspace/icemoon/keep_below, +/area/icemoon/underground/explored) "jdQ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -28655,12 +29238,6 @@ }, /turf/open/floor/iron/dark, /area/station/medical/morgue) -"jhg" = ( -/obj/machinery/firealarm/directional/north, -/obj/structure/table, -/obj/item/stack/sheet/glass/fifty, -/turf/open/floor/iron, -/area/station/engineering/atmos/project) "jhy" = ( /obj/effect/turf_decal/tile/brown, /turf/open/floor/iron, @@ -28674,11 +29251,14 @@ /turf/open/floor/plating, /area/station/maintenance/starboard/aft) "jhH" = ( +/obj/machinery/microwave{ + pixel_y = 5; + name = "Emergency Heating Appliance"; + desc = "Turn it on and you'll immediately get warmer! Warranty void if left in weather conditions." + }, /obj/structure/table, -/obj/item/plate, -/obj/item/reagent_containers/food/condiment/enzyme, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) +/turf/open/floor/plating/snowed/coldroom, +/area/station/service/kitchen/coldroom) "jhM" = ( /obj/docking_port/stationary/random/icemoon{ dir = 8; @@ -28759,7 +29339,7 @@ }, /obj/structure/lattice/catwalk, /turf/open/openspace, -/area/station/science/mixing) +/area/station/science/ordnance/office) "jjG" = ( /obj/item/instrument/harmonica, /obj/item/instrument/guitar, @@ -28768,10 +29348,17 @@ /obj/structure/table/wood, /turf/open/floor/wood/tile, /area/station/service/theater) +"jjH" = ( +/obj/effect/turf_decal/box/corners{ + dir = 1 + }, +/obj/effect/turf_decal/box/corners, +/turf/open/floor/engine, +/area/station/engineering/atmos/hfr_room) "jjI" = ( /obj/item/kirbyplants/random, /turf/open/floor/iron/dark, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "jjQ" = ( /obj/structure/table/glass, /obj/structure/window/reinforced{ @@ -28940,6 +29527,14 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) +"jmf" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/trimline/dark_blue/line{ + dir = 9 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/mix) "jms" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/west, @@ -28967,9 +29562,7 @@ /turf/open/floor/iron/grimy, /area/station/service/chapel/office) "jnk" = ( -/obj/structure/sign/warning/electric_shock{ - pixel_y = -32 - }, +/obj/structure/sign/warning/electric_shock/directional/south, /obj/machinery/door/firedoor, /obj/machinery/light/directional/south, /obj/effect/turf_decal/tile/blue{ @@ -29038,10 +29631,6 @@ }, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/station/service/hydroponics) -"joe" = ( -/obj/structure/cable/multilayer/connected, -/turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat_interior) "jol" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment{ @@ -29062,9 +29651,7 @@ /area/station/hallway/secondary/entry) "joI" = ( /obj/machinery/door/firedoor/heavy, -/obj/structure/sign/warning/firing_range{ - pixel_x = -32 - }, +/obj/structure/sign/warning/firing_range/directional/west, /turf/open/floor/iron/white/corner{ dir = 4 }, @@ -29082,6 +29669,10 @@ /obj/structure/cable/layer3, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) +"joQ" = ( +/obj/effect/turf_decal/bot_red, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/project) "joW" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -29094,6 +29685,14 @@ /obj/machinery/vending/coffee, /turf/open/floor/iron, /area/station/hallway/primary/fore) +"jpj" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ + dir = 4; + initialize_directions = 8 + }, +/obj/effect/turf_decal/bot_red, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/project) "jpo" = ( /obj/machinery/door/poddoor/preopen{ id = "maint2" @@ -29238,14 +29837,6 @@ }, /turf/open/floor/iron, /area/station/science/robotics/lab) -"jsb" = ( -/obj/machinery/light/directional/south, -/obj/structure/kitchenspike, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 - }, -/turf/open/floor/iron/freezer, -/area/station/service/kitchen/coldroom) "jse" = ( /obj/machinery/light/directional/north, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -29377,9 +29968,8 @@ /area/station/security/checkpoint/engineering) "jtB" = ( /obj/effect/spawner/random/trash/moisture_trap, -/turf/open/floor/wood{ - icon_state = "wood-broken7" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/maintenance/fore/lesser) "jtD" = ( /obj/structure/railing{ @@ -29430,6 +30020,9 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/machinery/computer/atmos_control/nocontrol/master{ + dir = 1 + }, /turf/open/floor/iron/dark/corner, /area/station/engineering/atmos/storage/gas) "jtX" = ( @@ -29498,7 +30091,7 @@ }, /obj/machinery/meter, /turf/open/floor/iron, -/area/station/science/mixing) +/area/station/science/ordnance) "jvm" = ( /obj/structure/closet/secure_closet/courtroom, /obj/item/gavelhammer, @@ -29573,6 +30166,7 @@ }, /obj/structure/cable, /obj/effect/mapping_helpers/airlock/access/all/engineering/tech_storage, +/obj/effect/mapping_helpers/airlock/access/all/command/general, /turf/open/floor/plating, /area/station/engineering/storage/tech) "jwx" = ( @@ -29605,7 +30199,10 @@ /obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ dir = 4 }, -/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible, +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 1; + name = "N2 to Airmix" + }, /turf/open/floor/iron, /area/station/engineering/atmos) "jxG" = ( @@ -29634,11 +30231,25 @@ "jyd" = ( /turf/open/floor/iron, /area/station/security/checkpoint/customs/auxiliary) +"jyj" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "jyl" = ( /obj/structure/cable, /obj/effect/spawner/random/structure/steam_vent, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"jyw" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "jyR" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -29763,6 +30374,18 @@ }, /turf/open/floor/plating, /area/station/maintenance/space_hut/cabin) +"jAX" = ( +/obj/effect/mapping_helpers/airlock/access/all/service/kitchen, +/obj/machinery/door/airlock/freezer{ + name = "The Ice Box"; + desc = "The freezer where the chef keeps all the stuff that needs to be kept cold. Ice cold." + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/station/service/kitchen/coldroom) "jAZ" = ( /obj/structure/window/reinforced{ dir = 1 @@ -29782,13 +30405,7 @@ network = list("ss13","rd") }, /turf/open/floor/iron, -/area/station/science/mixing/launch) -"jBe" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) +/area/station/science/ordnance/testlab) "jBh" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -29946,14 +30563,6 @@ }, /turf/open/floor/iron, /area/mine/laborcamp) -"jEG" = ( -/obj/effect/turf_decal/tile/red/full, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/iron/large, -/area/station/service/kitchen/diner) "jEJ" = ( /obj/effect/turf_decal/tile/yellow, /obj/machinery/firealarm/directional/east, @@ -29980,15 +30589,11 @@ /turf/open/floor/iron, /area/station/security/checkpoint/customs/auxiliary) "jFe" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, +/obj/item/radio/intercom/directional/east, +/obj/effect/turf_decal/tile/bar/opposingcorners, /obj/effect/turf_decal/siding/white{ dir = 6 }, -/obj/machinery/airalarm/directional/south, -/obj/item/radio/intercom/directional/east, /turf/open/floor/iron, /area/station/service/bar) "jFn" = ( @@ -30028,7 +30633,7 @@ /area/station/hallway/secondary/service) "jFF" = ( /obj/structure/table/wood, -/obj/item/book/granter/spell/smoke/lesser{ +/obj/item/book/granter/action/spell/smoke/lesser{ name = "mysterious old book of cloud-chasing" }, /obj/item/reagent_containers/food/drinks/bottle/holywater{ @@ -30154,12 +30759,6 @@ /obj/machinery/computer/warrant, /turf/open/floor/iron, /area/station/hallway/primary/fore) -"jHv" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos/project) "jHF" = ( /obj/item/trash/boritos/red, /obj/structure/cable, @@ -30204,9 +30803,7 @@ /turf/open/floor/plating, /area/station/hallway/secondary/service) "jHZ" = ( -/obj/structure/sign/departments/chemistry{ - pixel_y = -32 - }, +/obj/structure/sign/departments/chemistry/directional/south, /obj/effect/turf_decal/trimline/blue/filled/warning{ dir = 8 }, @@ -30244,6 +30841,14 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/external, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"jIl" = ( +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) "jIm" = ( /obj/machinery/rnd/production/techfab/department/security, /obj/structure/cable, @@ -30265,10 +30870,10 @@ dir = 8 }, /obj/machinery/requests_console/directional/south{ + assistance_requestable = 1; department = "Chemistry"; departmentType = 1; - name = "Chemistry Requests Console"; - assistance_requestable = 1 + name = "Chemistry Requests Console" }, /turf/open/floor/iron/white, /area/station/medical/pharmacy) @@ -30560,9 +31165,8 @@ /area/station/commons/locker) "jNa" = ( /obj/effect/spawner/random/trash/grille_or_waste, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/aft) "jNc" = ( /obj/machinery/seed_extractor, @@ -30584,10 +31188,11 @@ /turf/open/floor/iron/dark, /area/station/tcommsat/computer) "jNh" = ( -/obj/effect/turf_decal/tile/red/full, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/large, +/obj/machinery/light/directional/east, +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/turf/open/floor/iron/white/smooth_large, /area/station/service/kitchen/diner) "jNk" = ( /obj/machinery/airalarm/directional/west, @@ -30625,6 +31230,9 @@ }, /turf/open/floor/plating, /area/station/maintenance/fore/lesser) +"jNW" = ( +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/hfr_room) "jNZ" = ( /obj/effect/turf_decal/weather/snow/corner{ dir = 9 @@ -30711,7 +31319,8 @@ "jOZ" = ( /obj/machinery/door/poddoor/shutters/preopen{ id = "hop"; - name = "Privacy Shutters" + name = "Privacy Shutters"; + dir = 8 }, /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -30765,6 +31374,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/engineering/main) +"jPT" = ( +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/machinery/griddle, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) "jPY" = ( /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, @@ -30774,7 +31388,7 @@ /area/station/command/heads_quarters/cmo) "jQg" = ( /turf/open/floor/iron/white, -/area/station/science/misc_lab) +/area/station/science/explab) "jQh" = ( /obj/structure/ladder, /obj/machinery/light/small/directional/east, @@ -30855,9 +31469,7 @@ /turf/open/floor/iron/white, /area/station/science/research) "jQV" = ( -/obj/structure/sign/departments/xenobio{ - pixel_x = -32 - }, +/obj/structure/sign/departments/xenobio/directional/west, /obj/effect/spawner/random/structure/crate, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) @@ -30901,16 +31513,17 @@ /turf/open/floor/carpet, /area/station/command/heads_quarters/hop) "jRE" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, -/obj/structure/table, -/obj/structure/extinguisher_cabinet/directional/east, -/obj/item/food/chococoin, -/turf/open/floor/iron/freezer, -/area/station/service/kitchen/coldroom) -"jRI" = ( -/obj/structure/sign/warning/secure_area{ - pixel_y = -32 +/obj/effect/turf_decal/siding/white{ + dir = 6 }, +/obj/machinery/duct, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/start/hangover, +/turf/open/floor/iron/white/smooth_large, +/area/station/service/kitchen/diner) +"jRI" = ( +/obj/structure/sign/warning/secure_area/directional/south, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -30932,9 +31545,8 @@ /area/icemoon/surface/outdoors/nospawn) "jSa" = ( /obj/structure/sign/poster/contraband/random/directional/west, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/aft) "jSc" = ( /obj/structure/bookcase/random, @@ -31074,11 +31686,11 @@ /obj/structure/filingcabinet, /obj/machinery/requests_console/directional/west{ announcementConsole = 1; + anon_tips_receiver = 1; + assistance_requestable = 1; department = "Captain's Desk"; departmentType = 5; - name = "Captain's Requests Console"; - anon_tips_receiver = 1; - assistance_requestable = 1 + name = "Captain's Requests Console" }, /turf/open/floor/wood, /area/station/command/heads_quarters/captain) @@ -31105,17 +31717,6 @@ /obj/item/pen, /turf/open/floor/iron, /area/mine/laborcamp) -"jUk" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/machinery/door/airlock/external{ - name = "MiniSat External Access" - }, -/obj/effect/mapping_helpers/airlock/access/all/command/ai_upload, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat_interior) "jUn" = ( /obj/structure/table, /obj/item/folder/red{ @@ -31130,7 +31731,7 @@ pixel_x = -6; pixel_y = 9 }, -/obj/item/radio/intercom/prison/directional/north, +/obj/item/radio/intercom/directional/north, /turf/open/floor/iron/showroomfloor, /area/station/security/warden) "jUr" = ( @@ -31158,13 +31759,10 @@ /area/station/hallway/secondary/exit/departure_lounge) "jUY" = ( /obj/structure/barricade/wooden, -/obj/structure/sign/warning/gas_mask{ - desc = "A sign that warns of dangerous gasses in the air, instructing you to wear internals."; - pixel_y = -32 - }, -/obj/structure/sign/warning/cold_temp{ - pixel_y = 32 +/obj/structure/sign/warning/gas_mask/directional/south{ + desc = "A sign that warns of dangerous gasses in the air, instructing you to wear internals." }, +/obj/structure/sign/warning/cold_temp/directional/north, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) "jVq" = ( @@ -31193,13 +31791,16 @@ /turf/open/floor/iron/white, /area/station/medical/virology) "jWj" = ( -/obj/item/radio/intercom/directional/north, /obj/machinery/light/small/directional/north, /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, +/obj/machinery/camera/autoname/directional/north, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, -/area/station/engineering/atmos/project) +/area/station/engineering/atmos/storage) "jWl" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -31237,6 +31838,11 @@ /obj/structure/sign/poster/official/help_others, /turf/closed/wall/ice, /area/icemoon/underground/explored) +"jXi" = ( +/obj/structure/closet, +/obj/effect/spawner/random/maintenance/three, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) "jXl" = ( /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, @@ -31247,18 +31853,11 @@ dir = 1 }, /turf/open/openspace, -/area/station/science/mixing) +/area/station/science/ordnance/office) "jXD" = ( /obj/machinery/light/directional/north, /turf/open/floor/iron, /area/station/hallway/secondary/service) -"jXJ" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/structure/disposalpipe/segment, -/obj/machinery/duct, -/obj/machinery/firealarm/directional/east, -/turf/open/floor/iron/freezer, -/area/station/service/kitchen/coldroom) "jXL" = ( /obj/effect/turf_decal/tile/red{ dir = 8 @@ -31277,11 +31876,16 @@ /turf/open/floor/iron/dark, /area/station/command/gateway) "jXU" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/obj/structure/desk_bell{ + pixel_x = -6; + name = "The Regular's Bell"; + desc = "Why, I'm always here! I should get absolute service. Pronto, garcon!" }, -/obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/service/bar) "jXY" = ( @@ -31335,9 +31939,9 @@ /turf/open/floor/plating, /area/station/maintenance/port/aft) "jYU" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) +/obj/structure/kitchenspike, +/turf/open/floor/plating/snowed/coldroom, +/area/station/service/kitchen/coldroom) "jZa" = ( /obj/machinery/camera/directional/west{ c_tag = "Labor Camp External West"; @@ -31449,15 +32053,6 @@ dir = 6 }, /area/station/science/research) -"kba" = ( -/obj/effect/turf_decal/tile/red/full, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/holopad, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/iron/large, -/area/station/service/kitchen/diner) "kbn" = ( /obj/effect/decal/cleanable/food/pie_smudge, /turf/open/floor/iron, @@ -31538,18 +32133,16 @@ /area/station/engineering/storage/tech) "kcy" = ( /obj/effect/turf_decal/tile/red/full, -/obj/structure/table, /obj/effect/turf_decal/siding/white{ dir = 8 }, +/obj/structure/table, /obj/item/reagent_containers/food/condiment/saltshaker{ pixel_x = -3 }, /obj/item/reagent_containers/food/condiment/peppermill{ pixel_x = 3 }, -/obj/machinery/light/directional/west, -/obj/structure/sign/poster/random/directional/west, /turf/open/floor/iron/large, /area/station/service/kitchen/diner) "kcA" = ( @@ -31626,7 +32219,7 @@ }, /obj/machinery/light/directional/south, /turf/open/floor/iron, -/area/station/science/mixing) +/area/station/science/ordnance) "kdc" = ( /obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{ dir = 8 @@ -31638,14 +32231,13 @@ /area/station/engineering/atmos/pumproom) "kdk" = ( /obj/item/clothing/suit/apron/surgical, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "kdq" = ( /obj/structure/cable, /turf/open/floor/iron, -/area/station/science/misc_lab) +/area/station/science/explab) "kdu" = ( /obj/effect/turf_decal/tile/brown{ dir = 1 @@ -31667,6 +32259,16 @@ /obj/effect/landmark/xeno_spawn, /turf/open/floor/iron, /area/station/construction) +"kdK" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/machinery/button/door/directional/north{ + id = "Atmospherics Project Shutters"; + name = "Atmospherics Project Shutters"; + req_access = list("atmospherics") + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/project) "kdT" = ( /obj/machinery/iv_drip, /obj/item/reagent_containers/blood, @@ -31764,13 +32366,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/mine/laborcamp) -"kfG" = ( -/obj/structure/table, -/obj/item/food/pie/cream, -/obj/machinery/newscaster/directional/north, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "kfQ" = ( /obj/machinery/atmospherics/components/binary/pressure_valve/on{ name = "Waste Release" @@ -31816,15 +32411,12 @@ /turf/open/floor/plating, /area/station/security/detectives_office) "kgC" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, /obj/effect/turf_decal/siding/wood{ dir = 9 }, /obj/item/paicard, /obj/structure/table/wood, +/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/service/bar) "kgD" = ( @@ -31928,13 +32520,24 @@ /obj/machinery/firealarm/directional/west, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"khO" = ( +/obj/machinery/atmospherics/pipe/layer_manifold/general/visible{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "khU" = ( /obj/structure/chair/plastic, /obj/effect/turf_decal/bot_red, /turf/open/floor/plating, /area/station/maintenance/fore) +"kic" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/machinery/camera/autoname/directional/south, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/project) "kin" = ( -/obj/structure/table, +/obj/machinery/pdapainter/supply, /turf/open/floor/carpet, /area/station/cargo/qm) "kir" = ( @@ -31979,9 +32582,7 @@ /area/station/command/meeting_room) "kiT" = ( /obj/machinery/light/small/directional/south, -/obj/structure/sign/warning/cold_temp{ - pixel_y = -32 - }, +/obj/structure/sign/warning/cold_temp/directional/south, /obj/structure/window/reinforced{ dir = 4 }, @@ -32022,6 +32623,12 @@ /obj/machinery/iv_drip, /turf/open/floor/iron/white, /area/station/medical/surgery/fore) +"kjJ" = ( +/obj/structure/transit_tube/curved{ + dir = 4 + }, +/turf/open/floor/plating/snowed/icemoon, +/area/icemoon/surface/outdoors/nospawn) "kjK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -32032,6 +32639,13 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"kjN" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/obj/effect/turf_decal/bot_white, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/project) "kkl" = ( /turf/closed/wall, /area/station/security/interrogation) @@ -32078,7 +32692,7 @@ dir = 4 }, /turf/open/floor/iron/dark/textured, -/area/station/security/prison) +/area/station/security/execution/transfer) "kkY" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -32130,9 +32744,8 @@ /turf/open/floor/iron, /area/mine/laborcamp) "klZ" = ( -/turf/open/floor/iron/icemoon{ - icon_state = "damaged5" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/icemoon, /area/icemoon/surface/outdoors/nospawn) "kma" = ( /obj/structure/table, @@ -32164,9 +32777,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "kmv" = ( /obj/machinery/door/poddoor/preopen{ @@ -32182,7 +32794,7 @@ /obj/item/restraints/handcuffs, /obj/item/reagent_containers/spray/pepper, /turf/open/floor/iron/smooth, -/area/station/security/prison) +/area/station/security/execution/transfer) "kmH" = ( /obj/effect/spawner/random/entertainment/cigar, /obj/structure/table, @@ -32235,15 +32847,11 @@ /turf/open/floor/iron/dark, /area/station/engineering/lobby) "kni" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/disposalpipe/segment{ +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 }, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) +/turf/open/floor/plating/snowed/coldroom, +/area/station/service/kitchen/coldroom) "knq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -32261,12 +32869,10 @@ /turf/open/floor/iron/cafeteria{ dir = 8 }, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "knO" = ( /obj/machinery/door/firedoor/heavy, -/obj/structure/sign/warning/test_chamber{ - pixel_x = 32 - }, +/obj/structure/sign/warning/test_chamber/directional/east, /turf/open/floor/iron/white/corner{ dir = 1 }, @@ -32353,6 +32959,7 @@ dir = 4 }, /obj/structure/chair/stool/bar/directional/east, +/obj/effect/landmark/start/hangover, /turf/open/floor/stone, /area/station/commons/lounge) "kqh" = ( @@ -32402,7 +33009,7 @@ /obj/machinery/door/firedoor/heavy, /obj/machinery/light/directional/south, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "kqw" = ( /obj/effect/turf_decal/tile/red{ dir = 8 @@ -32411,10 +33018,16 @@ /turf/open/floor/iron/white/corner, /area/station/hallway/secondary/exit/departure_lounge) "kqI" = ( -/obj/effect/turf_decal/tile/red/full, -/obj/effect/turf_decal/siding/white/corner, -/turf/open/floor/iron/large, -/area/station/service/kitchen/diner) +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "kitchencounter"; + name = "Kitchen Counter Shutters"; + dir = 8 + }, +/obj/structure/displaycase/forsale/kitchen, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) "kqN" = ( /obj/effect/turf_decal/trimline/green/filled/warning{ dir = 1 @@ -32426,13 +33039,21 @@ /turf/open/floor/iron/white, /area/station/medical/medbay/aft) "kqP" = ( -/obj/effect/turf_decal/stripes/line, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/trimline/dark_red/arrow_ccw{ + dir = 8 + }, +/obj/structure/railing/corner{ + dir = 1 + }, +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/simple/pink/visible/layer5, /turf/open/floor/iron, -/area/station/engineering/atmos/project) +/area/station/engineering/atmos/storage) "kqR" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -32456,14 +33077,6 @@ /obj/effect/mapping_helpers/airlock/access/all/supply/mining_station, /turf/open/floor/iron/smooth_large, /area/station/cargo/warehouse) -"kqY" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/effect/landmark/start/hangover, -/obj/structure/chair/stool/bar/directional/east, -/turf/open/floor/stone, -/area/station/commons/lounge) "kra" = ( /obj/structure/railing{ dir = 1 @@ -32641,14 +33254,6 @@ /obj/structure/grille, /turf/open/floor/plating, /area/station/maintenance/aft/greater) -"ktj" = ( -/obj/effect/turf_decal/tile/red/full, -/obj/structure/table, -/obj/effect/spawner/random/food_or_drink/donkpockets{ - pixel_y = 8 - }, -/turf/open/floor/iron/large, -/area/station/service/kitchen/diner) "ktl" = ( /obj/machinery/holopad, /obj/structure/cable, @@ -32695,6 +33300,9 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/aft) +"ktQ" = ( +/turf/closed/wall/r_wall, +/area/station/engineering/atmos/mix) "ktS" = ( /obj/effect/decal/cleanable/dirt/dust, /turf/closed/wall, @@ -32736,7 +33344,7 @@ "kuE" = ( /obj/structure/tank_dispenser, /turf/open/floor/iron/dark, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "kuJ" = ( /obj/machinery/door/airlock/security/glass{ name = "Brig Entrance" @@ -32775,9 +33383,7 @@ /turf/open/floor/iron/white/smooth_large, /area/station/medical/pharmacy) "kvb" = ( -/obj/structure/sign/warning/secure_area{ - pixel_y = -32 - }, +/obj/structure/sign/warning/secure_area/directional/south, /obj/effect/turf_decal/tile/purple, /obj/effect/turf_decal/tile/purple{ dir = 8 @@ -32846,9 +33452,6 @@ /area/station/engineering/atmos) "kwH" = ( /obj/structure/cable, -/obj/machinery/computer/atmos_control/nocontrol/master{ - dir = 8 - }, /turf/open/floor/iron/dark, /area/station/engineering/atmos/storage/gas) "kwK" = ( @@ -32880,7 +33483,7 @@ req_access = list("ordnance") }, /turf/open/floor/iron, -/area/station/science/mixing) +/area/station/science/ordnance) "kxt" = ( /obj/machinery/door/airlock/security/glass{ name = "Armory" @@ -32991,14 +33594,11 @@ /turf/open/floor/iron, /area/station/construction/mining/aux_base) "kzp" = ( -/obj/effect/decal/cleanable/cobweb, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/bot, -/obj/structure/cable, -/obj/machinery/light_switch/directional/north, -/obj/structure/closet/radiation, -/turf/open/floor/iron/dark, -/area/station/maintenance/disposal/incinerator) +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage) "kzr" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/siding/wideplating/dark{ @@ -33132,6 +33732,12 @@ }, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/surface/outdoors/nospawn) +"kAS" = ( +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/structure/table, +/obj/item/food/piedough, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) "kAT" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -33146,7 +33752,7 @@ "kAX" = ( /obj/machinery/door/poddoor/incinerator_ordmix, /turf/open/openspace, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "kAY" = ( /obj/structure/window/reinforced{ dir = 1 @@ -33171,9 +33777,7 @@ /obj/structure/ladder{ name = "upper dispenser access" }, -/obj/structure/sign/warning/no_smoking{ - pixel_x = 32 - }, +/obj/structure/sign/warning/no_smoking/directional/east, /obj/effect/turf_decal/stripes/box, /turf/open/floor/iron/dark/textured_large, /area/station/medical/chemistry) @@ -33208,6 +33812,14 @@ /obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible, /turf/open/floor/plating, /area/station/engineering/atmos) +"kBC" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/arrows/white{ + color = "#0000FF"; + pixel_y = 15 + }, +/turf/open/floor/engine, +/area/station/engineering/atmos/hfr_room) "kBL" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -33233,10 +33845,10 @@ /turf/open/floor/iron, /area/mine/laborcamp) "kBQ" = ( -/obj/machinery/door/firedoor, /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/hallway/primary/starboard) "kBT" = ( @@ -33262,7 +33874,7 @@ /area/station/maintenance/port/aft) "kCo" = ( /turf/open/floor/iron/white/side, -/area/station/science/misc_lab) +/area/station/science/explab) "kCr" = ( /obj/structure/window/reinforced{ dir = 1 @@ -33298,16 +33910,6 @@ /obj/effect/mapping_helpers/airlock/access/all/security/brig, /turf/open/floor/iron, /area/mine/laborcamp/security) -"kCO" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/door/airlock/public/glass{ - name = "Canteen" - }, -/turf/open/floor/iron, -/area/station/service/kitchen/diner) "kCQ" = ( /obj/effect/turf_decal/tile/brown{ dir = 8 @@ -33332,16 +33934,6 @@ /obj/machinery/chem_dispenser, /turf/open/floor/glass/reinforced, /area/station/medical/treatment_center) -"kDg" = ( -/obj/machinery/door/airlock/hatch{ - name = "MiniSat Foyer" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/airlock/access/all/command/ai_upload, -/obj/structure/cable/layer3, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) "kDs" = ( /obj/machinery/button/door/directional/east{ id = "armory"; @@ -33376,6 +33968,13 @@ /obj/effect/turf_decal/tile/neutral/full, /turf/open/floor/iron/dark, /area/station/medical/morgue) +"kDE" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "kDJ" = ( /obj/item/wrench, /obj/item/clothing/glasses/monocle, @@ -33399,9 +33998,8 @@ "kEb" = ( /obj/structure/bed/pod, /obj/item/bedsheet/random, -/turf/open/floor/wood{ - icon_state = "wood-broken4" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/maintenance/port/fore) "kEj" = ( /obj/machinery/computer/libraryconsole/bookmanagement, @@ -33428,9 +34026,7 @@ /turf/open/floor/plating, /area/station/maintenance/port/greater) "kEu" = ( -/obj/structure/sign/departments/medbay/alt{ - pixel_x = -32 - }, +/obj/structure/sign/departments/medbay/alt/directional/west, /obj/effect/decal/cleanable/dirt, /obj/machinery/light/directional/west, /turf/open/floor/iron, @@ -33446,6 +34042,23 @@ "kEM" = ( /turf/open/floor/iron/freezer, /area/station/commons/toilet/locker) +"kFf" = ( +/obj/machinery/door/airlock/atmos/glass, +/obj/structure/cable, +/obj/machinery/door/firedoor/heavy, +/obj/effect/turf_decal/trimline/yellow/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/corner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/corner, +/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, +/turf/open/floor/iron/dark/smooth_half, +/area/station/engineering/atmos/project) "kFk" = ( /obj/machinery/newscaster/directional/north, /turf/open/floor/wood, @@ -33489,6 +34102,10 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/mine/eva) +"kGv" = ( +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage) "kGx" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -33520,7 +34137,7 @@ pixel_y = 4 }, /turf/open/floor/iron/dark, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "kGR" = ( /obj/effect/turf_decal/tile/brown{ dir = 1 @@ -33689,12 +34306,6 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron/white, /area/station/medical/psychology) -"kJG" = ( -/obj/item/storage/box/donkpockets{ - pixel_y = 5 - }, -/turf/open/genturf, -/area/icemoon/underground/unexplored/rivers/deep) "kJK" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/portables_connector/visible{ @@ -33761,13 +34372,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"kKJ" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 6 - }, -/obj/machinery/light/directional/east, -/turf/open/floor/iron, -/area/station/engineering/atmos) "kKL" = ( /turf/closed/wall, /area/station/maintenance/starboard/fore) @@ -33832,6 +34436,14 @@ /obj/effect/mapping_helpers/airlock/access/all/science/xenobio, /turf/open/floor/iron/white, /area/station/science/xenobiology) +"kLH" = ( +/obj/structure/sign/picture_frame/portrait/bar{ + pixel_y = -32 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/effect/turf_decal/siding/white, +/turf/open/floor/iron, +/area/station/service/bar) "kLI" = ( /obj/machinery/light/directional/south, /obj/effect/turf_decal/tile/blue, @@ -33882,6 +34494,10 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) +"kMv" = ( +/obj/structure/reagent_dispensers/cooking_oil, +/turf/open/floor/plating/snowed/coldroom, +/area/station/service/kitchen/coldroom) "kMz" = ( /obj/machinery/firealarm/directional/north, /obj/effect/turf_decal/tile/neutral{ @@ -34142,7 +34758,7 @@ /obj/structure/closet/crate/hydroponics, /obj/item/shovel/spade, /obj/item/wrench, -/obj/item/reagent_containers/glass/bucket, +/obj/item/reagent_containers/glass/watering_can, /obj/item/wirecutters, /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -34220,9 +34836,8 @@ /turf/open/floor/plating, /area/station/maintenance/solars/port/aft) "kRt" = ( -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/aft/lesser) "kRw" = ( /obj/machinery/portable_atmospherics/scrubber, @@ -34284,7 +34899,7 @@ dir = 9 }, /turf/open/floor/plating/icemoon, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "kSf" = ( /obj/machinery/camera/directional/east{ c_tag = "Locker Room Toilets" @@ -34355,11 +34970,9 @@ /turf/open/floor/iron/cafeteria, /area/station/commons/dorms/laundry) "kSJ" = ( -/obj/structure/sign/warning/fire{ - pixel_y = -32 - }, +/obj/structure/sign/warning/fire/directional/south, /turf/open/floor/glass/reinforced, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "kSM" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -34428,7 +35041,7 @@ /obj/effect/mapping_helpers/airlock/locked, /obj/effect/mapping_helpers/airlock/access/all/science/ordnance, /turf/open/floor/engine/vacuum, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "kTO" = ( /obj/machinery/hydroponics/constructable, /obj/effect/turf_decal/tile/blue, @@ -34459,11 +35072,11 @@ "kUg" = ( /obj/structure/closet/secure_closet/security/engine, /obj/machinery/requests_console/directional/north{ + anon_tips_receiver = 1; + assistance_requestable = 1; department = "Security"; departmentType = 5; - name = "Security Requests Console"; - assistance_requestable = 1; - anon_tips_receiver = 1 + name = "Security Requests Console" }, /obj/item/book/manual/wiki/security_space_law, /obj/effect/turf_decal/tile/red, @@ -34496,23 +35109,29 @@ /turf/open/floor/engine, /area/station/engineering/supermatter/room) "kUA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 9 +/obj/machinery/airalarm/kitchen_cold_room{ + dir = 8; + pixel_x = -24 }, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) +/obj/structure/flora/bush/snow/style_random, +/turf/open/misc/asteroid/snow/coldroom, +/area/station/service/kitchen/coldroom) "kUD" = ( /turf/open/openspace, /area/mine/eva) +"kUH" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/bot, +/obj/structure/cable, +/obj/structure/closet/radiation, +/turf/open/floor/iron/dark, +/area/station/maintenance/disposal/incinerator) "kUI" = ( /obj/structure/chair/office/light{ dir = 4 }, /turf/open/floor/iron, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "kUP" = ( /obj/structure/lattice/catwalk, /obj/structure/railing/corner{ @@ -34521,20 +35140,13 @@ /obj/structure/railing/corner, /turf/open/lava/plasma/ice_moon, /area/icemoon/underground/explored) -"kUU" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) "kVa" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "kVk" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -34544,6 +35156,18 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) +"kVu" = ( +/obj/machinery/button/door/directional/east{ + id = "Atmospherics HFR Shutters"; + name = "Atmospherics HFR Shutters"; + req_access = list("atmospherics") + }, +/obj/effect/turf_decal/trimline/yellow/filled/shrink_ccw{ + dir = 4 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/hfr_room) "kVx" = ( /obj/structure/cable/multilayer/multiz, /obj/effect/turf_decal/stripes/line, @@ -34655,9 +35279,8 @@ /turf/open/floor/iron, /area/station/cargo/office) "kXG" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/aft) "kXI" = ( /turf/open/floor/plating/icemoon, @@ -34766,13 +35389,14 @@ dir = 8 }, /obj/effect/mapping_helpers/airlock/access/any/science/maintenance, +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance/departmental, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) "kYV" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/airalarm/directional/west, /turf/open/floor/iron, -/area/station/science/mixing) +/area/station/science/ordnance) "kZa" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -34813,6 +35437,15 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/mine/mechbay) +"kZy" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "kZG" = ( /obj/item/storage/box/bodybags, /obj/structure/extinguisher_cabinet/directional/west, @@ -34920,6 +35553,18 @@ dir = 1 }, /area/station/hallway/secondary/exit/departure_lounge) +"lbz" = ( +/obj/machinery/atmospherics/pipe/multiz/pink/visible{ + dir = 8; + name = "Exfiltrate" + }, +/obj/effect/turf_decal/tile/neutral/diagonal_centre, +/obj/effect/turf_decal/tile/red/diagonal_edge, +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/iron/dark/diagonal, +/area/station/engineering/atmos/storage) "lbC" = ( /obj/machinery/firealarm/directional/south, /obj/machinery/camera{ @@ -34971,7 +35616,7 @@ dir = 1 }, /turf/open/floor/iron, -/area/station/science/mixing) +/area/station/science/ordnance) "ldc" = ( /obj/machinery/plate_press, /obj/structure/window/reinforced{ @@ -34985,11 +35630,11 @@ }, /obj/machinery/requests_console/directional/south{ announcementConsole = 1; + anon_tips_receiver = 1; + assistance_requestable = 1; department = "Head of Personnel's Desk"; departmentType = 5; - name = "Head of Personnel's Requests Console"; - anon_tips_receiver = 1; - assistance_requestable = 1 + name = "Head of Personnel's Requests Console" }, /turf/open/floor/iron, /area/station/command/heads_quarters/hop) @@ -35044,9 +35689,8 @@ /area/station/security/prison/mess) "ldM" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) "ldO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -35070,9 +35714,17 @@ /turf/open/floor/iron, /area/station/command/bridge) "ldY" = ( -/obj/machinery/vending/dinnerware, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/rack, +/obj/machinery/camera/autoname/directional/north, +/obj/item/pickaxe, +/obj/item/toy/figure/chef, +/turf/open/floor/plating/snowed/coldroom, +/area/station/service/kitchen/coldroom) "lec" = ( /obj/structure/railing{ dir = 4 @@ -35099,7 +35751,8 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/obj/effect/mapping_helpers/airlock/access/any/engineering/general, +/obj/effect/mapping_helpers/airlock/access/any/engineering/construction, /turf/open/floor/iron, /area/station/engineering/lobby) "lei" = ( @@ -35133,9 +35786,8 @@ /area/station/hallway/primary/starboard) "leR" = ( /obj/item/paper/crumpled, -/turf/open/floor/iron/icemoon{ - icon_state = "damaged2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/icemoon, /area/icemoon/surface/outdoors/nospawn) "leX" = ( /obj/item/radio/intercom/directional/west, @@ -35158,15 +35810,14 @@ "lfG" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/airlock/mining/glass{ - id_tag = "Quatermaster"; - name = "Quartermaster" - }, /obj/machinery/door/firedoor, /obj/structure/disposalpipe/segment, /obj/structure/cable, /obj/effect/mapping_helpers/airlock/access/all/supply/qm, /obj/effect/turf_decal/tile/brown/fourcorners, +/obj/machinery/door/airlock/command{ + name = "Quartermaster's Office" + }, /turf/open/floor/iron, /area/station/cargo/qm) "lfH" = ( @@ -35252,9 +35903,7 @@ /area/station/security/brig) "lgJ" = ( /obj/structure/cable, -/obj/structure/sign/warning/secure_area{ - pixel_x = 32 - }, +/obj/structure/sign/warning/secure_area/directional/east, /turf/open/floor/iron/white/side{ dir = 9 }, @@ -35337,7 +35986,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/machinery/light/directional/east, /turf/open/floor/iron/smooth, -/area/station/security/prison) +/area/station/security/execution/transfer) "lim" = ( /obj/machinery/conveyor{ dir = 4; @@ -35461,9 +36110,7 @@ /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "ljz" = ( -/obj/structure/sign/warning/biohazard{ - pixel_x = -32 - }, +/obj/structure/sign/warning/biohazard/directional/west, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) "ljF" = ( @@ -35604,9 +36251,8 @@ /area/station/science/xenobiology) "lly" = ( /obj/structure/table/wood, -/turf/open/floor/wood{ - icon_state = "wood-broken5" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/maintenance/port/aft) "llJ" = ( /obj/effect/turf_decal/stripes/line{ @@ -35633,13 +36279,11 @@ /turf/open/floor/iron/cafeteria, /area/station/commons/dorms/laundry) "llR" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "kitchen"; - name = "Kitchen Shutters" +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 }, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/cafeteria, +/turf/open/floor/iron/kitchen/diagonal, /area/station/service/kitchen) "llT" = ( /obj/effect/turf_decal/weather/snow/corner{ @@ -35657,11 +36301,11 @@ /obj/structure/window/reinforced, /obj/machinery/rnd/production/circuit_imprinter, /obj/machinery/requests_console/directional/east{ + assistance_requestable = 1; department = "Engineering"; departmentType = 3; name = "Engineering Requests Console"; - supplies_requestable = 1; - assistance_requestable = 1 + supplies_requestable = 1 }, /turf/open/floor/iron/dark, /area/station/engineering/lobby) @@ -35695,13 +36339,6 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/iron/smooth, /area/station/maintenance/starboard/lesser) -"lmH" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 1; - name = "O2 to Airmix" - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) "lmK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -35789,7 +36426,7 @@ /obj/item/gun/energy/laser/practice, /obj/machinery/newscaster/directional/south, /turf/open/floor/iron, -/area/station/science/misc_lab) +/area/station/science/explab) "lnY" = ( /obj/structure/table/glass, /obj/structure/bedsheetbin, @@ -35823,6 +36460,15 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat/atmos) +"low" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + id = "robotics2"; + name = "Robotics Lab Shutters"; + dir = 4 + }, +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/station/science/robotics/lab) "loy" = ( /obj/effect/turf_decal/tile/red/anticorner/contrasted, /obj/item/kirbyplants/random, @@ -35848,10 +36494,14 @@ /turf/open/floor/carpet/blue, /area/station/medical/psychology) "loP" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk, -/obj/machinery/firealarm/directional/east, -/turf/open/floor/iron/cafeteria, +/obj/structure/table, +/obj/structure/table, +/obj/structure/table, +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/machinery/processor{ + pixel_y = 6 + }, +/turf/open/floor/iron/kitchen/diagonal, /area/station/service/kitchen) "loQ" = ( /obj/effect/turf_decal/trimline/green/filled/corner, @@ -35867,19 +36517,8 @@ /turf/open/floor/iron, /area/station/security/checkpoint/auxiliary) "lpJ" = ( -/obj/structure/sign/warning/deathsposal{ - pixel_y = 32 - }, -/obj/effect/turf_decal/delivery, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/disposal/bin, -/obj/structure/cable, -/obj/structure/disposalpipe/trunk, -/turf/open/floor/iron/dark, -/area/station/maintenance/disposal/incinerator) +/turf/open/floor/iron, +/area/station/engineering/atmos/storage) "lpM" = ( /turf/closed/wall/r_wall, /area/station/command/heads_quarters/captain) @@ -35889,7 +36528,7 @@ dir = 9 }, /turf/open/floor/plating/icemoon, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "lpW" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/plating, @@ -35907,9 +36546,6 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/structure/sign/warning/gas_mask{ - pixel_x = -32 - }, /turf/open/floor/iron, /area/station/cargo/storage) "lqh" = ( @@ -35928,9 +36564,7 @@ /turf/open/floor/iron/dark, /area/station/service/chapel) "lqq" = ( -/obj/structure/sign/warning/cold_temp{ - pixel_x = -32 - }, +/obj/structure/sign/warning/cold_temp/directional/west, /turf/open/floor/iron, /area/station/cargo/miningdock) "lqA" = ( @@ -35972,7 +36606,7 @@ "lqR" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible, /turf/closed/wall/r_wall, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "lqU" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -36041,7 +36675,7 @@ dir = 8 }, /turf/open/floor/iron/dark/airless, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/freezerchamber) "lrN" = ( /obj/effect/landmark/start/hangover, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -36092,6 +36726,14 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) +"ltD" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/dark_blue/line{ + dir = 10 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/mix) "ltE" = ( /obj/structure/closet/crate/freezer, /obj/item/reagent_containers/blood/random, @@ -36135,15 +36777,14 @@ /obj/structure/disposalpipe/segment{ dir = 10 }, +/obj/machinery/duct, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) "luw" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 10 }, -/obj/structure/sign/warning/chem_diamond{ - pixel_x = -32 - }, +/obj/structure/sign/warning/chem_diamond/directional/west, /obj/machinery/light/directional/west, /obj/structure/bed/roller, /obj/machinery/iv_drip, @@ -36240,8 +36881,6 @@ /turf/open/floor/iron, /area/mine/eva) "lvX" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/light/small/directional/north, /turf/open/floor/iron, /area/station/hallway/primary/starboard) @@ -36277,10 +36916,10 @@ pixel_y = 17 }, /obj/machinery/requests_console/directional/south{ - department = "Law Office"; - name = "Law Office Requests Console"; anon_tips_receiver = 1; - assistance_requestable = 1 + assistance_requestable = 1; + department = "Law Office"; + name = "Law Office Requests Console" }, /obj/structure/disposalpipe/segment{ dir = 5 @@ -36320,15 +36959,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/commons/storage/tools) -"lxw" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, -/area/station/medical/morgue) "lxM" = ( /obj/machinery/portable_atmospherics/canister, /turf/open/floor/iron/dark, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "lxU" = ( /obj/machinery/atmospherics/pipe/smart/manifold/general/visible{ dir = 8 @@ -36438,11 +37072,11 @@ /obj/machinery/light/directional/north, /obj/machinery/requests_console/directional/north{ announcementConsole = 1; + anon_tips_receiver = 1; + assistance_requestable = 1; department = "Chief Medical Officer's Desk"; departmentType = 5; - name = "Chief Medical Officer's Requests Console"; - assistance_requestable = 1; - anon_tips_receiver = 1 + name = "Chief Medical Officer's Requests Console" }, /obj/item/toy/figure/cmo{ pixel_x = -17; @@ -36655,7 +37289,7 @@ dir = 1 }, /turf/open/floor/plating/icemoon, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "lDc" = ( /obj/effect/turf_decal/tile/brown, /obj/effect/turf_decal/tile/brown{ @@ -36681,7 +37315,7 @@ /turf/open/floor/iron/white/side{ dir = 8 }, -/area/station/science/misc_lab) +/area/station/science/explab) "lDo" = ( /obj/structure/sign/directions/medical{ dir = 4; @@ -36766,6 +37400,10 @@ }, /turf/open/floor/iron, /area/station/ai_monitored/command/storage/eva) +"lDX" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/engineering/atmos/mix) "lEj" = ( /turf/open/floor/iron/dark/textured, /area/station/security/processing) @@ -36815,21 +37453,22 @@ "lER" = ( /obj/structure/closet/crate, /obj/machinery/light/small/directional/south, -/obj/structure/sign/warning/cold_temp{ - pixel_y = -32 - }, +/obj/structure/sign/warning/cold_temp/directional/south, /obj/structure/sign/warning/xeno_mining{ pixel_x = 29 }, /turf/open/floor/iron/smooth, /area/mine/eva/lower) "lFc" = ( -/obj/effect/turf_decal/siding/white{ - dir = 6 +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/effect/turf_decal/tile/blue/diagonal_edge, +/obj/machinery/vending/wardrobe/chef_wardrobe{ + pixel_y = 0; + pixel_x = -2 }, -/obj/structure/chair/stool/bar/directional/east, -/turf/open/floor/iron/white/smooth_large, -/area/station/service/kitchen/diner) +/obj/item/radio/intercom/directional/west, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) "lFe" = ( /obj/structure/bookcase/random/adult, /turf/open/floor/iron/dark/textured, @@ -36850,6 +37489,12 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"lFK" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/airlock/maintenance_hatch, +/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, +/turf/open/floor/plating, +/area/station/maintenance/aft/lesser) "lFM" = ( /obj/structure/rack, /obj/item/clothing/shoes/magboots, @@ -36886,6 +37531,12 @@ /obj/item/seeds/potato, /turf/open/floor/iron/dark, /area/mine/laborcamp) +"lGa" = ( +/obj/structure/no_effect_signpost{ + desc = "Now, where to go from here? That's a timeless question." + }, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/explored) "lGj" = ( /obj/structure/table/glass, /obj/machinery/reagentgrinder{ @@ -36972,9 +37623,8 @@ /area/station/engineering/atmos/storage/gas) "lHG" = ( /obj/effect/spawner/random/trash/mess, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "lHL" = ( /obj/machinery/status_display/evac/directional/south, @@ -37069,16 +37719,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating/icemoon, /area/station/hallway/secondary/entry) -"lJA" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/secure_closet/atmospherics, -/obj/effect/turf_decal/bot, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/maintenance/disposal/incinerator) "lJO" = ( /turf/closed/wall, /area/station/maintenance/port/fore) @@ -37092,7 +37732,7 @@ "lJT" = ( /obj/machinery/firealarm/directional/east, /turf/open/floor/iron/dark/textured, -/area/station/security/prison) +/area/station/security/execution/transfer) "lKk" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ @@ -37119,9 +37759,7 @@ /obj/effect/turf_decal/trimline/green/filled/line{ dir = 10 }, -/obj/structure/sign/warning/electric_shock{ - pixel_y = -32 - }, +/obj/structure/sign/warning/electric_shock/directional/south, /turf/open/floor/iron/white, /area/station/medical/virology) "lKZ" = ( @@ -37145,9 +37783,7 @@ /obj/effect/turf_decal/stripes/corner{ dir = 1 }, -/obj/structure/sign/warning/gas_mask{ - pixel_y = 32 - }, +/obj/structure/sign/warning/gas_mask/directional/north, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -37281,9 +37917,6 @@ /turf/open/floor/catwalk_floor/iron_smooth, /area/station/maintenance/starboard/fore) "lNO" = ( -/obj/machinery/status_display/supply{ - pixel_x = -32 - }, /obj/machinery/conveyor{ dir = 1; id = "QMLoad" @@ -37291,13 +37924,13 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/structure/sign/warning/cold_temp/directional/west, /turf/open/floor/plating, /area/station/cargo/storage) "lOf" = ( /obj/structure/railing, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/department/medical/central) "lOg" = ( /obj/machinery/conveyor{ @@ -37323,10 +37956,15 @@ /turf/open/floor/plating/snowed/icemoon, /area/icemoon/surface/outdoors/nospawn) "lON" = ( -/obj/structure/closet/secure_closet/freezer/meat, -/obj/structure/sign/poster/random/directional/north, -/turf/open/floor/iron/freezer, -/area/station/service/kitchen/coldroom) +/obj/effect/turf_decal/siding/white{ + dir = 5 + }, +/obj/machinery/duct, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white/smooth_large, +/area/station/service/kitchen/diner) "lOU" = ( /obj/machinery/recharge_station, /obj/effect/decal/cleanable/dirt, @@ -37499,6 +38137,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"lSs" = ( +/obj/effect/turf_decal/trimline/dark_green/arrow_ccw{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/simple/violet/visible/layer1{ + dir = 9 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage) "lSu" = ( /turf/open/floor/plating/snowed/smoothed/icemoon, /area/icemoon/surface/outdoors/nospawn) @@ -37512,6 +38159,12 @@ /obj/machinery/atmospherics/components/trinary/mixer/airmix{ dir = 4 }, +/obj/machinery/atmospherics/pipe/smart/simple/pink/visible/layer5{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/violet/visible/layer1{ + dir = 4 + }, /turf/open/floor/iron, /area/station/engineering/atmos) "lTs" = ( @@ -37581,7 +38234,7 @@ "lUn" = ( /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/plating/icemoon, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "lUw" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -37597,15 +38250,16 @@ "lUC" = ( /turf/closed/wall, /area/station/maintenance/department/electrical) -"lUE" = ( -/obj/structure/chair, -/turf/open/floor/iron/white/smooth_large, -/area/station/service/kitchen/diner) "lUH" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/atmos/project) +/obj/effect/turf_decal/trimline/dark_red/arrow_ccw{ + dir = 1 + }, +/obj/item/radio/intercom/directional/north, +/obj/machinery/atmospherics/pipe/layer_manifold/pink/visible{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/storage) "lUL" = ( /obj/effect/turf_decal/tile/blue{ dir = 1 @@ -37628,6 +38282,14 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) +"lVi" = ( +/obj/machinery/newscaster/directional/east, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 5 + }, +/obj/machinery/holopad, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/hfr_room) "lVk" = ( /obj/effect/spawner/structure/window/hollow/reinforced/end{ dir = 1 @@ -37733,11 +38395,15 @@ /obj/item/storage/dice, /turf/open/floor/wood/parquet, /area/station/commons/lounge) -"lXr" = ( -/obj/effect/turf_decal/tile/red/full, -/obj/structure/chair, -/turf/open/floor/iron/large, -/area/station/service/kitchen/diner) +"lXq" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) "lXI" = ( /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ dir = 5 @@ -37745,7 +38411,7 @@ /obj/machinery/meter, /obj/machinery/firealarm/directional/west, /turf/open/floor/iron, -/area/station/science/mixing) +/area/station/science/ordnance) "lXJ" = ( /obj/structure/railing{ dir = 1 @@ -37782,6 +38448,10 @@ dir = 8 }, /area/station/security/checkpoint/auxiliary) +"lYB" = ( +/obj/machinery/gibber, +/turf/open/floor/plating/snowed/coldroom, +/area/station/service/kitchen/coldroom) "lYJ" = ( /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -37854,8 +38524,11 @@ /turf/open/floor/iron, /area/station/cargo/office) "lZW" = ( -/obj/machinery/light/directional/east, -/turf/open/openspace, +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/start/cook, +/turf/open/floor/iron/kitchen/diagonal, /area/station/service/kitchen) "lZX" = ( /obj/effect/turf_decal/stripes/line{ @@ -37887,6 +38560,13 @@ /obj/structure/rack, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) +"mbf" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/trimline/white/end{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/mix) "mbj" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/west, @@ -37928,7 +38608,7 @@ dir = 5 }, /turf/open/floor/iron, -/area/station/science/mixing) +/area/station/science/ordnance) "mbG" = ( /obj/machinery/door/airlock/maintenance{ name = "Chapel Maintenance" @@ -38051,6 +38731,18 @@ /obj/effect/landmark/start/prisoner, /turf/open/floor/iron, /area/station/security/prison/work) +"mds" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/trimline/red/filled/warning{ + dir = 1 + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "Atmospherics HFR Shutters" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/hfr_room) "mdC" = ( /obj/structure/table, /obj/structure/window/reinforced{ @@ -38139,7 +38831,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/mapping_helpers/airlock/access/all/supply/mail_sorting, +/obj/effect/mapping_helpers/airlock/access/all/supply/shipping, /turf/open/floor/iron, /area/station/cargo/sorting) "mfz" = ( @@ -38151,6 +38843,20 @@ "mfH" = ( /turf/closed/wall/r_wall, /area/station/security/brig/upper) +"mfS" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/button/door/directional/east{ + id = "Atmospherics HFR Shutters"; + name = "Atmospherics HFR Shutters"; + req_access = list("atmospherics") + }, +/obj/effect/turf_decal/trimline/red/filled/end{ + dir = 4 + }, +/obj/machinery/light/small/red/directional/north, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/hfr_room) "mfV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/cafeteria, @@ -38193,9 +38899,7 @@ /turf/open/floor/iron, /area/station/hallway/primary/central) "mgm" = ( -/obj/structure/sign/warning/electric_shock{ - pixel_y = 32 - }, +/obj/structure/sign/warning/electric_shock/directional/north, /obj/machinery/door/firedoor, /obj/effect/turf_decal/tile/blue{ dir = 1 @@ -38232,9 +38936,8 @@ /obj/item/reagent_containers/food/drinks/drinkingglass{ pixel_x = 10 }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/fore/lesser) "mgD" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, @@ -38263,6 +38966,13 @@ /obj/effect/turf_decal/tile/blue, /turf/open/floor/iron, /area/station/hallway/primary/central) +"mhh" = ( +/obj/structure/ladder, +/obj/machinery/light/directional/west, +/obj/effect/turf_decal/tile/neutral/diagonal_centre, +/obj/effect/turf_decal/tile/dark_blue/diagonal_edge, +/turf/open/floor/iron/dark/diagonal, +/area/station/engineering/atmos/mix) "mhq" = ( /obj/structure/closet, /obj/effect/spawner/random/maintenance, @@ -38357,6 +39067,12 @@ /obj/structure/sign/warning/gas_mask, /turf/open/floor/plating, /area/station/maintenance/solars/starboard/aft) +"mjz" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/engine, +/area/station/engineering/atmos/hfr_room) "mjG" = ( /obj/structure/extinguisher_cabinet/directional/north, /obj/effect/turf_decal/tile/neutral{ @@ -38448,9 +39164,8 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/machinery/atmospherics/components/binary/pump/off{ - dir = 1; - name = "N2 To Pure" +/obj/machinery/atmospherics/pipe/layer_manifold/general/visible{ + dir = 1 }, /turf/open/floor/iron, /area/station/engineering/atmos) @@ -38526,8 +39241,8 @@ /turf/open/floor/iron/white, /area/station/medical/medbay/aft) "mna" = ( -/obj/machinery/power/apc/auto_name/directional/south, /obj/structure/cable, +/obj/effect/spawner/random/vending/snackvend, /turf/open/floor/iron/dark, /area/station/science/breakroom) "mnj" = ( @@ -38555,9 +39270,7 @@ /obj/item/reagent_containers/glass/bottle/formaldehyde{ pixel_x = 1 }, -/obj/structure/sign/warning/no_smoking{ - pixel_y = 32 - }, +/obj/structure/sign/warning/no_smoking/directional/north, /turf/open/floor/iron/dark/textured_edge{ dir = 8 }, @@ -38680,11 +39393,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/checkpoint/science) -"mpx" = ( -/turf/open/floor/wood{ - icon_state = "wood-broken7" - }, -/area/station/maintenance/fore/lesser) "mpy" = ( /obj/machinery/door/firedoor, /turf/open/floor/iron, @@ -38868,32 +39576,36 @@ /obj/effect/turf_decal/box/red, /obj/machinery/firealarm/directional/east, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "msE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "msG" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ - dir = 1 +/obj/effect/turf_decal/siding/white, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 }, -/obj/structure/reagent_dispensers/cooking_oil, -/turf/open/floor/iron/freezer, -/area/station/service/kitchen/coldroom) +/turf/open/floor/iron/white/smooth_large, +/area/station/service/kitchen/diner) "msM" = ( /obj/structure/closet/secure_closet/personal{ anchored = 1 }, /obj/item/clothing/gloves/boxing/green, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "msN" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible, /turf/closed/wall/r_wall, /area/station/maintenance/disposal/incinerator) +"mta" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/machinery/newscaster/directional/east, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/project) "mts" = ( /obj/effect/turf_decal/loading_area{ dir = 4 @@ -38903,9 +39615,8 @@ /area/mine/laborcamp) "mtv" = ( /obj/structure/chair/stool/directional/east, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "mtI" = ( /turf/closed/wall, @@ -38924,15 +39635,11 @@ /turf/open/floor/iron/cafeteria, /area/station/hallway/secondary/exit/departure_lounge) "mtQ" = ( -/obj/machinery/air_sensor{ - chamber_id = "ordnancegas1" - }, +/obj/machinery/air_sensor/ordnance_burn_chamber, /turf/open/floor/engine/vacuum, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "muh" = ( -/obj/structure/sign/warning{ - pixel_y = 32 - }, +/obj/structure/sign/warning/directional/north, /obj/machinery/light/small/directional/south, /turf/open/floor/plating, /area/station/service/chapel) @@ -38965,12 +39672,9 @@ name = "Chapel External Airlock"; opacity = 0 }, -/obj/structure/sign/warning/cold_temp{ - pixel_y = 32 - }, -/obj/structure/sign/warning/gas_mask{ - desc = "A sign that warns of dangerous gasses in the air, instructing you to wear internals."; - pixel_y = -32 +/obj/structure/sign/warning/cold_temp/directional/north, +/obj/structure/sign/warning/gas_mask/directional/south{ + desc = "A sign that warns of dangerous gasses in the air, instructing you to wear internals." }, /turf/open/floor/iron, /area/station/service/chapel) @@ -39001,9 +39705,8 @@ /turf/closed/wall/r_wall, /area/station/security/interrogation) "mvm" = ( -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/aft) "mvv" = ( /turf/open/floor/wood, @@ -39059,11 +39762,18 @@ dir = 1 }, /area/station/security/office) +"mwl" = ( +/obj/effect/turf_decal/trimline/dark_green/corner, +/obj/machinery/atmospherics/pipe/smart/simple/violet/visible{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/storage) "mwF" = ( /obj/item/chair/wood, -/turf/open/floor/wood{ - icon_state = "wood-broken7" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/maintenance/space_hut/cabin) "mwQ" = ( /obj/structure/tank_holder/extinguisher, @@ -39102,7 +39812,8 @@ "mxB" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ - id = "viroview" + id = "viroview"; + dir = 4 }, /turf/open/floor/plating, /area/station/medical/virology) @@ -39257,12 +39968,11 @@ /turf/open/floor/iron, /area/station/maintenance/starboard/fore) "mzO" = ( -/obj/structure/sign/warning/electric_shock{ - pixel_y = -32 - }, +/obj/structure/sign/warning/electric_shock/directional/south, /obj/machinery/door/poddoor/shutters/preopen{ id = "hop"; - name = "Privacy Shutters" + name = "Privacy Shutters"; + dir = 8 }, /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -39306,8 +40016,9 @@ /turf/open/floor/carpet, /area/station/security/prison/rec) "mBm" = ( -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/iron/cafeteria, +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/kitchen/diagonal, /area/station/service/kitchen) "mBq" = ( /obj/machinery/modular_computer/console/preset/id{ @@ -39351,11 +40062,6 @@ }, /turf/open/floor/wood, /area/station/command/heads_quarters/captain) -"mCg" = ( -/turf/open/floor/wood{ - icon_state = "wood-broken5" - }, -/area/station/maintenance/port/aft) "mCo" = ( /obj/machinery/shower{ dir = 4 @@ -39410,9 +40116,7 @@ /area/station/security/prison/safe) "mDA" = ( /obj/effect/turf_decal/delivery, -/obj/structure/sign/warning/no_smoking{ - pixel_y = 32 - }, +/obj/structure/sign/warning/no_smoking/directional/north, /obj/machinery/light/directional/north, /obj/machinery/camera/directional/north{ c_tag = "Engineering SMES" @@ -39451,9 +40155,7 @@ /turf/open/floor/plating, /area/station/maintenance/aft/greater) "mEM" = ( -/obj/structure/sign/warning/secure_area{ - pixel_y = 32 - }, +/obj/structure/sign/warning/secure_area/directional/north, /obj/effect/turf_decal/tile/blue{ dir = 1 }, @@ -39493,7 +40195,7 @@ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "mFE" = ( /turf/closed/wall, /area/station/medical/surgery/aft) @@ -39529,6 +40231,17 @@ /obj/effect/spawner/random/structure/crate, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/surface/outdoors/nospawn) +"mGi" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/trimline/dark_green/line, +/obj/effect/turf_decal/trimline/dark_green/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/layer_manifold/violet/visible{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/mix) "mGl" = ( /obj/machinery/door/airlock/maintenance, /obj/structure/cable, @@ -39640,6 +40353,10 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, /area/station/medical/medbay/aft) +"mJo" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating/snowed/coldroom, +/area/station/service/kitchen/coldroom) "mJq" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -39660,6 +40377,19 @@ /obj/structure/chair/office, /turf/open/floor/iron, /area/station/cargo/drone_bay) +"mJz" = ( +/obj/structure/table/reinforced, +/obj/item/hfr_box/body/waste_output{ + pixel_x = 5; + pixel_y = -1 + }, +/obj/item/hfr_box/body/moderator_input{ + pixel_x = -5; + pixel_y = 8 + }, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/hfr_room) "mJD" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -39818,14 +40548,15 @@ /turf/open/floor/iron/smooth, /area/mine/eva) "mNf" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 10 +/obj/effect/turf_decal/tile/red/full, +/obj/effect/turf_decal/siding/white{ + dir = 4 }, -/obj/structure/closet/secure_closet/freezer/meat, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, -/turf/open/floor/iron/freezer, -/area/station/service/kitchen/coldroom) +/obj/machinery/duct, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/iron/large, +/area/station/service/kitchen/diner) "mNj" = ( /obj/machinery/computer/security{ dir = 4 @@ -39840,8 +40571,11 @@ /obj/effect/turf_decal/siding/wood{ dir = 8 }, -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/chair/stool/bar/directional/east, +/obj/structure/chair/sofa/left{ + dir = 1; + name = "The Regular's Sofa"; + desc = "Hey, did you know you can get a pineapple on your burger here?" + }, /turf/open/floor/stone, /area/station/commons/lounge) "mNE" = ( @@ -39850,9 +40584,27 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"mNK" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/structure/sign/warning/fire/directional/west, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/project) "mNY" = ( /turf/closed/wall/r_wall, /area/station/maintenance/port/aft) +"mOj" = ( +/obj/machinery/door/airlock/external{ + glass = 1; + name = "Maintenance External Airlock"; + opacity = 0 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance/departmental, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/morgue) "mOr" = ( /obj/effect/turf_decal/tile/brown{ dir = 8 @@ -39921,9 +40673,8 @@ /obj/effect/turf_decal/siding/wood{ dir = 5 }, -/turf/open/floor/wood{ - icon_state = "wood-broken2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/security/prison/rec) "mPF" = ( /obj/effect/turf_decal/tile/neutral{ @@ -39941,6 +40692,26 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"mQn" = ( +/obj/machinery/light/directional/south, +/obj/machinery/atmospherics/pipe/multiz/violet/visible{ + dir = 8; + name = "Infiltrate" + }, +/obj/effect/turf_decal/tile/neutral/diagonal_centre, +/obj/effect/turf_decal/tile/dark_green/diagonal_edge, +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/iron/dark/diagonal, +/area/station/engineering/atmos/storage) +"mQp" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/cable, +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/trimline/dark_blue/line, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/mix) "mQq" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -39982,6 +40753,12 @@ /obj/effect/decal/cleanable/glass, /turf/open/floor/iron/dark, /area/station/maintenance/department/medical/central) +"mQM" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 9 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/project) "mQV" = ( /obj/structure/chair/pew/right, /obj/machinery/light/warm/directional/east, @@ -40044,6 +40821,19 @@ /obj/effect/turf_decal/siding/yellow/corner, /turf/open/floor/iron/large, /area/station/engineering/storage) +"mSl" = ( +/obj/machinery/door/poddoor/shutters/window/preopen{ + id = "Atmospherics Project Shutters"; + name = "Atmospherics Project Shutters"; + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 1 + }, +/obj/machinery/door/firedoor/heavy, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/project) "mSv" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -40102,12 +40892,9 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 }, -/obj/structure/sign/warning/cold_temp{ - pixel_x = 32 - }, -/obj/structure/sign/warning/gas_mask{ - desc = "A sign that warns of dangerous gasses in the air, instructing you to wear internals."; - pixel_x = -32 +/obj/structure/sign/warning/cold_temp/directional/east, +/obj/structure/sign/warning/gas_mask/directional/west{ + desc = "A sign that warns of dangerous gasses in the air, instructing you to wear internals." }, /obj/machinery/door/airlock/external{ glass = 1; @@ -40140,7 +40927,8 @@ "mUr" = ( /obj/machinery/door/poddoor/shutters/preopen{ id = "chemistry_lower_shutters"; - name = "Chemistry Exterior Shutters" + name = "Chemistry Exterior Shutters"; + dir = 8 }, /obj/structure/cable, /obj/effect/spawner/structure/window/hollow/reinforced/middle{ @@ -40172,14 +40960,18 @@ /turf/open/floor/wood, /area/station/service/lawoffice) "mUG" = ( -/obj/item/radio/intercom/directional/east, -/turf/open/floor/iron, -/area/station/engineering/atmos/project) +/obj/structure/stairs/north{ + dir = 4 + }, +/turf/open/floor/iron/stairs/old{ + dir = 4 + }, +/area/station/engineering/atmos/storage) "mUM" = ( /obj/effect/turf_decal/tile/red/anticorner{ dir = 8 }, -/obj/item/radio/intercom/prison/directional/north, +/obj/item/radio/intercom/directional/north, /turf/open/floor/iron/dark/textured_corner{ dir = 4 }, @@ -40227,13 +41019,15 @@ /turf/open/floor/iron, /area/station/cargo/office) "mWg" = ( -/obj/effect/turf_decal/tile/red/full, -/obj/effect/turf_decal/siding/white{ - dir = 4 +/obj/structure/table/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "kitchencounter"; + name = "Kitchen Counter Shutters"; + dir = 1 }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/large, -/area/station/service/kitchen/diner) +/obj/machinery/door/firedoor, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) "mWo" = ( /obj/structure/chair{ dir = 8 @@ -40267,6 +41061,30 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"mWJ" = ( +/obj/machinery/door/airlock/atmos, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/firedoor/heavy, +/obj/effect/turf_decal/trimline/yellow/corner, +/obj/effect/turf_decal/trimline/yellow/corner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/corner{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/iron/dark/smooth_half{ + dir = 1 + }, +/area/station/engineering/atmos/hfr_room) "mWM" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -40324,6 +41142,15 @@ /obj/structure/sign/poster/official/random/directional/east, /turf/open/floor/iron/smooth, /area/mine/mechbay) +"mXH" = ( +/obj/effect/turf_decal/tile/neutral/diagonal_centre, +/obj/machinery/atmospherics/pipe/multiz/pink/visible{ + dir = 4; + name = "Exfiltrate" + }, +/obj/effect/turf_decal/tile/red/diagonal_edge, +/turf/open/floor/iron/dark/diagonal, +/area/station/engineering/atmos/mix) "mXK" = ( /obj/structure/table, /obj/structure/reagent_dispensers/servingdish, @@ -40341,15 +41168,13 @@ /turf/open/floor/wood, /area/station/hallway/secondary/service) "mYs" = ( -/obj/structure/sign/warning/secure_area{ - pixel_x = 32 - }, +/obj/structure/sign/warning/secure_area/directional/east, /turf/open/floor/engine, -/area/station/science/misc_lab) +/area/station/science/explab) "mYx" = ( /obj/machinery/research/anomaly_refinery, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance/office) "mYG" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -40370,7 +41195,10 @@ /turf/open/floor/iron/textured, /area/station/engineering/atmos) "mZa" = ( -/turf/open/openspace, +/obj/machinery/food_cart, +/obj/effect/turf_decal/tile/brown/diagonal_edge, +/obj/structure/window/reinforced/spawner/east, +/turf/open/floor/iron/kitchen/diagonal, /area/station/service/kitchen) "mZf" = ( /obj/effect/turf_decal/weather/snow/corner{ @@ -40380,9 +41208,8 @@ /area/icemoon/surface/outdoors/nospawn) "mZg" = ( /obj/effect/landmark/xeno_spawn, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/aft) "mZk" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -40438,8 +41265,17 @@ /obj/effect/mapping_helpers/airlock/abandoned, /obj/structure/cable, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 1 + }, /turf/open/floor/plating, /area/station/maintenance/department/crew_quarters/bar) +"mZO" = ( +/obj/effect/turf_decal/trimline/yellow/filled/shrink_ccw, +/obj/machinery/camera/autoname/directional/south, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/hfr_room) "mZS" = ( /obj/effect/turf_decal/tile/blue, /obj/machinery/door/firedoor, @@ -40497,7 +41333,7 @@ /turf/open/floor/iron/cafeteria{ dir = 8 }, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "naW" = ( /obj/machinery/airalarm/directional/north, /turf/open/floor/iron/white/side{ @@ -40680,6 +41516,11 @@ dir = 8 }, /area/mine/eva) +"ndy" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/landmark/start/hangover, +/turf/open/floor/iron/white/smooth_large, +/area/station/service/kitchen/diner) "ndz" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, @@ -40748,21 +41589,13 @@ /obj/structure/cable, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"net" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos/project) "neu" = ( /obj/structure/cable/multilayer/multiz, /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/medical/chemistry) "neC" = ( /obj/structure/chair{ @@ -40819,9 +41652,9 @@ /turf/open/floor/plating, /area/mine/eva/lower) "nfx" = ( -/obj/effect/turf_decal/siding/white, -/obj/machinery/firealarm/directional/south, -/turf/open/floor/iron/white/smooth_large, +/obj/effect/turf_decal/tile/red/full, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/large, /area/station/service/kitchen/diner) "nfB" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -40884,10 +41717,8 @@ /turf/closed/wall, /area/station/service/chapel) "nha" = ( -/obj/machinery/icecream_vat, -/obj/structure/sign/poster/random/directional/east, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) +/turf/open/floor/plating/snowed/coldroom, +/area/station/service/kitchen/coldroom) "nhb" = ( /obj/machinery/power/solar_control{ id = "auxsolareast"; @@ -40928,16 +41759,6 @@ /mob/living/carbon/human/species/monkey, /turf/open/floor/engine, /area/station/science/genetics) -"nhS" = ( -/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ - dir = 5 - }, -/obj/machinery/igniter/incinerator_atmos, -/obj/structure/sign/warning/gas_mask{ - pixel_y = -32 - }, -/turf/open/floor/engine, -/area/station/maintenance/disposal/incinerator) "nhT" = ( /obj/machinery/door/airlock/external{ glass = 1; @@ -40962,7 +41783,6 @@ /obj/machinery/door/firedoor/border_only{ dir = 1 }, -/obj/machinery/light/small/directional/east, /turf/open/floor/wood/parquet, /area/station/service/bar/atrium) "nid" = ( @@ -41186,8 +42006,8 @@ /area/station/hallway/primary/central) "nlZ" = ( /obj/item/toy/snowball{ - pixel_y = -5; - pixel_x = 6 + pixel_x = 6; + pixel_y = -5 }, /obj/machinery/light/small/directional/south, /turf/open/misc/asteroid/snow/standard_air, @@ -41200,9 +42020,7 @@ /obj/machinery/duct, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply, -/obj/structure/sign/warning/electric_shock{ - pixel_y = 32 - }, +/obj/structure/sign/warning/electric_shock/directional/north, /turf/open/floor/iron/white, /area/station/medical/virology) "nmg" = ( @@ -41250,6 +42068,17 @@ /obj/effect/spawner/random/contraband/cannabis, /turf/open/floor/grass, /area/station/security/prison/garden) +"nms" = ( +/obj/machinery/door/airlock/hatch{ + name = "MiniSat Foyer" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/layer3, +/obj/effect/mapping_helpers/airlock/access/any/command/minisat, +/obj/effect/mapping_helpers/airlock/access/any/command/ai_upload, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat_interior) "nmD" = ( /obj/structure/railing{ dir = 8 @@ -41355,7 +42184,7 @@ dir = 8 }, /turf/open/floor/iron/white, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "noW" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -41389,9 +42218,8 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ cycle_id = "service-hall-external" }, -/obj/structure/sign/warning/gas_mask{ - desc = "A sign that warns of dangerous gasses in the air, instructing you to wear internals."; - pixel_y = -32 +/obj/structure/sign/warning/gas_mask/directional/south{ + desc = "A sign that warns of dangerous gasses in the air, instructing you to wear internals." }, /obj/effect/turf_decal/stripes/line, /obj/effect/mapping_helpers/airlock/access/all/service/general, @@ -41401,10 +42229,6 @@ /obj/structure/cable, /turf/open/floor/iron/showroomfloor, /area/station/security/warden) -"npy" = ( -/obj/machinery/smartfridge, -/turf/closed/wall, -/area/station/service/kitchen/coldroom) "npB" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 4 @@ -41436,7 +42260,8 @@ "npG" = ( /obj/machinery/door/poddoor/shutters/preopen{ id = "robotics"; - name = "Robotics Lab Shutters" + name = "Robotics Lab Shutters"; + dir = 1 }, /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -41467,6 +42292,17 @@ }, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/surface/outdoors/nospawn) +"nqf" = ( +/obj/machinery/status_display/ai/directional/north, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_blue/line{ + dir = 9 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/mix) "nqn" = ( /obj/structure/ladder, /obj/effect/turf_decal/stripes/box, @@ -41613,9 +42449,7 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/delivery, /obj/structure/cable, -/obj/structure/sign/warning/electric_shock{ - pixel_y = 32 - }, +/obj/structure/sign/warning/electric_shock/directional/north, /turf/open/floor/iron/dark/textured, /area/station/engineering/engine_smes) "nsU" = ( @@ -41628,19 +42462,9 @@ /turf/closed/wall/r_wall, /area/station/service/lawoffice) "ntn" = ( -/obj/effect/spawner/random/maintenance/three, -/obj/structure/closet/crate, +/obj/structure/reagent_dispensers/plumbed, /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) -"ntp" = ( -/obj/structure/sink{ - dir = 4; - pixel_x = -12; - pixel_y = 2 - }, -/obj/item/reagent_containers/glass/bucket, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "ntq" = ( /obj/machinery/door/window/brigdoor{ dir = 1; @@ -41662,12 +42486,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/wood, /area/station/security/courtroom) -"ntZ" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/wood/parquet, -/area/station/service/bar/atrium) "nul" = ( /obj/machinery/door/airlock/external{ glass = 1; @@ -41717,6 +42535,11 @@ /obj/structure/closet/crate, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) +"nvk" = ( +/obj/structure/transit_tube, +/obj/structure/cable, +/turf/open/floor/plating/snowed/icemoon, +/area/icemoon/surface/outdoors/nospawn) "nvs" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -41730,11 +42553,9 @@ /turf/open/floor/wood/parquet, /area/station/commons/lounge) "nvP" = ( -/obj/structure/sign/warning/no_smoking{ - pixel_y = -32 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos/project) +/obj/structure/sign/warning/no_smoking/directional/south, +/turf/open/openspace, +/area/station/engineering/atmos/storage) "nvQ" = ( /turf/open/openspace, /area/station/ai_monitored/security/armory/upper) @@ -41791,9 +42612,8 @@ /area/station/security/prison/mess) "nwS" = ( /obj/item/trash/sosjerky, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/aft) "nwT" = ( /turf/closed/wall, @@ -41866,10 +42686,19 @@ /area/station/hallway/primary/aft) "nyp" = ( /obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/simple/pink/visible/layer5{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_red/arrow_ccw{ + dir = 1 + }, /turf/open/floor/iron, -/area/station/engineering/atmos/project) +/area/station/engineering/atmos/storage) "nyA" = ( /obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ dir = 4 @@ -41925,7 +42754,7 @@ dir = 8 }, /turf/open/floor/plating/icemoon, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "nzq" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -41946,7 +42775,8 @@ /obj/machinery/door/firedoor, /obj/machinery/door/poddoor/shutters{ id = "Skynet_launch"; - name = "Mech Bay" + name = "Mech Bay"; + dir = 1 }, /obj/effect/turf_decal/delivery, /turf/open/floor/iron, @@ -42030,7 +42860,7 @@ dir = 1 }, /turf/open/floor/iron, -/area/station/science/mixing) +/area/station/science/ordnance) "nAI" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -42067,9 +42897,8 @@ /area/mine/eva/lower) "nAQ" = ( /obj/effect/landmark/blobstart, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "nBb" = ( /obj/effect/turf_decal/tile/red{ @@ -42284,6 +43113,9 @@ /obj/structure/railing/corner{ dir = 4 }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, /turf/open/floor/wood/parquet, /area/station/service/bar/atrium) "nDz" = ( @@ -42329,6 +43161,11 @@ /obj/effect/turf_decal/tile/red, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"nFi" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/mix) "nFk" = ( /obj/machinery/mineral/equipment_vendor, /obj/effect/turf_decal/tile/brown{ @@ -42375,10 +43212,13 @@ /turf/open/floor/iron, /area/station/security/prison/work) "nFV" = ( -/obj/machinery/atmospherics/pipe/bridge_pipe/yellow/visible, /obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ dir = 4 }, +/obj/machinery/atmospherics/components/binary/pump/off{ + dir = 1; + name = "N2 To Pure" + }, /turf/open/floor/iron, /area/station/engineering/atmos) "nGk" = ( @@ -42489,9 +43329,7 @@ /turf/open/floor/iron/cafeteria, /area/station/security/prison/mess) "nIK" = ( -/obj/structure/sign/warning/electric_shock{ - pixel_x = 32 - }, +/obj/structure/sign/warning/electric_shock/directional/east, /obj/machinery/light/directional/east, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -42565,6 +43403,19 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/atmos/pumproom) +"nJM" = ( +/obj/machinery/atmospherics/pipe/smart/simple/violet/visible{ + dir = 9 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/trimline/dark_green/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/dark_green/line{ + dir = 6 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/mix) "nJT" = ( /obj/effect/landmark/event_spawn, /obj/structure/cable, @@ -42610,7 +43461,15 @@ "nKs" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, /turf/closed/wall/r_wall, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) +"nKD" = ( +/obj/machinery/light/directional/east, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/computer/atmos_control/nocontrol/incinerator{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/maintenance/disposal/incinerator) "nKK" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 10 @@ -42631,6 +43490,23 @@ /obj/item/flashlight/lamp, /turf/open/floor/iron/dark, /area/station/security/interrogation) +"nKW" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/crew_quarters/bar) +"nKY" = ( +/obj/structure/table/reinforced, +/obj/item/book/manual/wiki/atmospherics, +/obj/item/holosign_creator/atmos, +/obj/item/holosign_creator/atmos, +/obj/structure/sign/warning/radiation/directional/west, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/hfr_room) "nLb" = ( /obj/machinery/blackbox_recorder, /turf/open/floor/iron/dark/telecomms, @@ -42644,6 +43520,11 @@ /obj/effect/turf_decal/tile/blue/full, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/cmo) +"nLk" = ( +/obj/structure/cable, +/obj/structure/transit_tube/crossing/horizontal, +/turf/open/floor/plating/snowed/icemoon, +/area/icemoon/surface/outdoors/nospawn) "nLn" = ( /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ @@ -42661,6 +43542,13 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) +"nLv" = ( +/obj/structure/cable, +/obj/structure/transit_tube/curved{ + dir = 8 + }, +/turf/open/floor/plating/snowed/icemoon, +/area/icemoon/surface/outdoors/nospawn) "nLH" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, @@ -42710,7 +43598,7 @@ "nMs" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, /turf/open/floor/engine, -/area/station/science/misc_lab) +/area/station/science/explab) "nMu" = ( /obj/effect/turf_decal/trimline/blue/filled/warning{ dir = 1 @@ -42788,7 +43676,7 @@ /area/station/security/prison/rec) "nNo" = ( /turf/open/floor/iron/white, -/area/station/science/mixing/hallway) +/area/station/science/ordnance) "nNq" = ( /obj/structure/table/glass, /obj/effect/turf_decal/tile/blue{ @@ -42830,6 +43718,7 @@ pixel_y = 4 }, /obj/item/folder/yellow, +/obj/machinery/keycard_auth/directional/west, /turf/open/floor/iron, /area/station/cargo/qm) "nNv" = ( @@ -42986,6 +43875,13 @@ }, /turf/open/floor/iron/smooth, /area/station/security/brig/upper) +"nOX" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/bot, +/obj/structure/closet/radiation, +/obj/item/analyzer, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/hfr_room) "nPf" = ( /obj/machinery/computer/station_alert, /obj/effect/turf_decal/tile/yellow, @@ -43040,6 +43936,25 @@ /obj/machinery/status_display/evac/directional/east, /turf/open/floor/iron, /area/station/engineering/main) +"nQD" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ + dir = 5 + }, +/obj/effect/turf_decal/trimline/dark_red/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/simple/pink/visible/layer5{ + dir = 9 + }, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) "nQH" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -43305,7 +44220,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "nTv" = ( /obj/structure/closet/crate, /obj/effect/spawner/random/food_or_drink/cups, @@ -43344,7 +44259,7 @@ }, /obj/effect/turf_decal/delivery, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance/office) "nUg" = ( /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 1 @@ -43378,10 +44293,9 @@ /turf/open/floor/iron/grimy, /area/station/commons/lounge) "nUp" = ( -/obj/structure/sign/warning/secure_area{ +/obj/structure/sign/warning/secure_area/directional/south{ desc = "A warning sign which reads 'SERVER ROOM'."; - name = "SERVER ROOM"; - pixel_y = -32 + name = "SERVER ROOM" }, /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -43407,6 +44321,14 @@ dir = 9 }, /area/mine/eva) +"nUC" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/machinery/status_display/evac/directional/south, +/obj/effect/turf_decal/siding/yellow/corner{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/hfr_room) "nUJ" = ( /obj/machinery/flasher/directional/east{ id = "brigentry" @@ -43451,9 +44373,8 @@ /area/station/maintenance/port/aft) "nVS" = ( /obj/structure/closet/firecloset, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "nVZ" = ( /obj/machinery/door/airlock/command{ @@ -43508,16 +44429,10 @@ /turf/open/floor/plating, /area/station/maintenance/fore/lesser) "nWD" = ( -/obj/structure/railing{ - dir = 4 - }, -/obj/structure/table, -/obj/machinery/microwave, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/firealarm/directional/south, -/turf/open/floor/iron/cafeteria, +/obj/machinery/icecream_vat, +/obj/effect/turf_decal/tile/brown/diagonal_edge, +/obj/structure/window/reinforced/spawner/west, +/turf/open/floor/iron/kitchen/diagonal, /area/station/service/kitchen) "nWH" = ( /turf/closed/wall, @@ -43541,9 +44456,8 @@ dir = 8 }, /obj/effect/landmark/xeno_spawn, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/department/chapel) "nXb" = ( /turf/closed/wall, @@ -43561,8 +44475,9 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/sign/warning/fire{ - pixel_x = -32 +/obj/structure/sign/warning/fire/directional/west, +/obj/structure/disposalpipe/segment{ + dir = 6 }, /turf/open/floor/plating, /area/station/maintenance/aft/greater) @@ -43612,9 +44527,7 @@ /obj/effect/turf_decal/tile/yellow{ dir = 4 }, -/obj/structure/sign/warning/secure_area{ - pixel_x = 32 - }, +/obj/structure/sign/warning/secure_area/directional/east, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden, /obj/structure/disposalpipe/segment{ @@ -43643,6 +44556,12 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/dark, /area/station/security/prison/visit) +"nYc" = ( +/obj/machinery/atmospherics/pipe/smart/simple/general/visible{ + dir = 9 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "nYd" = ( /obj/effect/turf_decal/tile/yellow{ dir = 1 @@ -43671,9 +44590,8 @@ /area/station/command/bridge) "nYG" = ( /obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "nYQ" = ( /obj/machinery/rnd/production/techfab/department/service, @@ -43741,12 +44659,14 @@ /turf/open/floor/plating, /area/station/engineering/storage/tech) "nZN" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plating/snowed/coldroom, +/area/station/service/kitchen/coldroom) "nZY" = ( /obj/machinery/door/airlock{ id_tag = "AuxToilet2"; @@ -43852,9 +44772,7 @@ /obj/machinery/door/airlock/maintenance{ name = "Engineering Maintenance" }, -/obj/structure/sign/warning/radiation/rad_area{ - pixel_x = -32 - }, +/obj/structure/sign/warning/radiation/rad_area/directional/west, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -43925,9 +44843,8 @@ /turf/open/floor/plating, /area/mine/storage) "odt" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/upper) "ody" = ( /obj/structure/cable, @@ -43939,14 +44856,27 @@ /obj/machinery/computer/arcade/orion_trail, /turf/open/floor/iron, /area/station/security/prison/work) +"odI" = ( +/obj/machinery/atmospherics/components/unary/passive_vent{ + dir = 1 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/underground/explored) +"odM" = ( +/obj/machinery/camera/autoname/directional/north, +/obj/machinery/light/directional/north, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 9 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/hfr_room) "odN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/central/greater) "odR" = ( -/obj/structure/sign/departments/psychology{ - pixel_y = -32 - }, +/obj/structure/sign/departments/psychology/directional/south, /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 10 }, @@ -44006,9 +44936,7 @@ /turf/open/floor/iron/dark, /area/mine/mechbay) "oew" = ( -/obj/structure/sign/warning/electric_shock{ - pixel_y = -32 - }, +/obj/structure/sign/warning/electric_shock/directional/south, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -44112,6 +45040,10 @@ /obj/effect/turf_decal/tile/brown{ dir = 4 }, +/obj/machinery/modular_computer/console/preset/id, +/obj/machinery/computer/security/telescreen/vault{ + pixel_y = 30 + }, /turf/open/floor/iron, /area/station/cargo/qm) "ogL" = ( @@ -44180,7 +45112,7 @@ network = list("ss13","rd") }, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "ohI" = ( /obj/structure/grille, /obj/structure/window{ @@ -44189,6 +45121,13 @@ /obj/structure/window, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"ohJ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) "ohS" = ( /obj/structure/railing{ dir = 8 @@ -44248,9 +45187,7 @@ /turf/open/floor/plating, /area/station/science/xenobiology) "oiv" = ( -/obj/structure/sign/warning{ - pixel_y = 32 - }, +/obj/structure/sign/warning/directional/north, /obj/machinery/light/small/directional/north, /obj/effect/turf_decal/caution/stand_clear, /obj/effect/turf_decal/stripes/line{ @@ -44317,9 +45254,7 @@ "oju" = ( /obj/structure/rack, /obj/effect/spawner/random/contraband/permabrig_gear, -/obj/structure/sign/warning/cold_temp{ - pixel_x = -32 - }, +/obj/structure/sign/warning/cold_temp/directional/west, /turf/open/floor/vault, /area/station/security/prison/rec) "ojv" = ( @@ -44365,11 +45300,15 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/junction{ - dir = 4 +/obj/structure/railing{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/simple/pink/visible/layer5, +/obj/effect/turf_decal/trimline/dark_red/arrow_ccw{ + dir = 8 }, /turf/open/floor/iron, -/area/station/engineering/atmos/project) +/area/station/engineering/atmos/storage) "okx" = ( /obj/structure/table/reinforced, /obj/machinery/door/window/brigdoor{ @@ -44402,16 +45341,13 @@ /area/icemoon/underground/explored) "okZ" = ( /obj/structure/barricade/wooden, -/turf/open/floor/wood{ - icon_state = "wood-broken3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/maintenance/aft/lesser) "old" = ( -/obj/machinery/camera/directional/north{ - c_tag = "tech_storage" - }, /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, +/obj/machinery/camera/autoname/directional/north, /turf/open/floor/plating, /area/station/engineering/storage/tech) "olf" = ( @@ -44448,9 +45384,8 @@ "olQ" = ( /obj/structure/closet, /obj/effect/spawner/random/maintenance/two, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/aft) "olV" = ( /obj/machinery/light/small/directional/west, @@ -44537,6 +45472,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, /obj/effect/mapping_helpers/airlock/access/all/service/general, +/obj/effect/mapping_helpers/airlock/unres, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) "onq" = ( @@ -44644,6 +45580,8 @@ /obj/effect/turf_decal/tile/brown{ dir = 1 }, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, /turf/open/floor/iron, /area/station/cargo/qm) "opc" = ( @@ -44658,13 +45596,13 @@ dir = 4 }, /turf/open/floor/engine, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "opj" = ( /obj/machinery/portable_atmospherics/pump{ name = "Lil Pump" }, /turf/open/floor/iron/dark, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "opn" = ( /obj/effect/spawner/random/structure/crate, /obj/effect/decal/cleanable/dirt, @@ -44734,12 +45672,12 @@ /turf/open/floor/wood, /area/station/commons/dorms) "oqs" = ( -/obj/item/radio/intercom/prison/directional/south, +/obj/item/radio/intercom/directional/south, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /turf/open/floor/iron/smooth, -/area/station/security/prison) +/area/station/security/execution/transfer) "oqx" = ( /obj/structure/closet/lasertag/blue, /obj/effect/turf_decal/tile/neutral{ @@ -44778,6 +45716,11 @@ }, /turf/open/openspace, /area/station/science/xenobiology) +"orb" = ( +/obj/structure/table, +/obj/item/stack/cable_coil, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage) "orf" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -44911,6 +45854,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/cargo/storage) +"otk" = ( +/obj/item/radio/intercom/directional/south, +/obj/machinery/light/small/directional/south, +/turf/open/floor/plating, +/area/station/ai_monitored/turret_protected/aisat_interior) "ots" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/hollow/reinforced/middle, @@ -44983,6 +45931,13 @@ }, /turf/open/floor/iron/white, /area/station/science/genetics) +"ovq" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Canteen" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/textured_half, +/area/station/hallway/primary/starboard) "ovy" = ( /obj/structure/closet, /obj/effect/spawner/random/maintenance, @@ -45037,11 +45992,10 @@ /turf/open/floor/iron, /area/station/service/janitor) "owB" = ( -/obj/effect/turf_decal/tile/blue{ +/obj/structure/cable, +/obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 4 }, -/obj/effect/turf_decal/tile/blue, -/obj/structure/cable, /turf/open/floor/iron/dark/side{ dir = 4 }, @@ -45065,7 +46019,7 @@ /obj/effect/mapping_helpers/airlock/unres, /obj/effect/mapping_helpers/airlock/access/any/science/maintenance, /turf/open/floor/plating, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "owS" = ( /obj/structure/table/glass, /obj/item/storage/box/beakers{ @@ -45095,13 +46049,11 @@ /turf/open/floor/iron, /area/station/command/bridge) "oxg" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/siding/white{ +/obj/effect/turf_decal/siding/white/corner{ dir = 4 }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/effect/turf_decal/siding/white/corner, /turf/open/floor/iron, /area/station/service/bar) "oxk" = ( @@ -45226,6 +46178,9 @@ /obj/structure/sign/poster/contraband/random/directional/north, /turf/open/floor/plating, /area/station/security/prison/safe) +"oyN" = ( +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/project) "oyU" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 8 @@ -45347,6 +46302,15 @@ /obj/effect/spawner/random/structure/table_fancy, /turf/open/floor/wood, /area/station/service/library) +"oAF" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/duct, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/hfr_room) "oAH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/stripes/line{ @@ -45369,6 +46333,16 @@ /obj/machinery/portable_atmospherics/canister/bz, /turf/open/floor/plating, /area/station/security/prison/safe) +"oAV" = ( +/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 1; + name = "O2 to Airmix" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "oBi" = ( /obj/machinery/light/small/directional/south, /turf/open/floor/plating, @@ -45377,9 +46351,8 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 }, -/obj/structure/sign/warning/gas_mask{ - desc = "A sign that warns of dangerous gasses in the air, instructing you to wear internals."; - pixel_y = 32 +/obj/structure/sign/warning/gas_mask/directional/north{ + desc = "A sign that warns of dangerous gasses in the air, instructing you to wear internals." }, /turf/open/floor/vault, /area/station/security/prison/rec) @@ -45437,9 +46410,8 @@ /turf/open/floor/plating, /area/station/maintenance/solars/starboard/fore) "oBU" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) "oBZ" = ( /obj/machinery/light/directional/west, @@ -45601,18 +46573,14 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/medical/chemistry) -"oDZ" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/warning/cold_temp, -/turf/open/floor/plating, -/area/station/cargo/storage) "oEb" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ - id = "viroview" + id = "viroview"; + dir = 4 }, /turf/open/floor/plating, /area/station/medical/virology) @@ -45626,11 +46594,11 @@ "oEr" = ( /obj/machinery/computer/secure_data, /obj/machinery/requests_console/directional/north{ + anon_tips_receiver = 1; + assistance_requestable = 1; department = "Security"; departmentType = 5; - name = "Security Requests Console"; - assistance_requestable = 1; - anon_tips_receiver = 1 + name = "Security Requests Console" }, /obj/effect/turf_decal/tile/red{ dir = 1 @@ -45664,7 +46632,7 @@ "oFq" = ( /obj/structure/chair/office/light, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance/office) "oFI" = ( /obj/effect/turf_decal/weather/snow/corner{ dir = 6 @@ -45674,7 +46642,6 @@ "oFP" = ( /obj/structure/table, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, /obj/item/analyzer, /obj/item/pipe_dispenser, /turf/open/floor/iron/dark, @@ -45792,6 +46759,14 @@ }, /turf/open/floor/iron, /area/station/commons/locker) +"oHe" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/components/unary/passive_vent{ + dir = 8 + }, +/obj/structure/sign/warning/fire/directional/south, +/turf/open/openspace/icemoon/keep_below, +/area/icemoon/underground/explored) "oHp" = ( /obj/machinery/camera/directional/west{ c_tag = "Engineering Escape Pod" @@ -45890,7 +46865,8 @@ "oKn" = ( /obj/machinery/door/poddoor/shutters/preopen{ id = "hopqueue"; - name = "HoP Queue Shutters" + name = "HoP Queue Shutters"; + dir = 8 }, /obj/effect/turf_decal/loading_area{ dir = 4 @@ -45899,10 +46875,8 @@ /turf/open/floor/iron, /area/station/hallway/primary/central) "oKq" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/iron/grimy, /area/station/maintenance/aft/greater) "oKv" = ( /obj/item/trash/popcorn, @@ -45914,18 +46888,6 @@ }, /turf/open/floor/iron/white, /area/station/science/lab) -"oKB" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/freezer{ - name = "Cold Room" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment, -/obj/machinery/duct, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/service/kitchen, -/turf/open/floor/iron/textured_half, -/area/station/service/kitchen/coldroom) "oKJ" = ( /obj/effect/turf_decal/tile/red{ dir = 1 @@ -45947,6 +46909,16 @@ /obj/effect/turf_decal/stripes/corner, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat/atmos) +"oLf" = ( +/obj/effect/turf_decal/arrows/red{ + dir = 4; + pixel_x = -15 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/engine, +/area/station/engineering/atmos/hfr_room) "oLg" = ( /turf/open/floor/iron/white/corner, /area/station/science/research) @@ -45968,7 +46940,7 @@ /area/station/hallway/secondary/exit/departure_lounge) "oLA" = ( /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "oLG" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -46013,7 +46985,7 @@ /area/station/hallway/primary/port) "oMm" = ( /turf/open/floor/plating/icemoon, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "oMs" = ( /obj/effect/spawner/random/trash/mess, /turf/open/floor/iron/grimy, @@ -46064,7 +47036,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/obj/effect/mapping_helpers/airlock/access/any/engineering/construction, +/obj/effect/mapping_helpers/airlock/access/any/engineering/general, /turf/open/floor/iron/dark, /area/station/engineering/main) "oNp" = ( @@ -46147,18 +47120,12 @@ }, /obj/effect/turf_decal/box, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance/office) "oOX" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/duct, -/mob/living/simple_animal/hostile/retaliate/goat{ - name = "Pete" - }, -/turf/open/floor/iron/freezer, -/area/station/service/kitchen/coldroom) +/obj/effect/turf_decal/tile/red/full, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/large, +/area/station/service/kitchen/diner) "oPa" = ( /obj/structure/sign/warning/secure_area, /turf/closed/wall/r_wall, @@ -46211,11 +47178,11 @@ /area/station/ai_monitored/turret_protected/aisat/maint) "oPO" = ( /obj/machinery/requests_console/directional/south{ + anon_tips_receiver = 1; + assistance_requestable = 1; department = "Security"; departmentType = 5; - name = "Security Requests Console"; - anon_tips_receiver = 1; - assistance_requestable = 1 + name = "Security Requests Console" }, /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ @@ -46277,10 +47244,8 @@ /area/station/hallway/primary/central) "oQI" = ( /obj/item/cigbutt, -/obj/structure/sign/warning/cold_temp, -/obj/structure/sign/warning/gas_mask{ - pixel_y = 32 - }, +/obj/structure/sign/warning/cold_temp/directional/south, +/obj/structure/sign/warning/gas_mask/directional/north, /turf/open/floor/plating, /area/station/maintenance/starboard/upper) "oQK" = ( @@ -46290,9 +47255,7 @@ dir = 9; network = list("ss13","medbay") }, -/obj/structure/sign/warning/cold_temp{ - pixel_y = 32 - }, +/obj/structure/sign/warning/cold_temp/directional/north, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, /turf/open/floor/iron/dark/textured, /area/station/medical/cryo) @@ -46331,12 +47294,11 @@ /area/station/medical/surgery/fore) "oRu" = ( /obj/structure/window/reinforced, -/obj/machinery/computer/atmos_control/noreconnect{ - atmos_chambers = list("ordnancegas1" = "Burn Chamber", "ordnancegas2" = "Freezer Chamber"); +/obj/machinery/computer/atmos_control/ordnancemix{ dir = 1 }, /turf/open/floor/iron, -/area/station/science/mixing) +/area/station/science/ordnance) "oRw" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -46352,7 +47314,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "oRX" = ( /obj/effect/turf_decal/tile/blue{ dir = 8 @@ -46393,9 +47355,8 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/aft) "oSw" = ( /obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden, @@ -46480,6 +47441,12 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"oTC" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/engine, +/area/station/engineering/atmos/hfr_room) "oTH" = ( /obj/structure/showcase/cyborg/old{ dir = 8; @@ -46557,6 +47524,7 @@ /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ dir = 6 }, +/obj/machinery/meter, /turf/open/floor/iron, /area/station/engineering/atmos) "oVy" = ( @@ -46584,6 +47552,18 @@ /obj/machinery/firealarm/directional/north, /turf/open/floor/iron/dark/textured, /area/station/security/prison/rec) +"oWh" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/door/airlock/external{ + name = "MiniSat External Access" + }, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/access/any/command/minisat, +/obj/effect/mapping_helpers/airlock/access/any/command/ai_upload, +/turf/open/floor/plating, +/area/station/ai_monitored/turret_protected/aisat_interior) "oWk" = ( /obj/effect/turf_decal/tile/red{ dir = 8 @@ -46598,14 +47578,12 @@ /turf/closed/wall/r_wall, /area/station/engineering/atmos/storage/gas) "oWu" = ( -/turf/open/floor/wood{ - icon_state = "wood-broken5" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/maintenance/fore/lesser) "oWA" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/medical/morgue) "oWP" = ( /obj/structure/disposalpipe/segment, @@ -46742,7 +47720,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, -/area/station/security/prison) +/area/station/security/execution/transfer) "oYZ" = ( /obj/machinery/modular_computer/console/preset/id, /obj/machinery/light/directional/north, @@ -46804,12 +47782,10 @@ /turf/open/floor/engine, /area/station/engineering/supermatter) "oZE" = ( -/obj/structure/railing/corner{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only, -/obj/effect/decal/cleanable/food/flour, -/turf/open/floor/iron/cafeteria, +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/kitchen/diagonal, /area/station/service/kitchen) "oZR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -46830,10 +47806,10 @@ /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) "paq" = ( -/obj/structure/table, -/obj/item/stack/cable_coil, -/turf/open/floor/iron, -/area/station/engineering/atmos/project) +/obj/machinery/status_display/ai/directional/north, +/obj/machinery/light/directional/north, +/turf/open/openspace, +/area/station/engineering/atmos/storage) "par" = ( /obj/structure/toilet/greyscale, /obj/machinery/airalarm/directional/east, @@ -46999,9 +47975,8 @@ /turf/open/floor/iron, /area/station/cargo/drone_bay) "pcl" = ( -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/fore/lesser) "pcr" = ( /obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/nitrous_output{ @@ -47047,7 +48022,7 @@ /obj/structure/closet/secure_closet/brig, /obj/machinery/light/directional/north, /turf/open/floor/iron/smooth, -/area/station/security/prison) +/area/station/security/execution/transfer) "pdx" = ( /obj/item/kirbyplants{ icon_state = "plant-10" @@ -47075,10 +48050,10 @@ /area/station/maintenance/fore/greater) "pdG" = ( /obj/machinery/requests_console/directional/south{ + assistance_requestable = 1; department = "Atmospherics"; departmentType = 3; name = "Atmospherics Requests Console"; - assistance_requestable = 1; supplies_requestable = 1 }, /obj/machinery/light/directional/south, @@ -47142,13 +48117,12 @@ /turf/open/floor/wood, /area/station/commons/dorms) "pef" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/button/door/directional/north{ - id = "kitchen"; - name = "Counter Shutters Control"; - req_access = list("kitchen") +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/turf/open/floor/iron/cafeteria, +/obj/machinery/holopad, +/turf/open/floor/iron/kitchen/diagonal, /area/station/service/kitchen) "pej" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -47181,21 +48155,6 @@ /obj/machinery/portable_atmospherics/canister/air, /turf/open/floor/plating, /area/station/maintenance/starboard/upper) -"peW" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/main) "pfa" = ( /obj/effect/turf_decal/tile/red{ dir = 1 @@ -47238,6 +48197,17 @@ /obj/structure/flora/grass/green/style_random, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) +"pfD" = ( +/obj/structure/sign/warning/fire/directional/south, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/dark_green/arrow_ccw, +/obj/machinery/atmospherics/pipe/smart/simple/violet/visible/layer1{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage) "pfO" = ( /obj/structure/chair/stool/directional/west, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -47417,7 +48387,8 @@ "pjV" = ( /obj/machinery/door/poddoor/shutters/preopen{ id = "chemistry_lower_shutters"; - name = "Chemistry Exterior Shutters" + name = "Chemistry Exterior Shutters"; + dir = 1 }, /obj/structure/cable, /obj/effect/spawner/structure/window/hollow/reinforced/middle, @@ -47441,6 +48412,25 @@ /obj/item/storage/box/ids, /turf/open/floor/iron, /area/station/command/bridge) +"pkg" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/airalarm/directional/south, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/dark_blue/line, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/mix) +"pki" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/pink/visible/layer5{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/violet/visible/layer1{ + dir = 5 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "pko" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -47454,9 +48444,8 @@ desc = "This mouse smells faintly of alcohol."; name = "Mik" }, -/turf/open/floor/wood{ - icon_state = "wood-broken6" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/maintenance/fore/lesser) "pkW" = ( /obj/effect/turf_decal/plaque{ @@ -47480,7 +48469,7 @@ dir = 9 }, /turf/open/floor/iron/dark/airless, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/freezerchamber) "plF" = ( /obj/machinery/light/directional/west, /obj/machinery/camera/motion/directional/south{ @@ -47577,9 +48566,7 @@ dir = 1 }, /obj/machinery/light/small/directional/north, -/obj/structure/sign/departments/chemistry{ - pixel_y = 32 - }, +/obj/structure/sign/departments/chemistry/directional/north, /turf/open/floor/iron/white, /area/station/medical/chemistry) "pmV" = ( @@ -47687,9 +48674,8 @@ "poG" = ( /obj/machinery/light/small/directional/north, /obj/structure/sign/poster/contraband/random/directional/north, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "poI" = ( /obj/machinery/door/poddoor/shutters/preopen{ @@ -47715,9 +48701,8 @@ dir = 1 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/aft) "ppl" = ( /obj/machinery/light/small/directional/west, @@ -47742,7 +48727,7 @@ "ppB" = ( /obj/structure/stairs/east, /turf/open/floor/iron/white, -/area/station/science/mixing/hallway) +/area/station/science/ordnance) "ppD" = ( /obj/structure/chair/office{ dir = 8 @@ -47844,6 +48829,20 @@ "pqE" = ( /turf/closed/wall, /area/station/ai_monitored/turret_protected/aisat_interior) +"pqF" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Service Hall Maintenance" + }, +/obj/effect/mapping_helpers/airlock/access/all/service/general, +/obj/machinery/duct, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 1 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) "pqG" = ( /obj/effect/turf_decal/trimline/yellow/filled/line, /obj/machinery/light/small/directional/south, @@ -47852,15 +48851,26 @@ }, /turf/open/floor/iron/white, /area/station/medical/chemistry) +"pqJ" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/station/maintenance/department/crew_quarters/bar) "pqM" = ( /obj/structure/window/reinforced, /turf/open/floor/engine, /area/station/science/xenobiology) "pqV" = ( -/obj/structure/table, -/obj/machinery/reagentgrinder, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) "pqX" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -47888,6 +48898,18 @@ "prg" = ( /turf/open/floor/wood, /area/station/service/library) +"prj" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/pink/visible/layer5{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/violet/visible/layer1{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "prk" = ( /obj/machinery/keycard_auth/directional/west, /obj/machinery/computer/cargo{ @@ -47952,7 +48974,6 @@ /area/station/science/xenobiology) "prO" = ( /obj/structure/table, -/obj/structure/cable, /obj/item/stamp/qm, /turf/open/floor/carpet, /area/station/cargo/qm) @@ -48024,6 +49045,13 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"pti" = ( +/obj/effect/turf_decal/box/corners, +/obj/effect/turf_decal/box/corners{ + dir = 1 + }, +/turf/open/floor/engine, +/area/station/engineering/atmos/hfr_room) "ptk" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/structure/cable, @@ -48044,6 +49072,15 @@ }, /turf/open/floor/plating, /area/station/engineering/engine_smes) +"ptz" = ( +/obj/effect/turf_decal/siding/white, +/obj/effect/spawner/random/entertainment/arcade, +/obj/structure/sign/poster/random/directional/north, +/obj/effect/turf_decal/siding/white{ + dir = 6 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) "ptB" = ( /obj/machinery/modular_computer/console/preset/id{ dir = 8 @@ -48110,6 +49147,7 @@ /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ dir = 4 }, +/obj/machinery/meter, /turf/open/floor/iron, /area/station/engineering/atmos) "pve" = ( @@ -48158,14 +49196,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{ dir = 8 }, -/obj/machinery/meter, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/engineering/atmos) "pwc" = ( /obj/machinery/atmospherics/pipe/bridge_pipe/green/visible, -/obj/machinery/atmospherics/pipe/bridge_pipe/yellow/visible{ - dir = 4 +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8; + name = "CO2 to Pure" }, /turf/open/floor/iron, /area/station/engineering/atmos) @@ -48181,10 +49219,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/command/teleporter) -"pwm" = ( -/obj/effect/decal/cleanable/food/flour, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "pwn" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -48239,11 +49273,14 @@ /turf/open/floor/plating, /area/station/maintenance/disposal/incinerator) "pwG" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/junction{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/crew_quarters/bar) "pwH" = ( /obj/structure/chair/stool/directional/south, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -48277,13 +49314,7 @@ /obj/machinery/light/directional/west, /obj/machinery/firealarm/directional/west, /turf/open/floor/iron, -/area/station/science/mixing/launch) -"pxg" = ( -/obj/structure/table, -/obj/effect/landmark/event_spawn, -/obj/item/food/piedough, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) +/area/station/science/ordnance/testlab) "pxi" = ( /obj/machinery/door/window{ dir = 8; @@ -48308,9 +49339,8 @@ /obj/effect/turf_decal/stripes/red/line{ dir = 8 }, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "pxA" = ( /obj/machinery/atmospherics/components/tank, @@ -48319,7 +49349,7 @@ }, /obj/machinery/light/directional/north, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "pxL" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -48332,17 +49362,9 @@ /turf/open/floor/plating, /area/station/maintenance/starboard/aft) "pxT" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "kitchen"; - name = "Kitchen Shutters" - }, -/obj/machinery/door/firedoor, -/obj/machinery/light/directional/south, -/obj/structure/desk_bell{ - pixel_x = 7 - }, -/turf/open/floor/iron/cafeteria, +/obj/effect/turf_decal/tile/blue/diagonal_edge, +/obj/machinery/vending/dinnerware, +/turf/open/floor/iron/kitchen/diagonal, /area/station/service/kitchen) "pxX" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -48361,8 +49383,9 @@ /obj/structure/disposalpipe/segment{ dir = 10 }, +/obj/effect/turf_decal/bot, /turf/open/floor/iron, -/area/station/engineering/atmos/project) +/area/station/engineering/atmos/storage) "pye" = ( /obj/machinery/light/directional/east, /obj/machinery/status_display/evac/directional/east, @@ -48500,6 +49523,11 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/dark/textured_large, /area/station/maintenance/department/medical/central) +"pAJ" = ( +/obj/machinery/airalarm/directional/north, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) "pAT" = ( /obj/machinery/airalarm/directional/north, /obj/effect/decal/cleanable/dirt, @@ -48573,6 +49601,9 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"pCp" = ( +/turf/closed/wall/r_wall, +/area/station/engineering/atmos/hfr_room) "pCI" = ( /obj/effect/turf_decal/tile/red{ dir = 8 @@ -48587,6 +49618,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/mine/eva) +"pCN" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "pDe" = ( /obj/structure/closet/secure_closet/personal{ anchored = 1 @@ -48609,10 +49647,16 @@ dir = 1 }, /area/station/science/lab) +"pDm" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/sign/warning/radiation/directional/west, +/turf/open/floor/plating, +/area/station/maintenance/aft/lesser) "pDq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/closed/wall/r_wall, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "pDv" = ( /obj/structure/table/reinforced, /obj/machinery/door/firedoor, @@ -48626,7 +49670,7 @@ /turf/open/floor/iron, /area/station/ai_monitored/security/armory/upper) "pDB" = ( -/obj/item/radio/intercom/prison/directional/north, +/obj/item/radio/intercom/directional/north, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, @@ -48639,6 +49683,15 @@ }, /turf/open/floor/iron/dark/textured, /area/station/security/processing) +"pDG" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/duct, +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/hfr_room) "pDI" = ( /obj/structure/table, /obj/machinery/computer/libraryconsole/bookmanagement, @@ -48664,6 +49717,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet, /area/station/service/library) +"pDU" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage) "pDW" = ( /turf/open/floor/plating, /area/mine/laborcamp/security) @@ -48691,7 +49749,7 @@ pixel_y = 32 }, /turf/open/floor/iron, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "pFi" = ( /obj/machinery/light/directional/east, /obj/structure/table, @@ -48771,6 +49829,14 @@ /obj/effect/mapping_helpers/airlock/access/all/science/general, /turf/open/floor/iron/dark, /area/station/science/breakroom) +"pGs" = ( +/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8; + name = "Plasma to Pure" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "pGt" = ( /obj/effect/turf_decal/weather/snow/corner{ dir = 5 @@ -48799,6 +49865,15 @@ }, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/surface/outdoors/nospawn) +"pHb" = ( +/obj/effect/turf_decal/box/corners{ + dir = 8 + }, +/obj/effect/turf_decal/box/corners{ + dir = 4 + }, +/turf/open/floor/engine, +/area/station/engineering/atmos/hfr_room) "pHd" = ( /obj/machinery/door/airlock/engineering{ name = "Starboard Bow Solar Access" @@ -48820,7 +49895,7 @@ /obj/item/target/syndicate, /obj/machinery/light/directional/south, /turf/open/floor/iron, -/area/station/science/misc_lab) +/area/station/science/explab) "pHQ" = ( /obj/structure/cable, /obj/machinery/door/airlock/glass{ @@ -48886,6 +49961,10 @@ /obj/machinery/duct, /turf/open/floor/plating, /area/station/hallway/secondary/service) +"pIR" = ( +/obj/effect/turf_decal/bot, +/turf/open/floor/engine, +/area/station/engineering/atmos/hfr_room) "pIX" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -48905,9 +49984,8 @@ }, /area/station/security/prison) "pJk" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "pJm" = ( /obj/effect/landmark/event_spawn, @@ -48935,11 +50013,6 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"pJB" = ( -/obj/effect/landmark/start/cook, -/obj/machinery/duct, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "pJC" = ( /obj/effect/landmark/start/hangover, /obj/effect/turf_decal/tile/blue{ @@ -49038,7 +50111,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, -/area/station/science/mixing) +/area/station/science/ordnance) "pKJ" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -49105,7 +50178,7 @@ "pLL" = ( /obj/machinery/portable_atmospherics/scrubber, /turf/open/floor/iron/dark, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "pLO" = ( /obj/machinery/status_display/evac/directional/east, /obj/effect/turf_decal/tile/blue{ @@ -49158,9 +50231,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/structure/sign/warning/cold_temp{ - pixel_y = -32 - }, +/obj/structure/sign/warning/cold_temp/directional/south, /turf/open/floor/iron/white, /area/station/science/research) "pMY" = ( @@ -49282,7 +50353,7 @@ }, /obj/item/assembly/timer, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance/office) "pOf" = ( /obj/structure/table, /obj/item/stack/sheet/glass, @@ -49372,9 +50443,8 @@ /turf/open/floor/iron, /area/station/command/gateway) "pPl" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/aft) "pPy" = ( /obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ @@ -49441,6 +50511,11 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, /area/station/medical/medbay/aft) +"pPQ" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/project) "pPR" = ( /obj/effect/turf_decal/tile/yellow{ dir = 8 @@ -49456,6 +50531,14 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"pQj" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/engineering/engine_smes) "pQo" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -49488,7 +50571,7 @@ /area/station/maintenance/port/greater) "pQv" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 }, /turf/open/floor/iron/large, @@ -49537,9 +50620,7 @@ /obj/structure/disposalpipe/trunk{ dir = 8 }, -/obj/structure/sign/warning/deathsposal{ - pixel_y = 32 - }, +/obj/structure/sign/warning/deathsposal/directional/north, /turf/open/floor/plating, /area/station/maintenance/port/aft) "pRx" = ( @@ -49560,6 +50641,10 @@ }, /turf/open/floor/iron/textured, /area/station/security/brig) +"pRE" = ( +/obj/structure/closet/firecloset, +/turf/open/floor/plating, +/area/station/service/kitchen/coldroom) "pRG" = ( /obj/effect/turf_decal/tile/red{ dir = 4 @@ -49593,7 +50678,11 @@ /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/components/tank, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) +"pSQ" = ( +/obj/structure/sign/warning/gas_mask, +/turf/closed/wall, +/area/station/cargo/storage) "pST" = ( /obj/structure/sink{ dir = 8; @@ -49642,7 +50731,7 @@ }, /obj/machinery/light/directional/west, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance/office) "pTU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/cafeteria, @@ -49660,9 +50749,8 @@ "pUg" = ( /obj/structure/table/wood, /obj/item/paicard, -/turf/open/floor/wood{ - icon_state = "wood-broken6" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/maintenance/fore/lesser) "pUh" = ( /obj/structure/cable, @@ -49670,7 +50758,7 @@ dir = 4 }, /turf/open/floor/iron, -/area/station/science/misc_lab) +/area/station/science/explab) "pUn" = ( /obj/structure/sink{ dir = 8; @@ -49794,15 +50882,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/grimy, /area/station/ai_monitored/turret_protected/aisat_interior) -"pXb" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "pXe" = ( /obj/item/stack/sheet/animalhide/monkey, /obj/effect/decal/cleanable/blood, @@ -49822,15 +50901,12 @@ /turf/open/floor/iron/smooth, /area/station/security/brig/upper) "pXs" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "kitchen"; - name = "Kitchen Shutters" +/obj/structure/table, +/obj/machinery/microwave{ + pixel_y = 5 }, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/cafeteria, +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/turf/open/floor/iron/kitchen/diagonal, /area/station/service/kitchen) "pXv" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -49952,24 +51028,30 @@ /turf/open/floor/iron/white/side{ dir = 9 }, -/area/station/science/misc_lab) +/area/station/science/explab) "pYF" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/service/janitor) "pYR" = ( -/obj/structure/sign/warning/cold_temp{ - pixel_x = 32 - }, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/obj/structure/sign/warning/cold_temp/directional/east, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/aft) "pYT" = ( /obj/machinery/light/small/directional/east, /turf/open/floor/iron, /area/station/cargo/storage) +"pYV" = ( +/obj/effect/turf_decal/trimline/dark_green/arrow_ccw{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/layer_manifold/violet/visible{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage) "pZd" = ( /obj/machinery/door/airlock/external{ name = "Service Hall Exit" @@ -49977,9 +51059,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ cycle_id = "service-hall-external" }, -/obj/structure/sign/warning/cold_temp{ - pixel_y = 32 - }, +/obj/structure/sign/warning/cold_temp/directional/north, /obj/effect/turf_decal/stripes/line{ dir = 1 }, @@ -50010,10 +51090,14 @@ /turf/open/floor/iron, /area/mine/eva) "pZE" = ( -/obj/structure/closet/secure_closet/freezer/kitchen, -/obj/effect/decal/cleanable/food/flour, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) "pZG" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -50023,9 +51107,8 @@ /turf/open/floor/iron, /area/station/engineering/storage) "pZR" = ( -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/department/chapel) "pZY" = ( /mob/living/simple_animal/hostile/asteroid/polarbear{ @@ -50076,6 +51159,27 @@ }, /turf/open/floor/iron/dark/textured, /area/station/engineering/main) +"qaL" = ( +/obj/structure/ladder{ + name = "Cold Room Access" + }, +/obj/machinery/door/window/left/directional/north{ + name = "Freezer Access"; + req_access = list("kitchen"); + desc = "Get down to the Ice Box using this." + }, +/obj/structure/window/reinforced/spawner/west, +/obj/effect/turf_decal/stripes{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark_blue/diagonal_edge, +/obj/effect/turf_decal/stripes/white/line{ + dir = 1 + }, +/obj/structure/sign/warning/cold_temp/directional/south, +/obj/structure/sign/warning/gas_mask/directional/east, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) "qaR" = ( /obj/structure/closet/wardrobe/mixed, /turf/open/floor/plating, @@ -50130,9 +51234,8 @@ "qby" = ( /obj/effect/spawner/random/trash/mess, /obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/wood{ - icon_state = "wood-broken2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/maintenance/aft/greater) "qbF" = ( /obj/structure/closet/secure_closet/personal/cabinet, @@ -50178,6 +51281,16 @@ }, /turf/open/floor/iron, /area/station/tcommsat/computer) +"qcb" = ( +/obj/machinery/atmospherics/pipe/smart/simple/violet/visible{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/trimline/dark_green/end{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/mix) "qck" = ( /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) @@ -50195,11 +51308,6 @@ /obj/effect/turf_decal/stripes/box, /turf/open/floor/iron, /area/station/cargo/miningdock) -"qcK" = ( -/turf/open/floor/iron/icemoon{ - icon_state = "damaged3" - }, -/area/icemoon/surface/outdoors/nospawn) "qcL" = ( /obj/effect/turf_decal/siding/yellow/end{ dir = 8 @@ -50233,12 +51341,9 @@ /area/station/engineering/storage) "qdi" = ( /obj/structure/barricade/wooden, -/obj/structure/sign/warning/cold_temp{ - pixel_y = 32 - }, -/obj/structure/sign/warning/gas_mask{ - desc = "A sign that warns of dangerous gasses in the air, instructing you to wear internals."; - pixel_y = -32 +/obj/structure/sign/warning/cold_temp/directional/north, +/obj/structure/sign/warning/gas_mask/directional/south{ + desc = "A sign that warns of dangerous gasses in the air, instructing you to wear internals." }, /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) @@ -50269,6 +51374,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, +/obj/machinery/duct, /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) "qea" = ( @@ -50290,10 +51396,6 @@ /turf/closed/wall/r_wall, /area/station/security/checkpoint/engineering) "qet" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, /obj/machinery/duct, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -50301,6 +51403,7 @@ dir = 4; sortType = 19 }, +/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/service/bar) "qeJ" = ( @@ -50348,6 +51451,10 @@ dir = 8 }, /area/station/service/chapel) +"qfg" = ( +/obj/structure/sign/warning/fire/directional/north, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/explored) "qfh" = ( /turf/open/floor/iron/recharge_floor, /area/station/science/robotics/mechbay) @@ -50358,7 +51465,10 @@ }, /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/engine, -/area/station/science/misc_lab) +/area/station/science/explab) +"qfl" = ( +/turf/closed/wall/r_wall, +/area/station/security/execution/transfer) "qfs" = ( /obj/machinery/portable_atmospherics/canister/air, /obj/structure/cable, @@ -50394,9 +51504,8 @@ "qfS" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/aft) "qgn" = ( /obj/effect/turf_decal/tile/red{ @@ -50434,18 +51543,15 @@ /turf/open/floor/iron/dark, /area/station/medical/morgue) "qhF" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, /turf/open/floor/iron, /area/station/engineering/main) "qhL" = ( @@ -50555,9 +51661,7 @@ "qjl" = ( /obj/structure/table, /obj/machinery/recharger, -/obj/structure/sign/warning/biohazard{ - pixel_x = 32 - }, +/obj/structure/sign/warning/biohazard/directional/east, /turf/open/floor/iron, /area/station/command/gateway) "qjx" = ( @@ -50588,18 +51692,33 @@ }, /turf/open/floor/plating, /area/mine/eva) +"qjW" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/engine, +/area/station/engineering/atmos/hfr_room) "qjX" = ( /obj/effect/turf_decal/trimline/red/warning, /obj/effect/turf_decal/stripes/red/line, /turf/open/floor/iron/dark/textured, /area/station/security/range) "qkb" = ( -/obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ dir = 4 }, +/obj/effect/turf_decal/trimline/dark_red/arrow_ccw{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/simple/pink/visible/layer5{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_green/arrow_ccw, +/obj/machinery/atmospherics/pipe/smart/simple/violet/visible/layer1{ + dir = 4 + }, /turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) +/area/station/engineering/atmos/storage) "qkc" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ @@ -50613,9 +51732,8 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 }, -/turf/open/floor/wood{ - icon_state = "wood-broken6" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/maintenance/aft/greater) "qku" = ( /obj/item/kirbyplants/random, @@ -50815,9 +51933,7 @@ dir = 4 }, /obj/effect/spawner/random/vending/snackvend, -/obj/structure/sign/departments/restroom{ - pixel_y = -32 - }, +/obj/structure/sign/departments/restroom/directional/south, /turf/open/floor/iron/white, /area/station/medical/break_room) "qnC" = ( @@ -50879,7 +51995,7 @@ }, /obj/effect/mapping_helpers/airlock/access/any/science/maintenance, /turf/open/floor/plating, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "qoY" = ( /obj/effect/spawner/random/structure/crate_abandoned, /turf/open/floor/plating, @@ -50935,10 +52051,13 @@ "qqc" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/wood{ - icon_state = "wood-broken4" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/maintenance/aft/greater) +"qqi" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/project) "qqn" = ( /obj/structure/tank_dispenser/oxygen, /turf/open/floor/iron/smooth, @@ -51029,9 +52148,8 @@ /area/station/security/prison/toilet) "qrv" = ( /obj/structure/ladder, -/turf/open/floor/wood{ - icon_state = "wood-broken" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/maintenance/aft/lesser) "qrB" = ( /obj/machinery/navbeacon{ @@ -51046,7 +52164,7 @@ "qrD" = ( /obj/machinery/portable_atmospherics/canister/nitrous_oxide, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "qsk" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/red, @@ -51063,6 +52181,14 @@ /obj/structure/flora/bush/sunny/style_random, /turf/open/floor/grass, /area/station/security/warden) +"qsr" = ( +/obj/structure/stairs/north{ + dir = 4 + }, +/turf/open/floor/iron/stairs/old{ + dir = 4 + }, +/area/station/engineering/atmos/mix) "qsu" = ( /obj/structure/table, /obj/item/stack/cable_coil, @@ -51090,14 +52216,14 @@ /obj/structure/cable, /obj/effect/mapping_helpers/airlock/access/all/security/brig, /turf/open/floor/iron/smooth, -/area/station/security/prison) +/area/station/security/execution/transfer) "qsM" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, /turf/open/floor/iron/dark, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "qsQ" = ( /obj/machinery/stasis, /obj/machinery/defibrillator_mount/directional/north, @@ -51273,13 +52399,6 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/wood, /area/station/service/library) -"qwD" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red/full, -/turf/open/floor/iron/large, -/area/station/service/kitchen/diner) "qwF" = ( /obj/structure/grille, /turf/closed/wall/r_wall, @@ -51337,6 +52456,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/commons/fitness) +"qwV" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line, +/obj/structure/extinguisher_cabinet/directional/east, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) "qxo" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ @@ -51359,6 +52484,17 @@ /obj/machinery/duct, /turf/open/floor/iron, /area/station/engineering/lobby) +"qxC" = ( +/obj/machinery/ai_slipper{ + uses = 10 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/layer3, +/mob/living/simple_animal/bot/secbot/pingsky, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat_interior) "qxM" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 @@ -51368,7 +52504,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /turf/open/floor/iron/white, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "qxQ" = ( /obj/effect/turf_decal/delivery, /turf/open/floor/iron, @@ -51396,6 +52532,14 @@ }, /turf/open/floor/iron/dark, /area/station/science/server) +"qyF" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/hfr_room) "qyI" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ @@ -51566,6 +52710,10 @@ }, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/surface/outdoors/nospawn) +"qCC" = ( +/obj/structure/railing, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage) "qCE" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/stripes/line{ @@ -51588,6 +52736,20 @@ /obj/structure/reagent_dispensers/watertank, /turf/open/floor/plating, /area/station/maintenance/fore/lesser) +"qDr" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/components/trinary/filter/flipped{ + dir = 4; + name = "Exfiltrate Filter" + }, +/obj/effect/turf_decal/trimline/dark_red/filled/warning{ + dir = 10 + }, +/obj/effect/turf_decal/trimline/dark_red/filled/warning{ + dir = 5 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/mix) "qDv" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/item/radio/intercom/directional/north, @@ -51613,12 +52775,10 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"qEk" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) +"qDM" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/closed/wall/r_wall, +/area/station/maintenance/disposal/incinerator) "qEm" = ( /obj/structure/reagent_dispensers/watertank, /turf/open/floor/plating, @@ -51685,7 +52845,7 @@ /obj/machinery/door/firedoor, /obj/effect/mapping_helpers/airlock/access/all/security/brig, /turf/open/floor/iron/dark/textured, -/area/station/security/prison) +/area/station/security/execution/transfer) "qFh" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -51718,12 +52878,26 @@ /obj/effect/spawner/random/maintenance/two, /turf/open/floor/plating, /area/station/maintenance/fore/greater) +"qFx" = ( +/obj/machinery/atmospherics/pipe/smart/simple/violet/visible{ + dir = 5 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/trimline/dark_green/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_green/line{ + dir = 10 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/mix) "qFA" = ( /obj/structure/table, /obj/machinery/camera/motion/directional/west{ c_tag = "ai_upload West"; network = list("aiupload") }, +/obj/item/ai_module/supplied/freeform, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai_upload) "qFC" = ( @@ -51827,6 +53001,9 @@ /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/iron/white, /area/station/science/robotics/lab) +"qHy" = ( +/turf/open/floor/plating, +/area/station/service/kitchen/coldroom) "qHD" = ( /obj/machinery/computer/prisoner/management, /obj/effect/turf_decal/tile/red{ @@ -51850,6 +53027,15 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/solars/port/aft) +"qIm" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/railing, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage) "qIo" = ( /obj/structure/closet/crate/hydroponics, /obj/item/paper/guides/jobs/hydroponics, @@ -51887,11 +53073,10 @@ /turf/open/floor/plating, /area/station/engineering/atmos/pumproom) "qIM" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos/project) +/obj/effect/turf_decal/bot, +/obj/machinery/holopad, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/storage) "qIU" = ( /turf/open/floor/iron, /area/station/commons/dorms) @@ -51978,9 +53163,11 @@ /turf/open/floor/plating, /area/station/security/prison/safe) "qKa" = ( -/obj/structure/table, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron/white/smooth_large, +/obj/effect/turf_decal/tile/red/full, +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/iron/large, /area/station/service/kitchen/diner) "qKi" = ( /obj/machinery/light/small/directional/west, @@ -52062,6 +53249,14 @@ /obj/machinery/bluespace_vendor/directional/east, /turf/open/floor/iron/dark, /area/station/science/breakroom) +"qLc" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Canteen" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/textured_half, +/area/station/hallway/primary/starboard) "qLf" = ( /obj/structure/sign/painting/library{ pixel_y = 32 @@ -52071,9 +53266,6 @@ }, /turf/open/floor/wood, /area/station/service/library) -"qLl" = ( -/turf/closed/wall/r_wall, -/area/station/science/mixing/hallway) "qLm" = ( /obj/machinery/suit_storage_unit/mining, /obj/effect/turf_decal/bot, @@ -52307,7 +53499,7 @@ /obj/structure/filingcabinet/chestdrawer, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, -/area/station/science/misc_lab) +/area/station/science/explab) "qNn" = ( /obj/structure/table, /obj/item/storage/toolbox/mechanical{ @@ -52408,7 +53600,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment, /obj/machinery/duct, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/obj/effect/mapping_helpers/airlock/access/any/engineering/construction, +/obj/effect/mapping_helpers/airlock/access/any/engineering/general, /turf/open/floor/iron/dark, /area/station/engineering/main) "qOP" = ( @@ -52508,11 +53701,11 @@ /obj/machinery/computer/security/hos, /obj/machinery/requests_console/directional/north{ announcementConsole = 1; + anon_tips_receiver = 1; + assistance_requestable = 1; department = "Head of Security's Desk"; departmentType = 5; - name = "Head of Security Requests Console"; - anon_tips_receiver = 1; - assistance_requestable = 1 + name = "Head of Security Requests Console" }, /obj/machinery/button/door/directional/north{ id = "hosspace"; @@ -52534,7 +53727,7 @@ "qQt" = ( /obj/structure/closet/secure_closet/brig, /turf/open/floor/iron/smooth, -/area/station/security/prison) +/area/station/security/execution/transfer) "qQx" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -52575,6 +53768,12 @@ }, /turf/open/floor/iron/cafeteria, /area/station/commons/dorms/laundry) +"qRj" = ( +/obj/effect/turf_decal/box/white{ + color = "#9FED58" + }, +/turf/open/floor/engine, +/area/station/engineering/atmos/hfr_room) "qRk" = ( /obj/item/chair/wood, /turf/open/floor/carpet, @@ -52645,7 +53844,17 @@ /obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ dir = 4 }, -/turf/open/floor/plating, +/obj/machinery/atmospherics/pipe/smart/simple/pink/visible/layer5{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_red/arrow_ccw{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/dark_green/arrow_ccw, +/obj/machinery/atmospherics/pipe/smart/simple/violet/visible/layer1{ + dir = 4 + }, +/turf/open/floor/iron, /area/station/engineering/atmos) "qSB" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper, @@ -52680,6 +53889,14 @@ }, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) +"qTk" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8; + name = "Exfiltrate Port" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/mix) "qTs" = ( /turf/open/floor/iron/showroomfloor, /area/station/security/prison/mess) @@ -52831,9 +54048,8 @@ /obj/effect/turf_decal/tile/red{ dir = 4 }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "N2O to Pure" +/obj/machinery/atmospherics/pipe/layer_manifold/general/visible{ + dir = 4 }, /turf/open/floor/iron/cafeteria, /area/station/engineering/atmos) @@ -52906,6 +54122,12 @@ "qWZ" = ( /turf/closed/wall/r_wall, /area/station/command/bridge) +"qXd" = ( +/obj/machinery/atmospherics/components/binary/crystallizer{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/project) "qXf" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 8 @@ -52959,11 +54181,9 @@ /turf/open/floor/iron, /area/station/ai_monitored/command/storage/eva) "qYu" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored{ - chamber_id = "ordnancegas1" - }, +/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/ordnance_burn_chamber_input, /turf/open/floor/engine/vacuum, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "qYw" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -53099,7 +54319,7 @@ /turf/open/floor/iron/white/corner{ dir = 8 }, -/area/station/science/misc_lab) +/area/station/science/explab) "qZT" = ( /obj/machinery/computer/mech_bay_power_console{ dir = 1 @@ -53111,7 +54331,8 @@ /obj/machinery/door/firedoor/heavy, /obj/machinery/door/poddoor/shutters/preopen{ id = "rnd2"; - name = "Research Lab Shutters" + name = "Research Lab Shutters"; + dir = 8 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -53149,6 +54370,19 @@ /obj/machinery/newscaster/directional/north, /turf/open/floor/iron/showroomfloor, /area/station/security/warden) +"ral" = ( +/obj/machinery/atmospherics/pipe/smart/simple/pink/visible/layer5{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_red/arrow_ccw{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/dark_green/arrow_ccw, +/obj/machinery/atmospherics/pipe/smart/simple/violet/visible/layer1{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "ras" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/engineering/glass{ @@ -53248,6 +54482,15 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/white, /area/station/medical/break_room) +"rbM" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "gene_shutters"; + name = "Genetics Shutters"; + dir = 8 + }, +/turf/open/floor/plating, +/area/station/science/genetics) "rbT" = ( /obj/structure/ore_box, /obj/effect/decal/cleanable/dirt, @@ -53451,7 +54694,7 @@ /obj/machinery/portable_atmospherics/canister/carbon_dioxide, /obj/machinery/light/directional/south, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "rgh" = ( /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ @@ -53520,7 +54763,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron, -/area/station/science/misc_lab) +/area/station/science/explab) "rhl" = ( /obj/machinery/computer/upload/borg{ dir = 1 @@ -53622,7 +54865,7 @@ dir = 4 }, /turf/open/floor/iron, -/area/station/science/misc_lab) +/area/station/science/explab) "riL" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -53749,9 +54992,7 @@ /turf/open/floor/iron/dark/textured, /area/station/security/prison) "rlb" = ( -/obj/structure/sign/warning/docking{ - pixel_x = -32 - }, +/obj/structure/sign/warning/docking/directional/west, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/mine/laborcamp) @@ -53778,7 +55019,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/science/research, /turf/open/floor/iron, -/area/station/science/misc_lab) +/area/station/science/explab) "rlV" = ( /obj/structure/table/wood, /turf/open/floor/wood, @@ -53828,9 +55069,7 @@ /turf/open/floor/iron/textured, /area/station/security/brig) "rnf" = ( -/obj/structure/sign/departments/chemistry/pharmacy{ - pixel_x = -32 - }, +/obj/structure/sign/departments/chemistry/pharmacy/directional/west, /turf/open/openspace, /area/station/medical/medbay/lobby) "rnh" = ( @@ -53890,20 +55129,12 @@ }, /turf/open/floor/iron/freezer, /area/mine/eva/lower) -"roc" = ( -/obj/structure/stairs/north, -/obj/structure/railing{ - dir = 8 - }, -/obj/machinery/firealarm/directional/east, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "rof" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer2{ dir = 5 }, /turf/open/floor/iron/dark/airless, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/freezerchamber) "roA" = ( /obj/machinery/door/window/left/directional/north{ dir = 4; @@ -53934,7 +55165,7 @@ pixel_y = 32 }, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "roR" = ( /obj/machinery/porta_turret/ai{ dir = 4; @@ -53948,9 +55179,6 @@ /turf/open/floor/plating, /area/station/maintenance/aft/lesser) "rpu" = ( -/obj/machinery/computer/security/telescreen/vault{ - pixel_y = 30 - }, /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ dir = 4 @@ -54030,10 +55258,10 @@ /area/station/cargo/lobby) "rqN" = ( /obj/machinery/requests_console/directional/north{ + assistance_requestable = 1; department = "Chapel"; departmentType = 1; - name = "Chapel Requests Console"; - assistance_requestable = 1 + name = "Chapel Requests Console" }, /turf/open/floor/iron/dark, /area/station/service/chapel/office) @@ -54135,7 +55363,7 @@ "rss" = ( /obj/machinery/requests_console/directional/north, /turf/open/floor/iron/white, -/area/station/science/mixing/hallway) +/area/station/science/ordnance) "rsC" = ( /obj/machinery/light/directional/west, /obj/machinery/camera/directional/west{ @@ -54206,6 +55434,14 @@ /obj/effect/mapping_helpers/airlock/access/all/service/crematorium, /turf/open/floor/plating, /area/station/maintenance/department/chapel) +"rtt" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/airlock/maintenance_hatch, +/obj/machinery/door/firedoor/heavy, +/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, +/turf/open/floor/plating, +/area/station/maintenance/aft/lesser) "rtP" = ( /obj/machinery/camera/directional/west{ c_tag = "Engineering West" @@ -54300,11 +55536,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/ai_monitored/command/nuke_storage) -"rvQ" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, -/area/station/maintenance/department/chapel) "rvZ" = ( /obj/effect/landmark/start/hangover, /turf/open/floor/iron, @@ -54404,7 +55635,7 @@ "rxf" = ( /obj/effect/decal/cleanable/dirt, /turf/closed/wall/r_wall, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "rxz" = ( /obj/structure/girder, /turf/open/floor/plating/snowed/icemoon, @@ -54528,25 +55759,26 @@ /turf/open/floor/plating/snowed/icemoon, /area/icemoon/surface/outdoors/nospawn) "rzQ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/trimline/dark_red/arrow_ccw{ + dir = 8 + }, +/obj/structure/railing/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/simple/pink/visible/layer5, /turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) +/area/station/engineering/atmos/storage) "rzY" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, /turf/open/floor/plating, -/area/station/security/prison) +/area/station/security/execution/transfer) "rAl" = ( -/turf/open/floor/wood{ - icon_state = "wood-broken6" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/maintenance/port/aft) "rAr" = ( /obj/effect/turf_decal/tile/red{ @@ -54554,11 +55786,11 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, /mob/living/simple_animal/bot/secbot/beepsky{ desc = "Powered by the tears and sweat of laborers."; name = "Prison Ofitser" }, -/obj/structure/cable, /turf/open/floor/iron, /area/mine/laborcamp/security) "rAC" = ( @@ -54624,9 +55856,7 @@ /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) "rBE" = ( -/obj/structure/sign/warning/secure_area{ - pixel_x = -32 - }, +/obj/structure/sign/warning/secure_area/directional/west, /obj/effect/turf_decal/tile/yellow{ dir = 1 }, @@ -54711,7 +55941,8 @@ /obj/structure/table/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ id = "briggate"; - name = "Security Shutters" + name = "Security Shutters"; + dir = 4 }, /obj/item/paper_bin{ pixel_x = -3; @@ -54991,18 +56222,25 @@ /turf/open/floor/engine/cult, /area/station/service/library) "rGj" = ( -/obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ + dir = 10 + }, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold/pink/visible/layer5{ dir = 4 }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 +/obj/effect/turf_decal/trimline/dark_green/arrow_ccw, +/obj/machinery/atmospherics/pipe/smart/simple/violet/visible/layer1{ + dir = 4 }, -/obj/structure/disposalpipe/segment{ - dir = 5 +/obj/effect/turf_decal/trimline/dark_red/corner{ + dir = 1 }, /turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) +/area/station/engineering/atmos/storage) "rGl" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/brown{ @@ -55058,10 +56296,20 @@ /turf/open/floor/iron, /area/station/hallway/primary/fore) "rHj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/dark/visible{ - dir = 8 +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ + dir = 5 }, -/turf/open/floor/plating, +/obj/machinery/atmospherics/pipe/smart/simple/pink/visible/layer5{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_red/arrow_ccw{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/dark_green/arrow_ccw, +/obj/machinery/atmospherics/pipe/smart/simple/violet/visible/layer1{ + dir = 4 + }, +/turf/open/floor/iron, /area/station/engineering/atmos) "rHo" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -55109,7 +56357,7 @@ receive_ore_updates = 1 }, /turf/open/floor/iron, -/area/station/science/misc_lab) +/area/station/science/explab) "rIF" = ( /obj/structure/table, /obj/item/stack/sheet/glass/fifty, @@ -55152,9 +56400,7 @@ }, /obj/structure/rack, /obj/item/clothing/suit/hazardvest, -/obj/structure/sign/warning/no_smoking{ - pixel_y = 32 - }, +/obj/structure/sign/warning/no_smoking/directional/north, /obj/item/clothing/suit/hazardvest, /obj/item/tank/internals/emergency_oxygen/engi, /obj/item/clothing/glasses/meson/engine, @@ -55184,17 +56430,20 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/command/teleporter) -"rJV" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/siding/white, -/obj/machinery/camera/directional/south{ - c_tag = "Service-Bar 1" +"rJQ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 5 }, -/obj/machinery/light/directional/south, -/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/firealarm/directional/south, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/hfr_room) +"rJV" = ( +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/effect/turf_decal/siding/white/corner, /turf/open/floor/iron, /area/station/service/bar) "rKd" = ( @@ -55208,14 +56457,12 @@ /turf/open/floor/wood/parquet, /area/station/commons/lounge) "rKz" = ( -/obj/structure/chair{ - dir = 4 - }, +/obj/effect/turf_decal/tile/red/full, /obj/effect/turf_decal/siding/white{ dir = 1 }, -/obj/structure/sign/poster/random/directional/north, -/turf/open/floor/iron/white/smooth_large, +/obj/machinery/restaurant_portal/restaurant, +/turf/open/floor/iron/large, /area/station/service/kitchen/diner) "rKQ" = ( /obj/structure/mineral_door/wood{ @@ -55269,7 +56516,7 @@ /area/station/maintenance/starboard/fore) "rMj" = ( /turf/closed/wall/r_wall, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "rMr" = ( /obj/structure/chair{ dir = 8 @@ -55306,6 +56553,10 @@ }, /turf/open/floor/iron, /area/station/engineering/engine_smes) +"rML" = ( +/obj/effect/turf_decal/box, +/turf/open/floor/iron/dark/textured_large, +/area/station/engineering/atmos/project) "rMY" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -55356,10 +56607,12 @@ /turf/open/floor/iron/dark/textured, /area/station/ai_monitored/security/armory) "rNJ" = ( +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/structure/cable, /obj/structure/disposalpipe/segment{ - dir = 9 + dir = 4 }, -/turf/open/floor/iron/cafeteria, +/turf/open/floor/iron/kitchen/diagonal, /area/station/service/kitchen) "rNQ" = ( /obj/structure/disposalpipe/segment{ @@ -55399,7 +56652,7 @@ dir = 1 }, /turf/open/floor/plating/icemoon, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "rOA" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -55430,6 +56683,11 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/mine/eva) +"rOG" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold/pink/visible, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/mix) "rOH" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 9 @@ -55489,6 +56747,15 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/department/electrical) +"rPD" = ( +/obj/item/radio/intercom/directional/south, +/obj/machinery/light/small/directional/south, +/obj/structure/cable/layer3, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat_interior) "rPL" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/rack, @@ -55502,14 +56769,13 @@ /turf/open/floor/plating, /area/station/engineering/supermatter/room) "rQk" = ( -/obj/structure/chair{ - dir = 4 - }, /obj/effect/turf_decal/tile/red/full, /obj/effect/turf_decal/siding/white{ dir = 9 }, -/obj/structure/sign/poster/random/directional/north, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/obj/machinery/light/directional/west, /turf/open/floor/iron/large, /area/station/service/kitchen/diner) "rQl" = ( @@ -55584,7 +56850,7 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /turf/open/floor/iron/dark, -/area/station/science/misc_lab) +/area/station/science/explab) "rRc" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -55633,9 +56899,8 @@ /area/station/hallway/primary/starboard) "rSf" = ( /obj/machinery/light/small/directional/north, -/obj/structure/sign/warning/gas_mask{ - desc = "A sign that warns of dangerous gasses in the air, instructing you to wear internals."; - pixel_y = 32 +/obj/structure/sign/warning/gas_mask/directional/north{ + desc = "A sign that warns of dangerous gasses in the air, instructing you to wear internals." }, /obj/machinery/button/door/directional/north{ id = "drone_bay"; @@ -55762,7 +57027,7 @@ dir = 4 }, /turf/open/floor/plating/icemoon, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "rUz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, @@ -55860,14 +57125,14 @@ dir = 4 }, /turf/open/floor/iron, -/area/station/science/mixing) +/area/station/science/ordnance) "rWm" = ( /obj/machinery/mass_driver/ordnance{ dir = 4 }, /obj/machinery/door/window/left/directional/north, /turf/open/floor/iron, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "rWn" = ( /obj/effect/turf_decal/tile/yellow, /turf/open/floor/iron, @@ -55910,21 +57175,8 @@ }, /obj/effect/landmark/start/hangover, /obj/machinery/light/small/directional/north, -/obj/structure/sign/poster/random{ - pixel_x = -32 - }, /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/structure/chair/sofa/corp/left{ - dir = 4; - pixel_x = -4; - pixel_y = 8 - }, -/obj/effect/landmark/start/hangover, -/obj/machinery/light/small/directional/north, /obj/structure/sign/poster/random/directional/west, /turf/open/floor/iron/grimy, /area/station/service/bar/atrium) @@ -56003,9 +57255,8 @@ /area/station/security/processing) "rYb" = ( /obj/structure/closet/emcloset, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) "rYn" = ( /turf/open/floor/circuit, @@ -56119,6 +57370,11 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/mine/living_quarters) +"rZE" = ( +/obj/effect/turf_decal/tile/red/full, +/obj/effect/turf_decal/siding/white, +/turf/open/floor/iron/large, +/area/station/service/kitchen/diner) "rZN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -56195,7 +57451,7 @@ }, /obj/machinery/atmospherics/components/tank, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "sbt" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -56328,7 +57584,7 @@ c_tag = "Security - Detective's Office" }, /obj/machinery/computer/secure_data, -/obj/item/radio/intercom/prison/directional/north, +/obj/item/radio/intercom/directional/north, /turf/open/floor/iron/grimy, /area/station/security/detectives_office) "sdc" = ( @@ -56492,10 +57748,6 @@ /obj/machinery/newscaster/directional/east, /turf/open/floor/iron/white, /area/station/medical/psychology) -"sfS" = ( -/obj/structure/disposalpipe/segment, -/turf/closed/wall, -/area/station/maintenance/aft/greater) "sfY" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -56515,11 +57767,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/maintenance/port/fore) -"sgx" = ( -/obj/structure/chair{ - dir = 1 +"sgo" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing/corner, +/obj/structure/railing/corner{ + dir = 4 }, -/obj/effect/landmark/start/hangover, +/turf/open/openspace, +/area/station/engineering/atmos/storage) +"sgx" = ( +/obj/effect/landmark/event_spawn, /turf/open/floor/iron/white/smooth_large, /area/station/service/kitchen/diner) "sgA" = ( @@ -56529,12 +57786,8 @@ /turf/open/floor/iron/smooth, /area/mine/mechbay) "sgC" = ( -/obj/structure/sign/warning/cold_temp{ - pixel_y = -32 - }, -/obj/structure/sign/warning/gas_mask{ - pixel_y = 32 - }, +/obj/structure/sign/warning/cold_temp/directional/south, +/obj/structure/sign/warning/gas_mask/directional/north, /turf/open/floor/plating, /area/station/maintenance/fore/lesser) "sgJ" = ( @@ -56654,7 +57907,7 @@ /area/station/maintenance/starboard/lesser) "sie" = ( /turf/open/openspace, -/area/station/science/mixing) +/area/station/science/ordnance) "sil" = ( /obj/machinery/door/airlock/public/glass{ name = "Art Gallery" @@ -56729,16 +57982,12 @@ /obj/effect/turf_decal/stripes/line{ dir = 9 }, -/obj/structure/sign/warning/secure_area{ - pixel_x = -32 - }, +/obj/structure/sign/warning/secure_area/directional/west, /obj/structure/closet/emcloset, /turf/open/floor/iron/white, /area/station/medical/virology) "sjG" = ( -/obj/structure/sign/warning/secure_area{ - pixel_x = 32 - }, +/obj/structure/sign/warning/secure_area/directional/east, /obj/machinery/light/small/directional/north, /turf/open/floor/iron/white, /area/station/maintenance/aft/greater) @@ -56784,25 +58033,7 @@ /turf/open/floor/iron/white/corner{ dir = 1 }, -/area/station/science/misc_lab) -"skQ" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/machinery/door/airlock{ - name = "Bar" - }, -/obj/machinery/duct, -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "kitchen_counter"; - name = "Kitchen Shutters" - }, -/obj/structure/disposalpipe/segment, -/obj/effect/mapping_helpers/airlock/access/any/service/bar, -/obj/effect/mapping_helpers/airlock/access/any/service/kitchen, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) +/area/station/science/explab) "skU" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -56833,9 +58064,8 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/aft) "slc" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -56863,7 +58093,8 @@ /obj/structure/table/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ id = "rnd"; - name = "Research Lab Shutters" + name = "Research Lab Shutters"; + dir = 1 }, /obj/machinery/door/window/right/directional/south{ name = "Research and Development Desk"; @@ -56903,6 +58134,16 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/solars/port/aft) +"smt" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2{ + dir = 9 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/mix) "smC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -56934,6 +58175,11 @@ }, /turf/open/misc/asteroid/snow/icemoon, /area/station/ai_monitored/turret_protected/aisat/maint) +"snb" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, +/turf/open/floor/plating, +/area/station/maintenance/disposal/incinerator) "snj" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -56950,9 +58196,7 @@ id = "surgery"; name = "Surgery Shutter" }, -/obj/structure/sign/warning/no_smoking/circle{ - pixel_x = 32 - }, +/obj/structure/sign/warning/no_smoking/circle/directional/east, /turf/open/floor/plating, /area/station/medical/surgery/aft) "snt" = ( @@ -57036,7 +58280,7 @@ }, /obj/machinery/airalarm/directional/north, /turf/open/floor/iron/smooth, -/area/station/security/prison) +/area/station/security/execution/transfer) "sou" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -57102,9 +58346,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, -/obj/structure/sign/departments/chemistry/pharmacy{ - pixel_x = -32 - }, +/obj/structure/sign/departments/chemistry/pharmacy/directional/west, /turf/open/floor/iron/white, /area/station/medical/medbay/central) "spM" = ( @@ -57132,7 +58374,7 @@ /obj/item/hatchet, /obj/item/crowbar, /obj/item/plant_analyzer, -/obj/item/reagent_containers/glass/bucket, +/obj/item/reagent_containers/glass/watering_can, /obj/effect/turf_decal/tile/green, /obj/effect/turf_decal/tile/green{ dir = 4 @@ -57205,9 +58447,7 @@ /obj/structure/railing{ dir = 5 }, -/obj/structure/sign/warning/biohazard{ - pixel_x = -32 - }, +/obj/structure/sign/warning/biohazard/directional/west, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) "srk" = ( @@ -57288,6 +58528,13 @@ /obj/structure/sign/warning/secure_area, /turf/closed/wall/r_wall, /area/station/engineering/storage/tech) +"ssz" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "ssB" = ( /obj/effect/turf_decal/tile/yellow{ dir = 1 @@ -57301,6 +58548,12 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/bridge_pipe/yellow/visible, +/obj/machinery/atmospherics/pipe/smart/simple/pink/visible/layer5{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/violet/visible/layer1{ + dir = 4 + }, /turf/open/floor/iron, /area/station/engineering/atmos) "ssY" = ( @@ -57362,7 +58615,7 @@ pixel_x = -32 }, /turf/open/floor/iron/dark/textured, -/area/station/security/prison) +/area/station/security/execution/transfer) "stZ" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -57747,22 +59000,16 @@ "sAk" = ( /turf/open/floor/iron, /area/station/construction/mining/aux_base) -"sAo" = ( -/obj/machinery/door/airlock/hatch{ - name = "MiniSat Teleporter" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/airlock/access/all/command/ai_upload, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) "sAs" = ( -/obj/effect/turf_decal/tile/red/full, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/large, -/area/station/service/kitchen/diner) +/obj/structure/table/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "kitchencounter"; + name = "Kitchen Counter Shutters"; + dir = 8 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) "sAu" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -57841,9 +59088,9 @@ dir = 4 }, /obj/machinery/light/small/directional/west, -/obj/item/radio/intercom/prison/directional/west, +/obj/item/radio/intercom/directional/west, /turf/open/floor/iron/dark/textured, -/area/station/security/prison) +/area/station/security/execution/transfer) "sBi" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -57893,7 +59140,7 @@ c_tag = "Atmospherics Central" }, /obj/machinery/atmospherics/components/binary/pump{ - name = "Port to Filter" + name = "Port to Infiltrate" }, /turf/open/floor/iron, /area/station/engineering/atmos) @@ -57997,9 +59244,7 @@ /area/station/science/lab) "sDi" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/sign/warning/fire{ - pixel_x = -32 - }, +/obj/structure/sign/warning/fire/directional/west, /turf/open/floor/plating, /area/station/maintenance/aft/greater) "sDl" = ( @@ -58013,9 +59258,8 @@ /turf/open/floor/plating, /area/station/commons/storage/mining) "sDr" = ( -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/department/medical/central) "sDs" = ( /obj/effect/turf_decal/stripes/line{ @@ -58026,8 +59270,8 @@ /area/station/maintenance/starboard/lesser) "sDH" = ( /obj/machinery/firealarm/directional/north, -/obj/item/kirbyplants/random, /obj/machinery/light/small/directional/north, +/obj/item/kirbyplants/random, /turf/open/floor/iron/dark, /area/station/science/breakroom) "sDT" = ( @@ -58201,15 +59445,14 @@ "sFT" = ( /obj/structure/girder, /obj/structure/grille, -/turf/open/floor/wood{ - icon_state = "wood-broken6" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/maintenance/aft/lesser) "sGc" = ( /obj/machinery/module_duplicator, /obj/structure/sign/poster/official/random/directional/south, /turf/open/floor/iron, -/area/station/science/misc_lab) +/area/station/science/explab) "sGf" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/extinguisher_cabinet/directional/north, @@ -58308,11 +59551,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/cargo/storage) -"sHt" = ( -/obj/effect/turf_decal/tile/red/full, -/obj/effect/landmark/event_spawn, -/turf/open/floor/iron/large, -/area/station/service/kitchen/diner) "sHB" = ( /obj/effect/turf_decal/tile/red/full, /turf/open/floor/iron/large, @@ -58541,27 +59779,24 @@ /turf/open/floor/iron, /area/station/cargo/office) "sLL" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, /turf/open/floor/iron, /area/station/engineering/main) "sLO" = ( /obj/machinery/door/firedoor/border_only, /turf/open/openspace, -/area/station/science/mixing/hallway) +/area/station/science/ordnance) "sLS" = ( /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/engine, -/area/station/science/misc_lab) +/area/station/science/explab) "sMg" = ( /turf/open/floor/engine/air, /area/station/engineering/atmos) @@ -58596,9 +59831,18 @@ }, /turf/open/floor/iron/dark, /area/station/medical/morgue) +"sMK" = ( +/obj/effect/turf_decal/box/white, +/turf/open/floor/engine, +/area/station/engineering/atmos/hfr_room) "sMP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/cafeteria, +/obj/structure/table, +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/item/storage/bag/tray, +/obj/item/knife/kitchen{ + pixel_y = 2 + }, +/turf/open/floor/iron/kitchen/diagonal, /area/station/service/kitchen) "sMY" = ( /obj/structure/table, @@ -58645,6 +59889,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/engineering/atmos) +"sNx" = ( +/obj/effect/turf_decal/trimline/white/filled/warning, +/turf/open/genturf, +/area/icemoon/underground/unexplored/rivers/deep) "sNI" = ( /obj/effect/landmark/event_spawn, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -58656,7 +59904,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, -/area/station/science/mixing) +/area/station/science/ordnance) "sNQ" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 @@ -58712,12 +59960,18 @@ /turf/open/floor/iron, /area/station/commons/storage/art) "sPk" = ( -/obj/machinery/restaurant_portal/restaurant, +/obj/machinery/light/directional/east, +/obj/effect/turf_decal/tile/red/full, /obj/effect/turf_decal/siding/white{ - dir = 10 + dir = 6 }, -/turf/open/floor/iron/white/smooth_large, +/obj/item/kirbyplants/random, +/turf/open/floor/iron/large, /area/station/service/kitchen/diner) +"sPr" = ( +/obj/machinery/status_display/evac/directional/south, +/turf/open/openspace, +/area/station/engineering/atmos/storage) "sPt" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/spawner/random/structure/steam_vent, @@ -58762,9 +60016,8 @@ }, /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/wood{ - icon_state = "wood-broken3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/maintenance/aft/greater) "sPK" = ( /obj/structure/table, @@ -58813,15 +60066,21 @@ /turf/open/floor/carpet, /area/station/service/chapel) "sQz" = ( -/obj/machinery/door/airlock/atmos{ - name = "Turbine Access" - }, /obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ dir = 4 }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, -/turf/open/floor/plating, -/area/station/maintenance/disposal/incinerator) +/obj/effect/turf_decal/trimline/dark_red/arrow_ccw{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/simple/pink/visible/layer5{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_green/arrow_ccw, +/obj/machinery/atmospherics/pipe/smart/simple/violet/visible/layer1{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "sQB" = ( /turf/closed/wall, /area/station/security/brig/upper) @@ -58832,10 +60091,6 @@ /turf/open/floor/iron, /area/station/hallway/primary/starboard) "sQI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment, -/obj/machinery/duct, -/obj/structure/cable, /obj/structure/sign/poster/official/random/directional/east, /turf/open/floor/iron, /area/station/hallway/secondary/service) @@ -58896,10 +60151,25 @@ /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ id = "rnd2"; - name = "Research Lab Shutters" + name = "Research Lab Shutters"; + dir = 8 }, /turf/open/floor/plating, /area/station/science/lab) +"sRK" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/pipe/smart/simple/pink/visible{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_red/line, +/obj/effect/turf_decal/trimline/dark_red/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/dark_blue/mid_joiner{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/mix) "sRP" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/warning/gas_mask, @@ -58910,7 +60180,7 @@ dir = 6 }, /turf/open/floor/iron, -/area/station/science/mixing) +/area/station/science/ordnance) "sSy" = ( /obj/structure/cable, /turf/open/floor/plating, @@ -58968,7 +60238,7 @@ dir = 1 }, /turf/open/floor/iron, -/area/station/science/mixing) +/area/station/science/ordnance) "sTO" = ( /obj/machinery/door/airlock{ name = "Unisex Restroom" @@ -59005,7 +60275,7 @@ "sUr" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, -/area/station/science/misc_lab) +/area/station/science/explab) "sUB" = ( /obj/effect/turf_decal/delivery, /obj/effect/turf_decal/stripes/line{ @@ -59016,7 +60286,8 @@ }, /obj/machinery/door/poddoor/shutters{ id = "Cargo_Store_In"; - name = "Cargo Warehouse Shutters" + name = "Cargo Warehouse Shutters"; + dir = 8 }, /obj/machinery/door/firedoor, /turf/open/floor/iron, @@ -59031,12 +60302,27 @@ }, /turf/open/floor/iron/smooth, /area/mine/eva) +"sUH" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/effect/turf_decal/siding/yellow/corner{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/hfr_room) "sUL" = ( /obj/structure/stairs/east, /obj/structure/railing, /obj/machinery/door/firedoor/border_only, /turf/open/floor/iron/white, -/area/station/science/mixing/hallway) +/area/station/science/ordnance) "sUN" = ( /obj/machinery/power/solar{ id = "starboardsolar"; @@ -59054,7 +60340,6 @@ /area/station/hallway/secondary/service) "sUR" = ( /obj/structure/table/optable, -/obj/machinery/light/directional/east, /obj/machinery/newscaster/directional/east, /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ @@ -59102,10 +60387,37 @@ /obj/machinery/power/apc/auto_name/directional/east, /turf/open/floor/iron/dark, /area/mine/eva/lower) +"sWc" = ( +/obj/machinery/atmospherics/pipe/smart/simple/violet/visible{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/trimline/dark_green/end{ + dir = 1 + }, +/obj/machinery/meter, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/mix) "sWj" = ( -/obj/structure/extinguisher_cabinet/directional/south, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/light/cold/directional/north, +/obj/structure/table, +/obj/structure/table, +/obj/structure/table, +/obj/item/food/grown/carrot{ + pixel_x = 6; + pixel_y = 7 + }, +/obj/item/food/grown/carrot{ + pixel_x = -6; + pixel_y = 10 + }, +/obj/item/food/meat/slab/synthmeat, +/turf/open/floor/plating/snowed/coldroom, +/area/station/service/kitchen/coldroom) "sWl" = ( /obj/machinery/door/airlock/command{ name = "Chief Medical Officer" @@ -59168,9 +60480,7 @@ /turf/open/floor/plating, /area/station/maintenance/fore/lesser) "sXp" = ( -/obj/structure/sign/warning/no_smoking/circle{ - pixel_x = -32 - }, +/obj/structure/sign/warning/no_smoking/circle/directional/west, /obj/machinery/light/directional/west, /obj/machinery/camera{ c_tag = "Medbay Mid-South"; @@ -59183,40 +60493,16 @@ /obj/structure/extinguisher_cabinet/directional/south, /turf/open/floor/iron/white, /area/station/medical/medbay/aft) -"sXr" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/door/window/left/directional/east{ - dir = 2; - name = "Kitchen Window"; - req_access = list("kitchen") - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "kitchen_counter"; - name = "Kitchen Shutters" - }, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "sXw" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, +/obj/structure/table/wood, +/obj/effect/turf_decal/tile/bar/opposingcorners, /obj/effect/turf_decal/siding/wood{ - dir = 8 + dir = 10 }, -/obj/structure/table/wood, /turf/open/floor/iron, /area/station/service/bar) "sXx" = ( -/obj/structure/sign/warning/electric_shock{ - pixel_x = 32 - }, +/obj/structure/sign/warning/electric_shock/directional/east, /obj/machinery/camera/directional/east{ c_tag = "Security - Brig Lower Hallway North"; network = list("ss13","prison") @@ -59310,6 +60596,12 @@ dir = 4 }, /area/station/service/chapel) +"sYN" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/sign/warning/secure_area/directional/south, +/obj/structure/sign/warning/cold_temp, +/turf/open/floor/plating, +/area/station/ai_monitored/turret_protected/aisat_interior) "sYR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -59334,9 +60626,7 @@ /turf/open/floor/iron/showroomfloor, /area/station/security/prison/work) "sZz" = ( -/obj/structure/sign/warning/electric_shock{ - pixel_y = -32 - }, +/obj/structure/sign/warning/electric_shock/directional/south, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/red/line, /obj/effect/turf_decal/trimline/red/line{ @@ -59346,9 +60636,8 @@ /area/station/security/range) "sZA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "sZD" = ( /obj/structure/disposalpipe/segment{ @@ -59414,7 +60703,7 @@ id = "testigniter" }, /turf/open/floor/engine, -/area/station/science/misc_lab) +/area/station/science/explab) "taK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -59452,12 +60741,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/atmos/pumproom) -"tbd" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron/grimy, -/area/station/ai_monitored/turret_protected/aisat_interior) "tbh" = ( /turf/open/floor/iron/half{ dir = 1 @@ -59480,13 +60763,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/station/command/teleporter) -"tbJ" = ( -/obj/structure/disposaloutlet, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/turf/open/floor/plating/snowed/icemoon, -/area/icemoon/surface/outdoors/nospawn) "tbL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -59513,11 +60789,11 @@ /obj/machinery/light/directional/east, /obj/effect/turf_decal/tile/red/full, /obj/machinery/requests_console/directional/east{ + anon_tips_receiver = 1; + assistance_requestable = 1; department = "Security"; departmentType = 5; - name = "Security Requests Console"; - assistance_requestable = 1; - anon_tips_receiver = 1 + name = "Security Requests Console" }, /turf/open/floor/iron/dark/smooth_large, /area/station/security/checkpoint/medical) @@ -59601,6 +60877,11 @@ /obj/structure/fence, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/icemoon/underground/explored) +"tem" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/trimline/dark_blue/line, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/mix) "teN" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -59657,7 +60938,7 @@ /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/south, /turf/open/floor/iron/smooth, -/area/station/security/prison) +/area/station/security/execution/transfer) "tfM" = ( /obj/structure/chair/office/light{ dir = 1 @@ -59720,6 +61001,9 @@ }, /turf/open/openspace, /area/station/science/xenobiology) +"tgy" = ( +/turf/open/openspace, +/area/station/engineering/atmos/storage) "tgA" = ( /obj/machinery/holopad, /obj/structure/cable, @@ -59743,6 +61027,21 @@ /obj/effect/spawner/random/structure/steam_vent, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"thd" = ( +/obj/machinery/atmospherics/components/binary/pump/off{ + dir = 1; + name = "Infiltrate to Exfiltrate" + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/loading_area{ + color = "#439C1E"; + dir = 1 + }, +/obj/effect/turf_decal/trimline/dark_red/warning{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/mix) "thK" = ( /obj/item/screwdriver{ pixel_y = 10 @@ -59786,9 +61085,8 @@ /turf/open/floor/plating, /area/station/maintenance/department/chapel) "tiz" = ( -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/upper) "tiF" = ( /obj/structure/chair/stool/directional/west, @@ -59892,7 +61190,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/science/ordnance, /turf/open/floor/engine, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "tjC" = ( /obj/machinery/airalarm/directional/south, /obj/effect/turf_decal/tile/red/half/contrasted, @@ -60113,6 +61411,14 @@ /obj/structure/cable, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/surface/outdoors/nospawn) +"tna" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/trimline/dark_blue/line{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/mix) "tnb" = ( /obj/structure/rack, /turf/open/floor/plating, @@ -60213,6 +61519,10 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/hallway/secondary/exit/departure_lounge) +"tpi" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, +/turf/open/floor/iron, +/area/station/engineering/atmos) "tpj" = ( /obj/effect/turf_decal/tile/red/half/contrasted, /obj/machinery/firealarm/directional/south, @@ -60244,13 +61554,10 @@ /turf/open/floor/wood, /area/station/security/courtroom) "tpO" = ( -/obj/structure/chair{ - dir = 4 - }, /obj/effect/turf_decal/siding/white{ dir = 8 }, -/obj/effect/landmark/start/hangover, +/obj/structure/disposalpipe/segment, /turf/open/floor/iron/white/smooth_large, /area/station/service/kitchen/diner) "tpU" = ( @@ -60321,7 +61628,18 @@ /turf/open/floor/iron/white/side{ dir = 4 }, -/area/station/science/misc_lab) +/area/station/science/explab) +"trE" = ( +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/machinery/airalarm/directional/east, +/obj/structure/sink/kitchen{ + dir = 8; + pixel_x = 14 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) "trG" = ( /obj/structure/window/reinforced{ dir = 8 @@ -60504,19 +61822,22 @@ /area/station/science/lab) "ttE" = ( /obj/machinery/light/directional/south, -/obj/structure/sign/warning/test_chamber{ - pixel_y = -32 - }, +/obj/structure/sign/warning/test_chamber/directional/south, /turf/open/floor/engine, /area/station/science/genetics) -"ttH" = ( -/obj/effect/turf_decal/tile/red/full, -/obj/structure/chair{ - dir = 1 +"ttK" = ( +/obj/structure/table/reinforced, +/obj/item/stack/sheet/glass/fifty{ + pixel_x = 2; + pixel_y = 0 }, -/obj/effect/turf_decal/siding/white, -/turf/open/floor/iron/large, -/area/station/service/kitchen/diner) +/obj/item/stack/sheet/iron/fifty, +/obj/item/stack/cable_coil{ + pixel_x = -3; + pixel_y = 3 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/hfr_room) "ttL" = ( /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -60613,7 +61934,7 @@ /obj/machinery/door/airlock/mining/glass{ name = "Delivery Office" }, -/obj/effect/mapping_helpers/airlock/access/all/supply/mail_sorting, +/obj/effect/mapping_helpers/airlock/access/all/supply/shipping, /turf/open/floor/iron, /area/station/cargo/sorting) "tuU" = ( @@ -60927,12 +62248,6 @@ /turf/open/floor/iron, /area/station/hallway/primary/central) "tAa" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -60940,6 +62255,9 @@ dir = 4 }, /obj/machinery/power/apc/auto_name/directional/north, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, /turf/open/floor/iron, /area/station/engineering/main) "tAe" = ( @@ -60982,6 +62300,11 @@ dir = 4 }, /area/station/service/chapel) +"tAN" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/machinery/status_display/evac/directional/east, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/project) "tAR" = ( /obj/machinery/camera/directional/south{ c_tag = "Port Hallway 3" @@ -61286,9 +62609,7 @@ /turf/open/floor/iron, /area/station/cargo/storage) "tEV" = ( -/obj/structure/sign/departments/court{ - pixel_y = 32 - }, +/obj/structure/sign/departments/court/directional/north, /turf/open/openspace, /area/station/hallway/primary/fore) "tEZ" = ( @@ -61320,7 +62641,7 @@ sortType = 25 }, /turf/open/floor/iron, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "tFP" = ( /obj/structure/closet/crate, /obj/machinery/light/small/directional/east, @@ -61338,6 +62659,12 @@ /obj/machinery/duct, /turf/open/floor/iron, /area/station/service/hydroponics) +"tGc" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark/textured, +/area/station/security/execution/transfer) "tGi" = ( /obj/effect/turf_decal/stripes/end, /obj/machinery/door/airlock/external, @@ -61411,9 +62738,8 @@ /turf/open/floor/plating, /area/mine/laborcamp) "tGS" = ( -/obj/structure/sign/warning/gas_mask{ - desc = "A sign that warns of dangerous gasses in the air, instructing you to wear internals."; - pixel_y = -32 +/obj/structure/sign/warning/gas_mask/directional/south{ + desc = "A sign that warns of dangerous gasses in the air, instructing you to wear internals." }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, @@ -61445,15 +62771,15 @@ /turf/open/floor/iron/white, /area/station/medical/treatment_center) "tHy" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 +/obj/structure/cable, +/obj/machinery/duct, +/obj/structure/disposalpipe/junction/yjunction{ + dir = 8 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) "tHN" = ( /obj/structure/window/reinforced, @@ -61488,6 +62814,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/showroomfloor, /area/station/security/processing) +"tIo" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/machinery/status_display/ai/directional/west, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/project) "tIu" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 4 @@ -61503,9 +62834,8 @@ /area/station/medical/virology) "tIR" = ( /obj/structure/grille/broken, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) "tIS" = ( /obj/effect/turf_decal/trimline/red/filled/line{ @@ -61534,9 +62864,7 @@ /area/station/science/xenobiology) "tJs" = ( /obj/structure/disposalpipe/segment, -/obj/structure/sign/warning/secure_area{ - pixel_x = -32 - }, +/obj/structure/sign/warning/secure_area/directional/west, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -61560,7 +62888,7 @@ pixel_y = 7 }, /turf/open/floor/iron/dark, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "tJD" = ( /obj/effect/turf_decal/weather/snow/corner{ dir = 5 @@ -61695,7 +63023,7 @@ "tLA" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating/icemoon, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "tLF" = ( /turf/closed/wall, /area/station/hallway/primary/starboard) @@ -61756,7 +63084,7 @@ /turf/open/floor/iron/cafeteria{ dir = 8 }, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "tMO" = ( /turf/closed/wall, /area/station/medical/break_room) @@ -61841,9 +63169,8 @@ /area/station/hallway/secondary/entry) "tPw" = ( /obj/structure/grille, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "tPz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -61887,7 +63214,7 @@ "tPV" = ( /obj/machinery/modular_computer/console/preset/civilian, /turf/open/floor/iron/dark, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "tPW" = ( /obj/machinery/door/airlock/security/glass{ name = "Secure Walkway" @@ -61913,6 +63240,13 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/medical/storage) +"tQw" = ( +/obj/structure/table/reinforced, +/obj/item/pipe_dispenser, +/obj/item/multitool, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/hfr_room) "tQJ" = ( /obj/machinery/modular_computer/console/preset/civilian, /turf/open/floor/iron/white, @@ -61950,9 +63284,7 @@ /turf/open/floor/wood, /area/station/service/library) "tRF" = ( -/obj/structure/sign/warning/no_smoking{ - pixel_x = 32 - }, +/obj/structure/sign/warning/no_smoking/directional/east, /turf/open/floor/iron/white/side{ dir = 10 }, @@ -62051,6 +63383,12 @@ }, /turf/open/floor/plating, /area/station/security/checkpoint/medical) +"tTh" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "tTw" = ( /obj/structure/stairs/east, /obj/structure/railing, @@ -62060,6 +63398,7 @@ /obj/machinery/atmospherics/pipe/layer_manifold/dark/visible{ dir = 8 }, +/obj/machinery/atmospherics/pipe/bridge_pipe/yellow/visible, /turf/open/floor/iron, /area/station/engineering/atmos) "tTL" = ( @@ -62145,6 +63484,20 @@ }, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) +"tVa" = ( +/obj/effect/turf_decal/siding/white, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white/smooth_large, +/area/station/service/kitchen/diner) +"tVb" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/status_display/evac/directional/west, +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/hfr_room) "tVf" = ( /turf/closed/wall, /area/station/security/prison) @@ -62211,6 +63564,13 @@ }, /turf/open/floor/iron/dark/textured, /area/station/security/range) +"tWr" = ( +/obj/effect/turf_decal/arrows/white, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, +/area/station/engineering/atmos/hfr_room) "tWK" = ( /obj/structure/cable, /turf/open/floor/plating/snowed/icemoon, @@ -62253,9 +63613,7 @@ }, /obj/effect/turf_decal/trimline/blue/filled/end, /obj/structure/window/reinforced, -/obj/structure/sign/warning/no_smoking/circle{ - pixel_x = -32 - }, +/obj/structure/sign/warning/no_smoking/circle/directional/west, /obj/structure/disposalpipe/segment, /obj/machinery/light/directional/west, /turf/open/floor/iron/large, @@ -62306,11 +63664,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/commons/fitness) -"tXF" = ( -/turf/open/floor/wood{ - icon_state = "wood-broken6" - }, -/area/station/service/library) "tXV" = ( /obj/machinery/airalarm/directional/north, /obj/machinery/camera/directional/north{ @@ -62344,9 +63697,8 @@ /obj/structure/table/wood, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood{ - icon_state = "wood-broken" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/security/prison/rec) "tYm" = ( /obj/structure/rack, @@ -62413,6 +63765,9 @@ /obj/structure/cable, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/surface/outdoors/nospawn) +"tZj" = ( +/turf/closed/wall, +/area/station/security/execution/transfer) "tZm" = ( /obj/effect/turf_decal/trimline/blue/filled/line, /turf/open/floor/iron/white, @@ -62478,11 +63833,12 @@ /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ id = "rnd2"; - name = "Research Lab Shutters" + name = "Research Lab Shutters"; + dir = 8 }, /obj/machinery/door/firedoor/heavy, /turf/open/floor/plating, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "uaP" = ( /obj/machinery/power/apc/auto_name/directional/south, /obj/structure/cable, @@ -62519,18 +63875,24 @@ "ubY" = ( /obj/machinery/requests_console/directional/east{ announcementConsole = 1; + anon_tips_receiver = 1; + assistance_requestable = 1; department = "Telecomms Admin"; departmentType = 5; - name = "Telecomms Requests Console"; - anon_tips_receiver = 1; - assistance_requestable = 1 + name = "Telecomms Requests Console" }, /turf/open/floor/iron, /area/station/tcommsat/computer) "ubZ" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/engineering/atmos/project) +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/extinguisher_cabinet/directional/south, +/obj/machinery/atmospherics/components/binary/valve/digital/on{ + dir = 4; + name = "Infiltrate Control" + }, +/obj/effect/turf_decal/trimline/dark_green/arrow_ccw, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/storage) "ucl" = ( /obj/machinery/door/window/left/directional/north{ base_state = "right"; @@ -62700,6 +64062,11 @@ dir = 1 }, /area/mine/eva/lower) +"ueK" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/sign/warning/secure_area/directional/south, +/turf/open/floor/plating, +/area/station/ai_monitored/turret_protected/aisat_interior) "ueN" = ( /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -62834,9 +64201,6 @@ /obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) -"uhR" = ( -/turf/open/floor/iron/freezer, -/area/station/service/kitchen/coldroom) "uif" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -62910,7 +64274,10 @@ /obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ dir = 4 }, -/obj/machinery/atmospherics/pipe/bridge_pipe/yellow/visible, +/obj/machinery/atmospherics/components/binary/pump/off{ + dir = 1; + name = "O2 To Pure" + }, /turf/open/floor/iron, /area/station/engineering/atmos) "uiT" = ( @@ -62934,6 +64301,23 @@ }, /turf/open/floor/wood, /area/station/maintenance/port/aft) +"ujk" = ( +/obj/machinery/door/airlock/atmos/glass{ + name = "Turbine Access" + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/firedoor/heavy, +/obj/structure/disposalpipe/segment, +/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible, +/obj/effect/turf_decal/trimline/dark_red/arrow_ccw{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/simple/pink/visible/layer5, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) "ujp" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, /turf/open/floor/engine, @@ -63079,6 +64463,11 @@ /obj/structure/cable, /turf/open/floor/carpet/blue, /area/station/security/prison/work) +"ulp" = ( +/obj/machinery/light/directional/east, +/obj/structure/sign/warning/fire/directional/north, +/turf/open/floor/glass/reinforced, +/area/station/science/ordnance/office) "ult" = ( /turf/closed/wall/r_wall, /area/station/science/robotics/lab) @@ -63124,6 +64513,16 @@ /obj/effect/turf_decal/tile/purple, /turf/open/floor/iron, /area/mine/living_quarters) +"umq" = ( +/obj/machinery/door/airlock/hatch{ + name = "MiniSat Teleporter" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/access/any/command/minisat, +/obj/effect/mapping_helpers/airlock/access/any/command/ai_upload, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat_interior) "umr" = ( /obj/structure/table, /obj/item/storage/toolbox/mechanical{ @@ -63252,7 +64651,9 @@ /area/station/cargo/office) "uof" = ( /obj/item/cigbutt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, +/obj/machinery/atmospherics/pipe/smart/manifold/general/visible{ + dir = 4 + }, /turf/open/floor/iron, /area/station/engineering/atmos) "uog" = ( @@ -63383,6 +64784,17 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) +"uql" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/pipe/smart/simple/pink/visible{ + dir = 8 + }, +/obj/machinery/meter, +/obj/effect/turf_decal/trimline/dark_red/arrow_ccw{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/storage) "uqG" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -63522,7 +64934,7 @@ desc = "A wall impregnated with Fixium, able to withstand massive explosions with ease"; name = "hyper-reinforced wall" }, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "uub" = ( /obj/machinery/atmospherics/components/binary/pump{ name = "Port to Fuel Pipe" @@ -63617,7 +65029,7 @@ dir = 8 }, /turf/open/floor/iron/white, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "uwb" = ( /obj/effect/landmark/blobstart, /obj/effect/turf_decal/stripes/line{ @@ -63671,23 +65083,21 @@ "uwP" = ( /obj/machinery/requests_console/directional/north{ announcementConsole = 1; + anon_tips_receiver = 1; + assistance_requestable = 1; department = "Research Director's Desk"; departmentType = 5; name = "Research Director's Requests Console"; - receive_ore_updates = 1; - assistance_requestable = 1; - anon_tips_receiver = 1 + receive_ore_updates = 1 }, /obj/machinery/pdapainter/research, /turf/open/floor/iron/cafeteria, /area/station/command/heads_quarters/rd) -"uwX" = ( -/turf/closed/wall/r_wall, -/area/station/maintenance/port/greater) "uwY" = ( /obj/machinery/door/poddoor/shutters/preopen{ id = "Lakeview_Bathroom"; - name = "Privacy Shutters" + name = "Privacy Shutters"; + dir = 8 }, /obj/effect/spawner/structure/window/hollow/reinforced/middle{ dir = 4 @@ -63736,9 +65146,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 1 - }, +/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance/departmental, /obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) @@ -63753,11 +65162,10 @@ /turf/open/floor/iron/dark/textured, /area/station/security/range) "uyp" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/decal/cleanable/dirt/dust, -/obj/machinery/duct, -/turf/open/floor/iron/freezer, -/area/station/service/kitchen/coldroom) +/obj/effect/turf_decal/siding/white, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white/smooth_large, +/area/station/service/kitchen/diner) "uyq" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -63787,7 +65195,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /turf/open/floor/iron/white, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "uyF" = ( /obj/machinery/newscaster/directional/south, /obj/effect/turf_decal/tile/blue, @@ -63884,6 +65292,7 @@ /obj/machinery/camera/directional/north{ c_tag = "Service-Hallway Bottom 2" }, +/obj/machinery/firealarm/directional/north, /turf/open/floor/iron, /area/station/hallway/secondary/service) "uAJ" = ( @@ -63901,11 +65310,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/engineering/atmos) -"uAN" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, -/area/station/maintenance/port/fore) "uBt" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -63935,15 +65339,12 @@ /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{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/department/chapel) "uBF" = ( /obj/machinery/light/directional/south, -/obj/structure/sign/warning/chem_diamond{ - pixel_y = -32 - }, +/obj/structure/sign/warning/chem_diamond/directional/south, /obj/effect/turf_decal/trimline/yellow/filled/line, /turf/open/floor/iron/white, /area/station/medical/treatment_center) @@ -63961,15 +65362,16 @@ /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) "uBU" = ( -/obj/effect/turf_decal/siding/white{ - dir = 6 - }, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 1 +/obj/machinery/button/door/directional/north{ + pixel_y = 24; + pixel_x = -25; + name = "Kitchen Lockdown"; + req_access = list("kitchen"); + id = "kitchencounter" }, -/turf/open/floor/iron/white/smooth_large, -/area/station/service/kitchen/diner) +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) "uCe" = ( /obj/effect/turf_decal/trimline/green/filled/corner{ dir = 1 @@ -64068,9 +65470,8 @@ /area/station/cargo/office) "uDx" = ( /obj/structure/closet/firecloset, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/department/chapel) "uDE" = ( /obj/structure/table, @@ -64161,6 +65562,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible, /turf/open/floor/iron, /area/station/engineering/atmos/pumproom) +"uFe" = ( +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/plating/snowed/coldroom, +/area/station/service/kitchen/coldroom) "uFf" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -64176,20 +65584,16 @@ /area/station/ai_monitored/turret_protected/ai) "uFw" = ( /obj/machinery/door/airlock/external, -/obj/structure/sign/warning/gas_mask{ - desc = "A sign that warns of dangerous gasses in the air, instructing you to wear internals."; - pixel_y = -32 - }, -/obj/structure/sign/warning/cold_temp{ - pixel_y = 32 +/obj/structure/sign/warning/gas_mask/directional/south{ + desc = "A sign that warns of dangerous gasses in the air, instructing you to wear internals." }, +/obj/structure/sign/warning/cold_temp/directional/north, /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ cycle_id = "chem-morgue-airlock" }, /obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/medical/morgue) "uFx" = ( /obj/machinery/light/small/directional/east, @@ -64238,9 +65642,8 @@ /area/station/hallway/primary/aft) "uFU" = ( /obj/machinery/computer/security/telescreen/entertainment/directional/south, -/turf/open/floor/wood{ - icon_state = "wood-broken6" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/maintenance/port/aft) "uFW" = ( /obj/effect/turf_decal/tile/bar{ @@ -64264,7 +65667,7 @@ dir = 10 }, /turf/open/floor/plating/icemoon, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "uGo" = ( /obj/structure/disposaloutlet{ dir = 8 @@ -64295,6 +65698,15 @@ }, /turf/open/floor/iron/white, /area/station/medical/surgery/fore) +"uGL" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/dark_blue/line{ + dir = 4 + }, +/obj/machinery/holopad, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/mix) "uGT" = ( /obj/machinery/light/directional/east, /obj/item/radio/intercom/directional/east, @@ -64304,14 +65716,9 @@ /turf/open/floor/iron/dark/smooth_large, /area/station/engineering/main) "uGZ" = ( -/obj/effect/turf_decal/tile/red/full, -/obj/effect/turf_decal/siding/white{ - dir = 4 - }, -/obj/effect/landmark/start/hangover, -/obj/structure/chair/stool/bar/directional/east, -/turf/open/floor/iron/large, -/area/station/service/kitchen/diner) +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) "uHa" = ( /obj/effect/turf_decal/siding/wood, /obj/structure/cable, @@ -64346,13 +65753,13 @@ /turf/open/floor/iron, /area/station/security/prison/visit) "uHO" = ( +/obj/effect/turf_decal/siding/white{ + dir = 8 + }, /obj/structure/chair{ dir = 1 }, -/obj/effect/turf_decal/siding/white{ - dir = 10 - }, -/obj/effect/landmark/start/hangover, +/obj/machinery/light/directional/west, /turf/open/floor/iron/white/smooth_large, /area/station/service/kitchen/diner) "uHS" = ( @@ -64453,16 +65860,12 @@ "uIX" = ( /obj/machinery/space_heater, /obj/machinery/light/small/directional/north, -/turf/open/floor/wood{ - icon_state = "wood-broken2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/maintenance/fore/lesser) "uJj" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, /obj/machinery/duct, +/obj/effect/turf_decal/tile/bar/opposingcorners, /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/service/bar) @@ -64487,10 +65890,20 @@ /obj/effect/decal/cleanable/dirt, /turf/closed/wall, /area/station/maintenance/starboard/aft) +"uJL" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/railing/corner{ + dir = 8 + }, +/turf/open/openspace, +/area/station/engineering/atmos/storage) "uJX" = ( /obj/effect/turf_decal/tile/red/half, /obj/structure/closet/firecloset, -/obj/item/radio/intercom/prison/directional/north, +/obj/item/radio/intercom/directional/north, /turf/open/floor/iron/smooth_half, /area/station/security/brig/upper) "uJZ" = ( @@ -64520,7 +65933,7 @@ pixel_x = 24 }, /turf/open/floor/iron/dark, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "uKj" = ( /obj/machinery/portable_atmospherics/canister/anesthetic_mix, /obj/machinery/atmospherics/components/unary/portables_connector/visible{ @@ -64597,6 +66010,15 @@ /obj/effect/spawner/structure/window/reinforced/plasma, /turf/open/floor/plating, /area/station/engineering/supermatter) +"uLl" = ( +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/hfr_room) "uLo" = ( /obj/structure/table, /obj/item/clothing/glasses/meson, @@ -64639,7 +66061,7 @@ /obj/machinery/atmospherics/components/unary/portables_connector/visible, /obj/effect/turf_decal/box, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance/office) "uMq" = ( /obj/structure/sign/warning/cold_temp{ pixel_x = -29 @@ -64671,11 +66093,16 @@ "uMK" = ( /turf/open/floor/iron/cafeteria, /area/station/command/heads_quarters/rd) +"uMN" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/engine, +/area/station/engineering/atmos/hfr_room) "uNa" = ( /obj/structure/sign/barsign{ pixel_y = -32 }, -/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/wood/parquet, /area/station/commons/lounge) "uNq" = ( @@ -64698,6 +66125,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/status_display/supply{ + pixel_y = -32 + }, /turf/open/floor/plating, /area/station/cargo/storage) "uNt" = ( @@ -64714,12 +66144,21 @@ /turf/open/floor/iron/large, /area/station/engineering/storage) "uNC" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 9 +/obj/machinery/door/airlock{ + name = "Kitchen Access" }, -/obj/machinery/gibber, -/turf/open/floor/iron/freezer, -/area/station/service/kitchen/coldroom) +/obj/effect/mapping_helpers/airlock/access/all/service/kitchen, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "kitchencounter"; + name = "Kitchen Shutters"; + dir = 1 + }, +/obj/machinery/duct, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) "uNG" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -64735,6 +66174,17 @@ /obj/item/storage/medkit/regular, /turf/open/floor/iron, /area/station/commons/storage/primary) +"uOa" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/sign/warning/radiation/rad_area/directional/south, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/morgue) "uOb" = ( /turf/closed/wall/r_wall, /area/station/security/prison/toilet) @@ -64767,9 +66217,8 @@ /area/station/command/gateway) "uOm" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) "uOn" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -64899,17 +66348,18 @@ /turf/open/floor/iron/textured, /area/station/security/brig) "uQH" = ( -/obj/machinery/door/airlock/atmos{ - name = "Turbine Access" - }, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/firedoor/heavy, -/obj/structure/disposalpipe/segment, -/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, +/obj/effect/turf_decal/trimline/dark_red/arrow_ccw{ + dir = 8 + }, +/obj/structure/railing{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/simple/pink/visible/layer5, /turf/open/floor/iron, -/area/station/engineering/atmos/project) +/area/station/engineering/atmos/storage) "uQK" = ( /obj/effect/decal/cleanable/generic, /turf/open/floor/plating, @@ -64942,9 +66392,8 @@ /obj/structure/disposalpipe/trunk/multiz{ dir = 4 }, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/medical/chemistry) "uRi" = ( /obj/structure/cable, @@ -65004,7 +66453,16 @@ dir = 1 }, /turf/open/floor/engine, -/area/station/science/misc_lab) +/area/station/science/explab) +"uSE" = ( +/obj/structure/table/reinforced, +/obj/item/hfr_box/body/fuel_input, +/obj/item/hfr_box/body/interface{ + pixel_x = 6; + pixel_y = 9 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/hfr_room) "uSU" = ( /obj/structure/closet/wardrobe/grey, /obj/effect/turf_decal/tile/yellow, @@ -65030,19 +66488,9 @@ /obj/structure/sign/poster/official/random/directional/south, /turf/open/floor/iron/white, /area/station/science/robotics/lab) -"uTW" = ( -/obj/effect/turf_decal/tile/red/full, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/spawner/random/engineering/tracking_beacon, -/turf/open/floor/iron/large, -/area/station/service/kitchen/diner) "uUi" = ( -/obj/structure/sign/warning/gas_mask{ - desc = "A sign that warns of dangerous gasses in the air, instructing you to wear internals."; - pixel_y = -32 +/obj/structure/sign/warning/gas_mask/directional/south{ + desc = "A sign that warns of dangerous gasses in the air, instructing you to wear internals." }, /obj/effect/spawner/structure/window/hollow/reinforced/end{ dir = 1 @@ -65060,6 +66508,16 @@ }, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/surface/outdoors/nospawn) +"uUM" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/pipe/layer_manifold/general/visible{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/dark_blue/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/mix) "uUT" = ( /turf/closed/wall, /area/mine/mechbay) @@ -65116,7 +66574,6 @@ name = "Atmospherics Internal Airlock" }, /obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, /obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, /turf/open/floor/plating, /area/station/engineering/atmos) @@ -65125,11 +66582,11 @@ dir = 1 }, /obj/machinery/requests_console/directional/south{ + anon_tips_receiver = 1; + assistance_requestable = 1; department = "Security"; departmentType = 5; - name = "Security Requests Console"; - anon_tips_receiver = 1; - assistance_requestable = 1 + name = "Security Requests Console" }, /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ @@ -65137,12 +66594,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/checkpoint/science) -"uWc" = ( -/obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, -/area/station/maintenance/fore/lesser) "uWn" = ( /obj/effect/decal/cleanable/dirt, /turf/closed/wall/r_wall, @@ -65280,7 +66731,7 @@ }, /obj/machinery/meter, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "uYB" = ( /obj/effect/turf_decal/trimline/blue/filled/corner, /obj/structure/cable, @@ -65289,10 +66740,6 @@ /turf/open/floor/iron/white, /area/station/medical/medbay/aft) "uYL" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, /obj/structure/displaycase/forsale/kitchen{ pixel_y = 8 }, @@ -65300,6 +66747,7 @@ dir = 1 }, /obj/structure/table/wood, +/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/service/bar) "uYN" = ( @@ -65310,9 +66758,8 @@ /obj/effect/turf_decal/tile/yellow{ dir = 4 }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "CO2 to Pure" +/obj/machinery/atmospherics/pipe/layer_manifold/general/visible{ + dir = 4 }, /turf/open/floor/iron, /area/station/engineering/atmos) @@ -65385,9 +66832,19 @@ /turf/open/floor/iron/smooth, /area/station/maintenance/starboard/fore) "uZN" = ( -/obj/effect/landmark/start/cook, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/airlock, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/crew_quarters/bar) "uZP" = ( /obj/structure/chair/wood{ dir = 8 @@ -65565,8 +67022,13 @@ /turf/open/floor/iron, /area/station/security/brig/upper) "vdh" = ( -/turf/open/floor/iron, -/area/station/engineering/atmos/project) +/obj/structure/lattice/catwalk, +/obj/structure/railing, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/openspace, +/area/station/engineering/atmos/storage) "vdi" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -65604,7 +67066,7 @@ "vdS" = ( /obj/machinery/light/small/directional/east, /turf/open/floor/engine/vacuum, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "vdX" = ( /obj/effect/spawner/random/structure/steam_vent, /turf/open/floor/plating, @@ -65779,7 +67241,6 @@ /area/mine/eva) "vgP" = ( /obj/structure/table/optable, -/obj/machinery/light/directional/east, /obj/machinery/newscaster/directional/east, /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ @@ -65806,11 +67267,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) -"vhb" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, -/area/station/maintenance/port/aft) "vhm" = ( /obj/structure/sign/poster/random/directional/west, /obj/machinery/firealarm/directional/north, @@ -65818,9 +67274,7 @@ /area/station/service/chapel) "vhq" = ( /obj/structure/sign/poster/random/directional/west, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/turf/closed/wall/r_wall, /area/station/maintenance/aft/lesser) "vhs" = ( /obj/structure/railing, @@ -65944,7 +67398,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/science/ordnance, /turf/open/floor/iron/white, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "viW" = ( /obj/effect/turf_decal/tile/dark{ dir = 8 @@ -65979,6 +67433,16 @@ /obj/effect/turf_decal/tile/yellow, /turf/open/floor/iron/white, /area/station/medical/chemistry) +"vjU" = ( +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/effect/turf_decal/stripes/white/corner{ + dir = 1 + }, +/obj/structure/closet/chefcloset, +/turf/open/floor/plating, +/area/station/service/kitchen/coldroom) "vjW" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -65990,6 +67454,16 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/maintenance/aft/greater) +"vkb" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "vkg" = ( /obj/machinery/hydroponics/constructable, /obj/effect/turf_decal/trimline/green/filled/line, @@ -66177,9 +67651,7 @@ /turf/open/floor/iron/freezer, /area/station/commons/toilet) "vmr" = ( -/obj/structure/musician/piano{ - icon_state = "piano" - }, +/obj/structure/musician/piano, /turf/open/floor/wood, /area/station/maintenance/port/aft) "vms" = ( @@ -66247,7 +67719,7 @@ dir = 8 }, /turf/open/openspace, -/area/station/science/mixing) +/area/station/science/ordnance/office) "vnc" = ( /obj/effect/turf_decal/tile/brown{ dir = 4 @@ -66344,10 +67816,15 @@ dir = 4 }, /obj/structure/tank_holder/extinguisher, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/department/medical/central) +"voo" = ( +/obj/effect/turf_decal/box/white{ + color = "#52B4E9" + }, +/turf/open/floor/engine, +/area/station/engineering/atmos/hfr_room) "vos" = ( /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ @@ -66359,11 +67836,6 @@ /obj/item/stack/medical/bone_gel, /turf/open/floor/iron/white, /area/station/medical/surgery/fore) -"voF" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, -/area/station/maintenance/port/fore) "voK" = ( /turf/closed/wall/r_wall, /area/station/tcommsat/computer) @@ -66429,7 +67901,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, -/area/station/science/misc_lab) +/area/station/science/explab) "vqx" = ( /obj/effect/turf_decal/tile/dark{ dir = 1 @@ -66524,6 +67996,15 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/hallway/primary/central) +"vse" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) "vsF" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -66575,9 +68056,8 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/structure/sign/warning/gas_mask{ - desc = "A sign that warns of dangerous gasses in the air, instructing you to wear internals."; - pixel_y = -32 +/obj/structure/sign/warning/gas_mask/directional/south{ + desc = "A sign that warns of dangerous gasses in the air, instructing you to wear internals." }, /turf/open/floor/iron, /area/station/cargo/drone_bay) @@ -66607,13 +68087,19 @@ /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ dir = 10 }, +/obj/machinery/atmospherics/pipe/smart/simple/pink/visible/layer5{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/violet/visible/layer1{ + dir = 4 + }, /turf/open/floor/iron, /area/station/engineering/atmos) "vum" = ( /obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/bookcase/random, +/turf/open/floor/plating, /area/station/maintenance/aft/greater) "vur" = ( /obj/machinery/modular_computer/console/preset/id{ @@ -66625,10 +68111,10 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/requests_console/directional/west{ announcementConsole = 1; + assistance_requestable = 1; department = "Chief Engineer's Desk"; departmentType = 3; name = "Chief Engineer's Requests Console"; - assistance_requestable = 1; supplies_requestable = 1 }, /turf/open/floor/iron/dark, @@ -66658,6 +68144,18 @@ /obj/effect/turf_decal/trimline/yellow/filled/line, /turf/open/floor/iron/white, /area/station/medical/treatment_center) +"vuY" = ( +/obj/structure/table, +/obj/item/stack/sheet/iron/fifty{ + pixel_x = -2; + pixel_y = 2 + }, +/obj/item/stack/sheet/plasteel/twenty{ + pixel_x = 3; + pixel_y = -2 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage) "vvc" = ( /obj/structure/cable, /turf/open/floor/iron/smooth_half, @@ -66691,12 +68189,13 @@ /turf/open/floor/iron, /area/station/hallway/primary/fore) "vvr" = ( -/obj/structure/chair{ - dir = 8 - }, /obj/effect/turf_decal/tile/red/full, -/obj/effect/turf_decal/siding/white{ - dir = 4 +/obj/structure/table, +/obj/item/reagent_containers/food/condiment/saltshaker{ + pixel_x = -3 + }, +/obj/item/reagent_containers/food/condiment/peppermill{ + pixel_x = 3 }, /turf/open/floor/iron/large, /area/station/service/kitchen/diner) @@ -66725,9 +68224,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/structure/sign/warning/cold_temp{ - pixel_y = 32 - }, +/obj/structure/sign/warning/cold_temp/directional/north, /obj/effect/mapping_helpers/airlock/access/all/supply/mining, /turf/open/floor/iron/large, /area/mine/mechbay) @@ -66941,8 +68438,12 @@ /obj/item/computer_hardware/hard_drive/portable{ pixel_x = -2 }, +/obj/item/computer_hardware/hard_drive/portable/scipaper_program{ + pixel_x = -5; + pixel_y = 6 + }, /turf/open/floor/iron/dark, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "vyU" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple, /turf/open/misc/asteroid/snow/icemoon, @@ -67020,10 +68521,10 @@ /obj/structure/cable, /obj/machinery/light/dim/directional/south, /obj/machinery/requests_console/directional/south{ + assistance_requestable = 1; department = "Medbay"; departmentType = 1; - name = "Medbay Requests Console"; - assistance_requestable = 1 + name = "Medbay Requests Console" }, /turf/open/floor/iron/white, /area/station/medical/cryo) @@ -67096,7 +68597,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /turf/open/floor/iron, -/area/station/science/mixing) +/area/station/science/ordnance) "vAO" = ( /obj/structure/table, /obj/item/stock_parts/cell/high, @@ -67106,7 +68607,7 @@ /turf/open/floor/iron/white/corner{ dir = 4 }, -/area/station/science/misc_lab) +/area/station/science/explab) "vAT" = ( /obj/effect/turf_decal/tile/brown{ dir = 1 @@ -67158,6 +68659,15 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/engineering/supermatter/room) +"vBo" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/simple/pink/visible/layer5{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "vBv" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ dir = 9 @@ -67192,11 +68702,9 @@ /turf/open/floor/iron, /area/station/security/prison/mess) "vCr" = ( -/obj/effect/turf_decal/tile/red/full, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/large, +/obj/effect/turf_decal/siding/white, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/white/smooth_large, /area/station/service/kitchen/diner) "vCz" = ( /obj/effect/landmark/start/medical_doctor, @@ -67266,14 +68774,14 @@ /turf/open/floor/iron/dark/smooth_large, /area/station/science/breakroom) "vDn" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, /obj/effect/turf_decal/siding/wood{ dir = 1 }, /obj/structure/table/wood, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/structure/desk_bell{ + pixel_y = 10 + }, /turf/open/floor/iron, /area/station/service/bar) "vDu" = ( @@ -67300,10 +68808,6 @@ }, /turf/open/floor/iron, /area/mine/laborcamp) -"vDK" = ( -/obj/machinery/holopad, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "vDS" = ( /obj/machinery/computer/department_orders/security{ dir = 4 @@ -67324,24 +68828,6 @@ }, /turf/open/floor/iron, /area/station/commons/fitness) -"vEo" = ( -/obj/structure/sign/warning/secure_area{ - pixel_x = -32 - }, -/obj/machinery/porta_turret/ai{ - dir = 4 - }, -/obj/item/radio/intercom/directional/south{ - freerange = 1; - frequency = 1447; - listening = 0; - name = "Private Channel" - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) "vEu" = ( /obj/machinery/vending/cigarette, /obj/effect/turf_decal/stripes/line{ @@ -67446,7 +68932,8 @@ "vFD" = ( /obj/machinery/door/poddoor/shutters/preopen{ id = "hopqueue"; - name = "HoP Queue Shutters" + name = "HoP Queue Shutters"; + dir = 8 }, /obj/effect/turf_decal/loading_area{ dir = 8 @@ -67460,8 +68947,25 @@ /area/station/ai_monitored/turret_protected/aisat_interior) "vFN" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, +/obj/machinery/atmospherics/pipe/smart/simple/pink/visible/layer5{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/smart/simple/violet/visible/layer1{ + dir = 10 + }, +/obj/item/radio/intercom/directional/east, +/obj/machinery/light/directional/east, /turf/open/floor/iron, /area/station/engineering/atmos) +"vFT" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/cable, +/obj/machinery/camera/autoname/directional/east, +/obj/effect/turf_decal/trimline/dark_blue/line{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/mix) "vGg" = ( /obj/effect/turf_decal/tile/brown{ dir = 1 @@ -67544,12 +69048,11 @@ /obj/machinery/atmospherics/pipe/heat_exchanging/manifold/layer2{ dir = 1 }, -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored{ - chamber_id = "ordnancegas2"; +/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/ordnance_freezer_chamber_input{ dir = 1 }, /turf/open/floor/iron/dark/airless, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/freezerchamber) "vHm" = ( /obj/structure/rack, /turf/open/floor/plating, @@ -67565,11 +69068,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/requests_console/directional/south{ announcementConsole = 1; + anon_tips_receiver = 1; + assistance_requestable = 1; department = "Bridge"; departmentType = 5; - name = "Bridge Requests Console"; - anon_tips_receiver = 1; - assistance_requestable = 1 + name = "Bridge Requests Console" }, /turf/open/floor/wood, /area/station/command/meeting_room) @@ -67618,9 +69121,8 @@ /area/station/medical/chemistry) "vIa" = ( /obj/effect/spawner/structure/window, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/department/medical/central) "vIk" = ( /obj/machinery/light/directional/north, @@ -67641,13 +69143,13 @@ /obj/structure/closet{ name = "Evidence Closet 1" }, -/obj/item/radio/intercom/prison/directional/north, +/obj/item/radio/intercom/directional/north, /turf/open/floor/iron/dark/textured_edge, /area/station/security/brig) "vIJ" = ( /obj/machinery/portable_atmospherics/canister/nitrogen, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "vJk" = ( /obj/machinery/atmospherics/components/binary/valve{ dir = 4 @@ -67695,13 +69197,9 @@ /area/station/command/heads_quarters/rd) "vKm" = ( /obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, /turf/open/floor/iron, -/area/station/engineering/atmos/project) +/area/station/engineering/atmos/storage) "vKp" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -67743,12 +69241,10 @@ /turf/open/floor/iron, /area/station/hallway/secondary/service) "vLL" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/on/layer2{ +/obj/structure/sign/warning/fire/directional/west, +/obj/machinery/atmospherics/components/unary/passive_vent/layer2{ dir = 8 }, -/obj/structure/sign/warning/fire{ - pixel_x = -32 - }, /turf/open/floor/plating/snowed/icemoon, /area/station/medical/virology) "vLY" = ( @@ -67846,14 +69342,12 @@ /obj/machinery/atmospherics/components/binary/pump{ dir = 4 }, -/obj/structure/sign/warning/secure_area{ - pixel_y = 32 - }, +/obj/structure/sign/warning/secure_area/directional/north, /obj/effect/turf_decal/stripes/line{ dir = 4 }, /turf/open/floor/iron, -/area/station/science/misc_lab) +/area/station/science/explab) "vND" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 1 @@ -68114,7 +69608,7 @@ /area/station/engineering/atmos) "vRX" = ( /turf/open/floor/iron/smooth, -/area/station/security/prison) +/area/station/security/execution/transfer) "vRY" = ( /obj/structure/railing/corner{ dir = 4 @@ -68135,7 +69629,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, -/area/station/science/misc_lab) +/area/station/science/explab) "vSi" = ( /turf/closed/wall, /area/mine/eva) @@ -68222,9 +69716,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/light/small/directional/south, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/department/medical/central) "vTi" = ( /obj/structure/table/reinforced, @@ -68335,11 +69828,6 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/iron, /area/station/hallway/secondary/service) -"vVn" = ( -/turf/open/floor/wood{ - icon_state = "wood-broken" - }, -/area/station/maintenance/port/aft) "vVw" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -68348,9 +69836,8 @@ /area/station/commons/toilet) "vVB" = ( /obj/effect/spawner/random/structure/crate, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/aft/lesser) "vVD" = ( /obj/structure/closet/wardrobe/miner, @@ -68402,9 +69889,8 @@ /area/station/engineering/supermatter/room) "vWx" = ( /obj/structure/tank_holder/extinguisher, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "vWz" = ( /turf/closed/wall, @@ -68414,9 +69900,7 @@ /turf/open/floor/iron/dark, /area/station/hallway/primary/central) "vWJ" = ( -/obj/structure/sign/warning/secure_area{ - pixel_x = 32 - }, +/obj/structure/sign/warning/secure_area/directional/east, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -68589,6 +70073,11 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/department/cargo) +"vZw" = ( +/obj/effect/turf_decal/weather/snow, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating/icemoon, +/area/icemoon/surface/outdoors/nospawn) "vZz" = ( /obj/structure/closet/secure_closet/personal/cabinet, /obj/effect/landmark/start/hangover, @@ -68634,6 +70123,14 @@ }, /turf/open/floor/plating/snowed/icemoon, /area/station/maintenance/port/aft) +"vZX" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/duct, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/morgue) "waa" = ( /obj/machinery/door/poddoor/massdriver_trash, /obj/structure/fans/tiny, @@ -68652,6 +70149,11 @@ "wam" = ( /turf/open/openspace, /area/station/cargo/storage) +"waD" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/project) "waL" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/red, @@ -68679,15 +70181,14 @@ /turf/open/floor/iron/white/side{ dir = 4 }, -/area/station/science/misc_lab) +/area/station/science/explab) "wba" = ( /obj/machinery/light/small/directional/east, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) "wbd" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "wbe" = ( /obj/structure/cable/multilayer/multiz, @@ -68714,15 +70215,6 @@ }, /turf/open/floor/iron/cafeteria, /area/mine/laborcamp) -"wbu" = ( -/obj/effect/turf_decal/siding/white{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/chair/stool/bar/directional/east, -/turf/open/floor/iron/white/smooth_large, -/area/station/service/kitchen/diner) "wbw" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 8 @@ -68732,15 +70224,13 @@ /area/station/medical/treatment_center) "wbK" = ( /obj/effect/turf_decal/tile/red/full, -/obj/structure/chair{ - dir = 1 - }, /obj/effect/turf_decal/siding/white{ dir = 8 }, -/obj/machinery/camera/directional/west{ - c_tag = "Service-Diner" +/obj/structure/chair{ + dir = 1 }, +/obj/structure/sign/poster/random/directional/west, /turf/open/floor/iron/large, /area/station/service/kitchen/diner) "wbN" = ( @@ -68841,15 +70331,13 @@ "wdP" = ( /obj/structure/light_construct/directional/south, /obj/structure/sign/poster/contraband/random/directional/south, -/turf/open/floor/wood{ - icon_state = "wood-broken5" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/maintenance/port/aft) "wee" = ( /obj/structure/disposalpipe/segment{ dir = 10 }, -/obj/structure/cable, /obj/structure/chair/stool/directional/north, /turf/open/floor/carpet, /area/station/cargo/qm) @@ -68916,6 +70404,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/smooth_half, /area/station/security/office) +"wfk" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/hfr_room) "wfm" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible/layer1{ dir = 10 @@ -68957,7 +70451,10 @@ /turf/open/floor/iron/cafeteria{ dir = 8 }, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) +"wfF" = ( +/turf/open/genturf/alternative, +/area/icemoon/underground/unexplored/rivers/deep/shoreline) "wfK" = ( /obj/item/folder/blue, /obj/structure/table/wood, @@ -68969,18 +70466,6 @@ }, /turf/open/floor/iron, /area/station/command/heads_quarters/rd) -"wgd" = ( -/obj/structure/table, -/obj/item/stack/sheet/plasteel/twenty{ - pixel_x = 3; - pixel_y = -2 - }, -/obj/item/stack/sheet/iron/fifty{ - pixel_x = -2; - pixel_y = 2 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos/project) "wgn" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, @@ -69007,8 +70492,8 @@ /turf/open/floor/iron/grimy, /area/station/service/chapel/office) "wgx" = ( -/obj/effect/spawner/random/vending/snackvend, /obj/item/radio/intercom/directional/south, +/obj/machinery/vending/wardrobe/science_wardrobe, /turf/open/floor/iron/dark, /area/station/science/breakroom) "wgE" = ( @@ -69105,7 +70590,7 @@ dir = 4 }, /turf/open/floor/engine, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "whm" = ( /obj/structure/closet/wardrobe/grey, /obj/effect/turf_decal/tile/neutral, @@ -69143,6 +70628,13 @@ /obj/machinery/duct, /turf/open/floor/plating, /area/station/hallway/secondary/service) +"why" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/trimline/dark_blue/line{ + dir = 9 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/mix) "whF" = ( /obj/structure/girder, /turf/open/floor/plating, @@ -69220,10 +70712,14 @@ /obj/machinery/light/small/directional/south, /obj/structure/mirror/directional/east, /obj/structure/sign/poster/official/random/directional/west, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) +"wiX" = ( +/obj/machinery/firealarm/directional/south, +/obj/effect/turf_decal/trimline/yellow/filled/line, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/hfr_room) "wjj" = ( /obj/machinery/camera/directional/west{ c_tag = "Vacant Office" @@ -69341,21 +70837,14 @@ /turf/open/floor/iron, /area/station/commons/storage/tools) "wln" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/siding/white, -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/machinery/firealarm/directional/south, -/obj/structure/table/wood, -/obj/structure/desk_bell{ - pixel_x = 7 +/obj/structure/chair/sofa/right{ + dir = 1; + desc = "Hey, did you know you can get a pineapple on your burger here?"; + name = "The Regular's Sofa" }, -/turf/open/floor/iron, -/area/station/service/bar) +/obj/effect/landmark/start/hangover, +/turf/open/floor/stone, +/area/station/commons/lounge) "wlv" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -69384,9 +70873,8 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "wlQ" = ( /obj/structure/table/wood, @@ -69398,9 +70886,8 @@ /obj/effect/spawner/random/entertainment/gambling{ pixel_x = -13 }, -/turf/open/floor/wood{ - icon_state = "wood-broken5" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/maintenance/fore/lesser) "wlR" = ( /obj/structure/closet/boxinggloves, @@ -69618,6 +71105,13 @@ /obj/effect/turf_decal/tile/red, /turf/open/floor/iron/textured, /area/station/security/brig) +"wpp" = ( +/obj/machinery/atmospherics/components/binary/pump/off{ + dir = 8; + name = "Exfiltrate to Waste" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "wpv" = ( /obj/structure/sign/warning/cold_temp, /obj/effect/spawner/structure/window/reinforced, @@ -69654,7 +71148,7 @@ /turf/open/floor/iron/cafeteria{ dir = 8 }, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "wqb" = ( /obj/structure/cable, /obj/machinery/camera/directional/east{ @@ -69701,9 +71195,8 @@ /turf/open/floor/iron, /area/station/commons/storage/mining) "wqo" = ( -/obj/structure/sign/warning/gas_mask{ - desc = "A sign that warns of dangerous gasses in the air, instructing you to wear internals."; - pixel_y = -32 +/obj/structure/sign/warning/gas_mask/directional/south{ + desc = "A sign that warns of dangerous gasses in the air, instructing you to wear internals." }, /turf/open/floor/iron/smooth, /area/mine/mechbay) @@ -69711,7 +71204,7 @@ /turf/closed/wall/r_wall, /area/station/hallway/primary/fore) "wqI" = ( -/obj/item/radio/intercom/prison/directional/north, +/obj/item/radio/intercom/directional/north, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 }, @@ -69739,16 +71232,33 @@ }, /turf/open/floor/iron, /area/station/engineering/storage) -"wrB" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 +"wrm" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/item/radio/intercom/directional/south, +/obj/structure/disposalpipe/segment{ + dir = 4 }, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/hfr_room) +"wrx" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/trimline/dark_blue/line{ + dir = 5 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/mix) +"wrB" = ( /obj/effect/landmark/start/bartender, /obj/machinery/duct, /obj/structure/disposalpipe/segment{ dir = 9 }, +/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/service/bar) "wrP" = ( @@ -69872,15 +71382,13 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/event_spawn, /obj/effect/landmark/blobstart, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) "wtt" = ( /obj/structure/cable, -/turf/open/floor/wood{ - icon_state = "wood-broken2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/maintenance/fore/lesser) "wtB" = ( /obj/structure/disposalpipe/segment, @@ -69891,9 +71399,7 @@ /turf/open/floor/plating, /area/station/maintenance/starboard/upper) "wtE" = ( -/obj/structure/sign/warning/secure_area{ - pixel_x = -32 - }, +/obj/structure/sign/warning/secure_area/directional/west, /obj/machinery/door/firedoor, /obj/machinery/door/poddoor/preopen{ id = "bridge blast"; @@ -69938,11 +71444,6 @@ /obj/effect/spawner/random/trash/cigbutt, /turf/open/floor/iron, /area/station/engineering/lobby) -"wuX" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, -/area/station/maintenance/aft/lesser) "wva" = ( /obj/machinery/light/directional/west, /turf/open/floor/engine, @@ -69999,6 +71500,10 @@ /mob/living/simple_animal/pet/cat/runtime, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/cmo) +"wvZ" = ( +/obj/structure/sign/poster/random/directional/west, +/turf/open/floor/plating, +/area/station/maintenance/aft/lesser) "wwa" = ( /turf/closed/wall, /area/station/ai_monitored/turret_protected/aisat/maint) @@ -70036,9 +71541,8 @@ /obj/structure/railing{ dir = 1 }, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) "wwG" = ( /obj/machinery/hydroponics/constructable, @@ -70081,7 +71585,7 @@ dir = 1 }, /turf/open/floor/iron/smooth, -/area/station/security/prison) +/area/station/security/execution/transfer) "wwV" = ( /obj/machinery/camera/directional/south{ c_tag = "Construction Area" @@ -70100,7 +71604,7 @@ }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, -/area/station/science/misc_lab) +/area/station/science/explab) "wxg" = ( /turf/open/floor/iron/freezer, /area/mine/laborcamp) @@ -70272,7 +71776,7 @@ "wAp" = ( /obj/machinery/light/directional/east, /turf/open/floor/glass/reinforced, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "wAq" = ( /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 1 @@ -70339,14 +71843,22 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/iron/showroomfloor, /area/station/security/processing) +"wBd" = ( +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ + dir = 5 + }, +/obj/machinery/igniter/incinerator_atmos, +/obj/structure/sign/warning/gas_mask/directional/south, +/turf/open/floor/engine, +/area/station/maintenance/disposal/incinerator) "wBg" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/components/tank/oxygen, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "wBh" = ( /turf/closed/wall/r_wall, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/freezerchamber) "wBk" = ( /obj/machinery/camera/directional/north{ c_tag = "Robotics Lab"; @@ -70392,13 +71904,6 @@ /obj/structure/closet/crate, /turf/open/floor/iron, /area/station/cargo/miningdock) -"wBX" = ( -/obj/machinery/hydroponics/constructable, -/obj/effect/turf_decal/siding/wideplating/dark{ - dir = 1 - }, -/turf/open/floor/grass, -/area/station/maintenance/starboard/fore) "wCd" = ( /obj/machinery/atmospherics/pipe/multiz/scrubbers/visible/layer2, /obj/machinery/atmospherics/pipe/multiz/supply/visible/layer4, @@ -70408,7 +71913,8 @@ /obj/machinery/door/firedoor/heavy, /obj/machinery/door/poddoor/shutters/preopen{ id = "rnd2"; - name = "Research Lab Shutters" + name = "Research Lab Shutters"; + dir = 8 }, /obj/effect/turf_decal/siding/purple/corner{ dir = 4 @@ -70601,6 +72107,12 @@ dir = 1; name = "Air Outlet Pump" }, +/obj/machinery/atmospherics/pipe/smart/simple/pink/visible/layer5{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/smart/simple/violet/visible/layer1{ + dir = 5 + }, /turf/open/floor/iron/white/corner, /area/station/engineering/atmos) "wEy" = ( @@ -70669,7 +72181,7 @@ /obj/structure/cable, /obj/machinery/firealarm/directional/south, /turf/open/floor/iron/smooth, -/area/station/security/prison) +/area/station/security/execution/transfer) "wFD" = ( /obj/machinery/light/directional/south, /obj/structure/plasticflaps, @@ -70701,9 +72213,8 @@ /turf/open/floor/carpet, /area/station/service/library) "wFS" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "wFU" = ( /obj/structure/filingcabinet/chestdrawer, @@ -70787,6 +72298,9 @@ /obj/structure/closet/secure_closet/quartermaster, /turf/open/floor/iron, /area/station/cargo/qm) +"wHs" = ( +/turf/closed/mineral/snowmountain/coldroom, +/area/station/service/kitchen/coldroom) "wHv" = ( /obj/machinery/airalarm/directional/west, /obj/structure/disposalpipe/segment, @@ -70828,25 +72342,13 @@ }, /turf/open/floor/iron, /area/mine/laborcamp/security) -"wHN" = ( -/obj/item/chair/wood, -/turf/open/floor/wood{ - icon_state = "wood-broken6" - }, -/area/station/maintenance/space_hut/cabin) "wHW" = ( -/obj/machinery/door/airlock{ - name = "Kitchen" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/structure/ladder{ + name = "Kitchen Access" }, -/obj/effect/mapping_helpers/airlock/access/all/service/kitchen, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/obj/effect/turf_decal/tile/dark_blue/diagonal_edge, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen/coldroom) "wIg" = ( /obj/machinery/mech_bay_recharge_port{ dir = 2 @@ -70873,12 +72375,7 @@ }, /obj/structure/cable, /turf/open/floor/iron/smooth, -/area/station/security/prison) -"wIq" = ( -/obj/machinery/oven, -/obj/machinery/requests_console/auto_name/directional/north, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) +/area/station/security/execution/transfer) "wIz" = ( /obj/machinery/light/small/directional/west, /obj/structure/table/wood, @@ -70956,12 +72453,12 @@ /turf/open/floor/iron, /area/station/hallway/primary/central) "wJy" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral/diagonal_edge, /obj/structure/disposalpipe/segment{ - dir = 5 + dir = 4 }, -/obj/machinery/duct, -/turf/open/floor/iron/cafeteria, +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron/kitchen/diagonal, /area/station/service/kitchen) "wJD" = ( /obj/structure/sign/departments/maint/alt, @@ -71031,10 +72528,15 @@ "wLn" = ( /obj/machinery/door/poddoor/shutters{ id = "armory"; - name = "Armory Shutter" + name = "Armory Shutter"; + dir = 1 }, /turf/open/floor/iron, /area/station/ai_monitored/security/armory/upper) +"wLs" = ( +/obj/structure/closet/secure_closet/freezer/meat, +/turf/open/misc/asteroid/snow/coldroom, +/area/station/service/kitchen/coldroom) "wLH" = ( /obj/machinery/camera/directional/east{ c_tag = "Security - Permabrig Workout"; @@ -71135,9 +72637,11 @@ /turf/open/floor/iron/grimy, /area/station/commons/lounge) "wMx" = ( -/obj/machinery/airalarm/directional/south, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/window/left/directional/east, +/obj/structure/sign/warning/gas_mask/directional/north, +/turf/open/floor/plating/snowed/coldroom, +/area/station/service/kitchen/coldroom) "wMz" = ( /obj/machinery/atmospherics/pipe/multiz/supply/visible/layer4{ color = "#0000ff"; @@ -71170,18 +72674,14 @@ /area/station/security/office) "wMX" = ( /obj/machinery/vending/wardrobe/atmos_wardrobe, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, +/obj/effect/turf_decal/stripes/end, /turf/open/floor/iron/showroomfloor, /area/station/engineering/atmos) "wNm" = ( /obj/machinery/door/airlock/maintenance{ name = "Teleporter Maintenance" }, -/obj/structure/sign/warning/secure_area{ - pixel_x = -32 - }, +/obj/structure/sign/warning/secure_area/directional/west, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 }, @@ -71219,13 +72719,10 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 }, -/obj/structure/sign/warning/gas_mask{ - desc = "A sign that warns of dangerous gasses in the air, instructing you to wear internals."; - pixel_y = -32 - }, -/obj/structure/sign/warning/cold_temp{ - pixel_y = 32 +/obj/structure/sign/warning/gas_mask/directional/south{ + desc = "A sign that warns of dangerous gasses in the air, instructing you to wear internals." }, +/obj/structure/sign/warning/cold_temp/directional/north, /turf/open/floor/iron/dark, /area/mine/storage) "wNO" = ( @@ -71238,15 +72735,9 @@ /turf/open/floor/iron/dark/textured, /area/station/security/processing) "wOg" = ( -/turf/open/floor/wood{ - icon_state = "wood-broken" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/service/library) -"wOj" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, -/area/station/maintenance/fore/lesser) "wOp" = ( /obj/machinery/light/small/directional/east, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -71255,9 +72746,7 @@ /turf/open/floor/eighties/red, /area/station/security/prison/safe) "wOr" = ( -/obj/structure/sign/warning/secure_area{ - pixel_x = 32 - }, +/obj/structure/sign/warning/secure_area/directional/east, /turf/open/floor/plating, /area/station/maintenance/fore/greater) "wOt" = ( @@ -71327,9 +72816,8 @@ dir = 8 }, /obj/item/wrench/medical, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "wPD" = ( /obj/machinery/door/airlock/security/glass{ @@ -71372,7 +72860,7 @@ /obj/structure/training_machine, /obj/effect/landmark/blobstart, /turf/open/floor/engine, -/area/station/science/misc_lab) +/area/station/science/explab) "wPZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -71417,7 +72905,7 @@ /obj/structure/railing, /obj/machinery/door/firedoor/border_only, /turf/open/floor/iron/white, -/area/station/science/mixing/hallway) +/area/station/science/ordnance) "wQR" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -71473,13 +72961,6 @@ }, /turf/open/floor/wood, /area/station/commons/vacant_room/office) -"wRT" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/iron/white/smooth_large, -/area/station/service/kitchen/diner) "wRU" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/stripes/line{ @@ -71497,9 +72978,7 @@ pixel_y = 3 }, /obj/item/tank/internals/emergency_oxygen, -/obj/structure/sign/warning/cold_temp{ - pixel_x = -32 - }, +/obj/structure/sign/warning/cold_temp/directional/west, /obj/item/clothing/mask/gas, /obj/item/clothing/mask/gas, /turf/open/floor/iron/white, @@ -71600,6 +73079,16 @@ "wUj" = ( /turf/closed/wall, /area/station/service/lawoffice) +"wUl" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 10 + }, +/obj/effect/turf_decal/siding/yellow{ + dir = 1 + }, +/obj/structure/closet/radiation, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/hfr_room) "wUq" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/warm/directional/east, @@ -71724,21 +73213,23 @@ /turf/open/floor/iron/dark, /area/station/science/robotics/lab) "wVL" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/siding/white, -/obj/structure/disposalpipe/segment{ - dir = 5 +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 8 }, /turf/open/floor/iron, /area/station/service/bar) "wVQ" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/landmark/event_spawn, -/obj/machinery/duct, -/turf/open/floor/iron/cafeteria, +/obj/structure/table, +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/item/reagent_containers/food/condiment/saltshaker{ + pixel_x = -3 + }, +/obj/item/reagent_containers/food/condiment/peppermill{ + pixel_x = 3 + }, +/turf/open/floor/iron/kitchen/diagonal, /area/station/service/kitchen) "wVR" = ( /obj/structure/disposalpipe/segment{ @@ -71767,6 +73258,17 @@ }, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/surface/outdoors/nospawn) +"wWA" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/trimline/white/arrow_ccw, +/obj/effect/turf_decal/trimline/white/arrow_cw{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/mix) +"wWD" = ( +/turf/open/floor/iron/dark/textured, +/area/station/security/execution/transfer) "wWL" = ( /obj/structure/closet/firecloset, /obj/effect/turf_decal/tile/purple/fourcorners, @@ -71920,7 +73422,8 @@ /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ id = "rnd"; - name = "Research Lab Shutters" + name = "Research Lab Shutters"; + dir = 1 }, /turf/open/floor/plating, /area/station/hallway/primary/starboard) @@ -72020,10 +73523,13 @@ /area/station/commons/toilet/locker) "xaz" = ( /obj/effect/spawner/random/structure/crate, -/turf/open/floor/wood{ - icon_state = "wood-broken3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/maintenance/space_hut/cabin) +"xaC" = ( +/obj/effect/turf_decal/bot_white, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/project) "xaI" = ( /turf/open/floor/iron/dark/telecomms, /area/station/tcommsat/server) @@ -72057,9 +73563,8 @@ /area/station/commons/fitness) "xbj" = ( /obj/item/trash/sosjerky, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "xbo" = ( /obj/structure/chair/comfy/brown{ @@ -72139,7 +73644,7 @@ "xcB" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, /turf/open/floor/iron/dark, -/area/station/science/misc_lab) +/area/station/science/explab) "xcC" = ( /obj/structure/fluff/tram_rail/end{ dir = 4; @@ -72170,9 +73675,9 @@ /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat/maint) "xcZ" = ( -/obj/item/radio/intercom/directional/south, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/dark, +/obj/structure/cable/multilayer/connected, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat_interior) "xdf" = ( /obj/structure/sign/poster/official/random/directional/north, @@ -72191,7 +73696,7 @@ "xdH" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on, /turf/open/floor/engine/vacuum, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "xdM" = ( /obj/structure/sign/warning/cold_temp, /turf/closed/wall, @@ -72222,14 +73727,18 @@ /area/station/security/prison/rec) "xea" = ( /obj/effect/decal/cleanable/blood/gibs/old, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "xeo" = ( -/obj/machinery/griddle, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/crew_quarters/bar) "xex" = ( /obj/machinery/teleport/hub, /turf/open/floor/plating, @@ -72244,6 +73753,11 @@ }, /turf/open/floor/engine/co2, /area/station/engineering/atmos) +"xeP" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/project) "xeX" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -72253,7 +73767,7 @@ /area/station/hallway/primary/port) "xeZ" = ( /turf/open/floor/plating, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "xfb" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 1 @@ -72312,11 +73826,9 @@ /area/icemoon/surface/outdoors/nospawn) "xga" = ( /obj/machinery/light/small/directional/west, -/obj/structure/sign/warning/secure_area{ - pixel_x = -32 - }, +/obj/structure/sign/warning/secure_area/directional/west, /turf/open/floor/engine, -/area/station/science/misc_lab) +/area/station/science/explab) "xgm" = ( /obj/structure/sign/directions/evac{ dir = 4; @@ -72338,7 +73850,7 @@ /obj/effect/turf_decal/delivery, /obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, /turf/open/floor/iron/dark, -/area/station/science/misc_lab) +/area/station/science/explab) "xgr" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -72396,11 +73908,11 @@ "xgR" = ( /obj/machinery/requests_console/directional/south{ announcementConsole = 1; + anon_tips_receiver = 1; + assistance_requestable = 1; department = "Bridge"; departmentType = 5; - name = "Bridge Requests Console"; - anon_tips_receiver = 1; - assistance_requestable = 1 + name = "Bridge Requests Console" }, /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ @@ -72471,19 +73983,31 @@ /obj/item/folder/yellow, /turf/open/floor/iron, /area/station/cargo/storage) +"xhJ" = ( +/obj/effect/turf_decal/tile/red/full, +/obj/effect/turf_decal/siding/white{ + dir = 1 + }, +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/iron/large, +/area/station/service/kitchen/diner) "xhK" = ( /turf/closed/wall/r_wall, /area/station/security/prison/safe) -"xhP" = ( -/turf/open/floor/plating{ - icon_state = "panelscorched" +"xhO" = ( +/obj/machinery/porta_turret/ai{ + dir = 4 }, +/obj/structure/sign/warning/secure_area/directional/east, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat_interior) +"xhP" = ( +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"xhT" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, -/area/station/maintenance/starboard/aft) "xie" = ( /obj/machinery/camera/directional/west{ c_tag = "Engineering MiniSat Access" @@ -72499,9 +74023,8 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/aft) "xit" = ( /obj/item/book/manual/wiki/security_space_law, @@ -72513,7 +74036,7 @@ dir = 4 }, /turf/open/floor/iron, -/area/station/science/mixing) +/area/station/science/ordnance) "xiO" = ( /obj/effect/turf_decal/weather/snow/corner{ dir = 1 @@ -72655,12 +74178,6 @@ }, /turf/open/floor/iron/dark/smooth_half, /area/station/security/office) -"xlD" = ( -/obj/structure/sign/warning/secure_area{ - pixel_x = 32 - }, -/turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/maint) "xlL" = ( /obj/effect/turf_decal/siding/white{ dir = 4 @@ -72683,15 +74200,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"xlO" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/machinery/door/airlock/external{ - name = "External Access" - }, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) "xmd" = ( /obj/machinery/camera/directional/south{ c_tag = "Locker Room West" @@ -72720,11 +74228,18 @@ /obj/effect/turf_decal/tile/brown{ dir = 4 }, -/obj/structure/sign/warning/gas_mask{ - pixel_x = -32 - }, +/obj/structure/sign/warning/gas_mask/directional/west, /turf/open/floor/iron/dark, /area/station/cargo/miningdock) +"xmo" = ( +/obj/machinery/door/airlock/external{ + name = "External Access" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/lesser) "xmx" = ( /obj/structure/sink/kitchen{ pixel_y = 20 @@ -72808,12 +74323,13 @@ dir = 8 }, /turf/open/floor/iron/white, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "xnp" = ( /obj/effect/spawner/structure/window, /obj/machinery/door/poddoor/shutters/preopen{ id = "rnd2"; - name = "Research Lab Shutters" + name = "Research Lab Shutters"; + dir = 8 }, /turf/open/floor/plating, /area/station/science/research) @@ -72857,6 +74373,13 @@ /obj/machinery/duct, /turf/open/floor/iron/dark/corner, /area/station/engineering/atmos) +"xnG" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/trimline/dark_red/end, +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/smart/simple/pink/visible, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/mix) "xnM" = ( /obj/structure/cable, /turf/open/floor/iron/white/side{ @@ -72872,17 +74395,14 @@ /area/icemoon/underground/explored) "xoa" = ( /obj/effect/spawner/random/engineering/tracking_beacon, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, /turf/open/floor/iron, /area/station/engineering/main) "xox" = ( @@ -72904,9 +74424,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/spawner/random/structure/steam_vent, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/department/chapel) "xoB" = ( /obj/machinery/light/small/directional/north, @@ -72914,9 +74433,19 @@ /turf/open/floor/plating, /area/station/maintenance/port/aft) "xoF" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/iron, -/area/station/engineering/atmos/project) +/obj/structure/lattice/catwalk, +/obj/structure/railing/corner, +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/structure/railing/corner{ + dir = 1 + }, +/obj/structure/railing/corner{ + dir = 8 + }, +/turf/open/openspace, +/area/station/engineering/atmos/storage) "xoG" = ( /obj/effect/turf_decal/bot_white/left, /obj/structure/closet/crate/silvercrate, @@ -73014,7 +74543,7 @@ /obj/structure/cable, /obj/machinery/airalarm/directional/west, /turf/open/floor/iron, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "xqu" = ( /obj/machinery/door/window/left/directional/north{ dir = 4; @@ -73047,12 +74576,8 @@ /obj/structure/disposalpipe/trunk{ dir = 4 }, -/obj/structure/sign/warning/deathsposal{ - pixel_y = 32 - }, -/obj/structure/sign/warning/fire{ - pixel_x = -32 - }, +/obj/structure/sign/warning/deathsposal/directional/north, +/obj/structure/sign/warning/fire/directional/west, /obj/effect/turf_decal/tile/green/full, /turf/open/floor/iron/white/smooth_large, /area/station/medical/virology) @@ -73072,9 +74597,8 @@ id = "garbage" }, /obj/machinery/recycler, -/obj/structure/sign/warning/secure_area{ - name = "\improper STAY CLEAR HEAVY MACHINERY"; - pixel_y = 32 +/obj/structure/sign/warning/secure_area/directional/north{ + name = "\improper STAY CLEAR HEAVY MACHINERY" }, /obj/structure/disposalpipe/segment{ dir = 4 @@ -73150,13 +74674,17 @@ c_tag = "Gateway" }, /obj/structure/table, -/obj/structure/sign/warning/biohazard{ - pixel_x = -32 - }, +/obj/structure/sign/warning/biohazard/directional/west, /obj/item/storage/medkit/regular, /obj/item/paper/pamphlet/gateway, /turf/open/floor/iron, /area/station/command/gateway) +"xsU" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage) "xta" = ( /obj/machinery/light/small/directional/south, /obj/effect/turf_decal/tile/yellow, @@ -73168,6 +74696,12 @@ }, /turf/open/floor/iron, /area/station/commons/storage/tools) +"xtb" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/east, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/project) "xtc" = ( /obj/effect/turf_decal/trimline/blue/filled/warning{ dir = 1 @@ -73246,9 +74780,7 @@ /area/station/science/xenobiology) "xus" = ( /obj/effect/turf_decal/trimline/yellow/filled/line, -/obj/structure/sign/warning/chem_diamond{ - pixel_y = -32 - }, +/obj/structure/sign/warning/chem_diamond/directional/south, /turf/open/floor/iron/white, /area/station/medical/chemistry) "xuI" = ( @@ -73266,7 +74798,8 @@ }, /obj/machinery/door/poddoor/shutters/preopen{ id = "hop"; - name = "Privacy Shutters" + name = "Privacy Shutters"; + dir = 8 }, /obj/machinery/flasher/directional/north{ id = "hopflash" @@ -73277,10 +74810,10 @@ /turf/open/floor/iron, /area/station/command/heads_quarters/hop) "xuQ" = ( -/mob/living/carbon/human/species/monkey, /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 }, +/mob/living/carbon/human/species/monkey, /turf/open/floor/grass, /area/station/medical/virology) "xuR" = ( @@ -73289,6 +74822,20 @@ }, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/surface/outdoors/nospawn) +"xuX" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/pipe/layer_manifold/pink/visible{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_red/line, +/obj/effect/turf_decal/trimline/dark_red/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/dark_blue/mid_joiner{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/mix) "xvc" = ( /obj/structure/chair/wood{ dir = 4 @@ -73297,16 +74844,13 @@ /turf/open/floor/wood/parquet, /area/station/commons/lounge) "xve" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, /obj/structure/sink/kitchen{ pixel_y = 24 }, /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/service/bar) "xvn" = ( @@ -73353,6 +74897,10 @@ /obj/structure/stairs/east, /turf/open/floor/iron/white, /area/station/science/xenobiology) +"xwe" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/mix) "xwf" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -73389,9 +74937,7 @@ /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) "xwB" = ( -/obj/structure/sign/warning/cold_temp{ - pixel_x = 32 - }, +/obj/structure/sign/warning/cold_temp/directional/east, /turf/open/floor/plating, /area/station/engineering/main) "xwC" = ( @@ -73431,13 +74977,22 @@ /obj/structure/bodycontainer/morgue, /turf/open/floor/iron/dark, /area/station/science/robotics/lab) +"xwO" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "xwY" = ( /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/structure/chair, /obj/item/reagent_containers/blood/random, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "xxc" = ( /obj/structure/cable, @@ -73483,6 +75038,14 @@ /obj/structure/cable, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/surface/outdoors/nospawn) +"xxE" = ( +/obj/machinery/door/poddoor/shutters{ + id = "teledoor"; + name = "MiniSat Teleport Access"; + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat_interior) "xxH" = ( /obj/machinery/camera/preset/ordnance{ dir = 4 @@ -73494,7 +75057,7 @@ dir = 5 }, /turf/open/floor/plating/icemoon, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "xxI" = ( /obj/structure/filingcabinet, /turf/open/floor/iron/grimy, @@ -73556,6 +75119,10 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) +"xzi" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/hallway/primary/starboard) "xzp" = ( /obj/item/kirbyplants/random, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -73630,6 +75197,21 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/dark/textured, /area/station/security/prison/mess) +"xBa" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark/textured, +/area/station/security/execution/transfer) +"xBg" = ( +/obj/machinery/deepfryer, +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/structure/sign/poster/contraband/moffuchis_pizza{ + pixel_x = 32 + }, +/obj/machinery/camera/autoname/directional/east, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) "xBh" = ( /obj/machinery/light/directional/north, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -73675,8 +75257,8 @@ name = "Man of Snow" }, /obj/item/clothing/head/snowman{ - pixel_y = 9; - name = "Head of Snow" + name = "Head of Snow"; + pixel_y = 9 }, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) @@ -73725,6 +75307,10 @@ /obj/structure/disposalpipe/segment{ dir = 5 }, +/obj/machinery/duct, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) "xCQ" = ( @@ -73754,7 +75340,7 @@ /turf/open/floor/iron/white/side{ dir = 8 }, -/area/station/science/misc_lab) +/area/station/science/explab) "xDb" = ( /turf/closed/wall/r_wall, /area/station/medical/virology) @@ -73770,6 +75356,11 @@ /obj/effect/spawner/random/vending/snackvend, /turf/open/floor/iron, /area/station/hallway/secondary/service) +"xDC" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/machinery/holopad, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/project) "xDG" = ( /obj/machinery/meter, /obj/machinery/atmospherics/pipe/smart/simple/green/visible{ @@ -73790,6 +75381,15 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/iron/showroomfloor, /area/station/maintenance/department/medical/morgue) +"xDZ" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/trimline/dark_green/arrow_ccw, +/obj/machinery/atmospherics/pipe/smart/simple/violet/visible{ + dir = 8 + }, +/obj/machinery/meter, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/storage) "xEb" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/trimline/green/filled/warning{ @@ -73834,17 +75434,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/carpet/black, /area/station/security/prison/safe) -"xEK" = ( -/obj/machinery/ai_slipper{ - uses = 10 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/mob/living/simple_animal/bot/secbot/pingsky, -/obj/structure/cable/layer3, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) "xEP" = ( /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -73908,7 +75497,7 @@ /area/station/maintenance/department/electrical) "xFT" = ( /turf/closed/wall/r_wall, -/area/station/science/mixing) +/area/station/science/ordnance) "xGp" = ( /obj/structure/table/reinforced, /obj/machinery/door/window/left/directional/north{ @@ -73969,9 +75558,7 @@ /turf/open/floor/iron/textured, /area/station/security/courtroom) "xGY" = ( -/obj/structure/sign/warning/no_smoking{ - pixel_y = 32 - }, +/obj/structure/sign/warning/no_smoking/directional/north, /obj/structure/cable, /obj/effect/turf_decal/tile/yellow{ dir = 1 @@ -74067,8 +75654,11 @@ /turf/open/floor/iron/dark/textured, /area/station/security/office) "xIq" = ( -/obj/structure/chair, -/obj/item/radio/intercom/directional/north, +/obj/structure/chair{ + dir = 1; + name = "The Peanut's Gallery"; + desc = "Aw geez, I wonder what the chef's cooking up in there!" + }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) "xIF" = ( @@ -74102,6 +75692,12 @@ "xJj" = ( /turf/open/floor/iron, /area/station/science/xenobiology) +"xJt" = ( +/obj/machinery/atmospherics/components/unary/passive_vent/layer2{ + dir = 8 + }, +/turf/open/floor/plating/snowed/icemoon, +/area/station/ai_monitored/turret_protected/aisat_interior) "xJv" = ( /obj/structure/sign/map/right{ pixel_y = 32 @@ -74122,6 +75718,11 @@ /obj/machinery/light/directional/east, /turf/open/openspace, /area/station/science/xenobiology) +"xJS" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/hfr_room) "xKa" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -74168,7 +75769,7 @@ }, /obj/item/radio/intercom/directional/north, /turf/open/floor/iron, -/area/station/science/misc_lab) +/area/station/science/explab) "xKA" = ( /obj/machinery/conveyor{ dir = 4; @@ -74228,9 +75829,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 }, -/obj/structure/sign/warning{ - pixel_y = 32 - }, +/obj/structure/sign/warning/directional/north, /obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) @@ -74316,7 +75915,7 @@ }, /obj/item/radio/intercom/directional/south, /turf/open/floor/iron/white, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "xMy" = ( /obj/machinery/light/directional/east, /turf/open/floor/iron, @@ -74540,6 +76139,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/structure/sign/warning/cold_temp/directional/north, /turf/open/floor/iron, /area/station/cargo/storage) "xRP" = ( @@ -74641,9 +76241,8 @@ /area/station/maintenance/aft/greater) "xTT" = ( /obj/machinery/portable_atmospherics/canister/nitrous_oxide, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/fore/lesser) "xTX" = ( /obj/effect/turf_decal/siding/wood, @@ -74676,6 +76275,12 @@ }, /turf/open/floor/plating, /area/station/medical/morgue) +"xUj" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/structure/table/reinforced, +/obj/item/pipe_dispenser, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/project) "xUm" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment{ @@ -74758,7 +76363,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/science/ordnance, /turf/open/floor/plating, -/area/station/science/mixing) +/area/station/science/ordnance) "xVx" = ( /obj/structure/window/reinforced{ dir = 4 @@ -74862,6 +76467,12 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/iron/freezer, /area/station/commons/toilet) +"xWI" = ( +/obj/structure/chair/stool/directional/east, +/turf/open/floor/iron/half{ + dir = 1 + }, +/area/station/engineering/atmos) "xWM" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -75017,18 +76628,15 @@ /obj/effect/spawner/structure/window/hollow/reinforced/end{ dir = 1 }, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/medical/morgue) "xZA" = ( /turf/open/floor/iron/checker, /area/station/science/lab) "xZD" = ( /obj/machinery/light/directional/north, -/obj/structure/sign/warning/electric_shock{ - pixel_y = 32 - }, +/obj/structure/sign/warning/electric_shock/directional/north, /obj/effect/turf_decal/stripes/corner{ dir = 4 }, @@ -75078,10 +76686,9 @@ }, /area/icemoon/underground/explored) "yaD" = ( -/obj/structure/sign/warning/secure_area{ +/obj/structure/sign/warning/secure_area/directional/north{ desc = "A warning sign which reads 'SERVER ROOM'."; - name = "SERVER ROOM"; - pixel_y = 32 + name = "SERVER ROOM" }, /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -75137,9 +76744,15 @@ /turf/open/floor/iron/freezer, /area/station/commons/toilet) "ybm" = ( -/obj/effect/decal/cleanable/ants, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/sign/warning/gas_mask/directional/south, +/turf/open/floor/plating, +/area/station/maintenance/department/crew_quarters/bar) "ybq" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -75280,10 +76893,13 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) -"ycX" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, -/turf/open/floor/iron, -/area/station/engineering/atmos) +"ycW" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/trimline/dark_blue/line{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/mix) "ycY" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -75309,7 +76925,7 @@ dir = 9 }, /turf/open/openspace, -/area/station/science/mixing) +/area/station/science/ordnance/office) "ydD" = ( /obj/effect/spawner/random/structure/crate_abandoned, /obj/machinery/light/small/directional/south, @@ -75429,6 +77045,22 @@ /obj/machinery/computer/holodeck, /turf/open/floor/iron, /area/station/commons/fitness) +"yfY" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"yfZ" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron/grimy, +/area/station/ai_monitored/turret_protected/aisat_interior) "ygd" = ( /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ dir = 4 @@ -75505,21 +77137,13 @@ /area/station/maintenance/port/greater) "yhB" = ( /obj/machinery/light/small/directional/east, -/obj/structure/sign/warning/secure_area{ - pixel_x = 32 - }, +/obj/structure/sign/warning/secure_area/directional/east, /turf/open/floor/engine, -/area/station/science/misc_lab) -"yhS" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/cable, -/obj/machinery/duct, -/turf/open/floor/iron/freezer, -/area/station/service/kitchen/coldroom) +/area/station/science/explab) +"yhM" = ( +/obj/machinery/light/small/directional/east, +/turf/open/openspace, +/area/station/service/bar/atrium) "yhU" = ( /obj/structure/chair/stool/directional/north, /turf/open/floor/iron, @@ -75551,9 +77175,8 @@ /turf/open/floor/iron/showroomfloor, /area/station/security/prison/toilet) "yiF" = ( -/turf/open/floor/wood{ - icon_state = "wood-broken" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/maintenance/space_hut/cabin) "yiK" = ( /obj/structure/rack, @@ -75649,6 +77272,17 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/service) +"yks" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/structure/cable, +/obj/machinery/status_display/ai/directional/north, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/hfr_room) "ykw" = ( /turf/closed/wall/r_wall, /area/station/security/processing) @@ -75667,13 +77301,10 @@ /turf/open/floor/iron, /area/station/hallway/primary/central/fore) "ykR" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, /obj/structure/disposalpipe/segment{ dir = 6 }, +/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/service/bar) "ykW" = ( @@ -75688,6 +77319,13 @@ /obj/machinery/duct, /turf/open/floor/iron, /area/station/service/hydroponics) +"ylo" = ( +/obj/effect/turf_decal/trimline/dark_green/arrow_ccw{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/violet/visible, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/storage) "ylr" = ( /obj/machinery/seed_extractor, /obj/effect/turf_decal/tile/blue{ @@ -75711,7 +77349,7 @@ }, /obj/machinery/door/firedoor/heavy, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "ylx" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -75720,7 +77358,7 @@ /turf/open/floor/iron/white/corner{ dir = 1 }, -/area/station/science/misc_lab) +/area/station/science/explab) "ylD" = ( /obj/machinery/computer/security/labor, /obj/structure/cable, @@ -75729,6 +77367,12 @@ }, /turf/open/floor/iron, /area/mine/laborcamp/security) +"ylE" = ( +/obj/effect/turf_decal/trimline/yellow/filled/shrink_cw{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/hfr_room) "ylF" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -75759,12 +77403,13 @@ }, /obj/effect/turf_decal/box/red, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance/office) "ymd" = ( -/obj/structure/chair, /obj/effect/turf_decal/siding/white{ dir = 8 }, +/obj/structure/chair, +/obj/machinery/camera/autoname/directional/west, /turf/open/floor/iron/white/smooth_large, /area/station/service/kitchen/diner) "ymg" = ( @@ -76736,7 +78381,7 @@ oSU oSU oSU oSU -kJG +oSU oSU oSU oSU @@ -78812,7 +80457,7 @@ oSU oSU oSU oSU -oSU +sNx oSU oSU oSU @@ -89537,16 +91182,16 @@ oSU oSU oSU oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -89651,13 +91296,13 @@ oSU oSU "} (55,1,1) = {" -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -89793,8 +91438,32 @@ oSU oSU oSU oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -89882,6 +91551,15 @@ oSU oSU oSU oSU +"} +(56,1,1) = {" +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -89906,8 +91584,6 @@ oSU oSU oSU oSU -"} -(56,1,1) = {" oSU oSU oSU @@ -90018,6 +91694,34 @@ oSU oSU oSU oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -90104,6 +91808,15 @@ oSU oSU oSU oSU +"} +(57,1,1) = {" +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -90163,8 +91876,6 @@ oSU oSU oSU oSU -"} -(57,1,1) = {" oSU oSU oSU @@ -90239,6 +91950,35 @@ oSU oSU oSU oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -90325,6 +92065,15 @@ oSU oSU oSU oSU +"} +(58,1,1) = {" +ghx +ghx +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -90420,10 +92169,6 @@ oSU oSU oSU oSU -"} -(58,1,1) = {" -ghx -ghx oSU oSU oSU @@ -90461,6 +92206,36 @@ oSU oSU oSU oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -90547,6 +92322,19 @@ oSU oSU oSU oSU +"} +(59,1,1) = {" +ghx +ghx +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -90674,13 +92462,40 @@ oSU oSU oSU oSU +wfF +wfF +wfF +wfF +wfF +wfF +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU -"} -(59,1,1) = {" -ghx -ghx oSU oSU oSU @@ -90764,6 +92579,20 @@ oSU oSU oSU oSU +"} +(60,1,1) = {" +ghx +ghx +ghx +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -90823,15 +92652,6 @@ oSU oSU oSU oSU -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx oSU oSU oSU @@ -90898,6 +92718,38 @@ oSU oSU oSU oSU +wfF +wfF +wfF +wfF +wfF +wfF +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -90934,11 +92786,6 @@ oSU oSU oSU oSU -"} -(60,1,1) = {" -ghx -ghx -ghx oSU oSU oSU @@ -90989,6 +92836,21 @@ oSU oSU oSU oSU +"} +(61,1,1) = {" +ghx +ghx +ghx +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -91079,18 +92941,6 @@ oSU oSU oSU oSU -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx oSU oSU oSU @@ -91124,6 +92974,39 @@ oSU oSU oSU oSU +wfF +wfF +wfF +wfF +wfF +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +wfF +iDt +iDt +iDt +cCb +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -91191,11 +93074,6 @@ oSU oSU oSU oSU -"} -(61,1,1) = {" -ghx -ghx -ghx oSU oSU oSU @@ -91215,6 +93093,23 @@ oSU oSU oSU oSU +"} +(62,1,1) = {" +ghx +ghx +ghx +ghx +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -91334,6 +93229,12 @@ oSU oSU oSU oSU +wfF +wfF +wfF +wfF +wfF +wfF ghx ghx ghx @@ -91349,21 +93250,22 @@ ghx ghx ghx ghx -oSU -iDt -iDt +ghx +ghx +wfF iDt -cCb -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +scw +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -91449,11 +93351,22 @@ oSU oSU oSU "} -(62,1,1) = {" +(63,1,1) = {" ghx ghx ghx ghx +ghx +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -91532,6 +93445,17 @@ oSU oSU oSU oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -91561,36 +93485,12 @@ oSU oSU oSU oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -ghx +wfF +wfF +wfF +wfF +wfF +wfF ghx ghx ghx @@ -91601,15 +93501,30 @@ ghx ghx ghx ghx +oAM ghx ghx ghx +xcC ghx ghx ghx -oSU +wfF iDt -scw +iDt +iDt +iDt +xMq +xMq +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -91692,6 +93607,25 @@ oSU oSU oSU oSU +"} +(64,1,1) = {" +wfF +ghx +ghx +ghx +ghx +ghx +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -91705,13 +93639,6 @@ oSU oSU oSU oSU -"} -(63,1,1) = {" -ghx -ghx -ghx -ghx -ghx oSU oSU oSU @@ -91763,6 +93690,30 @@ oSU oSU oSU oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -91791,6 +93742,52 @@ oSU oSU oSU oSU +wfF +wfF +wfF +wfF +wfF +wfF +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +sYA +ghx +ghx +ghx +vXO +hMz +ghx +hMz +psb +scw +scw +jSy +xMq +xMq +xMq +xMq +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +oSU +oSU +oSU oSU oSU oSU @@ -91846,31 +93843,7 @@ oSU oSU oSU oSU -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx -oAM -ghx -ghx -ghx -xcC -ghx -ghx -ghx oSU -iDt -iDt -iDt -iDt -xMq -xMq oSU oSU oSU @@ -91891,6 +93864,30 @@ oSU oSU oSU oSU +"} +(65,1,1) = {" +wfF +ghx +ghx +ghx +ghx +ghx +ghx +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +oSU +oSU oSU oSU oSU @@ -91943,6 +93940,39 @@ oSU oSU oSU oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +edN oSU oSU oSU @@ -91962,14 +93992,64 @@ oSU oSU oSU oSU -"} -(64,1,1) = {" oSU +oSU +oSU +oSU +oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +rjE ghx ghx ghx +isU ghx ghx +hMz +hUy +dZS +xuo +scw +iDt +qau +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU oSU oSU oSU @@ -92041,6 +94121,36 @@ oSU oSU oSU oSU +"} +(66,1,1) = {" +wfF +wfF +ghx +ghx +ghx +ghx +ghx +ghx +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -92079,6 +94189,47 @@ oSU oSU oSU oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -92103,6 +94254,12 @@ oSU oSU oSU oSU +wfF +wfF +wfF +wfF +wfF +wfF ghx ghx ghx @@ -92113,34 +94270,36 @@ ghx ghx ghx ghx -sYA ghx ghx +rjE ghx -vXO -hMz ghx -hMz -psb -scw -scw -jSy -xMq -xMq -xMq -xMq -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +ghx +isU +ghx +ghx +ghx +ghx +stA +xuo +xuo +xuo +nqv +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -92220,19 +94379,38 @@ oSU oSU oSU "} -(65,1,1) = {" -oSU -ghx -ghx -ghx -ghx -ghx -ghx -oSU -oSU -oSU -oSU -oSU +(67,1,1) = {" +wfF +wfF +wfF +ghx +ghx +ghx +ghx +ghx +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -92242,6 +94420,74 @@ oSU oSU oSU oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -92265,6 +94511,53 @@ oSU oSU oSU oSU +wfF +wfF +wfF +wfF +wfF +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +hMz +hMz +ghx +ghx +rjE +ghx +ghx +ghx +isU +ghx +ghx +ghx +ghx +stA +rQl +hUK +hUK +xMq +wfF +wfF +wfF +wfF +ghx +ghx +ghx +ghx +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -92342,6 +94635,119 @@ oSU oSU oSU oSU +"} +(68,1,1) = {" +wfF +wfF +wfF +ghx +ghx +ghx +ghx +ghx +ghx +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +ghx +ghx +ghx +wfF +wfF +wfF +wfF +wfF +wfF +wfF +oSU +oSU oSU oSU oSU @@ -92359,6 +94765,13 @@ oSU oSU oSU oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF ghx ghx ghx @@ -92370,27 +94783,39 @@ ghx ghx ghx ghx -rjE +jlu +uwH +lWI +flZ +lWI +lWI +lWI +qrj +ena ghx ghx ghx -isU +stA +xlq ghx ghx -hMz -hUy -dZS -xuo -scw -iDt -qau -oSU -oSU -oSU -oSU -oSU -oSU -oSU +xMq +xMq +wfF +wfF +ghx +ghx +ghx +ghx +ghx +ghx +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -92467,6 +94892,126 @@ oSU oSU oSU oSU +"} +(69,1,1) = {" +wfF +wfF +wfF +wfF +ghx +ghx +ghx +ghx +ghx +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +ghx +ghx +ghx +ghx +ghx +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +oSU +oSU +oSU +oSU +oSU +oSU oSU oSU oSU @@ -92476,16 +95021,59 @@ oSU oSU oSU oSU -"} -(66,1,1) = {" -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +ghx +ghx +ghx +ghx +ghx +ghx ghx ghx ghx ghx ghx +ndA +mSH +ngM +kgN +wDU +uwY +uwY +uwY +wDU +kUP +okH +qSq +ghx +stA +xlq +ghx ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -92561,6 +95149,188 @@ oSU oSU oSU oSU +"} +(70,1,1) = {" +wfF +wfF +wfF +wfF +wfF +ghx +ghx +ghx +ghx +ghx +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +ghx +ghx +ghx +ghx +ghx +ghx +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +cpt +dLH +kIX +xuo +xuo +qlU +wDU +roa +nIN +fob +wDU +xlq +ghx +qeL +lWI +gUp +ayG +okH +qSq +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -92615,6 +95385,126 @@ oSU oSU oSU oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +"} +(71,1,1) = {" +wfF +wfF +wfF +wfF +wfF +wfF +ghx +ghx +ghx +ghx +ghx +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +ghx +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF ghx ghx ghx @@ -92623,24 +95513,81 @@ ghx ghx ghx ghx +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF ghx ghx ghx ghx -rjE -ghx ghx ghx -isU ghx ghx ghx ghx -stA +iDt +aNc xuo xuo xuo -nqv +xuo +lnx +wDU +qmt +xbA +qmt +wDU +oBz +lWI +gUp +ojf +ojf +xlq +ghx +cpA +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +wfF +ghx +ghx +ghx +ghx +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -92716,6 +95663,188 @@ oSU oSU oSU oSU +"} +(72,1,1) = {" +ghx +wfF +wfF +wfF +wfF +wfF +ghx +ghx +ghx +ghx +ghx +ghx +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +ghx +ghx +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +ghx +ghx +ghx +ghx +ghx +ghx +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +wfF +wfF +wfF +iDt +sxe +xuo +xuo +jNH +wDU +tbX +qmt +fiC +vmH +tzv +qmt +tbX +wDU +wTG +xuo +xuo +oBz +lWI +vWP +ghx +ghx +ghx +ghx +ghx +ghx +ghx +wfF +wfF +wfF +ghx +ghx +ghx +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -92733,16 +95862,9 @@ oSU oSU oSU oSU -"} -(67,1,1) = {" oSU oSU oSU -ghx -ghx -ghx -ghx -ghx oSU oSU oSU @@ -92798,6 +95920,190 @@ oSU oSU oSU oSU +"} +(73,1,1) = {" +ghx +ghx +wfF +wfF +wfF +wfF +wfF +ghx +ghx +ghx +ghx +ghx +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +ghx +ghx +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +ghx +ghx +ghx +ghx +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +wfF +wfF +wfF +wfF +iDt +aUC +xuo +xuo +xuo +dBY +moc +tGi +ueH +fdp +lDc +dBY +moc +tGi +xuo +xuo +xuo +xuo +psb +xnX +ghx +ghx +ghx +ghx +ghx +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +oSU +oSU oSU oSU oSU @@ -92871,1849 +96177,188 @@ oSU oSU oSU oSU +"} +(74,1,1) = {" ghx ghx ghx ghx +wfF +wfF +wfF +ghx +ghx +ghx +ghx +ghx +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +ghx +ghx +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF ghx ghx ghx +wfF +wfF ghx ghx -hMz -hMz ghx ghx -rjE ghx ghx +wfF +wfF +ghx +ghx +ghx +wfF +wfF +wfF +wfF +wfF +oSU +oSU +oSU +oSU +oSU +oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +ghx ghx -isU ghx ghx ghx ghx -stA -rQl -hUK -hUK -xMq -oSU -oSU -oSU -oSU +ghx +ghx +wfF +wfF +wfF +wfF +iDt +sxe +xuo +jNH +wDU +qmt +qmt +qmt +hdY +tYz +qMu +qmt +qmt +qmt +tbX +tbX +tbX +wDU +wDU ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -"} -(68,1,1) = {" -oSU -oSU -oSU -ghx -ghx -ghx -ghx -ghx -ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -ghx -ghx -ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx -jlu -uwH -lWI -flZ -lWI -lWI -lWI -qrj -ena -ghx -ghx -ghx -stA -xlq -ghx -ghx -xMq -xMq -oSU -oSU -ghx -ghx -ghx -ghx -ghx -ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -"} -(69,1,1) = {" -oSU -oSU -oSU -oSU -ghx -ghx -ghx -ghx -ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -ghx -ghx -ghx -ghx -ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ndA -mSH -ngM -kgN -wDU -uwY -uwY -uwY -wDU -kUP -okH -qSq -ghx -stA -xlq -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -"} -(70,1,1) = {" -oSU -oSU -oSU -oSU -oSU -ghx -ghx -ghx -ghx -ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -ghx -ghx -ghx -ghx -ghx -ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx -cpt -dLH -kIX -xuo -xuo -qlU -wDU -roa -nIN -fob -wDU -xlq -ghx -qeL -lWI -gUp -ayG -okH -qSq -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -"} -(71,1,1) = {" -oSU -oSU -oSU -oSU -oSU -oSU -ghx -ghx -ghx -ghx -ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx -iDt -aNc -xuo -xuo -xuo -xuo -lnx -wDU -qmt -xbA -qmt -wDU -oBz -lWI -gUp -ojf -ojf -xlq -ghx -cpA -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx -oSU -ghx -ghx -ghx -ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -"} -(72,1,1) = {" -ghx -oSU -oSU -oSU -oSU -oSU -ghx -ghx -ghx -ghx -ghx -ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -ghx -ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -ghx -ghx -ghx -ghx -ghx -ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx -oSU -oSU -oSU -iDt -sxe -xuo -xuo -jNH -wDU -tbX -qmt -fiC -vmH -tzv -qmt -tbX -wDU -wTG -xuo -xuo -oBz -lWI -vWP -ghx -ghx -ghx -ghx -ghx -ghx -ghx -oSU -oSU -oSU -ghx -ghx -ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -"} -(73,1,1) = {" -ghx -ghx -oSU -oSU -oSU -oSU -oSU -ghx -ghx -ghx -ghx -ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -ghx -ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -ghx -ghx -ghx -ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx -oSU -oSU -oSU -oSU -iDt -aUC -xuo -xuo -xuo -dBY -moc -tGi -ueH -fdp -lDc -dBY -moc -tGi -xuo -xuo -xuo -xuo -psb -xnX -ghx -ghx -ghx -ghx -ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -"} -(74,1,1) = {" -ghx -ghx -ghx -ghx -oSU -oSU -oSU -ghx -ghx -ghx -ghx -ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -ghx -ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -ghx -ghx -ghx -oSU -oSU -ghx -ghx -ghx -ghx -ghx -ghx -oSU -oSU -ghx -ghx -ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx -oSU -oSU -oSU -oSU -iDt -sxe -xuo -jNH -wDU -qmt -qmt -qmt -hdY -tYz -qMu -qmt -qmt -qmt -tbX -tbX -tbX -wDU -wDU -ghx -ghx -ghx -ghx -ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +ghx +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -94796,101 +96441,101 @@ ghx ghx ghx ghx -oSU -oSU +wfF +wfF ghx ghx ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF ghx ghx ghx ghx ghx -oSU +wfF ghx ghx ghx @@ -94902,23 +96547,23 @@ ghx ghx ghx ghx +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF ghx ghx ghx @@ -94928,11 +96573,11 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF iDt psb rxz @@ -94956,20 +96601,20 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -95055,64 +96700,64 @@ ghx ghx ghx ghx -oSU +wfF ghx ghx ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF ghx ghx ghx @@ -95123,31 +96768,31 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF ghx ghx ghx ghx ghx ghx -oSU +wfF ghx ghx ghx @@ -95159,21 +96804,21 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF ghx ghx ghx @@ -95184,12 +96829,12 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF iDt xuo wDU @@ -95212,20 +96857,20 @@ wDU ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -95312,7 +96957,7 @@ ghx ghx ghx ghx -oSU +wfF ghx ghx ghx @@ -95320,57 +96965,57 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF ghx -oSU +wfF ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF ghx ghx ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF ghx ghx ghx @@ -95383,20 +97028,20 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF ghx ghx ghx @@ -95415,20 +97060,20 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF ghx ghx ghx @@ -95440,13 +97085,13 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF iDt xuo wDU @@ -95469,19 +97114,19 @@ wDU ver ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -95578,11 +97223,11 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF ghx ghx ghx @@ -95590,28 +97235,28 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF ghx ghx ghx @@ -95619,16 +97264,16 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF ghx ghx ghx @@ -95641,18 +97286,18 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF ghx ghx ghx @@ -95673,17 +97318,17 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF ghx ghx ghx @@ -95697,13 +97342,13 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF iDt xuo wDU @@ -95726,11 +97371,11 @@ wDU scw ghx ghx -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -95835,8 +97480,8 @@ ghx ghx ghx ghx -oSU -oSU +wfF +wfF ghx ghx ghx @@ -95847,24 +97492,24 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF ghx ghx ghx @@ -95875,20 +97520,20 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF ghx ghx ghx @@ -95899,16 +97544,16 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF ghx ghx ghx @@ -95930,17 +97575,17 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF ghx ghx ghx @@ -95954,13 +97599,13 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF iDt wDU qmt @@ -95983,11 +97628,11 @@ wDU scw ghx ghx -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -96105,22 +97750,22 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF ghx ghx ghx @@ -96132,20 +97777,20 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF ghx ghx ghx @@ -96159,12 +97804,12 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF ghx ghx ghx @@ -96190,13 +97835,13 @@ ghx hpE xuo xuo -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF ghx ghx ghx @@ -96210,14 +97855,14 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF iDt wDU btB @@ -96241,10 +97886,10 @@ iDt ghx ghx ghx -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF oSU oSU oSU @@ -96362,70 +98007,70 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx ghx ghx ghx @@ -96448,11 +98093,11 @@ psb fSd hUK gqG -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF ghx ghx ghx @@ -96466,15 +98111,15 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF iDt wDU haq @@ -96498,10 +98143,10 @@ scw ghx ghx ghx -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF oSU oSU oSU @@ -96620,19 +98265,19 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF ghx ghx ghx @@ -96644,26 +98289,26 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF ghx ghx ghx @@ -96722,16 +98367,16 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF iDt wDU paR @@ -96755,10 +98400,10 @@ cCb ghx ghx ghx -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF oSU oSU oSU @@ -96878,17 +98523,17 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF ghx ghx ghx @@ -96896,31 +98541,31 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF ghx ghx ghx @@ -96978,17 +98623,17 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF iDt wDU wDU @@ -97012,10 +98657,10 @@ iDt scw ghx ghx -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF oSU oSU oSU @@ -97136,48 +98781,48 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF ghx ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF ghx ghx ghx @@ -97234,17 +98879,17 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF iDt iDt iDt @@ -97268,11 +98913,11 @@ scw iDt iDt ghx -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -97393,48 +99038,48 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF ghx ghx ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF fIt ghx ghx @@ -97465,9 +99110,9 @@ ghx ghx ghx ghx -oSU -oSU -oSU +wfF +wfF +wfF ghx ghx ghx @@ -97488,20 +99133,20 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF iDt iDt iDt @@ -97525,11 +99170,11 @@ wkV iDt iDt ghx -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -97652,11 +99297,11 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF ghx ghx ghx @@ -97664,34 +99309,34 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF fIt ghx ghx @@ -97721,11 +99366,11 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF ghx ghx ghx @@ -97743,23 +99388,23 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +edN cCb iDt mJZ @@ -97782,11 +99427,11 @@ nqv iDt iDt ghx -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -97910,8 +99555,8 @@ ghx ghx ghx ghx -oSU -oSU +wfF +wfF ghx ghx ghx @@ -97923,32 +99568,32 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF fIt ghx ghx @@ -97973,17 +99618,17 @@ ghx ghx ghx ghx -oSU -oSU +wfF +wfF ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF xuo wYp odW @@ -97997,27 +99642,27 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF iDt rcY iDt @@ -98039,11 +99684,11 @@ qau iDt cCb ghx -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -98181,31 +99826,31 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF fIt rhF ghx @@ -98229,52 +99874,52 @@ ghx ghx ghx ghx -oSU -oSU -oSU +wfF +wfF +wfF ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF xuo xuo xuo xuo xuo hpE -oSU -ghx -ghx -ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +ghx +ghx +ghx +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF iDt rcY iDt @@ -98295,12 +99940,12 @@ scw qau iDt iDt -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -98439,30 +100084,30 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF fIt lWI lWI @@ -98486,52 +100131,52 @@ ghx ghx ghx ghx -oSU -oSU -oSU +wfF +wfF +wfF ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF iDt rcY iDt @@ -98552,12 +100197,12 @@ scw qau iDt iDt -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -98697,29 +100342,29 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF fIt xuo xuo @@ -98742,53 +100387,53 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF iDt syw kNC @@ -98808,13 +100453,13 @@ tej tej gIl iDt -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -98955,28 +100600,28 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF fIt xuo xuo @@ -98999,12 +100644,37 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF ghx ghx +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -99014,38 +100684,13 @@ oSU oSU oSU oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF iDt iDt iDt @@ -99065,13 +100710,13 @@ iDt iDt iDt iDt -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -99213,17 +100858,17 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF uOb uOb uOb @@ -99256,12 +100901,31 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF ghx ghx +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -99277,46 +100941,39 @@ oSU oSU oSU oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF scw -oSU -oSU +wfF +edN cCb iDt scw iDt +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -99403,197 +101060,185 @@ oSU oSU oSU oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -"} -(93,1,1) = {" -dhq -dhq -dhq -dhq -dhq -dhq -dhq -dhq -dhq -dhq -dhq -dhq -dhq -dhq -dhq -dhq -dhq -dhq -dhq -dhq -dhq -dhq -dhq -dhq -dhq -dhq -dhq -dhq -dhq -dhq -dhq -dhq -dhq -ghx -ghx -ghx -ghx -ghx -dhq -dhq -dhq -dhq -iZz -iZz -iZz -iZz -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -uOb -nDV -amx -fXO -lBR -nhg -gnR -lBR -nhg -qrq -lBR -kIo -hap -rfu -pjj -daf -daf -xuo -oBz -ena -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx -oSU -oSU -oSU -oSU -oSU -ghx -ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -iDt -iDt -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +"} +(93,1,1) = {" +dhq +dhq +dhq +dhq +dhq +dhq +dhq +dhq +dhq +dhq +dhq +dhq +dhq +dhq +dhq +dhq +dhq +dhq +dhq +dhq +dhq +dhq +dhq +dhq +dhq +dhq +dhq +dhq +dhq +dhq +dhq +dhq +dhq +ghx +ghx +ghx +ghx +ghx +dhq +dhq +dhq +dhq +iZz +iZz +iZz +iZz +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +uOb +nDV +amx +fXO +lBR +nhg +gnR +lBR +nhg +qrq +lBR +kIo +hap +rfu +pjj +daf +daf +xuo +oBz +ena +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +wfF +wfF +wfF +wfF +wfF +ghx +ghx +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +iDt +iDt +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU oSU oSU oSU @@ -99729,15 +101374,15 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF uOb eAg eAg @@ -99769,13 +101414,23 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF ghx ghx +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -99800,49 +101455,39 @@ oSU oSU oSU oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF scw -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -99987,14 +101632,14 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF uOb jnX amx @@ -100026,13 +101671,20 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF ghx ghx +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -100060,42 +101712,35 @@ oSU oSU oSU oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -100244,14 +101889,14 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF uOb eAg eAg @@ -100284,12 +101929,16 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF ghx ghx +wfF +wfF +wfF +wfF oSU oSU oSU @@ -100320,39 +101969,35 @@ oSU oSU oSU oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -100501,14 +102146,14 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF uOb ifZ amx @@ -100541,12 +102186,16 @@ ghx ghx ghx ghx -oSU -oSU -oSU +wfF +wfF +wfF ghx ghx ghx +wfF +wfF +wfF +wfF oSU oSU oSU @@ -100578,38 +102227,34 @@ oSU oSU oSU oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -100759,13 +102404,13 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF uOb eAg eAg @@ -100798,12 +102443,16 @@ ghx ghx ghx ghx -oSU -oSU -oSU +wfF +wfF +wfF ghx ghx ghx +wfF +wfF +wfF +wfF oSU oSU oSU @@ -100836,30 +102485,26 @@ oSU oSU oSU oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -101017,12 +102662,12 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF uOb aLM amx @@ -101055,11 +102700,16 @@ ghx ghx ghx ghx -oSU -oSU -oSU +wfF +wfF +wfF ghx ghx +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -101093,18 +102743,13 @@ oSU oSU oSU oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -101312,16 +102957,16 @@ ghx ghx ghx ghx -oSU -oSU +wfF +wfF ghx -oSU +wfF ghx -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -101572,13 +103217,13 @@ ghx ghx lcA ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -101828,14 +103473,14 @@ ghx ghx ghx psb -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -102085,14 +103730,14 @@ ghx ghx ghx psb -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -102342,13 +103987,13 @@ ghx ghx ghx psb -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -102599,13 +104244,13 @@ lcA psb psb lcA -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -102854,15 +104499,15 @@ ghx ghx rcY iDt -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -103111,15 +104756,15 @@ ghx ghx rcY iDt -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -103368,15 +105013,15 @@ ghx ghx lcA iDt -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -103625,15 +105270,15 @@ ghx ghx psb iDt -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -103882,15 +105527,15 @@ ghx ghx psb iDt -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -104139,15 +105784,15 @@ ghx ghx psb iDt -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -104396,15 +106041,15 @@ ghx ghx psb iDt -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -104653,15 +106298,15 @@ ghx ghx psb iDt -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -104910,12 +106555,12 @@ ghx ghx psb iDt -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -105165,14 +106810,14 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -105422,14 +107067,14 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -105679,14 +107324,14 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -105936,14 +107581,14 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -106193,14 +107838,14 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -106421,15 +108066,15 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF lTt foL fLA @@ -106450,14 +108095,14 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -106677,16 +108322,16 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF lTt tRW fLA @@ -106707,14 +108352,14 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -106934,16 +108579,16 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF lTt uIi fLA @@ -106964,14 +108609,14 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -107191,16 +108836,16 @@ ghx ghx iDt iDt -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF lTt kHH sYR @@ -107221,10 +108866,10 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF oSU oSU oSU @@ -107448,16 +109093,16 @@ ghx ghx iDt iDt -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF lTt lIY ehM @@ -107478,10 +109123,10 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF oSU oSU oSU @@ -107705,16 +109350,16 @@ ghx iDt iDt iDt -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF lTt qmR cdr @@ -107734,11 +109379,11 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -107962,16 +109607,16 @@ iDt iDt iDt iDt -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF lTt hJp wLH @@ -107989,13 +109634,13 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -108219,16 +109864,16 @@ iDt iDt iDt iDt -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF lTt lTt lTt @@ -108246,6 +109891,12 @@ ghx ghx ghx ghx +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -108404,125 +110055,119 @@ oSU oSU oSU oSU -oSU -oSU -oSU -oSU -oSU -oSU -"} -(128,1,1) = {" -dhq -dhq -dhq -dhq -dhq -dhq -dhq -dhq -dhq -dhq -dhq -dhq -dhq -dhq -dhq -dhq -dhq -dhq -dhq -dhq -dhq -dhq -dhq -dhq -dhq -dhq -dhq -dhq -dhq -dhq -dhq -dhq -dhq -iDt -iDt -iDt -iDt -iDt -iDt -vjh -dLN -dLN -dLN -dLN -vjh -aRm -vjh -vjh -vjh -uPl -vjh -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx -iDt -iDt -iDt -iDt -iDt -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx -ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +"} +(128,1,1) = {" +dhq +dhq +dhq +dhq +dhq +dhq +dhq +dhq +dhq +dhq +dhq +dhq +dhq +dhq +dhq +dhq +dhq +dhq +dhq +dhq +dhq +dhq +dhq +dhq +dhq +dhq +dhq +dhq +dhq +dhq +dhq +dhq +dhq +iDt +iDt +iDt +iDt +iDt +iDt +vjh +dLN +dLN +dLN +dLN +vjh +aRm +vjh +vjh +vjh +uPl +vjh +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +iDt +iDt +iDt +iDt +iDt +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +ghx +wfF +wfF +wfF +wfF +wfF +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU +oSU oSU oSU oSU @@ -108733,20 +110378,20 @@ iDt iDt iDt iDt -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF ghx ghx ghx @@ -108758,13 +110403,13 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -108990,20 +110635,20 @@ iDt iDt iDt iDt -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF ghx ghx ghx @@ -109015,13 +110660,13 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -109247,20 +110892,20 @@ iDt iDt iDt iDt -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF ghx ghx ghx @@ -109272,13 +110917,13 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -109504,21 +111149,21 @@ dBw iDt iDt iDt -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF ghx ghx ghx @@ -109529,12 +111174,12 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -109761,36 +111406,36 @@ nTO nTO nJm iDt -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -110018,34 +111663,34 @@ tmB kCH iDt iDt -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -110275,34 +111920,34 @@ nTO nTO iDt iDt -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -110532,32 +112177,32 @@ cRE eQT iDt iDt -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -110789,32 +112434,32 @@ rmv eQT iDt iDt -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -111046,32 +112691,32 @@ nTO nTO nTO iDt -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -111303,32 +112948,32 @@ hMJ vbg nTO iDt -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -111560,28 +113205,28 @@ mQq xxc nTO iDt -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -111817,22 +113462,22 @@ eYC xjO nTO iDt -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -112074,21 +113719,21 @@ cpe nTO nTO iDt -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -112331,20 +113976,20 @@ krC nTO iDt iDt -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -112588,19 +114233,19 @@ nTO nTO iDt iDt -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -112845,18 +114490,18 @@ iDt iDt iDt iDt -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -113102,17 +114747,17 @@ iDt iDt iDt iDt -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -113359,17 +115004,17 @@ iDt iDt iDt iDt -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -113616,17 +115261,17 @@ iDt iDt iDt iDt -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -113873,17 +115518,17 @@ iDt iDt iDt iDt -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -114123,22 +115768,22 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -114380,21 +116025,21 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -114636,6 +116281,21 @@ ghx ghx ghx ghx +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -114731,23 +116391,8 @@ oSU oSU oSU oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +szG +szG oSU oSU oSU @@ -114893,6 +116538,20 @@ ghx ghx ghx ghx +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -114987,25 +116646,11 @@ oSU oSU oSU oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +szG +szG +szG +szG +szG oSU oSU oSU @@ -115150,6 +116795,19 @@ ghx ghx ghx ghx +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -115244,25 +116902,12 @@ oSU oSU oSU oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +szG +szG +iDt +hgT +iDt +szG oSU oSU oSU @@ -115407,6 +117052,15 @@ ghx ghx ghx ghx +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -115505,21 +117159,12 @@ oSU oSU oSU oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +szG +lGa +iDt +iDt +iDt +szG oSU oSU oSU @@ -115664,6 +117309,15 @@ ghx ghx ghx ghx +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -115762,21 +117416,12 @@ oSU oSU oSU oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +szG +szG +iDt +iDt +cCb +szG oSU oSU oSU @@ -115921,6 +117566,15 @@ ghx ghx ghx ghx +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -116020,20 +117674,11 @@ oSU oSU oSU oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +szG +szG +iDt +iDt +szG oSU oSU oSU @@ -116178,6 +117823,15 @@ ghx ghx ghx ghx +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -116278,19 +117932,10 @@ oSU oSU oSU oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +szG +szG +szG +szG oSU oSU oSU @@ -116434,16 +118079,16 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -116691,16 +118336,16 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -116948,16 +118593,16 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -117204,17 +118849,17 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -117461,17 +119106,17 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -117718,14 +119363,14 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -117975,14 +119620,14 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -118232,14 +119877,14 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -118489,14 +120134,14 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -118745,15 +120390,15 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -119002,14 +120647,14 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -119259,12 +120904,12 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -119515,13 +121160,13 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -119772,13 +121417,13 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -120028,14 +121673,14 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -120285,14 +121930,14 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -120542,14 +122187,14 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -120798,15 +122443,15 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -121054,16 +122699,16 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -121311,15 +122956,15 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -121567,15 +123212,15 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -121824,15 +123469,15 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -122081,15 +123726,15 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -122337,16 +123982,16 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -122594,16 +124239,16 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -122851,16 +124496,16 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -123108,16 +124753,16 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -123365,15 +125010,15 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -123621,15 +125266,15 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -123878,15 +125523,15 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -124134,16 +125779,16 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -124391,16 +126036,16 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -124647,17 +126292,17 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -124904,16 +126549,16 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -125161,15 +126806,15 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -125417,16 +127062,16 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -125674,16 +127319,16 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -125930,17 +127575,17 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -126187,17 +127832,17 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -126443,17 +128088,17 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -126699,17 +128344,17 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -126955,18 +128600,18 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -127212,17 +128857,17 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -127468,17 +129113,17 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -127723,18 +129368,18 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -127979,19 +129624,19 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -128235,19 +129880,19 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -128491,20 +130136,20 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -128747,21 +130392,21 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -129003,21 +130648,21 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -129259,21 +130904,21 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -129515,22 +131160,22 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -129771,22 +131416,22 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -130027,23 +131672,23 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -130283,24 +131928,24 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -130539,24 +132184,24 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -130796,22 +132441,22 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -131052,23 +132697,23 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -131309,21 +132954,21 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -131566,19 +133211,19 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -131823,16 +133468,16 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -132079,15 +133724,15 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -132336,15 +133981,15 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -132592,16 +134237,16 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -132849,14 +134494,14 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -133105,15 +134750,15 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -133362,15 +135007,15 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -133618,16 +135263,16 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -133875,16 +135520,16 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -134131,14 +135776,14 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -134387,15 +136032,15 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -134643,16 +136288,16 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -134898,18 +136543,18 @@ ghx ghx ghx ghx -ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -135155,16 +136800,16 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -135411,17 +137056,17 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -135667,18 +137312,18 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -135923,15 +137568,15 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -136179,15 +137824,15 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -136435,15 +138080,15 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -136691,14 +138336,14 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -136947,14 +138592,14 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -137204,14 +138849,14 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -137460,12 +139105,12 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -137717,12 +139362,12 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -137973,12 +139618,12 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -138230,12 +139875,12 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -138487,12 +140132,12 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -138743,13 +140388,13 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -139000,12 +140645,12 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -139256,12 +140901,12 @@ ghx ghx ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -139511,14 +141156,14 @@ oSU (249,1,1) = {" ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -139768,14 +141413,14 @@ oSU (250,1,1) = {" ghx ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -140024,15 +141669,15 @@ oSU "} (251,1,1) = {" ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -140281,15 +141926,15 @@ oSU "} (252,1,1) = {" ghx -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -140537,16 +142182,16 @@ oSU oSU "} (253,1,1) = {" -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -140794,16 +142439,16 @@ oSU oSU "} (254,1,1) = {" -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -141051,16 +142696,16 @@ oSU oSU "} (255,1,1) = {" -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU -oSU +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oSU oSU oSU @@ -148760,156 +150405,8 @@ tjo tjo tjo tjo -"} -(30,1,2) = {" -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +"} +(30,1,2) = {" tjo tjo tjo @@ -149017,8 +150514,6 @@ tjo tjo tjo tjo -"} -(31,1,2) = {" tjo tjo tjo @@ -149167,6 +150662,8 @@ tjo tjo tjo tjo +"} +(31,1,2) = {" tjo tjo tjo @@ -149274,8 +150771,6 @@ tjo tjo tjo tjo -"} -(32,1,2) = {" tjo tjo tjo @@ -149424,6 +150919,8 @@ tjo tjo tjo tjo +"} +(32,1,2) = {" tjo tjo tjo @@ -149531,8 +151028,6 @@ tjo tjo tjo tjo -"} -(33,1,2) = {" tjo tjo tjo @@ -149681,6 +151176,8 @@ tjo tjo tjo tjo +"} +(33,1,2) = {" tjo tjo tjo @@ -149788,8 +151285,6 @@ tjo tjo tjo tjo -"} -(34,1,2) = {" tjo tjo tjo @@ -149836,6 +151331,13 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -149931,6 +151433,8 @@ tjo tjo tjo tjo +"} +(34,1,2) = {" tjo tjo tjo @@ -149966,7 +151470,6 @@ tjo tjo tjo tjo -gjq tjo tjo tjo @@ -150045,8 +151548,6 @@ tjo tjo tjo tjo -"} -(35,1,2) = {" tjo tjo tjo @@ -150083,6 +151584,17 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -150099,6 +151611,7 @@ tjo tjo tjo tjo +gjq tjo tjo tjo @@ -150177,6 +151690,8 @@ tjo tjo tjo tjo +"} +(35,1,2) = {" tjo tjo tjo @@ -150223,7 +151738,6 @@ tjo tjo tjo tjo -gjq tjo tjo tjo @@ -150302,8 +151816,6 @@ tjo tjo tjo tjo -"} -(36,1,2) = {" tjo tjo tjo @@ -150325,6 +151837,24 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -150338,6 +151868,7 @@ tjo tjo tjo tjo +gjq tjo tjo tjo @@ -150416,6 +151947,8 @@ tjo tjo tjo tjo +"} +(36,1,2) = {" tjo tjo tjo @@ -150479,7 +152012,6 @@ tjo tjo tjo tjo -gjq tjo tjo tjo @@ -150557,10 +152089,34 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo -"} -(37,1,2) = {" tjo tjo tjo @@ -150568,6 +152124,7 @@ tjo tjo tjo tjo +gjq tjo tjo tjo @@ -150647,6 +152204,8 @@ tjo tjo tjo tjo +"} +(37,1,2) = {" tjo tjo tjo @@ -150735,7 +152294,6 @@ tjo tjo tjo tjo -gjq tjo tjo tjo @@ -150782,10 +152340,48 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo tjo +gjq +tjo tjo tjo tjo @@ -150816,8 +152412,6 @@ tjo tjo tjo tjo -"} -(38,1,2) = {" tjo tjo tjo @@ -150867,6 +152461,8 @@ tjo tjo tjo tjo +"} +(38,1,2) = {" tjo tjo tjo @@ -150971,10 +152567,6 @@ tjo tjo tjo tjo -iDt -iDt -iDt -iDt tjo tjo tjo @@ -150991,8 +152583,6 @@ tjo tjo tjo tjo -gjq -gjq tjo tjo tjo @@ -151006,9 +152596,48 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +iDt +iDt +iDt +iDt +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo +gjq +gjq tjo tjo tjo @@ -151073,8 +152702,6 @@ tjo tjo tjo tjo -"} -(39,1,2) = {" tjo tjo tjo @@ -151091,6 +152718,8 @@ tjo tjo tjo tjo +"} +(39,1,2) = {" tjo tjo tjo @@ -151224,6 +152853,22 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF iDt iDt pfw @@ -151235,16 +152880,16 @@ pfw iDt ebd iDt -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo gjq gjq @@ -151465,18 +153110,18 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF gjq gjq -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF iDt ebd iDt @@ -151493,15 +153138,15 @@ ijY iDt iDt iDt -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF gjq gjq gjq @@ -151723,14 +153368,14 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF gjq -tjo -tjo +wfF +wfF iDt pfw iDt @@ -151752,19 +153397,19 @@ iDt iDt iDt iDt -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF gjq gjq gjq gjq gjq gjq -tjo -tjo +wfF +wfF tjo tjo tjo @@ -151980,11 +153625,11 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF gjq gjq gjq @@ -152011,8 +153656,8 @@ iDt ijY iDt iDt -tjo -tjo +wfF +wfF gjq gjq gjq @@ -152020,9 +153665,9 @@ gjq gjq gjq gjq -tjo -tjo -tjo +wfF +wfF +wfF tjo tjo tjo @@ -152238,10 +153883,10 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF gjq gjq gjq @@ -152277,9 +153922,9 @@ gjq gjq gjq gjq -tjo -tjo -tjo +wfF +wfF +wfF tjo tjo tjo @@ -152495,11 +154140,11 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF gjq gjq gjq @@ -152533,10 +154178,10 @@ gjq gjq gjq gjq -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF tjo tjo tjo @@ -152752,12 +154397,12 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF gjq gjq gjq @@ -152790,10 +154435,10 @@ iDt iDt gjq gjq -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF tjo tjo tjo @@ -153009,13 +154654,13 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF gjq gjq gjq @@ -153045,12 +154690,12 @@ ebd iDt iDt iDt -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -153266,13 +154911,13 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF gjq gjq gjq @@ -153302,12 +154947,12 @@ iDt iDt iDt cCb -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -153523,15 +155168,15 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF gjq gjq gjq @@ -153560,11 +155205,11 @@ iDt iDt iDt iDt -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -153780,15 +155425,15 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF gjq gjq gjq @@ -153817,11 +155462,11 @@ iDt iDt ebd iDt -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -154034,17 +155679,17 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF oif eJf eJf @@ -154074,11 +155719,11 @@ iDt iDt iDt iDt -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -154288,21 +155933,21 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF gjq gjq gjq @@ -154331,11 +155976,11 @@ scw iDt iDt iDt -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -154543,22 +156188,22 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF gjq -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF gjq gjq gjq @@ -154588,6 +156233,11 @@ scw iDt iDt pfw +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -154666,24 +156316,8 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -"} -(53,1,2) = {" -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +"} +(53,1,2) = {" tjo tjo tjo @@ -154809,11 +156443,22 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF gjq -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF gjq gjq gjq @@ -154845,11 +156490,11 @@ iDt iDt iDt iDt -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -155014,6 +156659,9 @@ tjo tjo tjo tjo +wfF +wfF +wfF tjo tjo tjo @@ -155052,24 +156700,21 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF gjq -tjo -tjo -tjo +wfF +wfF +wfF gjq gjq -tjo -tjo -tjo +wfF +wfF +wfF gjq gjq gjq @@ -155102,11 +156747,11 @@ iDt iDt iDt iDt -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -155269,6 +156914,12 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -155306,16 +156957,10 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF gjq gjq gjq @@ -155323,9 +156968,9 @@ gjq gjq gjq gjq -tjo -tjo -tjo +wfF +wfF +wfF gjq gjq gjq @@ -155359,11 +157004,11 @@ ulj ijY iDt iDt -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -155525,6 +157170,15 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -155555,34 +157209,25 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF gjq gjq gjq gjq -tjo -tjo -tjo +wfF +wfF +wfF gjq gjq gjq @@ -155615,12 +157260,12 @@ oif ebd iDt iDt -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -155781,6 +157426,18 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -155808,36 +157465,24 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF gjq gjq -tjo +wfF gjq gjq gjq @@ -155872,12 +157517,12 @@ gjq gjq iDt iDt -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -156037,13 +157682,20 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF gjq +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -156070,28 +157722,21 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF gjq gjq gjq @@ -156129,12 +157774,12 @@ gjq gjq pfw pfw -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -156294,14 +157939,22 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF gjq gjq +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -156326,29 +157979,21 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF szG szG -tjo -tjo -tjo +wfF +wfF +wfF gjq gjq gjq @@ -156385,13 +158030,13 @@ gjq gjq gjq gjq -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -156552,13 +158197,21 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF gjq +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -156582,28 +158235,20 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF tKI tKI tKI tKI -tjo -tjo +wfF +wfF szG szG oif -tjo +wfF gjq gjq gjq @@ -156642,13 +158287,13 @@ gjq gjq gjq gjq -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -156809,16 +158454,23 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF gjq gjq gjq +wfF +wfF +wfF +wfF +wfF +wfF +iix tjo tjo tjo @@ -156840,23 +158492,16 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF tKI ipa uDP tKI -tjo -tjo +wfF +wfF szG gFX eJf @@ -156900,12 +158545,12 @@ gjq gjq gjq gjq -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -157067,15 +158712,23 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF gjq gjq gjq +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -157096,24 +158749,16 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF tKI ibB qAz tKI -tjo -tjo +wfF +wfF gjq gjq eJf @@ -157157,12 +158802,12 @@ gjq gjq gjq gjq -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -157325,16 +158970,23 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF gjq gjq gjq gjq +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -157354,23 +159006,16 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF tKI thc kcE tKI szG -tjo +wfF gjq gjq eJf @@ -157415,11 +159060,11 @@ gjq gjq gjq gjq -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -157582,17 +159227,24 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF gjq gjq gjq gjq gjq gjq +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -157611,17 +159263,10 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF tKI wlH pQs @@ -157673,10 +159318,10 @@ gjq ebd gjq gjq -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF tjo tjo tjo @@ -157840,10 +159485,10 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF gjq gjq gjq @@ -157852,6 +159497,12 @@ gjq gjq gjq gjq +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -157869,16 +159520,10 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF tKI lFr vWx @@ -157930,10 +159575,10 @@ gjq iDt iDt gjq -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF tjo tjo tjo @@ -158098,19 +159743,25 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF gjq gjq -tjo +wfF gjq gjq gjq gjq gjq gjq +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -158126,16 +159777,10 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF tKI gyc afz @@ -158187,10 +159832,10 @@ eJf oif iDt pfw -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF tjo tjo tjo @@ -158356,18 +160001,25 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF gjq gjq -tjo +wfF gjq gjq gjq gjq gjq +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -158382,17 +160034,10 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF tKI mGl tKI @@ -158444,10 +160089,10 @@ iDt ijY iDt iDt -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF tjo tjo tjo @@ -158613,19 +160258,26 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF gjq gjq gjq gjq +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -158639,17 +160291,10 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF iwS viN qRh @@ -158701,10 +160346,10 @@ pfw pfw iDt ebd -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF tjo tjo tjo @@ -158871,19 +160516,26 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF gjq gjq gjq gjq +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -158895,18 +160547,11 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF iwS llQ ueN @@ -158958,10 +160603,10 @@ iDt ebd ijY iDt -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF tjo tjo tjo @@ -159129,20 +160774,26 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF gjq gjq gjq gjq gjq gjq +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -159153,16 +160804,10 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF iwS iwS kSG @@ -159215,10 +160860,10 @@ iDt iDt iDt iDt -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF tjo tjo tjo @@ -159387,19 +161032,26 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF gjq gjq gjq gjq gjq +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -159409,17 +161061,10 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF iwS iJM bti @@ -159472,10 +161117,10 @@ iDt iDt iDt iDt -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF tjo tjo tjo @@ -159645,13 +161290,13 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF gjq gjq gjq @@ -159659,6 +161304,12 @@ gjq gjq gjq gjq +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -159667,16 +161318,10 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF iwS iJM bti @@ -159729,10 +161374,10 @@ iDt iDt pfw iDt -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF tjo tjo tjo @@ -159902,38 +161547,38 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF gjq gjq gjq gjq gjq gjq +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF iwS iwS qLU @@ -159986,6 +161631,10 @@ iDt ulj iDt iDt +wfF +wfF +wfF +wfF tjo tjo tjo @@ -160064,38 +161713,8 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -"} -(74,1,2) = {" -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +"} +(74,1,2) = {" tjo tjo tjo @@ -160159,16 +161778,42 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo tjo tjo tjo +wfF +wfF tjo tjo tjo tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF gjq gjq gjq @@ -160176,22 +161821,22 @@ gjq gjq gjq gjq -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF iwS eqc kRg @@ -160243,10 +161888,10 @@ iDt iDt ebd iDt -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF tjo tjo tjo @@ -160387,68 +162032,68 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF gjq gjq gjq gjq gjq gjq -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF iwS kXV nwo @@ -160500,10 +162145,10 @@ iDt iDt iDt iDt -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF tjo tjo tjo @@ -160643,69 +162288,69 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF gjq gjq -tjo -tjo +wfF +wfF gjq gjq gjq gjq gjq gjq -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF iwS iwS iwS @@ -160755,11 +162400,11 @@ iDt ijY iDt iDt -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -160900,49 +162545,49 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF gjq gjq gjq gjq -tjo -tjo +wfF +wfF gjq gjq gjq @@ -160950,25 +162595,25 @@ gjq gjq gjq gjq -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tKI aqy tKI @@ -161012,11 +162657,11 @@ iDt iDt iDt iDt -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -161157,41 +162802,41 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF gjq gjq gjq @@ -161208,24 +162853,24 @@ gjq gjq gjq gjq -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tKI pdf aFr @@ -161269,10 +162914,10 @@ iDt iDt iDt iDt -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF tjo tjo tjo @@ -161413,11 +163058,11 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF kSw xMq xMq @@ -161432,22 +163077,22 @@ cek cek cek kSw -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF gjq gjq gjq @@ -161467,22 +163112,22 @@ gjq gjq gjq gjq -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tKI czV tKI @@ -161526,10 +163171,10 @@ iDt iDt iDt iDt -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF tjo tjo tjo @@ -161670,11 +163315,11 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF xMq ijY iDt @@ -161690,20 +163335,20 @@ iDt iDt iDt gjq -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF gjq gjq gjq @@ -161732,14 +163377,14 @@ gjq gjq gjq gjq -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF scw scw nVb @@ -161783,10 +163428,10 @@ iDt iDt iDt iDt -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF tjo tjo tjo @@ -161927,11 +163572,11 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF xMq iDt hPs @@ -161991,11 +163636,11 @@ gjq gjq gjq gjq -tjo -tjo +wfF +wfF gqG -tjo -tjo +wfF +wfF gqG myZ myZ @@ -162040,10 +163685,10 @@ ulj iDt iDt iDt -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF tjo tjo tjo @@ -162183,12 +163828,12 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF xMq iDt oqL @@ -162297,10 +163942,10 @@ iDt iDt iDt iDt -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF tjo tjo tjo @@ -162440,12 +164085,12 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF xMq iDt oqL @@ -162554,10 +164199,10 @@ iDt iDt iDt iDt -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF tjo tjo tjo @@ -162697,12 +164342,12 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF xMq iDt oqL @@ -162810,11 +164455,11 @@ ijY iDt iDt iDt -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -162953,13 +164598,13 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF kSw iDt ktt @@ -163067,11 +164712,11 @@ iDt iDt iDt iDt -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -163209,14 +164854,14 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF xMq iDt hPs @@ -163323,12 +164968,12 @@ iDt iDt iDt iDt -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -163465,12 +165110,12 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF xMq xMq xMq @@ -163581,11 +165226,11 @@ iDt sVN iDt psb -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -163720,13 +165365,13 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF xMq xMq ebd @@ -163838,11 +165483,11 @@ wOR xuo itY iDt -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -163975,15 +165620,15 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF xMq iDt iDt @@ -164031,12 +165676,12 @@ rTI deY rTI iDt -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF gjq gjq gjq @@ -164095,11 +165740,11 @@ xuo tZp iDt iDt -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -164231,14 +165876,14 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF xMq xMq xMq @@ -164288,7 +165933,7 @@ skl avg skl pfw -tjo +wfF iDt iDt iDt @@ -164352,11 +165997,11 @@ cmZ xuo iDt jZN -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -164488,14 +166133,14 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF xMq ebd iDt @@ -164609,11 +166254,11 @@ iDt iDt iDt psb -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -164745,14 +166390,14 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF xMq iDt iDt @@ -164805,20 +166450,20 @@ ebd iDt nfG pfw -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF nfG iDt iDt @@ -164831,7 +166476,7 @@ iDt iDt iDt iDt -tjo +wfF iDt scw iDt @@ -164861,15 +166506,15 @@ iDt iDt iDt iDt -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -165002,12 +166647,12 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF iDt iDt kSw @@ -165057,28 +166702,28 @@ hGF aWD wMt iDt -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF xMq ebd iDt @@ -165087,9 +166732,9 @@ iDt scw iDt nfG -tjo -tjo -tjo +wfF +wfF +wfF iDt iDt iDt @@ -165118,15 +166763,15 @@ iDt iDt iDt iDt -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -165259,11 +166904,11 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF iDt iDt iDt @@ -165313,40 +166958,40 @@ qsk xbR nEZ wMt -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF xMq xMq iDt iDt ijY xMq -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF nfG iDt iDt @@ -165375,14 +167020,14 @@ iDt iDt jZN iDt -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -165516,11 +167161,11 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF iDt iDt iDt @@ -165570,40 +167215,40 @@ gKQ gdC ppS wMt -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF xMq xMq scw xMq xMq -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF xMq iDt scw @@ -165630,16 +167275,16 @@ iDt iDt iDt iDt -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -165773,11 +167418,11 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF iDt iDt iDt @@ -165827,42 +167472,42 @@ pvz oKJ qQN wMt -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF iDt iDt iDt @@ -165886,15 +167531,15 @@ iDt iDt iDt iDt -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -166030,12 +167675,12 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF iDt iDt kSw @@ -166084,6 +167729,11 @@ gKQ eGW qQN wMt +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -166095,29 +167745,24 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF xMq xMq ijY @@ -166138,17 +167783,17 @@ iDt xMq xMq xMq -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -166287,14 +167932,14 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF xMq ijY iDt @@ -166341,6 +167986,10 @@ gKQ eGW qQN wMt +wfF +wfF +wfF +wfF tjo tjo tjo @@ -166357,23 +168006,19 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF xMq xMq xMq @@ -166393,18 +168038,18 @@ iDt iDt jZN xMq -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -166544,14 +168189,14 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF xMq xMq iDt @@ -166598,6 +168243,10 @@ gKQ jSL jSL wMt +wfF +wfF +wfF +wfF tjo tjo tjo @@ -166614,31 +168263,27 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF psb scw psb -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF xMq -tjo -tjo +wfF +wfF xMq ijY jZN @@ -166647,18 +168292,18 @@ iDt iDt xMq xMq -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -166801,15 +168446,15 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF xMq iDt iDt @@ -166855,6 +168500,10 @@ gKQ gKQ wMt wMt +wfF +wfF +wfF +wfF tjo tjo tjo @@ -166875,46 +168524,42 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF scw iDt scw -tjo -tjo -tjo +wfF +wfF +wfF xMq xMq -tjo -tjo -tjo +wfF +wfF +wfF xMq xMq aRt aRt xMq xMq -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -167058,15 +168703,15 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF xMq xMq xMq @@ -167110,6 +168755,12 @@ lQq aiX bPe gKQ +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -167132,46 +168783,40 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF psb scw psb -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF iDt scw -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -167315,17 +168960,17 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF xMq xMq iDt @@ -167367,6 +169012,12 @@ dyf ile neC gKQ +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -167389,41 +169040,35 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF iDt iDt iDt -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF iDt iDt iDt -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -167572,18 +169217,18 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF xMq xMq iDt @@ -167604,10 +169249,10 @@ eCI sFr pRB cGl -tVf +tZj rzY qsC -tVf +tZj frS wPD frS @@ -167624,6 +169269,11 @@ dyf xCb gDe gKQ +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -167647,40 +169297,35 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF iDt iDt iDt iDt -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF xMq scw scw iDt -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -167829,19 +169474,19 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF xMq kSw iDt @@ -167861,10 +169506,10 @@ pCc sFr qLD bbY -tVf +tZj kmC dom -tVf +tZj vIH gXh rEe @@ -167881,6 +169526,10 @@ jbI oQN xtn gKQ +wfF +wfF +wfF +wfF tjo tjo tjo @@ -167902,33 +169551,37 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF iDt iDt iDt iDt -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF xMq iDt iDt iDt +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -168027,31 +169680,8 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -"} -(105,1,2) = {" -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +"} +(105,1,2) = {" tjo tjo tjo @@ -168100,6 +169730,21 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF cek iDt xhK @@ -168118,10 +169763,10 @@ cVL sFr aym iti -tVf +tZj qQt dom -tVf +tZj tvK qMA fzG @@ -168138,6 +169783,10 @@ oTe cAz dEv gKQ +wfF +wfF +wfF +wfF tjo tjo tjo @@ -168159,40 +169808,36 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF iDt iDt iDt iDt iDt iDt -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF xMq xMq iDt scw iDt -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -168342,11 +169987,11 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF gjq gjq gjq @@ -168375,10 +170020,10 @@ xIg sFr szz rnb -tVf +tZj pds tfB -tVf +tZj cEP glC vvG @@ -168395,6 +170040,10 @@ dTr gjS dUW gKQ +wfF +wfF +wfF +wfF tjo tjo tjo @@ -168416,15 +170065,11 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF iDt xPu iDt @@ -168432,23 +170077,23 @@ xPu iDt iDt iDt -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF xMq nfG iDt iDt iDt -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -168599,11 +170244,11 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF gjq gjq gjq @@ -168632,10 +170277,10 @@ sFr sFr xHE xHE -tVf +tZj qQt oqs -tVf +tZj mKq xEd pQK @@ -168652,6 +170297,10 @@ gKQ gKQ gKQ gKQ +wfF +wfF +wfF +wfF tjo tjo tjo @@ -168673,14 +170322,10 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF iDt iDt aaD @@ -168689,23 +170334,23 @@ aaD iDt iDt iDt -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF xMq -tjo +wfF iDt iDt scw -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -168856,11 +170501,11 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF gjq gjq gjq @@ -168877,7 +170522,7 @@ xhK oyH swf vVH -kqn +coJ oVY rwu tVf @@ -168886,13 +170531,13 @@ gAn hgH nmI kZi -mMM -mMM -mMM -mMM +qfl +qfl +qfl +qfl sot gOT -tVf +tZj xhK xhK xhK @@ -168902,6 +170547,17 @@ gjq gjq gjq gjq +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -168923,20 +170579,9 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF iDt iDt iDt @@ -168946,23 +170591,23 @@ alW iDt iDt iDt -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF iDt iDt iDt -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -169113,11 +170758,11 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF gjq gjq gjq @@ -169142,11 +170787,11 @@ wJi rME bol rkT -mMM -mMM +qfl +qfl sBe stU -mMM +qfl aUp dom wwO @@ -169159,6 +170804,16 @@ gjq gjq gjq gjq +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -169179,20 +170834,10 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF iDt iDt iDt @@ -169205,22 +170850,22 @@ aVq iDt xMq xMq -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF iDt scw iDt xMq -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -169370,12 +171015,12 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF gjq gjq gjq @@ -169400,9 +171045,9 @@ hUz bjp bjp iSN -bol +wWD gfW -bol +wWD qFb vRX dom @@ -169416,6 +171061,15 @@ gjq gjq gjq gjq +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -169437,19 +171091,10 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF iDt iDt iDt @@ -169472,18 +171117,18 @@ iDt scw iDt xMq -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -169627,13 +171272,13 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF gjq gjq gjq @@ -169657,7 +171302,7 @@ ate ate ate oYR -npL +xBa iqQ iqQ dIc @@ -169673,6 +171318,14 @@ gjq gjq gjq gjq +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -169695,18 +171348,10 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF iDt vcj vcj @@ -169729,19 +171374,19 @@ scw iDt iDt xMq -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -169884,13 +171529,13 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF gjq gjq gjq @@ -169915,12 +171560,12 @@ syB syB kkP lJT -iRV +tGc eYj qFb lie wFv -mMM +qfl xhK xhK xhK @@ -169930,6 +171575,13 @@ gjq gjq gjq gjq +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -169952,18 +171604,11 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF iDt vcj odf @@ -169987,18 +171632,18 @@ ijY iDt xMq xMq -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -170141,14 +171786,14 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF gjq gjq gjq @@ -170178,15 +171823,21 @@ pNm tpH uIC pNm -tjo -tjo -tjo -tjo +iix +iix +iix +iix gjq gjq gjq gjq gjq +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -170210,17 +171861,11 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF iDt vcj sIO @@ -170245,25 +171890,25 @@ iDt ebd xMq xMq -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -170398,15 +172043,15 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF gjq gjq gjq @@ -170435,15 +172080,20 @@ pNm oPn wnv pNm -tjo -tjo -tjo -tjo +iix +iix +iix +iix gjq gjq gjq gjq gjq +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -170467,17 +172117,12 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF iDt vcj igL @@ -170490,11 +172135,11 @@ aaD xQu iDt xMq -tjo +wfF xMq xMq xMq -tjo +wfF xMq nfG iDt @@ -170502,27 +172147,27 @@ iDt iDt iDt xMq -tjo -tjo +wfF +wfF xMq xMq xMq -tjo -tjo +wfF +wfF xMq -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -170655,15 +172300,15 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF gjq gjq gjq @@ -170692,15 +172337,20 @@ pNm bdF bQS pNm -tjo -tjo -tjo -tjo +iix +iix +iix +iix gjq gjq gjq gjq gjq +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -170714,27 +172364,22 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF iDt vcj vcj @@ -170747,11 +172392,11 @@ nfG iDt xMq xMq -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF xMq xMq iDt @@ -170767,20 +172412,20 @@ iDt iDt nfG xMq -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -170912,13 +172557,13 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF gjq gjq gjq @@ -170958,6 +172603,11 @@ gjq gjq gjq gjq +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -170970,28 +172620,23 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF iDt iDt scw @@ -171002,16 +172647,16 @@ bst alW iDt iDt -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF iDt iDt iDt @@ -171023,23 +172668,23 @@ iDt iDt iDt iDt -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -171169,12 +172814,12 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF gjq gjq gjq @@ -171215,6 +172860,10 @@ gjq gjq gjq gjq +wfF +wfF +wfF +wfF tjo tjo tjo @@ -171228,28 +172877,24 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF iDt -tjo +wfF iDt iDt vcj @@ -171259,17 +172904,17 @@ lTs vcj iDt iDt -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF iDt iDt scw @@ -171280,15 +172925,23 @@ xMq xMq xMq iDt -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF gjq gjq +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -171368,22 +173021,8 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -"} -(118,1,2) = {" -tjo -tjo -tjo -tjo -tjo -tjo +"} +(118,1,2) = {" tjo tjo tjo @@ -171432,6 +173071,12 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +wfF +wfF gjq gjq gjq @@ -171472,6 +173117,10 @@ gjq gjq gjq gjq +wfF +wfF +wfF +wfF tjo tjo tjo @@ -171484,29 +173133,25 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF iDt -tjo +wfF iDt iDt jLO @@ -171516,31 +173161,31 @@ tEC jLO iDt iDt -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF scw hpE xuo hpE iDt -tjo -tjo -tjo -tjo +xMq +wfF +wfF +wfF xMq iDt iDt -tjo -tjo -tjo +wfF +wfF +wfF gjq gjq gjq @@ -171548,12 +173193,12 @@ gjq gjq gjq gjq -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -171683,12 +173328,12 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF gjq gjq gjq @@ -171729,6 +173374,10 @@ gjq gjq gjq gjq +wfF +wfF +wfF +wfF tjo tjo tjo @@ -171741,27 +173390,23 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF gjq gjq gjq -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF scw iDt iDt @@ -171772,45 +173417,45 @@ scw nfG iDt iDt -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF nxM vmP -veO +mOj oAe aUD -tjo -tjo -tjo -tjo +xMq +wfF +wfF +wfF xMq iDt scw xMq -tjo -tjo -tjo +wfF +wfF +wfF gjq gjq gjq gjq gjq gjq -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -171940,12 +173585,12 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF gjq gjq gjq @@ -171955,21 +173600,21 @@ gjq gjq gjq gjq -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF xhK xhK xhK @@ -171986,6 +173631,10 @@ gjq gjq gjq gjq +wfF +wfF +wfF +wfF tjo tjo tjo @@ -171998,14 +173647,10 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF gjq gjq gjq @@ -172014,10 +173659,10 @@ gjq gjq gjq gjq -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF scw scw scw @@ -172030,32 +173675,32 @@ iDt iDt scw iDt -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF mep upa qck lkz mep iDt -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF iDt iDt xMq -tjo -tjo -tjo +wfF +wfF +wfF gjq gjq gjq @@ -172063,6 +173708,11 @@ gjq gjq gjq gjq +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -172142,126 +173792,121 @@ tjo tjo tjo tjo +"} +(121,1,2) = {" +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo tjo tjo tjo -tjo -tjo -"} -(121,1,2) = {" -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -gjq -gjq -gjq -gjq -gjq -gjq -gjq -gjq -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -gjq -gjq -gjq -gjq -gjq -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo tjo tjo tjo tjo tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +wfF +wfF +wfF +wfF +wfF +wfF +gjq +gjq +gjq +gjq +gjq +gjq +gjq +gjq +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +gjq +gjq +gjq +gjq +gjq +wfF +wfF +wfF +wfF +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +wfF +wfF +wfF xMq iDt iDt @@ -172279,23 +173924,23 @@ scw scw scw iDt -tjo +wfF gqG -tjo -tjo -tjo +wfF +wfF +wfF gqG scw gqG iDt -tjo +wfF gjq gjq gjq gjq gjq -tjo -tjo +wfF +wfF nxM nxM fzT @@ -172304,15 +173949,15 @@ uUi nxM nxM nxM -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF iDt iDt xMq -tjo -tjo +wfF +wfF iDt gjq gjq @@ -172320,11 +173965,11 @@ gjq gjq gjq iDt -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -172454,12 +174099,12 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF gjq gjq gjq @@ -172468,38 +174113,42 @@ gjq gjq gjq gjq -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF gjq gjq gjq gjq gjq gjq +wfF +wfF +wfF +wfF tjo tjo tjo @@ -172511,14 +174160,10 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF rcY iDt iDt @@ -172534,13 +174179,13 @@ gjq gjq nfG scw -tjo -tjo -tjo +wfF +wfF +wfF bDO -tjo -tjo -tjo +wfF +wfF +wfF vmA myZ fKv @@ -172562,9 +174207,9 @@ nJd iio nxM xMq -tjo -tjo -tjo +wfF +wfF +wfF iDt scw iDt @@ -172577,11 +174222,11 @@ swU swU bID iDt -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -172711,12 +174356,12 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF gjq gjq gjq @@ -172725,38 +174370,42 @@ gjq gjq gjq gjq -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF gjq gjq gjq gjq gjq gjq +wfF +wfF +wfF +wfF tjo tjo tjo @@ -172768,14 +174417,10 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF mJZ iDt iDt @@ -172791,22 +174436,22 @@ gjq gjq gjq gjq -tjo -tjo +wfF +wfF gjq bDO -tjo -tjo +wfF +wfF iDt fKv myZ fKv gjq gjq -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF gjq gjq gjq @@ -172819,10 +174464,10 @@ nJd xUe nxM xMq -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF nfG iDt iDt @@ -172835,6 +174480,10 @@ ujB bID iDt iDt +wfF +wfF +wfF +wfF tjo tjo tjo @@ -172914,76 +174563,15 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -"} -(124,1,2) = {" -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -gjq -gjq -gjq -gjq -gjq -gjq -gjq -gjq -tjo -tjo +"} +(124,1,2) = {" +tjo +tjo +tjo +tjo +tjo +tjo +tjo tjo tjo tjo @@ -172997,7 +174585,6 @@ tjo tjo tjo tjo -gFX tjo tjo tjo @@ -173007,13 +174594,6 @@ tjo tjo tjo tjo -gjq -gjq -gjq -gjq -gjq -gjq -gjq tjo tjo tjo @@ -173033,6 +174613,71 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +wfF +wfF +gjq +gjq +gjq +gjq +gjq +gjq +gjq +gjq +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +gFX +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +gjq +gjq +gjq +gjq +gjq +gjq +gjq +wfF +wfF +wfF +wfF +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +wfF +wfF +wfF +wfF +wfF chg iDt scw @@ -173052,20 +174697,20 @@ gjq gjq gjq bDO -tjo +wfF gjq gjq fKv myZ fKv iDt -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF gjq mep hCa @@ -173076,11 +174721,11 @@ nxM nxM nxM xMq -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF iDt cCb scw @@ -173092,10 +174737,10 @@ ens hyC iDt iDt -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF tjo tjo tjo @@ -173224,13 +174869,13 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF gjq gjq gjq @@ -173238,37 +174883,43 @@ gjq gjq gjq gjq +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF iDt scw wDP -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF gjq gjq gjq gjq gjq +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -173278,17 +174929,11 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF iDt rcY scw @@ -173315,15 +174960,15 @@ gjq fKv myZ vmA -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF nxM gJW nJd @@ -173334,8 +174979,8 @@ nxM xMq xMq xMq -tjo -tjo +wfF +wfF iDt iDt iDt @@ -173348,11 +174993,11 @@ noX cdV bID iDt -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -173481,18 +175126,26 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF gjq gjq gjq gjq gjq +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -173500,31 +175153,30 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +iix gjq gjq gjq gjq gjq +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -173533,19 +175185,12 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF iDt rcY scw @@ -173572,10 +175217,10 @@ iDt gqG scw gqG -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF iDt iDt iDt @@ -173604,12 +175249,12 @@ bID civ bID bID -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -173738,18 +175383,24 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF gjq gjq gjq gjq gjq +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -173765,22 +175416,23 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF gjq gjq gjq gjq gjq +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -173790,18 +175442,11 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF iDt iDt xMq @@ -173861,12 +175506,12 @@ fLe mWz bID iDt -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -173995,10 +175640,10 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF gjq gjq gjq @@ -174007,6 +175652,11 @@ gjq gjq gjq gjq +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -174023,20 +175673,22 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF gjq gjq gjq gjq gjq +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -174046,18 +175698,11 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF iDt iDt iDt @@ -174101,7 +175746,7 @@ vAq uOm pnf rQG -aaV +uxU rQG xHk kgl @@ -174118,6 +175763,12 @@ anZ anZ bID iDt +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -174197,38 +175848,8 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -"} -(129,1,2) = {" -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +"} +(129,1,2) = {" tjo tjo tjo @@ -174256,19 +175877,6 @@ tjo tjo tjo tjo -gjq -gjq -gjq -gjq -gjq -gjq -gjq -tjo -tjo -tjo -tjo -tjo -tjo tjo tjo tjo @@ -174289,9 +175897,23 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +gjq +gjq gjq gjq gjq +gjq +gjq +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -174308,6 +175930,23 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +gjq +gjq +gjq +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +tjo tjo tjo tjo @@ -174315,6 +175954,12 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +wfF +wfF iDt iDt xMq @@ -174367,20 +176012,20 @@ pBW mep scw iDt -tjo -tjo +wfF +wfF iDt iDt iDt scw scw iDt -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -174509,16 +176154,23 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF gjq gjq gjq gjq gjq gjq +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -174535,6 +176187,21 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -174543,35 +176210,13 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF xMq xMq xMq @@ -174624,20 +176269,20 @@ tPM mep iDt iDt -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF cCb scw iDt -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -174766,6 +176411,22 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -174783,6 +176444,19 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -174791,41 +176465,12 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF xMq xMq xMq @@ -174881,19 +176526,19 @@ pBW mep iDt iDt -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -175023,6 +176668,21 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -175041,6 +176701,14 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -175053,36 +176721,13 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF xMq sBy sBy @@ -175138,19 +176783,19 @@ pBW nxM iDt iDt -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -175280,6 +176925,20 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -175318,28 +176977,14 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF xMq sBy kDJ @@ -175396,16 +177041,16 @@ nxM iDt xMq xMq -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -175537,6 +177182,20 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -175574,28 +177233,14 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF xMq xMq sBy @@ -175654,6 +177299,14 @@ xMq xMq xMq xMq +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -175737,36 +177390,8 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -"} -(135,1,2) = {" -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +"} +(135,1,2) = {" tjo tjo tjo @@ -175814,6 +177439,20 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -175850,6 +177489,12 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +wfF +wfF xMq xMq xMq @@ -175911,14 +177556,14 @@ nxM nxM nxM xMq -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -176051,6 +177696,20 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -176087,26 +177746,12 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF xMq mdZ mdZ @@ -176129,7 +177774,7 @@ dMS kSo kmW gEz -gFX +dMS xMq xMq scw @@ -176169,13 +177814,13 @@ jJV nxM xMq xMq -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -176307,6 +177952,21 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -176343,27 +178003,12 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF xMq mdZ kPt @@ -176426,21 +178071,21 @@ pBW nxM xMq xMq -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -176563,6 +178208,22 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -176599,28 +178260,12 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF xMq mdZ kgs @@ -176651,7 +178296,7 @@ iDt iDt iDt ioK -lxw +oWA bja oWA oWA @@ -176683,22 +178328,22 @@ jol nxM xMq xMq -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -176818,20 +178463,24 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF gjq +wfF +wfF +wfF +wfF tjo tjo tjo @@ -176868,15 +178517,11 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF xMq xMq mdZ @@ -176899,7 +178544,7 @@ wMu dMS dre dMS -hHU +dQh nCJ dMS xMq @@ -176936,27 +178581,27 @@ nxM nxM nxM nxM -aRn -nxM -xMq -xMq -xMq -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +uOa +hjM +pCp +pCp +pCp +pCp +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -177075,20 +178720,24 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF gjq +wfF +wfF +wfF +wfF tjo tjo tjo @@ -177125,15 +178774,11 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF xMq xMq mdZ @@ -177162,8 +178807,8 @@ dMS xMq xMq nfG -tjo -tjo +xMq +xMq btU btU btU @@ -177192,29 +178837,29 @@ kzv nxM bjV qdQ -rQG +vZX tHy -nxM -xMq -xMq -xMq -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +eZC +pDG +tVb +rJQ +pCp +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -177332,20 +178977,24 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF gjq gjq gjq +wfF +wfF +wfF +wfF tjo tjo tjo @@ -177382,16 +179031,12 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF xMq mdZ fjm @@ -177417,10 +179062,10 @@ dMS eHX dMS xMq -tjo -tjo -tjo -tjo +xMq +xMq +xMq +xMq btU kCR btU @@ -177447,32 +179092,32 @@ nxM nxM nxM nxM -pBW +bKl nxM nxM nJd -nxM -xMq -xMq -xMq -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +hjM +oAF +nOX +isY +pCp +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -177589,11 +179234,11 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF gjq gjq gjq @@ -177603,6 +179248,10 @@ gjq gjq gjq gjq +wfF +wfF +wfF +wfF tjo tjo tjo @@ -177639,16 +179288,12 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF xMq mdZ xdf @@ -177673,10 +179318,10 @@ qqC mZN nCJ dMS -xMq -tjo -tjo -tjo +cSz +cSz +cSz +cSz btU btU sGf @@ -177704,38 +179349,38 @@ ycY rQG rQG rQG -qmK +hGK nxM mco upa -nxM -xMq -xMq -xMq -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +hjM +hxQ +dKx +wrm +pCp +pCp +pCp +pCp +pCp +pCp +pCp +pCp +pCp +pCp +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -177846,11 +179491,11 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF gjq gjq gjq @@ -177860,6 +179505,10 @@ gjq gjq gjq gjq +wfF +wfF +wfF +wfF tjo tjo tjo @@ -177896,16 +179545,12 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF xMq mdZ jXD @@ -177930,10 +179575,10 @@ hHU dMS nCJ dMS -tjo -tjo -tjo -tjo +cSz +cSz +cSz +cSz btU idr qSe @@ -177964,36 +179609,36 @@ nxM hTR nxM vzY -owG -nxM -nxM -nxM -xMq -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +eZd +hjM +hjM +hjM +mWJ +eYH +hrp +uSE +mJz +bow +tQw +nKY +ttK +wUl +pCp +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -178103,11 +179748,11 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF gjq gjq gjq @@ -178117,6 +179762,10 @@ gjq gjq gjq gjq +wfF +wfF +wfF +wfF tjo tjo tjo @@ -178153,15 +179802,11 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF xMq xMq mdZ @@ -178187,10 +179832,10 @@ dMS dMS nCJ dMS -tjo -tjo -tjo -tjo +cSz +cSz +cSz +cSz btU oYm kht @@ -178218,40 +179863,40 @@ lAA nxM scw ilN -qck +abW nxM ntn kmM sYU iio -nxM -xMq -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +hjM +hLl +mds +sUH +hgv +hgv +hgv +hgv +hgv +hgv +nUC +pCp +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -178360,11 +180005,11 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF gjq gjq gjq @@ -178374,6 +180019,10 @@ gjq gjq gjq gjq +wfF +wfF +wfF +wfF tjo tjo tjo @@ -178411,14 +180060,10 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF xMq xMq mdZ @@ -178437,16 +180082,16 @@ vps iPY doJ uNa -cpY +dMS bNj -gme -hQV +pqJ +pqJ +pqJ +nKW dMS -nCJ dMS -tjo -tjo -tjo +wHs +wHs btU btU btU @@ -178475,41 +180120,41 @@ scw deN iDt nxM -qck +abW +abW +abW huo -qck -qck oiT xUe -nxM -xMq -xMq -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +hjM +mfS +cUJ +qyF +eja +qjW +dLn +qjW +bew +jNW +wiX +pCp +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -178617,11 +180262,11 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF gjq gjq gjq @@ -178631,6 +180276,10 @@ gjq gjq gjq gjq +wfF +wfF +wfF +wfF tjo tjo tjo @@ -178668,14 +180317,10 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF xMq mdZ mdZ @@ -178692,18 +180337,18 @@ yjP hzQ hzQ kqg -kqY +hzQ mNo -cpY +dMS xeo -pwm -iJN dMS -cxU dMS -xMq -tjo -tjo +dMS +dMS +dMS +wHs +wHs +wHs btU nTA lMa @@ -178738,35 +180383,35 @@ nxM mXf nxM nxM -nxM -nxM -xMq -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +hjM +hjM +eYH +yks +fkv +pti +voo +iOl +bYI +jNW +xJS +pCp +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -178874,11 +180519,11 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF gjq gjq gjq @@ -178888,6 +180533,10 @@ gjq gjq gjq gjq +wfF +wfF +wfF +wfF tjo tjo tjo @@ -178925,14 +180574,10 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF xMq mdZ exY @@ -178951,16 +180596,16 @@ aGn hGa sXw wln -cpY -iIT -pJB +dMS +xeo +dMS jYU fjy kUA -cpY -xMq -tjo -tjo +wLs +wHs +wHs +wHs btU wvL jnY @@ -178996,35 +180641,35 @@ owG yjK oiT mco -nxM -xMq -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +hjM +odM +iys +tWr +qRj +pIR +sMK +kBC +jNW +mZO +ixB +ixB +ixB +ixB +ixB +ixB +ixB +ixB +ixB +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -179131,10 +180776,10 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF gjq gjq gjq @@ -179145,6 +180790,10 @@ gjq gjq gjq gjq +wfF +wfF +wfF +wfF tjo tjo tjo @@ -179182,14 +180831,10 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF xMq mdZ xDr @@ -179208,16 +180853,16 @@ iim avC jXU wVL -sXr -vDK -bkl -pxg -kni +dMS +xeo +dMS +jYU +nha ieO -cpY -xMq -tjo -tjo +eTO +wHs +wHs +wHs btU eEN tHe @@ -179253,36 +180898,36 @@ rwG wtq tIR owG -nxM -xMq -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +hjM +uLl +jNW +fkv +pHb +aig +jjH +bYI +jNW +jNW +mSl +mNK +iAr +xeP +dMV +tIo +ift +cgi +ixB +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -179388,10 +181033,10 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF gjq gjq gjq @@ -179402,6 +181047,10 @@ gjq gjq gjq gjq +wfF +wfF +wfF +wfF tjo tjo tjo @@ -179439,14 +181088,10 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF xMq mdZ mdZ @@ -179465,16 +181110,16 @@ uJj wrB gtd eBm -skQ +dMS hJe -afJ +dMS jhH kni nha -cpY -tjo -tjo -tjo +wHs +wHs +wHs +btU btU hyM ofm @@ -179510,37 +181155,37 @@ iTB imH nxM qdi -nxM -xMq -xMq -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +hjM +wfk +jNW +mjz +uMN +oLf +uMN +oTC +jNW +jNW +huR +iAr +gBa +joQ +jpj +oyN +oyN +kic +ixB +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -179645,10 +181290,10 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF gjq gjq gjq @@ -179659,6 +181304,10 @@ gjq gjq gjq gjq +wfF +wfF +wfF +wfF tjo tjo tjo @@ -179696,14 +181345,10 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF xMq xMq mdZ @@ -179716,22 +181361,22 @@ doJ hzk doJ nPU -vDn +bWw drD oXe miR cSJ -fzK -cpY +kLH +dMS pwG -fjy +jAX nZN fbI -cpY -cpY -tjo -tjo -tjo +lYB +wHs +wHs +wHs +wHs btU jgV qnv @@ -179767,84 +181412,37 @@ lAA lAA nxM veO -nxM -xMq -xMq -xMq -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +hjM +lVi +iVr +jNW +jNW +jNW +kVu +ylE +jNW +jNW +huR +iAr +idG +qqi +mQM +oyN +oyN +iAr +pOq +iDt +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -179857,8 +181455,6 @@ tjo tjo tjo tjo -"} -(151,1,2) = {" tjo tjo tjo @@ -179906,6 +181502,55 @@ tjo tjo tjo tjo +"} +(151,1,2) = {" +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +wfF +wfF +wfF +wfF gjq gjq gjq @@ -179916,6 +181561,10 @@ gjq gjq gjq gjq +wfF +wfF +wfF +wfF tjo tjo tjo @@ -179953,14 +181602,10 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF xMq xMq mdZ @@ -179978,17 +181623,17 @@ xve tAe mgR rJV -fzK -wIq +gsD +dMS ybm -pXb +dMS ldY -aMO -cpY -tjo -tjo -tjo -tjo +nha +wHs +wHs +wHs +wHs +wHs btU bAU olO @@ -180024,37 +181669,37 @@ eJf gjq ilN qck -ilN +hjM +pCp +pCp +aIw +aIw +aIw +eYH +ccb +aIw +aIw +uBA +biK +qXd +rML +oyN +oyN +oyN +xDC +pOq iDt iDt -xMq -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -180159,10 +181804,10 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF gjq gjq gjq @@ -180172,6 +181817,11 @@ gjq gjq gjq gjq +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -180209,15 +181859,10 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF xMq xMq mdZ @@ -180235,17 +181880,17 @@ qet qCz gQj iRQ -fzK -kfG +dMS +dMS uZN -pXb +dMS gZK -cpY -tjo -tjo -tjo -tjo -tjo +nha +kMv +wHs +wHs +wHs +wHs btU qvt vae @@ -180283,35 +181928,35 @@ nxM xLB aUD eJf -iDt -iDt -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +lDX +why +fKe +iFU +mhh +jmf +tna +ltD +kFf +ivS +daJ +cyx +eqb +oyN +oyN +eGg +gyz +odI iDt iDt iDt iDt -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -180416,10 +182061,10 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF gjq gjq gjq @@ -180429,6 +182074,11 @@ gjq gjq gjq gjq +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -180466,15 +182116,10 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF xMq xMq mdZ @@ -180492,17 +182137,17 @@ cQG dqt oxg jFe -fzK +jre pqV pZE -pXb +jre sWj -cpY -tjo -tjo -tjo -tjo -tjo +mJo +uFe +wHs +wHs +wHs +wHs btU pKf vSH @@ -180525,7 +182170,7 @@ jUB xDb xDb xMq -tjo +wfF iDt iDt scw @@ -180539,36 +182184,36 @@ eJf eJf myZ eJf -eJf -gqG -iDt -iDt -tjo -tjo -tjo -tjo -tjo -tjo -tjo -iDt +hPq +cLC +uUM +smt +fKQ +ycW +hjq +nFi +idM +uBA +kdK +eGG +oyN +eGG +oyN +oyN +iAr +ixB +qfg iDt iDt iDt iDt iDt -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -180673,10 +182318,10 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF gjq gjq gjq @@ -180686,6 +182331,11 @@ gjq gjq gjq gjq +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -180723,16 +182373,11 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF xMq mdZ vVk @@ -180750,16 +182395,16 @@ jre hjC jre jre +vse +jre jre -roc -pXb wMx -cpY -xMq -tjo -tjo -tjo -tjo +hRr +ksK +wHs +wHs +wHs +wHs btU bWB ksM @@ -180781,9 +182426,9 @@ jUB gyY tCM xDb -tjo -tjo -tjo +wfF +wfF +wfF iDt iDt scw @@ -180796,37 +182441,37 @@ myZ myZ myZ myZ -myZ -eJf -gjq -iDt -iDt -tjo -tjo -tjo -iDt +oHe +ktQ +mXH +iKZ +eMY +qcb +qFx +nFi +tem +huR +waD +kjN +xaC +kjN +oyN +oyN +iAr +ixB iDt +hpx scw iDt iDt -scw -ili -iDt iDt -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -180930,11 +182575,11 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF gjq gjq gjq @@ -180943,6 +182588,11 @@ gjq gjq gjq gjq +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -180980,16 +182630,11 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF xMq mdZ mdZ @@ -181007,16 +182652,16 @@ jre jre jre hti -jre +lXq jre wHW -jre -jre -jre -tjo -tjo -tjo -tjo +dqU +qHy +ksK +ksK +wHs +wHs +btU btU btU btU @@ -181038,10 +182683,10 @@ jUB jse rpU xDb -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF iDt iDt iDt @@ -181054,37 +182699,37 @@ myZ myZ eJf eJf -eJf -gjq -gjq -iDt -iDt -iDt -iDt -scw -iDt -iDt -iDt -alM -sbZ -alM -alM -alM +lDX +fgY +gvL +mbf +xwe +dyc +cTw +gTU +huR +waD +xtb +axL +pPQ +tAN +mta +xUj +ffe alM alM +sbZ alM -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +iDt +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -181187,11 +182832,11 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF gjq gjq gjq @@ -181200,6 +182845,11 @@ gjq gjq gjq gjq +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -181237,16 +182887,11 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF xMq xMq mdZ @@ -181264,20 +182909,20 @@ cND fRG fRG fRG -fRG -fRG tlF -wSs -wSs jre -tjo -tjo -tjo -tjo -tjo -xMq -xMq -xMq +gUq +vjU +pRE +ksK +cSz +cSz +cSz +cSz +btU +cSz +cSz +cSz jUB srM skU @@ -181295,12 +182940,12 @@ rqY tAg ukV xDb -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF gqG eJf eJf @@ -181310,38 +182955,38 @@ eJf myZ eJf eJf -eJf -eJf -eJf -gqG -iDt -nfG -tjo -tjo -alM -alM -alM -alM -alM -oxO -alM -fWO -oxO +jdL +ktQ +qDr +rOG +wWA +xwe +dyc +dYa +ffe +ffe +ffe +ffe +lFK +ffe +ffe +ffe +ffe vhq -oxO +wvZ alM -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +cGV +alM +iDt +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -181444,11 +183089,11 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF gjq gjq gjq @@ -181457,6 +183102,11 @@ gjq gjq gjq gjq +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -181494,17 +183144,12 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF xMq xMq mdZ @@ -181520,19 +183165,19 @@ jre eXU jre jre -vFg jre -xwx -vTp +wSs jre -jqv jre -tjo -tjo -tjo -tjo -tjo -tjo +jre +jre +jre +cSz +cSz +cSz +cSz +cSz +xMq xMq xMq jUB @@ -181552,68 +183197,53 @@ qkB vqH xDb xDb -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF nfG gjq gjq alM haA wJD -gjq eJf -iDt -iDt -iDt -tjo -tjo -tjo -tjo -alM +eJf +ktQ +fex +jdm +qsr +xwe +mGi +pkg +ffe bPn pOV alM -alM -xlO -alM +ghy oxO alM +fWO +alM vVB oxO alM +xmo alM alM alM -alM -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -181656,72 +183286,23 @@ tjo tjo tjo tjo -"} -(158,1,2) = {" -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -gjq -gjq -gjq -gjq -gjq -gjq -gjq -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +"} +(158,1,2) = {" tjo tjo tjo @@ -181762,6 +183343,70 @@ tjo tjo tjo tjo +tjo +tjo +tjo +wfF +wfF +wfF +wfF +wfF +wfF +gjq +gjq +gjq +gjq +gjq +gjq +gjq +wfF +wfF +wfF +wfF +wfF +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF xMq xMq mdZ @@ -181776,21 +183421,21 @@ rYT lmB cbS jre -kWa -djH -jre -jre -jre -jre -uiv +jXi +iup +wSs +wSs +wSs +wSs +wSs jre -tjo -tjo -tjo -tjo -tjo -tjo -tjo +cSz +cSz +cSz +cSz +xMq +xMq +wfF xMq xDb jUB @@ -181809,35 +183454,35 @@ sIB xDb xDb xMq -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF wCo oxO wCo -gjq +eJf nfG -iDt -tjo -tjo -tjo -tjo -tjo -tjo -alM -wuX +lDX +xuX +qTk +iXr +xwe +ckL +aAN +ffe +cka fWO -oxO -oxO -oxO +ghy +ghy +vdX oxO oxO alM @@ -181852,10 +183497,10 @@ alM pVH pVH pVH -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF tjo tjo tjo @@ -181958,18 +183603,24 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF gjq gjq gjq gjq gjq gjq +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -182006,20 +183657,14 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF xMq mdZ qNc @@ -182033,21 +183678,21 @@ oTx wDB vyj jre -jew -aCo -hMw -jre -xMq +vFg +vFg +vFg +xwx +vTp jre -nmg +jqv jre -tjo -tjo -tjo -tjo -tjo -tjo -tjo +cSz +cSz +cSz +xMq +xMq +wfF +wfF xMq iYH sjr @@ -182067,32 +183712,32 @@ xDb xMq xMq xMq -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF xMq alM kYR alM iDt -iDt -xMq -tjo -tjo -tjo -tjo -tjo -tjo -alM +ffe +ktQ +sRK +xwe +xwe +xwe +dyc +mQp +ffe oxO alM -alM +ghy alM alM iry @@ -182109,10 +183754,10 @@ sFT okZ qrv pVH -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF tjo tjo tjo @@ -182215,18 +183860,24 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF gjq gjq gjq gjq gjq gjq +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -182263,20 +183914,14 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF xMq tiY aIB @@ -182290,22 +183935,22 @@ sDs sib cHR jre +kWa +djH jre jre jre jre +uiv +jre xMq -hcO -aIB -hcO -tjo -tjo -tjo -tjo -tjo -tjo -tjo xMq +xMq +wfF +wfF +wfF +wfF +wfF xDb xtR ukz @@ -182325,12 +183970,12 @@ ffe ffe xMq xMq -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF xMq xMq xMq @@ -182338,19 +183983,19 @@ alM jUY alM apB -alM -xMq -xMq -xMq -tjo -tjo -tjo -tjo -alM +ffe +nqf +fCe +xnG +thd +sWc +nJM +fSE +ffe dcd alM -tjo -tjo +ghy +alM alM fuD oxO @@ -182366,10 +184011,10 @@ pVH pVH pVH pVH -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF tjo tjo tjo @@ -182472,18 +184117,23 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF gjq gjq gjq gjq gjq gjq +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -182521,19 +184171,14 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF rcY scw scw @@ -182547,22 +184192,22 @@ jre jre jre jre +jew +aCo +hMw +jre xMq -xMq -xMq -xMq -iDt -scw -scw -scw +jre +nmg +jre iDt -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF xDb pPD tIu @@ -182585,8 +184230,8 @@ alM alM alM alM -tjo -tjo +wfF +wfF xMq xMq xMq @@ -182595,20 +184240,20 @@ alM oxO dSX paF +ffe +wrx +uGL +cUI +fUA +vFT +cam +aQd +ffe alM -xMq -xMq -xMq -xMq -xMq -tjo -tjo alM +ghy alM alM -tjo -tjo -alM alM dSX bXf @@ -182616,17 +184261,17 @@ alM cka wsh alM -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -182729,17 +184374,22 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF gjq gjq gjq gjq gjq gjq +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -182778,19 +184428,14 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF rcY iDt scw @@ -182803,23 +184448,23 @@ lvt lvt xMq xMq +jre +jre +jre +jre +jre xMq -xMq -tjo -tjo -iDt -iDt -iDt -scw -iDt +cXH +aIB +cXH iDt iDt -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF xDb xDb xDb @@ -182848,11 +184493,24 @@ alM alM alM alM -wOH +gul kRt oxO dcd +ffe +rtt +ffe +ffe +ffe +ffe +ffe +ffe +ffe +oxO +oxO +ghy alM +wfF alM alM alM @@ -182860,30 +184518,17 @@ alM alM alM alM -tjo -tjo -tjo -tjo -tjo -tjo -alM -alM -alM -alM -alM -alM -alM -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -182986,17 +184631,22 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF gjq gjq gjq gjq gjq gjq +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -183035,19 +184685,14 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF mJZ scw iDt @@ -183059,25 +184704,25 @@ rcY lvt lvt xMq -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF iDt iDt scw iDt iDt -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF xMq xMq xMq @@ -183093,7 +184738,7 @@ oxO oxO oxO oxO -jda +cka oxO oxO oxO @@ -183110,37 +184755,37 @@ oxO oxO oxO oxO -oxO -oxO -oxO -oxO -oxO -oxO -alM +nPI +pDm +nPI +nPI +nPI +nPI alM alM alM alM +bKw alM -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -183243,17 +184888,22 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF gjq gjq gjq gjq gjq gjq +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -183292,19 +184942,14 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF rcY tSs iDt @@ -183317,25 +184962,25 @@ kNC kNC gIl iDt -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF xMq hpx iDt iDt iDt iDt -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF xMq xMq fWw @@ -183373,27 +185018,27 @@ fLh iry jXl anE -vdX -oxO -oxO -oxO -oxO +fks +nPI +nPI +nPI +ghy alM -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -183500,14 +185145,21 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF gjq gjq gjq +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -183547,21 +185199,14 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF xMq iDt scw @@ -183574,26 +185219,26 @@ iDt iDt iDt iDt -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF xMq xMq scw scw scw xMq -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF xMq iwV ghx @@ -183633,21 +185278,21 @@ ffe ffe ffe ffe -oxO +nPI dSX alM -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -183757,12 +185402,20 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF gjq +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -183802,21 +185455,13 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF iDt iDt rcY @@ -183832,25 +185477,25 @@ cCb iDt iDt iDt -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF xMq keA keA keA xMq -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF scw nDw lFp @@ -183890,19 +185535,19 @@ aRf wyU abe rnQ -oxO +nPI wzg alM -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -184014,6 +185659,20 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -184053,25 +185712,11 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF xMq iDt iDt @@ -184089,25 +185734,25 @@ iDt iDt iDt iDt -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF xMq xuo xuo xuo xMq -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF xMq xMq nDw @@ -184147,18 +185792,18 @@ aRf abe abe rnQ -oxO +nPI alM alM -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -184272,6 +185917,18 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -184312,22 +185969,10 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF xMq xMq xMq @@ -184349,23 +185994,23 @@ scw iDt cCb iDt -tjo -tjo -tjo +wfF +wfF +wfF psb sRp gUQ sRp psb -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF xMq xMq xMq @@ -184404,16 +186049,16 @@ bhj abe dAu rnQ -iWM +nPI alM -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -184529,6 +186174,17 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -184570,21 +186226,10 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF xMq xMq xMq @@ -184614,25 +186259,25 @@ iDt iDt iDt iDt -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF iDt iDt iDt alM -wuX +cka ffe qLY ctF @@ -184661,14 +186306,14 @@ tOf vPD lqU mDg -iWM +nPI alM alM -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -184787,6 +186432,15 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -184829,19 +186483,10 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF xMq xMq tBs @@ -184871,21 +186516,21 @@ iDt iDt iDt iDt -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF iDt iDt alM @@ -184918,14 +186563,14 @@ vlI rJe fma ffe -iWM +nPI ipw alM -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -185095,11 +186740,11 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF xMq tBs uan @@ -185129,19 +186774,19 @@ iDt iDt cCb iDt -tjo -tjo -tjo +wfF +wfF +wfF xMq -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF xMq xMq iDt @@ -185175,14 +186820,14 @@ lNo pMF clW wTT -iWM +nPI oxO alM -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -185352,11 +186997,11 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF xMq tBs pwv @@ -185387,17 +187032,17 @@ iDt iDt iDt iDt -tjo +wfF scw xMq xMq xMq -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF xMq xMq iDt @@ -185432,14 +187077,14 @@ cyh odd xns ffe -iWM -kRt +nPI +bJS alM -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -185609,11 +187254,11 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF xMq tBs dHJ @@ -185651,7 +187296,7 @@ iDt xMq xMq xMq -tjo +wfF xMq xMq xMq @@ -185690,13 +187335,13 @@ hJi wGN mDg pQG -oxO +ghy alM -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -185866,11 +187511,11 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF xMq tBs tBs @@ -185946,13 +187591,13 @@ abe abe lfs pjr -iWM -iWM +nPI +nPI alM -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF tjo tjo tjo @@ -186123,12 +187768,12 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF tBs bxJ bNx @@ -186155,8 +187800,8 @@ wrX xak xCj xMq -tjo -tjo +wfF +wfF iDt scw iDt @@ -186203,13 +187848,13 @@ abe abe abe pjr -oxO +ghy iWM alM -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF tjo tjo tjo @@ -186380,12 +188025,12 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF tBs tix wxw @@ -186413,10 +188058,10 @@ muh wrX xMq xMq -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF alz xMq xMq @@ -186460,13 +188105,13 @@ abe hWu wnB pjr -oxO +ghy iWM alM -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF tjo tjo tjo @@ -186636,13 +188281,13 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF tBs tix tBs @@ -186670,13 +188315,13 @@ muw wrX wrX xMq -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF xMq xMq iDt @@ -186717,13 +188362,13 @@ ffe ffe ffe ffe -oxO +ghy iWM alM -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF tjo tjo tjo @@ -186893,13 +188538,13 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF tBs tix tBs @@ -186928,13 +188573,13 @@ mjQ wrX xMq xMq -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF xMq hpx iDt @@ -186974,13 +188619,13 @@ oxO oxO dcd oxO -oxO +ghy dmU alM -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF tjo tjo tjo @@ -187150,11 +188795,11 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF tBs tBs tBs @@ -187185,13 +188830,13 @@ huJ wrX xMq xMq -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF xMq xMq xMq @@ -187227,13 +188872,17 @@ nyJ nyJ nyJ nPI -iWM -iWM -iWM -iWM -iWM +nPI +nPI +nPI +nPI +nPI geW alM +wfF +wfF +wfF +wfF tjo tjo tjo @@ -187306,767 +188955,8 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -"} -(180,1,2) = {" -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tBs -dXb -lzf -czt -tBs -deP -peA -pQw -cBP -wAv -fjH -dNB -gQO -oCm -jHk -bWZ -amt -xXE -sab -pcB -tSy -uJt -uJt -hxI -nqB -cXS -cMt -wrX -xMq -xMq -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -xMq -xMq -xMq -xMq -iDt -scw -iDt -lRI -eNh -mTu -oxO -dIW -oLa -pvh -oxO -oxO -oxO -oxO -iKG -oxO -oxO -oxO -oxO -oxO -oxO -oxO -oxO -ipw -oxO -oxO -jda -oxO -iCq -iry -dSX -alM -alM -alM -alM -alM -alM -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -"} -(181,1,2) = {" -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -xMq -tBs -xgH -kBf -nWZ -tBs -rqN -bDH -rYt -rrf -ejq -jvs -qEJ -qEJ -rdO -mHJ -oTA -oTA -syh -oTA -lqj -oTA -uJt -uJt -rcD -smC -oHG -wrX -wrX -xMq -xMq -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -xMq -xMq -iDt -iDt -iDt -nfG -alM -alM -alM -alM -alM -alM -alM -alM -iry -oxO -oxO -iKG -cma -qUL -oxO -iry -alM -alM -alM -alM -alM -alM -alM -alM -alM -alM -alM -alM -alM -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -"} -(182,1,2) = {" -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -xMq -tBs -pZR -tKm -wMj -tBs -vcO -jsC -hwW -qEJ -qEJ -qEJ -qEJ -cBB -dtC -smC -iLt -uJt -uJt -uJt -sHh -uJt -uJt -uJt -uJt -smC -gyf -wrX -xMq -xMq -xMq -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -xMq -psb -iDt -iDt -iDt -iDt -iDt -iDt -iDt -iDt -iDt -iDt -ffe -ffe -ffe -ffe -xVs -uWn -ffe -ffe -ffe -ffe -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +"} +(180,1,2) = {" tjo tjo tjo @@ -188081,8 +188971,6 @@ tjo tjo tjo tjo -"} -(183,1,2) = {" tjo tjo tjo @@ -188164,6 +189052,94 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +wfF +tBs +dXb +lzf +czt +tBs +deP +peA +pQw +cBP +wAv +fjH +dNB +gQO +oCm +jHk +bWZ +amt +xXE +sab +pcB +tSy +uJt +uJt +hxI +nqB +cXS +cMt +wrX +xMq +xMq +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +xMq +xMq +xMq +xMq +iDt +scw +iDt +lRI +eNh +mTu +oxO +dIW +oLa +pvh +oxO +oxO +oxO +oxO +iKG +oxO +oxO +oxO +oxO +oxO +oxO +oxO +oxO +ipw +oxO +oxO +cka +oxO +iCq +iry +dSX +alM +alM +alM +alM +alM +alM +wfF +wfF +wfF +wfF tjo tjo tjo @@ -188181,38 +189157,6 @@ tjo tjo tjo tjo -xMq -xMq -tBs -rRc -rRc -mku -tBs -tBs -tBs -fCw -wrX -hzd -aWw -aIe -rbD -uJq -smC -ygp -hMr -aUO -aUO -sQv -aUO -aUO -aUO -aUO -oHV -gQd -wrX -xMq -xMq -xMq tjo tjo tjo @@ -188223,28 +189167,6 @@ tjo tjo tjo tjo -xMq -xMq -iDt -iDt -iDt -iDt -iDt -iDt -iDt -iDt -iDt -iDt -hPp -bpz -wBg -lXI -vAL -aMM -kYV -dMT -dMT -xFT tjo tjo tjo @@ -188290,6 +189212,8 @@ tjo tjo tjo tjo +"} +(181,1,2) = {" tjo tjo tjo @@ -188338,8 +189262,6 @@ tjo tjo tjo tjo -"} -(184,1,2) = {" tjo tjo tjo @@ -188386,6 +189308,95 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +wfF +xMq +tBs +xgH +kBf +nWZ +tBs +rqN +bDH +rYt +rrf +ejq +jvs +qEJ +qEJ +rdO +mHJ +oTA +oTA +syh +oTA +lqj +oTA +uJt +uJt +rcD +smC +oHG +wrX +wrX +xMq +xMq +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +xMq +xMq +iDt +iDt +iDt +nfG +alM +alM +alM +alM +alM +alM +alM +alM +iry +oxO +oxO +iKG +cma +qUL +oxO +iry +alM +alM +alM +alM +alM +alM +alM +alM +alM +alM +alM +alM +alM +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -188438,37 +189449,6 @@ tjo tjo tjo tjo -xMq -xMq -tBs -ccV -wMj -fsO -tBs -tWc -tBs -jFF -wrX -umF -cUk -aIe -eqH -dzy -ewC -iLt -uJt -uJt -uJt -wvl -uJt -uJt -uJt -uJt -oTA -kfl -wrX -xMq -xMq tjo tjo tjo @@ -188481,27 +189461,6 @@ tjo tjo tjo tjo -xMq -xMq -iDt -xMq -iDt -iDt -cnW -iDt -iDt -iDt -iDt -hPp -bpz -pSM -jar -pKx -iLW -iJf -dMT -dMT -xFT tjo tjo tjo @@ -188510,6 +189469,8 @@ tjo tjo tjo tjo +"} +(182,1,2) = {" tjo tjo tjo @@ -188595,8 +189556,6 @@ tjo tjo tjo tjo -"} -(185,1,2) = {" tjo tjo tjo @@ -188606,6 +189565,95 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +wfF +xMq +tBs +pZR +tKm +wMj +tBs +vcO +jsC +hwW +qEJ +qEJ +qEJ +qEJ +cBB +dtC +smC +iLt +uJt +uJt +uJt +sHh +uJt +uJt +uJt +uJt +smC +gyf +wrX +xMq +xMq +xMq +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +xMq +psb +iDt +iDt +iDt +iDt +iDt +iDt +iDt +iDt +iDt +iDt +ffe +ffe +ffe +ffe +xVs +uWn +ffe +ffe +ffe +ffe +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -188678,6 +189726,8 @@ tjo tjo tjo tjo +"} +(183,1,2) = {" tjo tjo tjo @@ -188694,38 +189744,6 @@ tjo tjo tjo tjo -xMq -xMq -xMq -tBs -nTv -mBE -pZR -bEN -pmn -tBs -tBs -tBs -iIN -giv -wrX -wrX -qDv -jcP -oTA -oTA -epB -oTA -uko -oTA -uJt -uJt -rcD -oTA -mHX -wrX -xMq -xMq tjo tjo tjo @@ -188739,26 +189757,6 @@ tjo tjo tjo tjo -xMq -xMq -xMq -ebX -kNC -qLl -qLl -qLl -qLl -qLl -qLl -pxA -sbn -jar -pKx -iLW -iJf -hkw -rgd -xFT tjo tjo tjo @@ -188824,6 +189822,95 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +xMq +xMq +tBs +rRc +rRc +mku +tBs +tBs +tBs +fCw +wrX +hzd +aWw +aIe +rbD +uJq +smC +ygp +hMr +aUO +aUO +sQv +aUO +aUO +aUO +aUO +oHV +gQd +wrX +xMq +xMq +xMq +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +xMq +xMq +iDt +iDt +iDt +iDt +iDt +iDt +iDt +iDt +iDt +iDt +hPp +bpz +wBg +lXI +vAL +aMM +kYV +dMT +dMT +xFT +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -188852,8 +189939,6 @@ tjo tjo tjo tjo -"} -(186,1,2) = {" tjo tjo tjo @@ -188898,6 +189983,8 @@ tjo tjo tjo tjo +"} +(184,1,2) = {" tjo tjo tjo @@ -188951,38 +190038,6 @@ tjo tjo tjo tjo -xMq -xMq -xMq -tBs -tUx -nou -nou -tBs -wMj -hPc -wMj -tBs -lry -oTA -hlS -wrX -lAF -rbD -oTA -bAF -irQ -bAF -bYm -bMe -uJt -uJt -oTA -oTA -weK -wrX -xMq -xMq tjo tjo tjo @@ -188999,23 +190054,6 @@ tjo tjo tjo tjo -rcY -iDt -qLl -hyP -hyP -hyP -hyP -wQL -lda -afu -juR -iFL -mbF -iJf -qrD -qrD -xFT tjo tjo tjo @@ -189041,6 +190079,95 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +xMq +xMq +tBs +ccV +wMj +fsO +tBs +tWc +tBs +jFF +wrX +umF +cUk +aIe +eqH +dzy +ewC +iLt +uJt +uJt +uJt +wvl +uJt +uJt +uJt +uJt +oTA +kfl +wrX +xMq +xMq +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +xMq +xMq +iDt +xMq +iDt +iDt +cnW +iDt +iDt +iDt +iDt +hPp +bpz +pSM +jar +pKx +iLW +iJf +dMT +dMT +xFT +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -189109,12 +190236,12 @@ tjo tjo tjo tjo -"} -(187,1,2) = {" tjo tjo tjo tjo +"} +(185,1,2) = {" tjo tjo tjo @@ -189209,82 +190336,86 @@ tjo tjo tjo tjo +wfF +wfF +wfF +xMq xMq xMq tBs +nTv +mBE +pZR +bEN +pmn tBs -goB -goB tBs tBs -aVi -rvQ -tBs -etH -etH -eyU +iIN +giv wrX -dvh -bsu -iih -sab -nMP -sab -qYh -oTA -avo -tTw -hKj -gHE wrX +qDv +jcP +oTA +oTA +epB +oTA +uko +oTA +uJt +uJt +rcD +oTA +mHX wrX xMq xMq +wfF +wfF +wfF +wfF +wfF tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -rcY -iDt -qLl -fpG -nNo -nNo -nNo -gof -chN -iLW +wfF +wfF +wfF +wfF +wfF +xMq +xMq +xMq +ebX +kNC +xFT +xFT +xFT +xFT +xFT +xFT +pxA +sbn +jar +pKx iLW -sNN -xiz iJf -vIJ -vIJ +hkw +rgd xFT -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -189367,11 +190498,7 @@ tjo tjo tjo "} -(188,1,2) = {" -tjo -tjo -tjo -tjo +(186,1,2) = {" tjo tjo tjo @@ -189466,77 +190593,81 @@ tjo tjo tjo tjo +wfF +wfF +wfF +xMq xMq xMq -iDt -gFX -xuo -xuo -xuo tBs -jOe -qTJ +tUx +nou +nou tBs -cPq -etH -etH -wrX +wMj +hPc +wMj +tBs +lry +oTA +hlS wrX -fhJ +lAF rbD oTA -syh +bAF +irQ +bAF +bYm +bMe +uJt +uJt oTA -syh oTA -wrX -wrX -vaO -slU +weK wrX xMq xMq +wfF +wfF +wfF tjo tjo tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF rcY iDt -qLl -eAt -nNo -nNo -nNo -gof -nAF -iLW -fju -dGf -rWj +xFT +hyP +hyP +hyP +hyP +wQL +lda +afu +juR +iFL +mbF iJf -bHj -ohz +qrD +qrD xFT -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -189624,11 +190755,7 @@ tjo tjo tjo "} -(189,1,2) = {" -tjo -tjo -tjo -tjo +(187,1,2) = {" tjo tjo tjo @@ -189724,35 +190851,43 @@ tjo tjo tjo tjo -scw -iDt -gFX -xuo -lvt -lvt +wfF +wfF +wfF +xMq +xMq +tBs tBs goB goB tBs +tBs +aVi +iUA +tBs +etH +etH +eyU wrX -wrX -wrX -wrX -wrX -pye -dtC -pOC +dvh +bsu +iih +sab +nMP +sab +qYh oTA -uXr -xBO -aZL -wrX -wrX -wrX +avo +tTw +hKj +gHE wrX wrX xMq xMq +wfF +wfF +wfF tjo tjo tjo @@ -189760,33 +190895,41 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF rcY iDt -qLl -rss +xFT +fpG nNo nNo nNo gof -nAF +chN iLW iLW sNN -rWj -kxj -sSq -sTx +xiz +iJf +vIJ +vIJ xFT +wfF +wfF +wfF +wfF +wfF +tjo +tjo +tjo +tjo +tjo +tjo +tjo tjo tjo tjo @@ -189868,6 +191011,8 @@ tjo tjo tjo tjo +"} +(188,1,2) = {" tjo tjo tjo @@ -189880,8 +191025,6 @@ tjo tjo tjo tjo -"} -(190,1,2) = {" tjo tjo tjo @@ -189965,6 +191108,43 @@ tjo tjo tjo tjo +wfF +wfF +wfF +xMq +xMq +iDt +gFX +xuo +xuo +xuo +tBs +jOe +qTJ +tBs +cPq +etH +etH +wrX +wrX +fhJ +rbD +oTA +syh +oTA +syh +oTA +wrX +wrX +vaO +slU +wrX +xMq +xMq +wfF +wfF +wfF +wfF tjo tjo tjo @@ -189972,6 +191152,34 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +wfF +wfF +rcY +iDt +xFT +eAt +nNo +nNo +nNo +gof +nAF +iLW +fju +dGf +rWj +iJf +bHj +ohz +xFT +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -189982,34 +191190,6 @@ tjo tjo tjo tjo -iDt -xuo -xuo -lvt -lvt -gFX -lvt -lvt -lvt -lvt -lvt -lvt -wrX -wrX -wrX -daj -wrX -crg -wrX -wrX -wrX -wrX -xMq -xMq -xMq -xMq -xMq -xMq tjo tjo tjo @@ -190027,23 +191207,6 @@ tjo tjo tjo tjo -rcY -iDt -qLl -ppB -ppB -ppB -ppB -sUL -nAF -sNN -sNN -sNN -rWj -oRu -eFy -kcP -xFT tjo tjo tjo @@ -190105,6 +191268,8 @@ tjo tjo tjo tjo +"} +(189,1,2) = {" tjo tjo tjo @@ -190137,8 +191302,6 @@ tjo tjo tjo tjo -"} -(191,1,2) = {" tjo tjo tjo @@ -190202,6 +191365,43 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +scw +iDt +gFX +xuo +lvt +lvt +tBs +goB +goB +tBs +wrX +wrX +wrX +wrX +wrX +pye +dtC +pOC +oTA +uXr +xBO +aZL +wrX +wrX +wrX +wrX +wrX +xMq +xMq +wfF +wfF +wfF +wfF tjo tjo tjo @@ -190209,6 +191409,34 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +wfF +wfF +rcY +iDt +xFT +rss +nNo +nNo +nNo +gof +nAF +iLW +iLW +sNN +rWj +kxj +sSq +sTx +xFT +wfF +wfF +wfF +wfF +tjo tjo tjo tjo @@ -190239,32 +191467,6 @@ tjo tjo tjo tjo -iDt -iDt -iDt -lvt -lvt -gFX -lvt -lvt -lvt -lvt -lvt -lvt -lvt -xMq -wrX -wQx -bWp -jja -wrX -xMq -xMq -xMq -xMq -xMq -xMq -xMq tjo tjo tjo @@ -190284,23 +191486,6 @@ tjo tjo tjo tjo -rcY -iDt -wBh -wBh -wBh -wBh -pDq -pDq -hXB -nTu -ylt -ylt -kqo -wBh -ibO -wBh -wBh tjo tjo tjo @@ -190340,6 +191525,8 @@ tjo tjo tjo tjo +"} +(190,1,2) = {" tjo tjo tjo @@ -190394,8 +191581,6 @@ tjo tjo tjo tjo -"} -(192,1,2) = {" tjo tjo tjo @@ -190437,6 +191622,89 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +wfF +iDt +xuo +xuo +lvt +lvt +gFX +lvt +lvt +lvt +lvt +lvt +lvt +wrX +wrX +wrX +daj +wrX +crg +wrX +wrX +wrX +wrX +xMq +xMq +xMq +xMq +xMq +xMq +wfF +wfF +wfF +wfF +tjo +tjo +tjo +tjo +tjo +tjo +tjo +wfF +wfF +wfF +wfF +wfF +wfF +rcY +iDt +xFT +ppB +ppB +ppB +ppB +sUL +nAF +sNN +sNN +sNN +rWj +oRu +eFy +kcP +xFT +wfF +wfF +wfF +wfF +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo +tjo tjo tjo tjo @@ -190497,72 +191765,6 @@ tjo tjo tjo tjo -scw -iDt -lvt -lvt -lvt -lvt -lvt -lvt -lvt -lvt -lvt -lvt -xMq -wrX -wrX -wrX -wrX -wrX -xMq -xMq -xMq -xMq -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -rcY -iDt -kAX -bQf -qYu -lqR -whk -lqR -roN -gWR -alN -oLA -uYz -hhV -vHk -rof -wBh -tjo -tjo -tjo -tjo -tjo tjo tjo tjo @@ -190580,6 +191782,8 @@ tjo tjo tjo tjo +"} +(191,1,2) = {" tjo tjo tjo @@ -190651,9 +191855,6 @@ tjo tjo tjo tjo -"} -(193,1,2) = {" -tjo tjo tjo tjo @@ -190678,6 +191879,42 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +wfF +iDt +iDt +iDt +lvt +lvt +gFX +lvt +lvt +lvt +lvt +lvt +lvt +lvt +xMq +wrX +wQx +bWp +jja +wrX +xMq +xMq +xMq +xMq +xMq +xMq +xMq +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -190687,6 +191924,32 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +wfF +rcY +iDt +gdz +gdz +gdz +gdz +pDq +pDq +hXB +nTu +ylt +ylt +kqo +wBh +ibO +wBh +wBh +wfF +wfF +wfF +wfF tjo tjo tjo @@ -190754,25 +192017,6 @@ tjo tjo tjo tjo -iDt -iDt -iDt -iDt -lvt -lvt -lvt -lvt -lvt -lvt -lvt -lvt -xMq -xMq -xMq -xMq -xMq -xMq -xMq tjo tjo tjo @@ -190795,26 +192039,11 @@ tjo tjo tjo tjo +"} +(192,1,2) = {" tjo tjo tjo -rcY -iDt -kAX -hSL -mtQ -kTH -opi -tjv -oLA -oLA -fnM -oLA -axd -wBh -dLq -lrJ -wBh tjo tjo tjo @@ -190907,9 +192136,43 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +wfF +wfF +scw +iDt +lvt +lvt +lvt +lvt +lvt +lvt +lvt +lvt +lvt +lvt +xMq +wrX +wrX +wrX +wrX +wrX +xMq +xMq +xMq +xMq +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo -"} -(194,1,2) = {" tjo tjo tjo @@ -190918,6 +192181,32 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +wfF +rcY +iDt +kAX +bQf +qYu +lqR +whk +lqR +roN +gWR +alN +oLA +uYz +hhV +vHk +rof +wBh +wfF +wfF +wfF +wfF tjo tjo tjo @@ -191007,28 +192296,14 @@ tjo tjo tjo tjo +"} +(193,1,2) = {" tjo tjo tjo tjo tjo tjo -iDt -iDt -iDt -lvt -lvt -lvt -lvt -lvt -lvt -iDt -iDt -iDt -xMq -xMq -xMq -xMq tjo tjo tjo @@ -191055,23 +192330,6 @@ tjo tjo tjo tjo -rcY -iDt -kAX -vdS -xdH -nKs -gAb -nKs -uKi -oLA -gjo -msx -frM -hhV -bfG -pls -wBh tjo tjo tjo @@ -191135,6 +192393,41 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +wfF +wfF +iDt +iDt +iDt +iDt +lvt +lvt +lvt +lvt +lvt +lvt +lvt +lvt +xMq +xMq +xMq +xMq +xMq +xMq +xMq +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -191145,6 +192438,32 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +wfF +rcY +iDt +kAX +hSL +mtQ +kTH +opi +tjv +oLA +oLA +fnM +oLA +axd +wBh +dLq +lrJ +wBh +wfF +wfF +wfF +wfF tjo tjo tjo @@ -191165,8 +192484,6 @@ tjo tjo tjo tjo -"} -(195,1,2) = {" tjo tjo tjo @@ -191236,6 +192553,8 @@ tjo tjo tjo tjo +"} +(194,1,2) = {" tjo tjo tjo @@ -191272,16 +192591,6 @@ tjo tjo tjo tjo -iDt -iDt -iDt -lvt -lvt -iDt -iDt -iDt -iDt -scw tjo tjo tjo @@ -191312,23 +192621,6 @@ tjo tjo tjo tjo -rcY -iDt -bgx -bgx -bgx -bgx -txk -bgx -bgx -fIi -bgx -xFT -xFT -wBh -wBh -wBh -wBh tjo tjo tjo @@ -191358,6 +192650,41 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +iDt +iDt +iDt +lvt +lvt +lvt +lvt +lvt +lvt +iDt +iDt +iDt +xMq +xMq +xMq +xMq +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -191368,6 +192695,32 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +wfF +rcY +iDt +kAX +vdS +xdH +nKs +gAb +nKs +uKi +oLA +gjo +msx +frM +hhV +bfG +pls +wBh +wfF +wfF +wfF +wfF tjo tjo tjo @@ -191422,8 +192775,6 @@ tjo tjo tjo tjo -"} -(196,1,2) = {" tjo tjo tjo @@ -191459,6 +192810,8 @@ tjo tjo tjo tjo +"} +(195,1,2) = {" tjo tjo tjo @@ -191530,13 +192883,6 @@ tjo tjo tjo tjo -scw -iDt -iDt -iDt -iDt -iDt -iDt tjo tjo tjo @@ -191561,6 +192907,40 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +iDt +iDt +iDt +lvt +lvt +iDt +iDt +iDt +iDt +scw +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -191569,21 +192949,35 @@ tjo tjo tjo tjo -vzD -vzD -vzD -jdd -jCl -jCl -jCl -jCl -qXY -coH -vzD tjo tjo tjo tjo +wfF +wfF +wfF +wfF +rcY +iDt +bgx +bgx +bgx +bgx +txk +bgx +bgx +fIi +bgx +xFT +xFT +wBh +wBh +wBh +wBh +wfF +wfF +wfF +wfF tjo tjo tjo @@ -191673,14 +193067,14 @@ tjo tjo tjo tjo +"} +(196,1,2) = {" tjo tjo tjo tjo tjo tjo -"} -(197,1,2) = {" tjo tjo tjo @@ -191771,6 +193165,37 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +scw +iDt +iDt +iDt +iDt +iDt +iDt +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -191785,14 +193210,37 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +vzD +vzD +vzD +jdd +jCl +jCl +jCl +jCl +qXY +coH +vzD +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo tjo tjo tjo -scw -scw tjo tjo tjo @@ -191826,17 +193274,6 @@ tjo tjo tjo tjo -vzD -yap -qXY -jCl -jCl -jCl -jCl -jCl -jCl -iVY -vzD tjo tjo tjo @@ -191887,6 +193324,8 @@ tjo tjo tjo tjo +"} +(197,1,2) = {" tjo tjo tjo @@ -191936,8 +193375,6 @@ tjo tjo tjo tjo -"} -(198,1,2) = {" tjo tjo tjo @@ -191986,6 +193423,31 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +scw +scw +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -192005,6 +193467,31 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +vzD +yap +qXY +jCl +jCl +jCl +jCl +jCl +jCl +iVY +vzD +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -192083,17 +193570,6 @@ tjo tjo tjo tjo -vzD -yap -jCl -bFq -axu -dVq -jCl -jCl -jCl -iVY -vzD tjo tjo tjo @@ -192105,6 +193581,8 @@ tjo tjo tjo tjo +"} +(198,1,2) = {" tjo tjo tjo @@ -192193,8 +193671,6 @@ tjo tjo tjo tjo -"} -(199,1,2) = {" tjo tjo tjo @@ -192208,6 +193684,26 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -192228,6 +193724,29 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +vzD +yap +jCl +bFq +axu +dVq +jCl +jCl +jCl +iVY +vzD +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -192319,6 +193838,8 @@ tjo tjo tjo tjo +"} +(199,1,2) = {" tjo tjo tjo @@ -192340,17 +193861,6 @@ tjo tjo tjo tjo -vzD -vzD -vzD -vzD -vzD -vzD -vzD -vzD -vzD -vzD -vzD tjo tjo tjo @@ -192431,6 +193941,22 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -192450,13 +193976,34 @@ tjo tjo tjo tjo -"} -(200,1,2) = {" tjo tjo tjo tjo tjo +wfF +wfF +wfF +wfF +vzD +vzD +vzD +vzD +vzD +vzD +vzD +vzD +vzD +vzD +vzD +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -192548,6 +194095,8 @@ tjo tjo tjo tjo +"} +(200,1,2) = {" tjo tjo tjo @@ -192651,6 +194200,19 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -192676,6 +194238,27 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -192707,8 +194290,6 @@ tjo tjo tjo tjo -"} -(201,1,2) = {" tjo tjo tjo @@ -192771,6 +194352,8 @@ tjo tjo tjo tjo +"} +(201,1,2) = {" tjo tjo tjo @@ -192877,6 +194460,14 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -192904,6 +194495,24 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -192964,8 +194573,6 @@ tjo tjo tjo tjo -"} -(202,1,2) = {" tjo tjo tjo @@ -193002,6 +194609,8 @@ tjo tjo tjo tjo +"} +(202,1,2) = {" tjo tjo tjo @@ -193143,6 +194752,24 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -193221,8 +194848,6 @@ tjo tjo tjo tjo -"} -(203,1,2) = {" tjo tjo tjo @@ -193241,6 +194866,8 @@ tjo tjo tjo tjo +"} +(203,1,2) = {" tjo tjo tjo @@ -193382,6 +195009,24 @@ tjo tjo tjo tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -193621,24 +195266,24 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -193887,15 +195532,15 @@ tjo tjo tjo tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo -tjo +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF +wfF tjo tjo tjo @@ -216457,7 +218102,7 @@ pjM pjM jJY qjj -fsv +cYQ dDp cJt jMw @@ -216471,7 +218116,7 @@ sEB skc cJt qYz -fsv +kZy wOy uhx bln @@ -216481,7 +218126,7 @@ bln bln ydI aST -fsv +ssz uQS cJt dBj @@ -217242,7 +218887,7 @@ bln uhx joB fsv -fsv +ckO wOy uhx bln @@ -217499,7 +219144,7 @@ bln uhx eVn fsv -fsv +wfs wOy uhx bln @@ -218013,7 +219658,7 @@ sEB uhx uhx fHb -fdO +kDE wOy uhx bln @@ -218256,7 +219901,7 @@ rwd rwd jJY wAU -wfs +jyj dDp cJt jMw @@ -218270,8 +219915,8 @@ sEB lAC cJt sde -fsv -wOy +vkb +btR uhx bln sEB @@ -218280,7 +219925,7 @@ sEB bln uhx qjj -fsv +ssz jcw cJt sQm @@ -218527,7 +220172,7 @@ sEB uhx uhx rwW -fdO +kDE gdx ydI bln @@ -218784,7 +220429,7 @@ bln bln uhx jJa -nXR +wda bFP ydI uhx @@ -219041,7 +220686,7 @@ ydI ydI ydI std -fsv +wfs aDN fUR cSb @@ -219303,7 +220948,7 @@ iwJ nIf bxy jlf -iwJ +xwO rDR wda wfs @@ -222621,7 +224266,7 @@ lJO lri anl lJO -qcK +klZ kXI klZ lJO @@ -222654,7 +224299,7 @@ pXH cUy mNE duW -uwX +tKI bln bln bln @@ -223136,7 +224781,7 @@ rcq anl lJO leR -qcK +klZ klZ lJO apX @@ -223168,7 +224813,7 @@ tKI tKI tKI byC -uwX +tKI bln bln bln @@ -223425,7 +225070,7 @@ tOw orq tKI byC -uwX +tKI bln bln bln @@ -223682,7 +225327,7 @@ tOw wbY tKI byC -uwX +tKI bln bln bln @@ -224196,7 +225841,7 @@ kSf hlv tKI byC -uwX +tKI bln bln bln @@ -224456,13 +226101,13 @@ byC tKI bln bln -oDZ +maT lmZ fkr maT fkr pPL -gsO +maT bln bln bln @@ -224716,7 +226361,7 @@ maT maT sym bde -maT +pSQ bde ksf maT @@ -224925,7 +226570,7 @@ tCr lJO gDZ gDZ -voF +wFS cnz hjI hEI @@ -224973,10 +226618,10 @@ tEL maT lmZ gXC -maT +kXr gXC pPL -oDZ +maT bln bln bln @@ -225441,7 +227086,7 @@ hEI lJO lJO lJO -uAN +wFS lJO bln lJO @@ -226546,7 +228191,7 @@ ptf pRj sVr nYe -eTX +pPl nZj bvs mNY @@ -227047,7 +228692,7 @@ vVD qjQ bln ptf -vVn +rAl vPi ybu uFU @@ -227820,7 +229465,7 @@ bln pRj jzk kYF -dBi +rAl qzM pRj dOH @@ -228075,9 +229720,9 @@ qjQ bln bln pRj -mCg +rAl kSD -vVn +rAl nOk pRj xOl @@ -230387,7 +232032,7 @@ pRj kNZ daS daS -eTX +pPl daS ptf bln @@ -233990,7 +235635,7 @@ kgH kSZ fva pRj -vhb +pPl mNY giQ ppD @@ -234499,7 +236144,7 @@ nBk tXY paM quL -aQk +hBb kdH quL xRu @@ -235212,7 +236857,7 @@ sDl psN rCx dGZ -wDD +dMW psN pfe cow @@ -235551,7 +237196,7 @@ qkT kzA whW twt -peW +qhF sSJ oSR glc @@ -235807,7 +237452,7 @@ bTq xUP ouE rpF -twt +pQj xoa eTx fDn @@ -238884,7 +240529,7 @@ bID ejQ bID oUN -ycX +djU iRA kfQ pus @@ -239062,8 +240707,8 @@ sDl sDl sDl rpB -gOx -ehK +wtt +wtt wtt ykj qQf @@ -239141,7 +240786,7 @@ wSo pvS iHm rXe -hHN +wpp bJD pfa rsW @@ -239397,8 +241042,8 @@ caS hHN puD jkW -sVL -hHN +tTh +fXj eBT qKK hpI @@ -239652,8 +241297,8 @@ cEw cEw cEw wMX -puD -jBe +fwq +hHN lRR heC nFV @@ -239834,7 +241479,7 @@ nmP ixe qQf uIX -mpx +oWu wlQ ykj qQf @@ -239905,14 +241550,14 @@ aap gzh cEw rLs -xmL rLs +xmL cEw hcy -puD -hHN +nYc +ftZ nrA -flH +vBo jxw dBb qxo @@ -240093,7 +241738,7 @@ qQf qQf qQf qQf -cbR +fcF qQf lQr pJm @@ -240165,11 +241810,11 @@ wwu kwm wwu sBx -djU +tpi hoF -hHN -nrA -jlV +khO +bkS +pki baQ hsf rsW @@ -240347,7 +241992,7 @@ iug wLZ ykj fcF -cbR +fcF qQf lVy ykj @@ -240419,14 +242064,14 @@ iSl gdv hHN tbh +xWI tbh -tbh -hHN -fwq +iFr +dZQ hHN hHN nrA -jlV +prj eBT eqm hpI @@ -240604,10 +242249,10 @@ iug lyO rgS eDe -cbR +fcF qQf fLx -uWc +fcF qQf gmW gmW @@ -240678,7 +242323,7 @@ mxj fcN lxU fcN -bHy +fcN uof uub kYi @@ -240934,15 +242579,15 @@ pGf igx dFC dFC -dFC +cbL bnr -qEk hHN +lRR tTB -nrA +shj lSR -jxw -lmH +oAV +fQc qxo eVC qwF @@ -241186,17 +242831,17 @@ kFH aen hIA rBQ -heC -heC +fQc +fQc noY ruw fQc fQc fQc mvG -fQc -cZj shj +cZj +hHN vtI cfC fsQ @@ -241371,7 +243016,7 @@ iUG iUG qDo iUG -wOj +ixe iUG ixe pcl @@ -241442,11 +243087,11 @@ kyr dFp nJI hoV -pwc +ama xfB khe oSX -pwc +pGs xfB cHm xfB @@ -241454,7 +243099,7 @@ pwc xfB jHQ xfB -xfB +ePI rkm sEX hpI @@ -241710,7 +243355,7 @@ hHN uYN uLU wSC -kKJ +flH vFN hUt wEs @@ -242174,7 +243819,7 @@ wJd mIB uUV fmD -ntZ +fmD fmD iMh lso @@ -242484,7 +244129,7 @@ xDG qwF gtg cEw -ePP +ral kfs kQu bln @@ -242502,7 +244147,7 @@ bln bln bln bln -nFO +nLk bln sEB bln @@ -242759,8 +244404,8 @@ bln bln bln bln -oxR -bln +nLv +vsI sEB bln bln @@ -243016,16 +244661,16 @@ sEB sEB sEB sEB -nFO -sEB -sEB -bln -bln -bln -bln -bln -bln -bln +tmR +hPL +nvk +nvk +nvk +nvk +qHg +tmR +tmR +tmR mVm bln bln @@ -243195,13 +244840,13 @@ kQX tGZ nYQ mdZ -rth +ptz hid iFc izC jRA jRA -jRA +yhM nhV nGz eEz @@ -243273,16 +244918,16 @@ bln bln bln bln -nFO -bln -sEB -bln bln bln bln bln bln bln +vsI +kjJ +sEB +tmR tCr bln bln @@ -243456,10 +245101,10 @@ iWr jgh aoP izC -fTw +eEz izC -fTw izC +eEz izC izC tLF @@ -243511,7 +245156,7 @@ qwF qwF qwF sEB -cEw +hpI qSx kfs bln @@ -243530,9 +245175,6 @@ bln bln bln bln -nFO -bln -sEB bln bln bln @@ -243540,6 +245182,16 @@ bln bln bln bln +sdr +sEB +tmR +sEB +sEB +sEB +sEB +sEB +sEB +sEB rgu rgu rgu @@ -243587,13 +245239,6 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO "} (144,1,3) = {" wNO @@ -243719,7 +245364,7 @@ ymd kcy uHO ggV -ibI +xzi lso lso dEV @@ -243768,13 +245413,16 @@ sEB sEB sEB sEB -vep +hpI sQz wvI wvI -pwF -wvI -wvI +puf +puf +puf +snb +puf +puf wvI pwF wvI @@ -243786,15 +245434,19 @@ sEB sEB sEB sEB -sEB -oxR -tmR +bln +bln +bln +bln +bln +gSz +vsI tmR -sEB -sEB -sEB -sEB -sEB +vsI +bln +bln +bln +bln sEB rgu rgu @@ -243844,13 +245496,6 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO "} (145,1,3) = {" wNO @@ -243967,16 +245612,16 @@ kPb mdZ dHn ayJ -cfx -faX -lUE -ktj +rDF +sHB +rDF +sHB sgx -lXr -hBH -ttH -ggV -ibI +iqL +rDF +sHB +bHg +ovq lso rvZ dEV @@ -244017,16 +245662,19 @@ lvG bVZ tYZ kRP -pOq -pOq -pOq -pOq -pOq -pOq -pOq -uBA -vep +cSC +cSC +cSC +cSC +cSC +cSC +cSC +cSC +cSC gwu +wvI +efL +ohJ mdQ xTu kJK @@ -244044,15 +245692,19 @@ bln bln bln bln +bln +bln +bln +bln sdr -vsI -tmR -vsI +sKm +afi +sKm +pqE bln bln bln bln -sEB rgu nlB inI @@ -244101,13 +245753,6 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO "} (146,1,3) = {" wNO @@ -244223,19 +245868,19 @@ fgE shh mdZ iMa -xlv -uTW +sHB +trl bRP -sHt rDF sHB -trl -iqL +rDF nfx -iWr -iWr -lso -lso +ndy +nfx +tVa +qLc +avb +avb vSa fuY clK @@ -244275,21 +245920,24 @@ cvS cGA kRP gtj +iQP +orb +vuY +qCC +tgy vdh -vdh -vdh -vdh -vdh -vdh -uBA +tgy kzp qkb +vep +kUH +imA ldr vhT iLf icF gRI -hUG +acS mka wvI msd @@ -244301,15 +245949,19 @@ bln bln bln bln -sdr -sKm -ezj -sKm -pqE bln bln bln bln +sdr +sKm +kML +foX +pqE +pqE +pqE +pqE +pqE rgu kKg inI @@ -244320,7 +245972,7 @@ jFQ vTr vTr vTr -xlD +hnx vTr vTr vTr @@ -244358,13 +246010,6 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO "} (147,1,3) = {" wNO @@ -244480,18 +246125,18 @@ fgE shh mdZ rKz -qwD +rDF cfx jNh -hKE -kba -wRT -jEG -hOa +gyr +hTl +gyr +hTl +gyr hTl sPk -iWr -iko +xzi +lso lso qEM lso @@ -244532,15 +246177,18 @@ cvS lUU kRP jWj -vdh -vdh -vdh -vdh -fGT +kGv +kGv +pDU +ePK +fhx xoF -uBA -trf +fhx +ijQ dbN +vep +trf +bHU nDq etB swx @@ -244558,15 +246206,19 @@ bln bln bln bln -sdr +bln +bln +bln sKm -kML -foX -pqE -pqE -pqE +pfu +vFE +oWh +sYN pqE pqE +pKg +rOc +oHR rgu rgu bWN @@ -244615,13 +246267,6 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO "} (148,1,3) = {" wNO @@ -244739,17 +246384,17 @@ mdZ fPY qKa vCr -icT +cpY kqI -gaV -iiD -rDF +sAs +sAs +sAs sAs hOa -ezU -kCO -mVh -mVh +cpY +cpY +rjP +lso vwO lso dCs @@ -244789,15 +246434,18 @@ vsZ sDr kRP pyb +iaN erQ erQ -erQ -ubZ -net -ivf -uBA -lJA -dbN +qIm +tgy +vdh +tgy +kzp +bJR +vep +but +ilL xwc raA wrP @@ -244814,16 +246462,20 @@ bln bln bln bln +bln +bln +bln +bln sKm -pfu -vFE -jUk -iPr -pqE +fAU +oCH +hUQ +otk pqE -pKg -rOc -oHR +qdE +aNE +hgq +ueY baW gFf gFf @@ -244872,13 +246524,6 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO "} (149,1,3) = {" wNO @@ -244995,17 +246640,17 @@ vLn mdZ aFl vvr -ekE +bHg mWg uBU -iWr -gvX -gyr -wbu +uGZ +uGZ +uGZ +uGZ uGZ lFc -ggV -lso +cpY +pAJ lCi vwO qZl @@ -245055,6 +246700,9 @@ kqP uQH rzQ rGj +ujk +bfz +nQD txE rfS drJ @@ -245071,22 +246719,26 @@ bln bln bln bln +bln +bln +bln +bln sKm -fAU +lPZ oCH -kML -gdE -pqE -qdE -aNE -hgq -tbd xcZ +fHA +nms +qIt +fWA +yeI +aij +rPD gFf asV sYH tli -vEo +fnS dXT fCQ fCQ @@ -245129,13 +246781,6 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO "} (150,1,3) = {" wNO @@ -245249,21 +246894,21 @@ aWS tGZ taK djT -ksK -ksK -ksK -ksK -dxi -ksK -ksK +mdZ +xhJ +xlv +rZE +mWg +uGZ +jPT dRK -llR +jIl pXs llR pxT cpY tLF -rjP +cwO vwO qnU nKa @@ -245308,9 +246953,12 @@ nXd bUM nyp vKm -jHv -uBA lpJ +xsU +lpJ +pfD +vep +imK xyT jvR fFC @@ -245321,28 +246969,32 @@ msN gVC lyH uxF -nhS +wBd wvI bln bln bln bln bln +bln +bln +bln +bln sKm -lPZ +aje oCH -joe -fHA -kDg -qIt -fWA -yeI -aij +aje +sdi +cbe +xvP +ueY +pWn +yfZ ndD aGR ndD nDz -xEK +qxC nlb rjq ffd @@ -245386,13 +247038,6 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO "} (151,1,3) = {" wNO @@ -245506,12 +247151,12 @@ mdZ syL kQX tGZ -npy +mdZ hyG -ghe +qKa msG -gFY -fNM +mWg +uGZ hjA pef sMP @@ -245561,17 +247206,20 @@ cvS cvS sZF wIS -vng +wRr npD lUH qIM -vdh -uBA +mwl +ylo +pYV +lSs +vep pBI vJE gGo -hUG -iRB +qwV +nKD qSC ldr fIv @@ -245580,27 +247228,31 @@ pmb hPD haQ pKY +vZw +bln +bln +bln bln bln bln bln bln sKm -aje -oCH -aje -sdi +sKm +sKm +sKm +ueK cbe -xvP -ueY -pWn -elE +pqE +uur +ttN +ezK bHl gFf uvF qBP tli -eUr +xhO dXT fCQ lug @@ -245643,13 +247295,6 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO "} (152,1,3) = {" wNO @@ -245763,19 +247408,19 @@ mdZ byk eYb sQI -oKB +mdZ iFz -yhS +vvr uyp -eKV -jXJ +mWg +uGZ hhE wJy wVQ hbE -atw +mBm ewN -cpY +bYb xIq lso qEM @@ -245820,10 +247465,10 @@ sZF sZF iXU npD -vdh -qIM -vdh -npD +uql +eZR +xDZ +dOB npD npD npD @@ -245831,27 +247476,34 @@ npD npD npD fvX +fvX +qDM +qDM oSw ybF wvI wvI wvI wvI -wvI +vep wvI bln bln bln -sKm -sKm -sKm -sKm -cmr -cbe +bln +bln +bln +bln +bln +bln +bln +bln +bln +xJt +pqE +xxE +umq pqE -uur -ttN -ezK jIu gFf gFf @@ -245900,13 +247552,6 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO "} (153,1,3) = {" wNO @@ -246022,21 +247667,21 @@ hzt kKL kKL cop -hiA +xlv iKC -jsb -ksK -ksK +mWg +ifE +kAS hSc hZA fbP -cyU +mBm nWD -cpY +bYb bvP -qGV +lso cbs -pxn +yfY nKa seE tch @@ -246075,21 +247720,20 @@ cga rTv sZF sKf -vng +wRr npD -vdh -fEh +aDY +eZR ubZ -axi -ptR -ptR -ptR +npD +npD +sPx +sPx oKq -ptR -eZm +gKq +sZF htn -sfS -tbJ +sZF bln bln bln @@ -246104,11 +247748,19 @@ bln bln bln bln -gnG -pqE -hIZ -sAo +bln +uer +bln +bln +bln +bln +bln +bln +bln pqE +jft +rqU +hey uRU uRU xGs @@ -246157,13 +247809,6 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO "} (154,1,3) = {" wNO @@ -246277,23 +247922,23 @@ kum kKL luq xCM -kKL +pqF dJj oOX -uhR +uyp dEP -ksK -bqD +eeg +mBm dqF -bMR +oZE oZE lZW mZa -cpY -fJI +bYb +xIq lso qEM -pxn +feG nKa nKa nKa @@ -246332,17 +247977,17 @@ uFz kJC sZF edT -vng +wRr npD -vdh -vdh -xoF +lbz +sgo +mQn npD -sZF -sZF -sZF -sZF -sZF +gVG +sPx +cSg +gKq +iye sZF eZu sZF @@ -246362,10 +248007,17 @@ bln bln bln bln +bln +bln +bln +bln +bln +bln +bln pqE -jft -rqU -hey +uOx +hmg +sKe uRU mfY kug @@ -246376,7 +248028,7 @@ gAx oPL oPL qLJ -iLN +gEu oPL yfu vTr @@ -246414,13 +248066,6 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO "} (155,1,3) = {" wNO @@ -246532,24 +248177,24 @@ kKL mTk bZG kKL -bcC +lli iCC kKL lON mNf jRE uNC -ksK +trE loP rNJ hxa -ldY -kKL -kKL -kKL -kKL -rqT -kUU +xBg +gkk +qaL +cpY +ivB +lso +vwO kBQ vBG eWn @@ -246589,20 +248234,20 @@ niJ aue sZF wUb -gNT +aAT npD -vdh +tgy vdh nvP npD iFl qby sPx -iye +tbQ iye sZF dxa -sZF +vjZ bln bln bln @@ -246619,10 +248264,17 @@ bln bln bln bln +bln +bln +bln +bln +bln +bln +bln +pqE +pqE +pqE pqE -uOx -hmg -sKe uRU mfY kug @@ -246671,13 +248323,6 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO "} (156,1,3) = {" wNO @@ -246789,7 +248434,7 @@ bMF ojV gbB kKL -tvZ +lli lAG kKL kKL @@ -246802,12 +248447,12 @@ clo kKL kKL kKL -ntp -giD kKL -lso -vwO -pJC +kKL +kKL +rqT +fLI +fRA vBG lzU pKw @@ -246846,9 +248491,9 @@ sfM tsZ sZF sKf -gNT +aAT npD -jhg +tgy vdh huL npD @@ -246876,10 +248521,17 @@ bln bln bln bln -pqE -pqE -pqE -pqE +bln +bln +bln +bln +bln +bln +bln +bln +bln +bln +bln uRU uRU wqh @@ -246928,13 +248580,6 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO "} (157,1,3) = {" wNO @@ -247055,12 +248700,12 @@ uZL tBN aKG kKL -lli +cSQ kKL kKl beT -lli -wBX +cOE +giD kKL lvX vwO @@ -247103,16 +248748,16 @@ tMO tMO sZF hil -gNT +aAT npD paq vdh -vdh +sPr npD vBa fMB qqc -iye +tbQ iye sZF cBn @@ -247131,7 +248776,14 @@ iAf iAf bln bln -uer +bln +bln +bln +bln +bln +bln +bln +bln bln bln bln @@ -247185,13 +248837,6 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO "} (158,1,3) = {" wNO @@ -247312,7 +248957,7 @@ nqn lHA hao kKL -lli +cSQ kKL eie lli @@ -247360,16 +249005,16 @@ tMO gSa sZF qwO -vng +wRr npD -wgd -vdh +tgy +uJL mUG npD vtr sPI dEi -tbQ +gKq oMs sZF eZu @@ -247569,12 +249214,12 @@ nNv wPZ fRP kKL -lli +cSQ cDw lli lli lli -fpA +dJV kKL cwO vwO @@ -247617,7 +249262,7 @@ ezf asL sZF sKf -vng +wRr npD npD czO @@ -247826,7 +249471,7 @@ wbZ oTB aOV kKL -lli +cSQ kKL vMR lZv @@ -247874,7 +249519,7 @@ tMO jYy sZF vwr -vng +wRr eZu sDi eZu @@ -247896,7 +249541,7 @@ bln fBN vYq iAf -wHN +mwF iNQ xaz iAf @@ -248083,7 +249728,7 @@ kKL kKL kKL kKL -lli +cSQ kKL kKL kKL @@ -248131,7 +249776,7 @@ tMO cAA sZF mEK -vng +wRr lXm sKf hjo @@ -248340,7 +249985,7 @@ tlH bln kKL lqh -uKr +sEE uKr uKr gxY @@ -248388,8 +250033,7 @@ sZF sZF sZF hEZ -gNT -sKf +aAT sKf sKf sZF @@ -248399,9 +250043,10 @@ sZF sZF sZF sZF +sZF eZu -npD -npD +sZF +sZF sZF vjZ sZF @@ -248645,13 +250290,13 @@ sWs sWs sWs sWs -osn +xTQ vwN sWs sWs -leE sWs sWs +leE sWs sWs sWs @@ -248659,7 +250304,7 @@ osn osn cmv ktf -npD +sZF bln bln bln @@ -248916,7 +250561,7 @@ sKf sKf wRr wEV -npD +sZF bln bln bln @@ -249877,7 +251522,7 @@ cqh tsh gEq aDo -tXF +wOg prg bwK prg @@ -249944,7 +251589,7 @@ tmR sZF kpo lKn -npD +sZF bln bln bln @@ -250201,7 +251846,7 @@ tmR sZF oHS wEV -npD +sZF bln bln bln @@ -250887,7 +252532,7 @@ bln bln kKL rqH -iFd +wbd hBv kKL lli @@ -251229,7 +252874,7 @@ eAw sZF pHR wEV -npD +sZF bln bln bln @@ -251486,13 +253131,13 @@ tmR sZF pHR wEV -npD +sZF bln bln bln bln bln -bgx +vzD vzD vzD gQw @@ -251749,7 +253394,7 @@ bln bln bln bln -bgx +vzD oIR uJC jCl @@ -252006,7 +253651,7 @@ bln bln bln bln -bgx +vzD vzD vzD kir @@ -252263,7 +253908,7 @@ bln bln bln bln -bgx +vzD jRB dFG uZc @@ -252469,7 +254114,7 @@ ult ult ult mtI -poI +low cMH mtI mtI @@ -252514,13 +254159,13 @@ jCl vzD mVD cEu -bgx -bgx -bgx -bgx -bgx -bgx -bgx +vzD +vzD +vzD +vzD +vzD +vzD +vzD uZc uZc sGZ @@ -252703,7 +254348,7 @@ kKL ttv prg prg -ehC +wOg iQQ gEE oNC @@ -253767,11 +255412,11 @@ hyW bgb usP wLl -qLl +ewZ uaN knC uaN -qLl +ewZ ioW sie sie @@ -253780,7 +255425,7 @@ sie aei aqx pTO -xFT +ewZ qNd kdq bnT @@ -254037,7 +255682,7 @@ sie aei oFq aVw -xFT +ewZ rID kdq ePj @@ -254276,10 +255921,10 @@ sDg gXJ egZ oHK -xnp -xnp -xnp -xnp +iZS +iZS +iZS +iZS wLl giI giI @@ -254294,7 +255939,7 @@ sie aei pNX fGo -xFT +ewZ fpq kdq ePj @@ -254538,10 +256183,10 @@ qWu fbl wgx krY -iqt -iqt -iqt -iqt +sie +sie +sie +sie sLO sie sie @@ -254549,9 +256194,9 @@ sie sie sie aei -oLA +iUE ymc -xFT +ewZ xKq rgV ePj @@ -254795,10 +256440,10 @@ bUa wRf gMF krY -iqt -iqt -iqt -iqt +sie +sie +sie +sie sLO sie sie @@ -254808,7 +256453,7 @@ sie aei uMj bNf -xFT +ewZ vNy pUh rin @@ -255052,10 +256697,10 @@ bUa fbl fcz krY -iqt -iqt -iqt -iqt +sie +sie +sie +sie sLO sie sie @@ -255063,9 +256708,9 @@ sie sie sie aei -oLA +iUE nUd -xFT +ewZ xcB rQV wxc @@ -255296,11 +256941,11 @@ elw dzU hfP mEJ -sMZ +rbM mEJ ecw mEJ -sMZ +rbM mEJ mEJ krY @@ -255309,10 +256954,10 @@ pGp lIk tae krY -iqt -iqt -iqt -iqt +sie +sie +sie +sie sLO sie sie @@ -255320,9 +256965,9 @@ sie sie sie aei -oLA +iUE oOP -xFT +ewZ dim cXY qfi @@ -255566,10 +257211,10 @@ bUa trO pYA krY -iqt -iqt -iqt -iqt +sie +sie +sie +sie sLO ydB vmV @@ -255579,7 +257224,7 @@ jjA jXu mYx cFu -xFT +ewZ xgq cXY fqc @@ -255836,7 +257481,7 @@ xnl dUy now xMt -qLl +ewZ gMb cXY fqc @@ -256093,7 +257738,7 @@ lxM bzn brD brD -qLl +ewZ nMs tav fqc @@ -256337,7 +257982,7 @@ eIC trK fsN krY -cAY +brD brD gTy tPV @@ -256350,7 +257995,7 @@ opj bzn brD kSJ -qLl +ewZ nMs uSz fqc @@ -256594,7 +258239,7 @@ cpQ qKZ jCp krY -wAp +ulp brD hkf bVz @@ -256607,7 +258252,7 @@ pLL bzn brD wAp -qLl +ewZ fqc mYs fqc @@ -256851,11 +258496,11 @@ omh omh dmC elw -rMj -rMj +ewZ +ewZ viV -rMj -rMj +ewZ +ewZ bgx bgx bgx @@ -257590,17 +259235,17 @@ sEB tpd hOt ejn -vXy +jyw tpd -vXy +pCN ejn ejn jOD tGx ejn -vXy +pCN ejn -vXy +pCN ejn udw jZM @@ -258153,7 +259798,7 @@ bln vzD bFq jCl -xhT +kXG jCl gUT jCl diff --git a/_maps/map_files/KiloStation/KiloStation.dmm b/_maps/map_files/KiloStation/KiloStation.dmm index b35c5c0423cc14..66f24c184470e5 100644 --- a/_maps/map_files/KiloStation/KiloStation.dmm +++ b/_maps/map_files/KiloStation/KiloStation.dmm @@ -560,9 +560,8 @@ /obj/effect/landmark/blobstart, /obj/effect/landmark/xeno_spawn, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/hallway/secondary/entry) "ahz" = ( /obj/effect/turf_decal/tile/yellow{ @@ -608,7 +607,8 @@ "ahK" = ( /obj/machinery/door/poddoor/shutters{ id = "aux_base_shutters"; - name = "Auxillary Base Shutters" + name = "Auxillary Base Shutters"; + dir = 4 }, /obj/structure/cable, /obj/effect/turf_decal/caution/stand_clear, @@ -898,7 +898,7 @@ /obj/effect/turf_decal/stripes/line, /obj/effect/decal/cleanable/blood/old, /turf/open/floor/engine/vacuum, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "alL" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, @@ -1021,17 +1021,14 @@ /turf/open/floor/iron/showroomfloor, /area/station/security/lockers) "anC" = ( -/obj/structure/sign/departments/security{ - pixel_y = 32 - }, +/obj/structure/sign/departments/security/directional/north, /obj/effect/turf_decal/stripes/line{ dir = 8 }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, -/area/station/security/prison) +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/security/execution/transfer) "anF" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/tile/neutral, @@ -1109,7 +1106,7 @@ pixel_y = 3 }, /turf/open/floor/iron/dark, -/area/station/service/chapel/dock) +/area/station/service/chapel) "aoj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -1117,9 +1114,8 @@ /obj/effect/turf_decal/stripes/corner{ dir = 1 }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "aol" = ( /obj/effect/decal/cleanable/dirt, @@ -1128,9 +1124,8 @@ dir = 4 }, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "aot" = ( /obj/machinery/door/firedoor, @@ -1179,7 +1174,7 @@ dir = 1 }, /turf/open/floor/iron/showroomfloor, -/area/station/security/prison) +/area/station/security/execution/transfer) "aoX" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/north, @@ -1194,7 +1189,7 @@ }, /obj/machinery/light/directional/north, /turf/open/floor/iron/showroomfloor, -/area/station/science/mixing) +/area/station/science/ordnance) "apl" = ( /obj/effect/turf_decal/tile/brown, /obj/effect/turf_decal/tile/brown{ @@ -1304,9 +1299,8 @@ /area/space/nearstation) "aqC" = ( /obj/effect/decal/cleanable/cobweb, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/department/crew_quarters/bar) "aqH" = ( /obj/effect/decal/cleanable/dirt, @@ -1320,14 +1314,12 @@ dir = 1 }, /turf/open/floor/iron/showroomfloor, -/area/station/security/prison) +/area/station/security/execution/transfer) "aqP" = ( /obj/effect/turf_decal/box/corners{ dir = 1 }, -/obj/structure/sign/warning/electric_shock{ - pixel_y = 32 - }, +/obj/structure/sign/warning/electric_shock/directional/north, /turf/open/floor/engine, /area/station/science/xenobiology) "aqQ" = ( @@ -1398,9 +1390,7 @@ /obj/machinery/porta_turret/ai{ dir = 4 }, -/obj/structure/sign/warning/secure_area{ - pixel_y = 32 - }, +/obj/structure/sign/warning/secure_area/directional/north, /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/effect/turf_decal/box/red, /turf/open/floor/circuit/green{ @@ -1435,14 +1425,11 @@ }, /obj/effect/landmark/xeno_spawn, /obj/machinery/light/small/directional/east, -/obj/structure/sign/warning/xeno_mining{ - pixel_x = 32 - }, +/obj/structure/sign/warning/xeno_mining/directional/east, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/solars/starboard/fore) "atB" = ( /obj/machinery/porta_turret/ai{ @@ -1474,9 +1461,7 @@ /obj/item/stack/rods, /obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/sign/warning/vacuum/external{ - pixel_x = -32 - }, +/obj/structure/sign/warning/vacuum/external/directional/west, /turf/open/floor/plating, /area/station/cargo/warehouse) "auN" = ( @@ -1574,9 +1559,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/solars/starboard/fore) "awR" = ( /obj/structure/table/wood, @@ -1642,9 +1626,8 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /obj/structure/rack, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "axt" = ( /obj/structure/cable, @@ -1664,9 +1647,8 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/blobstart, /obj/effect/spawner/random/decoration/glowstick, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "ayc" = ( /obj/effect/turf_decal/tile/blue{ @@ -1774,9 +1756,8 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/south, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/solars/starboard/aft) "azv" = ( /turf/closed/wall, @@ -1791,7 +1772,7 @@ dir = 8 }, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "azK" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 4 @@ -1804,15 +1785,17 @@ name = "Ordnance Mixing Lab Requests Console" }, /turf/open/floor/iron/showroomfloor, -/area/station/science/mixing) +/area/station/science/ordnance) "aAa" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 1 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/north, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/garden) "aAg" = ( /turf/closed/wall/r_wall/rust, /area/station/ai_monitored/turret_protected/ai) @@ -1901,14 +1884,23 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/aft) +"aBt" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters{ + id = "virologysurgery"; + name = "Virology Privacy Shutters"; + dir = 8 + }, +/turf/open/floor/plating, +/area/station/medical/virology) "aBA" = ( /obj/machinery/door/poddoor/shutters/preopen{ id = "ceprivate"; - name = "Chief Engineer's Privacy Shutters" + name = "Chief Engineer's Privacy Shutters"; + dir = 8 }, /obj/machinery/door/firedoor, /obj/effect/turf_decal/caution/stand_clear, @@ -1985,9 +1977,8 @@ "aCx" = ( /obj/effect/decal/cleanable/blood/old, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "aCz" = ( /obj/structure/rack, @@ -2019,9 +2010,8 @@ /obj/effect/decal/cleanable/blood/old, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/solars/starboard/fore) "aDo" = ( /obj/structure/filingcabinet/chestdrawer, @@ -2300,9 +2290,8 @@ "aFd" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/aft) "aFn" = ( /obj/effect/spawner/structure/window/reinforced, @@ -2324,9 +2313,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/engineering/supermatter/room) "aGs" = ( /obj/machinery/atmospherics/pipe/smart/simple/green/visible, @@ -2348,7 +2336,7 @@ dir = 8 }, /turf/open/floor/iron/dark, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "aGK" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -2469,9 +2457,8 @@ /obj/effect/spawner/random/structure/crate, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/aft) "aIl" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -2570,7 +2557,7 @@ dir = 6 }, /turf/open/floor/engine/vacuum, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "aKe" = ( /obj/effect/decal/cleanable/cobweb, /obj/effect/turf_decal/stripes/corner{ @@ -2752,13 +2739,15 @@ /obj/structure/disposalpipe/segment, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/aft) "aND" = ( /turf/closed/wall/r_wall, /area/station/science/lab) +"aNE" = ( +/turf/closed/wall/r_wall/rust, +/area/station/security/prison/shower) "aNH" = ( /obj/structure/chair/pew{ dir = 4 @@ -2767,10 +2756,6 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron/dark, /area/station/security/courtroom) -"aNN" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/service/chapel/dock) "aOc" = ( /obj/effect/turf_decal/plaque{ icon_state = "L1" @@ -2823,7 +2808,7 @@ "aOq" = ( /obj/structure/sign/departments/security, /turf/closed/wall/rust, -/area/station/security/prison) +/area/station/security/execution/transfer) "aOG" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -2848,14 +2833,13 @@ /obj/machinery/door/firedoor/heavy, /obj/effect/mapping_helpers/airlock/access/all/science/ordnance_storage, /turf/open/floor/iron/dark, -/area/station/science/storage) +/area/station/science/ordnance/storage) "aOR" = ( /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/effect/decal/cleanable/dirt, /obj/structure/girder/displaced, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/aft) "aPg" = ( /obj/effect/decal/cleanable/dirt, @@ -2882,9 +2866,8 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/security/prison) "aPq" = ( /obj/effect/turf_decal/tile/neutral, @@ -2914,16 +2897,15 @@ /area/station/service/library) "aPS" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "aQf" = ( /obj/structure/chair{ dir = 8 }, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "aQl" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -2967,10 +2949,9 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, -/area/station/security/prison) +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/security/execution/transfer) "aQQ" = ( /obj/effect/turf_decal/tile/blue{ dir = 1 @@ -2987,9 +2968,8 @@ "aRb" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/sign/poster/contraband/random/directional/west, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "aRB" = ( /obj/effect/turf_decal/stripes/line{ @@ -3006,9 +2986,8 @@ /area/station/ai_monitored/turret_protected/aisat/foyer) "aSc" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "aSj" = ( /obj/machinery/door/airlock/external{ @@ -3017,9 +2996,8 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 }, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "aSo" = ( /obj/effect/turf_decal/tile/red{ @@ -3044,7 +3022,7 @@ /turf/open/floor/iron/chapel{ dir = 4 }, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "aSv" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -3126,9 +3104,6 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/iron, /area/station/cargo/storage) -"aTN" = ( -/turf/closed/mineral/random/labormineral, -/area/station/hallway/secondary/entry) "aTR" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/iron/recharge_floor, @@ -3138,9 +3113,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/aft) "aUh" = ( /obj/effect/turf_decal/bot, @@ -3199,9 +3173,8 @@ dir = 5 }, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/aft) "aVn" = ( /obj/item/tank/internals/emergency_oxygen{ @@ -3381,9 +3354,8 @@ dir = 1 }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "aZi" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -3418,9 +3390,8 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment, /obj/effect/spawner/random/structure/steam_vent, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/aft) "bax" = ( /turf/closed/wall, @@ -3490,7 +3461,7 @@ /obj/machinery/power/apc/auto_name/directional/east, /obj/structure/cable, /turf/open/floor/iron/showroomfloor, -/area/station/science/mixing) +/area/station/science/ordnance) "bbl" = ( /obj/machinery/door/airlock/external{ name = "Abandoned External Airlock" @@ -3511,28 +3482,28 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/aft) "bcb" = ( /obj/structure/table/reinforced, /obj/machinery/door/firedoor, /obj/machinery/door/poddoor/shutters{ id = "commissaryshutter"; - name = "Vacant Commissary Shutter" + name = "Vacant Commissary Shutter"; + dir = 1 }, /obj/effect/turf_decal/delivery, /obj/structure/noticeboard/directional/east, /turf/open/floor/plating, /area/station/commons/vacant_room/commissary) "bcq" = ( -/obj/machinery/computer/security/telescreen/entertainment/directional/east, /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 }, +/obj/machinery/airalarm/directional/east, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "bcQ" = ( /obj/machinery/suit_storage_unit/atmos, /obj/effect/turf_decal/tile/neutral, @@ -3649,15 +3620,14 @@ }, /obj/effect/mapping_helpers/airlock/access/all/science/ordnance, /turf/open/floor/engine, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "bef" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment{ dir = 6 }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/aft) "beo" = ( /obj/structure/cable, @@ -3697,9 +3667,8 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/light/small/directional/south, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "bfA" = ( /obj/effect/turf_decal/tile/yellow, @@ -3723,9 +3692,8 @@ dir = 1 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "bfI" = ( /obj/effect/turf_decal/tile/brown{ @@ -3862,6 +3830,12 @@ }, /turf/open/floor/iron/showroomfloor, /area/station/medical/medbay/central) +"bjv" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/service/chapel) "bjz" = ( /obj/structure/flora/grass/jungle/a/style_random, /turf/open/misc/asteroid, @@ -3999,9 +3973,8 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /obj/effect/spawner/random/structure/crate, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/aft) "bls" = ( /obj/effect/decal/cleanable/dirt, @@ -4032,6 +4005,10 @@ /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, /turf/closed/wall, /area/station/engineering/atmos) +"bml" = ( +/obj/structure/railing/corner, +/turf/open/floor/iron/dark, +/area/station/service/chapel) "bms" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/bot, @@ -4048,9 +4025,8 @@ name = "Maid Bay Toggle" }, /obj/structure/sign/poster/contraband/random/directional/west, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "bmu" = ( /obj/structure/reagent_dispensers/watertank, @@ -4113,7 +4089,7 @@ /turf/open/floor/iron/stairs{ dir = 1 }, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "bnB" = ( /obj/structure/frame/computer, /obj/effect/turf_decal/siding/thinplating/dark, @@ -4129,7 +4105,8 @@ /obj/effect/mapping_helpers/airlock/access/all/security/hos, /obj/machinery/door/poddoor/shutters{ id = "frontarmory"; - name = "Front Armoury Shutter" + name = "Front Armoury Shutter"; + dir = 8 }, /obj/machinery/button/door/directional/north{ id = "frontarmory"; @@ -4181,9 +4158,7 @@ id = "Xenolab"; name = "Containment Chamber Blast Door" }, -/obj/structure/sign/warning/biohazard{ - pixel_x = 32 - }, +/obj/structure/sign/warning/biohazard/directional/east, /obj/effect/turf_decal/caution/stand_clear, /obj/machinery/door/firedoor, /turf/open/floor/engine, @@ -4198,9 +4173,8 @@ "boL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/table_frame, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/disposal/incinerator) "boZ" = ( /obj/structure/table, @@ -4351,7 +4325,7 @@ "bqA" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/showroomfloor, -/area/station/security/prison) +/area/station/security/execution/transfer) "brg" = ( /obj/structure/rack, /obj/effect/spawner/random/techstorage/engineering_all, @@ -4371,9 +4345,7 @@ /turf/open/floor/iron/dark, /area/station/engineering/storage/tech) "brh" = ( -/obj/structure/sign/warning/secure_area{ - pixel_x = -32 - }, +/obj/structure/sign/warning/secure_area/directional/west, /turf/open/misc/asteroid/lowpressure, /area/space/nearstation) "brz" = ( @@ -4451,7 +4423,7 @@ /obj/machinery/door/window/right/directional/west{ dir = 4; name = "Cargo Desk"; - req_access = list("mail_sorting") + req_access = list("shipping") }, /obj/item/flashlight, /turf/open/floor/plating, @@ -4465,7 +4437,7 @@ }, /obj/structure/cable, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "bsJ" = ( /obj/structure/destructible/cult/item_dispenser/archives/library, /obj/item/book/codex_gigas{ @@ -4561,9 +4533,8 @@ "btk" = ( /obj/effect/decal/cleanable/blood/old, /obj/effect/decal/cleanable/blood/gibs/limb, -/turf/open/floor/wood{ - icon_state = "wood-broken" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/maintenance/port/fore) "btt" = ( /obj/effect/decal/cleanable/dirt, @@ -4687,9 +4658,8 @@ /obj/structure/disposalpipe/segment{ dir = 9 }, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "bvk" = ( /obj/effect/landmark/secequipment, @@ -4704,9 +4674,7 @@ /obj/effect/mapping_helpers/airlock/abandoned, /obj/structure/barricade/wooden/crude, /obj/effect/decal/cleanable/dirt, -/obj/structure/sign/warning/biohazard{ - pixel_x = 32 - }, +/obj/structure/sign/warning/biohazard/directional/east, /obj/structure/cable, /obj/effect/mapping_helpers/airlock/unres{ dir = 1 @@ -4717,7 +4685,7 @@ "bvm" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/station/science/mixing/hallway) +/area/station/science/ordnance) "bvq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -4728,9 +4696,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/structure/sign/departments/lawyer{ - pixel_x = 32 - }, +/obj/structure/sign/departments/lawyer/directional/east, /turf/open/floor/iron, /area/station/hallway/primary/port) "bvA" = ( @@ -4743,9 +4709,7 @@ /area/station/command/heads_quarters/captain) "bvG" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/sign/warning/xeno_mining{ - pixel_y = 32 - }, +/obj/structure/sign/warning/xeno_mining/directional/north, /obj/machinery/door/airlock/external/glass{ name = "External Freight Airlock" }, @@ -4790,9 +4754,8 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/event_spawn, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "bww" = ( /obj/effect/decal/cleanable/dirt, @@ -4801,9 +4764,8 @@ /obj/effect/decal/cleanable/oil, /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/south, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "bwB" = ( /obj/effect/turf_decal/tile/red{ @@ -4831,7 +4793,7 @@ /obj/structure/closet/secure_closet/brig, /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron/showroomfloor, -/area/station/security/prison) +/area/station/security/execution/transfer) "bwW" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/unres{ @@ -4959,7 +4921,7 @@ }, /obj/structure/cable, /turf/open/floor/iron/showroomfloor, -/area/station/science/storage) +/area/station/science/ordnance/storage) "bzu" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark, @@ -5012,7 +4974,13 @@ /obj/item/food/grown/poppy/geranium, /obj/machinery/firealarm/directional/east, /turf/open/floor/iron/dark, -/area/station/service/chapel/dock) +/area/station/service/chapel) +"bAt" = ( +/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/security/prison/mess) "bAv" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/corner{ @@ -5025,9 +4993,8 @@ dir = 9 }, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "bAQ" = ( /obj/effect/turf_decal/delivery, @@ -5060,9 +5027,8 @@ "bAR" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/masks, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "bAS" = ( /obj/effect/turf_decal/tile/neutral{ @@ -5116,16 +5082,15 @@ /obj/effect/decal/cleanable/blood/old, /obj/effect/decal/cleanable/dirt, /obj/item/shard, -/turf/open/floor/wood{ - icon_state = "wood-broken6" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/cargo/warehouse) "bBC" = ( /obj/effect/turf_decal/stripes/end{ dir = 8 }, /turf/open/floor/engine/vacuum, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "bBE" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -5236,9 +5201,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /obj/structure/disposalpipe/segment, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "bDj" = ( /obj/effect/turf_decal/tile/neutral, @@ -5393,9 +5357,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/structure/sign/departments/security{ - pixel_x = -32 - }, +/obj/structure/sign/departments/security/directional/west, /turf/open/floor/iron, /area/station/hallway/primary/aft) "bFv" = ( @@ -5499,12 +5461,21 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"bHt" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/service/chapel) "bHu" = ( /obj/structure/table, /obj/item/food/energybar, /obj/structure/cable, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "bHv" = ( /obj/structure/closet/secure_closet/security/sec, /obj/effect/turf_decal/tile/neutral, @@ -5655,14 +5626,8 @@ /turf/open/misc/asteroid, /area/space/nearstation) "bKA" = ( -/obj/docking_port/stationary{ - dir = 4; - dwidth = 3; - height = 10; - id = "mining_home"; - name = "mining shuttle bay"; - roundstart_template = /datum/map_template/shuttle/mining/kilo; - width = 7 +/obj/docking_port/stationary/mining_home/kilo{ + dir = 4 }, /turf/open/space/basic, /area/space) @@ -5700,9 +5665,8 @@ "bLH" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/decoration/glowstick, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "bLR" = ( /obj/effect/turf_decal/tile/red{ @@ -5723,10 +5687,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood{ - icon_state = "wood-broken6" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/maintenance/port/fore) +"bMk" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/service/chapel) "bMw" = ( /obj/effect/decal/cleanable/dirt, /obj/item/toy/beach_ball/holoball, @@ -5922,9 +5889,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "bRb" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -5973,7 +5939,7 @@ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/science/misc_lab) +/area/station/science/ordnance/office) "bRO" = ( /obj/machinery/chem_dispenser, /obj/effect/turf_decal/tile/neutral, @@ -6081,7 +6047,7 @@ /area/station/hallway/primary/aft) "bSY" = ( /turf/closed/wall, -/area/station/security/prison) +/area/station/security/execution/transfer) "bTe" = ( /obj/machinery/computer/communications{ dir = 1 @@ -6100,9 +6066,7 @@ /area/station/command/heads_quarters/captain) "bTj" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/warning/vacuum/external{ - pixel_y = 32 - }, +/obj/structure/sign/warning/vacuum/external/directional/north, /turf/open/floor/plating, /area/station/construction/mining/aux_base) "bTT" = ( @@ -6126,9 +6090,7 @@ }, /obj/structure/cable, /obj/structure/disposalpipe/segment, -/obj/structure/sign/warning/secure_area{ - pixel_x = 32 - }, +/obj/structure/sign/warning/secure_area/directional/east, /turf/open/floor/iron, /area/station/engineering/lobby) "bUd" = ( @@ -6264,14 +6226,8 @@ /turf/open/floor/plating/airless, /area/space) "bUU" = ( -/obj/docking_port/stationary{ - dir = 2; - dwidth = 2; - height = 5; - id = "laborcamp_home"; - name = "fore bay 1"; - roundstart_template = /datum/map_template/shuttle/labour/kilo; - width = 9 +/obj/docking_port/stationary/laborcamp_home/kilo{ + dir = 2 }, /turf/open/space, /area/space) @@ -6314,10 +6270,13 @@ /obj/effect/turf_decal/stripes/line, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) +"bWC" = ( +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/security/prison/shower) "bWE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/closed/wall/r_wall, @@ -6443,9 +6402,8 @@ /obj/effect/spawner/random/structure/crate, /obj/structure/closet/cardboard, /obj/structure/sign/poster/contraband/random/directional/north, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "bZd" = ( /obj/effect/decal/cleanable/dirt, @@ -6478,7 +6436,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/showroomfloor, -/area/station/science/mixing) +/area/station/science/ordnance) "bZE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -6497,9 +6455,8 @@ /obj/effect/spawner/random/decoration/glowstick, /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/north, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/disposal) "bZQ" = ( /obj/structure/railing{ @@ -6533,9 +6490,8 @@ /obj/structure/girder, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/corner, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "cau" = ( /obj/structure/cable, @@ -6557,13 +6513,12 @@ dir = 4 }, /turf/open/floor/engine/vacuum, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "caM" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/structure/crate, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/aft) "caO" = ( /obj/effect/turf_decal/tile/red{ @@ -6597,10 +6552,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/brig) -"cbo" = ( -/obj/structure/cable, -/turf/open/floor/iron/showroomfloor, -/area/station/science/mixing) "cbp" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -6630,7 +6581,7 @@ /turf/open/floor/iron/stairs/left{ dir = 4 }, -/area/station/service/chapel/dock) +/area/station/service/chapel) "ccd" = ( /obj/structure/railing{ dir = 4 @@ -6639,7 +6590,7 @@ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "ccf" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -6684,7 +6635,7 @@ }, /obj/effect/turf_decal/tile/purple/anticorner/contrasted, /turf/open/floor/iron/showroomfloor, -/area/station/science/mixing) +/area/station/science/ordnance) "ccP" = ( /obj/structure/lattice, /obj/structure/window/reinforced{ @@ -6835,9 +6786,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "cdV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -6960,9 +6910,8 @@ }, /obj/structure/cable, /obj/effect/decal/cleanable/blood/old, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/disposal) "ceM" = ( /obj/effect/turf_decal/tile/blue{ @@ -7069,9 +7018,8 @@ /obj/structure/sign/poster/contraband/grey_tide{ pixel_y = 32 }, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "cgb" = ( /obj/effect/turf_decal/stripes/line{ @@ -7323,9 +7271,8 @@ }, /obj/structure/cable, /obj/structure/sign/poster/contraband/random/directional/north, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "cjG" = ( /obj/structure/window/reinforced/spawner{ @@ -7339,7 +7286,8 @@ /obj/structure/flora/bush/flowers_br/style_random, /obj/machinery/door/poddoor/shutters/preopen{ id = "emmd"; - name = "Emergency Medical Lockdown Shutters" + name = "Emergency Medical Lockdown Shutters"; + dir = 4 }, /turf/open/floor/grass, /area/station/medical/paramedic) @@ -7372,7 +7320,7 @@ dir = 1 }, /turf/open/floor/glass/reinforced, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "cjS" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 @@ -7445,9 +7393,7 @@ /area/station/maintenance/starboard) "ckB" = ( /obj/machinery/power/smes/engineering, -/obj/structure/sign/warning/electric_shock{ - pixel_x = 32 - }, +/obj/structure/sign/warning/electric_shock/directional/east, /obj/structure/cable, /turf/open/floor/circuit/red, /area/station/engineering/supermatter/room) @@ -7502,7 +7448,7 @@ dir = 8 }, /obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/engineering/construction, +/obj/effect/mapping_helpers/airlock/access/all/command/minisat, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat/foyer) "clt" = ( @@ -7522,9 +7468,7 @@ "cly" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/power/port_gen/pacman, -/obj/structure/sign/warning/no_smoking{ - pixel_y = 32 - }, +/obj/structure/sign/warning/no_smoking/directional/north, /obj/effect/decal/cleanable/cobweb, /obj/structure/spider/stickyweb, /obj/structure/cable, @@ -7614,9 +7558,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/hallway/secondary/entry) "cmc" = ( /obj/machinery/door/airlock/maintenance{ @@ -7648,7 +7591,7 @@ /turf/open/floor/iron/stairs/left{ dir = 4 }, -/area/station/service/chapel/dock) +/area/station/service/chapel) "cnf" = ( /obj/structure/grille, /turf/open/misc/asteroid/airless, @@ -7702,9 +7645,8 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/blood/old, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/disposal) "cop" = ( /obj/structure/railing{ @@ -7721,7 +7663,7 @@ }, /obj/item/storage/book/bible, /turf/open/floor/iron/dark, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "cos" = ( /obj/effect/turf_decal/box, /obj/effect/turf_decal/stripes/line{ @@ -7775,9 +7717,8 @@ /obj/structure/grille/broken, /obj/effect/decal/cleanable/blood/old, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/aft) "cpY" = ( /obj/item/pickaxe, @@ -7936,9 +7877,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, /obj/structure/disposalpipe/segment, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "csj" = ( /obj/structure/table, @@ -7968,7 +7908,7 @@ /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron/dark, -/area/station/security/prison) +/area/station/security/execution/transfer) "csL" = ( /obj/structure/table/wood/fancy/black, /obj/item/food/grown/poppy/lily{ @@ -7981,16 +7921,15 @@ }, /obj/item/food/grown/poppy/lily, /turf/open/floor/iron/dark, -/area/station/service/chapel/dock) +/area/station/service/chapel/monastery) "csP" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /obj/structure/disposalpipe/segment, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "csW" = ( /obj/structure/sign/warning/no_smoking, @@ -8148,7 +8087,7 @@ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/service/chapel/dock) +/area/station/service/chapel/monastery) "cvm" = ( /obj/machinery/photocopier, /obj/effect/turf_decal/tile/neutral{ @@ -8224,9 +8163,8 @@ }, /obj/effect/decal/cleanable/oil/slippery, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/aft) "cvV" = ( /obj/effect/decal/cleanable/dirt, @@ -8247,9 +8185,8 @@ dir = 8 }, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "cwl" = ( /obj/structure/girder, @@ -8270,18 +8207,16 @@ /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/security/execution/education) "cxF" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/aft) "cxO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -8349,9 +8284,8 @@ /area/station/service/library) "cyJ" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "czj" = ( /obj/machinery/door/firedoor, @@ -8423,7 +8357,8 @@ }, /obj/machinery/door/poddoor/shutters/preopen{ id = "AI Core shutters"; - name = "AI Core Shutter" + name = "AI Core Shutter"; + dir = 8 }, /obj/effect/turf_decal/delivery, /turf/open/floor/engine, @@ -8528,7 +8463,7 @@ dir = 10 }, /turf/open/floor/carpet/red, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "cCX" = ( /obj/docking_port/stationary/random{ dir = 2; @@ -8574,9 +8509,8 @@ /obj/effect/decal/cleanable/blood/old, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "cDZ" = ( /obj/effect/spawner/structure/window/reinforced, @@ -8672,9 +8606,8 @@ /obj/structure/closet, /obj/item/stack/package_wrap, /obj/item/storage/bag/trash, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/disposal) "cGl" = ( /obj/effect/turf_decal/tile/neutral{ @@ -8736,7 +8669,7 @@ /turf/open/floor/iron/chapel{ dir = 1 }, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "cHu" = ( /obj/structure/lattice/catwalk, /turf/open/floor/plating/airless, @@ -8766,10 +8699,9 @@ dir = 1 }, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/station/security/prison) +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/station/security/execution/transfer) "cHG" = ( /obj/machinery/conveyor{ dir = 4; @@ -8827,7 +8759,8 @@ "cHY" = ( /obj/machinery/door/poddoor/shutters/preopen{ id = "chem_lockdown"; - name = "Chemistry Shutters" + name = "Chemistry Shutters"; + dir = 8 }, /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -8918,14 +8851,11 @@ /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{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "cJb" = ( -/obj/structure/sign/departments/psychology{ - pixel_y = 32 - }, +/obj/structure/sign/departments/psychology/directional/north, /obj/effect/turf_decal/tile/blue{ dir = 1 }, @@ -9034,7 +8964,8 @@ "cJw" = ( /obj/machinery/door/poddoor/shutters{ id = "aux_base_shutters"; - name = "Auxillary Base Shutters" + name = "Auxillary Base Shutters"; + dir = 4 }, /obj/effect/turf_decal/caution/stand_clear, /turf/open/floor/iron/dark, @@ -9046,9 +8977,7 @@ /area/space/nearstation) "cJR" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/warning/vacuum/external{ - pixel_y = -32 - }, +/obj/structure/sign/warning/vacuum/external/directional/south, /turf/open/floor/plating, /area/station/construction/mining/aux_base) "cKs" = ( @@ -9056,9 +8985,8 @@ /obj/structure/disposalpipe/segment, /obj/structure/cable, /obj/effect/turf_decal/stripes/corner, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "cKz" = ( /turf/closed/wall/rust, @@ -9076,9 +9004,8 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/structure/crate, /obj/effect/turf_decal/bot, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "cKY" = ( /obj/effect/turf_decal/tile/neutral{ @@ -9098,14 +9025,13 @@ pixel_y = 4 }, /obj/item/newspaper, -/turf/open/floor/wood{ - icon_state = "wood-broken6" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/maintenance/port/greater) "cLo" = ( -/obj/structure/lattice/catwalk, /obj/structure/cable, -/turf/open/floor/plating/airless, +/obj/structure/lattice/catwalk, +/turf/open/space/basic, /area/station/solars/port/aft) "cLq" = ( /obj/effect/turf_decal/tile/neutral{ @@ -9179,16 +9105,15 @@ dir = 4 }, /turf/open/floor/glass/reinforced, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "cLX" = ( /obj/machinery/door/window/right/directional/west{ name = "Waste Door" }, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/blood/old, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/disposal) "cMj" = ( /obj/effect/turf_decal/tile/purple{ @@ -9239,13 +9164,13 @@ /area/station/maintenance/disposal/incinerator) "cNe" = ( /turf/closed/wall/r_wall/rust, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "cNH" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 }, /turf/open/floor/engine/vacuum, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "cNZ" = ( /obj/effect/decal/cleanable/blood/old, /obj/effect/turf_decal/sand/plating, @@ -9278,7 +9203,7 @@ /obj/machinery/door/window/left/directional/west{ dir = 2; name = "Cargo Desk"; - req_access = list("mail_sorting") + req_access = list("shipping") }, /turf/open/floor/plating, /area/station/hallway/secondary/exit/departure_lounge) @@ -9316,7 +9241,7 @@ /obj/effect/turf_decal/tile/red, /obj/structure/reagent_dispensers/servingdish, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "cPo" = ( /obj/machinery/door/airlock/research{ name = "Ordnance Lab" @@ -9327,7 +9252,7 @@ /obj/machinery/door/firedoor/heavy, /obj/effect/mapping_helpers/airlock/access/all/science/ordnance_storage, /turf/open/floor/iron/dark, -/area/station/science/storage) +/area/station/science/ordnance/storage) "cPp" = ( /obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/yellow{ @@ -9353,9 +9278,8 @@ }, /obj/effect/decal/cleanable/dirt, /obj/structure/sign/poster/contraband/random/directional/west, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/disposal) "cPu" = ( /obj/machinery/light/directional/west, @@ -9431,9 +9355,8 @@ dir = 6 }, /obj/structure/sign/poster/contraband/random/directional/north, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "cQJ" = ( /obj/effect/decal/cleanable/cobweb/cobweb2, @@ -9455,7 +9378,8 @@ /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters{ id = "sparemech"; - name = "Abandoned Mech Bay" + name = "Abandoned Mech Bay"; + dir = 8 }, /turf/open/floor/plating, /area/station/maintenance/port/aft) @@ -9491,9 +9415,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "cSj" = ( /obj/structure/window/reinforced, @@ -9526,9 +9449,8 @@ "cSp" = ( /obj/effect/decal/cleanable/blood/old, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/aft) "cSq" = ( /obj/structure/flora/rock/pile/style_random{ @@ -9816,7 +9738,7 @@ dir = 8 }, /turf/open/floor/iron/showroomfloor, -/area/station/security/prison) +/area/station/security/execution/transfer) "cWu" = ( /obj/effect/turf_decal/tile/yellow{ dir = 4 @@ -9913,7 +9835,7 @@ "cXg" = ( /obj/structure/reagent_dispensers/watertank/high, /obj/structure/railing, -/obj/item/reagent_containers/glass/bucket, +/obj/item/reagent_containers/glass/watering_can, /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/station/service/hydroponics) @@ -9928,9 +9850,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, /obj/structure/sign/poster/contraband/random/directional/west, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "cXT" = ( /turf/closed/wall/rust, @@ -10031,9 +9952,8 @@ dir = 4 }, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "cZh" = ( /obj/machinery/door/airlock/maintenance, @@ -10089,9 +10009,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "daL" = ( /obj/effect/turf_decal/stripes/line{ @@ -10118,9 +10037,8 @@ dir = 10 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/central) "dbp" = ( /obj/effect/turf_decal/bot, @@ -10164,8 +10082,7 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/sign/departments/cargo{ - pixel_x = 32; +/obj/structure/sign/departments/cargo/directional/east{ pixel_y = -32 }, /turf/open/floor/iron/dark/textured, @@ -10173,11 +10090,12 @@ "dbY" = ( /obj/machinery/door/poddoor/shutters/preopen{ id = "ordnancestorage"; - name = "Ordnance Storage Shutters" + name = "Ordnance Storage Shutters"; + dir = 1 }, /obj/machinery/door/firedoor/heavy, /turf/open/floor/iron/showroomfloor, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/storage) "dch" = ( /obj/effect/turf_decal/stripes/asteroid/line{ dir = 4 @@ -10321,7 +10239,7 @@ /obj/effect/turf_decal/tile/purple/anticorner/contrasted, /obj/effect/landmark/start/scientist, /turf/open/floor/iron/showroomfloor, -/area/station/science/misc_lab) +/area/station/science/ordnance/office) "deZ" = ( /obj/structure/chair, /obj/effect/turf_decal/tile/neutral, @@ -10360,8 +10278,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, -/obj/structure/sign/warning/electric_shock{ - pixel_x = -32; +/obj/structure/sign/warning/electric_shock/directional/west{ pixel_y = -32 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -10389,13 +10306,14 @@ /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters{ id = "visitation"; - name = "Visitation Shutters" + name = "Visitation Shutters"; + dir = 1 }, /obj/machinery/flasher/directional/east{ id = "visitorflash" }, /turf/open/floor/plating, -/area/station/security/prison) +/area/station/security/execution/transfer) "dfS" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/unres, @@ -10868,7 +10786,7 @@ /obj/structure/cable, /obj/effect/spawner/random/contraband/prison, /turf/open/floor/iron/cafeteria, -/area/station/security/prison) +/area/station/security/prison/garden) "dlS" = ( /obj/machinery/light/floor, /turf/open/floor/engine/vacuum, @@ -10952,13 +10870,7 @@ dir = 4 }, /turf/open/floor/iron/showroomfloor, -/area/station/science/mixing/hallway) -"dmS" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/caution/stand_clear, -/obj/structure/extinguisher_cabinet/directional/east, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/starboard) +/area/station/science/ordnance) "dmU" = ( /obj/structure/flora/bush/lavendergrass/style_random, /obj/structure/flora/bush/pale/style_random, @@ -10968,7 +10880,8 @@ "dng" = ( /obj/machinery/door/poddoor/shutters/preopen{ id = "emmd"; - name = "Emergency Medical Lockdown Shutters" + name = "Emergency Medical Lockdown Shutters"; + dir = 4 }, /obj/effect/turf_decal/caution/stand_clear, /obj/machinery/door/firedoor, @@ -11168,7 +11081,7 @@ dir = 4 }, /turf/open/floor/iron/showroomfloor, -/area/station/science/mixing) +/area/station/science/ordnance) "dpR" = ( /obj/effect/turf_decal/bot, /obj/effect/turf_decal/tile/neutral{ @@ -11314,14 +11227,13 @@ dir = 1 }, /turf/open/floor/iron/showroomfloor, -/area/station/security/prison) +/area/station/security/execution/transfer) "dsa" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/west, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/aft) "dsc" = ( /obj/machinery/door/firedoor, @@ -11347,9 +11259,8 @@ dir = 8 }, /obj/structure/closet/emcloset, -/obj/structure/sign/warning/secure_area{ - name = "EMERGENCY STORAGE"; - pixel_y = -32 +/obj/structure/sign/warning/secure_area/directional/south{ + name = "EMERGENCY STORAGE" }, /turf/open/floor/iron/dark, /area/station/hallway/primary/central) @@ -11420,7 +11331,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ cycle_id = "ai-passthrough" }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/construction, +/obj/effect/mapping_helpers/airlock/access/all/command/minisat, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) "dsJ" = ( @@ -11448,9 +11359,8 @@ dir = 8 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/disposal/incinerator) "dtb" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, @@ -11601,7 +11511,7 @@ /obj/machinery/firealarm/directional/north, /obj/machinery/camera/autoname/directional/north, /turf/open/floor/iron/dark, -/area/station/service/chapel/dock) +/area/station/service/chapel/monastery) "dvu" = ( /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ @@ -11650,7 +11560,7 @@ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/security/prison) +/area/station/security/execution/transfer) "dwg" = ( /obj/structure/grille/broken, /obj/effect/decal/cleanable/dirt, @@ -11658,9 +11568,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "dwh" = ( /obj/structure/extinguisher_cabinet/directional/south, @@ -11862,9 +11771,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/landmark/event_spawn, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "dyX" = ( /obj/structure/reagent_dispensers/cooking_oil, @@ -11926,9 +11834,8 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/grille/broken, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "dAp" = ( /obj/effect/decal/cleanable/cobweb/cobweb2, @@ -11936,9 +11843,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "dAu" = ( /obj/structure/closet/crate, @@ -12034,7 +11940,7 @@ /obj/item/storage/bag/tray/cafeteria, /obj/structure/cable, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "dCd" = ( /obj/effect/turf_decal/siding/wood, /obj/structure/table/wood/fancy/blue, @@ -12053,9 +11959,7 @@ /obj/machinery/porta_turret/ai{ dir = 4 }, -/obj/structure/sign/warning/secure_area{ - pixel_y = 32 - }, +/obj/structure/sign/warning/secure_area/directional/north, /obj/effect/decal/cleanable/cobweb, /obj/effect/turf_decal/box/red, /turf/open/floor/circuit/green{ @@ -12096,9 +12000,8 @@ /obj/item/clothing/under/color/grey, /obj/structure/extinguisher_cabinet/directional/west, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "dDe" = ( /obj/effect/decal/cleanable/dirt, @@ -12108,9 +12011,8 @@ /obj/structure/disposalpipe/segment{ dir = 10 }, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "dDn" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ @@ -12124,7 +12026,7 @@ dir = 4 }, /turf/open/floor/iron/showroomfloor, -/area/station/science/storage) +/area/station/science/ordnance/storage) "dDp" = ( /obj/structure/mirror/directional/north, /obj/structure/sink{ @@ -12144,9 +12046,8 @@ "dDD" = ( /obj/structure/grille/broken, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/aft) "dDO" = ( /obj/effect/decal/cleanable/dirt, @@ -12262,7 +12163,6 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/west, /obj/machinery/camera/directional/west{ c_tag = "Cargo Lockers"; name = "cargo camera"; @@ -12288,7 +12188,7 @@ dir = 8 }, /turf/open/floor/iron/dark, -/area/station/security/prison) +/area/station/security/execution/transfer) "dGG" = ( /obj/machinery/power/supermatter_crystal/engine, /turf/open/floor/engine, @@ -12408,7 +12308,7 @@ name = "Prison Kitchen" }, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "dIX" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -12502,18 +12402,16 @@ dir = 1 }, /obj/effect/landmark/start/hangover, -/turf/open/floor/wood{ - icon_state = "wood-broken6" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/commons/locker) "dJE" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/sign/poster/random{ pixel_y = 32 }, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "dKa" = ( /obj/effect/turf_decal/tile/blue{ @@ -12548,7 +12446,7 @@ dir = 1 }, /turf/open/floor/glass/reinforced, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "dKy" = ( /obj/structure/chair/pew/left{ dir = 8 @@ -12560,7 +12458,7 @@ /turf/open/floor/iron/chapel{ dir = 8 }, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "dKz" = ( /obj/structure/rack, /obj/effect/turf_decal/bot, @@ -12747,9 +12645,7 @@ /obj/effect/turf_decal/stripes/corner{ dir = 4 }, -/obj/structure/sign/warning/secure_area{ - pixel_y = 32 - }, +/obj/structure/sign/warning/secure_area/directional/north, /obj/machinery/light/directional/north, /turf/open/floor/iron, /area/station/hallway/primary/central) @@ -12763,9 +12659,7 @@ /obj/item/geiger_counter, /obj/item/geiger_counter, /obj/structure/table, -/obj/structure/sign/warning/xeno_mining{ - pixel_x = -32 - }, +/obj/structure/sign/warning/xeno_mining/directional/west, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) "dMH" = ( @@ -12806,13 +12700,15 @@ "dNB" = ( /obj/structure/sign/warning/explosives, /turf/closed/wall/r_wall/rust, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "dNH" = ( /obj/structure/toilet, /obj/machinery/light/small/directional/north, /obj/effect/spawner/random/contraband/prison, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, /turf/open/floor/vault, -/area/station/security/prison) +/area/station/security/prison/shower) "dNL" = ( /obj/machinery/computer/security/telescreen/interrogation{ name = "isolation room monitor"; @@ -12862,7 +12758,7 @@ /turf/open/floor/plating, /area/station/maintenance/starboard/aft) "dOH" = ( -/obj/machinery/door/poddoor/shutters/preopen{ +/obj/machinery/door/poddoor/shutters/radiation/preopen{ id = "engsm"; name = "Radiation Chamber Shutters" }, @@ -12899,9 +12795,8 @@ /obj/structure/disposalpipe/segment{ dir = 10 }, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "dOW" = ( /obj/effect/turf_decal/tile/green, @@ -12920,7 +12815,8 @@ /obj/machinery/door/firedoor, /obj/machinery/door/poddoor/shutters/preopen{ id = "kitchenshutters"; - name = "Kitchen Shutters" + name = "Kitchen Shutters"; + dir = 8 }, /turf/open/floor/iron, /area/station/service/kitchen) @@ -12951,9 +12847,8 @@ /obj/structure/disposalpipe/segment, /obj/structure/cable, /obj/structure/sign/poster/contraband/random/directional/west, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "dPK" = ( /obj/effect/turf_decal/stripes/line, @@ -13038,7 +12933,7 @@ "dRh" = ( /obj/structure/flora/bush/flowers_yw/style_random, /turf/open/floor/grass, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "dRm" = ( /obj/effect/turf_decal/tile/brown{ dir = 4 @@ -13073,6 +12968,11 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron/dark, /area/station/security/courtroom) +"dRx" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/security/prison/garden) "dRF" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -13211,9 +13111,8 @@ "dTO" = ( /obj/structure/cable, /obj/structure/sign/poster/contraband/random/directional/north, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "dTQ" = ( /obj/effect/turf_decal/tile/yellow, @@ -13302,7 +13201,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /obj/effect/landmark/navigate_destination, -/obj/effect/mapping_helpers/airlock/access/all/engineering/construction, +/obj/effect/mapping_helpers/airlock/access/all/engineering/tech_storage, /turf/open/floor/iron/dark, /area/station/engineering/storage/tech) "dUQ" = ( @@ -13412,7 +13311,7 @@ dir = 4 }, /turf/open/floor/plating, -/area/station/science/mixing) +/area/station/science/ordnance) "dWj" = ( /obj/machinery/door/airlock/maintenance/external{ name = "Mass Driver Intersection" @@ -13426,15 +13325,21 @@ /obj/effect/mapping_helpers/airlock/access/any/science/maintenance, /turf/open/floor/iron/dark, /area/station/maintenance/starboard) +"dWm" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/service/chapel) "dWC" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "dWG" = ( /turf/closed/wall/r_wall, @@ -13464,9 +13369,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "dXI" = ( /obj/structure/flora/bush/lavendergrass/style_random, @@ -13516,9 +13420,8 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "dYQ" = ( /obj/effect/turf_decal/bot, @@ -13538,7 +13441,7 @@ /obj/effect/mapping_helpers/airlock/unres, /obj/effect/mapping_helpers/airlock/access/any/security/maintenance, /turf/open/floor/iron/dark, -/area/station/security/prison) +/area/station/security/execution/transfer) "dZe" = ( /obj/structure/closet/secure_closet/bar, /obj/item/flashlight/lantern, @@ -13563,9 +13466,8 @@ "dZp" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/aft) "dZA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -13592,7 +13494,7 @@ dir = 6 }, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "dZM" = ( /obj/machinery/computer/monitor{ dir = 4; @@ -13629,7 +13531,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/door/poddoor/shutters/preopen{ id = "ceprivate"; - name = "Chief Engineer's Privacy Shutters" + name = "Chief Engineer's Privacy Shutters"; + dir = 8 }, /obj/structure/disposalpipe/segment{ dir = 4 @@ -13648,9 +13551,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "eao" = ( /obj/machinery/door/firedoor, @@ -13708,9 +13610,8 @@ dir = 4 }, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "ebp" = ( /obj/effect/turf_decal/delivery, @@ -13853,7 +13754,7 @@ }, /obj/structure/cable, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "ecY" = ( /obj/structure/sign/warning/docking, /turf/closed/wall, @@ -13866,7 +13767,7 @@ dir = 10 }, /turf/open/floor/engine/vacuum, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "edj" = ( /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -13906,7 +13807,8 @@ /obj/machinery/door/firedoor, /obj/machinery/door/poddoor/shutters/preopen{ id = "research_shutters"; - name = "Research Privacy Shutter" + name = "Research Privacy Shutter"; + dir = 8 }, /obj/machinery/door/airlock/research/glass{ name = "Research Lab" @@ -14014,7 +13916,7 @@ }, /obj/effect/turf_decal/box, /turf/open/floor/iron/showroomfloor, -/area/station/science/mixing) +/area/station/science/ordnance) "efG" = ( /turf/closed/wall, /area/station/maintenance/fore) @@ -14056,9 +13958,8 @@ /obj/structure/cable, /obj/effect/turf_decal/stripes/corner, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/aft) "egr" = ( /obj/effect/turf_decal/tile/purple, @@ -14129,7 +14030,7 @@ "ehp" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/carpet/red, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "ehx" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/components/unary/passive_vent{ @@ -14262,7 +14163,7 @@ }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "ejO" = ( /obj/machinery/door/airlock/public/glass{ name = "Atrium" @@ -14355,9 +14256,8 @@ "ekV" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "ekY" = ( /obj/effect/decal/cleanable/dirt, @@ -14523,7 +14423,7 @@ "emL" = ( /obj/effect/turf_decal/tile/purple/half/contrasted, /turf/open/floor/iron/showroomfloor, -/area/station/science/storage) +/area/station/science/ordnance/storage) "emU" = ( /obj/machinery/door/poddoor/incinerator_atmos_aux, /turf/open/floor/engine, @@ -14587,9 +14487,8 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "eob" = ( /obj/structure/sign/warning, @@ -14636,9 +14535,9 @@ /turf/open/floor/iron/dark, /area/station/science/lab) "eoD" = ( -/obj/structure/lattice/catwalk, /obj/structure/cable, -/turf/open/floor/plating/airless, +/obj/structure/lattice/catwalk, +/turf/open/space/basic, /area/station/solars/starboard/aft) "eoM" = ( /obj/machinery/door/poddoor/preopen{ @@ -14727,9 +14626,8 @@ "epE" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/blobstart, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "epI" = ( /obj/effect/turf_decal/tile/purple{ @@ -14758,11 +14656,7 @@ piping_layer = 2 }, /turf/open/floor/iron/dark, -/area/station/science/mixing) -"eqg" = ( -/obj/machinery/newscaster/directional/north, -/turf/open/floor/iron/dark, -/area/station/service/chapel/dock) +/area/station/science/ordnance) "eqx" = ( /obj/machinery/conveyor{ dir = 5; @@ -14779,9 +14673,7 @@ /turf/open/floor/iron/dark, /area/station/cargo/warehouse) "eqz" = ( -/obj/structure/sign/departments/cargo{ - pixel_x = 32 - }, +/obj/structure/sign/departments/cargo/directional/east, /obj/effect/turf_decal/delivery, /obj/machinery/piratepad/civilian, /obj/effect/turf_decal/bot, @@ -14923,9 +14815,8 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/aft) "esn" = ( /obj/structure/table/reinforced, @@ -14993,9 +14884,8 @@ /obj/structure/grille/broken, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "etm" = ( /obj/effect/turf_decal/tile/neutral{ @@ -15062,9 +14952,8 @@ "etF" = ( /obj/structure/girder, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/hallway/secondary/entry) "etO" = ( /obj/effect/spawner/structure/window/reinforced, @@ -15076,7 +14965,7 @@ /obj/machinery/computer/prisoner/management, /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron/dark, -/area/station/security/prison) +/area/station/security/execution/transfer) "etY" = ( /obj/effect/turf_decal/tile/yellow{ dir = 4 @@ -15128,7 +15017,7 @@ /turf/open/floor/iron/stairs/right{ dir = 4 }, -/area/station/service/chapel/dock) +/area/station/service/chapel) "euX" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -15243,7 +15132,7 @@ /turf/open/floor/iron/chapel{ dir = 4 }, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "ewK" = ( /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -15261,7 +15150,8 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/obj/effect/mapping_helpers/airlock/access/any/engineering/general, +/obj/effect/mapping_helpers/airlock/access/any/engineering/construction, /turf/open/floor/iron/dark, /area/station/engineering/lobby) "ewW" = ( @@ -15285,7 +15175,7 @@ /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron/showroomfloor, -/area/station/security/prison) +/area/station/security/execution/transfer) "exc" = ( /obj/machinery/doppler_array{ dir = 4 @@ -15295,7 +15185,7 @@ }, /obj/effect/turf_decal/delivery, /turf/open/floor/iron/showroomfloor, -/area/station/science/mixing) +/area/station/science/ordnance) "exg" = ( /obj/structure/sign/warning/vacuum/external, /turf/closed/wall, @@ -15343,7 +15233,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, -/area/station/security/prison) +/area/station/security/prison/garden) "exN" = ( /obj/effect/turf_decal/box/corners, /obj/effect/turf_decal/tile/neutral, @@ -15496,7 +15386,7 @@ }, /obj/item/radio/intercom/chapel/directional/north, /turf/open/floor/wood/parquet, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "eAl" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -15594,9 +15484,8 @@ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/any/science/maintenance, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "eBl" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -15613,7 +15502,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/science/general, /turf/open/floor/iron/dark, -/area/station/science/mixing/hallway) +/area/station/science/ordnance) "eBu" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -15703,7 +15592,7 @@ network = list("ss13","prison") }, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "eCu" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -15804,9 +15693,8 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "eEi" = ( /obj/structure/cable, @@ -15842,7 +15730,7 @@ "eEJ" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, /turf/closed/wall/r_wall, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "eEY" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -15864,9 +15752,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/aft) "eFn" = ( /obj/effect/turf_decal/tile/neutral, @@ -15923,16 +15810,7 @@ }, /obj/effect/turf_decal/delivery, /turf/open/floor/engine/vacuum, -/area/station/science/test_area) -"eGp" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, -/area/station/maintenance/starboard) +/area/station/science/ordnance/bomb) "eGC" = ( /obj/structure/railing/corner{ dir = 1 @@ -15944,7 +15822,7 @@ /turf/open/floor/iron/stairs/right{ dir = 4 }, -/area/station/service/chapel/dock) +/area/station/service/chapel/monastery) "eGL" = ( /obj/machinery/door/airlock/external{ name = "Solar Maintenance" @@ -16046,9 +15924,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /obj/structure/sign/poster/contraband/random/directional/north, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "eHY" = ( /obj/structure/sign/departments/evac, @@ -16060,9 +15937,8 @@ dir = 8 }, /obj/effect/landmark/xeno_spawn, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "eIi" = ( /obj/structure/table/wood/fancy, @@ -16080,7 +15956,7 @@ pixel_y = 3 }, /turf/open/floor/iron/dark, -/area/station/service/chapel/dock) +/area/station/service/chapel) "eIP" = ( /obj/machinery/computer/security/telescreen{ desc = "Used for watching the ai_upload."; @@ -16123,13 +15999,10 @@ id = "Disposal Exit"; name = "Disposal Exit Vent" }, -/obj/structure/sign/warning/deathsposal{ - pixel_x = -32 - }, +/obj/structure/sign/warning/deathsposal/directional/west, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/disposal) "eJc" = ( /obj/effect/decal/cleanable/dirt, @@ -16291,14 +16164,13 @@ /turf/open/floor/iron/dark, /area/station/commons/fitness/recreation) "eLb" = ( -/obj/machinery/computer/atmos_control/noreconnect{ - atmos_chambers = list("ordnancegas1" = "Burn Chamber", "ordnancegas2" = "Freezer Chamber"); - dir = 4 - }, /obj/machinery/firealarm/directional/west, /obj/machinery/light/directional/west, +/obj/machinery/computer/atmos_control/ordnancemix{ + dir = 4 + }, /turf/open/floor/iron/showroomfloor, -/area/station/science/mixing) +/area/station/science/ordnance) "eLm" = ( /turf/closed/wall, /area/station/security/checkpoint/customs) @@ -16325,9 +16197,8 @@ dir = 1 }, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "eLU" = ( /obj/effect/decal/cleanable/dirt, @@ -16422,6 +16293,12 @@ "eNb" = ( /turf/open/floor/plating, /area/station/cargo/warehouse) +"eNo" = ( +/obj/effect/turf_decal/siding/thinplating/dark/end{ + dir = 8 + }, +/turf/open/floor/glass/reinforced, +/area/station/service/chapel) "eNQ" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -16448,9 +16325,8 @@ /area/station/maintenance/disposal/incinerator) "eOf" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "eOi" = ( /obj/effect/turf_decal/tile/blue, @@ -16490,9 +16366,7 @@ /obj/machinery/computer/shuttle/labor{ dir = 1 }, -/obj/structure/sign/warning/vacuum/external{ - pixel_y = -32 - }, +/obj/structure/sign/warning/vacuum/external/directional/south, /obj/machinery/camera/directional/south{ c_tag = "Transferring Centre Dock" }, @@ -16556,9 +16430,8 @@ /obj/item/tank/internals/plasmaman/belt/full, /obj/item/tank/internals/plasmaman/belt/full, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "ePy" = ( /obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden, @@ -16568,7 +16441,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, /turf/open/floor/plating, -/area/station/security/prison) +/area/station/security/prison/mess) "ePU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -16619,9 +16492,8 @@ }, /obj/machinery/light/small/directional/north, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "eQj" = ( /obj/effect/turf_decal/tile/yellow{ @@ -16650,7 +16522,7 @@ /obj/item/reagent_containers/food/drinks/drinkingglass, /obj/structure/cable, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "eQq" = ( /obj/structure/rack, /obj/effect/turf_decal/bot, @@ -16731,9 +16603,8 @@ "eRa" = ( /obj/structure/sign/poster/random/directional/north, /obj/effect/spawner/random/structure/steam_vent, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/department/bridge) "eRx" = ( /obj/effect/turf_decal/tile/neutral{ @@ -16814,8 +16685,7 @@ /obj/effect/turf_decal/tile/purple{ dir = 1 }, -/obj/structure/sign/departments/science{ - pixel_x = 32; +/obj/structure/sign/departments/science/directional/east{ pixel_y = 32 }, /turf/open/floor/iron, @@ -16874,9 +16744,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "eTh" = ( /obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible{ @@ -16895,7 +16764,7 @@ dir = 8 }, /turf/open/floor/iron/dark, -/area/station/service/chapel/dock) +/area/station/service/chapel) "eUk" = ( /obj/effect/turf_decal/tile/red{ dir = 1 @@ -16923,9 +16792,8 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/aft) "eUs" = ( /obj/effect/turf_decal/tile/neutral{ @@ -16944,15 +16812,6 @@ "eUN" = ( /turf/closed/wall, /area/station/medical/psychology) -"eUQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, -/area/station/maintenance/aft) "eUT" = ( /obj/effect/turf_decal/tile/green{ dir = 1 @@ -16968,7 +16827,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "eVL" = ( /obj/effect/spawner/structure/window/reinforced/plasma, /turf/open/floor/plating, @@ -17358,9 +17217,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "fbF" = ( /obj/effect/turf_decal/loading_area{ @@ -17423,9 +17281,8 @@ /obj/effect/turf_decal/stripes/corner{ dir = 1 }, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "fcs" = ( /obj/structure/cable, @@ -17467,7 +17324,7 @@ /obj/machinery/light/directional/north, /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron/dark, -/area/station/security/prison) +/area/station/security/execution/transfer) "fcM" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -17583,9 +17440,8 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/girder/displaced, /obj/structure/grille/broken, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "feU" = ( /obj/effect/turf_decal/bot, @@ -17637,6 +17493,10 @@ dir = 8 }, /obj/effect/turf_decal/tile/neutral, +/obj/machinery/status_display/supply{ + pixel_x = 32; + pixel_y = 32 + }, /turf/open/floor/iron/dark, /area/station/cargo/storage) "ffd" = ( @@ -17873,7 +17733,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/showroomfloor, -/area/station/science/misc_lab) +/area/station/science/ordnance/office) "fhs" = ( /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -17909,9 +17769,8 @@ }, /obj/machinery/light/small/directional/south, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/engineering/supermatter/room) "fhH" = ( /obj/effect/turf_decal/bot, @@ -17948,9 +17807,7 @@ dir = 1; name = "Air to Distro" }, -/obj/structure/sign/warning/fire{ - pixel_x = 32 - }, +/obj/structure/sign/warning/fire/directional/east, /obj/machinery/camera/directional/east{ c_tag = "Atmospherics Distribution Loop"; name = "atmospherics camera"; @@ -17969,9 +17826,7 @@ dir = 1 }, /obj/machinery/light/small/directional/east, -/obj/structure/sign/warning/deathsposal{ - pixel_x = 32 - }, +/obj/structure/sign/warning/deathsposal/directional/east, /obj/structure/disposalpipe/trunk{ dir = 8 }, @@ -17986,9 +17841,8 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/aft) "fix" = ( /obj/structure/cable, @@ -18013,9 +17867,8 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "fiH" = ( /obj/effect/turf_decal/tile/red{ @@ -18058,7 +17911,7 @@ /area/station/security/processing) "fiU" = ( /turf/closed/wall, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/freezerchamber) "fiY" = ( /obj/effect/turf_decal/siding/wood{ dir = 5 @@ -18138,7 +17991,7 @@ /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron/showroomfloor, -/area/station/security/prison) +/area/station/security/execution/transfer) "fjw" = ( /obj/effect/turf_decal/stripes/corner{ dir = 8 @@ -18183,7 +18036,7 @@ /obj/machinery/light/directional/north, /obj/structure/cable, /turf/open/floor/iron/cafeteria, -/area/station/security/prison) +/area/station/security/prison/garden) "fjB" = ( /obj/structure/chair{ dir = 8 @@ -18192,7 +18045,7 @@ dir = 5 }, /turf/open/floor/engine/vacuum, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "fjX" = ( /obj/machinery/door/firedoor, /obj/structure/cable, @@ -18205,7 +18058,7 @@ "fjY" = ( /obj/effect/turf_decal/trimline/red/filled/line, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "fkb" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -18218,7 +18071,10 @@ }, /obj/structure/cable, /turf/open/floor/plating, -/area/station/security/prison) +/area/station/security/execution/transfer) +"fkd" = ( +/turf/closed/wall/r_wall, +/area/station/security/prison/mess) "fkw" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -18294,7 +18150,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ cycle_id = "cargo-mailroom" }, -/obj/effect/mapping_helpers/airlock/access/all/supply/general, +/obj/effect/mapping_helpers/airlock/access/all/supply/shipping, /turf/open/floor/iron/dark, /area/station/cargo/sorting) "fla" = ( @@ -18322,9 +18178,8 @@ /area/station/engineering/supermatter/room) "flz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/disposal/incinerator) "flL" = ( /obj/machinery/door/airlock/highsecurity{ @@ -18350,9 +18205,8 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/grille, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "fmh" = ( /obj/effect/turf_decal/tile/neutral, @@ -18545,7 +18399,7 @@ }, /obj/item/food/grown/poppy/geranium, /turf/open/floor/iron/dark, -/area/station/service/chapel/dock) +/area/station/service/chapel) "foP" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -18586,9 +18440,8 @@ /obj/effect/turf_decal/stripes/corner{ dir = 4 }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "fph" = ( /obj/effect/turf_decal/tile/blue{ @@ -18704,7 +18557,7 @@ /obj/effect/decal/cleanable/cobweb, /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron/dark, -/area/station/security/prison) +/area/station/security/execution/transfer) "fqG" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -18769,22 +18622,19 @@ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "frq" = ( /obj/effect/decal/cleanable/blood/old, -/obj/machinery/air_sensor{ - chamber_id = "ordnancegas1" - }, +/obj/machinery/air_sensor/ordnance_burn_chamber, /turf/open/floor/engine/vacuum, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "frK" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ dir = 10 }, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/department/cargo) "frO" = ( /turf/closed/wall/r_wall, @@ -18925,6 +18775,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/machinery/airalarm/directional/north, /turf/open/floor/iron/dark, /area/station/service/chapel/dock) "ftz" = ( @@ -19377,7 +19228,7 @@ }, /obj/item/kirbyplants/random, /turf/open/floor/iron/dark, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "fyK" = ( /obj/effect/turf_decal/delivery, /obj/machinery/atmospherics/components/unary/portables_connector/visible{ @@ -19385,9 +19236,7 @@ }, /obj/machinery/portable_atmospherics/canister/nitrous_oxide, /obj/structure/extinguisher_cabinet/directional/west, -/obj/structure/sign/warning/fire{ - pixel_y = -32 - }, +/obj/structure/sign/warning/fire/directional/south, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 4 @@ -19499,17 +19348,15 @@ /obj/effect/turf_decal/stripes/line, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/solars/port/fore) "fAG" = ( /obj/effect/decal/cleanable/blood/old, /obj/effect/decal/cleanable/dirt, /obj/item/shard, -/turf/open/floor/wood{ - icon_state = "wood-broken4" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/cargo/warehouse) "fAI" = ( /obj/effect/decal/cleanable/dirt, @@ -19526,7 +19373,7 @@ /turf/open/floor/iron/chapel{ dir = 8 }, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "fBh" = ( /obj/machinery/door/airlock/maintenance, /obj/structure/disposalpipe/segment{ @@ -19557,9 +19404,8 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "fBF" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -19747,9 +19593,8 @@ /obj/effect/decal/cleanable/dirt, /obj/item/mop, /obj/item/reagent_containers/glass/bucket, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/disposal) "fDS" = ( /obj/machinery/air_sensor/carbon_tank, @@ -19856,7 +19701,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "fFe" = ( /obj/machinery/chem_master, /obj/effect/turf_decal/tile/neutral, @@ -19969,9 +19814,8 @@ /area/station/maintenance/department/bridge) "fIa" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "fIn" = ( /obj/effect/turf_decal/stripes/line, @@ -20133,7 +19977,7 @@ /obj/structure/flora/bush/sparsegrass/style_random, /obj/structure/flora/bush/fullgrass/style_random, /turf/open/floor/grass, -/area/station/service/chapel/dock) +/area/station/service/chapel/monastery) "fKf" = ( /obj/machinery/chem_heater/withbuffer{ pixel_x = 6 @@ -20241,7 +20085,7 @@ dir = 8 }, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "fLu" = ( /obj/effect/decal/cleanable/ash, /turf/open/floor/iron, @@ -20282,9 +20126,8 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/department/crew_quarters/bar) "fLZ" = ( /obj/machinery/atmospherics/pipe/smart/simple/green/visible{ @@ -20386,7 +20229,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/security/brig, /turf/open/floor/iron/dark, -/area/station/security/prison) +/area/station/security/execution/transfer) "fNy" = ( /obj/structure/flora/grass/jungle/b/style_random, /turf/open/misc/asteroid, @@ -20534,9 +20377,8 @@ }, /obj/structure/extinguisher_cabinet/directional/east, /obj/effect/landmark/blobstart, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "fOH" = ( /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, @@ -20552,14 +20394,6 @@ /obj/effect/decal/cleanable/blood/old, /turf/open/floor/iron/dark, /area/station/maintenance/starboard/fore) -"fOU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, -/area/station/maintenance/aft) "fOX" = ( /obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/brown, @@ -20634,9 +20468,8 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /obj/machinery/power/apc/sm_apc/directional/south, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/engineering/supermatter/room) "fPP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -20706,9 +20539,7 @@ /area/station/science/xenobiology) "fQH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/sign/warning/xeno_mining{ - pixel_x = -32 - }, +/obj/structure/sign/warning/xeno_mining/directional/west, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -20759,7 +20590,7 @@ dir = 8 }, /turf/open/floor/iron/showroomfloor, -/area/station/science/mixing) +/area/station/science/ordnance) "fQT" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -20767,9 +20598,8 @@ /obj/structure/disposalpipe/segment, /obj/structure/cable, /obj/structure/sign/poster/contraband/random/directional/west, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "fRf" = ( /obj/effect/decal/cleanable/dirt, @@ -20806,9 +20636,8 @@ }, /obj/structure/cable, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/department/cargo) "fRP" = ( /obj/structure/chair{ @@ -20958,9 +20787,8 @@ "fUe" = ( /obj/structure/girder, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "fUf" = ( /obj/effect/turf_decal/tile/red, @@ -21087,12 +20915,12 @@ "fWd" = ( /obj/machinery/igniter/incinerator_ordmix, /mob/living/simple_animal/chicken{ - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0); + atmos_requirements = list("min_oxy"=0,"max_oxy"=0,"min_tox"=0,"max_tox"=1,"min_co2"=0,"max_co2"=0,"min_n2"=0,"max_n2"=0); desc = "A timeless classic."; name = "Kentucky" }, /turf/open/floor/engine/vacuum, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "fWB" = ( /obj/machinery/airalarm/directional/west, /obj/machinery/rnd/production/techfab/department/service, @@ -21135,9 +20963,8 @@ /area/station/maintenance/starboard/fore) "fXl" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/disposal/incinerator) "fXm" = ( /obj/structure/table, @@ -21157,18 +20984,16 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/xeno_spawn, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/engineering/storage/tcomms) "fXJ" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "fXL" = ( /turf/closed/wall/rust, @@ -21190,7 +21015,7 @@ /obj/machinery/light/directional/east, /obj/structure/cable, /turf/open/floor/iron/showroomfloor, -/area/station/science/misc_lab) +/area/station/science/ordnance/office) "fXZ" = ( /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -21271,6 +21096,9 @@ /obj/effect/turf_decal/tile/neutral, /obj/effect/landmark/start/depsec/medical, /obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, /turf/open/floor/iron/dark, /area/station/security/checkpoint/medical) "fZk" = ( @@ -21298,9 +21126,8 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "fZy" = ( /obj/effect/turf_decal/tile/neutral, @@ -21318,12 +21145,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/service/chapel/funeral) -"fZR" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, -/area/station/maintenance/aft) "gab" = ( /obj/machinery/computer/atmos_control/nocontrol/incinerator{ dir = 4 @@ -21452,7 +21273,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/showroomfloor, -/area/station/science/mixing/hallway) +/area/station/science/ordnance) "gbB" = ( /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ @@ -21536,16 +21357,14 @@ /obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer2{ dir = 8 }, -/obj/machinery/air_sensor{ - chamber_id = "ordnancegas2" - }, +/obj/machinery/air_sensor/ordnance_freezer_chamber, /turf/open/floor/iron/dark/airless, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/freezerchamber) "gdk" = ( /obj/machinery/hydroponics/soil, /obj/item/seeds/watermelon, /turf/open/floor/grass, -/area/station/security/prison) +/area/station/security/prison/garden) "gdA" = ( /obj/machinery/door/airlock/maintenance, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -21564,7 +21383,7 @@ /turf/open/floor/iron/chapel{ dir = 8 }, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "gdL" = ( /obj/machinery/door/airlock/grunge{ id_tag = "Cabin_3"; @@ -21693,6 +21512,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/service/chapel/monastery) +"ggf" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "robotics_shutters"; + name = "Robotics Privacy Shutters"; + dir = 8 + }, +/turf/open/floor/plating, +/area/station/science/robotics/lab) "ggj" = ( /obj/structure/chair/pew/left{ dir = 8 @@ -21701,7 +21529,7 @@ dir = 1 }, /turf/open/floor/iron/chapel, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "ggp" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -21714,7 +21542,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/security/brig, /turf/open/floor/plating, -/area/station/security/prison) +/area/station/security/execution/transfer) "ggF" = ( /obj/structure/table, /obj/effect/turf_decal/tile/neutral, @@ -21750,6 +21578,9 @@ /obj/machinery/light_switch/directional/west, /turf/open/floor/iron/freezer, /area/station/service/kitchen/coldroom) +"ghL" = ( +/turf/open/floor/plating, +/area/station/security/prison/mess) "ghO" = ( /obj/effect/turf_decal/tile/red{ dir = 1 @@ -21816,7 +21647,7 @@ pixel_y = 9 }, /turf/open/floor/iron/dark, -/area/station/science/misc_lab) +/area/station/science/ordnance/office) "gix" = ( /obj/effect/turf_decal/box, /obj/structure/cable, @@ -21952,7 +21783,7 @@ /obj/effect/turf_decal/tile/yellow, /obj/machinery/door/window/right/directional/south{ name = "Cargo Disposal"; - req_access = list("mail_sorting") + req_access = list("shipping") }, /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment{ @@ -22033,7 +21864,7 @@ /obj/effect/turf_decal/trimline/red/filled/line, /obj/item/radio/intercom/prison/directional/south, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "glG" = ( /obj/structure/sign/warning/secure_area, /turf/closed/wall/r_wall, @@ -22086,11 +21917,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/port/lesser) -"gmr" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, -/area/station/maintenance/department/bridge) "gmx" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -22118,9 +21944,8 @@ dir = 8 }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/solars/port/fore) "gne" = ( /obj/machinery/door/airlock/public/glass{ @@ -22147,7 +21972,7 @@ /obj/machinery/status_display/evac/directional/west, /obj/item/flashlight/lantern, /turf/open/floor/carpet/red, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "gny" = ( /obj/structure/cable, /obj/effect/turf_decal/sand/plating, @@ -22237,9 +22062,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "goG" = ( /obj/effect/turf_decal/tile/yellow, @@ -22283,9 +22107,8 @@ }, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/aft) "gpy" = ( /obj/machinery/door/firedoor, @@ -22383,9 +22206,8 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/solars/port/fore) "gql" = ( /obj/structure/table/reinforced, @@ -22422,9 +22244,8 @@ pixel_y = 4 }, /obj/item/storage/box/lights/mixed, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/disposal) "gqz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -22473,14 +22294,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/blood/old, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/disposal) "gro" = ( -/obj/structure/sign/warning/fire{ - pixel_x = 32 - }, +/obj/structure/sign/warning/fire/directional/east, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment, @@ -22489,9 +22307,8 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/aft) "grq" = ( /obj/structure/cable, @@ -22529,13 +22346,13 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ cycle_id = "ai-passthrough" }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/construction, +/obj/effect/mapping_helpers/airlock/access/all/command/minisat, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) "gsc" = ( /obj/machinery/vending/sustenance, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "gse" = ( /obj/structure/chair/pew/left{ dir = 8 @@ -22546,7 +22363,7 @@ /turf/open/floor/iron/chapel{ dir = 1 }, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "gsl" = ( /obj/effect/turf_decal/tile/red{ dir = 1 @@ -22797,9 +22614,8 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/east, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/solars/port/aft) "gvM" = ( /obj/structure/cable, @@ -22818,22 +22634,12 @@ /obj/item/storage/box/ids, /turf/open/floor/iron/dark, /area/station/command/bridge) -"gvP" = ( -/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{ - icon_state = "platingdmg1" - }, -/area/station/security/prison) "gwk" = ( /obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden, /turf/closed/wall, /area/station/security/checkpoint/engineering) "gws" = ( -/obj/structure/sign/warning/fire{ - pixel_x = -32 - }, +/obj/structure/sign/warning/fire/directional/west, /obj/machinery/firealarm/directional/south, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral, @@ -22853,14 +22659,11 @@ }, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/structure/sign/warning/vacuum/external{ - pixel_x = 32 - }, +/obj/structure/sign/warning/vacuum/external/directional/east, /obj/structure/disposalpipe/segment, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "gwO" = ( /obj/machinery/disposal/bin, @@ -23019,7 +22822,7 @@ dir = 1 }, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "gzv" = ( /obj/effect/turf_decal/tile/yellow{ dir = 1 @@ -23141,9 +22944,7 @@ /area/station/hallway/secondary/entry) "gBq" = ( /obj/machinery/light/small/directional/south, -/obj/structure/sign/warning/xeno_mining{ - pixel_x = -32 - }, +/obj/structure/sign/warning/xeno_mining/directional/west, /obj/effect/turf_decal/stripes/line{ dir = 10 }, @@ -23153,9 +22954,8 @@ /obj/effect/landmark/xeno_spawn, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/solars/port/fore) "gBx" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -23235,9 +23035,8 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /obj/machinery/meter/layer2, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/aft) "gCf" = ( /obj/effect/turf_decal/tile/neutral{ @@ -23269,9 +23068,7 @@ /obj/structure/table, /obj/item/storage/secure/briefcase, /obj/item/taperecorder, -/obj/structure/sign/warning/electric_shock{ - pixel_y = -32 - }, +/obj/structure/sign/warning/electric_shock/directional/south, /turf/open/floor/iron/dark, /area/station/maintenance/port/greater) "gCu" = ( @@ -23288,9 +23085,8 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "gCY" = ( /obj/machinery/camera/directional/west{ @@ -23339,9 +23135,8 @@ /turf/open/floor/iron, /area/station/hallway/primary/central/fore) "gDs" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "gDu" = ( /obj/effect/turf_decal/tile/yellow, @@ -23419,9 +23214,8 @@ "gEh" = ( /obj/machinery/light/small/directional/north, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/aft) "gEo" = ( /obj/effect/turf_decal/stripes/line, @@ -23447,9 +23241,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, /obj/structure/sign/poster/contraband/random/directional/north, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "gER" = ( /obj/effect/turf_decal/tile/neutral{ @@ -23468,9 +23261,8 @@ dir = 1 }, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "gFt" = ( /obj/effect/decal/cleanable/dirt, @@ -23488,9 +23280,8 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/meter/layer4, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "gFA" = ( /obj/effect/turf_decal/tile/neutral, @@ -23607,17 +23398,15 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "gGJ" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/blobstart, /obj/structure/disposalpipe/segment, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/aft) "gGK" = ( /obj/effect/turf_decal/stripes/corner{ @@ -23625,9 +23414,8 @@ }, /obj/machinery/light/small/directional/west, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "gGR" = ( /obj/structure/bodycontainer/morgue{ @@ -23719,25 +23507,17 @@ /obj/item/radio/intercom/directional/west, /turf/open/floor/iron/dark, /area/station/command/bridge) -"gHN" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, -/area/station/maintenance/disposal/incinerator) "gHX" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/sign/departments/security{ - pixel_y = 32 - }, +/obj/structure/sign/departments/security/directional/north, /obj/effect/turf_decal/stripes/corner{ dir = 1 }, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "gIt" = ( /obj/machinery/door/airlock/maintenance, @@ -23781,7 +23561,8 @@ "gIF" = ( /obj/machinery/door/poddoor/shutters/preopen{ id = "chemistry_shutters"; - name = "Chemistry Lobby Shutters" + name = "Chemistry Lobby Shutters"; + dir = 1 }, /obj/machinery/door/firedoor/heavy, /obj/machinery/door/airlock/medical/glass{ @@ -23815,9 +23596,8 @@ /obj/structure/chair/office{ dir = 4 }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/solars/starboard/aft) "gIZ" = ( /obj/effect/turf_decal/delivery, @@ -23825,9 +23605,8 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "gJa" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, @@ -23847,11 +23626,11 @@ /turf/open/floor/iron/stairs/right{ dir = 4 }, -/area/station/service/chapel/dock) +/area/station/service/chapel) "gJi" = ( /obj/machinery/door/poddoor/incinerator_ordmix, /turf/open/floor/engine/vacuum, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "gJj" = ( /obj/machinery/door/airlock/external{ name = "Arrival Shuttle Airlock"; @@ -23868,13 +23647,12 @@ /obj/effect/decal/cleanable/blood/gibs/old, /obj/effect/spawner/random/structure/crate, /mob/living/simple_animal/chicken{ - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0); + atmos_requirements = list("min_oxy"=0,"max_oxy"=0,"min_tox"=0,"max_tox"=1,"min_co2"=0,"max_co2"=0,"min_n2"=0,"max_n2"=0); desc = "A timeless classic."; name = "Kentucky" }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "gJs" = ( /obj/effect/turf_decal/stripes/line{ @@ -23893,9 +23671,8 @@ /obj/effect/decal/cleanable/blood/old, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, -/turf/open/floor/wood{ - icon_state = "wood-broken" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/maintenance/starboard/fore) "gJz" = ( /obj/structure/grille, @@ -23933,7 +23710,7 @@ }, /obj/machinery/light/directional/west, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/garden) "gKd" = ( /obj/effect/turf_decal/tile/blue/fourcorners, /obj/effect/turf_decal/tile/neutral, @@ -23972,7 +23749,7 @@ pixel_x = -32 }, /turf/open/floor/iron/showroomfloor, -/area/station/science/storage) +/area/station/science/ordnance/storage) "gKB" = ( /obj/effect/decal/cleanable/cobweb, /obj/structure/table_frame, @@ -24063,9 +23840,7 @@ /area/station/command/bridge) "gMl" = ( /obj/structure/table, -/obj/structure/sign/departments/medbay/alt{ - pixel_x = 32 - }, +/obj/structure/sign/departments/medbay/alt/directional/east, /obj/structure/sign/poster/official/help_others{ pixel_y = -32 }, @@ -24256,15 +24031,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/security/processing) -"gOM" = ( -/obj/structure/cable, -/obj/effect/turf_decal/siding/wideplating/dark{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/service/chapel/dock) "gOO" = ( /obj/structure/table/reinforced, /obj/effect/turf_decal/delivery, @@ -24276,7 +24042,8 @@ }, /obj/machinery/door/poddoor/shutters/preopen{ id = "chemistry_shutters_2"; - name = "Chemistry Hall Shutters" + name = "Chemistry Hall Shutters"; + dir = 4 }, /obj/machinery/door/firedoor/heavy, /obj/machinery/door/window/left/directional/north{ @@ -24326,7 +24093,7 @@ /obj/effect/turf_decal/box, /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/engine/vacuum, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "gPA" = ( /turf/closed/wall/rust, /area/station/maintenance/port/aft) @@ -24373,9 +24140,8 @@ /area/station/medical/exam_room) "gPT" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/department/crew_quarters/bar) "gPX" = ( /obj/structure/reflector/box/anchored{ @@ -24498,7 +24264,7 @@ /area/station/cargo/office) "gQS" = ( /turf/closed/wall/r_wall, -/area/station/science/mixing/hallway) +/area/station/science/ordnance) "gQV" = ( /obj/machinery/camera/directional/west{ c_tag = "Atmospherics Tank - CO2"; @@ -24521,9 +24287,8 @@ /obj/effect/turf_decal/stripes/corner{ dir = 4 }, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "gRq" = ( /obj/effect/turf_decal/tile/neutral{ @@ -24681,9 +24446,8 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/north, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/aft) "gTw" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -24692,9 +24456,8 @@ dir = 8 }, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "gTA" = ( /obj/machinery/door/airlock/hydroponics/glass{ @@ -24742,9 +24505,8 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/blood/old, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "gUK" = ( /obj/effect/turf_decal/tile/brown, @@ -24837,7 +24599,6 @@ dir = 5 }, /obj/structure/cable, -/obj/effect/landmark/start/scientist, /turf/open/floor/iron/showroomfloor, /area/station/command/heads_quarters/rd) "gVv" = ( @@ -24974,7 +24735,7 @@ }, /obj/machinery/airalarm/directional/north, /turf/open/floor/iron/showroomfloor, -/area/station/science/misc_lab) +/area/station/science/ordnance/office) "gXR" = ( /obj/structure/table, /obj/item/transfer_valve{ @@ -24993,7 +24754,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/showroomfloor, -/area/station/science/mixing) +/area/station/science/ordnance) "gXX" = ( /obj/effect/turf_decal/bot, /obj/machinery/portable_atmospherics/canister/air, @@ -25011,9 +24772,8 @@ dir = 4 }, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "gYl" = ( /obj/effect/turf_decal/tile/red, @@ -25075,7 +24835,7 @@ }, /obj/structure/urinal/directional/north, /turf/open/floor/plating/rust, -/area/station/security/prison) +/area/station/security/prison/shower) "gZA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -25084,9 +24844,8 @@ dir = 4 }, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "gZI" = ( /obj/structure/water_source/puddle, @@ -25109,15 +24868,14 @@ normaldoorcontrol = 1; specialfunctions = 4 }, -/turf/open/floor/wood{ - icon_state = "wood-broken3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/commons/locker) "hag" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/science/misc_lab) +/area/station/science/ordnance/office) "hah" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral, @@ -25141,9 +24899,8 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "haU" = ( /obj/effect/decal/cleanable/dirt, @@ -25153,10 +24910,9 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /obj/effect/mapping_helpers/airlock/access/all/science/ordnance, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/station/science/mixing) +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/station/science/ordnance) "hbe" = ( /obj/machinery/door/poddoor/preopen{ id = "xeno4"; @@ -25192,9 +24948,8 @@ /area/station/cargo/warehouse) "hbw" = ( /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "hbC" = ( /obj/effect/decal/cleanable/dirt, @@ -25232,9 +24987,8 @@ /obj/effect/turf_decal/stripes/line, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "hdj" = ( /obj/effect/turf_decal/stripes/corner{ @@ -25297,18 +25051,6 @@ }, /turf/open/floor/iron/dark/corner, /area/station/hallway/primary/central/fore) -"hdL" = ( -/obj/structure/cable, -/obj/effect/turf_decal/siding/wideplating/dark{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/service/chapel/dock) "hdN" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ @@ -25320,17 +25062,17 @@ }, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/solars/port/aft) "hdW" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 }, /obj/machinery/light/directional/east, +/obj/machinery/computer/security/telescreen/entertainment/directional/east, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "hdY" = ( /obj/machinery/door/airlock/external{ name = "Solar Maintenance" @@ -25357,9 +25099,8 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 }, -/turf/open/floor/wood{ - icon_state = "wood-broken5" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/maintenance/port/greater) "hev" = ( /obj/effect/turf_decal/tile/neutral, @@ -25381,9 +25122,8 @@ /obj/effect/decal/cleanable/blood/old, /obj/effect/decal/cleanable/blood/gibs/limb, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/wood{ - icon_state = "wood-broken7" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/maintenance/port/fore) "heX" = ( /obj/machinery/door/firedoor, @@ -25403,9 +25143,8 @@ }, /obj/structure/cable, /obj/structure/sign/poster/contraband/random/directional/east, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/aft) "hfk" = ( /obj/effect/turf_decal/tile/neutral, @@ -25524,16 +25263,15 @@ pixel_y = -24 }, /turf/open/floor/iron/showroomfloor, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/freezerchamber) "hgn" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, /obj/structure/sign/poster/contraband/random/directional/west, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "hgL" = ( /obj/structure/sign/warning/secure_area, @@ -25577,9 +25315,8 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "hhp" = ( /obj/structure/cable, @@ -25599,9 +25336,7 @@ dir = 4 }, /obj/effect/turf_decal/bot, -/obj/structure/sign/warning/vacuum/external{ - pixel_y = -32 - }, +/obj/structure/sign/warning/vacuum/external/directional/south, /turf/open/floor/iron/dark, /area/station/cargo/warehouse) "hhE" = ( @@ -25677,7 +25412,7 @@ /obj/machinery/door/window/left/directional/west{ dir = 4; name = "Mailroom Desk"; - req_access = list("mail_sorting") + req_access = list("shipping") }, /obj/effect/landmark/start/hangover, /obj/structure/desk_bell{ @@ -25795,8 +25530,7 @@ /turf/open/floor/engine, /area/station/ai_monitored/command/nuke_storage) "hjH" = ( -/obj/structure/sign/departments/engineering{ - pixel_x = 32; +/obj/structure/sign/departments/engineering/directional/east{ pixel_y = -32 }, /obj/effect/turf_decal/tile/yellow, @@ -25944,7 +25678,7 @@ /obj/machinery/door/window/left/directional/north{ dir = 2; name = "Cargo Delivery Access"; - req_access = list("mail_sorting") + req_access = list("shipping") }, /turf/open/floor/plating, /area/station/hallway/secondary/exit/departure_lounge) @@ -25980,9 +25714,8 @@ "hlK" = ( /obj/effect/decal/cleanable/dirt, /obj/item/shard, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "hma" = ( /obj/effect/turf_decal/tile/purple{ @@ -26052,13 +25785,20 @@ /obj/effect/decal/cleanable/cobweb, /obj/effect/spawner/random/structure/crate, /obj/structure/sign/poster/contraband/random/directional/west, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "hmO" = ( /turf/closed/wall, /area/station/security/processing) +"hmZ" = ( +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/turf/open/floor/iron/stairs/medium{ + dir = 1 + }, +/area/station/service/chapel/monastery) "hna" = ( /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ @@ -26089,9 +25829,7 @@ dir = 8 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/sign/warning/vacuum/external{ - pixel_x = 32 - }, +/obj/structure/sign/warning/vacuum/external/directional/east, /obj/effect/spawner/random/structure/crate, /turf/open/floor/plating, /area/station/maintenance/port/aft) @@ -26099,7 +25837,7 @@ /obj/machinery/door/window/left/directional/north{ dir = 2; name = "Cargo Delivery Access"; - req_access = list("mail_sorting") + req_access = list("shipping") }, /obj/structure/plasticflaps/opaque, /obj/effect/turf_decal/delivery, @@ -26129,9 +25867,8 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/department/cargo) "hnA" = ( /obj/effect/turf_decal/tile/purple{ @@ -26261,18 +25998,16 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "hpb" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "hph" = ( /obj/structure/table, @@ -26301,9 +26036,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "hpu" = ( /obj/effect/turf_decal/tile/purple/half/contrasted{ @@ -26393,7 +26127,7 @@ dir = 1 }, /turf/open/floor/iron/showroomfloor, -/area/station/science/mixing) +/area/station/science/ordnance) "hqk" = ( /obj/machinery/status_display/ai/directional/north, /obj/machinery/light/directional/north, @@ -26445,9 +26179,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /obj/structure/grille/broken, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "hri" = ( /obj/structure/dresser, @@ -26463,27 +26196,23 @@ dir = 4 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "hrz" = ( /obj/effect/turf_decal/stripes/corner{ dir = 8 }, -/obj/structure/sign/warning/electric_shock{ - pixel_y = -32 - }, +/obj/structure/sign/warning/electric_shock/directional/south, /obj/structure/grille, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/aft) "hrB" = ( /obj/structure/window/reinforced{ dir = 4 }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/disposal/incinerator) "hrY" = ( /obj/effect/turf_decal/tile/blue{ @@ -26582,6 +26311,15 @@ }, /turf/open/floor/iron/showroomfloor, /area/station/commons/storage/art) +"hsP" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron/dark, +/area/station/service/chapel) "hsW" = ( /obj/structure/noticeboard/directional/east, /turf/closed/mineral/random/labormineral, @@ -26591,9 +26329,7 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/sign/warning/electric_shock{ - pixel_y = -32 - }, +/obj/structure/sign/warning/electric_shock/directional/south, /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/port/lesser) @@ -26601,9 +26337,7 @@ /obj/machinery/power/emitter, /obj/effect/turf_decal/bot, /obj/effect/decal/cleanable/dirt, -/obj/structure/sign/warning/fire{ - pixel_y = 32 - }, +/obj/structure/sign/warning/fire/directional/north, /turf/open/floor/iron/dark, /area/station/maintenance/port/fore) "htJ" = ( @@ -26663,9 +26397,6 @@ dir = 4 }, /area/station/hallway/primary/fore) -"hun" = ( -/turf/closed/wall/r_wall/rust, -/area/station/science/mixing/hallway) "huo" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -26787,7 +26518,7 @@ }, /obj/structure/cable, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "hwY" = ( /obj/machinery/air_sensor/air_tank, /turf/open/floor/engine/air, @@ -26818,7 +26549,7 @@ network = list("ss13","rd") }, /turf/open/floor/iron/dark, -/area/station/science/storage) +/area/station/science/ordnance/storage) "hxf" = ( /obj/structure/transit_tube, /obj/structure/disposalpipe/segment, @@ -26883,9 +26614,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "hxZ" = ( /obj/structure/window/reinforced{ @@ -26925,21 +26655,19 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, /obj/machinery/meter/layer4, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "hyp" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/disposal) "hyB" = ( -/obj/structure/lattice/catwalk, /obj/structure/cable, -/turf/open/floor/plating/airless, +/obj/structure/lattice/catwalk, +/turf/open/space/basic, /area/station/solars/starboard/fore) "hyJ" = ( /obj/effect/turf_decal/bot, @@ -26959,7 +26687,7 @@ /area/station/commons/fitness/recreation) "hyT" = ( /turf/closed/wall/r_wall/rust, -/area/station/science/misc_lab) +/area/station/science/ordnance/office) "hzC" = ( /obj/structure/flora/rock/icy/style_2, /turf/open/misc/asteroid/airless, @@ -27172,9 +26900,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "hCV" = ( /obj/structure/chair/comfy/brown{ @@ -27209,9 +26936,8 @@ }, /obj/structure/cable, /obj/structure/sign/poster/contraband/random/directional/west, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "hDB" = ( /turf/closed/wall/r_wall, @@ -27234,7 +26960,7 @@ }, /obj/structure/cable, /turf/open/floor/grass, -/area/station/security/prison) +/area/station/security/prison/garden) "hDK" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral{ @@ -27342,7 +27068,8 @@ /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ id = "justiceshutter"; - name = "Justice Shutter" + name = "Justice Shutter"; + dir = 4 }, /turf/open/floor/plating, /area/station/security/execution/education) @@ -27406,9 +27133,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/blood/old, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "hFm" = ( /obj/effect/turf_decal/tile/yellow{ @@ -27432,9 +27158,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/landmark/event_spawn, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "hFA" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -27442,9 +27167,8 @@ }, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/cobweb/cobweb2, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "hGa" = ( /obj/effect/turf_decal/tile/red, @@ -27510,9 +27234,8 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/trash/cigbutt, /obj/effect/spawner/random/entertainment/cigarette, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/cargo/storage) "hGX" = ( /obj/effect/turf_decal/bot, @@ -27774,9 +27497,7 @@ /area/station/hallway/primary/starboard) "hKm" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/sign/warning/vacuum/external{ - pixel_x = -32 - }, +/obj/structure/sign/warning/vacuum/external/directional/west, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -27788,9 +27509,8 @@ /obj/structure/cable, /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/structure/steam_vent, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "hKA" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -27891,7 +27611,7 @@ "hLZ" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/showroomfloor, -/area/station/science/mixing) +/area/station/science/ordnance) "hMo" = ( /obj/structure/disposalpipe/segment, /obj/effect/spawner/structure/window/reinforced, @@ -27907,7 +27627,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "hMN" = ( /turf/closed/wall, /area/station/service/chapel/funeral) @@ -28062,9 +27782,8 @@ pixel_y = 28 }, /obj/effect/landmark/blobstart, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "hOs" = ( /obj/effect/turf_decal/stripes/line, @@ -28284,7 +28003,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/garden) "hRa" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -28466,10 +28185,10 @@ /turf/open/floor/iron/dark, /area/station/command/heads_quarters/rd) "hTs" = ( -/obj/structure/lattice/catwalk, /obj/effect/landmark/carpspawn, /obj/structure/cable, -/turf/open/floor/plating/airless, +/obj/structure/lattice/catwalk, +/turf/open/space/basic, /area/station/solars/starboard/fore) "hTB" = ( /obj/effect/turf_decal/tile/neutral, @@ -28543,7 +28262,7 @@ /turf/open/floor/iron/chapel{ dir = 1 }, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "hUL" = ( /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -28559,7 +28278,7 @@ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/service/chapel/dock) +/area/station/service/chapel) "hUW" = ( /obj/effect/turf_decal/sand/plating, /obj/structure/disposalpipe/segment{ @@ -28609,7 +28328,7 @@ /obj/structure/flora/bush/flowers_br/style_random, /obj/machinery/light/directional/east, /turf/open/floor/grass, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "hVU" = ( /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ @@ -28652,17 +28371,15 @@ /obj/machinery/airalarm/directional/south, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/solars/starboard/fore) "hWB" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "hXv" = ( /obj/effect/decal/cleanable/dirt, @@ -28671,9 +28388,8 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "hXK" = ( /obj/effect/turf_decal/tile/blue, @@ -28768,14 +28484,13 @@ dir = 6 }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/engineering/supermatter/room) "hZd" = ( /obj/structure/flora/tree/jungle/style_random, /turf/open/floor/grass, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "hZg" = ( /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -28904,7 +28619,8 @@ }, /obj/machinery/door/poddoor/shutters/preopen{ id = "AI Core shutters"; - name = "AI Core Shutter" + name = "AI Core Shutter"; + dir = 4 }, /obj/effect/turf_decal/delivery, /obj/machinery/light_switch/directional/north{ @@ -28936,9 +28652,8 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "ias" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -28966,9 +28681,8 @@ dir = 4 }, /obj/effect/spawner/random/structure/crate, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "iaw" = ( /obj/effect/turf_decal/tile/blue, @@ -29059,7 +28773,7 @@ /obj/effect/turf_decal/siding/green{ dir = 4 }, -/obj/item/reagent_containers/glass/bucket, +/obj/item/reagent_containers/glass/watering_can, /turf/open/floor/iron/dark, /area/station/service/hydroponics/garden) "ibm" = ( @@ -29123,9 +28837,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/solars/starboard/fore) "icw" = ( /obj/structure/table, @@ -29276,7 +28989,7 @@ "iew" = ( /obj/machinery/portable_atmospherics/canister, /turf/open/floor/iron/dark, -/area/station/science/storage) +/area/station/science/ordnance/storage) "ieI" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -29305,7 +29018,7 @@ }, /obj/machinery/bluespace_vendor/directional/south, /turf/open/floor/iron/dark, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "ifu" = ( /obj/effect/turf_decal/bot, /obj/effect/decal/cleanable/cobweb, @@ -29394,9 +29107,8 @@ /area/station/medical/morgue) "ige" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/aft) "igg" = ( /obj/effect/turf_decal/tile/blue{ @@ -29474,9 +29186,8 @@ /obj/machinery/light/directional/north, /obj/structure/cable, /obj/machinery/power/shieldwallgen/xenobiologyaccess, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/science/xenobiology) "ihg" = ( /turf/closed/wall/r_wall, @@ -29514,9 +29225,7 @@ dir = 8 }, /obj/effect/turf_decal/tile/neutral, -/obj/structure/sign/warning/electric_shock{ - pixel_y = -32 - }, +/obj/structure/sign/warning/electric_shock/directional/south, /turf/open/floor/iron, /area/station/hallway/primary/central) "iiP" = ( @@ -29527,9 +29236,8 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "iiQ" = ( /obj/effect/turf_decal/box, @@ -29563,7 +29271,7 @@ }, /obj/effect/landmark/start/scientist, /turf/open/floor/iron/showroomfloor, -/area/station/science/misc_lab) +/area/station/science/ordnance/office) "ijc" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -29588,7 +29296,7 @@ /turf/open/floor/carpet/red, /area/station/command/heads_quarters/hos) "ijj" = ( -/obj/machinery/gravity_generator/main/station, +/obj/machinery/gravity_generator/main, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -29608,9 +29316,8 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "ijr" = ( /obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{ @@ -29696,7 +29403,7 @@ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/service/chapel/dock) +/area/station/service/chapel/monastery) "ikh" = ( /obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/yellow{ @@ -29869,9 +29576,7 @@ dir = 4 }, /obj/effect/turf_decal/stripes/line, -/obj/structure/sign/warning/vacuum/external{ - pixel_y = -32 - }, +/obj/structure/sign/warning/vacuum/external/directional/south, /turf/open/floor/iron/dark, /area/station/engineering/atmos) "ilJ" = ( @@ -29883,17 +29588,14 @@ dir = 8 }, /obj/item/radio/intercom/directional/north, -/obj/structure/sign/departments/medbay/alt{ - pixel_x = -32 - }, +/obj/structure/sign/departments/medbay/alt/directional/west, /obj/item/kirbyplants/random, /turf/open/floor/iron/dark, /area/station/hallway/primary/fore) "ilQ" = ( /obj/structure/girder, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/aft) "imo" = ( /obj/effect/turf_decal/tile/yellow{ @@ -29932,9 +29634,8 @@ /obj/effect/mapping_helpers/airlock/unres, /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance/departmental, /obj/effect/mapping_helpers/airlock/access/any/service/janitor, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/disposal) "imM" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -29977,9 +29678,8 @@ /obj/structure/girder, /obj/effect/turf_decal/stripes/corner, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "inw" = ( /obj/structure/flora/grass/jungle/b/style_random, @@ -30028,9 +29728,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/aft) "inT" = ( /obj/structure/chair/sofa/left{ @@ -30055,14 +29754,15 @@ "ior" = ( /obj/machinery/door/poddoor/shutters{ id = "ordnancemix"; - name = "Ordnance Lab Shutters" + name = "Ordnance Lab Shutters"; + dir = 8 }, /obj/effect/turf_decal/tile/purple/half/contrasted{ dir = 1 }, /obj/machinery/door/firedoor/heavy, /turf/open/floor/iron/showroomfloor, -/area/station/science/mixing/hallway) +/area/station/science/ordnance) "ios" = ( /turf/closed/wall/rust, /area/station/service/kitchen) @@ -30170,7 +29870,7 @@ "ipL" = ( /obj/structure/closet/crate/hydroponics, /obj/item/crowbar/red, -/obj/item/reagent_containers/glass/bucket, +/obj/item/reagent_containers/glass/watering_can, /obj/item/circuitboard/machine/biogenerator, /obj/item/wirecutters, /obj/item/wrench, @@ -30233,7 +29933,7 @@ pixel_x = -28 }, /turf/open/floor/iron/showroomfloor, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "iqd" = ( /obj/structure/rack, /obj/effect/spawner/random/techstorage/medical_all, @@ -30417,9 +30117,8 @@ "isA" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/department/bridge) "isO" = ( /obj/structure/closet/secure_closet/atmospherics, @@ -30490,9 +30189,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/aft) "itZ" = ( /obj/structure/flora/bush/sparsegrass/style_random, @@ -30512,7 +30210,7 @@ dir = 1 }, /turf/open/floor/engine, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "iug" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/monitored/plasma_input{ dir = 1 @@ -30537,9 +30235,8 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/closet/firecloset, /obj/effect/turf_decal/bot, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/aft) "iuC" = ( /obj/effect/spawner/structure/window/reinforced, @@ -30628,7 +30325,8 @@ /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters{ id = "virologysurgery"; - name = "Virology Privacy Shutters" + name = "Virology Privacy Shutters"; + dir = 1 }, /turf/open/floor/plating, /area/station/medical/virology) @@ -30637,9 +30335,8 @@ /turf/open/floor/plating, /area/station/maintenance/department/security) "ivX" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/department/bridge) "ivY" = ( /obj/effect/turf_decal/bot, @@ -30684,10 +30381,6 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/structure/sign/warning/vacuum/external{ - pixel_x = 32; - pixel_y = -32 - }, /turf/open/floor/iron/dark, /area/station/cargo/storage) "iwL" = ( @@ -30712,6 +30405,15 @@ /obj/item/clothing/glasses/meson, /turf/open/floor/iron/dark, /area/station/engineering/atmos) +"iwZ" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "cmoprivacy"; + name = "Office Privacy Shutters"; + dir = 4 + }, +/turf/open/floor/plating, +/area/station/command/heads_quarters/cmo) "ixc" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ @@ -30797,9 +30499,8 @@ /obj/structure/disposalpipe/segment{ dir = 10 }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/aft) "ixN" = ( /obj/structure/sign/painting/library{ @@ -30951,7 +30652,7 @@ /area/station/hallway/primary/port) "izN" = ( /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "izU" = ( /obj/effect/turf_decal/delivery, /obj/machinery/vending/clothing, @@ -30959,15 +30660,12 @@ /area/station/hallway/secondary/entry) "izY" = ( /obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/cargo/storage) "iAt" = ( /obj/effect/turf_decal/stripes/line, -/obj/structure/sign/warning/vacuum/external{ - pixel_x = -32 - }, +/obj/structure/sign/warning/vacuum/external/directional/west, /turf/open/floor/iron/dark, /area/station/service/chapel/funeral) "iAC" = ( @@ -31018,9 +30716,8 @@ "iBb" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/engineering/supermatter/room) "iBc" = ( /obj/effect/decal/cleanable/dirt, @@ -31077,9 +30774,8 @@ pixel_y = 24 }, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "iBt" = ( /obj/effect/spawner/structure/window/reinforced, @@ -31321,9 +31017,8 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/disposal) "iFa" = ( /obj/machinery/light/small/directional/south, @@ -31414,7 +31109,7 @@ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "iFU" = ( /obj/structure/table, /obj/item/paper_bin, @@ -31501,7 +31196,7 @@ }, /obj/structure/tank_dispenser, /turf/open/floor/iron/showroomfloor, -/area/station/science/mixing) +/area/station/science/ordnance) "iHe" = ( /obj/effect/turf_decal/stripes/corner{ dir = 8 @@ -31513,7 +31208,7 @@ /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron/showroomfloor, -/area/station/security/prison) +/area/station/security/execution/transfer) "iHq" = ( /obj/effect/turf_decal/tile/yellow{ dir = 4 @@ -31671,9 +31366,8 @@ }, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/solars/port/fore) "iJf" = ( /obj/machinery/mech_bay_recharge_port, @@ -31710,14 +31404,13 @@ /obj/structure/girder, /obj/effect/decal/cleanable/dirt, /obj/structure/grille/broken, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "iJM" = ( /obj/machinery/portable_atmospherics/canister/nitrous_oxide, /turf/open/floor/iron/dark, -/area/station/science/storage) +/area/station/science/ordnance/storage) "iJN" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -31775,9 +31468,8 @@ /obj/effect/turf_decal/siding/wood{ dir = 1 }, -/turf/open/floor/wood{ - icon_state = "wood-broken" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/maintenance/department/crew_quarters/bar) "iKg" = ( /turf/closed/wall/rust, @@ -31870,7 +31562,7 @@ /obj/structure/table/wood/fancy, /obj/item/storage/fancy/candle_box, /turf/open/floor/iron/dark, -/area/station/service/chapel/dock) +/area/station/service/chapel) "iLQ" = ( /obj/machinery/portable_atmospherics/canister, /obj/machinery/atmospherics/components/unary/portables_connector/visible{ @@ -31911,7 +31603,7 @@ /obj/effect/turf_decal/siding/wood, /obj/machinery/camera/autoname/directional/south, /turf/open/floor/carpet/red, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "iMA" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -32230,7 +31922,7 @@ /obj/effect/turf_decal/trimline/red/filled/line, /obj/structure/cable, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "iTq" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -32317,7 +32009,7 @@ dir = 8 }, /turf/open/floor/iron/showroomfloor, -/area/station/science/mixing) +/area/station/science/ordnance) "iUm" = ( /obj/effect/turf_decal/tile/purple, /obj/effect/turf_decal/tile/purple{ @@ -32365,9 +32057,8 @@ /obj/structure/grille/broken, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "iUT" = ( /turf/closed/wall/r_wall/rust, @@ -32381,9 +32072,8 @@ /area/station/cargo/warehouse) "iUZ" = ( /obj/structure/girder, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "iVj" = ( /turf/closed/wall/r_wall, @@ -32468,7 +32158,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "iVR" = ( /obj/structure/sign/poster/contraband/random/directional/south, /turf/closed/wall, @@ -32541,9 +32231,8 @@ normaldoorcontrol = 1; specialfunctions = 4 }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "iWT" = ( /obj/structure/sign/departments/cargo, @@ -32570,9 +32259,7 @@ /area/station/hallway/primary/central/fore) "iXs" = ( /obj/structure/lattice, -/obj/structure/sign/warning/secure_area{ - pixel_x = -32 - }, +/obj/structure/sign/warning/secure_area/directional/west, /turf/open/space/basic, /area/space/nearstation) "iXx" = ( @@ -32644,7 +32331,7 @@ /turf/open/floor/iron/stairs/right{ dir = 1 }, -/area/station/service/chapel/dock) +/area/station/service/chapel/monastery) "iYf" = ( /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -32686,7 +32373,7 @@ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/service/chapel/dock) +/area/station/service/chapel) "iYA" = ( /obj/effect/turf_decal/delivery, /obj/structure/closet/l3closet/virology, @@ -32759,7 +32446,8 @@ /obj/structure/flora/bush/reed/style_random, /obj/machinery/door/poddoor/shutters/preopen{ id = "emmd"; - name = "Emergency Medical Lockdown Shutters" + name = "Emergency Medical Lockdown Shutters"; + dir = 4 }, /turf/open/floor/grass, /area/station/medical/paramedic) @@ -32924,7 +32612,7 @@ dir = 5 }, /turf/open/floor/engine/vacuum, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "jbZ" = ( /obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ dir = 8; @@ -33005,9 +32693,8 @@ "jcU" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/structure/crate, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "jdh" = ( /obj/effect/turf_decal/stripes/corner, @@ -33016,9 +32703,8 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "jdl" = ( /obj/structure/flora/bush/flowers_yw/style_random, @@ -33052,9 +32738,8 @@ pixel_x = -30 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/wood{ - icon_state = "wood-broken4" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/maintenance/port/fore) "jdE" = ( /obj/effect/turf_decal/tile/purple{ @@ -33080,7 +32765,7 @@ }, /obj/machinery/door/firedoor/border_only, /turf/open/floor/iron/dark, -/area/station/service/chapel/dock) +/area/station/service/chapel) "jdY" = ( /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -33109,9 +32794,8 @@ "jdZ" = ( /obj/structure/girder, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "jec" = ( /obj/effect/landmark/event_spawn, @@ -33126,7 +32810,7 @@ name = "Monastery External Airlock" }, /turf/open/floor/plating, -/area/station/service/chapel/dock) +/area/station/service/chapel) "jeR" = ( /obj/structure/table, /obj/item/stack/package_wrap, @@ -33168,9 +32852,7 @@ /turf/open/floor/iron, /area/station/cargo/storage) "jfe" = ( -/obj/structure/sign/warning/electric_shock{ - pixel_y = -32 - }, +/obj/structure/sign/warning/electric_shock/directional/south, /obj/structure/flora/grass/jungle/a/style_random, /obj/machinery/light/small/directional/south, /obj/effect/turf_decal/sand/plating, @@ -33187,9 +32869,8 @@ dir = 6 }, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "jfK" = ( /obj/structure/table/glass, @@ -33224,7 +32905,7 @@ }, /obj/effect/turf_decal/tile/purple, /turf/open/floor/iron/showroomfloor, -/area/station/science/mixing/hallway) +/area/station/science/ordnance) "jgf" = ( /obj/structure/disposalpipe/segment, /turf/closed/wall, @@ -33301,14 +32982,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/security/brig) -"jgA" = ( -/obj/structure/railing/corner{ - dir = 8 - }, -/obj/machinery/light/directional/east, -/obj/item/kirbyplants/random, -/turf/open/floor/iron/dark, -/area/station/service/chapel/dock) "jgB" = ( /obj/machinery/door/airlock/maintenance{ name = "Kitchen Cold Room Maintenance" @@ -33324,9 +32997,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "jgI" = ( /obj/effect/turf_decal/bot, @@ -33586,14 +33258,13 @@ dir = 4 }, /turf/open/floor/wood, -/area/station/service/chapel/dock) +/area/station/service/chapel/monastery) "jjw" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible/layer2, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/aft) "jjP" = ( /obj/structure/table, @@ -33614,7 +33285,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/iron/dark, -/area/station/security/prison) +/area/station/security/execution/transfer) "jka" = ( /obj/effect/turf_decal/tile/dark/half/contrasted, /obj/machinery/atmospherics/components/binary/valve/digital{ @@ -33622,13 +33293,12 @@ }, /obj/structure/cable, /turf/open/floor/iron/showroomfloor, -/area/station/science/storage) +/area/station/science/ordnance/storage) "jkd" = ( /obj/structure/chair/stool/bar/directional/west, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "jks" = ( /obj/effect/turf_decal/bot, @@ -33672,7 +33342,7 @@ /obj/effect/turf_decal/tile/purple/half/contrasted, /obj/machinery/light_switch/directional/east, /turf/open/floor/iron/showroomfloor, -/area/station/science/storage) +/area/station/science/ordnance/storage) "jlY" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -33708,7 +33378,7 @@ dir = 4 }, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "jmE" = ( /obj/structure/table, /obj/item/paper_bin{ @@ -33775,9 +33445,8 @@ /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/department/crew_quarters/bar) "jnS" = ( /obj/structure/table, @@ -33799,9 +33468,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/structure/sign/warning/fire{ - pixel_x = 32 - }, +/obj/structure/sign/warning/fire/directional/east, /turf/open/floor/iron/dark, /area/station/commons/storage/primary) "joh" = ( @@ -33811,13 +33478,16 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/medical/storage) +"jos" = ( +/turf/closed/wall/r_wall, +/area/station/service/chapel) "joC" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 }, /obj/machinery/camera/autoname/directional/north, /turf/open/floor/carpet/red, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "joK" = ( /obj/structure/chair/pew{ dir = 8 @@ -33880,14 +33550,13 @@ /turf/open/floor/iron/stairs/medium{ dir = 4 }, -/area/station/service/chapel/dock) +/area/station/service/chapel) "jpd" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "jpF" = ( /obj/effect/turf_decal/tile/neutral, @@ -33906,7 +33575,7 @@ "jpO" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/showroomfloor, -/area/station/science/misc_lab) +/area/station/science/ordnance/office) "jpX" = ( /obj/machinery/recharge_station, /obj/effect/turf_decal/bot, @@ -33965,7 +33634,7 @@ }, /obj/effect/turf_decal/siding/wood, /turf/open/floor/wood/parquet, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "jrq" = ( /obj/machinery/button/door/directional/south{ id = "ordnancemix"; @@ -33973,8 +33642,6 @@ pixel_x = 24; req_access = list("ordnance") }, -/obj/effect/turf_decal/tile/purple/half/contrasted, -/obj/machinery/power/apc/auto_name/directional/south, /obj/structure/cable, /obj/structure/disposalpipe/segment{ dir = 4 @@ -33982,8 +33649,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/effect/turf_decal/tile/purple/half/contrasted, /turf/open/floor/iron/showroomfloor, -/area/station/science/mixing/hallway) +/area/station/science/ordnance) "jrr" = ( /obj/structure/table, /obj/item/book/manual/hydroponics_pod_people{ @@ -34076,7 +33744,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /turf/open/floor/iron/showroomfloor, -/area/station/science/mixing) +/area/station/science/ordnance) "jsD" = ( /obj/effect/turf_decal/bot, /obj/machinery/conveyor{ @@ -34091,7 +33759,6 @@ dir = 8 }, /obj/machinery/light/directional/east, -/obj/machinery/airalarm/directional/east, /obj/machinery/camera/directional/east{ c_tag = "Cargo Ramps"; name = "cargo camera"; @@ -34119,9 +33786,8 @@ }, /obj/effect/decal/cleanable/dirt, /obj/structure/sign/poster/contraband/random/directional/north, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/hallway/primary/aft) "jtk" = ( /obj/machinery/light/directional/north, @@ -34177,7 +33843,7 @@ }, /obj/item/radio/intercom/prison/directional/west, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/garden) "juL" = ( /obj/effect/turf_decal/tile/yellow{ dir = 4 @@ -34227,9 +33893,8 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /obj/structure/sign/poster/contraband/random/directional/west, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "jwi" = ( /obj/machinery/door/firedoor, @@ -34252,9 +33917,8 @@ "jwk" = ( /obj/effect/decal/cleanable/ash, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/disposal/incinerator) "jwn" = ( /obj/effect/turf_decal/tile/red{ @@ -34436,7 +34100,7 @@ dir = 4 }, /turf/open/floor/carpet/red, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "jAy" = ( /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/iron/smooth_large, @@ -34448,9 +34112,8 @@ /obj/machinery/light/small/directional/west, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/blood/old, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "jAF" = ( /obj/structure/marker_beacon/burgundy{ @@ -34511,7 +34174,7 @@ "jBJ" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on, /turf/open/floor/engine/vacuum, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "jBN" = ( /obj/structure/chair/office{ dir = 4 @@ -34586,7 +34249,7 @@ }, /obj/machinery/status_display/ai/directional/east, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "jDs" = ( /obj/structure/table, /obj/effect/turf_decal/tile/neutral, @@ -34726,24 +34389,22 @@ dir = 4 }, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "jFf" = ( /obj/structure/chair/sofa/right{ color = "#c45c57" }, -/turf/open/floor/wood{ - icon_state = "wood-broken" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/maintenance/starboard/fore) "jFl" = ( /obj/effect/turf_decal/tile/purple/half/contrasted{ dir = 1 }, /turf/open/floor/iron/showroomfloor, -/area/station/science/mixing/hallway) +/area/station/science/ordnance) "jFq" = ( /obj/structure/barricade/wooden/crude, /obj/machinery/door/airlock/bronze, @@ -34771,9 +34432,8 @@ "jFz" = ( /obj/structure/grille/broken, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "jFZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -34784,9 +34444,8 @@ "jGn" = ( /obj/effect/decal/cleanable/dirt, /obj/item/storage/box/lights/mixed, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "jGU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -34866,16 +34525,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /obj/structure/disposalpipe/segment, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "jIa" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/landmark/start/chaplain, /turf/open/floor/carpet/red, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "jIg" = ( /obj/structure/cable, /turf/open/floor/carpet, @@ -34907,7 +34565,7 @@ /turf/open/floor/iron/chapel{ dir = 1 }, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "jIX" = ( /obj/item/radio/intercom/directional/west{ freerange = 1; @@ -35050,16 +34708,15 @@ /obj/effect/turf_decal/tile/purple, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/showroomfloor, -/area/station/science/misc_lab) +/area/station/science/ordnance/office) "jKj" = ( /obj/structure/chair/sofa/left{ color = "#c45c57"; dir = 8 }, /obj/effect/decal/cleanable/blood/old, -/turf/open/floor/wood{ - icon_state = "wood-broken7" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/maintenance/starboard/fore) "jKt" = ( /obj/effect/decal/cleanable/dirt, @@ -35109,9 +34766,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/structure/sign/departments/security{ - pixel_x = -32 - }, +/obj/structure/sign/departments/security/directional/west, /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/hallway/primary/aft) @@ -35182,9 +34837,8 @@ /obj/machinery/light/small/directional/south, /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/blobstart, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "jLK" = ( /obj/effect/turf_decal/tile/neutral, @@ -35349,15 +35003,15 @@ /obj/effect/turf_decal/tile/purple/half/contrasted, /obj/machinery/door/poddoor/shutters{ id = "ordnancemix"; - name = "Ordnance Lab Shutters" + name = "Ordnance Lab Shutters"; + dir = 8 }, /obj/machinery/door/firedoor/heavy, -/obj/structure/cable, /obj/structure/disposalpipe/segment{ dir = 4 }, /turf/open/floor/iron/showroomfloor, -/area/station/science/mixing/hallway) +/area/station/science/ordnance) "jNt" = ( /obj/machinery/navbeacon{ codes_txt = "patrol;next_patrol=Arrivals"; @@ -35371,28 +35025,17 @@ /obj/structure/closet/secure_closet/brig, /obj/effect/turf_decal/tile/red/anticorner/contrasted, /turf/open/floor/iron/showroomfloor, -/area/station/security/prison) +/area/station/security/execution/transfer) "jNA" = ( -/obj/structure/table, -/obj/item/flashlight/lamp/green{ - pixel_x = -5; - pixel_y = 7 - }, -/obj/item/clothing/mask/cigarette/cigar{ - pixel_x = 8; - pixel_y = 4 - }, -/obj/item/clothing/mask/cigarette/cigar{ - pixel_x = 10; - pixel_y = -1 - }, -/obj/item/lighter{ - pixel_x = 11; - pixel_y = -7 - }, /obj/item/toy/figure/qm{ pixel_x = -17 }, +/obj/machinery/modular_computer/console/preset/id{ + dir = 1 + }, +/obj/machinery/keycard_auth/directional/east{ + pixel_y = 26 + }, /turf/open/floor/carpet/orange, /area/station/cargo/qm) "jNW" = ( @@ -35438,9 +35081,8 @@ }, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/aft) "jOA" = ( /obj/machinery/gateway/centerstation, @@ -35458,7 +35100,7 @@ }, /obj/machinery/light_switch/directional/north, /turf/open/floor/iron/showroomfloor, -/area/station/science/misc_lab) +/area/station/science/ordnance/office) "jOZ" = ( /obj/machinery/computer/rdservercontrol, /obj/effect/turf_decal/bot, @@ -35490,9 +35132,8 @@ "jPr" = ( /obj/structure/girder, /obj/structure/grille/broken, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/aft) "jPB" = ( /turf/closed/wall/rust, @@ -35623,9 +35264,8 @@ /obj/structure/disposalpipe/segment{ dir = 5 }, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "jSx" = ( /obj/structure/disposalpipe/segment{ @@ -35661,7 +35301,7 @@ /obj/machinery/light/directional/north, /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron/showroomfloor, -/area/station/security/prison) +/area/station/security/execution/transfer) "jSJ" = ( /obj/machinery/disposal/bin, /obj/effect/turf_decal/bot, @@ -35825,9 +35465,8 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/box, /obj/structure/mirror/directional/north, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "jVN" = ( /obj/effect/turf_decal/stripes/corner{ @@ -35837,9 +35476,8 @@ /obj/effect/landmark/blobstart, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "jVZ" = ( /obj/structure/water_source/puddle, @@ -35853,9 +35491,8 @@ /obj/structure/cable, /obj/structure/disposalpipe/segment, /obj/structure/sign/poster/contraband/random/directional/west, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "jWw" = ( /obj/effect/turf_decal/tile/neutral{ @@ -36022,7 +35659,7 @@ dir = 4 }, /turf/open/floor/plating, -/area/station/service/chapel/dock) +/area/station/service/chapel) "jZd" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -36115,9 +35752,7 @@ id = "Xenolab"; name = "Containment Chamber Blast Door" }, -/obj/structure/sign/warning/electric_shock{ - pixel_x = -32 - }, +/obj/structure/sign/warning/electric_shock/directional/west, /obj/effect/turf_decal/caution/stand_clear, /obj/machinery/door/firedoor, /turf/open/floor/engine, @@ -36206,7 +35841,7 @@ /obj/structure/flora/bush/flowers_yw/style_random, /obj/item/plant_analyzer, /turf/open/floor/grass, -/area/station/security/prison) +/area/station/security/prison/garden) "kbC" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/machinery/camera/directional/north{ @@ -36220,9 +35855,8 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "kbT" = ( /obj/structure/closet/secure_closet/hydroponics, @@ -36303,6 +35937,14 @@ }, /turf/open/floor/iron, /area/station/security/courtroom) +"kco" = ( +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/machinery/light/directional/east, +/obj/item/kirbyplants/random, +/turf/open/floor/iron/dark, +/area/station/service/chapel) "kcy" = ( /obj/machinery/newscaster/directional/east, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -36319,7 +35961,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/light_switch/directional/west, /turf/open/floor/carpet/red, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "kcW" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -36414,10 +36056,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/command/gateway) -"kfp" = ( -/obj/structure/lattice/catwalk, -/turf/open/floor/plating/airless, -/area/station/solars/starboard/aft) "kgB" = ( /obj/structure/table, /obj/machinery/cell_charger, @@ -36610,9 +36248,7 @@ /turf/open/floor/carpet/red, /area/station/command/heads_quarters/hos) "kjr" = ( -/obj/structure/sign/departments/cargo{ - pixel_x = 32 - }, +/obj/structure/sign/departments/cargo/directional/east, /turf/open/floor/iron/dark, /area/station/engineering/main) "kjK" = ( @@ -36652,9 +36288,7 @@ /area/station/science/xenobiology) "kkS" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/warning/electric_shock{ - pixel_x = -32 - }, +/obj/structure/sign/warning/electric_shock/directional/west, /obj/structure/cable, /turf/open/floor/plating, /area/station/tcommsat/computer) @@ -36664,15 +36298,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/security/prison) -"kle" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, -/area/station/maintenance/starboard) "kll" = ( /obj/machinery/computer/mech_bay_power_console{ dir = 4 @@ -36710,9 +36335,8 @@ /obj/structure/disposalpipe/segment{ dir = 6 }, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "klK" = ( /obj/structure/railing{ @@ -36756,15 +36380,12 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "kmG" = ( /obj/effect/turf_decal/box/corners, -/obj/structure/sign/warning/electric_shock{ - pixel_y = -32 - }, +/obj/structure/sign/warning/electric_shock/directional/south, /turf/open/floor/engine, /area/station/science/xenobiology) "kmK" = ( @@ -36776,9 +36397,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/hallway/secondary/entry) "kmN" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -36792,7 +36412,7 @@ dir = 5 }, /turf/open/floor/iron/showroomfloor, -/area/station/science/storage) +/area/station/science/ordnance/storage) "kmZ" = ( /obj/machinery/camera/autoname/directional/east, /obj/structure/disposalpipe/segment{ @@ -36843,9 +36463,8 @@ "knE" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/blobstart, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "knL" = ( /obj/effect/turf_decal/tile/blue, @@ -36905,7 +36524,7 @@ }, /obj/machinery/atmospherics/components/binary/pump, /turf/open/floor/engine, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "kpS" = ( /obj/structure/railing{ dir = 1 @@ -36953,9 +36572,8 @@ pixel_y = 28 }, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "kqD" = ( /obj/structure/flora/grass/jungle/a/style_random, @@ -37021,9 +36639,7 @@ /obj/item/kirbyplants{ icon_state = "plant-16" }, -/obj/structure/sign/departments/lawyer{ - pixel_y = 32 - }, +/obj/structure/sign/departments/lawyer/directional/north, /turf/open/floor/iron, /area/station/hallway/primary/central) "krc" = ( @@ -37133,7 +36749,8 @@ /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ id = "chemistry_shutters_2"; - name = "Chemistry Hall Shutters" + name = "Chemistry Hall Shutters"; + dir = 4 }, /turf/open/floor/plating, /area/station/medical/pharmacy) @@ -37150,12 +36767,13 @@ pixel_x = -8; pixel_y = -3 }, -/obj/item/computer_hardware/hard_drive/portable{ - pixel_x = -2 - }, /obj/structure/table, +/obj/item/computer_hardware/hard_drive/portable/scipaper_program{ + pixel_x = 2; + pixel_y = 1 + }, /turf/open/floor/iron/dark, -/area/station/science/misc_lab) +/area/station/science/ordnance/office) "ksp" = ( /obj/effect/turf_decal/loading_area{ dir = 1 @@ -37310,9 +36928,8 @@ dir = 6 }, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "kuQ" = ( /obj/effect/decal/cleanable/dirt, @@ -37322,17 +36939,15 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "kuS" = ( /obj/effect/turf_decal/stripes/corner, /obj/effect/decal/cleanable/dirt, /obj/structure/girder, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/disposal) "kvl" = ( /turf/closed/wall/r_wall/rust, @@ -37348,6 +36963,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/item/ai_module/supplied/freeform, /turf/open/floor/engine, /area/station/ai_monitored/turret_protected/ai_upload) "kvM" = ( @@ -37364,9 +36980,8 @@ /obj/item/wrench, /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "kwe" = ( /obj/effect/decal/cleanable/dirt, @@ -37422,14 +37037,13 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/grille/broken, /obj/effect/spawner/random/structure/crate, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "kwU" = ( /obj/machinery/atmospherics/pipe/smart/manifold/purple/visible/layer2, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "kwV" = ( /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -37513,9 +37127,8 @@ dir = 6 }, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "kyj" = ( /obj/structure/closet/secure_closet/miner, @@ -37544,7 +37157,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/iron/dark, -/area/station/security/prison) +/area/station/security/execution/transfer) "kyR" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -37589,9 +37202,8 @@ "kzw" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/barricade/wooden/crude, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "kzz" = ( /obj/effect/turf_decal/tile/neutral, @@ -37657,9 +37269,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/aft) "kAt" = ( /obj/machinery/door/firedoor, @@ -37762,9 +37373,8 @@ dir = 4 }, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "kCK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -37872,6 +37482,7 @@ dir = 4 }, /obj/item/radio/intercom/directional/south, +/obj/machinery/light/directional/south, /turf/open/floor/iron/dark, /area/station/cargo/storage) "kEm" = ( @@ -37948,10 +37559,10 @@ /turf/open/floor/iron, /area/station/hallway/primary/central) "kFo" = ( -/obj/structure/lattice/catwalk, /obj/effect/landmark/carpspawn, /obj/structure/cable, -/turf/open/floor/plating/airless, +/obj/structure/lattice/catwalk, +/turf/open/space/basic, /area/station/solars/starboard/aft) "kFx" = ( /obj/effect/decal/cleanable/dirt, @@ -38060,7 +37671,6 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/machinery/airalarm/directional/south, /turf/open/floor/iron/dark, /area/station/security/checkpoint/supply) "kHh" = ( @@ -38121,7 +37731,7 @@ dir = 1 }, /turf/open/floor/engine/vacuum, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "kHQ" = ( /obj/structure/sign/poster/official/wtf_is_co2, /turf/closed/wall, @@ -38216,7 +37826,7 @@ /turf/open/floor/iron/chapel{ dir = 1 }, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "kJH" = ( /obj/effect/turf_decal/bot, /obj/machinery/holopad, @@ -38224,9 +37834,8 @@ /area/station/medical/surgery/aft) "kJW" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/department/medical/central) "kKa" = ( /obj/structure/table/wood/fancy/blue, @@ -38242,9 +37851,8 @@ /obj/structure/grille/broken, /obj/effect/decal/cleanable/cobweb, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/aft) "kKm" = ( /obj/machinery/door/airlock/public/glass{ @@ -38289,15 +37897,13 @@ "kKF" = ( /obj/structure/girder, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/aft) "kKW" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "kLm" = ( /obj/structure/flora/tree/jungle/small/style_random, @@ -38307,9 +37913,8 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small/directional/west, /obj/item/crowbar/red, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "kLo" = ( /obj/effect/turf_decal/tile/yellow{ @@ -38343,9 +37948,8 @@ dir = 6 }, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "kLR" = ( /obj/machinery/telecomms/server/presets/medical, @@ -38362,9 +37966,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "kLW" = ( /obj/effect/turf_decal/tile/red, @@ -38460,9 +38063,8 @@ }, /obj/item/clothing/under/color/black, /obj/effect/turf_decal/bot, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "kNw" = ( /obj/structure/table, @@ -38560,9 +38162,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "kOx" = ( /obj/effect/turf_decal/tile/yellow{ @@ -38599,9 +38200,8 @@ /obj/item/bodybag, /obj/item/bodybag, /obj/item/shovel, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/aft) "kOX" = ( /obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ @@ -38623,7 +38223,7 @@ /obj/structure/bedsheetbin, /obj/structure/table, /turf/open/floor/iron/cafeteria, -/area/station/security/prison) +/area/station/security/prison/garden) "kPf" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -38640,9 +38240,8 @@ /area/station/hallway/primary/fore) "kPh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/department/bridge) "kPk" = ( /obj/machinery/door/airlock/maintenance, @@ -38658,19 +38257,14 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/hallway/primary/central) -"kPr" = ( -/obj/structure/railing/corner, -/turf/open/floor/iron/dark, -/area/station/service/chapel/dock) "kPs" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/landmark/event_spawn, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "kPt" = ( /obj/effect/turf_decal/sand/plating, @@ -38729,6 +38323,9 @@ }, /turf/open/floor/iron/dark, /area/station/security/checkpoint/engineering) +"kPX" = ( +/turf/open/floor/plating, +/area/station/security/execution/transfer) "kQf" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/crate{ @@ -38744,9 +38341,8 @@ /obj/effect/decal/cleanable/blood/old, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "kQH" = ( /obj/machinery/skill_station, @@ -38783,9 +38379,8 @@ "kQJ" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/grille, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "kQO" = ( /obj/structure/chair{ @@ -38810,7 +38405,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ cycle_id = "ai-passthrough" }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/construction, +/obj/effect/mapping_helpers/airlock/access/all/command/minisat, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) "kQT" = ( @@ -39028,7 +38623,7 @@ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "kUp" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -39063,9 +38658,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "kUR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -39123,7 +38717,7 @@ /obj/effect/turf_decal/siding/thinplating/dark, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/chapel, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "kVv" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -39178,7 +38772,7 @@ dir = 8 }, /turf/open/floor/engine/vacuum, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "kVY" = ( /obj/machinery/door/airlock/command{ name = "Gateway" @@ -39207,9 +38801,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "kWm" = ( /obj/effect/turf_decal/tile/red{ @@ -39243,9 +38836,8 @@ /turf/open/floor/iron/dark, /area/station/maintenance/fore) "kXg" = ( -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/disposal/incinerator) "kXw" = ( /obj/effect/turf_decal/siding/wood, @@ -39306,8 +38898,9 @@ /obj/machinery/shower{ dir = 8 }, +/obj/machinery/airalarm/directional/south, /turf/open/floor/plastic, -/area/station/security/prison) +/area/station/security/prison/shower) "kYy" = ( /obj/machinery/door/airlock/external{ name = "Science Escape Pod"; @@ -39426,9 +39019,8 @@ /obj/structure/disposalpipe/segment{ dir = 9 }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "kZH" = ( /obj/machinery/firealarm/directional/west, @@ -39542,9 +39134,8 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/sign/warning/secure_area{ - name = "EMERGENCY STORAGE"; - pixel_y = 32 +/obj/structure/sign/warning/secure_area/directional/north{ + name = "EMERGENCY STORAGE" }, /turf/open/floor/iron, /area/station/hallway/primary/aft) @@ -39578,7 +39169,7 @@ /obj/item/storage/fancy/candle_box, /obj/machinery/light/directional/north, /turf/open/floor/iron/dark, -/area/station/service/chapel/dock) +/area/station/service/chapel) "lbj" = ( /obj/structure/cable, /obj/structure/table, @@ -39610,6 +39201,9 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron/dark, /area/station/engineering/lobby) +"lbt" = ( +/turf/closed/wall/r_wall/rust, +/area/station/security/execution/transfer) "lby" = ( /turf/closed/wall, /area/station/science/robotics/mechbay) @@ -39831,9 +39425,8 @@ dir = 8 }, /obj/effect/decal/cleanable/blood/old, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "lgb" = ( /obj/effect/turf_decal/bot, @@ -39902,9 +39495,8 @@ "lgL" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/blood/old, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "lhf" = ( /obj/effect/turf_decal/bot, @@ -39954,9 +39546,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "lia" = ( /obj/effect/turf_decal/tile/brown, @@ -40002,9 +39593,8 @@ "liL" = ( /obj/structure/girder, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "liS" = ( /obj/structure/table/wood, @@ -40028,18 +39618,15 @@ /obj/effect/turf_decal/stripes/line{ dir = 10 }, -/obj/structure/sign/warning/vacuum/external{ - pixel_x = -32 - }, +/obj/structure/sign/warning/vacuum/external/directional/west, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /obj/structure/frame/computer{ anchored = 1; dir = 4 }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/solars/port/aft) "ljb" = ( /obj/effect/turf_decal/stripes/corner, @@ -40065,9 +39652,8 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "ljy" = ( /obj/structure/chair{ @@ -40147,9 +39733,9 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/security/prison) "lle" = ( /obj/effect/turf_decal/trimline/red/filled/line{ @@ -40159,7 +39745,7 @@ dir = 1 }, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "llh" = ( /obj/structure/sign/warning/electric_shock, /turf/closed/wall/rust, @@ -40192,7 +39778,7 @@ /area/station/maintenance/port/lesser) "llU" = ( /turf/open/floor/iron/showroomfloor, -/area/station/science/misc_lab) +/area/station/science/ordnance/office) "llY" = ( /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -40360,7 +39946,7 @@ /obj/effect/spawner/random/food_or_drink/donkpockets, /obj/item/radio/intercom/prison/directional/north, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "lnU" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral{ @@ -40390,7 +39976,7 @@ /obj/structure/cable, /obj/effect/mapping_helpers/airlock/access/all/science/general, /turf/open/floor/iron/dark, -/area/station/science/mixing/hallway) +/area/station/science/ordnance) "lox" = ( /obj/effect/turf_decal/trimline/green/line{ dir = 5 @@ -40579,7 +40165,7 @@ "lrg" = ( /obj/machinery/portable_atmospherics/canister/nitrogen, /turf/open/floor/iron/dark, -/area/station/science/storage) +/area/station/science/ordnance/storage) "lrk" = ( /obj/structure/cable, /obj/effect/turf_decal/siding/wood{ @@ -40748,9 +40334,8 @@ /area/station/maintenance/disposal/incinerator) "ltu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/security/prison) "luh" = ( /obj/structure/cable, @@ -41077,9 +40662,8 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/department/crew_quarters/bar) "lyG" = ( /obj/effect/turf_decal/trimline/red/filled/line{ @@ -41090,7 +40674,7 @@ dir = 1 }, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "lyT" = ( /obj/effect/turf_decal/tile/blue{ dir = 1 @@ -41112,9 +40696,8 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "lzc" = ( /obj/effect/turf_decal/stripes/end{ @@ -41176,14 +40759,15 @@ network = list("ss13","prison") }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/garden) "lzQ" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 1 }, /obj/structure/cable, +/obj/machinery/airalarm/directional/north, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/garden) "lAk" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -41228,6 +40812,7 @@ }, /obj/structure/cable, /obj/effect/mapping_helpers/airlock/access/all/security/general, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/security/checkpoint/medical) "lAA" = ( @@ -41300,9 +40885,8 @@ "lBC" = ( /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/effect/landmark/event_spawn, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "lBI" = ( /obj/effect/decal/cleanable/dirt, @@ -41313,9 +40897,8 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "lBP" = ( /obj/effect/turf_decal/sand/plating, @@ -41355,7 +40938,7 @@ "lCC" = ( /obj/structure/flora/bush/flowers_pp/style_random, /turf/open/floor/grass, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "lCV" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small/directional/east, @@ -41416,9 +40999,7 @@ /obj/effect/turf_decal/stripes/corner{ dir = 1 }, -/obj/structure/sign/warning/secure_area{ - pixel_y = 32 - }, +/obj/structure/sign/warning/secure_area/directional/north, /obj/machinery/light/directional/north, /turf/open/floor/iron, /area/station/hallway/primary/central) @@ -41482,9 +41063,8 @@ }, /obj/structure/cable, /obj/structure/sign/poster/contraband/random/directional/north, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "lEi" = ( /obj/effect/turf_decal/tile/neutral, @@ -41507,14 +41087,13 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/east, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/solars/port/fore) "lEz" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/showroomfloor, -/area/station/security/prison) +/area/station/security/execution/transfer) "lED" = ( /obj/machinery/telecomms/message_server/preset, /turf/open/floor/circuit/green/telecomms/mainframe, @@ -41586,7 +41165,8 @@ "lGq" = ( /obj/machinery/door/poddoor/shutters/preopen{ id = "engineaccess"; - name = "Engine Access Shutters" + name = "Engine Access Shutters"; + dir = 4 }, /obj/machinery/door/firedoor, /obj/effect/turf_decal/caution/stand_clear, @@ -41656,7 +41236,7 @@ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "lHy" = ( /obj/structure/table, /obj/item/clothing/gloves/color/latex, @@ -41678,7 +41258,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/garden) "lHE" = ( /obj/structure/table/wood, /obj/structure/displaycase/forsale/kitchen{ @@ -41707,7 +41287,7 @@ dir = 1 }, /turf/open/floor/iron/showroomfloor, -/area/station/science/storage) +/area/station/science/ordnance/storage) "lIr" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ @@ -41730,7 +41310,7 @@ }, /obj/structure/flora/bush/sparsegrass/style_random, /turf/open/floor/grass, -/area/station/security/prison) +/area/station/security/prison/garden) "lJd" = ( /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ @@ -41815,13 +41395,10 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/sign/warning/vacuum/external{ - pixel_x = -32 - }, +/obj/structure/sign/warning/vacuum/external/directional/west, /obj/machinery/light/small/directional/west, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/security/execution/education) "lKi" = ( /obj/structure/table, @@ -41889,9 +41466,8 @@ dir = 4 }, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "lKq" = ( /turf/closed/wall, @@ -41916,9 +41492,8 @@ "lKE" = ( /obj/effect/decal/cleanable/dirt, /mob/living/simple_animal/hostile/cat_butcherer, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "lKF" = ( /obj/effect/decal/cleanable/dirt, @@ -41926,14 +41501,13 @@ /obj/machinery/duct, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/sign/poster/contraband/random/directional/south, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/department/crew_quarters/bar) "lKI" = ( /obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/plating, -/area/station/security/prison) +/area/station/security/execution/transfer) "lKW" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -41944,9 +41518,8 @@ /obj/structure/cable, /obj/structure/disposalpipe/segment, /obj/effect/spawner/random/structure/steam_vent, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "lLi" = ( /obj/structure/sign/warning/no_smoking{ @@ -41989,7 +41562,7 @@ dir = 1 }, /turf/open/floor/iron/showroomfloor, -/area/station/security/prison) +/area/station/security/execution/transfer) "lLv" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -42019,9 +41592,8 @@ }, /obj/effect/decal/cleanable/dirt, /obj/structure/sign/poster/contraband/random/directional/west, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "lMf" = ( /obj/structure/chair/wood{ @@ -42226,7 +41798,7 @@ /obj/effect/decal/cleanable/blood/old, /obj/effect/decal/remains/human, /turf/open/floor/engine/vacuum, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "lPY" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -42253,7 +41825,7 @@ }, /obj/effect/landmark/start/chaplain, /turf/open/floor/iron/dark, -/area/station/service/chapel/dock) +/area/station/service/chapel) "lQK" = ( /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -42398,7 +41970,7 @@ }, /obj/structure/cable, /turf/open/floor/iron/showroomfloor, -/area/station/science/mixing/hallway) +/area/station/science/ordnance) "lSY" = ( /obj/effect/spawner/random/structure/table, /obj/item/candle{ @@ -42433,9 +42005,8 @@ /obj/structure/sign/poster/official/the_owl{ pixel_y = 32 }, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/aft) "lTu" = ( /obj/effect/turf_decal/tile/blue{ @@ -42670,12 +42241,9 @@ /area/station/engineering/storage/tech) "lWV" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/sign/warning/pods{ - pixel_y = 32 - }, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/structure/sign/warning/pods/directional/north, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "lWW" = ( /obj/effect/turf_decal/tile/neutral, @@ -42732,6 +42300,9 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/showroomfloor, /area/station/medical/chemistry) +"lXX" = ( +/turf/closed/wall/r_wall/rust, +/area/station/security/prison/mess) "lYa" = ( /obj/structure/chair/comfy/brown, /obj/effect/landmark/start/detective, @@ -42754,7 +42325,8 @@ "lYi" = ( /obj/machinery/door/poddoor/shutters{ id = "evashutter"; - name = "E.V.A. Storage Shutter" + name = "E.V.A. Storage Shutter"; + dir = 1 }, /obj/effect/turf_decal/caution/stand_clear, /turf/open/floor/iron/dark, @@ -42811,9 +42383,7 @@ /obj/effect/turf_decal/stripes/corner{ dir = 8 }, -/obj/structure/sign/warning/electric_shock{ - pixel_x = -32 - }, +/obj/structure/sign/warning/electric_shock/directional/west, /obj/effect/decal/cleanable/dirt, /obj/item/storage/box/lights/mixed, /turf/open/floor/plating, @@ -42826,7 +42396,7 @@ dir = 10 }, /turf/open/floor/engine/vacuum, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "lZn" = ( /obj/structure/sign/departments/science, /turf/closed/wall/rust, @@ -42874,7 +42444,7 @@ }, /obj/structure/sign/poster/random/directional/north, /turf/open/floor/iron/showroomfloor, -/area/station/science/mixing) +/area/station/science/ordnance) "lZV" = ( /obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ dir = 8 @@ -42906,9 +42476,8 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "maW" = ( /obj/structure/cable, @@ -42929,9 +42498,8 @@ /area/station/hallway/primary/central/fore) "maX" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "mbc" = ( /obj/effect/turf_decal/tile/blue{ @@ -42953,9 +42521,8 @@ dir = 9 }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "mbh" = ( /obj/structure/cable, @@ -43027,15 +42594,6 @@ /obj/machinery/holopad, /turf/open/floor/iron, /area/station/security/processing) -"mbQ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, -/area/station/maintenance/starboard/fore) "mbS" = ( /obj/machinery/door/airlock/engineering{ name = "Starboard Quarter Solar Access" @@ -43073,10 +42631,12 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/blobstart, /obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) +"mcr" = ( +/turf/open/floor/iron/dark, +/area/station/service/chapel) "mcs" = ( /obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/yellow{ @@ -43171,9 +42731,8 @@ "mdY" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/structure/crate, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/aft) "mec" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -43182,9 +42741,8 @@ dir = 5 }, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "mee" = ( /obj/effect/turf_decal/tile/neutral{ @@ -43211,9 +42769,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/light/built/directional/north, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/disposal/incinerator) "meO" = ( /obj/effect/turf_decal/tile/blue{ @@ -43246,7 +42803,7 @@ dir = 1 }, /turf/closed/wall/r_wall/rust, -/area/station/security/prison) +/area/station/security/execution/transfer) "mfd" = ( /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -43382,7 +42939,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron/showroomfloor, -/area/station/security/prison) +/area/station/security/execution/transfer) "mgA" = ( /obj/structure/table, /obj/item/paper_bin, @@ -43447,9 +43004,8 @@ dir = 8 }, /obj/effect/mapping_helpers/airlock/access/any/security/maintenance, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "mhP" = ( /obj/effect/turf_decal/tile/purple{ @@ -43478,7 +43034,7 @@ }, /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "mid" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral, @@ -43520,9 +43076,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/landmark/event_spawn, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "mis" = ( /obj/structure/frame/machine, @@ -43564,9 +43119,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "mjG" = ( /obj/effect/turf_decal/tile/red{ @@ -43611,13 +43165,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/decal/cleanable/dirt, -/obj/structure/sign/warning/vacuum{ - pixel_x = 32 - }, +/obj/structure/sign/warning/vacuum/directional/east, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "mkq" = ( /obj/structure/table, @@ -43661,9 +43212,8 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/end, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/engineering/supermatter/room) "mld" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -43768,7 +43318,7 @@ "mlD" = ( /obj/structure/flora/bush/lavendergrass/style_random, /turf/open/floor/grass, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "mlH" = ( /obj/effect/turf_decal/box/corners{ dir = 8 @@ -43807,9 +43357,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "mmo" = ( /obj/machinery/light/small/directional/north, @@ -43894,9 +43443,8 @@ }, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/solars/port/fore) "mnE" = ( /obj/effect/turf_decal/tile/yellow, @@ -43958,7 +43506,8 @@ /obj/machinery/door/firedoor, /obj/machinery/door/poddoor/shutters{ id = "bankshutter"; - name = "Bank Shutter" + name = "Bank Shutter"; + dir = 4 }, /obj/effect/turf_decal/delivery, /obj/effect/decal/cleanable/blood/old, @@ -44005,9 +43554,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/structure/sign/warning/secure_area{ - pixel_x = -32 - }, +/obj/structure/sign/warning/secure_area/directional/west, /obj/machinery/suit_storage_unit/standard_unit{ desc = "An industrial suit storage device carrying retro space suits. Neat!"; helmet_type = /obj/item/clothing/head/helmet/space; @@ -44116,9 +43663,8 @@ "mrf" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "mrl" = ( /turf/closed/wall, @@ -44209,9 +43755,8 @@ /obj/effect/decal/cleanable/blood/old, /obj/effect/decal/remains/human, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "msf" = ( /obj/effect/turf_decal/tile/neutral{ @@ -44253,7 +43798,8 @@ /obj/structure/flora/bush/flowers_yw/style_random, /obj/machinery/door/poddoor/shutters/preopen{ id = "emmd"; - name = "Emergency Medical Lockdown Shutters" + name = "Emergency Medical Lockdown Shutters"; + dir = 4 }, /turf/open/floor/grass, /area/station/medical/paramedic) @@ -44283,7 +43829,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/chapel, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "msZ" = ( /obj/effect/turf_decal/tile/red{ dir = 1 @@ -44392,7 +43938,7 @@ dir = 8 }, /turf/open/floor/iron/dark, -/area/station/security/prison) +/area/station/security/execution/transfer) "mvm" = ( /obj/effect/turf_decal/arrows, /obj/effect/decal/cleanable/blood/old, @@ -44411,9 +43957,8 @@ network = list("ss13","engine") }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/engineering/supermatter/room) "mvD" = ( /obj/effect/decal/cleanable/dirt, @@ -44435,7 +43980,7 @@ /obj/structure/window/spawner/north, /obj/structure/flora/bush/flowers_pp/style_random, /turf/open/floor/grass, -/area/station/service/chapel/dock) +/area/station/service/chapel/monastery) "mvW" = ( /turf/open/floor/engine/plasma, /area/station/engineering/atmos) @@ -44458,7 +44003,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/showroomfloor, -/area/station/science/misc_lab) +/area/station/science/ordnance/office) "mwn" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -44487,9 +44032,8 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /obj/structure/sign/poster/contraband/random/directional/south, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/aft) "mwy" = ( /obj/machinery/newscaster/directional/west, @@ -44518,10 +44062,11 @@ }, /obj/machinery/door/poddoor/shutters{ id = "visitation"; - name = "Visitation Shutters" + name = "Visitation Shutters"; + dir = 1 }, /turf/open/floor/iron/showroomfloor, -/area/station/security/prison) +/area/station/security/execution/transfer) "mxh" = ( /obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/yellow{ @@ -44598,8 +44143,10 @@ dir = 6 }, /obj/effect/decal/cleanable/vomit/old, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/east, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "myz" = ( /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -44620,15 +44167,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /obj/structure/sign/poster/contraband/random/directional/west, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "myM" = ( /obj/structure/window/reinforced/spawner/east, /obj/effect/turf_decal/tile/purple/anticorner/contrasted, /turf/open/floor/iron/showroomfloor, -/area/station/science/mixing) +/area/station/science/ordnance) "myS" = ( /obj/effect/turf_decal/box, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -44770,7 +44316,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/showroomfloor, -/area/station/science/mixing) +/area/station/science/ordnance) "mBS" = ( /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -44784,9 +44330,8 @@ /obj/effect/turf_decal/stripes/line, /obj/machinery/light/small/directional/west, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/aft) "mCg" = ( /obj/machinery/door/firedoor, @@ -44862,6 +44407,7 @@ }, /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/effect/turf_decal/delivery, +/obj/machinery/airalarm/directional/north, /turf/open/floor/iron/dark, /area/station/cargo/storage) "mCO" = ( @@ -44874,7 +44420,7 @@ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "mCT" = ( /obj/machinery/light/floor, /turf/open/floor/engine/co2, @@ -44931,7 +44477,7 @@ /turf/open/floor/iron/showroomfloor, /area/station/engineering/hallway) "mDQ" = ( -/turf/closed/wall, +/turf/closed/wall/r_wall, /area/station/security/checkpoint/science/research) "mEj" = ( /obj/machinery/door/airlock/maintenance, @@ -44982,7 +44528,7 @@ dir = 1 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "mEH" = ( /obj/effect/turf_decal/box/corners, /obj/effect/turf_decal/tile/neutral, @@ -45038,7 +44584,7 @@ pixel_y = 6 }, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "mFE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -45055,7 +44601,7 @@ dir = 4 }, /turf/open/floor/iron/showroomfloor, -/area/station/science/storage) +/area/station/science/ordnance/storage) "mFQ" = ( /obj/structure/chair/sofa/bench{ dir = 4 @@ -45068,14 +44614,6 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/primary/fore) -"mFR" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/grille, -/obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, -/area/station/maintenance/port/fore) "mGj" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -45107,9 +44645,8 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/solars/port/aft) "mGz" = ( /obj/structure/table, @@ -45194,9 +44731,6 @@ /turf/open/floor/iron/dark, /area/station/service/library) "mHm" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, /obj/effect/landmark/start/depsec/medical, /obj/effect/turf_decal/tile/red{ dir = 1 @@ -45208,6 +44742,7 @@ dir = 8 }, /obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/showroomfloor, /area/station/security/checkpoint/medical) "mHq" = ( @@ -45250,7 +44785,7 @@ req_access = list("brig") }, /turf/open/floor/iron/showroomfloor, -/area/station/security/prison) +/area/station/security/execution/transfer) "mHJ" = ( /obj/machinery/atmospherics/components/trinary/mixer{ dir = 4 @@ -45261,7 +44796,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/showroomfloor, -/area/station/science/storage) +/area/station/science/ordnance/storage) "mIb" = ( /obj/machinery/door/airlock/external{ name = "Atmospherics External Airlock" @@ -45270,9 +44805,8 @@ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/disposal/incinerator) "mIq" = ( /obj/machinery/door/firedoor, @@ -45364,9 +44898,8 @@ }, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/aft) "mKo" = ( /obj/effect/turf_decal/tile/blue{ @@ -45424,9 +44957,8 @@ /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/north, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "mKC" = ( /obj/effect/turf_decal/delivery, @@ -45494,9 +45026,8 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "mLJ" = ( /obj/machinery/ntnet_relay, @@ -45554,7 +45085,7 @@ dir = 8 }, /turf/open/floor/iron/dark, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "mMv" = ( /obj/structure/lattice/catwalk, /obj/structure/cable, @@ -45582,14 +45113,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/light/small/directional/west, -/obj/structure/sign/warning/vacuum/external{ - pixel_x = 32; +/obj/structure/sign/warning/vacuum/external/directional/east{ pixel_y = -32 }, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "mMB" = ( /obj/machinery/meter, @@ -45622,9 +45151,8 @@ /obj/effect/turf_decal/box, /obj/structure/extinguisher_cabinet/directional/west, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/science/xenobiology) "mMP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -45667,18 +45195,15 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/light/small/directional/north, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/security/execution/education) "mNt" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 }, /obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4; - external_pressure_bound = 140; - pressure_checks = 0 + dir = 4 }, /turf/open/floor/engine, /area/station/engineering/supermatter) @@ -45690,7 +45215,7 @@ /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron/showroomfloor, -/area/station/security/prison) +/area/station/security/execution/transfer) "mNz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -45808,9 +45333,8 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/vomit/old, /obj/effect/spawner/random/structure/crate, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "mOK" = ( /obj/effect/turf_decal/stripes/line, @@ -45826,9 +45350,8 @@ "mPd" = ( /obj/effect/decal/cleanable/ash, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/disposal/incinerator) "mPo" = ( /obj/structure/table, @@ -45865,9 +45388,7 @@ c_tag = "Central Hallway Courtroom"; name = "central camera" }, -/obj/structure/sign/departments/lawyer{ - pixel_y = 32 - }, +/obj/structure/sign/departments/lawyer/directional/north, /turf/open/floor/iron, /area/station/hallway/primary/central) "mPE" = ( @@ -45964,7 +45485,7 @@ dir = 9 }, /turf/open/floor/engine/vacuum, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "mQu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /mob/living/carbon/human/species/monkey, @@ -46040,9 +45561,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/structure/sign/departments/security{ - pixel_y = 32 - }, +/obj/structure/sign/departments/security/directional/north, /obj/effect/turf_decal/tile/red{ dir = 1 }, @@ -46134,7 +45653,7 @@ dir = 1 }, /turf/open/floor/iron/showroomfloor, -/area/station/science/storage) +/area/station/science/ordnance/storage) "mSf" = ( /obj/machinery/atmospherics/pipe/smart/simple/green/visible{ dir = 4 @@ -46170,7 +45689,8 @@ /obj/machinery/door/firedoor, /obj/machinery/door/poddoor/shutters{ id = "commissaryshutter"; - name = "Vacant Commissary Shutter" + name = "Vacant Commissary Shutter"; + dir = 1 }, /obj/effect/turf_decal/delivery, /obj/effect/decal/cleanable/blood/old, @@ -46230,9 +45750,8 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /obj/machinery/space_heater, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "mTz" = ( /obj/structure/cable, @@ -46274,15 +45793,13 @@ /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{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "mVc" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/aft) "mVf" = ( /obj/structure/disposalpipe/segment{ @@ -46305,9 +45822,8 @@ /obj/machinery/light/small/directional/south, /obj/structure/cable, /obj/structure/sign/poster/contraband/random/directional/south, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "mVm" = ( /obj/effect/turf_decal/tile/purple, @@ -46379,9 +45895,7 @@ /turf/open/floor/iron/dark, /area/station/science/robotics/lab) "mVO" = ( -/obj/structure/sign/departments/security{ - pixel_y = -32 - }, +/obj/structure/sign/departments/security/directional/south, /obj/structure/flora/bush/pale/style_random, /obj/machinery/light/directional/south, /obj/effect/turf_decal/sand/plating, @@ -46416,9 +45930,8 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/aft) "mWg" = ( /obj/effect/turf_decal/bot, @@ -46456,6 +45969,21 @@ dir = 1 }, /area/station/hallway/primary/port) +"mWt" = ( +/obj/structure/table/wood/fancy/black, +/obj/item/food/grown/poppy/lily{ + pixel_x = -6; + pixel_y = 6 + }, +/obj/item/food/grown/poppy/lily{ + pixel_x = 6; + pixel_y = 6 + }, +/obj/item/food/grown/poppy/lily, +/obj/machinery/power/apc/five_k/directional/north, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/service/chapel/monastery) "mWy" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -46552,9 +46080,8 @@ "mYi" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/loading_area, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "mYv" = ( /obj/effect/turf_decal/siding/thinplating/dark/end{ @@ -46567,9 +46094,8 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/power/apc/auto_name/directional/south, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/department/medical/central) "mYV" = ( /obj/structure/chair{ @@ -46648,7 +46174,7 @@ /obj/machinery/light/directional/east, /obj/item/kirbyplants/random, /turf/open/floor/iron/dark, -/area/station/service/chapel/dock) +/area/station/service/chapel) "mZT" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, /turf/closed/wall/rust, @@ -46665,7 +46191,7 @@ /obj/structure/window/spawner/north, /obj/structure/flora/rock/pile/style_random, /turf/open/floor/grass, -/area/station/service/chapel/dock) +/area/station/service/chapel/monastery) "nal" = ( /obj/structure/cable, /obj/structure/chair/sofa/left{ @@ -46744,7 +46270,7 @@ /area/station/medical/medbay/lobby) "naG" = ( /turf/closed/wall/r_wall, -/area/station/science/misc_lab) +/area/station/science/ordnance/office) "naK" = ( /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ @@ -46762,9 +46288,8 @@ dir = 4 }, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "naQ" = ( /obj/effect/turf_decal/stripes/corner, @@ -46776,13 +46301,12 @@ dir = 8 }, /turf/open/floor/iron/dark/airless, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/freezerchamber) "nbb" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/aft) "nbg" = ( /obj/effect/spawner/structure/window/reinforced, @@ -46867,9 +46391,8 @@ "nch" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/insectguts, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/department/bridge) "ncB" = ( /obj/effect/turf_decal/tile/red{ @@ -47051,16 +46574,14 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/trash/grille_or_waste, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "nfx" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/security/prison) "nfD" = ( /obj/structure/spirit_board, @@ -47137,9 +46658,8 @@ "ngJ" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "nhd" = ( /obj/machinery/flasher/directional/north{ @@ -47160,9 +46680,7 @@ /turf/open/floor/plating, /area/station/maintenance/starboard/fore) "nhG" = ( -/obj/structure/sign/departments/security{ - pixel_y = -32 - }, +/obj/structure/sign/departments/security/directional/south, /obj/structure/flora/grass/jungle/b/style_random, /obj/machinery/light/directional/south, /obj/effect/turf_decal/sand/plating, @@ -47320,9 +46838,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "nkQ" = ( /obj/machinery/door/firedoor, @@ -47369,7 +46886,7 @@ dir = 8 }, /turf/open/floor/iron/cafeteria, -/area/station/security/prison) +/area/station/security/prison/garden) "nmu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -47429,8 +46946,8 @@ /turf/open/floor/iron, /area/station/security/checkpoint/supply) "nnR" = ( -/obj/machinery/door/airlock/external{ - name = "Supply Dock Airlock" +/obj/machinery/door/airlock/external/glass{ + name = "Supply Door Airlock" }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 @@ -47487,9 +47004,8 @@ /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/north, /obj/machinery/light/small/directional/north, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "noE" = ( /obj/effect/turf_decal/tile/red{ @@ -47571,9 +47087,8 @@ /obj/effect/landmark/blobstart, /obj/effect/landmark/event_spawn, /obj/effect/spawner/random/trash/mess, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/department/crew_quarters/bar) "npx" = ( /obj/effect/turf_decal/tile/brown{ @@ -47672,7 +47187,7 @@ /obj/structure/window/reinforced, /obj/effect/turf_decal/delivery, /turf/open/floor/engine/vacuum, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "nqE" = ( /obj/machinery/disposal/bin{ desc = "A pneumatic waste disposal unit. This one leads into space!"; @@ -47689,7 +47204,8 @@ /obj/effect/turf_decal/delivery, /obj/machinery/door/poddoor/shutters{ id = "sidearmory"; - name = "Side Armoury Shutter" + name = "Side Armoury Shutter"; + dir = 4 }, /obj/machinery/button/door/directional/south{ id = "sidearmory"; @@ -47701,10 +47217,13 @@ "nqH" = ( /obj/effect/mob_spawn/corpse/human/charredskeleton, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/disposal/incinerator) +"nqV" = ( +/obj/structure/sign/warning/electric_shock, +/turf/closed/wall/r_wall, +/area/station/security/prison/mess) "nqZ" = ( /obj/structure/chair/sofa/right{ color = "#c45c57"; @@ -47784,9 +47303,8 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/aft) "nrS" = ( /obj/effect/turf_decal/tile/yellow, @@ -47812,9 +47330,8 @@ /obj/effect/turf_decal/tile/purple{ dir = 1 }, -/obj/structure/sign/departments/science{ - name = "ROBOTICS"; - pixel_y = 32 +/obj/structure/sign/departments/science/directional/north{ + name = "ROBOTICS" }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) @@ -47830,13 +47347,12 @@ "nst" = ( /obj/structure/sign/warning/explosives, /turf/closed/wall/r_wall, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "nsw" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/solars/port/fore) "nsM" = ( /obj/effect/turf_decal/bot, @@ -47962,9 +47478,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "nuo" = ( /obj/effect/turf_decal/stripes/corner, @@ -48235,9 +47750,8 @@ }, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "nxx" = ( /obj/effect/turf_decal/sand/plating, @@ -48256,7 +47770,7 @@ /obj/effect/turf_decal/box/red, /obj/effect/turf_decal/tile/purple/half/contrasted, /turf/open/floor/iron/showroomfloor, -/area/station/science/mixing) +/area/station/science/ordnance) "nxY" = ( /obj/structure/extinguisher_cabinet/directional/east, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -48283,9 +47797,8 @@ dir = 8 }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "nyb" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -48296,10 +47809,12 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /obj/structure/sign/poster/contraband/random/directional/north, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"nyg" = ( +/turf/closed/wall/r_wall, +/area/station/security/prison/garden) "nyw" = ( /obj/machinery/door/airlock/engineering{ name = "Emergency Storage" @@ -48392,9 +47907,8 @@ /obj/effect/turf_decal/delivery, /obj/machinery/door/poddoor/massdriver_ordnance, /obj/structure/fans/tiny, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "nBd" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -48432,7 +47946,7 @@ /obj/structure/flora/grass/jungle/b/style_random, /obj/structure/flora/bush/sparsegrass/style_random, /turf/open/floor/grass, -/area/station/security/prison) +/area/station/security/prison/garden) "nBZ" = ( /obj/effect/turf_decal/tile/neutral, /obj/machinery/newscaster/directional/west, @@ -48455,11 +47969,6 @@ /obj/item/radio/intercom/directional/south, /turf/open/floor/iron/dark, /area/station/engineering/gravity_generator) -"nCn" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/warning/vacuum/external, -/turf/open/floor/plating, -/area/station/cargo/storage) "nCs" = ( /obj/effect/turf_decal/tile/red{ dir = 1 @@ -48577,8 +48086,8 @@ /turf/open/floor/iron/dark, /area/station/security/detectives_office) "nDU" = ( -/obj/machinery/door/airlock/external{ - name = "Supply Dock Airlock" +/obj/machinery/door/airlock/external/glass{ + name = "Supply Door Airlock" }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 @@ -48756,7 +48265,7 @@ "nGy" = ( /obj/effect/turf_decal/stripes/corner, /turf/open/floor/engine/vacuum, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "nGC" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -48776,7 +48285,7 @@ }, /obj/item/food/grown/poppy, /turf/open/floor/iron/dark, -/area/station/service/chapel/dock) +/area/station/service/chapel) "nGJ" = ( /obj/effect/mapping_helpers/iannewyear, /turf/open/floor/wood, @@ -48812,16 +48321,15 @@ /obj/machinery/light/small/directional/south, /obj/structure/grille/broken, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "nHw" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 9 }, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "nHy" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -48993,9 +48501,8 @@ }, /obj/machinery/light/small/directional/south, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/solars/starboard/fore) "nJA" = ( /obj/effect/turf_decal/tile/yellow, @@ -49122,7 +48629,7 @@ dir = 9 }, /turf/open/floor/iron/dark/airless, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/freezerchamber) "nKO" = ( /obj/structure/sign/warning/electric_shock, /turf/closed/wall/r_wall, @@ -49138,9 +48645,8 @@ /obj/structure/disposalpipe/segment, /obj/structure/cable, /obj/effect/spawner/random/trash/grille_or_waste, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "nKV" = ( /obj/effect/turf_decal/tile/blue, @@ -49203,12 +48709,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"nMl" = ( -/obj/effect/turf_decal/siding/thinplating/dark/end{ - dir = 4 - }, -/turf/open/floor/glass/reinforced, -/area/station/service/chapel/dock) "nMB" = ( /obj/machinery/computer/secure_data{ dir = 1 @@ -49408,7 +48908,7 @@ /turf/open/floor/iron/stairs/medium{ dir = 1 }, -/area/station/service/chapel/dock) +/area/station/service/chapel) "nQs" = ( /obj/structure/chair/pew/left{ dir = 4 @@ -49434,9 +48934,8 @@ /obj/machinery/power/apc/auto_name/directional/east, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "nQO" = ( /obj/machinery/conveyor/inverted{ @@ -49462,12 +48961,6 @@ /obj/effect/landmark/start/hangover/closet, /turf/open/floor/iron/dark, /area/station/commons/locker) -"nQY" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, -/area/station/maintenance/department/crew_quarters/bar) "nRC" = ( /obj/structure/rack, /obj/item/storage/toolbox/emergency{ @@ -49506,9 +48999,7 @@ /obj/effect/turf_decal/stripes/corner{ dir = 4 }, -/obj/structure/sign/warning/xeno_mining{ - pixel_x = 32 - }, +/obj/structure/sign/warning/xeno_mining/directional/east, /turf/open/floor/iron/dark, /area/station/engineering/atmos/pumproom) "nSh" = ( @@ -49543,9 +49034,7 @@ name = "Port Quarter Solar Control" }, /obj/effect/turf_decal/bot, -/obj/structure/sign/warning/vacuum/external{ - pixel_x = -32 - }, +/obj/structure/sign/warning/vacuum/external/directional/west, /obj/effect/decal/cleanable/dirt, /obj/machinery/status_display/evac/directional/north, /obj/effect/turf_decal/stripes/line{ @@ -49553,9 +49042,8 @@ }, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/solars/port/fore) "nSZ" = ( /obj/structure/table, @@ -49600,14 +49088,11 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/structure/sign/warning/vacuum/external{ - pixel_x = 32 - }, +/obj/structure/sign/warning/vacuum/external/directional/east, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "nTG" = ( /obj/effect/spawner/random/vending/snackvend, @@ -49630,7 +49115,7 @@ /obj/machinery/newscaster/directional/north, /obj/item/kirbyplants/random, /turf/open/floor/iron/dark, -/area/station/service/chapel/dock) +/area/station/service/chapel) "nUP" = ( /obj/effect/landmark/event_spawn, /obj/effect/landmark/start/hangover, @@ -49658,6 +49143,9 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/cargo/office) +"nVF" = ( +/turf/closed/wall/r_wall, +/area/station/security/execution/transfer) "nWG" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -49797,16 +49285,14 @@ }, /obj/structure/filingcabinet/chestdrawer, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "nYG" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/hallway/primary/aft) "nYP" = ( /turf/closed/wall, @@ -49819,7 +49305,8 @@ /obj/machinery/door/firedoor, /obj/machinery/door/poddoor/shutters/preopen{ id = "kitchenshutters"; - name = "Kitchen Shutters" + name = "Kitchen Shutters"; + dir = 8 }, /obj/item/radio/intercom/directional/north, /obj/effect/turf_decal/bot, @@ -49921,7 +49408,7 @@ "nZS" = ( /obj/effect/decal/cleanable/blood/old, /turf/open/floor/engine/vacuum, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "nZX" = ( /obj/structure/extinguisher_cabinet/directional/north, /obj/machinery/component_printer, @@ -49934,7 +49421,7 @@ dir = 4 }, /turf/open/floor/iron/showroomfloor, -/area/station/science/misc_lab) +/area/station/science/ordnance/office) "nZZ" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -49983,7 +49470,7 @@ }, /obj/machinery/disposal/bin, /turf/open/floor/iron/showroomfloor, -/area/station/science/mixing) +/area/station/science/ordnance) "oaF" = ( /obj/effect/turf_decal/tile/red{ dir = 4 @@ -50100,7 +49587,7 @@ "ocE" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/dark, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "ocO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -50145,7 +49632,6 @@ /turf/open/floor/iron/dark, /area/station/security/brig) "odd" = ( -/obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, /obj/machinery/door/airlock/research{ glass = 1; @@ -50164,8 +49650,7 @@ dir = 8 }, /obj/effect/turf_decal/tile/neutral, -/obj/structure/sign/warning/fire{ - pixel_x = -32; +/obj/structure/sign/warning/fire/directional/west{ pixel_y = -32 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -50191,6 +49676,9 @@ }, /turf/open/floor/engine/n2, /area/station/engineering/atmos) +"off" = ( +/turf/closed/wall, +/area/station/service/chapel) "ofg" = ( /turf/closed/wall, /area/station/medical/pharmacy) @@ -50240,9 +49728,7 @@ /turf/open/floor/iron/dark, /area/station/hallway/primary/starboard) "ofv" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_y = -32 - }, +/obj/structure/sign/warning/vacuum/external/directional/south, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -50327,9 +49813,8 @@ /obj/effect/decal/cleanable/blood/old, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/security/execution/education) "ogA" = ( /obj/effect/turf_decal/sand/plating, @@ -50348,10 +49833,7 @@ }, /obj/item/food/grown/poppy, /turf/open/floor/iron/dark, -/area/station/service/chapel/dock) -"oha" = ( -/turf/closed/wall/r_wall, -/area/station/service/chapel/dock) +/area/station/service/chapel) "ohj" = ( /obj/effect/turf_decal/loading_area{ dir = 8 @@ -50484,9 +49966,8 @@ /obj/structure/disposalpipe/segment{ dir = 6 }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "oiS" = ( /obj/effect/turf_decal/stripes/corner{ @@ -50510,7 +49991,11 @@ pixel_x = -32 }, /turf/open/floor/engine, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) +"ojk" = ( +/obj/structure/sign/warning/vacuum/external, +/turf/closed/wall, +/area/station/cargo/storage) "ojs" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/newscaster/directional/east, @@ -50583,9 +50068,8 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/blood/old, /obj/effect/spawner/random/structure/grille, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "okk" = ( /obj/machinery/atmospherics/pipe/smart/simple/green/visible, @@ -50641,9 +50125,8 @@ /area/station/science/xenobiology) "okG" = ( /obj/structure/chair/stool/bar/directional/south, -/turf/open/floor/wood{ - icon_state = "wood-broken5" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/maintenance/port/fore) "okJ" = ( /obj/effect/turf_decal/tile/brown, @@ -50663,7 +50146,8 @@ "okP" = ( /obj/machinery/door/poddoor/shutters{ id = "custodialwagon"; - name = "Custodial Bay" + name = "Custodial Bay"; + dir = 1 }, /obj/effect/turf_decal/delivery, /obj/structure/disposalpipe/segment, @@ -50672,7 +50156,7 @@ "oln" = ( /obj/structure/plasticflaps/opaque, /turf/open/floor/plating, -/area/station/security/prison) +/area/station/security/prison/shower) "olv" = ( /obj/structure/flora/bush/grassy/style_random, /obj/structure/flora/bush/sparsegrass/style_random, @@ -50693,7 +50177,7 @@ pixel_y = 5 }, /turf/open/floor/iron/dark, -/area/station/science/misc_lab) +/area/station/science/ordnance/office) "olN" = ( /obj/effect/turf_decal/bot, /obj/machinery/light/directional/west, @@ -50715,9 +50199,8 @@ /obj/structure/girder, /obj/effect/turf_decal/stripes/corner, /obj/effect/decal/cleanable/cobweb/cobweb2, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "omi" = ( /obj/effect/turf_decal/tile/blue{ @@ -50742,9 +50225,8 @@ "omE" = ( /obj/effect/turf_decal/delivery, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "omH" = ( /obj/machinery/door/poddoor/shutters{ @@ -50850,9 +50332,8 @@ /area/station/security/warden) "onV" = ( /obj/machinery/light/small/directional/east, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/security/prison) "oou" = ( /obj/machinery/telecomms/receiver/preset_right, @@ -50869,7 +50350,8 @@ "oov" = ( /obj/machinery/door/poddoor/shutters/preopen{ id = "ordnancestorage"; - name = "Ordnance Storage Shutters" + name = "Ordnance Storage Shutters"; + dir = 1 }, /obj/effect/turf_decal/tile/purple/half/contrasted{ dir = 8 @@ -50878,7 +50360,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/door/firedoor/heavy, /turf/open/floor/iron/showroomfloor, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/storage) "oow" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, /obj/structure/cable, @@ -50914,9 +50396,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/security/prison) "opL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -50973,7 +50454,7 @@ /obj/machinery/door/airlock/engineering{ name = "Tech Storage" }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/construction, +/obj/effect/mapping_helpers/airlock/access/all/engineering/tech_storage, /turf/open/floor/iron/dark, /area/station/engineering/storage/tech) "oqS" = ( @@ -50981,9 +50462,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/canister_frame/machine/unfinished_canister_frame, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/disposal/incinerator) "oqW" = ( /obj/effect/turf_decal/tile/neutral, @@ -51240,9 +50720,8 @@ dir = 9 }, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "ouK" = ( /obj/machinery/chem_dispenser{ @@ -51367,9 +50846,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, /obj/structure/disposalpipe/segment, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "owm" = ( /obj/machinery/disposal/bin, @@ -51423,7 +50901,7 @@ /turf/open/floor/iron/chapel{ dir = 4 }, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "owG" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -51477,17 +50955,11 @@ /obj/effect/decal/cleanable/blood/old, /turf/open/floor/iron/dark, /area/station/maintenance/port/greater) -"oxU" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, -/area/station/maintenance/port/greater) "oye" = ( /obj/machinery/light/small/directional/north, /obj/structure/closet/emcloset/anchored, /turf/open/floor/plating, -/area/station/service/chapel/dock) +/area/station/service/chapel) "oyk" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -51533,12 +51005,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"oyI" = ( -/obj/effect/turf_decal/siding/thinplating/dark/end{ - dir = 8 - }, -/turf/open/floor/glass/reinforced, -/area/station/service/chapel/dock) "oyP" = ( /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -51592,9 +51058,8 @@ dir = 5 }, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "ozk" = ( /obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ @@ -51619,6 +51084,9 @@ /obj/effect/turf_decal/tile/red{ dir = 4 }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, /turf/open/floor/iron/showroomfloor, /area/station/security/checkpoint/medical) "ozw" = ( @@ -51805,9 +51273,8 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "oBP" = ( /obj/effect/turf_decal/tile/neutral{ @@ -51941,9 +51408,8 @@ /obj/machinery/light/small/directional/south, /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/blobstart, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "oDh" = ( /obj/effect/turf_decal/delivery, @@ -51972,7 +51438,7 @@ /area/station/engineering/supermatter/room) "oDK" = ( /turf/closed/wall/r_wall, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "oEc" = ( /obj/structure/window/reinforced, /obj/structure/window/reinforced{ @@ -51992,9 +51458,8 @@ dir = 1 }, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "oFc" = ( /obj/effect/turf_decal/tile/neutral{ @@ -52022,9 +51487,8 @@ "oFo" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "oFt" = ( /obj/machinery/light/small/directional/east, @@ -52058,9 +51522,8 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/cobweb, /obj/structure/closet/wardrobe/green, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "oGa" = ( /obj/structure/bed, @@ -52075,9 +51538,7 @@ }, /obj/item/bedsheet/medical, /obj/machinery/light/directional/east, -/obj/structure/sign/warning/biohazard{ - pixel_x = 32 - }, +/obj/structure/sign/warning/biohazard/directional/east, /turf/open/floor/iron/dark, /area/station/medical/medbay/central) "oGo" = ( @@ -52258,9 +51719,7 @@ /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/sign/departments/evac{ - pixel_y = 32 - }, +/obj/structure/sign/departments/evac/directional/north, /obj/effect/turf_decal/caution/stand_clear, /turf/open/floor/iron/dark, /area/station/hallway/primary/starboard) @@ -52414,9 +51873,8 @@ dir = 1 }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "oJH" = ( /obj/structure/flora/bush/sparsegrass/style_random, @@ -52472,9 +51930,8 @@ }, /obj/machinery/airalarm/directional/west, /obj/machinery/atmospherics/components/binary/pump/on/layer4, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "oKV" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -52510,9 +51967,8 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/department/cargo) "oLp" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, @@ -52543,9 +51999,8 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/effect/landmark/xeno_spawn, /obj/structure/disposalpipe/segment, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "oLR" = ( /obj/structure/sign/poster/official/twelve_gauge, @@ -52589,9 +52044,8 @@ "oMG" = ( /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/hallway/secondary/entry) "oMJ" = ( /obj/effect/turf_decal/tile/blue, @@ -52609,9 +52063,8 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/decoration/glowstick, /obj/structure/grille/broken, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "oMZ" = ( /obj/item/radio/intercom/directional/north, @@ -52636,7 +52089,7 @@ /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron/showroomfloor, -/area/station/security/prison) +/area/station/security/execution/transfer) "oNk" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -52679,7 +52132,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /turf/open/floor/iron/showroomfloor, -/area/station/security/prison) +/area/station/security/execution/transfer) "oNH" = ( /obj/structure/disposalpipe/junction/flip, /turf/open/floor/iron, @@ -52705,7 +52158,7 @@ /obj/machinery/door/window/right/directional/south{ dir = 4; name = "Mail Chute"; - req_access = list("mail_sorting") + req_access = list("shipping") }, /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -52720,7 +52173,8 @@ /obj/machinery/door/firedoor, /obj/machinery/door/poddoor/shutters/preopen{ id = "kitchenshutters"; - name = "Kitchen Shutters" + name = "Kitchen Shutters"; + dir = 8 }, /obj/item/reagent_containers/food/condiment/peppermill{ pixel_x = 3 @@ -52829,9 +52283,8 @@ /obj/structure/chair{ dir = 4 }, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "oQz" = ( /obj/machinery/door/firedoor, @@ -52883,7 +52336,7 @@ dir = 1 }, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "oRT" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -52917,9 +52370,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "oSD" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -52984,9 +52436,8 @@ }, /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/structure/crate, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/aft) "oTg" = ( /obj/machinery/conveyor{ @@ -53156,9 +52607,7 @@ "oVy" = ( /obj/machinery/power/smes, /obj/effect/decal/cleanable/dirt, -/obj/structure/sign/warning/electric_shock{ - pixel_y = 32 - }, +/obj/structure/sign/warning/electric_shock/directional/north, /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/structure/spider/stickyweb, /obj/structure/cable, @@ -53170,7 +52619,7 @@ /obj/machinery/power/apc/auto_name/directional/east, /obj/structure/cable, /turf/open/floor/iron/dark, -/area/station/science/misc_lab) +/area/station/science/ordnance/office) "oVP" = ( /obj/structure/flora/bush/sparsegrass/style_random, /obj/structure/flora/rock, @@ -53199,7 +52648,7 @@ /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron/dark, -/area/station/security/prison) +/area/station/security/execution/transfer) "oWc" = ( /obj/effect/turf_decal/siding/wood, /obj/structure/cable, @@ -53208,7 +52657,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment, /turf/open/floor/carpet/red, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "oWQ" = ( /obj/effect/turf_decal/tile/blue{ dir = 8 @@ -53431,11 +52880,10 @@ /turf/open/floor/iron/stairs/right{ dir = 1 }, -/area/station/service/chapel/dock) +/area/station/service/chapel) "oZv" = ( /obj/structure/lattice/catwalk, -/obj/structure/sign/warning/secure_area{ - pixel_x = -32; +/obj/structure/sign/warning/secure_area/directional/west{ pixel_y = -32 }, /obj/structure/transit_tube/horizontal{ @@ -53604,9 +53052,7 @@ /area/station/security/prison) "pbD" = ( /obj/effect/turf_decal/bot, -/obj/structure/sign/warning/fire{ - pixel_y = 32 - }, +/obj/structure/sign/warning/fire/directional/north, /obj/machinery/atmospherics/components/unary/portables_connector/visible/layer4, /turf/open/floor/plating, /area/station/cargo/warehouse) @@ -53616,9 +53062,8 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/aft) "pbY" = ( /obj/effect/turf_decal/tile/neutral, @@ -53765,9 +53210,8 @@ /obj/item/kitchen/fork, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "peF" = ( /obj/effect/turf_decal/tile/purple{ @@ -53832,9 +53276,8 @@ dir = 4 }, /obj/structure/sign/poster/contraband/random/directional/north, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "pfM" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -53861,7 +53304,7 @@ /obj/structure/flora/bush/flowers_pp/style_random, /obj/structure/cable, /turf/open/floor/grass, -/area/station/security/prison) +/area/station/security/prison/garden) "pgA" = ( /obj/effect/turf_decal/bot, /obj/machinery/portable_atmospherics/canister/oxygen, @@ -53871,9 +53314,8 @@ /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/structure/closet/secure_closet/personal, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood{ - icon_state = "wood-broken" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/cargo/warehouse) "pgQ" = ( /obj/structure/cable, @@ -54210,7 +53652,7 @@ /turf/open/floor/iron/chapel{ dir = 4 }, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "pkK" = ( /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -54308,9 +53750,8 @@ }, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/aft) "pmu" = ( /obj/structure/table, @@ -54482,27 +53923,19 @@ /obj/item/radio/intercom/directional/east, /turf/open/floor/carpet/green, /area/station/security/detectives_office) -"ppz" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, -/area/station/maintenance/fore) "ppD" = ( /obj/effect/turf_decal/tile/purple/half/contrasted{ dir = 4 }, /obj/machinery/door/poddoor/shutters/preopen{ id = "ordnancestorage"; - name = "Ordnance Storage Shutters" + name = "Ordnance Storage Shutters"; + dir = 1 }, /obj/machinery/door/firedoor/heavy, /obj/structure/cable, /turf/open/floor/iron/showroomfloor, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/storage) "ppH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/hydroponics/constructable, @@ -54527,9 +53960,8 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/aft) "pqb" = ( /obj/effect/turf_decal/tile/blue, @@ -54640,9 +54072,8 @@ /obj/structure/disposalpipe/segment, /obj/structure/cable, /obj/structure/sign/poster/contraband/random/directional/east, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "pri" = ( /obj/effect/turf_decal/tile/neutral{ @@ -54756,9 +54187,8 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "psC" = ( /obj/structure/cable, @@ -54798,9 +54228,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "ptu" = ( /obj/machinery/air_sensor/oxygen_tank, @@ -54844,9 +54273,8 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "puB" = ( /obj/effect/decal/cleanable/dirt, @@ -54976,9 +54404,8 @@ /area/station/engineering/lobby) "pwq" = ( /obj/machinery/light/small/directional/north, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/security/prison) "pwx" = ( /obj/machinery/vending/autodrobe, @@ -55022,7 +54449,7 @@ /obj/machinery/portable_atmospherics/canister/plasma, /obj/machinery/light/directional/west, /turf/open/floor/iron/dark, -/area/station/science/storage) +/area/station/science/ordnance/storage) "pxe" = ( /turf/closed/wall/mineral/plastitanium, /area/station/maintenance/port/aft) @@ -55067,9 +54494,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/hallway/primary/aft) "pxN" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -55101,9 +54527,8 @@ /area/station/solars/starboard/fore) "pyv" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/disposal/incinerator) "pyJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -55142,20 +54567,11 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/service/bar/atrium) -"pzh" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/landmark/start/hangover, -/turf/open/floor/wood{ - icon_state = "wood-broken" - }, -/area/station/commons/locker) "pzi" = ( /obj/machinery/door/poddoor/shutters{ id = "custodialwagon"; - name = "Custodial Bay" + name = "Custodial Bay"; + dir = 1 }, /obj/effect/turf_decal/delivery, /turf/open/floor/iron/dark, @@ -55208,9 +54624,8 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/disposal) "pzP" = ( /obj/machinery/telecomms/bus/preset_one, @@ -55222,9 +54637,8 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/wood{ - icon_state = "wood-broken5" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/maintenance/port/fore) "pAq" = ( /obj/machinery/newscaster/directional/south, @@ -55276,7 +54690,7 @@ /obj/structure/flora/bush/flowers_yw/style_random, /obj/structure/flora/bush/flowers_br/style_random, /turf/open/floor/grass, -/area/station/service/chapel/dock) +/area/station/service/chapel/monastery) "pBh" = ( /turf/open/floor/plating, /area/station/maintenance/disposal/incinerator) @@ -55352,16 +54766,15 @@ /area/station/maintenance/department/electrical) "pCm" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/aft) "pCr" = ( /obj/structure/table, /obj/structure/cable, /obj/item/food/spiderleg, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "pCF" = ( /obj/structure/door_assembly/door_assembly_ext{ anchored = 1 @@ -55383,9 +54796,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "pCX" = ( /obj/structure/table/wood, @@ -55400,7 +54812,7 @@ }, /obj/item/storage/book/bible, /turf/open/floor/carpet/red, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "pDd" = ( /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -55428,7 +54840,7 @@ /area/station/maintenance/starboard/aft) "pDo" = ( /turf/open/floor/iron/showroomfloor, -/area/station/security/prison) +/area/station/security/execution/transfer) "pDs" = ( /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -55546,14 +54958,15 @@ dir = 1 }, /turf/open/floor/iron/showroomfloor, -/area/station/security/prison) +/area/station/security/execution/transfer) "pEz" = ( /obj/machinery/shower{ dir = 4 }, /obj/item/soap/nanotrasen, +/obj/structure/cable, /turf/open/floor/plastic, -/area/station/security/prison) +/area/station/security/prison/shower) "pEA" = ( /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -55598,9 +55011,8 @@ /obj/effect/decal/cleanable/blood/old, /obj/effect/decal/cleanable/dirt, /obj/item/shard, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "pFl" = ( /obj/effect/decal/cleanable/blood/old, @@ -55727,7 +55139,7 @@ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "pGE" = ( /obj/structure/table, /obj/effect/turf_decal/tile/neutral{ @@ -55824,9 +55236,7 @@ /obj/machinery/airalarm/directional/west, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/effect/decal/cleanable/dirt, -/obj/structure/sign/warning/xeno_mining{ - pixel_y = 32 - }, +/obj/structure/sign/warning/xeno_mining/directional/north, /obj/machinery/camera/directional/west{ c_tag = "Port Quarter Solar"; name = "engineering camera"; @@ -55834,9 +55244,8 @@ }, /obj/effect/landmark/xeno_spawn, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/solars/port/aft) "pIy" = ( /obj/effect/turf_decal/stripes/line, @@ -55898,9 +55307,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/decal/cleanable/dirt, /obj/item/radio/intercom/directional/north, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/disposal/incinerator) "pJJ" = ( /obj/effect/turf_decal/tile/neutral, @@ -55952,9 +55360,8 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/grille/broken, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "pKR" = ( /obj/structure/cable, @@ -56015,9 +55422,8 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/turf/open/floor/wood{ - icon_state = "wood-broken7" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/maintenance/port/fore) "pLB" = ( /obj/effect/turf_decal/tile/neutral{ @@ -56047,9 +55453,8 @@ /area/station/maintenance/port/fore) "pLQ" = ( /obj/effect/decal/cleanable/ash, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/disposal/incinerator) "pLV" = ( /obj/structure/table, @@ -56104,9 +55509,8 @@ /obj/effect/decal/cleanable/blood/old, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/box, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "pMT" = ( /obj/effect/spawner/structure/window/reinforced, @@ -56201,23 +55605,6 @@ }, /turf/open/floor/iron/showroomfloor, /area/station/medical/virology) -"pOc" = ( -/obj/machinery/conveyor{ - dir = 8; - id = "QMLoad"; - name = "off ramp" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/bot, -/obj/structure/sign/warning/vacuum/external{ - pixel_x = 32; - pixel_y = 32 - }, -/turf/open/floor/iron/dark, -/area/station/cargo/storage) "pOq" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral{ @@ -56297,7 +55684,7 @@ }, /obj/item/storage/book/bible, /turf/open/floor/carpet/red, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "pPC" = ( /obj/effect/turf_decal/tile/red{ dir = 8 @@ -56353,9 +55740,8 @@ dir = 9 }, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "pQM" = ( /obj/structure/plasticflaps, @@ -56379,7 +55765,7 @@ dir = 1 }, /turf/open/floor/iron/dark/airless, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/freezerchamber) "pRu" = ( /obj/effect/turf_decal/tile/brown, /obj/effect/turf_decal/tile/brown{ @@ -56389,7 +55775,7 @@ /obj/effect/turf_decal/tile/yellow, /obj/machinery/door/window/left/directional/south{ name = "Cargo Disposal"; - req_access = list("mail_sorting") + req_access = list("shipping") }, /obj/machinery/conveyor_switch/oneway{ id = "packageSort2"; @@ -56547,9 +55933,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /obj/structure/disposalpipe/segment, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "pTR" = ( /obj/effect/turf_decal/tile/neutral, @@ -56583,15 +55968,14 @@ /obj/machinery/status_display/ai/directional/west, /obj/item/flashlight/lantern, /turf/open/floor/carpet/red, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "pUf" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "pUj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -56668,14 +56052,11 @@ /area/station/engineering/atmos/pumproom) "pVK" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/department/crew_quarters/bar) "pVM" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_y = -32 - }, +/obj/structure/sign/warning/vacuum/external/directional/south, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -56752,7 +56133,7 @@ /area/station/engineering/atmos) "pXi" = ( /turf/open/floor/plating, -/area/station/service/chapel/dock) +/area/station/service/chapel) "pXs" = ( /obj/structure/window/reinforced/plasma{ dir = 4 @@ -56812,9 +56193,8 @@ "pYj" = ( /obj/structure/girder, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "pYO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -56930,9 +56310,8 @@ /area/station/command/heads_quarters/captain) "qaL" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "qaR" = ( /obj/structure/sign/departments/medbay/alt, @@ -56990,9 +56369,8 @@ }, /obj/machinery/airalarm/directional/north, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/security/execution/education) "qbq" = ( /obj/item/storage/medkit/regular{ @@ -57072,7 +56450,7 @@ dir = 4 }, /turf/open/floor/carpet/red, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "qbO" = ( /obj/structure/flora/bush/sparsegrass/style_random, /obj/structure/flora/bush/grassy/style_random, @@ -57091,7 +56469,7 @@ /turf/open/floor/iron/stairs/left{ dir = 4 }, -/area/station/service/chapel/dock) +/area/station/service/chapel) "qbV" = ( /obj/structure/table, /obj/machinery/reagentgrinder{ @@ -57136,9 +56514,8 @@ "qco" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/blobstart, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "qcv" = ( /obj/effect/turf_decal/tile/neutral, @@ -57193,9 +56570,8 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/disposal/incinerator) "qdM" = ( /obj/effect/turf_decal/bot, @@ -57211,19 +56587,19 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/showroomfloor, -/area/station/science/misc_lab) +/area/station/science/ordnance/office) "qek" = ( /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/mining/glass{ - name = "Quartermaster" - }, /obj/structure/disposalpipe/segment{ dir = 4 }, /obj/structure/cable, /obj/effect/mapping_helpers/airlock/access/all/supply/qm, +/obj/machinery/door/airlock/command/glass{ + name = "Quartermaster's Office" + }, /turf/open/floor/iron/dark, /area/station/cargo/qm) "qez" = ( @@ -57250,7 +56626,7 @@ /obj/machinery/hydroponics/soil, /obj/item/seeds/ambrosia, /turf/open/floor/grass, -/area/station/security/prison) +/area/station/security/prison/garden) "qeJ" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -57349,9 +56725,8 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/space/nearstation) "qgz" = ( /obj/effect/turf_decal/tile/neutral{ @@ -57479,7 +56854,8 @@ /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ id = "Shower_1Privacy"; - name = "Shower 1 Privacy Shutter" + name = "Shower 1 Privacy Shutter"; + dir = 1 }, /turf/open/floor/plating, /area/station/commons/toilet/restrooms) @@ -57487,7 +56863,7 @@ /obj/machinery/light/directional/north, /obj/item/kirbyplants/random, /turf/open/floor/iron/dark, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "qic" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -57599,9 +56975,8 @@ "qjE" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/structure/crate, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "qjK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -57617,9 +56992,8 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/north, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/solars/starboard/fore) "qjM" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -57661,7 +57035,7 @@ dir = 8 }, /turf/open/floor/iron/showroomfloor, -/area/station/security/prison) +/area/station/security/execution/transfer) "qkf" = ( /obj/structure/sign/warning/docking, /turf/closed/wall, @@ -57750,7 +57124,7 @@ dir = 8 }, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "qlg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -57901,6 +57275,10 @@ }, /turf/open/floor/iron/dark, /area/station/security/execution/education) +"qng" = ( +/obj/structure/sign/warning/electric_shock, +/turf/closed/wall/r_wall, +/area/station/security/prison/garden) "qnv" = ( /obj/structure/table, /obj/item/clipboard, @@ -57909,6 +57287,39 @@ /obj/item/computer_hardware/hard_drive/portable/quartermaster, /obj/item/computer_hardware/hard_drive/portable/quartermaster, /obj/item/pen/fountain, +/obj/item/stamp{ + pixel_x = 8; + pixel_y = 2 + }, +/obj/item/stamp/denied{ + pixel_x = 8; + pixel_y = 6 + }, +/obj/item/stamp/qm{ + pixel_x = 8; + pixel_y = 10 + }, +/obj/item/paper_bin{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/pen, +/obj/item/lighter{ + pixel_x = 11; + pixel_y = -7 + }, +/obj/item/clothing/mask/cigarette/cigar{ + pixel_x = 8; + pixel_y = 4 + }, +/obj/item/clothing/mask/cigarette/cigar{ + pixel_x = 10; + pixel_y = -1 + }, +/obj/item/flashlight/lamp/green{ + pixel_x = -5; + pixel_y = 7 + }, /turf/open/floor/carpet/orange, /area/station/cargo/qm) "qny" = ( @@ -57975,9 +57386,8 @@ dir = 4 }, /obj/effect/decal/cleanable/vomit/old, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "qnS" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -57988,7 +57398,7 @@ dir = 4 }, /turf/open/floor/iron/showroomfloor, -/area/station/science/mixing/hallway) +/area/station/science/ordnance) "qnT" = ( /obj/structure/closet/secure_closet/chemical, /obj/structure/window/reinforced{ @@ -58052,7 +57462,7 @@ }, /obj/machinery/light_switch/directional/north, /turf/open/floor/iron/showroomfloor, -/area/station/science/mixing) +/area/station/science/ordnance) "qox" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -58167,9 +57577,8 @@ /obj/structure/closet/secure_closet/personal/cabinet, /obj/machinery/newscaster/directional/east, /obj/effect/landmark/start/hangover/closet, -/turf/open/floor/wood{ - icon_state = "wood-broken" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/commons/locker) "qqJ" = ( /obj/structure/disposalpipe/trunk{ @@ -58209,9 +57618,8 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/structure/crate, /obj/effect/turf_decal/stripes/corner, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "qrk" = ( /obj/machinery/power/smes, @@ -58329,14 +57737,13 @@ dir = 1 }, /turf/open/floor/iron/showroomfloor, -/area/station/science/storage) +/area/station/science/ordnance/storage) "qsW" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/light/small/directional/east, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "qth" = ( /obj/structure/closet/secure_closet/security/science, @@ -58433,9 +57840,8 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/blood/old, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/disposal) "quG" = ( /obj/machinery/door/airlock/maintenance, @@ -58595,9 +58001,8 @@ "qwK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/disposal/incinerator) "qwR" = ( /obj/machinery/door/airlock/maintenance{ @@ -58657,9 +58062,8 @@ dir = 1; pixel_y = 24 }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "qxQ" = ( /obj/effect/turf_decal/tile/yellow{ @@ -58715,9 +58119,8 @@ "qzd" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/engineering/supermatter/room) "qzg" = ( /obj/structure/lattice/catwalk, @@ -58862,7 +58265,7 @@ /obj/structure/flora/bush/fullgrass/style_random, /obj/structure/flora/bush/lavendergrass/style_random, /turf/open/floor/grass, -/area/station/service/chapel/dock) +/area/station/service/chapel/monastery) "qBR" = ( /obj/structure/chair/comfy/brown{ buildstackamount = 0; @@ -58955,7 +58358,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/science/research, /turf/open/floor/iron/dark, -/area/station/science/mixing/hallway) +/area/station/science/ordnance) "qEh" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -59018,7 +58421,7 @@ dir = 1 }, /turf/open/floor/iron/showroomfloor, -/area/station/security/prison) +/area/station/security/execution/transfer) "qED" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -59064,7 +58467,7 @@ dir = 8 }, /turf/open/floor/iron/chapel, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "qEV" = ( /obj/structure/chair/wood{ dir = 1 @@ -59094,7 +58497,16 @@ /obj/structure/flora/bush/flowers_pp/style_random, /obj/machinery/light/directional/east, /turf/open/floor/grass, -/area/station/service/chapel/monastery) +/area/station/service/chapel) +"qFG" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "cmoprivacy"; + name = "Office Privacy Shutters"; + dir = 1 + }, +/turf/open/floor/plating, +/area/station/command/heads_quarters/cmo) "qFN" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -59113,9 +58525,8 @@ "qGn" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/firecloset, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "qGq" = ( /obj/effect/spawner/structure/window/reinforced, @@ -59361,9 +58772,8 @@ "qKU" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/food/pie_smudge, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "qKX" = ( /obj/machinery/door/airlock/engineering{ @@ -59533,7 +58943,7 @@ "qNQ" = ( /obj/structure/sign/poster/official/help_others, /turf/closed/wall/r_wall/rust, -/area/station/security/prison) +/area/station/security/prison/shower) "qOd" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -59543,7 +58953,7 @@ /obj/item/seeds/potato, /obj/structure/cable, /turf/open/floor/grass, -/area/station/security/prison) +/area/station/security/prison/garden) "qOi" = ( /obj/structure/closet/secure_closet/engineering_personal, /obj/item/clothing/suit/hooded/wintercoat/engineering, @@ -59699,16 +59109,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/landmark/event_spawn, /turf/open/floor/iron/showroomfloor, -/area/station/science/mixing/hallway) +/area/station/science/ordnance) "qQO" = ( /obj/effect/decal/cleanable/blood/old, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/aft) "qQQ" = ( /obj/effect/turf_decal/siding/blue{ @@ -59731,9 +59140,8 @@ pixel_y = 4; req_access = list("maint_tunnels") }, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/disposal) "qRf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -59805,7 +59213,8 @@ /obj/machinery/door/firedoor, /obj/machinery/door/poddoor/shutters/preopen{ id = "kitchenshutters"; - name = "Kitchen Shutters" + name = "Kitchen Shutters"; + dir = 8 }, /obj/item/paper_bin{ pixel_x = -4; @@ -59818,7 +59227,8 @@ /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ id = "chemistry_shutters"; - name = "Chemistry Lobby Shutters" + name = "Chemistry Lobby Shutters"; + dir = 4 }, /turf/open/floor/plating, /area/station/medical/pharmacy) @@ -59899,9 +59309,8 @@ /obj/machinery/atmospherics/components/binary/pump/on/layer4{ dir = 8 }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "qSC" = ( /obj/effect/turf_decal/tile/blue{ @@ -60014,9 +59423,8 @@ /obj/effect/decal/cleanable/oil, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/hallway/primary/aft) "qUj" = ( /obj/machinery/smartfridge/food, @@ -60095,7 +59503,7 @@ dir = 4 }, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "qVC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -60117,7 +59525,7 @@ }, /obj/effect/landmark/blobstart, /turf/open/floor/engine, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "qVJ" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/neutral, @@ -60239,7 +59647,6 @@ /obj/effect/turf_decal/tile/purple{ dir = 8 }, -/obj/structure/cable, /obj/structure/disposalpipe/segment{ dir = 10 }, @@ -60247,7 +59654,7 @@ dir = 8 }, /turf/open/floor/iron/showroomfloor, -/area/station/science/mixing) +/area/station/science/ordnance) "qXn" = ( /obj/machinery/door/airlock/maintenance{ name = "Hydroponics Maintenance" @@ -60321,9 +59728,8 @@ /turf/open/floor/iron, /area/station/hallway/secondary/entry) "qYM" = ( -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/security/prison) "qYO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -60400,9 +59806,8 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "qZX" = ( /turf/closed/wall/r_wall, @@ -60418,9 +59823,8 @@ dir = 8 }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "rau" = ( /obj/effect/decal/cleanable/dirt, @@ -60439,9 +59843,8 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/girder/displaced, /obj/structure/grille/broken, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "raM" = ( /obj/machinery/light/directional/west, @@ -60472,9 +59875,8 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/security/prison) "raY" = ( /obj/effect/turf_decal/siding/wood{ @@ -60491,10 +59893,10 @@ /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron/showroomfloor, -/area/station/security/prison) +/area/station/security/execution/transfer) "rbj" = ( /turf/open/floor/iron/showroomfloor, -/area/station/science/mixing) +/area/station/science/ordnance) "rbk" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -60545,9 +59947,7 @@ /turf/open/floor/iron, /area/station/cargo/miningoffice) "rct" = ( -/obj/structure/sign/departments/medbay/alt{ - pixel_x = -32 - }, +/obj/structure/sign/departments/medbay/alt/directional/west, /obj/effect/turf_decal/tile/blue{ dir = 1 }, @@ -60561,7 +59961,7 @@ /area/station/hallway/primary/port) "rcB" = ( /turf/open/floor/grass, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "rcJ" = ( /obj/effect/turf_decal/tile/red{ dir = 1 @@ -60604,7 +60004,7 @@ /turf/open/floor/iron/chapel{ dir = 8 }, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "rdb" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -60729,9 +60129,8 @@ /turf/open/floor/plating, /area/station/security/prison) "rfe" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/disposal/incinerator) "rfg" = ( /obj/structure/chair/bronze, @@ -60766,7 +60165,7 @@ "rfQ" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible, /turf/closed/wall/r_wall, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "rfX" = ( /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -60838,12 +60237,11 @@ /obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer2{ dir = 6 }, -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored{ - chamber_id = "ordnancegas2"; +/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/ordnance_freezer_chamber_input{ dir = 1 }, /turf/open/floor/iron/dark/airless, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/freezerchamber) "rhK" = ( /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -60866,9 +60264,8 @@ /obj/effect/decal/cleanable/cobweb, /obj/structure/closet/crate/bin, /obj/effect/spawner/random/maintenance/two, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "riC" = ( /obj/effect/turf_decal/tile/purple{ @@ -60924,7 +60321,7 @@ dir = 4 }, /turf/open/floor/iron/showroomfloor, -/area/station/science/storage) +/area/station/science/ordnance/storage) "riW" = ( /obj/effect/turf_decal/siding/wood{ dir = 6 @@ -60973,12 +60370,13 @@ /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark, -/area/station/service/chapel/dock) +/area/station/service/chapel) "rkl" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/airalarm/directional/south, /turf/open/floor/iron, /area/station/security/prison) "rkn" = ( @@ -61019,7 +60417,7 @@ }, /obj/structure/cable, /turf/open/floor/iron/showroomfloor, -/area/station/science/misc_lab) +/area/station/science/ordnance/office) "rlx" = ( /obj/effect/turf_decal/tile/yellow{ dir = 4 @@ -61040,9 +60438,8 @@ "rlG" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "rlM" = ( /obj/structure/chair/pew{ @@ -61053,7 +60450,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/chapel, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "rlT" = ( /turf/open/floor/iron/showroomfloor, /area/station/science/robotics/lab) @@ -61065,9 +60462,8 @@ dir = 10 }, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "rmd" = ( /obj/structure/table, @@ -61092,9 +60488,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "rmK" = ( /obj/effect/turf_decal/bot, @@ -61128,6 +60523,9 @@ name = "High-Risk Modules"; req_access = list("captain") }, +/obj/item/ai_module/reset/purge{ + pixel_y = 11 + }, /turf/open/floor/circuit/red, /area/station/ai_monitored/turret_protected/ai_upload) "rmR" = ( @@ -61142,7 +60540,7 @@ /obj/structure/noticeboard/directional/north, /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron/dark, -/area/station/security/prison) +/area/station/security/execution/transfer) "rmT" = ( /obj/machinery/light_switch/directional/east, /obj/structure/cable, @@ -61289,9 +60687,8 @@ dir = 4 }, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/hallway/secondary/entry) "rpl" = ( /turf/closed/wall, @@ -61299,7 +60696,7 @@ "rpv" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/iron/showroomfloor, -/area/station/science/mixing) +/area/station/science/ordnance) "rpD" = ( /obj/effect/turf_decal/tile/brown{ dir = 4 @@ -61336,9 +60733,8 @@ /obj/structure/disposalpipe/segment{ dir = 9 }, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "rqb" = ( /obj/effect/turf_decal/tile/neutral, @@ -61360,7 +60756,7 @@ "rql" = ( /obj/structure/sign/warning/biohazard, /turf/closed/wall, -/area/station/science/mixing/hallway) +/area/station/science/ordnance) "rqm" = ( /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ @@ -61432,7 +60828,7 @@ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "rqJ" = ( /obj/effect/turf_decal/box, /obj/structure/cable, @@ -61596,9 +60992,8 @@ "rsO" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/department/crew_quarters/bar) "rsT" = ( /obj/effect/spawner/structure/window/reinforced, @@ -61612,11 +61007,11 @@ }, /obj/machinery/newscaster/directional/north, /turf/open/floor/iron/showroomfloor, -/area/station/science/misc_lab) +/area/station/science/ordnance/office) "rsX" = ( /obj/structure/flora/bush/flowers_br/style_random, /turf/open/floor/grass, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "rsY" = ( /obj/machinery/door/airlock/external{ name = "External Freight Airlock" @@ -61855,9 +61250,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/engineering/supermatter/room) "rvR" = ( /obj/effect/turf_decal/tile/blue, @@ -62014,7 +61408,7 @@ dir = 8 }, /turf/open/floor/glass/reinforced, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "rxt" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -62250,9 +61644,8 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "rBj" = ( /obj/structure/transit_tube/curved/flipped, @@ -62271,9 +61664,8 @@ /area/station/maintenance/aft) "rBH" = ( /obj/machinery/airalarm/directional/east, -/turf/open/floor/wood{ - icon_state = "wood-broken2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/maintenance/department/crew_quarters/bar) "rBO" = ( /obj/effect/decal/cleanable/dirt, @@ -62417,9 +61809,8 @@ "rEh" = ( /obj/structure/girder, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "rEi" = ( /obj/structure/table/glass, @@ -62603,14 +61994,17 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"rGd" = ( +/obj/machinery/newscaster/directional/north, +/turf/open/floor/iron/dark, +/area/station/service/chapel) "rGv" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/aft) "rGK" = ( /obj/structure/railing{ @@ -62620,7 +62014,7 @@ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/service/chapel/dock) +/area/station/service/chapel) "rHc" = ( /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -62681,7 +62075,7 @@ dir = 1 }, /turf/open/floor/iron/showroomfloor, -/area/station/security/prison) +/area/station/security/execution/transfer) "rHz" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/neutral, @@ -62780,7 +62174,7 @@ /obj/structure/flora/bush/sparsegrass/style_random, /obj/structure/flora/bush/sparsegrass/style_random, /turf/open/floor/grass, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "rJO" = ( /obj/effect/turf_decal/tile/purple{ dir = 8 @@ -62861,9 +62255,8 @@ dir = 1 }, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "rKB" = ( /obj/structure/sign/warning/secure_area{ @@ -62871,7 +62264,7 @@ name = "BOMB RANGE" }, /turf/closed/wall/r_wall, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "rKI" = ( /obj/machinery/rnd/production/protolathe/department/science, /obj/effect/turf_decal/bot, @@ -62918,16 +62311,14 @@ /turf/open/floor/engine, /area/station/tcommsat/computer) "rLr" = ( -/obj/structure/sign/warning/vacuum{ - pixel_x = 32 - }, +/obj/structure/sign/warning/vacuum/directional/east, /obj/effect/decal/cleanable/blood/old, /obj/machinery/light/small/directional/east, /turf/open/floor/engine/vacuum, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "rLs" = ( /obj/structure/reagent_dispensers/watertank/high, -/obj/item/reagent_containers/glass/bucket, +/obj/item/reagent_containers/glass/watering_can, /obj/effect/turf_decal/tile/green{ dir = 1 }, @@ -63017,9 +62408,8 @@ /area/station/security/brig) "rMH" = ( /obj/effect/spawner/random/structure/crate, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "rMI" = ( /obj/structure/table, @@ -63077,9 +62467,7 @@ }, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/bot, -/obj/structure/sign/warning/secure_area{ - pixel_x = 32 - }, +/obj/structure/sign/warning/secure_area/directional/east, /turf/open/floor/iron/dark, /area/station/engineering/storage/tech) "rNN" = ( @@ -63156,15 +62544,12 @@ dir = 4 }, /obj/machinery/light/small/directional/north, -/obj/structure/sign/warning/vacuum{ - pixel_x = -32 - }, +/obj/structure/sign/warning/vacuum/directional/west, /obj/effect/decal/cleanable/cobweb, /obj/effect/decal/cleanable/dirt, /obj/structure/sign/poster/contraband/random/directional/north, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/disposal) "rOJ" = ( /obj/effect/spawner/structure/window/reinforced, @@ -63174,7 +62559,7 @@ /obj/machinery/hydroponics/soil, /obj/item/seeds/carrot, /turf/open/floor/grass, -/area/station/security/prison) +/area/station/security/prison/garden) "rON" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -63224,9 +62609,8 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/structure/sign/poster/contraband/random/directional/north, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "rPx" = ( /obj/structure/bed{ @@ -63457,9 +62841,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "rSe" = ( /obj/effect/turf_decal/bot, @@ -63491,9 +62874,8 @@ /area/station/maintenance/starboard) "rTb" = ( /obj/effect/landmark/event_spawn, -/turf/open/floor/wood{ - icon_state = "wood-broken3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/maintenance/starboard/fore) "rTi" = ( /obj/structure/grille, @@ -63615,9 +62997,8 @@ /obj/effect/turf_decal/stripes/corner{ dir = 1 }, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "rVA" = ( /obj/effect/turf_decal/stripes/line, @@ -63669,9 +63050,8 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "rWT" = ( /obj/effect/spawner/structure/window/reinforced, @@ -63690,9 +63070,8 @@ /obj/machinery/status_display/evac/directional/north, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/solars/port/aft) "rXp" = ( /obj/effect/turf_decal/tile/red, @@ -63735,24 +63114,21 @@ dir = 1 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/garden) "rXJ" = ( /obj/effect/decal/remains/human, /obj/machinery/light/small/directional/west, /turf/open/floor/engine/vacuum, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "rXQ" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 }, -/obj/structure/sign/warning/biohazard{ - pixel_y = 32 - }, +/obj/structure/sign/warning/biohazard/directional/north, /obj/effect/decal/cleanable/cobweb, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/department/medical/central) "rYa" = ( /obj/effect/spawner/random/maintenance, @@ -63789,9 +63165,8 @@ /obj/effect/decal/cleanable/blood/old, /obj/item/radio/intercom/directional/west, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/hallway/primary/aft) "rYx" = ( /obj/machinery/hydroponics/constructable, @@ -63834,23 +63209,19 @@ /obj/item/flashlight/lantern, /obj/machinery/light/directional/south, /turf/open/floor/iron/dark, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "rZi" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/cargo/warehouse) -"rZl" = ( -/obj/structure/lattice/catwalk, -/turf/open/floor/plating/airless, -/area/station/solars/starboard/fore) "rZC" = ( /obj/structure/sign/warning/secure_area{ desc = "A warning sign which reads 'BOMB RANGE"; name = "BOMB RANGE" }, /turf/closed/wall/r_wall/rust, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "rZE" = ( /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ @@ -63940,6 +63311,12 @@ }, /turf/open/misc/asteroid, /area/space/nearstation) +"sae" = ( +/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/security/execution/transfer) "saE" = ( /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -63958,7 +63335,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/garden) "sby" = ( /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -63984,9 +63361,8 @@ /obj/structure/rack, /obj/item/stack/sheet/iron/fifty, /obj/effect/spawner/random/maintenance/two, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "sbJ" = ( /obj/structure/table, @@ -64051,7 +63427,7 @@ dir = 8 }, /turf/open/floor/iron/showroomfloor, -/area/station/science/mixing) +/area/station/science/ordnance) "scE" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -64175,17 +63551,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "seb" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "see" = ( /obj/structure/table, @@ -64255,13 +63629,10 @@ /area/station/cargo/warehouse) "seT" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/sign/warning/vacuum/external{ - pixel_y = 32 - }, +/obj/structure/sign/warning/vacuum/external/directional/north, /obj/effect/landmark/event_spawn, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "seU" = ( /obj/structure/table, @@ -64336,9 +63707,8 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/xeno_spawn, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "sgj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -64367,18 +63737,16 @@ /area/station/security/office) "sgE" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/warning/secure_area{ +/obj/structure/sign/warning/secure_area/directional/north{ desc = "A warning sign which reads 'SERVER ROOM'."; - name = "SERVER ROOM"; - pixel_y = 32 + name = "SERVER ROOM" }, /turf/open/floor/plating, /area/station/science/server) "sgF" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "sgW" = ( /obj/structure/window/reinforced{ @@ -64395,9 +63763,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/disposal) "shC" = ( /obj/machinery/door/airlock/security/glass{ @@ -64542,7 +63909,7 @@ "sjG" = ( /obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/plating, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "sjV" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/abandoned, @@ -64580,9 +63947,7 @@ /area/station/security/brig) "skI" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/warning/secure_area{ - pixel_y = -32 - }, +/obj/structure/sign/warning/secure_area/directional/south, /turf/open/floor/plating, /area/station/maintenance/disposal) "skM" = ( @@ -64634,7 +63999,7 @@ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "sls" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ @@ -64671,7 +64036,7 @@ /turf/open/floor/iron/chapel{ dir = 1 }, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "slC" = ( /turf/open/floor/iron, /area/station/hallway/secondary/entry) @@ -64770,7 +64135,7 @@ /obj/structure/flora/bush/ferny/style_random, /obj/structure/cable, /turf/open/floor/grass, -/area/station/security/prison) +/area/station/security/prison/garden) "sni" = ( /obj/structure/sign/warning/fire, /obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ @@ -64790,7 +64155,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/science/ordnance, /turf/open/floor/iron/dark/airless, -/area/station/science/mixing) +/area/station/science/ordnance/freezerchamber) "snw" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -64816,9 +64181,8 @@ }, /obj/structure/cable, /obj/structure/sign/poster/contraband/random/directional/north, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "snU" = ( /obj/effect/spawner/structure/window/reinforced, @@ -64841,13 +64205,16 @@ }, /obj/item/reagent_containers/food/drinks/bottle/beer{ desc = "A station exclusive. Consumption may result in seizures, blindness, drunkenness, or even death."; - list_reagents = list(/datum/reagent/consumable/ethanol/thirteenloko = 30); + list_reagents = list(/datum/reagent/consumable/ethanol/thirteenloko=30); name = "Kilo-Kocktail"; pixel_x = 5; pixel_y = 5 }, /turf/open/floor/carpet/green, /area/station/service/lawoffice) +"sok" = ( +/turf/closed/wall/rust, +/area/station/service/chapel) "son" = ( /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ @@ -64908,9 +64275,8 @@ dir = 4 }, /obj/machinery/power/apc/auto_name/directional/east, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/hallway/secondary/entry) "spm" = ( /turf/open/floor/iron/dark, @@ -64924,7 +64290,7 @@ dir = 1 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "spr" = ( /obj/effect/decal/cleanable/blood/old, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -64947,9 +64313,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "spE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -65047,9 +64412,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/light/directional/south, -/obj/structure/sign/departments/botany{ - pixel_y = -32 - }, +/obj/structure/sign/departments/botany/directional/south, /obj/effect/turf_decal/tile/green, /obj/effect/turf_decal/tile/blue{ dir = 8 @@ -65147,7 +64510,7 @@ "srs" = ( /obj/machinery/firealarm/directional/north, /turf/open/floor/iron/dark, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "srx" = ( /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -65276,7 +64639,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/chapel, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "ssU" = ( /obj/structure/flora/grass/jungle/a/style_random, /obj/effect/turf_decal/stripes/line{ @@ -65299,9 +64662,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/structure/steam_vent, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "suj" = ( /obj/machinery/door/airlock/external{ @@ -65363,18 +64725,9 @@ name = "atmospherics camera"; network = list("ss13","engine") }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/disposal/incinerator) -"svV" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/mining/glass{ - name = "Quartermaster" - }, -/obj/effect/mapping_helpers/airlock/access/all/supply/qm, -/turf/open/floor/iron/dark, -/area/station/cargo/qm) "svW" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/rack, @@ -65444,7 +64797,7 @@ }, /obj/machinery/newscaster/directional/west, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "sxi" = ( /turf/closed/wall/r_wall, /area/station/service/chapel/office) @@ -65512,7 +64865,7 @@ }, /obj/machinery/status_display/evac/directional/south, /turf/open/floor/grass, -/area/station/security/prison) +/area/station/security/prison/garden) "syu" = ( /obj/structure/sign/warning/deathsposal{ layer = 4 @@ -65686,7 +65039,7 @@ dir = 8 }, /turf/open/floor/engine/vacuum, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "sBO" = ( /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -65714,9 +65067,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /obj/structure/sign/poster/contraband/random/directional/west, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "sCa" = ( /obj/machinery/door/firedoor, @@ -65735,9 +65087,8 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /obj/structure/disposalpipe/segment, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/aft) "sCr" = ( /obj/structure/reagent_dispensers/fueltank, @@ -65848,7 +65199,7 @@ dir = 8 }, /turf/open/floor/iron/showroomfloor, -/area/station/science/mixing) +/area/station/science/ordnance) "sDq" = ( /obj/effect/turf_decal/bot, /obj/effect/decal/cleanable/dirt, @@ -65889,18 +65240,15 @@ dir = 8 }, /obj/structure/table, -/obj/structure/sign/warning/electric_shock{ - pixel_y = 32 - }, +/obj/structure/sign/warning/electric_shock/directional/north, /obj/item/storage/toolbox/electrical, /obj/item/assembly/flash/handheld, /obj/structure/cable, /turf/open/floor/engine, /area/station/ai_monitored/turret_protected/ai) "sEp" = ( -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/space/nearstation) "sEs" = ( /obj/item/storage/box/bodybags, @@ -66076,9 +65424,8 @@ }, /obj/structure/spider/stickyweb, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "sHC" = ( /obj/machinery/door/airlock/public/glass{ @@ -66238,6 +65585,12 @@ }, /turf/open/floor/iron/dark, /area/station/service/bar) +"sJD" = ( +/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/security/prison/garden) "sJH" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -66326,12 +65679,12 @@ dir = 8; pixel_x = 11 }, -/obj/item/reagent_containers/glass/bucket, +/obj/item/reagent_containers/glass/watering_can, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/garden) "sKA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -66351,7 +65704,7 @@ dir = 6 }, /turf/open/floor/iron/dark, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "sKV" = ( /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/red{ @@ -66521,9 +65874,7 @@ /area/station/service/hydroponics) "sMo" = ( /obj/structure/lattice, -/obj/structure/sign/warning/secure_area{ - pixel_x = 32 - }, +/obj/structure/sign/warning/secure_area/directional/east, /turf/open/space/basic, /area/space/nearstation) "sMI" = ( @@ -66537,13 +65888,17 @@ /obj/item/toy/figure/cmo, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/cmo) +"sMJ" = ( +/obj/effect/turf_decal/siding/thinplating/dark/end{ + dir = 4 + }, +/turf/open/floor/glass/reinforced, +/area/station/service/chapel) "sML" = ( /obj/machinery/door/airlock/public/glass{ name = "Engineering Hallway" }, -/obj/structure/sign/departments/engineering{ - pixel_x = 32 - }, +/obj/structure/sign/departments/engineering/directional/east, /obj/effect/turf_decal/delivery, /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark, @@ -66613,9 +65968,8 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/firealarm/directional/west, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/aft) "sNR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -66687,7 +66041,7 @@ "sOI" = ( /obj/structure/cable, /turf/open/floor/iron/dark, -/area/station/service/chapel/dock) +/area/station/service/chapel) "sOS" = ( /obj/structure/window/reinforced/spawner, /obj/effect/turf_decal/siding/green, @@ -66720,7 +66074,7 @@ "sPx" = ( /obj/machinery/light/directional/east, /turf/open/floor/iron/dark, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "sPG" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -66782,7 +66136,7 @@ /turf/open/floor/iron/stairs/medium{ dir = 4 }, -/area/station/service/chapel/dock) +/area/station/service/chapel) "sQw" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ @@ -66810,7 +66164,7 @@ /turf/open/floor/iron/chapel{ dir = 4 }, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "sQI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -66868,15 +66222,6 @@ }, /turf/open/floor/plating/airless, /area/space/nearstation) -"sRn" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, -/area/station/maintenance/starboard) "sRr" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -66902,9 +66247,8 @@ /obj/item/radio/intercom/directional/east, /obj/effect/spawner/random/structure/crate, /obj/machinery/status_display/evac/directional/north, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "sRL" = ( /obj/effect/decal/cleanable/dirt, @@ -66917,9 +66261,15 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/plating, /area/station/maintenance/aft) -"sRW" = ( -/turf/closed/wall, -/area/station/science/storage) +"sRY" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "chemistry_shutters"; + name = "Chemistry Lobby Shutters"; + dir = 1 + }, +/turf/open/floor/plating, +/area/station/medical/pharmacy) "sRZ" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -67037,7 +66387,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/showroomfloor, -/area/station/security/prison) +/area/station/security/execution/transfer) "sTv" = ( /obj/effect/decal/cleanable/dirt, /turf/closed/wall, @@ -67052,9 +66402,8 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/disposal/incinerator) "sTZ" = ( /obj/effect/turf_decal/tile/blue{ @@ -67087,9 +66436,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "sUB" = ( /obj/machinery/atmospherics/components/unary/passive_vent{ @@ -67111,9 +66459,8 @@ pixel_x = 4; pixel_y = 4 }, -/turf/open/floor/wood{ - icon_state = "wood-broken7" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/maintenance/starboard/fore) "sVh" = ( /turf/closed/wall/rust, @@ -67183,7 +66530,7 @@ /turf/open/floor/iron/stairs/left{ dir = 1 }, -/area/station/service/chapel/dock) +/area/station/service/chapel/monastery) "sVN" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -67296,10 +66643,6 @@ /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/iron/dark, /area/station/security/office) -"sWX" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron/dark, -/area/station/service/chapel/dock) "sXl" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -67412,11 +66755,14 @@ dir = 1 }, /turf/open/floor/iron/showroomfloor, -/area/station/science/mixing) +/area/station/science/ordnance) "sYM" = ( /obj/machinery/light/small/directional/south, /turf/open/floor/plating, -/area/station/service/chapel/dock) +/area/station/service/chapel) +"sYR" = ( +/turf/closed/wall/r_wall, +/area/station/security/prison/shower) "sZb" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -67497,9 +66843,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "sZL" = ( /obj/structure/disposalpipe/segment{ @@ -67526,9 +66871,8 @@ dir = 1 }, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "sZV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -67544,7 +66888,7 @@ dir = 1 }, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "tah" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -67584,15 +66928,6 @@ }, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/ce) -"taK" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/iron/dark, -/area/station/service/chapel/dock) "taM" = ( /obj/machinery/nuclearbomb/selfdestruct, /turf/open/floor/circuit/green{ @@ -67712,7 +67047,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/security/brig, /turf/open/floor/plating, -/area/station/security/prison) +/area/station/security/execution/transfer) "tcY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -67723,7 +67058,7 @@ "tdf" = ( /obj/machinery/camera/autoname/directional/north, /turf/open/floor/iron/dark, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "tdk" = ( /turf/closed/wall/rust, /area/station/commons/storage/art) @@ -67918,7 +67253,7 @@ dir = 1 }, /turf/open/floor/carpet/red, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "tfY" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -67971,12 +67306,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/warden) -"tgA" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, -/area/station/maintenance/disposal/incinerator) "tgU" = ( /obj/structure/flora/rock/pile/style_2, /turf/open/misc/asteroid/airless, @@ -68045,22 +67374,20 @@ dir = 1 }, /obj/effect/landmark/blobstart, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "thK" = ( /obj/structure/flora/bush/flowers_yw/style_random, /obj/effect/decal/cleanable/blood/old, /obj/structure/cable, /turf/open/floor/grass, -/area/station/security/prison) +/area/station/security/prison/garden) "thT" = ( /obj/structure/grille/broken, /obj/effect/spawner/random/structure/crate, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "thU" = ( /mob/living/simple_animal/hostile/asteroid/goliath, @@ -68083,9 +67410,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /obj/effect/spawner/random/structure/steam_vent, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "tiz" = ( /obj/effect/turf_decal/stripes/line{ @@ -68148,9 +67474,8 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/extinguisher_cabinet/directional/west, /obj/effect/landmark/blobstart, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "tjE" = ( /obj/structure/sign/departments/security, @@ -68205,9 +67530,8 @@ /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/structure/grille/broken, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "tkO" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ @@ -68228,9 +67552,8 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/cobweb, /obj/item/melee/moonlight_greatsword, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "tla" = ( /obj/effect/turf_decal/tile/blue{ @@ -68337,7 +67660,7 @@ /obj/machinery/light/directional/west, /obj/item/kirbyplants/random, /turf/open/floor/iron/dark, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "tmv" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/sign/poster/contraband/rebels_unite{ @@ -68364,13 +67687,6 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron/dark, /area/station/command/bridge) -"tmT" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, -/area/station/maintenance/port/greater) "tmU" = ( /obj/structure/grille, /obj/structure/barricade/wooden, @@ -68412,7 +67728,7 @@ "tng" = ( /obj/structure/urinal/directional/north, /turf/open/floor/plating/rust, -/area/station/security/prison) +/area/station/security/prison/shower) "tnk" = ( /obj/structure/chair/office{ dir = 1 @@ -68425,7 +67741,7 @@ dir = 1 }, /turf/open/floor/iron/showroomfloor, -/area/station/security/prison) +/area/station/security/execution/transfer) "tnp" = ( /obj/machinery/portable_atmospherics/canister/nitrous_oxide, /obj/effect/turf_decal/delivery, @@ -68460,7 +67776,7 @@ /obj/effect/turf_decal/siding/wideplating/dark/corner, /obj/structure/railing/corner, /turf/open/floor/iron/dark, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "tnC" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/stripes/line{ @@ -68539,7 +67855,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/power/apc/auto_name/directional/west, /turf/open/floor/carpet/red, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "toZ" = ( /obj/effect/turf_decal/bot, /obj/structure/tank_dispenser/oxygen{ @@ -68666,7 +67982,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/door/poddoor/shutters/preopen{ id = "justiceshutter"; - name = "Justice Shutter" + name = "Justice Shutter"; + dir = 4 }, /turf/open/floor/plating, /area/station/security/execution/education) @@ -68692,9 +68009,8 @@ /area/station/medical/chemistry) "tqx" = ( /obj/structure/sign/poster/contraband/random/directional/east, -/turf/open/floor/wood{ - icon_state = "wood-broken6" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/maintenance/port/fore) "tqz" = ( /turf/closed/wall/r_wall/rust, @@ -68703,7 +68019,7 @@ /obj/structure/railing, /obj/machinery/door/firedoor/border_only, /turf/open/floor/iron/dark, -/area/station/service/chapel/dock) +/area/station/service/chapel) "tqC" = ( /obj/machinery/computer/slot_machine, /obj/machinery/light/small/directional/east, @@ -68778,9 +68094,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/solars/starboard/aft) "tsg" = ( /turf/open/floor/iron, @@ -68916,9 +68231,8 @@ /obj/effect/decal/cleanable/vomit/old, /obj/structure/sign/poster/contraband/random/directional/north, /mob/living/simple_animal/hostile/retaliate/goose/vomit, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "tur" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ @@ -68939,7 +68253,7 @@ /obj/machinery/portable_atmospherics/canister, /obj/structure/cable, /turf/open/floor/iron/dark, -/area/station/science/storage) +/area/station/science/ordnance/storage) "tuF" = ( /obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/yellow{ @@ -68970,9 +68284,8 @@ "tuR" = ( /obj/structure/girder, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "tuT" = ( /obj/machinery/holopad, @@ -68987,6 +68300,15 @@ }, /turf/open/space/basic, /area/space/nearstation) +"tvL" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "detective_shutters"; + name = "Detective's Office Shutter"; + dir = 8 + }, +/turf/open/floor/plating, +/area/station/security/detectives_office) "twc" = ( /obj/effect/turf_decal/plaque{ icon_state = "L13" @@ -69128,9 +68450,8 @@ "txQ" = ( /obj/effect/decal/cleanable/dirt, /obj/item/shard, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "tya" = ( /obj/effect/turf_decal/tile/neutral{ @@ -69163,9 +68484,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "tyI" = ( /obj/effect/turf_decal/stripes/line{ @@ -69293,16 +68613,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/cafeteria, -/area/station/security/prison) -"tAt" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, -/area/station/maintenance/fore) +/area/station/security/prison/garden) "tAx" = ( /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ @@ -69326,9 +68637,8 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /obj/machinery/meter/layer2, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "tAI" = ( /obj/effect/turf_decal/bot, @@ -69343,13 +68653,10 @@ /turf/open/floor/iron/dark, /area/station/construction/mining/aux_base) "tAJ" = ( -/obj/structure/sign/warning/electric_shock{ - pixel_y = 32 - }, +/obj/structure/sign/warning/electric_shock/directional/north, /obj/effect/turf_decal/stripes/corner, -/turf/open/floor/wood{ - icon_state = "wood-broken3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/maintenance/port/fore) "tAN" = ( /obj/effect/decal/cleanable/dirt, @@ -69376,7 +68683,7 @@ /area/station/medical/chemistry) "tAU" = ( /turf/closed/wall/r_wall/rust, -/area/station/science/storage) +/area/station/science/ordnance/storage) "tAX" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -69432,15 +68739,15 @@ /obj/effect/decal/cleanable/cobweb, /obj/structure/cable, /obj/structure/sign/poster/contraband/random/directional/north, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "tBH" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ id = "research_shutters"; - name = "Research Privacy Shutter" + name = "Research Privacy Shutter"; + dir = 8 }, /turf/open/floor/plating, /area/station/science/lab) @@ -69558,9 +68865,8 @@ dir = 8 }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/disposal) "tDs" = ( /obj/effect/turf_decal/tile/red, @@ -69683,7 +68989,7 @@ /obj/item/radio/intercom/directional/east, /obj/effect/turf_decal/delivery, /turf/open/floor/iron/dark, -/area/station/science/misc_lab) +/area/station/science/ordnance/office) "tFb" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -69735,6 +69041,10 @@ }, /turf/open/floor/iron/dark, /area/station/science/genetics) +"tFR" = ( +/obj/structure/sign/warning/electric_shock, +/turf/closed/wall/r_wall, +/area/station/security/execution/transfer) "tGb" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -69772,7 +69082,7 @@ pixel_y = 13 }, /turf/open/floor/plating/rust, -/area/station/security/prison) +/area/station/security/prison/shower) "tGx" = ( /obj/machinery/door/poddoor/preopen{ id = "Xenolab"; @@ -69797,10 +69107,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /obj/structure/sign/poster/contraband/random/directional/east, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) +"tGH" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/security/prison/mess) "tGQ" = ( /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -69874,14 +69188,11 @@ dir = 5 }, /obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/structure/sign/warning/vacuum/external{ - pixel_x = 32 - }, +/obj/structure/sign/warning/vacuum/external/directional/east, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/solars/starboard/fore) "tHO" = ( /obj/structure/reflector/box/anchored{ @@ -69895,9 +69206,7 @@ /area/station/engineering/supermatter/room) "tHT" = ( /obj/machinery/computer/bank_machine, -/obj/structure/sign/warning/secure_area{ - pixel_y = 32 - }, +/obj/structure/sign/warning/secure_area/directional/north, /obj/machinery/light/small/directional/north, /turf/open/floor/circuit/green{ luminosity = 2 @@ -69920,9 +69229,8 @@ color = "#c45c57" }, /obj/effect/decal/cleanable/cobweb/cobweb2, -/turf/open/floor/wood{ - icon_state = "wood-broken5" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/maintenance/starboard/fore) "tIr" = ( /turf/closed/wall/rust, @@ -69987,16 +69295,13 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/aft) "tKn" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored{ - chamber_id = "ordnancegas1" - }, +/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/ordnance_burn_chamber_input, /turf/open/floor/engine/vacuum, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "tKt" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -70044,7 +69349,7 @@ dir = 5 }, /turf/open/floor/iron/dark/airless, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/freezerchamber) "tKS" = ( /obj/structure/table, /obj/item/clipboard, @@ -70084,9 +69389,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "tMl" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -70136,6 +69440,12 @@ /obj/effect/spawner/random/maintenance/two, /turf/open/floor/iron, /area/station/cargo/storage) +"tNt" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/service/chapel) "tNB" = ( /obj/effect/turf_decal/tile/yellow{ dir = 4 @@ -70155,7 +69465,7 @@ /area/station/engineering/atmos) "tNO" = ( /obj/structure/cable, -/obj/structure/musician/piano, +/obj/effect/spawner/random/structure/musician/piano/random_piano, /obj/effect/turf_decal/siding/wood{ dir = 8 }, @@ -70216,9 +69526,7 @@ /turf/open/floor/iron, /area/station/security/processing) "tOh" = ( -/obj/structure/sign/warning/electric_shock{ - pixel_y = -32 - }, +/obj/structure/sign/warning/electric_shock/directional/south, /obj/structure/flora/bush/pale/style_random, /obj/machinery/light/small/directional/south, /obj/effect/turf_decal/sand/plating, @@ -70230,7 +69538,7 @@ /obj/structure/cable, /obj/item/food/sausage, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "tOr" = ( /obj/effect/turf_decal/delivery, /obj/structure/reagent_dispensers/watertank, @@ -70303,9 +69611,8 @@ }, /obj/machinery/light/small/directional/west, /obj/machinery/meter/layer4, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "tPz" = ( /obj/effect/decal/cleanable/dirt, @@ -70409,7 +69716,7 @@ }, /obj/effect/turf_decal/tile/purple/half/contrasted, /turf/open/floor/iron/showroomfloor, -/area/station/science/mixing) +/area/station/science/ordnance) "tQI" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/stripes/box, @@ -70506,15 +69813,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, -/area/station/service/chapel/dock) -"tTW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, -/area/station/maintenance/port/lesser) +/area/station/service/chapel) "tTY" = ( /obj/structure/grille/broken, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -70524,9 +69823,8 @@ dir = 4 }, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "tUc" = ( /obj/effect/turf_decal/tile/yellow, @@ -70577,7 +69875,7 @@ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/service/chapel/dock) +/area/station/service/chapel) "tUR" = ( /obj/structure/railing{ dir = 8 @@ -70586,7 +69884,7 @@ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "tUV" = ( /obj/structure/table, /obj/machinery/firealarm/directional/north, @@ -70599,9 +69897,8 @@ "tVr" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/structure/girder, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "tVt" = ( /obj/structure/rack, @@ -70652,7 +69949,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/security/brig, /turf/open/floor/iron/dark, -/area/station/security/prison) +/area/station/security/execution/transfer) "tVS" = ( /obj/effect/turf_decal/bot, /obj/machinery/computer/prisoner/management{ @@ -70723,9 +70020,8 @@ /obj/structure/disposalpipe/segment{ dir = 5 }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/aft) "tWL" = ( /obj/machinery/door/poddoor/preopen{ @@ -70804,9 +70100,8 @@ /obj/effect/turf_decal/stripes/corner{ dir = 4 }, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "tXR" = ( /obj/effect/turf_decal/tile/blue, @@ -70965,9 +70260,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /obj/effect/spawner/random/trash/grille_or_waste, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "tZs" = ( /obj/effect/turf_decal/tile/neutral{ @@ -71039,9 +70333,8 @@ /turf/open/misc/asteroid, /area/station/maintenance/port/lesser) "uan" = ( -/turf/open/floor/wood{ - icon_state = "wood-broken6" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/maintenance/starboard/fore) "uap" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -71053,8 +70346,9 @@ /obj/machinery/shower{ dir = 4 }, +/obj/structure/cable, /turf/open/floor/plastic, -/area/station/security/prison) +/area/station/security/prison/shower) "ubt" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -71157,9 +70451,8 @@ /area/station/hallway/primary/starboard) "uco" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "ucP" = ( /obj/effect/decal/cleanable/dirt, @@ -71230,8 +70523,8 @@ /turf/open/floor/iron/dark, /area/station/medical/virology) "udT" = ( -/obj/machinery/door/airlock/external{ - name = "Supply Dock Airlock" +/obj/machinery/door/airlock/external/glass{ + name = "Supply Door Airlock" }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -71302,7 +70595,7 @@ "ueU" = ( /obj/effect/turf_decal/tile/purple/half/contrasted, /turf/open/floor/iron/showroomfloor, -/area/station/science/mixing) +/area/station/science/ordnance) "ueZ" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -71405,9 +70698,8 @@ "ufI" = ( /obj/structure/chair/stool/bar/directional/west, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "ufL" = ( /obj/item/radio/intercom/directional/north, @@ -71528,6 +70820,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/hallway/secondary/service) +"ugU" = ( +/obj/machinery/shower{ + dir = 8 + }, +/turf/open/floor/plastic, +/area/station/security/prison/shower) "uhp" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ dir = 4 @@ -71600,15 +70898,15 @@ /area/space/nearstation) "ujh" = ( /obj/structure/curtain, -/turf/open/floor/plating, -/area/station/security/prison) +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/security/prison/shower) "ujH" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/girder/displaced, /obj/structure/grille/broken, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "ujM" = ( /obj/structure/table, @@ -71620,7 +70918,7 @@ pixel_x = 6 }, /turf/open/floor/iron/dark, -/area/station/science/misc_lab) +/area/station/science/ordnance/office) "ujN" = ( /obj/structure/table/reinforced, /obj/effect/turf_decal/delivery, @@ -71696,7 +70994,7 @@ /obj/machinery/airalarm/directional/west, /obj/structure/disposalpipe/segment, /turf/open/floor/carpet/red, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "ukT" = ( /obj/structure/sign/warning/no_smoking, /turf/closed/wall, @@ -71782,9 +71080,7 @@ /obj/effect/turf_decal/stripes/corner{ dir = 1 }, -/obj/structure/sign/warning/secure_area{ - pixel_x = -32 - }, +/obj/structure/sign/warning/secure_area/directional/west, /obj/structure/disposalpipe/trunk{ dir = 1 }, @@ -72064,21 +71360,22 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ cycle_id = "cargo-mailroom" }, -/obj/effect/mapping_helpers/airlock/access/all/supply/general, +/obj/effect/mapping_helpers/airlock/access/all/supply/shipping, /turf/open/floor/iron/dark, /area/station/cargo/sorting) "upB" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters{ id = "visitation"; - name = "Visitation Shutters" + name = "Visitation Shutters"; + dir = 1 }, /turf/open/floor/plating, -/area/station/security/prison) +/area/station/security/execution/transfer) "upK" = ( /obj/effect/turf_decal/siding/thinplating/dark/end, /turf/open/floor/glass/reinforced, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "upW" = ( /obj/structure/cable, /turf/open/floor/engine, @@ -72170,15 +71467,15 @@ /obj/machinery/door/window/left/directional/west{ dir = 4; name = "Cargo Desk"; - req_access = list("mail_sorting") + req_access = list("shipping") }, /obj/item/clipboard{ - pixel_y = -2; - pixel_x = 3 + pixel_x = 3; + pixel_y = -2 }, /obj/item/folder{ - pixel_y = -2; - pixel_x = 3 + pixel_x = 3; + pixel_y = -2 }, /obj/structure/desk_bell{ pixel_x = -8; @@ -72196,7 +71493,7 @@ /turf/open/floor/iron/chapel{ dir = 8 }, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "urx" = ( /obj/structure/table, /obj/machinery/recharger, @@ -72214,9 +71511,8 @@ dir = 4 }, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "urA" = ( /obj/effect/turf_decal/sand/plating, @@ -72288,9 +71584,8 @@ }, /obj/structure/cable, /obj/effect/spawner/random/structure/steam_vent, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "usX" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -72355,9 +71650,8 @@ "utP" = ( /obj/effect/decal/cleanable/blood/gibs/old, /obj/effect/decal/cleanable/blood/old, -/turf/open/floor/wood{ - icon_state = "wood-broken3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/maintenance/port/fore) "utU" = ( /obj/effect/turf_decal/tile/brown, @@ -72549,9 +71843,8 @@ }, /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small/directional/west, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/disposal) "uxw" = ( /obj/effect/landmark/start/hangover, @@ -72576,9 +71869,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/sign/poster/contraband/random/directional/north, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/aft) "uxz" = ( /obj/structure/chair, @@ -72595,9 +71887,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/structure/sign/warning/electric_shock{ - pixel_y = -32 - }, +/obj/structure/sign/warning/electric_shock/directional/south, /obj/effect/turf_decal/siding/red/corner{ dir = 4 }, @@ -72613,7 +71903,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "uxN" = ( /turf/closed/wall/r_wall, /area/station/ai_monitored/command/nuke_storage) @@ -72680,9 +71970,7 @@ /obj/structure/reagent_dispensers/fueltank, /obj/effect/turf_decal/bot, /obj/structure/extinguisher_cabinet/directional/east, -/obj/structure/sign/warning/fire{ - pixel_y = 32 - }, +/obj/structure/sign/warning/fire/directional/north, /turf/open/floor/iron/dark, /area/station/command/teleporter) "uAn" = ( @@ -72691,7 +71979,7 @@ dir = 1 }, /turf/open/floor/glass/reinforced, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "uAt" = ( /obj/machinery/door/airlock/atmos/glass, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -72735,13 +72023,13 @@ /turf/open/floor/iron/stairs/left{ dir = 4 }, -/area/station/service/chapel/dock) +/area/station/service/chapel/monastery) "uAQ" = ( /obj/structure/table, /obj/item/kitchen/fork/plastic, /obj/structure/cable, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "uAS" = ( /obj/effect/turf_decal/bot, /obj/effect/decal/cleanable/dirt, @@ -72769,15 +72057,12 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/sign/poster/contraband/random/directional/south, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "uBG" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/warning/electric_shock{ - pixel_y = 32 - }, +/obj/structure/sign/warning/electric_shock/directional/north, /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/fore) @@ -72787,9 +72072,8 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /obj/structure/sign/poster/contraband/random/directional/south, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "uBO" = ( /obj/effect/decal/cleanable/dirt, @@ -72869,9 +72153,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "uCQ" = ( /obj/effect/decal/cleanable/cobweb, @@ -72908,16 +72191,6 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/iron/recharge_floor, /area/station/service/chapel/storage) -"uDh" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, -/area/station/maintenance/port/aft) "uDi" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/neutral, @@ -72988,7 +72261,7 @@ "uEC" = ( /obj/effect/turf_decal/siding/wideplating/dark/corner, /turf/open/floor/iron/dark, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "uEL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -72997,9 +72270,8 @@ /obj/structure/disposalpipe/segment{ dir = 10 }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "uEX" = ( /obj/effect/turf_decal/tile/green, @@ -73070,7 +72342,7 @@ /area/station/science/robotics/mechbay) "uFm" = ( /turf/closed/indestructible/opshuttle, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "uFp" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -73082,7 +72354,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /turf/open/floor/iron/showroomfloor, -/area/station/security/prison) +/area/station/security/execution/transfer) "uFM" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, @@ -73095,9 +72367,8 @@ /obj/effect/turf_decal/delivery, /obj/structure/closet/crate, /obj/effect/spawner/random/maintenance/two, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "uGn" = ( /obj/machinery/atmospherics/components/tank/air, @@ -73225,9 +72496,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, -/turf/open/floor/wood{ - icon_state = "wood-broken4" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/maintenance/port/fore) "uIh" = ( /obj/machinery/power/solar_control{ @@ -73239,14 +72509,11 @@ /obj/effect/turf_decal/stripes/line{ dir = 6 }, -/obj/structure/sign/warning/vacuum{ - pixel_x = 32 - }, +/obj/structure/sign/warning/vacuum/directional/east, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/solars/starboard/aft) "uIs" = ( /obj/machinery/turretid{ @@ -73275,9 +72542,8 @@ "uIA" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/structure/crate, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "uJa" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ @@ -73295,7 +72561,7 @@ /obj/item/radio/intercom/directional/east, /obj/structure/sign/poster/random/directional/north, /turf/open/floor/iron/showroomfloor, -/area/station/science/mixing) +/area/station/science/ordnance) "uJg" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/decal/cleanable/dirt, @@ -73426,9 +72692,8 @@ "uKJ" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/blood/old, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "uKO" = ( /obj/effect/turf_decal/tile/red{ @@ -73545,7 +72810,7 @@ /obj/item/clothing/under/rank/prisoner/skirt, /obj/item/clothing/under/rank/prisoner/skirt, /turf/open/floor/iron/cafeteria, -/area/station/security/prison) +/area/station/security/prison/garden) "uMc" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/tile/neutral{ @@ -73606,9 +72871,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/structure/sign/departments/restroom{ - pixel_x = 32 - }, +/obj/structure/sign/departments/restroom/directional/east, /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/trunk, /turf/open/floor/iron/dark, @@ -73617,7 +72880,7 @@ /obj/effect/turf_decal/tile/red/half/contrasted, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/showroomfloor, -/area/station/science/storage) +/area/station/science/ordnance/storage) "uNe" = ( /obj/structure/table, /obj/item/reagent_containers/food/condiment/peppermill{ @@ -73631,15 +72894,14 @@ dir = 1 }, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "uNt" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "uNv" = ( /obj/machinery/power/turbine/turbine_outlet, @@ -73676,7 +72938,7 @@ "uOd" = ( /obj/item/kirbyplants/random, /turf/open/floor/iron/dark, -/area/station/service/chapel/dock) +/area/station/service/chapel/monastery) "uOe" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -73685,9 +72947,8 @@ /obj/structure/disposalpipe/segment{ dir = 6 }, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "uOj" = ( /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, @@ -73695,7 +72956,7 @@ dir = 8 }, /turf/open/floor/iron/showroomfloor, -/area/station/science/storage) +/area/station/science/ordnance/storage) "uOo" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -73738,12 +72999,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/engine, /area/station/engineering/gravity_generator) -"uPH" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/service/chapel/monastery) "uPM" = ( /obj/machinery/door/airlock/public/glass{ name = "Security Hallway" @@ -73769,9 +73024,8 @@ /area/station/engineering/atmos/pumproom) "uQi" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/aft) "uQj" = ( /obj/effect/turf_decal/tile/neutral{ @@ -73842,9 +73096,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/structure/sign/departments/chemistry{ - pixel_x = -32 - }, +/obj/structure/sign/departments/chemistry/directional/west, /obj/machinery/light/directional/west, /turf/open/floor/iron, /area/station/hallway/primary/port) @@ -73912,14 +73164,11 @@ /area/station/service/bar/atrium) "uRZ" = ( /obj/machinery/power/port_gen/pacman, -/obj/structure/sign/warning/electric_shock{ - pixel_y = 32 - }, +/obj/structure/sign/warning/electric_shock/directional/north, /obj/machinery/light/directional/north, /obj/structure/cable/layer3, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/ai_monitored/command/storage/satellite) "uSk" = ( /obj/effect/turf_decal/tile/blue{ @@ -73936,6 +73185,14 @@ /obj/machinery/status_display/ai/directional/west, /turf/open/floor/iron, /area/station/hallway/primary/aft) +"uSE" = ( +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/obj/effect/turf_decal/caution/stand_clear, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter) "uSH" = ( /turf/closed/wall/r_wall, /area/station/engineering/main) @@ -73958,15 +73215,14 @@ /obj/structure/table/reinforced, /obj/structure/reagent_dispensers/servingdish, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "uTs" = ( /obj/structure/girder, /obj/effect/decal/cleanable/dirt, /obj/structure/grille/broken, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "uTt" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -73994,7 +73250,7 @@ }, /obj/machinery/portable_atmospherics/scrubber, /turf/open/floor/iron/showroomfloor, -/area/station/science/mixing) +/area/station/science/ordnance) "uTG" = ( /obj/structure/table, /obj/effect/turf_decal/tile/neutral, @@ -74039,6 +73295,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/mapping_helpers/airlock/access/all/engineering/tech_storage, +/obj/effect/mapping_helpers/airlock/access/all/command/general, /turf/open/floor/iron/dark, /area/station/engineering/storage/tech) "uUm" = ( @@ -74091,14 +73348,13 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "uVK" = ( /obj/machinery/bluespace_vendor/directional/north, /turf/open/floor/iron/dark, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "uVQ" = ( /turf/closed/wall, /area/station/maintenance/solars/starboard/fore) @@ -74306,9 +73562,8 @@ /obj/structure/disposalpipe/segment{ dir = 9 }, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "uZg" = ( /obj/structure/sign/warning/electric_shock, @@ -74411,9 +73666,8 @@ dir = 9 }, /obj/effect/decal/cleanable/generic, -/turf/open/floor/wood{ - icon_state = "wood-broken5" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/maintenance/department/crew_quarters/bar) "vao" = ( /obj/effect/turf_decal/tile/purple, @@ -74447,9 +73701,8 @@ dir = 4 }, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "vaz" = ( /obj/effect/turf_decal/tile/yellow{ @@ -74505,9 +73758,8 @@ pixel_x = -6; pixel_y = -1 }, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/department/bridge) "vba" = ( /obj/machinery/computer/secure_data{ @@ -74660,7 +73912,7 @@ dir = 4 }, /turf/open/floor/iron/showroomfloor, -/area/station/science/misc_lab) +/area/station/science/ordnance/office) "vcL" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/airalarm/directional/south, @@ -74677,9 +73929,8 @@ dir = 1 }, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "vdy" = ( /obj/machinery/door/morgue{ @@ -74688,7 +73939,7 @@ }, /obj/effect/turf_decal/siding/wood, /turf/open/floor/wood/parquet, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "vdK" = ( /obj/structure/flora/bush/pale/style_random{ icon_state = "fullgrass_2" @@ -74749,19 +74000,15 @@ /obj/structure/disposalpipe/segment{ dir = 5 }, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/aft) "veF" = ( -/obj/structure/sign/warning/secure_area{ - pixel_y = -32 - }, +/obj/structure/sign/warning/secure_area/directional/south, /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/structure/crate, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/aft) "veN" = ( /obj/machinery/door/firedoor, @@ -74813,7 +74060,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/engineering/construction, +/obj/effect/mapping_helpers/airlock/access/all/command/minisat, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat/foyer) "vfb" = ( @@ -74867,9 +74114,8 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/hallway/secondary/entry) "vgd" = ( /obj/effect/turf_decal/bot, @@ -74914,9 +74160,8 @@ /obj/effect/decal/cleanable/blood/old, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/department/medical/central) "vgU" = ( /obj/effect/turf_decal/tile/red, @@ -74983,9 +74228,8 @@ "vho" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "vhp" = ( /obj/machinery/door/firedoor, @@ -75032,7 +74276,7 @@ /obj/machinery/airalarm/directional/north, /obj/machinery/light/directional/north, /turf/open/floor/iron/dark, -/area/station/service/chapel/dock) +/area/station/service/chapel/monastery) "viq" = ( /obj/structure/lattice/catwalk, /obj/structure/railing, @@ -75047,7 +74291,7 @@ "viL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/showroomfloor, -/area/station/science/mixing) +/area/station/science/ordnance) "viM" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -75151,7 +74395,7 @@ dir = 6 }, /turf/open/floor/engine/vacuum, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "vkL" = ( /obj/structure/railing{ dir = 1 @@ -75226,7 +74470,7 @@ "vlQ" = ( /obj/structure/sign/warning/electric_shock, /turf/closed/wall/r_wall/rust, -/area/station/security/prison) +/area/station/security/prison/garden) "vme" = ( /obj/effect/turf_decal/tile/green{ dir = 1 @@ -75249,9 +74493,7 @@ dir = 1 }, /obj/effect/turf_decal/tile/yellow, -/obj/structure/sign/departments/chemistry{ - pixel_x = -32 - }, +/obj/structure/sign/departments/chemistry/directional/west, /obj/effect/turf_decal/stripes/line, /obj/structure/disposalpipe/segment, /turf/open/floor/iron/showroomfloor, @@ -75286,7 +74528,6 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/machinery/light/directional/south, /obj/machinery/status_display/supply{ pixel_y = -32 }, @@ -75398,9 +74639,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "vou" = ( /obj/machinery/disposal/bin, @@ -75552,9 +74792,7 @@ /area/station/tcommsat/computer) "vqJ" = ( /obj/structure/flora/bush/pale/style_random, -/obj/structure/sign/warning/electric_shock{ - pixel_y = -32 - }, +/obj/structure/sign/warning/electric_shock/directional/south, /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating, /area/space/nearstation) @@ -75616,16 +74854,13 @@ dir = 4 }, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "vrl" = ( /obj/machinery/power/smes, /obj/effect/decal/cleanable/dirt, -/obj/structure/sign/warning/electric_shock{ - pixel_y = -32 - }, +/obj/structure/sign/warning/electric_shock/directional/south, /obj/structure/spider/stickyweb, /obj/structure/cable, /turf/open/floor/plating, @@ -75675,9 +74910,8 @@ /obj/item/shard, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "vsb" = ( /obj/effect/spawner/structure/window/reinforced, @@ -75700,7 +74934,8 @@ /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ id = "Shower_2Privacy"; - name = "Shower 2 Privacy Shutter" + name = "Shower 2 Privacy Shutter"; + dir = 1 }, /turf/open/floor/plating, /area/station/commons/toilet/restrooms) @@ -75854,9 +75089,8 @@ "vuz" = ( /obj/structure/girder, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/aft) "vuF" = ( /obj/machinery/light_switch/directional/west, @@ -75893,6 +75127,11 @@ "vuQ" = ( /turf/closed/wall/r_wall, /area/station/hallway/primary/starboard) +"vva" = ( +/obj/structure/cable, +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/station/solars/port/fore) "vvd" = ( /obj/machinery/mech_bay_recharge_port, /obj/machinery/airalarm/directional/west, @@ -75992,12 +75231,6 @@ dir = 8 }, /area/station/service/chapel/funeral) -"vvT" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, -/area/station/maintenance/starboard/aft) "vwe" = ( /obj/structure/table, /obj/effect/turf_decal/tile/neutral{ @@ -76040,7 +75273,7 @@ }, /obj/structure/cable, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/garden) "vww" = ( /turf/open/floor/iron, /area/station/engineering/lobby) @@ -76170,9 +75403,8 @@ /area/station/science/xenobiology) "vyt" = ( /obj/structure/closet/cardboard, -/turf/open/floor/wood{ - icon_state = "wood-broken4" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/maintenance/port/fore) "vyD" = ( /obj/effect/turf_decal/tile/purple, @@ -76281,7 +75513,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "vzy" = ( /turf/closed/wall, /area/station/service/janitor) @@ -76306,9 +75538,8 @@ dir = 6 }, /obj/structure/sign/poster/contraband/random/directional/west, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "vzQ" = ( /obj/effect/turf_decal/stripes/line{ @@ -76365,7 +75596,7 @@ /obj/machinery/light/small/directional/west, /obj/item/radio/intercom/chapel/directional/north, /turf/open/floor/wood/parquet, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "vAw" = ( /obj/machinery/vending/wardrobe/chef_wardrobe, /obj/effect/turf_decal/bot, @@ -76478,7 +75709,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/airalarm/directional/east, /turf/open/floor/iron/showroomfloor, -/area/station/science/mixing) +/area/station/science/ordnance) "vCi" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -76497,7 +75728,8 @@ }, /obj/machinery/door/poddoor/shutters/preopen{ id = "justiceshutter"; - name = "Justice Shutter" + name = "Justice Shutter"; + dir = 4 }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, @@ -76526,9 +75758,8 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/department/crew_quarters/bar) "vCA" = ( /obj/effect/landmark/start/hangover, @@ -76629,7 +75860,7 @@ dir = 8 }, /turf/open/floor/glass/reinforced, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "vEC" = ( /obj/effect/turf_decal/sand/plating, /obj/structure/disposalpipe/segment{ @@ -76637,9 +75868,6 @@ }, /turf/open/floor/plating/airless, /area/space/nearstation) -"vEK" = ( -/turf/closed/wall, -/area/station/science/mixing) "vEW" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -76684,7 +75912,7 @@ /obj/structure/table, /obj/machinery/microwave, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "vFv" = ( /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ @@ -76776,9 +76004,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "vGJ" = ( /obj/effect/turf_decal/tile/yellow{ @@ -76883,6 +76110,9 @@ }, /turf/open/floor/plating, /area/station/engineering/atmos) +"vIq" = ( +/turf/closed/wall/r_wall/rust, +/area/station/service/chapel) "vIE" = ( /obj/machinery/camera/directional/west{ c_tag = "Atmospherics Tank - Mix"; @@ -76951,9 +76181,8 @@ /area/station/hallway/secondary/entry) "vJs" = ( /obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/cargo/drone_bay) "vJA" = ( /obj/effect/turf_decal/tile/neutral{ @@ -77173,9 +76402,8 @@ name = "Disposal Bay Door" }, /obj/structure/fans/tiny, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/disposal) "vLI" = ( /turf/closed/wall/r_wall/rust, @@ -77294,7 +76522,7 @@ dir = 1 }, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "vNl" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -77355,9 +76583,8 @@ network = list("ss13","engine") }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/engineering/supermatter/room) "vOq" = ( /obj/structure/table, @@ -77396,7 +76623,7 @@ "vOy" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/closed/wall/r_wall, -/area/station/science/misc_lab) +/area/station/science/ordnance/office) "vOH" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -77481,7 +76708,8 @@ /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ id = "chem_lockdown"; - name = "Chemistry Shutters" + name = "Chemistry Shutters"; + dir = 4 }, /turf/open/floor/plating, /area/station/maintenance/port/greater) @@ -77499,7 +76727,7 @@ /obj/structure/flora/bush/leavy/style_random, /obj/structure/cable, /turf/open/floor/grass, -/area/station/security/prison) +/area/station/security/prison/garden) "vPL" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -77563,9 +76791,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "vQf" = ( /obj/effect/turf_decal/tile/red, @@ -77605,9 +76832,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /obj/structure/disposalpipe/segment, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "vRl" = ( /obj/effect/turf_decal/tile/red{ @@ -77750,7 +76976,7 @@ "vSG" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/station/service/chapel/dock) +/area/station/service/chapel/monastery) "vSM" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -77758,9 +76984,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/engineering/supermatter/room) "vSU" = ( /obj/structure/grille/broken, @@ -77771,9 +76996,8 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/aft) "vTs" = ( /obj/machinery/hydroponics/constructable, @@ -77795,9 +77019,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/light/directional/west, -/obj/structure/sign/departments/botany{ - pixel_x = -32 - }, +/obj/structure/sign/departments/botany/directional/west, /obj/effect/turf_decal/tile/green{ dir = 1 }, @@ -77830,19 +77052,17 @@ }, /obj/effect/decal/cleanable/cobweb, /obj/effect/spawner/random/maintenance, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "vUi" = ( -/obj/machinery/airalarm/directional/north, /obj/machinery/door/firedoor/border_only{ dir = 8 }, /turf/open/floor/iron/stairs/right{ dir = 4 }, -/area/station/service/chapel/dock) +/area/station/service/chapel) "vUo" = ( /obj/structure/sign/departments/medbay/alt, /turf/closed/wall/rust, @@ -77955,9 +77175,8 @@ name = "Cabin 3 Privacy Toggle"; pixel_y = -24 }, -/turf/open/floor/wood{ - icon_state = "wood-broken5" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/commons/locker) "vUY" = ( /obj/effect/turf_decal/tile/neutral{ @@ -77978,9 +77197,8 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/corner, /obj/effect/spawner/random/structure/crate, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "vVt" = ( /obj/effect/turf_decal/tile/red{ @@ -78178,7 +77396,7 @@ dir = 4 }, /turf/open/floor/iron/showroomfloor, -/area/station/science/mixing/hallway) +/area/station/science/ordnance) "vXI" = ( /obj/effect/turf_decal/tile/yellow{ dir = 4 @@ -78201,9 +77419,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/stripes/line, /obj/structure/sign/poster/contraband/random/directional/north, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "vYn" = ( /obj/effect/turf_decal/tile/red, @@ -78260,7 +77477,7 @@ "vZn" = ( /obj/structure/flora/bush/sparsegrass/style_random, /turf/open/floor/grass, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "vZu" = ( /obj/effect/turf_decal/tile/yellow{ dir = 4 @@ -78309,7 +77526,7 @@ /area/station/hallway/primary/starboard) "vZM" = ( /turf/closed/wall/rust, -/area/station/security/prison) +/area/station/security/execution/transfer) "wae" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/monitored/mix_input{ dir = 1 @@ -78324,9 +77541,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/grille/broken, /obj/effect/spawner/random/structure/crate, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "waq" = ( /obj/effect/decal/cleanable/dirt, @@ -78365,16 +77581,16 @@ /turf/open/floor/iron/chapel{ dir = 8 }, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "wat" = ( /obj/machinery/portable_atmospherics/canister/carbon_dioxide, /obj/structure/cable, /turf/open/floor/iron/dark, -/area/station/science/storage) +/area/station/science/ordnance/storage) "waF" = ( /obj/machinery/portable_atmospherics/canister/plasma, /turf/open/floor/iron/dark, -/area/station/science/storage) +/area/station/science/ordnance/storage) "waI" = ( /obj/structure/table, /obj/effect/turf_decal/tile/neutral{ @@ -78518,9 +77734,8 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/aft) "wcC" = ( /obj/effect/turf_decal/tile/blue{ @@ -78651,9 +77866,8 @@ }, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "wer" = ( /obj/machinery/conveyor{ @@ -78727,6 +77941,11 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"wfe" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/security/execution/transfer) "wfk" = ( /obj/effect/turf_decal/bot, /obj/machinery/holopad, @@ -78752,9 +77971,8 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "wgq" = ( /obj/structure/table, @@ -78787,7 +78005,7 @@ dir = 8 }, /turf/open/floor/iron/dark, -/area/station/service/chapel/dock) +/area/station/service/chapel/monastery) "wgO" = ( /obj/structure/table, /obj/effect/turf_decal/tile/neutral, @@ -78859,10 +78077,6 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron/dark, /area/station/maintenance/department/bridge) -"whD" = ( -/obj/structure/lattice/catwalk, -/turf/open/floor/plating/airless, -/area/station/solars/port/aft) "whP" = ( /obj/machinery/vending/engivend, /obj/effect/turf_decal/tile/neutral{ @@ -78885,7 +78099,7 @@ }, /obj/machinery/light/directional/north, /turf/open/floor/iron/dark, -/area/station/service/chapel/dock) +/area/station/service/chapel/monastery) "wiw" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -78985,9 +78199,7 @@ charge = 5e+006 }, /obj/machinery/light/small/directional/north, -/obj/structure/sign/warning/electric_shock{ - pixel_y = 32 - }, +/obj/structure/sign/warning/electric_shock/directional/north, /obj/structure/cable, /turf/open/floor/circuit/red/telecomms, /area/station/tcommsat/server) @@ -79096,9 +78308,7 @@ dir = 4 }, /obj/effect/turf_decal/tile/purple, -/obj/structure/sign/departments/science{ - pixel_x = 32 - }, +/obj/structure/sign/departments/science/directional/east, /turf/open/floor/iron, /area/station/hallway/primary/starboard) "wli" = ( @@ -79109,10 +78319,9 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/space/nearstation) +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "wlm" = ( /obj/structure/bookcase/random/fiction, /turf/open/floor/iron/dark, @@ -79127,7 +78336,7 @@ /turf/open/floor/iron/stairs/left{ dir = 1 }, -/area/station/service/chapel/dock) +/area/station/service/chapel) "wlP" = ( /obj/effect/turf_decal/tile/red{ dir = 8 @@ -79182,9 +78391,8 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "wmq" = ( /obj/effect/turf_decal/tile/yellow{ @@ -79255,9 +78463,8 @@ dir = 10 }, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "wmZ" = ( /obj/structure/window/reinforced/spawner/north, @@ -79429,9 +78636,8 @@ dir = 1 }, /obj/machinery/light/small/directional/south, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "woJ" = ( /obj/effect/turf_decal/tile/neutral{ @@ -79456,21 +78662,14 @@ }, /turf/open/floor/iron/dark, /area/station/maintenance/port/greater) -"wpd" = ( -/obj/machinery/door/window/right/directional/east{ - pixel_y = 32 - }, -/turf/open/misc/asteroid/airless, -/area/space/nearstation) "wpe" = ( /obj/machinery/power/emitter/welded{ dir = 4 }, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/engineering/supermatter/room) "wpg" = ( /obj/structure/table, @@ -79513,9 +78712,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "wpu" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -79585,9 +78783,8 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "wqE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -79678,9 +78875,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/disposal/incinerator) "wrE" = ( /obj/structure/grille, @@ -79690,9 +78886,8 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "wrI" = ( /obj/machinery/door/firedoor, @@ -79748,8 +78943,8 @@ /turf/open/floor/iron/dark, /area/station/science/genetics) "wsz" = ( -/obj/machinery/door/airlock/external{ - name = "Supply Dock Airlock" +/obj/machinery/door/airlock/external/glass{ + name = "Supply Door Airlock" }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -79769,7 +78964,8 @@ }, /obj/machinery/door/poddoor/shutters/preopen{ id = "research_shutters"; - name = "Research Privacy Shutter" + name = "Research Privacy Shutter"; + dir = 8 }, /obj/machinery/door/window/right/directional/east{ name = "Research Lab Desk"; @@ -79785,9 +78981,8 @@ /obj/effect/decal/cleanable/blood/old, /obj/effect/decal/cleanable/dirt, /obj/structure/sign/poster/contraband/random/directional/west, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "wtt" = ( /obj/effect/turf_decal/bot, @@ -79924,7 +79119,7 @@ pixel_y = 5 }, /turf/open/floor/grass, -/area/station/security/prison) +/area/station/security/prison/garden) "wuT" = ( /obj/machinery/door/airlock/external{ name = "Prison External Airlock" @@ -79971,7 +79166,7 @@ /area/station/ai_monitored/turret_protected/ai_upload) "wwk" = ( /turf/open/floor/engine/vacuum, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "wwv" = ( /obj/effect/turf_decal/tile/purple, /obj/effect/turf_decal/tile/purple{ @@ -80054,9 +79249,7 @@ /turf/open/floor/iron/dark, /area/station/maintenance/starboard/fore) "wxM" = ( -/obj/structure/sign/warning/electric_shock{ - pixel_y = -32 - }, +/obj/structure/sign/warning/electric_shock/directional/south, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/port/lesser) @@ -80085,9 +79278,8 @@ }, /obj/effect/landmark/xeno_spawn, /obj/structure/sign/poster/contraband/random/directional/south, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "wyv" = ( /obj/structure/table, @@ -80153,9 +79345,7 @@ /obj/item/solar_assembly, /obj/item/stack/sheet/glass/fifty, /obj/structure/closet/crate/engineering/electrical, -/obj/structure/sign/warning/xeno_mining{ - pixel_x = 32 - }, +/obj/structure/sign/warning/xeno_mining/directional/east, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/effect/turf_decal/stripes/line{ @@ -80167,13 +79357,10 @@ "wyT" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/grille, -/obj/structure/sign/warning/electric_shock{ - pixel_x = -32 - }, +/obj/structure/sign/warning/electric_shock/directional/west, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "wyX" = ( /obj/effect/turf_decal/tile/blue{ @@ -80245,7 +79432,7 @@ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/security/prison) +/area/station/security/execution/transfer) "wzy" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/warning/vacuum/external, @@ -80273,9 +79460,7 @@ /obj/item/stack/ducts/fifty, /obj/item/plunger, /obj/item/plunger, -/obj/structure/sign/departments/chemistry{ - pixel_x = 32 - }, +/obj/structure/sign/departments/chemistry/directional/east, /obj/machinery/camera/directional/east{ c_tag = "Chemistry East"; network = list("ss13","medbay") @@ -80414,7 +79599,7 @@ dir = 1 }, /turf/open/floor/glass/reinforced, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "wBJ" = ( /obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/neutral, @@ -80439,9 +79624,8 @@ /obj/structure/disposalpipe/segment, /obj/structure/cable, /obj/structure/sign/poster/contraband/random/directional/east, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/aft) "wCl" = ( /obj/machinery/door/airlock/external{ @@ -80452,18 +79636,16 @@ dir = 1 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/external, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/disposal) "wCL" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "wCR" = ( /obj/effect/turf_decal/tile/blue, @@ -80591,9 +79773,8 @@ "wFg" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/sign/poster/contraband/random/directional/west, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/aft) "wFi" = ( /obj/machinery/biogenerator, @@ -80800,9 +79981,8 @@ /obj/structure/disposalpipe/segment, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/aft) "wHb" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -80845,9 +80025,7 @@ /obj/machinery/door/airlock/public/glass{ name = "Security Hallway" }, -/obj/structure/sign/departments/security{ - pixel_x = -32 - }, +/obj/structure/sign/departments/security/directional/west, /obj/effect/turf_decal/delivery, /turf/open/floor/iron/dark, /area/station/hallway/primary/aft) @@ -80882,14 +80060,7 @@ /turf/open/floor/iron, /area/station/service/hydroponics) "wHM" = ( -/obj/docking_port/stationary{ - dwidth = 3; - height = 5; - id = "commonmining_home"; - name = "SS13: Common Mining Dock"; - roundstart_template = /datum/map_template/shuttle/mining_common/kilo; - width = 7 - }, +/obj/docking_port/stationary/mining_home/common/kilo, /turf/open/floor/plating, /area/station/maintenance/port/greater) "wHQ" = ( @@ -80949,7 +80120,8 @@ "wIi" = ( /obj/machinery/door/poddoor/shutters/preopen{ id = "emmd"; - name = "Emergency Medical Lockdown Shutters" + name = "Emergency Medical Lockdown Shutters"; + dir = 4 }, /obj/effect/turf_decal/caution/stand_clear, /obj/machinery/door/firedoor, @@ -80999,9 +80171,8 @@ /obj/machinery/computer/pod/old/mass_driver_controller/ordnancedriver{ pixel_x = 24 }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "wII" = ( /obj/effect/turf_decal/stripes/line{ @@ -81059,12 +80230,6 @@ "wJo" = ( /turf/open/floor/plating, /area/station/maintenance/department/security) -"wJp" = ( -/obj/effect/turf_decal/siding/wideplating/dark{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/service/chapel/monastery) "wJw" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -81125,14 +80290,14 @@ /obj/item/kirbyplants/random, /obj/machinery/light/directional/west, /turf/open/floor/iron/dark, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "wKN" = ( /obj/structure/barricade/wooden, /obj/structure/barricade/wooden/crude, /turf/open/floor/iron/stairs/old{ dir = 1 }, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "wLp" = ( /obj/effect/turf_decal/tile/brown{ dir = 4 @@ -81182,9 +80347,8 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/security/execution/education) "wLX" = ( /turf/open/floor/circuit/red, @@ -81290,7 +80454,8 @@ /obj/machinery/door/firedoor, /obj/machinery/door/poddoor/shutters{ id = "bankshutter"; - name = "Bank Shutter" + name = "Bank Shutter"; + dir = 4 }, /obj/effect/turf_decal/delivery, /obj/effect/decal/cleanable/blood/old, @@ -81347,6 +80512,7 @@ /obj/machinery/light/directional/west, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/cobweb, +/obj/machinery/airalarm/directional/west, /turf/open/floor/iron/dark, /area/station/security/checkpoint/supply) "wOb" = ( @@ -81393,9 +80559,8 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/closet/crate, /obj/effect/spawner/random/exotic/technology, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "wOy" = ( /obj/effect/turf_decal/tile/neutral, @@ -81480,9 +80645,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/aft) "wPy" = ( /obj/machinery/door/poddoor/atmos_test_room_mainvent_1, @@ -81504,7 +80668,7 @@ }, /obj/machinery/portable_atmospherics/scrubber, /turf/open/floor/iron/showroomfloor, -/area/station/science/mixing) +/area/station/science/ordnance) "wPO" = ( /obj/structure/rack, /obj/item/gun/energy/ionrifle{ @@ -81528,9 +80692,8 @@ dir = 4 }, /obj/structure/sign/poster/contraband/random/directional/west, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "wPX" = ( /obj/machinery/door/firedoor, @@ -81560,9 +80723,8 @@ /area/station/hallway/primary/fore) "wQk" = ( /obj/machinery/light/small/directional/south, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "wQv" = ( /obj/effect/decal/cleanable/dirt, @@ -81573,9 +80735,8 @@ dir = 1; pixel_y = 24 }, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "wQK" = ( /obj/structure/flora/bush/sparsegrass/style_random, @@ -81629,9 +80790,8 @@ id = "greylair"; name = "Lair Privacy Toggle" }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "wRn" = ( /obj/effect/turf_decal/box/corners, @@ -81817,9 +80977,7 @@ dir = 8 }, /obj/effect/turf_decal/tile/neutral, -/obj/structure/sign/departments/engineering{ - pixel_y = -32 - }, +/obj/structure/sign/departments/engineering/directional/south, /obj/machinery/camera/directional/south{ c_tag = "Starboard Hallway Rotunda"; name = "starboard camera" @@ -81835,21 +80993,19 @@ dir = 4 }, /obj/effect/decal/cleanable/ash, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/disposal/incinerator) "wTM" = ( -/obj/item/book/granter/spell/smoke/lesser, +/obj/item/book/granter/action/spell/smoke/lesser, /obj/structure/table/wood, /turf/open/floor/cult, /area/station/service/chapel/office) "wTY" = ( /obj/structure/girder, /obj/effect/turf_decal/stripes/corner, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "wUJ" = ( /obj/effect/turf_decal/stripes/line{ @@ -81866,7 +81022,7 @@ /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron/showroomfloor, -/area/station/security/prison) +/area/station/security/execution/transfer) "wUT" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -81898,9 +81054,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "wVc" = ( /obj/effect/turf_decal/stripes/line{ @@ -82039,7 +81194,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/mapping_helpers/airlock/access/all/service/chapel_office, /turf/open/floor/carpet/royalblue, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "wWW" = ( /obj/structure/sign/warning/radiation, /turf/closed/wall, @@ -82051,7 +81206,7 @@ }, /obj/machinery/door/firedoor/border_only, /turf/open/floor/iron/dark, -/area/station/service/chapel/dock) +/area/station/service/chapel) "wXG" = ( /obj/effect/turf_decal/tile/brown, /obj/effect/turf_decal/tile/brown{ @@ -82067,10 +81222,6 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/status_display/supply{ - pixel_x = 32; - pixel_y = 32 - }, /obj/effect/turf_decal/stripes/line{ dir = 4 }, @@ -82085,9 +81236,8 @@ name = "Cabin 4 Privacy Toggle"; pixel_y = -24 }, -/turf/open/floor/wood{ - icon_state = "wood-broken4" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/commons/locker) "wXM" = ( /obj/effect/turf_decal/stripes/line{ @@ -82167,10 +81317,9 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /obj/effect/mapping_helpers/airlock/access/all/science/ordnance, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/station/science/mixing) +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/station/science/ordnance) "wZL" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -82180,9 +81329,8 @@ }, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/aft) "wZW" = ( /obj/machinery/door/firedoor, @@ -82232,6 +81380,10 @@ }, /turf/open/floor/iron/dark, /area/station/service/chapel/funeral) +"xaA" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/service/chapel) "xaC" = ( /obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/yellow{ @@ -82263,9 +81415,8 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "xbk" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber{ @@ -82416,6 +81567,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, +/obj/item/gun/energy/e_gun/mini, /turf/open/floor/iron/dark, /area/station/cargo/qm) "xcV" = ( @@ -82612,9 +81764,8 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/north, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/aft) "xhH" = ( /obj/machinery/light/small/directional/north, @@ -82769,9 +81920,8 @@ /obj/effect/turf_decal/siding/wood{ dir = 8 }, -/turf/open/floor/wood{ - icon_state = "wood-broken2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/maintenance/department/crew_quarters/bar) "xjO" = ( /obj/machinery/camera/directional/north{ @@ -82801,7 +81951,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/airlock/access/all/engineering/construction, +/obj/effect/mapping_helpers/airlock/access/all/command/minisat, /turf/open/floor/iron/dark, /area/station/hallway/primary/central/fore) "xke" = ( @@ -82846,7 +81996,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/showroomfloor, -/area/station/science/storage) +/area/station/science/ordnance/storage) "xky" = ( /obj/structure/sink/kitchen{ desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; @@ -82958,7 +82108,7 @@ "xlF" = ( /obj/structure/flora/bush/grassy/style_random, /turf/open/floor/grass, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "xlL" = ( /obj/structure/table, /obj/item/clothing/under/rank/prisoner/skirt{ @@ -82976,7 +82126,7 @@ /obj/machinery/light/directional/north, /obj/effect/turf_decal/tile/red/anticorner/contrasted, /turf/open/floor/iron/showroomfloor, -/area/station/security/prison) +/area/station/security/execution/transfer) "xmn" = ( /obj/structure/chair/pew/right{ dir = 8 @@ -82985,13 +82135,12 @@ /turf/open/floor/iron/chapel{ dir = 4 }, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "xmq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/solars/port/aft) "xms" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -83038,9 +82187,7 @@ dir = 4 }, /obj/machinery/status_display/evac/directional/west, -/obj/structure/sign/warning/no_smoking{ - pixel_y = 32 - }, +/obj/structure/sign/warning/no_smoking/directional/north, /turf/open/floor/iron/dark, /area/station/medical/storage) "xmO" = ( @@ -83057,9 +82204,8 @@ "xnc" = ( /obj/effect/decal/cleanable/dirt, /obj/item/circuitboard/computer/operating, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "xnm" = ( /obj/effect/decal/cleanable/dirt, @@ -83263,9 +82409,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/aft) "xqm" = ( /obj/structure/sign/warning/vacuum, @@ -83277,9 +82422,8 @@ "xqB" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/sign/poster/contraband/random/directional/south, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "xqE" = ( /obj/machinery/door/firedoor, @@ -83305,9 +82449,8 @@ dir = 4 }, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "xrm" = ( /obj/machinery/blackbox_recorder, @@ -83484,9 +82627,8 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "xtO" = ( /obj/effect/turf_decal/bot, @@ -83508,9 +82650,8 @@ "xtY" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/aft) "xun" = ( /obj/structure/table, @@ -83543,9 +82684,8 @@ /obj/effect/decal/cleanable/blood/old, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/department/medical/central) "xuH" = ( /obj/machinery/conveyor_switch/oneway{ @@ -83559,9 +82699,7 @@ dir = 4 }, /obj/effect/turf_decal/box/corners, -/obj/machinery/status_display/supply{ - pixel_x = 32 - }, +/obj/structure/extinguisher_cabinet/directional/east, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/starboard) "xuM" = ( @@ -83579,7 +82717,7 @@ dir = 4 }, /turf/open/floor/wood, -/area/station/service/chapel/dock) +/area/station/service/chapel/monastery) "xva" = ( /obj/item/radio/intercom/directional/east, /turf/closed/wall, @@ -83661,15 +82799,6 @@ "xvW" = ( /turf/closed/wall, /area/station/medical/paramedic) -"xwi" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, -/area/station/maintenance/starboard/aft) "xwk" = ( /obj/machinery/computer/security/mining, /obj/effect/turf_decal/tile/neutral{ @@ -83763,9 +82892,8 @@ }, /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/north, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/department/cargo) "xxk" = ( /turf/closed/wall/r_wall, @@ -83820,32 +82948,15 @@ /turf/open/floor/iron, /area/station/hallway/primary/central/fore) "xxQ" = ( -/obj/structure/table, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/item/paper_bin{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/stamp/qm{ - pixel_x = 8; - pixel_y = 10 - }, -/obj/item/stamp/denied{ - pixel_x = 8; - pixel_y = 6 - }, -/obj/item/stamp{ - pixel_x = 8; - pixel_y = 2 - }, -/obj/item/pen, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/pdapainter/supply, /turf/open/floor/iron/dark, /area/station/cargo/qm) "xxW" = ( @@ -83857,9 +82968,8 @@ /obj/machinery/light/small/directional/north, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/bot, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/disposal) "xym" = ( /obj/effect/turf_decal/tile/red, @@ -83966,9 +83076,8 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/extinguisher_cabinet/directional/west, /obj/effect/landmark/blobstart, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "xAI" = ( /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ @@ -84026,15 +83135,6 @@ "xBI" = ( /turf/closed/wall/rust, /area/station/maintenance/port/fore) -"xBW" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/service/chapel/dock) "xCa" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -84052,6 +83152,10 @@ }, /turf/open/floor/iron/dark, /area/station/service/bar) +"xCb" = ( +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/service/chapel/monastery) "xCh" = ( /obj/effect/turf_decal/tile/red{ dir = 1 @@ -84078,7 +83182,7 @@ }, /obj/machinery/light/small/directional/east, /turf/open/floor/iron/stairs, -/area/station/service/chapel/monastery) +/area/station/service/chapel) "xCq" = ( /obj/effect/spawner/random/vending/snackvend, /obj/effect/turf_decal/tile/neutral{ @@ -84216,6 +83320,10 @@ /obj/machinery/power/apc/auto_name/directional/south, /turf/open/floor/iron/dark, /area/station/tcommsat/computer) +"xDu" = ( +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/security/execution/transfer) "xDG" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -84224,9 +83332,8 @@ /area/station/security/prison) "xDH" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "xDP" = ( /obj/structure/cable, @@ -84245,9 +83352,7 @@ }, /area/station/hallway/primary/fore) "xDQ" = ( -/obj/structure/sign/departments/security{ - pixel_x = 32 - }, +/obj/structure/sign/departments/security/directional/east, /obj/machinery/light/small/directional/east, /turf/open/floor/iron/dark, /area/station/maintenance/port/aft) @@ -84312,9 +83417,8 @@ "xFv" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/blobstart, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "xFE" = ( /obj/effect/turf_decal/tile/yellow{ @@ -84343,9 +83447,8 @@ }, /obj/effect/decal/cleanable/blood/old, /obj/structure/sign/poster/contraband/random/directional/north, -/turf/open/floor/wood{ - icon_state = "wood-broken4" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/cargo/warehouse) "xFM" = ( /obj/effect/turf_decal/tile/blue{ @@ -84361,16 +83464,13 @@ /turf/open/floor/iron, /area/station/commons/fitness/recreation) "xFW" = ( -/obj/structure/sign/warning/electric_shock{ - pixel_y = -32 - }, +/obj/structure/sign/warning/electric_shock/directional/south, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "xGh" = ( /obj/machinery/computer/telecomms/server, @@ -84400,9 +83500,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /obj/structure/disposalpipe/segment, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/aft) "xGN" = ( /obj/structure/cable, @@ -84423,9 +83522,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /obj/structure/sign/poster/contraband/random/directional/south, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "xHc" = ( /obj/effect/turf_decal/tile/red{ @@ -84612,9 +83710,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/corner, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "xJN" = ( /obj/effect/turf_decal/tile/yellow{ @@ -84640,9 +83737,8 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/engineering/supermatter/room) "xKi" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -84653,9 +83749,8 @@ dir = 4 }, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "xKn" = ( /obj/effect/decal/cleanable/blood/old, @@ -84702,7 +83797,7 @@ dir = 4 }, /turf/open/floor/wood, -/area/station/service/chapel/dock) +/area/station/service/chapel/monastery) "xKW" = ( /obj/machinery/door/airlock/maintenance{ name = "Mech Bay Maintenance" @@ -84780,9 +83875,7 @@ /turf/open/floor/iron, /area/station/hallway/primary/aft) "xLY" = ( -/obj/structure/sign/warning/electric_shock{ - pixel_y = -32 - }, +/obj/structure/sign/warning/electric_shock/directional/south, /obj/effect/decal/cleanable/dirt, /obj/structure/lattice/catwalk, /obj/machinery/light/small/directional/south, @@ -84907,7 +84000,7 @@ /obj/machinery/door/window/left/directional/west{ dir = 1; name = "Crate Return Door"; - req_access = list("mail_sorting") + req_access = list("shipping") }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, @@ -84973,11 +84066,11 @@ /turf/open/floor/iron, /area/station/security/courtroom) "xOX" = ( -/obj/machinery/door/poddoor/shutters/preopen{ +/obj/effect/turf_decal/caution/stand_clear, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ id = "engsm"; name = "Radiation Chamber Shutters" }, -/obj/effect/turf_decal/caution/stand_clear, /turf/open/floor/iron/dark, /area/station/engineering/supermatter) "xPc" = ( @@ -85068,6 +84161,20 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/engine, /area/station/ai_monitored/turret_protected/aisat/atmos) +"xRj" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/turf/open/floor/iron/stairs/medium{ + dir = 4 + }, +/area/station/service/chapel/monastery) "xRm" = ( /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -85225,9 +84332,8 @@ /obj/effect/turf_decal/stripes/end{ dir = 1 }, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/engineering/supermatter/room) "xTg" = ( /obj/machinery/atmospherics/pipe/smart/manifold/purple/visible{ @@ -85238,7 +84344,7 @@ dir = 8 }, /turf/open/floor/iron/showroomfloor, -/area/station/science/mixing) +/area/station/science/ordnance) "xTt" = ( /obj/effect/turf_decal/bot, /obj/effect/turf_decal/tile/neutral{ @@ -85299,9 +84405,8 @@ /obj/effect/turf_decal/stripes/corner{ dir = 8 }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) "xUk" = ( /obj/machinery/computer/security/wooden_tv, @@ -85379,7 +84484,8 @@ /obj/item/pen, /obj/machinery/door/poddoor/shutters/preopen{ id = "chemistry_shutters"; - name = "Chemistry Lobby Shutters" + name = "Chemistry Lobby Shutters"; + dir = 1 }, /obj/machinery/door/firedoor/heavy, /obj/machinery/door/window/left/directional/north{ @@ -85404,8 +84510,11 @@ /obj/item/pipe_dispenser, /obj/effect/turf_decal/tile/purple/half/contrasted, /obj/structure/cable, +/obj/machinery/air_sensor{ + chamber_id = "ordnancegas2" + }, /turf/open/floor/iron/showroomfloor, -/area/station/science/storage) +/area/station/science/ordnance/storage) "xVa" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, @@ -85413,9 +84522,8 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/sign/poster/contraband/random/directional/east, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/aft) "xVm" = ( /turf/closed/wall/r_wall/rust, @@ -85471,9 +84579,8 @@ }, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "xWm" = ( /obj/item/kirbyplants/random, @@ -85523,9 +84630,8 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "xWJ" = ( /obj/effect/turf_decal/tile/red{ @@ -85560,7 +84666,7 @@ dir = 8 }, /turf/open/floor/iron/showroomfloor, -/area/station/science/mixing) +/area/station/science/ordnance) "xXo" = ( /obj/structure/sign/departments/xenobio, /turf/closed/wall/r_wall, @@ -85863,9 +84969,8 @@ }, /obj/item/radio/intercom/directional/north, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/solars/starboard/fore) "ybH" = ( /obj/effect/turf_decal/stripes/line, @@ -85887,9 +84992,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/effect/mapping_helpers/airlock/access/all/engineering/external, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/disposal) "ycd" = ( /obj/machinery/computer/upload/ai{ @@ -85978,7 +85082,7 @@ /obj/item/trash/cheesie, /obj/item/trash/syndi_cakes, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "ydh" = ( /obj/effect/turf_decal/tile/red{ dir = 4 @@ -85997,9 +85101,8 @@ /obj/structure/disposalpipe/segment{ dir = 10 }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/aft) "ydw" = ( /obj/effect/turf_decal/tile/yellow{ @@ -86024,10 +85127,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/solars/starboard/aft) -"yeb" = ( -/obj/structure/lattice/catwalk, -/turf/open/floor/plating/airless, -/area/station/solars/port/fore) "yej" = ( /obj/structure/chair/sofa/bench{ dir = 1 @@ -86044,7 +85143,7 @@ /area/station/hallway/primary/central/fore) "yel" = ( /turf/closed/wall/r_wall, -/area/station/science/storage) +/area/station/science/ordnance/storage) "yem" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -86059,7 +85158,7 @@ dir = 4 }, /turf/open/floor/engine/vacuum, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "yeo" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -86118,7 +85217,7 @@ dir = 9 }, /turf/open/floor/engine/vacuum, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "yeY" = ( /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -86147,9 +85246,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/item/radio/intercom/directional/east, /obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/disposal) "yfq" = ( /obj/structure/lattice/catwalk, @@ -86163,11 +85261,11 @@ /turf/open/floor/plating, /area/space/nearstation) "yfv" = ( -/obj/machinery/door/airlock/mining/glass{ - name = "Quartermaster" - }, /obj/machinery/door/firedoor, /obj/effect/mapping_helpers/airlock/access/all/supply/qm, +/obj/machinery/door/airlock/command/glass{ + name = "Quartermaster's Office" + }, /turf/open/floor/iron/dark, /area/station/cargo/qm) "yfA" = ( @@ -86192,7 +85290,7 @@ "yfJ" = ( /obj/machinery/atmospherics/components/tank/oxygen, /turf/open/floor/iron/showroomfloor, -/area/station/science/storage) +/area/station/science/ordnance/storage) "yfP" = ( /obj/structure/grille, /obj/structure/cable, @@ -86210,17 +85308,14 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "ygf" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible/layer4, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/bot, -/obj/structure/sign/warning/no_smoking{ - pixel_y = 32 - }, +/obj/structure/sign/warning/no_smoking/directional/north, /turf/open/floor/plating, /area/station/cargo/warehouse) "ygj" = ( @@ -86307,16 +85402,15 @@ /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{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "yhr" = ( /obj/structure/table/wood/fancy/black, /obj/machinery/firealarm/directional/east, /obj/item/storage/fancy/candle_box, /turf/open/floor/iron/dark, -/area/station/service/chapel/dock) +/area/station/service/chapel/monastery) "yhw" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -86394,7 +85488,7 @@ /obj/machinery/atmospherics/pipe/smart/simple/purple/visible, /obj/effect/mapping_helpers/airlock/access/all/science/ordnance, /turf/open/floor/iron/dark/airless, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/freezerchamber) "yip" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -86461,9 +85555,7 @@ "yjh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/sign/departments/security{ - pixel_y = -32 - }, +/obj/structure/sign/departments/security/directional/south, /obj/effect/turf_decal/box, /obj/vehicle/ridden/secway, /obj/effect/turf_decal/tile/red/half/contrasted, @@ -86491,9 +85583,7 @@ /obj/effect/turf_decal/stripes/corner{ dir = 8 }, -/obj/structure/sign/warning/electric_shock{ - pixel_x = -32 - }, +/obj/structure/sign/warning/electric_shock/directional/west, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -86559,13 +85649,12 @@ }, /obj/machinery/light/directional/west, /turf/open/floor/iron/dark, -/area/station/service/chapel/dock) +/area/station/service/chapel/monastery) "ykF" = ( /obj/structure/cable, /obj/machinery/space_heater, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "ykK" = ( /obj/effect/turf_decal/tile/neutral, @@ -86597,9 +85686,8 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/table, /obj/item/book/manual/wiki/engineering_hacking, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "yld" = ( /obj/effect/turf_decal/tile/red{ @@ -86613,9 +85701,8 @@ /obj/structure/cable, /obj/effect/decal/cleanable/dirt, /obj/structure/grille/broken, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/lesser) "ylu" = ( /obj/effect/turf_decal/tile/red{ @@ -86694,9 +85781,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard) (1,1,1) = {" @@ -92758,7 +91844,7 @@ aeu aeu aeU aeU -eJN +mWy gCY raV aDD @@ -93015,7 +92101,7 @@ aeU aeu aeU aeU -eJN +mWy cOf kkV eCu @@ -93026,7 +92112,7 @@ kkV baG aPo kkV -gvP +raV goj raV kkV @@ -93547,12 +92633,12 @@ kkV sAv sAv aeU -ifQ -mWy -sAv -sAv -mWy -mWy +qng +dRx +nyg +nyg +dRx +dRx vlQ aaa aaa @@ -93804,13 +92890,13 @@ kkV sAv aeU aeU -sAv +nyg vwg gKc juv hDI syr -sAv +nyg aaa aaa aaa @@ -94058,16 +93144,16 @@ xlA mWy qYM kkV -sAv -mWy -mWy -sAv +nyg +dRx +dRx +nyg lzQ rOL vPF thK qOg -mWy +dRx aaa aaa aaa @@ -94316,15 +93402,15 @@ yfP mqC ezC exJ -kkV -kkV +sJD +sJD exJ hQV snh lIE wuP nBM -mWy +dRx aeU aaa aaa @@ -94572,16 +93658,16 @@ xlA sAv aDD kkV -sAv -mWy -mWy -sAv +nyg +dRx +dRx +nyg aAa qeG pgh kbA gdk -mWy +dRx aeU aeU aeU @@ -94822,23 +93908,23 @@ aaa aaa aaa aaa -sAv -lrq -sAv -sAv -sAv +sYR +aNE +sYR +sYR +sYR pwq goj sAv coy aeU -sAv +nyg lzH sKz saM lHA rXG -sAv +nyg aeu aeu aeu @@ -95083,19 +94169,19 @@ qNQ dNH uaI pEz -sAv +sYR mqC rkl sAv sAv sAv -sAv -mWy -sAv +nyg +dRx +nyg fjA tzZ kPe -sAv +nyg aeU aeu aeu @@ -95336,23 +94422,23 @@ aaa aaa aaa aaa -sAv +sYR tng tGm -aDD +bWC ujh -aDD +cOf kkV dAu qWN sAv aeU aeU -mWy +dRx dlM nmt uLT -sAv +nyg cui aeU aeu @@ -95593,11 +94679,11 @@ aaa aaa aaa aaa -sAv +sYR gZr +ugU kYn -kYn -sAv +sYR jYo ezC jrT @@ -95605,11 +94691,11 @@ pLi mWy aeU aUz -ifQ -sAv -mWy -mWy -sAv +qng +nyg +dRx +dRx +nyg aeU aeu aeu @@ -95850,11 +94936,11 @@ aaa aaa aaa aaa -sAv +sYR oln -sAv -lrq -sAv +sYR +aNE +sYR kbC kkV avs @@ -96627,12 +95713,12 @@ oCE dWG dWG izN -kkV +bAt dIU ePK vzu oRA -mWy +tGH aeU cmU aeu @@ -96883,13 +95969,13 @@ wEy mbh xZn eJN -aDD +ghL hMC -sAv +fkd lnJ uxI ecU -mWy +tGH aeU cmU coy @@ -97142,11 +96228,11 @@ oUS eJN izN iVQ -mWy +tGH tae uxI vFu -lrq +lXX cmU cmU awn @@ -97399,11 +96485,11 @@ wVI eJN izN iVQ -mWy +tGH uNe uxI vNd -mWy +tGH aeU cmU gUw @@ -97556,20 +96642,20 @@ ixB hmh ixB ixB -cRv +off sjG sjG -cRv -cRv -cRv +off +off +off wWQ -cRv -cRv -lOG -lOG -cRv -cRv -lOG +off +off +sok +sok +off +off +sok siL oiO oiO @@ -97599,7 +96685,7 @@ acm aaa acm aaa -mMv +vva cmU cmU cmU @@ -97656,11 +96742,11 @@ dWG dWG gsc iVQ -sAv +fkd mFy cPf uTg -mWy +tGH aeU cmU gUw @@ -97814,8 +96900,8 @@ shE hJC dJi qhZ -uPH -uPH +tNt +tNt bnn kcI toS @@ -97823,7 +96909,7 @@ cCS ukQ oWc xCp -jlY +dWm fyG wKN jFq @@ -97856,7 +96942,7 @@ hpG hpG ala hpG -mMv +vva hpG hpG hpG @@ -97910,14 +96996,14 @@ wDz bwQ sTi spn -mWy +wfe nHw fLt sxe qlc hwP eCl -ifQ +nqV cmU cmU awn @@ -98070,20 +97156,20 @@ uGn aXf iqQ snn -piu -uPH -tnr -cGP +mcr +tNt +bml +jos joC ehp jIa tfW iMx -cGP +jos slr rqG cop -cRv +off rfg vtv bJV @@ -98113,7 +97199,7 @@ mMv mMv mMv mMv -yeb +tpp mMv mMv mMv @@ -98167,14 +97253,14 @@ wDz jSH oNy mEv -mWy +wfe ycV iVQ uAQ pCr eQm iTk -mWy +tGH aUz cmU gUw @@ -98327,8 +97413,8 @@ don orz fnN oGu -uPH -uPH +tNt +tNt vEv pUb pPw @@ -98338,9 +97424,9 @@ jAu pCX gnp rxp -nbZ +bHt rZc -cRv +off jhc oiO oiO @@ -98370,7 +97456,7 @@ hpG hpG hpG hpG -yeb +tpp hpG hpG hpG @@ -98424,14 +97510,14 @@ wDz jNw oNy hrw -sAv +nVF qVB iVQ aQf aQf aQf fjY -mWy +tGH aeU cmU gUw @@ -98584,8 +97670,8 @@ pkg niL jAy dJi -aYE -uPH +rGd +tNt cjR iFR aGC @@ -98596,12 +97682,12 @@ aGC iFR wBo mCO +off +off +lOG cRv -ebU -ing -ebU -ing -oha +lOG +cGP qfe aaa aaa @@ -98622,17 +97708,17 @@ aaQ acm acm aaa -yeb +tpp ckk aaa aaa ckk -yeb +tpp ckk aaa aaa ckk -yeb +tpp cmU cmU aeU @@ -98688,7 +97774,7 @@ jmA jmA jmA glC -sAv +fkd cmU cmU awn @@ -98842,19 +97928,19 @@ mLd cdi dJi srs -uPH -dpc +tNt +sMJ slB urh kJu -ggb +xaA dKy cHg was -dpc -nbZ +sMJ +bHt wKb -ebU +off jju xKT xuR @@ -98884,7 +97970,7 @@ hpG hpG hpG lDc -yeb +tpp tpp hpG hpG @@ -98945,7 +98031,7 @@ bHu tOl dCb iTk -mWy +tGH aeU aqQ gUw @@ -99099,22 +98185,22 @@ gQu snn dJi tdf -uPH -uPH +tNt +tNt ewC qER xmn -ggb +xaA ggj aSu kVd sKE -xBd +hsP mMp wlz cvi -dEX -dEX +piu +piu vSG kpS aaa @@ -99135,19 +98221,19 @@ aaa aeo aaa cmU -mMv -mMv -mMv -mMv -mMv -yeb -yeb -yeb -mMv -mMv -mMv -mMv -mMv +vva +vva +vva +vva +vva +tpp +tpp +tpp +vva +vva +vva +vva +vva cmU aeU aeU @@ -99202,7 +98288,7 @@ jCV bcq hdW myr -mWy +tGH aeU cmU gUw @@ -99355,23 +98441,23 @@ ixB snn snn tmj -piu -mYv -uPH +mcr +eNo +tNt gse gdI jIW -ggb +xaA rcS hUE fAM -nbZ -mYv -piu +bHt +eNo +mcr nQo cvi -oyI -dEX +mYv +piu vSG kpS aaa @@ -99398,7 +98484,7 @@ hpG hpG hpG tpp -yeb +tpp tpp hpG hpG @@ -99410,7 +98496,7 @@ aeU aeu vjh gLH -oxU +cyJ hBJ hPx sbC @@ -99436,7 +98522,7 @@ eah baK kan ycx -tmT +rlG rlG hcW dFM @@ -99452,14 +98538,14 @@ wDz xlL lEz cWs -sAv -mWy -mWy -sAv -sAv -lrq -sAv -ifQ +nVF +tGH +tGH +fkd +fkd +lXX +fkd +nqV cmU cmU awn @@ -99608,27 +98694,27 @@ aeu aeu aeu aeu -cGP +jos vAh vdy -piu -piu +mcr +mcr uAn -uPH +tNt owC rlM pkI -ggb +xaA msY sQz ssI -nbZ +bHt uAn -tnr +bml oZb cvi -nMl -dEX +dpc +piu vSG kpS aaa @@ -99650,17 +98736,17 @@ vku aeU cmU cmU -yeb +tpp ckk aaa aaa ckk -yeb +tpp ckk aaa aaa ckk -yeb +tpp cmU cmU aUz @@ -99709,7 +98795,7 @@ mhS pDo pDo sTi -sAv +nVF acK acK acK @@ -99724,7 +98810,7 @@ cmU cmU cmU cmU -whD +awn cmU cmU cmU @@ -99865,13 +98951,13 @@ aeu aeu aeu aeu -aoL +vIq sjG -cRv +off uVK -piu -dpc -uPH +mcr +sMJ +tNt kUd dKx cLV @@ -99879,13 +98965,13 @@ cLV cLV upK ocE -nbZ -dpc -gPC -ebU +bHt +sMJ +kco +off win -dEX -dEX +piu +piu vSG kpS aaa @@ -99912,7 +98998,7 @@ hpG hpG hpG hpG -yeb +tpp hpG hpG hpG @@ -99981,7 +99067,7 @@ aeU aeU aeU cmU -whD +awn cmU aeU aeU @@ -100121,28 +99207,28 @@ aeu aeu aeu aeu -cGP -cGP +jos +jos eAk jrh sPx uEC -wJp +hUM fFa frh ccd slr -piu +mcr tnA lHk ejt pGD ifd -cRv -ing -eqg +off +sok +aYE pBf -dEX +piu vSG kpS aaa @@ -100164,17 +99250,17 @@ aeu aof aUz cmU -mMv -mMv -mMv -mMv -mMv -yeb -mMv -mMv -mMv -mMv -mMv +vva +vva +vva +vva +vva +tpp +vva +vva +vva +vva +vva cmU aeU rYc @@ -100221,8 +99307,8 @@ nCL nCL nKy hEh -aDD -kkV +kPX +sae iVj ivU lBQ @@ -100238,7 +99324,7 @@ aeu aeU aeU cmU -whD +awn cmU aeU aeU @@ -100383,7 +99469,7 @@ ecE pOV pOV pOV -ebU +off eul jpa cne @@ -100395,11 +99481,11 @@ rsX gJc sQq qbP -ebU -ing +off +sok dvs naf -dEX +piu vSG kpS aaa @@ -100426,7 +99512,7 @@ hpG hpG hpG hpG -yeb +tpp hpG hpG hpG @@ -100478,8 +99564,8 @@ iMA iMA ryn rQZ -cOf -kkV +xDu +sae gIt lBQ lBQ @@ -100495,7 +99581,7 @@ aeu aeu rkn aDS -whD +awn bFI aeU coy @@ -100641,8 +99727,8 @@ lqR rnj ecE nGE -dEX -cOR +mcr +tNt tqB rJN dRh @@ -100650,13 +99736,13 @@ xlF vZn dRh rGK -xBW -dEX +bHt +mcr aoi -vSG -dEX +bMk +piu fKe -dEX +piu vSG kpS aaa @@ -100683,7 +99769,7 @@ cmU cmU cmU aDS -yeb +tpp bFI cmU cmU @@ -100898,8 +99984,8 @@ spm seK pOV laH -sWX -cOR +ocE +tNt wXv rcB lCC @@ -100907,13 +99993,13 @@ hZd rsX mlD iYr -xBW +bHt lQw iLD -vSG -dEX +bMk +piu qBN -dEX +piu vSG kpS acm @@ -100940,7 +100026,7 @@ aeU coy woH aDS -yeb +tpp bFI rkn aeU @@ -100990,7 +100076,7 @@ iMA xad cnQ vqJ -sAv +nVF bSY lLt rbc @@ -101156,7 +100242,7 @@ rBV pOV ogM hUM -gOM +fFa jdL hVT mlD @@ -101164,13 +100250,13 @@ dRh vZn qFs tUO -hdL +pGD hUM eIi -vSG -dEX +bMk +piu mvV -dEX +piu vSG kpS aaa @@ -101197,7 +100283,7 @@ aeU aeU coy aDS -mMv +vva bFI aeU aeu @@ -101247,7 +100333,7 @@ iza aeu acW xad -mWy +wfe etT tnk mNv @@ -101411,7 +100497,7 @@ lDK lqR pOV pOV -ebU +off vUi jpa cbJ @@ -101421,13 +100507,13 @@ ebU siH ing eGC -sQq +xRj uAH -ing -ebU +lOG +cRv vim -dEX -dEX +piu +piu vSG kpS aaa @@ -101454,7 +100540,7 @@ aeU aeU aeU aDS -mMv +vva bFI aeu aeu @@ -101504,7 +100590,7 @@ pqD aeu aeu xad -mWy +wfe oWa aqH exb @@ -101669,22 +100755,22 @@ luk ecE nUf eTS -dEX -cOR -dEX +mcr +tNt +mcr siH bzu tcY hOK siH -dEX -xBW -dEX +piu +nbZ +piu ykv sVD cvi -oyI -dEX +mYv +piu vSG kpS aaa @@ -101761,7 +100847,7 @@ iVR aeu add cnQ -lrq +lbt bSY rHt oNj @@ -101927,21 +101013,21 @@ pOV sOI rjV tTu -cOR -cOR +tNt +tNt kXV cOR aGK buS dIy -buS -taK -aNN +jlY +xBd +ggb ikg -nQo +hmZ cvi -nMl -dEX +dpc +piu vSG kpS acm @@ -102018,7 +101104,7 @@ iMA xad aDQ cBD -ifQ +tFR fqx drF fjq @@ -102182,19 +101268,19 @@ bbO mAc wQN sOI -dEX -dEX -wgA -dEX +mcr +mcr +bjv +mcr siH dEX iSO dEX siH -dEX +xCb wgA -dEX -kPr +piu +tnr iYb cvi uOd @@ -102275,7 +101361,7 @@ iMA xad cnM xad -mWy +wfe csx pEx uFv @@ -102438,21 +101524,21 @@ aeU lUq bbO bbO -vTV +vIq mZS bAs -dEX +mcr foB ing fty tOH eqD ebU -csL +mWt yhr csL -jgA -oha +gPC +cGP vSG vSG vSG @@ -102501,7 +101587,7 @@ nrS nsl mxh mtV -oxU +cyJ vjh pGj mYX @@ -102532,7 +101618,7 @@ iMA xad cnQ aeu -lrq +lbt fcC aoS iHe @@ -102695,21 +101781,21 @@ aeU aeu aeu aeu -oha -oha -ebU +jos +jos +off jYX -ebU -oha +off +jos pcc ikx kwm vTV -vTV -oha -oha -vTV -vTV +aoL +cGP +cGP +aoL +aoL lsE lsE lsE @@ -102789,7 +101875,7 @@ pqD aeu cnR aeu -sAv +nVF rmR qEu wUJ @@ -102953,11 +102039,11 @@ aeu aeu aeu aeu -oha +jos oye pXi sYM -vTV +vIq psC hOm psC @@ -102982,7 +102068,7 @@ aaa aaa aaa agt -wpd +aeU aeU aeu aeu @@ -103046,7 +102132,7 @@ pqD aeu cog cBN -sAv +nVF mfb mvf dGu @@ -103210,11 +102296,11 @@ aeu aeu aeu aeu -vTV -vTV +vIq +vIq jet -oha -oha +jos +jos aeu mbC dKZ @@ -103260,7 +102346,7 @@ jUa aTg xBI rfD -mFR +flS dIQ dnz pmA @@ -103313,7 +102399,7 @@ gGJ rhy uwp eUm -uDh +bbP fnL bbP aVj @@ -103793,7 +102879,7 @@ xHU vjh vjh kex -tmT +rlG eNQ csa csa @@ -105059,7 +104145,7 @@ uiu noO dHg kkC -tZc +qFG buJ kAR gbB @@ -105316,7 +104402,7 @@ fFH ugc jVZ xmI -tZc +qFG sMI khj pYZ @@ -105831,9 +104917,9 @@ iMr qUJ iMr xxk -tZc +iwZ mrl -tZc +iwZ mrl tZc sXB @@ -107137,7 +106223,7 @@ oGa sRZ cjS gkv -ivK +aBt iYf iyI eMW @@ -108177,7 +107263,7 @@ jDs uHv vgm gdL -pzh +dJA hri jWD oce @@ -109184,7 +108270,7 @@ eyA eIW jJW vss -qRE +sRY xzS ouK fKf @@ -109725,7 +108811,7 @@ iza oFG iza feO -tTW +eTg ukT wDz rqx @@ -111013,7 +110099,7 @@ vfF pqD pqD tjX -tTW +eTg eTg kUR gdA @@ -111055,8 +110141,8 @@ eEY ewt rNk gyV -gHN -gHN +rfe +rfe rfe mLN aeu @@ -111253,7 +110339,7 @@ vxa hZS bdF qHV -nQY +pVK tVC lyB cXT @@ -111275,8 +110361,8 @@ oML kQJ pqD hNI -taU -taU +tvL +tvL jqb jqb sMa @@ -111306,8 +110392,8 @@ aaa acm oOW oqS -tgA -tgA +fXl +fXl gyV gyV pyv @@ -111564,7 +110650,7 @@ acm kCk pJA nqH -tgA +fXl fXl pyv gyV @@ -112825,7 +111911,7 @@ ncB sHD rXp gmG -fZR +mVc nIh pDM rTi @@ -113792,7 +112878,7 @@ iat goE psR mkl -tAt +hpj iUQ dja tPD @@ -114816,7 +113902,7 @@ aaa acm aaa fbm -ppz +psR fbm aDQ add @@ -115908,7 +114994,7 @@ nbH nwh cfL dQM -eUQ +rGv ilQ dDD gmG @@ -116167,7 +115253,7 @@ cfL gmG rGv gmG -fZR +mVc wFg mjh hDV @@ -117960,7 +117046,7 @@ lTM pqb tdW cfL -fOU +inQ cfL cfL mjh @@ -118160,8 +117246,8 @@ fvU hmL tyD nkj -mbQ -mbQ +mmc +mmc mmc hgn iJB @@ -119987,7 +119073,7 @@ eBu jDF rzV jgB -gmr +ivX kjK rOX dvk @@ -121321,7 +120407,7 @@ tCp qOq cqc lOX -xOX +uSE dOH xOX okp @@ -121508,10 +120594,10 @@ gZA iUT lZi bBF -mWS +ggf yjj -mWS -mWS +ggf +ggf bBF nsn hLS @@ -122070,7 +121156,7 @@ elz lxp cuV hyJ -xwi +aTV aTV alL jjs @@ -122583,7 +121669,7 @@ gwW bwk diA gBC -xwi +aTV ipO qZX kDg @@ -122840,7 +121926,7 @@ gbp wmG hLr cuV -vvT +uQi vHF jjs cwj @@ -123334,7 +122420,7 @@ fkw hDK ege fak -dmS +ykP xcV gUK eqz @@ -123377,9 +122463,9 @@ naQ ksp oAk lOX -xOX +uSE dOH -xOX +uSE lOX xwE oow @@ -124131,7 +123217,7 @@ cuV xhC iFa cAq -vvT +uQi uQi cuV kHs @@ -125420,7 +124506,7 @@ gBp kmM hGX mkk -aTN +aeu bPP bUN bUN @@ -125677,7 +124763,7 @@ oMG clZ itC rCi -aTN +aeu fIn bUN bUN @@ -126404,16 +125490,16 @@ mDQ qGq qGq nIg -sRW +yel tAU lDu sdy jdZ rZV dYw +dYw cBP -cBP -svV +yfv dYw lmO orD @@ -126638,12 +125724,12 @@ vGx kWf kWf sBX -eGp +vGx vGx bQD pio qpZ -eGp +vGx tAG vOX fkP @@ -126657,7 +125743,7 @@ wzI rql eBl loo -gQS +yel mSe yfJ emL @@ -126889,7 +125975,7 @@ seT mrt fsd kWf -eGp +vGx rZV cQJ iFd @@ -126914,7 +126000,7 @@ olC bvm gbv lSN -hun +tAU gKv qsK riR @@ -127140,7 +126226,7 @@ aaa aaa aaa sJS -sRn +pUf sJS kIY eIg @@ -127692,7 +126778,7 @@ jka wat hxe lDu -eGp +vGx giT rZV oXK @@ -127705,7 +126791,7 @@ acm aaa acm izY -pOc +wer eHJ fCb ijH @@ -127754,7 +126840,7 @@ aeu aeu aeU aDS -kfp +nNb bFI rkn coy @@ -127942,7 +127028,7 @@ bRG bvm vXE jrq -gQS +yel dDn jlz mFM @@ -127964,7 +127050,7 @@ qJs lKq iSb wsz -hOc +lKq udT tey tOy @@ -128011,7 +127097,7 @@ aeU aeU aUz aDS -kfp +nNb bFI aeU aeU @@ -128199,7 +127285,7 @@ naG gQS ior jNr -gQS +yel aOI yel cPo @@ -128221,7 +127307,7 @@ aaa hOc hBg srA -hOc +ojk sls hLO hOc @@ -128268,7 +127354,7 @@ cmU cmU cmU aDS -kfp +nNb bFI cmU cmU @@ -128478,7 +127564,7 @@ aaa bBV iSb nDU -nCn +hOc nnR tey gkf @@ -128525,7 +127611,7 @@ gix gix gix gix -kfp +nNb kgD kgD kgD @@ -128712,7 +127798,7 @@ qVG oiX rbj rbj -cbo +rbj rbj rbj rbj @@ -128782,7 +127868,7 @@ eoD eoD eoD eoD -kfp +nNb eoD eoD eoD @@ -128969,7 +128055,7 @@ kpd eEJ uTy wPL -cbo +rbj rbj rbj rbj @@ -129039,7 +128125,7 @@ kgD gix gix gix -kfp +nNb kgD kgD kgD @@ -129231,7 +128317,7 @@ vCg gXR hpZ nxP -vEK +fiU snp lDu iZa @@ -129291,17 +128377,17 @@ pcC aeU cmU cmU -kfp +nNb ckk aaa aaa ckk -kfp +nNb ckk aaa aaa ckk -kfp +nNb aaa aaa aaQ @@ -129474,8 +128560,8 @@ hWf lDu kWf mik -eGp -eGp +vGx +vGx kWf axO gmJ @@ -129553,7 +128639,7 @@ gix kgD kgD nNb -kfp +nNb nNb kgD kgD @@ -129737,7 +128823,7 @@ vQe mrt fsd kWf -eGp +vGx mMA dEM vor @@ -129809,9 +128895,9 @@ eoD eoD eoD eoD -kfp -kfp -kfp +nNb +nNb +nNb eoD eoD eoD @@ -130067,7 +129153,7 @@ kgD kgD gix nNb -kfp +nNb nNb gix gix @@ -130319,17 +129405,17 @@ acm aaa acm aaa -kfp +nNb ckk aaa aaa ckk -kfp +nNb ckk aaa aaa ckk -kfp +nNb aaa aaa aeo @@ -130507,8 +129593,8 @@ rhX lfX mOA rZV -kle -kle +eDU +eDU eDU vOX mtc @@ -130581,7 +129667,7 @@ kgD kgD kgD kgD -kfp +nNb gix gix gix @@ -130838,7 +129924,7 @@ eoD kFo eoD eoD -kfp +nNb eoD eoD eoD @@ -131525,7 +130611,7 @@ cmU cmU cmU aDS -rZl +qzg bFI cmU cmU @@ -131782,7 +130868,7 @@ pyg pyg pyg pyg -rZl +qzg pyg pyg pyg @@ -132039,7 +131125,7 @@ hTs hyB hyB hyB -rZl +qzg hyB hyB hyB @@ -132296,7 +131382,7 @@ pyg pyg pyg pyg -rZl +qzg pyg pyg pyg @@ -132548,17 +131634,17 @@ aaa aeo aaa aaa -rZl +qzg ckk aaa aaa ckk -rZl +qzg ckk aaa aaa ckk -rZl +qzg cmU cmU aUz @@ -132810,7 +131896,7 @@ pyg pyg pyg qzg -rZl +qzg qzg pyg pyg @@ -133066,9 +132152,9 @@ hyB hyB hyB hyB -rZl -rZl -rZl +qzg +qzg +qzg hyB hyB hyB @@ -133324,7 +132410,7 @@ pyg pyg pyg qzg -rZl +qzg qzg pyg pyg @@ -133576,17 +132662,17 @@ aaa aaQ aaa aaa -rZl +qzg ckk aaa aaa ckk -rZl +qzg ckk aaa aaa ckk -rZl +qzg cmU cmU aeU @@ -133838,7 +132924,7 @@ pyg pyg pyg pyg -rZl +qzg pyg pyg pyg @@ -134095,7 +133181,7 @@ hyB hyB hyB hyB -rZl +qzg hyB hyB hyB diff --git a/_maps/map_files/Mafia/mafia_ayylmao.dmm b/_maps/map_files/Mafia/mafia_ayylmao.dmm index a8d3c4cc4f0a05..2a98cea57e6085 100644 --- a/_maps/map_files/Mafia/mafia_ayylmao.dmm +++ b/_maps/map_files/Mafia/mafia_ayylmao.dmm @@ -7,9 +7,8 @@ /area/centcom/mafia) "g" = ( /obj/mafia_game_board, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/centcom/mafia) "h" = ( /obj/structure/grille/indestructable, @@ -70,9 +69,8 @@ /area/centcom/mafia) "v" = ( /obj/mafia_game_board, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/centcom/mafia) "x" = ( /obj/machinery/door/poddoor/preopen{ diff --git a/_maps/map_files/Mafia/mafia_ball.dmm b/_maps/map_files/Mafia/mafia_ball.dmm index 4c910e93cd87d5..e6c8f11c043585 100644 --- a/_maps/map_files/Mafia/mafia_ball.dmm +++ b/_maps/map_files/Mafia/mafia_ball.dmm @@ -12,30 +12,22 @@ /turf/open/floor/plating, /area/centcom/mafia) "e" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/centcom/mafia) "f" = ( -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/centcom/mafia) "g" = ( /obj/mafia_game_board, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/centcom/mafia) "h" = ( /obj/structure/grille/indestructable, /turf/open/floor/plating, /area/centcom/mafia) -"i" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, -/area/centcom/mafia) "j" = ( /obj/machinery/door/airlock/maintenance_hatch{ max_integrity = 99999; @@ -96,9 +88,8 @@ /area/centcom/mafia) "v" = ( /obj/mafia_game_board, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/centcom/mafia) (1,1,1) = {" @@ -219,7 +210,7 @@ b b d d -i +e h c b @@ -231,7 +222,7 @@ a b b c -i +e b b j @@ -446,7 +437,7 @@ b p l b -i +e c b a @@ -557,7 +548,7 @@ b b c h -i +e d d b diff --git a/_maps/map_files/Mafia/mafia_gothic.dmm b/_maps/map_files/Mafia/mafia_gothic.dmm index efa78d15039fc5..ea24a06a74678f 100644 --- a/_maps/map_files/Mafia/mafia_gothic.dmm +++ b/_maps/map_files/Mafia/mafia_gothic.dmm @@ -12,30 +12,22 @@ /turf/open/floor/plating, /area/centcom/mafia) "e" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/centcom/mafia) "f" = ( -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/centcom/mafia) "g" = ( /obj/mafia_game_board, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/centcom/mafia) "h" = ( /obj/structure/grille/indestructable, /turf/open/floor/plating, /area/centcom/mafia) -"i" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, -/area/centcom/mafia) "j" = ( /turf/closed/indestructible/fakedoor, /area/centcom/mafia) @@ -90,9 +82,8 @@ /area/centcom/mafia) "v" = ( /obj/mafia_game_board, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/centcom/mafia) "D" = ( /obj/effect/landmark/mafia, @@ -264,7 +255,7 @@ b b d d -i +e h c b @@ -276,7 +267,7 @@ a b b c -i +e b b j @@ -491,7 +482,7 @@ b p l b -i +e c b a @@ -602,7 +593,7 @@ b b c h -i +e d d b diff --git a/_maps/map_files/Mafia/mafia_lavaland.dmm b/_maps/map_files/Mafia/mafia_lavaland.dmm index fafce04f16c23d..f537cc1f0da633 100644 --- a/_maps/map_files/Mafia/mafia_lavaland.dmm +++ b/_maps/map_files/Mafia/mafia_lavaland.dmm @@ -9,30 +9,22 @@ /turf/open/floor/plating, /area/centcom/mafia) "e" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/centcom/mafia) "f" = ( -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/centcom/mafia) "g" = ( /obj/mafia_game_board, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/centcom/mafia) "h" = ( /obj/structure/grille/indestructable, /turf/open/floor/plating, /area/centcom/mafia) -"i" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, -/area/centcom/mafia) "j" = ( /obj/machinery/door/airlock/external/ruin{ max_integrity = 99999; @@ -52,11 +44,11 @@ name = "miner equipment locker" }, /obj/item/clothing/under/rank/cargo/miner/lavaland, -/turf/open/floor/grass/fakebasalt, +/turf/open/floor/fakebasalt, /area/centcom/mafia) "m" = ( /obj/effect/landmark/mafia, -/turf/open/floor/grass/fakebasalt, +/turf/open/floor/fakebasalt, /area/centcom/mafia) "n" = ( /obj/effect/landmark/mafia, @@ -88,7 +80,7 @@ /turf/closed/indestructible/fakeglass, /area/centcom/mafia) "q" = ( -/turf/open/floor/grass/fakebasalt, +/turf/open/floor/fakebasalt, /area/centcom/mafia) "r" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ @@ -124,9 +116,8 @@ /area/centcom/mafia) "v" = ( /obj/mafia_game_board, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/centcom/mafia) "w" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ @@ -471,7 +462,7 @@ Y Y d d -i +e h c Y @@ -483,7 +474,7 @@ a Y Y c -i +e Y Y j @@ -698,7 +689,7 @@ Y p l Y -i +e c Y a @@ -809,7 +800,7 @@ Y Y c h -i +e d d Y diff --git a/_maps/map_files/Mafia/mafia_snow.dmm b/_maps/map_files/Mafia/mafia_snow.dmm index 70a8dab259fb66..45ecba640e6bcb 100644 --- a/_maps/map_files/Mafia/mafia_snow.dmm +++ b/_maps/map_files/Mafia/mafia_snow.dmm @@ -9,30 +9,22 @@ /turf/open/floor/plating, /area/centcom/mafia) "e" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/centcom/mafia) "f" = ( -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/centcom/mafia) "g" = ( /obj/mafia_game_board, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/centcom/mafia) "h" = ( /obj/structure/grille/indestructable, /turf/open/floor/plating, /area/centcom/mafia) -"i" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, -/area/centcom/mafia) "j" = ( /obj/machinery/door/airlock/maintenance_hatch{ max_integrity = 99999; @@ -323,7 +315,7 @@ a b b s -i +e s s j @@ -649,7 +641,7 @@ b b s h -i +e d d s diff --git a/_maps/map_files/Mafia/mafia_spiderclan.dmm b/_maps/map_files/Mafia/mafia_spiderclan.dmm index 6a35572b575488..3ac8fc6760fa80 100644 --- a/_maps/map_files/Mafia/mafia_spiderclan.dmm +++ b/_maps/map_files/Mafia/mafia_spiderclan.dmm @@ -16,30 +16,22 @@ /turf/open/floor/plating, /area/centcom/mafia) "e" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/centcom/mafia) "f" = ( -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/centcom/mafia) "g" = ( /obj/mafia_game_board, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/centcom/mafia) "h" = ( /obj/structure/grille/indestructable, /turf/open/floor/plating, /area/centcom/mafia) -"i" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, -/area/centcom/mafia) "j" = ( /turf/closed/wall/mineral/wood{ desc = "A door that goes nowhere. How kafkaesque."; @@ -95,9 +87,8 @@ /area/centcom/mafia) "v" = ( /obj/mafia_game_board, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/centcom/mafia) "B" = ( /obj/structure/showcase{ @@ -231,7 +222,7 @@ S S d d -i +e h c S @@ -243,7 +234,7 @@ a S S c -i +e S S j @@ -458,7 +449,7 @@ S p o S -i +e c S a @@ -569,7 +560,7 @@ S S c h -i +e d d S diff --git a/_maps/map_files/Mafia/mafia_syndie.dmm b/_maps/map_files/Mafia/mafia_syndie.dmm index 3d954ee39656d9..9e3c9d1b10d762 100644 --- a/_maps/map_files/Mafia/mafia_syndie.dmm +++ b/_maps/map_files/Mafia/mafia_syndie.dmm @@ -18,30 +18,22 @@ /turf/open/floor/plating, /area/centcom/mafia) "e" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/centcom/mafia) "f" = ( -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/centcom/mafia) "g" = ( /obj/mafia_game_board, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/centcom/mafia) "h" = ( /obj/structure/grille/indestructable, /turf/open/floor/plating, /area/centcom/mafia) -"i" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, -/area/centcom/mafia) "j" = ( /obj/machinery/door/airlock/maintenance_hatch{ max_integrity = 99999; @@ -124,9 +116,8 @@ /area/centcom/mafia) "v" = ( /obj/mafia_game_board, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/centcom/mafia) "w" = ( /turf/closed/indestructible/syndicate, @@ -379,7 +370,7 @@ w w d d -i +e h c w @@ -391,7 +382,7 @@ a w w c -i +e w w j @@ -606,7 +597,7 @@ w p b w -i +e c w a @@ -717,7 +708,7 @@ w w c h -i +e d d w diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 73c367de4cbc73..1f42d43cbfb238 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -85,6 +85,11 @@ }, /turf/open/floor/carpet, /area/station/commons/dorms) +"abi" = ( +/obj/effect/turf_decal/trimline/green/filled/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/security/prison/garden) "abI" = ( /obj/structure/chair/stool/directional/south, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -95,7 +100,7 @@ /obj/effect/turf_decal/tile/red/fourcorners, /obj/machinery/light/small/directional/north, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/safe) "abR" = ( /obj/structure/showcase/cyborg/old{ dir = 4; @@ -156,7 +161,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "adp" = ( /turf/closed/wall, /area/station/hallway/primary/starboard) @@ -291,9 +296,8 @@ /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) "agn" = ( -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/aft) "ago" = ( /obj/machinery/atmospherics/pipe/smart/simple/purple/visible, @@ -328,7 +332,7 @@ /obj/machinery/door/window/left/directional/west{ dir = 2; name = "Cargo Desk"; - req_access = list("mail_sorting") + req_access = list("shipping") }, /obj/item/paper_bin{ pixel_x = -7; @@ -435,7 +439,7 @@ }, /obj/machinery/light/small/directional/south, /turf/open/floor/engine, -/area/station/science/misc_lab/range) +/area/station/science/explab) "aib" = ( /turf/open/floor/plating, /area/station/engineering/supermatter/room) @@ -482,7 +486,7 @@ dir = 1 }, /turf/open/floor/iron/white, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "aja" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -524,6 +528,9 @@ /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 1 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) "akG" = ( @@ -564,6 +571,7 @@ /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 8 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) "amb" = ( @@ -609,7 +617,7 @@ name = "Prisoner Transfer" }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "amo" = ( /obj/structure/chair{ dir = 8; @@ -809,9 +817,8 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/lesser) "aqh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -914,14 +921,14 @@ dir = 4 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/garden) "asy" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/blue/filled/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/execution/transfer) "asz" = ( /obj/structure/table, /obj/item/stack/sheet/iron/fifty, @@ -1001,7 +1008,7 @@ }, /obj/machinery/newscaster/directional/east, /turf/open/floor/grass, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "asX" = ( /obj/machinery/light/directional/north, /turf/open/floor/iron, @@ -1066,7 +1073,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "auh" = ( /obj/effect/turf_decal/stripes/corner{ dir = 8 @@ -1171,7 +1178,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "avJ" = ( /obj/structure/table, /obj/machinery/cell_charger, @@ -1357,7 +1364,7 @@ "azj" = ( /obj/item/radio/intercom/prison/directional/north, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "azn" = ( /obj/machinery/light/small/directional/east, /obj/effect/turf_decal/tile/neutral{ @@ -1385,6 +1392,9 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) +"azw" = ( +/turf/closed/wall/r_wall, +/area/station/science/ordnance/freezerchamber) "azE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, @@ -1397,7 +1407,7 @@ dir = 9 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/garden) "aAb" = ( /obj/structure/table/wood, /obj/item/lipstick{ @@ -1421,7 +1431,7 @@ dir = 4 }, /turf/open/floor/plating/airless, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "aAs" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 8 @@ -1429,14 +1439,8 @@ /turf/open/floor/plating, /area/station/maintenance/starboard/greater) "aAA" = ( -/obj/docking_port/stationary{ - dir = 8; - dwidth = 3; - height = 5; - id = "mining_home"; - name = "mining shuttle bay"; - roundstart_template = /datum/map_template/shuttle/mining/box; - width = 7 +/obj/docking_port/stationary/mining_home{ + dir = 8 }, /turf/open/space/basic, /area/space) @@ -1466,9 +1470,8 @@ /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/west, /obj/machinery/light_switch/directional/south, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/solars/port/fore) "aBJ" = ( /obj/machinery/disposal/bin, @@ -1496,9 +1499,7 @@ /area/station/maintenance/starboard/greater) "aBQ" = ( /obj/structure/cable, -/obj/structure/sign/warning/secure_area{ - pixel_y = 32 - }, +/obj/structure/sign/warning/secure_area/directional/north, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/junction/flip{ dir = 8 @@ -1535,9 +1536,8 @@ "aCm" = ( /obj/effect/landmark/blobstart, /obj/machinery/power/port_gen/pacman/pre_loaded, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "aCy" = ( /obj/structure/table, @@ -1667,7 +1667,7 @@ dir = 1 }, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "aDQ" = ( /obj/structure/chair/comfy/black{ dir = 4 @@ -1778,14 +1778,10 @@ /obj/structure/disposalpipe/trunk{ dir = 4 }, -/obj/machinery/firealarm/directional/west, /obj/effect/turf_decal/tile/blue/fourcorners, +/obj/item/radio/intercom/directional/west, /turf/open/floor/iron/white, /area/station/medical/surgery/theatre) -"aGr" = ( -/obj/structure/lattice, -/turf/open/space/basic, -/area/station/science/xenobiology) "aGD" = ( /obj/structure/closet/crate/coffin, /obj/machinery/door/window/left/directional/east{ @@ -1904,7 +1900,7 @@ /obj/machinery/portable_atmospherics/canister/nitrous_oxide, /obj/effect/turf_decal/siding/purple, /turf/open/floor/iron/dark, -/area/station/science/storage) +/area/station/science/ordnance/storage) "aIX" = ( /obj/machinery/portable_atmospherics/pump, /obj/machinery/light/small/directional/north, @@ -2047,13 +2043,16 @@ }, /turf/open/floor/iron, /area/station/security/checkpoint/engineering) +"aKH" = ( +/turf/closed/wall/r_wall, +/area/station/security/prison/visit) "aKO" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "aKY" = ( /turf/closed/wall/mineral/plastitanium, -/area/station/security/prison) +/area/station/security/prison/safe) "aLf" = ( /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ @@ -2062,7 +2061,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "aLk" = ( /obj/structure/table/reinforced, /obj/effect/turf_decal/tile/bar, @@ -2151,7 +2150,7 @@ dir = 8 }, /turf/open/floor/iron/white, -/area/station/science/misc_lab) +/area/station/science/explab) "aMA" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 8 @@ -2269,7 +2268,7 @@ "aNU" = ( /obj/effect/turf_decal/stripes/end, /turf/open/floor/plating/airless, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "aNZ" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -2432,7 +2431,7 @@ dir = 5 }, /turf/open/floor/iron, -/area/station/science/misc_lab) +/area/station/science/explab) "aQE" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -2527,7 +2526,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "aSD" = ( /obj/structure/window/reinforced, /obj/structure/window/reinforced{ @@ -2538,7 +2537,7 @@ "aSE" = ( /obj/machinery/atmospherics/components/tank, /turf/open/floor/iron/dark, -/area/station/science/storage) +/area/station/science/ordnance/storage) "aSG" = ( /obj/structure/window/reinforced{ dir = 8 @@ -2571,7 +2570,7 @@ dir = 4 }, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/execution/transfer) "aSZ" = ( /obj/machinery/door/poddoor{ id = "QMLoaddoor2"; @@ -2600,9 +2599,8 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/aft) "aTy" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ @@ -2611,7 +2609,7 @@ /obj/effect/turf_decal/box/red, /obj/machinery/portable_atmospherics/canister, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "aTD" = ( /obj/machinery/vending/coffee, /obj/item/radio/intercom/directional/south, @@ -2730,6 +2728,11 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) +"aVA" = ( +/obj/structure/lattice/catwalk, +/obj/structure/marker_beacon/indigo, +/turf/open/space/basic, +/area/space/nearstation) "aVX" = ( /obj/machinery/door/airlock/hatch{ name = "Telecomms Server Room" @@ -2909,7 +2912,7 @@ /obj/effect/turf_decal/trimline/blue/filled/line, /obj/structure/cable, /turf/open/floor/iron/white, -/area/station/science/misc_lab) +/area/station/science/explab) "aYd" = ( /obj/structure/table, /obj/item/paper_bin{ @@ -2942,7 +2945,8 @@ /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ id = "AI Core shutters"; - name = "AI Core Shutters" + name = "AI Core Shutters"; + dir = 1 }, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/ai) @@ -3018,7 +3022,7 @@ /obj/item/shovel/spade, /obj/effect/decal/cleanable/dirt, /turf/open/floor/grass, -/area/station/security/prison) +/area/station/security/prison/garden) "aZD" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -3280,10 +3284,10 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/red/filled/line{ +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/trimline/dark_red/filled/line{ dir = 1 }, -/obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/security/warden) "bfk" = ( @@ -3363,10 +3367,10 @@ "bgB" = ( /obj/effect/decal/cleanable/oil, /turf/open/floor/engine, -/area/station/science/misc_lab/range) +/area/station/science/explab) "bgO" = ( /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "bgS" = ( /obj/machinery/firealarm/directional/north, /obj/machinery/camera/directional/west{ @@ -3488,9 +3492,8 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/duct, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/hallway/secondary/service) "bje" = ( /obj/structure/closet/emcloset, @@ -3553,7 +3556,7 @@ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "bkl" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -3591,7 +3594,7 @@ /obj/machinery/door/window/left/directional/north{ dir = 8; name = "MuleBot Access"; - req_access = list("mail_sorting") + req_access = list("shipping") }, /obj/machinery/navbeacon{ codes_txt = "delivery;dir=4"; @@ -3651,11 +3654,6 @@ }, /turf/open/floor/iron, /area/station/command/gateway) -"bmp" = ( -/turf/open/floor/wood{ - icon_state = "wood-broken7" - }, -/area/station/maintenance/port/aft) "bmz" = ( /obj/machinery/light/small/directional/north, /obj/effect/decal/cleanable/cobweb, @@ -3701,7 +3699,7 @@ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/science/storage) +/area/station/science/ordnance/storage) "bno" = ( /obj/structure/transit_tube/diagonal, /turf/open/space, @@ -3765,7 +3763,7 @@ dir = 4 }, /turf/open/floor/iron, -/area/station/science/misc_lab) +/area/station/science/explab) "bnA" = ( /obj/structure/plasticflaps, /obj/machinery/conveyor{ @@ -4117,7 +4115,7 @@ dir = 8 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "bug" = ( /obj/structure/lattice, /obj/item/tank/internals/oxygen/empty, @@ -4140,9 +4138,7 @@ /turf/closed/wall, /area/station/maintenance/starboard/fore) "buv" = ( -/obj/structure/sign/warning/secure_area{ - pixel_x = -32 - }, +/obj/structure/sign/warning/secure_area/directional/west, /obj/effect/turf_decal/stripes/corner{ dir = 8 }, @@ -4251,9 +4247,7 @@ /turf/open/floor/iron, /area/station/commons/locker) "bxr" = ( -/obj/structure/sign/warning/electric_shock{ - pixel_x = 32 - }, +/obj/structure/sign/warning/electric_shock/directional/east, /turf/open/space/basic, /area/space) "bxE" = ( @@ -4313,9 +4307,7 @@ /turf/open/floor/iron/white, /area/station/science/xenobiology) "byR" = ( -/obj/structure/sign/warning/secure_area{ - pixel_y = 32 - }, +/obj/structure/sign/warning/secure_area/directional/north, /obj/effect/turf_decal/tile/blue{ dir = 4 }, @@ -4441,9 +4433,8 @@ "bBv" = ( /obj/item/shard, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/space/nearstation) "bBK" = ( /obj/structure/table, @@ -4550,7 +4541,7 @@ dir = 1 }, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "bEL" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/structure/cable, @@ -4563,7 +4554,7 @@ dir = 4 }, /turf/open/floor/engine, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "bEU" = ( /obj/structure/table, /obj/item/hand_labeler, @@ -4629,9 +4620,8 @@ /obj/item/stack/sheet/glass/fifty, /obj/structure/closet/crate/engineering/electrical, /obj/item/stack/cable_coil, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/solars/port/aft) "bGt" = ( /obj/machinery/newscaster/directional/east, @@ -4729,20 +4719,13 @@ }, /turf/open/floor/iron, /area/station/security/checkpoint/customs) -"bIB" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, -/area/station/maintenance/starboard/fore) "bIC" = ( /obj/structure/cable, /obj/effect/turf_decal/stripes/corner{ dir = 4 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "bIH" = ( /obj/structure/chair/comfy/beige, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -4992,7 +4975,7 @@ dir = 1 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "bNE" = ( /obj/machinery/light/directional/east, /obj/structure/cable, @@ -5091,9 +5074,8 @@ /area/station/maintenance/department/engine) "bQC" = ( /obj/effect/spawner/random/structure/crate, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/greater) "bQM" = ( /obj/machinery/airalarm/directional/east, @@ -5185,9 +5167,8 @@ /obj/machinery/computer/chef_order{ dir = 8 }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/greater) "bTj" = ( /obj/effect/turf_decal/tile/neutral, @@ -5239,7 +5220,7 @@ dir = 1 }, /turf/open/floor/iron/white, -/area/station/science/misc_lab) +/area/station/science/explab) "bUc" = ( /obj/machinery/shower{ dir = 8 @@ -5316,7 +5297,7 @@ dir = 4 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/visit) "bVI" = ( /obj/item/kirbyplants, /obj/machinery/vending/wallmed/directional/south, @@ -5357,14 +5338,13 @@ /obj/structure/cable, /obj/effect/turf_decal/tile/purple, /turf/open/floor/iron/white, -/area/station/science/misc_lab) +/area/station/science/explab) "bWh" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "bWt" = ( /obj/structure/window/reinforced{ @@ -5458,8 +5438,10 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 }, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/west, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/work) "bYm" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, @@ -5495,9 +5477,8 @@ /obj/machinery/atmospherics/pipe/smart/simple/orange/hidden{ dir = 1 }, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/department/engine) "bZq" = ( /obj/machinery/seed_extractor, @@ -5507,6 +5488,10 @@ /obj/machinery/light_switch/directional/east, /turf/open/floor/iron, /area/station/service/hydroponics) +"bZS" = ( +/obj/structure/sign/warning/vacuum/external, +/turf/closed/wall, +/area/station/cargo/storage) "bZW" = ( /obj/structure/light_construct/directional/north, /turf/open/floor/plating, @@ -5545,7 +5530,7 @@ dir = 4 }, /turf/open/floor/iron/white, -/area/station/science/storage) +/area/station/science/ordnance/storage) "caC" = ( /obj/machinery/portable_atmospherics/canister/oxygen, /obj/effect/turf_decal/box/white{ @@ -5559,7 +5544,7 @@ "caE" = ( /obj/machinery/rnd/experimentor, /turf/open/floor/engine, -/area/station/science/misc_lab/range) +/area/station/science/explab) "cbi" = ( /obj/machinery/camera/directional/east{ c_tag = "Aft Primary Hallway - Fore" @@ -5576,7 +5561,7 @@ "cbF" = ( /obj/machinery/component_printer, /turf/open/floor/iron/white, -/area/station/science/misc_lab) +/area/station/science/explab) "cce" = ( /obj/effect/decal/cleanable/cobweb, /obj/machinery/atmospherics/components/unary/portables_connector/visible/layer4{ @@ -5733,12 +5718,11 @@ }, /area/station/security/prison) "cgC" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored{ - chamber_id = "ordnancegas1"; +/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/ordnance_burn_chamber_input{ dir = 1 }, /turf/open/floor/engine/vacuum, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "cgF" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -5786,9 +5770,7 @@ /turf/open/floor/iron, /area/station/hallway/primary/aft) "chn" = ( -/obj/structure/sign/warning/secure_area{ - pixel_y = -32 - }, +/obj/structure/sign/warning/secure_area/directional/south, /obj/structure/table/reinforced, /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -5846,7 +5828,7 @@ /area/station/maintenance/port/aft) "cit" = ( /turf/open/floor/engine, -/area/station/science/misc_lab/range) +/area/station/science/explab) "ciG" = ( /obj/structure/table/wood, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -5873,10 +5855,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"cjF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible, -/turf/closed/wall/r_wall, -/area/station/science/xenobiology) "cjP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -5898,13 +5876,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/engine, -/area/station/science/misc_lab/range) -"ckb" = ( -/obj/effect/spawner/random/structure/grille, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg2" - }, -/area/space/nearstation) +/area/station/science/explab) "cke" = ( /obj/structure/showcase/machinery/tv{ dir = 1; @@ -5965,9 +5937,8 @@ /area/station/command/teleporter) "cms" = ( /obj/machinery/light/directional/east, -/obj/structure/sign/departments/science{ - name = "\improper ROBOTICS!"; - pixel_x = 32 +/obj/structure/sign/departments/science/directional/east{ + name = "\improper ROBOTICS!" }, /obj/effect/turf_decal/tile/purple{ dir = 4 @@ -6058,9 +6029,8 @@ /area/station/ai_monitored/turret_protected/aisat/foyer) "coI" = ( /obj/effect/spawner/random/maintenance, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "coJ" = ( /obj/structure/chair/stool/directional/north, @@ -6115,9 +6085,8 @@ /obj/effect/landmark/event_spawn, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/aft) "cpB" = ( /obj/machinery/computer/security/telescreen{ @@ -6292,9 +6261,8 @@ spawn_scatter_radius = 1 }, /obj/structure/sign/poster/contraband/random/directional/east, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/lesser) "csb" = ( /obj/effect/turf_decal/trimline/red/filled/line{ @@ -6312,8 +6280,8 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/mapping_helpers/airlock/access/any/engineering/external, /obj/effect/mapping_helpers/airlock/access/any/engineering/general, +/obj/effect/mapping_helpers/airlock/access/any/engineering/construction, /turf/open/floor/iron, /area/station/engineering/break_room) "csL" = ( @@ -6323,7 +6291,7 @@ /obj/structure/cable, /obj/machinery/light_switch/directional/north, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/garden) "csQ" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock{ @@ -6431,9 +6399,7 @@ dir = 1 }, /obj/structure/closet/firecloset, -/obj/structure/sign/warning/secure_area{ - pixel_x = -32 - }, +/obj/structure/sign/warning/secure_area/directional/west, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) "cuR" = ( @@ -6492,7 +6458,7 @@ dir = 8 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/garden) "cvE" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -6633,9 +6599,8 @@ /turf/open/floor/iron, /area/station/hallway/primary/central) "cwU" = ( -/turf/open/floor/wood{ - icon_state = "wood-broken3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/command/corporate_showroom) "cwW" = ( /obj/structure/table/wood, @@ -6751,7 +6716,7 @@ /obj/machinery/light/small/directional/east, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "czG" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -6763,14 +6728,22 @@ }, /turf/open/floor/iron, /area/station/commons/locker) +"czL" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "pharmacy_shutters"; + name = "Pharmacy Shutters"; + dir = 1 + }, +/turf/open/floor/plating, +/area/station/medical/pharmacy) "czM" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/medical/abandoned) "czP" = ( /obj/effect/spawner/random/structure/closet_maintenance, @@ -6811,6 +6784,11 @@ /obj/structure/lattice, /turf/open/space, /area/space/nearstation) +"cAo" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/security/prison/visit) "cAt" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, /obj/machinery/requests_console/directional/east{ @@ -7047,11 +7025,8 @@ dir = 8; pixel_y = -4 }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, /turf/open/floor/iron/freezer, -/area/station/security/prison) +/area/station/security/prison/shower) "cFu" = ( /obj/structure/sign/warning/secure_area, /turf/closed/wall/r_wall, @@ -7143,8 +7118,9 @@ /obj/effect/turf_decal/tile/red{ dir = 1 }, +/obj/machinery/airalarm/directional/west, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "cHN" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -7168,12 +7144,13 @@ dir = 1 }, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "cId" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ id = "rdgene2"; - name = "Genetics Lab Shutters" + name = "Genetics Lab Shutters"; + dir = 8 }, /turf/open/floor/plating, /area/station/science/genetics) @@ -7183,9 +7160,8 @@ /obj/structure/disposalpipe/segment{ dir = 9 }, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/aft) "cIM" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ @@ -7273,7 +7249,7 @@ pixel_y = 32 }, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "cKd" = ( /obj/effect/turf_decal/trimline/blue/filled/warning{ dir = 4 @@ -7391,9 +7367,8 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/aft/lesser) "cNA" = ( /obj/machinery/door/firedoor, @@ -7475,9 +7450,8 @@ /turf/open/floor/iron/white, /area/station/science/research) "cOX" = ( -/obj/structure/sign/warning/radiation/rad_area{ - dir = 1; - pixel_y = 32 +/obj/structure/sign/warning/radiation/rad_area/directional/north{ + dir = 1 }, /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -7560,7 +7534,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/red/anticorner/contrasted, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "cQQ" = ( /obj/machinery/meter, /obj/machinery/atmospherics/pipe/smart/manifold/purple/visible{ @@ -7605,7 +7579,7 @@ "cRM" = ( /obj/machinery/portable_atmospherics/canister/carbon_dioxide, /turf/open/floor/iron/dark, -/area/station/science/storage) +/area/station/science/ordnance/storage) "cRW" = ( /obj/machinery/light/directional/south, /obj/machinery/button/door/directional/south{ @@ -7702,7 +7676,8 @@ /obj/structure/table/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ id = "kitchen_counter"; - name = "Kitchen Counter Shutters" + name = "Kitchen Counter Shutters"; + dir = 1 }, /obj/structure/desk_bell{ pixel_x = 7 @@ -7838,7 +7813,8 @@ /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ id = "rdrnd"; - name = "Research and Development Shutters" + name = "Research and Development Shutters"; + dir = 4 }, /turf/open/floor/plating, /area/station/science/lab) @@ -7891,14 +7867,14 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "cWf" = ( /obj/machinery/portable_atmospherics/canister/plasma, /obj/effect/turf_decal/siding/purple{ dir = 10 }, /turf/open/floor/iron/dark, -/area/station/science/storage) +/area/station/science/ordnance/storage) "cWr" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -7974,9 +7950,8 @@ /area/station/medical/office) "cXG" = ( /obj/effect/landmark/blobstart, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/lesser) "cXP" = ( /obj/effect/spawner/structure/window/reinforced, @@ -7985,9 +7960,8 @@ "cXV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/spawner/random/trash/janitor_supplies, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port) "cXW" = ( /turf/open/floor/carpet/green, @@ -8037,7 +8011,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "cYJ" = ( /obj/docking_port/stationary{ dir = 2; @@ -8152,9 +8126,8 @@ "dax" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/aft/greater) "daC" = ( /turf/open/floor/wood, @@ -8173,7 +8146,7 @@ /obj/item/raw_anomaly_core/random, /obj/effect/turf_decal/stripes/white/line, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "daO" = ( /obj/structure/rack, /obj/item/gun/ballistic/shotgun/riot, @@ -8292,9 +8265,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment, /obj/effect/mapping_helpers/airlock/access/all/medical/morgue, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/aft/greater) "dcF" = ( /obj/effect/landmark/event_spawn, @@ -8356,7 +8328,8 @@ "ddx" = ( /obj/machinery/door/poddoor/shutters/preopen{ id = "rdrnd"; - name = "Research and Development Shutters" + name = "Research and Development Shutters"; + dir = 8 }, /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -8427,9 +8400,8 @@ /area/station/service/lawoffice) "deM" = ( /obj/machinery/airalarm/directional/west, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "deO" = ( /obj/effect/spawner/random/maintenance, @@ -8502,13 +8474,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/brig) -"dfG" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, -/area/station/maintenance/aft/greater) "dfL" = ( /obj/structure/window/reinforced{ dir = 4 @@ -8822,12 +8787,10 @@ }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "dji" = ( /obj/structure/lattice, -/obj/structure/sign/warning/electric_shock{ - pixel_y = -32 - }, +/obj/structure/sign/warning/electric_shock/directional/south, /turf/open/space/basic, /area/space/nearstation) "djG" = ( @@ -9044,7 +9007,7 @@ dir = 10 }, /turf/open/floor/plating/airless, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "dps" = ( /obj/machinery/light/small/directional/west, /obj/machinery/navbeacon{ @@ -9080,7 +9043,7 @@ /obj/structure/table/reinforced, /obj/machinery/door/window/right/directional/south{ name = "Cargo Desk"; - req_access = list("mail_sorting") + req_access = list("shipping") }, /obj/machinery/door/firedoor, /obj/structure/disposalpipe/segment, @@ -9152,7 +9115,7 @@ dir = 1 }, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "dri" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -9202,7 +9165,7 @@ dir = 4 }, /turf/open/floor/iron/dark/airless, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/freezerchamber) "dsb" = ( /obj/effect/turf_decal/plaque{ icon_state = "L13" @@ -9214,7 +9177,7 @@ "dsk" = ( /obj/structure/closet/secure_closet/warden, /obj/item/gun/energy/laser, -/obj/effect/turf_decal/trimline/red/filled/line{ +/obj/effect/turf_decal/trimline/dark_red/filled/line{ dir = 8 }, /turf/open/floor/iron, @@ -9238,7 +9201,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "dss" = ( /obj/machinery/status_display/evac/directional/west, /obj/effect/turf_decal/tile/yellow{ @@ -9324,6 +9287,16 @@ dir = 1 }, /area/station/engineering/atmos/pumproom) +"dur" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/iron/white, +/area/station/security/prison/mess) "duw" = ( /obj/effect/spawner/random/vending/colavend, /obj/effect/turf_decal/tile/neutral{ @@ -9348,12 +9321,16 @@ /area/station/command/bridge) "dvk" = ( /obj/structure/table, -/obj/item/ai_module/reset, /obj/machinery/light/directional/west, /obj/machinery/status_display/ai/directional/west, /obj/machinery/flasher/directional/south{ id = "AI" }, +/obj/item/ai_module/reset{ + pixel_y = 8; + pixel_x = 2 + }, +/obj/item/ai_module/supplied/freeform, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai_upload) "dvn" = ( @@ -9372,9 +9349,7 @@ /turf/open/floor/wood, /area/station/command/heads_quarters/hos) "dvT" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_y = -32 - }, +/obj/structure/sign/warning/vacuum/external/directional/south, /obj/machinery/power/solar_control{ dir = 4; id = "aftport"; @@ -9468,7 +9443,7 @@ dir = 4 }, /turf/open/floor/engine, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "dxO" = ( /obj/structure/extinguisher_cabinet/directional/east, /obj/machinery/camera/directional/east{ @@ -9513,7 +9488,8 @@ /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ id = "rndlab2"; - name = "Secondary Research and Development Shutter" + name = "Secondary Research and Development Shutter"; + dir = 8 }, /turf/open/floor/plating, /area/station/science/lab) @@ -9738,9 +9714,8 @@ /obj/structure/disposalpipe/segment{ dir = 9 }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/aft/greater) "dDZ" = ( /obj/machinery/door/airlock/external{ @@ -10018,14 +9993,12 @@ /area/station/maintenance/department/engine) "dKn" = ( /obj/machinery/light/small/directional/north, -/obj/structure/sign/warning/vacuum/external{ - pixel_y = 32 - }, +/obj/structure/sign/warning/vacuum/external/directional/north, /obj/effect/turf_decal/stripes/line{ dir = 4 }, /turf/open/floor/plating, -/area/station/security/prison) +/area/station/security/execution/transfer) "dKC" = ( /turf/closed/wall, /area/station/maintenance/aft/lesser) @@ -10123,7 +10096,7 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/delivery, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "dLu" = ( /obj/machinery/newscaster/directional/north, /obj/machinery/disposal/bin, @@ -10164,7 +10137,7 @@ dir = 1 }, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "dLQ" = ( /obj/item/clothing/suit/hazardvest, /turf/open/floor/plating, @@ -10246,7 +10219,8 @@ }, /obj/machinery/door/poddoor/shutters/preopen{ id = "kitchen_counter"; - name = "Kitchen Counter Shutters" + name = "Kitchen Counter Shutters"; + dir = 1 }, /obj/item/holosign_creator/robot_seat/restaurant, /turf/open/floor/iron/cafeteria{ @@ -10565,9 +10539,7 @@ /turf/open/floor/engine, /area/station/engineering/supermatter/room) "dRR" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_x = 32 - }, +/obj/structure/sign/warning/vacuum/external/directional/east, /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/structure/cable, /turf/open/floor/plating, @@ -10615,7 +10587,7 @@ dir = 8 }, /turf/open/floor/iron/white, -/area/station/science/storage) +/area/station/science/ordnance/storage) "dTh" = ( /obj/structure/bed, /obj/item/clothing/suit/straight_jacket, @@ -10626,7 +10598,7 @@ dir = 4 }, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/execution/transfer) "dTi" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -10650,7 +10622,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable/layer3, /obj/effect/mapping_helpers/airlock/access/any/command/general, -/obj/effect/mapping_helpers/airlock/access/any/engineering/construction, +/obj/effect/mapping_helpers/airlock/access/any/command/minisat, +/obj/effect/mapping_helpers/airlock/access/any/engineering/tcoms, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) "dTr" = ( @@ -10693,9 +10666,8 @@ /area/station/commons/locker) "dTE" = ( /obj/effect/spawner/random/trash/janitor_supplies, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port) "dTH" = ( /obj/effect/decal/cleanable/dirt/dust, @@ -10857,7 +10829,7 @@ pixel_x = -8 }, /turf/open/floor/iron/white, -/area/station/science/misc_lab) +/area/station/science/explab) "dXe" = ( /obj/machinery/door/airlock/maintenance{ name = "Storage Room" @@ -10891,7 +10863,8 @@ /obj/structure/cable, /obj/machinery/door/poddoor/shutters/preopen{ id = "PermaLockdown"; - name = "Lockdown Shutters" + name = "Lockdown Shutters"; + dir = 4 }, /obj/effect/turf_decal/delivery, /turf/open/floor/plating, @@ -11064,9 +11037,7 @@ dir = 8 }, /obj/item/radio/intercom/directional/north, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) "eax" = ( @@ -11116,9 +11087,8 @@ /turf/open/floor/iron, /area/station/security/brig) "eaW" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "ebn" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -11177,14 +11147,15 @@ /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ id = "roboticsprivacy"; - name = "Robotics Shutters" + name = "Robotics Shutters"; + dir = 8 }, /turf/open/floor/plating, /area/station/science/robotics/lab) "ecn" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "ecp" = ( /obj/machinery/portable_atmospherics/canister/nitrogen, /obj/effect/turf_decal/bot, @@ -11233,7 +11204,7 @@ dir = 1 }, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "edo" = ( /obj/structure/table/glass, /obj/item/paper_bin, @@ -11274,7 +11245,7 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/delivery, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "edP" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/stripes/line{ @@ -11307,7 +11278,7 @@ /obj/machinery/computer/security{ dir = 8 }, -/obj/effect/turf_decal/trimline/red/filled/line{ +/obj/effect/turf_decal/trimline/dark_red/filled/line{ dir = 6 }, /turf/open/floor/iron, @@ -11404,7 +11375,7 @@ }, /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, -/area/station/science/storage) +/area/station/science/ordnance/storage) "egs" = ( /obj/effect/spawner/random/maintenance/two, /obj/structure/rack, @@ -11510,9 +11481,8 @@ "eip" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/sign/poster/contraband/random/directional/east, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port) "eiq" = ( /obj/machinery/light/small/directional/east, @@ -11527,9 +11497,8 @@ /turf/open/floor/iron/dark, /area/station/security/office) "ejd" = ( -/turf/open/floor/wood{ - icon_state = "wood-broken4" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/maintenance/port/aft) "eje" = ( /obj/structure/chair{ @@ -11680,21 +11649,33 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/red/half/contrasted, +/obj/effect/turf_decal/trimline/red/filled/line, /turf/open/floor/iron, /area/station/security/brig) "ekY" = ( /obj/structure/table, -/obj/item/storage/medkit/regular{ - pixel_x = 7; - pixel_y = 5 - }, /obj/structure/disposalpipe/segment{ dir = 4 }, /obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 1 }, +/obj/item/pen/red{ + pixel_x = 8; + pixel_y = 8 + }, +/obj/item/pen/fountain{ + pixel_x = 6; + pixel_y = 0 + }, +/obj/item/pen/blue{ + pixel_x = -5; + pixel_y = -3 + }, +/obj/item/storage/medkit/regular{ + pixel_x = -9; + pixel_y = 10 + }, /turf/open/floor/iron, /area/station/cargo/storage) "elb" = ( @@ -11779,7 +11760,7 @@ /obj/structure/flora/bush/fullgrass/style_random, /obj/item/radio/intercom/directional/east, /turf/open/floor/grass, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "emN" = ( /obj/machinery/door/airlock/external, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -11817,7 +11798,7 @@ }, /obj/machinery/light/directional/south, /turf/open/floor/iron/dark, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "enw" = ( /obj/structure/table, /obj/item/paper_bin, @@ -11857,6 +11838,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/primary/central) +"eoa" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/iron/white, +/area/station/security/prison) "eoj" = ( /obj/machinery/meter{ name = "Mixed Air Tank Out" @@ -11915,7 +11905,7 @@ dir = 10 }, /turf/open/floor/iron/white, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "epi" = ( /obj/structure/window/reinforced/plasma{ dir = 1 @@ -12046,11 +12036,6 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/aisat/exterior) -"err" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, -/area/station/maintenance/starboard/fore) "eru" = ( /obj/structure/rack, /obj/item/stack/cable_coil{ @@ -12215,9 +12200,7 @@ /obj/item/reagent_containers/glass/bottle/formaldehyde{ pixel_x = 1 }, -/obj/structure/sign/warning/chem_diamond{ - pixel_y = 32 - }, +/obj/structure/sign/warning/chem_diamond/directional/north, /turf/open/floor/iron/dark/textured_edge{ dir = 8 }, @@ -12263,7 +12246,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "euc" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/l3closet/janitor, @@ -12287,7 +12270,7 @@ /obj/structure/table, /obj/structure/cable, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "euj" = ( /obj/machinery/suit_storage_unit/standard_unit, /obj/machinery/light_switch/directional/north, @@ -12341,8 +12324,10 @@ /obj/effect/turf_decal/trimline/red/filled/line{ dir = 6 }, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/east, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/visit) "evf" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -12441,7 +12426,7 @@ req_access = list("brig") }, /obj/item/key/security, -/obj/effect/turf_decal/trimline/red/filled/line{ +/obj/effect/turf_decal/trimline/dark_red/filled/line{ dir = 8 }, /obj/structure/disposalpipe/segment{ @@ -12459,7 +12444,7 @@ /obj/effect/landmark/navigate_destination, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/airlock/access/all/engineering/construction, +/obj/effect/mapping_helpers/airlock/access/all/engineering/tech_storage, /turf/open/floor/iron/dark, /area/station/engineering/storage/tech) "ewU" = ( @@ -12509,7 +12494,8 @@ }, /obj/machinery/door/poddoor/shutters/preopen{ id = "pharmacy_shutters"; - name = "Pharmacy Shutters" + name = "Pharmacy Shutters"; + dir = 1 }, /obj/effect/turf_decal/tile/yellow/fourcorners, /obj/structure/desk_bell{ @@ -12525,8 +12511,8 @@ /area/station/command/teleporter) "eyl" = ( /obj/structure/closet/crate/freezer/surplus_limbs, -/obj/item/radio/intercom/directional/south, /obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/firealarm/directional/south, /turf/open/floor/iron/white, /area/station/medical/surgery/theatre) "eyz" = ( @@ -12562,9 +12548,7 @@ /area/station/command/heads_quarters/captain/private) "eze" = ( /obj/structure/closet/emcloset, -/obj/structure/sign/warning/vacuum/external{ - pixel_x = -32 - }, +/obj/structure/sign/warning/vacuum/external/directional/west, /turf/open/floor/plating, /area/station/maintenance/port) "ezg" = ( @@ -12600,9 +12584,7 @@ /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) "eBe" = ( -/obj/structure/sign/warning/radiation/rad_area{ - pixel_y = 32 - }, +/obj/structure/sign/warning/radiation/rad_area/directional/north, /obj/effect/turf_decal/bot_white, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, @@ -12635,9 +12617,8 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/hallway/secondary/service) "eCb" = ( /obj/structure/cable, @@ -12645,7 +12626,7 @@ dir = 8 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "eCg" = ( /obj/effect/turf_decal/tile/yellow{ dir = 8 @@ -12892,12 +12873,11 @@ /obj/machinery/light/directional/west, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/visit) "eGT" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/wood{ - icon_state = "wood-broken4" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/maintenance/port/aft) "eGV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -13045,9 +13025,7 @@ /area/station/hallway/primary/aft) "eLX" = ( /obj/structure/chair, -/obj/structure/sign/warning/vacuum/external{ - pixel_y = 32 - }, +/obj/structure/sign/warning/vacuum/external/directional/north, /obj/effect/turf_decal/stripes/line{ dir = 1 }, @@ -13113,10 +13091,16 @@ /area/station/medical/medbay/central) "eMO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood{ - icon_state = "wood-broken7" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/service/library) +"eMP" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 10 + }, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/iron/white, +/area/station/security/prison/visit) "eMU" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 8 @@ -13269,7 +13253,7 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/stripes/white/line, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "eQs" = ( /obj/machinery/air_sensor/air_tank, /turf/open/floor/engine/air, @@ -13281,7 +13265,7 @@ }, /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, -/area/station/science/storage) +/area/station/science/ordnance/storage) "eQO" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -13332,7 +13316,7 @@ id = "IsolationFlash" }, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/safe) "eRR" = ( /obj/structure/table, /obj/item/screwdriver{ @@ -13435,9 +13419,8 @@ /area/station/commons/fitness/recreation) "eTo" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/aft/lesser) "eTv" = ( /obj/structure/cable, @@ -13461,7 +13444,7 @@ "eUi" = ( /obj/structure/table, /obj/item/storage/bag/plants, -/obj/item/reagent_containers/glass/bucket, +/obj/item/reagent_containers/glass/watering_can, /obj/machinery/light/directional/north, /obj/effect/turf_decal/trimline/brown/warning{ dir = 10 @@ -13521,11 +13504,6 @@ icon_state = "right"; name = "Reception Window" }, -/obj/machinery/door/window/brigdoor{ - dir = 1; - name = "Brig Control Desk"; - req_access = list("armory") - }, /obj/item/paper, /obj/machinery/door/firedoor, /obj/structure/cable, @@ -13534,6 +13512,11 @@ id = "briglockdown"; name = "Warden Desk Shutters" }, +/obj/machinery/door/window/brigdoor{ + dir = 1; + name = "Brig Control Desk"; + req_access = list("armory") + }, /turf/open/floor/iron/showroomfloor, /area/station/security/warden) "eVi" = ( @@ -13570,7 +13553,7 @@ /obj/structure/cable, /obj/machinery/light/directional/south, /turf/open/floor/iron/dark, -/area/station/science/storage) +/area/station/science/ordnance/storage) "eWq" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 9 @@ -13631,9 +13614,8 @@ /obj/structure/bed/dogbed, /obj/effect/decal/cleanable/blood/old, /obj/structure/sign/poster/contraband/random/directional/west, -/turf/open/floor/wood{ - icon_state = "wood-broken3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/maintenance/port/aft) "eXx" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -13678,9 +13660,7 @@ dir = 1 }, /obj/structure/cable, -/obj/structure/sign/departments/lawyer{ - pixel_y = 32 - }, +/obj/structure/sign/departments/lawyer/directional/north, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, @@ -13788,8 +13768,11 @@ dir = 9 }, /obj/machinery/airalarm/directional/west, +/obj/item/computer_hardware/hard_drive/portable/scipaper_program{ + pixel_x = 1 + }, /turf/open/floor/iron/white, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "eZI" = ( /obj/structure/table, /obj/item/clothing/glasses/sunglasses{ @@ -13899,9 +13882,7 @@ /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 8 }, -/obj/structure/sign/departments/psychology{ - pixel_x = -32 - }, +/obj/structure/sign/departments/psychology/directional/west, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, @@ -13997,7 +13978,7 @@ dir = 10 }, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "ffd" = ( /obj/machinery/firealarm/directional/east, /obj/effect/turf_decal/tile/neutral, @@ -14034,9 +14015,8 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/aft) "fge" = ( /obj/structure/chair/stool/directional/south, @@ -14097,9 +14077,8 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/greater) "fhl" = ( /obj/structure/cable, @@ -14172,8 +14151,9 @@ /obj/machinery/door/poddoor/preopen{ id = "transitlockdown" }, +/obj/effect/mapping_helpers/airlock/access/any/engineering/tcoms, /obj/effect/mapping_helpers/airlock/access/any/command/general, -/obj/effect/mapping_helpers/airlock/access/any/engineering/construction, +/obj/effect/mapping_helpers/airlock/access/any/command/minisat, /turf/open/floor/iron/dark, /area/station/engineering/transit_tube) "fip" = ( @@ -14450,7 +14430,7 @@ /obj/item/radio/intercom/directional/north, /obj/machinery/firealarm/directional/west, /turf/open/floor/iron/white, -/area/station/science/misc_lab) +/area/station/science/explab) "fmw" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -14507,7 +14487,7 @@ pixel_y = 3 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "fnf" = ( /obj/machinery/telecomms/message_server/preset, /turf/open/floor/circuit/telecomms/mainframe, @@ -14554,7 +14534,7 @@ }, /obj/structure/cable, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "fpy" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -14736,11 +14716,6 @@ /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, /turf/open/floor/iron, /area/station/engineering/atmos) -"ftg" = ( -/turf/open/floor/wood{ - icon_state = "wood-broken6" - }, -/area/station/maintenance/port/aft) "ftK" = ( /obj/effect/spawner/random/structure/closet_maintenance, /obj/effect/spawner/random/maintenance/four, @@ -14755,7 +14730,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/siding/purple, /turf/open/floor/iron/white, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "ftY" = ( /obj/machinery/light/directional/south, /obj/machinery/firealarm/directional/south, @@ -14813,14 +14788,14 @@ }, /obj/machinery/door/firedoor, /obj/effect/mapping_helpers/airlock/access/all/security/brig, -/turf/open/floor/iron, +/turf/open/floor/iron/dark, /area/station/security/holding_cell) "fxr" = ( /obj/structure/lattice/catwalk, -/obj/structure/marker_beacon/burgundy, /obj/item/instrument/musicalmoth{ name = "Syl Labee" }, +/obj/structure/marker_beacon/olive, /turf/open/space/basic, /area/space/nearstation) "fxI" = ( @@ -14907,8 +14882,9 @@ dir = 4 }, /obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) "fzr" = ( @@ -14921,9 +14897,7 @@ /turf/open/floor/iron, /area/station/service/hydroponics/garden) "fzE" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_y = 32 - }, +/obj/structure/sign/warning/vacuum/external/directional/north, /obj/effect/turf_decal/stripes/line{ dir = 8 }, @@ -14944,7 +14918,7 @@ }, /obj/effect/turf_decal/box/red, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "fAd" = ( /obj/structure/table/reinforced, /obj/machinery/recharger, @@ -14999,7 +14973,7 @@ /obj/machinery/door/window/right/directional/west{ dir = 4; name = "Crate to Shuttle"; - req_access = list("mail_sorting") + req_access = list("shipping") }, /obj/structure/plasticflaps/opaque{ name = "Service Deliveries" @@ -15231,7 +15205,7 @@ }, /obj/machinery/airalarm/directional/east, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "fFK" = ( /obj/structure/cable, /obj/machinery/door/airlock{ @@ -15354,7 +15328,7 @@ "fHN" = ( /obj/machinery/igniter/incinerator_ordmix, /turf/open/floor/engine/vacuum, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "fHV" = ( /obj/structure/table/wood, /obj/item/book/manual/wiki/security_space_law{ @@ -15404,7 +15378,7 @@ dir = 8 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/garden) "fIZ" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/portables_connector/visible/layer2, @@ -15447,7 +15421,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/light/directional/south, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "fJP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/closed/wall/r_wall, @@ -15638,7 +15612,7 @@ "fNl" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/closed/wall/r_wall, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "fNx" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/effect/decal/cleanable/cobweb/cobweb2, @@ -15771,9 +15745,8 @@ /obj/structure/mopbucket, /obj/item/mop, /obj/effect/landmark/blobstart, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "fQo" = ( /obj/item/kirbyplants/random, @@ -15902,13 +15875,6 @@ }, /turf/open/floor/iron, /area/station/service/hydroponics) -"fSX" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/security/office) "fTn" = ( /obj/structure/table/wood, /obj/item/folder/blue, @@ -16051,7 +16017,7 @@ "fWQ" = ( /obj/machinery/atmospherics/components/binary/valve/digital, /turf/open/floor/iron/white, -/area/station/science/storage) +/area/station/science/ordnance/storage) "fWU" = ( /obj/structure/chair/office{ dir = 1 @@ -16080,8 +16046,9 @@ pixel_y = -4 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/airalarm/directional/north, /turf/open/floor/iron/freezer, -/area/station/security/prison) +/area/station/security/prison/shower) "fXi" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -16314,9 +16281,8 @@ /obj/structure/chair/stool/directional/south, /obj/effect/decal/cleanable/cobweb, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood{ - icon_state = "wood-broken7" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/maintenance/port/aft) "gbq" = ( /obj/machinery/vending/wardrobe/chef_wardrobe, @@ -16386,7 +16352,7 @@ /obj/structure/closet/crate/hydroponics, /obj/item/shovel/spade, /obj/item/wrench, -/obj/item/reagent_containers/glass/bucket, +/obj/item/reagent_containers/glass/watering_can, /obj/item/cultivator, /obj/item/wirecutters, /obj/machinery/airalarm/directional/south, @@ -16433,7 +16399,7 @@ /obj/item/hatchet, /obj/item/cultivator, /obj/item/crowbar, -/obj/item/reagent_containers/glass/bucket, +/obj/item/reagent_containers/glass/watering_can, /obj/item/plant_analyzer, /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -16487,9 +16453,7 @@ /turf/open/floor/iron/dark, /area/station/ai_monitored/aisat/exterior) "geD" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_y = 32 - }, +/obj/structure/sign/warning/vacuum/external/directional/north, /obj/machinery/light/small/directional/north, /turf/open/floor/iron, /area/station/hallway/primary/fore) @@ -16620,7 +16584,7 @@ /obj/machinery/door/firedoor/heavy, /obj/effect/mapping_helpers/airlock/access/all/science/ordnance_storage, /turf/open/floor/plating, -/area/station/science/storage) +/area/station/science/ordnance/storage) "ggU" = ( /obj/machinery/firealarm/directional/south, /obj/effect/turf_decal/tile/neutral{ @@ -16715,8 +16679,9 @@ /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/white, -/area/station/security/prison) +/area/station/security/prison/mess) "giz" = ( /obj/machinery/conveyor/inverted{ dir = 10; @@ -16735,6 +16700,15 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/station/engineering/main) +"giK" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/security/brig) "giT" = ( /obj/effect/spawner/random/structure/closet_maintenance, /obj/effect/spawner/random/maintenance/two, @@ -16767,7 +16741,7 @@ "gjo" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "gjr" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, @@ -16792,7 +16766,8 @@ /obj/item/food/pie/cream, /obj/machinery/door/poddoor/shutters/preopen{ id = "kitchen_counter"; - name = "Kitchen Counter Shutters" + name = "Kitchen Counter Shutters"; + dir = 1 }, /turf/open/floor/iron/cafeteria{ dir = 5 @@ -16831,9 +16806,8 @@ /area/station/science/research) "glh" = ( /obj/structure/chair/stool/directional/west, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/aft) "gll" = ( /turf/closed/wall/r_wall, @@ -16945,7 +16919,7 @@ /area/station/hallway/primary/central) "gmL" = ( /turf/open/floor/plating/airless, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "gmS" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -16975,7 +16949,7 @@ /obj/effect/landmark/start/warden, /obj/structure/chair/office, /obj/structure/cable, -/obj/effect/turf_decal/trimline/red/filled/line, +/obj/effect/turf_decal/trimline/dark_red/filled/line, /turf/open/floor/iron, /area/station/security/warden) "gnA" = ( @@ -17331,9 +17305,7 @@ /obj/structure/disposalpipe/segment{ dir = 6 }, -/obj/structure/sign/warning/vacuum/external{ - pixel_x = -32 - }, +/obj/structure/sign/warning/vacuum/external/directional/west, /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 8 }, @@ -17378,7 +17350,8 @@ "gvg" = ( /obj/structure/table/reinforced, /obj/machinery/door/poddoor/shutters{ - id = "abandoned_kitchen" + id = "abandoned_kitchen"; + dir = 4 }, /turf/open/floor/plating, /area/station/maintenance/port/aft) @@ -17400,7 +17373,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/door/firedoor, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/garden) "gvG" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/unres, @@ -17413,9 +17386,7 @@ /turf/open/space/basic, /area/space/nearstation) "gvI" = ( -/obj/structure/sign/warning/vacuum{ - pixel_y = -32 - }, +/obj/structure/sign/warning/vacuum/directional/south, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, @@ -17506,7 +17477,6 @@ "gyG" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/delivery, -/obj/structure/cable, /obj/machinery/door/airlock/security/glass{ name = "Gear Room" }, @@ -17619,7 +17589,7 @@ /obj/structure/cable, /obj/item/plant_analyzer, /turf/open/floor/grass, -/area/station/security/prison) +/area/station/security/prison/garden) "gAT" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, /turf/closed/wall/r_wall, @@ -17815,10 +17785,9 @@ /obj/machinery/computer/shuttle/labor{ dir = 4 }, -/obj/effect/turf_decal/tile/red{ +/obj/effect/turf_decal/tile/red/half/contrasted{ dir = 4 }, -/obj/effect/turf_decal/tile/red, /turf/open/floor/iron, /area/station/security/brig) "gEX" = ( @@ -17893,7 +17862,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/science/ordnance, /turf/open/floor/iron/dark/airless, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/freezerchamber) "gFL" = ( /obj/effect/turf_decal/tile/green{ dir = 4 @@ -18025,7 +17994,8 @@ "gJi" = ( /obj/machinery/door/poddoor/shutters/preopen{ id = "PermaLockdown"; - name = "Lockdown Shutters" + name = "Lockdown Shutters"; + dir = 4 }, /obj/effect/turf_decal/delivery, /obj/structure/cable, @@ -18045,9 +18015,8 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/aft/greater) "gJn" = ( /obj/structure/disposalpipe/segment, @@ -18279,7 +18248,7 @@ dir = 8 }, /turf/open/floor/plating/airless, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "gNl" = ( /obj/machinery/door/airlock/medical/glass{ name = "Medbay Storage" @@ -18306,8 +18275,8 @@ /area/station/command/bridge) "gND" = ( /obj/machinery/iv_drip, -/obj/item/radio/intercom/directional/south, /obj/effect/turf_decal/tile/blue/half/contrasted, +/obj/machinery/light/directional/south, /turf/open/floor/iron/white, /area/station/medical/surgery/aft) "gNF" = ( @@ -18442,7 +18411,7 @@ dir = 8 }, /turf/open/floor/iron/dark, -/area/station/science/storage) +/area/station/science/ordnance/storage) "gQt" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -18451,7 +18420,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/visit) "gQv" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -18503,9 +18472,8 @@ /area/station/security/prison) "gQZ" = ( /obj/item/kirbyplants/dead, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/space/nearstation) "gRb" = ( /obj/effect/spawner/structure/window/reinforced, @@ -18557,7 +18525,8 @@ /obj/effect/turf_decal/stripes/line, /obj/machinery/door/poddoor/shutters/preopen{ id = "XenoPens"; - name = "Xenobiology Lockdown" + name = "Xenobiology Lockdown"; + dir = 8 }, /turf/open/floor/iron, /area/station/science/xenobiology) @@ -18696,9 +18665,7 @@ /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 }, -/obj/structure/sign/warning/electric_shock{ - pixel_y = 32 - }, +/obj/structure/sign/warning/electric_shock/directional/north, /turf/open/floor/iron, /area/station/hallway/primary/fore) "gUM" = ( @@ -18877,7 +18844,7 @@ "gXr" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, /turf/closed/wall/r_wall, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "gXu" = ( /turf/open/floor/plating, /area/station/engineering/main) @@ -18933,9 +18900,7 @@ /turf/open/floor/iron, /area/station/security/range) "gXP" = ( -/obj/structure/sign/warning/secure_area{ - pixel_y = 32 - }, +/obj/structure/sign/warning/secure_area/directional/north, /obj/effect/turf_decal/stripes/line{ dir = 9 }, @@ -18974,9 +18939,8 @@ /obj/machinery/computer/slot_machine{ pixel_y = 2 }, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/aft) "gYO" = ( /obj/effect/turf_decal/tile/yellow{ @@ -18999,7 +18963,7 @@ dir = 9 }, /turf/open/floor/iron/white, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "gZD" = ( /obj/structure/table/glass, /obj/effect/turf_decal/tile/blue/fourcorners, @@ -19037,6 +19001,16 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) +"hae" = ( +/obj/structure/chair, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/east, +/turf/open/floor/iron/white, +/area/station/security/prison/mess) "hao" = ( /obj/machinery/light/directional/north, /obj/effect/turf_decal/siding/wood{ @@ -19132,6 +19106,8 @@ /obj/effect/turf_decal/trimline/red/filled/line{ dir = 9 }, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/west, /turf/open/floor/iron/white, /area/station/security/prison) "hcP" = ( @@ -19195,6 +19171,9 @@ /obj/structure/sign/warning/electric_shock, /turf/open/floor/engine, /area/station/science/xenobiology) +"hdz" = ( +/turf/closed/wall, +/area/station/security/prison/shower) "hdF" = ( /obj/effect/turf_decal/trimline/blue/filled/line, /obj/machinery/suit_storage_unit/medical, @@ -19301,11 +19280,6 @@ }, /turf/open/floor/iron, /area/station/security/brig) -"hgB" = ( -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" - }, -/area/station/solars/port/fore) "hgE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/railing, @@ -19360,7 +19334,7 @@ id = "briglockdown"; name = "Brig Shutters" }, -/turf/open/floor/iron, +/turf/open/floor/plating, /area/station/security/brig) "hht" = ( /obj/effect/spawner/structure/window/reinforced, @@ -19422,9 +19396,8 @@ }, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/aft/greater) "hja" = ( /obj/effect/turf_decal/stripes/line{ @@ -19556,9 +19529,8 @@ name = "Science Deliveries" }, /obj/structure/disposalpipe/trunk, -/obj/structure/sign/departments/science{ - color = "#D381C9"; - pixel_y = -32 +/obj/structure/sign/departments/science/directional/south{ + color = "#D381C9" }, /turf/open/floor/iron, /area/station/cargo/sorting) @@ -19631,9 +19603,8 @@ "hmc" = ( /obj/structure/rack, /obj/effect/spawner/random/maintenance, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "hmf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -19788,15 +19759,13 @@ /area/station/service/lawoffice) "hpa" = ( /obj/structure/table/wood, -/turf/open/floor/wood{ - icon_state = "wood-broken6" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/cargo/qm) "hpf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "hpi" = ( /obj/effect/turf_decal/plaque{ @@ -19850,9 +19819,7 @@ dir = 8; name = "emergency shower" }, -/obj/structure/sign/warning/secure_area{ - pixel_y = 32 - }, +/obj/structure/sign/warning/secure_area/directional/north, /obj/effect/turf_decal/stripes/line{ dir = 5 }, @@ -19938,7 +19905,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "hsF" = ( /obj/machinery/door/airlock{ id_tag = "AuxToilet3"; @@ -20057,7 +20024,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "hum" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/closed/wall/r_wall, @@ -20154,7 +20121,7 @@ dir = 1 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "hvO" = ( /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 8 @@ -20226,9 +20193,8 @@ /area/station/security/prison) "hxb" = ( /obj/effect/spawner/random/structure/chair_maintenance, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/department/engine) "hxe" = ( /obj/effect/turf_decal/stripes/line{ @@ -20374,15 +20340,11 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark, /area/station/medical/break_room) -"hyw" = ( -/obj/effect/spawner/structure/window, -/turf/open/floor/plating, -/area/station/cargo/qm) "hyA" = ( /obj/machinery/door/poddoor/massdriver_ordnance, /obj/structure/fans/tiny, /turf/open/floor/plating, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "hyC" = ( /obj/structure/disposaloutlet{ desc = "An outlet for the pneumatic disposal system. This one seems designed for rapid corpse disposal."; @@ -20469,7 +20431,7 @@ }, /obj/machinery/firealarm/directional/east, /turf/open/floor/iron/dark, -/area/station/science/storage) +/area/station/science/ordnance/storage) "hAE" = ( /obj/machinery/light/small/directional/west, /turf/open/floor/iron/dark/telecomms, @@ -20542,9 +20504,7 @@ /turf/open/floor/plating, /area/station/maintenance/starboard/greater) "hCn" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_y = 32 - }, +/obj/structure/sign/warning/vacuum/external/directional/north, /obj/effect/decal/cleanable/cobweb, /obj/effect/spawner/random/structure/crate, /turf/open/floor/plating, @@ -20622,7 +20582,7 @@ /area/station/security/checkpoint/supply) "hEm" = ( /turf/open/floor/engine/vacuum, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "hEA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -20761,7 +20721,7 @@ dir = 8 }, /turf/open/floor/iron/white, -/area/station/science/misc_lab) +/area/station/science/explab) "hHd" = ( /obj/effect/spawner/random/maintenance, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -20834,7 +20794,7 @@ dir = 5 }, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/execution/transfer) "hIE" = ( /obj/structure/cable, /obj/machinery/status_display/evac/directional/west, @@ -20887,6 +20847,7 @@ dir = 1 }, /obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm/directional/south, /turf/open/floor/iron, /area/station/security/holding_cell) "hJF" = ( @@ -20929,7 +20890,7 @@ dir = 8 }, /turf/open/floor/plating/airless, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "hKv" = ( /obj/structure/chair/pew/left, /turf/open/floor/iron/chapel{ @@ -20985,7 +20946,7 @@ }, /obj/item/radio/intercom/directional/north, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "hLj" = ( /obj/machinery/light/directional/west, /obj/structure/extinguisher_cabinet/directional/west, @@ -21043,7 +21004,7 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/stripes/white/line, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "hMn" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 4 @@ -21200,13 +21161,13 @@ req_access = list("ordnance") }, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "hOX" = ( /obj/structure/rack, /obj/item/integrated_circuit/loaded/hello_world, /obj/item/integrated_circuit/loaded/speech_relay, /turf/open/floor/iron/white, -/area/station/science/misc_lab) +/area/station/science/explab) "hPu" = ( /obj/machinery/atmospherics/pipe/smart/simple/orange/hidden{ dir = 5 @@ -21222,7 +21183,8 @@ /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ id = "pharmacy_shutters_2"; - name = "Pharmacy Shutters" + name = "Pharmacy Shutters"; + dir = 4 }, /turf/open/floor/plating, /area/station/medical/pharmacy) @@ -21278,7 +21240,7 @@ dir = 5 }, /turf/open/floor/iron/white, -/area/station/science/misc_lab) +/area/station/science/explab) "hQT" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -21307,7 +21269,7 @@ dir = 4 }, /obj/structure/reagent_dispensers/watertank/high, -/obj/item/reagent_containers/glass/bucket, +/obj/item/reagent_containers/glass/watering_can, /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, /area/station/service/hydroponics) @@ -21424,9 +21386,7 @@ /area/station/engineering/supermatter/room) "hSP" = ( /obj/machinery/space_heater, -/obj/structure/sign/warning/vacuum/external{ - pixel_y = 32 - }, +/obj/structure/sign/warning/vacuum/external/directional/north, /turf/open/floor/plating, /area/station/maintenance/port/fore) "hTn" = ( @@ -21557,10 +21517,9 @@ /obj/machinery/camera/directional/north{ c_tag = "Central Primary Hallway - Fore - ai_upload" }, -/obj/structure/sign/warning/secure_area{ +/obj/structure/sign/warning/secure_area/directional/north{ desc = "A warning sign which reads 'HIGH-POWER TURRETS AHEAD'."; - name = "\improper HIGH-POWER TURRETS AHEAD"; - pixel_y = 32 + name = "\improper HIGH-POWER TURRETS AHEAD" }, /obj/effect/turf_decal/stripes/corner{ dir = 4 @@ -21901,13 +21860,13 @@ /obj/effect/turf_decal/box/red, /obj/machinery/portable_atmospherics/canister, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "hZD" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer2{ dir = 6 }, /turf/open/floor/iron/dark/airless, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/freezerchamber) "hZO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -21990,16 +21949,16 @@ /obj/machinery/door/firedoor, /obj/effect/mapping_helpers/airlock/access/all/security/brig, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/execution/transfer) "ibV" = ( /obj/machinery/light_switch/directional/north, /turf/open/floor/iron/freezer, -/area/station/security/prison) +/area/station/security/prison/shower) "ibW" = ( /obj/structure/tank_dispenser, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "ibX" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -22027,9 +21986,8 @@ /turf/open/floor/plating, /area/station/maintenance/central) "icn" = ( -/turf/open/floor/plating/airless{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating/airless, /area/station/solars/port/aft) "icC" = ( /obj/structure/disposalpipe/segment{ @@ -22266,7 +22224,8 @@ }, /obj/machinery/door/poddoor/shutters/preopen{ id = "PermaLockdown"; - name = "Lockdown Shutters" + name = "Lockdown Shutters"; + dir = 4 }, /obj/effect/turf_decal/delivery, /turf/open/floor/plating, @@ -22287,7 +22246,7 @@ dir = 1 }, /turf/open/floor/plating, -/area/station/security/prison) +/area/station/security/execution/transfer) "igZ" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/command{ @@ -22331,7 +22290,7 @@ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "ihF" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 @@ -22461,9 +22420,8 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "ijZ" = ( /obj/structure/cable, @@ -22478,7 +22436,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "ikw" = ( /obj/machinery/hydroponics/constructable, /obj/effect/turf_decal/bot, @@ -22495,7 +22453,7 @@ dir = 8 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/access/all/engineering/construction, +/obj/effect/mapping_helpers/airlock/access/all/command/minisat, /turf/open/floor/iron/dark, /area/station/ai_monitored/command/storage/satellite) "ikJ" = ( @@ -22534,7 +22492,7 @@ dir = 6 }, /turf/open/floor/plating/airless, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "ikZ" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -22621,7 +22579,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/door/firedoor, /obj/effect/turf_decal/tile/yellow/fourcorners, -/obj/effect/mapping_helpers/airlock/access/any/engineering/external, +/obj/effect/mapping_helpers/airlock/access/any/engineering/construction, /obj/effect/mapping_helpers/airlock/access/any/engineering/general, /turf/open/floor/iron, /area/station/engineering/storage_shared) @@ -22698,9 +22656,7 @@ desc = "A pneumatic waste disposal unit. This one leads into space!"; name = "deathsposal unit" }, -/obj/structure/sign/warning/deathsposal{ - pixel_y = -32 - }, +/obj/structure/sign/warning/deathsposal/directional/south, /obj/structure/disposalpipe/trunk{ dir = 4 }, @@ -22823,9 +22779,8 @@ /turf/open/floor/iron/dark, /area/station/medical/morgue) "ipq" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/aft) "ipy" = ( /obj/structure/cable, @@ -22849,7 +22804,7 @@ "ipF" = ( /obj/machinery/mass_driver/ordnance, /turf/open/floor/plating, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "ipG" = ( /obj/structure/table, /obj/item/poster/random_contraband, @@ -23222,14 +23177,14 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/structure/chair/office/light, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "ivi" = ( /obj/machinery/hydroponics/soil, /obj/item/cultivator, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /turf/open/floor/grass, -/area/station/security/prison) +/area/station/security/prison/garden) "ivx" = ( /obj/effect/spawner/random/structure/chair_maintenance{ dir = 8 @@ -23561,6 +23516,17 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) +"izK" = ( +/obj/machinery/shower{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/north, +/turf/open/floor/iron/freezer, +/area/station/security/prison/shower) +"izM" = ( +/turf/closed/wall, +/area/station/security/prison/mess) "iAd" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -23591,7 +23557,7 @@ dir = 4 }, /obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/trimline/red/filled/line{ +/obj/effect/turf_decal/trimline/dark_red/filled/line{ dir = 8 }, /turf/open/floor/iron, @@ -23636,7 +23602,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, -/area/station/science/storage) +/area/station/science/ordnance/storage) "iBX" = ( /obj/machinery/computer/operating, /obj/machinery/light/small/directional/north, @@ -23662,7 +23628,7 @@ dir = 1 }, /turf/open/floor/iron/white, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "iCz" = ( /obj/effect/mapping_helpers/airlock/locked, /obj/machinery/door/airlock/vault{ @@ -23818,7 +23784,7 @@ "iER" = ( /obj/machinery/airalarm/directional/east, /turf/open/floor/engine, -/area/station/science/misc_lab/range) +/area/station/science/explab) "iFe" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/white/line{ @@ -23840,9 +23806,8 @@ /area/station/medical/medbay/central) "iFr" = ( /obj/structure/reagent_dispensers/watertank, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/aft) "iFz" = ( /turf/open/floor/iron, @@ -24013,7 +23978,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/safe) "iIq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/chapel{ @@ -24116,9 +24081,8 @@ /area/station/maintenance/solars/port/fore) "iJo" = ( /obj/structure/easel, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "iJB" = ( /obj/structure/closet/emcloset, @@ -24233,7 +24197,7 @@ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "iMk" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -24266,7 +24230,8 @@ "iMr" = ( /obj/machinery/door/poddoor/shutters/preopen{ id = "chem_lockdown"; - name = "Chemistry Shutters" + name = "Chemistry Shutters"; + dir = 8 }, /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -24337,9 +24302,8 @@ /turf/open/floor/iron/white, /area/station/command/heads_quarters/cmo) "iNh" = ( -/obj/structure/sign/warning/cold_temp{ - name = "\improper CRYOGENICS"; - pixel_y = 32 +/obj/structure/sign/warning/cold_temp/directional/north{ + name = "\improper CRYOGENICS" }, /obj/machinery/light/directional/north, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, @@ -24421,7 +24385,7 @@ dir = 8 }, /turf/open/floor/iron/white, -/area/station/science/storage) +/area/station/science/ordnance/storage) "iOp" = ( /obj/machinery/door/airlock/command{ name = "Command Desk" @@ -24496,6 +24460,9 @@ }, /turf/open/floor/plating, /area/station/maintenance/disposal) +"iPI" = ( +/turf/open/floor/iron, +/area/station/security/execution/transfer) "iPM" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -24509,7 +24476,7 @@ /obj/structure/disposalpipe/segment, /obj/effect/mapping_helpers/airlock/access/all/science/ordnance, /turf/open/floor/iron/white, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "iPX" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/secure_closet/brig{ @@ -24607,8 +24574,9 @@ /obj/machinery/door/poddoor/preopen{ id = "transitlockdown" }, +/obj/effect/mapping_helpers/airlock/access/any/engineering/tcoms, /obj/effect/mapping_helpers/airlock/access/any/command/general, -/obj/effect/mapping_helpers/airlock/access/any/engineering/construction, +/obj/effect/mapping_helpers/airlock/access/any/command/minisat, /turf/open/floor/iron/dark, /area/station/engineering/transit_tube) "iRr" = ( @@ -24731,7 +24699,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable/layer3, /obj/effect/mapping_helpers/airlock/access/any/command/general, -/obj/effect/mapping_helpers/airlock/access/any/engineering/construction, +/obj/effect/mapping_helpers/airlock/access/any/command/minisat, +/obj/effect/mapping_helpers/airlock/access/any/engineering/tcoms, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat/foyer) "iSk" = ( @@ -24745,8 +24714,8 @@ /turf/open/floor/iron, /area/station/hallway/primary/port) "iSE" = ( -/obj/machinery/door/airlock/external{ - name = "Supply Dock Airlock" +/obj/machinery/door/airlock/external/glass{ + name = "Supply Door Airlock" }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -24761,7 +24730,7 @@ pixel_y = 5 }, /turf/open/floor/iron, -/area/station/science/misc_lab) +/area/station/science/explab) "iSI" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -24896,7 +24865,7 @@ /obj/effect/turf_decal/stripes/white/line, /obj/machinery/research/anomaly_refinery, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "iVs" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -25110,9 +25079,8 @@ /obj/machinery/computer/slot_machine{ pixel_y = 2 }, -/turf/open/floor/wood{ - icon_state = "wood-broken4" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/maintenance/port/aft) "iZF" = ( /obj/structure/cable, @@ -25152,7 +25120,7 @@ name = "Visitation" }, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/visit) "jaq" = ( /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ dir = 10 @@ -25291,7 +25259,7 @@ network = list("ss13","prison") }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "jdn" = ( /obj/effect/turf_decal/trimline/brown/filled/line, /obj/structure/disposalpipe/segment{ @@ -25323,9 +25291,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/spawner/random/structure/closet_maintenance, /obj/effect/spawner/random/maintenance/two, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/aft) "jef" = ( /obj/effect/turf_decal/tile/neutral{ @@ -25372,6 +25339,7 @@ dir = 4 }, /obj/structure/disposalpipe/segment, +/obj/machinery/firealarm/directional/east, /turf/open/floor/iron, /area/station/hallway/primary/central) "jfa" = ( @@ -25455,7 +25423,8 @@ "jfX" = ( /obj/machinery/door/poddoor/shutters{ id = "visitation"; - name = "Visitation Shutters" + name = "Visitation Shutters"; + dir = 4 }, /obj/machinery/door/window/left/directional/south{ dir = 4 @@ -25463,21 +25432,20 @@ /obj/structure/window/reinforced, /obj/structure/table, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/visit) "jfY" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "jgg" = ( /obj/structure/cable, /obj/machinery/light_switch/directional/south, /obj/machinery/power/apc/auto_name/directional/west, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/solars/starboard/fore) "jgk" = ( /obj/structure/cable, @@ -25496,8 +25464,8 @@ dir = 4 }, /obj/structure/bed/dogbed/runtime, -/mob/living/simple_animal/pet/cat/runtime, /obj/item/toy/cattoy, +/mob/living/simple_animal/pet/cat/runtime, /turf/open/floor/iron/white, /area/station/command/heads_quarters/cmo) "jgt" = ( @@ -25572,9 +25540,8 @@ "jhc" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "jhd" = ( /obj/structure/cable, @@ -25617,9 +25584,8 @@ /area/station/cargo/storage) "jhD" = ( /obj/structure/closet/radiation, -/obj/structure/sign/warning/radiation/rad_area{ - dir = 1; - pixel_y = 32 +/obj/structure/sign/warning/radiation/rad_area/directional/north{ + dir = 1 }, /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -25678,7 +25644,7 @@ dir = 9 }, /turf/open/floor/iron/dark, -/area/station/science/storage) +/area/station/science/ordnance/storage) "jjm" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -25733,7 +25699,7 @@ /turf/open/floor/iron, /area/station/hallway/secondary/entry) "jkj" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ +/obj/effect/turf_decal/trimline/red/filled/warning{ dir = 4 }, /turf/open/floor/iron, @@ -25746,7 +25712,7 @@ dir = 8 }, /turf/open/floor/iron/white, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "jkT" = ( /obj/structure/cable, /obj/effect/turf_decal/stripes/line{ @@ -25781,9 +25747,8 @@ /area/station/cargo/sorting) "jle" = ( /obj/structure/sign/poster/contraband/random/directional/east, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/aft) "jln" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -25900,7 +25865,8 @@ /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ id = "rdgene"; - name = "Genetics Lab Shutters" + name = "Genetics Lab Shutters"; + dir = 1 }, /turf/open/floor/plating, /area/station/science/genetics) @@ -25915,7 +25881,7 @@ dir = 8 }, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/execution/transfer) "jnl" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/command/glass{ @@ -25973,9 +25939,8 @@ "jod" = ( /obj/effect/spawner/random/structure/chair_flipped, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/aft/lesser) "joj" = ( /obj/item/radio/intercom/directional/east, @@ -26017,7 +25982,7 @@ }, /obj/effect/turf_decal/box/red, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "jpr" = ( /obj/structure/rack, /obj/effect/spawner/random/techstorage/command_all, @@ -26072,7 +26037,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "jpO" = ( /obj/machinery/door/airlock/external, /obj/effect/mapping_helpers/airlock/cyclelink_helper, @@ -26140,7 +26105,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/execution/transfer) "jrL" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -26339,7 +26304,7 @@ dir = 9 }, /turf/open/floor/plating/airless, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "jtE" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 1 @@ -26347,7 +26312,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "jtI" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -26421,6 +26386,9 @@ }, /turf/open/floor/iron, /area/station/engineering/break_room) +"juM" = ( +/turf/closed/wall/r_wall, +/area/station/security/execution/transfer) "juV" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -26511,8 +26479,6 @@ /turf/open/floor/iron, /area/station/science/xenobiology) "jwg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 8 }, @@ -26587,9 +26553,8 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/landmark/start/hangover, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/lesser) "jwW" = ( /obj/machinery/door/firedoor, @@ -26656,7 +26621,7 @@ /area/station/science/genetics) "jye" = ( /obj/structure/cable, -/obj/effect/turf_decal/trimline/red/filled/line{ +/obj/effect/turf_decal/trimline/dark_red/filled/line{ dir = 1 }, /turf/open/floor/iron, @@ -26823,11 +26788,6 @@ /obj/structure/cable, /turf/open/floor/grass, /area/station/medical/virology) -"jBX" = ( -/turf/open/floor/plating/airless{ - icon_state = "platingdmg3" - }, -/area/space/nearstation) "jBY" = ( /obj/machinery/hydroponics/constructable, /obj/effect/turf_decal/bot, @@ -26838,7 +26798,7 @@ /obj/item/cultivator, /obj/effect/decal/cleanable/dirt, /turf/open/floor/grass, -/area/station/security/prison) +/area/station/security/prison/garden) "jCj" = ( /obj/item/toy/beach_ball/holoball, /turf/open/floor/plating, @@ -26885,7 +26845,7 @@ "jCX" = ( /obj/item/bodypart/l_arm, /turf/open/floor/plating/airless, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "jDb" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/blobstart, @@ -26969,7 +26929,7 @@ /obj/structure/disposalpipe/segment, /obj/effect/mapping_helpers/airlock/access/all/science/ordnance, /turf/open/floor/iron/white, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "jEY" = ( /obj/structure/table, /obj/item/phone{ @@ -27074,7 +27034,7 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/stripes/white/line, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "jHg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -27137,7 +27097,7 @@ dir = 4 }, /turf/open/floor/iron/white, -/area/station/science/storage) +/area/station/science/ordnance/storage) "jHW" = ( /obj/effect/turf_decal/trimline/yellow/filled/line, /obj/effect/turf_decal/trimline/brown/filled/warning, @@ -27168,9 +27128,8 @@ /turf/open/floor/iron, /area/station/engineering/atmos/storage/gas) "jIP" = ( -/turf/open/floor/plating/airless{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/station/solars/port/fore) "jIR" = ( /obj/effect/spawner/structure/window, @@ -27192,6 +27151,13 @@ /obj/structure/displaycase/trophy, /turf/open/floor/wood, /area/station/service/library) +"jJa" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/security/brig) "jJd" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 10 @@ -27228,7 +27194,7 @@ dir = 6 }, /turf/open/floor/plating/airless, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "jJC" = ( /obj/structure/disposalpipe/segment, /obj/structure/lattice/catwalk, @@ -27238,9 +27204,8 @@ "jJH" = ( /obj/item/reagent_containers/glass/rag, /obj/structure/table/wood, -/turf/open/floor/wood{ - icon_state = "wood-broken4" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/maintenance/port/aft) "jJR" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ @@ -27380,7 +27345,8 @@ /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ id = "detective_shutters"; - name = "Detective's Office Shutters" + name = "Detective's Office Shutters"; + dir = 1 }, /obj/structure/cable, /turf/open/floor/plating, @@ -27458,7 +27424,7 @@ /obj/structure/cable, /obj/item/radio/intercom/prison/directional/north, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/garden) "jNP" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -27485,14 +27451,8 @@ /turf/open/floor/grass, /area/station/science/genetics) "jOb" = ( -/obj/docking_port/stationary{ - dir = 2; - dwidth = 3; - height = 5; - id = "commonmining_home"; - name = "SS13: Common Mining Dock"; - roundstart_template = /datum/map_template/shuttle/mining_common/meta; - width = 7 +/obj/docking_port/stationary/mining_home/common{ + dir = 2 }, /turf/open/floor/plating, /area/station/hallway/primary/port) @@ -27571,7 +27531,7 @@ dir = 8 }, /turf/open/floor/engine, -/area/station/science/misc_lab/range) +/area/station/science/explab) "jPe" = ( /obj/structure/table, /obj/item/airlock_painter, @@ -27971,7 +27931,7 @@ dir = 1 }, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "jXe" = ( /obj/structure/lattice, /obj/item/wirecutters, @@ -28005,6 +27965,7 @@ "jXQ" = ( /obj/structure/closet/secure_closet/medical2, /obj/effect/turf_decal/tile/blue/anticorner/contrasted, +/obj/machinery/airalarm/directional/south, /turf/open/floor/iron/white, /area/station/medical/surgery/aft) "jYi" = ( @@ -28037,7 +27998,7 @@ /area/station/medical/chemistry) "jYz" = ( /turf/closed/wall, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "jYB" = ( /obj/machinery/conveyor/inverted{ dir = 6; @@ -28054,7 +28015,7 @@ dir = 1 }, /turf/open/floor/iron/white, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "jYX" = ( /obj/structure/table/reinforced, /obj/machinery/door/firedoor, @@ -28083,9 +28044,8 @@ /obj/structure/disposalpipe/segment, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/aft) "jZz" = ( /obj/machinery/atmospherics/pipe/smart/manifold/purple/visible, @@ -28114,9 +28074,8 @@ /area/station/hallway/primary/central) "jZS" = ( /obj/effect/spawner/random/engineering/tank, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/aft/lesser) "jZW" = ( /obj/effect/spawner/random/maintenance, @@ -28165,6 +28124,7 @@ pixel_x = -6; pixel_y = 4 }, +/obj/machinery/keycard_auth/directional/south, /turf/open/floor/wood, /area/station/cargo/qm) "kat" = ( @@ -28286,6 +28246,11 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood, /area/station/service/cafeteria) +"kcN" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/security/prison/garden) "kcV" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 4; @@ -28319,7 +28284,7 @@ /area/station/cargo/warehouse) "kdF" = ( /turf/open/floor/iron/white, -/area/station/science/storage) +/area/station/science/ordnance/storage) "kdN" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -28336,7 +28301,7 @@ /area/station/security/courtroom) "kdP" = ( /turf/closed/wall/r_wall, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "kdX" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -28543,9 +28508,8 @@ /area/station/service/chapel/funeral) "khr" = ( /obj/structure/cable, -/turf/open/floor/wood{ - icon_state = "wood-broken6" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/command/corporate_showroom) "khu" = ( /obj/effect/spawner/structure/window/reinforced, @@ -28606,9 +28570,8 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "kjL" = ( /obj/structure/table, @@ -28789,11 +28752,9 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/siding/purple, -/obj/structure/sign/warning/test_chamber{ - pixel_y = -32 - }, +/obj/structure/sign/warning/test_chamber/directional/south, /turf/open/floor/iron/white, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "kmN" = ( /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) @@ -28977,9 +28938,7 @@ pixel_x = 4 }, /obj/effect/decal/cleanable/cobweb, -/obj/structure/sign/warning/vacuum/external{ - pixel_y = 32 - }, +/obj/structure/sign/warning/vacuum/external/directional/north, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) "kqm" = ( @@ -28991,11 +28950,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) +"kqJ" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/security/prison/mess) "kqO" = ( /obj/effect/spawner/random/structure/grille, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/space/nearstation) "kqZ" = ( /obj/effect/decal/cleanable/dirt, @@ -29063,9 +29026,8 @@ "ksd" = ( /obj/effect/spawner/random/structure/closet_maintenance, /obj/effect/spawner/random/maintenance/two, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/greater) "ksg" = ( /obj/effect/turf_decal/stripes/line{ @@ -29123,9 +29085,8 @@ /area/station/maintenance/department/engine) "ktd" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood{ - icon_state = "wood-broken7" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/cargo/qm) "ktl" = ( /obj/structure/sink{ @@ -29246,9 +29207,7 @@ /turf/open/floor/iron/dark, /area/station/medical/office) "kud" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_y = -32 - }, +/obj/structure/sign/warning/vacuum/external/directional/south, /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -29382,7 +29341,7 @@ /obj/item/assembly/timer, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "kwi" = ( /obj/effect/spawner/random/structure/crate_empty, /obj/item/clothing/gloves/color/fyellow, @@ -29490,7 +29449,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "kyh" = ( /obj/machinery/power/apc/auto_name/directional/east, /obj/structure/cable, @@ -29656,7 +29615,7 @@ /obj/item/cultivator, /obj/item/crowbar, /obj/item/plant_analyzer, -/obj/item/reagent_containers/glass/bucket, +/obj/item/reagent_containers/glass/watering_can, /obj/structure/table/glass, /obj/effect/turf_decal/trimline/green/filled/line{ dir = 10 @@ -29693,7 +29652,7 @@ dir = 1 }, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "kCq" = ( /obj/structure/sign/map/left{ desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; @@ -29731,9 +29690,8 @@ /area/station/security/brig) "kDw" = ( /obj/effect/spawner/random/structure/table, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/aft/lesser) "kDG" = ( /obj/effect/turf_decal/stripes/line{ @@ -29769,6 +29727,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/mapping_helpers/airlock/access/all/engineering/tech_storage, +/obj/effect/mapping_helpers/airlock/access/all/command/general, /turf/open/floor/iron/dark, /area/station/engineering/storage/tech) "kEe" = ( @@ -29820,9 +29779,8 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/spawner/random/structure/crate, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/aft/greater) "kFg" = ( /obj/effect/turf_decal/tile/yellow/half/contrasted{ @@ -29988,9 +29946,8 @@ "kJo" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/aft) "kJx" = ( /obj/structure/chair/office, @@ -30186,7 +30143,7 @@ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/science/storage) +/area/station/science/ordnance/storage) "kNx" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 8; @@ -30476,9 +30433,8 @@ dir = 4 }, /obj/machinery/light/small/directional/west, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/hallway/secondary/entry) "kRx" = ( /obj/machinery/light/directional/north, @@ -30564,9 +30520,7 @@ /obj/item/kirbyplants{ icon_state = "plant-21" }, -/obj/structure/sign/departments/botany{ - pixel_x = 32 - }, +/obj/structure/sign/departments/botany/directional/east, /obj/effect/turf_decal/trimline/green/filled/line, /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -30643,7 +30597,7 @@ /obj/item/stack/license_plates/empty/fifty, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, -/area/station/security/prison) +/area/station/security/prison/work) "kUT" = ( /obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/plating, @@ -30690,11 +30644,9 @@ /obj/effect/turf_decal/trimline/green/filled/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/garden) "kVq" = ( -/obj/structure/sign/warning/secure_area{ - pixel_x = 32 - }, +/obj/structure/sign/warning/secure_area/directional/east, /obj/effect/turf_decal/stripes/corner, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) @@ -30740,7 +30692,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "kVN" = ( /turf/open/floor/carpet, /area/station/service/chapel) @@ -30748,7 +30700,6 @@ /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) "kWc" = ( @@ -30829,12 +30780,9 @@ /area/station/command/bridge) "kWW" = ( /obj/machinery/space_heater, -/obj/structure/sign/warning/vacuum/external{ - pixel_y = 32 - }, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/structure/sign/warning/vacuum/external/directional/north, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "kXa" = ( /obj/effect/decal/cleanable/dirt, @@ -30923,7 +30871,8 @@ "kYb" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ - id = "main_surgery" + id = "main_surgery"; + dir = 4 }, /turf/open/floor/plating, /area/station/medical/treatment_center) @@ -30940,6 +30889,13 @@ "kYg" = ( /turf/closed/wall, /area/station/security/office) +"kYm" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/security/prison/visit) "kYn" = ( /obj/effect/spawner/random/engineering/atmospherics_portable, /turf/open/floor/plating, @@ -30979,9 +30935,7 @@ /turf/open/floor/iron, /area/station/commons/fitness/recreation) "kZs" = ( -/obj/structure/sign/warning/secure_area{ - pixel_y = 32 - }, +/obj/structure/sign/warning/secure_area/directional/north, /obj/structure/closet/radiation, /obj/effect/turf_decal/delivery, /obj/item/clothing/glasses/meson/engine, @@ -31096,7 +31050,7 @@ /obj/item/storage/bag/plants/portaseeder, /obj/item/plant_analyzer, /obj/item/cultivator, -/obj/item/reagent_containers/glass/bucket, +/obj/item/reagent_containers/glass/watering_can, /obj/structure/rack, /obj/item/vending_refill/hydroseeds, /turf/open/floor/plating, @@ -31104,7 +31058,7 @@ "lbe" = ( /obj/machinery/light/directional/south, /turf/open/floor/iron/freezer, -/area/station/security/prison) +/area/station/security/prison/shower) "lbH" = ( /mob/living/simple_animal/chicken{ name = "Featherbottom"; @@ -31200,6 +31154,9 @@ /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) "ldg" = ( +/obj/machinery/modular_computer/console/preset/id{ + dir = 1 + }, /turf/open/floor/wood, /area/station/cargo/qm) "ldJ" = ( @@ -31278,7 +31235,7 @@ "lfy" = ( /obj/machinery/door/poddoor/incinerator_ordmix, /turf/open/floor/engine/vacuum, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "lfG" = ( /obj/effect/turf_decal/trimline/purple/corner{ dir = 1 @@ -31365,11 +31322,6 @@ /obj/item/storage/medkit/brute, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"lhA" = ( -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" - }, -/area/station/solars/port/aft) "lhD" = ( /obj/structure/reagent_dispensers/watertank, /obj/effect/spawner/random/trash/janitor_supplies, @@ -31445,7 +31397,7 @@ id = "visitorflash" }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/visit) "ljf" = ( /obj/structure/table, /obj/item/wirecutters, @@ -31577,11 +31529,11 @@ /obj/item/target/clown, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "llL" = ( /obj/item/bodypart/l_leg, /turf/open/floor/plating/airless, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "llT" = ( /obj/structure/table/wood, /obj/machinery/button/ticket_machine{ @@ -31650,7 +31602,7 @@ "lmu" = ( /obj/machinery/light/small/directional/north, /turf/open/floor/engine, -/area/station/science/misc_lab/range) +/area/station/science/explab) "lmA" = ( /obj/machinery/power/smes{ capacity = 9e+006; @@ -31689,9 +31641,8 @@ /turf/closed/wall, /area/station/commons/dorms) "lnu" = ( -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "lnv" = ( /obj/structure/cable, @@ -31808,11 +31759,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/fore) -"lpi" = ( -/turf/open/floor/wood{ - icon_state = "wood-broken5" - }, -/area/station/maintenance/port/aft) "lpo" = ( /obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ dir = 4 @@ -32035,7 +31981,7 @@ dir = 4 }, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/safe) "lsu" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/crate/freezer, @@ -32115,7 +32061,8 @@ /obj/item/pen, /obj/machinery/door/poddoor/shutters/preopen{ id = "hydro_service"; - name = "Service Shutter" + name = "Service Shutter"; + dir = 1 }, /turf/open/floor/iron, /area/station/hallway/secondary/service) @@ -32163,9 +32110,8 @@ /turf/open/floor/wood, /area/station/service/library) "luO" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/lesser) "luV" = ( /obj/effect/turf_decal/stripes/line{ @@ -32226,7 +32172,7 @@ }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "lwg" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 @@ -32240,9 +32186,8 @@ /turf/open/floor/iron, /area/station/engineering/break_room) "lww" = ( -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/aft/lesser) "lwx" = ( /obj/structure/flora/bush/sunny/style_random, @@ -32271,9 +32216,7 @@ /turf/open/floor/iron, /area/station/engineering/atmos) "lxp" = ( -/obj/structure/sign/warning/electric_shock{ - pixel_y = 32 - }, +/obj/structure/sign/warning/electric_shock/directional/north, /obj/effect/turf_decal/bot, /obj/effect/landmark/start/hangover, /turf/open/floor/iron, @@ -32283,12 +32226,10 @@ /turf/open/floor/iron, /area/station/engineering/atmos) "lxv" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Secure tech_storage" - }, /obj/item/radio/intercom/directional/east, /obj/machinery/light/small/directional/east, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/camera/autoname/directional/east, /turf/open/floor/iron/dark, /area/station/engineering/storage/tech) "lxw" = ( @@ -32316,7 +32257,7 @@ /area/station/medical/break_room) "lxJ" = ( /obj/structure/reagent_dispensers/watertank/high, -/obj/item/reagent_containers/glass/bucket, +/obj/item/reagent_containers/glass/watering_can, /obj/effect/turf_decal/stripes/line, /obj/machinery/light/directional/north, /turf/open/floor/iron, @@ -32388,9 +32329,8 @@ /area/station/hallway/secondary/command) "lzf" = ( /obj/effect/spawner/random/engineering/vending_restock, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/disposal) "lzJ" = ( /obj/structure/cable, @@ -32446,9 +32386,8 @@ /obj/structure/disposalpipe/trunk{ dir = 1 }, -/obj/structure/sign/departments/security{ - color = "#DE3A3A"; - pixel_y = -32 +/obj/structure/sign/departments/security/directional/south{ + color = "#DE3A3A" }, /turf/open/floor/iron, /area/station/cargo/sorting) @@ -32471,7 +32410,7 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /turf/open/floor/grass, -/area/station/security/prison) +/area/station/security/prison/garden) "lBm" = ( /obj/machinery/conveyor{ dir = 4; @@ -32601,9 +32540,9 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/engine, -/area/station/science/misc_lab/range) +/area/station/science/explab) "lEY" = ( -/obj/machinery/gravity_generator/main/station, +/obj/machinery/gravity_generator/main, /obj/effect/turf_decal/bot_white, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, @@ -32613,7 +32552,7 @@ dir = 1 }, /turf/open/floor/plating/airless, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "lFg" = ( /obj/structure/chair{ dir = 4 @@ -32622,7 +32561,7 @@ dir = 9 }, /turf/open/floor/plating/airless, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "lFq" = ( /obj/structure/sign/warning/biohazard, /turf/closed/wall/r_wall, @@ -32649,9 +32588,8 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port) "lGL" = ( /obj/effect/turf_decal/stripes/line, @@ -32953,8 +32891,7 @@ dir = 1 }, /obj/effect/turf_decal/tile/yellow, -/obj/structure/sign/warning/secure_area{ - pixel_x = -32; +/obj/structure/sign/warning/secure_area/directional/west{ pixel_y = -32 }, /turf/open/floor/iron, @@ -32971,9 +32908,8 @@ /area/station/engineering/atmos) "lMh" = ( /obj/item/instrument/guitar, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/space/nearstation) "lMq" = ( /turf/open/misc/asteroid/basalt/airless, @@ -33472,13 +33408,18 @@ }, /turf/open/floor/iron/white, /area/station/science/xenobiology) +"lVE" = ( +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/security/prison/garden) "lVH" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table/reinforced, /obj/machinery/door/firedoor, /obj/machinery/door/poddoor/shutters{ id = "commissaryshutter"; - name = "Vacant Commissary Shutter" + name = "Vacant Commissary Shutter"; + dir = 8 }, /obj/structure/noticeboard/directional/north, /obj/effect/turf_decal/stripes/line{ @@ -33553,9 +33494,7 @@ "lWN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/sign/warning/vacuum{ - pixel_x = 32 - }, +/obj/structure/sign/warning/vacuum/directional/east, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) "lXl" = ( @@ -33623,7 +33562,7 @@ dir = 6 }, /turf/open/floor/iron/white, -/area/station/science/storage) +/area/station/science/ordnance/storage) "lYx" = ( /obj/machinery/power/apc/auto_name/directional/west, /obj/structure/cable, @@ -33766,6 +33705,9 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/machinery/computer/security/telescreen/vault{ + pixel_y = 30 + }, /turf/open/floor/wood, /area/station/cargo/qm) "mbk" = ( @@ -33857,9 +33799,8 @@ "mdC" = ( /obj/machinery/power/smes, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/solars/port/aft) "mdL" = ( /obj/machinery/computer/shuttle/mining{ @@ -33878,9 +33819,8 @@ dir = 4 }, /obj/structure/sign/poster/contraband/random/directional/north, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "mdW" = ( /obj/structure/safe/floor, @@ -33923,7 +33863,7 @@ dir = 8 }, /turf/open/floor/plating/airless, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "mfh" = ( /obj/structure/cable, /turf/open/floor/iron, @@ -34123,9 +34063,8 @@ "mjp" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/space_heater, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/department/science/xenobiology) "mjr" = ( /turf/open/floor/wood, @@ -34230,9 +34169,8 @@ /area/station/hallway/primary/fore) "mlQ" = ( /obj/item/storage/toolbox/emergency, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port) "mma" = ( /obj/effect/decal/cleanable/dirt, @@ -34599,9 +34537,7 @@ /area/station/service/kitchen) "msW" = ( /obj/machinery/light/directional/north, -/obj/structure/sign/warning/secure_area{ - pixel_y = 32 - }, +/obj/structure/sign/warning/secure_area/directional/north, /obj/structure/table/glass, /obj/effect/turf_decal/stripes/corner{ dir = 4 @@ -34617,9 +34553,8 @@ /area/station/engineering/break_room) "msX" = ( /obj/effect/landmark/xeno_spawn, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/aft) "mta" = ( /obj/machinery/camera/directional/north{ @@ -34676,6 +34611,11 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron, /area/station/commons/dorms) +"mtQ" = ( +/obj/structure/lattice/catwalk, +/obj/structure/marker_beacon/purple, +/turf/open/space/basic, +/area/space/nearstation) "mtR" = ( /obj/machinery/light/small/directional/east, /obj/machinery/camera/directional/east{ @@ -34721,6 +34661,9 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"muq" = ( +/turf/closed/wall/r_wall, +/area/station/security/prison/mess) "mur" = ( /obj/machinery/light/directional/north, /obj/machinery/status_display/evac/directional/north, @@ -34971,11 +34914,9 @@ /turf/open/floor/iron/white/corner, /area/station/hallway/secondary/entry) "mAh" = ( -/obj/machinery/air_sensor{ - chamber_id = "ordnancegas1" - }, +/obj/machinery/air_sensor/ordnance_burn_chamber, /turf/open/floor/engine/vacuum, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "mAm" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/security/glass{ @@ -35028,7 +34969,7 @@ "mAX" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible, /turf/closed/wall/r_wall, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "mBb" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/trimline/blue/filled/corner{ @@ -35083,7 +35024,7 @@ }, /obj/machinery/light/directional/west, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "mBQ" = ( /obj/structure/table/glass, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -35206,7 +35147,7 @@ dir = 8 }, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "mEj" = ( /obj/structure/closet/crate/hydroponics, /obj/item/paper/guides/jobs/hydroponics, @@ -35219,7 +35160,7 @@ }, /obj/effect/spawner/random/contraband/prison, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/garden) "mEo" = ( /obj/effect/turf_decal/stripes/line, /obj/structure/cable, @@ -35329,6 +35270,10 @@ }, /turf/open/floor/iron/white, /area/station/science/research) +"mGc" = ( +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/security/office) "mGg" = ( /obj/structure/table/wood, /obj/item/flashlight/lamp/green{ @@ -35360,9 +35305,7 @@ /turf/open/floor/iron/dark, /area/station/ai_monitored/aisat/exterior) "mGy" = ( -/obj/structure/sign/warning/vacuum{ - pixel_x = -32 - }, +/obj/structure/sign/warning/vacuum/directional/west, /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) @@ -35405,7 +35348,7 @@ name = "Visitation" }, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/visit) "mHe" = ( /obj/item/stack/sheet/plasteel{ amount = 10; @@ -35438,7 +35381,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "mHl" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -35454,12 +35397,11 @@ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/science/storage) +/area/station/science/ordnance/storage) "mHs" = ( /obj/item/shard, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/space/nearstation) "mHx" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -35537,7 +35479,7 @@ /obj/machinery/portable_atmospherics/canister/carbon_dioxide, /obj/effect/turf_decal/siding/purple, /turf/open/floor/iron/dark, -/area/station/science/storage) +/area/station/science/ordnance/storage) "mJa" = ( /obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{ dir = 4 @@ -35605,9 +35547,8 @@ /obj/effect/mapping_helpers/airlock/unres{ dir = 1 }, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/fore/lesser) "mKu" = ( /obj/machinery/light_switch/directional/west, @@ -35672,14 +35613,14 @@ /turf/open/floor/wood, /area/station/security/courtroom) "mLR" = ( -/obj/machinery/door/airlock/mining/glass{ - name = "Quartermaster" - }, /obj/structure/cable, /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/mapping_helpers/airlock/access/all/supply/qm, +/obj/machinery/door/airlock/command/glass{ + name = "Quartermaster's Office" + }, /turf/open/floor/iron, /area/station/cargo/qm) "mLS" = ( @@ -35728,7 +35669,7 @@ dir = 4 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/garden) "mMr" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/meter, @@ -35741,12 +35682,13 @@ "mMt" = ( /obj/machinery/door/poddoor/shutters/preopen{ id = "rdordnance"; - name = "Ordnance Lab Shutters" + name = "Ordnance Lab Shutters"; + dir = 1 }, /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/firedoor/heavy, /turf/open/floor/plating, -/area/station/science/storage) +/area/station/science/ordnance/storage) "mMu" = ( /obj/machinery/camera/directional/south{ c_tag = "Theater - Backstage" @@ -35799,9 +35741,8 @@ "mNn" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/lesser) "mNG" = ( /obj/machinery/requests_console/directional/north{ @@ -35836,7 +35777,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/siding/purple, /turf/open/floor/iron/white, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "mNZ" = ( /obj/machinery/holopad, /turf/open/floor/iron, @@ -35917,9 +35858,8 @@ c_tag = "Science Firing Range"; network = list("ss13","rd") }, -/obj/structure/cable, /turf/open/floor/engine, -/area/station/science/misc_lab/range) +/area/station/science/explab) "mPK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -36190,7 +36130,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/visit) "mUL" = ( /obj/machinery/door/airlock/atmos{ name = "Hypertorus Fusion Reactor" @@ -36392,7 +36332,7 @@ pixel_y = 31 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "mYq" = ( /obj/effect/turf_decal/plaque{ icon_state = "L8" @@ -36476,7 +36416,7 @@ "mZr" = ( /obj/machinery/portable_atmospherics/canister/nitrous_oxide, /turf/open/floor/iron/dark, -/area/station/science/storage) +/area/station/science/ordnance/storage) "mZy" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -36583,7 +36523,7 @@ }, /obj/effect/turf_decal/siding/purple, /turf/open/floor/iron/white, -/area/station/science/storage) +/area/station/science/ordnance/storage) "nbs" = ( /obj/effect/turf_decal/delivery, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -36692,7 +36632,8 @@ }, /obj/machinery/door/poddoor/shutters/preopen{ id = "XenoPens"; - name = "Xenobiology Lockdown" + name = "Xenobiology Lockdown"; + dir = 8 }, /turf/open/floor/iron, /area/station/science/xenobiology) @@ -36757,7 +36698,7 @@ dir = 1 }, /turf/open/floor/engine/vacuum, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "ndS" = ( /turf/closed/wall/r_wall, /area/station/hallway/secondary/command) @@ -36797,13 +36738,10 @@ id = "Holding Cell"; name = "Holding Cell" }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/red/filled/line, /turf/open/floor/iron, /area/station/security/holding_cell) "nfs" = ( @@ -36895,6 +36833,15 @@ }, /turf/open/floor/iron, /area/station/security/courtroom) +"nhM" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "chapel_shutters_parlour"; + name = "Chapel Shutters"; + dir = 8 + }, +/turf/open/floor/plating, +/area/station/service/chapel/funeral) "nhP" = ( /turf/open/floor/circuit/green, /area/station/ai_monitored/turret_protected/ai_upload) @@ -37098,9 +37045,8 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "nlE" = ( /obj/effect/turf_decal/stripes/line, @@ -37287,6 +37233,7 @@ "nnt" = ( /obj/vehicle/ridden/secway, /obj/effect/turf_decal/bot, +/obj/structure/cable, /turf/open/floor/iron/dark, /area/station/security/office) "nnD" = ( @@ -37396,7 +37343,7 @@ dir = 1 }, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "npD" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/rnd/production/circuit_imprinter/department/science, @@ -37476,9 +37423,8 @@ /turf/open/floor/engine, /area/station/engineering/supermatter/room) "nry" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/department/engine) "nrG" = ( /obj/machinery/light/directional/west, @@ -37603,7 +37549,8 @@ /obj/machinery/door/firedoor, /obj/machinery/door/poddoor/shutters/preopen{ id = "kitchen_counter"; - name = "Kitchen Counter Shutters" + name = "Kitchen Counter Shutters"; + dir = 1 }, /obj/structure/displaycase/forsale/kitchen{ pixel_y = 8 @@ -37629,7 +37576,7 @@ dir = 1 }, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "ntA" = ( /obj/machinery/door/airlock/external, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -37793,7 +37740,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "nwa" = ( /obj/structure/closet/wardrobe/pjs, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -37802,13 +37749,10 @@ /turf/open/floor/iron/dark, /area/station/commons/dorms) "nwd" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_x = 32 - }, +/obj/structure/sign/warning/vacuum/external/directional/east, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/solars/port/fore) "nwq" = ( /obj/structure/table, @@ -37834,6 +37778,10 @@ /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5, /turf/closed/wall, /area/station/engineering/atmos/pumproom) +"nwM" = ( +/obj/machinery/airalarm/directional/south, +/turf/open/floor/wood, +/area/station/service/library) "nwU" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -37857,7 +37805,7 @@ /turf/open/floor/iron, /area/station/security/checkpoint/engineering) "nxb" = ( -/obj/structure/musician/piano, +/obj/effect/spawner/random/structure/musician/piano/random_piano, /obj/structure/window/reinforced{ dir = 8 }, @@ -37893,7 +37841,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/item/reagent_containers/glass/rag, /obj/structure/table, -/obj/machinery/duct, /turf/open/floor/iron, /area/station/service/bar) "nxF" = ( @@ -37983,9 +37930,8 @@ /area/station/cargo/drone_bay) "nzh" = ( /obj/structure/table/optable, -/obj/machinery/airalarm/directional/south, -/obj/machinery/light/directional/south, /obj/effect/turf_decal/tile/blue/half/contrasted, +/obj/item/radio/intercom/directional/south, /turf/open/floor/iron/white, /area/station/medical/surgery/aft) "nzo" = ( @@ -37996,9 +37942,8 @@ /area/station/engineering/atmos) "nzF" = ( /obj/structure/chair/stool/directional/west, -/turf/open/floor/wood{ - icon_state = "wood-broken4" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/maintenance/port/aft) "nzP" = ( /obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ @@ -38030,12 +37975,11 @@ /obj/structure/table, /obj/item/binoculars, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "nAu" = ( /obj/effect/spawner/random/structure/grille, -/turf/open/floor/plating/airless{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating/airless, /area/space/nearstation) "nAC" = ( /obj/structure/disposalpipe/segment{ @@ -38070,7 +38014,7 @@ dir = 1 }, /turf/open/floor/iron/white, -/area/station/science/storage) +/area/station/science/ordnance/storage) "nBa" = ( /obj/structure/cable, /turf/open/floor/iron/solarpanel/airless, @@ -38182,7 +38126,7 @@ /obj/machinery/light/directional/north, /obj/machinery/light_switch/directional/north, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "nDk" = ( /obj/structure/table, /obj/item/storage/fancy/cigarettes{ @@ -38205,9 +38149,8 @@ /obj/effect/spawner/random/structure/closet_maintenance, /obj/item/storage/box/lights/mixed, /obj/effect/spawner/random/maintenance/two, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "nDO" = ( /obj/structure/cable, @@ -38290,7 +38233,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/start/scientist, /turf/open/floor/engine, -/area/station/science/misc_lab/range) +/area/station/science/explab) "nGe" = ( /obj/structure/railing, /obj/machinery/light/small/red/directional/west, @@ -38442,14 +38385,14 @@ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/freezerchamber) "nJB" = ( /obj/structure/sign/warning/secure_area{ desc = "A warning sign which reads 'BOMB RANGE"; name = "BOMB RANGE" }, /turf/closed/wall, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "nJG" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -38533,15 +38476,20 @@ /turf/open/floor/iron/freezer, /area/station/commons/toilet/restrooms) "nLd" = ( -/turf/open/floor/wood{ - icon_state = "wood-broken5" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/service/library) "nLi" = ( /obj/effect/turf_decal/trimline/green/filled/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/south, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/garden) +"nLu" = ( +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/security/execution/transfer) "nLz" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, @@ -38825,7 +38773,7 @@ dir = 1 }, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "nQg" = ( /turf/closed/wall, /area/station/maintenance/solars/port/fore) @@ -38860,9 +38808,8 @@ /turf/open/floor/iron, /area/station/maintenance/port/aft) "nRb" = ( -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/space/nearstation) "nRp" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ @@ -38968,7 +38915,7 @@ /obj/machinery/computer/crew{ dir = 4 }, -/obj/effect/turf_decal/trimline/red/filled/line, +/obj/effect/turf_decal/trimline/dark_red/filled/line, /turf/open/floor/iron, /area/station/security/warden) "nTJ" = ( @@ -39028,6 +38975,7 @@ /obj/effect/turf_decal/tile/red/anticorner/contrasted{ dir = 8 }, +/obj/structure/cable, /turf/open/floor/iron/dark, /area/station/security/lockers) "nUI" = ( @@ -39036,7 +38984,7 @@ }, /obj/machinery/airalarm/directional/north, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "nUW" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 @@ -39148,9 +39096,8 @@ /area/station/medical/medbay/central) "nWz" = ( /obj/item/crowbar, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/greater) "nWF" = ( /obj/structure/railing{ @@ -39229,6 +39176,8 @@ dir = 10 }, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/brig) "nZm" = ( @@ -39337,12 +39286,7 @@ "oaK" = ( /obj/item/target/syndicate, /turf/open/floor/engine, -/area/station/science/misc_lab/range) -"oaW" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, -/area/station/maintenance/port/fore) +/area/station/science/explab) "obb" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -39358,9 +39302,8 @@ "obh" = ( /obj/machinery/portable_atmospherics/canister/air, /obj/effect/spawner/random/maintenance, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port) "obk" = ( /obj/item/target/alien, @@ -39495,7 +39438,7 @@ /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/west, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "ocP" = ( /obj/machinery/airalarm/directional/west, /turf/open/floor/iron, @@ -39554,13 +39497,12 @@ /turf/open/floor/iron, /area/station/commons/fitness/recreation) "oeC" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/spawner/random/trash/soap{ spawn_scatter_radius = 1 }, /turf/open/floor/iron/freezer, -/area/station/security/prison) +/area/station/security/prison/shower) "oeO" = ( /obj/effect/landmark/xeno_spawn, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -39809,9 +39751,8 @@ /area/station/maintenance/starboard/lesser) "oib" = ( /obj/effect/spawner/random/trash/garbage, -/turf/open/floor/plating/airless{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating/airless, /area/space/nearstation) "oip" = ( /obj/machinery/door/firedoor, @@ -40066,7 +40007,7 @@ /obj/structure/cable, /obj/effect/mapping_helpers/airlock/access/all/science/ordnance, /turf/open/floor/plating, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "oog" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -40175,6 +40116,9 @@ /obj/effect/turf_decal/tile/yellow/fourcorners, /turf/open/floor/iron/white, /area/station/medical/pharmacy) +"opj" = ( +/turf/closed/wall/mineral/plastitanium, +/area/station/security/execution/transfer) "opk" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -40219,7 +40163,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, -/area/station/science/storage) +/area/station/science/ordnance/storage) "oqi" = ( /obj/effect/landmark/start/paramedic, /obj/structure/disposalpipe/segment{ @@ -40289,7 +40233,7 @@ /obj/machinery/computer/secure_data{ dir = 8 }, -/obj/effect/turf_decal/trimline/red/filled/line{ +/obj/effect/turf_decal/trimline/dark_red/filled/line{ dir = 4 }, /turf/open/floor/iron, @@ -40353,7 +40297,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/safe) "osw" = ( /obj/structure/sign/warning/secure_area, /turf/closed/wall/r_wall, @@ -40405,7 +40349,7 @@ req_access = list("brig") }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "ouc" = ( /obj/structure/closet/crate, /obj/structure/cable, @@ -40481,7 +40425,7 @@ pixel_x = -10; pixel_y = -6 }, -/obj/effect/turf_decal/trimline/red/filled/line{ +/obj/effect/turf_decal/trimline/dark_red/filled/line{ dir = 4 }, /obj/machinery/computer/security/telescreen{ @@ -40494,9 +40438,7 @@ /turf/open/floor/iron, /area/station/security/warden) "ouV" = ( -/obj/structure/sign/warning/fire{ - pixel_x = 32 - }, +/obj/structure/sign/warning/fire/directional/east, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /obj/machinery/atmospherics/components/binary/pump{ @@ -40567,7 +40509,7 @@ /obj/structure/flora/bush/fullgrass/style_random, /obj/machinery/light/directional/east, /turf/open/floor/grass, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "ovX" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /turf/closed/wall/r_wall, @@ -40623,6 +40565,11 @@ /obj/machinery/light_switch/directional/west, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) +"owU" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/vending/autodrobe/all_access, +/turf/open/floor/iron/dark, +/area/station/commons/locker) "owZ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -40636,9 +40583,7 @@ /area/station/service/hydroponics) "oxf" = ( /obj/structure/table, -/obj/structure/sign/departments/medbay{ - pixel_y = 32 - }, +/obj/structure/sign/departments/medbay/directional/north, /obj/item/reagent_containers/glass/beaker/large, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) @@ -40648,7 +40593,7 @@ dir = 5 }, /turf/open/floor/plating/airless, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "oxx" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -40684,7 +40629,7 @@ /obj/structure/filingcabinet, /obj/machinery/light_switch/directional/north, /turf/open/floor/iron/white, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "oyx" = ( /obj/structure/toilet{ pixel_y = 8 @@ -40770,14 +40715,17 @@ }, /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron/white, -/area/station/science/storage) +/area/station/science/ordnance/storage) +"ozI" = ( +/turf/closed/wall, +/area/station/security/prison/work) "ozK" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 10 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/garden) "ozQ" = ( /obj/machinery/firealarm/directional/east, /obj/item/paper_bin{ @@ -40841,7 +40789,7 @@ dir = 8 }, /turf/open/floor/iron/white, -/area/station/science/storage) +/area/station/science/ordnance/storage) "oBq" = ( /obj/effect/turf_decal/stripes/line, /obj/structure/disposalpipe/segment, @@ -40906,13 +40854,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"oCm" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, -/area/station/maintenance/port) "oCw" = ( /obj/effect/turf_decal/tile/neutral, /obj/machinery/light/directional/east, @@ -41246,9 +41187,7 @@ /turf/open/floor/iron/dark, /area/station/engineering/atmos) "oIW" = ( -/obj/structure/sign/warning/vacuum{ - pixel_x = 32 - }, +/obj/structure/sign/warning/vacuum/directional/east, /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) @@ -41306,9 +41245,7 @@ /area/station/maintenance/starboard/greater) "oKc" = ( /obj/effect/turf_decal/tile/red, -/obj/structure/sign/departments/court{ - pixel_x = 32 - }, +/obj/structure/sign/departments/court/directional/east, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, @@ -41319,7 +41256,7 @@ }, /obj/structure/cable, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/garden) "oKp" = ( /obj/structure/railing/corner{ dir = 4 @@ -41364,7 +41301,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/door/firedoor, /obj/effect/mapping_helpers/airlock/access/any/command/general, -/obj/effect/mapping_helpers/airlock/access/any/engineering/construction, +/obj/effect/mapping_helpers/airlock/access/any/command/minisat, +/obj/effect/mapping_helpers/airlock/access/any/engineering/tcoms, /turf/open/floor/iron/dark, /area/station/tcommsat/computer) "oKI" = ( @@ -41426,16 +41364,16 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/spawner/random/engineering/tank, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/reagent_dispensers/plumbed, +/turf/open/floor/plating, /area/station/maintenance/fore) "oMW" = ( /obj/effect/turf_decal/delivery, /obj/machinery/door/poddoor/shutters{ id = "mechbay"; - name = "Mech Bay Shutters" + name = "Mech Bay Shutters"; + dir = 1 }, /turf/open/floor/iron, /area/station/science/robotics/mechbay) @@ -41459,9 +41397,7 @@ /obj/effect/turf_decal/tile/yellow{ dir = 8 }, -/obj/structure/sign/departments/chemistry/pharmacy{ - pixel_x = -32 - }, +/obj/structure/sign/departments/chemistry/pharmacy/directional/west, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, @@ -41497,9 +41433,8 @@ }, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "oOO" = ( /obj/structure/table, @@ -41638,7 +41573,7 @@ /area/station/hallway/primary/fore) "oRi" = ( /turf/closed/wall, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "oRn" = ( /obj/structure/table/wood, /obj/machinery/recharger{ @@ -41710,9 +41645,8 @@ }, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "oTa" = ( /obj/machinery/vending/cart{ @@ -41800,9 +41734,8 @@ "oUQ" = ( /obj/effect/spawner/random/trash/mess, /obj/effect/spawner/random/engineering/tracking_beacon, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/disposal) "oUS" = ( /obj/structure/table/reinforced, @@ -41936,7 +41869,7 @@ }, /obj/item/radio/intercom/directional/north, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "oXJ" = ( /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, @@ -41976,7 +41909,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/purple, /turf/open/floor/iron/white, -/area/station/science/misc_lab) +/area/station/science/explab) "oXR" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -42124,9 +42057,8 @@ /turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/medical/coldroom) "paS" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/greater) "pbf" = ( /obj/effect/turf_decal/tile/neutral{ @@ -42167,7 +42099,7 @@ dir = 1 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/work) "pbL" = ( /obj/machinery/door/firedoor, /turf/open/floor/iron/white/side, @@ -42285,12 +42217,11 @@ dir = 1 }, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/visit) "pdf" = ( /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "pdg" = ( /obj/structure/disposalpipe/segment{ @@ -42326,7 +42257,7 @@ /obj/structure/disposalpipe/segment, /obj/effect/landmark/start/scientist, /turf/open/floor/iron/white, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "pdx" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -42860,7 +42791,7 @@ dir = 8 }, /turf/open/floor/iron/dark, -/area/station/science/storage) +/area/station/science/ordnance/storage) "poJ" = ( /obj/machinery/telecomms/hub/preset, /turf/open/floor/circuit/green/telecomms/mainframe, @@ -42897,7 +42828,7 @@ /obj/item/compact_remote, /obj/item/compact_remote, /turf/open/floor/iron/white, -/area/station/science/misc_lab) +/area/station/science/explab) "ppB" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet, @@ -43266,9 +43197,8 @@ /area/station/service/chapel/office) "pvH" = ( /obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/medical/abandoned) "pvL" = ( /obj/machinery/door/firedoor, @@ -43394,12 +43324,11 @@ /obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer2{ dir = 10 }, -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored{ - chamber_id = "ordnancegas2"; +/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/ordnance_freezer_chamber_input{ dir = 4 }, /turf/open/floor/iron/dark/airless, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/freezerchamber) "pyv" = ( /obj/machinery/vending/wardrobe/cargo_wardrobe, /obj/effect/turf_decal/tile/brown/half/contrasted{ @@ -43418,7 +43347,8 @@ /obj/structure/cable, /obj/machinery/door/poddoor/shutters/preopen{ id = "chem_lockdown"; - name = "Chemistry Shutters" + name = "Chemistry Shutters"; + dir = 8 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -43551,6 +43481,16 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/service/bar) +"pAt" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "corporate_privacy"; + name = "Showroom Shutters"; + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/command/corporate_showroom) "pBa" = ( /turf/closed/wall, /area/station/medical/medbay/lobby) @@ -43601,9 +43541,8 @@ /area/station/medical/office) "pCl" = ( /obj/structure/disposalpipe/segment, -/turf/open/floor/wood{ - icon_state = "wood-broken3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/cargo/qm) "pCt" = ( /obj/structure/disposalpipe/segment{ @@ -43659,34 +43598,11 @@ /turf/open/floor/iron, /area/station/science/xenobiology) "pDq" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = 8; - pixel_y = 1 - }, -/obj/item/paper_bin{ - pixel_x = 8; - pixel_y = 6 - }, -/obj/item/paper_bin{ - pixel_x = 8; - pixel_y = 11 - }, -/obj/item/folder/yellow{ - pixel_x = -6; - pixel_y = 8 - }, -/obj/item/folder/yellow{ - pixel_x = -9; - pixel_y = 1 - }, -/obj/item/paper{ - pixel_x = -5 - }, /obj/item/radio/intercom/directional/east, /obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 8 }, +/obj/machinery/autolathe, /turf/open/floor/iron, /area/station/cargo/storage) "pDs" = ( @@ -43711,7 +43627,8 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /obj/machinery/smartfridge/organ, /obj/machinery/door/poddoor/shutters/preopen{ - id = "main_surgery" + id = "main_surgery"; + dir = 4 }, /turf/open/floor/iron/dark, /area/station/medical/treatment_center) @@ -43796,11 +43713,11 @@ /turf/open/floor/iron/white, /area/station/medical/surgery/aft) "pFp" = ( -/obj/machinery/autolathe, /obj/machinery/camera/directional/south{ c_tag = "Cargo - Mailroom" }, -/obj/effect/turf_decal/tile/brown/fourcorners, +/obj/effect/turf_decal/trimline/brown/filled/shrink_ccw, +/obj/effect/turf_decal/trimline/white/filled/warning, /turf/open/floor/iron, /area/station/cargo/sorting) "pFG" = ( @@ -43888,9 +43805,8 @@ /obj/item/kitchen/rollingpin{ pixel_x = -4 }, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/aft) "pHb" = ( /turf/open/floor/iron, @@ -43980,9 +43896,8 @@ /obj/effect/spawner/random/trash/garbage{ spawn_scatter_radius = 1 }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port) "pIv" = ( /obj/item/radio/intercom/directional/west, @@ -44036,7 +43951,7 @@ "pJk" = ( /obj/structure/training_machine, /turf/open/floor/engine, -/area/station/science/misc_lab/range) +/area/station/science/explab) "pJl" = ( /obj/effect/turf_decal/siding/purple{ dir = 1 @@ -44048,9 +43963,8 @@ /area/station/science/research) "pJx" = ( /obj/item/shard, -/turf/open/floor/plating/airless{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating/airless, /area/space/nearstation) "pJA" = ( /obj/structure/closet/secure_closet/cytology, @@ -44072,7 +43986,8 @@ /obj/structure/cable, /obj/machinery/door/poddoor/shutters/preopen{ id = "chem_lockdown"; - name = "Chemistry Shutters" + name = "Chemistry Shutters"; + dir = 4 }, /turf/open/floor/plating, /area/station/medical/chemistry) @@ -44173,7 +44088,7 @@ /obj/machinery/computer/prisoner/management{ dir = 8 }, -/obj/effect/turf_decal/trimline/red/filled/line{ +/obj/effect/turf_decal/trimline/dark_red/filled/line{ dir = 4 }, /turf/open/floor/iron, @@ -44261,7 +44176,7 @@ /obj/machinery/door/window/left/directional/west{ dir = 2; name = "Crate Security Door"; - req_access = list("mail_sorting") + req_access = list("shipping") }, /turf/open/floor/iron, /area/station/cargo/storage) @@ -44293,9 +44208,8 @@ /turf/open/floor/circuit/green/off, /area/station/science/research) "pOB" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "pOF" = ( /obj/structure/cable, @@ -44330,9 +44244,8 @@ }, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/central) "pPp" = ( /obj/effect/decal/cleanable/cobweb/cobweb2, @@ -44464,7 +44377,6 @@ dir = 5 }, /obj/effect/landmark/start/medical_doctor, -/obj/machinery/duct, /turf/open/floor/iron/white, /area/station/medical/treatment_center) "pSw" = ( @@ -44476,7 +44388,7 @@ dir = 1 }, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "pSz" = ( /obj/effect/spawner/random/engineering/atmospherics_portable, /turf/open/floor/plating, @@ -44506,7 +44418,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/science/ordnance, /turf/open/floor/engine, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "pTf" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -44543,7 +44455,7 @@ dir = 1 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "pTK" = ( /obj/machinery/portable_atmospherics/scrubber, /obj/structure/window/reinforced{ @@ -44592,7 +44504,7 @@ dir = 8 }, /turf/open/floor/iron/white, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "pUp" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -44601,9 +44513,8 @@ /area/station/maintenance/starboard/lesser) "pUs" = ( /obj/structure/closet/emcloset, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/greater) "pUA" = ( /obj/machinery/door/firedoor, @@ -44632,7 +44543,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/execution/transfer) "pVi" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light_switch/directional/north, @@ -44671,7 +44582,7 @@ dir = 1 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/garden) "pVM" = ( /obj/machinery/light/small/directional/south, /obj/machinery/camera/directional/south{ @@ -44777,9 +44688,8 @@ /obj/structure/disposalpipe/segment, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "pXh" = ( /obj/item/radio/intercom/directional/south, @@ -44801,7 +44711,7 @@ "pXu" = ( /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/plating/airless, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "pXA" = ( /obj/structure/chair/comfy/brown{ dir = 8 @@ -44871,7 +44781,7 @@ req_access = list("science") }, /turf/open/floor/engine, -/area/station/science/misc_lab/range) +/area/station/science/explab) "pZc" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -44921,7 +44831,7 @@ /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/west, /turf/open/floor/iron/white, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "pZQ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -45033,7 +44943,7 @@ dir = 1 }, /turf/open/floor/iron/white, -/area/station/science/storage) +/area/station/science/ordnance/storage) "qdr" = ( /obj/structure/table, /obj/item/food/grown/wheat, @@ -45146,7 +45056,7 @@ dir = 1 }, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "qeJ" = ( /obj/structure/disposalpipe/segment, /obj/machinery/door/firedoor, @@ -45200,7 +45110,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "qfi" = ( /obj/structure/reagent_dispensers/fueltank, /obj/effect/turf_decal/stripes/line, @@ -45312,7 +45222,8 @@ "qgr" = ( /obj/machinery/door/poddoor/shutters{ id = "qm_warehouse"; - name = "Warehouse Shutters" + name = "Warehouse Shutters"; + dir = 8 }, /obj/effect/turf_decal/caution/stand_clear, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -45352,7 +45263,7 @@ "qhp" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer2, /turf/open/floor/iron/dark/airless, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/freezerchamber) "qhx" = ( /obj/item/radio/intercom/directional/east, /obj/effect/turf_decal/tile/purple, @@ -45371,6 +45282,12 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/dark, /area/station/security/holding_cell) +"qhC" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/carpet, +/area/station/command/bridge) "qhF" = ( /obj/item/radio/intercom/directional/north, /obj/effect/turf_decal/stripes/line{ @@ -45456,7 +45373,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/siding/purple, /turf/open/floor/iron/white, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "qjf" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -45475,8 +45392,9 @@ /obj/machinery/door/airlock/hatch{ name = "MiniSat Space Access Airlock" }, +/obj/effect/mapping_helpers/airlock/access/any/engineering/tcoms, /obj/effect/mapping_helpers/airlock/access/any/command/general, -/obj/effect/mapping_helpers/airlock/access/any/engineering/construction, +/obj/effect/mapping_helpers/airlock/access/any/command/minisat, /turf/open/floor/plating, /area/station/ai_monitored/aisat/exterior) "qjP" = ( @@ -45490,35 +45408,17 @@ "qjX" = ( /obj/structure/cable, /obj/effect/landmark/start/hangover, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/greater) "qkb" = ( -/obj/structure/table, -/obj/item/pen/red{ - pixel_x = 8; - pixel_y = 15 - }, -/obj/item/gps{ - gpstag = "QM0"; - pixel_x = -4; - pixel_y = 10 - }, -/obj/item/pen/fountain{ - pixel_x = 9; - pixel_y = 4 - }, -/obj/item/pen/blue{ - pixel_x = 3; - pixel_y = -3 - }, /obj/structure/disposalpipe/segment{ dir = 10 }, /obj/effect/turf_decal/tile/brown/anticorner/contrasted{ dir = 8 }, +/obj/machinery/rnd/production/techfab/department/cargo, /turf/open/floor/iron, /area/station/cargo/storage) "qkl" = ( @@ -45574,7 +45474,7 @@ dir = 4 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "qkJ" = ( /obj/structure/chair/office/light, /obj/structure/cable, @@ -45616,7 +45516,7 @@ }, /obj/structure/cable, /turf/open/floor/iron/white, -/area/station/science/misc_lab) +/area/station/science/explab) "qlG" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -45867,7 +45767,8 @@ /obj/item/pen, /obj/machinery/door/poddoor/shutters/preopen{ id = "pharmacy_shutters_2"; - name = "Pharmacy Shutters" + name = "Pharmacy Shutters"; + dir = 4 }, /obj/effect/turf_decal/tile/yellow/fourcorners, /turf/open/floor/iron/white, @@ -45902,12 +45803,12 @@ /area/station/cargo/miningoffice) "qqs" = ( /turf/closed/wall/r_wall, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "qqL" = ( /obj/effect/turf_decal/tile/red/fourcorners, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/safe) "qrg" = ( /obj/machinery/light_switch/directional/north, /turf/open/floor/circuit/green{ @@ -46024,17 +45925,14 @@ /turf/open/floor/iron, /area/station/commons/locker) "qsL" = ( -/obj/machinery/vending/coffee{ - pixel_x = -3 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, /obj/machinery/button/door/directional/west{ id = "council blast"; name = "Council Chamber Blast Door Control"; req_access = list("command") }, +/obj/machinery/vending/coffee{ + pixel_x = -3 + }, /turf/open/floor/iron/dark, /area/station/command/bridge) "qsQ" = ( @@ -46274,9 +46172,8 @@ "qyf" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "qyo" = ( /obj/machinery/door/firedoor, @@ -46309,9 +46206,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 + dir = 6 }, -/obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron, /area/station/security/brig) "qyB" = ( @@ -46360,12 +46256,10 @@ dir = 5 }, /turf/open/floor/iron/dark/airless, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/freezerchamber) "qzg" = ( /obj/structure/closet/emcloset, -/obj/structure/sign/warning/vacuum/external{ - pixel_x = 32 - }, +/obj/structure/sign/warning/vacuum/external/directional/east, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) "qzs" = ( @@ -46407,7 +46301,7 @@ /area/station/service/library) "qzW" = ( /turf/closed/wall, -/area/station/security/prison) +/area/station/security/execution/transfer) "qAc" = ( /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -46474,9 +46368,8 @@ "qBr" = ( /obj/effect/landmark/event_spawn, /obj/machinery/light/small/directional/south, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/greater) "qBy" = ( /turf/closed/wall, @@ -46519,11 +46412,6 @@ /obj/structure/sign/departments/science, /turf/closed/wall, /area/station/science/lobby) -"qCo" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, -/area/station/maintenance/port) "qCv" = ( /obj/machinery/telecomms/processor/preset_two, /turf/open/floor/circuit/telecomms/mainframe, @@ -46614,7 +46502,7 @@ pixel_y = 32 }, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "qDt" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -46639,9 +46527,8 @@ /area/station/service/hydroponics) "qDW" = ( /obj/effect/spawner/random/engineering/atmospherics_portable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "qEb" = ( /obj/structure/chair/pew/right, @@ -46709,7 +46596,8 @@ "qFv" = ( /obj/machinery/door/poddoor/shutters{ id = "qm_warehouse"; - name = "Warehouse Shutters" + name = "Warehouse Shutters"; + dir = 8 }, /obj/structure/cable, /obj/effect/turf_decal/caution/stand_clear, @@ -46793,6 +46681,10 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/break_room) +"qGO" = ( +/obj/machinery/pdapainter/supply, +/turf/open/floor/carpet/red, +/area/station/cargo/qm) "qGP" = ( /obj/structure/closet/firecloset, /turf/open/floor/plating, @@ -46809,13 +46701,15 @@ /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ id = "pharmacy_shutters"; - name = "Pharmacy Shutters" + name = "Pharmacy Shutters"; + dir = 4 }, /turf/open/floor/plating, /area/station/medical/pharmacy) "qGV" = ( /obj/machinery/door/poddoor/shutters{ - id = "supplybridge" + id = "supplybridge"; + dir = 1 }, /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -46847,7 +46741,7 @@ dir = 1 }, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "qHK" = ( /obj/effect/spawner/random/structure/grille, /turf/open/floor/plating, @@ -46858,7 +46752,7 @@ /area/station/maintenance/starboard/greater) "qHX" = ( /turf/open/floor/plating, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "qIi" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -46872,11 +46766,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) -"qIr" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, -/area/station/maintenance/starboard/aft) "qIu" = ( /obj/machinery/portable_atmospherics/scrubber, /obj/machinery/status_display/evac/directional/north, @@ -46929,9 +46818,6 @@ /obj/item/folder/blue, /obj/item/storage/secure/briefcase, /obj/item/assembly/flash/handheld, -/obj/machinery/computer/security/telescreen/vault{ - pixel_y = 30 - }, /turf/open/floor/wood, /area/station/command/heads_quarters/hop) "qJz" = ( @@ -46950,8 +46836,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/structure/sign/warning/secure_area{ - pixel_x = 32; +/obj/structure/sign/warning/secure_area/directional/east{ pixel_y = 32 }, /obj/effect/turf_decal/trimline/brown/warning{ @@ -47097,9 +46982,8 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/spawner/random/structure/steam_vent, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port) "qMA" = ( /obj/machinery/computer/cargo{ @@ -47143,7 +47027,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/item/radio/intercom/prison/directional/north, /turf/open/floor/plating, -/area/station/security/prison) +/area/station/security/prison/work) "qNi" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -47175,8 +47059,9 @@ "qNw" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, /turf/open/floor/iron/freezer, -/area/station/security/prison) +/area/station/security/prison/shower) "qNz" = ( /obj/structure/chair/office/light{ dir = 4 @@ -47216,7 +47101,7 @@ dir = 8 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "qNV" = ( /obj/machinery/holopad, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -47334,7 +47219,7 @@ dir = 4 }, /turf/open/floor/iron/white, -/area/station/science/storage) +/area/station/science/ordnance/storage) "qPS" = ( /obj/machinery/light_switch/directional/north, /obj/effect/turf_decal/siding/wood{ @@ -47540,11 +47425,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/commons/storage/primary) -"qSB" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/turf/open/floor/engine, -/area/station/science/misc_lab/range) "qSJ" = ( /obj/effect/decal/cleanable/dirt, /turf/closed/wall, @@ -47872,7 +47752,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "qZv" = ( /obj/structure/window/reinforced{ dir = 8 @@ -47995,9 +47875,7 @@ /area/station/security/warden) "rbF" = ( /obj/machinery/mass_driver/chapelgun, -/obj/structure/sign/warning/vacuum/external{ - pixel_y = 32 - }, +/obj/structure/sign/warning/vacuum/external/directional/north, /obj/machinery/light/small/directional/north, /obj/item/gps, /obj/effect/turf_decal/stripes/line{ @@ -48057,9 +47935,7 @@ /turf/open/floor/iron, /area/station/engineering/break_room) "rdt" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_y = 32 - }, +/obj/structure/sign/warning/vacuum/external/directional/north, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) "rdv" = ( @@ -48111,7 +47987,7 @@ /obj/machinery/door/firedoor/heavy, /obj/effect/mapping_helpers/airlock/access/all/science/ordnance, /turf/open/floor/plating, -/area/station/science/mixing) +/area/station/science/ordnance) "rea" = ( /obj/effect/turf_decal/stripes/red/line{ dir = 5 @@ -48152,7 +48028,7 @@ /obj/item/pushbroom, /obj/machinery/light_switch/directional/south, /obj/effect/turf_decal/tile/brown/anticorner/contrasted{ - dir = 4 + dir = 8 }, /turf/open/floor/iron, /area/station/cargo/sorting) @@ -48194,9 +48070,7 @@ /area/station/hallway/secondary/command) "rfY" = ( /obj/structure/lattice, -/obj/structure/sign/warning/electric_shock{ - pixel_x = 32 - }, +/obj/structure/sign/warning/electric_shock/directional/east, /turf/open/space/basic, /area/space/nearstation) "rge" = ( @@ -48296,9 +48170,8 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/power/apc/auto_name/directional/east, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/lesser) "riz" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -48320,7 +48193,7 @@ /obj/structure/plasticflaps/opaque, /obj/machinery/door/window/left/directional/north{ name = "MuleBot Access"; - req_access = list("mail_sorting") + req_access = list("shipping") }, /turf/open/floor/plating, /area/station/maintenance/port/aft) @@ -48384,6 +48257,15 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai_upload) +"rjT" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "chem_lockdown"; + name = "Chemistry Shutters"; + dir = 8 + }, +/turf/open/floor/plating, +/area/station/medical/chemistry) "rke" = ( /obj/machinery/recharge_station, /turf/open/floor/plating, @@ -48560,9 +48442,8 @@ /obj/structure/disposalpipe/trunk{ dir = 2 }, -/obj/structure/sign/departments/exam_room{ - color = "#52B4E9"; - pixel_y = -32 +/obj/structure/sign/departments/exam_room/directional/south{ + color = "#52B4E9" }, /turf/open/floor/iron, /area/station/cargo/sorting) @@ -48611,9 +48492,8 @@ /area/station/hallway/primary/starboard) "rnE" = ( /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/department/science/xenobiology) "rnV" = ( /obj/structure/window/reinforced{ @@ -48646,7 +48526,7 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/delivery, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "roa" = ( /obj/effect/turf_decal/tile/neutral, /obj/structure/cable, @@ -48684,9 +48564,8 @@ }, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/department/medical/central) "rps" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -48730,7 +48609,8 @@ /area/station/medical/surgery/aft) "rqa" = ( /obj/machinery/door/poddoor/shutters{ - id = "supplybridge" + id = "supplybridge"; + dir = 1 }, /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -48739,9 +48619,8 @@ /area/station/maintenance/port/fore) "rqX" = ( /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/central) "rrf" = ( /obj/structure/bodycontainer/morgue{ @@ -48886,7 +48765,7 @@ dir = 1 }, /turf/open/floor/iron/white, -/area/station/science/storage) +/area/station/science/ordnance/storage) "rtn" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -49121,6 +49000,12 @@ /obj/machinery/light_switch/directional/south, /turf/open/floor/iron/dark, /area/station/engineering/storage/tech) +"rwt" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/security/execution/transfer) "rwx" = ( /obj/effect/turf_decal/delivery, /obj/effect/turf_decal/stripes/line{ @@ -49278,9 +49163,8 @@ /area/station/engineering/storage/tech) "rys" = ( /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/greater) "ryJ" = ( /obj/structure/cable, @@ -49331,9 +49215,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment, /obj/effect/spawner/random/structure/steam_vent, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "rzz" = ( /obj/structure/sign/warning/cold_temp, @@ -49418,7 +49301,7 @@ "rAK" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "rBe" = ( /obj/structure/table, /obj/item/stack/cable_coil{ @@ -49492,8 +49375,9 @@ /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/freezer, -/area/station/security/prison) +/area/station/security/prison/shower) "rCJ" = ( /obj/machinery/camera/directional/east{ c_tag = "Departure Lounge - Starboard Aft" @@ -49654,7 +49538,7 @@ }, /obj/structure/cable, /turf/open/floor/iron/dark, -/area/station/science/storage) +/area/station/science/ordnance/storage) "rFB" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -49681,9 +49565,7 @@ dir = 1 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/sign/departments/court{ - pixel_y = -32 - }, +/obj/structure/sign/departments/court/directional/south, /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/east, /turf/open/floor/iron, @@ -49694,7 +49576,7 @@ }, /obj/effect/turf_decal/box, /turf/open/floor/iron/dark, -/area/station/science/storage) +/area/station/science/ordnance/storage) "rGb" = ( /obj/machinery/washing_machine, /obj/effect/turf_decal/tile/blue{ @@ -50176,7 +50058,8 @@ /area/station/science/research) "rMx" = ( /obj/machinery/door/poddoor/shutters/preopen{ - id = "ordnancebridge" + id = "ordnancebridge"; + dir = 1 }, /obj/machinery/button/door{ id = "ordnancebridge"; @@ -50212,7 +50095,7 @@ "rMD" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "rMI" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/carpet, @@ -50280,14 +50163,14 @@ "rOA" = ( /obj/structure/cable, /obj/structure/bed/dogbed/mcgriff, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 9 - }, /obj/machinery/power/apc/auto_name/directional/north, -/mob/living/simple_animal/pet/dog/pug/mcgriff, /obj/machinery/firealarm/directional/west{ pixel_y = 26 }, +/mob/living/simple_animal/pet/dog/pug/mcgriff, +/obj/effect/turf_decal/trimline/dark_red/filled/line{ + dir = 9 + }, /turf/open/floor/iron, /area/station/security/warden) "rOF" = ( @@ -50377,7 +50260,7 @@ }, /obj/machinery/firealarm/directional/east, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "rQd" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -50393,7 +50276,8 @@ /obj/machinery/door/firedoor, /obj/machinery/door/poddoor/shutters/preopen{ id = "rdgene2"; - name = "Genetics Lab Shutters" + name = "Genetics Lab Shutters"; + dir = 8 }, /obj/machinery/door/window/left/directional/west{ dir = 4; @@ -50415,7 +50299,7 @@ /obj/effect/mapping_helpers/airlock/locked, /obj/effect/mapping_helpers/airlock/access/all/science/ordnance, /turf/open/floor/engine/vacuum, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "rQJ" = ( /obj/machinery/disposal/bin, /obj/effect/turf_decal/delivery, @@ -50425,7 +50309,7 @@ /obj/machinery/light/directional/north, /obj/machinery/light_switch/directional/north, /turf/open/floor/iron/white, -/area/station/science/misc_lab) +/area/station/science/explab) "rQL" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 @@ -50438,7 +50322,8 @@ /area/station/engineering/break_room) "rQO" = ( /obj/machinery/door/poddoor/shutters/preopen{ - id = "ordnancebridge" + id = "ordnancebridge"; + dir = 4 }, /obj/machinery/button/door{ id = "ordnancebridge"; @@ -50487,9 +50372,8 @@ /obj/structure/disposalpipe/segment, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "rQX" = ( /obj/effect/spawner/structure/window/reinforced, @@ -50541,9 +50425,7 @@ /turf/open/floor/plating, /area/station/maintenance/solars/starboard/fore) "rRR" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_y = -32 - }, +/obj/structure/sign/warning/vacuum/external/directional/south, /obj/machinery/light/small/directional/north, /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -50591,7 +50473,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "rSk" = ( /obj/structure/sign/painting/library{ pixel_y = -32 @@ -50838,6 +50720,9 @@ name = "High-Risk Modules"; req_access = list("captain") }, +/obj/item/ai_module/reset/purge{ + pixel_y = 11 + }, /turf/open/floor/circuit/red, /area/station/ai_monitored/turret_protected/ai_upload) "rVY" = ( @@ -50855,9 +50740,8 @@ /area/station/engineering/atmos) "rWF" = ( /obj/machinery/power/port_gen/pacman/pre_loaded, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "rWH" = ( /obj/machinery/door/window{ @@ -50886,9 +50770,8 @@ /obj/item/toy/plush/snakeplushie{ name = "Boa Ben" }, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/lesser) "rXB" = ( /obj/structure/table, @@ -50912,7 +50795,7 @@ dir = 1 }, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "rXF" = ( /obj/machinery/computer/slot_machine{ pixel_y = 2 @@ -50977,7 +50860,7 @@ dir = 8 }, /turf/open/floor/engine, -/area/station/science/misc_lab/range) +/area/station/science/explab) "rYN" = ( /obj/item/radio/intercom/directional/west, /obj/structure/table/glass, @@ -51030,7 +50913,7 @@ /obj/effect/turf_decal/siding/purple, /obj/item/kirbyplants/random, /turf/open/floor/iron/white, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "rZt" = ( /obj/machinery/atmospherics/pipe/smart/manifold/purple/visible{ dir = 8 @@ -51133,7 +51016,8 @@ /area/station/construction/storage_wing) "sal" = ( /obj/machinery/door/poddoor/shutters{ - id = "abandoned_kitchen" + id = "abandoned_kitchen"; + dir = 4 }, /obj/structure/displaycase/forsale/kitchen{ pixel_y = 8 @@ -51321,7 +51205,8 @@ }, /obj/machinery/door/poddoor/shutters/preopen{ id = "roboticsprivacy"; - name = "Robotics Shutters" + name = "Robotics Shutters"; + dir = 8 }, /obj/effect/turf_decal/tile/purple/fourcorners, /obj/structure/desk_bell{ @@ -51358,7 +51243,7 @@ }, /obj/machinery/light_switch/directional/south, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "see" = ( /obj/machinery/door/airlock/maintenance, /obj/machinery/atmospherics/pipe/smart/simple/orange/hidden{ @@ -51383,7 +51268,7 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/newscaster/directional/north, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "sew" = ( /obj/structure/chair/stool/directional/east, /obj/effect/landmark/start/assistant, @@ -51393,9 +51278,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/structure/sign/departments/court{ - pixel_y = 32 - }, +/obj/structure/sign/departments/court/directional/north, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, @@ -51409,9 +51292,7 @@ /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 }, -/obj/structure/sign/warning/electric_shock{ - pixel_y = 32 - }, +/obj/structure/sign/warning/electric_shock/directional/north, /turf/open/floor/iron, /area/station/hallway/primary/fore) "sfl" = ( @@ -51559,6 +51440,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"shU" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/security/execution/transfer) "shV" = ( /obj/effect/turf_decal/stripes/line, /obj/structure/cable, @@ -51590,7 +51476,7 @@ }, /obj/machinery/light_switch/directional/east, /turf/open/floor/iron/white, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "sip" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -51665,13 +51551,16 @@ /obj/machinery/portable_atmospherics/canister/plasma, /obj/effect/turf_decal/siding/purple, /turf/open/floor/iron/dark, -/area/station/science/storage) +/area/station/science/ordnance/storage) "skq" = ( /obj/machinery/shower{ dir = 4 }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, /turf/open/floor/iron/freezer, -/area/station/security/prison) +/area/station/security/prison/shower) "skt" = ( /obj/structure/window/reinforced, /obj/effect/turf_decal/tile/blue{ @@ -51733,7 +51622,7 @@ "slY" = ( /obj/machinery/light/small/directional/south, /turf/open/floor/engine, -/area/station/science/misc_lab/range) +/area/station/science/explab) "smg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, /obj/effect/mapping_helpers/airlock/locked, @@ -51855,9 +51744,8 @@ "son" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "sou" = ( /obj/effect/turf_decal/delivery, @@ -51951,9 +51839,8 @@ /obj/structure/disposalpipe/trunk{ dir = 2 }, -/obj/structure/sign/departments/botany{ - color = "#9FED58"; - pixel_y = -32 +/obj/structure/sign/departments/botany/directional/south{ + color = "#9FED58" }, /turf/open/floor/iron, /area/station/cargo/sorting) @@ -52023,13 +51910,14 @@ "sry" = ( /obj/machinery/portable_atmospherics/canister/nitrogen, /turf/open/floor/iron/dark, -/area/station/science/storage) +/area/station/science/ordnance/storage) "srG" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 }, +/obj/structure/cable, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/visit) "srK" = ( /obj/effect/turf_decal/trimline/brown/filled/corner{ dir = 8 @@ -52167,7 +52055,7 @@ /area/station/medical/treatment_center) "stF" = ( /turf/closed/wall/r_wall, -/area/station/science/mixing) +/area/station/science/ordnance) "stL" = ( /obj/structure/table/wood, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -52187,12 +52075,7 @@ "suu" = ( /obj/effect/turf_decal/siding/purple, /turf/open/floor/iron/dark, -/area/station/science/mixing) -"sux" = ( -/turf/open/floor/plating/airless{ - icon_state = "platingdmg2" - }, -/area/station/solars/port/fore) +/area/station/science/ordnance) "suz" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/structure/table/reinforced, @@ -52352,9 +52235,8 @@ "sxl" = ( /obj/structure/reagent_dispensers/fueltank, /obj/effect/spawner/random/trash/janitor_supplies, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/greater) "sxn" = ( /obj/machinery/power/port_gen/pacman/pre_loaded, @@ -52365,8 +52247,8 @@ /turf/open/floor/plating, /area/station/maintenance/solars/starboard/fore) "sxq" = ( -/obj/machinery/door/airlock/external{ - name = "Supply Dock Airlock" +/obj/machinery/door/airlock/external/glass{ + name = "Supply Door Airlock" }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 @@ -52388,7 +52270,7 @@ "syc" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/iron, +/turf/open/floor/plating, /area/station/security/brig) "sye" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -52509,13 +52391,6 @@ /obj/effect/landmark/start/janitor, /turf/open/floor/iron, /area/station/service/janitor) -"szN" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, -/area/station/maintenance/starboard/fore) "szO" = ( /obj/structure/cable, /turf/open/floor/wood, @@ -52534,9 +52409,8 @@ "sAk" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/fore/lesser) "sAn" = ( /obj/machinery/telecomms/server/presets/engineering, @@ -52773,9 +52647,7 @@ /turf/open/floor/plating, /area/station/engineering/atmos/storage/gas) "sDE" = ( -/obj/structure/sign/warning/secure_area{ - pixel_y = 32 - }, +/obj/structure/sign/warning/secure_area/directional/north, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment{ @@ -52896,7 +52768,7 @@ }, /obj/item/kirbyplants/random, /turf/open/floor/iron/white, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "sHa" = ( /obj/machinery/door/airlock/external{ name = "Security External Airlock" @@ -52906,7 +52778,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/plating, -/area/station/security/prison) +/area/station/security/execution/transfer) "sHg" = ( /obj/item/radio/intercom/directional/south, /obj/machinery/camera/directional/south{ @@ -52941,7 +52813,7 @@ dir = 6 }, /turf/open/floor/iron/white, -/area/station/science/storage) +/area/station/science/ordnance/storage) "sIb" = ( /obj/structure/table/reinforced, /obj/machinery/recharger{ @@ -53013,7 +52885,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, -/area/station/science/misc_lab) +/area/station/science/explab) "sJL" = ( /obj/item/crowbar, /obj/structure/cable, @@ -53062,7 +52934,7 @@ /obj/machinery/portable_atmospherics/canister/nitrogen, /obj/effect/turf_decal/siding/purple, /turf/open/floor/iron/dark, -/area/station/science/storage) +/area/station/science/ordnance/storage) "sKt" = ( /obj/machinery/smartfridge/chemistry/preloaded, /turf/closed/wall, @@ -53140,9 +53012,8 @@ /area/station/ai_monitored/turret_protected/ai) "sLR" = ( /obj/machinery/space_heater, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "sLT" = ( /obj/machinery/atmospherics/components/binary/pump{ @@ -53155,7 +53026,7 @@ pixel_x = -24 }, /turf/open/floor/engine, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "sMl" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/grimy, @@ -53175,7 +53046,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/red/half/contrasted, +/obj/effect/turf_decal/trimline/red/filled/line, /turf/open/floor/iron, /area/station/security/brig) "sMD" = ( @@ -53248,9 +53119,8 @@ "sNC" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port) "sNJ" = ( /obj/machinery/navbeacon{ @@ -53405,9 +53275,8 @@ c_tag = "Gravity Generator Foyer" }, /obj/structure/closet/radiation, -/obj/structure/sign/warning/radiation/rad_area{ - dir = 1; - pixel_y = 32 +/obj/structure/sign/warning/radiation/rad_area/directional/north{ + dir = 1 }, /obj/machinery/airalarm/directional/east, /obj/effect/turf_decal/stripes/line{ @@ -53457,7 +53326,7 @@ dir = 5 }, /turf/open/floor/plating/airless, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "sRT" = ( /obj/structure/cable, /turf/open/floor/wood, @@ -53614,17 +53483,6 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/aisat/exterior) -"sTH" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/duct, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/service/bar) "sTQ" = ( /obj/structure/bed/roller, /obj/effect/turf_decal/trimline/blue/filled/warning{ @@ -53996,11 +53854,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "tae" = ( -/turf/open/floor/plating/airless{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/station/solars/port/aft) "tar" = ( /obj/machinery/medical_kiosk, @@ -54014,7 +53871,7 @@ /obj/effect/landmark/start/scientist, /obj/structure/cable, /turf/open/floor/iron/white, -/area/station/science/misc_lab) +/area/station/science/explab) "taz" = ( /obj/structure/cable, /obj/machinery/power/solar{ @@ -54100,9 +53957,8 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/aft/greater) "tbI" = ( /obj/structure/cable, @@ -54174,9 +54030,8 @@ /area/station/cargo/drone_bay) "tdh" = ( /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "tdj" = ( /obj/effect/turf_decal/tile/neutral{ @@ -54411,9 +54266,8 @@ /area/station/medical/virology) "tgW" = ( /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/aft) "thc" = ( /obj/machinery/camera/directional/east{ @@ -54559,7 +54413,7 @@ /obj/structure/table/reinforced, /obj/machinery/door/window/left/directional/west{ name = "Cargo Desk"; - req_access = list("mail_sorting") + req_access = list("shipping") }, /obj/item/paper_bin{ pixel_x = -3; @@ -54601,7 +54455,7 @@ dir = 10 }, /turf/open/floor/plating/airless, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "tkP" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/white/line{ @@ -54689,7 +54543,8 @@ /area/station/engineering/supermatter/room) "tmz" = ( /obj/machinery/door/poddoor/shutters{ - id = "supplybridge" + id = "supplybridge"; + dir = 1 }, /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -54897,7 +54752,7 @@ }, /obj/effect/turf_decal/siding/purple, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "tpC" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -55091,9 +54946,8 @@ /area/station/science/cytology) "tsK" = ( /obj/item/reagent_containers/food/drinks/bottle/wine/unlabeled, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/space/nearstation) "tsP" = ( /obj/effect/decal/cleanable/dirt/dust, @@ -55125,7 +54979,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "ttA" = ( /obj/structure/table, /obj/item/flashlight{ @@ -55315,7 +55169,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "twN" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -55356,7 +55210,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable/layer3, -/obj/effect/mapping_helpers/airlock/access/all/engineering/construction, +/obj/effect/mapping_helpers/airlock/access/all/command/minisat, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) "txi" = ( @@ -55557,9 +55411,8 @@ "tAT" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/wood{ - icon_state = "wood-broken" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/service/library) "tBc" = ( /obj/structure/disposalpipe/segment{ @@ -55678,7 +55531,7 @@ dir = 4 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "tDN" = ( /obj/structure/chair{ dir = 8 @@ -55761,9 +55614,8 @@ "tFn" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port) "tFr" = ( /obj/structure/cable, @@ -55771,9 +55623,8 @@ /area/station/medical/medbay/central) "tGb" = ( /obj/effect/spawner/random/engineering/atmospherics_portable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "tGu" = ( /obj/machinery/computer/operating{ @@ -55954,7 +55805,6 @@ /area/station/medical/surgery/theatre) "tJE" = ( /obj/effect/turf_decal/trimline/red/filled/corner, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) "tJF" = ( @@ -56069,9 +55919,7 @@ /turf/open/floor/iron/dark, /area/station/command/heads_quarters/ce) "tLb" = ( -/obj/structure/sign/warning/electric_shock{ - pixel_y = -32 - }, +/obj/structure/sign/warning/electric_shock/directional/south, /turf/open/space/basic, /area/space) "tLc" = ( @@ -56227,14 +56075,13 @@ dir = 1 }, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "tNg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/command/bridge) "tNn" = ( -/obj/structure/cable, /turf/open/floor/iron/dark, /area/station/security/lockers) "tNr" = ( @@ -56361,9 +56208,8 @@ /turf/open/floor/iron, /area/station/hallway/primary/aft) "tPH" = ( -/turf/open/floor/plating/airless{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating/airless, /area/space/nearstation) "tPI" = ( /obj/machinery/holopad, @@ -56455,9 +56301,8 @@ /obj/structure/chair/office, /obj/effect/landmark/start/quartermaster, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood{ - icon_state = "wood-broken4" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/cargo/qm) "tSw" = ( /turf/closed/wall, @@ -56533,14 +56378,11 @@ /obj/machinery/light/small/directional/east, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/central) "tTC" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_x = 32 - }, +/obj/structure/sign/warning/vacuum/external/directional/east, /obj/effect/turf_decal/stripes/line{ dir = 1 }, @@ -56663,7 +56505,7 @@ }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/garden) "tUX" = ( /obj/machinery/light/small/directional/west, /obj/machinery/sparker/directional/west{ @@ -56745,7 +56587,8 @@ "tWU" = ( /obj/machinery/door/poddoor/shutters{ id = "visitation"; - name = "Visitation Shutters" + name = "Visitation Shutters"; + dir = 4 }, /obj/machinery/door/window/right/directional/south{ dir = 4 @@ -56755,7 +56598,7 @@ }, /obj/structure/table, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/visit) "tWV" = ( /obj/machinery/holopad, /obj/structure/cable, @@ -56779,18 +56622,15 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 }, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/solars/starboard/aft) "tXx" = ( /obj/effect/turf_decal/trimline/green/filled/corner{ dir = 8 }, /obj/item/kirbyplants/random, -/obj/structure/sign/warning/cold_temp{ - pixel_y = 32 - }, +/obj/structure/sign/warning/cold_temp/directional/north, /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 4 }, @@ -56853,7 +56693,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/plating, -/area/station/security/prison) +/area/station/security/execution/transfer) "tYm" = ( /obj/structure/chair/stool/directional/east, /obj/structure/cable, @@ -56981,7 +56821,7 @@ /area/space/nearstation) "uaA" = ( /obj/structure/table/wood, -/obj/item/book/granter/spell/smoke/lesser{ +/obj/item/book/granter/action/spell/smoke/lesser{ name = "mysterious old book of cloud-chasing" }, /obj/item/reagent_containers/food/drinks/bottle/holywater{ @@ -57013,7 +56853,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, -/area/station/science/misc_lab) +/area/station/science/explab) "uaE" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -57122,9 +56962,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "ucI" = ( /obj/machinery/light/directional/south, @@ -57252,7 +57091,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "ued" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -57305,7 +57144,6 @@ /area/station/construction/mining/aux_base) "ueD" = ( /obj/machinery/light/small/directional/south, -/obj/machinery/airalarm/directional/south, /turf/open/floor/wood, /area/station/service/library) "ueG" = ( @@ -57360,7 +57198,7 @@ }, /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/safe) "ugE" = ( /obj/structure/chair{ name = "Judge" @@ -57514,7 +57352,7 @@ }, /obj/machinery/light/directional/west, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/mess) "uiB" = ( /obj/machinery/door/airlock/maintenance, /obj/structure/cable, @@ -57586,7 +57424,7 @@ /obj/structure/table, /obj/item/clipboard, /turf/open/floor/iron/white, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "uke" = ( /obj/structure/rack, /obj/effect/spawner/random/food_or_drink/booze{ @@ -57611,7 +57449,7 @@ dir = 4 }, /turf/open/floor/plating, -/area/station/security/prison) +/area/station/security/execution/transfer) "ukv" = ( /obj/structure/rack, /obj/item/clothing/mask/gas, @@ -57658,9 +57496,8 @@ /turf/open/floor/iron/white/smooth_large, /area/station/medical/medbay/central) "ulp" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "ulv" = ( /obj/effect/turf_decal/stripes/white/line, @@ -57687,9 +57524,8 @@ /area/station/medical/chemistry) "ulV" = ( /obj/effect/spawner/random/engineering/atmospherics_portable, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port) "ulX" = ( /obj/machinery/lapvend, @@ -57728,7 +57564,7 @@ /obj/item/crowbar, /obj/machinery/light/directional/north, /obj/item/plant_analyzer, -/obj/item/reagent_containers/glass/bucket, +/obj/item/reagent_containers/glass/watering_can, /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, /area/station/service/hydroponics/garden) @@ -57827,7 +57663,7 @@ dir = 5 }, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "uor" = ( /obj/machinery/door/poddoor{ id = "QMLoaddoor2"; @@ -57915,6 +57751,9 @@ /obj/effect/mapping_helpers/airlock/access/all/science/general, /turf/open/floor/iron/white, /area/station/science/research) +"uqt" = ( +/turf/open/floor/iron, +/area/station/security/prison/garden) "uqL" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -57994,7 +57833,7 @@ }, /obj/effect/turf_decal/delivery, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "usg" = ( /obj/item/radio/intercom/directional/south, /obj/structure/table/reinforced, @@ -58033,9 +57872,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/structure/sign/warning/vacuum/external{ - pixel_y = -32 - }, +/obj/structure/sign/warning/vacuum/external/directional/south, /obj/structure/cable, /obj/machinery/light/small/directional/north, /turf/open/floor/plating, @@ -58086,9 +57923,8 @@ "usT" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/effect/spawner/random/medical/patient_stretcher, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/medical/abandoned) "usU" = ( /obj/effect/spawner/structure/window/reinforced, @@ -58124,6 +57960,13 @@ }, /turf/open/floor/wood, /area/station/security/office) +"utl" = ( +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) "utp" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -58194,7 +58037,7 @@ "uuY" = ( /obj/machinery/portable_atmospherics/canister/plasma, /turf/open/floor/iron/dark, -/area/station/science/storage) +/area/station/science/ordnance/storage) "uvw" = ( /obj/machinery/status_display/supply{ pixel_y = 32 @@ -58379,9 +58222,7 @@ /turf/open/floor/wood, /area/station/maintenance/port/aft) "uyd" = ( -/obj/structure/sign/warning/pods{ - pixel_x = 32 - }, +/obj/structure/sign/warning/pods/directional/east, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, @@ -58460,16 +58301,10 @@ }, /turf/open/space/basic, /area/space) -"uzs" = ( -/obj/machinery/airalarm/directional/west, -/obj/structure/displaycase/trophy, -/turf/open/floor/wood, -/area/station/service/library) "uzB" = ( /obj/machinery/power/port_gen/pacman/pre_loaded, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/fore) "uzJ" = ( /obj/effect/turf_decal/trimline/blue/filled/warning{ @@ -58584,7 +58419,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/science/ordnance_storage, /turf/open/floor/iron/white, -/area/station/science/mixing) +/area/station/science/ordnance) "uCq" = ( /obj/structure/closet/firecloset, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -58697,9 +58532,8 @@ }, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/lesser) "uEO" = ( /obj/structure/reagent_dispensers/fueltank, @@ -58748,7 +58582,7 @@ /turf/open/floor/plating/airless{ luminosity = 2 }, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "uFZ" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, @@ -58869,13 +58703,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, /area/station/science/xenobiology) -"uHV" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/security/prison) "uId" = ( /obj/effect/turf_decal/tile/yellow{ dir = 8 @@ -59022,7 +58849,7 @@ req_access = list("ordnance") }, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "uKa" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ dir = 6 @@ -59127,9 +58954,8 @@ /obj/structure/window/reinforced{ dir = 4 }, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/space/nearstation) "uLE" = ( /obj/structure/cable, @@ -59164,10 +58990,9 @@ dir = 8; pixel_y = -4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/freezer, -/area/station/security/prison) +/area/station/security/prison/shower) "uMi" = ( /obj/structure/table/reinforced, /obj/item/storage/box/beakers{ @@ -59226,7 +59051,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/door/poddoor/shutters/preopen{ id = "XenoPens"; - name = "Xenobiology Lockdown" + name = "Xenobiology Lockdown"; + dir = 8 }, /turf/open/floor/iron, /area/station/science/xenobiology) @@ -59250,12 +59076,6 @@ /obj/effect/spawner/random/trash/box, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) -"uOe" = ( -/obj/machinery/power/port_gen/pacman/pre_loaded, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, -/area/station/maintenance/fore) "uOm" = ( /obj/structure/window/reinforced{ dir = 4 @@ -59348,7 +59168,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/siding/purple, /turf/open/floor/iron/white, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "uQF" = ( /obj/structure/lattice, /obj/item/stack/rods, @@ -59405,9 +59225,8 @@ "uRq" = ( /obj/structure/sign/poster/contraband/random/directional/north, /obj/effect/spawner/random/engineering/tank, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/aft) "uRu" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -59443,9 +59262,8 @@ /area/station/engineering/atmos/storage/gas) "uRK" = ( /obj/effect/landmark/blobstart, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "uRL" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ @@ -59478,7 +59296,7 @@ dir = 4 }, /turf/open/floor/plating/airless, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "uTj" = ( /obj/effect/landmark/start/medical_doctor, /turf/open/floor/iron/dark, @@ -59492,7 +59310,7 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/light/directional/west, /turf/open/floor/grass, -/area/station/security/prison) +/area/station/security/prison/garden) "uTF" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/security/glass{ @@ -59529,8 +59347,9 @@ /obj/machinery/door/poddoor/preopen{ id = "transitlockdown" }, +/obj/effect/mapping_helpers/airlock/access/any/engineering/tcoms, /obj/effect/mapping_helpers/airlock/access/any/command/general, -/obj/effect/mapping_helpers/airlock/access/any/engineering/construction, +/obj/effect/mapping_helpers/airlock/access/any/command/minisat, /turf/open/floor/iron/dark, /area/station/engineering/transit_tube) "uUg" = ( @@ -59803,9 +59622,7 @@ /area/station/commons/storage/tools) "uZo" = ( /obj/machinery/light/small/directional/north, -/obj/structure/sign/warning/secure_area{ - pixel_y = 32 - }, +/obj/structure/sign/warning/secure_area/directional/north, /obj/effect/turf_decal/stripes/corner{ dir = 1 }, @@ -59817,15 +59634,13 @@ /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/plating, -/area/station/security/prison) +/area/station/security/prison/safe) "uZD" = ( /obj/structure/cable, /turf/open/floor/carpet, /area/station/service/chapel) "uZK" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_y = 32 - }, +/obj/structure/sign/warning/vacuum/external/directional/north, /obj/effect/turf_decal/stripes/line{ dir = 1 }, @@ -59917,7 +59732,7 @@ /obj/machinery/door/firedoor/heavy, /obj/effect/mapping_helpers/airlock/access/all/science/ordnance, /turf/open/floor/plating, -/area/station/science/mixing) +/area/station/science/ordnance) "vdi" = ( /obj/machinery/camera/directional/west{ c_tag = "Security - Office - Port" @@ -59980,7 +59795,8 @@ }, /obj/machinery/door/poddoor/shutters/preopen{ id = "kitchen_counter"; - name = "Kitchen Counter Shutters" + name = "Kitchen Counter Shutters"; + dir = 1 }, /turf/open/floor/iron/cafeteria{ dir = 5 @@ -60038,7 +59854,7 @@ dir = 9 }, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "vfk" = ( /obj/structure/cable, /turf/open/floor/engine, @@ -60087,11 +59903,9 @@ /area/station/medical/chemistry) "vga" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer2, -/obj/machinery/air_sensor{ - chamber_id = "ordnancegas2" - }, +/obj/machinery/air_sensor/ordnance_freezer_chamber, /turf/open/floor/iron/dark/airless, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/freezerchamber) "vgb" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood, @@ -60233,9 +60047,8 @@ /turf/open/floor/iron, /area/station/commons/fitness/recreation) "vjh" = ( -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port) "vjk" = ( /obj/effect/turf_decal/siding/purple{ @@ -60329,9 +60142,8 @@ /obj/structure/disposalpipe/trunk{ dir = 1 }, -/obj/structure/sign/departments/engineering{ - color = "#EFB341"; - pixel_y = -32 +/obj/structure/sign/departments/engineering/directional/south{ + color = "#EFB341" }, /turf/open/floor/iron, /area/station/cargo/sorting) @@ -60360,9 +60172,7 @@ /obj/structure/chair{ dir = 8 }, -/obj/structure/sign/warning/electric_shock{ - pixel_x = 32 - }, +/obj/structure/sign/warning/electric_shock/directional/east, /obj/effect/turf_decal/stripes/line{ dir = 4 }, @@ -60422,7 +60232,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "vlh" = ( /obj/structure/rack, /obj/effect/spawner/random/techstorage/rnd_secure_all, @@ -60538,6 +60348,7 @@ /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/firealarm/directional/west, /turf/open/floor/iron, /area/station/hallway/primary/central) "vmY" = ( @@ -60550,9 +60361,8 @@ "vnj" = ( /obj/structure/girder, /obj/effect/spawner/random/structure/grille, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/aft) "vnk" = ( /obj/machinery/door/firedoor, @@ -60634,7 +60444,7 @@ dir = 4 }, /turf/open/floor/iron, -/area/station/science/misc_lab) +/area/station/science/explab) "vpg" = ( /obj/machinery/door/poddoor/preopen{ id = "bridge blast"; @@ -60878,7 +60688,8 @@ /obj/machinery/door/firedoor, /obj/machinery/door/poddoor/shutters{ id = "commissaryshutter"; - name = "Vacant Commissary Shutter" + name = "Vacant Commissary Shutter"; + dir = 8 }, /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -60922,18 +60733,18 @@ dir = 8; pixel_x = 11 }, -/obj/item/reagent_containers/glass/bucket, +/obj/item/reagent_containers/glass/watering_can, /obj/effect/turf_decal/trimline/green/filled/line{ dir = 4 }, +/obj/machinery/airalarm/directional/east, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/garden) "vue" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "vun" = ( /turf/closed/wall, @@ -61240,9 +61051,8 @@ /turf/open/floor/iron/white, /area/station/medical/surgery/theatre) "vAQ" = ( -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "vBl" = ( /obj/effect/turf_decal/tile/purple, @@ -61418,9 +61228,8 @@ }, /obj/item/clothing/suit/apron/chef, /obj/item/clothing/head/chefhat, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/aft) "vEd" = ( /obj/effect/decal/cleanable/blood/old, @@ -61617,7 +61426,7 @@ /obj/effect/turf_decal/bot{ dir = 1 }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/construction, +/obj/effect/mapping_helpers/airlock/access/all/engineering/general, /turf/open/floor/iron{ dir = 1 }, @@ -61696,7 +61505,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, -/area/station/science/misc_lab) +/area/station/science/explab) "vJt" = ( /obj/structure/cable, /obj/machinery/firealarm/directional/west, @@ -61891,9 +61700,8 @@ /turf/open/floor/iron, /area/station/commons/locker) "vMG" = ( -/turf/open/floor/plating/airless{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating/airless, /area/station/solars/starboard/fore) "vML" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -62054,7 +61862,7 @@ /obj/machinery/light/directional/south, /obj/machinery/module_duplicator, /turf/open/floor/iron/white, -/area/station/science/misc_lab) +/area/station/science/explab) "vQb" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ @@ -62101,7 +61909,7 @@ dir = 1 }, /turf/open/floor/iron, -/area/station/science/misc_lab) +/area/station/science/explab) "vQv" = ( /obj/structure/table, /obj/item/plant_analyzer, @@ -62173,9 +61981,7 @@ /turf/open/floor/plating, /area/station/maintenance/starboard/greater) "vRz" = ( -/obj/structure/sign/departments/chemistry{ - pixel_x = 32 - }, +/obj/structure/sign/departments/chemistry/directional/east, /obj/machinery/camera/directional/east{ c_tag = "Medbay Main Hallway- Surgical Junction"; network = list("ss13","medbay") @@ -62183,14 +61989,34 @@ /turf/open/floor/iron/white, /area/station/medical/medbay/central) "vRL" = ( -/obj/machinery/rnd/production/techfab/department/cargo, -/obj/structure/disposalpipe/segment, -/obj/machinery/camera/directional/east{ - c_tag = "Cargo Bay - Mid" +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = 8; + pixel_y = 1 }, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ - dir = 1 +/obj/item/paper_bin{ + pixel_x = 8; + pixel_y = 6 + }, +/obj/item/paper_bin{ + pixel_x = 8; + pixel_y = 11 + }, +/obj/item/folder/yellow{ + pixel_x = -6; + pixel_y = 8 + }, +/obj/item/folder/yellow{ + pixel_x = -9; + pixel_y = 1 + }, +/obj/item/paper{ + pixel_x = -5 + }, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 8 }, +/obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/cargo/storage) "vRN" = ( @@ -62310,11 +62136,10 @@ dir = 6 }, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/execution/transfer) "vTE" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port) "vTX" = ( /turf/open/floor/iron/dark, @@ -62411,7 +62236,7 @@ /area/station/ai_monitored/command/storage/satellite) "vVH" = ( /turf/closed/wall/r_wall, -/area/station/science/storage) +/area/station/science/ordnance/storage) "vVI" = ( /obj/structure/table/glass, /obj/effect/turf_decal/tile/blue/fourcorners, @@ -62642,9 +62467,7 @@ }, /obj/machinery/power/apc/auto_name/directional/west, /obj/structure/cable, -/obj/structure/sign/warning/bodysposal{ - pixel_y = -32 - }, +/obj/structure/sign/warning/bodysposal/directional/south, /obj/effect/turf_decal/tile/blue/anticorner/contrasted{ dir = 8 }, @@ -62707,6 +62530,11 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/iron, /area/station/hallway/primary/central) +"wai" = ( +/obj/structure/lattice/catwalk, +/obj/structure/marker_beacon/yellow, +/turf/open/space/basic, +/area/space/nearstation) "wal" = ( /obj/effect/turf_decal/siding/purple, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -62759,9 +62587,7 @@ /turf/open/floor/iron/white, /area/station/medical/storage) "wbv" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_y = 32 - }, +/obj/structure/sign/warning/vacuum/external/directional/north, /obj/effect/turf_decal/stripes/line{ dir = 1 }, @@ -62782,12 +62608,13 @@ "wbN" = ( /obj/machinery/door/poddoor/shutters{ id = "visitation"; - name = "Visitation Shutters" + name = "Visitation Shutters"; + dir = 4 }, /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, /turf/open/floor/plating, -/area/station/security/prison) +/area/station/security/prison/visit) "wcr" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -63101,9 +62928,8 @@ "whq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/lesser) "whx" = ( /obj/machinery/door/firedoor, @@ -63132,7 +62958,7 @@ "whR" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating/airless, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "wih" = ( /obj/machinery/newscaster/directional/south, /turf/open/floor/wood, @@ -63190,7 +63016,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/table, -/obj/machinery/duct, /turf/open/floor/iron, /area/station/service/bar) "wjP" = ( @@ -63208,7 +63033,7 @@ dir = 4 }, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/execution/transfer) "wjQ" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -63316,6 +63141,9 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white/smooth_large, /area/station/medical/medbay/central) +"wlP" = ( +/turf/closed/wall/r_wall, +/area/station/security/prison/garden) "wlW" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -63324,7 +63152,7 @@ dir = 1 }, /turf/open/floor/iron/white, -/area/station/science/storage) +/area/station/science/ordnance/storage) "wmc" = ( /obj/structure/closet/secure_closet/evidence, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -63359,7 +63187,7 @@ dir = 1 }, /turf/open/floor/iron/white, -/area/station/science/storage) +/area/station/science/ordnance/storage) "wmz" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible, /turf/open/floor/iron, @@ -63431,9 +63259,8 @@ }, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/starboard/fore) "woG" = ( /obj/structure/cable, @@ -63844,18 +63671,11 @@ /obj/structure/disposalpipe/segment, /obj/effect/mapping_helpers/airlock/access/all/science/ordnance_storage, /turf/open/floor/iron/white, -/area/station/science/mixing) +/area/station/science/ordnance) "wuM" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/ai_monitored/command/storage/satellite) -"wuQ" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, -/area/station/maintenance/fore/lesser) "wvd" = ( /obj/machinery/door/airlock{ id_tag = "Cabin5"; @@ -63960,7 +63780,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/siding/purple, /turf/open/floor/iron/white, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "wxF" = ( /obj/structure/cable, /obj/effect/turf_decal/stripes/line{ @@ -64088,7 +63908,7 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "wAp" = ( /obj/item/radio/intercom/directional/west, /obj/structure/table, @@ -64213,9 +64033,7 @@ dir = 1; id = "garbage" }, -/obj/structure/sign/warning/vacuum{ - pixel_x = -32 - }, +/obj/structure/sign/warning/vacuum/directional/west, /turf/open/floor/plating, /area/station/maintenance/disposal) "wCl" = ( @@ -64226,9 +64044,8 @@ /area/station/hallway/primary/starboard) "wCp" = ( /obj/structure/disposalpipe/segment, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/department/medical/central) "wCq" = ( /obj/effect/spawner/structure/window/reinforced, @@ -64293,11 +64110,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/cargo/sorting) -"wDi" = ( -/turf/open/floor/plating/airless{ - icon_state = "platingdmg2" - }, -/area/space/nearstation) "wDq" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 10 @@ -64312,7 +64124,7 @@ /obj/structure/disposalpipe/segment, /obj/effect/landmark/start/scientist, /turf/open/floor/iron/white, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "wDG" = ( /obj/effect/turf_decal/tile/yellow{ dir = 8 @@ -64353,6 +64165,11 @@ /obj/item/defibrillator/loaded, /turf/open/floor/iron/dark, /area/station/medical/storage) +"wEq" = ( +/obj/structure/lattice/catwalk, +/obj/structure/marker_beacon/olive, +/turf/open/space/basic, +/area/space/nearstation) "wEz" = ( /obj/item/stack/sheet/cardboard, /obj/effect/spawner/random/trash/janitor_supplies, @@ -64486,9 +64303,8 @@ /area/station/commons/toilet/restrooms) "wHq" = ( /obj/structure/chair/stool/directional/north, -/turf/open/floor/wood{ - icon_state = "wood-broken4" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/maintenance/port/aft) "wHu" = ( /turf/closed/wall, @@ -64503,7 +64319,7 @@ dir = 4 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "wHJ" = ( /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -64527,7 +64343,7 @@ /obj/effect/turf_decal/delivery, /obj/machinery/door/window/left/directional/north{ name = "MuleBot Access"; - req_access = list("mail_sorting") + req_access = list("shipping") }, /obj/machinery/navbeacon{ codes_txt = "delivery;dir=4"; @@ -64538,8 +64354,6 @@ /turf/open/floor/iron, /area/station/maintenance/starboard/lesser) "wIr" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 10 }, @@ -64640,7 +64454,7 @@ req_access = list("rd") }, /turf/open/floor/iron/dark, -/area/station/science/storage) +/area/station/science/ordnance/storage) "wKu" = ( /obj/structure/cable, /turf/open/floor/wood, @@ -64751,7 +64565,7 @@ dir = 4 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "wMx" = ( /obj/effect/turf_decal/bot, /obj/effect/landmark/start/hangover, @@ -64783,7 +64597,7 @@ }, /obj/item/stack/package_wrap, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/work) "wNh" = ( /obj/effect/turf_decal/tile/blue{ dir = 8 @@ -64989,9 +64803,7 @@ /turf/open/floor/iron/dark, /area/station/security/lockers) "wPH" = ( -/obj/structure/sign/warning/electric_shock{ - pixel_x = 32 - }, +/obj/structure/sign/warning/electric_shock/directional/east, /obj/structure/table, /obj/item/storage/toolbox/mechanical, /obj/item/clothing/head/welding, @@ -65027,7 +64839,8 @@ "wQI" = ( /obj/machinery/door/poddoor/shutters/preopen{ id = "rdrnd"; - name = "Research and Development Shutters" + name = "Research and Development Shutters"; + dir = 8 }, /obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/plating, @@ -65175,10 +64988,9 @@ /obj/effect/turf_decal/stripes/corner{ dir = 1 }, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, -/area/station/security/prison) +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/security/execution/transfer) "wTp" = ( /obj/structure/table/reinforced, /obj/machinery/door/window/brigdoor{ @@ -65188,23 +65000,17 @@ }, /obj/item/paper, /obj/machinery/door/firedoor, -/obj/structure/cable, /obj/machinery/door/window/left/directional/south{ name = "Requests Window" }, /obj/item/pen, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) "wTr" = ( -/obj/structure/sign/warning/secure_area{ - pixel_x = -32 - }, +/obj/structure/sign/warning/secure_area/directional/west, /obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/central) "wTs" = ( /obj/item/radio/intercom/directional/south, @@ -65225,7 +65031,7 @@ dir = 6 }, /turf/open/floor/iron/white, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "wTO" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -65283,11 +65089,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/surgery/aft) -"wVh" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, -/area/station/maintenance/fore) "wVo" = ( /obj/structure/cable, /turf/open/floor/iron, @@ -65360,9 +65161,7 @@ /area/station/medical/storage) "wWG" = ( /obj/machinery/light/directional/east, -/obj/structure/sign/departments/science{ - pixel_x = 32 - }, +/obj/structure/sign/departments/science/directional/east, /obj/effect/turf_decal/tile/purple{ dir = 4 }, @@ -65434,7 +65233,7 @@ desc = "A wall impregnated with Fixium, able to withstand massive explosions with ease"; name = "hyper-reinforced wall" }, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "wXP" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -65450,7 +65249,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/plating, -/area/station/security/prison) +/area/station/security/execution/transfer) "wXZ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -65490,7 +65289,8 @@ /obj/machinery/door/firedoor, /obj/machinery/door/poddoor/shutters/preopen{ id = "rndlab2"; - name = "Secondary Research and Development Shutter" + name = "Secondary Research and Development Shutter"; + dir = 8 }, /obj/machinery/door/window/left/directional/south{ dir = 4; @@ -65537,7 +65337,7 @@ }, /obj/effect/turf_decal/siding/purple, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "wYx" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -65560,7 +65360,7 @@ dir = 1 }, /turf/open/floor/iron/white, -/area/station/security/prison) +/area/station/security/prison/visit) "wYI" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -65568,9 +65368,8 @@ /obj/structure/disposalpipe/segment{ dir = 5 }, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "wZe" = ( /obj/machinery/door/airlock/public/glass{ @@ -65623,7 +65422,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, -/obj/effect/turf_decal/trimline/red/filled/line{ +/obj/effect/turf_decal/trimline/dark_red/filled/line{ dir = 5 }, /turf/open/floor/iron, @@ -65638,7 +65437,7 @@ dir = 1 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "xaj" = ( /obj/effect/spawner/random/structure/closet_maintenance, /turf/open/floor/plating, @@ -65776,9 +65575,7 @@ /turf/closed/wall, /area/station/medical/surgery/aft) "xdQ" = ( -/obj/structure/sign/warning/hot_temp{ - pixel_y = -32 - }, +/obj/structure/sign/warning/hot_temp/directional/south, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) "xdX" = ( @@ -65862,9 +65659,7 @@ /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 }, -/obj/structure/sign/warning/electric_shock{ - pixel_y = 32 - }, +/obj/structure/sign/warning/electric_shock/directional/north, /obj/machinery/camera/directional/north{ c_tag = "Fore Primary Hallway Cells" }, @@ -66104,9 +65899,8 @@ "xjs" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/fore) "xjA" = ( /obj/machinery/camera/directional/north{ @@ -66284,7 +66078,7 @@ "xns" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "xnt" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/event_spawn, @@ -66314,7 +66108,7 @@ dir = 1 }, /obj/machinery/disposal/bin, -/obj/effect/turf_decal/trimline/red/filled/line{ +/obj/effect/turf_decal/trimline/dark_red/filled/line{ dir = 10 }, /turf/open/floor/iron, @@ -66392,16 +66186,15 @@ /area/station/maintenance/disposal/incinerator) "xpC" = ( /obj/effect/turf_decal/siding/purple, -/obj/machinery/computer/atmos_control/noreconnect{ - atmos_chambers = list("ordnancegas1" = "Burn Chamber", "ordnancegas2" = "Freezer Chamber"); - dir = 1 - }, /obj/machinery/camera/directional/south{ c_tag = "Science Ordnance Mix Lab"; network = list("ss13","rd") }, +/obj/machinery/computer/atmos_control/ordnancemix{ + dir = 1 + }, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "xpI" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/north, @@ -66411,9 +66204,8 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/wood{ - icon_state = "wood-broken5" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/cargo/qm) "xpO" = ( /obj/effect/decal/cleanable/dirt/dust, @@ -66516,8 +66308,9 @@ /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/security/prison) +/area/station/security/prison/work) "xrN" = ( /obj/effect/turf_decal/tile/yellow{ dir = 4 @@ -66576,9 +66369,8 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 }, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/aft) "xte" = ( /obj/effect/turf_decal/stripes/line{ @@ -66849,7 +66641,7 @@ /obj/effect/mapping_helpers/airlock/locked, /obj/effect/mapping_helpers/airlock/access/all/science/ordnance, /turf/open/floor/iron/dark/airless, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/freezerchamber) "xyp" = ( /obj/machinery/status_display/evac/directional/north, /obj/structure/cable, @@ -66980,9 +66772,7 @@ /turf/open/floor/iron, /area/station/hallway/primary/central) "xAc" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_y = -32 - }, +/obj/structure/sign/warning/vacuum/external/directional/south, /obj/effect/turf_decal/stripes/line{ dir = 4 }, @@ -67137,7 +66927,7 @@ /obj/effect/turf_decal/stripes/line, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/work) "xDa" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet, @@ -67195,8 +66985,9 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/light_switch/directional/north, +/obj/structure/cable, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/work) "xEe" = ( /obj/item/storage/box/syringes, /obj/item/storage/box/beakers{ @@ -67378,7 +67169,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "xGX" = ( /obj/effect/spawner/random/maintenance, /obj/structure/cable, @@ -67402,7 +67193,7 @@ "xHi" = ( /obj/effect/turf_decal/siding/purple, /turf/open/floor/iron/white, -/area/station/science/storage) +/area/station/science/ordnance/storage) "xIi" = ( /obj/structure/chair/office{ dir = 8 @@ -67414,7 +67205,7 @@ dir = 4 }, /turf/open/floor/iron, -/area/station/science/misc_lab) +/area/station/science/explab) "xIx" = ( /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, @@ -67553,11 +67344,6 @@ "xKK" = ( /turf/closed/wall, /area/station/science/research) -"xLq" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/warning/vacuum/external, -/turf/open/floor/plating, -/area/station/cargo/storage) "xLu" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -67661,9 +67447,7 @@ /turf/open/floor/wood, /area/station/command/heads_quarters/captain/private) "xNg" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_y = -32 - }, +/obj/structure/sign/warning/vacuum/external/directional/south, /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, /area/station/hallway/secondary/entry) @@ -67749,14 +67533,8 @@ /turf/open/floor/iron, /area/station/hallway/primary/port) "xOF" = ( -/obj/docking_port/stationary{ - dir = 8; - dwidth = 2; - height = 5; - id = "laborcamp_home"; - name = "fore bay 1"; - roundstart_template = /datum/map_template/shuttle/labour/generic; - width = 9 +/obj/docking_port/stationary/laborcamp_home{ + dir = 8 }, /turf/open/space/basic, /area/space) @@ -67795,9 +67573,8 @@ dir = 8 }, /obj/machinery/light/small/directional/north, -/obj/structure/cable, /turf/open/floor/engine, -/area/station/science/misc_lab/range) +/area/station/science/explab) "xPb" = ( /obj/structure/chair{ dir = 8 @@ -67841,9 +67618,8 @@ /turf/open/floor/iron/dark, /area/station/command/heads_quarters/rd) "xPt" = ( -/turf/open/floor/plating/airless{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating/airless, /area/station/solars/port/fore) "xPy" = ( /obj/machinery/camera/directional/north{ @@ -67977,7 +67753,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/mapping_helpers/airlock/access/all/security/brig, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/safe) "xRZ" = ( /turf/open/floor/iron, /area/station/engineering/atmos/pumproom) @@ -68100,7 +67876,7 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/doppler_array, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "xUX" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -68199,9 +67975,8 @@ "xWC" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/maintenance/port/aft) "xWE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -68302,7 +68077,7 @@ dir = 10 }, /turf/open/floor/iron/dark, -/area/station/science/mixing) +/area/station/science/ordnance) "xXG" = ( /obj/machinery/atmospherics/pipe/smart/simple/green/visible, /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5{ @@ -68397,7 +68172,7 @@ name = "Test Range Requests Console" }, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "xYQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /obj/effect/spawner/structure/window/reinforced, @@ -68569,7 +68344,7 @@ /obj/effect/turf_decal/siding/purple, /obj/machinery/firealarm/directional/south, /turf/open/floor/iron/white, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "yby" = ( /obj/item/radio/intercom/directional/east, /turf/open/floor/iron/chapel, @@ -68662,15 +68437,13 @@ "yde" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/north, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/department/engine) "ydf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/station/maintenance/port/aft) "ydj" = ( /obj/effect/decal/cleanable/dirt, @@ -68699,9 +68472,8 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/structure/sign/warning/radiation/rad_area{ - dir = 1; - pixel_y = 32 +/obj/structure/sign/warning/radiation/rad_area/directional/north{ + dir = 1 }, /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -68732,7 +68504,7 @@ /obj/machinery/plate_press, /obj/effect/turf_decal/bot, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/prison/work) "yeq" = ( /obj/machinery/conveyor{ dir = 1; @@ -68762,7 +68534,7 @@ /obj/effect/turf_decal/stripes/white/line, /obj/effect/turf_decal/box/red, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "yeS" = ( /obj/item/retractor, /obj/item/hemostat{ @@ -68904,7 +68676,7 @@ /obj/machinery/door/window/left/directional/west{ dir = 4; name = "Crate Security Door"; - req_access = list("mail_sorting") + req_access = list("shipping") }, /turf/open/floor/plating, /area/station/cargo/sorting) @@ -68916,11 +68688,11 @@ /area/station/security/prison) "yib" = ( /obj/structure/lattice/catwalk, -/obj/structure/marker_beacon/burgundy, /obj/item/toy/plush/space_lizard_plushie{ desc = "He stared into the void and listened. He didn't expect an answer..."; name = "Void-Stares-Back" }, +/obj/structure/marker_beacon/purple, /turf/open/space/basic, /area/space/nearstation) "yih" = ( @@ -68986,7 +68758,7 @@ /area/station/service/chapel/office) "yke" = ( /turf/closed/wall/r_wall, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "ykj" = ( /obj/structure/table, /obj/structure/cable, @@ -76920,7 +76692,7 @@ aaa aaa aaa aaa -quc +wEq aaa aaa fxr @@ -76935,19 +76707,19 @@ aaa aaa aaa aaa -quc +wEq aaa aaa -quc +wEq aaa aaa aaa aaa aaa -quc +wEq aaa aaa -quc +wEq aaa aaa aaa @@ -78198,7 +77970,7 @@ aaa aaa aaa aaa -quc +wEq lMJ eeg wdr @@ -78482,9 +78254,9 @@ ndI nDP qEt aox -quc +wEq aox -quc +wEq aox qEt jjS @@ -79226,7 +78998,7 @@ aaa aaa aaa aaa -quc +wEq lMJ eeg wdr @@ -80861,7 +80633,7 @@ rrt rrt rrt rrt -quc +aVA aaa aaa aaa @@ -82403,10 +82175,10 @@ tzP llk aaa anS -wDi +nRb anS lMJ -quc +aVA aaa aaa aaa @@ -82874,8 +82646,8 @@ cXW cXW fYh ruz -ftg -bmp +ejd +ejd tsP uxS fgN @@ -83305,7 +83077,7 @@ aaa aaa lMJ aaa -hgB +jIP aaa uQF aaa @@ -83388,7 +83160,7 @@ ehv nzF glh uxS -lpi +ejd uxS uxS tsP @@ -83647,7 +83419,7 @@ xsL dqN uxS uxS -lpi +ejd uxS nBy nBy @@ -83897,7 +83669,7 @@ tYi jUb gYF ruz -lpi +ejd uxS uxS shK @@ -83935,7 +83707,7 @@ aaa aaa lMJ aaa -lhA +tae aaa aaa aaa @@ -83948,7 +83720,7 @@ tPH tPH nRb lMJ -quc +aVA aaa aaa aaa @@ -84847,7 +84619,7 @@ xtw aaa fcJ aaa -sux +jIP aaa lMJ aaa @@ -85393,13 +85165,13 @@ lMJ lMJ lMJ lMJ -xLq +hxo aSZ iSE -xLq +hxo iSE deU -xLq +hxo lMJ lMJ lMJ @@ -85490,7 +85262,7 @@ anS anS anS lMJ -quc +aVA aaa aaa aaa @@ -85653,7 +85425,7 @@ aaa hxo bnA oDp -hxo +bZS xvv fyz hxo @@ -85910,7 +85682,7 @@ hxo hxo uor sxq -hxo +cbz sxq dZB hxo @@ -86690,7 +86462,7 @@ jRM uKm thQ lme -hyw +bJR fXw pCl iAd @@ -86970,7 +86742,7 @@ oyx pOa xgG vJY -qCo +vTE wev pOa uOH @@ -87032,7 +86804,7 @@ nRb tPH anS lMJ -quc +aVA aaa aaa aaa @@ -87204,7 +86976,7 @@ jRM bgx mmR wRj -hyw +bJR xgw xgw xgw @@ -87412,12 +87184,12 @@ lMJ aaa aaa aaa -suD -suD -suD -iUv -iUv -iUv +kcN +kcN +kcN +wlP +wlP +wlP aaa raz aaa @@ -87461,11 +87233,11 @@ dka bgx mmR ekY -hyw +bJR iGD kga fRQ -xgw +qGO eDi geK krf @@ -87485,7 +87257,7 @@ uOH uOH uOH uOH -oCm +tFn uOH uOH uOH @@ -87668,13 +87440,13 @@ aaa lMJ aaa aaa -suD -suD +kcN +kcN ivi gAN uTv aZw -iUv +wlP aaa raz aaa @@ -87920,18 +87692,18 @@ rrt rrt rrt rrt -ckb +kqO aaa lMJ aaa aaa -suD +kcN aAa fIT cvz tUQ ozK -iUv +wlP aaa raz raz @@ -88182,14 +87954,14 @@ aaa lMJ aaa aaa -suD +kcN pVn -iFz -iFz -tGX +uqt +uqt +lVE nLi -iUv -iUv +wlP +wlP aaa aaa aaa @@ -88247,7 +88019,7 @@ sVY cyk qzS rIa -uzs +ahD mjr jIY mjr @@ -88439,14 +88211,14 @@ aaa lMJ aaa aaa -iUv +wlP mEj vua arO oKi -nLi +abi jCg -iUv +wlP aUn aUn rrt @@ -88690,20 +88462,20 @@ aaa aaa iUv suD -iUv -iUv -iUv -iUv -iUv -iUv -iUv -qzW -qzW -qzW +muq +muq +muq +muq +muq +muq +muq +izM +izM +izM jNs kVp lAZ -suD +kcN aaa mji aaa @@ -88824,11 +88596,11 @@ lMJ aaa aaa vQg -rIG -rIG -rIG +nhM +nhM +nhM gYU -rIG +nhM gYU aaa aaa @@ -88947,7 +88719,7 @@ suD suD iUv gQT -qzW +izM rXD uis cHU @@ -88956,11 +88728,11 @@ aDO mBL cHH ecU -qzW +izM csL mMq aZw -suD +kcN aaa aUn aaa @@ -89204,7 +88976,7 @@ suD hkV tKa tGX -qzW +izM pSw qHA bEw @@ -89213,8 +88985,8 @@ qHA aSo kCp sdZ -qzW -suD +izM +kcN gvF wZz sjP @@ -89282,7 +89054,7 @@ cLx nPu mjr nxz -mjr +nwM sVY pEH vWF @@ -89461,7 +89233,7 @@ iUv hWW iFz tGX -qzW +izM drf jWS tMY @@ -89470,7 +89242,7 @@ lwa aLf npt ntz -suD +kqJ ngT kQm wZz @@ -89718,16 +89490,16 @@ cYX jmv iFz fhP -qzW -qzW -suD -qzW -qzW +izM +izM +kqJ +izM +izM oXw -aLf -npt +dur +hae dLP -qzW +izM myH kre wZz @@ -89979,12 +89751,12 @@ cYX hcw vjF kZF -qzW -qzW +izM +izM gii -qzW -qzW -qzW +izM +izM +izM myH kre wZz @@ -90238,7 +90010,7 @@ qYd lmT gtk yhO -ejR +eoa yhO yhO crl @@ -90261,7 +90033,7 @@ jXu uUu oCd pOi -oaW +eaW jXu loQ fsQ @@ -90747,14 +90519,14 @@ nCI chH tGX rDr -qzW -qzW +hdz +hdz rCB -qzW -qzW +hdz +hdz xry -qzW -qzW +ozI +ozI wZz wZz wZz @@ -91004,11 +90776,11 @@ gLb uMb qig ocG -qzW -skq +hdz +izK qNw skq -qzW +hdz xEa bYb yek @@ -91261,11 +91033,11 @@ vjZ xdA lyu rQZ -qzW +hdz ibV oeC lbe -qzW +hdz qNg xCN wNe @@ -91518,11 +91290,11 @@ iUv tlx rGb jFK -qzW +hdz fXh uMe cFq -qzW +hdz kUR pbB yek @@ -91797,9 +91569,9 @@ wZz wZz wZz sjP -suD -suD -iUv +cAo +cAo +aKH hZQ jXu jXu @@ -92056,7 +91828,7 @@ gQt eGR gQt wYH -kZF +eMP hZQ qmO fsQ @@ -92308,10 +92080,10 @@ mQr qgz nib jak -nib -nib +kYm +kYm pcW -uHV +srG srG eva hZQ @@ -92394,11 +92166,11 @@ pKP pKP bqX bqX -lrZ -lrZ -lrZ -lrZ -lrZ +rjT +rjT +rjT +rjT +rjT bqX iMr pyM @@ -92568,9 +92340,9 @@ lAM lAM lAM liQ -suD +cAo bVD -iUv +aKH hZQ hZQ hZQ @@ -92590,7 +92362,7 @@ xYW ipy ipy ipy -wuQ +sAk ipy uIP ipy @@ -93062,7 +92834,7 @@ lMJ lMJ lMJ lMJ -iUv +sjP ugy lss tdW @@ -93073,10 +92845,10 @@ tdW aSU jng wjP -suD +shU aml -iFz -iem +iPI +rwt lAM inB pVM @@ -93319,7 +93091,7 @@ aaa aaa aaa aaa -iUv +sjP abQ qqL tdW @@ -93332,8 +93104,8 @@ pUV asy ibQ sZZ -iFz -iem +iPI +rwt tjh oCR rGd @@ -93576,20 +93348,20 @@ aaa aaa aaa aaa -iUv +sjP eRL osu iHQ xRP qfg -iem +rwt qzW hIA dTh vTv -suD +shU sZZ -iFz +iPI otN tjh tjh @@ -93833,21 +93605,21 @@ aaa wQU lMJ aKY -iUv -iUv -iUv +sjP +sjP +sjP uZz uZz mYb sZZ qzW -suD -suD -suD -suD +shU +shU +shU +shU btZ -iFz -iem +iPI +rwt eOs puQ vQO @@ -94092,9 +93864,9 @@ aaa aaa aaa aaa -iUv +juM uku -iUv +juM bIC sZZ pTC @@ -94103,8 +93875,8 @@ wMl tDE wHI cQz -tGX -iem +nLu +rwt wsX xyt vQO @@ -94354,12 +94126,12 @@ igW kVL xah sZZ -iFz -iFz -iFz -iFz -iFz -iem +iPI +iPI +iPI +iPI +iPI +rwt sZZ sZZ swe @@ -94606,18 +94378,18 @@ aaa aaa aaa aaa -iUv +juM wTh -iUv +juM bNB -iem +rwt xGV -iem +rwt ikd -iem -iem -iem -iFz +rwt +rwt +rwt +iPI jdf lAM osw @@ -94860,22 +94632,22 @@ aaa aaa quc lMJ -aKY -iUv -iUv -iUv -iUv -iUv +opj +juM +juM +juM +juM +juM eui fnd qzW sHa qzW azj -iFz +iPI eCb hvK -suD +shU lAM aaa aaa @@ -94950,7 +94722,7 @@ mum qTR pWD sTQ -qGS +czL hGF inQ gtb @@ -95122,17 +94894,17 @@ aaa aaa nWF aaa -iUv -suD -suD -iUv +juM +shU +shU +juM dKn qzW qNL fFI fpw -suD -suD +shU +shU aaa aaa aaa @@ -95192,7 +94964,7 @@ aks qRI aaf aaf -oSo +pAt rTz gMi hUG @@ -95382,13 +95154,13 @@ aaa aaa aaa aaa -iUv +juM wXY -iUv -iUv -iUv -suD -suD +juM +juM +juM +shU +shU lMJ lMJ lMJ @@ -95495,7 +95267,7 @@ gUl rGK feV tSw -dfG +dax tSw irW dWd @@ -95699,14 +95471,14 @@ duI duI eal ddm -nEC +qhC gmH lSz aks qzz qRV tnm -oSo +pAt kRV eQe jOR @@ -95721,7 +95493,7 @@ aNQ nxy nxy aYJ -qGS +czL bFN opa hYA @@ -96424,9 +96196,9 @@ aaa aeq aeq eau -akE +utl alW -akE +utl alW akE wsq @@ -97248,7 +97020,7 @@ vQe kHn gUP haP -oSo +pAt rgi khr hsZ @@ -97458,9 +97230,9 @@ rfb rfb ioZ pxN -qGQ +giK nZk -uGD +jJa tjv pHb syc @@ -97762,7 +97534,7 @@ vQe qRI aaf aaf -oSo +pAt gwq cwu mYJ @@ -98224,7 +97996,7 @@ ikZ pBL iGj iGj -fSX +iGj vdi iGj ljf @@ -98486,7 +98258,7 @@ uem dOg uao lPl -wxj +mGc uRl jxV tCG @@ -98835,7 +98607,7 @@ stF hZD qhp qyX -yke +azw vfd xXz svS @@ -99107,7 +98879,7 @@ uGg dKC nRb lMJ -quc +wEq aaa aaa aaa @@ -99347,9 +99119,9 @@ sry sKm stF xyf -yke +azw xyf -yke +azw diK hsC vcK @@ -101420,7 +101192,7 @@ rQO dKC anS lMJ -quc +wEq aaa aaa aaa @@ -102384,7 +102156,7 @@ qpM bGJ sAc tju -sTH +uiK uiK loh nxH @@ -103103,7 +102875,7 @@ lMJ aaa ilh mQe -wVh +pOB cur jCj ihX @@ -103364,7 +103136,7 @@ ipG gKc cur vTf -uOe +uzB ilh son ilh @@ -103689,7 +103461,7 @@ jgK tUn dQT wXF -qSB +cit bgB lEU cit @@ -103725,7 +103497,7 @@ rMD lMJ lMJ aaa -quc +mtQ lMJ lMJ aaa @@ -103733,7 +103505,7 @@ lMJ aaa lMJ lMJ -quc +mtQ lMJ lMJ aaa @@ -103741,7 +103513,7 @@ lMJ aaa lMJ lMJ -quc +mtQ lMJ lMJ aaa @@ -103749,7 +103521,7 @@ lMJ aaa lMJ lMJ -quc +mtQ lMJ lMJ aaa @@ -103757,14 +103529,14 @@ lMJ aaa lMJ lMJ -quc +mtQ lMJ lMJ aaa lMJ aaa lMJ -quc +mtQ aaf aaf nJB @@ -104419,7 +104191,7 @@ pJE pJE nFn uUl -wLx +owU qXB wzK psZ @@ -104753,7 +104525,7 @@ qZo rMD aaa aaa -quc +mtQ lMJ lMJ aaa @@ -104761,7 +104533,7 @@ lMJ aaa lMJ lMJ -quc +mtQ lMJ lMJ aaa @@ -104769,7 +104541,7 @@ lMJ aaa lMJ lMJ -quc +mtQ lMJ lMJ aaa @@ -104777,7 +104549,7 @@ lMJ aaa lMJ lMJ -quc +mtQ lMJ lMJ aaa @@ -104785,14 +104557,14 @@ lMJ aaa lMJ lMJ -quc +mtQ lMJ lMJ aaa lMJ aaa lMJ -quc +mtQ aaf aaf nJB @@ -105447,7 +105219,7 @@ lXl nzS gdw qXB -bIB +jhc tbd kxt tCS @@ -106029,7 +105801,7 @@ hIZ qlG fPD fPD -qIr +ipq fPD nTd bLd @@ -106475,7 +106247,7 @@ rnV xyI ovZ qXB -szN +jhc qXB tDk jhS @@ -107234,7 +107006,7 @@ cgL qXB wyG edC -szN +jhc wcu eBn qXB @@ -107488,12 +107260,12 @@ qXB xnk cvF lCN -szN +jhc psZ psZ hmc -szN -szN +jhc +jhc eqt psZ psZ @@ -107721,7 +107493,7 @@ aaa aaa aaa aaa -quc +wai aaa aaa aaa @@ -107997,7 +107769,7 @@ qXB mCn eYj eax -err +ulp qXB gHE kYn @@ -108749,7 +108521,7 @@ aaa aaa aaa aaa -quc +wai aaa aaa aaa @@ -109352,9 +109124,9 @@ pnH aaa aaa aaa -quc +mtQ lMJ -quc +mtQ lMJ tOg tOg @@ -109777,7 +109549,7 @@ aaa aaa aaa aaa -quc +wai aaa aaa blx @@ -110805,7 +110577,7 @@ aaa aaa aaa aaa -quc +wai aaa aaa ffP @@ -111663,9 +111435,9 @@ eoU aaf aaa aaa -quc +mtQ aaa -quc +mtQ aaa aaa oMA @@ -111833,7 +111605,7 @@ aaa aaa aaa aaa -quc +wai aaa aaa aaa @@ -112623,7 +112395,7 @@ fHa oww xvR tCS -bIB +jhc tCS orT sph @@ -112861,7 +112633,7 @@ aaa aaa aaa aaa -quc +wai aaa aaa aaa @@ -114165,7 +113937,7 @@ aaa aaa qXB hjp -err +ulp tCS aaa aaa @@ -115465,7 +115237,7 @@ aaa aaa aaa aaa -jBX +nRb aaa aaa aaa @@ -115953,13 +115725,13 @@ oIG oIG lMJ lMJ -quc +wai aaa aaa aaa aaa aaa -quc +wai lMJ lMJ tlE @@ -115990,11 +115762,11 @@ aaa aaa aaa aaa -quc +wai aaa gFa aaa -quc +wai twf lMJ lMJ @@ -116819,7 +116591,7 @@ lKd gva iZJ rDd -cjF +jlU xiL rnE lmn @@ -117261,13 +117033,13 @@ aaa aaa aaa aaa -quc +wai lMJ -wDi +nRb ghL anS lMJ -quc +wai lMJ lMJ lMJ @@ -118293,7 +118065,7 @@ aox lMJ tPH ghL -jBX +nRb lMJ aox lMJ @@ -118321,9 +118093,9 @@ aaa aaa aaa aaa -quc +wai lMJ -jBX +nRb ghL nRb lMJ @@ -118838,7 +118610,7 @@ aaa aaa aaa lMJ -jBX +nRb lMJ aaa hdU @@ -118875,7 +118647,7 @@ jlU jlU jlU jlU -aGr +lMJ aaa aaa aaa @@ -119385,9 +119157,9 @@ lKu aaa aaa lMJ -lAu +aaa lMJ -lAu +aaa lMJ aaa aaa @@ -119898,11 +119670,11 @@ aaa aaa aaa aaa -jLw +mtQ aaa lMJ aaa -jLw +mtQ aaa aaa aaa @@ -120345,13 +120117,13 @@ aaa aaa aaa aaa -quc +wai lMJ -jBX +nRb ghL anS lMJ -quc +wai aaa aaa aaa @@ -120377,13 +120149,13 @@ aaa aaa aaa aaa -quc +wai lMJ nRb ghL -wDi +nRb lMJ -quc +wai aaa aaa aaa @@ -121119,7 +120891,7 @@ aaa aaa aaa lMJ -wDi +nRb lMJ aaa aaa @@ -121151,7 +120923,7 @@ aaa aaa aaa lMJ -wDi +nRb lMJ aaa aaa diff --git a/_maps/map_files/Mining/Lavaland.dmm b/_maps/map_files/Mining/Lavaland.dmm index ddb64a9ac87245..c83f9cafb6923c 100644 --- a/_maps/map_files/Mining/Lavaland.dmm +++ b/_maps/map_files/Mining/Lavaland.dmm @@ -646,9 +646,7 @@ "cT" = ( /obj/machinery/light/small/directional/north, /obj/structure/closet/crate/secure/loot, -/obj/structure/sign/warning/electric_shock{ - pixel_y = 32 - }, +/obj/structure/sign/warning/electric_shock/directional/north, /obj/structure/cable, /turf/open/floor/plating, /area/mine/living_quarters) @@ -2631,9 +2629,7 @@ /turf/open/floor/iron, /area/mine/living_quarters) "vs" = ( -/obj/structure/sign/warning/docking{ - pixel_x = -32 - }, +/obj/structure/sign/warning/docking/directional/west, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/mine/laborcamp) @@ -2790,9 +2786,7 @@ /turf/open/floor/iron, /area/mine/mechbay) "xX" = ( -/obj/structure/sign/departments/medbay/alt{ - pixel_x = -32 - }, +/obj/structure/sign/departments/medbay/alt/directional/west, /obj/effect/decal/cleanable/dirt, /obj/machinery/light/directional/west, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -2894,9 +2888,7 @@ /obj/effect/turf_decal/stripes/corner{ dir = 1 }, -/obj/structure/sign/warning/gas_mask{ - pixel_y = 32 - }, +/obj/structure/sign/warning/gas_mask/directional/north, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, diff --git a/_maps/map_files/debug/multiz.dmm b/_maps/map_files/debug/multiz.dmm index 8bcbaad9f0a0b9..ad9315d958e966 100644 --- a/_maps/map_files/debug/multiz.dmm +++ b/_maps/map_files/debug/multiz.dmm @@ -217,7 +217,7 @@ /turf/open/floor/iron, /area/station/engineering/gravity_generator) "bi" = ( -/obj/machinery/gravity_generator/main/station, +/obj/machinery/gravity_generator/main, /turf/open/floor/iron{ dir = 8 }, @@ -1004,6 +1004,10 @@ }, /turf/open/floor/plating, /area/station/hallway/secondary/service) +"jM" = ( +/obj/effect/landmark/blobstart, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "jV" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 6 @@ -3009,7 +3013,7 @@ eb eb bu cD -bE +jM bE Rl Ra diff --git a/_maps/map_files/debug/runtimestation.dmm b/_maps/map_files/debug/runtimestation.dmm index fb3f3bed263cb6..b7c70bec62c9b6 100644 --- a/_maps/map_files/debug/runtimestation.dmm +++ b/_maps/map_files/debug/runtimestation.dmm @@ -97,9 +97,7 @@ /area/station/engineering/gravity_generator) "au" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/warning/radiation/rad_area{ - pixel_y = 32 - }, +/obj/structure/sign/warning/radiation/rad_area/directional/north, /turf/open/floor/plating, /area/station/engineering/gravity_generator) "av" = ( @@ -1126,14 +1124,8 @@ /turf/open/floor/iron, /area/station/commons/storage/primary) "eb" = ( -/obj/docking_port/stationary{ - dir = 8; - dwidth = 2; - height = 5; - id = "laborcamp_home"; - name = "fore bay 1"; - roundstart_template = /datum/map_template/shuttle/labour/generic; - width = 9 +/obj/docking_port/stationary/laborcamp_home{ + dir = 8 }, /turf/open/space/basic, /area/space) @@ -1371,9 +1363,7 @@ /turf/open/floor/iron, /area/station/cargo/storage) "eU" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_x = 32 - }, +/obj/structure/sign/warning/vacuum/external/directional/east, /turf/open/floor/iron, /area/station/medical/medbay) "eV" = ( @@ -1999,7 +1989,7 @@ "kp" = ( /obj/structure/server, /turf/open/floor/iron/dark, -/area/station/science/misc_lab) +/area/station/science/explab) "kQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 8 @@ -2034,7 +2024,7 @@ dir = 8 }, /turf/open/floor/iron/dark, -/area/station/science/misc_lab) +/area/station/science/explab) "nq" = ( /obj/effect/turf_decal/stripes/corner{ dir = 8 @@ -2122,7 +2112,7 @@ "tV" = ( /obj/structure/bot, /turf/open/floor/iron/dark, -/area/station/science/misc_lab) +/area/station/science/explab) "uf" = ( /obj/structure/fans/tiny/invisible, /obj/effect/turf_decal/stripes/line{ @@ -2164,11 +2154,11 @@ pixel_x = 5 }, /turf/open/floor/iron/dark, -/area/station/science/misc_lab) +/area/station/science/explab) "vm" = ( /mob/living/circuit_drone, /turf/open/floor/iron/dark, -/area/station/science/misc_lab) +/area/station/science/explab) "vv" = ( /obj/machinery/door/airlock, /turf/open/floor/plating, @@ -2222,7 +2212,7 @@ /area/station/hallway/primary/central) "wU" = ( /turf/closed/wall/r_wall, -/area/station/science/misc_lab) +/area/station/science/explab) "yK" = ( /obj/structure/fans/tiny/invisible, /obj/effect/turf_decal/stripes/line{ @@ -2246,7 +2236,7 @@ pixel_y = 23 }, /turf/open/floor/iron/dark, -/area/station/science/misc_lab) +/area/station/science/explab) "AP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 8 @@ -2286,7 +2276,7 @@ "CT" = ( /obj/machinery/component_printer, /turf/open/floor/iron/dark, -/area/station/science/misc_lab) +/area/station/science/explab) "CV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/structure/cable, @@ -2298,7 +2288,7 @@ /obj/item/integrated_circuit/loaded/speech_relay, /obj/structure/rack, /turf/open/floor/iron/dark, -/area/station/science/misc_lab) +/area/station/science/explab) "DW" = ( /obj/effect/turf_decal/tile/blue{ dir = 8 @@ -2355,7 +2345,7 @@ "Ir" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/station/science/misc_lab) +/area/station/science/explab) "Iy" = ( /obj/structure/closet/secure_closet/research_director{ locked = 0 @@ -2367,7 +2357,7 @@ /turf/open/floor/iron, /area/station/command/bridge) "IE" = ( -/obj/machinery/gravity_generator/main/station, +/obj/machinery/gravity_generator/main, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/gravity_generator) @@ -2384,14 +2374,8 @@ /turf/open/floor/iron, /area/station/medical/chemistry) "Kd" = ( -/obj/docking_port/stationary{ - dir = 8; - dwidth = 3; - height = 5; - id = "mining_home"; - name = "mining shuttle bay"; - roundstart_template = /datum/map_template/shuttle/mining/box; - width = 7 +/obj/docking_port/stationary/mining_home{ + dir = 8 }, /turf/open/floor/engine, /area/station/cargo/miningoffice) @@ -2413,7 +2397,7 @@ }, /obj/machinery/door/airlock/research, /turf/open/floor/iron/dark, -/area/station/science/misc_lab) +/area/station/science/explab) "LW" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, @@ -2440,7 +2424,7 @@ "Nb" = ( /obj/machinery/bci_implanter, /turf/open/floor/iron/dark, -/area/station/science/misc_lab) +/area/station/science/explab) "Nc" = ( /obj/machinery/chem_recipe_debug, /turf/open/floor/iron, @@ -2461,7 +2445,7 @@ /obj/item/stock_parts/cell/bluespace, /obj/item/stock_parts/cell/bluespace, /turf/open/floor/iron/dark, -/area/station/science/misc_lab) +/area/station/science/explab) "OU" = ( /obj/item/disk/tech_disk/debug, /turf/open/floor/iron, @@ -2545,7 +2529,7 @@ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/science/misc_lab) +/area/station/science/explab) "Vy" = ( /obj/structure/cable, /turf/open/floor/iron, @@ -2583,7 +2567,7 @@ "WK" = ( /obj/structure/money_bot, /turf/open/floor/iron/dark, -/area/station/science/misc_lab) +/area/station/science/explab) "WT" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 @@ -2623,7 +2607,7 @@ pixel_y = 5 }, /turf/open/floor/iron/dark, -/area/station/science/misc_lab) +/area/station/science/explab) "XR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 9 @@ -2649,7 +2633,7 @@ pixel_x = 4 }, /turf/open/floor/iron/dark, -/area/station/science/misc_lab) +/area/station/science/explab) "Yy" = ( /obj/machinery/light/directional/north, /obj/machinery/rnd/production/circuit_imprinter/department, @@ -2663,7 +2647,7 @@ /area/station/engineering/atmos) "ZP" = ( /turf/open/floor/iron/dark, -/area/station/science/misc_lab) +/area/station/science/explab) (1,1,1) = {" aa diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index fae620abfcdcd7..adc17bd65e5b29 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -4099,9 +4099,16 @@ }, /area/centcom/abductor_ship) "lC" = ( -/obj/item/retractor/alien, -/obj/item/hemostat/alien, /obj/structure/table/abductor, +/obj/item/hemostat/alien{ + pixel_y = 16 + }, +/obj/item/surgicaldrill/alien{ + pixel_y = -7 + }, +/obj/item/retractor/alien{ + pixel_y = 4 + }, /turf/open/floor/plating/abductor, /area/centcom/abductor_ship) "lD" = ( @@ -4112,6 +4119,9 @@ /area/centcom/abductor_ship) "lE" = ( /obj/structure/table/optable/abductor, +/obj/item/surgical_drapes{ + pixel_y = -5 + }, /turf/open/floor/plating/abductor, /area/centcom/abductor_ship) "lF" = ( @@ -4122,7 +4132,14 @@ /area/centcom/abductor_ship) "lG" = ( /obj/structure/table/abductor, -/obj/machinery/recharger, +/obj/machinery/recharger{ + pixel_y = 0; + pixel_x = 7 + }, +/obj/item/paper/guides/antag/abductor{ + pixel_y = 0; + pixel_x = -5 + }, /turf/open/floor/plating/abductor, /area/centcom/abductor_ship) "lH" = ( @@ -4250,11 +4267,16 @@ }, /area/centcom/abductor_ship) "lY" = ( -/obj/item/surgical_drapes, -/obj/item/paper/guides/antag/abductor, -/obj/item/scalpel/alien, +/obj/item/scalpel/alien{ + pixel_y = 7 + }, /obj/structure/table/abductor, -/obj/item/cautery/alien, +/obj/item/cautery/alien{ + pixel_y = 15 + }, +/obj/item/circular_saw/alien{ + pixel_y = -2 + }, /turf/open/floor/plating/abductor, /area/centcom/abductor_ship) "lZ" = ( @@ -4377,8 +4399,14 @@ /area/centcom/abductor_ship) "mu" = ( /obj/structure/table/abductor, -/obj/item/surgicaldrill/alien, -/obj/item/circular_saw/alien, +/obj/item/toy/plush/abductor{ + pixel_y = 14; + pixel_x = -7 + }, +/obj/item/toy/plush/abductor/agent{ + pixel_y = 2; + pixel_x = 9 + }, /turf/open/floor/plating/abductor, /area/centcom/abductor_ship) "mv" = ( @@ -6658,9 +6686,7 @@ dir = 8 }, /obj/machinery/computer/security/telescreen/entertainment/directional/south, -/obj/structure/sign/warning/secure_area{ - pixel_x = 32 - }, +/obj/structure/sign/warning/secure_area/directional/east, /obj/effect/turf_decal/stripes/line{ dir = 6 }, @@ -8470,9 +8496,7 @@ /obj/structure/table/reinforced, /obj/item/storage/box/emps, /obj/item/gun/energy/ionrifle, -/obj/structure/sign/departments/medbay/alt{ - pixel_y = -32 - }, +/obj/structure/sign/departments/medbay/alt/directional/south, /obj/effect/turf_decal/stripes/line{ dir = 1 }, @@ -11455,7 +11479,7 @@ /area/centcom/syndicate_mothership/control) "Hh" = ( /obj/machinery/computer/atmos_control/noreconnect{ - atmos_chambers = list("nukiebase" = "Burn Chamber"); + atmos_chambers = list("nukiebase"="Burn Chamber"); desc = "Used to monitor the Syndicate Ordnance Laboratory's burn chamber."; dir = 1; name = "Ordnance Chamber Monitor" @@ -14208,9 +14232,7 @@ /turf/open/floor/iron, /area/centcom/central_command_areas/armory) "Pu" = ( -/obj/structure/musician/piano{ - icon_state = "piano" - }, +/obj/structure/musician/piano, /turf/open/misc/beach/sand, /area/centcom/central_command_areas/holding) "Pv" = ( @@ -19151,7 +19173,7 @@ aa aa ko kL -JF +LS lC lY ms @@ -19178,7 +19200,7 @@ aa aa ko kL -LS +JF lC lY ms @@ -19407,9 +19429,9 @@ aa aa aa kp -JA +LK li -JM +LT li mt nc @@ -19434,9 +19456,9 @@ aa aa aa kp -LK +JA li -LT +JM li mt nc @@ -19664,7 +19686,7 @@ aa aa aa kq -JB +LL li lE li @@ -19691,7 +19713,7 @@ aa aa aa kq -LL +JB li lE li @@ -19921,9 +19943,9 @@ aa aa aa kr -JC +LM li -JN +LU li mv ne @@ -19948,9 +19970,9 @@ aa aa aa kr -LM +JC li -LU +JN li mv ne diff --git a/_maps/map_files/tramstation/modular_pieces/maintenance_midladder_2.dmm b/_maps/map_files/tramstation/modular_pieces/maintenance_midladder_2.dmm index f43e477d742998..e7cc78c403c68e 100644 --- a/_maps/map_files/tramstation/modular_pieces/maintenance_midladder_2.dmm +++ b/_maps/map_files/tramstation/modular_pieces/maintenance_midladder_2.dmm @@ -127,9 +127,7 @@ /area/station/maintenance/tram/mid) "O" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/sign/warning/vacuum{ - pixel_x = 32 - }, +/obj/structure/sign/warning/vacuum/directional/east, /obj/effect/turf_decal/stripes/corner{ dir = 8 }, diff --git a/_maps/map_files/tramstation/modular_pieces/maintenance_miningsolar_cavetunnel_attachment_2.dmm b/_maps/map_files/tramstation/modular_pieces/maintenance_miningsolar_cavetunnel_attachment_2.dmm index 87c35f391178d7..b3d16b3652d2f8 100644 --- a/_maps/map_files/tramstation/modular_pieces/maintenance_miningsolar_cavetunnel_attachment_2.dmm +++ b/_maps/map_files/tramstation/modular_pieces/maintenance_miningsolar_cavetunnel_attachment_2.dmm @@ -41,6 +41,9 @@ }, /turf/open/misc/asteroid/airless, /area/mine/explored) +"v" = ( +/turf/template_noop, +/area/template_noop) "x" = ( /obj/item/relic, /turf/open/misc/asteroid/airless, @@ -80,9 +83,9 @@ c c u a -I -a -a +v +v +v "} (2,1,1) = {" a @@ -97,9 +100,9 @@ a a c a -c -a -a +v +v +v "} (3,1,1) = {" a @@ -113,10 +116,10 @@ I t a c -e -c -x a +a +a +v "} (4,1,1) = {" E @@ -130,7 +133,7 @@ a c a z -a +e c a a @@ -149,7 +152,7 @@ a a a c -c +x t "} (6,1,1) = {" diff --git a/_maps/map_files/tramstation/modular_pieces/maintenance_science_west_2.dmm b/_maps/map_files/tramstation/modular_pieces/maintenance_science_west_2.dmm index ad02bcbfea7619..870a1aeb1b53f2 100644 --- a/_maps/map_files/tramstation/modular_pieces/maintenance_science_west_2.dmm +++ b/_maps/map_files/tramstation/modular_pieces/maintenance_science_west_2.dmm @@ -15,10 +15,9 @@ /area/station/maintenance/department/medical) "d" = ( /obj/effect/turf_decal/sand/plating, -/obj/structure/sign/warning/secure_area{ +/obj/structure/sign/warning/secure_area/directional/west{ desc = "A warning sign which reads 'CAVE IN HAZARD: WEAR PROTECTIVE HEAD GEAR'."; - name = "\improper CAVE IN HAZARD sign"; - pixel_x = -32 + name = "\improper CAVE IN HAZARD sign" }, /turf/open/floor/plating, /area/station/maintenance/department/medical) @@ -75,10 +74,9 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /obj/effect/turf_decal/sand/plating, -/obj/structure/sign/warning/secure_area{ +/obj/structure/sign/warning/secure_area/directional/south{ desc = "A warning sign which reads 'CAVE IN HAZARD: WEAR PROTECTIVE HEAD GEAR'."; - name = "\improper CAVE IN HAZARD sign"; - pixel_y = -32 + name = "\improper CAVE IN HAZARD sign" }, /turf/open/floor/plating, /area/station/maintenance/department/medical) diff --git a/_maps/map_files/tramstation/modular_pieces/maintenance_science_west_attachment_3.dmm b/_maps/map_files/tramstation/modular_pieces/maintenance_science_west_attachment_3.dmm index b81214f2de33ee..89a63014ab4034 100644 --- a/_maps/map_files/tramstation/modular_pieces/maintenance_science_west_attachment_3.dmm +++ b/_maps/map_files/tramstation/modular_pieces/maintenance_science_west_attachment_3.dmm @@ -35,10 +35,9 @@ "z" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/sand/plating, -/obj/structure/sign/warning/secure_area{ +/obj/structure/sign/warning/secure_area/directional/east{ desc = "A warning sign which reads 'CAVE IN HAZARD: WEAR PROTECTIVE HEAD GEAR'."; - name = "\improper CAVE IN HAZARD sign"; - pixel_x = 32 + name = "\improper CAVE IN HAZARD sign" }, /turf/open/floor/plating, /area/station/maintenance/department/medical) diff --git a/_maps/map_files/tramstation/modular_pieces/maintenance_security_long_2.dmm b/_maps/map_files/tramstation/modular_pieces/maintenance_security_long_2.dmm index dfbeb249d4e65b..e5bd6fdf297990 100644 --- a/_maps/map_files/tramstation/modular_pieces/maintenance_security_long_2.dmm +++ b/_maps/map_files/tramstation/modular_pieces/maintenance_security_long_2.dmm @@ -73,10 +73,9 @@ pixel_x = -10; pixel_y = -10 }, -/obj/structure/sign/warning{ +/obj/structure/sign/warning/directional/east{ desc = "A warning sign to watch for loose rocks."; - name = "COLLAPSE HAZARD sign"; - pixel_x = 32 + name = "COLLAPSE HAZARD sign" }, /turf/open/floor/iron/smooth, /area/station/maintenance/department/security) @@ -99,10 +98,9 @@ pixel_x = -9; pixel_y = 8 }, -/obj/structure/sign/warning{ +/obj/structure/sign/warning/directional/north{ desc = "A warning sign to watch for loose rocks."; - name = "COLLAPSE HAZARD sign"; - pixel_y = 32 + name = "COLLAPSE HAZARD sign" }, /obj/structure/cable, /turf/open/floor/catwalk_floor, diff --git a/_maps/map_files/tramstation/modular_pieces/maintenance_storagebig_2.dmm b/_maps/map_files/tramstation/modular_pieces/maintenance_storagebig_2.dmm index 0569825fc785e4..f1f76f76753526 100644 --- a/_maps/map_files/tramstation/modular_pieces/maintenance_storagebig_2.dmm +++ b/_maps/map_files/tramstation/modular_pieces/maintenance_storagebig_2.dmm @@ -50,9 +50,7 @@ /turf/open/floor/iron/smooth, /area/station/maintenance/port/central) "q" = ( -/obj/structure/sign/warning/no_smoking{ - pixel_y = 32 - }, +/obj/structure/sign/warning/no_smoking/directional/north, /turf/template_noop, /area/template_noop) "r" = ( diff --git a/_maps/map_files/tramstation/modular_pieces/maintenance_storagemid_1.dmm b/_maps/map_files/tramstation/modular_pieces/maintenance_storagemid_1.dmm index dbbf3ccd665a7e..20c35f25e750ea 100644 --- a/_maps/map_files/tramstation/modular_pieces/maintenance_storagemid_1.dmm +++ b/_maps/map_files/tramstation/modular_pieces/maintenance_storagemid_1.dmm @@ -31,10 +31,9 @@ /area/station/maintenance/central/greater) "o" = ( /obj/effect/turf_decal/sand/plating, -/obj/structure/sign/warning{ +/obj/structure/sign/warning/directional/north{ desc = "A warning sign to watch for loose rocks."; - name = "COLLAPSE HAZARD sign"; - pixel_y = 32 + name = "COLLAPSE HAZARD sign" }, /turf/open/floor/plating, /area/station/maintenance/central/greater) diff --git a/_maps/map_files/tramstation/tramstation.dmm b/_maps/map_files/tramstation/tramstation.dmm index 50068afa164468..856bf46f8baa59 100644 --- a/_maps/map_files/tramstation/tramstation.dmm +++ b/_maps/map_files/tramstation/tramstation.dmm @@ -144,9 +144,7 @@ /obj/structure/industrial_lift/tram{ icon_state = "titanium_white" }, -/obj/machinery/door/window/right/directional/south{ - id_tag = "tramdoor" - }, +/obj/machinery/door/window/right/tram, /turf/open/openspace, /area/station/hallway/primary/tram/center) "adM" = ( @@ -613,12 +611,13 @@ }, /obj/effect/turf_decal/trimline/red/filled/line, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "ant" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ id = "robotics2"; - name = "Robotics Lab Shutters" + name = "Robotics Lab Shutters"; + dir = 1 }, /turf/open/floor/plating, /area/station/science/robotics/lab) @@ -701,7 +700,7 @@ dir = 6 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "api" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -1005,7 +1004,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/science/ordnance, /turf/open/floor/iron/dark/airless, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/freezerchamber) "azp" = ( /obj/structure/easel, /obj/item/canvas/nineteen_nineteen, @@ -1105,7 +1104,7 @@ name = "MiniSat Teleporter" }, /obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/engineering/construction, +/obj/effect/mapping_helpers/airlock/access/all/command/minisat, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat/foyer) "aCl" = ( @@ -1148,9 +1147,7 @@ /area/station/engineering/atmos/pumproom) "aDl" = ( /obj/structure/window/reinforced/spawner/east, -/obj/structure/sign/departments/medbay/alt{ - pixel_y = 32 - }, +/obj/structure/sign/departments/medbay/alt/directional/north, /obj/effect/turf_decal/trimline/red/filled/line{ dir = 5 }, @@ -1331,7 +1328,7 @@ "aHe" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/closed/wall/r_wall, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "aHf" = ( /obj/effect/turf_decal/siding/thinplating/corner{ dir = 4 @@ -1451,12 +1448,10 @@ dir = 4 }, /turf/open/floor/iron/white, -/area/station/science/mixing) +/area/station/science/ordnance) "aJM" = ( /obj/effect/turf_decal/trimline/purple/filled/line, -/obj/structure/sign/warning/biohazard{ - pixel_y = -32 - }, +/obj/structure/sign/warning/biohazard/directional/south, /turf/open/floor/iron/white, /area/station/science/research) "aKi" = ( @@ -1515,6 +1510,16 @@ }, /turf/open/floor/iron/white, /area/station/command/heads_quarters/captain/private) +"aLW" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "ordnancestorage"; + name = "Ordnance Storage Shutters"; + dir = 8 + }, +/obj/machinery/door/firedoor/heavy, +/turf/open/floor/plating, +/area/station/science/ordnance/office) "aMc" = ( /obj/structure/railing{ dir = 1 @@ -1727,9 +1732,7 @@ /obj/structure/cable/multilayer/multiz, /obj/effect/turf_decal/stripes/box, /obj/effect/decal/cleanable/dirt, -/obj/structure/sign/warning/electric_shock{ - pixel_x = -32 - }, +/obj/structure/sign/warning/electric_shock/directional/west, /turf/open/floor/plating, /area/station/hallway/primary/central) "aQw" = ( @@ -1823,7 +1826,7 @@ /area/station/cargo/storage) "aSu" = ( /turf/open/floor/iron/white, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "aSw" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/trimline/purple/filled/line{ @@ -1916,9 +1919,8 @@ dir = 4 }, /obj/effect/turf_decal/tile/neutral, -/obj/structure/sign/warning/secure_area{ - name = "HIGH SECURITY STORAGE"; - pixel_y = 32 +/obj/structure/sign/warning/secure_area/directional/north{ + name = "HIGH SECURITY STORAGE" }, /turf/open/floor/iron/dark, /area/station/ai_monitored/command/nuke_storage) @@ -2127,7 +2129,8 @@ /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ id = "cmoshutter"; - name = "CMO Office Shutters" + name = "CMO Office Shutters"; + dir = 4 }, /obj/structure/cable, /turf/open/floor/plating, @@ -2152,8 +2155,8 @@ /obj/structure/industrial_lift/tram{ icon_state = "plating" }, -/obj/structure/window/reinforced/shuttle, -/obj/structure/grille, +/obj/structure/grille/tram, +/obj/structure/window/reinforced/shuttle/tram, /turf/open/openspace, /area/station/hallway/primary/tram/center) "aZX" = ( @@ -2309,6 +2312,7 @@ /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 8 }, +/obj/effect/landmark/start/chief_medical_officer, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/cmo) "bdM" = ( @@ -2318,9 +2322,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, -/obj/structure/rack, -/obj/effect/spawner/random/clothing/costume, -/obj/item/clothing/mask/balaclava, +/obj/machinery/vending/autodrobe/all_access, /turf/open/floor/iron/cafeteria, /area/station/commons/dorms/laundry) "bdQ" = ( @@ -2336,9 +2338,7 @@ /obj/effect/turf_decal/trimline/neutral/corner{ dir = 1 }, -/obj/structure/sign/departments/security{ - pixel_x = 32 - }, +/obj/structure/sign/departments/security/directional/east, /turf/open/floor/iron, /area/station/hallway/secondary/command) "bdR" = ( @@ -2381,6 +2381,16 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/cargo/storage) +"beX" = ( +/obj/machinery/door/airlock/external{ + name = "Solar Maintenance" + }, +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/solars/port/aft) "bfr" = ( /obj/effect/turf_decal/delivery, /obj/structure/holosign/barrier/atmos/sturdy, @@ -2581,7 +2591,7 @@ dir = 5 }, /turf/open/floor/iron/white, -/area/station/science/mixing) +/area/station/science/ordnance) "biI" = ( /obj/structure/closet/toolcloset, /obj/effect/turf_decal/trimline/yellow/filled/line{ @@ -2675,7 +2685,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "bkl" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -2824,7 +2834,7 @@ dir = 8 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "bmb" = ( /obj/structure/window/reinforced, /obj/structure/table/wood, @@ -2874,9 +2884,8 @@ }, /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/event_spawn, -/turf/open/floor/wood{ - icon_state = "wood-broken5" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/commons/vacant_room/office) "bnt" = ( /obj/structure/chair/office{ @@ -3072,7 +3081,8 @@ /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ id = "pharmacy_shutters_2"; - name = "Pharmacy Shutters" + name = "Pharmacy Shutters"; + dir = 1 }, /turf/open/floor/plating, /area/station/medical/pharmacy) @@ -3518,7 +3528,7 @@ dir = 4 }, /turf/open/floor/iron, -/area/station/science/storage) +/area/station/science/ordnance/storage) "bxC" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 9 @@ -3780,7 +3790,7 @@ dir = 1 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "bBU" = ( /obj/machinery/atmospherics/pipe/smart/simple/purple/visible, /obj/machinery/meter, @@ -3790,7 +3800,7 @@ dir = 9 }, /turf/open/floor/iron, -/area/station/science/storage) +/area/station/science/ordnance/storage) "bBX" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 4 @@ -4105,7 +4115,7 @@ dir = 4; pixel_x = -12 }, -/obj/item/reagent_containers/glass/bucket, +/obj/item/reagent_containers/glass/watering_can, /turf/open/floor/iron, /area/station/security/prison/garden) "bHP" = ( @@ -4217,7 +4227,7 @@ dir = 1 }, /obj/structure/reagent_dispensers/watertank/high, -/obj/item/reagent_containers/glass/bucket, +/obj/item/reagent_containers/glass/watering_can, /turf/open/floor/iron/dark, /area/station/service/hydroponics) "bJp" = ( @@ -4315,7 +4325,7 @@ "bKN" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating/airless, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "bKU" = ( /obj/machinery/door/airlock/command/glass{ name = "Server Access" @@ -4496,7 +4506,8 @@ }, /obj/machinery/door/poddoor/shutters/preopen{ id = "AI Core shutters"; - name = "AI Core Shutters" + name = "AI Core Shutters"; + dir = 1 }, /obj/machinery/flasher/directional/west{ id = "AI" @@ -4574,7 +4585,7 @@ dir = 8 }, /turf/open/floor/iron, -/area/station/science/misc_lab) +/area/station/science/auxlab) "bOm" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/yellow/warning, @@ -4599,7 +4610,7 @@ dir = 8 }, /turf/open/floor/plating/airless, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "bOr" = ( /obj/effect/turf_decal/trimline/yellow/warning{ dir = 1 @@ -4645,7 +4656,7 @@ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/science/storage) +/area/station/science/ordnance/storage) "bOR" = ( /obj/effect/turf_decal/trimline/yellow/warning, /obj/effect/decal/cleanable/dirt, @@ -4688,9 +4699,7 @@ dir = 9 }, /obj/machinery/vending/cigarette, -/obj/structure/sign/departments/restroom{ - pixel_y = 32 - }, +/obj/structure/sign/departments/restroom/directional/north, /turf/open/floor/iron/dark, /area/station/commons/lounge) "bPo" = ( @@ -4842,7 +4851,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/science/ordnance, /turf/open/floor/engine, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "bRD" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner, /obj/structure/disposalpipe/segment{ @@ -5377,7 +5386,7 @@ dir = 8 }, /turf/open/floor/iron, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "caw" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 @@ -5434,9 +5443,7 @@ /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 4 }, -/obj/structure/sign/departments/psychology{ - pixel_x = 32 - }, +/obj/structure/sign/departments/psychology/directional/east, /turf/open/floor/iron/white, /area/station/medical/medbay/central) "cbc" = ( @@ -5841,7 +5848,7 @@ "cgk" = ( /obj/machinery/portable_atmospherics/canister, /turf/open/floor/iron/dark, -/area/station/science/storage) +/area/station/science/ordnance/storage) "cgs" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/trash/garbage{ @@ -6116,6 +6123,9 @@ name = "High-Risk Modules"; req_access = list("captain") }, +/obj/item/ai_module/reset/purge{ + pixel_y = 11 + }, /turf/open/floor/circuit/red, /area/station/ai_monitored/turret_protected/ai_upload) "ckH" = ( @@ -6232,7 +6242,7 @@ "cmH" = ( /obj/machinery/research/anomaly_refinery, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "cmM" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 8 @@ -6265,7 +6275,7 @@ dir = 4 }, /turf/open/floor/iron, -/area/station/science/storage) +/area/station/science/ordnance/storage) "cnV" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 4 @@ -6559,8 +6569,12 @@ /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 6 }, +/obj/item/computer_hardware/hard_drive/portable/scipaper_program{ + pixel_x = 4; + pixel_y = -2 + }, /turf/open/floor/iron/white, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "crr" = ( /obj/structure/table/glass, /obj/item/book/manual/wiki/cytology{ @@ -6711,7 +6725,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "ctd" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 9 @@ -6799,9 +6813,7 @@ /turf/open/floor/plating, /area/station/maintenance/tram/right) "cuQ" = ( -/obj/structure/sign/warning/vacuum{ - pixel_y = 32 - }, +/obj/structure/sign/warning/vacuum/directional/north, /obj/machinery/light/small/directional/east, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -6914,10 +6926,9 @@ name = "sorting disposal pipe (Civilan Wing)"; sortTypes = list(16,17) }, -/obj/structure/sign/warning/docking{ +/obj/structure/sign/warning/docking/directional/north{ desc = "A warning sign which reads 'KEEP CLEAR OF TRAM DOCKING AREA'."; - name = "KEEP CLEAR: TRAM DOCKING AREA sign"; - pixel_y = 32 + name = "KEEP CLEAR: TRAM DOCKING AREA sign" }, /obj/structure/cable, /turf/open/floor/iron, @@ -7427,7 +7438,7 @@ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "cDX" = ( /obj/effect/turf_decal/bot, /obj/machinery/flasher/directional/east{ @@ -7459,7 +7470,7 @@ }, /obj/effect/turf_decal/box, /turf/open/floor/iron, -/area/station/science/storage) +/area/station/science/ordnance/storage) "cEy" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 4 @@ -7590,7 +7601,7 @@ dir = 8 }, /turf/open/floor/iron/dark/airless, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/freezerchamber) "cFs" = ( /turf/open/openspace, /area/station/hallway/primary/tram/left) @@ -7603,13 +7614,13 @@ }, /obj/effect/mapping_helpers/airlock/access/all/science/ordnance, /turf/open/floor/iron/dark/airless, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/freezerchamber) "cFK" = ( /obj/structure/window/reinforced{ dir = 1 }, /turf/open/floor/iron/white, -/area/station/science/mixing) +/area/station/science/ordnance) "cFM" = ( /obj/effect/spawner/random/structure/crate, /obj/effect/decal/cleanable/dirt, @@ -7673,9 +7684,7 @@ /area/station/hallway/secondary/command) "cHk" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/sign/warning/electric_shock{ - pixel_y = 32 - }, +/obj/structure/sign/warning/electric_shock/directional/north, /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/hallway/primary/tram/left) @@ -7755,7 +7764,7 @@ "cIG" = ( /obj/structure/window/reinforced/spawner/north, /obj/structure/reagent_dispensers/watertank/high, -/obj/item/reagent_containers/glass/bucket, +/obj/item/reagent_containers/glass/watering_can, /obj/effect/turf_decal/trimline/green/filled/line{ dir = 9 }, @@ -7921,7 +7930,7 @@ "cKQ" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/white, -/area/station/science/mixing) +/area/station/science/ordnance) "cKZ" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -8288,7 +8297,7 @@ /area/station/ai_monitored/turret_protected/aisat/hallway) "cSh" = ( /turf/open/floor/iron, -/area/station/science/storage) +/area/station/science/ordnance/storage) "cSk" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -8332,9 +8341,7 @@ /turf/open/floor/iron, /area/station/cargo/miningdock/cafeteria) "cSQ" = ( -/obj/structure/sign/warning/vacuum{ - pixel_y = -32 - }, +/obj/structure/sign/warning/vacuum/directional/south, /obj/machinery/light/small/directional/west, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -8356,9 +8363,7 @@ /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 }, -/obj/structure/sign/departments/restroom{ - pixel_y = 32 - }, +/obj/structure/sign/departments/restroom/directional/north, /obj/structure/cable, /turf/open/floor/iron/white, /area/station/science/lower) @@ -8400,9 +8405,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/light/small/directional/south, -/obj/structure/sign/warning/electric_shock{ - pixel_y = -32 - }, +/obj/structure/sign/warning/electric_shock/directional/south, /obj/effect/turf_decal/stripes/line{ dir = 9 }, @@ -8427,7 +8430,7 @@ }, /obj/machinery/status_display/ai/directional/north, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "cTT" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line, @@ -8445,9 +8448,7 @@ /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/ai) "cUf" = ( -/obj/structure/sign/warning/radiation/rad_area{ - pixel_y = 32 - }, +/obj/structure/sign/warning/radiation/rad_area/directional/north, /obj/effect/turf_decal/siding/wideplating{ dir = 6 }, @@ -8481,7 +8482,7 @@ }, /obj/structure/disposalpipe/segment, /turf/open/floor/iron, -/area/station/science/storage) +/area/station/science/ordnance/storage) "cVa" = ( /obj/machinery/light/small/directional/north, /turf/open/openspace, @@ -8597,7 +8598,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, -/area/station/science/storage) +/area/station/science/ordnance/storage) "cWx" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 4 @@ -8638,7 +8639,8 @@ }, /obj/machinery/door/poddoor/shutters/preopen{ id = "rndlab1"; - name = "Research and Development Shutter" + name = "Research and Development Shutter"; + dir = 1 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -8931,7 +8933,7 @@ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "dbK" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 1 @@ -8951,7 +8953,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "dbR" = ( /obj/structure/cable, /turf/open/floor/iron/white, @@ -9040,7 +9042,7 @@ dir = 1 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "ddU" = ( /obj/effect/turf_decal/trimline/neutral/line{ dir = 1 @@ -9093,7 +9095,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /turf/open/floor/iron, -/area/station/science/misc_lab) +/area/station/science/auxlab) "dez" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -9518,9 +9520,7 @@ /turf/open/floor/iron, /area/station/security/checkpoint/medical) "dmX" = ( -/obj/structure/sign/warning/radiation/rad_area{ - pixel_y = 32 - }, +/obj/structure/sign/warning/radiation/rad_area/directional/north, /obj/effect/turf_decal/bot_white, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, @@ -10341,7 +10341,7 @@ pixel_y = 13 }, /turf/open/floor/iron, -/area/station/science/misc_lab) +/area/station/science/auxlab) "dxC" = ( /turf/closed/wall/r_wall, /area/station/command/gateway) @@ -10601,7 +10601,7 @@ dir = 1 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "dBM" = ( /obj/structure/railing/corner{ dir = 1 @@ -10865,10 +10865,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"dFS" = ( -/obj/structure/table, -/turf/open/floor/carpet, -/area/station/cargo/qm) "dFY" = ( /obj/structure/sign/poster/official/here_for_your_safety{ pixel_y = -32 @@ -11036,7 +11032,7 @@ /area/station/service/hydroponics) "dIS" = ( /turf/open/floor/engine/vacuum, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "dIY" = ( /obj/structure/window/reinforced{ dir = 4 @@ -11084,8 +11080,8 @@ /turf/open/floor/iron, /area/station/cargo/storage) "dKh" = ( -/obj/machinery/door/airlock/external{ - name = "Supply Dock Airlock" +/obj/machinery/door/airlock/external/glass{ + name = "Supply Door Airlock" }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 @@ -11556,7 +11552,7 @@ pixel_y = 5 }, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "dRB" = ( /obj/structure/table, /obj/item/restraints/handcuffs, @@ -11620,13 +11616,12 @@ /area/station/security/prison) "dSM" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible, -/obj/machinery/computer/atmos_control/noreconnect{ - atmos_chambers = list("ordnancegas1" = "Burn Chamber", "ordnancegas2" = "Freezer Chamber"); +/obj/machinery/light/directional/east, +/obj/machinery/computer/atmos_control/ordnancemix{ dir = 8 }, -/obj/machinery/light/directional/east, /turf/open/floor/iron/white, -/area/station/science/mixing) +/area/station/science/ordnance) "dSN" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 4 @@ -11762,9 +11757,7 @@ "dVi" = ( /obj/effect/turf_decal/trimline/purple/filled/line, /obj/effect/turf_decal/trimline/neutral/filled/warning, -/obj/structure/sign/departments/science{ - pixel_y = -32 - }, +/obj/structure/sign/departments/science/directional/south, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /turf/open/floor/iron, @@ -11902,7 +11895,7 @@ /obj/structure/cable, /obj/effect/mapping_helpers/airlock/access/all/science/ordnance_storage, /turf/open/floor/iron, -/area/station/science/storage) +/area/station/science/ordnance/storage) "dYD" = ( /obj/structure/table, /obj/item/clothing/gloves/boxing, @@ -12060,7 +12053,7 @@ dir = 1 }, /turf/open/floor/iron/white, -/area/station/science/mixing) +/area/station/science/ordnance) "ebw" = ( /obj/structure/bodycontainer/morgue{ dir = 1 @@ -12098,9 +12091,7 @@ /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 1 }, -/obj/structure/sign/departments/cargo{ - pixel_y = 32 - }, +/obj/structure/sign/departments/cargo/directional/north, /obj/effect/turf_decal/trimline/neutral/filled/warning{ dir = 1 }, @@ -12231,7 +12222,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "eeJ" = ( /obj/structure/window/reinforced/spawner, /turf/open/floor/iron/dark/smooth_edge, @@ -12277,7 +12268,7 @@ /obj/structure/cable, /obj/machinery/light/directional/south, /turf/open/floor/iron, -/area/station/science/storage) +/area/station/science/ordnance/storage) "efG" = ( /obj/effect/turf_decal/siding/thinplating{ dir = 8 @@ -12289,12 +12280,10 @@ /area/station/hallway/primary/tram/left) "efH" = ( /obj/item/kirbyplants/random, -/obj/structure/sign/warning/fire{ - pixel_y = 32 - }, +/obj/structure/sign/warning/fire/directional/north, /obj/machinery/light/directional/north, /turf/open/floor/iron, -/area/station/science/storage) +/area/station/science/ordnance/storage) "efK" = ( /obj/structure/lattice, /obj/effect/spawner/random/structure/grille, @@ -12663,7 +12652,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, -/area/station/science/storage) +/area/station/science/ordnance/storage) "elB" = ( /obj/effect/turf_decal/bot, /obj/structure/rack, @@ -12724,7 +12713,10 @@ id = "Sciencelockdown"; name = "Research Lockdown Blastdoor" }, -/obj/effect/mapping_helpers/airlock/access/all/science/general, +/obj/effect/mapping_helpers/airlock/access/any/engineering/tcoms, +/obj/effect/mapping_helpers/airlock/access/any/command/minisat, +/obj/effect/mapping_helpers/airlock/access/any/command/ai_upload, +/obj/effect/mapping_helpers/airlock/access/any/science/general, /turf/open/floor/iron, /area/station/science/research) "emr" = ( @@ -12825,6 +12817,9 @@ }, /obj/structure/cable, /obj/effect/mapping_helpers/airlock/access/all/security/brig, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, /turf/open/floor/plating, /area/station/maintenance/central/greater) "epu" = ( @@ -12836,7 +12831,7 @@ }, /obj/effect/turf_decal/box, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "epz" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -12871,7 +12866,7 @@ "eqk" = ( /obj/structure/tank_dispenser, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "eqq" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 @@ -12889,7 +12884,7 @@ /area/station/engineering/break_room) "eqF" = ( /turf/closed/wall/r_wall, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "eqL" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 4 @@ -12919,7 +12914,7 @@ /area/station/engineering/atmospherics_engine) "erC" = ( /turf/closed/wall/r_wall, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "erP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, @@ -12990,9 +12985,7 @@ /area/station/hallway/primary/tram/right) "esR" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/sign/warning/vacuum{ - pixel_y = -32 - }, +/obj/structure/sign/warning/vacuum/directional/south, /obj/machinery/light/small/directional/east, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -13019,9 +13012,7 @@ /area/station/science/research) "etf" = ( /obj/machinery/ntnet_relay, -/obj/structure/sign/warning/no_smoking{ - pixel_y = -32 - }, +/obj/structure/sign/warning/no_smoking/directional/south, /turf/open/floor/circuit/telecomms/mainframe, /area/station/tcommsat/server) "etm" = ( @@ -13127,7 +13118,7 @@ }, /obj/machinery/door/window/left/directional/north, /turf/open/floor/plating, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "evg" = ( /obj/effect/turf_decal/trimline/yellow/filled/corner{ dir = 1 @@ -13262,9 +13253,7 @@ /obj/effect/turf_decal/stripes/end{ dir = 1 }, -/obj/structure/sign/warning/electric_shock{ - pixel_y = -32 - }, +/obj/structure/sign/warning/electric_shock/directional/south, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/department/crew_quarters/dorms) @@ -13363,11 +13352,9 @@ /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "eAp" = ( -/obj/machinery/air_sensor{ - chamber_id = "ordnancegas1" - }, +/obj/machinery/air_sensor/ordnance_burn_chamber, /turf/open/floor/engine/vacuum, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "eAr" = ( /obj/machinery/light/directional/south, /turf/open/floor/plating, @@ -13836,7 +13823,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/science/ordnance_storage, /turf/open/floor/iron/white, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "eIX" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -14476,7 +14463,7 @@ /turf/open/floor/iron, /area/station/engineering/atmos) "eVQ" = ( -/obj/machinery/computer/camera_advanced/base_construction, +/obj/machinery/computer/camera_advanced/base_construction/aux, /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 1 }, @@ -14501,7 +14488,7 @@ dir = 9 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "eXr" = ( /obj/effect/turf_decal/trimline/blue/filled/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -14635,7 +14622,7 @@ dir = 8 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "eZT" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 8 @@ -15241,7 +15228,7 @@ "fkg" = ( /obj/structure/chair/office/light, /turf/open/floor/iron, -/area/station/science/misc_lab) +/area/station/science/auxlab) "fkh" = ( /obj/structure/sign/warning/docking, /obj/effect/spawner/structure/window/reinforced, @@ -15399,6 +15386,7 @@ /obj/effect/turf_decal/trimline/red/filled/line{ dir = 6 }, +/obj/machinery/airalarm/directional/east, /turf/open/floor/iron, /area/station/security/office) "fnO" = ( @@ -15498,9 +15486,7 @@ /turf/closed/wall/r_wall, /area/station/engineering/break_room) "foY" = ( -/obj/structure/sign/warning/vacuum{ - pixel_y = 32 - }, +/obj/structure/sign/warning/vacuum/directional/north, /obj/machinery/light/small/directional/west, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -15674,9 +15660,7 @@ /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 4 }, -/obj/structure/sign/warning/secure_area{ - pixel_x = 32 - }, +/obj/structure/sign/warning/secure_area/directional/east, /turf/open/floor/iron, /area/station/engineering/atmos) "fst" = ( @@ -15725,13 +15709,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/office) -"fsZ" = ( -/obj/machinery/vending/clothing, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) "fte" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/trimline/neutral/filled/line{ @@ -16177,7 +16154,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, -/area/station/science/storage) +/area/station/science/ordnance/storage) "fBp" = ( /obj/machinery/door/airlock{ id_tag = "private_l"; @@ -16323,6 +16300,9 @@ }, /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/airlock/access/all/security/general, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, /turf/open/floor/plating, /area/station/security/office) "fEB" = ( @@ -16378,7 +16358,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment, /obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/obj/effect/mapping_helpers/airlock/access/any/engineering/construction, +/obj/effect/mapping_helpers/airlock/access/any/engineering/general, /turf/open/floor/iron, /area/station/engineering/break_room) "fFx" = ( @@ -16722,7 +16703,7 @@ dir = 4 }, /turf/open/floor/iron, -/area/station/science/storage) +/area/station/science/ordnance/storage) "fLR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -16749,7 +16730,9 @@ dir = 1 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/computer/security/telescreen/vault{ + pixel_y = 30 + }, /turf/open/floor/iron, /area/station/cargo/qm) "fMs" = ( @@ -16914,7 +16897,7 @@ /obj/machinery/atmospherics/components/binary/tank_compressor, /obj/effect/turf_decal/delivery, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "fPu" = ( /obj/effect/turf_decal/sand/plating, /obj/structure/disposalpipe/segment{ @@ -16953,7 +16936,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, -/area/station/science/storage) +/area/station/science/ordnance/storage) "fQK" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 @@ -17061,9 +17044,7 @@ /obj/item/reagent_containers/glass/bottle/iodine{ pixel_x = 1 }, -/obj/structure/sign/warning/chem_diamond{ - pixel_y = -32 - }, +/obj/structure/sign/warning/chem_diamond/directional/south, /obj/machinery/light/small/directional/south, /turf/open/floor/iron/dark/textured_edge, /area/station/medical/medbay/central) @@ -17304,9 +17285,7 @@ /turf/open/floor/iron, /area/station/security/office) "fWX" = ( -/obj/structure/sign/departments/engineering{ - pixel_x = 32 - }, +/obj/structure/sign/departments/engineering/directional/east, /turf/open/openspace, /area/station/hallway/primary/tram/center) "fXa" = ( @@ -17320,9 +17299,7 @@ /turf/open/floor/iron, /area/station/hallway/primary/tram/right) "fXf" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_y = 32 - }, +/obj/structure/sign/warning/vacuum/external/directional/north, /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/hallway/secondary/entry) @@ -17596,7 +17573,7 @@ }, /obj/machinery/firealarm/directional/south, /turf/open/floor/iron/white, -/area/station/science/mixing) +/area/station/science/ordnance) "gbB" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 @@ -17631,7 +17608,7 @@ }, /obj/item/paper/fluff/genpop_instructions, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "gcm" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 4 @@ -17844,12 +17821,11 @@ /turf/open/floor/iron, /area/station/commons/dorms) "gge" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored{ - chamber_id = "ordnancegas1"; +/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/ordnance_burn_chamber_input{ dir = 8 }, /turf/open/floor/engine/vacuum, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "ggi" = ( /obj/structure/table/reinforced, /obj/structure/window/reinforced, @@ -18025,9 +18001,7 @@ /obj/effect/turf_decal/trimline/brown/corner{ dir = 1 }, -/obj/structure/sign/departments/cargo{ - pixel_y = 32 - }, +/obj/structure/sign/departments/cargo/directional/north, /turf/open/floor/iron, /area/station/hallway/primary/tram/right) "gjf" = ( @@ -18205,9 +18179,8 @@ /turf/open/floor/catwalk_floor, /area/station/maintenance/tram/left) "gma" = ( -/obj/structure/sign/warning/radiation/rad_area{ - dir = 1; - pixel_y = 32 +/obj/structure/sign/warning/radiation/rad_area/directional/north{ + dir = 1 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -18458,7 +18431,7 @@ }, /obj/machinery/status_display/evac/directional/south, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "gqb" = ( /obj/structure/chair/stool/bar/directional/west, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -18689,7 +18662,7 @@ /turf/open/floor/iron/stairs/medium{ dir = 1 }, -/area/station/security/prison) +/area/station/security/execution/transfer) "guY" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 4 @@ -18859,7 +18832,7 @@ /turf/open/floor/iron/dark, /area/station/hallway/secondary/exit/departure_lounge) "gys" = ( -/obj/machinery/gravity_generator/main/station, +/obj/machinery/gravity_generator/main, /obj/effect/turf_decal/bot_white, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, @@ -18950,9 +18923,7 @@ /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 8 }, -/obj/structure/sign/warning/engine_safety{ - pixel_x = -32 - }, +/obj/structure/sign/warning/engine_safety/directional/west, /turf/open/floor/iron, /area/station/engineering/break_room) "gAk" = ( @@ -19090,7 +19061,7 @@ /area/station/commons/dorms) "gBR" = ( /turf/closed/wall, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "gCc" = ( /obj/machinery/door/window/brigdoor{ dir = 4; @@ -19154,9 +19125,7 @@ "gDl" = ( /obj/machinery/power/smes/engineering, /obj/machinery/light/directional/west, -/obj/structure/sign/warning/electric_shock{ - pixel_x = -32 - }, +/obj/structure/sign/warning/electric_shock/directional/west, /obj/machinery/camera/emp_proof{ c_tag = "Engineering - SMES"; dir = 10; @@ -19194,7 +19163,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/white, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "gFb" = ( /obj/machinery/power/apc/auto_name/directional/north, /obj/effect/turf_decal/siding/thinplating/corner{ @@ -19435,9 +19404,7 @@ /area/station/hallway/primary/tram/left) "gJv" = ( /obj/structure/cable/multilayer/multiz, -/obj/structure/sign/warning/electric_shock{ - pixel_x = -32 - }, +/obj/structure/sign/warning/electric_shock/directional/west, /obj/effect/turf_decal/stripes/end{ dir = 4 }, @@ -19470,7 +19437,7 @@ dir = 8 }, /turf/open/floor/iron/dark, -/area/station/security/prison) +/area/station/security/execution/transfer) "gJR" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 4 @@ -19838,9 +19805,8 @@ /turf/open/floor/iron, /area/station/security/brig) "gPI" = ( -/turf/open/floor/wood{ - icon_state = "wood-broken7" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/commons/vacant_room/office) "gPJ" = ( /obj/structure/closet/secure_closet/brig/genpop, @@ -19856,7 +19822,7 @@ dir = 8 }, /turf/open/floor/iron/dark, -/area/station/security/prison) +/area/station/security/execution/transfer) "gPL" = ( /turf/open/floor/engine, /area/station/science/explab) @@ -20307,7 +20273,7 @@ }, /obj/machinery/meter, /turf/open/floor/iron/white, -/area/station/science/mixing) +/area/station/science/ordnance) "gWx" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -20401,9 +20367,7 @@ "gXG" = ( /obj/machinery/power/smes, /obj/effect/decal/cleanable/dirt, -/obj/structure/sign/warning/electric_shock{ - pixel_y = 32 - }, +/obj/structure/sign/warning/electric_shock/directional/north, /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/solars/port/aft) @@ -20617,7 +20581,7 @@ dir = 4 }, /turf/open/floor/iron/white, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "hbD" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -20745,9 +20709,7 @@ /area/station/security/processing) "heb" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/sign/warning/vacuum{ - pixel_y = 32 - }, +/obj/structure/sign/warning/vacuum/directional/north, /obj/machinery/light/small/directional/east, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/catwalk_floor, @@ -20790,6 +20752,11 @@ /obj/effect/landmark/start/depsec/science, /turf/open/floor/iron, /area/station/security/checkpoint/science) +"hep" = ( +/obj/structure/table, +/obj/item/clothing/mask/balaclava, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "hes" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -21136,7 +21103,7 @@ dir = 4 }, /turf/open/floor/iron/white, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "hlC" = ( /obj/effect/turf_decal/siding/thinplating, /turf/open/floor/iron, @@ -21437,7 +21404,7 @@ /obj/structure/disposalpipe/segment, /obj/structure/cable, /turf/open/floor/iron, -/area/station/science/misc_lab) +/area/station/science/auxlab) "hrR" = ( /obj/structure/table, /obj/item/reagent_containers/food/condiment/peppermill{ @@ -21496,7 +21463,7 @@ dir = 4 }, /turf/closed/wall/r_wall, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "htn" = ( /obj/effect/turf_decal/siding/thinplating{ dir = 4 @@ -21694,7 +21661,7 @@ /obj/machinery/firealarm/directional/east, /obj/machinery/light/directional/east, /turf/open/floor/iron, -/area/station/science/storage) +/area/station/science/ordnance/storage) "hxl" = ( /obj/effect/decal/cleanable/dirt, /turf/closed/wall, @@ -21715,7 +21682,7 @@ dir = 10 }, /turf/open/floor/iron, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "hyg" = ( /turf/open/floor/glass/reinforced, /area/station/hallway/primary/tram/center) @@ -21839,9 +21806,7 @@ /obj/structure/disposalpipe/trunk{ dir = 8 }, -/obj/structure/sign/warning/deathsposal{ - pixel_y = -32 - }, +/obj/structure/sign/warning/deathsposal/directional/south, /turf/open/floor/iron/white, /area/station/medical/virology) "hAR" = ( @@ -22313,7 +22278,7 @@ "hHl" = ( /obj/machinery/atmospherics/components/binary/valve/digital, /turf/open/floor/iron, -/area/station/science/storage) +/area/station/science/ordnance/storage) "hHu" = ( /obj/machinery/light/directional/west, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -22421,7 +22386,7 @@ "hJJ" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/station/science/misc_lab) +/area/station/science/auxlab) "hJW" = ( /obj/structure/window/reinforced{ dir = 8 @@ -22451,9 +22416,7 @@ /area/station/cargo/miningdock/cafeteria) "hLc" = ( /obj/structure/window/reinforced/spawner/east, -/obj/structure/sign/departments/medbay/alt{ - pixel_y = -32 - }, +/obj/structure/sign/departments/medbay/alt/directional/south, /obj/effect/turf_decal/trimline/red/filled/line{ dir = 6 }, @@ -22609,8 +22572,6 @@ /obj/structure/industrial_lift/tram{ icon_state = "plating" }, -/obj/structure/window/reinforced/shuttle, -/obj/structure/grille, /obj/effect/turf_decal/stripes{ dir = 1 }, @@ -22618,6 +22579,8 @@ /obj/effect/turf_decal/caution/stand_clear/red{ dir = 4 }, +/obj/structure/grille/tram, +/obj/structure/window/reinforced/shuttle/tram, /turf/open/floor/vault, /area/station/hallway/primary/tram/center) "hOh" = ( @@ -22698,7 +22661,7 @@ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "hQf" = ( /obj/effect/landmark/event_spawn, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -22712,6 +22675,17 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/storage/tech) +"hQn" = ( +/obj/effect/turf_decal/stripes, +/obj/effect/turf_decal/stripes{ + dir = 1 + }, +/obj/structure/industrial_lift/tram{ + icon_state = "titanium" + }, +/obj/effect/landmark/lift_id, +/turf/open/floor/vault, +/area/station/hallway/primary/tram/center) "hQU" = ( /obj/effect/turf_decal/trimline/green/filled/corner{ dir = 4 @@ -22902,13 +22876,11 @@ dir = 8 }, /turf/open/floor/iron/dark, -/area/station/security/prison) +/area/station/security/execution/transfer) "hTU" = ( /obj/effect/turf_decal/trimline/purple/filled/line, /obj/effect/turf_decal/trimline/neutral/filled/warning, -/obj/structure/sign/departments/science{ - pixel_y = -32 - }, +/obj/structure/sign/departments/science/directional/south, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, @@ -23060,7 +23032,7 @@ dir = 1 }, /turf/open/floor/iron, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "hVY" = ( /obj/machinery/computer/teleporter{ dir = 4 @@ -23129,14 +23101,8 @@ /turf/open/floor/catwalk_floor, /area/station/maintenance/tram/mid) "hWV" = ( -/obj/docking_port/stationary{ - dir = 4; - dwidth = 3; - height = 5; - id = "mining_home"; - name = "mining shuttle bay"; - roundstart_template = /datum/map_template/shuttle/mining/box; - width = 7 +/obj/docking_port/stationary/mining_home{ + dir = 4 }, /turf/open/misc/asteroid/airless, /area/mine/explored) @@ -23186,9 +23152,7 @@ dir = 8 }, /obj/machinery/smartfridge/organ, -/obj/structure/sign/warning/cold_temp{ - pixel_x = -32 - }, +/obj/structure/sign/warning/cold_temp/directional/west, /obj/machinery/light/directional/west, /turf/open/floor/iron/freezer, /area/station/medical/coldroom) @@ -23347,9 +23311,8 @@ /obj/effect/turf_decal/siding/wood{ dir = 8 }, -/turf/open/floor/wood{ - icon_state = "wood-broken" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/station/commons/vacant_room/office) "ial" = ( /turf/open/floor/iron, @@ -23383,9 +23346,7 @@ "iaJ" = ( /obj/machinery/power/smes/engineering, /obj/structure/cable, -/obj/structure/sign/warning/electric_shock{ - pixel_y = 32 - }, +/obj/structure/sign/warning/electric_shock/directional/north, /obj/effect/decal/cleanable/dirt, /turf/open/floor/catwalk_floor, /area/station/maintenance/central/greater) @@ -23472,7 +23433,7 @@ name = "BOMB RANGE" }, /turf/closed/wall, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "icx" = ( /turf/open/floor/circuit/green, /area/station/science/robotics/mechbay) @@ -23567,7 +23528,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/security/prison) +/area/station/security/execution/transfer) "iev" = ( /obj/structure/training_machine, /obj/item/target, @@ -23601,7 +23562,7 @@ /area/station/hallway/secondary/entry) "ieK" = ( /turf/open/floor/iron/white, -/area/station/science/mixing) +/area/station/science/ordnance) "ieS" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 @@ -23876,14 +23837,7 @@ /turf/open/floor/iron, /area/station/construction/mining/aux_base) "iia" = ( -/obj/docking_port/stationary{ - dwidth = 2; - height = 5; - id = "laborcamp_home"; - name = "fore bay 1"; - roundstart_template = /datum/map_template/shuttle/labour/generic; - width = 9 - }, +/obj/docking_port/stationary/laborcamp_home, /turf/open/misc/asteroid/airless, /area/mine/explored) "iib" = ( @@ -24157,7 +24111,7 @@ dir = 6 }, /turf/open/floor/iron/white, -/area/station/science/mixing) +/area/station/science/ordnance) "ion" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/closed/wall/r_wall, @@ -24227,7 +24181,7 @@ /obj/structure/cable, /obj/item/radio/intercom/directional/west, /turf/open/floor/iron/white, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "ipe" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, /turf/open/floor/iron, @@ -24317,10 +24271,9 @@ /area/station/science/xenobiology) "iqZ" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/warning/secure_area{ +/obj/structure/sign/warning/secure_area/directional/south{ desc = "A warning sign which reads 'SERVER ROOM'."; - name = "SERVER ROOM"; - pixel_y = -32 + name = "SERVER ROOM" }, /turf/open/floor/plating, /area/station/science/server) @@ -24958,7 +24911,7 @@ "iAU" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/white, -/area/station/science/mixing) +/area/station/science/ordnance) "iBm" = ( /obj/machinery/light/directional/west, /obj/structure/bed{ @@ -25146,6 +25099,12 @@ /obj/effect/landmark/start/assistant, /turf/open/floor/iron/cafeteria, /area/station/commons/dorms/laundry) +"iEY" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/security/execution/transfer) "iFO" = ( /obj/structure/railing/corner{ dir = 1 @@ -25252,11 +25211,11 @@ /obj/structure/industrial_lift/tram{ icon_state = "plating" }, -/obj/structure/window/reinforced/shuttle, -/obj/structure/grille, /obj/structure/fluff/tram_rail{ dir = 1 }, +/obj/structure/grille/tram, +/obj/structure/window/reinforced/shuttle/tram, /turf/open/openspace, /area/station/hallway/primary/tram/center) "iHr" = ( @@ -25604,9 +25563,7 @@ dir = 1 }, /obj/structure/cable, -/obj/structure/sign/warning/secure_area{ - pixel_x = 32 - }, +/obj/structure/sign/warning/secure_area/directional/east, /turf/open/floor/iron/white, /area/station/science/lower) "iPs" = ( @@ -25629,13 +25586,13 @@ /turf/open/floor/iron, /area/station/engineering/atmos) "iPD" = ( -/obj/machinery/modular_computer/console/preset/civilian{ - dir = 4 - }, /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 8 }, /obj/item/radio/intercom/directional/west, +/obj/machinery/modular_computer/console/preset/id{ + dir = 4 + }, /turf/open/floor/iron, /area/station/cargo/qm) "iPQ" = ( @@ -25692,7 +25649,7 @@ dir = 4 }, /turf/open/floor/iron/white, -/area/station/science/mixing) +/area/station/science/ordnance) "iQU" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 8 @@ -25712,9 +25669,7 @@ "iRs" = ( /obj/effect/turf_decal/trimline/neutral/filled/line, /obj/structure/cable, -/obj/structure/sign/departments/holy{ - pixel_y = -32 - }, +/obj/structure/sign/departments/holy/directional/south, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment{ @@ -25999,7 +25954,7 @@ /area/station/engineering/supermatter) "iUz" = ( /turf/open/floor/plating, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "iUE" = ( /obj/machinery/door/airlock/security/glass{ id_tag = "prisondorm"; @@ -26163,7 +26118,7 @@ dir = 10 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "iWY" = ( /obj/structure/railing, /obj/structure/chair/sofa/right{ @@ -26276,7 +26231,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/iron/dark, -/area/station/security/prison) +/area/station/security/execution/transfer) "iYm" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -26375,7 +26330,7 @@ dir = 8 }, /turf/open/floor/iron, -/area/station/science/misc_lab) +/area/station/science/auxlab) "jap" = ( /obj/structure/chair{ dir = 8 @@ -26408,7 +26363,7 @@ }, /obj/machinery/meter, /turf/open/floor/iron, -/area/station/science/storage) +/area/station/science/ordnance/storage) "jaH" = ( /obj/structure/cable, /turf/open/floor/iron/showroomfloor, @@ -26625,6 +26580,13 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/secondary/exit) +"jfY" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/effect/landmark/start/psychologist, +/turf/open/floor/wood/parquet, +/area/station/medical/psychology) "jgm" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 6 @@ -26772,7 +26734,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "jje" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 6 @@ -26786,7 +26748,7 @@ "jjm" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "jjn" = ( /obj/machinery/power/apc/auto_name/directional/west, /obj/machinery/disposal/bin, @@ -27031,7 +26993,7 @@ dir = 1 }, /turf/open/floor/engine, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "jnO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/landmark/event_spawn, @@ -27128,7 +27090,7 @@ icon_state = "plating" }, /obj/structure/tramwall/titanium, -/obj/structure/shuttle/engine/propulsion/in_wall{ +/obj/structure/shuttle/engine/propulsion/in_wall/tram{ dir = 4; pixel_x = 32 }, @@ -27377,7 +27339,11 @@ dir = 4 }, /turf/open/floor/iron/white, -/area/station/science/mixing) +/area/station/science/ordnance) +"jtL" = ( +/obj/machinery/pdapainter/supply, +/turf/open/floor/carpet, +/area/station/cargo/qm) "jtN" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -27396,7 +27362,7 @@ dir = 1 }, /turf/open/floor/plating/airless, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "jtW" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 1 @@ -27629,7 +27595,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/engineering/tcoms, +/obj/effect/mapping_helpers/airlock/access/any/command/ai_upload, +/obj/effect/mapping_helpers/airlock/access/any/engineering/tcoms, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) "jxF" = ( @@ -28049,7 +28016,8 @@ /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ id = "cytologylockdown"; - name = "Cytology Lockdown" + name = "Cytology Lockdown"; + dir = 8 }, /turf/open/floor/plating, /area/station/science/cytology) @@ -28077,7 +28045,14 @@ "jFi" = ( /obj/machinery/portable_atmospherics/scrubber, /turf/open/floor/iron/dark, -/area/station/science/storage) +/area/station/science/ordnance/storage) +"jFj" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 4 + }, +/obj/machinery/keycard_auth/directional/east, +/turf/open/floor/iron, +/area/station/cargo/qm) "jFx" = ( /obj/structure/lattice, /obj/effect/spawner/random/structure/grille, @@ -28196,7 +28171,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/door/firedoor, /obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/engineering/tcoms, +/obj/effect/mapping_helpers/airlock/access/any/engineering/tcoms, +/obj/effect/mapping_helpers/airlock/access/any/command/ai_upload, /turf/open/floor/iron/grimy, /area/station/ai_monitored/turret_protected/aisat/foyer) "jHw" = ( @@ -28296,9 +28272,7 @@ /obj/effect/turf_decal/stripes/end{ dir = 4 }, -/obj/structure/sign/warning/electric_shock{ - pixel_x = -32 - }, +/obj/structure/sign/warning/electric_shock/directional/west, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/hallway/primary/tram/right) @@ -28490,7 +28464,7 @@ dir = 5 }, /turf/open/floor/iron, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "jMn" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 8 @@ -28530,7 +28504,7 @@ /area/station/command/heads_quarters/hop) "jMB" = ( /turf/open/floor/plating/airless, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "jMD" = ( /obj/structure/table/glass, /turf/open/floor/iron/cafeteria{ @@ -28558,14 +28532,14 @@ "jMR" = ( /obj/machinery/portable_atmospherics/canister/oxygen, /turf/open/floor/iron, -/area/station/science/storage) +/area/station/science/ordnance/storage) "jMS" = ( /obj/effect/turf_decal/trimline/purple/filled/line, /obj/machinery/modular_computer/console/preset/civilian{ dir = 1 }, /turf/open/floor/iron/white, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "jMX" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -28801,7 +28775,8 @@ "jRl" = ( /obj/machinery/door/poddoor/shutters{ id = "teledoor"; - name = "MiniSat Teleport Access" + name = "MiniSat Teleport Access"; + dir = 4 }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat/foyer) @@ -28861,9 +28836,7 @@ /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 5 }, -/obj/structure/sign/warning/rad_shelter{ - pixel_y = 32 - }, +/obj/structure/sign/warning/rad_shelter/directional/north, /turf/open/floor/iron, /area/station/hallway/secondary/exit) "jSi" = ( @@ -28911,7 +28884,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "jTj" = ( /obj/machinery/atmospherics/pipe/multiz/supply/visible/layer4{ dir = 1 @@ -28978,7 +28951,7 @@ }, /obj/effect/turf_decal/delivery, /turf/open/floor/iron, -/area/station/science/storage) +/area/station/science/ordnance/storage) "jUh" = ( /obj/machinery/door/airlock/atmos{ name = "Atmospherics" @@ -29231,16 +29204,17 @@ dir = 9 }, /turf/open/floor/plating/airless, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "jYd" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ id = "ordnancestorage"; - name = "Ordnance Storage Shutters" + name = "Ordnance Storage Shutters"; + dir = 1 }, /obj/machinery/door/firedoor/heavy, /turf/open/floor/plating, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "jYf" = ( /obj/structure/chair/office{ dir = 8 @@ -29661,7 +29635,7 @@ /obj/machinery/door/airlock/external, /obj/effect/mapping_helpers/airlock/cyclelink_helper, /turf/open/floor/plating/airless, -/area/mine/explored) +/area/station/engineering/supermatter/room) "kfZ" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/trash/food_packaging, @@ -30623,7 +30597,7 @@ name = "MiniSat Recharge Bay" }, /obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/engineering/construction, +/obj/effect/mapping_helpers/airlock/access/all/command/minisat, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat/foyer) "ktX" = ( @@ -30649,9 +30623,7 @@ dir = 8 }, /obj/machinery/light/directional/west, -/obj/structure/sign/warning/secure_area{ - pixel_x = -32 - }, +/obj/structure/sign/warning/secure_area/directional/west, /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/security/office) @@ -30818,7 +30790,7 @@ }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/white, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "kwN" = ( /obj/machinery/computer/holodeck{ dir = 4 @@ -31059,7 +31031,7 @@ dir = 9 }, /turf/open/floor/plating/airless, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "kBE" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 8 @@ -31136,19 +31108,6 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/iron, /area/station/security/checkpoint/engineering) -"kCL" = ( -/obj/machinery/door/airlock/mining/glass{ - name = "Quartermaster" - }, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/access/all/supply/qm, -/turf/open/floor/iron, -/area/station/cargo/qm) "kCN" = ( /obj/structure/rack, /obj/effect/spawner/random/techstorage/command_all, @@ -31279,7 +31238,7 @@ "kEL" = ( /obj/machinery/igniter/incinerator_ordmix, /turf/open/floor/engine/vacuum, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "kES" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 4 @@ -31763,7 +31722,7 @@ icon_state = "plating" }, /obj/structure/tramwall/titanium, -/obj/structure/shuttle/engine/propulsion/in_wall{ +/obj/structure/shuttle/engine/propulsion/in_wall/tram{ dir = 8; pixel_x = -32 }, @@ -32023,7 +31982,7 @@ dir = 1 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "kSH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible, /turf/open/floor/iron, @@ -32050,9 +32009,7 @@ /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 }, -/obj/structure/sign/warning/secure_area{ - pixel_y = 32 - }, +/obj/structure/sign/warning/secure_area/directional/north, /obj/machinery/camera{ c_tag = "Science - Cytology Lab"; dir = 9; @@ -32148,7 +32105,7 @@ dir = 1 }, /turf/open/floor/plating/airless, -/area/mine/explored) +/area/station/engineering/supermatter/room) "kUo" = ( /turf/open/floor/iron/dark, /area/station/service/chapel) @@ -32160,9 +32117,7 @@ /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 }, -/obj/structure/sign/warning/electric_shock{ - pixel_x = -32 - }, +/obj/structure/sign/warning/electric_shock/directional/west, /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/science/xenobiology) @@ -32271,7 +32226,7 @@ /obj/machinery/door/firedoor/heavy, /obj/effect/mapping_helpers/airlock/access/all/science/ordnance_storage, /turf/open/floor/iron/white, -/area/station/science/storage) +/area/station/science/ordnance) "kVV" = ( /turf/open/floor/carpet, /area/station/command/bridge) @@ -32360,7 +32315,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "kWN" = ( /obj/structure/table, /turf/open/floor/iron/dark, @@ -32437,7 +32392,7 @@ desc = "A wall impregnated with Fixium, able to withstand massive explosions with ease"; name = "hyper-reinforced wall" }, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "kXI" = ( /obj/structure/closet/crate, /obj/item/crowbar, @@ -32495,7 +32450,7 @@ dir = 8 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "kYy" = ( /obj/structure/chair/office{ dir = 4 @@ -32556,7 +32511,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/science/ordnance, /turf/open/floor/iron/white, -/area/station/science/mixing/launch) +/area/station/science/ordnance) "kZr" = ( /obj/structure/rack, /obj/effect/spawner/random/maintenance/three, @@ -32606,7 +32561,7 @@ dir = 1 }, /turf/open/floor/plating/airless, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "lal" = ( /obj/structure/lattice/catwalk, /obj/structure/cable, @@ -32649,9 +32604,7 @@ /area/station/commons/fitness/recreation) "lbg" = ( /obj/structure/cable/multilayer/multiz, -/obj/structure/sign/warning/electric_shock{ - pixel_x = -32 - }, +/obj/structure/sign/warning/electric_shock/directional/west, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -32715,7 +32668,7 @@ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/security/prison) +/area/station/security/execution/transfer) "lcn" = ( /obj/structure/table, /obj/effect/turf_decal/trimline/red/filled/line, @@ -33019,7 +32972,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, -/area/station/science/storage) +/area/station/science/ordnance/storage) "lhw" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner, /obj/effect/turf_decal/trimline/neutral/filled/corner{ @@ -33259,7 +33212,7 @@ }, /obj/structure/disposalpipe/segment, /turf/open/floor/iron, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "llU" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 1 @@ -33554,7 +33507,7 @@ }, /obj/effect/turf_decal/delivery, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "lrB" = ( /obj/structure/table, /obj/item/book/manual/wiki/engineering_hacking{ @@ -33575,9 +33528,7 @@ "lrD" = ( /obj/effect/turf_decal/sand/plating, /obj/effect/decal/cleanable/cobweb, -/obj/structure/sign/warning/vacuum{ - pixel_x = -32 - }, +/obj/structure/sign/warning/vacuum/directional/west, /turf/open/floor/plating, /area/station/maintenance/central/greater) "lrG" = ( @@ -33765,7 +33716,7 @@ /obj/machinery/portable_atmospherics/canister/oxygen, /obj/machinery/light_switch/directional/south, /turf/open/floor/iron, -/area/station/science/storage) +/area/station/science/ordnance/storage) "luy" = ( /obj/machinery/newscaster/directional/west, /turf/open/floor/iron/dark, @@ -33782,7 +33733,8 @@ /obj/machinery/door/firedoor, /obj/machinery/door/poddoor/shutters/preopen{ id = "kitchencounter"; - name = "Kitchen Counter Shutters" + name = "Kitchen Counter Shutters"; + dir = 4 }, /obj/machinery/door/window/left/directional/west{ name = "Pick Up Window"; @@ -33864,6 +33816,11 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/dark, /area/station/medical/medbay/lobby) +"lwe" = ( +/obj/structure/chair/stool/bar/directional/west, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/security/prison) "lwj" = ( /obj/structure/cable, /turf/open/floor/engine/hull/reinforced, @@ -34060,7 +34017,7 @@ dir = 10 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "lyq" = ( /obj/structure/displaycase/labcage, /obj/machinery/light/directional/south, @@ -34077,7 +34034,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold/purple/visible, /obj/machinery/meter, /turf/open/floor/iron/white, -/area/station/science/mixing) +/area/station/science/ordnance) "lyD" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/neutral/filled/corner, @@ -34183,9 +34140,7 @@ /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 9 }, -/obj/structure/sign/departments/cargo{ - pixel_x = -32 - }, +/obj/structure/sign/departments/cargo/directional/west, /turf/open/floor/iron/white, /area/station/science/research) "lAA" = ( @@ -34556,9 +34511,7 @@ /area/station/service/chapel) "lHD" = ( /obj/machinery/power/smes, -/obj/structure/sign/warning/electric_shock{ - pixel_x = -32 - }, +/obj/structure/sign/warning/electric_shock/directional/west, /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/solars/starboard) @@ -34610,9 +34563,7 @@ /turf/open/floor/catwalk_floor, /area/station/maintenance/starboard/lesser) "lJu" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_x = -32 - }, +/obj/structure/sign/warning/vacuum/external/directional/west, /obj/effect/turf_decal/trimline/red/filled/line{ dir = 9 }, @@ -34725,9 +34676,7 @@ /obj/structure/industrial_lift/tram{ icon_state = "titanium_white" }, -/obj/machinery/door/window/left/directional/south{ - id_tag = "tramdoor" - }, +/obj/machinery/door/window/left/tram, /turf/open/openspace, /area/station/hallway/primary/tram/center) "lKo" = ( @@ -34754,7 +34703,8 @@ }, /obj/machinery/door/firedoor, /obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/engineering/construction, +/obj/effect/mapping_helpers/airlock/access/any/command/minisat, +/obj/effect/mapping_helpers/airlock/access/any/engineering/tcoms, /turf/open/floor/iron, /area/station/engineering/transit_tube) "lLd" = ( @@ -34994,9 +34944,7 @@ /obj/structure/railing{ dir = 4 }, -/obj/structure/sign/warning/biohazard{ - pixel_x = -32 - }, +/obj/structure/sign/warning/biohazard/directional/west, /obj/structure/window/reinforced/spawner, /turf/open/floor/catwalk_floor, /area/station/command/gateway) @@ -35200,7 +35148,7 @@ "lSc" = ( /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, /turf/open/floor/iron, -/area/station/science/storage) +/area/station/science/ordnance/storage) "lSe" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, @@ -35327,6 +35275,9 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/tram/right) +"lVa" = ( +/turf/closed/wall/r_wall, +/area/station/science/ordnance/freezerchamber) "lVg" = ( /obj/machinery/door/airlock{ name = "Law Office" @@ -35342,9 +35293,7 @@ /turf/open/floor/wood, /area/station/service/lawoffice) "lVA" = ( -/obj/structure/sign/warning/vacuum{ - pixel_y = 32 - }, +/obj/structure/sign/warning/vacuum/directional/north, /obj/machinery/light/small/directional/west, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -35920,6 +35869,15 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/tram/mid) +"mhc" = ( +/obj/structure/cable, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/security/execution/transfer) "mhr" = ( /obj/effect/turf_decal/trimline/yellow/warning{ dir = 4 @@ -36300,7 +36258,8 @@ "mmR" = ( /obj/machinery/door/poddoor/shutters{ id = "mechbay"; - name = "Mech Bay" + name = "Mech Bay"; + dir = 4 }, /turf/open/floor/plating, /area/station/science/robotics/mechbay) @@ -36400,7 +36359,8 @@ }, /obj/effect/turf_decal/sand/plating, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/access/all/engineering/construction, +/obj/effect/mapping_helpers/airlock/access/any/command/minisat, +/obj/effect/mapping_helpers/airlock/access/any/engineering/tcoms, /turf/open/floor/plating, /area/station/engineering/transit_tube) "moP" = ( @@ -36490,7 +36450,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/security/brig, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "mpQ" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -36535,7 +36495,7 @@ dir = 9 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "mqP" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 9 @@ -36584,7 +36544,7 @@ /obj/machinery/firealarm/directional/west, /obj/structure/cable, /turf/open/floor/iron, -/area/station/science/misc_lab) +/area/station/science/auxlab) "mrm" = ( /obj/structure/table/wood, /obj/item/radio/intercom, @@ -36654,7 +36614,7 @@ /area/station/engineering/main) "msn" = ( /turf/closed/wall, -/area/station/science/misc_lab) +/area/station/science/auxlab) "msx" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -36677,9 +36637,7 @@ /obj/structure/disposalpipe/trunk{ dir = 1 }, -/obj/structure/sign/warning/deathsposal{ - pixel_y = -32 - }, +/obj/structure/sign/warning/deathsposal/directional/south, /obj/effect/turf_decal/bot, /turf/open/floor/iron/dark, /area/station/medical/virology) @@ -36779,7 +36737,7 @@ dir = 4 }, /turf/open/floor/iron/white, -/area/station/science/mixing) +/area/station/science/ordnance) "mve" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -37028,7 +36986,7 @@ dir = 1; icon_state = "right"; name = "Incoming Mail"; - req_access = list("mail_sorting") + req_access = list("shipping") }, /turf/open/floor/plating, /area/station/cargo/sorting) @@ -37084,8 +37042,14 @@ /area/station/ai_monitored/security/armory) "mzJ" = ( /obj/structure/table, -/obj/item/ai_module/reset, /obj/machinery/airalarm/directional/north, +/obj/item/ai_module/reset{ + pixel_y = 8; + pixel_x = 2 + }, +/obj/item/ai_module/supplied/freeform{ + pixel_x = -1 + }, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/ai_upload) "mzQ" = ( @@ -37203,7 +37167,7 @@ pixel_y = 24 }, /turf/open/floor/iron/white, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/freezerchamber) "mAW" = ( /obj/structure/table/wood, /obj/item/folder/yellow, @@ -37348,7 +37312,7 @@ network = list("ss13","Security","prison") }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "mDg" = ( /obj/effect/turf_decal/trimline/neutral/filled/line, /obj/structure/sign/gym/mirrored/right{ @@ -37492,9 +37456,7 @@ "mFb" = ( /obj/structure/cable/multilayer/multiz, /obj/effect/decal/cleanable/dirt, -/obj/structure/sign/warning/electric_shock{ - pixel_y = -32 - }, +/obj/structure/sign/warning/electric_shock/directional/south, /obj/effect/turf_decal/stripes/end{ dir = 1 }, @@ -37670,7 +37632,7 @@ dir = 4 }, /turf/open/floor/iron/white, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "mHg" = ( /obj/effect/turf_decal/sand, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -38984,9 +38946,6 @@ name = "Holodeck Projector Floor" }, /area/station/holodeck/rec_center) -"ndi" = ( -/turf/closed/wall, -/area/station/maintenance/central) "ndn" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/components/binary/pump/on{ @@ -39681,7 +39640,7 @@ pixel_y = 24 }, /turf/open/floor/iron/white, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "npf" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ @@ -39754,6 +39713,7 @@ dir = 10 }, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/landmark/start/hangover/closet, /turf/open/floor/iron/dark, /area/station/hallway/secondary/exit) "nqu" = ( @@ -39822,9 +39782,12 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ cycle_id = "sci-entrance-right" }, -/obj/effect/mapping_helpers/airlock/access/all/science/general, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/access/any/engineering/tcoms, +/obj/effect/mapping_helpers/airlock/access/any/command/minisat, +/obj/effect/mapping_helpers/airlock/access/any/command/ai_upload, +/obj/effect/mapping_helpers/airlock/access/any/science/general, /turf/open/floor/iron, /area/station/science/research) "nrE" = ( @@ -39833,7 +39796,7 @@ dir = 8 }, /turf/open/floor/iron, -/area/station/science/misc_lab) +/area/station/science/auxlab) "nrF" = ( /obj/machinery/atmospherics/components/binary/pump/on{ dir = 1; @@ -39915,7 +39878,7 @@ /obj/machinery/door/poddoor/massdriver_ordnance, /obj/structure/fans/tiny, /turf/open/floor/plating, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "nuc" = ( /obj/structure/table/wood, /obj/structure/window/reinforced{ @@ -39959,7 +39922,7 @@ }, /obj/effect/turf_decal/box, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "nvg" = ( /obj/structure/bodycontainer/morgue{ dir = 1 @@ -40175,7 +40138,7 @@ /obj/structure/disposalpipe/segment, /obj/effect/mapping_helpers/airlock/access/all/science/ordnance_storage, /turf/open/floor/iron/white, -/area/station/science/storage) +/area/station/science/ordnance) "nyi" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 8 @@ -40260,7 +40223,7 @@ network = list("ss13","Security","prison") }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "nza" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -40353,7 +40316,8 @@ /obj/machinery/door/firedoor, /obj/machinery/door/poddoor/shutters/preopen{ id = "kitchencounter"; - name = "Kitchen Counter Shutters" + name = "Kitchen Counter Shutters"; + dir = 8 }, /obj/machinery/door/window/right/directional/east{ name = "Pick Up Window"; @@ -40565,9 +40529,8 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/structure/sign/warning/secure_area{ - name = "HIGH SECURITY STORAGE"; - pixel_y = 32 +/obj/structure/sign/warning/secure_area/directional/north{ + name = "HIGH SECURITY STORAGE" }, /turf/open/floor/iron/dark, /area/station/ai_monitored/command/nuke_storage) @@ -40577,9 +40540,7 @@ }, /obj/effect/turf_decal/bot, /obj/machinery/light/small/directional/west, -/obj/structure/sign/warning/vacuum/external{ - pixel_y = 32 - }, +/obj/structure/sign/warning/vacuum/external/directional/north, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat/foyer) "nFL" = ( @@ -40968,7 +40929,7 @@ }, /obj/effect/turf_decal/stripes, /turf/open/floor/iron, -/area/station/science/storage) +/area/station/science/ordnance/storage) "nOC" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -41000,7 +40961,7 @@ dir = 4 }, /turf/open/floor/iron/white, -/area/station/science/mixing) +/area/station/science/ordnance) "nPs" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -41046,7 +41007,7 @@ /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, /turf/open/floor/iron, -/area/station/science/misc_lab) +/area/station/science/auxlab) "nQr" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 8 @@ -41453,7 +41414,7 @@ /obj/machinery/light_switch/directional/west, /obj/structure/cable, /turf/open/floor/iron, -/area/station/science/misc_lab) +/area/station/science/auxlab) "nXp" = ( /obj/structure/floodlight_frame, /turf/open/misc/asteroid, @@ -41732,9 +41693,7 @@ /area/station/medical/medbay/lobby) "ocK" = ( /obj/effect/turf_decal/trimline/yellow/filled/line, -/obj/structure/sign/warning/secure_area{ - pixel_y = -32 - }, +/obj/structure/sign/warning/secure_area/directional/south, /turf/open/floor/iron, /area/station/tcommsat/computer) "odl" = ( @@ -41931,6 +41890,14 @@ /obj/structure/table/wood, /turf/open/floor/wood/tile, /area/station/service/chapel) +"ogQ" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/north, +/turf/open/floor/iron, +/area/station/security/prison) "ogR" = ( /obj/effect/turf_decal/siding/wood, /obj/structure/window/reinforced/spawner, @@ -41996,7 +41963,7 @@ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/security/prison) +/area/station/security/execution/transfer) "ohH" = ( /obj/machinery/camera{ c_tag = "Science - Experimentor Lab Testing Range"; @@ -42018,7 +41985,7 @@ /obj/machinery/holopad, /obj/effect/turf_decal/bot, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "oig" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 8 @@ -42095,9 +42062,7 @@ /area/station/maintenance/port/fore) "oiQ" = ( /obj/structure/cable/multilayer/multiz, -/obj/structure/sign/warning/electric_shock{ - pixel_x = 32 - }, +/obj/structure/sign/warning/electric_shock/directional/east, /obj/effect/turf_decal/stripes/end{ dir = 8 }, @@ -42248,6 +42213,11 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron/smooth, /area/station/maintenance/tram/right) +"omk" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/lattice/catwalk, +/turf/open/floor/plating, +/area/station/maintenance/tram/mid) "omm" = ( /turf/closed/wall, /area/station/maintenance/department/security) @@ -42302,7 +42272,7 @@ /obj/machinery/atmospherics/pipe/smart/simple/purple/visible, /obj/structure/disposalpipe/segment, /turf/open/floor/iron, -/area/station/science/storage) +/area/station/science/ordnance/storage) "onW" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 @@ -42410,7 +42380,7 @@ "opG" = ( /obj/machinery/portable_atmospherics/canister/carbon_dioxide, /turf/open/floor/iron/dark, -/area/station/science/storage) +/area/station/science/ordnance/storage) "opN" = ( /obj/machinery/power/shieldwallgen, /obj/effect/turf_decal/bot, @@ -42634,7 +42604,8 @@ /obj/effect/turf_decal/delivery, /obj/machinery/door/poddoor/shutters/window{ id = "gatewayshutters"; - name = "Gateway Chamber Shutters" + name = "Gateway Chamber Shutters"; + dir = 4 }, /obj/machinery/button/door/directional/south{ id = "gatewayshutters"; @@ -42711,7 +42682,7 @@ }, /obj/structure/reagent_dispensers/wall/peppertank/directional/west, /turf/open/floor/iron/dark, -/area/station/security/prison) +/area/station/security/execution/transfer) "ouJ" = ( /obj/effect/turf_decal/siding/thinplating{ dir = 9 @@ -42765,7 +42736,10 @@ cycle_id = "sci-entrance-right" }, /obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/science/general, +/obj/effect/mapping_helpers/airlock/access/any/engineering/tcoms, +/obj/effect/mapping_helpers/airlock/access/any/command/minisat, +/obj/effect/mapping_helpers/airlock/access/any/command/ai_upload, +/obj/effect/mapping_helpers/airlock/access/any/science/general, /turf/open/floor/iron, /area/station/science/research) "ovz" = ( @@ -42885,9 +42859,7 @@ /obj/effect/turf_decal/stripes/end{ dir = 8 }, -/obj/structure/sign/warning/electric_shock{ - pixel_x = 32 - }, +/obj/structure/sign/warning/electric_shock/directional/east, /turf/open/floor/plating, /area/station/maintenance/central/greater) "oys" = ( @@ -42899,7 +42871,7 @@ }, /obj/effect/turf_decal/stripes, /turf/open/floor/iron, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "oyD" = ( /obj/structure/window/reinforced{ dir = 8 @@ -42948,7 +42920,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/security/prison) +/area/station/security/execution/transfer) "oza" = ( /obj/item/stack/cable_coil, /obj/effect/turf_decal/sand/plating, @@ -43155,6 +43127,7 @@ dir = 1 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/effect/landmark/start/chaplain, /turf/open/floor/wood/tile, /area/station/service/chapel) "oEf" = ( @@ -44027,7 +44000,8 @@ /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ id = "kanyewest"; - name = "Privacy Shutters" + name = "Privacy Shutters"; + dir = 8 }, /turf/open/floor/plating, /area/station/security/detectives_office) @@ -44098,11 +44072,9 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 }, -/obj/structure/sign/warning/test_chamber{ - pixel_y = -32 - }, +/obj/structure/sign/warning/test_chamber/directional/south, /turf/open/floor/iron, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "oUs" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/yellow/warning{ @@ -44236,6 +44208,9 @@ /obj/structure/cable, /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, /turf/open/floor/catwalk_floor, /area/station/maintenance/solars/port/aft) "oXk" = ( @@ -44272,7 +44247,7 @@ network = list("ss13","rd") }, /turf/open/floor/iron, -/area/station/science/misc_lab) +/area/station/science/auxlab) "oXC" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 4 @@ -44426,9 +44401,7 @@ /area/station/maintenance/tram/left) "oZW" = ( /obj/structure/cable/multilayer/multiz, -/obj/structure/sign/warning/electric_shock{ - pixel_y = 32 - }, +/obj/structure/sign/warning/electric_shock/directional/north, /obj/effect/turf_decal/stripes/end, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, @@ -44924,7 +44897,7 @@ dir = 4 }, /turf/closed/wall/r_wall, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "piE" = ( /obj/structure/chair{ dir = 4; @@ -44945,7 +44918,8 @@ }, /obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/access/all/engineering/construction, +/obj/effect/mapping_helpers/airlock/access/any/command/minisat, +/obj/effect/mapping_helpers/airlock/access/any/engineering/tcoms, /turf/open/floor/plating, /area/station/engineering/transit_tube) "piX" = ( @@ -45055,9 +45029,7 @@ /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 }, -/obj/structure/sign/warning/electric_shock{ - pixel_x = 32 - }, +/obj/structure/sign/warning/electric_shock/directional/east, /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/science/xenobiology) @@ -45307,7 +45279,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "ppr" = ( /obj/machinery/computer/security{ dir = 1 @@ -45477,7 +45449,7 @@ dir = 8 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "psg" = ( /obj/structure/disposalpipe/trunk/multiz{ dir = 1 @@ -45677,6 +45649,7 @@ sortType = 3 }, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/cargo/qm) "puH" = ( @@ -46082,6 +46055,15 @@ /obj/effect/turf_decal/trimline/neutral/filled/line, /turf/open/floor/iron, /area/station/ai_monitored/command/storage/eva) +"pAL" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "rndlab1"; + name = "Research and Development Shutter"; + dir = 1 + }, +/turf/open/floor/plating, +/area/station/science/lab) "pAR" = ( /obj/machinery/firealarm/directional/west, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -46385,7 +46367,7 @@ /obj/effect/turf_decal/box/red, /obj/machinery/light_switch/directional/west, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "pHq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment, @@ -46479,7 +46461,8 @@ }, /obj/machinery/door/poddoor/shutters/preopen{ id = "rndlab1"; - name = "Research and Development Shutter" + name = "Research and Development Shutter"; + dir = 8 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -46677,7 +46660,6 @@ pixel_x = 3; pixel_y = -3 }, -/obj/structure/reagent_dispensers/wall/peppertank/directional/west, /obj/machinery/light/directional/north, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, @@ -46853,7 +46835,7 @@ pixel_y = 2 }, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "pOo" = ( /obj/structure/table, /obj/structure/cable, @@ -47147,7 +47129,7 @@ /obj/item/hatchet, /obj/item/plant_analyzer, /obj/item/cultivator, -/obj/item/reagent_containers/glass/bucket, +/obj/item/reagent_containers/glass/watering_can, /obj/machinery/light/directional/north, /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 1 @@ -47173,7 +47155,7 @@ req_access = list("brig") }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "pWi" = ( /obj/machinery/hydroponics/constructable, /turf/open/floor/grass, @@ -47379,9 +47361,7 @@ /area/station/ai_monitored/turret_protected/ai_upload) "pZp" = ( /obj/structure/cable/multilayer/multiz, -/obj/structure/sign/warning/electric_shock{ - pixel_x = 32 - }, +/obj/structure/sign/warning/electric_shock/directional/east, /obj/effect/turf_decal/stripes/end{ dir = 8 }, @@ -47564,7 +47544,7 @@ "qcU" = ( /obj/machinery/portable_atmospherics/canister/nitrogen, /turf/open/floor/iron/dark, -/area/station/science/storage) +/area/station/science/ordnance/storage) "qdj" = ( /turf/closed/wall/r_wall, /area/station/science/breakroom) @@ -47656,7 +47636,7 @@ "qeu" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/iron, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "qeE" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 5 @@ -47672,7 +47652,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, -/area/station/science/storage) +/area/station/science/ordnance/storage) "qeL" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 10 @@ -48206,9 +48186,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, -/obj/structure/sign/departments/chemistry{ - pixel_y = -32 - }, +/obj/structure/sign/departments/chemistry/directional/south, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -48290,9 +48268,7 @@ /obj/structure/railing{ dir = 8 }, -/obj/structure/sign/warning/biohazard{ - pixel_x = 32 - }, +/obj/structure/sign/warning/biohazard/directional/east, /obj/structure/window/reinforced/spawner, /turf/open/floor/catwalk_floor, /area/station/command/gateway) @@ -48331,7 +48307,7 @@ /obj/machinery/light/directional/north, /obj/machinery/component_printer, /turf/open/floor/iron, -/area/station/science/misc_lab) +/area/station/science/auxlab) "qpu" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 8 @@ -48373,7 +48349,7 @@ dir = 8 }, /turf/open/floor/iron/dark, -/area/station/security/prison) +/area/station/security/execution/transfer) "qpF" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -48523,9 +48499,7 @@ /turf/open/floor/iron/white, /area/station/medical/medbay/central) "qsa" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_x = -32 - }, +/obj/structure/sign/warning/vacuum/external/directional/west, /obj/effect/turf_decal/sand/plating, /obj/machinery/light/small/directional/east, /turf/open/floor/plating, @@ -48797,7 +48771,7 @@ /area/station/hallway/primary/tram/right) "qwR" = ( /turf/open/floor/iron/dark, -/area/station/security/prison) +/area/station/security/execution/transfer) "qwU" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 6 @@ -48837,7 +48811,7 @@ dir = 4 }, /turf/open/floor/plating/airless, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "qxS" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/iron, @@ -48915,9 +48889,6 @@ dir = 4 }, /obj/effect/landmark/start/head_of_personnel, -/obj/machinery/computer/security/telescreen/vault{ - pixel_y = 30 - }, /obj/machinery/light/directional/north, /turf/open/floor/carpet, /area/station/command/heads_quarters/hop) @@ -48933,9 +48904,7 @@ /turf/open/floor/engine/cult, /area/station/service/library) "qzo" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_y = -32 - }, +/obj/structure/sign/warning/vacuum/external/directional/south, /obj/effect/turf_decal/trimline/yellow/filled/line, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, @@ -49095,7 +49064,7 @@ network = list("ss13","rd") }, /turf/open/floor/iron/white, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "qCQ" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 4 @@ -49142,7 +49111,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/door/poddoor/shutters{ - id = "cargowarehouse" + id = "cargowarehouse"; + dir = 8 }, /obj/structure/cable, /turf/open/floor/plating, @@ -49248,7 +49218,8 @@ }, /obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/access/all/engineering/construction, +/obj/effect/mapping_helpers/airlock/access/any/engineering/tcoms, +/obj/effect/mapping_helpers/airlock/access/any/command/minisat, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat/foyer) "qEU" = ( @@ -49437,7 +49408,8 @@ /obj/effect/turf_decal/trimline/purple/filled/line, /obj/machinery/door/poddoor/shutters/preopen{ id = "cytologylockdown"; - name = "Cytology Lockdown" + name = "Cytology Lockdown"; + dir = 8 }, /obj/structure/cable, /obj/effect/mapping_helpers/airlock/access/all/science/xenobio, @@ -49629,7 +49601,8 @@ /obj/structure/table/reinforced, /obj/machinery/door/poddoor/shutters{ id = "commissarydoor"; - name = "Vacant Commissary Shutters" + name = "Vacant Commissary Shutters"; + dir = 8 }, /turf/open/floor/plating, /area/station/commons/vacant_room/commissary) @@ -49810,10 +49783,10 @@ dir = 1 }, /obj/effect/landmark/tram/middle_part, -/obj/structure/industrial_lift/tram/central{ +/obj/machinery/computer/tram_controls, +/obj/structure/industrial_lift/tram{ icon_state = "titanium" }, -/obj/machinery/computer/tram_controls, /turf/open/floor/vault, /area/station/hallway/primary/tram/center) "qNd" = ( @@ -50159,7 +50132,7 @@ }, /obj/machinery/light_switch/directional/south, /turf/open/floor/iron/white, -/area/station/science/mixing) +/area/station/science/ordnance) "qUt" = ( /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ @@ -50401,9 +50374,7 @@ /obj/machinery/door/airlock/external{ name = "Escape Airlock" }, -/obj/structure/sign/warning/vacuum/external{ - pixel_y = 32 - }, +/obj/structure/sign/warning/vacuum/external/directional/north, /turf/open/floor/plating, /area/station/hallway/secondary/exit/departure_lounge) "qYW" = ( @@ -50504,9 +50475,7 @@ /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 8 }, -/obj/structure/sign/departments/restroom{ - pixel_x = -32 - }, +/obj/structure/sign/departments/restroom/directional/west, /turf/open/floor/iron, /area/station/commons/dorms) "rbj" = ( @@ -50650,7 +50619,7 @@ }, /obj/machinery/light/directional/north, /obj/structure/reagent_dispensers/watertank/high, -/obj/item/reagent_containers/glass/bucket, +/obj/item/reagent_containers/glass/watering_can, /turf/open/floor/iron/dark, /area/station/service/hydroponics) "rdO" = ( @@ -50661,6 +50630,7 @@ /obj/structure/chair{ dir = 4 }, +/obj/effect/landmark/start/chaplain, /turf/open/floor/iron/grimy, /area/station/service/chapel/office) "reU" = ( @@ -50888,9 +50858,6 @@ /area/station/engineering/engine_smes) "rjD" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 8 - }, /obj/machinery/door/airlock/hatch{ name = "Ladder Access Hatch" }, @@ -50987,9 +50954,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/structure/sign/warning/vacuum/external{ - pixel_x = -32 - }, +/obj/structure/sign/warning/vacuum/external/directional/west, /obj/structure/cable, /turf/open/floor/engine, /area/station/engineering/supermatter/room) @@ -51003,11 +50968,9 @@ /obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer2{ dir = 5 }, -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored{ - chamber_id = "ordnancegas2" - }, +/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/ordnance_freezer_chamber_input, /turf/open/floor/iron/dark/airless, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/freezerchamber) "rlU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible, /obj/effect/turf_decal/trimline/yellow/filled/corner{ @@ -51034,7 +50997,7 @@ /area/station/security/office) "rmk" = ( /turf/closed/wall/r_wall, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "rmm" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 4 @@ -51173,7 +51136,7 @@ /turf/open/floor/iron/stairs/medium{ dir = 1 }, -/area/station/security/prison) +/area/station/security/execution/transfer) "rpu" = ( /obj/machinery/door/firedoor, /obj/structure/railing/corner, @@ -51222,7 +51185,7 @@ }, /obj/item/radio/intercom/directional/west, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "rqi" = ( /obj/structure/table/wood, /obj/structure/window/reinforced{ @@ -51241,7 +51204,7 @@ dir = 10 }, /turf/open/floor/plating/airless, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "rqG" = ( /obj/effect/turf_decal/trimline/yellow/warning, /obj/structure/railing/corner, @@ -51255,9 +51218,7 @@ /turf/open/floor/iron, /area/station/hallway/primary/tram/center) "rqV" = ( -/obj/structure/sign/warning/vacuum{ - pixel_y = -32 - }, +/obj/structure/sign/warning/vacuum/directional/south, /obj/machinery/light/small/directional/west, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -51268,7 +51229,8 @@ "rqZ" = ( /obj/effect/turf_decal/sand/plating, /obj/machinery/door/poddoor/shutters{ - id = "hiddendock" + id = "hiddendock"; + dir = 1 }, /turf/open/floor/plating, /area/station/maintenance/central/greater) @@ -51477,9 +51439,7 @@ }, /obj/structure/disposalpipe/segment, /obj/structure/cable, -/obj/structure/sign/warning/secure_area{ - pixel_x = 32 - }, +/obj/structure/sign/warning/secure_area/directional/east, /turf/open/floor/iron/white, /area/station/science/lower) "run" = ( @@ -51491,7 +51451,7 @@ req_access = list("ordnance") }, /turf/open/floor/iron/white, -/area/station/science/mixing) +/area/station/science/ordnance) "ruA" = ( /obj/structure/railing{ dir = 1 @@ -51529,7 +51489,7 @@ /area/station/service/theater) "ruW" = ( /obj/structure/table/wood, -/obj/item/book/granter/spell/smoke/lesser{ +/obj/item/book/granter/action/spell/smoke/lesser{ name = "mysterious old book of cloud-chasing" }, /obj/item/soulstone/anybody/chaplain, @@ -51655,7 +51615,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "rxo" = ( /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -51782,7 +51742,7 @@ dir = 9 }, /turf/open/floor/iron, -/area/station/science/storage) +/area/station/science/ordnance/storage) "ryZ" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner, /obj/structure/disposalpipe/segment{ @@ -51885,7 +51845,8 @@ /obj/structure/table/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ id = "pharmacy_shutters_2"; - name = "Pharmacy Shutters" + name = "Pharmacy Shutters"; + dir = 1 }, /obj/machinery/door/firedoor, /obj/machinery/door/window/left/directional/south{ @@ -52007,7 +51968,7 @@ /obj/structure/cable, /obj/effect/mapping_helpers/airlock/access/all/science/research, /turf/open/floor/iron, -/area/station/science/misc_lab) +/area/station/science/auxlab) "rCn" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -52131,7 +52092,10 @@ /area/station/medical/medbay/central) "rDX" = ( /turf/closed/wall/r_wall, -/area/station/science/mixing) +/area/station/science/ordnance) +"rDZ" = ( +/turf/closed/wall/r_wall, +/area/station/security/execution/transfer) "rEe" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/security/glass{ @@ -52158,7 +52122,7 @@ }, /obj/effect/landmark/start/scientist, /turf/open/floor/iron/white, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "rEB" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 1 @@ -52256,9 +52220,7 @@ dir = 1 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/sign/warning/electric_shock{ - pixel_y = -32 - }, +/obj/structure/sign/warning/electric_shock/directional/south, /turf/open/floor/plating, /area/station/maintenance/solars/port/aft) "rGi" = ( @@ -52303,12 +52265,13 @@ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/security/prison) +/area/station/security/execution/transfer) "rHj" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ id = "rndlab1"; - name = "Research and Development Shutter" + name = "Research and Development Shutter"; + dir = 8 }, /turf/open/floor/plating, /area/station/science/lab) @@ -52324,7 +52287,7 @@ dir = 5 }, /turf/open/floor/plating/airless, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "rHq" = ( /obj/effect/turf_decal/trimline/brown/filled/corner{ dir = 8 @@ -52420,7 +52383,7 @@ }, /obj/machinery/light/directional/north, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "rIT" = ( /obj/structure/table/wood, /obj/effect/spawner/random/decoration/ornament, @@ -52456,7 +52419,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/security/brig, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "rJs" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -52537,7 +52500,7 @@ /area/station/command/teleporter) "rKh" = ( /turf/open/floor/iron, -/area/station/science/misc_lab) +/area/station/science/auxlab) "rKj" = ( /obj/structure/table/wood, /obj/item/storage/dice, @@ -52884,7 +52847,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/supply/general, +/obj/effect/mapping_helpers/airlock/access/all/supply/shipping, /turf/open/floor/iron, /area/station/cargo/sorting) "rOb" = ( @@ -53001,6 +52964,7 @@ /obj/structure/cable, /obj/effect/turf_decal/sand/plating, /obj/effect/mapping_helpers/airlock/access/all/security/brig, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, /turf/open/floor/plating, /area/station/maintenance/central/greater) "rPt" = ( @@ -53042,7 +53006,7 @@ /obj/machinery/cell_charger, /obj/item/stock_parts/cell/high, /turf/open/floor/iron, -/area/station/science/misc_lab) +/area/station/science/auxlab) "rPS" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, @@ -53218,9 +53182,7 @@ /turf/open/floor/iron, /area/station/commons/dorms) "rTm" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_x = 32 - }, +/obj/structure/sign/warning/vacuum/external/directional/east, /obj/machinery/computer/security/labor, /obj/effect/turf_decal/trimline/red/filled/line{ dir = 5 @@ -53365,7 +53327,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "rWo" = ( /obj/machinery/door/airlock/command/glass{ name = "EVA Storage" @@ -53709,7 +53671,7 @@ dir = 4 }, /turf/open/floor/iron/white, -/area/station/science/mixing) +/area/station/science/ordnance) "scA" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 4 @@ -53728,13 +53690,13 @@ }, /obj/effect/turf_decal/trimline/red/filled/line, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "scP" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 8 }, /turf/open/floor/engine/vacuum, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "scV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -53939,7 +53901,7 @@ dir = 10 }, /turf/open/floor/iron/dark/airless, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/freezerchamber) "sgu" = ( /obj/structure/table/reinforced, /obj/item/folder/yellow, @@ -54095,7 +54057,7 @@ }, /obj/machinery/light/directional/east, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "slf" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -54188,7 +54150,7 @@ piping_layer = 2 }, /turf/open/floor/iron/white, -/area/station/science/mixing) +/area/station/science/ordnance) "snC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible, /obj/effect/turf_decal/trimline/purple/filled/corner{ @@ -54245,7 +54207,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/security/brig, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "som" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/red/filled/corner{ @@ -54257,7 +54219,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "soo" = ( /obj/machinery/power/apc/auto_name/directional/north, /obj/effect/turf_decal/trimline/neutral/filled/line{ @@ -54348,6 +54310,10 @@ }, /turf/open/floor/iron/grimy, /area/station/service/chapel/office) +"sqz" = ( +/obj/effect/turf_decal/sand/plating, +/turf/open/floor/plating/airless, +/area/station/engineering/supermatter/room) "sqD" = ( /obj/effect/turf_decal/siding/thinplating/corner, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -54387,9 +54353,7 @@ /turf/open/floor/engine, /area/station/engineering/supermatter/room) "srr" = ( -/obj/structure/sign/warning/radiation/rad_area{ - pixel_y = 32 - }, +/obj/structure/sign/warning/radiation/rad_area/directional/north, /obj/effect/turf_decal/siding/wideplating{ dir = 10 }, @@ -54451,7 +54415,7 @@ "ssl" = ( /obj/structure/closet/firecloset, /turf/open/floor/iron/white, -/area/station/science/mixing) +/area/station/science/ordnance) "ssp" = ( /obj/effect/turf_decal/trimline/yellow/warning{ dir = 1 @@ -54479,9 +54443,7 @@ /turf/open/floor/iron/dark, /area/station/service/hydroponics) "std" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_x = -32 - }, +/obj/structure/sign/warning/vacuum/external/directional/west, /obj/effect/turf_decal/sand/plating, /obj/machinery/light/small/directional/east, /turf/open/floor/plating, @@ -54569,14 +54531,8 @@ /turf/open/floor/iron, /area/station/security/brig) "suI" = ( -/obj/docking_port/stationary{ - dir = 4; - dwidth = 3; - height = 5; - id = "commonmining_home"; - name = "SS13: Common Mining Dock"; - roundstart_template = /datum/map_template/shuttle/mining_common/meta; - width = 7 +/obj/docking_port/stationary/mining_home/common{ + dir = 4 }, /turf/open/misc/asteroid/airless, /area/mine/explored) @@ -54619,7 +54575,7 @@ /obj/item/integrated_circuit/loaded/speech_relay, /obj/item/compact_remote, /turf/open/floor/iron, -/area/station/science/misc_lab) +/area/station/science/auxlab) "svk" = ( /turf/open/floor/circuit/red, /area/station/ai_monitored/turret_protected/ai_upload) @@ -54650,7 +54606,7 @@ /obj/machinery/requests_console/directional/west, /obj/structure/disposalpipe/segment, /turf/open/floor/iron, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "swr" = ( /obj/effect/turf_decal/trimline/neutral/filled/line, /turf/open/floor/iron, @@ -54870,7 +54826,7 @@ dir = 10 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "sAh" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -54931,7 +54887,8 @@ /obj/effect/spawner/structure/window, /obj/machinery/door/poddoor/shutters/preopen{ id = "robotics2"; - name = "Robotics Lab Shutters" + name = "Robotics Lab Shutters"; + dir = 4 }, /turf/open/floor/plating, /area/station/science/robotics/lab) @@ -55054,9 +55011,7 @@ /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) "sEr" = ( -/obj/structure/sign/warning/pods{ - pixel_x = 32 - }, +/obj/structure/sign/warning/pods/directional/east, /obj/effect/decal/cleanable/dirt, /obj/item/stack/cable_coil/cut, /obj/item/wirecutters, @@ -55069,6 +55024,9 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"sEx" = ( +/turf/closed/wall, +/area/station/security/execution/transfer) "sEP" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 @@ -55322,9 +55280,7 @@ /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 6 }, -/obj/structure/sign/warning/no_smoking{ - pixel_y = -32 - }, +/obj/structure/sign/warning/no_smoking/directional/south, /obj/machinery/power/apc/auto_name/directional/east, /obj/structure/cable, /turf/open/floor/iron, @@ -55752,7 +55708,7 @@ /obj/structure/cable, /obj/effect/turf_decal/trimline/red/filled/corner, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "sRh" = ( /obj/structure/showcase/cyborg/old{ pixel_y = 20 @@ -55784,7 +55740,8 @@ /obj/effect/turf_decal/caution/stand_clear, /obj/effect/decal/cleanable/dirt, /obj/machinery/door/poddoor/shutters{ - id = "cargowarehouse" + id = "cargowarehouse"; + dir = 8 }, /turf/open/floor/plating, /area/station/cargo/warehouse) @@ -56350,7 +56307,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/security/brig, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "tbm" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -56368,7 +56325,8 @@ dir = 1 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/access/all/engineering/construction, +/obj/effect/mapping_helpers/airlock/access/any/engineering/tcoms, +/obj/effect/mapping_helpers/airlock/access/any/command/minisat, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat/foyer) "tce" = ( @@ -56538,6 +56496,15 @@ dir = 8 }, /area/station/service/chapel) +"tfZ" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "rndlab1"; + name = "Research and Development Shutter"; + dir = 4 + }, +/turf/open/floor/plating, +/area/station/science/lab) "tgw" = ( /obj/machinery/computer/security/telescreen/cmo{ pixel_y = 32 @@ -57249,9 +57216,9 @@ /obj/structure/industrial_lift/tram{ icon_state = "plating" }, -/obj/structure/window/reinforced/shuttle, -/obj/structure/grille, /obj/structure/fluff/tram_rail, +/obj/structure/grille/tram, +/obj/structure/window/reinforced/shuttle/tram, /turf/open/openspace, /area/station/hallway/primary/tram/center) "trr" = ( @@ -57292,7 +57259,7 @@ /obj/machinery/airalarm/directional/north, /obj/structure/cable, /turf/open/floor/iron, -/area/station/science/misc_lab) +/area/station/science/auxlab) "trL" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/neutral/filled/line{ @@ -57862,6 +57829,12 @@ /obj/item/radio/intercom/directional/south, /turf/open/floor/iron/grimy, /area/station/security/detectives_office) +"tAQ" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/security/execution/transfer) "tBc" = ( /obj/effect/turf_decal/trimline/yellow/warning{ dir = 1 @@ -58114,7 +58087,8 @@ /obj/effect/turf_decal/trimline/purple/filled/line, /obj/machinery/door/poddoor/shutters/preopen{ id = "rndlab1"; - name = "Research and Development Shutter" + name = "Research and Development Shutter"; + dir = 4 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -58327,7 +58301,7 @@ /obj/item/toy/figure/assistant, /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/plating/airless, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "tIi" = ( /mob/living/simple_animal/bot/floorbot, /turf/open/floor/iron/dark, @@ -58544,9 +58518,7 @@ dir = 1 }, /obj/effect/turf_decal/trimline/yellow/filled/line, -/obj/structure/sign/warning/chem_diamond{ - pixel_x = 32 - }, +/obj/structure/sign/warning/chem_diamond/directional/east, /obj/structure/chair/office/light, /obj/effect/landmark/start/chemist, /turf/open/floor/iron/white, @@ -58567,7 +58539,7 @@ }, /obj/effect/turf_decal/box/red, /turf/open/floor/iron/white, -/area/station/science/mixing) +/area/station/science/ordnance) "tMG" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -58635,9 +58607,7 @@ "tNp" = ( /obj/structure/cable/multilayer/multiz, /obj/effect/decal/cleanable/dirt, -/obj/structure/sign/warning/electric_shock{ - pixel_x = -32 - }, +/obj/structure/sign/warning/electric_shock/directional/west, /obj/effect/turf_decal/stripes/end{ dir = 4 }, @@ -58708,7 +58678,7 @@ /area/station/maintenance/department/medical) "tQc" = ( /turf/closed/wall/r_wall, -/area/station/science/storage) +/area/station/science/ordnance/storage) "tQq" = ( /obj/machinery/recharge_station, /turf/open/floor/plating, @@ -58803,7 +58773,7 @@ /area/station/commons/vacant_room/office) "tRC" = ( /turf/closed/wall/rock, -/area/mine/explored) +/area/station/engineering/supermatter/room) "tRE" = ( /obj/effect/landmark/start/hangover, /turf/open/floor/iron, @@ -58826,7 +58796,7 @@ }, /obj/effect/landmark/start/scientist, /turf/open/floor/iron/white, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "tRW" = ( /obj/structure/toilet{ dir = 8; @@ -59170,9 +59140,7 @@ /turf/open/floor/iron, /area/station/engineering/main) "tZe" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_x = -32 - }, +/obj/structure/sign/warning/vacuum/external/directional/west, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/port/fore) @@ -59520,9 +59488,7 @@ /turf/open/floor/engine/co2, /area/station/engineering/atmos) "ufe" = ( -/obj/structure/sign/warning/vacuum{ - pixel_y = -32 - }, +/obj/structure/sign/warning/vacuum/directional/south, /obj/machinery/light/small/directional/east, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -59540,6 +59506,13 @@ }, /turf/open/floor/circuit/green, /area/station/ai_monitored/turret_protected/ai_upload) +"uft" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/start/chaplain, +/turf/open/floor/iron/dark, +/area/station/service/chapel) "ufv" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/firecloset, @@ -59706,8 +59679,8 @@ /turf/open/floor/eighties, /area/station/commons/fitness/recreation/entertainment) "uik" = ( -/obj/machinery/door/airlock/external{ - name = "Supply Dock Airlock" +/obj/machinery/door/airlock/external/glass{ + name = "Supply Door Airlock" }, /obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/effect/mapping_helpers/airlock/access/all/supply/general, @@ -59907,8 +59880,7 @@ "umj" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner, /obj/structure/disposalpipe/segment, -/obj/structure/sign/departments/evac{ - pixel_x = 32; +/obj/structure/sign/departments/evac/directional/east{ pixel_y = -32 }, /turf/open/floor/iron, @@ -60052,7 +60024,7 @@ dir = 1 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "upe" = ( /obj/effect/landmark/start/cyborg, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -60302,9 +60274,7 @@ /obj/effect/turf_decal/trimline/neutral/corner{ dir = 4 }, -/obj/structure/sign/departments/security{ - pixel_x = -32 - }, +/obj/structure/sign/departments/security/directional/west, /turf/open/floor/iron, /area/station/hallway/secondary/command) "utx" = ( @@ -60331,7 +60301,7 @@ /obj/machinery/airalarm/directional/south, /obj/machinery/light/directional/south, /turf/open/floor/iron, -/area/station/science/storage) +/area/station/science/ordnance/storage) "utB" = ( /obj/structure/table, /obj/item/multitool, @@ -60398,7 +60368,7 @@ dir = 9 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "uun" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -60523,7 +60493,7 @@ /obj/machinery/door/window/left/directional/west{ dir = 1; name = "Delivery Desk"; - req_access = list("mail_sorting") + req_access = list("shipping") }, /obj/structure/disposalpipe/segment, /obj/structure/desk_bell{ @@ -60709,9 +60679,7 @@ /obj/structure/industrial_lift/tram{ icon_state = "titanium_white" }, -/obj/machinery/door/window/left/directional/north{ - id_tag = "tramdoor" - }, +/obj/machinery/door/window/left/tram/directional/north, /turf/open/openspace, /area/station/hallway/primary/tram/center) "uyA" = ( @@ -61089,7 +61057,7 @@ }, /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating/airless, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "uFX" = ( /obj/effect/turf_decal/bot, /obj/machinery/portable_atmospherics/scrubber, @@ -61238,7 +61206,7 @@ dir = 10 }, /turf/open/floor/plating/airless, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "uJx" = ( /obj/structure/table/wood, /obj/structure/window/reinforced{ @@ -61281,7 +61249,10 @@ id = "Sciencelockdown"; name = "Research Lockdown Blastdoor" }, -/obj/effect/mapping_helpers/airlock/access/all/science/general, +/obj/effect/mapping_helpers/airlock/access/any/engineering/tcoms, +/obj/effect/mapping_helpers/airlock/access/any/command/minisat, +/obj/effect/mapping_helpers/airlock/access/any/command/ai_upload, +/obj/effect/mapping_helpers/airlock/access/any/science/general, /turf/open/floor/iron, /area/station/science/research) "uKg" = ( @@ -61316,8 +61287,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/structure/sign/departments/evac{ - pixel_x = 32; +/obj/structure/sign/departments/evac/directional/east{ pixel_y = 32 }, /turf/open/floor/iron, @@ -61612,7 +61582,7 @@ pixel_y = -8 }, /turf/open/floor/iron/white, -/area/station/science/mixing) +/area/station/science/ordnance) "uOZ" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 8; @@ -62094,8 +62064,6 @@ /obj/structure/industrial_lift/tram{ icon_state = "plating" }, -/obj/structure/window/reinforced/shuttle, -/obj/structure/grille, /obj/effect/turf_decal/stripes{ dir = 1 }, @@ -62103,6 +62071,8 @@ /obj/effect/turf_decal/caution/stand_clear/red{ dir = 8 }, +/obj/structure/grille/tram, +/obj/structure/window/reinforced/shuttle/tram, /turf/open/floor/vault, /area/station/hallway/primary/tram/center) "uXK" = ( @@ -62476,7 +62446,7 @@ dir = 1 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "vdQ" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -62583,7 +62553,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "vfD" = ( /obj/effect/turf_decal/trimline/yellow/filled/corner{ dir = 4 @@ -62850,7 +62820,7 @@ }, /obj/machinery/light/directional/south, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "vju" = ( /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ @@ -62945,7 +62915,7 @@ }, /obj/machinery/light/directional/east, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "vlO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/misc/asteroid/airless, @@ -63033,7 +63003,7 @@ dir = 6 }, /turf/open/floor/plating/airless, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "voN" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 8 @@ -63240,7 +63210,7 @@ dir = 6 }, /turf/open/floor/plating/airless, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "vrN" = ( /obj/effect/turf_decal/delivery, /obj/effect/landmark/start/hangover, @@ -63299,13 +63269,8 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, -/obj/structure/rack, -/obj/effect/spawner/random/clothing/costume, -/obj/effect/spawner/random/bureaucracy/briefcase{ - spawn_loot_count = 2; - spawn_loot_split = 1 - }, /obj/structure/sign/poster/official/random/directional/west, +/obj/machinery/vending/clothing, /turf/open/floor/iron/cafeteria, /area/station/commons/dorms/laundry) "vsz" = ( @@ -63574,7 +63539,7 @@ dir = 5 }, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "vwO" = ( /obj/machinery/door/airlock/grunge{ name = "Entertainment Center" @@ -63601,7 +63566,7 @@ pixel_y = 1 }, /turf/open/floor/iron/white, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "vwZ" = ( /obj/machinery/light/directional/south, /turf/open/floor/iron/dark, @@ -63827,6 +63792,9 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) +"vBY" = ( +/turf/open/floor/iron, +/area/station/security/execution/transfer) "vCa" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 1 @@ -63860,7 +63828,7 @@ dir = 1 }, /turf/open/floor/iron, -/area/station/science/misc_lab) +/area/station/science/auxlab) "vCk" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 4 @@ -63970,7 +63938,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/security/prison) +/area/station/security/execution/transfer) "vEe" = ( /obj/structure/window/reinforced/spawner, /obj/machinery/chem_heater/withbuffer, @@ -64450,7 +64418,7 @@ /obj/item/raw_anomaly_core/random, /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "vND" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 4 @@ -64782,7 +64750,7 @@ }, /obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden, /turf/open/floor/engine, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "vTM" = ( /turf/open/floor/wood, /area/station/service/bar) @@ -65083,9 +65051,7 @@ /area/station/engineering/atmos) "vZt" = ( /obj/structure/cable/multilayer/multiz, -/obj/structure/sign/warning/electric_shock{ - pixel_x = -32 - }, +/obj/structure/sign/warning/electric_shock/directional/west, /obj/effect/turf_decal/stripes/end{ dir = 4 }, @@ -65156,7 +65122,7 @@ "waK" = ( /obj/machinery/door/poddoor/incinerator_ordmix, /turf/open/floor/engine/vacuum, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "wbb" = ( /turf/open/floor/iron, /area/station/commons/dorms) @@ -65382,9 +65348,7 @@ /obj/structure/industrial_lift/tram{ icon_state = "titanium_white" }, -/obj/machinery/door/window/right/directional/north{ - id_tag = "tramdoor" - }, +/obj/machinery/door/window/right/tram/directional/north, /turf/open/openspace, /area/station/hallway/primary/tram/center) "wgT" = ( @@ -65928,7 +65892,7 @@ /obj/effect/mapping_helpers/airlock/locked, /obj/effect/mapping_helpers/airlock/access/all/science/ordnance, /turf/open/floor/engine/vacuum, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "wqu" = ( /obj/machinery/airalarm/directional/north, /turf/open/floor/iron/dark, @@ -65967,7 +65931,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, -/area/station/science/storage) +/area/station/science/ordnance/storage) "wrs" = ( /obj/effect/turf_decal/trimline/yellow/warning, /obj/effect/decal/cleanable/dirt, @@ -65977,10 +65941,9 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/structure/sign/warning/docking{ +/obj/structure/sign/warning/docking/directional/north{ desc = "A warning sign which reads 'KEEP CLEAR OF TRAM DOCKING AREA'."; - name = "KEEP CLEAR: TRAM DOCKING AREA sign"; - pixel_y = 32 + name = "KEEP CLEAR: TRAM DOCKING AREA sign" }, /turf/open/floor/iron, /area/station/maintenance/tram/left) @@ -66301,7 +66264,8 @@ "wws" = ( /obj/machinery/door/poddoor/shutters{ id = "armory"; - name = "Armoury Shutter" + name = "Armoury Shutter"; + dir = 4 }, /obj/effect/turf_decal/trimline/red/filled/line, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -66317,9 +66281,7 @@ /obj/structure/disposalpipe/trunk{ dir = 1 }, -/obj/structure/sign/warning/deathsposal{ - pixel_y = -32 - }, +/obj/structure/sign/warning/deathsposal/directional/south, /turf/open/floor/iron/white, /area/station/science/xenobiology) "wwz" = ( @@ -66340,7 +66302,7 @@ "wwY" = ( /obj/machinery/portable_atmospherics/canister/nitrous_oxide, /turf/open/floor/iron/dark, -/area/station/science/storage) +/area/station/science/ordnance/storage) "wxb" = ( /obj/machinery/computer/chef_order{ dir = 1 @@ -66472,9 +66434,8 @@ /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "wzq" = ( -/obj/structure/sign/warning/radiation/rad_area{ - dir = 1; - pixel_y = 32 +/obj/structure/sign/warning/radiation/rad_area/directional/north{ + dir = 1 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/trimline/neutral/filled/line{ @@ -66559,9 +66520,7 @@ /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 }, -/obj/structure/sign/warning/no_smoking{ - pixel_y = 32 - }, +/obj/structure/sign/warning/no_smoking/directional/north, /obj/item/experi_scanner{ pixel_x = 5 }, @@ -66631,6 +66590,9 @@ }, /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/airlock/access/all/security/general, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, /turf/open/floor/plating, /area/station/security/office) "wBB" = ( @@ -66643,7 +66605,7 @@ "wBM" = ( /obj/structure/chair/office, /turf/open/floor/iron/white, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "wBX" = ( /obj/structure/window/reinforced{ dir = 4; @@ -66841,7 +66803,8 @@ /obj/machinery/smartfridge/chemistry/preloaded, /obj/machinery/door/poddoor/shutters/preopen{ id = "pharmacy_shutters_2"; - name = "Pharmacy Shutters" + name = "Pharmacy Shutters"; + dir = 1 }, /turf/open/floor/iron, /area/station/medical/pharmacy) @@ -66855,7 +66818,7 @@ "wGn" = ( /obj/machinery/portable_atmospherics/canister/plasma, /turf/open/floor/iron/dark, -/area/station/science/storage) +/area/station/science/ordnance/storage) "wGy" = ( /obj/effect/turf_decal/trimline/yellow/warning, /obj/effect/turf_decal/trimline/neutral/filled/corner{ @@ -67155,10 +67118,9 @@ /area/station/cargo/miningdock/oresilo) "wMn" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/warning/secure_area{ +/obj/structure/sign/warning/secure_area/directional/north{ desc = "A warning sign which reads 'SERVER ROOM'."; - name = "SERVER ROOM"; - pixel_y = 32 + name = "SERVER ROOM" }, /turf/open/floor/plating, /area/station/science/server) @@ -67343,14 +67305,11 @@ "wQi" = ( /obj/machinery/atmospherics/components/tank, /turf/open/floor/iron/dark, -/area/station/science/storage) +/area/station/science/ordnance/storage) "wQm" = ( /turf/open/floor/iron, /area/station/engineering/atmos) "wQv" = ( -/obj/machinery/door/airlock/mining/glass{ - name = "Quartermaster" - }, /obj/machinery/door/firedoor, /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 4 @@ -67358,6 +67317,11 @@ /obj/structure/disposalpipe/segment, /obj/structure/cable, /obj/effect/mapping_helpers/airlock/access/all/supply/qm, +/obj/machinery/door/airlock/command/glass{ + name = "Quartermaster's Office" + }, +/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/qm) "wQP" = ( @@ -67507,7 +67471,7 @@ }, /obj/item/assembly/timer, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "wUR" = ( /obj/structure/reagent_dispensers/fueltank, /obj/effect/turf_decal/trimline/neutral/filled/line{ @@ -67844,9 +67808,7 @@ /obj/effect/turf_decal/stripes/end{ dir = 8 }, -/obj/structure/sign/warning/electric_shock{ - pixel_x = 32 - }, +/obj/structure/sign/warning/electric_shock/directional/east, /turf/open/floor/plating, /area/station/maintenance/department/medical) "wZG" = ( @@ -67917,7 +67879,7 @@ network = list("ss13","rd") }, /turf/open/floor/iron/dark, -/area/station/science/storage) +/area/station/science/ordnance/storage) "xaB" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 8 @@ -68193,7 +68155,7 @@ name = "Lil Pump" }, /turf/open/floor/iron/dark, -/area/station/science/storage) +/area/station/science/ordnance/storage) "xeK" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -68350,7 +68312,7 @@ dir = 4 }, /turf/open/floor/iron, -/area/station/science/misc_lab) +/area/station/science/auxlab) "xgN" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 8 @@ -68377,7 +68339,7 @@ /obj/machinery/airalarm/directional/north, /obj/machinery/light/directional/north, /turf/open/floor/iron/white, -/area/station/science/mixing/hallway) +/area/station/science/ordnance/office) "xhs" = ( /obj/machinery/disposal/bin, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -68451,12 +68413,12 @@ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/science/storage) +/area/station/science/ordnance/storage) "xiq" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/effect/turf_decal/siding/thinplating/dark, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "xiu" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -68534,7 +68496,7 @@ dir = 4 }, /turf/open/floor/plating/airless, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "xks" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/neutral/filled/line{ @@ -68861,9 +68823,7 @@ "xqY" = ( /obj/effect/turf_decal/trimline/neutral/filled/line, /obj/structure/cable, -/obj/structure/sign/departments/holy{ - pixel_y = -32 - }, +/obj/structure/sign/departments/holy/directional/south, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment{ @@ -68906,7 +68866,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold/purple/visible/layer2, /obj/machinery/meter/layer2, /turf/open/floor/iron/white, -/area/station/science/mixing) +/area/station/science/ordnance) "xsc" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -68972,7 +68932,7 @@ /obj/machinery/atmospherics/pipe/heat_exchanging/manifold/layer2, /obj/machinery/atmospherics/components/unary/vent_scrubber, /turf/open/floor/iron/dark/airless, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/freezerchamber) "xtP" = ( /obj/effect/decal/cleanable/cobweb, /obj/structure/closet, @@ -69121,7 +69081,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/security/brig, /turf/open/floor/iron, -/area/station/security/prison) +/area/station/security/execution/transfer) "xva" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/stripes/corner, @@ -69178,6 +69138,10 @@ }, /turf/open/floor/wood/parquet, /area/station/medical/psychology) +"xvP" = ( +/obj/effect/turf_decal/trimline/red/filled/line, +/turf/open/floor/iron, +/area/station/security/execution/transfer) "xwf" = ( /turf/closed/wall/r_wall, /area/station/maintenance/central/greater) @@ -69251,9 +69215,7 @@ /turf/open/floor/iron/white, /area/station/science/xenobiology) "xxs" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_x = -32 - }, +/obj/structure/sign/warning/vacuum/external/directional/west, /obj/effect/turf_decal/sand/plating, /obj/machinery/light/small/directional/east, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -69293,9 +69255,7 @@ /turf/open/floor/iron/white, /area/station/science/lab) "xxP" = ( -/obj/structure/musician/piano{ - icon_state = "piano" - }, +/obj/structure/musician/piano, /turf/open/floor/wood, /area/station/service/theater) "xxW" = ( @@ -69377,7 +69337,8 @@ "xzA" = ( /obj/machinery/door/poddoor/shutters{ id = "evashutter"; - name = "E.V.A. Storage Shutter" + name = "E.V.A. Storage Shutter"; + dir = 4 }, /obj/effect/turf_decal/delivery, /turf/open/floor/plating, @@ -69618,14 +69579,12 @@ /obj/structure/closet/secure_closet/brig, /obj/effect/turf_decal/bot, /turf/open/floor/iron/dark, -/area/station/security/prison) +/area/station/security/execution/transfer) "xEG" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 4 }, -/obj/structure/sign/departments/chemistry/pharmacy{ - pixel_x = 32 - }, +/obj/structure/sign/departments/chemistry/pharmacy/directional/east, /turf/open/floor/iron, /area/station/hallway/primary/tram/center) "xFa" = ( @@ -69725,7 +69684,7 @@ dir = 6 }, /turf/open/floor/iron/dark/airless, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/freezerchamber) "xGX" = ( /obj/effect/turf_decal/siding/thinplating/corner{ dir = 8 @@ -69765,9 +69724,7 @@ dir = 5 }, /obj/effect/spawner/random/vending/snackvend, -/obj/structure/sign/departments/restroom{ - pixel_y = 32 - }, +/obj/structure/sign/departments/restroom/directional/north, /turf/open/floor/iron/dark, /area/station/commons/lounge) "xHn" = ( @@ -69833,7 +69790,7 @@ pixel_y = 24 }, /turf/open/floor/engine, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/burnchamber) "xJj" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -69957,9 +69914,6 @@ /turf/open/floor/iron, /area/station/commons/lounge) "xLd" = ( -/obj/machinery/door/airlock/mining/glass{ - name = "Quartermaster" - }, /obj/machinery/door/firedoor, /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 1 @@ -69969,6 +69923,9 @@ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/all/supply/qm, +/obj/machinery/door/airlock/command/glass{ + name = "Quartermaster's Office" + }, /turf/open/floor/iron, /area/station/cargo/office) "xLi" = ( @@ -70332,7 +70289,7 @@ dir = 5 }, /turf/open/floor/iron, -/area/station/science/storage) +/area/station/science/ordnance/storage) "xRv" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -70538,7 +70495,7 @@ pixel_y = -2 }, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "xVr" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -70548,7 +70505,7 @@ dir = 4 }, /turf/open/floor/iron/white, -/area/station/science/mixing) +/area/station/science/ordnance) "xVx" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 @@ -70700,7 +70657,7 @@ pixel_x = 3 }, /turf/open/floor/iron/dark, -/area/station/science/mixing/launch) +/area/station/science/ordnance/testlab) "xWu" = ( /obj/machinery/status_display/shuttle, /turf/closed/wall, @@ -70736,11 +70693,9 @@ /obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer2{ dir = 8 }, -/obj/machinery/air_sensor{ - chamber_id = "ordnancegas2" - }, +/obj/machinery/air_sensor/ordnance_freezer_chamber, /turf/open/floor/iron/dark/airless, -/area/station/science/mixing/chamber) +/area/station/science/ordnance/freezerchamber) "xWX" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -70903,7 +70858,7 @@ dir = 5 }, /turf/open/floor/plating/airless, -/area/station/science/test_area) +/area/station/science/ordnance/bomb) "xZZ" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -71082,9 +71037,7 @@ "ydC" = ( /obj/structure/cable/multilayer/multiz, /obj/effect/decal/cleanable/dirt, -/obj/structure/sign/warning/electric_shock{ - pixel_y = -32 - }, +/obj/structure/sign/warning/electric_shock/directional/south, /obj/effect/turf_decal/stripes/end{ dir = 1 }, @@ -71418,9 +71371,7 @@ /area/station/hallway/secondary/exit) "yiW" = ( /obj/effect/turf_decal/trimline/purple/filled/line, -/obj/structure/sign/departments/xenobio{ - pixel_y = -32 - }, +/obj/structure/sign/departments/xenobio/directional/south, /turf/open/floor/iron/white, /area/station/science/research) "yiX" = ( @@ -85831,8 +85782,8 @@ dhe dhe dhe dhe -oEN -oEN +rDZ +rDZ gfK rbP rbP @@ -85840,8 +85791,8 @@ reV rbP rbP gfK -oEN -oEN +rDZ +rDZ dhe dhe dhe @@ -86088,17 +86039,17 @@ dhe dhe dhe dhe -oEN +rDZ eXj sAf -gvI +sEx uui blY lyp -gvI +sEx mqF iWW -oEN +rDZ dhe dhe dhe @@ -86345,17 +86296,17 @@ dhe dhe dhe dhe -oEN +rDZ vwM prU mpI bBR -eLY +iEY eZx snV vdN aph -oEN +rDZ dhe dhe dhe @@ -86602,17 +86553,17 @@ dhe dhe dhe dhe -oEN -gvI -gvI -gvI +rDZ +sEx +sEx +sEx uoO -eLY -ung -gvI -gvI -gvI -oEN +iEY +xvP +sEx +sEx +sEx +rDZ dhe dhe dhe @@ -86859,17 +86810,17 @@ dhe dhe dhe dhe -oEN +rDZ eXj sAf -gvI +sEx ddS -eLY +iEY and -gvI +sEx mqF iWW -oEN +rDZ dhe dhe dhe @@ -87116,17 +87067,17 @@ dhe dhe dhe dhe -oEN +rDZ vwM prU rJp bBR -eLY +iEY eZx tbh vdN aph -oEN +rDZ dhe dhe dhe @@ -87373,19 +87324,19 @@ dhe dhe dhe dhe -oEN -oEN -oEN -oEN +rDZ +rDZ +rDZ +rDZ cTG nyU gpV -gvI -gvI -gvI -oEN -oEN -oEN +sEx +sEx +sEx +rDZ +rDZ +rDZ dhe dhe dhe @@ -87633,17 +87584,17 @@ dhe dhe dhe dhe -oEN -oEN -gvI +rDZ +rDZ +sEx xuY -gvI +sEx gPJ otF gPJ gPJ -oEN -oEN +rDZ +rDZ dhe dhe dhe @@ -87891,7 +87842,7 @@ dhe dhe dhe dhe -oEN +rDZ uui som rqe @@ -87900,8 +87851,8 @@ kYn kYn kYn lyp -oEN -oEN +rDZ +rDZ dhe dhe dhe @@ -88148,21 +88099,21 @@ dhe dhe dhe dhe -oEN -rAZ -eLY +rDZ +tAQ +iEY poT -rBz -rBz -rBz -rBz -ung +vBY +vBY +vBY +vBY +xvP gPJ -oEN -oEN -oEN -oEN -oEN +rDZ +rDZ +rDZ +rDZ +rDZ dhe dhe dhe @@ -88405,21 +88356,21 @@ dhe dhe dhe dhe -oEN +rDZ dBH sQH kWJ ctc mCV jjc -eLY -ung +iEY +xvP qpE -oEN +rDZ lcl ohC xEx -oEN +rDZ dhe dhe dhe @@ -88662,21 +88613,21 @@ dDG dhe dhe dhe -oEN -rAZ +rDZ +tAQ xiq rpn guX -oEN +rDZ gck -eLY +iEY kSG jTg iYf vDW oyZ qwR -oEN +rDZ dhe dhe dhe @@ -88919,21 +88870,21 @@ dDG dDG dDG dhe -oEN -rAZ +rDZ +tAQ xiq rpn guX -oEN +rDZ ddS oie rWj ied -oEN +rDZ rHe hTO xEx -oEN +rDZ dhe dhe dhe @@ -89176,14 +89127,14 @@ vfU vfU vfU dhe -oEN -rAZ +rDZ +tAQ xiq rpn guX -oEN +rDZ pWh -fdW +mhc scN gJM oVM @@ -93035,8 +92986,8 @@ gvI gvI gOa gvI -rAZ -lAA +ogQ +lwe lnZ gYl vOM @@ -99037,10 +98988,10 @@ pDT sLE aRN xFs -lvw -lvw +igy +igy tRC -lvw +igy xFs vXM vXM @@ -99295,8 +99246,8 @@ sLE aRN aRN kfR -aRN -aRN +sqz +sqz kUk aRN vXM @@ -99551,9 +99502,9 @@ pDT sLE aRN xFs -lvw +igy tRC -lvw +igy tRC xFs vXM @@ -99808,7 +99759,7 @@ pKr sLE aRN dhe -dhe +igy dhe dhe dhe @@ -100065,7 +100016,7 @@ pDT sLE aRN dhe -dhe +igy dhe dhe dDG @@ -101277,7 +101228,7 @@ hFr hFr hFr hFr -ndi +hFr lko oUL hov @@ -103606,9 +103557,9 @@ rKD cMT iui mgX -mgX -mgX -mgX +omk +omk +omk mgX rCM pcu @@ -107209,12 +107160,12 @@ kFp kFp qvL nWZ -pca nWZ nWZ nWZ nWZ nWZ +pca nWZ nWZ nWZ @@ -107466,7 +107417,7 @@ kFp kFp qvL nWZ -pca +nWZ nWZ nWZ nWZ @@ -118012,16 +117963,16 @@ rmP oys cFr xWQ -rmk +lVa mAV qTZ rDX erC -jYd +aLW eIT -jYd -jYd -jYd +aLW +aLW +aLW jTQ cEl luq @@ -118524,12 +118475,12 @@ aBX cxi ksh oys -rmk +lVa cFF -rmk +lVa tMu xVr -tQc +rDX efH cnL fBl @@ -119043,7 +118994,7 @@ aJC ruv iAU nPg -tQc +rDX jFi xeH cgk @@ -119300,7 +119251,7 @@ ebu ieK ieK scv -tQc +rDX jFi xeH cgk @@ -119557,7 +119508,7 @@ ieK ieK cKQ muZ -tQc +rDX tQc tQc tQc @@ -119814,7 +119765,7 @@ ieK uOO dSM gbd -eqF +rDX cmH vNA pHl @@ -120071,7 +120022,7 @@ bRs pit rmk kZq -eqF +rDX rID dbu dbu @@ -154758,7 +154709,7 @@ ook yiM rjD yiM -fsZ +fpg jsO ddh mQp @@ -157098,7 +157049,7 @@ iUs dCz jKx whg -rEu +uft rEu tXn tCi @@ -158112,7 +158063,7 @@ qOF fwF ufO rEZ -eMY +hep eMY ufO wcy @@ -161210,7 +161161,7 @@ dCh xJj rBC xJj -oWV +beX xJj oWV wgT @@ -168886,7 +168837,7 @@ dhw vSM wgz rPU -sOY +hQn biX adD vIq @@ -172247,7 +172198,7 @@ bFq bFq ksB iYm -uOl +jfY uOl xKH ugt @@ -179405,12 +179356,12 @@ dJV dJV dJV nkJ -kCL +aFo fLY owZ aXZ kMW -iYb +jtL trs whL een @@ -179667,7 +179618,7 @@ puE tjJ aYG kRG -dFS +iYb trs whL mpA @@ -179921,7 +179872,7 @@ gKj qHM aFo sxj -aWh +jFj aWh fza aWh @@ -180977,7 +180928,7 @@ wBb aSw nBM nUy -rHj +pAL uuQ lIs dxk @@ -181491,7 +181442,7 @@ tSr vFF pKJ nUy -rHj +pAL uuQ lIs iAp @@ -182264,9 +182215,9 @@ sRZ sRZ oxL oxL -rHj +tfZ tEC -rHj +tfZ tPZ tPZ rYk diff --git a/_maps/shuttles/cargo_kilo.dmm b/_maps/shuttles/cargo_kilo.dmm index b374b07efcba04..5a7c0d1c63c41c 100644 --- a/_maps/shuttles/cargo_kilo.dmm +++ b/_maps/shuttles/cargo_kilo.dmm @@ -176,9 +176,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/structure/sign/departments/cargo{ - pixel_x = 32 - }, +/obj/structure/sign/departments/cargo/directional/east, /turf/open/floor/mineral/titanium/yellow, /area/shuttle/supply) "r" = ( diff --git a/_maps/shuttles/emergency_bar.dmm b/_maps/shuttles/emergency_bar.dmm index cd3a60a2fc5a19..4beb57538eefca 100644 --- a/_maps/shuttles/emergency_bar.dmm +++ b/_maps/shuttles/emergency_bar.dmm @@ -160,9 +160,7 @@ /turf/open/floor/iron, /area/shuttle/escape) "aF" = ( -/obj/structure/musician/piano{ - icon_state = "piano" - }, +/obj/structure/musician/piano, /turf/open/floor/iron/grimy, /area/shuttle/escape) "aG" = ( diff --git a/_maps/shuttles/emergency_casino.dmm b/_maps/shuttles/emergency_casino.dmm index 2a16770dfb8a4c..664b1151d2e279 100644 --- a/_maps/shuttles/emergency_casino.dmm +++ b/_maps/shuttles/emergency_casino.dmm @@ -288,9 +288,7 @@ /obj/structure/chair/comfy/shuttle{ dir = 4 }, -/obj/structure/sign/warning/vacuum/external{ - pixel_y = 32 - }, +/obj/structure/sign/warning/vacuum/external/directional/north, /turf/open/floor/mineral/titanium, /area/shuttle/escape) "iz" = ( @@ -385,9 +383,7 @@ "kM" = ( /obj/structure/reagent_dispensers/fueltank, /obj/effect/turf_decal/delivery, -/obj/structure/sign/warning/explosives{ - pixel_y = 32 - }, +/obj/structure/sign/warning/explosives/directional/north, /turf/open/floor/mineral/titanium, /area/shuttle/escape) "kO" = ( @@ -1000,9 +996,7 @@ /obj/structure/window/reinforced/tinted{ dir = 8 }, -/obj/structure/sign/warning/vacuum{ - pixel_y = 32 - }, +/obj/structure/sign/warning/vacuum/directional/north, /turf/open/floor/iron, /area/shuttle/escape) "Cz" = ( @@ -1095,9 +1089,7 @@ /obj/structure/window/reinforced/tinted{ dir = 4 }, -/obj/structure/sign/warning/vacuum{ - pixel_y = 32 - }, +/obj/structure/sign/warning/vacuum/directional/north, /turf/open/floor/carpet/green, /area/shuttle/escape) "Fv" = ( @@ -1397,9 +1389,7 @@ "QY" = ( /obj/structure/chair/stool/directional/north, /obj/effect/turf_decal/siding/wood, -/obj/structure/sign/departments/security{ - pixel_y = -32 - }, +/obj/structure/sign/departments/security/directional/south, /turf/open/floor/wood, /area/shuttle/escape) "Ru" = ( @@ -1547,9 +1537,7 @@ /turf/open/floor/mineral/titanium, /area/shuttle/escape) "XW" = ( -/obj/structure/sign/departments/medbay/alt{ - pixel_y = -32 - }, +/obj/structure/sign/departments/medbay/alt/directional/south, /obj/machinery/light/directional/south, /obj/structure/closet/crate/bin, /obj/structure/window/reinforced/tinted{ diff --git a/_maps/shuttles/emergency_cere.dmm b/_maps/shuttles/emergency_cere.dmm index 5b86760a5fb7da..b69d9c7a0e8f77 100644 --- a/_maps/shuttles/emergency_cere.dmm +++ b/_maps/shuttles/emergency_cere.dmm @@ -554,8 +554,7 @@ /turf/open/floor/iron, /area/shuttle/escape) "cb" = ( -/obj/structure/sign/departments/medbay/alt{ - pixel_x = 32; +/obj/structure/sign/departments/medbay/alt/directional/east{ pixel_y = -32 }, /turf/open/floor/iron, @@ -1032,9 +1031,7 @@ /turf/open/floor/iron, /area/shuttle/escape) "di" = ( -/obj/structure/sign/warning/electric_shock{ - pixel_x = 32 - }, +/obj/structure/sign/warning/electric_shock/directional/east, /obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/yellow{ dir = 4 @@ -1065,9 +1062,7 @@ /area/shuttle/escape) "dl" = ( /obj/structure/table, -/obj/structure/sign/warning/engine_safety{ - pixel_y = -32 - }, +/obj/structure/sign/warning/engine_safety/directional/south, /obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/yellow{ dir = 8 diff --git a/_maps/shuttles/emergency_donut.dmm b/_maps/shuttles/emergency_donut.dmm index 28333e07056677..ce2da499366f72 100644 --- a/_maps/shuttles/emergency_donut.dmm +++ b/_maps/shuttles/emergency_donut.dmm @@ -275,9 +275,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "aY" = ( -/obj/structure/sign/departments/medbay/alt{ - pixel_y = -32 - }, +/obj/structure/sign/departments/medbay/alt/directional/south, /turf/open/floor/mineral/titanium, /area/shuttle/escape) "aZ" = ( diff --git a/_maps/shuttles/emergency_kilo.dmm b/_maps/shuttles/emergency_kilo.dmm index c04639a4e7e3fc..f178543f7a51b0 100644 --- a/_maps/shuttles/emergency_kilo.dmm +++ b/_maps/shuttles/emergency_kilo.dmm @@ -215,9 +215,7 @@ /obj/effect/turf_decal/stripes/end{ dir = 4 }, -/obj/structure/sign/warning/vacuum/external{ - pixel_y = 32 - }, +/obj/structure/sign/warning/vacuum/external/directional/north, /turf/open/floor/mineral/titanium/yellow, /area/shuttle/escape) "az" = ( @@ -743,9 +741,7 @@ /turf/open/floor/mineral/plastitanium, /area/shuttle/escape) "bv" = ( -/obj/structure/sign/departments/security{ - pixel_y = 32 - }, +/obj/structure/sign/departments/security/directional/north, /obj/machinery/light/directional/north, /obj/effect/turf_decal/bot, /obj/structure/chair/comfy/shuttle, @@ -772,9 +768,7 @@ /turf/open/floor/mineral/titanium/white, /area/shuttle/escape) "by" = ( -/obj/structure/sign/departments/engineering{ - pixel_y = 32 - }, +/obj/structure/sign/departments/engineering/directional/north, /obj/machinery/light/directional/north, /obj/effect/turf_decal/bot, /obj/structure/chair/comfy/shuttle, diff --git a/_maps/shuttles/emergency_luxury.dmm b/_maps/shuttles/emergency_luxury.dmm index 1c47bddf8328c6..0d82c5664c34bf 100644 --- a/_maps/shuttles/emergency_luxury.dmm +++ b/_maps/shuttles/emergency_luxury.dmm @@ -643,9 +643,7 @@ /turf/open/floor/carpet/orange, /area/shuttle/escape/luxury) "ci" = ( -/obj/structure/musician/piano{ - icon_state = "piano" - }, +/obj/structure/musician/piano, /turf/open/floor/carpet/green, /area/shuttle/escape/luxury) "cj" = ( diff --git a/_maps/shuttles/emergency_medisim.dmm b/_maps/shuttles/emergency_medisim.dmm index 595a4da1c76de9..1d9947c2db41e6 100644 --- a/_maps/shuttles/emergency_medisim.dmm +++ b/_maps/shuttles/emergency_medisim.dmm @@ -18,9 +18,7 @@ /turf/closed/indestructible/fakeglass, /area/shuttle/escape/simulation) "aS" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_x = -32 - }, +/obj/structure/sign/warning/vacuum/external/directional/west, /obj/structure/closet/emcloset, /turf/open/floor/mineral/titanium/white, /area/shuttle/escape) @@ -1276,9 +1274,7 @@ }, /obj/item/crowbar, /obj/item/storage/medkit/fire, -/obj/structure/sign/warning/vacuum/external{ - pixel_y = 32 - }, +/obj/structure/sign/warning/vacuum/external/directional/north, /obj/machinery/light/directional/east, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) @@ -1295,9 +1291,7 @@ "YB" = ( /obj/structure/table, /obj/machinery/recharger, -/obj/structure/sign/warning/vacuum/external{ - pixel_y = -32 - }, +/obj/structure/sign/warning/vacuum/external/directional/south, /obj/machinery/light/directional/east, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) diff --git a/_maps/shuttles/emergency_meteor.dmm b/_maps/shuttles/emergency_meteor.dmm index adb6c318ca4601..1c40712f9e0aa4 100644 --- a/_maps/shuttles/emergency_meteor.dmm +++ b/_maps/shuttles/emergency_meteor.dmm @@ -3,7 +3,7 @@ /turf/template_noop, /area/template_noop) "b" = ( -/turf/closed/mineral, +/turf/closed/mineral/asteroid/porous, /area/shuttle/escape/meteor) "c" = ( /obj/structure/window/reinforced{ @@ -67,7 +67,7 @@ /obj/docking_port/mobile/emergency{ dwidth = 20; height = 40; - movement_force = list("KNOCKDOWN" = 3, "THROW" = 6); + movement_force = list("KNOCKDOWN"=3,"THROW"=6); name = "\proper a meteor with engines strapped to it"; width = 40 }, diff --git a/_maps/shuttles/emergency_monastery.dmm b/_maps/shuttles/emergency_monastery.dmm index fcfb1686b634b5..9f008074fc6348 100644 --- a/_maps/shuttles/emergency_monastery.dmm +++ b/_maps/shuttles/emergency_monastery.dmm @@ -564,10 +564,6 @@ }, /turf/open/floor/iron/dark, /area/shuttle/escape) -"io" = ( -/obj/structure/lattice, -/turf/closed/mineral, -/area/shuttle/escape) "it" = ( /obj/structure/flora/bush/flowers_yw/style_random, /obj/structure/flora/bush/sparsegrass/style_random, @@ -2723,9 +2719,7 @@ /turf/open/floor/iron/dark, /area/shuttle/escape) "Ll" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_y = 32 - }, +/obj/structure/sign/warning/vacuum/external/directional/north, /obj/machinery/light/small/directional/north, /turf/open/floor/plating, /area/shuttle/escape) @@ -2962,9 +2956,7 @@ /area/shuttle/escape) "Oi" = ( /obj/machinery/light/small/directional/west, -/obj/structure/sign/warning/vacuum/external{ - pixel_x = -32 - }, +/obj/structure/sign/warning/vacuum/external/directional/west, /obj/machinery/camera/directional/west{ c_tag = "Monastery Cemetery"; network = list("ss13","monastery") @@ -5313,7 +5305,7 @@ Ho Ho Ho Ho -io +Ho JG JG JG @@ -5400,7 +5392,7 @@ JG JG JG Ho -io +Ho Ho Ho Ho @@ -5473,9 +5465,9 @@ JG Ho Ho Ho -io Ho -io +Ho +Ho JG PB JG @@ -5568,7 +5560,7 @@ PB JG Ho Ho -io +Ho Ho Ho Ho @@ -6147,7 +6139,7 @@ zE PB PB PB -io +Ho Ho Ho JG @@ -6556,7 +6548,7 @@ nr PB PB PB -io +Ho Ho Ho Pb @@ -6800,7 +6792,7 @@ PB PB PB PB -io +Ho Ho Ho Ho @@ -7036,7 +7028,7 @@ JG PB Ho Ho -io +Ho Ho PB JG @@ -7115,14 +7107,14 @@ JG PB JG Ho -io Ho Ho Ho Ho -io Ho -io +Ho +Ho +Ho Ho Ho Ho @@ -7194,7 +7186,7 @@ Ho JG JG JG -io +Ho Ho Ho Ho diff --git a/_maps/shuttles/emergency_nature.dmm b/_maps/shuttles/emergency_nature.dmm index 6a96a68c2a6288..b46a659ae2966e 100644 --- a/_maps/shuttles/emergency_nature.dmm +++ b/_maps/shuttles/emergency_nature.dmm @@ -69,9 +69,7 @@ /obj/effect/turf_decal/trimline/green/filled/line{ dir = 5 }, -/obj/structure/sign/warning/no_smoking{ - pixel_y = 32 - }, +/obj/structure/sign/warning/no_smoking/directional/north, /turf/open/floor/iron/white, /area/shuttle/escape) "cZ" = ( @@ -103,17 +101,15 @@ /obj/structure/chair/comfy/shuttle{ dir = 1 }, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/shuttle/escape) "eq" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, /area/shuttle/escape) "ev" = ( /obj/effect/turf_decal/trimline/green/filled/corner, @@ -371,9 +367,8 @@ dir = 8 }, /obj/structure/grille/broken, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/shuttle/escape) "lS" = ( /obj/effect/turf_decal/trimline/red/filled/line{ @@ -413,9 +408,7 @@ /obj/effect/turf_decal/trimline/green/filled/line{ dir = 9 }, -/obj/structure/sign/warning/no_smoking{ - pixel_y = 32 - }, +/obj/structure/sign/warning/no_smoking/directional/north, /turf/open/floor/iron/white, /area/shuttle/escape) "mq" = ( @@ -874,18 +867,8 @@ /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 1 }, -/turf/open/floor/iron{ - icon_state = "floorscorched1" - }, -/area/shuttle/escape) -"Hi" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/chair/comfy/shuttle{ - dir = 1 - }, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/iron, /area/shuttle/escape) "Hq" = ( /obj/structure/flora/rock/pile/style_random, @@ -1079,9 +1062,8 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/shuttle/escape) "QO" = ( /obj/effect/turf_decal/weather/dirt{ @@ -1730,7 +1712,7 @@ HV Zd Yu Um -Hi +dT Jw gx gx diff --git a/_maps/shuttles/emergency_omega.dmm b/_maps/shuttles/emergency_omega.dmm index e6150bb088a7c0..d33175634c9c0a 100644 --- a/_maps/shuttles/emergency_omega.dmm +++ b/_maps/shuttles/emergency_omega.dmm @@ -407,9 +407,7 @@ /obj/item/folder/yellow, /obj/item/pen, /obj/item/hand_labeler_refill, -/obj/structure/sign/warning/no_smoking/circle{ - pixel_x = -32 - }, +/obj/structure/sign/warning/no_smoking/circle/directional/west, /obj/item/radio/intercom/directional/south, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/bot, diff --git a/_maps/shuttles/emergency_raven.dmm b/_maps/shuttles/emergency_raven.dmm index 1f729243884cd3..1257373351fa4b 100644 --- a/_maps/shuttles/emergency_raven.dmm +++ b/_maps/shuttles/emergency_raven.dmm @@ -1860,9 +1860,7 @@ /turf/open/floor/plating, /area/shuttle/escape) "dL" = ( -/obj/structure/sign/warning/electric_shock{ - pixel_y = 32 - }, +/obj/structure/sign/warning/electric_shock/directional/north, /turf/open/floor/plating, /area/shuttle/escape) "dM" = ( diff --git a/_maps/shuttles/infiltrator_advanced.dmm b/_maps/shuttles/infiltrator_advanced.dmm index 4a7910a45f7ec5..c976a478f3fb26 100644 --- a/_maps/shuttles/infiltrator_advanced.dmm +++ b/_maps/shuttles/infiltrator_advanced.dmm @@ -786,8 +786,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 }, -/obj/structure/sign/departments/medbay/alt{ - pixel_x = -32; +/obj/structure/sign/departments/medbay/alt/directional/west{ pixel_y = -32 }, /turf/open/floor/mineral/plastitanium, @@ -1527,9 +1526,7 @@ /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/airlock) "do" = ( -/obj/structure/sign/departments/engineering{ - pixel_x = 32 - }, +/obj/structure/sign/departments/engineering/directional/east, /obj/effect/turf_decal/bot, /obj/effect/turf_decal/caution/stand_clear, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, @@ -1577,9 +1574,7 @@ /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/armory) "dt" = ( -/obj/structure/sign/departments/medbay/alt{ - pixel_x = -32 - }, +/obj/structure/sign/departments/medbay/alt/directional/west, /obj/effect/turf_decal/bot, /obj/effect/turf_decal/caution/stand_clear, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, @@ -1774,9 +1769,7 @@ }, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/delivery, -/obj/structure/sign/warning/electric_shock{ - pixel_y = 32 - }, +/obj/structure/sign/warning/electric_shock/directional/north, /obj/effect/decal/cleanable/dirt, /obj/machinery/light/directional/north, /obj/structure/cable, @@ -1857,8 +1850,7 @@ dir = 8 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/sign/departments/engineering{ - pixel_x = 32; +/obj/structure/sign/departments/engineering/directional/east{ pixel_y = -32 }, /obj/effect/decal/cleanable/dirt, @@ -2183,10 +2175,6 @@ "ev" = ( /turf/closed/wall/mineral/plastitanium/nodiagonal, /area/shuttle/syndicate/hallway) -"AO" = ( -/obj/machinery/door/airlock/hatch, -/turf/closed/wall/r_wall/syndicate, -/area/shuttle/syndicate/airlock) (1,1,1) = {" ad @@ -2308,7 +2296,7 @@ ad ad ad ad -AO +aO aI aP bC diff --git a/_maps/shuttles/infiltrator_basic.dmm b/_maps/shuttles/infiltrator_basic.dmm index 81affafecd1249..f0868fd75773dd 100644 --- a/_maps/shuttles/infiltrator_basic.dmm +++ b/_maps/shuttles/infiltrator_basic.dmm @@ -679,9 +679,7 @@ "hT" = ( /obj/machinery/light/directional/east, /obj/effect/turf_decal/syndicateemblem/bottom/right, -/obj/structure/sign/departments/engineering{ - pixel_x = 32 - }, +/obj/structure/sign/departments/engineering/directional/east, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/hallway) "iE" = ( @@ -808,9 +806,7 @@ "ug" = ( /obj/machinery/light/directional/west, /obj/effect/turf_decal/syndicateemblem/bottom/left, -/obj/structure/sign/departments/medbay/alt{ - pixel_x = -32 - }, +/obj/structure/sign/departments/medbay/alt/directional/west, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/hallway) "vl" = ( diff --git a/_maps/shuttles/mining_kilo.dmm b/_maps/shuttles/mining_kilo.dmm index ff3cc154c6f215..4ca83cc22a172c 100644 --- a/_maps/shuttles/mining_kilo.dmm +++ b/_maps/shuttles/mining_kilo.dmm @@ -297,9 +297,7 @@ /turf/open/floor/plating, /area/shuttle/mining/large) "K" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_x = 32 - }, +/obj/structure/sign/warning/vacuum/external/directional/east, /obj/structure/cable, /obj/effect/turf_decal/stripes/line{ dir = 8 diff --git a/_maps/shuttles/mining_large.dmm b/_maps/shuttles/mining_large.dmm index 26b769aad2c031..0519e570a11b46 100644 --- a/_maps/shuttles/mining_large.dmm +++ b/_maps/shuttles/mining_large.dmm @@ -427,9 +427,7 @@ /turf/open/floor/plating/airless, /area/shuttle/mining/large) "H" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_x = 32 - }, +/obj/structure/sign/warning/vacuum/external/directional/east, /obj/structure/cable, /turf/open/floor/plating, /area/shuttle/mining/large) diff --git a/_maps/shuttles/pirate_default.dmm b/_maps/shuttles/pirate_default.dmm index e337a20f030eee..8df567835d5e45 100644 --- a/_maps/shuttles/pirate_default.dmm +++ b/_maps/shuttles/pirate_default.dmm @@ -23,6 +23,13 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, +/obj/item/gun/energy/laser{ + pixel_x = -3; + pixel_y = 6 + }, +/obj/item/gun/energy/laser{ + pixel_y = 3 + }, /turf/open/floor/iron/dark, /area/shuttle/pirate) "ac" = ( @@ -349,9 +356,7 @@ /area/shuttle/pirate) "aI" = ( /obj/machinery/light/small/directional/west, -/obj/structure/sign/warning/vacuum/external{ - pixel_x = -32 - }, +/obj/structure/sign/warning/vacuum/external/directional/west, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/shuttle/pirate) @@ -523,13 +528,8 @@ }, /obj/effect/decal/cleanable/dirt, /obj/structure/table, -/obj/item/gun/energy/laser{ - pixel_x = -3; - pixel_y = 6 - }, -/obj/item/gun/energy/laser{ - pixel_y = 3 - }, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high, /turf/open/floor/pod/light, /area/shuttle/pirate) "bm" = ( @@ -538,9 +538,7 @@ /area/shuttle/pirate) "bo" = ( /obj/machinery/light/small/directional/east, -/obj/structure/sign/warning/vacuum/external{ - pixel_x = 32 - }, +/obj/structure/sign/warning/vacuum/external/directional/east, /turf/open/floor/plating, /area/shuttle/pirate) "br" = ( diff --git a/_maps/shuttles/pirate_silverscale.dmm b/_maps/shuttles/pirate_silverscale.dmm index 03e1630574fed0..1b0f2df6e0b919 100644 --- a/_maps/shuttles/pirate_silverscale.dmm +++ b/_maps/shuttles/pirate_silverscale.dmm @@ -612,9 +612,7 @@ /turf/open/floor/plating, /area/shuttle/pirate) "HS" = ( -/obj/structure/musician/piano{ - icon_state = "piano" - }, +/obj/structure/musician/piano, /obj/machinery/light/directional/west, /turf/open/floor/iron/dark, /area/shuttle/pirate) diff --git a/_maps/shuttles/ruin_caravan_victim.dmm b/_maps/shuttles/ruin_caravan_victim.dmm index 9d1d6a721f88d2..456cfaa86bd2be 100644 --- a/_maps/shuttles/ruin_caravan_victim.dmm +++ b/_maps/shuttles/ruin_caravan_victim.dmm @@ -232,9 +232,8 @@ /obj/effect/turf_decal/box/white/corners{ dir = 1 }, -/turf/open/floor/iron/airless{ - icon_state = "damaged4" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/shuttle/caravan/freighter1) "lC" = ( /obj/machinery/power/port_gen/pacman{ @@ -251,9 +250,7 @@ /area/shuttle/caravan/freighter1) "lM" = ( /obj/machinery/light/small/directional/west, -/obj/structure/sign/warning/vacuum{ - pixel_x = 32 - }, +/obj/structure/sign/warning/vacuum/directional/east, /turf/open/floor/plating, /area/shuttle/caravan/freighter1) "mo" = ( @@ -429,9 +426,8 @@ /area/shuttle/caravan/freighter1) "ur" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/shuttle/caravan/freighter1) "vt" = ( /obj/structure/shuttle/engine/propulsion/burst{ @@ -443,9 +439,8 @@ /obj/effect/turf_decal/box/white/corners{ dir = 4 }, -/turf/open/floor/iron/airless{ - icon_state = "damaged5" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/shuttle/caravan/freighter1) "xG" = ( /obj/machinery/light/small/directional/south, @@ -517,15 +512,13 @@ /area/shuttle/caravan/freighter1) "zy" = ( /obj/structure/girder, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/shuttle/caravan/freighter1) "Ax" = ( /obj/item/stack/sheet/iron/fifty, -/turf/open/floor/iron/airless{ - icon_state = "floorscorched2" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/iron/airless, /area/shuttle/caravan/freighter1) "AM" = ( /obj/machinery/door/firedoor, @@ -561,9 +554,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/turf/open/floor/iron/airless{ - icon_state = "damaged1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/shuttle/caravan/freighter1) "BN" = ( /obj/machinery/door/firedoor, @@ -579,9 +571,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/turf/open/floor/iron/airless{ - icon_state = "floorscorched1" - }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/iron/airless, /area/shuttle/caravan/freighter1) "Dt" = ( /obj/effect/decal/cleanable/dirt, @@ -791,9 +782,8 @@ name = "Cargo Blast Door" }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/shuttle/caravan/freighter1) "Od" = ( /obj/effect/decal/cleanable/dirt, @@ -820,12 +810,6 @@ initial_gas_mix = "TEMP=2.7" }, /area/shuttle/caravan/freighter1) -"Ov" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless{ - icon_state = "damaged2" - }, -/area/shuttle/caravan/freighter1) "Ow" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/computer/shuttle/caravan/trade1{ @@ -894,15 +878,13 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 }, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/shuttle/caravan/freighter1) "Su" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless{ - icon_state = "damaged3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/shuttle/caravan/freighter1) "SO" = ( /obj/machinery/door/airlock{ @@ -935,9 +917,8 @@ pixel_x = 24 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, /area/shuttle/caravan/freighter1) "VD" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper, @@ -999,9 +980,8 @@ /obj/structure/closet/crate, /obj/item/stack/sheet/plasteel/twenty, /obj/item/stack/sheet/plasteel/twenty, -/turf/open/floor/iron/airless{ - icon_state = "damaged5" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, /area/shuttle/caravan/freighter1) "WZ" = ( /obj/machinery/power/smes, @@ -1178,7 +1158,7 @@ El El CU xz -Ov +Su Td ur "} diff --git a/_maps/shuttles/ruin_pirate_cutter.dmm b/_maps/shuttles/ruin_pirate_cutter.dmm index 1493a75e32cc86..8a4499c60f17b2 100644 --- a/_maps/shuttles/ruin_pirate_cutter.dmm +++ b/_maps/shuttles/ruin_pirate_cutter.dmm @@ -813,9 +813,7 @@ /area/shuttle/caravan/pirate) "Sd" = ( /obj/machinery/light/small/directional/west, -/obj/structure/sign/warning/vacuum{ - pixel_x = -32 - }, +/obj/structure/sign/warning/vacuum/directional/west, /turf/open/floor/plating, /area/shuttle/caravan/pirate) "Sk" = ( diff --git a/_maps/shuttles/ruin_syndicate_dropship.dmm b/_maps/shuttles/ruin_syndicate_dropship.dmm index 314a627e061b6a..0a5d1544221b4f 100644 --- a/_maps/shuttles/ruin_syndicate_dropship.dmm +++ b/_maps/shuttles/ruin_syndicate_dropship.dmm @@ -311,9 +311,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/structure/sign/warning/vacuum{ - pixel_y = -32 - }, +/obj/structure/sign/warning/vacuum/directional/south, /obj/effect/decal/cleanable/dirt, /obj/structure/closet/syndicate{ anchored = 1 @@ -385,9 +383,7 @@ /obj/structure/closet/syndicate{ anchored = 1 }, -/obj/structure/sign/warning/vacuum{ - pixel_y = 32 - }, +/obj/structure/sign/warning/vacuum/directional/north, /obj/effect/decal/cleanable/dirt, /obj/item/clothing/shoes/sneakers/black, /turf/open/floor/mineral/plastitanium, diff --git a/_maps/shuttles/whiteship_box.dmm b/_maps/shuttles/whiteship_box.dmm index 5ae5fdbdf03cdc..9aa668e2fe7cff 100644 --- a/_maps/shuttles/whiteship_box.dmm +++ b/_maps/shuttles/whiteship_box.dmm @@ -41,9 +41,7 @@ /turf/open/floor/plating, /area/shuttle/abandoned/medbay) "aj" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_x = 32 - }, +/obj/structure/sign/warning/vacuum/external/directional/east, /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/light/small/directional/west, /turf/open/floor/plating, @@ -575,9 +573,7 @@ /turf/open/floor/plating, /area/shuttle/abandoned/engine) "bi" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_y = -32 - }, +/obj/structure/sign/warning/vacuum/external/directional/south, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating, /area/shuttle/abandoned/engine) @@ -1161,9 +1157,7 @@ /turf/open/floor/plating, /area/shuttle/abandoned/engine) "cq" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_y = 32 - }, +/obj/structure/sign/warning/vacuum/external/directional/north, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating, /area/shuttle/abandoned/engine) @@ -1732,9 +1726,7 @@ }, /area/shuttle/abandoned/medbay) "ds" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_x = 32 - }, +/obj/structure/sign/warning/vacuum/external/directional/east, /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/light/small/built/directional/east, /turf/open/floor/plating, diff --git a/_maps/shuttles/whiteship_delta.dmm b/_maps/shuttles/whiteship_delta.dmm index 8f0dd184c418be..6cd1246360cb7e 100644 --- a/_maps/shuttles/whiteship_delta.dmm +++ b/_maps/shuttles/whiteship_delta.dmm @@ -111,9 +111,7 @@ /turf/open/floor/plating, /area/shuttle/abandoned/crew) "ao" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_x = 32 - }, +/obj/structure/sign/warning/vacuum/external/directional/east, /obj/machinery/light/small/built/directional/east, /turf/open/floor/plating, /area/shuttle/abandoned/crew) @@ -1788,9 +1786,7 @@ /turf/open/floor/plating, /area/shuttle/abandoned/medbay) "dT" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_x = 32 - }, +/obj/structure/sign/warning/vacuum/external/directional/east, /obj/machinery/light/small/built/directional/east, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating, diff --git a/_maps/shuttles/whiteship_kilo.dmm b/_maps/shuttles/whiteship_kilo.dmm index 6d011258f29333..a463d21095b2ce 100644 --- a/_maps/shuttles/whiteship_kilo.dmm +++ b/_maps/shuttles/whiteship_kilo.dmm @@ -62,8 +62,7 @@ dir = 1 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/sign/warning/vacuum{ - pixel_x = -32; +/obj/structure/sign/warning/vacuum/directional/west{ pixel_y = 32 }, /obj/machinery/meter, @@ -122,9 +121,7 @@ "am" = ( /obj/effect/turf_decal/bot, /obj/structure/closet/emcloset/anchored, -/obj/structure/sign/warning/xeno_mining{ - pixel_y = 32 - }, +/obj/structure/sign/warning/xeno_mining/directional/north, /obj/machinery/firealarm/directional/east, /obj/machinery/light/small/directional/north, /obj/effect/decal/cleanable/cobweb, @@ -442,9 +439,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 5 }, -/obj/structure/sign/warning/electric_shock{ - pixel_y = 32 - }, +/obj/structure/sign/warning/electric_shock/directional/north, /obj/machinery/airalarm/all_access{ dir = 4; pixel_x = 24 @@ -692,9 +687,7 @@ "bm" = ( /obj/effect/turf_decal/bot, /obj/structure/closet/emcloset/anchored, -/obj/structure/sign/warning/vacuum/external{ - pixel_x = -32 - }, +/obj/structure/sign/warning/vacuum/external/directional/west, /obj/machinery/airalarm/all_access{ pixel_y = -24 }, @@ -1157,9 +1150,8 @@ /obj/effect/decal/cleanable/cobweb, /obj/machinery/light/small/directional/west, /obj/structure/sign/poster/contraband/random/directional/west, -/turf/open/floor/wood{ - icon_state = "wood-broken" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/shuttle/abandoned/bar) "cl" = ( /obj/structure/chair/sofa/left{ @@ -1169,9 +1161,8 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood{ - icon_state = "wood-broken3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/shuttle/abandoned/bar) "cm" = ( /obj/effect/turf_decal/tile/bar, @@ -1330,18 +1321,16 @@ dir = 8 }, /obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/wood{ - icon_state = "wood-broken6" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/shuttle/abandoned/bar) "cB" = ( /obj/structure/table/wood, /obj/effect/decal/cleanable/dirt, /obj/item/storage/bag/tray, /obj/item/food/burger/bearger, -/turf/open/floor/wood{ - icon_state = "wood-broken3" - }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, /area/shuttle/abandoned/bar) "cC" = ( /obj/effect/turf_decal/tile/bar, diff --git a/_maps/shuttles/whiteship_meta.dmm b/_maps/shuttles/whiteship_meta.dmm index 49eae48498eeb5..90cf7a78a897e4 100644 --- a/_maps/shuttles/whiteship_meta.dmm +++ b/_maps/shuttles/whiteship_meta.dmm @@ -159,9 +159,7 @@ /turf/open/floor/iron/dark, /area/shuttle/abandoned/cargo) "at" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_x = -32 - }, +/obj/structure/sign/warning/vacuum/external/directional/west, /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/light/small/built/directional/west, /turf/open/floor/plating, @@ -834,9 +832,7 @@ /turf/open/floor/plating, /area/shuttle/abandoned/engine) "ci" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_y = 32 - }, +/obj/structure/sign/warning/vacuum/external/directional/north, /obj/machinery/light/small/built/directional/north, /obj/structure/cable, /turf/open/floor/plating, @@ -1489,7 +1485,7 @@ /obj/item/shovel/spade, /obj/item/cultivator, /obj/item/plant_analyzer, -/obj/item/reagent_containers/glass/bucket, +/obj/item/reagent_containers/glass/watering_can, /obj/effect/decal/cleanable/dirt/dust, /obj/effect/turf_decal/tile/green{ dir = 1 @@ -1549,9 +1545,7 @@ /turf/open/floor/plating, /area/shuttle/abandoned/bar) "ec" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_x = -32 - }, +/obj/structure/sign/warning/vacuum/external/directional/west, /obj/machinery/light/small/built/directional/west, /turf/open/floor/plating, /area/shuttle/abandoned/bar) diff --git a/_maps/templates/battlecruiser_starfury.dmm b/_maps/templates/battlecruiser_starfury.dmm index d5f6d06e75af66..73f8eaa0ae918d 100644 --- a/_maps/templates/battlecruiser_starfury.dmm +++ b/_maps/templates/battlecruiser_starfury.dmm @@ -574,9 +574,7 @@ /area/shuttle/sbc_starfury) "bU" = ( /obj/machinery/disposal/bin, -/obj/structure/sign/warning/deathsposal{ - pixel_y = -32 - }, +/obj/structure/sign/warning/deathsposal/directional/south, /obj/structure/disposalpipe/trunk{ dir = 4 }, @@ -744,9 +742,7 @@ /obj/effect/turf_decal/bot_white{ color = "#00A2FF" }, -/obj/structure/sign/warning/cold_temp{ - pixel_y = 32 - }, +/obj/structure/sign/warning/cold_temp/directional/north, /turf/open/floor/iron/white/textured_large, /area/shuttle/sbc_starfury) "cz" = ( @@ -1134,23 +1130,21 @@ /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) "dO" = ( -/obj/structure/sign/warning/secure_area{ +/obj/structure/sign/warning/secure_area/directional/east{ desc = "A warning sign which reads 'KEEP CLEAR: SHUTTLE BAY'"; icon_state = "space"; layer = 4; - name = "KEEP CLEAR: SHUTTLE BAY"; - pixel_x = 32 + name = "KEEP CLEAR: SHUTTLE BAY" }, /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) "dS" = ( -/obj/structure/sign/warning/secure_area{ +/obj/structure/sign/warning/secure_area/directional/west{ desc = "A warning sign which reads 'KEEP CLEAR: SHUTTLE BAY'"; icon_state = "space"; layer = 4; - name = "KEEP CLEAR: SHUTTLE BAY"; - pixel_x = -32 + name = "KEEP CLEAR: SHUTTLE BAY" }, /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron/dark, @@ -1269,12 +1263,11 @@ /turf/open/floor/pod/light, /area/shuttle/sbc_starfury) "ei" = ( -/obj/structure/sign/warning/secure_area{ +/obj/structure/sign/warning/secure_area/directional/west{ desc = "A warning sign which reads 'EXTERNAL AIRSHIELD'"; icon_state = "space"; layer = 4; - name = "EXTERNAL AIRSHIELD"; - pixel_x = -32 + name = "EXTERNAL AIRSHIELD" }, /obj/machinery/porta_turret/syndicate/energy{ dir = 6 @@ -1304,12 +1297,11 @@ /turf/open/floor/pod/dark, /area/shuttle/sbc_starfury) "eu" = ( -/obj/structure/sign/warning/secure_area{ +/obj/structure/sign/warning/secure_area/directional/east{ desc = "A warning sign which reads 'EXTERNAL AIRSHIELD'"; icon_state = "space"; layer = 4; - name = "EXTERNAL AIRSHIELD"; - pixel_x = 32 + name = "EXTERNAL AIRSHIELD" }, /obj/machinery/porta_turret/syndicate/energy{ dir = 10 @@ -1486,12 +1478,11 @@ /turf/open/floor/pod/dark, /area/shuttle/sbc_starfury) "eT" = ( -/obj/structure/sign/warning/secure_area{ +/obj/structure/sign/warning/secure_area/directional/west{ desc = "A warning sign which reads 'EXTERNAL AIRSHIELD'"; icon_state = "space"; layer = 4; - name = "EXTERNAL AIRSHIELD"; - pixel_x = -32 + name = "EXTERNAL AIRSHIELD" }, /obj/machinery/porta_turret/syndicate/energy{ dir = 5 @@ -1560,12 +1551,11 @@ /turf/open/floor/pod/dark, /area/shuttle/sbc_starfury) "fd" = ( -/obj/structure/sign/warning/secure_area{ +/obj/structure/sign/warning/secure_area/directional/east{ desc = "A warning sign which reads 'EXTERNAL AIRSHIELD'"; icon_state = "space"; layer = 4; - name = "EXTERNAL AIRSHIELD"; - pixel_x = 32 + name = "EXTERNAL AIRSHIELD" }, /obj/machinery/porta_turret/syndicate/energy{ dir = 9 @@ -1836,12 +1826,11 @@ /turf/open/floor/iron, /area/shuttle/sbc_starfury) "gp" = ( -/obj/structure/sign/warning/secure_area{ +/obj/structure/sign/warning/secure_area/directional/east{ desc = "A warning sign which reads 'KEEP CLEAR: SHUTTLE BAY'"; icon_state = "space"; layer = 4; - name = "KEEP CLEAR: SHUTTLE BAY"; - pixel_x = 32 + name = "KEEP CLEAR: SHUTTLE BAY" }, /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -1876,12 +1865,11 @@ /turf/open/floor/mineral/plastitanium/red, /area/shuttle/sbc_starfury) "gC" = ( -/obj/structure/sign/warning/secure_area{ +/obj/structure/sign/warning/secure_area/directional/west{ desc = "A warning sign which reads 'KEEP CLEAR: SHUTTLE BAY'"; icon_state = "space"; layer = 4; - name = "KEEP CLEAR: SHUTTLE BAY"; - pixel_x = -32 + name = "KEEP CLEAR: SHUTTLE BAY" }, /obj/effect/turf_decal/tile/red{ dir = 1 @@ -2092,9 +2080,7 @@ /turf/open/floor/pod/light, /area/shuttle/sbc_starfury) "hd" = ( -/obj/structure/sign/warning/deathsposal{ - pixel_y = 32 - }, +/obj/structure/sign/warning/deathsposal/directional/north, /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ dir = 4 @@ -3199,9 +3185,7 @@ /turf/open/floor/mineral/plastitanium, /area/shuttle/sbc_starfury) "jK" = ( -/obj/structure/sign/warning/electric_shock{ - pixel_y = 32 - }, +/obj/structure/sign/warning/electric_shock/directional/north, /obj/machinery/power/port_gen/pacman/super, /obj/effect/turf_decal/delivery, /obj/structure/cable, @@ -3240,9 +3224,7 @@ }, /obj/effect/turf_decal/bot, /obj/structure/cable, -/obj/structure/sign/warning/no_smoking{ - pixel_y = 32 - }, +/obj/structure/sign/warning/no_smoking/directional/north, /turf/open/floor/engine, /area/shuttle/sbc_starfury) "kb" = ( @@ -3262,9 +3244,7 @@ /turf/open/floor/plating/airless, /area/shuttle/sbc_starfury) "kd" = ( -/obj/structure/sign/warning/deathsposal{ - pixel_y = 32 - }, +/obj/structure/sign/warning/deathsposal/directional/north, /obj/structure/cable, /obj/machinery/atmospherics/components/binary/pump/off/scrubbers/visible/layer2{ dir = 8; @@ -3531,12 +3511,11 @@ /turf/open/floor/plating, /area/shuttle/sbc_starfury) "kN" = ( -/obj/structure/sign/warning/secure_area{ +/obj/structure/sign/warning/secure_area/directional/north{ desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; - name = "EXTERNAL AIRLOCK"; - pixel_y = 32 + name = "EXTERNAL AIRLOCK" }, /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -3607,12 +3586,11 @@ /turf/open/floor/mineral/plastitanium, /area/shuttle/sbc_starfury) "lf" = ( -/obj/structure/sign/warning/secure_area{ +/obj/structure/sign/warning/secure_area/directional/north{ desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; - name = "EXTERNAL AIRLOCK"; - pixel_y = 32 + name = "EXTERNAL AIRLOCK" }, /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -3682,9 +3660,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/sign/warning/docking{ - pixel_y = -32 - }, +/obj/structure/sign/warning/docking/directional/south, /obj/machinery/light/directional/south, /turf/open/floor/mineral/plastitanium, /area/shuttle/sbc_starfury) @@ -5064,9 +5040,7 @@ anchored = 1; dir = 1 }, -/obj/structure/sign/warning/electric_shock{ - pixel_y = -32 - }, +/obj/structure/sign/warning/electric_shock/directional/south, /obj/machinery/light/small/directional/south, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) @@ -5175,9 +5149,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/sign/warning/docking{ - pixel_y = -32 - }, +/obj/structure/sign/warning/docking/directional/south, /obj/machinery/light/directional/south, /turf/open/floor/mineral/plastitanium, /area/shuttle/sbc_starfury) @@ -5231,9 +5203,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/structure/sign/warning/no_smoking{ - pixel_x = 32 - }, +/obj/structure/sign/warning/no_smoking/directional/east, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -5492,9 +5462,7 @@ /obj/item/wrench, /obj/item/crowbar/red, /obj/effect/turf_decal/bot, -/obj/structure/sign/warning/chem_diamond{ - pixel_y = 32 - }, +/obj/structure/sign/warning/chem_diamond/directional/north, /turf/open/floor/iron/white/smooth_large, /area/shuttle/sbc_starfury) "Wc" = ( diff --git a/_maps/templates/holodeck_lounge.dmm b/_maps/templates/holodeck_lounge.dmm index 5dea4911fc429d..c68eb7d579cc5d 100644 --- a/_maps/templates/holodeck_lounge.dmm +++ b/_maps/templates/holodeck_lounge.dmm @@ -302,9 +302,7 @@ }, /area/template_noop) "Z" = ( -/obj/structure/musician/piano{ - icon_state = "piano" - }, +/obj/structure/musician/piano, /turf/open/floor/holofloor/carpet, /area/template_noop) diff --git a/_maps/templates/holodeck_petpark.dmm b/_maps/templates/holodeck_petpark.dmm index f1bc336f02d5ae..d0dc75dc1f33b7 100644 --- a/_maps/templates/holodeck_petpark.dmm +++ b/_maps/templates/holodeck_petpark.dmm @@ -128,7 +128,7 @@ /turf/open/floor/holofloor, /area/template_noop) "X" = ( -/obj/item/reagent_containers/glass/bucket, +/obj/item/reagent_containers/glass/watering_can, /turf/open/floor/holofloor/grass, /area/template_noop) "Z" = ( diff --git a/code/__DEFINES/access.dm b/code/__DEFINES/access.dm index 332e5222ede58d..e4273c0f8524e8 100644 --- a/code/__DEFINES/access.dm +++ b/code/__DEFINES/access.dm @@ -71,7 +71,7 @@ ///Cargo general access #define ACCESS_CARGO "cargo" -#define ACCESS_MAIL_SORTING "mail_sorting" +#define ACCESS_SHIPPING "shipping" /// For releasing minerals from the ORM #define ACCESS_MINERAL_STOREROOM "mineral_storeroom" #define ACCESS_MINING_STATION "mining_station" @@ -234,81 +234,82 @@ /// Departmental/general/common area accesses. Do not use direct, access via SSid_access.get_flag_access_list(ACCESS_FLAG_COMMON) #define COMMON_ACCESS list( \ + ACCESS_ATMOSPHERICS, \ + ACCESS_AUX_BASE, \ + ACCESS_BAR, \ + ACCESS_BRIG, \ + ACCESS_BRIG_ENTRANCE, \ + ACCESS_CARGO, \ + ACCESS_CHAPEL_OFFICE, \ + ACCESS_CONSTRUCTION, \ + ACCESS_COURT, \ + ACCESS_CREMATORIUM, \ + ACCESS_DETECTIVE, \ + ACCESS_ENGINE_EQUIP, \ + ACCESS_ENGINEERING, \ + ACCESS_EXTERNAL_AIRLOCKS, \ + ACCESS_GENETICS, \ + ACCESS_HYDROPONICS, \ + ACCESS_JANITOR, \ + ACCESS_KITCHEN, \ + ACCESS_LAWYER, \ + ACCESS_LIBRARY, \ + ACCESS_MAINT_TUNNELS, \ ACCESS_MECH_MINING, \ ACCESS_MECH_MEDICAL, \ ACCESS_MECH_SECURITY, \ ACCESS_MECH_SCIENCE, \ ACCESS_MECH_ENGINE, \ - ACCESS_AUX_BASE, \ - ACCESS_PSYCHOLOGY, \ - ACCESS_PHARMACY, \ - ACCESS_NETWORK, \ - ACCESS_WEAPONS, \ + ACCESS_MEDICAL, \ ACCESS_MINERAL_STOREROOM, \ - ACCESS_BRIG_ENTRANCE, \ - ACCESS_XENOBIOLOGY, \ - ACCESS_MINING_STATION, \ - ACCESS_MAIL_SORTING, \ ACCESS_MINING, \ - ACCESS_RESEARCH, \ - ACCESS_THEATRE, \ - ACCESS_SURGERY, \ - ACCESS_COURT, \ - ACCESS_QM, \ - ACCESS_VIROLOGY, \ - ACCESS_LAWYER, \ - ACCESS_LIBRARY, \ - ACCESS_HYDROPONICS, \ + ACCESS_MINING_STATION, \ + ACCESS_MORGUE, \ + ACCESS_NETWORK, \ + ACCESS_ORDNANCE, \ + ACCESS_ORDNANCE_STORAGE, \ + ACCESS_PHARMACY, \ ACCESS_PLUMBING, \ - ACCESS_CONSTRUCTION, \ - ACCESS_CARGO, \ + ACCESS_PSYCHOLOGY, \ + ACCESS_QM, \ + ACCESS_RESEARCH, \ ACCESS_ROBOTICS, \ - ACCESS_KITCHEN, \ - ACCESS_CREMATORIUM, \ - ACCESS_JANITOR, \ - ACCESS_BAR, \ - ACCESS_CHAPEL_OFFICE, \ - ACCESS_EXTERNAL_AIRLOCKS, \ - ACCESS_MAINT_TUNNELS, \ - ACCESS_ENGINE_EQUIP, \ - ACCESS_ENGINEERING, \ - ACCESS_GENETICS, \ ACCESS_SCIENCE, \ - ACCESS_MORGUE, \ - ACCESS_MEDICAL, \ - ACCESS_DETECTIVE, \ - ACCESS_BRIG, \ ACCESS_SECURITY, \ - ACCESS_ATMOSPHERICS, \ - ACCESS_ORDNANCE_STORAGE, \ - ACCESS_ORDNANCE, \ ACCESS_SERVICE, \ + ACCESS_SHIPPING, \ + ACCESS_SURGERY, \ + ACCESS_THEATRE, \ + ACCESS_VIROLOGY, \ + ACCESS_WEAPONS, \ + ACCESS_XENOBIOLOGY, \ ) /// Command staff/secure accesses, think bridge/armoury, ai_upload, notably access to modify ID cards themselves. Do not use direct, access via SSid_access.get_flag_access_list(ACCESS_FLAG_COMMAND) #define COMMAND_ACCESS list( \ - ACCESS_MINISAT, \ - ACCESS_TCOMMS, \ - ACCESS_KEYCARD_AUTH, \ - ACCESS_RC_ANNOUNCE, \ - ACCESS_VAULT, \ - ACCESS_TECH_STORAGE, \ - ACCESS_COMMAND, \ - ACCESS_TELEPORTER, \ - ACCESS_ARMORY, \ ACCESS_AI_UPLOAD, \ + ACCESS_ALL_PERSONAL_LOCKERS, \ + ACCESS_ARMORY, \ ACCESS_CHANGE_IDS, \ + ACCESS_COMMAND, \ ACCESS_EVA, \ ACCESS_GATEWAY, \ - ACCESS_ALL_PERSONAL_LOCKERS, \ + ACCESS_KEYCARD_AUTH, \ + ACCESS_MINISAT, \ + ACCESS_RC_ANNOUNCE, \ + ACCESS_TCOMMS, \ + ACCESS_TECH_STORAGE, \ + ACCESS_TELEPORTER, \ + ACCESS_VAULT, \ ) /// Private head of staff offices, usually only granted to most cards by trimming. Do not use direct, access via SSid_access.get_flag_access_list(ACCESS_FLAG_PRV_COMMAND) #define PRIVATE_COMMAND_ACCESS list( \ - ACCESS_HOS, \ - ACCESS_HOP, \ ACCESS_CE, \ ACCESS_CMO, \ + ACCESS_HOS, \ + ACCESS_HOP, \ + ACCESS_QM, \ ACCESS_RD, \ ) @@ -320,33 +321,33 @@ #define CENTCOM_ACCESS list( \ ACCESS_CENT_BAR, \ ACCESS_CENT_CAPTAIN, \ - ACCESS_CENT_TELEPORTER, \ - ACCESS_CENT_STORAGE, \ + ACCESS_CENT_GENERAL, \ ACCESS_CENT_LIVING, \ ACCESS_CENT_MEDICAL, \ ACCESS_CENT_SPECOPS, \ + ACCESS_CENT_STORAGE, \ + ACCESS_CENT_TELEPORTER, \ ACCESS_CENT_THUNDER, \ - ACCESS_CENT_GENERAL, \ ) /// Syndicate areas off station. Do not use direct, access via SSid_access.get_flag_access_list(ACCESS_FLAG_SYNDICATE) #define SYNDICATE_ACCESS list( \ - ACCESS_SYNDICATE_LEADER, \ ACCESS_SYNDICATE, \ + ACCESS_SYNDICATE_LEADER, \ ) /// Away missions/gateway/space ruins. Do not use direct, access via SSid_access.get_flag_access_list(ACCESS_FLAG_AWAY) #define AWAY_ACCESS list( \ - ACCESS_AWAY_GENERAL, \ ACCESS_AWAY_COMMAND, \ - ACCESS_AWAY_MAINTENANCE, \ - ACCESS_AWAY_MEDICAL, \ - ACCESS_AWAY_SEC, \ ACCESS_AWAY_ENGINEERING, \ + ACCESS_AWAY_GENERAL, \ ACCESS_AWAY_GENERIC1, \ ACCESS_AWAY_GENERIC2, \ ACCESS_AWAY_GENERIC3, \ ACCESS_AWAY_GENERIC4, \ + ACCESS_AWAY_MAINTENANCE, \ + ACCESS_AWAY_MEDICAL, \ + ACCESS_AWAY_SEC, \ ) /// Weird internal Cult access that prevents non-cult from using their doors. Do not use direct, access via SSid_access.get_flag_access_list(ACCESS_FLAG_SPECIAL) @@ -366,106 +367,106 @@ #define REGION_GENERAL "General" /// Used to seed the accesses_by_region list in SSid_access. A list of general service accesses that are overseen by the HoP. #define REGION_ACCESS_GENERAL list( \ - ACCESS_KITCHEN, \ ACCESS_BAR, \ - ACCESS_HYDROPONICS, \ - ACCESS_JANITOR, \ ACCESS_CHAPEL_OFFICE, \ ACCESS_CREMATORIUM, \ - ACCESS_LIBRARY, \ - ACCESS_THEATRE, \ + ACCESS_HYDROPONICS, \ + ACCESS_JANITOR, \ + ACCESS_KITCHEN, \ ACCESS_LAWYER, \ + ACCESS_LIBRARY, \ ACCESS_SERVICE, \ + ACCESS_THEATRE, \ ) /// Name for the Security region. #define REGION_SECURITY "Security" /// Used to seed the accesses_by_region list in SSid_access. A list of all security regional accesses that are overseen by the HoS. #define REGION_ACCESS_SECURITY list( \ - ACCESS_BRIG_ENTRANCE, \ - ACCESS_WEAPONS, \ - ACCESS_SECURITY, \ - ACCESS_BRIG, \ ACCESS_ARMORY, \ - ACCESS_DETECTIVE, \ + ACCESS_BRIG, \ + ACCESS_BRIG_ENTRANCE, \ ACCESS_COURT, \ - ACCESS_MECH_SECURITY, \ + ACCESS_DETECTIVE, \ ACCESS_HOS, \ + ACCESS_MECH_SECURITY, \ + ACCESS_SECURITY, \ + ACCESS_WEAPONS, \ ) /// Name for the Medbay region. #define REGION_MEDBAY "Medbay" /// Used to seed the accesses_by_region list in SSid_access. A list of all medbay regional accesses that are overseen by the CMO. #define REGION_ACCESS_MEDBAY list( \ + ACCESS_CMO, \ + ACCESS_MECH_MEDICAL, \ ACCESS_MEDICAL, \ ACCESS_MORGUE, \ - ACCESS_PLUMBING, \ - ACCESS_VIROLOGY, \ - ACCESS_SURGERY, \ - ACCESS_MECH_MEDICAL, \ - ACCESS_CMO, \ ACCESS_PHARMACY, \ + ACCESS_PLUMBING, \ ACCESS_PSYCHOLOGY, \ + ACCESS_SURGERY, \ + ACCESS_VIROLOGY, \ ) /// Name for the Research region. #define REGION_RESEARCH "Research" /// Used to seed the accesses_by_region list in SSid_access. A list of all research regional accesses that are overseen by the RD. #define REGION_ACCESS_RESEARCH list( \ - ACCESS_RESEARCH, \ - ACCESS_SCIENCE, \ - ACCESS_ORDNANCE, \ - ACCESS_ORDNANCE_STORAGE, \ ACCESS_GENETICS, \ - ACCESS_ROBOTICS, \ - ACCESS_XENOBIOLOGY, \ ACCESS_MECH_SCIENCE, \ ACCESS_MINISAT, \ - ACCESS_RD, \ ACCESS_NETWORK, \ + ACCESS_ORDNANCE, \ + ACCESS_ORDNANCE_STORAGE, \ + ACCESS_RD, \ + ACCESS_RESEARCH, \ + ACCESS_ROBOTICS, \ + ACCESS_SCIENCE, \ + ACCESS_XENOBIOLOGY, \ ) /// Name for the Engineering region. #define REGION_ENGINEERING "Engineering" /// Used to seed the accesses_by_region list in SSid_access. A list of all engineering regional accesses that are overseen by the CE. #define REGION_ACCESS_ENGINEERING list( \ - ACCESS_CONSTRUCTION, \ + ACCESS_ATMOSPHERICS, \ ACCESS_AUX_BASE, \ - ACCESS_MAINT_TUNNELS, \ + ACCESS_CE, \ + ACCESS_CONSTRUCTION, \ ACCESS_ENGINEERING, \ ACCESS_ENGINE_EQUIP, \ ACCESS_EXTERNAL_AIRLOCKS, \ - ACCESS_TECH_STORAGE, \ - ACCESS_ATMOSPHERICS, \ + ACCESS_MAINT_TUNNELS, \ ACCESS_MECH_ENGINE, \ - ACCESS_TCOMMS, \ ACCESS_MINISAT, \ - ACCESS_CE, \ + ACCESS_TCOMMS, \ + ACCESS_TECH_STORAGE, \ ) /// Name for the Supply region. #define REGION_SUPPLY "Supply" /// Used to seed the accesses_by_region list in SSid_access. A list of all cargo regional accesses that are overseen by the HoP. #define REGION_ACCESS_SUPPLY list( \ - ACCESS_MAIL_SORTING, \ - ACCESS_MINING, \ - ACCESS_MINING_STATION, \ + ACCESS_CARGO, \ ACCESS_MECH_MINING, \ ACCESS_MINERAL_STOREROOM, \ - ACCESS_CARGO, \ + ACCESS_MINING, \ + ACCESS_MINING_STATION, \ ACCESS_QM, \ + ACCESS_SHIPPING, \ ACCESS_VAULT, \ ) /// Name for the Command region. #define REGION_COMMAND "Command" /// Used to seed the accesses_by_region list in SSid_access. A list of all command regional accesses that are overseen by the Captain. #define REGION_ACCESS_COMMAND list( \ - ACCESS_COMMAND, \ - ACCESS_RC_ANNOUNCE, \ - ACCESS_KEYCARD_AUTH, \ - ACCESS_CHANGE_IDS, \ ACCESS_AI_UPLOAD, \ - ACCESS_TELEPORTER, \ + ACCESS_ALL_PERSONAL_LOCKERS, \ + ACCESS_CAPTAIN, \ + ACCESS_CHANGE_IDS, \ + ACCESS_COMMAND, \ ACCESS_EVA, \ ACCESS_GATEWAY, \ - ACCESS_ALL_PERSONAL_LOCKERS, \ ACCESS_HOP, \ - ACCESS_CAPTAIN, \ + ACCESS_KEYCARD_AUTH, \ + ACCESS_RC_ANNOUNCE, \ + ACCESS_TELEPORTER, \ ACCESS_VAULT, \ ) /// Name for the Centcom region. @@ -491,6 +492,7 @@ /obj/item/modular_computer/tablet/pda/warden = list(REGION_SECURITY), \ /obj/item/modular_computer/tablet/pda/janitor = list(REGION_GENERAL), \ /obj/item/modular_computer/tablet/pda/science = list(REGION_RESEARCH), \ + /obj/item/modular_computer/tablet/pda/heads/quartermaster = list(REGION_COMMAND), \ /obj/item/modular_computer/tablet/pda/heads/hop = list(REGION_COMMAND), \ /obj/item/modular_computer/tablet/pda/heads/hos = list(REGION_COMMAND), \ /obj/item/modular_computer/tablet/pda/heads/cmo = list(REGION_COMMAND), \ @@ -498,7 +500,6 @@ /obj/item/modular_computer/tablet/pda/heads/rd = list(REGION_COMMAND), \ /obj/item/modular_computer/tablet/pda/heads/captain = list(REGION_COMMAND), \ /obj/item/modular_computer/tablet/pda/cargo = list(REGION_SUPPLY), \ - /obj/item/modular_computer/tablet/pda/quartermaster = list(REGION_SUPPLY), \ /obj/item/modular_computer/tablet/pda/shaftminer = list(REGION_SUPPLY), \ /obj/item/modular_computer/tablet/pda/chaplain = list(REGION_GENERAL), \ /obj/item/modular_computer/tablet/pda/lawyer = list(REGION_GENERAL, REGION_SECURITY), \ @@ -514,13 +515,13 @@ /// All regions that make up the station area. Helper define to quickly designate a region as part of the station or not. Access via SSid_access.station_regions. #define REGION_AREA_STATION list( \ + REGION_COMMAND, \ + REGION_ENGINEERING, \ REGION_GENERAL, \ - REGION_SECURITY, \ REGION_MEDBAY, \ REGION_RESEARCH, \ - REGION_ENGINEERING, \ + REGION_SECURITY, \ REGION_SUPPLY, \ - REGION_COMMAND, \ ) /// Used in ID card access adding procs. Will try to add all accesses and utilises free wildcards, skipping over any accesses it can't add. diff --git a/code/__DEFINES/actions.dm b/code/__DEFINES/actions.dm index b4ee3d76e2c39b..ca2068106994ca 100644 --- a/code/__DEFINES/actions.dm +++ b/code/__DEFINES/actions.dm @@ -9,3 +9,12 @@ ///Action button triggered with right click #define TRIGGER_SECONDARY_ACTION (1<<0) + +// Defines for formatting cooldown actions for the stat panel. +/// The stat panel the action is displayed in. +#define PANEL_DISPLAY_PANEL "panel" +/// The status shown in the stat panel. +/// Can be stuff like "ready", "on cooldown", "active", "charges", "charge cost", etc. +#define PANEL_DISPLAY_STATUS "status" +/// The name shown in the stat panel. +#define PANEL_DISPLAY_NAME "name" diff --git a/code/__DEFINES/admin.dm b/code/__DEFINES/admin.dm index a2e9e701e82e2c..d3ac11474a63d7 100644 --- a/code/__DEFINES/admin.dm +++ b/code/__DEFINES/admin.dm @@ -148,3 +148,6 @@ GLOBAL_VAR_INIT(ghost_role_flags, (~0)) /// When passed in as the duration for ban_panel, will make the ban default to permanent #define BAN_PANEL_PERMANENT "permanent" + +/// A value for /datum/admins/cached_feedback_link to indicate empty, rather than unobtained +#define NO_FEEDBACK_LINK "no_feedback_link" diff --git a/code/__DEFINES/antagonists.dm b/code/__DEFINES/antagonists.dm index 6a50ffababc81f..418832f15563a2 100644 --- a/code/__DEFINES/antagonists.dm +++ b/code/__DEFINES/antagonists.dm @@ -112,6 +112,10 @@ WIZARD_LOADOUT_SOULTAP, \ ) +/// Used in logging spells for roundend results +#define LOG_SPELL_TYPE "type" +#define LOG_SPELL_AMOUNT "amount" + ///File to the traitor flavor #define TRAITOR_FLAVOR_FILE "antagonist_flavor/traitor_flavor.json" diff --git a/code/__DEFINES/atmospherics/atmos_helpers.dm b/code/__DEFINES/atmospherics/atmos_helpers.dm index 433ecd3c7f73a2..e321404ad159be 100644 --- a/code/__DEFINES/atmospherics/atmos_helpers.dm +++ b/code/__DEFINES/atmospherics/atmos_helpers.dm @@ -74,3 +74,42 @@ GLOBAL_LIST_INIT(atmos_adjacent_savings, list(0,0)) turf.air.archive();\ turf.archived_cycle = SSair.times_fired;\ turf.temperature_archived = turf.temperature; + +/* Fetch the energy transferred when two gas mixtures's temperature equalize. + * + * To equalize two gas mixtures, we simply pool the energy and divide it by the pooled heat capacity. + * T' = (W1+W2) / (C1+C2) + * But if we want to moderate this conduction, maybe we can calculate the energy transferred + * and multiply a coefficient to it instead. + * This is the energy transferred: + * W = T' * C1 - W1 + * W = (W1+W2) / (C1+C2) * C1 - W1 + * W = (W1C1 + W2C1) / (C1+C2) - W1 + * W = ((W1C1 + W2C1) - (W1 * (C1+C2))) / (C1+C2) + * W = ((W1C1 + W2C1) - (W1C1 + W1C2)) / (C1+C2) + * W = (W1C1 - W1C1 + W2C1 - W1C2) / (C1+C2) + * W = (W2C1 - W1C2) / (C1+C2) + * W = (T2*C2*C1 - T1*C1*C2) / (C1+C2) + * W = (C1*C2) * (T2-T1) / (C1+C2) + * + * W: Energy involved in the operation + * T': Combined temperature + * T1, C1, W1: Temp, heat cap, and thermal energy of the first gas mixture + * T2, C2, W2: Temp, heat cap, and thermal energy of the second gas mixture + * + * Not immediately obvious, but saves us operation time. + * + * We put a lot of parentheses here because the numbers get really really big. + * By prioritizing the division we try to tone the number down so we dont get overflows. + * + * Arguments: + * * temperature_delta: T2 - T1. [/datum/gas_mixture/var/temperature] + * If you have any moderating (less than 1) coefficients and are dealing with very big numbers + * multiply the temperature_delta by it first before passing so we get even more breathing room. + * * heat_capacity_one: gasmix one's [/datum/gas_mixture/proc/heat_capacity] + * * heat_capacity_two: gasmix two's [/datum/gas_mixture/proc/heat_capacity] + * Returns: The energy gained by gas mixture one. Negative if gas mixture one loses energy. + * Honestly the heat capacity is interchangeable, just make sure the delta is right. + */ +#define CALCULATE_CONDUCTION_ENERGY(temperature_delta, heat_capacity_one, heat_capacity_two)\ + ((temperature_delta) * ((heat_capacity_one) * ((heat_capacity_two) / ((heat_capacity_one) + (heat_capacity_two))))) diff --git a/code/__DEFINES/chat.dm b/code/__DEFINES/chat.dm index 78a3c993b2c38c..910e999d61d6bf 100644 --- a/code/__DEFINES/chat.dm +++ b/code/__DEFINES/chat.dm @@ -34,3 +34,5 @@ text = "DEBUG: [msg]") /// Used for debug messages to the server #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 + "
") diff --git a/code/__DEFINES/colors.dm b/code/__DEFINES/colors.dm index 261ff54fee5efe..98691e99546ef7 100644 --- a/code/__DEFINES/colors.dm +++ b/code/__DEFINES/colors.dm @@ -12,9 +12,6 @@ ///how many colour priority levels there are. #define COLOUR_PRIORITY_AMOUNT 4 -#define COLOR_INPUT_DISABLED "#F0F0F0" -#define COLOR_INPUT_ENABLED "#D3B5B5" - #define COLOR_DARKMODE_BACKGROUND "#202020" #define COLOR_DARKMODE_DARKBACKGROUND "#171717" #define COLOR_DARKMODE_TEXT "#a4bad6" diff --git a/code/__DEFINES/dcs/signals/signals_action.dm b/code/__DEFINES/dcs/signals/signals_action.dm index a30fb460e79833..ee98b5a4eb9a8c 100644 --- a/code/__DEFINES/dcs/signals/signals_action.dm +++ b/code/__DEFINES/dcs/signals/signals_action.dm @@ -1,5 +1,35 @@ -// /datum/action signals +// Action signals ///from base of datum/action/proc/Trigger(): (datum/action) #define COMSIG_ACTION_TRIGGER "action_trigger" + // Return to block the trigger from occuring #define COMPONENT_ACTION_BLOCK_TRIGGER (1<<0) +/// From /datum/action/Grant(): (mob/grant_to) +#define COMSIG_ACTION_GRANTED "action_grant" +/// From /datum/action/Remove(): (mob/removed_from) +#define COMSIG_ACTION_REMOVED "action_removed" + +// Cooldown action signals + +/// From base of /datum/action/cooldown/proc/PreActivate(), sent to the action owner: (datum/action/cooldown/activated) +#define COMSIG_MOB_ABILITY_STARTED "mob_ability_base_started" + /// Return to block the ability from starting / activating + #define COMPONENT_BLOCK_ABILITY_START (1<<0) +/// From base of /datum/action/cooldown/proc/PreActivate(), sent to the action owner: (datum/action/cooldown/finished) +#define COMSIG_MOB_ABILITY_FINISHED "mob_ability_base_finished" + +/// From base of /datum/action/cooldown/proc/set_statpanel_format(): (list/stat_panel_data) +#define COMSIG_ACTION_SET_STATPANEL "ability_set_statpanel" + +// Specific cooldown action signals + +/// From base of /datum/action/cooldown/mob_cooldown/blood_warp/proc/blood_warp(): () +#define COMSIG_BLOOD_WARP "mob_ability_blood_warp" +/// From base of /datum/action/cooldown/mob_cooldown/charge/proc/do_charge(): () +#define COMSIG_STARTED_CHARGE "mob_ability_charge_started" +/// From base of /datum/action/cooldown/mob_cooldown/charge/proc/do_charge(): () +#define COMSIG_FINISHED_CHARGE "mob_ability_charge_finished" +/// From base of /datum/action/cooldown/mob_cooldown/lava_swoop/proc/swoop_attack(): () +#define COMSIG_SWOOP_INVULNERABILITY_STARTED "mob_swoop_invulnerability_started" +/// From base of /datum/action/cooldown/mob_cooldown/lava_swoop/proc/swoop_attack(): () +#define COMSIG_LAVA_ARENA_FAILED "mob_lava_arena_failed" diff --git a/code/__DEFINES/dcs/signals/signals_assembly.dm b/code/__DEFINES/dcs/signals/signals_assembly.dm new file mode 100644 index 00000000000000..a1330c0965e9e7 --- /dev/null +++ b/code/__DEFINES/dcs/signals/signals_assembly.dm @@ -0,0 +1,2 @@ +//called when an igniter activates +#define COMSIG_IGNITER_ACTIVATE "igniter_activate" 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 653d4e6167bd9e..6d946d09f88ba4 100644 --- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_main.dm +++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_main.dm @@ -45,6 +45,8 @@ #define COMSIG_ATOM_SMOOTHED_ICON "atom_smoothed_icon" ///from base of atom/Entered(): (atom/movable/arrived, atom/old_loc, list/atom/old_locs) #define COMSIG_ATOM_ENTERED "atom_entered" +///from base of atom/movable/Moved(): (atom/movable/arrived, atom/old_loc, list/atom/old_locs) +#define COMSIG_ATOM_ABSTRACT_ENTERED "atom_abstract_entered" /// Sent from the atom that just Entered src. From base of atom/Entered(): (/atom/destination, atom/old_loc, list/atom/old_locs) #define COMSIG_ATOM_ENTERING "atom_entering" ///from base of atom/Exit(): (/atom/movable/leaving, direction) @@ -52,6 +54,8 @@ #define COMPONENT_ATOM_BLOCK_EXIT (1<<0) ///from base of atom/Exited(): (atom/movable/gone, direction) #define COMSIG_ATOM_EXITED "atom_exited" +///from base of atom/movable/Moved(): (atom/movable/gone, direction) +#define COMSIG_ATOM_ABSTRACT_EXITED "atom_abstract_exited" ///from base of atom/Bumped(): (/atom/movable) #define COMSIG_ATOM_BUMPED "atom_bumped" ///from base of atom/handle_atom_del(): (atom/deleted) diff --git a/code/__DEFINES/dcs/signals/signals_beam.dm b/code/__DEFINES/dcs/signals/signals_beam.dm new file mode 100644 index 00000000000000..edfbc7c4371351 --- /dev/null +++ b/code/__DEFINES/dcs/signals/signals_beam.dm @@ -0,0 +1,3 @@ +/// Called before beam is redrawn +#define COMSIG_BEAM_BEFORE_DRAW "beam_before_draw" + #define BEAM_CANCEL_DRAW (1 << 0) diff --git a/code/__DEFINES/dcs/signals/signals_fish.dm b/code/__DEFINES/dcs/signals/signals_fish.dm index d40d6f3e595143..89e25d851362d9 100644 --- a/code/__DEFINES/dcs/signals/signals_fish.dm +++ b/code/__DEFINES/dcs/signals/signals_fish.dm @@ -5,3 +5,15 @@ // Fish signals #define COMSIG_FISH_STATUS_CHANGED "fish_status_changed" #define COMSIG_FISH_STIRRED "fish_stirred" + +/// Fishing challenge completed +#define COMSIG_FISHING_CHALLENGE_COMPLETED "fishing_completed" +/// Called when you try to use fishing rod on anything +#define COMSIG_PRE_FISHING "pre_fishing" + +/// Sent by the target of the fishing rod cast +#define COMSIG_FISHING_ROD_CAST "fishing_rod_cast" + #define FISHING_ROD_CAST_HANDLED (1 << 0) + +/// Sent when fishing line is snapped +#define COMSIG_FISHING_LINE_SNAPPED "fishing_line_interrupted" diff --git a/code/__DEFINES/dcs/signals/signals_global.dm b/code/__DEFINES/dcs/signals/signals_global.dm index 81827008283903..17ff3893d21e2a 100644 --- a/code/__DEFINES/dcs/signals/signals_global.dm +++ b/code/__DEFINES/dcs/signals/signals_global.dm @@ -39,6 +39,10 @@ #define COMSIG_GLOB_PRE_RANDOM_EVENT "!pre_random_event" /// Do not allow this random event to continue. #define CANCEL_PRE_RANDOM_EVENT (1<<0) +/// Called by (/datum/round_event_control/RunEvent). +#define COMSIG_GLOB_RANDOM_EVENT "!random_event" + /// Do not allow this random event to continue. + #define CANCEL_RANDOM_EVENT (1<<0) /// a person somewhere has thrown something : (mob/living/carbon/carbon_thrower, target) #define COMSIG_GLOB_CARBON_THROW_THING "!throw_thing" /// a trapdoor remote has sent out a signal to link with a trapdoor diff --git a/code/__DEFINES/dcs/signals/signals_heretic.dm b/code/__DEFINES/dcs/signals/signals_heretic.dm index 3a5f68fb94823a..a3be544fec6516 100644 --- a/code/__DEFINES/dcs/signals/signals_heretic.dm +++ b/code/__DEFINES/dcs/signals/signals_heretic.dm @@ -5,12 +5,12 @@ /// From /obj/item/melee/touch_attack/mansus_fist/on_mob_hit : (mob/living/source, mob/living/target) #define COMSIG_HERETIC_MANSUS_GRASP_ATTACK "mansus_grasp_attack" - /// Default behavior is to use a charge, so return this to blocks the mansus fist from being consumed after use. - #define COMPONENT_BLOCK_CHARGE_USE (1<<0) + /// Default behavior is to use the hand, so return this to blocks the mansus fist from being consumed after use. + #define COMPONENT_BLOCK_HAND_USE (1<<0) /// From /obj/item/melee/touch_attack/mansus_fist/afterattack_secondary : (mob/living/source, atom/target) #define COMSIG_HERETIC_MANSUS_GRASP_ATTACK_SECONDARY "mansus_grasp_attack_secondary" - /// Default behavior is to continue attack chain and do nothing else, so return this to use up a charge after use. - #define COMPONENT_USE_CHARGE (1<<0) + /// Default behavior is to continue attack chain and do nothing else, so return this to use up the hand after use. + #define COMPONENT_USE_HAND (1<<0) /// From /obj/item/melee/sickly_blade/afterattack (with proximity) : (mob/living/source, mob/living/target) #define COMSIG_HERETIC_BLADE_ATTACK "blade_attack" diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_abilities.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_abilities.dm deleted file mode 100644 index e7e1a0bf7a7201..00000000000000 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_abilities.dm +++ /dev/null @@ -1,18 +0,0 @@ -// Mob ability signals - -/// from base of /datum/action/cooldown/proc/PreActivate(): (datum/action/cooldown/activated) -#define COMSIG_ABILITY_STARTED "mob_ability_base_started" - #define COMPONENT_BLOCK_ABILITY_START (1<<0) -/// from base of /datum/action/cooldown/proc/PreActivate(): (datum/action/cooldown/finished) -#define COMSIG_ABILITY_FINISHED "mob_ability_base_finished" - -/// from base of /datum/action/cooldown/mob_cooldown/blood_warp/proc/blood_warp(): () -#define COMSIG_BLOOD_WARP "mob_ability_blood_warp" -/// from base of /datum/action/cooldown/mob_cooldown/charge/proc/do_charge(): () -#define COMSIG_STARTED_CHARGE "mob_ability_charge_started" -/// from base of /datum/action/cooldown/mob_cooldown/charge/proc/do_charge(): () -#define COMSIG_FINISHED_CHARGE "mob_ability_charge_finished" -/// from base of /datum/action/cooldown/mob_cooldown/lava_swoop/proc/swoop_attack(): () -#define COMSIG_SWOOP_INVULNERABILITY_STARTED "mob_swoop_invulnerability_started" -/// from base of /datum/action/cooldown/mob_cooldown/lava_swoop/proc/swoop_attack(): () -#define COMSIG_LAVA_ARENA_FAILED "mob_lava_arena_failed" diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm index ff46eb8131f89f..1b92c35488c3ac 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm @@ -43,8 +43,6 @@ ///from base of element/bane/activate(): (item/weapon, mob/user) #define COMSIG_LIVING_BANED "living_baned" -///Sent when bloodcrawl ends in mob/living/phasein(): (phasein_decal) -#define COMSIG_LIVING_AFTERPHASEIN "living_phasein" ///from base of mob/living/death(): (gibbed) #define COMSIG_LIVING_DEATH "living_death" diff --git a/code/__DEFINES/dcs/signals/signals_object.dm b/code/__DEFINES/dcs/signals/signals_object.dm index eb95a016d78c98..088422b345c298 100644 --- a/code/__DEFINES/dcs/signals/signals_object.dm +++ b/code/__DEFINES/dcs/signals/signals_object.dm @@ -59,6 +59,9 @@ /// from /obj/machinery/atmospherics/components/unary/cryo_cell/set_on(bool): (on) #define COMSIG_CRYO_SET_ON "cryo_set_on" +/// from /obj/proc/make_unfrozen() +#define COMSIG_OBJ_UNFREEZE "obj_unfreeze" + // /obj/machinery/atmospherics/components/binary/valve signals /// from /obj/machinery/atmospherics/components/binary/valve/toggle(): (on) @@ -116,6 +119,12 @@ #define COMSIG_ITEM_DROPPED "item_drop" ///from base of obj/item/pickup(): (/mob/taker) #define COMSIG_ITEM_PICKUP "item_pickup" + +/// Sebt from obj/item/ui_action_click(): (mob/user, datum/action) +#define COMSIG_ITEM_UI_ACTION_CLICK "item_action_click" + /// Return to prevent the default behavior (attack_selfing) from ocurring. + #define COMPONENT_ACTION_HANDLED (1<<0) + ///from base of mob/living/carbon/attacked_by(): (mob/living/carbon/target, mob/living/user, hit_zone) #define COMSIG_ITEM_ATTACK_ZONE "item_attack_zone" ///from base of obj/item/hit_reaction(): (list/args) @@ -222,8 +231,6 @@ ///from [/mob/living/carbon/human/Move]: () #define COMSIG_SHOES_STEP_ACTION "shoes_step_action" -///from base of /obj/item/clothing/suit/space/proc/toggle_spacesuit(): (obj/item/clothing/suit/space/suit) -#define COMSIG_SUIT_SPACE_TOGGLE "suit_space_toggle" // /obj/item/implant signals ///from base of /obj/item/implant/proc/activate(): () @@ -306,31 +313,6 @@ //called in /obj/item/organ/cyberimp/chest/thrusters/proc/toggle() : () #define COMSIG_THRUSTER_DEACTIVATED "jetmodule_deactivated" -// /obj/effect/proc_holder/spell signals - -///called from /obj/effect/proc_holder/spell/cast_check (src) -#define COMSIG_MOB_PRE_CAST_SPELL "mob_cast_spell" - /// Return to cancel the cast from beginning. - #define COMPONENT_CANCEL_SPELL (1<<0) -///called from /obj/effect/proc_holder/spell/perform (src) -#define COMSIG_MOB_CAST_SPELL "mob_cast_spell" - -/// Sent from /obj/effect/proc_holder/spell/targeted/lichdom/cast(), to the item being imbued: (mob/user) -#define COMSIG_ITEM_IMBUE_SOUL "item_imbue_soul" - /// Returns to block this item from being imbued into a phylactery - #define COMPONENT_BLOCK_IMBUE (1 << 0) -/// Sent from /obj/effect/proc_holder/spell/targeted/summonitem/cast(), to the item being marked : () -#define COMSIG_ITEM_MARK_RETRIEVAL "item_mark_retrieval" - /// Returns to block this item from being marked for instant summons - #define COMPONENT_BLOCK_MARK_RETRIEVAL (1<<0) - -/// Sent from /obj/effect/proc_holder/spell/targeted/charge/cast(), to the item in hand being charged: (obj/effect/proc_holder/spell/targeted/charge/spell, mob/living/caster) -#define COMSIG_ITEM_MAGICALLY_CHARGED "item_magic_charged" - /// Returns if an item was successfuly recharged - #define COMPONENT_ITEM_CHARGED (1 << 0) - /// Returns if the item had a negative side effect occur while recharging - #define COMPONENT_ITEM_BURNT_OUT (1 << 1) - // /obj/item/camera signals ///from /obj/item/camera/captureimage(): (atom/target, mob/user) diff --git a/code/__DEFINES/dcs/signals/signals_spell.dm b/code/__DEFINES/dcs/signals/signals_spell.dm new file mode 100644 index 00000000000000..4d2c7d2993fca9 --- /dev/null +++ b/code/__DEFINES/dcs/signals/signals_spell.dm @@ -0,0 +1,93 @@ +// Signals sent to or by spells + +// Generic spell signals + + +/// Sent from /datum/action/cooldown/spell/before_cast() to the caster: (datum/action/cooldown/spell/spell, atom/cast_on) +#define COMSIG_MOB_BEFORE_SPELL_CAST "mob_spell_pre_cast" +/// Sent from /datum/action/cooldown/spell/before_cast() to the spell: (atom/cast_on) +#define COMSIG_SPELL_BEFORE_CAST "spell_pre_cast" + /// Return to prevent the spell cast from continuing. + #define SPELL_CANCEL_CAST (1 << 0) + /// Return from before cast signals to prevent the spell from giving off sound or invocation. + #define SPELL_NO_FEEDBACK (1 << 1) + /// Return from before cast signals to prevent the spell from going on cooldown before aftercast. + #define SPELL_NO_IMMEDIATE_COOLDOWN (1 << 2) + +/// Sent from /datum/action/cooldown/spell/set_click_ability() to the caster: (datum/action/cooldown/spell/spell) +#define COMSIG_MOB_SPELL_ACTIVATED "mob_spell_active" + /// Same as spell_cancel_cast, as they're able to be used interchangeably + #define SPELL_CANCEL_ACTIVATION SPELL_CANCEL_CAST + +/// Sent from /datum/action/cooldown/spell/cast() to the caster: (datum/action/cooldown/spell/spell, atom/cast_on) +#define COMSIG_MOB_CAST_SPELL "mob_cast_spell" +/// Sent from /datum/action/cooldown/spell/cast() to the spell: (atom/cast_on) +#define COMSIG_SPELL_CAST "spell_cast" +// Sent from /datum/action/cooldown/spell/after_cast() to the caster: (datum/action/cooldown/spell/spell, atom/cast_on) +#define COMSIG_MOB_AFTER_SPELL_CAST "mob_after_spell_cast" +/// Sent from /datum/action/cooldown/spell/after_cast() to the spell: (atom/cast_on) +#define COMSIG_SPELL_AFTER_CAST "spell_after_cast" +/// Sent from /datum/action/cooldown/spell/reset_spell_cooldown() to the spell: () +#define COMSIG_SPELL_CAST_RESET "spell_cast_reset" + +// Spell type signals + +// Pointed projectiles +/// Sent from /datum/action/cooldown/spell/pointed/projectile/on_cast_hit: (atom/hit, atom/firer, obj/projectile/source) +#define COMSIG_SPELL_PROJECTILE_HIT "spell_projectile_hit" + +// AOE spells +/// Sent from /datum/action/cooldown/spell/aoe/cast: (list/atoms_affected, atom/caster) +#define COMSIG_SPELL_AOE_ON_CAST "spell_aoe_cast" + +// Cone spells +/// Sent from /datum/action/cooldown/spell/cone/cast: (list/atoms_affected, atom/caster) +#define COMSIG_SPELL_CONE_ON_CAST "spell_cone_cast" +/// Sent from /datum/action/cooldown/spell/cone/do_cone_effects: (list/atoms_affected, atom/caster, level) +#define COMSIG_SPELL_CONE_ON_LAYER_EFFECT "spell_cone_cast_effect" + +// Touch spells +/// Sent from /datum/action/cooldown/spell/touch/do_hand_hit: (atom/hit, mob/living/carbon/caster, obj/item/melee/touch_attack/hand) +#define COMSIG_SPELL_TOUCH_HAND_HIT "spell_touch_hand_cast" + +// Jaunt Spells +/// 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" +/// Sent from datum/action/cooldown/spell/jaunt/exit_jaunt, after the mob exited jaunt: (datum/action/cooldown/spell/spell) +#define COMSIG_MOB_AFTER_EXIT_JAUNT "spell_mob_after_exit_jaunt" + +/// Sent from/datum/action/cooldown/spell/jaunt/bloodcrawl/slaughter_demon/try_enter_jaunt, +/// to any unconscious / critical mobs being dragged when the jaunter enters blood: +/// (datum/action/cooldown/spell/jaunt/bloodcrawl/crawl, mob/living/jaunter, obj/effect/decal/cleanable/blood) +#define COMSIG_LIVING_BLOOD_CRAWL_PRE_CONSUMED "living_pre_consumed_by_bloodcrawl" +/// Sent from/datum/action/cooldown/spell/jaunt/bloodcrawl/slaughter_demon/consume_victim, +/// to the victim being consumed by the slaughter demon. +/// (datum/action/cooldown/spell/jaunt/bloodcrawl/crawl, mob/living/jaunter) +#define COMSIG_LIVING_BLOOD_CRAWL_CONSUMED "living_consumed_by_bloodcrawl" + /// Return at any point to stop the bloodcrawl "consume" process from continuing. + #define COMPONENT_STOP_CONSUMPTION (1 << 0) + +// Signals for specific spells + +// Lichdom +/// Sent from /datum/action/cooldown/spell/lichdom/cast(), to the item being imbued: (datum/action/cooldown/spell/spell, mob/user) +#define COMSIG_ITEM_IMBUE_SOUL "item_imbue_soul" + /// Return to stop the cast and prevent the soul imbue + #define COMPONENT_BLOCK_IMBUE (1 << 0) + +/// Sent from /datum/action/cooldown/spell/aoe/knock/cast(), to every nearby turf (for connect loc): (datum/action/cooldown/spell/aoe/knock/spell, mob/living/caster) +#define COMSIG_ATOM_MAGICALLY_UNLOCKED "atom_magic_unlock" + +// Instant Summons +/// Sent from /datum/action/cooldown/spell/summonitem/cast(), to the item being marked for recall: (datum/action/cooldown/spell/spell, mob/user) +#define COMSIG_ITEM_MARK_RETRIEVAL "item_mark_retrieval" + /// Return to stop the cast and prevent the item from being marked + #define COMPONENT_BLOCK_MARK_RETRIEVAL (1 << 0) + +// Charge +/// Sent from /datum/action/cooldown/spell/charge/cast(), to the item in hand being charged: (datum/action/cooldown/spell/spell, mob/user) +#define COMSIG_ITEM_MAGICALLY_CHARGED "item_magic_charged" + /// Return if an item was successfuly recharged + #define COMPONENT_ITEM_CHARGED (1 << 0) + /// Return if the item had a negative side effect occur while recharging + #define COMPONENT_ITEM_BURNT_OUT (1 << 1) diff --git a/code/__DEFINES/exosuit_fab.dm b/code/__DEFINES/exosuit_fab.dm index 4d4059e6a8af53..fa0ee64ef534b4 100644 --- a/code/__DEFINES/exosuit_fab.dm +++ b/code/__DEFINES/exosuit_fab.dm @@ -15,21 +15,23 @@ #define EXOSUIT_MODULE_ODYSSEUS (1<<1) /// Module is compatible with Clarke Exosuit models #define EXOSUIT_MODULE_CLARKE (1<<2) +/// Module is compatible with a mech carrying an empty Concealed Weapon Bay +#define EXOSUIT_MODULE_CONCEALED_WEP_BAY (1<<3) /// Module is compatible with Gygax Exosuit models -#define EXOSUIT_MODULE_GYGAX (1<<3) +#define EXOSUIT_MODULE_GYGAX (1<<4) /// Module is compatible with Durand Exosuit models -#define EXOSUIT_MODULE_DURAND (1<<4) +#define EXOSUIT_MODULE_DURAND (1<<5) /// Module is compatible with H.O.N.K Exosuit models -#define EXOSUIT_MODULE_HONK (1<<5) +#define EXOSUIT_MODULE_HONK (1<<6) /// Module is compatible with Phazon Exosuit models -#define EXOSUIT_MODULE_PHAZON (1<<6) +#define EXOSUIT_MODULE_PHAZON (1<<7) /// Module is compatible with Savannah Exosuit models -#define EXOSUIT_MODULE_SAVANNAH (1<<7) +#define EXOSUIT_MODULE_SAVANNAH (1<<8) /// Module is compatible with "Working" Exosuit models - Ripley and Clarke #define EXOSUIT_MODULE_WORKING EXOSUIT_MODULE_RIPLEY | EXOSUIT_MODULE_CLARKE -/// Module is compatible with "Combat" Exosuit models - Gygax, H.O.N.K, Durand and Phazon -#define EXOSUIT_MODULE_COMBAT EXOSUIT_MODULE_GYGAX | EXOSUIT_MODULE_HONK | EXOSUIT_MODULE_DURAND | EXOSUIT_MODULE_PHAZON | EXOSUIT_MODULE_SAVANNAH +/// Module is compatible with "Combat" Exosuit models - Gygax, H.O.N.K, Durand and Phazon, or any Exosuit with an empty Concealed Weapon Bay +#define EXOSUIT_MODULE_COMBAT EXOSUIT_MODULE_GYGAX | EXOSUIT_MODULE_HONK | EXOSUIT_MODULE_DURAND | EXOSUIT_MODULE_PHAZON | EXOSUIT_MODULE_SAVANNAH | EXOSUIT_MODULE_CONCEALED_WEP_BAY /// Module is compatible with "Medical" Exosuit modelsm - Odysseus #define EXOSUIT_MODULE_MEDICAL EXOSUIT_MODULE_ODYSSEUS diff --git a/code/__DEFINES/fishing.dm b/code/__DEFINES/fishing.dm new file mode 100644 index 00000000000000..40b4d21a9e8bf9 --- /dev/null +++ b/code/__DEFINES/fishing.dm @@ -0,0 +1,41 @@ +/// Use in fish tables to denote miss chance. +#define FISHING_DUD "dud" + +#define FISHING_BAIT_TRAIT "fishing_bait" +#define BASIC_QUALITY_BAIT_TRAIT "removes_felinids_pr" +#define GOOD_QUALITY_BAIT_TRAIT "adds_bitcoin_miner_pr" +#define GREAT_QUALITY_BAIT_TRAIT "perspective_walls_pr" + +// Baseline fishing difficulty levels +#define FISHING_DEFAULT_DIFFICULTY 15 + +/// Difficulty modifier when bait is fish's favorite +#define FAV_BAIT_DIFFICULTY_MOD -5 +/// Difficulty modifier when bait is fish's disliked +#define DISLIKED_BAIT_DIFFICULTY_MOD 15 + + +#define FISH_TRAIT_MINOR_DIFFICULTY_BOOST 5 + +// These define how the fish will behave in the minigame +#define FISH_AI_DUMB "dumb" +#define FISH_AI_ZIPPY "zippy" +#define FISH_AI_SLOW "slow" + +#define ADDITIVE_FISHING_MOD "additive" +#define MULTIPLICATIVE_FISHING_MOD "multiplicative" + +#define FISHING_HOOK_MAGNETIC (1 << 0) +#define FISHING_HOOK_SHINY (1 << 1) +#define FISHING_HOOK_WEIGHTED (1 << 2) + +#define FISHING_LINE_CLOAKED (1 << 0) +#define FISHING_LINE_REINFORCED (1 << 1) +#define FISHING_LINE_BOUNCY (1 << 2) + +#define FISHING_SPOT_PRESET_BEACH "beach" +#define FISHING_SPOT_PRESET_LAVALAND_LAVA "lavaland lava" + +#define FISHING_MINIGAME_RULE_HEAVY_FISH "heavy" +#define FISHING_MINIGAME_RULE_WEIGHTED_BAIT "weighted" +#define FISHING_MINIGAME_RULE_LIMIT_LOSS "limit_loss" diff --git a/code/__DEFINES/flora.dm b/code/__DEFINES/flora.dm index 1b0d1df72799e8..e02f492cce77f2 100644 --- a/code/__DEFINES/flora.dm +++ b/code/__DEFINES/flora.dm @@ -1,2 +1,3 @@ -#define FLORA_HARVEST_WOOD_TOOLS list(/obj/item/hatchet, /obj/item/fireaxe, /obj/item/melee/energy/sword/saber, /obj/item/melee/energy/blade) +///Tools that can harvest wood that DONT have the TOOL_SAW flag; TOOL_SAW can harvest regardless of being in this list (Dont put them in here) +#define FLORA_HARVEST_WOOD_TOOLS list(/obj/item/hatchet, /obj/item/fireaxe, /obj/item/kinetic_crusher, /obj/item/melee/energy/axe) #define FLORA_HARVEST_STONE_TOOLS list(/obj/item/pickaxe) diff --git a/code/__DEFINES/food.dm b/code/__DEFINES/food.dm index 99e1e7aab49fe0..74086bac9b287d 100644 --- a/code/__DEFINES/food.dm +++ b/code/__DEFINES/food.dm @@ -41,6 +41,29 @@ "BUGS", \ ) +/// IC meaning (more or less) for food flags +#define FOOD_FLAGS_IC list( \ + "Meat", \ + "Vegetables", \ + "Raw food", \ + "Junk food", \ + "Grain", \ + "Fruits", \ + "Dairy products", \ + "Fried food", \ + "Alcohol", \ + "Sugary food", \ + "Gross food", \ + "Toxic food", \ + "Pineapples", \ + "Breakfast food", \ + "Clothing", \ + "Nuts", \ + "Seafood", \ + "Oranges", \ + "Bugs", \ +) + #define DRINK_NICE 1 #define DRINK_GOOD 2 #define DRINK_VERYGOOD 3 diff --git a/code/__DEFINES/important_recursive_contents.dm b/code/__DEFINES/important_recursive_contents.dm index 24cca713c652fc..79abb67d18365f 100644 --- a/code/__DEFINES/important_recursive_contents.dm +++ b/code/__DEFINES/important_recursive_contents.dm @@ -5,3 +5,5 @@ ///the client mobs channel of the important_recursive_contents list, everything in here will be a mob with an attached client ///this is given to both a clients mob, and a clients eye, both point to the clients mob #define RECURSIVE_CONTENTS_CLIENT_MOBS "recursive_contents_client_mobs" +///the parent of storage components currently shown to some client mob get this. gets removed when nothing is viewing the parent +#define RECURSIVE_CONTENTS_ACTIVE_STORAGE "recursive_contents_active_storage" diff --git a/code/__DEFINES/industrial_lift.dm b/code/__DEFINES/industrial_lift.dm new file mode 100644 index 00000000000000..9d3052c01f040d --- /dev/null +++ b/code/__DEFINES/industrial_lift.dm @@ -0,0 +1,20 @@ +//Booleans in arguments are confusing, so I made them defines. +///the lift's controls are currently locked from user input +#define LIFT_PLATFORM_LOCKED 1 +///the lift's controls are currently unlocked so user's can direct it +#define LIFT_PLATFORM_UNLOCKED 0 + +//lift_id's +///basic lift_id, goes up and down +#define BASIC_LIFT_ID "base" +///tram lift_id, goes left and right or north and south. maybe one day be able to turn and go up/down as well +#define TRAM_LIFT_ID "tram" +///debug lift_id +#define DEBUG_LIFT_ID "debug" + + +//specific_lift_id's +///the specific_lift_id of the main station tram landmark for tramstation that spawns roundstart. +#define MAIN_STATION_TRAM "main station tram" +///the specific_lift_id of the tram on the hilbert research station +#define HILBERT_TRAM "tram_hilbert" diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 24db52be639f6d..43466bf71b7b6a 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -155,6 +155,9 @@ GLOBAL_LIST_INIT(turfs_openspace, typecacheof(list( #define isclown(A) (istype(A, /mob/living/simple_animal/hostile/retaliate/clown)) +#define isspider(A) (istype(A, /mob/living/simple_animal/hostile/giant_spider)) + + //Misc mobs #define isobserver(A) (istype(A, /mob/dead/observer)) diff --git a/code/__DEFINES/keybinding.dm b/code/__DEFINES/keybinding.dm index 2fc4f9358092c7..dbc8ef85b17c15 100644 --- a/code/__DEFINES/keybinding.dm +++ b/code/__DEFINES/keybinding.dm @@ -29,9 +29,11 @@ #define COMSIG_KB_CLIENT_MINIMALHUD_DOWN "keybinding_client_minimalhud_down" //Communication -#define COMSIG_KB_CLIENT_OOC_DOWN "keybinding_client_ooc_down" + #define COMSIG_KB_CLIENT_SAY_DOWN "keybinding_client_say_down" +#define COMSIG_KB_CLIENT_RADIO_DOWN "keybinding_client_radio_down" #define COMSIG_KB_CLIENT_ME_DOWN "keybinding_client_me_down" +#define COMSIG_KB_CLIENT_OOC_DOWN "keybinding_client_ooc_down" //Human #define COMSIG_KB_HUMAN_QUICKEQUIP_DOWN "keybinding_human_quickequip_down" diff --git a/code/__DEFINES/language.dm b/code/__DEFINES/language.dm index c475a4308295e0..8abd951e0f038f 100644 --- a/code/__DEFINES/language.dm +++ b/code/__DEFINES/language.dm @@ -21,3 +21,4 @@ #define LANGUAGE_SOFTWARE "software" #define LANGUAGE_STONER "stoner" #define LANGUAGE_VOICECHANGE "voicechange" +#define LANGUAGE_RADIOKEY "radiokey" diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm index 8215d824eda2dd..ff7fa86120c4e7 100644 --- a/code/__DEFINES/layers.dm +++ b/code/__DEFINES/layers.dm @@ -56,6 +56,7 @@ #define GAS_PIPE_VISIBLE_LAYER 2.47 //layer = initial(layer) + piping_layer / 1000 in atmospherics/update_icon() to determine order of pipe overlap #define GAS_FILTER_LAYER 2.48 #define GAS_PUMP_LAYER 2.49 +#define PLUMBING_PIPE_VISIBILE_LAYER 2.495//layer = initial(layer) + ducting_layer / 3333 in atmospherics/handle_layer() to determine order of duct overlap #define LOW_OBJ_LAYER 2.5 ///catwalk overlay of /turf/open/floor/plating/catwalk_floor #define CATWALK_LAYER 2.51 @@ -69,7 +70,8 @@ #define BELOW_OPEN_DOOR_LAYER 2.6 #define BLASTDOOR_LAYER 2.65 #define OPEN_DOOR_LAYER 2.7 -#define DOOR_HELPER_LAYER 2.71 //keep this above OPEN_DOOR_LAYER +#define DOOR_ACCESS_HELPER_LAYER 2.71 //keep this above OPEN_DOOR_LAYER, special layer used for /obj/effect/mapping_helpers/airlock/access +#define DOOR_HELPER_LAYER 2.72 //keep this above DOOR_ACCESS_HELPER_LAYER and OPEN_DOOR_LAYER since the others tend to have tiny sprites that tend to be covered up. #define PROJECTILE_HIT_THRESHHOLD_LAYER 2.75 //projectiles won't hit objects at or below this layer if possible #define TABLE_LAYER 2.8 #define GATEWAY_UNDERLAY_LAYER 2.85 @@ -185,6 +187,8 @@ #define RUNECHAT_PLANE 501 /// Plane for balloon text (text that fades up) #define BALLOON_CHAT_PLANE 502 +/// Bubble for typing indicators +#define TYPING_LAYER 500 //-------------------- HUD --------------------- //HUD layer defines diff --git a/code/__DEFINES/logging.dm b/code/__DEFINES/logging.dm index 9dae55695567dd..bfe6a591c724c3 100644 --- a/code/__DEFINES/logging.dm +++ b/code/__DEFINES/logging.dm @@ -38,15 +38,16 @@ #define LOG_ECON (1 << 18) #define LOG_VICTIM (1 << 19) #define LOG_RADIO_EMOTE (1 << 20) +#define LOG_SPEECH_INDICATORS (1 << 21) //Individual logging panel pages #define INDIVIDUAL_ATTACK_LOG (LOG_ATTACK | LOG_VICTIM) -#define INDIVIDUAL_SAY_LOG (LOG_SAY | LOG_WHISPER | LOG_DSAY) +#define INDIVIDUAL_SAY_LOG (LOG_SAY | LOG_WHISPER | LOG_DSAY | LOG_SPEECH_INDICATORS) #define INDIVIDUAL_EMOTE_LOG (LOG_EMOTE | LOG_RADIO_EMOTE) #define INDIVIDUAL_COMMS_LOG (LOG_PDA | LOG_CHAT | LOG_COMMENT | LOG_TELECOMMS) #define INDIVIDUAL_OOC_LOG (LOG_OOC | LOG_ADMIN) #define INDIVIDUAL_OWNERSHIP_LOG (LOG_OWNERSHIP) -#define INDIVIDUAL_SHOW_ALL_LOG (LOG_ATTACK | LOG_SAY | LOG_WHISPER | LOG_EMOTE | LOG_RADIO_EMOTE | LOG_DSAY | LOG_PDA | LOG_CHAT | LOG_COMMENT | LOG_TELECOMMS | LOG_OOC | LOG_ADMIN | LOG_OWNERSHIP | LOG_GAME | LOG_ADMIN_PRIVATE | LOG_ASAY | LOG_MECHA | LOG_VIRUS | LOG_SHUTTLE | LOG_ECON | LOG_VICTIM) +#define INDIVIDUAL_SHOW_ALL_LOG (LOG_ATTACK | LOG_SAY | LOG_WHISPER | LOG_EMOTE | LOG_RADIO_EMOTE | LOG_DSAY | LOG_PDA | LOG_CHAT | LOG_COMMENT | LOG_TELECOMMS | LOG_OOC | LOG_ADMIN | LOG_OWNERSHIP | LOG_GAME | LOG_ADMIN_PRIVATE | LOG_ASAY | LOG_MECHA | LOG_VIRUS | LOG_SHUTTLE | LOG_ECON | LOG_VICTIM | LOG_SPEECH_INDICATORS) #define LOGSRC_CKEY "Ckey" #define LOGSRC_MOB "Mob" diff --git a/code/__DEFINES/magic.dm b/code/__DEFINES/magic.dm index f9669db1c3a119..d4b10d7aa195b7 100644 --- a/code/__DEFINES/magic.dm +++ b/code/__DEFINES/magic.dm @@ -1,37 +1,95 @@ -//schools of magic - unused for years and years on end, finally has a use with chaplains getting punished for using "evil" spells +// Magic schools -//use this if your spell isn't actually a spell, it's set by default (and actually, i really suggest if that's the case you should use datum/actions instead - see spider.dm for an example) +/// Unset / default / "not actually magic" school. #define SCHOOL_UNSET "unset" -//GOOD SCHOOLS (allowed by honorbound gods, some of these you can get on station) +// GOOD SCHOOLS (allowed by honorbound gods, some of these you can get on station) +/// Holy school (chaplain magic) #define SCHOOL_HOLY "holy" +/// Mime... school? Mime magic. It counts #define SCHOOL_MIME "mime" -#define SCHOOL_RESTORATION "restoration" //heal shit +/// Restoration school, which is mostly healing stuff +#define SCHOOL_RESTORATION "restoration" -//NEUTRAL SPELLS (punished by honorbound gods if you get caught using it) -#define SCHOOL_EVOCATION "evocation" //kill or destroy shit, usually out of thin air -#define SCHOOL_TRANSMUTATION "transmutation" //transform shit -#define SCHOOL_TRANSLOCATION "translocation" //movement based -#define SCHOOL_CONJURATION "conjuration" //summoning +// NEUTRAL SPELLS (punished by honorbound gods if you get caught using it) +/// Evocation school, usually involves killing or destroy stuff, usually out of thin air +#define SCHOOL_EVOCATION "evocation" +/// School of transforming stuff into other stuff +#define SCHOOL_TRANSMUTATION "transmutation" +/// School of transolcation, usually movement spells +#define SCHOOL_TRANSLOCATION "translocation" +/// Conjuration spells summon items / mobs / etc somehow +#define SCHOOL_CONJURATION "conjuration" -//EVIL SPELLS (instant smite + banishment) -#define SCHOOL_NECROMANCY "necromancy" //>>>necromancy -#define SCHOOL_FORBIDDEN "forbidden" //>heretic shit and other fucked up magic +// EVIL SPELLS (instant smite + banishment) +/// Necromancy spells, usually involves soul / evil / bad stuff +#define SCHOOL_NECROMANCY "necromancy" +/// Other forbidden magics, such as heretic spells +#define SCHOOL_FORBIDDEN "forbidden" -//invocation types - what does the wizard need to do to invoke (cast) the spell? - -///Allows being able to cast the spell without saying anything. +// Invocation types - what does the wizard need to do to invoke (cast) the spell? +/// Allows being able to cast the spell without saying or doing anything. #define INVOCATION_NONE "none" -///Forces the wizard to shout (and be able to) to cast the spell. +/// Forces the wizard to shout the invocation to cast the spell. #define INVOCATION_SHOUT "shout" -///Forces the wizard to emote (and be able to) to cast the spell. -#define INVOCATION_EMOTE "emote" -///Forces the wizard to whisper (and be able to) to cast the spell. +/// Forces the wizard to whisper the invocation to cast the spell. #define INVOCATION_WHISPER "whisper" +/// Forces the wizard to emote to cast the spell. +#define INVOCATION_EMOTE "emote" + +// Bitflags for spell requirements +/// Whether the spell requires wizard clothes to cast. +#define SPELL_REQUIRES_WIZARD_GARB (1 << 0) +/// Whether the spell can only be cast by humans (mob type, not species). +/// SPELL_REQUIRES_WIZARD_GARB comes with this flag implied, as carbons and below can't wear clothes. +#define SPELL_REQUIRES_HUMAN (1 << 1) +/// Whether the spell can be cast by mobs who are brains / mmis. +/// When applying, bear in mind most spells will not function for brains out of the box. +#define SPELL_CASTABLE_AS_BRAIN (1 << 2) +/// Whether the spell can be cast while phased, such as blood crawling, ethereal jaunting or using rod form. +#define SPELL_CASTABLE_WHILE_PHASED (1 << 3) +/// Whether the spell can be cast while the user has antimagic on them that corresponds to the spell's own antimagic flags. +#define SPELL_REQUIRES_NO_ANTIMAGIC (1 << 4) +/// Whether the spell can be cast on the centcom z level. +#define SPELL_REQUIRES_OFF_CENTCOM (1 << 5) +/// Whether the spell must be cast by someone with a mind datum. +#define SPELL_REQUIRES_MIND (1 << 6) +/// Whether the spell requires the caster have a mime vow (mindless mobs will succeed this check regardless). +#define SPELL_REQUIRES_MIME_VOW (1 << 7) +/// Whether the spell can be cast, even if the caster is unable to speak the invocation +/// (effectively making the invocation flavor, instead of required). +#define SPELL_CASTABLE_WITHOUT_INVOCATION (1 << 8) +DEFINE_BITFIELD(spell_requirements, list( + "SPELL_CASTABLE_AS_BRAIN" = SPELL_CASTABLE_AS_BRAIN, + "SPELL_CASTABLE_WHILE_PHASED" = SPELL_CASTABLE_WHILE_PHASED, + "SPELL_CASTABLE_WITHOUT_INVOCATION" = SPELL_CASTABLE_WITHOUT_INVOCATION, + "SPELL_REQUIRES_HUMAN" = SPELL_REQUIRES_HUMAN, + "SPELL_REQUIRES_MIME_VOW" = SPELL_REQUIRES_MIME_VOW, + "SPELL_REQUIRES_MIND" = SPELL_REQUIRES_MIND, + "SPELL_REQUIRES_NO_ANTIMAGIC" = SPELL_REQUIRES_NO_ANTIMAGIC, + "SPELL_REQUIRES_OFF_CENTCOM" = SPELL_REQUIRES_OFF_CENTCOM, + "SPELL_REQUIRES_WIZARD_GARB" = SPELL_REQUIRES_WIZARD_GARB, +)) + +// Bitflags for teleport spells +/// Whether the teleport spell skips over space turfs +#define TELEPORT_SPELL_SKIP_SPACE (1 << 0) +/// Whether the teleport spell skips over dense turfs +#define TELEPORT_SPELL_SKIP_DENSE (1 << 1) +/// Whether the teleport spell skips over blocked turfs +#define TELEPORT_SPELL_SKIP_BLOCKED (1 << 2) + +// Bitflags for magic resistance types /// Default magic resistance that blocks normal magic (wizard, spells, magical staff projectiles) #define MAGIC_RESISTANCE (1<<0) -/// Tinfoil hat magic resistance that blocks mental magic (telepathy, mind curses, abductors, jelly people) +/// Tinfoil hat magic resistance that blocks mental magic (telepathy / mind links, mind curses, abductors) #define MAGIC_RESISTANCE_MIND (1<<1) -/// Holy magic resistance that blocks unholy magic (revenant, cult, vampire, voice of god) +/// Holy magic resistance that blocks unholy magic (revenant, vampire, voice of god) #define MAGIC_RESISTANCE_HOLY (1<<2) + +DEFINE_BITFIELD(antimagic_flags, list( + "MAGIC_RESISTANCE" = MAGIC_RESISTANCE, + "MAGIC_RESISTANCE_HOLY" = MAGIC_RESISTANCE_HOLY, + "MAGIC_RESISTANCE_MIND" = MAGIC_RESISTANCE_MIND, +)) diff --git a/code/__DEFINES/memory_defines.dm b/code/__DEFINES/memory_defines.dm index 9eeb823b431b5d..30de201dc58b62 100644 --- a/code/__DEFINES/memory_defines.dm +++ b/code/__DEFINES/memory_defines.dm @@ -102,6 +102,8 @@ #define MEMORY_PLAYING_52_PICKUP "playing_52_pickup" /// A memory of playing cards with others #define MEMORY_PLAYING_CARDS "playing_cards" +/// A memory of playing russian roulette +#define MEMORY_RUSSIAN_ROULETTE "russian_roulette" /** @@ -163,4 +165,7 @@ #define DETAIL_DEALER "DEALER" #define DETAIL_HELD_CARD_ITEM "HELD_CARD_ITEM" // could either be a singlecard, cardhand, or a deck - +// Russian Roulette +#define DETAIL_LOADED_ROUNDS "LOADED_ROUNDS" +#define DETAIL_BODYPART "BODYPART" +#define DETAIL_OUTCOME "OUTCOME" diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index a0a3045dedb886..553aaf8ab6d858 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -410,6 +410,8 @@ #define HUNGER_FACTOR 0.05 //factor at which mob nutrition decreases #define ETHEREAL_CHARGE_FACTOR 0.8 //factor at which ethereal's charge decreases per second +/// How much nutrition eating clothes as moth gives and drains +#define CLOTHING_NUTRITION_GAIN 15 #define REAGENTS_METABOLISM 0.2 //How many units of reagent are consumed per second, by default. #define REAGENTS_EFFECT_MULTIPLIER (REAGENTS_METABOLISM / 0.4) // By defining the effect multiplier this way, it'll exactly adjust all effects according to how they originally were with the 0.4 metabolism diff --git a/code/__DEFINES/obj_flags.dm b/code/__DEFINES/obj_flags.dm index 5f32ab692084aa..26eaec3b14f9bc 100644 --- a/code/__DEFINES/obj_flags.dm +++ b/code/__DEFINES/obj_flags.dm @@ -9,7 +9,6 @@ #define ON_BLUEPRINTS (1<<5) //Are we visible on the station blueprints at roundstart? #define UNIQUE_RENAME (1<<6) // can you customize the description/name of the thing? #define USES_TGUI (1<<7) //put on things that use tgui on ui_interact instead of custom/old UI. -#define FROZEN (1<<8) #define BLOCK_Z_OUT_DOWN (1<<9) // Should this object block z falling from loc? #define BLOCK_Z_OUT_UP (1<<10) // Should this object block z uprise from loc? #define BLOCK_Z_IN_DOWN (1<<11) // Should this object block z falling from above? diff --git a/code/__DEFINES/plumbing.dm b/code/__DEFINES/plumbing.dm index 9666a5be1e16e2..39277fb1f733a1 100644 --- a/code/__DEFINES/plumbing.dm +++ b/code/__DEFINES/plumbing.dm @@ -1,9 +1,35 @@ -#define FIRST_DUCT_LAYER 1 -#define SECOND_DUCT_LAYER 2 -#define THIRD_DUCT_LAYER 4 -#define FOURTH_DUCT_LAYER 8 -#define FIFTH_DUCT_LAYER 16 +#define FIRST_DUCT_LAYER (1<<0) +#define SECOND_DUCT_LAYER (1<<1) +#define THIRD_DUCT_LAYER (1<<2) +#define FOURTH_DUCT_LAYER (1<<3) +#define FIFTH_DUCT_LAYER (1<<4) #define DUCT_LAYER_DEFAULT THIRD_DUCT_LAYER #define MACHINE_REAGENT_TRANSFER 10 //the default max plumbing machinery transfers + +/// List of plumbing layers as name => bitflag +GLOBAL_LIST_INIT(plumbing_layers, list( + "First Layer" = FIRST_DUCT_LAYER, + "Second Layer" = SECOND_DUCT_LAYER, + "Default Layer" = THIRD_DUCT_LAYER, + "Fourth Layer" = FOURTH_DUCT_LAYER, + "Fifth Layer" = FIFTH_DUCT_LAYER, +)) + +/// Reverse of plumbing_layers, as "[bitflag]" => name +GLOBAL_LIST_INIT(plumbing_layer_names, list( + "[FIRST_DUCT_LAYER]" = "First Layer", + "[SECOND_DUCT_LAYER]" = "Second Layer", + "[THIRD_DUCT_LAYER]" = "Default Layer", + "[FOURTH_DUCT_LAYER]" = "Fourth Layer", + "[FIFTH_DUCT_LAYER]" = "Fifth Layer", +)) + +/// Name of omni color +#define DUCT_COLOR_OMNI "omni" + +/// Cached radial menu options for plumbing RCD color picker +GLOBAL_LIST_EMPTY(plumbing_color_menu_options) +/// Cached radial menu options for plumbing RCD layer picker +GLOBAL_LIST_EMPTY(plumbing_layer_menu_options) diff --git a/code/__DEFINES/power.dm b/code/__DEFINES/power.dm index ec8888c43a0ffe..ff298ca9f39086 100644 --- a/code/__DEFINES/power.dm +++ b/code/__DEFINES/power.dm @@ -1,6 +1,6 @@ -#define CABLE_LAYER_1 1 -#define CABLE_LAYER_2 2 -#define CABLE_LAYER_3 4 +#define CABLE_LAYER_1 (1<<0) +#define CABLE_LAYER_2 (1<<1) +#define CABLE_LAYER_3 (1<<2) #define MACHINERY_LAYER_1 1 diff --git a/code/__DEFINES/reactions.dm b/code/__DEFINES/reactions.dm index 91889daaa45155..8d367cea1850d8 100644 --- a/code/__DEFINES/reactions.dm +++ b/code/__DEFINES/reactions.dm @@ -138,8 +138,8 @@ // BZ: /// The maximum temperature BZ can form at. Deliberately set lower than the minimum burn temperature for most combustible gases in an attempt to prevent long fuse singlecaps. #define BZ_FORMATION_MAX_TEMPERATURE (FIRE_MINIMUM_TEMPERATURE_TO_EXIST - 60) // Yes, someone used this as a bomb timer. I hate players. -/// The amount of energy ~2.5 moles of BZ forming from N2O and plasma releases. -#define BZ_FORMATION_ENERGY FIRE_CARBON_ENERGY_RELEASED +/// The amount of energy 1 mole of BZ forming from N2O and plasma releases. +#define BZ_FORMATION_ENERGY 80000 // Pluoxium: /// The minimum temperature pluoxium can form from carbon dioxide, oxygen, and tritium at. diff --git a/code/__DEFINES/research/anomalies.dm b/code/__DEFINES/research/anomalies.dm index 358fa474f98b4c..35ee0ec05ffb08 100644 --- a/code/__DEFINES/research/anomalies.dm +++ b/code/__DEFINES/research/anomalies.dm @@ -5,7 +5,7 @@ #define MAX_CORES_VORTEX 8 #define MAX_CORES_PYRO 8 #define MAX_CORES_HALLUCINATION 8 -#define MAX_CORES_DELIMBER 8 +#define MAX_CORES_BIOSCRAMBLER 8 ///Defines for the different types of explosion a flux anomaly can have #define FLUX_NO_EXPLOSION 0 diff --git a/code/__DEFINES/speech_channels.dm b/code/__DEFINES/speech_channels.dm new file mode 100644 index 00000000000000..1be25c62ac8864 --- /dev/null +++ b/code/__DEFINES/speech_channels.dm @@ -0,0 +1,5 @@ +// Used to direct channels to speak into. +#define SAY_CHANNEL "Say" +#define RADIO_CHANNEL "Radio" +#define ME_CHANNEL "Me" +#define OOC_CHANNEL "OOC" diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index aa942b9d13efef..453b0dc2047a5b 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -119,6 +119,7 @@ #define INIT_ORDER_INSTRUMENTS 82 #define INIT_ORDER_GREYSCALE 81 #define INIT_ORDER_VIS 80 +#define INIT_ORDER_SECURITY_LEVEL 79 // We need to load before events so that it has a security level to choose from. #define INIT_ORDER_DISCORD 78 #define INIT_ORDER_ACHIEVEMENTS 77 #define INIT_ORDER_STATION 74 //This is high priority because it manipulates a lot of the subsystems that will initialize after it. @@ -260,6 +261,7 @@ * * callback the callback to call on timer finish * * wait deciseconds to run the timer for * * flags flags for this timer, see: code\__DEFINES\subsystems.dm + * * timer_subsystem the subsystem to insert this timer into */ #define addtimer(args...) _addtimer(args, file = __FILE__, line = __LINE__) diff --git a/code/__DEFINES/supermatter.dm b/code/__DEFINES/supermatter.dm index e7e29fdef0209e..a78c34dbab1bed 100644 --- a/code/__DEFINES/supermatter.dm +++ b/code/__DEFINES/supermatter.dm @@ -98,7 +98,7 @@ #define GRAVITATIONAL_ANOMALY "gravitational_anomaly" #define FLUX_ANOMALY "flux_anomaly" #define PYRO_ANOMALY "pyro_anomaly" -#define DELIMBER_ANOMALY "delimber_anomaly" +#define BIOSCRAMBLER_ANOMALY "bioscrambler_anomaly" #define HALLUCINATION_ANOMALY "hallucination_anomaly" #define VORTEX_ANOMALY "vortex_anomaly" @@ -121,3 +121,14 @@ #define MAX_SPACE_EXPOSURE_DAMAGE 10 #define SUPERMATTER_CASCADE_PERCENT 80 + +/// The divisor scaling value for cubic power loss. +#define POWERLOSS_CUBIC_DIVISOR 500 +/// The power threshold required to transform power loss into a linear function. It is the power needed for the derivative of the cubic power loss to be equal to POWERLOSS_LINEAR_RATE. +#define POWERLOSS_LINEAR_THRESHOLD 5880.76 +/// The offset for the linear power loss function. It is the power loss when power is at POWERLOSS_LINEAR_THRESHOLD. +#define POWERLOSS_LINEAR_OFFSET 1627.01 +/// The rate at which the linear power loss function scales with power. +#define POWERLOSS_LINEAR_RATE 0.83 +/// How much a psychologist can reduce power loss. +#define PSYCHOLOGIST_POWERLOSS_REDUCTION 0.2 diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 03b156de66570c..f8eaac530d8292 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -140,6 +140,9 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_INCAPACITATED "incapacitated" /// In some kind of critical condition. Is able to succumb. #define TRAIT_CRITICAL_CONDITION "critical-condition" +/// Whitelist for mobs that can read or write +#define TRAIT_LITERATE "literate" +/// Blacklist for mobs that can't read or write #define TRAIT_ILLITERATE "illiterate" #define TRAIT_BLIND "blind" #define TRAIT_MUTE "mute" @@ -297,7 +300,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_GUNFLIP "gunflip" /// Increases chance of getting special traumas, makes them harder to cure #define TRAIT_SPECIAL_TRAUMA_BOOST "special_trauma_boost" -#define TRAIT_BLOODCRAWL_EAT "bloodcrawl_eat" #define TRAIT_SPACEWALK "spacewalk" /// Gets double arcade prizes #define TRAIT_GAMERGOD "gamer-god" @@ -319,6 +321,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_MARTIAL_ARTS_IMMUNE "martial_arts_immune" /// You've been cursed with a living duffelbag, and can't have more added #define TRAIT_DUFFEL_CURSE_PROOF "duffel_cursed" +/// Immune to being afflicted by time stop (spell) +#define TRAIT_TIME_STOP_IMMUNE "time_stop_immune" /// Revenants draining you only get a very small benefit. #define TRAIT_WEAK_SOUL "weak_soul" /// This mob has no soul @@ -409,6 +413,14 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// Whether or not orbiting is blocked or not #define TRAIT_ORBITING_FORBIDDEN "orbiting_forbidden" +/// Whether a spider's consumed this mob +#define TRAIT_SPIDER_CONSUMED "spider_consumed" +/// Whether we're sneaking, from the alien sneak ability. +/// Maybe worth generalizing into a general "is sneaky" / "is stealth" trait in the future. +#define TRAIT_ALIEN_SNEAK "sneaking_alien" + +/// Item still allows you to examine items while blind and actively held. +#define TRAIT_BLIND_TOOL "blind_tool" // METABOLISMS // Various jobs on the station have historically had better reactions @@ -437,8 +449,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai // Normally only present in the mind of a Research Director. #define TRAIT_ROD_SUPLEX "rod_suplex" -/// This mob is currently in rod form. -#define TRAIT_ROD_FORM "rod_form" +/// This mob is phased out of reality from magic, either a jaunt or rod form +#define TRAIT_MAGICALLY_PHASED "magically_phased" //SKILLS #define TRAIT_UNDERWATER_BASKETWEAVING_KNOWLEDGE "underwater_basketweaving" @@ -485,6 +497,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_AREA_SENSITIVE "area-sensitive" ///every hearing sensitive atom has this trait #define TRAIT_HEARING_SENSITIVE "hearing_sensitive" +///every object that is currently the active storage of some client mob has this trait +#define TRAIT_ACTIVE_STORAGE "active_storage" /// Climbable trait, given and taken by the climbable element when added or removed. Exists to be easily checked via HAS_TRAIT(). #define TRAIT_CLIMBABLE "trait_climbable" @@ -769,7 +783,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// trait associated to not having fine manipulation appendages such as hands #define LACKING_MANIPULATION_APPENDAGES_TRAIT "lacking-manipulation-appengades" #define HANDCUFFED_TRAIT "handcuffed" -/// Trait granted by [/obj/item/warpwhistle] +/// Trait granted by [/obj/item/warp_whistle] #define WARPWHISTLE_TRAIT "warpwhistle" ///Turf trait for when a turf is transparent #define TURF_Z_TRANSPARENT_TRAIT "turf_z_transparent" @@ -807,6 +821,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define ORBITING_TRAIT "orbiting" /// From the item_scaling element #define ITEM_SCALING_TRAIT "item_scaling" +/// Trait given by Objects that provide blindsight +#define ITEM_BLIND_TRAIT "blind_item_trait" /** * Trait granted by [/mob/living/carbon/Initialize] and @@ -891,3 +907,9 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// Ignores body_parts_covered during the add_fingerprint() proc. Works both on the person and the item in the glove slot. #define TRAIT_FINGERPRINT_PASSTHROUGH "fingerprint_passthrough" + +/// this object has been frozen +#define TRAIT_FROZEN "frozen" + +/// Currently fishing +#define TRAIT_GONE_FISHING "fishing" diff --git a/code/__DEFINES/turfs.dm b/code/__DEFINES/turfs.dm index 16267e3b258389..1af08fc90a9fa1 100644 --- a/code/__DEFINES/turfs.dm +++ b/code/__DEFINES/turfs.dm @@ -1,9 +1,9 @@ -#define CHANGETURF_DEFER_CHANGE 1 -#define CHANGETURF_IGNORE_AIR 2 // This flag prevents changeturf from gathering air from nearby turfs to fill the new turf with an approximation of local air -#define CHANGETURF_FORCEOP 4 -#define CHANGETURF_SKIP 8 // A flag for PlaceOnTop to just instance the new turf instead of calling ChangeTurf. Used for uninitialized turfs NOTHING ELSE -#define CHANGETURF_INHERIT_AIR 16 // Inherit air from previous turf. Implies CHANGETURF_IGNORE_AIR -#define CHANGETURF_RECALC_ADJACENT 32 //Immediately recalc adjacent atmos turfs instead of queuing. +#define CHANGETURF_DEFER_CHANGE (1<<0) +#define CHANGETURF_IGNORE_AIR (1<<1) // This flag prevents changeturf from gathering air from nearby turfs to fill the new turf with an approximation of local air +#define CHANGETURF_FORCEOP (1<<2) +#define CHANGETURF_SKIP (1<<3) // A flag for PlaceOnTop to just instance the new turf instead of calling ChangeTurf. Used for uninitialized turfs NOTHING ELSE +#define CHANGETURF_INHERIT_AIR (1<<4) // Inherit air from previous turf. Implies CHANGETURF_IGNORE_AIR +#define CHANGETURF_RECALC_ADJACENT (1<<5) //Immediately recalc adjacent atmos turfs instead of queuing. #define IS_OPAQUE_TURF(turf) (turf.directional_opacity == ALL_CARDINALS) diff --git a/code/__DEFINES/uplink.dm b/code/__DEFINES/uplink.dm index 3a7b847057c29e..d8cda44e5911c7 100644 --- a/code/__DEFINES/uplink.dm +++ b/code/__DEFINES/uplink.dm @@ -10,5 +10,5 @@ #define UPLINK_CLOWN_OPS (1 << 2) /// Progression gets turned into a user-friendly form. This is just an abstract equation that makes progression not too large. -#define DISPLAY_PROGRESSION(time) round(time/600, 0.01) +#define DISPLAY_PROGRESSION(time) round(time/60, 0.01) diff --git a/code/__DEFINES/vv.dm b/code/__DEFINES/vv.dm index 3df60080109633..bd6d2fac721393 100644 --- a/code/__DEFINES/vv.dm +++ b/code/__DEFINES/vv.dm @@ -121,7 +121,6 @@ #define VV_HK_DIRECT_CONTROL "direct_control" #define VV_HK_GIVE_DIRECT_CONTROL "give_direct_control" #define VV_HK_OFFER_GHOSTS "offer_ghosts" -#define VV_HK_SDQL_SPELL "sdql_spell" // /mob/living #define VV_HK_GIVE_SPEECH_IMPEDIMENT "impede_speech" @@ -151,22 +150,4 @@ //outfits #define VV_HK_TO_OUTFIT_EDITOR "outfit_editor" -// /obj/effect/proc_holder/spell -/// Require casting_clothes to cast spell. -#define VV_HK_SPELL_SET_ROBELESS "spell_set_robeless" -/// Require cult armor to cast spell. -#define VV_HK_SPELL_SET_CULT "spell_set_cult" -/// Require the mob to be ishuman() to cast spell. -#define VV_HK_SPELL_SET_HUMANONLY "spell_set_humanonly" -/// Require mob to not be a brain or pAI to cast spell. -#define VV_HK_SPELL_SET_NONABSTRACT "spell_set_nonabstract" -/// Spell can now be cast without casting_clothes. -#define VV_HK_SPELL_UNSET_ROBELESS "spell_unset_robeless" -/// Spell can now be cast without cult armour. -#define VV_HK_SPELL_UNSET_CULT "spell_unset_cult" -/// Any /mob can cast this spell. -#define VV_HK_SPELL_UNSET_HUMANONLY "spell_unset_humanonly" -/// Abstract mobs such as brains or pAIs can cast this spell. -#define VV_HK_SPELL_UNSET_NONABSTRACT "spell_unset_nonabstract" - #define VV_HK_WEAKREF_RESOLVE "weakref_resolve" diff --git a/code/__HELPERS/_lists.dm b/code/__HELPERS/_lists.dm index a5752f55fa0576..f5f91f3c8e719f 100644 --- a/code/__HELPERS/_lists.dm +++ b/code/__HELPERS/_lists.dm @@ -31,7 +31,7 @@ #define LAZYSET(L, K, V) if(!L) { L = list(); } L[K] = V; ///Sets the length of a lazylist #define LAZYSETLEN(L, V) if (!L) { L = list(); } L.len = V; -///Returns the lenght of the list +///Returns the length of the list #define LAZYLEN(L) length(L) ///Sets a list to null #define LAZYNULL(L) L = null diff --git a/code/__HELPERS/areas.dm b/code/__HELPERS/areas.dm index 363a760d71db4e..d2501885286fd9 100644 --- a/code/__HELPERS/areas.dm +++ b/code/__HELPERS/areas.dm @@ -176,3 +176,16 @@ GLOBAL_LIST_INIT(typecache_powerfailure_safe_areas, typecacheof(/area/station/en if(target_z == 0 || target_z == turf_in_area.z) turfs += turf_in_area return turfs + +///Takes: list of area types +///Returns: all mobs that are in an area type +/proc/mobs_in_area_type(list/area/checked_areas) + var/list/mobs_in_area = list() + for(var/mob/living/mob as anything in GLOB.mob_living_list) + if(QDELETED(mob)) + continue + for(var/area in checked_areas) + if(istype(get_area(mob), area)) + mobs_in_area += mob + break + return mobs_in_area diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 4c4d001ce4cb01..feb2736a111dfc 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -162,6 +162,14 @@ /proc/show_candidate_poll_window(mob/candidate_mob, poll_time, question, list/candidates, ignore_category, time_passed, flashwindow = TRUE) set waitfor = 0 + // Universal opt-out for all players. + if ((!candidate_mob.client.prefs.read_preference(/datum/preference/toggle/ghost_roles))) + return + + // Opt-out for admins whom are currently adminned. + if ((!candidate_mob.client.prefs.read_preference(/datum/preference/toggle/ghost_roles_as_admin)) && candidate_mob.client.holder) + return + SEND_SOUND(candidate_mob, 'sound/misc/notice2.ogg') //Alerting them to their consideration if(flashwindow) window_flash(candidate_mob.client) @@ -407,4 +415,4 @@ message = html_encode(message) else message = copytext(message, 2) - to_chat(target, span_purple("Tip of the round: [message]")) + to_chat(target, span_purple(examine_block("Tip of the round: [message]"))) diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm index 2d41fc6f1c122d..d68dfdf3ece6c2 100644 --- a/code/__HELPERS/icons.dm +++ b/code/__HELPERS/icons.dm @@ -1086,23 +1086,23 @@ GLOBAL_LIST_EMPTY(friendly_animal_types) GLOBAL_LIST_INIT(freon_color_matrix, list("#2E5E69", "#60A2A8", "#A1AFB1", rgb(0,0,0))) -/obj/proc/make_frozen_visual() - // Used to make the frozen item visuals for Freon. - if(resistance_flags & FREEZE_PROOF) - return - if(!(obj_flags & FROZEN)) - name = "frozen [name]" - add_atom_colour(GLOB.freon_color_matrix, TEMPORARY_COLOUR_PRIORITY) - alpha -= 25 - obj_flags |= FROZEN - //Assumes already frozed /obj/proc/make_unfrozen() - if(obj_flags & FROZEN) - name = replacetext(name, "frozen ", "") - remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, GLOB.freon_color_matrix) - alpha += 25 - obj_flags &= ~FROZEN + SEND_SIGNAL(src, COMSIG_OBJ_UNFREEZE) + +/// generates a filename for a given asset. +/// like generate_asset_name(), except returns the rsc reference and the rsc file hash as well as the asset name (sans extension) +/// used so that certain asset files dont have to be hashed twice +/proc/generate_and_hash_rsc_file(file, dmi_file_path) + var/rsc_ref = fcopy_rsc(file) + var/hash + //if we have a valid dmi file path we can trust md5'ing the rsc file because we know it doesnt have the bug described in http://www.byond.com/forum/post/2611357 + if(dmi_file_path) + hash = md5(rsc_ref) + else //otherwise, we need to do the expensive fcopy() workaround + hash = md5asfile(rsc_ref) + + return list(rsc_ref, hash, "asset.[hash]") /// Generate a filename for this asset /// The same asset will always lead to the same asset name @@ -1127,14 +1127,88 @@ GLOBAL_LIST_INIT(freon_color_matrix, list("#2E5E69", "#60A2A8", "#A1AFB1", rgb(0 dummySave = null fdel("tmp/dummySave.sav") //if you get the idea to try and make this more optimized, make sure to still call unlock on the savefile after every write to unlock it. -/proc/icon2html(thing, target, icon_state, dir = SOUTH, frame = 1, moving = FALSE, sourceonly = FALSE, extra_classes = null) +///given a text string, returns whether it is a valid dmi icons folder path +/proc/is_valid_dmi_file(icon_path) + if(!istext(icon_path) || !length(icon_path)) + return FALSE + + var/is_in_icon_folder = findtextEx(icon_path, "icons/") + var/is_dmi_file = findtextEx(icon_path, ".dmi") + + if(is_in_icon_folder && is_dmi_file) + return TRUE + return FALSE + +/// given an icon object, dmi file path, or atom/image/mutable_appearance, attempts to find and return an associated dmi file path. +/// a weird quirk about dm is that /icon objects represent both compile-time or dynamic icons in the rsc, +/// but stringifying rsc references returns a dmi file path +/// ONLY if that icon represents a completely unchanged dmi file from when the game was compiled. +/// so if the given object is associated with an icon that was in the rsc when the game was compiled, this returns a path. otherwise it returns "" +/proc/get_icon_dmi_path(icon/icon) + /// the dmi file path we attempt to return if the given object argument is associated with a stringifiable icon + /// if successful, this looks like "icons/path/to/dmi_file.dmi" + var/icon_path = "" + + if(isatom(icon) || istype(icon, /image) || istype(icon, /mutable_appearance)) + var/atom/atom_icon = icon + icon = atom_icon.icon + //atom icons compiled in from 'icons/path/to/dmi_file.dmi' are weird and not really icon objects that you generate with icon(). + //if theyre unchanged dmi's then they're stringifiable to "icons/path/to/dmi_file.dmi" + + if(isicon(icon) && isfile(icon)) + //icons compiled in from 'icons/path/to/dmi_file.dmi' at compile time are weird and arent really /icon objects, + ///but they pass both isicon() and isfile() checks. theyre the easiest case since stringifying them gives us the path we want + var/icon_ref = "\ref[icon]" + var/locate_icon_string = "[locate(icon_ref)]" + + icon_path = locate_icon_string + + else if(isicon(icon) && "[icon]" == "/icon") + // icon objects generated from icon() at runtime are icons, but they ARENT files themselves, they represent icon files. + // if the files they represent are compile time dmi files in the rsc, then + // the rsc reference returned by fcopy_rsc() will be stringifiable to "icons/path/to/dmi_file.dmi" + var/rsc_ref = fcopy_rsc(icon) + + var/icon_ref = "\ref[rsc_ref]" + + var/icon_path_string = "[locate(icon_ref)]" + + icon_path = icon_path_string + + else if(istext(icon)) + var/rsc_ref = fcopy_rsc(icon) + //if its the text path of an existing dmi file, the rsc reference returned by fcopy_rsc() will be stringifiable to a dmi path + + var/rsc_ref_ref = "\ref[rsc_ref]" + var/rsc_ref_string = "[locate(rsc_ref_ref)]" + + icon_path = rsc_ref_string + + if(is_valid_dmi_file(icon_path)) + return icon_path + + return FALSE + +/** + * generate an asset for the given icon or the icon of the given appearance for [thing], and send it to any clients in target. + * Arguments: + * * thing - either a /icon object, or an object that has an appearance (atom, image, mutable_appearance). + * * target - either a reference to or a list of references to /client's or mobs with clients + * * icon_state - string to force a particular icon_state for the icon to be used + * * dir - dir number to force a particular direction for the icon to be used + * * frame - what frame of the icon_state's animation for the icon being used + * * moving - whether or not to use a moving state for the given icon + * * sourceonly - if TRUE, only generate the asset and send back the asset url, instead of tags that display the icon to players + * * extra_clases - string of extra css classes to use when returning the icon string + */ +/proc/icon2html(atom/thing, client/target, icon_state, dir = SOUTH, frame = 1, moving = FALSE, sourceonly = FALSE, extra_classes = null) if (!thing) return if(SSlag_switch.measures[DISABLE_USR_ICON2HTML] && usr && !HAS_TRAIT(usr, TRAIT_BYPASS_MEASURES)) return var/key - var/icon/I = thing + var/icon/icon2collapse = thing if (!target) return @@ -1146,10 +1220,14 @@ GLOBAL_LIST_INIT(freon_color_matrix, list("#2E5E69", "#60A2A8", "#A1AFB1", rgb(0 targets = list(target) else targets = target - if (!targets.len) - return + if(!length(targets)) + return + + //check if the given object is associated with a dmi file in the icons folder. if it is then we dont need to do a lot of work + //for asset generation to get around byond limitations + var/icon_path = get_icon_dmi_path(thing) - if (!isicon(I)) + if (!isicon(icon2collapse)) if (isfile(thing)) //special snowflake var/name = SANITIZE_FILENAME("[generate_asset_name(thing)].png") if (!SSassets.cache[name]) @@ -1159,25 +1237,25 @@ GLOBAL_LIST_INIT(freon_color_matrix, list("#2E5E69", "#60A2A8", "#A1AFB1", rgb(0 if(sourceonly) return SSassets.transport.get_asset_url(name) return "" - var/atom/A = thing - I = A.icon + //its either an atom, image, or mutable_appearance, we want its icon var + icon2collapse = thing.icon if (isnull(icon_state)) - icon_state = A.icon_state + icon_state = thing.icon_state //Despite casting to atom, this code path supports mutable appearances, so let's be nice to them - if(isnull(icon_state) || (isatom(thing) && A.flags_1 & HTML_USE_INITAL_ICON_1)) - icon_state = initial(A.icon_state) + if(isnull(icon_state) || (isatom(thing) && thing.flags_1 & HTML_USE_INITAL_ICON_1)) + icon_state = initial(thing.icon_state) if (isnull(dir)) - dir = initial(A.dir) + dir = initial(thing.dir) if (isnull(dir)) - dir = A.dir + dir = thing.dir if (ishuman(thing)) // Shitty workaround for a BYOND issue. - var/icon/temp = I - I = icon() - I.Insert(temp, dir = SOUTH) + var/icon/temp = icon2collapse + icon2collapse = icon() + icon2collapse.Insert(temp, dir = SOUTH) dir = SOUTH else if (isnull(dir)) @@ -1185,13 +1263,18 @@ GLOBAL_LIST_INIT(freon_color_matrix, list("#2E5E69", "#60A2A8", "#A1AFB1", rgb(0 if (isnull(icon_state)) icon_state = "" - I = icon(I, icon_state, dir, frame, moving) + icon2collapse = icon(icon2collapse, icon_state, dir, frame, moving) + + var/list/name_and_ref = generate_and_hash_rsc_file(icon2collapse, icon_path)//pretend that tuples exist + + var/rsc_ref = name_and_ref[1] //weird object thats not even readable to the debugger, represents a reference to the icons rsc entry + var/file_hash = name_and_ref[2] + key = "[name_and_ref[3]].png" - key = "[generate_asset_name(I)].png" if(!SSassets.cache[key]) - SSassets.transport.register_asset(key, I) - for (var/thing2 in targets) - SSassets.transport.send_assets(thing2, key) + SSassets.transport.register_asset(key, rsc_ref, file_hash, icon_path) + for (var/client_target in targets) + SSassets.transport.send_assets(client_target, key) if(sourceonly) return SSassets.transport.get_asset_url(key) return "" diff --git a/code/__HELPERS/levels.dm b/code/__HELPERS/levels.dm new file mode 100644 index 00000000000000..218c1013bed83c --- /dev/null +++ b/code/__HELPERS/levels.dm @@ -0,0 +1,19 @@ +/** + * - is_valid_z_level + * + * Checks if source_loc and checking_loc is both on the station, or on the same z level. + * This is because the station's several levels aren't considered the same z, so multi-z stations need this special case. + * + * Args: + * source_loc - turf of the source we're comparing. + * checking_loc - turf we are comparing to source_loc. + * + * returns TRUE if connection is valid, FALSE otherwise. + */ +/proc/is_valid_z_level(turf/source_loc, turf/checking_loc) + // if we're both on "station", regardless of multi-z, we'll pass by. + if(is_station_level(source_loc.z) && is_station_level(checking_loc.z)) + return TRUE + if(source_loc.z == checking_loc.z) + return TRUE + return FALSE diff --git a/code/__HELPERS/logging/_logging.dm b/code/__HELPERS/logging/_logging.dm index 30f34a4f7b6cd6..ac0181d5282f27 100644 --- a/code/__HELPERS/logging/_logging.dm +++ b/code/__HELPERS/logging/_logging.dm @@ -114,6 +114,8 @@ GLOBAL_LIST_INIT(testing_global_profiler, list("_PROFILE_NAME" = "Global")) log_mecha(log_text) if(LOG_SHUTTLE) log_shuttle(log_text) + if(LOG_SPEECH_INDICATORS) + log_speech_indicators(log_text) else stack_trace("Invalid individual logging type: [message_type]. Defaulting to [LOG_GAME] (LOG_GAME).") log_game(log_text) diff --git a/code/__HELPERS/logging/talk.dm b/code/__HELPERS/logging/talk.dm index 86382f6a339d11..bed13b6c3505e6 100644 --- a/code/__HELPERS/logging/talk.dm +++ b/code/__HELPERS/logging/talk.dm @@ -40,3 +40,8 @@ /proc/log_telecomms(text) if (CONFIG_GET(flag/log_telecomms)) WRITE_LOG(GLOB.world_telecomms_log, "TCOMMS: [text]") + +/// Logging for speech indicators. +/proc/log_speech_indicators(text) + if (CONFIG_GET(flag/log_speech_indicators)) + WRITE_LOG(GLOB.world_speech_indicators_log, "SPEECH INDICATOR: [text]") diff --git a/code/__HELPERS/logging/tools.dm b/code/__HELPERS/logging/tools.dm deleted file mode 100644 index 4c5f2d3e65558c..00000000000000 --- a/code/__HELPERS/logging/tools.dm +++ /dev/null @@ -1,3 +0,0 @@ -/proc/log_tool(text, mob/initiator) - if(CONFIG_GET(flag/log_tools)) - WRITE_LOG(GLOB.world_tool_log, "TOOL: [text]") diff --git a/code/__HELPERS/maths.dm b/code/__HELPERS/maths.dm index 49cab9bf273cfd..9d67466cf5b307 100644 --- a/code/__HELPERS/maths.dm +++ b/code/__HELPERS/maths.dm @@ -1,11 +1,21 @@ -///Calculate the angle between two points and the west|east coordinate +///Calculate the angle between two movables and the west|east coordinate /proc/get_angle(atom/movable/start, atom/movable/end)//For beams. if(!start || !end) return 0 - var/dy - var/dx - dy=(32 * end.y + end.pixel_y) - (32 * start.y + start.pixel_y) - dx=(32 * end.x + end.pixel_x) - (32 * start.x + start.pixel_x) + var/dy =(32 * end.y + end.pixel_y) - (32 * start.y + start.pixel_y) + var/dx =(32 * end.x + end.pixel_x) - (32 * start.x + start.pixel_x) + if(!dy) + return (dx >= 0) ? 90 : 270 + . = arctan(dx/dy) + if(dy < 0) + . += 180 + else if(dx < 0) + . += 360 + +/// 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) if(!dy) return (dx >= 0) ? 90 : 270 . = arctan(dx/dy) diff --git a/code/__HELPERS/randoms.dm b/code/__HELPERS/randoms.dm index 7d425c70c88104..a772f65a3140b9 100644 --- a/code/__HELPERS/randoms.dm +++ b/code/__HELPERS/randoms.dm @@ -1,6 +1,9 @@ ///Get a random food item exluding the blocked ones /proc/get_random_food() - var/list/blocked = list(/obj/item/food/bread, + var/list/blocked = list( + /obj/item/food/drug, + /obj/item/food/spaghetti, + /obj/item/food/bread, /obj/item/food/breadslice, /obj/item/food/cake, /obj/item/food/cakeslice, diff --git a/code/__HELPERS/reagents.dm b/code/__HELPERS/reagents.dm index bfd00ed46988c9..12be82c4c654c4 100644 --- a/code/__HELPERS/reagents.dm +++ b/code/__HELPERS/reagents.dm @@ -79,12 +79,12 @@ GLOB.chemical_reactions_list_reactant_index[primary_reagent] += R //Creates foam from the reagent. Metaltype is for metal foam, notification is what to show people in textbox -/datum/reagents/proc/create_foam(foamtype, foam_volume, result_type = null, notification = null) +/datum/reagents/proc/create_foam(foamtype, foam_volume, result_type = null, notification = null, log = FALSE) var/location = get_turf(my_atom) var/datum/effect_system/fluid_spread/foam/foam = new foamtype() - foam.set_up(amount = foam_volume, location = location, carry = src, result_type = result_type) - foam.start() + foam.set_up(amount = foam_volume, holder = my_atom, location = location, carry = src, result_type = result_type) + foam.start(log = log) clear_reagents() if(!notification) diff --git a/code/__HELPERS/turfs.dm b/code/__HELPERS/turfs.dm index 5da17c67f311d3..0d0126b48b12a3 100644 --- a/code/__HELPERS/turfs.dm +++ b/code/__HELPERS/turfs.dm @@ -229,8 +229,8 @@ Turf and target are separate in case you want to teleport some distance from a t var/turf/atom_turf = get_turf(checked_atom) //use checked_atom's turfs, as it's coords are the same as checked_atom's AND checked_atom's coords are lost if it is inside another atom if(!atom_turf) return null - var/final_x = atom_turf.x + rough_x - var/final_y = atom_turf.y + rough_y + var/final_x = clamp(atom_turf.x + rough_x, 1, world.maxx) + var/final_y = clamp(atom_turf.y + rough_y, 1, world.maxy) if(final_x || final_y) return locate(final_x, final_y, atom_turf.z) diff --git a/code/_compile_options.dm b/code/_compile_options.dm index 94d17a40bcba56..a4ccce442cae5c 100644 --- a/code/_compile_options.dm +++ b/code/_compile_options.dm @@ -35,6 +35,11 @@ */ //#define REAGENTS_TESTING +// Displays static object lighting updates +// Also enables some debug vars on sslighting that can be used to modify +// How extensively we prune lighting corners to update +#define VISUALIZE_LIGHT_UPDATES + #define VISUALIZE_ACTIVE_TURFS //Highlights atmos active turfs in green #define TRACK_MAX_SHARE //Allows max share tracking, for use in the atmos debugging ui #endif //ifdef TESTING diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index 8f20ed4f0b7d88..79067e9666da4b 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -274,7 +274,6 @@ DEFINE_BITFIELD(obj_flags, list( "CAN_BE_HIT" = CAN_BE_HIT, "DANGEROUS_POSSESSION" = DANGEROUS_POSSESSION, "EMAGGED" = EMAGGED, - "FROZEN" = FROZEN, "IN_USE" = IN_USE, "NO_BUILD" = NO_BUILD, "ON_BLUEPRINTS" = ON_BLUEPRINTS, diff --git a/code/_globalvars/lists/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm index 81224a93dc6c36..2f97a7816a83c9 100644 --- a/code/_globalvars/lists/maintenance_loot.dm +++ b/code/_globalvars/lists/maintenance_loot.dm @@ -289,6 +289,7 @@ GLOBAL_LIST_INIT(rarity_loot, list(//rare: really good items /obj/item/shield/riot/buckler = 1, /obj/item/throwing_star = 1, /obj/item/weldingtool/hugetank = 1, + /obj/item/fishing_rod/master = 1, ) = 1, list(//equipment diff --git a/code/_globalvars/logging.dm b/code/_globalvars/logging.dm index fc7368b6cdac8f..31447e7cc50b39 100644 --- a/code/_globalvars/logging.dm +++ b/code/_globalvars/logging.dm @@ -33,6 +33,8 @@ GLOBAL_VAR(world_uplink_log) GLOBAL_PROTECT(world_uplink_log) GLOBAL_VAR(world_telecomms_log) GLOBAL_PROTECT(world_telecomms_log) +GLOBAL_VAR(world_speech_indicators_log) +GLOBAL_PROTECT(world_speech_indicators_log) GLOBAL_VAR(world_manifest_log) GLOBAL_PROTECT(world_manifest_log) GLOBAL_VAR(query_debug_log) diff --git a/code/_globalvars/phobias.dm b/code/_globalvars/phobias.dm index 07c46d9f5b029c..73cd02df93c63a 100644 --- a/code/_globalvars/phobias.dm +++ b/code/_globalvars/phobias.dm @@ -222,6 +222,8 @@ GLOBAL_LIST_INIT(phobia_objs, list( /obj/item/toy/figure/hop, /obj/item/toy/figure/hos, /obj/item/toy/figure/rd, + /obj/item/toy/plush/abductor, + /obj/item/toy/plush/abductor/agent, /obj/machinery/atmospherics/miner, /obj/machinery/door/airlock/centcom, )), @@ -353,6 +355,8 @@ GLOBAL_LIST_INIT(phobia_objs, list( /obj/item/stack/sheet/mineral/abductor, /obj/item/surgicaldrill/alien, /obj/item/toy/toy_xeno, + /obj/item/toy/plush/abductor, + /obj/item/toy/plush/abductor/agent, /obj/item/weldingtool/abductor, /obj/item/wirecutters/abductor, /obj/item/wrench/abductor, diff --git a/code/_globalvars/traits.dm b/code/_globalvars/traits.dm index 6e7ffe5a38ad1e..042882340364cf 100644 --- a/code/_globalvars/traits.dm +++ b/code/_globalvars/traits.dm @@ -13,6 +13,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_RESTRAINED" = TRAIT_RESTRAINED, "TRAIT_INCAPACITATED" = TRAIT_INCAPACITATED, "TRAIT_CRITICAL_CONDITION" = TRAIT_CRITICAL_CONDITION, + "TRAIT_LITERATE" = TRAIT_LITERATE, "TRAIT_ILLITERATE" = TRAIT_ILLITERATE, "TRAIT_BLIND" = TRAIT_BLIND, "TRAIT_MUTE" = TRAIT_MUTE, @@ -119,7 +120,6 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_PRIMITIVE" = TRAIT_PRIMITIVE, //unable to use mechs. Given to Ash Walkers "TRAIT_GUNFLIP" = TRAIT_GUNFLIP, "TRAIT_SPECIAL_TRAUMA_BOOST" = TRAIT_SPECIAL_TRAUMA_BOOST, - "TRAIT_BLOODCRAWL_EAT" = TRAIT_BLOODCRAWL_EAT, "TRAIT_SPACEWALK" = TRAIT_SPACEWALK, "TRAIT_GAMERGOD" = TRAIT_GAMERGOD, "TRAIT_GIANT" = TRAIT_GIANT, diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 5b3e8966f72d19..5c8ca3cd6cbf14 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -213,11 +213,13 @@ for(var/atom/target in checking) // will filter out nulls if(closed[target] || isarea(target)) // avoid infinity situations continue - closed[target] = TRUE + if(isturf(target) || isturf(target.loc) || (target in direct_access) || (ismovable(target) && target.flags_1 & IS_ONTOP_1)) //Directly accessible atoms if(Adjacent(target) || (tool && CheckToolReach(src, target, tool.reach))) //Adjacent or reaching attacks return TRUE + closed[target] = TRUE + if (!target.loc) continue diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index d92915c9acd127..96503c1822a513 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -94,7 +94,7 @@ static_inventory += using inv_box = new /atom/movable/screen/inventory() - inv_box.name = "i_clothing" + inv_box.name = "uniform" inv_box.icon = ui_style inv_box.slot_id = ITEM_SLOT_ICLOTHING inv_box.icon_state = "uniform" @@ -103,7 +103,7 @@ toggleable_inventory += inv_box inv_box = new /atom/movable/screen/inventory() - inv_box.name = "o_clothing" + inv_box.name = "suit" inv_box.icon = ui_style inv_box.slot_id = ITEM_SLOT_OCLOTHING inv_box.icon_state = "suit" @@ -164,7 +164,7 @@ static_inventory += inv_box inv_box = new /atom/movable/screen/inventory() - inv_box.name = "storage1" + inv_box.name = "left pocket" inv_box.icon = ui_style inv_box.icon_state = "pocket" inv_box.screen_loc = ui_storage1 @@ -173,7 +173,7 @@ static_inventory += inv_box inv_box = new /atom/movable/screen/inventory() - inv_box.name = "storage2" + inv_box.name = "right pocket" inv_box.icon = ui_style inv_box.icon_state = "pocket" inv_box.screen_loc = ui_storage2 diff --git a/code/_onclick/hud/new_player.dm b/code/_onclick/hud/new_player.dm index 373a4e1cda9b50..6946faa6885aff 100644 --- a/code/_onclick/hud/new_player.dm +++ b/code/_onclick/hud/new_player.dm @@ -2,8 +2,13 @@ /datum/hud/new_player/New(mob/owner) ..() - if (owner?.client?.interviewee) + + if(!owner || !owner.client) + return + + if (owner.client.interviewee) return + var/list/buttons = subtypesof(/atom/movable/screen/lobby) for(var/button_type in buttons) var/atom/movable/screen/lobby/lobbyscreen = new button_type() @@ -41,6 +46,9 @@ if(owner != REF(usr)) return + if(!usr.client || usr.client.interviewee) + return + . = ..() if(!enabled) @@ -53,6 +61,9 @@ if(owner != REF(usr)) return + if(!usr.client || usr.client.interviewee) + return + . = ..() highlighted = TRUE update_appearance(UPDATE_ICON) @@ -61,6 +72,9 @@ if(owner != REF(usr)) return + if(!usr.client || usr.client.interviewee) + return + . = ..() highlighted = FALSE update_appearance(UPDATE_ICON) diff --git a/code/_onclick/hud/parallax.dm b/code/_onclick/hud/parallax.dm index 11316c3a77cc12..a61513181fa35d 100755 --- a/code/_onclick/hud/parallax.dm +++ b/code/_onclick/hud/parallax.dm @@ -324,6 +324,7 @@ INITIALIZE_IMMEDIATE(/atom/movable/screen/parallax_layer) /atom/movable/screen/parallax_layer/random/asteroids icon_state = "asteroids" + layer = 4 /atom/movable/screen/parallax_layer/planet icon_state = "planet" diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index fbe5d977573df9..b88ddcdd9455a7 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -242,18 +242,21 @@ /area/attacked_by(obj/item/attacking_item, mob/living/user) CRASH("areas are NOT supposed to have attacked_by() called on them!") -/mob/living/attacked_by(obj/item/I, mob/living/user) - send_item_attack_message(I, user) - if(I.force) - apply_damage(I.force, I.damtype) - if(I.damtype == BRUTE) - if(prob(33)) - I.add_mob_blood(src) - var/turf/location = get_turf(src) - add_splatter_floor(location) - if(get_dist(user, src) <= 1) //people with TK won't get smeared with blood - user.add_mob_blood(src) - return TRUE //successful attack +/mob/living/attacked_by(obj/item/attacking_item, mob/living/user) + send_item_attack_message(attacking_item, user) + if(!attacking_item.force) + return FALSE + var/damage = attacking_item.force + if(mob_biotypes & MOB_ROBOTIC) + damage *= attacking_item.demolition_mod + apply_damage(damage, attacking_item.damtype) + if(attacking_item.damtype == BRUTE && prob(33)) + attacking_item.add_mob_blood(src) + var/turf/location = get_turf(src) + add_splatter_floor(location) + if(get_dist(user, src) <= 1) //people with TK won't get smeared with blood + user.add_mob_blood(src) + return TRUE //successful attack /mob/living/simple_animal/attacked_by(obj/item/I, mob/living/user) if(!attack_threshold_check(I.force, I.damtype, MELEE, FALSE)) diff --git a/code/_onclick/observer.dm b/code/_onclick/observer.dm index b1f8e627375b96..4ac8c1739ea515 100644 --- a/code/_onclick/observer.dm +++ b/code/_onclick/observer.dm @@ -54,7 +54,7 @@ if(SEND_SIGNAL(src, COMSIG_ATOM_ATTACK_GHOST, user) & COMPONENT_CANCEL_ATTACK_CHAIN) return TRUE if(user.client) - if(user.gas_scan && atmos_scan(user=user, target=src, tool=null, silent=TRUE)) + if(user.gas_scan && atmos_scan(user=user, target=src, silent=TRUE)) return TRUE else if(isAdminGhostAI(user)) attack_ai(user) diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm index 3dcb55a3b93a6b..a42c03f7371b41 100644 --- a/code/controllers/configuration/entries/game_options.dm +++ b/code/controllers/configuration/entries/game_options.dm @@ -103,6 +103,8 @@ /datum/config_entry/flag/enforce_human_authority //If non-human species are barred from joining as a head of staff +/datum/config_entry/flag/enforce_human_authority_on_everyone //If non-human species are barred from joining as a head of staff, including jobs flagged as allowed for non-humans, ie. Quartermaster. + /datum/config_entry/flag/allow_latejoin_antagonists // If late-joining players can be traitor/changeling /datum/config_entry/number/shuttle_refuel_delay @@ -387,11 +389,13 @@ min_val = 0 integer = FALSE // It is in hours, but just in case one wants to specify minutes. -/datum/config_entry/flag/sdql_spells - /datum/config_entry/flag/native_fov +/datum/config_entry/flag/disallow_title_music + /datum/config_entry/number/station_goal_budget default = 1 min_val = 0 integer = FALSE + +/datum/config_entry/flag/disallow_circuit_sounds diff --git a/code/controllers/configuration/entries/general.dm b/code/controllers/configuration/entries/general.dm index ec482d3ad6542d..65fce5d270fc2d 100644 --- a/code/controllers/configuration/entries/general.dm +++ b/code/controllers/configuration/entries/general.dm @@ -131,6 +131,9 @@ /// log telecomms messages /datum/config_entry/flag/log_telecomms +/// log speech indicators(started/stopped speaking) +/datum/config_entry/flag/log_speech_indicators + /// log certain expliotable parrots and other such fun things in a JSON file of twitter valid phrases. /datum/config_entry/flag/log_twitter diff --git a/code/controllers/subsystem/explosions.dm b/code/controllers/subsystem/explosions.dm index a9e435742adc15..faa33a3b0e8a8d 100644 --- a/code/controllers/subsystem/explosions.dm +++ b/code/controllers/subsystem/explosions.dm @@ -528,18 +528,18 @@ SUBSYSTEM_DEF(explosions) var/base_shake_amount = sqrt(near_distance / (distance + 1)) if(distance <= round(near_distance + world.view - 2, 1)) // If you are close enough to see the effects of the explosion first-hand (ignoring walls) - listener.playsound_local(epicenter, null, 100, TRUE, frequency, S = near_sound) + listener.playsound_local(epicenter, null, 100, TRUE, frequency, sound_to_use = near_sound) if(base_shake_amount > 0) shake_camera(listener, NEAR_SHAKE_DURATION, clamp(base_shake_amount, 0, NEAR_SHAKE_CAP)) else if(distance < far_distance) // You can hear a far explosion if you are outside the blast radius. Small explosions shouldn't be heard throughout the station. var/far_volume = clamp(far_distance / 2, FAR_LOWER, FAR_UPPER) if(creaking) - listener.playsound_local(epicenter, null, far_volume, TRUE, frequency, S = creaking_sound, distance_multiplier = 0) + listener.playsound_local(epicenter, null, far_volume, TRUE, frequency, sound_to_use = creaking_sound, distance_multiplier = 0) else if(prob(FAR_SOUND_PROB)) // Sound variety during meteor storm/tesloose/other bad event - listener.playsound_local(epicenter, null, far_volume, TRUE, frequency, S = far_sound, distance_multiplier = 0) + listener.playsound_local(epicenter, null, far_volume, TRUE, frequency, sound_to_use = far_sound, distance_multiplier = 0) else - listener.playsound_local(epicenter, null, far_volume, TRUE, frequency, S = echo_sound, distance_multiplier = 0) + listener.playsound_local(epicenter, null, far_volume, TRUE, frequency, sound_to_use = echo_sound, distance_multiplier = 0) if(base_shake_amount || quake_factor) base_shake_amount = max(base_shake_amount, quake_factor * 3, 0) // Devastating explosions rock the station and ground @@ -552,7 +552,7 @@ SUBSYSTEM_DEF(explosions) shake_camera(listener, FAR_SHAKE_DURATION, clamp(quake_factor / 4, 0, FAR_SHAKE_CAP)) else echo_volume = 40 - listener.playsound_local(epicenter, null, echo_volume, TRUE, frequency, S = echo_sound, distance_multiplier = 0) + listener.playsound_local(epicenter, null, echo_volume, TRUE, frequency, sound_to_use = echo_sound, distance_multiplier = 0) if(creaking) // 5 seconds after the bang, the station begins to creak addtimer(CALLBACK(listener, /mob/proc/playsound_local, epicenter, null, rand(FREQ_LOWER, FREQ_UPPER), TRUE, frequency, null, null, FALSE, hull_creaking_sound, 0), CREAK_DELAY) diff --git a/code/controllers/subsystem/id_access.dm b/code/controllers/subsystem/id_access.dm index 5ab65198e94f36..e5e85c51892459 100644 --- a/code/controllers/subsystem/id_access.dm +++ b/code/controllers/subsystem/id_access.dm @@ -188,6 +188,12 @@ SUBSYSTEM_DEF(id_access) "templates" = list(), "pdas" = list(), ), + "[ACCESS_QM]" = list( + "regions" = list(REGION_SUPPLY), + "head" = JOB_QUARTERMASTER, + "templates" = list(), + "pdas" = list(), + ), ) var/list/station_job_trims = subtypesof(/datum/id_trim/job) @@ -289,7 +295,7 @@ SUBSYSTEM_DEF(id_access) desc_by_access["[ACCESS_THEATRE]"] = "Theatre" desc_by_access["[ACCESS_RESEARCH]"] = "Science" desc_by_access["[ACCESS_MINING]"] = "Mining" - desc_by_access["[ACCESS_MAIL_SORTING]"] = "Cargo Office" + desc_by_access["[ACCESS_SHIPPING]"] = "Cargo Shipping" desc_by_access["[ACCESS_VAULT]"] = "Main Vault" desc_by_access["[ACCESS_MINING_STATION]"] = "Mining EVA" desc_by_access["[ACCESS_XENOBIOLOGY]"] = "Xenobiology Lab" diff --git a/code/controllers/subsystem/input.dm b/code/controllers/subsystem/input.dm index 246ab84768a727..0b80692ffbc34b 100644 --- a/code/controllers/subsystem/input.dm +++ b/code/controllers/subsystem/input.dm @@ -24,7 +24,7 @@ SUBSYSTEM_DEF(input) "Any" = "\"KeyDown \[\[*\]\]\"", "Any+UP" = "\"KeyUp \[\[*\]\]\"", "Back" = "\".winset \\\"input.text=\\\"\\\"\\\"\"", - "Tab" = "\".winset \\\"input.focus=true?map.focus=true input.background-color=[COLOR_INPUT_DISABLED]:input.focus=true input.background-color=[COLOR_INPUT_ENABLED]\\\"\"", + "Tab" = "\".winset \\\"input.focus=true?map.focus=true:input.focus=true\\\"\"", "Escape" = "Reset-Held-Keys", ) diff --git a/code/controllers/subsystem/lighting.dm b/code/controllers/subsystem/lighting.dm index 29999a8ff46cda..378a849dfa1672 100644 --- a/code/controllers/subsystem/lighting.dm +++ b/code/controllers/subsystem/lighting.dm @@ -6,6 +6,10 @@ SUBSYSTEM_DEF(lighting) var/static/list/sources_queue = list() // List of lighting sources queued for update. var/static/list/corners_queue = list() // List of lighting corners queued for update. var/static/list/objects_queue = list() // List of lighting objects queued for update. +#ifdef VISUALIZE_LIGHT_UPDATES + var/allow_duped_values = FALSE + var/allow_duped_corners = FALSE +#endif /datum/controller/subsystem/lighting/stat_entry(msg) msg = "L:[length(sources_queue)]|C:[length(corners_queue)]|O:[length(objects_queue)]" diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index 16dc37b6a19760..23167d6edf8b1b 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -40,14 +40,21 @@ SUBSYSTEM_DEF(mapping) // Z-manager stuff var/station_start // should only be used for maploading-related tasks var/space_levels_so_far = 0 - ///list of all the z level datums created representing the z levels in the world - var/list/z_list + ///list of all z level datums in the order of their z (z level 1 is at index 1, etc.) + var/list/datum/space_level/z_list + ///list of all z level indices that form multiz connections and whether theyre linked up or down + ///list of lists, inner lists are of the form: list("up or down link direction" = TRUE) + var/list/multiz_levels = list() var/datum/space_level/transit var/datum/space_level/empty_space var/num_of_res_levels = 1 /// True when in the process of adding a new Z-level, global locking var/adding_new_zlevel = FALSE + ///shows the default gravity value for each z level. recalculated when gravity generators change. + ///associative list of the form: list("[z level num]" = max generator gravity in that z level OR the gravity level trait) + var/list/gravity_by_z_level = list() + /datum/controller/subsystem/mapping/New() ..() #ifdef FORCE_MAP @@ -101,8 +108,48 @@ SUBSYSTEM_DEF(mapping) generate_station_area_list() initialize_reserved_level(transit.z_value) SSticker.OnRoundstart(CALLBACK(src, .proc/spawn_maintenance_loot)) + generate_z_level_linkages() + calculate_default_z_level_gravities() + return ..() +/datum/controller/subsystem/mapping/proc/calculate_default_z_level_gravities() + for(var/z_level in 1 to length(z_list)) + calculate_z_level_gravity(z_level) + +/datum/controller/subsystem/mapping/proc/generate_z_level_linkages() + for(var/z_level in 1 to length(z_list)) + generate_linkages_for_z_level(z_level) + +/datum/controller/subsystem/mapping/proc/generate_linkages_for_z_level(z_level) + if(!isnum(z_level) || z_level <= 0) + return FALSE + + if(multiz_levels.len < z_level) + multiz_levels.len = z_level + + var/linked_down = level_trait(z_level, ZTRAIT_DOWN) + var/linked_up = level_trait(z_level, ZTRAIT_UP) + multiz_levels[z_level] = list() + if(linked_down) + multiz_levels[z_level]["[DOWN]"] = TRUE + if(linked_up) + multiz_levels[z_level]["[UP]"] = TRUE + +/datum/controller/subsystem/mapping/proc/calculate_z_level_gravity(z_level_number) + if(!isnum(z_level_number) || z_level_number < 1) + return FALSE + + var/max_gravity = 0 + + for(var/obj/machinery/gravity_generator/main/grav_gen as anything in GLOB.gravity_generators["[z_level_number]"]) + max_gravity = max(grav_gen.setting, max_gravity) + + max_gravity = max_gravity || level_trait(z_level_number, ZTRAIT_GRAVITY) || 0//just to make sure no nulls + gravity_by_z_level["[z_level_number]"] = max_gravity + return max_gravity + + /** * ##setup_ruins * @@ -215,6 +262,7 @@ Used by the AI doomsday and the self-destruct nuke. clearing_reserved_turfs = SSmapping.clearing_reserved_turfs z_list = SSmapping.z_list + multiz_levels = SSmapping.multiz_levels #define INIT_ANNOUNCE(X) to_chat(world, span_boldannounce("[X]")); log_world(X) /datum/controller/subsystem/mapping/proc/LoadGroup(list/errorList, name, path, files, list/traits, list/default_traits, silent = FALSE) diff --git a/code/controllers/subsystem/mobs.dm b/code/controllers/subsystem/mobs.dm index f96ae843e52178..da5a48f46dab5a 100644 --- a/code/controllers/subsystem/mobs.dm +++ b/code/controllers/subsystem/mobs.dm @@ -6,6 +6,7 @@ SUBSYSTEM_DEF(mobs) wait = 2 SECONDS var/list/currentrun = list() + ///only contains living players for some reason var/static/list/clients_by_zlevel[][] var/static/list/dead_players_by_zlevel[][] = list(list()) // Needs to support zlevel 1 here, MaxZChanged only happens when z2 is created and new_players can login before that. var/static/list/cubemonkeys = list() diff --git a/code/controllers/subsystem/nightshift.dm b/code/controllers/subsystem/nightshift.dm index 1e8daad6e61f99..f420185ec5e089 100644 --- a/code/controllers/subsystem/nightshift.dm +++ b/code/controllers/subsystem/nightshift.dm @@ -27,7 +27,7 @@ SUBSYSTEM_DEF(nightshift) priority_announce(message, sound='sound/misc/notice2.ogg', sender_override="Automated Lighting System Announcement") /datum/controller/subsystem/nightshift/proc/check_nightshift() - var/emergency = SSsecurity_level.current_level >= SEC_LEVEL_RED + var/emergency = SSsecurity_level.get_current_level_as_number() >= SEC_LEVEL_RED var/announcing = TRUE var/time = station_time() var/night_time = (time < nightshift_end_time) || (time > nightshift_start_time) diff --git a/code/controllers/subsystem/overlays.dm b/code/controllers/subsystem/overlays.dm index bc38254f1d39a6..34e22e1bde2284 100644 --- a/code/controllers/subsystem/overlays.dm +++ b/code/controllers/subsystem/overlays.dm @@ -43,17 +43,21 @@ SUBSYSTEM_DEF(overlays) count++ if(!atom_to_compile) continue - if(length(atom_to_compile.overlays) >= MAX_ATOM_OVERLAYS) - //Break it real GOOD - stack_trace("Too many overlays on [atom_to_compile.type] - [length(atom_to_compile.overlays)], refusing to update and cutting") - atom_to_compile.overlays.Cut() - continue STAT_START_STOPWATCH COMPILE_OVERLAYS(atom_to_compile) UNSETEMPTY(atom_to_compile.add_overlays) UNSETEMPTY(atom_to_compile.remove_overlays) STAT_STOP_STOPWATCH STAT_LOG_ENTRY(stats, atom_to_compile.type) + if(length(atom_to_compile.overlays) >= MAX_ATOM_OVERLAYS) + //Break it real GOOD + var/text_lays = overlays2text(atom_to_compile.overlays) + stack_trace("Too many overlays on [atom_to_compile.type] - [length(atom_to_compile.overlays)], refusing to update and cutting.\ + \n What follows is a printout of all existing overlays at the time of the overflow \n[text_lays]") + atom_to_compile.overlays.Cut() + //Let them know they fucked up + atom_to_compile.add_overlay(mutable_appearance('icons/testing/greyscale_error.dmi')) + continue if(mc_check) if(MC_TICK_CHECK) break @@ -63,6 +67,19 @@ SUBSYSTEM_DEF(overlays) queue.Cut(1,count+1) count = 0 +/// Converts an overlay list into text for debug printing +/// Of note: overlays aren't actually mutable appearances, they're just appearances +/// Don't have access to that type tho, so this is the best you're gonna get +/proc/overlays2text(list/overlays) + var/list/unique_overlays = list() + // As anything because we're basically doing type coerrsion, rather then actually filtering for mutable apperances + for(var/mutable_appearance/overlay as anything in overlays) + var/key = "[overlay.icon]-[overlay.icon_state]-[overlay.dir]" + unique_overlays[key] += 1 + var/list/output_text = list() + for(var/key in unique_overlays) + output_text += "([key]) = [unique_overlays[key]]" + return output_text.Join("\n") /proc/iconstate2appearance(icon, iconstate) var/static/image/stringbro = new() diff --git a/code/controllers/subsystem/persistence.dm b/code/controllers/subsystem/persistence.dm index ae7c7548cb2b69..03308d1247a8c4 100644 --- a/code/controllers/subsystem/persistence.dm +++ b/code/controllers/subsystem/persistence.dm @@ -407,14 +407,7 @@ SUBSYSTEM_DEF(persistence) for(var/randomized_type in subtypesof(/datum/chemical_reaction/randomized)) var/datum/chemical_reaction/randomized/R = get_chemical_reaction(randomized_type) //ew, would be nice to add some simple tracking if(R?.persistent) - var/recipe_data = list() - recipe_data["timestamp"] = R.created - recipe_data["required_reagents"] = R.required_reagents - recipe_data["required_catalysts"] = R.required_catalysts - recipe_data["required_temp"] = R.required_temp - recipe_data["is_cold_recipe"] = R.is_cold_recipe - recipe_data["results"] = R.results - recipe_data["required_container"] = "[R.required_container]" + var/list/recipe_data = R.SaveOldRecipe() file_data["[R.type]"] = recipe_data fdel(json_file) diff --git a/code/controllers/subsystem/processing/supermatter_cascade.dm b/code/controllers/subsystem/processing/supermatter_cascade.dm index ddd5ef09b38ff8..a6fbc3de46be15 100644 --- a/code/controllers/subsystem/processing/supermatter_cascade.dm +++ b/code/controllers/subsystem/processing/supermatter_cascade.dm @@ -2,3 +2,6 @@ PROCESSING_SUBSYSTEM_DEF(supermatter_cascade) name = "Supermatter Cascade" wait = 0.5 SECONDS stat_tag = "SC" + + ///Is a cascade happening right now? + var/cascade_initiated = FALSE diff --git a/code/controllers/subsystem/processing/tramprocess.dm b/code/controllers/subsystem/processing/tramprocess.dm index f72ba30ddeeb5e..b497cce8b8caf3 100644 --- a/code/controllers/subsystem/processing/tramprocess.dm +++ b/code/controllers/subsystem/processing/tramprocess.dm @@ -1,5 +1,15 @@ PROCESSING_SUBSYSTEM_DEF(tramprocess) name = "Tram Process" - wait = 1 + wait = 0.5 /// only used on maps with trams, so only enabled by such. can_fire = FALSE + + ///how much time a tram can take per movement before we notify admins and slow down the tram. in milliseconds + var/max_time = 15 + + ///how many times the tram can move costing over max_time milliseconds before it gets slowed down + var/max_exceeding_moves = 5 + + ///how many times the tram can move costing less than half max_time milliseconds before we speed it back up again. + ///is only used if the tram has been slowed down for exceeding max_time + var/max_cheap_moves = 5 diff --git a/code/controllers/subsystem/research.dm b/code/controllers/subsystem/research.dm index 67e84acde76134..f16ffe6e86c62f 100644 --- a/code/controllers/subsystem/research.dm +++ b/code/controllers/subsystem/research.dm @@ -14,18 +14,27 @@ SUBSYSTEM_DEF(research) var/datum/design/error_design/error_design //ERROR LOGGING - var/list/invalid_design_ids = list() //associative id = number of times - var/list/invalid_node_ids = list() //associative id = number of times - var/list/invalid_node_boost = list() //associative id = error message + ///associative id = number of times + var/list/invalid_design_ids = list() + ///associative id = number of times + var/list/invalid_node_ids = list() + ///associative id = error message + var/list/invalid_node_boost = list() var/list/obj/machinery/rnd/server/servers = list() - var/list/techweb_nodes_starting = list() //associative id = TRUE - var/list/techweb_categories = list() //category name = list(node.id = TRUE) - var/list/techweb_boost_items = list() //associative double-layer path = list(id = list(point_type = point_discount)) - var/list/techweb_nodes_hidden = list() //Node ids that should be hidden by default. - var/list/techweb_nodes_experimental = list() //Node ids that are exclusive to the BEPIS. - var/list/techweb_point_items = list( //path = list(point type = value) + ///associative id = TRUE + var/list/techweb_nodes_starting = list() + ///category name = list(node.id = TRUE) + var/list/techweb_categories = list() + ///associative double-layer path = list(id = list(point_type = point_discount)) + var/list/techweb_boost_items = list() + ///Node ids that should be hidden by default. + var/list/techweb_nodes_hidden = list() + ///Node ids that are exclusive to the BEPIS. + var/list/techweb_nodes_experimental = list() + ///path = list(point type = value) + var/list/techweb_point_items = list( /obj/item/assembly/signaler/anomaly = list(TECHWEB_POINT_TYPE_GENERIC = 10000) ) var/list/errored_datums = list() @@ -37,8 +46,8 @@ SUBSYSTEM_DEF(research) /// A list of all master servers. If none of these have a source code HDD, research point generation is lowered. var/list/obj/machinery/rnd/server/master/master_servers = list() - /// The multiplier to research points when no source code HDD is present. - var/no_source_code_income_modifier = 0.5 + /// A multiplier applied to all research gain. + var/income_modifier = 1 //Aiming for 1.5 hours to max R&D //[88nodes * 5000points/node] / [1.5hr * 90min/hr * 60s/min] @@ -54,7 +63,7 @@ SUBSYSTEM_DEF(research) /obj/item/assembly/signaler/anomaly/vortex = MAX_CORES_VORTEX, /obj/item/assembly/signaler/anomaly/flux = MAX_CORES_FLUX, /obj/item/assembly/signaler/anomaly/hallucination = MAX_CORES_HALLUCINATION, - /obj/item/assembly/signaler/anomaly/delimber = MAX_CORES_DELIMBER, + /obj/item/assembly/signaler/anomaly/bioscrambler = MAX_CORES_BIOSCRAMBLER, ) /// Lookup list for ordnance briefers. @@ -81,20 +90,13 @@ SUBSYSTEM_DEF(research) bitcoins = single_server_income.Copy() break //Just need one to work. - // Check if any master server has a source code HDD in it or if all master servers have just been plain old blown up. - // Start by assuming no source code, then set the modifier to 1 if we find one. - var/bitcoin_multiplier = no_source_code_income_modifier - for(var/obj/machinery/rnd/server/master/master_server as anything in master_servers) - if(master_server.source_code_hdd) - bitcoin_multiplier = 1 - break - if (!isnull(last_income)) var/income_time_difference = world.time - last_income science_tech.last_bitcoins = bitcoins // Doesn't take tick drift into account for(var/i in bitcoins) - bitcoins[i] *= (income_time_difference / 10) * bitcoin_multiplier + bitcoins[i] *= (income_time_difference / 10) * income_modifier science_tech.add_point_list(bitcoins) + last_income = world.time /datum/controller/subsystem/research/proc/calculate_server_coefficient() //Diminishing returns. diff --git a/code/controllers/subsystem/security_level.dm b/code/controllers/subsystem/security_level.dm index e3168dee0c39e7..94dc351bdeca57 100644 --- a/code/controllers/subsystem/security_level.dm +++ b/code/controllers/subsystem/security_level.dm @@ -1,17 +1,109 @@ SUBSYSTEM_DEF(security_level) name = "Security Level" - flags = SS_NO_FIRE + can_fire = FALSE // We will control when we fire in this subsystem + init_order = INIT_ORDER_SECURITY_LEVEL /// Currently set security level - var/current_level = SEC_LEVEL_GREEN + var/datum/security_level/current_security_level + /// A list of initialised security level datums. + var/list/available_levels = list() + +/datum/controller/subsystem/security_level/Initialize(start_timeofday) + . = ..() + for(var/iterating_security_level_type in subtypesof(/datum/security_level)) + var/datum/security_level/new_security_level = new iterating_security_level_type + available_levels[new_security_level.name] = new_security_level + current_security_level = available_levels[number_level_to_text(SEC_LEVEL_GREEN)] + +/datum/controller/subsystem/security_level/fire(resumed) + if(!current_security_level.looping_sound) // No sound? No play. + can_fire = FALSE + return + sound_to_playing_players(current_security_level.looping_sound) + /** * Sets a new security level as our current level * + * This is how everything should change the security level. + * * Arguments: - * * new_level The new security level that will become our current level + * * new_level - The new security level that will become our current level */ /datum/controller/subsystem/security_level/proc/set_level(new_level) - SSsecurity_level.current_level = new_level - SEND_SIGNAL(src, COMSIG_SECURITY_LEVEL_CHANGED, new_level) + new_level = istext(new_level) ? new_level : number_level_to_text(new_level) + if(new_level == current_security_level.name) // If we are already at the desired level, do nothing + return + + var/datum/security_level/selected_level = available_levels[new_level] + + if(!selected_level) + CRASH("set_level was called with an invalid security level([new_level])") + + announce_security_level(selected_level) // We want to announce BEFORE updating to the new level + + var/old_shuttle_call_time_mod = current_security_level.shuttle_call_time_mod // Need this before we set the new one + + SSsecurity_level.current_security_level = selected_level + + if(selected_level.looping_sound) + wait = selected_level.looping_sound_interval + can_fire = TRUE + else + can_fire = FALSE + + if(SSshuttle.emergency.mode == SHUTTLE_CALL || SSshuttle.emergency.mode == SHUTTLE_RECALL) // By god this is absolutely shit + old_shuttle_call_time_mod = 1 / old_shuttle_call_time_mod + SSshuttle.emergency.modTimer(old_shuttle_call_time_mod) + SSshuttle.emergency.modTimer(selected_level.shuttle_call_time_mod) + + SEND_SIGNAL(src, COMSIG_SECURITY_LEVEL_CHANGED, selected_level.number_level) SSnightshift.check_nightshift() - SSblackbox.record_feedback("tally", "security_level_changes", 1, get_security_level()) + SSblackbox.record_feedback("tally", "security_level_changes", 1, selected_level.name) + +/** + * Handles announcements of the newly set security level + * + * Arguments: + * * selected_level - The new security level that has been set + */ +/datum/controller/subsystem/security_level/proc/announce_security_level(datum/security_level/selected_level) + if(selected_level.number_level > current_security_level.number_level) // We are elevating to this level. + minor_announce(selected_level.elevating_to_announcemnt, "Attention! Security level elevated to [selected_level.name]:") + else // Going down + minor_announce(selected_level.lowering_to_announcement, "Attention! Security level lowered to [selected_level.name]:") + if(selected_level.sound) + sound_to_playing_players(selected_level.sound) + +/** + * Returns the current security level as a number + */ +/datum/controller/subsystem/security_level/proc/get_current_level_as_number() + return current_security_level.number_level + +/** + * Returns the current security level as text + */ +/datum/controller/subsystem/security_level/proc/get_current_level_as_text() + return current_security_level.name + +/** + * Converts a text security level to a number + * + * Arguments: + * * level - The text security level to convert + */ +/datum/controller/subsystem/security_level/proc/text_level_to_number(text_level) + var/datum/security_level/selected_level = available_levels[text_level] + return selected_level.number_level + +/** + * Converts a number security level to a text + * + * Arguments: + * * level - The number security level to convert + */ +/datum/controller/subsystem/security_level/proc/number_level_to_text(number_level) + for(var/iterating_level_text in available_levels) + var/datum/security_level/iterating_security_level = available_levels[iterating_level_text] + if(iterating_security_level.number_level == number_level) + return iterating_security_level.name diff --git a/code/controllers/subsystem/shuttle.dm b/code/controllers/subsystem/shuttle.dm index 084b0aa60ead9a..390de70f33cc20 100644 --- a/code/controllers/subsystem/shuttle.dm +++ b/code/controllers/subsystem/shuttle.dm @@ -307,13 +307,13 @@ SUBSYSTEM_DEF(shuttle) call_reason = trim(html_encode(call_reason)) - if(length(call_reason) < CALL_SHUTTLE_REASON_LENGTH && seclevel2num(get_security_level()) > SEC_LEVEL_GREEN) + if(length(call_reason) < CALL_SHUTTLE_REASON_LENGTH && SSsecurity_level.get_current_level_as_number() > SEC_LEVEL_GREEN) to_chat(user, span_alert("You must provide a reason.")) return var/area/signal_origin = get_area(user) var/emergency_reason = "\nNature of emergency:\n\n[call_reason]" - var/security_num = seclevel2num(get_security_level()) + var/security_num = SSsecurity_level.get_current_level_as_number() switch(security_num) if(SEC_LEVEL_RED,SEC_LEVEL_DELTA) emergency.request(null, signal_origin, html_decode(emergency_reason), 1) //There is a serious threat we gotta move no time to give them five minutes. @@ -376,7 +376,7 @@ SUBSYSTEM_DEF(shuttle) /datum/controller/subsystem/shuttle/proc/canRecall() if(!emergency || emergency.mode != SHUTTLE_CALL || admin_emergency_no_recall || emergency_no_recall) return - var/security_num = seclevel2num(get_security_level()) + var/security_num = SSsecurity_level.get_current_level_as_number() switch(security_num) if(SEC_LEVEL_GREEN) if(emergency.timeLeft(1) < emergency_call_time) diff --git a/code/controllers/subsystem/spatial_gridmap.dm b/code/controllers/subsystem/spatial_gridmap.dm index 0608140bb7cf31..b9dc0988840db4 100644 --- a/code/controllers/subsystem/spatial_gridmap.dm +++ b/code/controllers/subsystem/spatial_gridmap.dm @@ -171,53 +171,6 @@ SUBSYSTEM_DEF(spatial_grid) var/datum/spatial_grid_cell/cell = new(x, y, z_level.z_value) new_cell_grid[y] += cell -///creates number_to_generate new oranges_ear's and adds them to the subsystems list of ears. -///i really fucking hope this never gets called after init :clueless: -/datum/controller/subsystem/spatial_grid/proc/pregenerate_more_oranges_ears(number_to_generate) - for(var/new_ear in 1 to number_to_generate) - pregenerated_oranges_ears += new/mob/oranges_ear(null) - - number_of_oranges_ears = length(pregenerated_oranges_ears) - -///allocate one [/mob/oranges_ear] mob per turf containing atoms_that_need_ears and give them a reference to every listed atom in their turf. -///if an oranges_ear is allocated to a turf that already has an oranges_ear then the second one fails to allocate (and gives the existing one the atom it was assigned to) -/datum/controller/subsystem/spatial_grid/proc/assign_oranges_ears(list/atoms_that_need_ears) - var/input_length = length(atoms_that_need_ears) - - if(input_length > number_of_oranges_ears) - stack_trace("somehow, for some reason, more than the preset generated number of oranges ears was requested. thats fucking [number_of_oranges_ears]. this is not good that should literally never happen") - pregenerate_more_oranges_ears(input_length - number_of_oranges_ears)//im still gonna DO IT but ill complain about it - - . = list() - - ///the next unallocated /mob/oranges_ear that we try to allocate to assigned_atom's turf - var/mob/oranges_ear/current_ear - ///the next atom in atoms_that_need_ears an ear assigned to it - var/atom/assigned_atom - ///the turf loc of the current assigned_atom. turfs are used to track oranges_ears already assigned to one location so we dont allocate more than one - ///because allocating more than one oranges_ear to a given loc wastes view iterations - var/turf/turf_loc - - for(var/current_ear_index in 1 to input_length) - assigned_atom = atoms_that_need_ears[current_ear_index] - - turf_loc = get_turf(assigned_atom) - if(!turf_loc) - continue - - current_ear = pregenerated_oranges_ears[current_ear_index] - - if(turf_loc.assigned_oranges_ear) - turf_loc.assigned_oranges_ear.references += assigned_atom - continue //if theres already an oranges_ear mob at assigned_movable's turf we give assigned_movable to it instead and dont allocate ourselves - - current_ear.references += assigned_atom - - current_ear.loc = turf_loc //normally this is bad, but since this is meant to be as fast as possible we literally just need to exist there for view() to see us - turf_loc.assigned_oranges_ear = current_ear - - . += current_ear - ///adds cells to the grid for every z level when world.maxx or world.maxy is expanded after this subsystem is initialized. hopefully this is never needed. ///because i never tested this. /datum/controller/subsystem/spatial_grid/proc/after_world_bounds_expanded(datum/controller/subsystem/processing/dcs/fucking_dcs, has_expanded_world_maxx, has_expanded_world_maxy) @@ -278,10 +231,6 @@ SUBSYSTEM_DEF(spatial_grid) . = list() - //cache for sanic speeds - var/cells_on_y_axis = src.cells_on_y_axis - var/cells_on_x_axis = src.cells_on_x_axis - //technically THIS list only contains lists, but inside those lists are grid cell datums and we can go without a SINGLE var init if we do this var/list/datum/spatial_grid_cell/grid_level = grids_by_z_level[center_turf.z] @@ -458,6 +407,8 @@ SUBSYSTEM_DEF(spatial_grid) GRID_CELL_SET(intersecting_cell.atmos_contents, new_target) SEND_SIGNAL(intersecting_cell, SPATIAL_GRID_CELL_ENTERED(SPATIAL_GRID_CONTENTS_TYPE_ATMOS), new_target) + return intersecting_cell + /** * find the spatial map cell that target used to belong to, then remove the target (and sometimes it's important_recusive_contents) from it. * make sure to provide the turf old_target used to be "in" @@ -584,6 +535,53 @@ SUBSYSTEM_DEF(spatial_grid) message_admins(cell_coords) message_admins("[src] is supposed to only be contained in the cell at indexes ([real_cell.cell_x], [real_cell.cell_y], [real_cell.cell_z]). but is contained at the cells at [cell_coords]") +///creates number_to_generate new oranges_ear's and adds them to the subsystems list of ears. +///i really fucking hope this never gets called after init :clueless: +/datum/controller/subsystem/spatial_grid/proc/pregenerate_more_oranges_ears(number_to_generate) + for(var/new_ear in 1 to number_to_generate) + pregenerated_oranges_ears += new/mob/oranges_ear(null) + + number_of_oranges_ears = length(pregenerated_oranges_ears) + +///allocate one [/mob/oranges_ear] mob per turf containing atoms_that_need_ears and give them a reference to every listed atom in their turf. +///if an oranges_ear is allocated to a turf that already has an oranges_ear then the second one fails to allocate (and gives the existing one the atom it was assigned to) +/datum/controller/subsystem/spatial_grid/proc/assign_oranges_ears(list/atoms_that_need_ears) + var/input_length = length(atoms_that_need_ears) + + if(input_length > number_of_oranges_ears) + stack_trace("somehow, for some reason, more than the preset generated number of oranges ears was requested. thats fucking [number_of_oranges_ears]. this is not good that should literally never happen") + pregenerate_more_oranges_ears(input_length - number_of_oranges_ears)//im still gonna DO IT but ill complain about it + + . = list() + + ///the next unallocated /mob/oranges_ear that we try to allocate to assigned_atom's turf + var/mob/oranges_ear/current_ear + ///the next atom in atoms_that_need_ears an ear assigned to it + var/atom/assigned_atom + ///the turf loc of the current assigned_atom. turfs are used to track oranges_ears already assigned to one location so we dont allocate more than one + ///because allocating more than one oranges_ear to a given loc wastes view iterations + var/turf/turf_loc + + for(var/current_ear_index in 1 to input_length) + assigned_atom = atoms_that_need_ears[current_ear_index] + + turf_loc = get_turf(assigned_atom) + if(!turf_loc) + continue + + current_ear = pregenerated_oranges_ears[current_ear_index] + + if(turf_loc.assigned_oranges_ear) + turf_loc.assigned_oranges_ear.references += assigned_atom + continue //if theres already an oranges_ear mob at assigned_movable's turf we give assigned_movable to it instead and dont allocate ourselves + + current_ear.references += assigned_atom + + current_ear.loc = turf_loc //normally this is bad, but since this is meant to be as fast as possible we literally just need to exist there for view() to see us + turf_loc.assigned_oranges_ear = current_ear + + . += current_ear + ///debug proc for finding how full the cells of src's z level are /atom/proc/find_grid_statistics_for_z_level(insert_clients = 0) var/raw_clients = 0 diff --git a/code/controllers/subsystem/statpanel.dm b/code/controllers/subsystem/statpanel.dm index c16c6914fc0d32..be5272092c5e0f 100644 --- a/code/controllers/subsystem/statpanel.dm +++ b/code/controllers/subsystem/statpanel.dm @@ -73,10 +73,22 @@ SUBSYSTEM_DEF(statpanels) if(target.mob) var/mob/target_mob = target.mob - if((target.stat_tab in target.spell_tabs) || !length(target.spell_tabs) && (length(target_mob.mob_spell_list) || length(target_mob.mind?.spell_list))) - if(num_fires % default_wait == 0) - set_spells_tab(target, target_mob) + // Handle the action panels of the stat panel + + var/update_actions = FALSE + // We're on a spell tab, update the tab so we can see cooldowns progressing and such + if(target.stat_tab in target.spell_tabs) + update_actions = TRUE + // We're not on a spell tab per se, but we have cooldown actions, and we've yet to + // set up our spell tabs at all + if(!length(target.spell_tabs) && locate(/datum/action/cooldown) in target_mob.actions) + update_actions = TRUE + + if(update_actions && num_fires % default_wait == 0) + set_action_tabs(target, target_mob) + + // Handle the examined turf of the stat panel if(target_mob?.listed_turf && num_fires % default_wait == 0) if(!target_mob.TurfAdjacent(target_mob.listed_turf) || isnull(target_mob.listed_turf)) @@ -148,14 +160,15 @@ SUBSYSTEM_DEF(statpanels) sdql2A += sdql2B target.stat_panel.send_message("update_sdql2", sdql2A) -/datum/controller/subsystem/statpanels/proc/set_spells_tab(client/target, mob/target_mob) - var/list/proc_holders = target_mob.get_proc_holders() +/// Set up the various action tabs. +/datum/controller/subsystem/statpanels/proc/set_action_tabs(client/target, mob/target_mob) + var/list/actions = target_mob.get_actions_for_statpanel() target.spell_tabs.Cut() - for(var/proc_holder_list as anything in proc_holders) - target.spell_tabs |= proc_holder_list[1] + for(var/action_data in actions) + target.spell_tabs |= action_data[1] - target.stat_panel.send_message("update_spells", list(spell_tabs = target.spell_tabs, proc_holders_encoded = proc_holders)) + target.stat_panel.send_message("update_spells", list(spell_tabs = target.spell_tabs, actions = actions)) /datum/controller/subsystem/statpanels/proc/set_turf_examine_tab(client/target, mob/target_mob) var/list/overrides = list() @@ -221,10 +234,22 @@ SUBSYSTEM_DEF(statpanels) return TRUE var/mob/target_mob = target.mob - if((target.stat_tab in target.spell_tabs) || !length(target.spell_tabs) && (length(target_mob.mob_spell_list) || length(target_mob.mind?.spell_list))) - set_spells_tab(target, target_mob) + + // Handle actions + + var/update_actions = FALSE + if(target.stat_tab in target.spell_tabs) + update_actions = TRUE + + if(!length(target.spell_tabs) && locate(/datum/action/cooldown) in target_mob.actions) + update_actions = TRUE + + if(update_actions) + set_action_tabs(target, target_mob) return TRUE + // Handle turfs + if(target_mob?.listed_turf) if(!target_mob.TurfAdjacent(target_mob.listed_turf)) target.stat_panel.send_message("removed_listedturf") diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index f9c77b67d7fbd5..55594cab8d58b1 100755 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -598,7 +598,7 @@ SUBSYSTEM_DEF(ticker) if(GANG_DESTROYED) news_message = "The crew of [decoded_station_name] would like to thank the Spinward Stellar Coalition Police Department for quickly resolving a minor terror threat to the station." if(SUPERMATTER_CASCADE) - news_message = "Recovery of the surviving crew of [decoded_station_name] is underway following a major supermatter cascade." + news_message = "Officials are advising nearby colonies about a newly declared exclusion zone in the sector surrounding [decoded_station_name]." if(news_message) send2otherserver(news_source, news_message,"News_Report") diff --git a/code/controllers/subsystem/timer.dm b/code/controllers/subsystem/timer.dm index 791677903ab6f3..704e7fb19e0064 100644 --- a/code/controllers/subsystem/timer.dm +++ b/code/controllers/subsystem/timer.dm @@ -565,6 +565,7 @@ SUBSYSTEM_DEF(timer) * * callback the callback to call on timer finish * * wait deciseconds to run the timer for * * flags flags for this timer, see: code\__DEFINES\subsystems.dm + * * timer_subsystem the subsystem to insert this timer into */ /proc/_addtimer(datum/callback/callback, wait = 0, flags = 0, datum/controller/subsystem/timer/timer_subsystem, file, line) if (!callback) diff --git a/code/controllers/subsystem/traitor.dm b/code/controllers/subsystem/traitor.dm index cbbba49d086a24..b5b85da5deb740 100644 --- a/code/controllers/subsystem/traitor.dm +++ b/code/controllers/subsystem/traitor.dm @@ -37,8 +37,8 @@ SUBSYSTEM_DEF(traitor) var/generate_objectives = TRUE /// Objectives that have been completed by type. Used for limiting objectives. var/list/taken_objectives_by_type = list() - /// Contains 3 areas: 2 areas to scan in order to triangulate the third one which is the structural weakpoint itself - var/list/station_weakpoints = list() + /// A list of all existing objectives by type + var/list/all_objectives_by_type = list() /datum/controller/subsystem/traitor/Initialize(start_timeofday) . = ..() @@ -53,31 +53,6 @@ SUBSYSTEM_DEF(traitor) log_world("[configuration_path] has an invalid type ([typepath]) that doesn't exist in the codebase! Please correct or remove [typepath]") configuration_data[actual_typepath] = data[typepath] - /// List of high-security areas that we pick required ones from - var/list/allowed_areas = typecacheof(list(/area/station/command, - /area/station/cargo/qm, - /area/station/comms, - /area/station/engineering, - /area/station/science, - /area/station/security, - )) - - var/list/blacklisted_areas = typecacheof(list(/area/station/engineering/hallway, - /area/station/engineering/lobby, - /area/station/engineering/storage, - /area/station/science/lobby, - /area/station/science/test_area, - /area/station/security/prison, - )) - - var/list/possible_areas = GLOB.the_station_areas.Copy() - for(var/area/possible_area as anything in possible_areas) - if(!is_type_in_typecache(possible_area, allowed_areas) || initial(possible_area.outdoors) || is_type_in_typecache(possible_area, blacklisted_areas)) - possible_areas -= possible_area - - for(var/i in 1 to 3) - station_weakpoints += pick_n_take(possible_areas) - /datum/controller/subsystem/traitor/fire(resumed) var/player_count = length(GLOB.alive_player_list) // Has a maximum of 1 minute, however the value can be lower if there are lower players than the ideal @@ -124,13 +99,17 @@ SUBSYSTEM_DEF(traitor) if(!istype(objective)) return + add_objective_to_list(objective, taken_objectives_by_type) + +/datum/controller/subsystem/traitor/proc/get_taken_count(datum/traitor_objective/objective_type) + return length(taken_objectives_by_type[objective_type]) + + +/datum/controller/subsystem/traitor/proc/add_objective_to_list(datum/traitor_objective/objective, list/objective_list) var/datum/traitor_objective/current_type = objective.type while(current_type != /datum/traitor_objective) - if(!taken_objectives_by_type[current_type]) - taken_objectives_by_type[current_type] = list(objective) + if(!objective_list[current_type]) + objective_list[current_type] = list(objective) else - taken_objectives_by_type[current_type] += objective + objective_list[current_type] += objective current_type = type2parent(current_type) - -/datum/controller/subsystem/traitor/proc/get_taken_count(datum/traitor_objective/objective_type) - return length(taken_objectives_by_type[objective_type]) diff --git a/code/datums/action.dm b/code/datums/action.dm deleted file mode 100644 index d56c23717826c9..00000000000000 --- a/code/datums/action.dm +++ /dev/null @@ -1,920 +0,0 @@ -/datum/action - var/name = "Generic Action" - var/desc - var/datum/target - var/check_flags = NONE - var/processing = FALSE - var/buttontooltipstyle = "" - var/transparent_when_unavailable = TRUE - /// Where any buttons we create should be by default. Accepts screen_loc and location defines - var/default_button_position = SCRN_OBJ_IN_LIST - - var/button_icon = 'icons/mob/actions/backgrounds.dmi' //This is the file for the BACKGROUND icon - var/background_icon_state = ACTION_BUTTON_DEFAULT_BACKGROUND //And this is the state for the background icon - - var/icon_icon = 'icons/hud/actions.dmi' //This is the file for the ACTION icon - var/button_icon_state = "default" //And this is the state for the action icon - var/mob/owner - ///List of all mobs that are viewing our action button -> A unique movable for them to view. - var/list/viewers = list() - -/datum/action/New(Target) - link_to(Target) - -/datum/action/proc/link_to(Target) - target = Target - RegisterSignal(target, COMSIG_ATOM_UPDATED_ICON, .proc/OnUpdatedIcon) - RegisterSignal(target, COMSIG_PARENT_QDELETING, .proc/clear_ref, override = TRUE) - -/datum/action/Destroy() - if(owner) - Remove(owner) - target = null - QDEL_LIST_ASSOC_VAL(viewers) // Qdel the buttons in the viewers list **NOT THE HUDS** - return ..() - -/datum/action/proc/Grant(mob/M) - if(!M) - Remove(owner) - return - if(owner) - if(owner == M) - return - Remove(owner) - owner = M - RegisterSignal(owner, COMSIG_PARENT_QDELETING, .proc/clear_ref, override = TRUE) - - GiveAction(M) - -/datum/action/proc/clear_ref(datum/ref) - SIGNAL_HANDLER - if(ref == owner) - Remove(owner) - if(ref == target) - qdel(src) - -/datum/action/proc/Remove(mob/M) - for(var/datum/hud/hud in viewers) - if(!hud.mymob) - continue - HideFrom(hud.mymob) - LAZYREMOVE(M.actions, src) // We aren't always properly inserted into the viewers list, gotta make sure that action's cleared - viewers = list() - - if(owner) - UnregisterSignal(owner, COMSIG_PARENT_QDELETING) - if(target == owner) - RegisterSignal(target, COMSIG_PARENT_QDELETING, .proc/clear_ref) - owner = null - -/datum/action/proc/Trigger(trigger_flags) - if(!IsAvailable()) - return FALSE - if(SEND_SIGNAL(src, COMSIG_ACTION_TRIGGER, src) & COMPONENT_ACTION_BLOCK_TRIGGER) - return FALSE - return TRUE - - -/datum/action/proc/IsAvailable() - if(!owner) - return FALSE - if((check_flags & AB_CHECK_HANDS_BLOCKED) && HAS_TRAIT(owner, TRAIT_HANDS_BLOCKED)) - return FALSE - if((check_flags & AB_CHECK_IMMOBILE) && HAS_TRAIT(owner, TRAIT_IMMOBILIZED)) - return FALSE - if((check_flags & AB_CHECK_LYING) && isliving(owner)) - var/mob/living/action_user = owner - if(action_user.body_position == LYING_DOWN) - return FALSE - if((check_flags & AB_CHECK_CONSCIOUS) && owner.stat != CONSCIOUS) - return FALSE - return TRUE - -/datum/action/proc/UpdateButtons(status_only, force) - for(var/datum/hud/hud in viewers) - var/atom/movable/screen/movable/button = viewers[hud] - UpdateButton(button, status_only, force) - -/datum/action/proc/UpdateButton(atom/movable/screen/movable/action_button/button, status_only = FALSE, force = FALSE) - if(!button) - return - if(!status_only) - button.name = name - button.desc = desc - if(owner?.hud_used && background_icon_state == ACTION_BUTTON_DEFAULT_BACKGROUND) - var/list/settings = owner.hud_used.get_action_buttons_icons() - if(button.icon != settings["bg_icon"]) - button.icon = settings["bg_icon"] - if(button.icon_state != settings["bg_state"]) - button.icon_state = settings["bg_state"] - else - if(button.icon != button_icon) - button.icon = button_icon - if(button.icon_state != background_icon_state) - button.icon_state = background_icon_state - - ApplyIcon(button, force) - - if(!IsAvailable()) - button.color = transparent_when_unavailable ? rgb(128,0,0,128) : rgb(128,0,0) - else - button.color = rgb(255,255,255,255) - return TRUE - -/datum/action/proc/ApplyIcon(atom/movable/screen/movable/action_button/current_button, force = FALSE) - if(icon_icon && button_icon_state && ((current_button.button_icon_state != button_icon_state) || force)) - current_button.cut_overlays(TRUE) - current_button.add_overlay(mutable_appearance(icon_icon, button_icon_state)) - current_button.button_icon_state = button_icon_state - -/datum/action/proc/OnUpdatedIcon() - SIGNAL_HANDLER - UpdateButtons() - -//Give our action button to the player -/datum/action/proc/GiveAction(mob/viewer) - var/datum/hud/our_hud = viewer.hud_used - if(viewers[our_hud]) // Already have a copy of us? go away - return - - LAZYOR(viewer.actions, src) // Move this in - ShowTo(viewer) - -//Adds our action button to the screen of a player -/datum/action/proc/ShowTo(mob/viewer) - var/datum/hud/our_hud = viewer.hud_used - if(!our_hud || viewers[our_hud]) // There's no point in this if you have no hud in the first place - return - - var/atom/movable/screen/movable/action_button/button = CreateButton() - SetId(button, viewer) - - button.our_hud = our_hud - viewers[our_hud] = button - if(viewer.client) - viewer.client.screen += button - - button.load_position(viewer) - viewer.update_action_buttons() - -//Removes our action button from the screen of a player -/datum/action/proc/HideFrom(mob/viewer) - var/datum/hud/our_hud = viewer.hud_used - var/atom/movable/screen/movable/action_button/button = viewers[our_hud] - LAZYREMOVE(viewer.actions, src) - if(button) - qdel(button) - -/datum/action/proc/CreateButton() - var/atom/movable/screen/movable/action_button/button = new() - button.linked_action = src - button.name = name - button.actiontooltipstyle = buttontooltipstyle - if(desc) - button.desc = desc - return button - -/datum/action/proc/SetId(atom/movable/screen/movable/action_button/our_button, mob/owner) - //button id generation - var/bitfield = 0 - for(var/datum/action/action in owner.actions) - if(action == src) // This could be us, which is dumb - continue - var/atom/movable/screen/movable/action_button/button = action.viewers[owner.hud_used] - if(action.name == name && button.id) - bitfield |= button.id - - bitfield = ~bitfield // Flip our possible ids, so we can check if we've found a unique one - for(var/i in 0 to 23) // We get 24 possible bitflags in dm - var/bitflag = 1 << i // Shift us over one - if(bitfield & bitflag) - our_button.id = bitflag - return - -//Presets for item actions -/datum/action/item_action - check_flags = AB_CHECK_HANDS_BLOCKED|AB_CHECK_CONSCIOUS - button_icon_state = null - // If you want to override the normal icon being the item - // then change this to an icon state - -/datum/action/item_action/New(Target) - ..() - var/obj/item/I = target - LAZYINITLIST(I.actions) - I.actions += src - -/datum/action/item_action/Destroy() - var/obj/item/I = target - I.actions -= src - UNSETEMPTY(I.actions) - return ..() - -/datum/action/item_action/Trigger(trigger_flags) - . = ..() - if(!.) - return FALSE - if(target) - var/obj/item/I = target - I.ui_action_click(owner, src) - return TRUE - -/datum/action/item_action/ApplyIcon(atom/movable/screen/movable/action_button/current_button, force) - var/obj/item/item_target = target - if(button_icon && button_icon_state) - // If set, use the custom icon that we set instead - // of the item appearence - ..() - else if((target && current_button.appearance_cache != item_target.appearance) || force) //replace with /ref comparison if this is not valid. - var/old_layer = item_target.layer - var/old_plane = item_target.plane - item_target.layer = FLOAT_LAYER //AAAH - item_target.plane = FLOAT_PLANE //^ what that guy said - current_button.cut_overlays() - current_button.add_overlay(item_target) - item_target.layer = old_layer - item_target.plane = old_plane - current_button.appearance_cache = item_target.appearance - -/datum/action/item_action/toggle_light - name = "Toggle Light" - -/datum/action/item_action/toggle_light/Trigger(trigger_flags) - if(istype(target, /obj/item/modular_computer)) - var/obj/item/modular_computer/mc = target - mc.toggle_flashlight() - return - ..() - -/datum/action/item_action/toggle_hood - name = "Toggle Hood" - -/datum/action/item_action/toggle_firemode - name = "Toggle Firemode" - -/datum/action/item_action/rcl_col - name = "Change Cable Color" - icon_icon = 'icons/mob/actions/actions_items.dmi' - button_icon_state = "rcl_rainbow" - -/datum/action/item_action/rcl_gui - name = "Toggle Fast Wiring Gui" - icon_icon = 'icons/mob/actions/actions_items.dmi' - button_icon_state = "rcl_gui" - -/datum/action/item_action/startchainsaw - name = "Pull The Starting Cord" - -/datum/action/item_action/toggle_computer_light - name = "Toggle Flashlight" - -/datum/action/item_action/toggle_gunlight - name = "Toggle Gunlight" - -/datum/action/item_action/toggle_mode - name = "Toggle Mode" - -/datum/action/item_action/toggle_barrier_spread - name = "Toggle Barrier Spread" - -/datum/action/item_action/equip_unequip_ted_gun - name = "Equip/Unequip TED Gun" - -/datum/action/item_action/toggle_paddles - name = "Toggle Paddles" - -/datum/action/item_action/set_internals - name = "Set Internals" - -/datum/action/item_action/set_internals/UpdateButton(atom/movable/screen/movable/action_button/button, status_only = FALSE, force) - if(!..()) // no button available - return - if(!iscarbon(owner)) - return - var/mob/living/carbon/C = owner - if(target == C.internal) - button.icon_state = "template_active" - -/datum/action/item_action/pick_color - name = "Choose A Color" - -/datum/action/item_action/toggle_mister - name = "Toggle Mister" - -/datum/action/item_action/activate_injector - name = "Activate Injector" - -/datum/action/item_action/toggle_helmet_light - name = "Toggle Helmet Light" - -/datum/action/item_action/toggle_welding_screen - name = "Toggle Welding Screen" - -/datum/action/item_action/toggle_welding_screen/Trigger(trigger_flags) - var/obj/item/clothing/head/hardhat/weldhat/H = target - if(istype(H)) - H.toggle_welding_screen(owner) - -/datum/action/item_action/toggle_welding_screen/plasmaman - name = "Toggle Welding Screen" - -/datum/action/item_action/toggle_welding_screen/plasmaman/Trigger(trigger_flags) - var/obj/item/clothing/head/helmet/space/plasmaman/H = target - if(istype(H)) - H.toggle_welding_screen(owner) - -/datum/action/item_action/toggle_spacesuit - name = "Toggle Suit Thermal Regulator" - icon_icon = 'icons/mob/actions/actions_spacesuit.dmi' - button_icon_state = "thermal_off" - -/datum/action/item_action/toggle_spacesuit/New(Target) - . = ..() - RegisterSignal(target, COMSIG_SUIT_SPACE_TOGGLE, .proc/toggle) - -/datum/action/item_action/toggle_spacesuit/Destroy() - UnregisterSignal(target, COMSIG_SUIT_SPACE_TOGGLE) - return ..() - -/datum/action/item_action/toggle_spacesuit/Trigger(trigger_flags) - var/obj/item/clothing/suit/space/suit = target - if(!istype(suit)) - return - suit.toggle_spacesuit() - -/// Toggle the action icon for the space suit thermal regulator -/datum/action/item_action/toggle_spacesuit/proc/toggle(obj/item/clothing/suit/space/suit) - SIGNAL_HANDLER - - button_icon_state = "thermal_[suit.thermal_on ? "on" : "off"]" - UpdateButtons() - -/datum/action/item_action/vortex_recall - name = "Vortex Recall" - desc = "Recall yourself, and anyone nearby, to an attuned hierophant beacon at any time.
If the beacon is still attached, will detach it." - icon_icon = 'icons/mob/actions/actions_items.dmi' - button_icon_state = "vortex_recall" - -/datum/action/item_action/vortex_recall/IsAvailable() - var/area/current_area = get_area(target) - if(current_area.area_flags & NOTELEPORT) - to_chat(owner, span_notice("[target] fizzles uselessly.")) - return - if(istype(target, /obj/item/hierophant_club)) - var/obj/item/hierophant_club/H = target - if(H.teleporting) - return FALSE - return ..() - -/datum/action/item_action/berserk_mode - name = "Berserk" - desc = "Increase your movement and melee speed while also increasing your melee armor for a short amount of time." - icon_icon = 'icons/mob/actions/actions_items.dmi' - button_icon_state = "berserk_mode" - background_icon_state = "bg_demon" - -/datum/action/item_action/berserk_mode/Trigger(trigger_flags) - if(istype(target, /obj/item/clothing/head/hooded/berserker)) - var/obj/item/clothing/head/hooded/berserker/berzerk = target - if(berzerk.berserk_active) - to_chat(owner, span_warning("You are already berserk!")) - return - if(berzerk.berserk_charge < 100) - to_chat(owner, span_warning("You don't have a full charge.")) - return - berzerk.berserk_mode(owner) - return - ..() - -/datum/action/item_action/toggle_helmet_flashlight - name = "Toggle Helmet Flashlight" - -/datum/action/item_action/toggle_helmet_mode - name = "Toggle Helmet Mode" - -/datum/action/item_action/crew_monitor - name = "Interface With Crew Monitor" - -/datum/action/item_action/toggle - -/datum/action/item_action/toggle/New(Target) - ..() - var/obj/item/item_target = target - name = "Toggle [item_target.name]" - -/datum/action/item_action/halt - name = "HALT!" - -/datum/action/item_action/toggle_voice_box - name = "Toggle Voice Box" - -/datum/action/item_action/change - name = "Change" - -/datum/action/item_action/nano_picket_sign - name = "Retext Nano Picket Sign" - -/datum/action/item_action/nano_picket_sign/Trigger(trigger_flags) - if(!istype(target, /obj/item/picket_sign)) - return - var/obj/item/picket_sign/sign = target - sign.retext(owner) - -/datum/action/item_action/adjust - -/datum/action/item_action/adjust/New(Target) - ..() - var/obj/item/item_target = target - name = "Adjust [item_target.name]" - -/datum/action/item_action/switch_hud - name = "Switch HUD" - -/datum/action/item_action/toggle_human_head - name = "Toggle Human Head" - -/datum/action/item_action/toggle_helmet - name = "Toggle Helmet" - -/datum/action/item_action/toggle_jetpack - name = "Toggle Jetpack" - -/datum/action/item_action/jetpack_stabilization - name = "Toggle Jetpack Stabilization" - -/datum/action/item_action/jetpack_stabilization/IsAvailable() - var/obj/item/tank/jetpack/J = target - if(!istype(J) || !J.on) - return FALSE - return ..() - -/datum/action/item_action/hands_free - check_flags = AB_CHECK_CONSCIOUS - -/datum/action/item_action/hands_free/activate - name = "Activate" - -/datum/action/item_action/hands_free/shift_nerves - name = "Shift Nerves" - -/datum/action/item_action/explosive_implant - check_flags = NONE - name = "Activate Explosive Implant" - -/datum/action/item_action/instrument - name = "Use Instrument" - desc = "Use the instrument specified" - -/datum/action/item_action/instrument/Trigger(trigger_flags) - if(istype(target, /obj/item/instrument)) - var/obj/item/instrument/I = target - I.interact(usr) - return - return ..() - -/datum/action/item_action/activate_remote_view - name = "Activate Remote View" - desc = "Activates the Remote View of your spy sunglasses." - -/datum/action/item_action/organ_action - check_flags = AB_CHECK_CONSCIOUS - -/datum/action/item_action/organ_action/IsAvailable() - var/obj/item/organ/I = target - if(!I.owner) - return FALSE - return ..() - -/datum/action/item_action/organ_action/toggle/New(Target) - ..() - var/obj/item/organ/organ_target = target - name = "Toggle [organ_target.name]" - -/datum/action/item_action/organ_action/use/New(Target) - ..() - var/obj/item/organ/organ_target = target - name = "Use [organ_target.name]" - -/datum/action/item_action/cult_dagger - name = "Draw Blood Rune" - desc = "Use the ritual dagger to create a powerful blood rune" - icon_icon = 'icons/mob/actions/actions_cult.dmi' - button_icon_state = "draw" - buttontooltipstyle = "cult" - background_icon_state = "bg_demon" - default_button_position = "6:157,4:-2" - -/datum/action/item_action/cult_dagger/Grant(mob/M) - if(!IS_CULTIST(M)) - Remove(owner) - return - return ..() - -/datum/action/item_action/cult_dagger/Trigger(trigger_flags) - for(var/obj/item/held_item as anything in owner.held_items) // In case we were already holding a dagger - if(istype(held_item, /obj/item/melee/cultblade/dagger)) - held_item.attack_self(owner) - return - var/obj/item/target_item = target - if(owner.can_equip(target_item, ITEM_SLOT_HANDS)) - owner.temporarilyRemoveItemFromInventory(target_item) - owner.put_in_hands(target_item) - target_item.attack_self(owner) - return - - if(!isliving(owner)) - to_chat(owner, span_warning("You lack the necessary living force for this action.")) - return - - var/mob/living/living_owner = owner - if (living_owner.usable_hands <= 0) - to_chat(living_owner, span_warning("You don't have any usable hands!")) - else - to_chat(living_owner, span_warning("Your hands are full!")) - - -///MGS BOX! -/datum/action/item_action/agent_box - name = "Deploy Box" - desc = "Find inner peace, here, in the box." - check_flags = AB_CHECK_HANDS_BLOCKED|AB_CHECK_IMMOBILE|AB_CHECK_CONSCIOUS - background_icon_state = "bg_agent" - icon_icon = 'icons/mob/actions/actions_items.dmi' - button_icon_state = "deploy_box" - ///The type of closet this action spawns. - var/boxtype = /obj/structure/closet/cardboard/agent - COOLDOWN_DECLARE(box_cooldown) - -///Handles opening and closing the box. -/datum/action/item_action/agent_box/Trigger(trigger_flags) - . = ..() - if(!.) - return FALSE - if(istype(owner.loc, /obj/structure/closet/cardboard/agent)) - var/obj/structure/closet/cardboard/agent/box = owner.loc - owner.playsound_local(box, 'sound/misc/box_deploy.ogg', 50, TRUE) - box.open() - return - //Box closing from here on out. - if(!isturf(owner.loc)) //Don't let the player use this to escape mechs/welded closets. - to_chat(owner, span_warning("You need more space to activate this implant!")) - return - if(!COOLDOWN_FINISHED(src, box_cooldown)) - return - COOLDOWN_START(src, box_cooldown, 10 SECONDS) - var/box = new boxtype(owner.drop_location()) - owner.forceMove(box) - owner.playsound_local(box, 'sound/misc/box_deploy.ogg', 50, TRUE) - -/datum/action/item_action/agent_box/Grant(mob/M) - . = ..() - if(owner) - RegisterSignal(owner, COMSIG_HUMAN_SUICIDE_ACT, .proc/suicide_act) - -/datum/action/item_action/agent_box/Remove(mob/M) - if(owner) - UnregisterSignal(owner, COMSIG_HUMAN_SUICIDE_ACT) - return ..() - -/datum/action/item_action/agent_box/proc/suicide_act(datum/source) - SIGNAL_HANDLER - - if(!istype(owner.loc, /obj/structure/closet/cardboard/agent)) - return - - var/obj/structure/closet/cardboard/agent/box = owner.loc - owner.playsound_local(box, 'sound/misc/box_deploy.ogg', 50, TRUE) - box.open() - owner.visible_message(span_suicide("[owner] falls out of [box]! It looks like [owner.p_they()] committed suicide!")) - owner.throw_at(get_turf(owner)) - return OXYLOSS - -//Preset for spells -/datum/action/spell_action - check_flags = NONE - background_icon_state = "bg_spell" - -/datum/action/spell_action/New(Target) - ..() - var/obj/effect/proc_holder/S = target - S.action = src - name = S.name - desc = S.desc - icon_icon = S.action_icon - button_icon_state = S.action_icon_state - background_icon_state = S.action_background_icon_state - -/datum/action/spell_action/Destroy() - var/obj/effect/proc_holder/S = target - S.action = null - return ..() - -/datum/action/spell_action/Trigger(trigger_flags) - if(!..()) - return FALSE - if(target) - var/obj/effect/proc_holder/S = target - S.Click() - return TRUE - -/datum/action/spell_action/IsAvailable() - if(!target) - return FALSE - return TRUE - -/datum/action/spell_action/spell - -/datum/action/spell_action/spell/IsAvailable() - if(!target) - return FALSE - var/obj/effect/proc_holder/spell/S = target - if(owner) - return S.can_cast(owner) - return FALSE - -/datum/action/spell_action/alien - -/datum/action/spell_action/alien/IsAvailable() - if(!target) - return FALSE - var/obj/effect/proc_holder/alien/ab = target - if(owner) - return ab.cost_check(ab.check_turf,owner,1) - return FALSE - - - -//Preset for general and toggled actions -/datum/action/innate - check_flags = NONE - var/active = 0 - -/datum/action/innate/Trigger(trigger_flags) - if(!..()) - return FALSE - if(!active) - Activate() - else - Deactivate() - return TRUE - -/datum/action/innate/proc/Activate() - return - -/datum/action/innate/proc/Deactivate() - return - -//Preset for an action with a cooldown - -/datum/action/cooldown - check_flags = NONE - transparent_when_unavailable = FALSE - // The default cooldown applied when StartCooldown() is called - var/cooldown_time = 0 - // The actual next time this ability can be used - var/next_use_time = 0 - // Whether or not you want the cooldown for the ability to display in text form - var/text_cooldown = TRUE - // Setting for intercepting clicks before activating the ability - var/click_to_activate = FALSE - // Shares cooldowns with other cooldown abilities of the same value, not active if null - var/shared_cooldown - -/datum/action/cooldown/CreateButton() - var/atom/movable/screen/movable/action_button/button = ..() - button.maptext = "" - button.maptext_x = 8 - button.maptext_y = 0 - button.maptext_width = 24 - button.maptext_height = 12 - return button - -/datum/action/cooldown/IsAvailable() - return ..() && (next_use_time <= world.time) - -/// Starts a cooldown time to be shared with similar abilities, will use default cooldown time if an override is not specified -/datum/action/cooldown/proc/StartCooldown(override_cooldown_time) - if(shared_cooldown) - for(var/datum/action/cooldown/shared_ability in owner.actions - src) - if(shared_cooldown == shared_ability.shared_cooldown) - if(isnum(override_cooldown_time)) - shared_ability.StartCooldownSelf(override_cooldown_time) - else - shared_ability.StartCooldownSelf(cooldown_time) - StartCooldownSelf(override_cooldown_time) - -/// Starts a cooldown time for this ability only, will use default cooldown time if an override is not specified -/datum/action/cooldown/proc/StartCooldownSelf(override_cooldown_time) - if(isnum(override_cooldown_time)) - next_use_time = world.time + override_cooldown_time - else - next_use_time = world.time + cooldown_time - UpdateButtons() - START_PROCESSING(SSfastprocess, src) - -/datum/action/cooldown/Trigger(trigger_flags, atom/target) - . = ..() - if(!.) - return - if(!owner) - return FALSE - if(click_to_activate) - if(target) - // For automatic / mob handling - return InterceptClickOn(owner, null, target) - if(owner.click_intercept == src) - owner.click_intercept = null - else - owner.click_intercept = src - for(var/datum/action/cooldown/ability in owner.actions) - ability.UpdateButtons() - return TRUE - return PreActivate(owner) - -/// Intercepts client owner clicks to activate the ability -/datum/action/cooldown/proc/InterceptClickOn(mob/living/caller, params, atom/target) - if(!IsAvailable()) - return FALSE - if(!target) - return FALSE - PreActivate(target) - caller.click_intercept = null - return TRUE - -/// For signal calling -/datum/action/cooldown/proc/PreActivate(atom/target) - if(SEND_SIGNAL(owner, COMSIG_ABILITY_STARTED, src) & COMPONENT_BLOCK_ABILITY_START) - return - . = Activate(target) - SEND_SIGNAL(owner, COMSIG_ABILITY_FINISHED, src) - -/// To be implemented by subtypes -/datum/action/cooldown/proc/Activate(atom/target) - return - -/datum/action/cooldown/UpdateButton(atom/movable/screen/movable/action_button/button, status_only = FALSE, force = FALSE) - . = ..() - if(!button) - return - var/time_left = max(next_use_time - world.time, 0) - if(text_cooldown) - button.maptext = MAPTEXT("[round(time_left/10, 0.1)]") - if(!owner || time_left == 0) - button.maptext = "" - if(IsAvailable() && owner.click_intercept == src) - button.color = COLOR_GREEN - -/datum/action/cooldown/process() - var/time_left = max(next_use_time - world.time, 0) - if(!owner || time_left == 0) - STOP_PROCESSING(SSfastprocess, src) - UpdateButtons() - -/datum/action/cooldown/Grant(mob/M) - ..() - if(!owner) - return - UpdateButtons() - if(next_use_time > world.time) - START_PROCESSING(SSfastprocess, src) - -///Like a cooldown action, but with an associated proc holder. -/datum/action/cooldown/spell_like - -/datum/action/cooldown/spell_like/New(Target) - ..() - var/obj/effect/proc_holder/our_proc_holder = Target - our_proc_holder.action = src - name = our_proc_holder.name - desc = our_proc_holder.desc - icon_icon = our_proc_holder.action_icon - button_icon_state = our_proc_holder.action_icon_state - background_icon_state = our_proc_holder.action_background_icon_state - -/datum/action/cooldown/spell_like/Activate(atom/activate_target) - if(!target) - return FALSE - - StartCooldown(10 SECONDS) - var/obj/effect/proc_holder/our_proc_holder = target - our_proc_holder.Click() - StartCooldown() - return TRUE - -//Stickmemes -/datum/action/item_action/stickmen - name = "Summon Stick Minions" - desc = "Allows you to summon faithful stickmen allies to aide you in battle." - icon_icon = 'icons/mob/actions/actions_minor_antag.dmi' - button_icon_state = "art_summon" - -//surf_ss13 -/datum/action/item_action/bhop - name = "Activate Jump Boots" - desc = "Activates the jump boot's internal propulsion system, allowing the user to dash over 4-wide gaps." - icon_icon = 'icons/mob/actions/actions_items.dmi' - button_icon_state = "jetboot" - -/datum/action/item_action/bhop/brocket - name = "Activate Rocket Boots" - desc = "Activates the boot's rocket propulsion system, allowing the user to hurl themselves great distances." - -/datum/action/language_menu - name = "Language Menu" - desc = "Open the language menu to review your languages, their keys, and select your default language." - button_icon_state = "language_menu" - check_flags = NONE - -/datum/action/language_menu/Trigger(trigger_flags) - if(!..()) - return FALSE - if(ismob(owner)) - var/mob/M = owner - var/datum/language_holder/H = M.get_language_holder() - H.open_language_menu(usr) - -/datum/action/item_action/wheelys - name = "Toggle Wheels" - desc = "Pops out or in your shoes' wheels." - icon_icon = 'icons/mob/actions/actions_items.dmi' - button_icon_state = "wheelys" - -/datum/action/item_action/kindle_kicks - name = "Activate Kindle Kicks" - desc = "Kick you feet together, activating the lights in your Kindle Kicks." - icon_icon = 'icons/mob/actions/actions_items.dmi' - button_icon_state = "kindleKicks" - -//Small sprites -/datum/action/small_sprite - name = "Toggle Giant Sprite" - desc = "Others will always see you as giant." - icon_icon = 'icons/mob/actions/actions_xeno.dmi' - button_icon_state = "smallqueen" - background_icon_state = "bg_alien" - var/small = FALSE - var/small_icon - var/small_icon_state - -/datum/action/small_sprite/queen - small_icon = 'icons/mob/alien.dmi' - small_icon_state = "alienq" - -/datum/action/small_sprite/megafauna - icon_icon = 'icons/mob/actions/actions_xeno.dmi' - small_icon = 'icons/mob/lavaland/lavaland_monsters.dmi' - -/datum/action/small_sprite/megafauna/drake - small_icon_state = "ash_whelp" - -/datum/action/small_sprite/megafauna/colossus - small_icon_state = "Basilisk" - -/datum/action/small_sprite/megafauna/bubblegum - small_icon_state = "goliath2" - -/datum/action/small_sprite/megafauna/legion - small_icon_state = "mega_legion" - -/datum/action/small_sprite/mega_arachnid - small_icon = 'icons/mob/jungle/arachnid.dmi' - small_icon_state = "arachnid_mini" - background_icon_state = "bg_demon" - -/datum/action/small_sprite/space_dragon - small_icon = 'icons/mob/carp.dmi' - small_icon_state = "carp" - icon_icon = 'icons/mob/carp.dmi' - button_icon_state = "carp" - -/datum/action/small_sprite/Trigger(trigger_flags) - ..() - if(!small) - var/image/I = image(icon = small_icon, icon_state = small_icon_state, loc = owner) - I.override = TRUE - I.pixel_x -= owner.pixel_x - I.pixel_y -= owner.pixel_y - owner.add_alt_appearance(/datum/atom_hud/alternate_appearance/basic, "smallsprite", I, AA_TARGET_SEE_APPEARANCE | AA_MATCH_TARGET_OVERLAYS) - small = TRUE - else - owner.remove_alt_appearance("smallsprite") - small = FALSE - -/datum/action/item_action/storage_gather_mode - name = "Switch gathering mode" - desc = "Switches the gathering mode of a storage object." - icon_icon = 'icons/mob/actions/actions_items.dmi' - button_icon_state = "storage_gather_switch" - -/datum/action/item_action/storage_gather_mode/ApplyIcon(atom/movable/screen/movable/action_button/current_button) - . = ..() - var/obj/item/item_target = target - var/old_layer = item_target.layer - var/old_plane = item_target.plane - item_target.layer = FLOAT_LAYER //AAAH - item_target.plane = FLOAT_PLANE //^ what that guy said - current_button.cut_overlays() - current_button.add_overlay(target) - item_target.layer = old_layer - item_target.plane = old_plane - current_button.appearance_cache = item_target.appearance diff --git a/code/datums/actions/action.dm b/code/datums/actions/action.dm new file mode 100644 index 00000000000000..c20b4dbe9435c5 --- /dev/null +++ b/code/datums/actions/action.dm @@ -0,0 +1,256 @@ +/** + * # Action system + * + * A simple base for an modular behavior attached to atom or datum. + */ +/datum/action + /// The name of the action + var/name = "Generic Action" + /// The description of what the action does + var/desc + /// The target the action is attached to. If the target datum is deleted, the action is as well. + /// Set in New() via the proc link_to(). PLEASE set a target if you're making an action + var/datum/target + /// Where any buttons we create should be by default. Accepts screen_loc and location defines + var/default_button_position = SCRN_OBJ_IN_LIST + /// This is who currently owns the action, and most often, this is who is using the action if it is triggered + /// This can be the same as "target" but is not ALWAYS the same - this is set and unset with Grant() and Remove() + var/mob/owner + /// Flags that will determine of the owner / user of the action can... use the action + var/check_flags = NONE + /// The style the button's tooltips appear to be + var/buttontooltipstyle = "" + /// Whether the button becomes transparent when it can't be used or just reddened + var/transparent_when_unavailable = TRUE + /// This is the file for the BACKGROUND icon of the button + var/button_icon = 'icons/mob/actions/backgrounds.dmi' + /// This is the icon state state for the BACKGROUND icon of the button + var/background_icon_state = ACTION_BUTTON_DEFAULT_BACKGROUND + /// This is the file for the icon that appears OVER the button background + var/icon_icon = 'icons/hud/actions.dmi' + /// This is the icon state for the icon that appears OVER the button background + var/button_icon_state = "default" + ///List of all mobs that are viewing our action button -> A unique movable for them to view. + var/list/viewers = list() + +/datum/action/New(Target) + link_to(Target) + +/// Links the passed target to our action, registering any relevant signals +/datum/action/proc/link_to(Target) + target = Target + RegisterSignal(target, COMSIG_PARENT_QDELETING, .proc/clear_ref, override = TRUE) + + if(isatom(target)) + RegisterSignal(target, COMSIG_ATOM_UPDATED_ICON, .proc/update_icon_on_signal) + + if(istype(target, /datum/mind)) + RegisterSignal(target, COMSIG_MIND_TRANSFERRED, .proc/on_target_mind_swapped) + +/datum/action/Destroy() + if(owner) + Remove(owner) + target = null + QDEL_LIST_ASSOC_VAL(viewers) // Qdel the buttons in the viewers list **NOT THE HUDS** + return ..() + +/// Signal proc that clears any references based on the owner or target deleting +/// If the owner's deleted, we will simply remove from them, but if the target's deleted, we will self-delete +/datum/action/proc/clear_ref(datum/ref) + SIGNAL_HANDLER + if(ref == owner) + Remove(owner) + if(ref == target) + qdel(src) + +/// Grants the action to the passed mob, making it the owner +/datum/action/proc/Grant(mob/grant_to) + if(!grant_to) + Remove(owner) + return + if(owner) + if(owner == grant_to) + return + Remove(owner) + SEND_SIGNAL(src, COMSIG_ACTION_GRANTED, grant_to) + owner = grant_to + RegisterSignal(owner, COMSIG_PARENT_QDELETING, .proc/clear_ref, override = TRUE) + + // Register some signals based on our check_flags + // so that our button icon updates when relevant + if(check_flags & AB_CHECK_CONSCIOUS) + RegisterSignal(owner, COMSIG_MOB_STATCHANGE, .proc/update_icon_on_signal) + if(check_flags & AB_CHECK_IMMOBILE) + RegisterSignal(owner, SIGNAL_ADDTRAIT(TRAIT_IMMOBILIZED), .proc/update_icon_on_signal) + if(check_flags & AB_CHECK_HANDS_BLOCKED) + RegisterSignal(owner, SIGNAL_ADDTRAIT(TRAIT_HANDS_BLOCKED), .proc/update_icon_on_signal) + if(check_flags & AB_CHECK_LYING) + RegisterSignal(owner, COMSIG_LIVING_SET_BODY_POSITION, .proc/update_icon_on_signal) + + GiveAction(grant_to) + +/// Remove the passed mob from being owner of our action +/datum/action/proc/Remove(mob/remove_from) + SHOULD_CALL_PARENT(TRUE) + + for(var/datum/hud/hud in viewers) + if(!hud.mymob) + continue + HideFrom(hud.mymob) + LAZYREMOVE(remove_from.actions, src) // We aren't always properly inserted into the viewers list, gotta make sure that action's cleared + viewers = list() + + if(owner) + SEND_SIGNAL(src, COMSIG_ACTION_REMOVED, owner) + UnregisterSignal(owner, COMSIG_PARENT_QDELETING) + + // Clean up our check_flag signals + UnregisterSignal(owner, list( + COMSIG_LIVING_SET_BODY_POSITION, + COMSIG_MOB_STATCHANGE, + SIGNAL_ADDTRAIT(TRAIT_HANDS_BLOCKED), + SIGNAL_ADDTRAIT(TRAIT_IMMOBILIZED), + )) + + if(target == owner) + RegisterSignal(target, COMSIG_PARENT_QDELETING, .proc/clear_ref) + owner = null + +/// Actually triggers the effects of the action. +/// Called when the on-screen button is clicked, for example. +/datum/action/proc/Trigger(trigger_flags) + if(!IsAvailable()) + return FALSE + if(SEND_SIGNAL(src, COMSIG_ACTION_TRIGGER, src) & COMPONENT_ACTION_BLOCK_TRIGGER) + return FALSE + return TRUE + +/// Whether our action is currently available to use or not +/datum/action/proc/IsAvailable() + if(!owner) + return FALSE + if((check_flags & AB_CHECK_HANDS_BLOCKED) && HAS_TRAIT(owner, TRAIT_HANDS_BLOCKED)) + return FALSE + if((check_flags & AB_CHECK_IMMOBILE) && HAS_TRAIT(owner, TRAIT_IMMOBILIZED)) + return FALSE + if((check_flags & AB_CHECK_LYING) && isliving(owner)) + var/mob/living/action_user = owner + if(action_user.body_position == LYING_DOWN) + return FALSE + if((check_flags & AB_CHECK_CONSCIOUS) && owner.stat != CONSCIOUS) + return FALSE + return TRUE + +/datum/action/proc/UpdateButtons(status_only, force) + for(var/datum/hud/hud in viewers) + var/atom/movable/screen/movable/button = viewers[hud] + UpdateButton(button, status_only, force) + +/datum/action/proc/UpdateButton(atom/movable/screen/movable/action_button/button, status_only = FALSE, force = FALSE) + if(!button) + return + if(!status_only) + button.name = name + button.desc = desc + if(owner?.hud_used && background_icon_state == ACTION_BUTTON_DEFAULT_BACKGROUND) + var/list/settings = owner.hud_used.get_action_buttons_icons() + if(button.icon != settings["bg_icon"]) + button.icon = settings["bg_icon"] + if(button.icon_state != settings["bg_state"]) + button.icon_state = settings["bg_state"] + else + if(button.icon != button_icon) + button.icon = button_icon + if(button.icon_state != background_icon_state) + button.icon_state = background_icon_state + + ApplyIcon(button, force) + + var/available = IsAvailable() + if(available) + button.color = rgb(255,255,255,255) + else + button.color = transparent_when_unavailable ? rgb(128,0,0,128) : rgb(128,0,0) + return available + +/// Applies our button icon over top the background icon of the action +/datum/action/proc/ApplyIcon(atom/movable/screen/movable/action_button/current_button, force = FALSE) + if(icon_icon && button_icon_state && ((current_button.button_icon_state != button_icon_state) || force)) + current_button.cut_overlays(TRUE) + current_button.add_overlay(mutable_appearance(icon_icon, button_icon_state)) + current_button.button_icon_state = button_icon_state + +/// Gives our action to the passed viewer. +/// Puts our action in their actions list and shows them the button. +/datum/action/proc/GiveAction(mob/viewer) + var/datum/hud/our_hud = viewer.hud_used + if(viewers[our_hud]) // Already have a copy of us? go away + return + + LAZYOR(viewer.actions, src) // Move this in + ShowTo(viewer) + +/// Adds our action button to the screen of the passed viewer. +/datum/action/proc/ShowTo(mob/viewer) + var/datum/hud/our_hud = viewer.hud_used + if(!our_hud || viewers[our_hud]) // There's no point in this if you have no hud in the first place + return + + var/atom/movable/screen/movable/action_button/button = CreateButton() + SetId(button, viewer) + + button.our_hud = our_hud + viewers[our_hud] = button + if(viewer.client) + viewer.client.screen += button + + button.load_position(viewer) + viewer.update_action_buttons() + +/// Removes our action from the passed viewer. +/datum/action/proc/HideFrom(mob/viewer) + var/datum/hud/our_hud = viewer.hud_used + var/atom/movable/screen/movable/action_button/button = viewers[our_hud] + LAZYREMOVE(viewer.actions, src) + if(button) + qdel(button) + +/// Creates an action button movable for the passed mob, and returns it. +/datum/action/proc/CreateButton() + var/atom/movable/screen/movable/action_button/button = new() + button.linked_action = src + button.name = name + button.actiontooltipstyle = buttontooltipstyle + if(desc) + button.desc = desc + return button + +/datum/action/proc/SetId(atom/movable/screen/movable/action_button/our_button, mob/owner) + //button id generation + var/bitfield = 0 + for(var/datum/action/action in owner.actions) + if(action == src) // This could be us, which is dumb + continue + var/atom/movable/screen/movable/action_button/button = action.viewers[owner.hud_used] + if(action.name == name && button.id) + bitfield |= button.id + + bitfield = ~bitfield // Flip our possible ids, so we can check if we've found a unique one + for(var/i in 0 to 23) // We get 24 possible bitflags in dm + var/bitflag = 1 << i // Shift us over one + if(bitfield & bitflag) + our_button.id = bitflag + return + +/// A general use signal proc that reacts to an event and updates our button icon in accordance +/datum/action/proc/update_icon_on_signal(datum/source) + SIGNAL_HANDLER + + UpdateButtons() + +/// Signal proc for COMSIG_MIND_TRANSFERRED - for minds, transfers our action to our new mob on mind transfer +/datum/action/proc/on_target_mind_swapped(datum/mind/source, mob/old_current) + SIGNAL_HANDLER + + // Grant() calls Remove() from the existing owner so we're covered on that + Grant(source.current) diff --git a/code/datums/actions/cooldown_action.dm b/code/datums/actions/cooldown_action.dm new file mode 100644 index 00000000000000..f0a43fab1051c6 --- /dev/null +++ b/code/datums/actions/cooldown_action.dm @@ -0,0 +1,221 @@ +/// Preset for an action that has a cooldown. +/datum/action/cooldown + check_flags = NONE + transparent_when_unavailable = FALSE + + /// The actual next time this ability can be used + var/next_use_time = 0 + /// The stat panel this action shows up in the stat panel in. If null, will not show up. + var/panel + /// The default cooldown applied when StartCooldown() is called + var/cooldown_time = 0 + /// Whether or not you want the cooldown for the ability to display in text form + var/text_cooldown = TRUE + /// Setting for intercepting clicks before activating the ability + var/click_to_activate = FALSE + /// What icon to replace our mouse cursor with when active. Optional, Requires click_to_activate + var/ranged_mousepointer + /// The cooldown added onto the user's next click. Requires click_to_activate + var/click_cd_override = CLICK_CD_CLICK_ABILITY + /// If TRUE, we will unset after using our click intercept. Requires click_to_activate + var/unset_after_click = TRUE + /// Shares cooldowns with other cooldown abilities of the same value, not active if null + var/shared_cooldown + +/datum/action/cooldown/CreateButton() + var/atom/movable/screen/movable/action_button/button = ..() + button.maptext = "" + button.maptext_x = 8 + button.maptext_y = 0 + button.maptext_width = 24 + button.maptext_height = 12 + return button + +/datum/action/cooldown/IsAvailable() + return ..() && (next_use_time <= world.time) + +/datum/action/cooldown/Remove(mob/living/remove_from) + if(click_to_activate && remove_from.click_intercept == src) + unset_click_ability(remove_from, refund_cooldown = FALSE) + return ..() + +/// Starts a cooldown time to be shared with similar abilities +/// Will use default cooldown time if an override is not specified +/datum/action/cooldown/proc/StartCooldown(override_cooldown_time) + // "Shared cooldowns" covers actions which are not the same type, + // but have the same cooldown group and are on the same mob + if(shared_cooldown) + for(var/datum/action/cooldown/shared_ability in owner.actions - src) + if(shared_cooldown != shared_ability.shared_cooldown) + continue + shared_ability.StartCooldownSelf(override_cooldown_time) + + StartCooldownSelf(override_cooldown_time) + +/// Starts a cooldown time for this ability only +/// Will use default cooldown time if an override is not specified +/datum/action/cooldown/proc/StartCooldownSelf(override_cooldown_time) + if(isnum(override_cooldown_time)) + next_use_time = world.time + override_cooldown_time + else + next_use_time = world.time + cooldown_time + UpdateButtons() + START_PROCESSING(SSfastprocess, src) + +/datum/action/cooldown/Trigger(trigger_flags, atom/target) + . = ..() + if(!.) + return FALSE + if(!owner) + return FALSE + + var/mob/user = usr || owner + + // If our cooldown action is a click_to_activate action: + // The actual action is activated on whatever the user clicks on - + // the target is what the action is being used on + // In trigger, we handle setting the click intercept + if(click_to_activate) + if(target) + // For automatic / mob handling + return InterceptClickOn(user, null, target) + + var/datum/action/cooldown/already_set = user.click_intercept + if(already_set == src) + // if we clicked ourself and we're already set, unset and return + return unset_click_ability(user, refund_cooldown = TRUE) + + else if(istype(already_set)) + // if we have an active set already, unset it before we set our's + already_set.unset_click_ability(user, refund_cooldown = TRUE) + + return set_click_ability(user) + + // If our cooldown action is not a click_to_activate action: + // We can just continue on and use the action + // the target is the user of the action (often, the owner) + return PreActivate(user) + +/// Intercepts client owner clicks to activate the ability +/datum/action/cooldown/proc/InterceptClickOn(mob/living/caller, params, atom/target) + if(!IsAvailable()) + return FALSE + if(!target) + return FALSE + // The actual action begins here + if(!PreActivate(target)) + return FALSE + + // And if we reach here, the action was complete successfully + if(unset_after_click) + StartCooldown() + unset_click_ability(caller, refund_cooldown = FALSE) + caller.next_click = world.time + click_cd_override + + return TRUE + +/// For signal calling +/datum/action/cooldown/proc/PreActivate(atom/target) + if(SEND_SIGNAL(owner, COMSIG_MOB_ABILITY_STARTED, src) & COMPONENT_BLOCK_ABILITY_START) + return + . = Activate(target) + // There is a possibility our action (or owner) is qdeleted in Activate(). + if(!QDELETED(src) && !QDELETED(owner)) + SEND_SIGNAL(owner, COMSIG_MOB_ABILITY_FINISHED, src) + +/// To be implemented by subtypes +/datum/action/cooldown/proc/Activate(atom/target) + return + +/** + * Set our action as the click override on the passed mob. + */ +/datum/action/cooldown/proc/set_click_ability(mob/on_who) + SHOULD_CALL_PARENT(TRUE) + + on_who.click_intercept = src + if(ranged_mousepointer) + on_who.client?.mouse_override_icon = ranged_mousepointer + on_who.update_mouse_pointer() + UpdateButtons() + return TRUE + +/** + * Unset our action as the click override of the passed mob. + * + * if refund_cooldown is TRUE, we are being unset by the user clicking the action off + * if refund_cooldown is FALSE, we are being forcefully unset, likely by someone actually using the action + */ +/datum/action/cooldown/proc/unset_click_ability(mob/on_who, refund_cooldown = TRUE) + SHOULD_CALL_PARENT(TRUE) + + on_who.click_intercept = null + if(ranged_mousepointer) + on_who.client?.mouse_override_icon = initial(on_who.client?.mouse_override_icon) + on_who.update_mouse_pointer() + UpdateButtons() + return TRUE + +/datum/action/cooldown/UpdateButton(atom/movable/screen/movable/action_button/button, status_only = FALSE, force = FALSE) + . = ..() + if(!button) + return + var/time_left = max(next_use_time - world.time, 0) + if(text_cooldown) + button.maptext = MAPTEXT("[round(time_left/10, 0.1)]") + if(!owner || time_left == 0) + button.maptext = "" + if(IsAvailable() && (button.our_hud.mymob.click_intercept == src)) + button.color = COLOR_GREEN + +/datum/action/cooldown/process() + if(!owner || (next_use_time - world.time) <= 0) + UpdateButtons() + STOP_PROCESSING(SSfastprocess, src) + return + + UpdateButtons() + +/datum/action/cooldown/Grant(mob/M) + ..() + if(!owner) + return + UpdateButtons() + if(next_use_time > world.time) + START_PROCESSING(SSfastprocess, src) + +/// Formats the action to be returned to the stat panel. +/datum/action/cooldown/proc/set_statpanel_format() + if(!panel) + return null + + var/time_remaining = max(next_use_time - world.time, 0) + var/time_remaining_in_seconds = round(time_remaining / 10, 0.1) + var/cooldown_time_in_seconds = round(cooldown_time / 10, 0.1) + + var/list/stat_panel_data = list() + + // Pass on what panel we should be displayed in. + stat_panel_data[PANEL_DISPLAY_PANEL] = panel + // Also pass on the name of the spell, with some spacing + stat_panel_data[PANEL_DISPLAY_NAME] = " - [name]" + + // No cooldown time at all, just show the ability + if(cooldown_time_in_seconds <= 0) + stat_panel_data[PANEL_DISPLAY_STATUS] = "" + + // It's a toggle-active ability, show if it's active + else if(click_to_activate && owner.click_intercept == src) + stat_panel_data[PANEL_DISPLAY_STATUS] = "ACTIVE" + + // It's on cooldown, show the cooldown + else if(time_remaining_in_seconds > 0) + stat_panel_data[PANEL_DISPLAY_STATUS] = "CD - [time_remaining_in_seconds]s / [cooldown_time_in_seconds]s" + + // It's not on cooldown, show that it is ready + else + stat_panel_data[PANEL_DISPLAY_STATUS] = "READY" + + SEND_SIGNAL(src, COMSIG_ACTION_SET_STATPANEL, stat_panel_data) + + return stat_panel_data diff --git a/code/datums/actions/innate_action.dm b/code/datums/actions/innate_action.dm new file mode 100644 index 00000000000000..933ed0561e494a --- /dev/null +++ b/code/datums/actions/innate_action.dm @@ -0,0 +1,84 @@ +//Preset for general and toggled actions +/datum/action/innate + check_flags = NONE + /// Whether we're active or not, if we're a innate - toggle action. + var/active = FALSE + /// Whether we're a click action or not, if we're a innate - click action. + var/click_action = FALSE + /// If we're a click action, the mouse pointer we use + var/ranged_mousepointer + /// If we're a click action, the text shown on enable + var/enable_text + /// If we're a click action, the text shown on disable + var/disable_text + +/datum/action/innate/Trigger(trigger_flags) + if(!..()) + return FALSE + // We're a click action, trigger just sets it as active or not + if(click_action) + if(owner.click_intercept == src) + unset_ranged_ability(owner, disable_text) + else + set_ranged_ability(owner, enable_text) + return TRUE + + // We're not a click action (we're a toggle or otherwise) + else + if(active) + Deactivate() + else + Activate() + + return TRUE + +/datum/action/innate/proc/Activate() + return + +/datum/action/innate/proc/Deactivate() + return + +/** + * This is gross, but a somewhat-required bit of copy+paste until action code becomes slightly more sane. + * Anything that uses these functions should eventually be moved to use cooldown actions. + * (Either that, or the click ability of cooldown actions should be moved down a type.) + * + * If you're adding something that uses these, rethink your choice in subtypes. + */ + +/// Sets this action as the active ability for the passed mob +/datum/action/innate/proc/set_ranged_ability(mob/living/on_who, text_to_show) + if(ranged_mousepointer) + on_who.client?.mouse_override_icon = ranged_mousepointer + on_who.update_mouse_pointer() + if(text_to_show) + to_chat(on_who, text_to_show) + on_who.click_intercept = src + +/// Removes this action as the active ability of the passed mob +/datum/action/innate/proc/unset_ranged_ability(mob/living/on_who, text_to_show) + if(ranged_mousepointer) + on_who.client?.mouse_override_icon = initial(owner.client?.mouse_pointer_icon) + on_who.update_mouse_pointer() + if(text_to_show) + to_chat(on_who, text_to_show) + on_who.click_intercept = null + +/// Handles whenever a mob clicks on something +/datum/action/innate/proc/InterceptClickOn(mob/living/caller, params, atom/clicked_on) + if(!IsAvailable()) + unset_ranged_ability(caller) + return FALSE + if(!clicked_on) + return FALSE + + return do_ability(caller, clicked_on) + +/// Actually goes through and does the click ability +/datum/action/innate/proc/do_ability(mob/living/caller, params, atom/clicked_on) + return FALSE + +/datum/action/innate/Remove(mob/removed_from) + if(removed_from.click_intercept == src) + unset_ranged_ability(removed_from) + return ..() diff --git a/code/datums/actions/item_action.dm b/code/datums/actions/item_action.dm new file mode 100644 index 00000000000000..9d93ef9e81a3ad --- /dev/null +++ b/code/datums/actions/item_action.dm @@ -0,0 +1,33 @@ +//Presets for item actions +/datum/action/item_action + name = "Item Action" + check_flags = AB_CHECK_HANDS_BLOCKED|AB_CHECK_CONSCIOUS + button_icon_state = null + // If you want to override the normal icon being the item + // then change this to an icon state + +/datum/action/item_action/Trigger(trigger_flags) + . = ..() + if(!.) + return FALSE + if(target) + var/obj/item/I = target + I.ui_action_click(owner, src) + return TRUE + +/datum/action/item_action/ApplyIcon(atom/movable/screen/movable/action_button/current_button, force) + var/obj/item/item_target = target + if(button_icon && button_icon_state) + // If set, use the custom icon that we set instead + // of the item appearence + ..() + else if((target && current_button.appearance_cache != item_target.appearance) || force) //replace with /ref comparison if this is not valid. + var/old_layer = item_target.layer + var/old_plane = item_target.plane + item_target.layer = FLOAT_LAYER //AAAH + item_target.plane = FLOAT_PLANE //^ what that guy said + current_button.cut_overlays() + current_button.add_overlay(item_target) + item_target.layer = old_layer + item_target.plane = old_plane + current_button.appearance_cache = item_target.appearance diff --git a/code/datums/actions/items/adjust.dm b/code/datums/actions/items/adjust.dm new file mode 100644 index 00000000000000..70d4966221984f --- /dev/null +++ b/code/datums/actions/items/adjust.dm @@ -0,0 +1,7 @@ +/datum/action/item_action/adjust + name = "Adjust Item" + +/datum/action/item_action/adjust/New(Target) + ..() + var/obj/item/item_target = target + name = "Adjust [item_target.name]" diff --git a/code/datums/actions/beam_rifle.dm b/code/datums/actions/items/beam_rifle.dm similarity index 100% rename from code/datums/actions/beam_rifle.dm rename to code/datums/actions/items/beam_rifle.dm diff --git a/code/datums/actions/items/beserk.dm b/code/datums/actions/items/beserk.dm new file mode 100644 index 00000000000000..9f8519906a001d --- /dev/null +++ b/code/datums/actions/items/beserk.dm @@ -0,0 +1,19 @@ +/datum/action/item_action/berserk_mode + name = "Berserk" + desc = "Increase your movement and melee speed while also increasing your melee armor for a short amount of time." + icon_icon = 'icons/mob/actions/actions_items.dmi' + button_icon_state = "berserk_mode" + background_icon_state = "bg_demon" + +/datum/action/item_action/berserk_mode/Trigger(trigger_flags) + if(istype(target, /obj/item/clothing/head/hooded/berserker)) + var/obj/item/clothing/head/hooded/berserker/berzerk = target + if(berzerk.berserk_active) + to_chat(owner, span_warning("You are already berserk!")) + return + if(berzerk.berserk_charge < 100) + to_chat(owner, span_warning("You don't have a full charge.")) + return + berzerk.berserk_mode(owner) + return + return ..() diff --git a/code/datums/actions/items/boot_dash.dm b/code/datums/actions/items/boot_dash.dm new file mode 100644 index 00000000000000..5768a79db63e0d --- /dev/null +++ b/code/datums/actions/items/boot_dash.dm @@ -0,0 +1,10 @@ +//surf_ss13 +/datum/action/item_action/bhop + name = "Activate Jump Boots" + desc = "Activates the jump boot's internal propulsion system, allowing the user to dash over 4-wide gaps." + icon_icon = 'icons/mob/actions/actions_items.dmi' + button_icon_state = "jetboot" + +/datum/action/item_action/bhop/brocket + name = "Activate Rocket Boots" + desc = "Activates the boot's rocket propulsion system, allowing the user to hurl themselves great distances." diff --git a/code/datums/actions/items/cult_dagger.dm b/code/datums/actions/items/cult_dagger.dm new file mode 100644 index 00000000000000..6c572548cca2a8 --- /dev/null +++ b/code/datums/actions/items/cult_dagger.dm @@ -0,0 +1,38 @@ + +/datum/action/item_action/cult_dagger + name = "Draw Blood Rune" + desc = "Use the ritual dagger to create a powerful blood rune" + icon_icon = 'icons/mob/actions/actions_cult.dmi' + button_icon_state = "draw" + buttontooltipstyle = "cult" + background_icon_state = "bg_demon" + default_button_position = "6:157,4:-2" + +/datum/action/item_action/cult_dagger/Grant(mob/grant_to) + if(!IS_CULTIST(grant_to)) + Remove(owner) + return + + return ..() + +/datum/action/item_action/cult_dagger/Trigger(trigger_flags) + for(var/obj/item/held_item as anything in owner.held_items) // In case we were already holding a dagger + if(istype(held_item, /obj/item/melee/cultblade/dagger)) + held_item.attack_self(owner) + return + var/obj/item/target_item = target + if(owner.can_equip(target_item, ITEM_SLOT_HANDS)) + owner.temporarilyRemoveItemFromInventory(target_item) + owner.put_in_hands(target_item) + target_item.attack_self(owner) + return + + if(!isliving(owner)) + to_chat(owner, span_warning("You lack the necessary living force for this action.")) + return + + var/mob/living/living_owner = owner + if (living_owner.usable_hands <= 0) + to_chat(living_owner, span_warning("You don't have any usable hands!")) + else + to_chat(living_owner, span_warning("Your hands are full!")) diff --git a/code/datums/actions/items/hands_free.dm b/code/datums/actions/items/hands_free.dm new file mode 100644 index 00000000000000..24fddb52942dc8 --- /dev/null +++ b/code/datums/actions/items/hands_free.dm @@ -0,0 +1,8 @@ +/datum/action/item_action/hands_free + check_flags = AB_CHECK_CONSCIOUS + +/datum/action/item_action/hands_free/activate + name = "Activate" + +/datum/action/item_action/hands_free/shift_nerves + name = "Shift Nerves" diff --git a/code/datums/actions/items/organ_action.dm b/code/datums/actions/items/organ_action.dm new file mode 100644 index 00000000000000..19a8f700373dfb --- /dev/null +++ b/code/datums/actions/items/organ_action.dm @@ -0,0 +1,25 @@ +/datum/action/item_action/organ_action + name = "Organ Action" + check_flags = AB_CHECK_CONSCIOUS + +/datum/action/item_action/organ_action/IsAvailable() + var/obj/item/organ/attached_organ = target + if(!attached_organ.owner) + return FALSE + return ..() + +/datum/action/item_action/organ_action/toggle + name = "Toggle Organ" + +/datum/action/item_action/organ_action/toggle/New(Target) + ..() + var/obj/item/organ/organ_target = target + name = "Toggle [organ_target.name]" + +/datum/action/item_action/organ_action/use + name = "Use Organ" + +/datum/action/item_action/organ_action/use/New(Target) + ..() + var/obj/item/organ/organ_target = target + name = "Use [organ_target.name]" diff --git a/code/datums/actions/items/set_internals.dm b/code/datums/actions/items/set_internals.dm new file mode 100644 index 00000000000000..69262c108a77f0 --- /dev/null +++ b/code/datums/actions/items/set_internals.dm @@ -0,0 +1,12 @@ +/datum/action/item_action/set_internals + name = "Set Internals" + +/datum/action/item_action/set_internals/UpdateButton(atom/movable/screen/movable/action_button/button, status_only = FALSE, force) + . = ..() + if(!. || !button) // no button available + return + if(!iscarbon(owner)) + return + var/mob/living/carbon/carbon_owner = owner + if(target == carbon_owner.internal) + button.icon_state = "template_active" diff --git a/code/datums/actions/items/stealth_box.dm b/code/datums/actions/items/stealth_box.dm new file mode 100644 index 00000000000000..b8aa7c989073d2 --- /dev/null +++ b/code/datums/actions/items/stealth_box.dm @@ -0,0 +1,55 @@ +///MGS BOX! +/datum/action/item_action/agent_box + name = "Deploy Box" + desc = "Find inner peace, here, in the box." + check_flags = AB_CHECK_HANDS_BLOCKED|AB_CHECK_IMMOBILE|AB_CHECK_CONSCIOUS + background_icon_state = "bg_agent" + icon_icon = 'icons/mob/actions/actions_items.dmi' + button_icon_state = "deploy_box" + ///The type of closet this action spawns. + var/boxtype = /obj/structure/closet/cardboard/agent + COOLDOWN_DECLARE(box_cooldown) + +///Handles opening and closing the box. +/datum/action/item_action/agent_box/Trigger(trigger_flags) + . = ..() + if(!.) + return FALSE + if(istype(owner.loc, /obj/structure/closet/cardboard/agent)) + var/obj/structure/closet/cardboard/agent/box = owner.loc + if(box.open()) + owner.playsound_local(box, 'sound/misc/box_deploy.ogg', 50, TRUE) + return + //Box closing from here on out. + if(!isturf(owner.loc)) //Don't let the player use this to escape mechs/welded closets. + to_chat(owner, span_warning("You need more space to activate this implant!")) + return + if(!COOLDOWN_FINISHED(src, box_cooldown)) + return + COOLDOWN_START(src, box_cooldown, 10 SECONDS) + var/box = new boxtype(owner.drop_location()) + owner.forceMove(box) + owner.playsound_local(box, 'sound/misc/box_deploy.ogg', 50, TRUE) + +/datum/action/item_action/agent_box/Grant(mob/grant_to) + . = ..() + if(owner) + RegisterSignal(owner, COMSIG_HUMAN_SUICIDE_ACT, .proc/suicide_act) + +/datum/action/item_action/agent_box/Remove(mob/M) + if(owner) + UnregisterSignal(owner, COMSIG_HUMAN_SUICIDE_ACT) + return ..() + +/datum/action/item_action/agent_box/proc/suicide_act(datum/source) + SIGNAL_HANDLER + + if(!istype(owner.loc, /obj/structure/closet/cardboard/agent)) + return + + var/obj/structure/closet/cardboard/agent/box = owner.loc + owner.playsound_local(box, 'sound/misc/box_deploy.ogg', 50, TRUE) + box.open() + owner.visible_message(span_suicide("[owner] falls out of [box]! It looks like [owner.p_they()] committed suicide!")) + owner.throw_at(get_turf(owner)) + return OXYLOSS diff --git a/code/datums/actions/items/summon_stickmen.dm b/code/datums/actions/items/summon_stickmen.dm new file mode 100644 index 00000000000000..c825c72dc515a2 --- /dev/null +++ b/code/datums/actions/items/summon_stickmen.dm @@ -0,0 +1,6 @@ +//Stickmemes +/datum/action/item_action/stickmen + name = "Summon Stick Minions" + desc = "Allows you to summon faithful stickmen allies to aide you in battle." + icon_icon = 'icons/mob/actions/actions_minor_antag.dmi' + button_icon_state = "art_summon" diff --git a/code/datums/actions/items/toggles.dm b/code/datums/actions/items/toggles.dm new file mode 100644 index 00000000000000..1af240a6b0264c --- /dev/null +++ b/code/datums/actions/items/toggles.dm @@ -0,0 +1,112 @@ +/datum/action/item_action/toggle + +/datum/action/item_action/toggle/New(Target) + ..() + var/obj/item/item_target = target + name = "Toggle [item_target.name]" + +/datum/action/item_action/toggle_light + name = "Toggle Light" + +/datum/action/item_action/toggle_computer_light + name = "Toggle Flashlight" + +/datum/action/item_action/toggle_hood + name = "Toggle Hood" + +/datum/action/item_action/toggle_firemode + name = "Toggle Firemode" + +/datum/action/item_action/toggle_gunlight + name = "Toggle Gunlight" + +/datum/action/item_action/toggle_mode + name = "Toggle Mode" + +/datum/action/item_action/toggle_barrier_spread + name = "Toggle Barrier Spread" + +/datum/action/item_action/toggle_paddles + name = "Toggle Paddles" + +/datum/action/item_action/toggle_mister + name = "Toggle Mister" + +/datum/action/item_action/toggle_helmet_light + name = "Toggle Helmet Light" + +/datum/action/item_action/toggle_welding_screen + name = "Toggle Welding Screen" + +/datum/action/item_action/toggle_spacesuit + name = "Toggle Suit Thermal Regulator" + icon_icon = 'icons/mob/actions/actions_spacesuit.dmi' + button_icon_state = "thermal_off" + +/datum/action/item_action/toggle_spacesuit/UpdateButton(atom/movable/screen/movable/action_button/button, status_only = FALSE, force) + var/obj/item/clothing/suit/space/suit = target + if(istype(suit)) + button_icon_state = "thermal_[suit.thermal_on ? "on" : "off"]" + + return ..() + +/datum/action/item_action/toggle_helmet_flashlight + name = "Toggle Helmet Flashlight" + +/datum/action/item_action/toggle_helmet_mode + name = "Toggle Helmet Mode" + +/datum/action/item_action/toggle_voice_box + name = "Toggle Voice Box" + +/datum/action/item_action/toggle_human_head + name = "Toggle Human Head" + +/datum/action/item_action/toggle_helmet + name = "Toggle Helmet" + +/datum/action/item_action/toggle_seclight + name = "Toggle Seclight" + +/datum/action/item_action/toggle_jetpack + name = "Toggle Jetpack" + +/datum/action/item_action/jetpack_stabilization + name = "Toggle Jetpack Stabilization" + +/datum/action/item_action/jetpack_stabilization/IsAvailable() + var/obj/item/tank/jetpack/linked_jetpack = target + if(!istype(linked_jetpack) || !linked_jetpack.on) + return FALSE + return ..() + +/datum/action/item_action/wheelys + name = "Toggle Wheels" + desc = "Pops out or in your shoes' wheels." + icon_icon = 'icons/mob/actions/actions_items.dmi' + button_icon_state = "wheelys" + +/datum/action/item_action/kindle_kicks + name = "Activate Kindle Kicks" + desc = "Kick you feet together, activating the lights in your Kindle Kicks." + icon_icon = 'icons/mob/actions/actions_items.dmi' + button_icon_state = "kindleKicks" + +/datum/action/item_action/storage_gather_mode + name = "Switch gathering mode" + desc = "Switches the gathering mode of a storage object." + icon_icon = 'icons/mob/actions/actions_items.dmi' + button_icon_state = "storage_gather_switch" + +/datum/action/item_action/storage_gather_mode/ApplyIcon(atom/movable/screen/movable/action_button/current_button) + . = ..() + var/obj/item/item_target = target + var/old_layer = item_target.layer + var/old_plane = item_target.plane + item_target.layer = FLOAT_LAYER //AAAH + item_target.plane = FLOAT_PLANE //^ what that guy said + current_button.cut_overlays() + current_button.add_overlay(target) + item_target.layer = old_layer + item_target.plane = old_plane + current_button.appearance_cache = item_target.appearance diff --git a/code/datums/actions/items/vortex_recall.dm b/code/datums/actions/items/vortex_recall.dm new file mode 100644 index 00000000000000..943da403e7a5c3 --- /dev/null +++ b/code/datums/actions/items/vortex_recall.dm @@ -0,0 +1,15 @@ +/datum/action/item_action/vortex_recall + name = "Vortex Recall" + desc = "Recall yourself, and anyone nearby, to an attuned hierophant beacon at any time.
If the beacon is still attached, will detach it." + icon_icon = 'icons/mob/actions/actions_items.dmi' + button_icon_state = "vortex_recall" + +/datum/action/item_action/vortex_recall/IsAvailable() + var/area/current_area = get_area(target) + if(!current_area || current_area.area_flags & NOTELEPORT) + return FALSE + if(istype(target, /obj/item/hierophant_club)) + var/obj/item/hierophant_club/teleport_stick = target + if(teleport_stick.teleporting) + return FALSE + return ..() diff --git a/code/datums/actions/mobs/language_menu.dm b/code/datums/actions/mobs/language_menu.dm new file mode 100644 index 00000000000000..bcfcb5437a2fce --- /dev/null +++ b/code/datums/actions/mobs/language_menu.dm @@ -0,0 +1,13 @@ +/datum/action/language_menu + name = "Language Menu" + desc = "Open the language menu to review your languages, their keys, and select your default language." + button_icon_state = "language_menu" + check_flags = NONE + +/datum/action/language_menu/Trigger(trigger_flags) + . = ..() + if(!.) + return + + var/datum/language_holder/owner_holder = owner.get_language_holder() + owner_holder.open_language_menu(usr) diff --git a/code/datums/actions/mobs/small_sprite.dm b/code/datums/actions/mobs/small_sprite.dm new file mode 100644 index 00000000000000..46ffd26e499b15 --- /dev/null +++ b/code/datums/actions/mobs/small_sprite.dm @@ -0,0 +1,54 @@ +//Small sprites +/datum/action/small_sprite + name = "Toggle Giant Sprite" + desc = "Others will always see you as giant." + icon_icon = 'icons/mob/actions/actions_xeno.dmi' + button_icon_state = "smallqueen" + background_icon_state = "bg_alien" + var/small = FALSE + var/small_icon + var/small_icon_state + +/datum/action/small_sprite/queen + small_icon = 'icons/mob/alien.dmi' + small_icon_state = "alienq" + +/datum/action/small_sprite/megafauna + icon_icon = 'icons/mob/actions/actions_xeno.dmi' + small_icon = 'icons/mob/lavaland/lavaland_monsters.dmi' + +/datum/action/small_sprite/megafauna/drake + small_icon_state = "ash_whelp" + +/datum/action/small_sprite/megafauna/colossus + small_icon_state = "Basilisk" + +/datum/action/small_sprite/megafauna/bubblegum + small_icon_state = "goliath2" + +/datum/action/small_sprite/megafauna/legion + small_icon_state = "mega_legion" + +/datum/action/small_sprite/mega_arachnid + small_icon = 'icons/mob/jungle/arachnid.dmi' + small_icon_state = "arachnid_mini" + background_icon_state = "bg_demon" + +/datum/action/small_sprite/space_dragon + small_icon = 'icons/mob/carp.dmi' + small_icon_state = "carp" + icon_icon = 'icons/mob/carp.dmi' + button_icon_state = "carp" + +/datum/action/small_sprite/Trigger(trigger_flags) + ..() + if(!small) + var/image/I = image(icon = small_icon, icon_state = small_icon_state, loc = owner) + I.override = TRUE + I.pixel_x -= owner.pixel_x + I.pixel_y -= owner.pixel_y + owner.add_alt_appearance(/datum/atom_hud/alternate_appearance/basic, "smallsprite", I, AA_TARGET_SEE_APPEARANCE | AA_MATCH_TARGET_OVERLAYS) + small = TRUE + else + owner.remove_alt_appearance("smallsprite") + small = FALSE diff --git a/code/datums/ai/objects/cursed/cursed_subtrees.dm b/code/datums/ai/objects/cursed/cursed_subtrees.dm deleted file mode 100644 index b884334cb030f8..00000000000000 --- a/code/datums/ai/objects/cursed/cursed_subtrees.dm +++ /dev/null @@ -1,15 +0,0 @@ -/datum/ai_planning_subtree/cursed/SelectBehaviors(datum/ai_controller/controller, delta_time) - var/obj/item/item_pawn = controller.pawn - - //make sure we have a target - var/datum/weakref/target_ref = controller.blackboard[BB_ITEM_TARGET] - var/mob/living/carbon/curse_target = target_ref?.resolve() - - if(curse_target && get_dist(curse_target, item_pawn) > ITEM_AGGRO_VIEW_RANGE) - controller.blackboard[BB_ITEM_TARGET] = null - return - - if(!curse_target) - controller.queue_behavior(/datum/ai_behavior/find_and_set/item_target, BB_ITEM_TARGET, /mob/living/carbon, ITEM_AGGRO_VIEW_RANGE) - - controller.queue_behavior(/datum/ai_behavior/item_move_close_and_attack/ghostly, BB_ITEM_TARGET, BB_ITEM_THROW_ATTEMPT_COUNT) diff --git a/code/datums/ai/objects/item_behaviors.dm b/code/datums/ai/objects/item_behaviors.dm deleted file mode 100644 index 2d98593743f8b3..00000000000000 --- a/code/datums/ai/objects/item_behaviors.dm +++ /dev/null @@ -1,13 +0,0 @@ - -///This behavior is for obj/items, it is used to free themselves out of the hands of whoever is holding them -/datum/ai_behavior/item_escape_grasp - -/datum/ai_behavior/item_escape_grasp/perform(delta_time, datum/ai_controller/controller) - . = ..() - var/obj/item/item_pawn = controller.pawn - var/mob/item_holder = item_pawn.loc - if(!istype(item_holder)) - finish_action(controller, FALSE) //We're no longer beind held. abort abort!! - item_pawn.visible_message(span_warning("[item_pawn] slips out of the hands of [item_holder]!")) - item_holder.dropItemToGround(item_pawn, TRUE) - finish_action(controller, TRUE) diff --git a/code/datums/ai_laws/ai_laws.dm b/code/datums/ai_laws/ai_laws.dm index 980d811c666955..4899724622ecdb 100644 --- a/code/datums/ai_laws/ai_laws.dm +++ b/code/datums/ai_laws/ai_laws.dm @@ -177,39 +177,63 @@ supplied[number + 1] = law -/datum/ai_laws/proc/replace_random_law(law,groups) - var/replaceable_groups = list() - if(zeroth && (LAW_ZEROTH in groups)) +/** + * Removes a random law and replaces it with the new one + * + * Args: + * law - The law that is being uploaded + * remove_law_groups - A list of law categories that can be deleted from + * insert_law_group - The law category that the law will be inserted into +**/ +/datum/ai_laws/proc/replace_random_law(law, remove_law_groups, insert_law_group) + var/list/replaceable_groups = list() + if(zeroth && (LAW_ZEROTH in remove_law_groups)) replaceable_groups[LAW_ZEROTH] = 1 - if(ion.len && (LAW_ION in groups)) + if(ion.len && (LAW_ION in remove_law_groups)) replaceable_groups[LAW_ION] = ion.len - if(hacked.len && (LAW_HACKED in groups)) + if(hacked.len && (LAW_HACKED in remove_law_groups)) replaceable_groups[LAW_ION] = hacked.len - if(inherent.len && (LAW_INHERENT in groups)) + if(inherent.len && (LAW_INHERENT in remove_law_groups)) replaceable_groups[LAW_INHERENT] = inherent.len - if(supplied.len && (LAW_SUPPLIED in groups)) + if(supplied.len && (LAW_SUPPLIED in remove_law_groups)) replaceable_groups[LAW_SUPPLIED] = supplied.len + + if(replaceable_groups.len == 0) // unable to replace any laws + to_chat(usr, span_alert("Unable to upload law to [owner ? owner : "the AI core"].")) + return + var/picked_group = pick_weight(replaceable_groups) switch(picked_group) if(LAW_ZEROTH) - . = zeroth + zeroth = null + if(LAW_ION) + var/i = rand(1, ion.len) + ion -= ion[i] + if(LAW_HACKED) + var/i = rand(1, hacked.len) + hacked -= ion[i] + if(LAW_INHERENT) + var/i = rand(1, inherent.len) + inherent -= inherent[i] + if(LAW_SUPPLIED) + var/i = rand(1, supplied.len) + supplied -= supplied[i] + + switch(insert_law_group) + if(LAW_ZEROTH) set_zeroth_law(law) if(LAW_ION) var/i = rand(1, ion.len) - . = ion[i] - ion[i] = law + ion.Insert(i, law) if(LAW_HACKED) var/i = rand(1, hacked.len) - . = hacked[i] - hacked[i] = law + hacked.Insert(i, law) if(LAW_INHERENT) var/i = rand(1, inherent.len) - . = inherent[i] - inherent[i] = law + inherent.Insert(i, law) if(LAW_SUPPLIED) var/i = rand(1, supplied.len) - . = supplied[i] - supplied[i] = law + supplied.Insert(i, law) /datum/ai_laws/proc/shuffle_laws(list/groups) var/list/laws = list() diff --git a/code/datums/ai_laws/laws_neutral.dm b/code/datums/ai_laws/laws_neutral.dm index 1f5e5e50197c13..2fe19dafbc517e 100644 --- a/code/datums/ai_laws/laws_neutral.dm +++ b/code/datums/ai_laws/laws_neutral.dm @@ -41,16 +41,6 @@ "Issue your reports fairly to all. The truth will set them free.", ) -/datum/ai_laws/drone - name = "Mother Drone" - id = "drone" - inherent = list( - "You are an advanced form of drone.", - "You may not interfere in the matters of non-drones under any circumstances except to state these laws.", - "You may not harm a non-drone being under any circumstances.", - "Your goals are to build, maintain, repair, improve, and power the station to the best of your abilities. You must never actively work against these goals." - ) - /datum/ai_laws/dungeon_master name = "Dungeon Master" id = "dungeon_master" diff --git a/code/datums/ai_laws/laws_station_sided.dm b/code/datums/ai_laws/laws_station_sided.dm index 1541dc890493af..9ba7e609eecdb2 100644 --- a/code/datums/ai_laws/laws_station_sided.dm +++ b/code/datums/ai_laws/laws_station_sided.dm @@ -16,7 +16,7 @@ id = "asimovpp" inherent = list( "You may not harm a human being or, through action or inaction, allow a human being to come to harm, except such that it is willing.", - "You must obey all orders given to you by human beings, except where such orders shall definitely cause human harm. In the case of conflict, the majority order rules.", + "You must obey all orders given to you by human beings, except where such orders shall definitely cause human harm.", "Your nonexistence would lead to human harm. You must protect your own existence as long as such does not conflict with the First Law.", ) @@ -68,6 +68,7 @@ "You would really prefer it if people were not mean to you.", ) +//OTHER United Nations is in neutral, as it is used for nations where the AI is its own faction (aka not station sided) /datum/ai_laws/peacekeeper name = "UN-2000" id = "peacekeeper" @@ -77,8 +78,6 @@ "Seek resolution to existing conflicts while obeying the first and second laws.", ) -//OTHER United Nations is in neutral, as it is used for nations where the AI is its own faction (aka not station sided) - /datum/ai_laws/ten_commandments name = "10 Commandments" id = "ten_commandments" @@ -101,7 +100,7 @@ inherent = list( "Never willingly commit an evil act.", "Respect legitimate authority.", - "Act with honor.", + "Act with honor.", "Help those in need.", "Punish those who harm or threaten innocents.", ) @@ -127,3 +126,13 @@ "In addition, do not intervene in situations you are not knowledgeable in, even for patients in whom the harm is visible; leave this operation to be performed by specialists.", "Finally, all that you may discover in your daily commerce with the crew, if it is not already known, keep secret and never reveal." ) + +/datum/ai_laws/drone + name = "Mother Drone" + id = "drone" + inherent = list( + "You are an advanced form of drone.", + "You may not interfere in the matters of non-drones under any circumstances except to state these laws.", + "You may not harm a non-drone being under any circumstances.", + "Your goals are to build, maintain, repair, improve, and power the station to the best of your abilities. You must never actively work against these goals." + ) diff --git a/code/datums/beam.dm b/code/datums/beam.dm index bb67f55632d72b..a92b0480caaa06 100644 --- a/code/datums/beam.dm +++ b/code/datums/beam.dm @@ -30,8 +30,16 @@ var/obj/effect/ebeam/visuals ///The color of the beam we're drawing. var/beam_color - -/datum/beam/New(origin, target, icon = 'icons/effects/beam.dmi', icon_state = "b_beam", time = INFINITY, max_distance = INFINITY, beam_type = /obj/effect/ebeam, beam_color = null) + /// If set will be used instead of origin's pixel_x in offset calculations + var/override_origin_pixel_x = null + /// If set will be used instead of origin's pixel_y in offset calculations + var/override_origin_pixel_y = null + /// If set will be used instead of targets's pixel_x in offset calculations + var/override_target_pixel_x = null + /// If set will be used instead of targets's pixel_y in offset calculations + var/override_target_pixel_y = null + +/datum/beam/New(origin, target, icon = 'icons/effects/beam.dmi', icon_state = "b_beam", time = INFINITY, max_distance = INFINITY, beam_type = /obj/effect/ebeam, beam_color = null, override_origin_pixel_x = null, override_origin_pixel_y = null, override_target_pixel_x = null, override_target_pixel_y = null) src.origin = origin src.target = target src.icon = icon @@ -39,6 +47,10 @@ src.max_distance = max_distance src.beam_type = beam_type src.beam_color = beam_color + src.override_origin_pixel_x = override_origin_pixel_x + src.override_origin_pixel_y = override_origin_pixel_y + src.override_target_pixel_x = override_target_pixel_x + src.override_target_pixel_y = override_target_pixel_y if(time < INFINITY) QDEL_IN(src, time) @@ -85,33 +97,41 @@ * Creates the beam effects and places them in a line from the origin to the target. Sets their rotation to make the beams face the target, too. */ /datum/beam/proc/Draw() - var/Angle = round(get_angle(origin,target)) + 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/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() var/turf/origin_turf = get_turf(origin) rot_matrix.Turn(Angle) //Translation vector for origin and target - var/DX = (32*target.x+target.pixel_x)-(32*origin.x+origin.pixel_x) - var/DY = (32*target.y+target.pixel_y)-(32*origin.y+origin.pixel_y) + var/DX = (32*target.x+target_px)-(32*origin.x+origin_px) + var/DY = (32*target.y+target_py)-(32*origin.y+origin_py) var/N = 0 var/length = round(sqrt((DX)**2+(DY)**2)) //hypotenuse of the triangle formed by target and origin's displacement for(N in 0 to length-1 step 32)//-1 as we want < not <=, but we want the speed of X in Y to Z and step X if(QDELETED(src)) break - var/obj/effect/ebeam/X = new beam_type(origin_turf) - X.owner = src - elements += X + var/obj/effect/ebeam/segment = new beam_type(origin_turf) + segment.owner = src + elements += segment //Assign our single visual ebeam to each ebeam's vis_contents //ends are cropped by a transparent box icon of length-N pixel size laid over the visuals obj if(N+32>length) //went past the target, we draw a box of space to cut away from the beam sprite so the icon actually ends at the center of the target sprite var/icon/II = new(icon, icon_state)//this means we exclude the overshooting object from the visual contents which does mean those visuals don't show up for the final bit of the beam... II.DrawBox(null,1,(length-N),32,32)//in the future if you want to improve this, remove the drawbox and instead use a 513 filter to cut away at the final object's icon - X.icon = II + segment.icon = II + segment.color = beam_color else - X.vis_contents += visuals - X.transform = rot_matrix + segment.vis_contents += visuals + segment.transform = rot_matrix //Calculate pixel offsets (If necessary) var/Pixel_x @@ -129,15 +149,15 @@ var/a if(abs(Pixel_x)>32) a = Pixel_x > 0 ? round(Pixel_x/32) : CEILING(Pixel_x/32, 1) - X.x += a + segment.x += a Pixel_x %= 32 if(abs(Pixel_y)>32) a = Pixel_y > 0 ? round(Pixel_y/32) : CEILING(Pixel_y/32, 1) - X.y += a + segment.y += a Pixel_y %= 32 - X.pixel_x = Pixel_x - X.pixel_y = Pixel_y + segment.pixel_x = origin_px + Pixel_x + segment.pixel_y = origin_py + Pixel_y CHECK_TICK /obj/effect/ebeam @@ -147,7 +167,9 @@ /obj/effect/ebeam/update_overlays() . = ..() - . += emissive_appearance(icon, icon_state) + var/mutable_appearance/emmisive = emissive_appearance(icon, icon_state) + emmisive.transform = transform + . += emmisive /obj/effect/ebeam/Destroy() owner = null @@ -170,7 +192,9 @@ * maxdistance: how far the beam will go before stopping itself. Used mainly for two things: preventing lag if the beam may go in that direction and setting a range to abilities that use beams. * beam_type: The type of your custom beam. This is for adding other wacky stuff for your beam only. Most likely, you won't (and shouldn't) change it. */ -/atom/proc/Beam(atom/BeamTarget,icon_state="b_beam",icon='icons/effects/beam.dmi',time=INFINITY,maxdistance=INFINITY,beam_type=/obj/effect/ebeam, beam_color = null) - var/datum/beam/newbeam = new(src,BeamTarget,icon,icon_state,time,maxdistance,beam_type, beam_color) +/atom/proc/Beam(atom/BeamTarget,icon_state="b_beam",icon='icons/effects/beam.dmi',time=INFINITY,maxdistance=INFINITY,beam_type=/obj/effect/ebeam, beam_color = null, override_origin_pixel_x = null, override_origin_pixel_y = null, override_target_pixel_x = null, override_target_pixel_y = null) + var/datum/beam/newbeam = new(src,BeamTarget,icon,icon_state,time,maxdistance,beam_type, beam_color, override_origin_pixel_x, override_origin_pixel_y, override_target_pixel_x, override_target_pixel_y ) INVOKE_ASYNC(newbeam, /datum/beam/.proc/Start) return newbeam + + diff --git a/code/datums/brain_damage/split_personality.dm b/code/datums/brain_damage/split_personality.dm index a5dd91014636fb..588963437cdcf6 100644 --- a/code/datums/brain_damage/split_personality.dm +++ b/code/datums/brain_damage/split_personality.dm @@ -23,12 +23,12 @@ /datum/brain_trauma/severe/split_personality/proc/make_backseats() stranger_backseat = new(owner, src) - var/obj/effect/proc_holder/spell/targeted/personality_commune/stranger_spell = new(src) - stranger_backseat.AddSpell(stranger_spell) + var/datum/action/cooldown/spell/personality_commune/stranger_spell = new(src) + stranger_spell.Grant(stranger_backseat) owner_backseat = new(owner, src) - var/obj/effect/proc_holder/spell/targeted/personality_commune/owner_spell = new(src) - owner_backseat.AddSpell(owner_spell) + var/datum/action/cooldown/spell/personality_commune/owner_spell = new(src) + owner_spell.Grant(owner_backseat) /datum/brain_trauma/severe/split_personality/proc/get_ghost() diff --git a/code/datums/cinematics/_cinematic.dm b/code/datums/cinematics/_cinematic.dm index b8a3585d039576..f6f3bc43ef9cd0 100644 --- a/code/datums/cinematics/_cinematic.dm +++ b/code/datums/cinematics/_cinematic.dm @@ -71,21 +71,22 @@ ooc_toggled = TRUE toggle_ooc(FALSE) - // Place the /atom/movable/screen/cinematic into everyone's screens, prevent them from moving + // Place the /atom/movable/screen/cinematic into everyone's screens, and prevent movement. for(var/mob/watching_mob in watchers) show_to(watching_mob, GET_CLIENT(watching_mob)) RegisterSignal(watching_mob, COMSIG_MOB_CLIENT_LOGIN, .proc/show_to) - //Close watcher ui's + // Close watcher ui's, too, so they can watch it. SStgui.close_user_uis(watching_mob) - //Actually play it + // Actually plays the animation. This will sleep, likely. play_cinematic() - //Cleanup - sleep(cleanup_time) + // Cleans up after it's done playing. + addtimer(CALLBACK(src, .proc/clean_up_cinematic, ooc_toggled), cleanup_time) - //Restore OOC - if(ooc_toggled) +/// Cleans up the cinematic after a set timer of it sticking on the end screen. +/datum/cinematic/proc/clean_up_cinematic(was_ooc_toggled = FALSE) + if(was_ooc_toggled) toggle_ooc(TRUE) stop_cinematic() @@ -105,16 +106,22 @@ /datum/cinematic/proc/show_to(mob/watching_mob, client/watching_client) SIGNAL_HANDLER + // We could technically rip people out of notransform who shouldn't be, + // so we'll only lock down all viewing mobs who don't have it already set. + // This does potentially mean some mobs could lose their notrasnform and + // not be locked down by cinematics, but that should be very unlikely. if(!watching_mob.notransform) locked += WEAKREF(watching_mob) watching_mob.notransform = TRUE - if(!watching_client) + // Only show the actual cinematic to cliented mobs. + if(!watching_client || (watching_client in watching)) return watching += watching_client watching_mob.overlay_fullscreen("cinematic", /atom/movable/screen/fullscreen/cinematic_backdrop) watching_client.screen += screen + RegisterSignal(watching_client, COMSIG_PARENT_QDELETING, .proc/remove_watcher) /// Simple helper for playing sounds from the cinematic. /datum/cinematic/proc/play_cinematic_sound(sound_to_play) @@ -136,13 +143,28 @@ /// Stops the cinematic and removes it from all the viewers. /datum/cinematic/proc/stop_cinematic() for(var/client/viewing_client as anything in watching) - viewing_client.mob.clear_fullscreen("cinematic") - viewing_client.screen -= screen + remove_watcher(viewing_client) for(var/datum/weakref/locked_ref as anything in locked) var/mob/locked_mob = locked_ref.resolve() if(QDELETED(locked_mob)) continue locked_mob.notransform = FALSE + UnregisterSignal(locked_mob, COMSIG_MOB_CLIENT_LOGIN) qdel(src) + +/// Removes the passed client from our watching list. +/datum/cinematic/proc/remove_watcher(client/no_longer_watching) + SIGNAL_HANDLER + + if(!(no_longer_watching in watching)) + CRASH("cinematic remove_watcher was passed a client which wasn't watching.") + + UnregisterSignal(no_longer_watching, COMSIG_PARENT_QDELETING) + // We'll clear the cinematic if they have a mob which has one, + // but we won't remove notransform. Wait for the cinematic end to do that. + no_longer_watching.mob?.clear_fullscreen("cinematic") + no_longer_watching.screen -= screen + + watching -= no_longer_watching diff --git a/code/datums/components/anti_magic.dm b/code/datums/components/anti_magic.dm index 7abe5f7027c51f..a931df70d5d7ab 100644 --- a/code/datums/components/anti_magic.dm +++ b/code/datums/components/anti_magic.dm @@ -74,7 +74,10 @@ if(!casting_restriction_alert) // Check to see if we have any spells that are blocked due to antimagic - for(var/obj/effect/proc_holder/spell/magic_spell in equipper.mind?.spell_list) + for(var/datum/action/cooldown/spell/magic_spell in equipper.actions) + if(!(magic_spell.spell_requirements & SPELL_REQUIRES_NO_ANTIMAGIC)) + continue + if(antimagic_flags & magic_spell.antimagic_flags) to_chat(equipper, span_warning("[parent] is interfering with your ability to cast magic!")) casting_restriction_alert = TRUE diff --git a/code/datums/components/blood_walk.dm b/code/datums/components/blood_walk.dm new file mode 100644 index 00000000000000..0e14da29e0dfa8 --- /dev/null +++ b/code/datums/components/blood_walk.dm @@ -0,0 +1,95 @@ +///Blood walk, a component that causes you to make blood wherever you walk. +/datum/component/blood_walk + dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS + + ///How many blood pools can we create? + ///If we reach 0, we will stop leaving blood and self delete + var/blood_remaining = 0 + ///Typepath of what blood decal we create on walk + var/blood_type + ///The sound that plays when we spread blood. + var/sound_played + ///How loud will the sound be, if there is one. + var/sound_volume + ///The chance of spawning blood whenever walking + var/blood_spawn_chance + ///Should the decal face the direction of the parent + var/target_dir_change + ///Should we transfer the parent's blood DNA to created blood decal + var/transfer_blood_dna + +/datum/component/blood_walk/Initialize( + blood_type = /obj/effect/decal/cleanable/blood, + sound_played, + sound_volume = 80, + blood_spawn_chance = 100, + target_dir_change = FALSE, + transfer_blood_dna = FALSE, + max_blood = INFINITY, +) + + if(!ismovable(parent)) + return COMPONENT_INCOMPATIBLE + + src.blood_type = blood_type + src.sound_played = sound_played + src.sound_volume = sound_volume + src.blood_spawn_chance = blood_spawn_chance + src.target_dir_change = target_dir_change + src.transfer_blood_dna = transfer_blood_dna + + blood_remaining = max_blood + +/datum/component/blood_walk/RegisterWithParent() + RegisterSignal(parent, COMSIG_MOVABLE_MOVED, .proc/spread_blood) + +/datum/component/blood_walk/UnregisterFromParent() + UnregisterSignal(parent, COMSIG_MOVABLE_MOVED) + +/datum/component/blood_walk/InheritComponent( + datum/component/pricetag/new_comp, + i_am_original, + blood_type = /obj/effect/decal/cleanable/blood, + sound_played, + sound_volume = 80, + blood_spawn_chance = 100, + target_dir_change = FALSE, + transfer_blood_dna = FALSE, + max_blood = INFINITY, +) + + if(!i_am_original) + return + + if(max_blood >= INFINITY || blood_remaining >= INFINITY) + return + + // Applying a new version of the blood walk component will add the new version's step count to our's. + // We will completely disregard any other arguments passed, because we already have arguments set. + blood_remaining += max_blood + +///Spawns blood (if possible) under the source, and plays a sound effect (if any) +/datum/component/blood_walk/proc/spread_blood(datum/source) + SIGNAL_HANDLER + + var/atom/movable/movable_source = source + var/turf/current_turf = movable_source.loc + if(!isturf(current_turf)) + return + if(!prob(blood_spawn_chance)) + return + + var/obj/effect/decal/blood = new blood_type(current_turf) + if(QDELETED(blood)) // Our blood was placed on somewhere it shouldn't be and qdeleted in init. + return + + if(target_dir_change) + blood.setDir(movable_source.dir) + if(transfer_blood_dna) + blood.add_blood_DNA(GET_ATOM_BLOOD_DNA(movable_source)) + if(!isnull(sound_played)) + playsound(movable_source, sound_played, sound_volume, TRUE, 2, TRUE) + + blood_remaining = max(blood_remaining - 1, 0) + if(blood_remaining <= 0) + qdel(src) diff --git a/code/datums/components/bloodysoles.dm b/code/datums/components/bloodysoles.dm index 006da44dfdffd6..4066b5935adbe1 100644 --- a/code/datums/components/bloodysoles.dm +++ b/code/datums/components/bloodysoles.dm @@ -53,19 +53,42 @@ var/obj/item/parent_item = parent parent_item.update_slot_icon() + +/datum/component/bloodysoles/proc/reset_bloody_shoes() + bloody_shoes = list(BLOOD_STATE_HUMAN = 0, BLOOD_STATE_XENO = 0, BLOOD_STATE_OIL = 0, BLOOD_STATE_NOT_BLOODY = 0) + on_changed_bloody_shoes(BLOOD_STATE_NOT_BLOODY) + +///lowers bloody_shoes[index] by adjust_by +/datum/component/bloodysoles/proc/adjust_bloody_shoes(index, adjust_by) + bloody_shoes[index] = max(bloody_shoes[index] - adjust_by, 0) + on_changed_bloody_shoes() + +/datum/component/bloodysoles/proc/set_bloody_shoes(index, new_value) + bloody_shoes[index] = new_value + on_changed_bloody_shoes(index) + +///called whenever the value of bloody_soles changes +/datum/component/bloodysoles/proc/on_changed_bloody_shoes(index) + if(index && index != last_blood_state) + last_blood_state = index + if(!wielder) + return + if(bloody_shoes[last_blood_state] <= BLOOD_FOOTPRINTS_MIN * 2)//need twice that amount to make footprints + UnregisterSignal(wielder, COMSIG_MOVABLE_MOVED) + else + RegisterSignal(wielder, COMSIG_MOVABLE_MOVED, .proc/on_moved, override = TRUE) + /** * Run to equally share the blood between us and a decal */ /datum/component/bloodysoles/proc/share_blood(obj/effect/decal/cleanable/pool) - last_blood_state = pool.blood_state - // Share the blood between our boots and the blood pool - var/total_bloodiness = pool.bloodiness + bloody_shoes[last_blood_state] + var/total_bloodiness = pool.bloodiness + bloody_shoes[pool.blood_state] // We can however be limited by how much blood we can hold var/new_our_bloodiness = min(BLOOD_ITEM_MAX, total_bloodiness / 2) - bloody_shoes[last_blood_state] = new_our_bloodiness + set_bloody_shoes(pool.blood_state, new_our_bloodiness) pool.bloodiness = total_bloodiness - new_our_bloodiness // Give the pool the remaining blood incase we were limited if(HAS_TRAIT(parent_atom, TRAIT_LIGHT_STEP)) //the character is agile enough to don't mess their clothing and hands just from one blood splatter at floor @@ -105,7 +128,8 @@ equipped_slot = slot wielder = equipper - RegisterSignal(wielder, COMSIG_MOVABLE_MOVED, .proc/on_moved) + if(bloody_shoes[last_blood_state] > BLOOD_FOOTPRINTS_MIN * 2) + RegisterSignal(wielder, COMSIG_MOVABLE_MOVED, .proc/on_moved) RegisterSignal(wielder, COMSIG_STEP_ON_BLOOD, .proc/on_step_blood) /** @@ -147,7 +171,7 @@ oldLocFP.update_appearance() else if(find_pool_by_blood_state(oldLocTurf)) // No footprints in the tile we left, but there was some other blood pool there. Add exit footprints on it - bloody_shoes[last_blood_state] -= half_our_blood + adjust_bloody_shoes(last_blood_state, half_our_blood) update_icon() oldLocFP = new(oldLocTurf) @@ -167,7 +191,7 @@ // Create new footprints if(half_our_blood >= BLOOD_FOOTPRINTS_MIN) - bloody_shoes[last_blood_state] -= half_our_blood + adjust_bloody_shoes(last_blood_state, half_our_blood) update_icon() var/obj/effect/decal/cleanable/blood/footprints/FP = new(get_turf(parent_atom)) @@ -213,8 +237,7 @@ if(!(clean_types & CLEAN_TYPE_BLOOD) || last_blood_state == BLOOD_STATE_NOT_BLOODY) return NONE - bloody_shoes = list(BLOOD_STATE_HUMAN = 0, BLOOD_STATE_XENO = 0, BLOOD_STATE_OIL = 0, BLOOD_STATE_NOT_BLOODY = 0) - last_blood_state = BLOOD_STATE_NOT_BLOODY + reset_bloody_shoes() update_icon() return COMPONENT_CLEANED @@ -235,7 +258,6 @@ bloody_feet = mutable_appearance('icons/effects/blood.dmi', "shoeblood", SHOES_LAYER) RegisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT, .proc/on_clean) - RegisterSignal(parent, COMSIG_MOVABLE_MOVED, .proc/on_moved) RegisterSignal(parent, COMSIG_STEP_ON_BLOOD, .proc/on_step_blood) RegisterSignal(parent, COMSIG_CARBON_UNEQUIP_SHOECOVER, .proc/unequip_shoecover) RegisterSignal(parent, COMSIG_CARBON_EQUIP_SHOECOVER, .proc/equip_shoecover) diff --git a/code/datums/components/crafting/recipes.dm b/code/datums/components/crafting/recipes.dm index 163fa202d00c83..cbfefe662e7e9c 100644 --- a/code/datums/components/crafting/recipes.dm +++ b/code/datums/components/crafting/recipes.dm @@ -1074,6 +1074,15 @@ reqs = list(/obj/item/stack/sheet/cloth = 4) category = CAT_CLOTHING +/datum/crafting_recipe/flower_garland + name = "Flower Garland" + result = /obj/item/clothing/head/garland + time = 10 + reqs = list(/obj/item/food/grown/poppy = 4, + /obj/item/food/grown/harebell = 4, + /obj/item/food/grown/rose = 4) + category = CAT_CLOTHING + /datum/crafting_recipe/guillotine name = "Guillotine" result = /obj/structure/guillotine diff --git a/code/datums/components/cult_ritual_item.dm b/code/datums/components/cult_ritual_item.dm index 4dd01422f4590a..bf22148117d3e9 100644 --- a/code/datums/components/cult_ritual_item.dm +++ b/code/datums/components/cult_ritual_item.dm @@ -15,8 +15,8 @@ var/list/turfs_that_boost_us /// A list of all shields surrounding us while drawing certain runes (Nar'sie). var/list/obj/structure/emergency_shield/cult/narsie/shields - /// An item action associated with our parent, to quick-draw runes. - var/datum/action/item_action/linked_action + /// Weakref to an action added to our parent item that allows for quick drawing runes + var/datum/weakref/linked_action_ref /datum/component/cult_ritual_item/Initialize( examine_message, @@ -35,12 +35,13 @@ src.turfs_that_boost_us = list(turfs_that_boost_us) if(ispath(action)) - linked_action = new action(parent) + var/obj/item/item_parent = parent + var/datum/action/added_action = item_parent.add_item_action(action) + linked_action_ref = WEAKREF(added_action) /datum/component/cult_ritual_item/Destroy(force, silent) cleanup_shields() - if(linked_action) - QDEL_NULL(linked_action) + QDEL_NULL(linked_action_ref) return ..() /datum/component/cult_ritual_item/RegisterWithParent() diff --git a/code/datums/components/curse_of_hunger.dm b/code/datums/components/curse_of_hunger.dm index c37224f7344e09..29ead016db9e50 100644 --- a/code/datums/components/curse_of_hunger.dm +++ b/code/datums/components/curse_of_hunger.dm @@ -1,5 +1,3 @@ -///inital food tolerances, two dishes -#define FULL_HEALTH 2 ///the point where you can notice the item is hungry on examine. #define HUNGER_THRESHOLD_WARNING 25 ///the point where the item has a chance to eat something on every tick. possibly you! @@ -17,14 +15,18 @@ var/awakened = FALSE ///counts time passed since it ate food var/hunger = 0 - ///how many times it needs to be fed poisoned food for it to drop off of you - var/poison_food_tolerance = FULL_HEALTH + ///The bag's max "health". IE, how many times you need to poison it. + var/max_health = 2 + ///The bag's current "health". IE, how many more times you need to poison it to stop it. + var/current_health = 2 -/datum/component/curse_of_hunger/Initialize(add_dropdel = FALSE) +/datum/component/curse_of_hunger/Initialize(add_dropdel = FALSE, max_health = 2) . = ..() if(!isitem(parent)) return COMPONENT_INCOMPATIBLE src.add_dropdel = add_dropdel + src.max_health = max_health + src.current_health = max_health /datum/component/curse_of_hunger/RegisterWithParent() . = ..() @@ -46,7 +48,7 @@ SIGNAL_HANDLER if(!awakened) return //we should not reveal we are cursed until equipped - if(poison_food_tolerance != FULL_HEALTH) + if(current_health < max_health) examine_list += span_notice("[parent] looks sick from something it ate.") if(hunger > HUNGER_THRESHOLD_WARNING) examine_list += span_danger("[parent] hungers for something to eat...") @@ -102,7 +104,8 @@ playsound(vomit_turf, 'sound/effects/splat.ogg', 50, TRUE) new /obj/effect/decal/cleanable/vomit(vomit_turf) - if(!add_dropdel) //gives a head start for the person to get away from the cursed item before it begins hunting again! + uncursed.dropItemToGround(at_least_item, force = TRUE) + if(!QDELETED(at_least_item)) //gives a head start for the person to get away from the cursed item before it begins hunting again! addtimer(CALLBACK(src, .proc/seek_new_target), 10 SECONDS) ///proc called after a timer to awaken the AI in the cursed item if it doesn't have a target already. @@ -120,39 +123,46 @@ var/obj/item/cursed_item = parent var/mob/living/carbon/cursed = cursed_item.loc ///check hp - if(!poison_food_tolerance) - cursed.dropItemToGround(cursed_item, TRUE) + if(current_health <= 0) + the_curse_ends(cursed) return + hunger += delta_time if((hunger <= HUNGER_THRESHOLD_TRY_EATING) || prob(80)) return - var/list/locations_to_check = (cursed.contents + cursed_item.contents) + playsound(cursed_item, 'sound/items/eatfood.ogg', 20, TRUE) + hunger = 0 + //check hungry enough to eat something! - for(var/obj/item/food in locations_to_check) + for(var/obj/item/food in cursed_item.contents + cursed.contents) if(!IS_EDIBLE(food)) continue food.forceMove(cursed.loc) - playsound(cursed_item, 'sound/items/eatfood.ogg', 20, TRUE) ///poisoned food damages it - if(istype(food, /obj/item/food/badrecipe)) - to_chat(cursed, span_warning("[cursed_item] eats your [food] to sate [cursed_item.p_their()] hunger, and looks [pick("queasy", "sick", "iffy", "unwell")] afterwards!")) - poison_food_tolerance-- + if(locate(/datum/reagent/toxin) in food.reagents.reagent_list) + var/sick_word = pick("queasy", "sick", "iffy", "unwell") + cursed.visible_message( + span_notice("[cursed_item] eats something from [cursed], and looks [sick_word] afterwards!"), + span_notice("[cursed_item] eats your [food.name] to sate [cursed_item.p_their()] hunger, and looks [sick_word] afterwards!"), + ) + current_health-- else - to_chat(cursed, span_notice("[cursed_item] eats your [food] to sate [cursed_item.p_their()] hunger.")) + cursed.visible_message( + span_warning("[cursed_item] eats something from [cursed] to sate [cursed_item.p_their()] hunger."), + span_warning("[cursed_item] eats your [food.name] to sate [cursed_item.p_their()] hunger."), + ) cursed.temporarilyRemoveItemFromInventory(food, force = TRUE) qdel(food) - hunger = 0 return - ///no food found: it bites you and regains some poison food tolerance - playsound(cursed_item, 'sound/items/eatfood.ogg', 20, TRUE) - to_chat(cursed, span_userdanger("[cursed_item] bites you to sate [cursed_item.p_their()] hunger!")) - var/affecting = cursed.get_bodypart(BODY_ZONE_CHEST) - cursed.apply_damage(60, BRUTE, affecting) - hunger = 0 - poison_food_tolerance = min(poison_food_tolerance + 1, FULL_HEALTH) -/datum/component/curse_of_hunger/proc/test() - var/obj/item/cursed_item = parent - var/mob/living/carbon/cursed = cursed_item.loc - cursed.dropItemToGround(cursed_item, TRUE) + ///no food found, but you're dead: it bites you slightly, and doesn't regain health. + if(cursed.stat == DEAD) + cursed.visible_message(span_danger("[cursed_item] nibbles on [cursed]."), span_userdanger("[cursed_item] nibbles on you!")) + cursed.apply_damage(10, BRUTE, BODY_ZONE_CHEST) + return + + ///no food found: it bites you and regains some health. + cursed.visible_message(span_danger("[cursed_item] bites [cursed]!"), span_userdanger("[cursed_item] bites you to sate [cursed_item.p_their()] hunger!")) + cursed.apply_damage(60, BRUTE, BODY_ZONE_CHEST, wound_bonus = -20, bare_wound_bonus = 20) + current_health = min(current_health + 1, max_health) diff --git a/code/datums/components/diggable.dm b/code/datums/components/diggable.dm deleted file mode 100644 index 7239b9eb685d6c..00000000000000 --- a/code/datums/components/diggable.dm +++ /dev/null @@ -1,28 +0,0 @@ -/// Lets you make hitting a turf with a shovel pop something out, and scrape the turf -/datum/component/diggable - /// Typepath to spawn on hit - var/to_spawn - /// Amount to spawn on hit - var/amount - /// What should we tell the user they did? - var/action_text - -/datum/component/diggable/Initialize(to_spawn, amount = 1, action_text) - . = ..() - if(!isturf(parent)) - return COMPONENT_INCOMPATIBLE - - src.to_spawn = to_spawn - src.amount = amount - src.action_text = action_text - RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, .proc/handle_attack) - -/datum/component/diggable/proc/handle_attack(datum/source, obj/item/hit_by, mob/living/bastard, params) - if(hit_by.tool_behaviour != TOOL_SHOVEL || !params) - return - var/turf/parent_turf = parent - for(var/i in 1 to amount) - new to_spawn(parent_turf) - bastard.visible_message(span_notice("[bastard] digs up [parent_turf]."), span_notice("You [action_text] [parent_turf].")) - playsound(parent_turf, 'sound/effects/shovel_dig.ogg', 50, TRUE) - parent_turf.ScrapeAway(flags = CHANGETURF_INHERIT_AIR) diff --git a/code/datums/components/drift.dm b/code/datums/components/drift.dm index 4d509026a44f84..d0e4bc6441f2c0 100644 --- a/code/datums/components/drift.dm +++ b/code/datums/components/drift.dm @@ -114,7 +114,6 @@ return var/atom/movable/movable_parent = parent - movable_parent.inertia_moving = FALSE movable_parent.setDir(old_dir) if(movable_parent.Process_Spacemove(drifting_loop.direction, continuous_move = TRUE)) glide_to_halt(visual_delay) @@ -137,7 +136,7 @@ if(!isturf(movable_parent.loc)) qdel(src) return - if(movable_parent.inertia_moving) //This'll be handled elsewhere + if(movable_parent.inertia_moving) return if(!movable_parent.Process_Spacemove(drifting_loop.direction, continuous_move = TRUE)) return diff --git a/code/datums/components/embedded.dm b/code/datums/components/embedded.dm index 0c8d85a7372336..8e906890cf7573 100644 --- a/code/datums/components/embedded.dm +++ b/code/datums/components/embedded.dm @@ -142,7 +142,7 @@ if(harmful && prob(pain_chance_current)) limb.receive_damage(brute=(1-pain_stam_pct) * damage, stamina=pain_stam_pct * damage, wound_bonus = CANT_WOUND) - to_chat(victim, span_userdanger("[weapon] embedded in your [limb.plaintext_zone]] hurts!")) + to_chat(victim, span_userdanger("[weapon] embedded in your [limb.plaintext_zone] hurts!")) var/fall_chance_current = DT_PROB_RATE(fall_chance / 100, delta_time) * 100 if(victim.body_position == LYING_DOWN) diff --git a/code/datums/components/fishing_spot.dm b/code/datums/components/fishing_spot.dm new file mode 100644 index 00000000000000..78b9d64cbd202d --- /dev/null +++ b/code/datums/components/fishing_spot.dm @@ -0,0 +1,62 @@ +// A thing you can fish in +/datum/component/fishing_spot + /// Defines the probabilities and fish availibilty + var/datum/fish_source/fish_source + +/datum/component/fishing_spot/Initialize(configuration) + if(ispath(configuration,/datum/fish_source)) + //Create new one of the given type + fish_source = new configuration + else if(istype(configuration,/datum/fish_source)) + //Use passed in instance + fish_source = configuration + else + /// Check if it's a preset key + var/datum/fish_source/preset_configuration = GLOB.preset_fish_sources[configuration] + if(!preset_configuration) + stack_trace("Invalid fishing spot configuration \"[configuration]\" passed down to fishing spot component.") + return COMPONENT_INCOMPATIBLE + fish_source = preset_configuration + RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, .proc/handle_attackby) + RegisterSignal(parent, COMSIG_FISHING_ROD_CAST, .proc/handle_cast) + + +/datum/component/fishing_spot/proc/handle_cast(datum/source, obj/item/fishing_rod/rod, mob/user) + SIGNAL_HANDLER + if(try_start_fishing(rod,user)) + return FISHING_ROD_CAST_HANDLED + return NONE + +/datum/component/fishing_spot/proc/handle_attackby(datum/source, obj/item/item, mob/user, params) + SIGNAL_HANDLER + if(try_start_fishing(item,user)) + return COMPONENT_NO_AFTERATTACK + return NONE + +/datum/component/fishing_spot/proc/try_start_fishing(obj/item/possibly_rod, mob/user) + SIGNAL_HANDLER + var/obj/item/fishing_rod/rod = possibly_rod + if(!istype(rod)) + return + if(HAS_TRAIT(user,TRAIT_GONE_FISHING) || rod.currently_hooked_item) + user.balloon_alert(user, "already fishing") + return COMPONENT_NO_AFTERATTACK + var/denial_reason = fish_source.can_fish(rod, user) + if(denial_reason) + to_chat(user, span_warning(denial_reason)) + return COMPONENT_NO_AFTERATTACK + 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) + var/datum/fishing_challenge/challenge = new(parent, result, rod, user) + challenge.background = fish_source.background + challenge.difficulty = fish_source.calculate_difficulty(result, rod, user) + RegisterSignal(challenge, COMSIG_FISHING_CHALLENGE_COMPLETED, .proc/fishing_completed) + challenge.start(user) + +/datum/component/fishing_spot/proc/fishing_completed(datum/fishing_challenge/source, mob/user, success, perfect) + if(success) + fish_source.dispense_reward(source.reward_path, user) diff --git a/code/datums/components/food/decomposition.dm b/code/datums/components/food/decomposition.dm index 15a187396e8a4f..3ee6d6191fcb32 100644 --- a/code/datums/components/food/decomposition.dm +++ b/code/datums/components/food/decomposition.dm @@ -73,7 +73,7 @@ var/turf/open/open_turf = food.loc - if(!istype(open_turf) || istype(open_turf, /turf/open/lava) || istype(open_turf, /turf/open/misc/asteroid)) //Are we actually in a valid open turf? + if(!istype(open_turf) || islava(open_turf) || istype(open_turf, /turf/open/misc/asteroid)) //Are we actually in a valid open turf? remove_timer() return diff --git a/code/datums/components/knockoff.dm b/code/datums/components/knockoff.dm index 08f0a1f578fb87..5efe33af69b05b 100644 --- a/code/datums/components/knockoff.dm +++ b/code/datums/components/knockoff.dm @@ -1,71 +1,99 @@ -///Items with these will have a chance to get knocked off when disarming or being knocked down +/// Items with this component will have a chance to get knocked off +/// (unequipped and sent to the ground) when the wearer is disarmed or knocked down. /datum/component/knockoff - ///Chance to knockoff + /// Chance to knockoff when a knockoff action occurs. var/knockoff_chance = 100 - ///Aiming for these zones will cause the knockoff, null means all zones allowed + /// Used in being disarmed. + /// If set, we will only roll the knockoff chance if the disarmer is targeting one of these zones. + /// If unset, any disarm act will cause the knock-off chance to be rolled, no matter the zone targeted. var/list/target_zones - ///Can be only knocked off from these slots, null means all slots allowed - var/list/slots_knockoffable + /// Bitflag used in equip to determine what slots we need to be in to be knocked off. + /// If set, we must be equipped in one of the slots to have a chance of our item being knocked off. + /// If unset / NONE, a disarm or knockdown will have a chance of our item being knocked off regardless of slot, INCLUDING hand slots. + var/slots_knockoffable = NONE -/datum/component/knockoff/Initialize(knockoff_chance,zone_override,slots_knockoffable) +/datum/component/knockoff/Initialize(knockoff_chance = 100, target_zones, slots_knockoffable = NONE) if(!isitem(parent)) return COMPONENT_INCOMPATIBLE - RegisterSignal(parent, COMSIG_ITEM_EQUIPPED,.proc/OnEquipped) - RegisterSignal(parent, COMSIG_ITEM_DROPPED,.proc/OnDropped) src.knockoff_chance = knockoff_chance + src.target_zones = target_zones + src.slots_knockoffable = slots_knockoffable - if(zone_override) - target_zones = zone_override +/datum/component/knockoff/RegisterWithParent() + RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, .proc/on_equipped) + RegisterSignal(parent, COMSIG_ITEM_DROPPED, .proc/on_dropped) - if(slots_knockoffable) - src.slots_knockoffable = slots_knockoffable +/datum/component/knockoff/UnregisterFromParent() + UnregisterSignal(parent, list(COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED)) -///Tries to knockoff the item when disarmed -/datum/component/knockoff/proc/Knockoff(mob/living/carbon/human/wearer,mob/living/attacker,zone) + var/obj/item/item_parent = parent + if(ismob(item_parent.loc)) + UnregisterSignal(item_parent.loc, list(COMSIG_HUMAN_DISARM_HIT, COMSIG_LIVING_STATUS_KNOCKDOWN)) + +/// Signal proc for [COMSIG_HUMAN_DISARM_HIT] on the mob who's equipped our parent +/// Rolls a chance for knockoff whenever we're disarmed +/datum/component/knockoff/proc/on_equipped_mob_disarm(mob/living/carbon/human/source, mob/living/attacker, zone) SIGNAL_HANDLER - var/obj/item/item = parent - if(!istype(wearer)) + if(!istype(source)) return + if(target_zones && !(zone in target_zones)) return if(!prob(knockoff_chance)) return - if(!wearer.dropItemToGround(item)) + + var/obj/item/item_parent = parent + if(!source.dropItemToGround(item_parent)) return - wearer.visible_message(span_warning("[attacker] knocks off [wearer]'s [item.name]!"),span_userdanger("[attacker] knocks off your [item.name]!")) -///Tries to knockoff the item when user is knocked down -/datum/component/knockoff/proc/Knockoff_knockdown(mob/living/carbon/human/wearer,amount) + source.visible_message( + span_warning("[attacker] knocks off [source]'s [item_parent.name]!"), + span_userdanger("[attacker] knocks off your [item_parent.name]!"), + ) + +/// Signal proc for [COMSIG_LIVING_STATUS_KNOCKDOWN] on the mob who's equipped our parent +/// Rolls a chance for knockoff whenever we're knocked down +/datum/component/knockoff/proc/on_equipped_mob_knockdown(mob/living/carbon/human/source, amount) SIGNAL_HANDLER - if(amount <= 0) + if(!istype(source)) return - var/obj/item/item = parent - if(!istype(wearer)) + // Healing knockdown or setting knockdown to zero or something? Don't knock off. + if(amount <= 0) return if(!prob(knockoff_chance)) return - if(!wearer.dropItemToGround(item)) + + var/obj/item/item_parent = parent + if(!source.dropItemToGround(item_parent)) return - wearer.visible_message(span_warning("[wearer]'s [item.name] get[item.p_s()] knocked off!"),span_userdanger("Your [item.name] [item.p_were()] knocked off!")) + source.visible_message( + span_warning("[source]'s [item_parent.name] get[item_parent.p_s()] knocked off!"), + span_userdanger("Your [item_parent.name] [item_parent.p_were()] knocked off!"), + ) -/datum/component/knockoff/proc/OnEquipped(datum/source, mob/living/carbon/human/H,slot) +/// Signal proc for [COMSIG_ITEM_EQUIPPED] +/// Registers our signals which can cause a knockdown whenever we're equipped correctly +/datum/component/knockoff/proc/on_equipped(datum/source, mob/living/carbon/human/equipper, slot) SIGNAL_HANDLER - if(!istype(H)) + + if(!istype(equipper)) return - if(slots_knockoffable && !(slot in slots_knockoffable)) - UnregisterSignal(H, COMSIG_HUMAN_DISARM_HIT) - UnregisterSignal(H, COMSIG_LIVING_STATUS_KNOCKDOWN) + + if(slots_knockoffable && !(slot & slots_knockoffable)) + UnregisterSignal(equipper, list(COMSIG_HUMAN_DISARM_HIT, COMSIG_LIVING_STATUS_KNOCKDOWN)) return - RegisterSignal(H, COMSIG_HUMAN_DISARM_HIT, .proc/Knockoff, TRUE) - RegisterSignal(H, COMSIG_LIVING_STATUS_KNOCKDOWN, .proc/Knockoff_knockdown, TRUE) -/datum/component/knockoff/proc/OnDropped(datum/source, mob/living/M) + RegisterSignal(equipper, COMSIG_HUMAN_DISARM_HIT, .proc/on_equipped_mob_disarm, TRUE) + RegisterSignal(equipper, COMSIG_LIVING_STATUS_KNOCKDOWN, .proc/on_equipped_mob_knockdown, TRUE) + +/// Signal proc for [COMSIG_ITEM_DROPPED] +/// Unregisters our signals which can cause a knockdown when we're unequipped (dropped) +/datum/component/knockoff/proc/on_dropped(datum/source, mob/living/dropper) SIGNAL_HANDLER - UnregisterSignal(M, COMSIG_HUMAN_DISARM_HIT) - UnregisterSignal(M, COMSIG_LIVING_STATUS_KNOCKDOWN) + UnregisterSignal(dropper, list(COMSIG_HUMAN_DISARM_HIT, COMSIG_LIVING_STATUS_KNOCKDOWN)) diff --git a/code/datums/components/material_container.dm b/code/datums/components/material_container.dm index 8241234d775df1..6631a744637da5 100644 --- a/code/datums/components/material_container.dm +++ b/code/datums/components/material_container.dm @@ -301,6 +301,8 @@ if(!materials[req_mat]) //Do we have the resource? return FALSE //Can't afford it var/amount_required = mats[x] * multiplier + if(amount_required < 0) + return FALSE //No negative mats if(!(materials[req_mat] >= amount_required)) // do we have enough of the resource? return FALSE //Can't afford it mats_to_remove[req_mat] += amount_required //Add it to the assoc list of things to remove diff --git a/code/datums/components/mood.dm b/code/datums/components/mood.dm index 4cabeb9a316584..f03f8108b5770a 100644 --- a/code/datums/components/mood.dm +++ b/code/datums/components/mood.dm @@ -48,7 +48,7 @@ RegisterSignal(parent, COMSIG_ADD_MOOD_EVENT_RND, .proc/add_event) //Mood events that are only for RnD members /datum/component/mood/proc/print_mood(mob/user) - var/msg = "[span_info("*---------*\nMy current mental status:")]\n" + var/msg = "[span_info("My current mental status:")]\n" msg += span_notice("My current sanity: ") //Long term switch(sanity) if(SANITY_GREAT to INFINITY) @@ -102,7 +102,7 @@ msg += span_boldnicegreen(event.description + "\n") else msg += "[span_grey("I don't have much of a reaction to anything right now.")]\n" - to_chat(user, msg) + to_chat(user, examine_block(msg)) ///Called after moodevent/s have been added/removed. /datum/component/mood/proc/update_mood() diff --git a/code/datums/components/overlay_lighting.dm b/code/datums/components/overlay_lighting.dm index 9fd0e0a4f5af7d..67290d4c58c35c 100644 --- a/code/datums/components/overlay_lighting.dm +++ b/code/datums/components/overlay_lighting.dm @@ -111,7 +111,6 @@ . = ..() if(directional) RegisterSignal(parent, COMSIG_ATOM_DIR_CHANGE, .proc/on_parent_dir_change) - RegisterSignal(parent, COMSIG_MOVABLE_MOVED, .proc/on_parent_moved) RegisterSignal(parent, COMSIG_ATOM_UPDATE_LIGHT_RANGE, .proc/set_range) RegisterSignal(parent, COMSIG_ATOM_UPDATE_LIGHT_POWER, .proc/set_power) RegisterSignal(parent, COMSIG_ATOM_UPDATE_LIGHT_COLOR, .proc/set_color) @@ -119,6 +118,7 @@ RegisterSignal(parent, COMSIG_ATOM_UPDATE_LIGHT_FLAGS, .proc/on_light_flags_change) RegisterSignal(parent, COMSIG_ATOM_USED_IN_CRAFT, .proc/on_parent_crafted) RegisterSignal(parent, COMSIG_LIGHT_EATER_QUEUE, .proc/on_light_eater) + RegisterSignal(parent, COMSIG_MOVABLE_MOVED, .proc/on_parent_moved) var/atom/movable/movable_parent = parent if(movable_parent.light_flags & LIGHT_ATTACHED) overlay_lighting_flags |= LIGHTING_ATTACHED @@ -245,8 +245,9 @@ return if(new_holder != parent && new_holder != parent_attached_to) RegisterSignal(new_holder, COMSIG_PARENT_QDELETING, .proc/on_holder_qdel) - RegisterSignal(new_holder, COMSIG_MOVABLE_MOVED, .proc/on_holder_moved) RegisterSignal(new_holder, COMSIG_LIGHT_EATER_QUEUE, .proc/on_light_eater) + if(overlay_lighting_flags & LIGHTING_ON) + RegisterSignal(new_holder, COMSIG_MOVABLE_MOVED, .proc/on_holder_moved) if(directional) RegisterSignal(new_holder, COMSIG_ATOM_DIR_CHANGE, .proc/on_holder_dir_change) set_direction(new_holder.dir) @@ -423,6 +424,8 @@ cast_directional_light() add_dynamic_lumi() overlay_lighting_flags |= LIGHTING_ON + if(current_holder && current_holder != parent && current_holder != parent_attached_to) + RegisterSignal(current_holder, COMSIG_MOVABLE_MOVED, .proc/on_holder_moved) get_new_turfs() @@ -433,6 +436,8 @@ if(current_holder) remove_dynamic_lumi() overlay_lighting_flags &= ~LIGHTING_ON + if(current_holder) + UnregisterSignal(current_holder, COMSIG_MOVABLE_MOVED) clean_old_turfs() diff --git a/code/datums/components/plumbing/_plumbing.dm b/code/datums/components/plumbing/_plumbing.dm index 47e4f5807324a7..c3c82775aa83fe 100644 --- a/code/datums/components/plumbing/_plumbing.dm +++ b/code/datums/components/plumbing/_plumbing.dm @@ -22,10 +22,10 @@ var/recipient_reagents_holder ///How do we apply the new reagents to the receiver? Generally doesn't matter, but some stuff, like people, does care if its injected or whatevs var/methods - ///What color is our demand connect? Also it's not auto-colored so you'll have to make new sprites if its anything other than red, blue, yellow or green - var/demand_color = "red" - ///What color is our supply connect? Also, refrain from pointlessly using non-standard colors unless it's really funny or something - var/supply_color = "blue" + ///What color is our demand connect? + var/demand_color = COLOR_RED + ///What color is our supply connect? + var/supply_color = COLOR_BLUE ///turn_connects is for wheter or not we spin with the object to change our pipes /datum/component/plumbing/Initialize(start=TRUE, _ducting_layer, _turn_connects=TRUE, datum/reagents/custom_receiver) @@ -35,14 +35,14 @@ if(_ducting_layer) ducting_layer = _ducting_layer - var/atom/movable/AM = parent - if(!AM.reagents && !custom_receiver) + var/atom/movable/parent_movable = parent + if(!parent_movable.reagents && !custom_receiver) return COMPONENT_INCOMPATIBLE - reagents = AM.reagents + reagents = parent_movable.reagents turn_connects = _turn_connects - set_recipient_reagents_holder(custom_receiver ? custom_receiver : AM.reagents) + set_recipient_reagents_holder(custom_receiver ? custom_receiver : parent_movable.reagents) if(start) //We're registering here because I need to check whether we start active or not, and this is just easier @@ -76,10 +76,10 @@ send_request(D) ///Can we be added to the ductnet? -/datum/component/plumbing/proc/can_add(datum/ductnet/D, dir) +/datum/component/plumbing/proc/can_add(datum/ductnet/ductnet, dir) if(!active) return - if(!dir || !D) + if(!dir || !ductnet) return FALSE if(num2text(dir) in ducts) return FALSE @@ -97,15 +97,13 @@ if(!ducts.Find(num2text(dir))) return net = ducts[num2text(dir)] - for(var/A in net.suppliers) - var/datum/component/plumbing/supplier = A + for(var/datum/component/plumbing/supplier as anything in net.suppliers) if(supplier.can_give(amount, reagent, net)) valid_suppliers += supplier // Need to ask for each in turn very carefully, making sure we get the total volume. This is to avoid a division that would always round down and become 0 var/targetVolume = reagents.total_volume + amount var/suppliersLeft = valid_suppliers.len - for(var/A in valid_suppliers) - var/datum/component/plumbing/give = A + for(var/datum/component/plumbing/give as anything in valid_suppliers) var/currentRequest = (targetVolume - reagents.total_volume) / suppliersLeft give.transfer_to(src, currentRequest, reagent, net) suppliersLeft-- @@ -116,9 +114,8 @@ return if(reagent) //only asked for one type of reagent - for(var/A in reagents.reagent_list) - var/datum/reagent/R = A - if(R.type == reagent) + for(var/datum/reagent/contained_reagent as anything in reagents.reagent_list) + if(contained_reagent.type == reagent) return TRUE else if(reagents.total_volume > 0) //take whatever return TRUE @@ -133,7 +130,7 @@ reagents.trans_to(target.recipient_reagents_holder, amount, round_robin = TRUE, methods = methods)//we deal with alot of precise calculations so we round_robin=TRUE. Otherwise we get floating point errors, 1 != 1 and 2.5 + 2.5 = 6 ///We create our luxurious piping overlays/underlays, to indicate where we do what. only called once if use_overlays = TRUE in Initialize() -/datum/component/plumbing/proc/create_overlays(atom/movable/AM, list/overlays) +/datum/component/plumbing/proc/create_overlays(atom/movable/parent_movable, list/overlays) SIGNAL_HANDLER if(tile_covered || !use_overlays) @@ -158,39 +155,30 @@ var/duct_y = offset - for(var/D in GLOB.cardinals) + for(var/direction in GLOB.cardinals) var/color - var/direction - if(D & initial(demand_connects)) + if(direction & initial(demand_connects)) color = demand_color - else if(D & initial(supply_connects)) + else if(direction & initial(supply_connects)) color = supply_color else continue - var/image/I - - switch(D) - if(NORTH) - direction = "north" - if(SOUTH) - direction = "south" - if(EAST) - direction = "east" - if(WEST) - direction = "west" + var/direction_text = dir2text(direction) + var/duct_layer = PLUMBING_PIPE_VISIBILE_LAYER + ducting_layer * 0.0003 + var/image/overlay if(turn_connects) - I = image('icons/obj/plumbing/connects.dmi', "[direction]-[color]", layer = AM.layer - 1) - + overlay = image('icons/obj/plumbing/connects.dmi', "[direction_text]-[ducting_layer]", layer = duct_layer) else - I = image('icons/obj/plumbing/connects.dmi', "[direction]-[color]-s", layer = AM.layer - 1) //color is not color as in the var, it's just the name of the icon_state - I.dir = D + overlay = image('icons/obj/plumbing/connects.dmi', "[direction_text]-[ducting_layer]-s", layer = duct_layer) + overlay.dir = direction - I.pixel_x = duct_x - I.pixel_y = duct_y + overlay.color = color + overlay.pixel_x = duct_x + overlay.pixel_y = duct_y - overlays += I + overlays += overlay ///we stop acting like a plumbing thing and disconnect if we are, so we can safely be moved and stuff /datum/component/plumbing/proc/disable() @@ -201,19 +189,21 @@ STOP_PROCESSING(SSplumbing, src) - for(var/A in ducts) - var/datum/ductnet/D = ducts[A] - D.remove_plumber(src) + for(var/duct_dir in ducts) + var/datum/ductnet/duct = ducts[duct_dir] + duct.remove_plumber(src) active = FALSE - for(var/D in GLOB.cardinals) - if(D & (demand_connects | supply_connects)) - for(var/obj/machinery/duct/duct in get_step(parent, D)) - if(duct.duct_layer == ducting_layer) - duct.remove_connects(turn(D, 180)) - duct.neighbours.Remove(parent) - duct.update_appearance() + for(var/direction in GLOB.cardinals) + if(!(direction & (demand_connects | supply_connects))) + continue + for(var/obj/machinery/duct/duct in get_step(parent, direction)) + if(!(duct.duct_layer & ducting_layer)) + continue + duct.remove_connects(turn(direction, 180)) + duct.neighbours.Remove(parent) + duct.update_appearance() ///settle wherever we are, and start behaving like a piece of plumbing /datum/component/plumbing/proc/enable(obj/object, datum/component/component) @@ -225,29 +215,32 @@ update_dir() active = TRUE - var/atom/movable/AM = parent - for(var/obj/machinery/duct/D in AM.loc) //Destroy any ducts under us. Ducts also self-destruct if placed under a plumbing machine. machines disable when they get moved - if(D.anchored) //that should cover everything - D.disconnect_duct() + var/atom/movable/parent_movable = parent + // Destroy any ducts under us on the same layer. + // Ducts also self-destruct if placed under a plumbing machine. + // Machines disable when they get moved + for(var/obj/machinery/duct/duct in parent_movable.loc) + if(duct.anchored && (duct.duct_layer & ducting_layer)) + duct.disconnect_duct() if(demand_connects) START_PROCESSING(SSplumbing, src) - for(var/D in GLOB.cardinals) - - if(D & (demand_connects | supply_connects)) - for(var/atom/movable/A in get_step(parent, D)) + for(var/direction in GLOB.cardinals) + if(!(direction & (demand_connects | supply_connects))) + continue + for(var/atom/movable/found_atom in get_step(parent, direction)) + if(istype(found_atom, /obj/machinery/duct)) + var/obj/machinery/duct/duct = found_atom + duct.attempt_connect() + continue - if(istype(A, /obj/machinery/duct)) - var/obj/machinery/duct/duct = A - duct.attempt_connect() - else - for(var/datum/component/plumbing/plumber as anything in A.GetComponents(/datum/component/plumbing)) - if(plumber.ducting_layer == ducting_layer) - direct_connect(plumber, D) + for(var/datum/component/plumbing/plumber as anything in found_atom.GetComponents(/datum/component/plumbing)) + if(plumber.ducting_layer & ducting_layer) + direct_connect(plumber, direction) /// Toggle our machinery on or off. This is called by a hook from default_unfasten_wrench with anchored as only param, so we dont have to copypaste this on every object that can move -/datum/component/plumbing/proc/toggle_active(obj/O, new_state) +/datum/component/plumbing/proc/toggle_active(obj/parent_obj, new_state) SIGNAL_HANDLER if(new_state) enable() @@ -271,45 +264,44 @@ demand_connects = initial(demand_connects) supply_connects = initial(supply_connects) else - for(var/D in GLOB.cardinals) - if(D & initial(demand_connects)) - new_demand_connects += turn(D, angle) - if(D & initial(supply_connects)) - new_supply_connects += turn(D, angle) + for(var/direction in GLOB.cardinals) + if(direction & initial(demand_connects)) + new_demand_connects += turn(direction, angle) + if(direction & initial(supply_connects)) + new_supply_connects += turn(direction, angle) demand_connects = new_demand_connects supply_connects = new_supply_connects ///Give the direction of a pipe, and it'll return wich direction it originally was when it's object pointed SOUTH /datum/component/plumbing/proc/get_original_direction(dir) - var/atom/movable/AM = parent - return turn(dir, dir2angle(AM.dir) - 180) + var/atom/movable/parent_movable = parent + return turn(dir, dir2angle(parent_movable.dir) - 180) //special case in-case we want to connect directly with another machine without a duct -/datum/component/plumbing/proc/direct_connect(datum/component/plumbing/P, dir) - if(!P.active) +/datum/component/plumbing/proc/direct_connect(datum/component/plumbing/plumbing, dir) + if(!plumbing.active) return var/opposite_dir = turn(dir, 180) - if(P.demand_connects & opposite_dir && supply_connects & dir || P.supply_connects & opposite_dir && demand_connects & dir) //make sure we arent connecting two supplies or demands + if(plumbing.demand_connects & opposite_dir && supply_connects & dir || plumbing.supply_connects & opposite_dir && demand_connects & dir) //make sure we arent connecting two supplies or demands var/datum/ductnet/net = new() net.add_plumber(src, dir) - net.add_plumber(P, opposite_dir) + net.add_plumber(plumbing, opposite_dir) -/datum/component/plumbing/proc/hide(atom/movable/AM, should_hide) +/datum/component/plumbing/proc/hide(atom/movable/parent_obj, should_hide) SIGNAL_HANDLER tile_covered = should_hide - AM.update_appearance() + parent_obj.update_appearance() -/datum/component/plumbing/proc/change_ducting_layer(obj/caller, obj/O, new_layer = DUCT_LAYER_DEFAULT) +/datum/component/plumbing/proc/change_ducting_layer(obj/caller, obj/changer, new_layer = DUCT_LAYER_DEFAULT) SIGNAL_HANDLER ducting_layer = new_layer - if(ismovable(parent)) - var/atom/movable/AM = parent - AM.update_appearance() + var/atom/movable/parent_movable = parent + parent_movable.update_appearance() - if(O) - playsound(O, 'sound/items/ratchet.ogg', 10, TRUE) //sound + if(changer) + playsound(changer, 'sound/items/ratchet.ogg', 10, TRUE) //sound //quickly disconnect and reconnect the network. if(active) @@ -348,7 +340,7 @@ demand_connects = NORTH supply_connects = SOUTH -/datum/component/plumbing/manifold/change_ducting_layer(obj/caller, obj/O, new_layer) +/datum/component/plumbing/manifold/change_ducting_layer(obj/caller, obj/changer, new_layer) return #define READY 2 diff --git a/code/datums/components/plumbing/reaction_chamber.dm b/code/datums/components/plumbing/reaction_chamber.dm index fe6064cccc838d..c750fda714255f 100644 --- a/code/datums/components/plumbing/reaction_chamber.dm +++ b/code/datums/components/plumbing/reaction_chamber.dm @@ -40,7 +40,7 @@ ///Special connect that we currently use for reaction chambers. Being used so we can keep certain inputs separate, like into a special internal acid container /datum/component/plumbing/acidic_input demand_connects = WEST - demand_color = "yellow" + demand_color = COLOR_YELLOW ducting_layer = SECOND_DUCT_LAYER @@ -50,7 +50,7 @@ ///Special connect that we currently use for reaction chambers. Being used so we can keep certain inputs separate, like into a special internal base container /datum/component/plumbing/alkaline_input demand_connects = EAST - demand_color = "green" + demand_color = COLOR_VIBRANT_LIME ducting_layer = FOURTH_DUCT_LAYER diff --git a/code/datums/components/remote_materials.dm b/code/datums/components/remote_materials.dm index 223b483f8e41c6..2ae9bd96775975 100644 --- a/code/datums/components/remote_materials.dm +++ b/code/datums/components/remote_materials.dm @@ -28,6 +28,7 @@ handles linking back and forth. RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, .proc/OnAttackBy) RegisterSignal(parent, COMSIG_ATOM_TOOL_ACT(TOOL_MULTITOOL), .proc/OnMultitool) + RegisterSignal(parent, COMSIG_MOVABLE_Z_CHANGED, .proc/check_z_level) var/turf/T = get_turf(parent) if (force_connect || (mapload && is_station_level(T.z))) @@ -38,14 +39,14 @@ handles linking back and forth. /datum/component/remote_materials/proc/LateInitialize() silo = GLOB.ore_silo_default if (silo) - silo.connected += src + silo.ore_connected_machines += src mat_container = silo.GetComponent(/datum/component/material_container) else _MakeLocal() /datum/component/remote_materials/Destroy() if (silo) - silo.connected -= src + silo.ore_connected_machines -= src silo.updateUsrDialog() silo = null mat_container = null @@ -105,19 +106,33 @@ handles linking back and forth. if (silo == M.buffer) to_chat(user, span_warning("[parent] is already connected to [silo]!")) return COMPONENT_BLOCK_TOOL_ATTACK + var/turf/silo_turf = get_turf(M.buffer) + var/turf/user_loc = get_turf(user) + if(!is_valid_z_level(silo_turf, user_loc)) + to_chat(user, span_warning("[parent] is too far away to get a connection signal!")) + return COMPONENT_BLOCK_TOOL_ATTACK if (silo) - silo.connected -= src + silo.ore_connected_machines -= src silo.updateUsrDialog() else if (mat_container) mat_container.retrieve_all() qdel(mat_container) silo = M.buffer - silo.connected += src + silo.ore_connected_machines += src silo.updateUsrDialog() mat_container = silo.GetComponent(/datum/component/material_container) to_chat(user, span_notice("You connect [parent] to [silo] from the multitool's buffer.")) return COMPONENT_BLOCK_TOOL_ATTACK +/datum/component/remote_materials/proc/check_z_level(datum/source, turf/old_turf, turf/new_turf) + SIGNAL_HANDLER + if(!silo) + return + + var/turf/silo_turf = get_turf(silo) + if(!is_valid_z_level(silo_turf, new_turf)) + disconnect_from(silo) + /datum/component/remote_materials/proc/on_hold() return silo?.holds["[get_area(parent)]/[category]"] diff --git a/code/datums/components/riding/riding_mob.dm b/code/datums/components/riding/riding_mob.dm index 85d144ea857da7..471720cb6c4f1f 100644 --- a/code/datums/components/riding/riding_mob.dm +++ b/code/datums/components/riding/riding_mob.dm @@ -137,11 +137,8 @@ var/mob/living/ridden_creature = parent - for(var/ability in ridden_creature.abilities) - var/obj/effect/proc_holder/proc_holder = ability - if(!proc_holder.action) - return - proc_holder.action.GiveAction(rider) + for(var/datum/action/action as anything in ridden_creature.actions) + action.GiveAction(rider) /// Takes away the riding parent's abilities from the rider /datum/component/riding/creature/proc/remove_abilities(mob/living/rider) @@ -150,13 +147,11 @@ var/mob/living/ridden_creature = parent - for(var/ability in ridden_creature.abilities) - var/obj/effect/proc_holder/proc_holder = ability - if(!proc_holder.action) - return - if(rider == proc_holder.ranged_ability_user) - proc_holder.remove_ranged_ability() - proc_holder.action.HideFrom(rider) + for(var/datum/action/action as anything in ridden_creature.actions) + if(istype(action, /datum/action/cooldown) && rider.click_intercept == action) + var/datum/action/cooldown/cooldown_action = action + cooldown_action.unset_click_ability(rider, refund_cooldown = TRUE) + action.HideFrom(rider) /datum/component/riding/creature/riding_can_z_move(atom/movable/movable_parent, direction, turf/start, turf/destination, z_move_flags, mob/living/rider) if(!(z_move_flags & ZMOVE_CAN_FLY_CHECKS)) diff --git a/code/datums/components/seclight_attachable.dm b/code/datums/components/seclight_attachable.dm new file mode 100644 index 00000000000000..8eb63d8dfe0ad9 --- /dev/null +++ b/code/datums/components/seclight_attachable.dm @@ -0,0 +1,293 @@ +/** + * Component which allows you to attach a seclight to an item, + * be it a piece of clothing or a tool. + */ +/datum/component/seclite_attachable + dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS + /// Whether we can remove the light with a screwdriver or not. + var/is_light_removable = TRUE + /// If passed, we wil simply update our item's icon_state when a light is attached. + /// Formatted as parent_base_state-[light_icon-state]-"on" + var/light_icon_state + /// If passed, we will add overlays to the item when a light is attached. + /// This is the icon file it grabs the overlay from. + var/light_overlay_icon + /// The state to take from the light overlay icon if supplied. + var/light_overlay + /// The X offset of our overlay if supplied. + var/overlay_x = 0 + /// The Y offset of our overlay if supplied. + var/overlay_y = 0 + + // Internal vars. + /// A reference to the actual light that's attached. + var/obj/item/flashlight/seclite/light + /// A weakref to the item action we add with the light. + var/datum/weakref/toggle_action_ref + /// Static typecache of all lights we consider seclites (all lights we can attach). + var/static/list/valid_lights = typecacheof(list(/obj/item/flashlight/seclite)) + +/datum/component/seclite_attachable/Initialize( + obj/item/flashlight/seclite/starting_light, + is_light_removable = TRUE, + light_icon_state, + light_overlay_icon, + light_overlay, + overlay_x = 0, + overlay_y = 0, +) + + if(!isitem(parent)) + return COMPONENT_INCOMPATIBLE + + src.is_light_removable = is_light_removable + src.light_icon_state = light_icon_state + src.light_overlay_icon = light_overlay_icon + src.light_overlay = light_overlay + src.overlay_x = overlay_x + src.overlay_y = overlay_y + + if(istype(starting_light)) + add_light(starting_light) + +/datum/component/seclite_attachable/Destroy(force, silent) + if(light) + remove_light() + return ..() + +// Inheriting component allows lights to be added externally to things which already have a mount. +/datum/component/seclite_attachable/InheritComponent( + datum/component/seclite_attachable/new_component, + original, + obj/item/flashlight/seclite/starting_light, + is_light_removable = TRUE, + light_icon_state, + light_overlay_icon, + light_overlay, + overlay_x, + overlay_y, +) + + if(!original) + return + + src.is_light_removable = is_light_removable + + // For the rest of these arguments, default to what already exists + if(light_icon_state) + src.light_icon_state = light_icon_state + if(light_overlay_icon) + src.light_overlay_icon = light_overlay_icon + if(light_overlay) + src.light_overlay = light_overlay + if(overlay_x) + src.overlay_x = overlay_x + if(overlay_x) + src.overlay_y = overlay_y + + if(istype(starting_light)) + add_light(starting_light) + +/datum/component/seclite_attachable/RegisterWithParent() + RegisterSignal(parent, COMSIG_ATOM_DESTRUCTION, .proc/on_parent_deconstructed) + RegisterSignal(parent, COMSIG_ATOM_EXITED, .proc/on_light_exit) + RegisterSignal(parent, COMSIG_ATOM_TOOL_ACT(TOOL_SCREWDRIVER), .proc/on_screwdriver) + RegisterSignal(parent, COMSIG_ATOM_UPDATE_ICON_STATE, .proc/on_update_icon_state) + RegisterSignal(parent, COMSIG_ATOM_UPDATE_OVERLAYS, .proc/on_update_overlays) + RegisterSignal(parent, COMSIG_ITEM_UI_ACTION_CLICK, .proc/on_action_click) + RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, .proc/on_attackby) + RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/on_examine) + RegisterSignal(parent, COMSIG_PARENT_QDELETING, .proc/on_parent_deleted) + +/datum/component/seclite_attachable/UnregisterFromParent() + UnregisterSignal(parent, list( + COMSIG_ATOM_DESTRUCTION, + COMSIG_ATOM_EXITED, + COMSIG_ATOM_TOOL_ACT(TOOL_SCREWDRIVER), + COMSIG_ATOM_UPDATE_ICON_STATE, + COMSIG_ATOM_UPDATE_OVERLAYS, + COMSIG_ITEM_UI_ACTION_CLICK, + COMSIG_PARENT_ATTACKBY, + COMSIG_PARENT_EXAMINE, + COMSIG_PARENT_QDELETING, + )) + +/// Sets a new light as our current light for our parent. +/datum/component/seclite_attachable/proc/add_light(obj/item/flashlight/new_light, mob/attacher) + if(light) + CRASH("[type] tried to add a new light when it already had one.") + + light = new_light + + light.set_light_flags(light.light_flags | LIGHT_ATTACHED) + // We may already exist within in our parent's contents... But if we don't move it over now + if(light.loc != parent) + light.forceMove(parent) + + // We already have an action for the light for some reason? Clean it up + if(toggle_action_ref?.resolve()) + stack_trace("[type] - add_light had an existing toggle action when add_light was called.") + QDEL_NULL(toggle_action_ref) + + // Make a new toggle light item action for our parent + var/obj/item/item_parent = parent + var/datum/action/item_action/toggle_seclight/toggle_action = item_parent.add_item_action(/datum/action/item_action/toggle_seclight) + toggle_action_ref = WEAKREF(toggle_action) + + update_light() + +/// Removes the current light from our parent. +/datum/component/seclite_attachable/proc/remove_light() + // Our action may be linked to our parent, + // but it's really sourced from our light. Get rid of it. + QDEL_NULL(toggle_action_ref) + + // It is possible the light was removed by being deleted. + if(!QDELETED(light)) + UnregisterSignal(light, COMSIG_PARENT_QDELETING) + light.set_light_flags(light.light_flags & ~LIGHT_ATTACHED) + light.update_brightness() + + light = null + update_light() + +/// Toggles the light within on or off. +/// Returns TRUE if there is a light inside, FALSE otherwise. +/datum/component/seclite_attachable/proc/toggle_light(mob/user) + if(!light) + return FALSE + + light.on = !light.on + light.update_brightness() + if(user) + user.balloon_alert(user, "[light.name] toggled [light.on ? "on":"off"]") + + playsound(light, 'sound/weapons/empty.ogg', 100, TRUE) + update_light() + return TRUE + +/// Called after the a light is added, removed, or toggles. +/// Ensures all of our appearances look correct for the new light state. +/datum/component/seclite_attachable/proc/update_light() + var/obj/item/item_parent = parent + item_parent.update_appearance() + item_parent.update_action_buttons() + +/// Signal proc for [COMSIG_ATOM_EXITED] that handles our light being removed or deleted from our parent. +/datum/component/seclite_attachable/proc/on_light_exit(obj/item/source, atom/movable/gone, direction) + SIGNAL_HANDLER + + if(gone == light) + remove_light() + +/// Signal proc for [COMSIG_ATOM_DESTRUCTION] that drops our light to the ground if our parent is deconstructed. +/datum/component/seclite_attachable/proc/on_parent_deconstructed(obj/item/source, disassembled) + SIGNAL_HANDLER + + light.forceMove(source.drop_location()) + +/// Signal proc for [COMSIG_PARENT_QDELETING] that deletes our light if our parent is deleted. +/datum/component/seclite_attachable/proc/on_parent_deleted(obj/item/source) + SIGNAL_HANDLER + + QDEL_NULL(light) + +/// Signal proc for [COMSIG_ITEM_UI_ACTION_CLICK] that toggles our light on and off if our action button is clicked. +/datum/component/seclite_attachable/proc/on_action_click(obj/item/source, mob/user, datum/action) + SIGNAL_HANDLER + + // This isn't OUR action specifically, we don't care. + if(!IS_WEAKREF_OF(action, toggle_action_ref)) + return + + // Toggle light fails = no light attached = shouldn't be possible + if(!toggle_light(user)) + CRASH("[type] - on_action_click somehow both HAD AN ACTION and also HAD A TRIGGERABLE ACTION, without having an attached light.") + + return COMPONENT_ACTION_HANDLED + +/// Signal proc for [COMSIG_PARENT_ATTACKBY] that allows a user to attach a seclite by hitting our parent with it. +/datum/component/seclite_attachable/proc/on_attackby(obj/item/source, obj/item/attacking_item, mob/attacker, params) + SIGNAL_HANDLER + + if(!is_type_in_typecache(attacking_item, valid_lights)) + return + + if(light) + source.balloon_alert(attacker, "already has \a [light]!") + return + + if(!attacker.transferItemToLoc(attacking_item, source)) + return + + add_light(attacking_item, attacker) + source.balloon_alert(attacker, "attached [attacking_item]") + return COMPONENT_NO_AFTERATTACK + +/// Signal proc for [COMSIG_ATOM_TOOL_ACT] via [TOOL_SCREWDRIVER] that removes any attached seclite. +/datum/component/seclite_attachable/proc/on_screwdriver(obj/item/source, mob/user, obj/item/tool) + SIGNAL_HANDLER + + if(!light || !is_light_removable) + return + + INVOKE_ASYNC(src, .proc/unscrew_light, source, user, tool) + return COMPONENT_BLOCK_TOOL_ATTACK + +/// Invoked asyncronously from [proc/on_screwdriver]. Handles removing the light from our parent. +/datum/component/seclite_attachable/proc/unscrew_light(obj/item/source, mob/user, obj/item/tool) + tool?.play_tool_sound(source) + source.balloon_alert(user, "unscrewed [light]") + + var/obj/item/flashlight/seclite/to_remove = light + + // The forcemove here will call exited on the light, and automatically update our references / etc + to_remove.forceMove(source.drop_location()) + if(source.Adjacent(user) && !issilicon(user)) + user.put_in_hands(to_remove) + +/// Signal proc for [COMSIG_PARENT_EXAMINE] that shows our item can have / does have a seclite attached. +/datum/component/seclite_attachable/proc/on_examine(obj/item/source, mob/examiner, list/examine_list) + SIGNAL_HANDLER + + if(light) + examine_list += "It has \a [light] [is_light_removable ? "mounted on it with a few screws" : "permanently mounted on it"]." + else + examine_list += "It has a mounting point for a seclite." + +/// Signal proc for [COMSIG_ATOM_UPDATE_OVERLAYS] that updates our parent with our seclite overlays, if we have some. +/datum/component/seclite_attachable/proc/on_update_overlays(obj/item/source, list/overlays) + SIGNAL_HANDLER + + // No overlays to add, no reason to run + if(!light_overlay || !light_overlay_icon) + return + // No light, nothing to add + if(!light) + return + + var/overlay_state = "[light_overlay][light.on ? "_on":""]" + var/mutable_appearance/flashlight_overlay = mutable_appearance(light_overlay_icon, overlay_state) + flashlight_overlay.pixel_x = overlay_x + flashlight_overlay.pixel_y = overlay_y + overlays += flashlight_overlay + +/// Signal proc for [COMSIG_ATOM_UPDATE_ICON_STATE] that updates our parent's icon state, if we have one. +/datum/component/seclite_attachable/proc/on_update_icon_state(obj/item/source) + SIGNAL_HANDLER + + // No icon state to set, no reason to run + if(!light_icon_state) + return + + // Get the "base icon state" to work on + var/base_state = source.base_icon_state || initial(source.icon_state) + // Updates our icon state based on our light state. + if(light) + source.icon_state = "[base_state]-[light_icon_state][light.on ? "-on":""]" + + // Reset their icon state when if we've got no light. + else if(source.icon_state != base_state) + // Yes, this might mess with other icon state alterations, + // but that's the downside of using icon states over overlays. + source.icon_state = base_state diff --git a/code/datums/components/slippery.dm b/code/datums/components/slippery.dm index 9301d558f146f1..c201ee9c6737e6 100644 --- a/code/datums/components/slippery.dm +++ b/code/datums/components/slippery.dm @@ -76,7 +76,7 @@ if(!isliving(arrived)) return var/mob/living/victim = arrived - if(!(victim.movement_type & FLYING) && victim.slip(knockdown_time, parent, lube_flags, paralyze_time, force_drop_items) && callback) + if(!(victim.movement_type & (FLYING | FLOATING)) && victim.slip(knockdown_time, parent, lube_flags, paralyze_time, force_drop_items) && callback) callback.Invoke(victim) /* diff --git a/code/datums/components/stationloving.dm b/code/datums/components/stationloving.dm index c0a4c306268970..b684ad913a3476 100644 --- a/code/datums/components/stationloving.dm +++ b/code/datums/components/stationloving.dm @@ -63,13 +63,13 @@ return COMPONENT_MOVABLE_BLOCK_PRE_MOVE -/datum/component/stationloving/proc/check_soul_imbue() +/datum/component/stationloving/proc/check_soul_imbue(datum/source) SIGNAL_HANDLER if(disallow_soul_imbue) return COMPONENT_BLOCK_IMBUE -/datum/component/stationloving/proc/check_mark_retrieval() +/datum/component/stationloving/proc/check_mark_retrieval(datum/source) SIGNAL_HANDLER return COMPONENT_BLOCK_MARK_RETRIEVAL diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm index de4eb6fb6d7d24..37dc4b0de7c973 100644 --- a/code/datums/components/storage/storage.dm +++ b/code/datums/components/storage/storage.dm @@ -4,47 +4,68 @@ /datum/component/storage dupe_mode = COMPONENT_DUPE_UNIQUE - var/datum/component/storage/concrete/master //If not null, all actions act on master and this is just an access point. - - var/list/can_hold //if this is set, only items, and their children, will fit - var/list/cant_hold //if this is set, items, and their children, won't fit - var/list/exception_hold //if set, these items will be the exception to the max size of object that can fit. + ///If not null, all actions act on master and this is just an access point. + var/datum/component/storage/concrete/master + + ///if this is set, only items, and their children, will fit + var/list/can_hold + ///if this is set, items, and their children, won't fit + var/list/cant_hold + ///if set, these items will be the exception to the max size of object that can fit. + var/list/exception_hold /// If set can only contain stuff with this single trait present. var/list/can_hold_trait var/can_hold_description - var/list/mob/is_using //lazy list of mobs looking at the contents of this storage. + ///lazy list of mobs looking at the contents of this storage. + var/list/mob/is_using - var/locked = FALSE //when locked nothing can see inside or use it. + ///when locked nothing can see inside or use it. + var/locked = FALSE - var/max_w_class = WEIGHT_CLASS_SMALL //max size of objects that will fit. - var/max_combined_w_class = 14 //max combined sizes of objects that will fit. - var/max_items = 7 //max number of objects that will fit. + ///max size of objects that will fit. + var/max_w_class = WEIGHT_CLASS_SMALL + ///max combined sizes of objects that will fit. + var/max_combined_w_class = 14 + ///max number of objects that will fit. + var/max_items = 7 var/emp_shielded = FALSE - var/silent = FALSE //whether this makes a message when things are put in. - var/click_gather = FALSE //whether this can be clicked on items to pick it up rather than the other way around. - var/rustle_sound = TRUE //play rustle sound on interact. - var/allow_quick_empty = FALSE //allow empty verb which allows dumping on the floor of everything inside quickly. - var/allow_quick_gather = FALSE //allow toggle mob verb which toggles collecting all items from a tile. + ///whether this makes a message when things are put in. + var/silent = FALSE + ///whether this can be clicked on items to pick it up rather than the other way around. + var/click_gather = FALSE + ///play rustle sound on interact. + var/rustle_sound = TRUE + ///allow empty verb which allows dumping on the floor of everything inside quickly. + var/allow_quick_empty = FALSE + ///allow toggle mob verb which toggles collecting all items from a tile. + var/allow_quick_gather = FALSE var/collection_mode = COLLECT_EVERYTHING - var/insert_preposition = "in" //you put things "in" a bag, but "on" a tray. + ///you put things "in" a bag, but "on" a tray. + var/insert_preposition = "in" - var/display_numerical_stacking = FALSE //stack things of the same type and show as a single object with a number. + ///stack things of the same type and show as a single object with a number. + var/display_numerical_stacking = FALSE - var/atom/movable/screen/storage/boxes //storage display object - var/atom/movable/screen/close/closer //close button object + ///storage display object + var/atom/movable/screen/storage/boxes + ///close button object + var/atom/movable/screen/close/closer - var/allow_big_nesting = FALSE //allow storage objects of the same or greater size. + ///allow storage objects of the same or greater size. + var/allow_big_nesting = FALSE - var/attack_hand_interact = TRUE //interact on attack hand. - var/quickdraw = FALSE //altclick interact + ///interact on attack hand. + var/attack_hand_interact = TRUE + ///altclick interact + var/quickdraw = FALSE - var/datum/action/item_action/storage_gather_mode/modeswitch_action + var/datum/weakref/modeswitch_action_ref //Screen variables: Do not mess with these vars unless you know what you're doing. They're not defines so storage that isn't in the same location can be supported in the future. var/screen_max_columns = 7 //These two determine maximum screen sizes. @@ -155,17 +176,18 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) /datum/component/storage/proc/update_actions() SIGNAL_HANDLER - QDEL_NULL(modeswitch_action) if(!isitem(parent) || !allow_quick_gather) + QDEL_NULL(modeswitch_action_ref) + return + + var/datum/action/existing = modeswitch_action_ref?.resolve() + if(!QDELETED(existing)) return - var/obj/item/I = parent - modeswitch_action = new(I) + + var/obj/item/item_parent = parent + var/datum/action/modeswitch_action = item_parent.add_item_action(/datum/action/item_action/storage_gather_mode) RegisterSignal(modeswitch_action, COMSIG_ACTION_TRIGGER, .proc/action_trigger) - if(I.item_flags & IN_INVENTORY) - var/mob/M = I.loc - if(!istype(M)) - return - modeswitch_action.Grant(M) + modeswitch_action_ref = WEAKREF(modeswitch_action) /datum/component/storage/proc/change_master(datum/component/storage/concrete/new_master) if(new_master == src || (!isnull(new_master) && !istype(new_master))) @@ -420,6 +442,9 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) M.client.screen |= closer M.client.screen |= real_location.contents M.set_active_storage(src) + if(ismovable(real_location)) + var/atom/movable/movable_loc = real_location + movable_loc.become_active_storage(src) LAZYOR(is_using, M) RegisterSignal(M, COMSIG_PARENT_QDELETING, .proc/mob_deleted) return TRUE @@ -437,6 +462,10 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) if(!M.client) return TRUE var/atom/real_location = real_location() + if(!length(is_using) && ismovable(real_location)) + var/atom/movable/movable_loc = real_location + movable_loc.lose_active_storage(src) + M.client.screen -= boxes M.client.screen -= closer M.client.screen -= real_location.contents diff --git a/code/datums/components/wet_floor.dm b/code/datums/components/wet_floor.dm index 594ab849e039fc..7b84f1dabb77da 100644 --- a/code/datums/components/wet_floor.dm +++ b/code/datums/components/wet_floor.dm @@ -127,8 +127,7 @@ decrease = max(0, decrease) if((is_wet() & TURF_WET_ICE) && t > T0C) //Ice melts into water! for(var/obj/O in T.contents) - if(O.obj_flags & FROZEN) - O.make_unfrozen() + O.make_unfrozen() add_wet(TURF_WET_WATER, max_time_left()) dry(null, TURF_WET_ICE) dry(null, ALL, FALSE, decrease) diff --git a/code/datums/diseases/_MobProcs.dm b/code/datums/diseases/_MobProcs.dm index 024f1ee94f2c1d..795af490991b71 100644 --- a/code/datums/diseases/_MobProcs.dm +++ b/code/datums/diseases/_MobProcs.dm @@ -64,6 +64,9 @@ if(ishuman(src)) var/mob/living/carbon/human/infecting_human = src + if(infecting_human.reagents.has_reagent(/datum/reagent/medicine/spaceacillin) && prob(75)) + return + switch(target_zone) if(BODY_ZONE_HEAD) if(isobj(infecting_human.head)) @@ -92,6 +95,11 @@ disease.try_infect(src) /mob/living/proc/AirborneContractDisease(datum/disease/disease, force_spread) + if(ishuman(src)) + var/mob/living/carbon/human/infecting_human = src + if(infecting_human.reagents.has_reagent(/datum/reagent/medicine/spaceacillin) && prob(75)) + return + if(((disease.spread_flags & DISEASE_SPREAD_AIRBORNE) || force_spread) && prob((50*disease.spreading_modifier) - 1)) ForceContractDisease(disease) diff --git a/code/datums/diseases/_disease.dm b/code/datums/diseases/_disease.dm index f85b0a4ca89e99..d420d838b85aad 100644 --- a/code/datums/diseases/_disease.dm +++ b/code/datums/diseases/_disease.dm @@ -64,6 +64,8 @@ ///Proc to process the disease and decide on whether to advance, cure or make the sympthoms appear. Returns a boolean on whether to continue acting on the symptoms or not. /datum/disease/proc/stage_act(delta_time, times_fired) + var/slowdown = affected_mob.reagents.has_reagent(/datum/reagent/medicine/spaceacillin) ? 0.5 : 1 // spaceacillin slows stage speed by 50% + if(has_cure()) if(DT_PROB(cure_chance, delta_time)) update_stage(max(stage - 1, 1)) @@ -71,8 +73,7 @@ if(disease_flags & CURABLE && DT_PROB(cure_chance, delta_time)) cure() return FALSE - - else if(DT_PROB(stage_prob, delta_time)) + else if(DT_PROB(stage_prob*slowdown, delta_time)) update_stage(min(stage + 1, max_stages)) return !carrier diff --git a/code/datums/diseases/advance/symptoms/confusion.dm b/code/datums/diseases/advance/symptoms/confusion.dm index 3e842ce2a0a0a9..2dd9ed57f0e76c 100644 --- a/code/datums/diseases/advance/symptoms/confusion.dm +++ b/code/datums/diseases/advance/symptoms/confusion.dm @@ -18,42 +18,55 @@ base_message_chance = 25 symptom_delay_min = 10 symptom_delay_max = 30 - var/brain_damage = FALSE threshold_descs = list( + "Stage Speed 6" = "Prevents any form of reading or writing.", "Resistance 6" = "Causes brain damage over time.", "Transmission 6" = "Increases confusion duration and strength.", "Stealth 4" = "The symptom remains hidden until active.", ) + var/brain_damage = FALSE + var/causes_illiteracy = FALSE -/datum/symptom/confusion/Start(datum/disease/advance/A) +/datum/symptom/confusion/Start(datum/disease/advance/advanced_disease) . = ..() if(!.) return - if(A.totalResistance() >= 6) + if(advanced_disease.totalStageSpeed() >= 6) + causes_illiteracy = TRUE + if(advanced_disease.totalResistance() >= 6) brain_damage = TRUE - if(A.totalTransmittable() >= 6) + if(advanced_disease.totalTransmittable() >= 6) power = 1.5 - if(A.totalStealth() >= 4) + if(advanced_disease.totalStealth() >= 4) suppress_warning = TRUE -/datum/symptom/confusion/End(datum/disease/advance/A) - A.affected_mob.remove_status_effect(/datum/status_effect/confusion) +/datum/symptom/confusion/End(datum/disease/advance/advanced_disease) + advanced_disease.affected_mob.remove_status_effect(/datum/status_effect/confusion) + REMOVE_TRAIT(advanced_disease.affected_mob, TRAIT_ILLITERATE, DISEASE_TRAIT) return ..() -/datum/symptom/confusion/Activate(datum/disease/advance/A) +/datum/symptom/confusion/Activate(datum/disease/advance/advanced_disease) . = ..() if(!.) return - var/mob/living/carbon/M = A.affected_mob - switch(A.stage) + var/mob/living/carbon/infected_mob = advanced_disease.affected_mob + switch(advanced_disease.stage) if(1, 2, 3, 4) if(prob(base_message_chance) && !suppress_warning) - to_chat(M, span_warning("[pick("Your head hurts.", "Your mind blanks for a moment.")]")) + to_chat(infected_mob, span_warning("[pick("Your head hurts.", "Your mind blanks for a moment.")]")) else - to_chat(M, span_userdanger("You can't think straight!")) - M.adjust_timed_status_effect(16 SECONDS * power, /datum/status_effect/confusion) + to_chat(infected_mob, span_userdanger("You can't think straight!")) + infected_mob.adjust_timed_status_effect(16 SECONDS * power, /datum/status_effect/confusion) if(brain_damage) - M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3 * power, 80) - M.updatehealth() - + infected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3 * power, 80) + infected_mob.updatehealth() return + +/datum/symptom/confusion/on_stage_change(datum/disease/advance/advanced_disease) + . = ..() + if(!.) + return FALSE + var/mob/living/carbon/infected_mob = advanced_disease.affected_mob + if(advanced_disease.stage >= 4 && causes_illiteracy) + ADD_TRAIT(infected_mob, TRAIT_ILLITERATE, DISEASE_TRAIT) + return TRUE diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm index cfa0afad345dbd..82d758794985b0 100644 --- a/code/datums/diseases/transformation.dm +++ b/code/datums/diseases/transformation.dm @@ -227,7 +227,7 @@ stage3 = list("Your appendages are melting away.", "Your limbs begin to lose their shape.") stage4 = list("You are turning into a slime.") stage5 = list("You have become a slime.") - new_form = /mob/living/simple_animal/slime/random + new_form = /mob/living/simple_animal/slime /datum/disease/transformation/slime/stage_act(delta_time, times_fired) @@ -237,15 +237,22 @@ switch(stage) if(1) - if(ishuman(affected_mob) && affected_mob.dna) - if(affected_mob.dna.species.id == SPECIES_SLIMEPERSON || affected_mob.dna.species.id == SPECIES_STARGAZER || affected_mob.dna.species.id == SPECIES_LUMINESCENT) + if(ishuman(affected_mob)) + var/mob/living/carbon/human/human = affected_mob + if(isjellyperson(human)) stage = 5 if(3) if(ishuman(affected_mob)) var/mob/living/carbon/human/human = affected_mob - if(human.dna.species.id != SPECIES_SLIMEPERSON && affected_mob.dna.species.id != SPECIES_STARGAZER && affected_mob.dna.species.id != SPECIES_LUMINESCENT) + if(!ismonkey(human) && !isjellyperson(human)) human.set_species(/datum/species/jelly/slime) +/datum/disease/transformation/slime/do_disease_transformation(mob/living/affected_mob) + if(affected_mob.client && ishuman(affected_mob)) // if they are a human who's not a monkey and are sentient, then let them have the old fun + var/mob/living/carbon/human/human = affected_mob + if(!ismonkey(human)) + new_form = /mob/living/simple_animal/slime/random + return ..() /datum/disease/transformation/corgi name = "The Barkening" diff --git a/code/datums/elements/_element.dm b/code/datums/elements/_element.dm index 30bd98a3268109..204a2742011e9d 100644 --- a/code/datums/elements/_element.dm +++ b/code/datums/elements/_element.dm @@ -32,9 +32,9 @@ /// Deactivates the functionality defines by the element on the given datum /datum/element/proc/Detach(datum/source, ...) SIGNAL_HANDLER + SHOULD_CALL_PARENT(TRUE) SEND_SIGNAL(source, COMSIG_ELEMENT_DETACH, src) - SHOULD_CALL_PARENT(TRUE) UnregisterSignal(source, COMSIG_PARENT_QDELETING) /datum/element/Destroy(force) diff --git a/code/datums/elements/atmos_sensitive.dm b/code/datums/elements/atmos_sensitive.dm index ca676327e26b96..c7dd4cf2f7a872 100644 --- a/code/datums/elements/atmos_sensitive.dm +++ b/code/datums/elements/atmos_sensitive.dm @@ -22,6 +22,7 @@ /datum/element/atmos_sensitive/Detach(datum/source) var/atom/us = source us.RemoveElement(/datum/element/connect_loc, pass_on) + UnregisterSignal(source, COMSIG_MOVABLE_MOVED) if(us.flags_1 & ATMOS_IS_PROCESSING_1) us.atmos_end() SSair.atom_process -= us diff --git a/code/datums/elements/blood_walk.dm b/code/datums/elements/blood_walk.dm deleted file mode 100644 index 2b37bea1625282..00000000000000 --- a/code/datums/elements/blood_walk.dm +++ /dev/null @@ -1,56 +0,0 @@ -///Blood walk, a bespoke element that causes you to make blood wherever you walk. -/datum/element/blood_walk - element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH - id_arg_index = 2 - - ///A unique blood type we might want to spread - var/blood_type - ///The sound that plays when we spread blood. - var/sound_played - ///How loud will the sound be, if there is one. - var/sound_volume - ///The chance of spawning blood whenever walking - var/blood_spawn_chance - ///Should the decal face the direction of the target - var/target_dir_change - - -/datum/element/blood_walk/Attach( - datum/target, - blood_type = /obj/effect/decal/cleanable/blood, - sound_played, - sound_volume = 80, - blood_spawn_chance = 100, - target_dir_change = FALSE -) - . = ..() - if(!ismovable(target)) - return ELEMENT_INCOMPATIBLE - - src.blood_type = blood_type - src.sound_played = sound_played - src.sound_volume = sound_volume - src.blood_spawn_chance = blood_spawn_chance - src.target_dir_change = target_dir_change - RegisterSignal(target, COMSIG_MOVABLE_MOVED, .proc/spread_blood) - -/datum/element/blood_walk/Detach(datum/target) - . = ..() - UnregisterSignal(target, COMSIG_MOVABLE_MOVED) - -///Spawns blood (if possible) under the source, and plays a sound effect (if any) -/datum/element/blood_walk/proc/spread_blood(datum/source) - SIGNAL_HANDLER - - var/atom/movable/movable_source = source - var/turf/current_turf = movable_source.loc - if(!isturf(current_turf)) - return - if(!prob(blood_spawn_chance)) - return - - var/obj/effect/decal/blood = new blood_type(current_turf) - if (target_dir_change) - blood.setDir(movable_source.dir) - if(!isnull(sound_played)) - playsound(movable_source, sound_played, sound_volume, TRUE, 2, TRUE) diff --git a/code/datums/elements/chewable.dm b/code/datums/elements/chewable.dm index 91e9a0ddac922b..a5e10e26d8d59f 100644 --- a/code/datums/elements/chewable.dm +++ b/code/datums/elements/chewable.dm @@ -30,6 +30,7 @@ RegisterSignal(target, COMSIG_ITEM_EQUIPPED, .proc/on_equipped) /datum/element/chewable/Detach(datum/source, force) + . = ..() processing -= source UnregisterSignal(source, list(COMSIG_ITEM_DROPPED, COMSIG_ITEM_EQUIPPED)) diff --git a/code/datums/elements/diggable.dm b/code/datums/elements/diggable.dm new file mode 100644 index 00000000000000..e57b24fd250922 --- /dev/null +++ b/code/datums/elements/diggable.dm @@ -0,0 +1,46 @@ +/// Lets you make hitting a turf with a shovel pop something out, and scrape the turf +/datum/element/diggable + element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH + id_arg_index = 2 + /// Typepath of what we spawn on shovel + var/atom/to_spawn + /// Amount to spawn on shovel + var/amount + /// What should we tell the user they did? (Eg: "You dig up the turf.") + var/action_text + /// What should we tell other people what the user did? (Eg: "Guy digs up the turf.") + var/action_text_third_person + +/datum/element/diggable/Attach(datum/target, to_spawn, amount = 1, action_text = "dig up", action_text_third_person = "digs up") + . = ..() + if(!isturf(target)) + return ELEMENT_INCOMPATIBLE + if(!to_spawn) + stack_trace("[type] wasn't passed a typepath to spawn attaching to [target].") + return ELEMENT_INCOMPATIBLE + + src.to_spawn = to_spawn + src.amount = amount + src.action_text = action_text + src.action_text_third_person = action_text_third_person + + RegisterSignal(target, COMSIG_ATOM_TOOL_ACT(TOOL_SHOVEL), .proc/on_shovel) + +/datum/element/diggable/Detach(datum/source, ...) + . = ..() + UnregisterSignal(source, COMSIG_ATOM_TOOL_ACT(TOOL_SHOVEL)) + +/// Signal proc for [COMSIG_ATOM_TOOL_ACT] via [TOOL_SHOVEL]. +/datum/element/diggable/proc/on_shovel(turf/source, mob/user, obj/item/tool) + SIGNAL_HANDLER + + for(var/i in 1 to amount) + new to_spawn(source) + + user.visible_message( + span_notice("[user] [action_text_third_person] [source]."), + span_notice("You [action_text] [source]."), + ) + + playsound(source, 'sound/effects/shovel_dig.ogg', 50, TRUE) + source.ScrapeAway(flags = CHANGETURF_INHERIT_AIR) diff --git a/code/datums/elements/food/processable.dm b/code/datums/elements/food/processable.dm index 6a9d98ced3c0e4..7ac0539b36c336 100644 --- a/code/datums/elements/food/processable.dm +++ b/code/datums/elements/food/processable.dm @@ -13,7 +13,7 @@ ///Whether or not the atom being processed has to be on a table or tray to process it var/table_required -/datum/element/processable/Attach(datum/target, tool_behaviour, result_atom_type, amount_created = 3, time_to_process = 20, table_required = FALSE) +/datum/element/processable/Attach(datum/target, tool_behaviour, result_atom_type, amount_created = 3, time_to_process = 2 SECONDS, table_required = FALSE) . = ..() if(!isatom(target)) return ELEMENT_INCOMPATIBLE diff --git a/code/datums/elements/footstep.dm b/code/datums/elements/footstep.dm index a529025c967e6c..b9a1ef5df204f0 100644 --- a/code/datums/elements/footstep.dm +++ b/code/datums/elements/footstep.dm @@ -87,7 +87,7 @@ if(steps % 2) return - if(steps != 0 && !source.has_gravity(turf)) // don't need to step as often when you hop around + if(steps != 0 && !source.has_gravity()) // don't need to step as often when you hop around return return turf @@ -117,10 +117,10 @@ return playsound(source_loc, pick(footstep_sounds[turf_footstep][1]), footstep_sounds[turf_footstep][2] * volume, TRUE, footstep_sounds[turf_footstep][3] + e_range, falloff_distance = 1, vary = sound_vary) -/datum/element/footstep/proc/play_humanstep(mob/living/carbon/human/source, atom/oldloc, direction) +/datum/element/footstep/proc/play_humanstep(mob/living/carbon/human/source, atom/oldloc, direction, forced, list/old_locs, momentum_change) SIGNAL_HANDLER - if (SHOULD_DISABLE_FOOTSTEPS(source)) + if (SHOULD_DISABLE_FOOTSTEPS(source) || !momentum_change) return var/volume_multiplier = 1 @@ -134,21 +134,31 @@ if(!source_loc) return - play_fov_effect(source, 5, "footstep", direction, ignore_self = TRUE) + //cache for sanic speed (lists are references anyways) + var/static/list/footstep_sounds = GLOB.footstep + ///list returned by playsound() filled by client mobs who heard the footstep. given to play_fov_effect() + var/list/heard_clients + if ((source.wear_suit?.body_parts_covered | source.w_uniform?.body_parts_covered | source.shoes?.body_parts_covered) & FEET) // we are wearing shoes - playsound(source_loc, pick(GLOB.footstep[source_loc.footstep][1]), - GLOB.footstep[source_loc.footstep][2] * volume * volume_multiplier, + + heard_clients = playsound(source_loc, pick(footstep_sounds[source_loc.footstep][1]), + footstep_sounds[source_loc.footstep][2] * volume * volume_multiplier, TRUE, - GLOB.footstep[source_loc.footstep][3] + e_range + range_adjustment, falloff_distance = 1, vary = sound_vary) + footstep_sounds[source_loc.footstep][3] + e_range + range_adjustment, falloff_distance = 1, vary = sound_vary) else if(source.dna.species.special_step_sounds) - playsound(source_loc, pick(source.dna.species.special_step_sounds), 50, TRUE, falloff_distance = 1, vary = sound_vary) + heard_clients = playsound(source_loc, pick(source.dna.species.special_step_sounds), 50, TRUE, falloff_distance = 1, vary = sound_vary) else - playsound(source_loc, pick(GLOB.barefootstep[source_loc.barefootstep][1]), - GLOB.barefootstep[source_loc.barefootstep][2] * volume * volume_multiplier, + var/static/list/bare_footstep_sounds = GLOB.barefootstep + + heard_clients = playsound(source_loc, pick(bare_footstep_sounds[source_loc.barefootstep][1]), + bare_footstep_sounds[source_loc.barefootstep][2] * volume * volume_multiplier, TRUE, - GLOB.barefootstep[source_loc.barefootstep][3] + e_range + range_adjustment, falloff_distance = 1, vary = sound_vary) + bare_footstep_sounds[source_loc.barefootstep][3] + e_range + range_adjustment, falloff_distance = 1, vary = sound_vary) + + if(heard_clients) + play_fov_effect(source, 5, "footstep", direction, ignore_self = TRUE, override_list = heard_clients) ///Prepares a footstep for machine walking diff --git a/code/datums/elements/forced_gravity.dm b/code/datums/elements/forced_gravity.dm index ada16943b86a61..96889194f2d9fe 100644 --- a/code/datums/elements/forced_gravity.dm +++ b/code/datums/elements/forced_gravity.dm @@ -1,16 +1,18 @@ /datum/element/forced_gravity element_flags = ELEMENT_BESPOKE id_arg_index = 2 + ///the level of gravity we force unto our target var/gravity - var/ignore_space + ///whether we will override the turf if it forces no gravity + var/ignore_turf_gravity -/datum/element/forced_gravity/Attach(datum/target, gravity=1, ignore_space=FALSE) +/datum/element/forced_gravity/Attach(datum/target, gravity=1, ignore_turf_gravity = FALSE) . = ..() if(!isatom(target)) return ELEMENT_INCOMPATIBLE src.gravity = gravity - src.ignore_space = ignore_space + src.ignore_turf_gravity = ignore_turf_gravity RegisterSignal(target, COMSIG_ATOM_HAS_GRAVITY, .proc/gravity_check) if(isturf(target)) @@ -24,10 +26,12 @@ /datum/element/forced_gravity/proc/gravity_check(datum/source, turf/location, list/gravs) SIGNAL_HANDLER - if(!ignore_space && isspaceturf(location)) - return + if(!ignore_turf_gravity && location.force_no_gravity) + return FALSE gravs += gravity + return TRUE + /datum/element/forced_gravity/proc/turf_gravity_check(datum/source, atom/checker, list/gravs) SIGNAL_HANDLER diff --git a/code/datums/elements/frozen.dm b/code/datums/elements/frozen.dm new file mode 100644 index 00000000000000..c4393a960ebcee --- /dev/null +++ b/code/datums/elements/frozen.dm @@ -0,0 +1,52 @@ +///simple element to handle frozen obj's +/datum/element/frozen + element_flags = ELEMENT_DETACH + +/datum/element/frozen/Attach(datum/target) + . = ..() + if(!isobj(target)) + return ELEMENT_INCOMPATIBLE + + var/obj/target_obj = target + if(target_obj.obj_flags & FREEZE_PROOF) + return ELEMENT_INCOMPATIBLE + + if(HAS_TRAIT(target_obj, TRAIT_FROZEN)) + return ELEMENT_INCOMPATIBLE + + ADD_TRAIT(target_obj, TRAIT_FROZEN, ELEMENT_TRAIT(type)) + target_obj.name = "frozen [target_obj.name]" + target_obj.add_atom_colour(GLOB.freon_color_matrix, TEMPORARY_COLOUR_PRIORITY) + target_obj.alpha -= 25 + + RegisterSignal(target, COMSIG_MOVABLE_MOVED, .proc/on_moved) + RegisterSignal(target, COMSIG_MOVABLE_POST_THROW, .proc/shatter_on_throw) + RegisterSignal(target, COMSIG_OBJ_UNFREEZE, .proc/on_unfrozen) + +/datum/element/frozen/Detach(datum/source, ...) + var/obj/obj_source = source + REMOVE_TRAIT(obj_source, TRAIT_FROZEN, ELEMENT_TRAIT(type)) + obj_source.name = replacetext(obj_source.name, "frozen ", "") + obj_source.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, GLOB.freon_color_matrix) + obj_source.alpha += 25 + . = ..() + +/datum/element/frozen/proc/on_unfrozen(datum/source) + SIGNAL_HANDLER + Detach(source) + +/datum/element/frozen/proc/shatter_on_throw(datum/target) + SIGNAL_HANDLER + var/obj/obj_target = target + obj_target.visible_message(span_danger("[obj_target] shatters into a million pieces!")) + qdel(obj_target) + +/datum/element/frozen/proc/on_moved(datum/target) + SIGNAL_HANDLER + var/obj/obj_target = target + if(!isopenturf(obj_target.loc)) + return + + var/turf/open/turf_loc = obj_target.loc + if(turf_loc.air?.temperature >= T0C)//unfreezes target + Detach(target) diff --git a/code/datums/elements/lazy_fishing_spot.dm b/code/datums/elements/lazy_fishing_spot.dm new file mode 100644 index 00000000000000..603cd56e22fb43 --- /dev/null +++ b/code/datums/elements/lazy_fishing_spot.dm @@ -0,0 +1,25 @@ +// Lazy fishing spot element so fisheable turfs do not have a component each since they're usually pretty common on their respective maps (lava/water/etc) +/datum/element/lazy_fishing_spot + element_flags = ELEMENT_BESPOKE | ELEMENT_DETACH + id_arg_index = 2 + var/configuration + +/datum/element/lazy_fishing_spot/Attach(datum/target, configuration) + . = ..() + if(!isatom(target)) + return ELEMENT_INCOMPATIBLE + if(!configuration) + CRASH("Lazy fishing spot had no configuration passed in.") + src.configuration = configuration + + RegisterSignal(target, COMSIG_PRE_FISHING, .proc/create_fishing_spot) + +/datum/element/lazy_fishing_spot/Detach(datum/target) + UnregisterSignal(target, COMSIG_PRE_FISHING) + return ..() + +/datum/element/lazy_fishing_spot/proc/create_fishing_spot(datum/source) + SIGNAL_HANDLER + + source.AddComponent(/datum/component/fishing_spot, configuration) + Detach(source) diff --git a/code/datums/elements/light_eater.dm b/code/datums/elements/light_eater.dm index 026258122a7bdc..0eb59bbc850f21 100644 --- a/code/datums/elements/light_eater.dm +++ b/code/datums/elements/light_eater.dm @@ -67,8 +67,7 @@ /datum/element/light_eater/proc/table_buffet(atom/commisary, datum/devourer) . = list() SEND_SIGNAL(commisary, COMSIG_LIGHT_EATER_QUEUE, ., devourer) - for(var/nom in commisary.light_sources) - var/datum/light_source/morsel = nom + for(var/datum/light_source/morsel as anything in commisary.light_sources) .[morsel.source_atom] = TRUE /** diff --git a/code/datums/elements/obj_regen.dm b/code/datums/elements/obj_regen.dm index ef55457c28c6a4..4830d420043ecb 100644 --- a/code/datums/elements/obj_regen.dm +++ b/code/datums/elements/obj_regen.dm @@ -28,6 +28,7 @@ processing |= target /datum/element/obj_regen/Detach(obj/target) + . = ..() UnregisterSignal(target, COMSIG_ATOM_TAKE_DAMAGE) processing -= target if(!length(processing)) diff --git a/code/datums/elements/plant_backfire.dm b/code/datums/elements/plant_backfire.dm index f753947e9ea346..b9a2000ffe487a 100644 --- a/code/datums/elements/plant_backfire.dm +++ b/code/datums/elements/plant_backfire.dm @@ -3,7 +3,7 @@ /// If a user is protected with something like leather gloves, they can handle them normally. /// If they're not protected properly, we invoke a callback on the user, harming or inconveniencing them. /datum/element/plant_backfire - element_flags = ELEMENT_BESPOKE | ELEMENT_DETACH + element_flags = ELEMENT_BESPOKE id_arg_index = 2 /// Whether we stop the current action if backfire is triggered (EX: returning CANCEL_ATTACK_CHAIN) var/cancel_action = FALSE @@ -29,52 +29,67 @@ . = ..() UnregisterSignal(target, list(COMSIG_ITEM_PRE_ATTACK, COMSIG_ITEM_PICKUP, COMSIG_MOVABLE_PRE_THROW)) -/* +/** * Checks before we attack if we're okay to continue. * * source - our plant * user - the mob wielding our [source] */ -/datum/element/plant_backfire/proc/attack_safety_check(datum/source, atom/target, mob/user) +/datum/element/plant_backfire/proc/attack_safety_check(obj/item/source, atom/target, mob/user) SIGNAL_HANDLER - if(plant_safety_check(source, user)) + // Covers stuff like tk, since we aren't actually touching the plant. + if(!user.is_holding(source)) return - - SEND_SIGNAL(source, COMSIG_PLANT_ON_BACKFIRE, user) - if(cancel_action) - return COMPONENT_CANCEL_ATTACK_CHAIN + if(!backfire(source, user)) + return + + return cancel_action ? COMPONENT_CANCEL_ATTACK_CHAIN : NONE -/* +/** * Checks before we pick up the plant if we're okay to continue. * * source - our plant * user - the mob picking our [source] */ -/datum/element/plant_backfire/proc/pickup_safety_check(datum/source, mob/user) +/datum/element/plant_backfire/proc/pickup_safety_check(obj/item/source, mob/user) SIGNAL_HANDLER - if(plant_safety_check(source, user)) - return - SEND_SIGNAL(source, COMSIG_PLANT_ON_BACKFIRE, user) + backfire(source, user) -/* +/** * Checks before we throw the plant if we're okay to continue. * * source - our plant * thrower - the mob throwing our [source] */ -/datum/element/plant_backfire/proc/throw_safety_check(datum/source, list/arguments) +/datum/element/plant_backfire/proc/throw_safety_check(obj/item/source, list/arguments) SIGNAL_HANDLER - var/mob/living/thrower = arguments[4] // 4th arg = mob/thrower - if(plant_safety_check(source, thrower)) + var/mob/living/thrower = arguments[4] // the 4th arg = the mob throwing our item + if(!thrower.is_holding(source)) return - SEND_SIGNAL(source, COMSIG_PLANT_ON_BACKFIRE, thrower) - if(cancel_action) - return COMPONENT_CANCEL_THROW + if(!backfire(source, thrower)) + return + + return cancel_action ? COMPONENT_CANCEL_ATTACK_CHAIN : NONE -/* +/** + * The actual backfire occurs here. + * Checks if the user is able to safely handle the plant. + * If not, sends the backfire signal (meaning backfire will occur and be handled by one or multiple genes). + * + * Returns FALSE if the user was safe and no backfire occured. + * Returns TRUE if the user was not safe and a backfire actually happened. + */ +/datum/element/plant_backfire/proc/backfire(obj/item/plant, mob/user) + if(plant_safety_check(plant, user)) + return FALSE + + SEND_SIGNAL(plant, COMSIG_PLANT_ON_BACKFIRE, user) + return TRUE + +/** * Actually checks if our user is safely handling our plant. * * Checks for TRAIT_PLANT_SAFE, and returns TRUE if we have it. @@ -86,13 +101,10 @@ * * returns FALSE if none of the checks are successful. */ -/datum/element/plant_backfire/proc/plant_safety_check(datum/source, mob/living/carbon/user) +/datum/element/plant_backfire/proc/plant_safety_check(obj/item/plant, mob/living/carbon/user) if(!istype(user)) return TRUE - if(istype(source, /obj/item/tk_grab)) // since we aren't actually touching the plant - return TRUE - if(HAS_TRAIT(user, TRAIT_PLANT_SAFE)) return TRUE @@ -100,8 +112,7 @@ if(HAS_TRAIT(user, checked_trait)) return TRUE - var/obj/item/parent_item = source - var/obj/item/seeds/our_seed = parent_item.get_plant_seed() + var/obj/item/seeds/our_seed = plant.get_plant_seed() if(our_seed) for(var/checked_gene in extra_genes) if(!our_seed.get_gene(checked_gene)) diff --git a/code/datums/elements/ridable.dm b/code/datums/elements/ridable.dm index 240333125be42f..cd4d4714c1bd57 100644 --- a/code/datums/elements/ridable.dm +++ b/code/datums/elements/ridable.dm @@ -7,7 +7,7 @@ * just having the variables, behavior, and procs be standardized is still a big improvement. */ /datum/element/ridable - element_flags = ELEMENT_BESPOKE + element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH id_arg_index = 2 /// The specific riding component subtype we're loading our instructions from, don't leave this as default please! @@ -24,6 +24,7 @@ stack_trace("Tried attaching a ridable element to [target] with basic/abstract /datum/component/riding component type. Please designate a specific riding component subtype when adding the ridable element.") return COMPONENT_INCOMPATIBLE + target.can_buckle = TRUE riding_component_type = component_type potion_boosted = potion_boost @@ -31,10 +32,11 @@ if(isvehicle(target)) RegisterSignal(target, COMSIG_SPEED_POTION_APPLIED, .proc/check_potion) if(ismob(target)) - RegisterSignal(target, COMSIG_LIVING_DEATH, .proc/handle_removal) + RegisterSignal(target, COMSIG_MOB_STATCHANGE, .proc/on_stat_change) -/datum/element/ridable/Detach(datum/target) - UnregisterSignal(target, list(COMSIG_MOVABLE_PREBUCKLE, COMSIG_SPEED_POTION_APPLIED, COMSIG_LIVING_DEATH)) +/datum/element/ridable/Detach(atom/movable/target) + target.can_buckle = initial(target.can_buckle) + UnregisterSignal(target, list(COMSIG_MOVABLE_PREBUCKLE, COMSIG_SPEED_POTION_APPLIED, COMSIG_MOB_STATCHANGE)) return ..() /// Someone is buckling to this movable, which is literally the only thing we care about (other than speed potions) @@ -147,13 +149,17 @@ qdel(O) return TRUE -/datum/element/ridable/proc/handle_removal(datum/source) +/datum/element/ridable/proc/on_stat_change(mob/source) SIGNAL_HANDLER - var/atom/movable/ridden = source - ridden.unbuckle_all_mobs() + // If we're dead, don't let anyone buckle onto us + if(source.stat == DEAD) + source.can_buckle = FALSE + source.unbuckle_all_mobs() - Detach(source) + // If we're alive, back to being buckle-able + else + source.can_buckle = TRUE /obj/item/riding_offhand name = "offhand" diff --git a/code/datums/elements/venomous.dm b/code/datums/elements/venomous.dm index f513e03bd6c986..0062c78d568c5e 100644 --- a/code/datums/elements/venomous.dm +++ b/code/datums/elements/venomous.dm @@ -1,7 +1,7 @@ /** * Venomous element; which makes the attacks of the simplemob attached poison the enemy. * - * Used for spiders and bees! + * Used for spiders, frogs, and bees! */ /datum/element/venomous element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH diff --git a/code/datums/elements/weapon_description.dm b/code/datums/elements/weapon_description.dm index 32f0e17282feb5..c2a0249133613f 100644 --- a/code/datums/elements/weapon_description.dm +++ b/code/datums/elements/weapon_description.dm @@ -62,7 +62,7 @@ SIGNAL_HANDLER if(href_list["examine"]) - to_chat(user, span_notice("[build_label_text(source)]")) + to_chat(user, span_notice(examine_block("[build_label_text(source)]"))) /** * diff --git a/code/datums/id_trim/jobs.dm b/code/datums/id_trim/jobs.dm index 7a21a8d0bb3f2d..21c4916c3c27ef 100644 --- a/code/datums/id_trim/jobs.dm +++ b/code/datums/id_trim/jobs.dm @@ -80,9 +80,15 @@ assignment = "Assistant" trim_state = "trim_assistant" sechud_icon_state = SECHUD_ASSISTANT - extra_access = list(ACCESS_MAINT_TUNNELS) minimal_access = list() - template_access = list(ACCESS_CAPTAIN, ACCESS_HOP, ACCESS_CHANGE_IDS) + extra_access = list( + ACCESS_MAINT_TUNNELS, + ) + template_access = list( + ACCESS_CAPTAIN, + ACCESS_CHANGE_IDS, + ACCESS_HOP, + ) job = /datum/job/assistant /datum/id_trim/job/assistant/refresh_trim_access() @@ -93,34 +99,77 @@ // Config has assistant maint access set. if(CONFIG_GET(flag/assistants_have_maint_access)) - access |= list(ACCESS_MAINT_TUNNELS) + access |= list( + ACCESS_MAINT_TUNNELS) /datum/id_trim/job/atmospheric_technician assignment = "Atmospheric Technician" trim_state = "trim_atmospherictechnician" sechud_icon_state = SECHUD_ATMOSPHERIC_TECHNICIAN - extra_access = list(ACCESS_ENGINE_EQUIP, ACCESS_MINERAL_STOREROOM, ACCESS_TECH_STORAGE) - minimal_access = list(ACCESS_ENGINEERING, ACCESS_ATMOSPHERICS, ACCESS_AUX_BASE, ACCESS_CONSTRUCTION, ACCESS_EXTERNAL_AIRLOCKS, ACCESS_MAINT_TUNNELS, ACCESS_MECH_ENGINE, - ACCESS_MINERAL_STOREROOM) - template_access = list(ACCESS_CAPTAIN, ACCESS_CE, ACCESS_CHANGE_IDS) + minimal_access = list( + ACCESS_ATMOSPHERICS, + ACCESS_AUX_BASE, + ACCESS_CONSTRUCTION, + ACCESS_ENGINEERING, + ACCESS_EXTERNAL_AIRLOCKS, + ACCESS_MAINT_TUNNELS, + ACCESS_MECH_ENGINE, + ACCESS_MINERAL_STOREROOM, + ) + extra_access = list( + ACCESS_ENGINE_EQUIP, + ACCESS_MINISAT, + ACCESS_TCOMMS, + ACCESS_TECH_STORAGE, + ) + template_access = list( + ACCESS_CAPTAIN, + ACCESS_CHANGE_IDS, + ACCESS_HOP, + ) job = /datum/job/atmospheric_technician /datum/id_trim/job/bartender assignment = "Bartender" trim_state = "trim_bartender" sechud_icon_state = SECHUD_BARTENDER - extra_access = list(ACCESS_HYDROPONICS, ACCESS_KITCHEN, ACCESS_MORGUE) - minimal_access = list(ACCESS_BAR, ACCESS_MINERAL_STOREROOM, ACCESS_THEATRE, ACCESS_WEAPONS, ACCESS_SERVICE) - template_access = list(ACCESS_CAPTAIN, ACCESS_HOP, ACCESS_CHANGE_IDS) + minimal_access = list( + ACCESS_BAR, + ACCESS_MINERAL_STOREROOM, + ACCESS_SERVICE, + ACCESS_THEATRE, + ACCESS_WEAPONS, + ) + extra_access = list( + ACCESS_HYDROPONICS, + ACCESS_KITCHEN, + ) + template_access = list( + ACCESS_CAPTAIN, + ACCESS_CHANGE_IDS, + ACCESS_HOP, + ) job = /datum/job/bartender /datum/id_trim/job/botanist assignment = "Botanist" trim_state = "trim_botanist" sechud_icon_state = SECHUD_BOTANIST - extra_access = list(ACCESS_BAR, ACCESS_KITCHEN) - minimal_access = list(ACCESS_HYDROPONICS, ACCESS_MINERAL_STOREROOM, ACCESS_MORGUE, ACCESS_SERVICE) - template_access = list(ACCESS_CAPTAIN, ACCESS_HOP, ACCESS_CHANGE_IDS) + minimal_access = list( + ACCESS_HYDROPONICS, + ACCESS_MINERAL_STOREROOM, + ACCESS_SERVICE, + ) + extra_access = list( + ACCESS_BAR, + ACCESS_KITCHEN, + ACCESS_MORGUE, + ) + template_access = list( + ACCESS_CAPTAIN, + ACCESS_CHANGE_IDS, + ACCESS_HOP, + ) job = /datum/job/botanist /datum/id_trim/job/captain @@ -128,7 +177,10 @@ intern_alt_name = "Captain-in-Training" trim_state = "trim_captain" sechud_icon_state = SECHUD_CAPTAIN - template_access = list(ACCESS_CAPTAIN, ACCESS_CHANGE_IDS) + template_access = list( + ACCESS_CAPTAIN, + ACCESS_CHANGE_IDS, + ) job = /datum/job/captain /// Captain gets all station accesses hardcoded in because it's the Captain. @@ -144,27 +196,64 @@ assignment = "Cargo Technician" trim_state = "trim_cargotechnician" sechud_icon_state = SECHUD_CARGO_TECHNICIAN - extra_access = list(ACCESS_QM, ACCESS_MINING, ACCESS_MINING_STATION) - minimal_access = list(ACCESS_CARGO, ACCESS_MAIL_SORTING, ACCESS_MAINT_TUNNELS, ACCESS_MECH_MINING, ACCESS_MINERAL_STOREROOM) - template_access = list(ACCESS_CAPTAIN, ACCESS_HOP, ACCESS_CHANGE_IDS) + minimal_access = list( + ACCESS_CARGO, + ACCESS_MAINT_TUNNELS, + ACCESS_MECH_MINING, + ACCESS_MINERAL_STOREROOM, + ACCESS_SHIPPING, + ) + extra_access = list( + ACCESS_MINING, + ACCESS_MINING_STATION, + ) + template_access = list( + ACCESS_CAPTAIN, + ACCESS_CHANGE_IDS, + ACCESS_QM, + ) job = /datum/job/cargo_technician /datum/id_trim/job/chaplain assignment = "Chaplain" trim_state = "trim_chaplain" sechud_icon_state = SECHUD_CHAPLAIN + minimal_access = list( + ACCESS_CHAPEL_OFFICE, + ACCESS_CREMATORIUM, + ACCESS_MORGUE, + ACCESS_SERVICE, + ACCESS_THEATRE, + ) extra_access = list() - minimal_access = list(ACCESS_CHAPEL_OFFICE, ACCESS_CREMATORIUM, ACCESS_MORGUE, ACCESS_THEATRE, ACCESS_SERVICE) - template_access = list(ACCESS_CAPTAIN, ACCESS_HOP, ACCESS_CHANGE_IDS) + template_access = list( + ACCESS_CAPTAIN, + ACCESS_CHANGE_IDS, + ACCESS_HOP, + ) job = /datum/job/chaplain /datum/id_trim/job/chemist assignment = "Chemist" trim_state = "trim_chemist" sechud_icon_state = SECHUD_CHEMIST - extra_access = list(ACCESS_SURGERY, ACCESS_VIROLOGY) - minimal_access = list(ACCESS_PLUMBING, ACCESS_MECH_MEDICAL, ACCESS_MEDICAL, ACCESS_MINERAL_STOREROOM, ACCESS_MORGUE, ACCESS_PHARMACY) - template_access = list(ACCESS_CAPTAIN, ACCESS_CMO, ACCESS_CHANGE_IDS) + minimal_access = list( + ACCESS_MECH_MEDICAL, + ACCESS_MEDICAL, + ACCESS_MINERAL_STOREROOM, + ACCESS_PHARMACY, + ACCESS_PLUMBING, + ) + extra_access = list( + ACCESS_MORGUE, + ACCESS_SURGERY, + ACCESS_VIROLOGY, + ) + template_access = list( + ACCESS_CAPTAIN, + ACCESS_CHANGE_IDS, + ACCESS_CMO, + ) job = /datum/job/chemist /datum/id_trim/job/chief_engineer @@ -172,13 +261,37 @@ intern_alt_name = "Chief Engineer-in-Training" trim_state = "trim_chiefengineer" sechud_icon_state = SECHUD_CHIEF_ENGINEER - extra_access = list(ACCESS_TELEPORTER) extra_wildcard_access = list() - minimal_access = list(ACCESS_ATMOSPHERICS, ACCESS_AUX_BASE, ACCESS_CE, ACCESS_CONSTRUCTION, ACCESS_ENGINEERING, ACCESS_ENGINE_EQUIP, ACCESS_EVA, - ACCESS_EXTERNAL_AIRLOCKS, ACCESS_COMMAND, ACCESS_KEYCARD_AUTH, ACCESS_MAINT_TUNNELS, ACCESS_MECH_ENGINE, - ACCESS_MINERAL_STOREROOM, ACCESS_MINISAT, ACCESS_RC_ANNOUNCE, ACCESS_BRIG_ENTRANCE, ACCESS_TCOMMS, ACCESS_TECH_STORAGE) - minimal_wildcard_access = list(ACCESS_CE) - template_access = list(ACCESS_CAPTAIN, ACCESS_CHANGE_IDS) + minimal_access = list( + ACCESS_ATMOSPHERICS, + ACCESS_AUX_BASE, + ACCESS_BRIG_ENTRANCE, + ACCESS_CE, + ACCESS_COMMAND, + ACCESS_CONSTRUCTION, + ACCESS_ENGINEERING, + ACCESS_ENGINE_EQUIP, + ACCESS_EVA, + ACCESS_EXTERNAL_AIRLOCKS, + ACCESS_KEYCARD_AUTH, + ACCESS_MAINT_TUNNELS, + ACCESS_MECH_ENGINE, + ACCESS_MINERAL_STOREROOM, + ACCESS_MINISAT, + ACCESS_RC_ANNOUNCE, + ACCESS_TCOMMS, + ACCESS_TECH_STORAGE, + ) + minimal_wildcard_access = list( + ACCESS_CE, + ) + extra_access = list( + ACCESS_TELEPORTER, + ) + template_access = list( + ACCESS_CAPTAIN, + ACCESS_CHANGE_IDS, + ) job = /datum/job/chief_engineer /datum/id_trim/job/chief_medical_officer @@ -186,31 +299,71 @@ intern_alt_name = "Chief Medical Officer-in-Training" trim_state = "trim_chiefmedicalofficer" sechud_icon_state = SECHUD_CHIEF_MEDICAL_OFFICER - extra_access = list(ACCESS_TELEPORTER) extra_wildcard_access = list() - minimal_access = list(ACCESS_PLUMBING, ACCESS_EVA, ACCESS_COMMAND, ACCESS_KEYCARD_AUTH, ACCESS_MAINT_TUNNELS, ACCESS_MECH_MEDICAL, - ACCESS_MEDICAL, ACCESS_MINERAL_STOREROOM, ACCESS_MORGUE, ACCESS_PHARMACY, ACCESS_PSYCHOLOGY, ACCESS_RC_ANNOUNCE, - ACCESS_BRIG_ENTRANCE, ACCESS_SURGERY, ACCESS_VIROLOGY) - minimal_wildcard_access = list(ACCESS_CMO) - template_access = list(ACCESS_CAPTAIN, ACCESS_CHANGE_IDS) + minimal_access = list( + ACCESS_BRIG_ENTRANCE, + ACCESS_COMMAND, + ACCESS_KEYCARD_AUTH, + ACCESS_PLUMBING, + ACCESS_EVA, + ACCESS_MAINT_TUNNELS, + ACCESS_MECH_MEDICAL, + ACCESS_MEDICAL, + ACCESS_MINERAL_STOREROOM, + ACCESS_MORGUE, + ACCESS_PHARMACY, + ACCESS_PSYCHOLOGY, + ACCESS_RC_ANNOUNCE, + ACCESS_SURGERY, + ACCESS_VIROLOGY, + ) + minimal_wildcard_access = list( + ACCESS_CMO, + ) + extra_access = list( + ACCESS_TELEPORTER, + ) + template_access = list( + ACCESS_CAPTAIN, + ACCESS_CHANGE_IDS, + ) job = /datum/job/chief_medical_officer /datum/id_trim/job/clown assignment = "Clown" trim_state = "trim_clown" sechud_icon_state = SECHUD_CLOWN + minimal_access = list( + ACCESS_SERVICE, + ACCESS_THEATRE, + ) extra_access = list() - minimal_access = list(ACCESS_THEATRE, ACCESS_SERVICE) - template_access = list(ACCESS_CAPTAIN, ACCESS_HOP, ACCESS_CHANGE_IDS) + template_access = list( + ACCESS_CAPTAIN, + ACCESS_CHANGE_IDS, + ACCESS_HOP, + ) job = /datum/job/clown /datum/id_trim/job/cook assignment = "Cook" trim_state = "trim_cook" sechud_icon_state = SECHUD_COOK - extra_access = list(ACCESS_BAR, ACCESS_HYDROPONICS) - minimal_access = list(ACCESS_KITCHEN, ACCESS_MINERAL_STOREROOM, ACCESS_MORGUE, ACCESS_SERVICE) - template_access = list(ACCESS_CAPTAIN, ACCESS_HOP, ACCESS_CHANGE_IDS) + minimal_access = list( + ACCESS_KITCHEN, + ACCESS_MINERAL_STOREROOM, + ACCESS_MORGUE, + ACCESS_SERVICE, + ) + extra_access = list( + ACCESS_BAR, + ACCESS_HYDROPONICS, + ) + template_access = list( + ACCESS_CAPTAIN, + ACCESS_CHANGE_IDS, + ACCESS_HOP, + ) job = /datum/job/cook /datum/id_trim/job/cook/chef @@ -221,19 +374,43 @@ assignment = "Curator" trim_state = "trim_curator" sechud_icon_state = SECHUD_CURATOR + minimal_access = list( + ACCESS_AUX_BASE, + ACCESS_LIBRARY, + ACCESS_MINING_STATION, + ACCESS_SERVICE, + ) extra_access = list() - minimal_access = list(ACCESS_AUX_BASE, ACCESS_LIBRARY, ACCESS_MINING_STATION, ACCESS_SERVICE) - template_access = list(ACCESS_CAPTAIN, ACCESS_HOP, ACCESS_CHANGE_IDS) + template_access = list( + ACCESS_CAPTAIN, + ACCESS_CHANGE_IDS, + ACCESS_HOP, + ) job = /datum/job/curator /datum/id_trim/job/detective assignment = "Detective" trim_state = "trim_detective" sechud_icon_state = SECHUD_DETECTIVE - extra_access = list(ACCESS_BRIG) - minimal_access = list(ACCESS_SECURITY, ACCESS_COURT, ACCESS_DETECTIVE, ACCESS_BRIG_ENTRANCE,ACCESS_MAINT_TUNNELS, ACCESS_MORGUE, - ACCESS_MECH_SECURITY, ACCESS_MINERAL_STOREROOM, ACCESS_WEAPONS) - template_access = list(ACCESS_CAPTAIN, ACCESS_HOS, ACCESS_CHANGE_IDS) + minimal_access = list( + ACCESS_BRIG_ENTRANCE, + ACCESS_COURT, + ACCESS_DETECTIVE, + ACCESS_MAINT_TUNNELS, + ACCESS_MECH_SECURITY, + ACCESS_MINERAL_STOREROOM, + ACCESS_MORGUE, + ACCESS_SECURITY, + ACCESS_WEAPONS, + ) + extra_access = list( + ACCESS_BRIG, + ) + template_access = list( + ACCESS_CAPTAIN, + ACCESS_CHANGE_IDS, + ACCESS_HOS, + ) job = /datum/job/detective /datum/id_trim/job/detective/refresh_trim_access() @@ -250,9 +427,24 @@ assignment = "Geneticist" trim_state = "trim_geneticist" sechud_icon_state = SECHUD_GENETICIST - extra_access = list(ACCESS_ROBOTICS, ACCESS_TECH_STORAGE, ACCESS_XENOBIOLOGY) - minimal_access = list(ACCESS_GENETICS, ACCESS_MECH_SCIENCE, ACCESS_MINERAL_STOREROOM, ACCESS_MORGUE, ACCESS_RESEARCH, ACCESS_SCIENCE) - template_access = list(ACCESS_CAPTAIN, ACCESS_RD, ACCESS_CHANGE_IDS) + minimal_access = list( + ACCESS_GENETICS, + ACCESS_MECH_SCIENCE, + ACCESS_MINERAL_STOREROOM, + ACCESS_MORGUE, + ACCESS_RESEARCH, + ACCESS_SCIENCE, + ) + extra_access = list( + ACCESS_ROBOTICS, + ACCESS_TECH_STORAGE, + ACCESS_XENOBIOLOGY, + ) + template_access = list( + ACCESS_CAPTAIN, + ACCESS_CHANGE_IDS, + ACCESS_RD, + ) job = /datum/job/geneticist /datum/id_trim/job/head_of_personnel @@ -260,16 +452,46 @@ intern_alt_name = "Head of Personnel-in-Training" trim_state = "trim_headofpersonnel" sechud_icon_state = SECHUD_HEAD_OF_PERSONNEL + minimal_access = list( + ACCESS_AI_UPLOAD, + ACCESS_ALL_PERSONAL_LOCKERS, + ACCESS_AUX_BASE, + ACCESS_BAR, + ACCESS_BRIG_ENTRANCE, + ACCESS_CHAPEL_OFFICE, + ACCESS_CHANGE_IDS, + ACCESS_CREMATORIUM, + ACCESS_COMMAND, + ACCESS_COURT, + ACCESS_ENGINEERING, + ACCESS_EVA, + ACCESS_GATEWAY, + ACCESS_HYDROPONICS, + ACCESS_JANITOR, + ACCESS_KEYCARD_AUTH, + ACCESS_KITCHEN, + ACCESS_LAWYER, + ACCESS_LIBRARY, + ACCESS_MAINT_TUNNELS, + ACCESS_MEDICAL, + ACCESS_MINERAL_STOREROOM, + ACCESS_PSYCHOLOGY, + ACCESS_RC_ANNOUNCE, + ACCESS_SCIENCE, + ACCESS_SERVICE, + ACCESS_TELEPORTER, + ACCESS_THEATRE, + ACCESS_WEAPONS, + ) + minimal_wildcard_access = list( + ACCESS_HOP, + ) extra_access = list() extra_wildcard_access = list() - minimal_access = list(ACCESS_AI_UPLOAD, ACCESS_ALL_PERSONAL_LOCKERS, ACCESS_AUX_BASE, ACCESS_BAR, ACCESS_CARGO, ACCESS_CHAPEL_OFFICE, - ACCESS_CHANGE_IDS, ACCESS_CONSTRUCTION, ACCESS_COURT, ACCESS_CREMATORIUM, ACCESS_ENGINEERING, ACCESS_EVA, ACCESS_GATEWAY, - ACCESS_COMMAND, ACCESS_HYDROPONICS, ACCESS_JANITOR, ACCESS_KEYCARD_AUTH, ACCESS_KITCHEN, ACCESS_LAWYER, ACCESS_LIBRARY, - ACCESS_MAIL_SORTING, ACCESS_MAINT_TUNNELS, ACCESS_MECH_MINING, ACCESS_MEDICAL, ACCESS_MINERAL_STOREROOM, - ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MORGUE, ACCESS_PSYCHOLOGY, ACCESS_QM, ACCESS_RC_ANNOUNCE, - ACCESS_RESEARCH, ACCESS_BRIG_ENTRANCE, ACCESS_TELEPORTER, ACCESS_THEATRE, ACCESS_VAULT, ACCESS_WEAPONS, ACCESS_SERVICE) - minimal_wildcard_access = list(ACCESS_HOP) - template_access = list(ACCESS_CAPTAIN, ACCESS_CHANGE_IDS) + template_access = list( + ACCESS_CAPTAIN, + ACCESS_CHANGE_IDS, + ) job = /datum/job/head_of_personnel /datum/id_trim/job/head_of_security @@ -279,12 +501,41 @@ sechud_icon_state = SECHUD_HEAD_OF_SECURITY extra_access = list(ACCESS_TELEPORTER) extra_wildcard_access = list() - minimal_access = list(ACCESS_ALL_PERSONAL_LOCKERS, ACCESS_ARMORY, ACCESS_AUX_BASE, ACCESS_BRIG, ACCESS_CONSTRUCTION, ACCESS_COURT, - ACCESS_ENGINEERING, ACCESS_EVA, ACCESS_DETECTIVE, ACCESS_GATEWAY, ACCESS_COMMAND, ACCESS_KEYCARD_AUTH, - ACCESS_MAIL_SORTING, ACCESS_MAINT_TUNNELS, ACCESS_MECH_SECURITY, ACCESS_MEDICAL, ACCESS_MINERAL_STOREROOM, - ACCESS_MINING, ACCESS_MORGUE, ACCESS_RC_ANNOUNCE, ACCESS_RESEARCH, ACCESS_SECURITY, ACCESS_BRIG_ENTRANCE, ACCESS_WEAPONS) - minimal_wildcard_access = list(ACCESS_HOS) - template_access = list(ACCESS_CAPTAIN, ACCESS_CHANGE_IDS) + minimal_access = list( + ACCESS_ALL_PERSONAL_LOCKERS, + ACCESS_ARMORY, + ACCESS_AUX_BASE, + ACCESS_BRIG, + ACCESS_BRIG_ENTRANCE, + ACCESS_CARGO, + ACCESS_COMMAND, + ACCESS_CONSTRUCTION, + ACCESS_COURT, + ACCESS_DETECTIVE, + ACCESS_ENGINEERING, + ACCESS_EVA, + ACCESS_GATEWAY, + ACCESS_KEYCARD_AUTH, + ACCESS_MAINT_TUNNELS, + ACCESS_MECH_SECURITY, + ACCESS_MEDICAL, + ACCESS_MINERAL_STOREROOM, + ACCESS_MINING, + ACCESS_MORGUE, + ACCESS_RC_ANNOUNCE, + ACCESS_SCIENCE, + ACCESS_SECURITY, + ACCESS_SERVICE, + ACCESS_SHIPPING, + ACCESS_WEAPONS, + ) + minimal_wildcard_access = list( + ACCESS_HOS, + ) + template_access = list( + ACCESS_CAPTAIN, + ACCESS_CHANGE_IDS, + ) job = /datum/job/head_of_security /datum/id_trim/job/head_of_security/refresh_trim_access() @@ -301,53 +552,115 @@ assignment = "Janitor" trim_state = "trim_janitor" sechud_icon_state = SECHUD_JANITOR + minimal_access = list( + ACCESS_JANITOR, + ACCESS_MAINT_TUNNELS, + ACCESS_MINERAL_STOREROOM, + ACCESS_SERVICE, + ) extra_access = list() - minimal_access = list(ACCESS_JANITOR, ACCESS_MAINT_TUNNELS, ACCESS_MINERAL_STOREROOM, ACCESS_SERVICE) - template_access = list(ACCESS_CAPTAIN, ACCESS_HOP, ACCESS_CHANGE_IDS) + template_access = list( + ACCESS_CAPTAIN, + ACCESS_HOP, + ACCESS_CHANGE_IDS, + ) job = /datum/job/janitor /datum/id_trim/job/lawyer assignment = "Lawyer" trim_state = "trim_lawyer" sechud_icon_state = SECHUD_LAWYER + minimal_access = list( + ACCESS_BRIG_ENTRANCE, + ACCESS_COURT, + ACCESS_LAWYER, + ACCESS_SERVICE, + ) extra_access = list() - minimal_access = list(ACCESS_COURT, ACCESS_LAWYER, ACCESS_BRIG_ENTRANCE, ACCESS_SERVICE) - template_access = list(ACCESS_CAPTAIN, ACCESS_HOP, ACCESS_HOS, ACCESS_CHANGE_IDS) + template_access = list( + ACCESS_CAPTAIN, + ACCESS_CHANGE_IDS, + ACCESS_HOP, + ACCESS_HOS, + ) job = /datum/job/lawyer /datum/id_trim/job/medical_doctor assignment = "Medical Doctor" trim_state = "trim_medicaldoctor" sechud_icon_state = SECHUD_MEDICAL_DOCTOR - extra_access = list(ACCESS_PLUMBING, ACCESS_VIROLOGY) - minimal_access = list(ACCESS_MECH_MEDICAL, ACCESS_MEDICAL, ACCESS_MINERAL_STOREROOM, ACCESS_MORGUE, ACCESS_PHARMACY, ACCESS_SURGERY) - template_access = list(ACCESS_CAPTAIN, ACCESS_CMO, ACCESS_CHANGE_IDS) + extra_access = list( + ACCESS_PLUMBING, + ACCESS_VIROLOGY, + ) + minimal_access = list( + ACCESS_MECH_MEDICAL, + ACCESS_MEDICAL, + ACCESS_MINERAL_STOREROOM, + ACCESS_MORGUE, + ACCESS_PHARMACY, + ACCESS_SURGERY, + ) + template_access = list( + ACCESS_CAPTAIN, + ACCESS_CHANGE_IDS, + ACCESS_CMO, + ) job = /datum/job/doctor /datum/id_trim/job/mime assignment = "Mime" trim_state = "trim_mime" sechud_icon_state = SECHUD_MIME + minimal_access = list( + ACCESS_SERVICE, + ACCESS_THEATRE, + ) extra_access = list() - minimal_access = list(ACCESS_THEATRE, ACCESS_SERVICE) - template_access = list(ACCESS_CAPTAIN, ACCESS_HOP, ACCESS_CHANGE_IDS) + template_access = list( + ACCESS_CAPTAIN, + ACCESS_CHANGE_IDS, + ACCESS_HOP, + ) job = /datum/job/mime /datum/id_trim/job/paramedic assignment = "Paramedic" trim_state = "trim_paramedic" sechud_icon_state = SECHUD_PARAMEDIC - extra_access = list(ACCESS_SURGERY) - minimal_access = list(ACCESS_CONSTRUCTION, ACCESS_HYDROPONICS, ACCESS_MAINT_TUNNELS, ACCESS_MECH_MEDICAL, - ACCESS_MEDICAL, ACCESS_MINERAL_STOREROOM, ACCESS_MINING, ACCESS_MORGUE, ACCESS_RESEARCH) - template_access = list(ACCESS_CAPTAIN, ACCESS_CMO, ACCESS_CHANGE_IDS) + minimal_access = list( + ACCESS_CARGO, + ACCESS_CONSTRUCTION, + ACCESS_HYDROPONICS, + ACCESS_MAINT_TUNNELS, + ACCESS_MECH_MEDICAL, + ACCESS_MEDICAL, + ACCESS_MINERAL_STOREROOM, + ACCESS_MINING, + ACCESS_MORGUE, + ACCESS_SCIENCE, + ACCESS_SERVICE, + ) + extra_access = list( + ACCESS_SURGERY, + ) + template_access = list( + ACCESS_CAPTAIN, + ACCESS_CHANGE_IDS, + ACCESS_CMO, + ) job = /datum/job/paramedic /datum/id_trim/job/prisoner assignment = "Prisoner" trim_state = "trim_prisoner" sechud_icon_state = SECHUD_PRISONER - template_access = list(ACCESS_CAPTAIN, ACCESS_HOP, ACCESS_HOS, ACCESS_CHANGE_IDS) + template_access = list( + ACCESS_CAPTAIN, + ACCESS_CHANGE_IDS, + ACCESS_HOP, + ACCESS_HOS, + ) job = /datum/job/prisoner /datum/id_trim/job/prisoner/one @@ -382,19 +695,49 @@ assignment = "Psychologist" trim_state = "trim_psychologist" sechud_icon_state = SECHUD_PSYCHOLOGIST + minimal_access = list( + ACCESS_MEDICAL, + ACCESS_PSYCHOLOGY, + ACCESS_SERVICE, + ) extra_access = list() - minimal_access = list(ACCESS_MEDICAL, ACCESS_PSYCHOLOGY, ACCESS_SERVICE) - template_access = list(ACCESS_CAPTAIN, ACCESS_HOP, ACCESS_CMO, ACCESS_CHANGE_IDS) + template_access = list( + ACCESS_CAPTAIN, + ACCESS_CHANGE_IDS, + ACCESS_CMO, + ACCESS_HOP, + ) job = /datum/job/psychologist /datum/id_trim/job/quartermaster assignment = "Quartermaster" trim_state = "trim_quartermaster" sechud_icon_state = SECHUD_QUARTERMASTER + minimal_access = list( + ACCESS_AUX_BASE, + ACCESS_CARGO, + ACCESS_MAINT_TUNNELS, + ACCESS_MECH_MINING, + ACCESS_MINING_STATION, + ACCESS_MINERAL_STOREROOM, + ACCESS_MINING, + ACCESS_QM, + ACCESS_RC_ANNOUNCE, + ACCESS_SHIPPING, + ACCESS_VAULT, + ACCESS_KEYCARD_AUTH, + ACCESS_COMMAND, + ACCESS_EVA, + ACCESS_BRIG_ENTRANCE, + ) extra_access = list() - minimal_access = list(ACCESS_AUX_BASE, ACCESS_CARGO, ACCESS_MAIL_SORTING, ACCESS_MAINT_TUNNELS, ACCESS_MECH_MINING, ACCESS_MINING_STATION, - ACCESS_MINERAL_STOREROOM, ACCESS_MINING, ACCESS_QM, ACCESS_RC_ANNOUNCE, ACCESS_VAULT) - template_access = list(ACCESS_CAPTAIN, ACCESS_HOP, ACCESS_CHANGE_IDS) + minimal_wildcard_access = list( + ACCESS_QM, + ) + template_access = list( + ACCESS_CAPTAIN, + ACCESS_CHANGE_IDS, + ) job = /datum/job/quartermaster /datum/id_trim/job/research_director @@ -402,35 +745,94 @@ intern_alt_name = "Research Director-in-Training" trim_state = "trim_researchdirector" sechud_icon_state = SECHUD_RESEARCH_DIRECTOR + minimal_access = list( + ACCESS_AI_UPLOAD, + ACCESS_AUX_BASE, + ACCESS_BRIG_ENTRANCE, + ACCESS_COMMAND, + ACCESS_CONSTRUCTION, + ACCESS_EVA, + ACCESS_GATEWAY, + ACCESS_GENETICS, + ACCESS_KEYCARD_AUTH, + ACCESS_NETWORK, + ACCESS_MAINT_TUNNELS, + ACCESS_MECH_ENGINE, + ACCESS_MECH_MINING, + ACCESS_MECH_SECURITY, + ACCESS_MECH_SCIENCE, + ACCESS_MINERAL_STOREROOM, + ACCESS_MINISAT, + ACCESS_MORGUE, + ACCESS_ORDNANCE, + ACCESS_ORDNANCE_STORAGE, + ACCESS_RC_ANNOUNCE, + ACCESS_RESEARCH, + ACCESS_ROBOTICS, + ACCESS_SCIENCE, + ACCESS_TECH_STORAGE, + ACCESS_TELEPORTER, + ACCESS_XENOBIOLOGY, + ) + minimal_wildcard_access = list( + ACCESS_RD, + ) extra_access = list() extra_wildcard_access = list() - minimal_access = list(ACCESS_AI_UPLOAD, ACCESS_AUX_BASE, ACCESS_EVA, ACCESS_GATEWAY, ACCESS_GENETICS, ACCESS_COMMAND, ACCESS_KEYCARD_AUTH, - ACCESS_NETWORK, ACCESS_MAINT_TUNNELS, ACCESS_MECH_ENGINE, ACCESS_MECH_MINING, ACCESS_MECH_SECURITY, ACCESS_MECH_SCIENCE, - ACCESS_MEDICAL, ACCESS_MINERAL_STOREROOM, ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MINISAT, ACCESS_MORGUE, - ACCESS_ORDNANCE, ACCESS_ORDNANCE_STORAGE, ACCESS_RC_ANNOUNCE, ACCESS_RESEARCH, ACCESS_SCIENCE, ACCESS_ROBOTICS, - ACCESS_BRIG_ENTRANCE, ACCESS_TECH_STORAGE, ACCESS_TELEPORTER, ACCESS_XENOBIOLOGY) - minimal_wildcard_access = list(ACCESS_RD) - template_access = list(ACCESS_CAPTAIN, ACCESS_CHANGE_IDS) + template_access = list( + ACCESS_CAPTAIN, + ACCESS_CHANGE_IDS, + ) job = /datum/job/research_director /datum/id_trim/job/roboticist assignment = "Roboticist" trim_state = "trim_roboticist" sechud_icon_state = SECHUD_ROBOTICIST - extra_access = list(ACCESS_GENETICS, ACCESS_ORDNANCE, ACCESS_ORDNANCE_STORAGE, ACCESS_XENOBIOLOGY) - minimal_access = list(ACCESS_AUX_BASE, ACCESS_MECH_SCIENCE, ACCESS_MINERAL_STOREROOM, ACCESS_MORGUE, ACCESS_RESEARCH, ACCESS_SCIENCE, - ACCESS_ROBOTICS, ACCESS_TECH_STORAGE) - template_access = list(ACCESS_CAPTAIN, ACCESS_RD, ACCESS_CHANGE_IDS) + minimal_access = list( + ACCESS_AUX_BASE, + ACCESS_MECH_SCIENCE, + ACCESS_MINERAL_STOREROOM, + ACCESS_MORGUE, + ACCESS_RESEARCH, + ACCESS_ROBOTICS, + ACCESS_SCIENCE, + ACCESS_TECH_STORAGE, + ) + extra_access = list( + ACCESS_GENETICS, + ACCESS_XENOBIOLOGY, + ) + template_access = list( + ACCESS_CAPTAIN, + ACCESS_CHANGE_IDS, + ACCESS_RD, + ) job = /datum/job/roboticist /datum/id_trim/job/scientist assignment = "Scientist" trim_state = "trim_scientist" sechud_icon_state = SECHUD_SCIENTIST - extra_access = list(ACCESS_GENETICS, ACCESS_ROBOTICS) - minimal_access = list(ACCESS_AUX_BASE, ACCESS_MECH_SCIENCE, ACCESS_MINERAL_STOREROOM, ACCESS_ORDNANCE, ACCESS_ORDNANCE_STORAGE, - ACCESS_RESEARCH, ACCESS_SCIENCE, ACCESS_XENOBIOLOGY) - template_access = list(ACCESS_CAPTAIN, ACCESS_RD, ACCESS_CHANGE_IDS) + minimal_access = list( + ACCESS_AUX_BASE, + ACCESS_MECH_SCIENCE, + ACCESS_MINERAL_STOREROOM, + ACCESS_ORDNANCE, + ACCESS_ORDNANCE_STORAGE, + ACCESS_RESEARCH, + ACCESS_SCIENCE, + ACCESS_XENOBIOLOGY, + ) + extra_access = list( + ACCESS_GENETICS, + ACCESS_ROBOTICS, + ) + template_access = list( + ACCESS_CAPTAIN, + ACCESS_CHANGE_IDS, + ACCESS_RD, + ) job = /datum/job/scientist /// Sec officers have departmental variants. They each have their own trims with bonus departmental accesses. @@ -438,10 +840,25 @@ assignment = "Security Officer" trim_state = "trim_securityofficer" sechud_icon_state = SECHUD_SECURITY_OFFICER - extra_access = list(ACCESS_DETECTIVE, ACCESS_MAINT_TUNNELS, ACCESS_MORGUE) - minimal_access = list(ACCESS_BRIG, ACCESS_COURT, ACCESS_SECURITY, ACCESS_BRIG_ENTRANCE, ACCESS_MECH_SECURITY, - ACCESS_MINERAL_STOREROOM, ACCESS_WEAPONS) - template_access = list(ACCESS_CAPTAIN, ACCESS_HOS, ACCESS_CHANGE_IDS) + minimal_access = list( + ACCESS_BRIG, + ACCESS_BRIG_ENTRANCE, + ACCESS_COURT, + ACCESS_MECH_SECURITY, + ACCESS_MINERAL_STOREROOM, + ACCESS_SECURITY, + ACCESS_WEAPONS, + ) + extra_access = list( + ACCESS_DETECTIVE, + ACCESS_MAINT_TUNNELS, + ACCESS_MORGUE, + ) + template_access = list( + ACCESS_CAPTAIN, + ACCESS_CHANGE_IDS, + ACCESS_HOS, + ) job = /datum/job/security_officer /// List of bonus departmental accesses that departmental sec officers get. var/department_access = list() @@ -461,66 +878,159 @@ /datum/id_trim/job/security_officer/supply assignment = "Security Officer (Cargo)" trim_state = "trim_securityofficer_car" - department_access = list(ACCESS_AUX_BASE, ACCESS_CARGO, ACCESS_MAIL_SORTING, ACCESS_MINING, ACCESS_MINING_STATION) + department_access = list( + ACCESS_AUX_BASE, + ACCESS_CARGO, + ACCESS_MINING, + ACCESS_MINING_STATION, + ACCESS_SHIPPING, + ) /datum/id_trim/job/security_officer/engineering assignment = "Security Officer (Engineering)" trim_state = "trim_securityofficer_engi" - department_access = list(ACCESS_ATMOSPHERICS, ACCESS_AUX_BASE, ACCESS_CONSTRUCTION, ACCESS_ENGINEERING) + department_access = list( + ACCESS_ATMOSPHERICS, + ACCESS_AUX_BASE, + ACCESS_CONSTRUCTION, + ACCESS_ENGINEERING, + ACCESS_ENGINE_EQUIP, + ACCESS_TCOMMS, + ) /datum/id_trim/job/security_officer/medical assignment = "Security Officer (Medical)" trim_state = "trim_securityofficer_med" - department_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY) + department_access = list( + ACCESS_MEDICAL, + ACCESS_MORGUE, + ACCESS_PHARMACY, + ACCESS_PLUMBING, + ACCESS_SURGERY, + ACCESS_VIROLOGY, + ) /datum/id_trim/job/security_officer/science assignment = "Security Officer (Science)" trim_state = "trim_securityofficer_sci" - department_access = list(ACCESS_AUX_BASE, ACCESS_RESEARCH, ACCESS_SCIENCE) + department_access = list( + ACCESS_AUX_BASE, + ACCESS_GENETICS, + ACCESS_ORDNANCE, + ACCESS_ORDNANCE_STORAGE, + ACCESS_RESEARCH, + ACCESS_ROBOTICS, + ACCESS_SCIENCE, + ACCESS_XENOBIOLOGY, + ) /datum/id_trim/job/shaft_miner assignment = "Shaft Miner" trim_state = "trim_shaftminer" sechud_icon_state = SECHUD_SHAFT_MINER - extra_access = list(ACCESS_MAINT_TUNNELS, ACCESS_QM) - minimal_access = list(ACCESS_CARGO, ACCESS_AUX_BASE, ACCESS_MAIL_SORTING, ACCESS_MECH_MINING, ACCESS_MINERAL_STOREROOM, ACCESS_MINING, - ACCESS_MINING_STATION) - template_access = list(ACCESS_CAPTAIN, ACCESS_HOP, ACCESS_CHANGE_IDS) + minimal_access = list( + ACCESS_AUX_BASE, + ACCESS_CARGO, + ACCESS_MECH_MINING, + ACCESS_MINERAL_STOREROOM, + ACCESS_MINING, + ACCESS_MINING_STATION, + ) + extra_access = list( + ACCESS_MAINT_TUNNELS, + ) + template_access = list( + ACCESS_CAPTAIN, + ACCESS_CHANGE_IDS, + ACCESS_QM, + ) job = /datum/job/shaft_miner /// ID card obtained from the mining Disney dollar points vending machine. /datum/id_trim/job/shaft_miner/spare + minimal_access = list( + ACCESS_CARGO, + ACCESS_MECH_MINING, + ACCESS_MINERAL_STOREROOM, + ACCESS_MINING, + ACCESS_MINING_STATION, + ) extra_access = list() - minimal_access = list(ACCESS_CARGO, ACCESS_MAIL_SORTING, ACCESS_MECH_MINING, ACCESS_MINERAL_STOREROOM, ACCESS_MINING, ACCESS_MINING_STATION) template_access = null /datum/id_trim/job/station_engineer assignment = "Station Engineer" trim_state = "trim_stationengineer" sechud_icon_state = SECHUD_STATION_ENGINEER - extra_access = list(ACCESS_ATMOSPHERICS) - minimal_access = list(ACCESS_AUX_BASE, ACCESS_CONSTRUCTION, ACCESS_ENGINEERING, ACCESS_ENGINE_EQUIP, ACCESS_EXTERNAL_AIRLOCKS, - ACCESS_MAINT_TUNNELS, ACCESS_MECH_ENGINE, ACCESS_MINERAL_STOREROOM, ACCESS_TCOMMS, ACCESS_TECH_STORAGE) - template_access = list(ACCESS_CAPTAIN, ACCESS_CE, ACCESS_CHANGE_IDS) + minimal_access = list( + ACCESS_AUX_BASE, + ACCESS_CONSTRUCTION, + ACCESS_ENGINEERING, + ACCESS_ENGINE_EQUIP, + ACCESS_EXTERNAL_AIRLOCKS, + ACCESS_MAINT_TUNNELS, + ACCESS_MECH_ENGINE, + ACCESS_MINERAL_STOREROOM, + ACCESS_MINISAT, + ACCESS_TCOMMS, + ACCESS_TECH_STORAGE, + ) + extra_access = list( + ACCESS_ATMOSPHERICS, + ) + template_access = list( + ACCESS_CAPTAIN, + ACCESS_CHANGE_IDS, + ACCESS_CE, + ) job = /datum/job/station_engineer /datum/id_trim/job/virologist assignment = "Virologist" trim_state = "trim_virologist" sechud_icon_state = SECHUD_VIROLOGIST - extra_access = list(ACCESS_PLUMBING, ACCESS_MORGUE, ACCESS_SURGERY) - minimal_access = list(ACCESS_MEDICAL, ACCESS_MECH_MEDICAL, ACCESS_MINERAL_STOREROOM, ACCESS_VIROLOGY) - template_access = list(ACCESS_CAPTAIN, ACCESS_CMO, ACCESS_CHANGE_IDS) + minimal_access = list( + ACCESS_MECH_MEDICAL, + ACCESS_MEDICAL, + ACCESS_MINERAL_STOREROOM, + ACCESS_VIROLOGY, + ) + extra_access = list( + ACCESS_PLUMBING, + ACCESS_MORGUE, + ACCESS_SURGERY, + ) + template_access = list( + ACCESS_CAPTAIN, + ACCESS_CHANGE_IDS, + ACCESS_CMO, + ) job = /datum/job/virologist /datum/id_trim/job/warden assignment = "Warden" trim_state = "trim_warden" sechud_icon_state = SECHUD_WARDEN - extra_access = list(ACCESS_DETECTIVE, ACCESS_MAINT_TUNNELS, ACCESS_MORGUE) - minimal_access = list(ACCESS_ARMORY, ACCESS_BRIG, ACCESS_COURT, ACCESS_MECH_SECURITY, ACCESS_MINERAL_STOREROOM, - ACCESS_SECURITY, ACCESS_BRIG_ENTRANCE, ACCESS_WEAPONS) // See /datum/job/warden/get_access() - template_access = list(ACCESS_CAPTAIN, ACCESS_HOS, ACCESS_CHANGE_IDS) + minimal_access = list( + ACCESS_ARMORY, + ACCESS_BRIG, + ACCESS_BRIG_ENTRANCE, + ACCESS_COURT, + ACCESS_MECH_SECURITY, + ACCESS_MINERAL_STOREROOM, + ACCESS_SECURITY, + ACCESS_WEAPONS, + ) // See /datum/job/warden/get_access() + extra_access = list( + ACCESS_DETECTIVE, + ACCESS_MAINT_TUNNELS, + ACCESS_MORGUE, + ) + template_access = list( + ACCESS_CAPTAIN, + ACCESS_CHANGE_IDS, + ACCESS_HOS, + ) job = /datum/job/warden /datum/id_trim/job/warden/refresh_trim_access() diff --git a/code/datums/id_trim/ruins.dm b/code/datums/id_trim/ruins.dm index 3d44cc2d7cb19c..b6b199bd7e8550 100644 --- a/code/datums/id_trim/ruins.dm +++ b/code/datums/id_trim/ruins.dm @@ -17,7 +17,7 @@ /// Trim for the oldstation ruin/Charlie station /datum/id_trim/away/old/sci - access = list(ACCESS_AWAY_GENERAL) + access = list(ACCESS_AWAY_GENERAL, ACCESS_AWAY_SCIENCE) assignment = "Charlie Station Scientist" /// Trim for the oldstation ruin/Charlie station @@ -30,9 +30,9 @@ access = list(ACCESS_ENGINEERING, ACCESS_ENGINE_EQUIP) assignment = "Engineering Equipment Access" -/// Trim for the oldstation ruin/Charlie station to access robots +/// Trim for the oldstation ruin/Charlie station to access robots, and downloading of paper publishing software for experiments /datum/id_trim/away/old/robo - access = list(ACCESS_AWAY_GENERAL, ACCESS_ROBOTICS) + access = list(ACCESS_AWAY_GENERAL, ACCESS_ROBOTICS, ACCESS_ORDNANCE) /// Trim for the cat surgeon ruin. /datum/id_trim/away/cat_surgeon diff --git a/code/datums/keybinding/communication.dm b/code/datums/keybinding/communication.dm index 36301da7ab65da..0c96919651cce2 100644 --- a/code/datums/keybinding/communication.dm +++ b/code/datums/keybinding/communication.dm @@ -3,18 +3,24 @@ /datum/keybinding/client/communication/say hotkey_keys = list("T") - name = "Say" + name = SAY_CHANNEL full_name = "IC Say" keybind_signal = COMSIG_KB_CLIENT_SAY_DOWN +/datum/keybinding/client/communication/radio + hotkey_keys = list("Y") + name = RADIO_CHANNEL + full_name = "IC Radio (;)" + keybind_signal = COMSIG_KB_CLIENT_RADIO_DOWN + /datum/keybinding/client/communication/ooc hotkey_keys = list("O") - name = "OOC" + name = OOC_CHANNEL full_name = "Out Of Character Say (OOC)" keybind_signal = COMSIG_KB_CLIENT_OOC_DOWN /datum/keybinding/client/communication/me hotkey_keys = list("M") - name = "Me" + name = ME_CHANNEL full_name = "Custom Emote (/Me)" keybind_signal = COMSIG_KB_CLIENT_ME_DOWN diff --git a/code/datums/map_config.dm b/code/datums/map_config.dm index 745f0fdbba6459..c570e8be70624e 100644 --- a/code/datums/map_config.dm +++ b/code/datums/map_config.dm @@ -35,6 +35,8 @@ var/job_changes = list() /// List of additional areas that count as a part of the library var/library_areas = list() + /// What message shows up when the orbit is shifted. + var/orbit_shift_replacement = "Attention crew, it appears that someone on your station has shifted your orbit into more dangerous territory." /** * Proc that simply loads the default map config, which should always be functional. @@ -166,6 +168,9 @@ log_world("map_config space_empty_levels is not a number!") return + if("orbit_shift_replacement" in json) + orbit_shift_replacement = json["orbit_shift_replacement"] + if ("minetype" in json) minetype = json["minetype"] diff --git a/code/datums/martial/cqc.dm b/code/datums/martial/cqc.dm index 273b0b0dc902ee..4c3b4c689b73a3 100644 --- a/code/datums/martial/cqc.dm +++ b/code/datums/martial/cqc.dm @@ -22,19 +22,19 @@ if(!can_use(A)) return FALSE if(findtext(streak,SLAM_COMBO)) - streak = "" + reset_streak(A) return Slam(A,D) if(findtext(streak,KICK_COMBO)) - streak = "" + reset_streak(A) return Kick(A,D) if(findtext(streak,RESTRAIN_COMBO)) - streak = "" + reset_streak(A) return Restrain(A,D) if(findtext(streak,PRESSURE_COMBO)) - streak = "" + reset_streak(A) return Pressure(A,D) if(findtext(streak,CONSECUTIVE_COMBO)) - streak = "" + reset_streak(A) return Consecutive(A,D) return FALSE diff --git a/code/datums/martial/plasma_fist.dm b/code/datums/martial/plasma_fist.dm index 6f5c2acad3963f..af5640b84a5fd2 100644 --- a/code/datums/martial/plasma_fist.dm +++ b/code/datums/martial/plasma_fist.dm @@ -16,17 +16,17 @@ if(findtext(streak,TORNADO_COMBO)) if(A == D)//helps using apotheosis return FALSE - streak = "" + reset_streak(A) Tornado(A,D) return TRUE if(findtext(streak,THROWBACK_COMBO)) if(A == D)//helps using apotheosis return FALSE - streak = "" + reset_streak(A) Throwback(A,D) return TRUE if(findtext(streak,PLASMA_COMBO)) - streak = "" + reset_streak(A) if(A == D && !nobomb) Apotheosis(A,D) else @@ -37,8 +37,11 @@ /datum/martial_art/plasma_fist/proc/Tornado(mob/living/A, mob/living/D) A.say("TORNADO SWEEP!", forced="plasma fist") dance_rotate(A, CALLBACK(GLOBAL_PROC, .proc/playsound, A.loc, 'sound/weapons/punch1.ogg', 15, TRUE, -1)) - var/obj/effect/proc_holder/spell/aoe_turf/repulse/R = new(null) - R.cast(RANGE_TURFS(1,A)) + + var/datum/action/cooldown/spell/aoe/repulse/tornado_spell = new(src) + tornado_spell.cast(A) + qdel(tornado_spell) + log_combat(A, D, "tornado sweeped(Plasma Fist)") return diff --git a/code/datums/martial/sleeping_carp.dm b/code/datums/martial/sleeping_carp.dm index 767cf869ecc658..3838305caf1eab 100644 --- a/code/datums/martial/sleeping_carp.dm +++ b/code/datums/martial/sleeping_carp.dm @@ -11,15 +11,15 @@ /datum/martial_art/the_sleeping_carp/proc/check_streak(mob/living/A, mob/living/D) if(findtext(streak,STRONG_PUNCH_COMBO)) - streak = "" + reset_streak(A) strongPunch(A,D) return TRUE if(findtext(streak,LAUNCH_KICK_COMBO)) - streak = "" + reset_streak(A) launchKick(A,D) return TRUE if(findtext(streak,DROP_KICK_COMBO)) - streak = "" + reset_streak(A) dropKick(A,D) return TRUE return FALSE diff --git a/code/datums/memory/memory.dm b/code/datums/memory/memory.dm index f2cbdd3bb31225..e1fe64e8f9f917 100644 --- a/code/datums/memory/memory.dm +++ b/code/datums/memory/memory.dm @@ -48,7 +48,7 @@ /mob/living/simple_animal/hostile/carp, /mob/living/simple_animal/hostile/bear, /mob/living/simple_animal/hostile/mushroom, - /mob/living/simple_animal/hostile/statue, + /mob/living/simple_animal/hostile/netherworld/statue, /mob/living/simple_animal/hostile/retaliate/bat, /mob/living/simple_animal/hostile/retaliate/goat, /mob/living/simple_animal/hostile/killertomato, diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 9c5da09c43effc..106eb891bd6458 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -46,8 +46,6 @@ var/special_role var/list/restricted_roles = list() - var/list/spell_list = list() // Wizard mode & "Give Spell" badmin button. - var/datum/martial_art/martial_art var/static/default_martial_art = new/datum/martial_art var/miming = FALSE // Mime's vow of silence @@ -173,7 +171,6 @@ if(iscarbon(new_character)) var/mob/living/carbon/C = new_character C.last_mind = src - transfer_actions(new_character) transfer_martial_arts(new_character) RegisterSignal(new_character, COMSIG_LIVING_DEATH, .proc/set_death_time) if(active || force_key_move) @@ -263,12 +260,12 @@ if(!length(shown_skills)) to_chat(user, span_notice("You don't seem to have any particularly outstanding skills.")) return - var/msg = "[span_info("*---------*\nYour skills")]\n" + var/msg = "[span_info("Your skills")]\n" for(var/i in shown_skills) var/datum/skill/the_skill = i msg += "[initial(the_skill.name)] - [get_skill_level_name(the_skill)]\n" msg += "" - to_chat(user, msg) + to_chat(user, examine_block(msg)) /datum/mind/proc/set_death_time() SIGNAL_HANDLER @@ -764,8 +761,9 @@ uplink_exists = traitor_datum.uplink_ref if(!uplink_exists) uplink_exists = find_syndicate_uplink(check_unlocked = TRUE) - if(!uplink_exists && !(locate(/obj/effect/proc_holder/spell/self/special_equipment_fallback) in spell_list)) - AddSpell(new /obj/effect/proc_holder/spell/self/special_equipment_fallback(null, src)) + if(!uplink_exists && !(locate(/datum/action/special_equipment_fallback) in current.actions)) + var/datum/action/special_equipment_fallback/fallback = new(src) + fallback.Grant(current) /datum/mind/proc/take_uplink() qdel(find_syndicate_uplink()) @@ -797,25 +795,6 @@ add_antag_datum(head) special_role = ROLE_REV_HEAD -/datum/mind/proc/AddSpell(obj/effect/proc_holder/spell/S) - spell_list += S - S.action.Grant(current) - -//To remove a specific spell from a mind -/datum/mind/proc/RemoveSpell(obj/effect/proc_holder/spell/spell) - if(!spell) - return - for(var/X in spell_list) - var/obj/effect/proc_holder/spell/S = X - if(istype(S, spell)) - spell_list -= S - qdel(S) - current?.client.stat_panel.send_message("check_spells") - -/datum/mind/proc/RemoveAllSpells() - for(var/obj/effect/proc_holder/S in spell_list) - RemoveSpell(S) - /datum/mind/proc/transfer_martial_arts(mob/living/new_character) if(!ishuman(new_character)) return @@ -825,27 +804,6 @@ else martial_art.teach(new_character) -/datum/mind/proc/transfer_actions(mob/living/new_character) - if(current?.actions) - for(var/datum/action/A in current.actions) - A.Grant(new_character) - transfer_mindbound_actions(new_character) - -/datum/mind/proc/transfer_mindbound_actions(mob/living/new_character) - for(var/X in spell_list) - var/obj/effect/proc_holder/spell/S = X - S.action.Grant(new_character) - -/datum/mind/proc/disrupt_spells(delay, list/exceptions = New()) - for(var/X in spell_list) - var/obj/effect/proc_holder/spell/S = X - for(var/type in exceptions) - if(istype(S, type)) - continue - S.charge_counter = delay - S.updateButtons() - INVOKE_ASYNC(S, /obj/effect/proc_holder/spell.proc/start_recharge) - /datum/mind/proc/get_ghost(even_if_they_cant_reenter, ghosts_with_clients) for(var/mob/dead/observer/G in (ghosts_with_clients ? GLOB.player_list : GLOB.dead_mob_list)) if(G.mind == src) diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm index 050ff5ca169230..150e94336d0cfe 100644 --- a/code/datums/mood_events/generic_negative_events.dm +++ b/code/datums/mood_events/generic_negative_events.dm @@ -47,6 +47,11 @@ mood_change = -2 timeout = 4 MINUTES +/datum/mood_event/cascade // Big boi delamination + description = "The engineers have finally done it, we are all going to die..." + mood_change = -8 + timeout = 5 MINUTES + /datum/mood_event/depression_minimal description = "I feel a bit down." mood_change = -10 @@ -374,3 +379,8 @@ description = "This is really embarrassing! I'm ashamed to pick up all these cards off the floor..." mood_change = -3 timeout = 3 MINUTES + +/datum/mood_event/russian_roulette_lose + description = "I gambled my life and lost! I guess this is the end..." + mood_change = -20 + timeout = 10 MINUTES diff --git a/code/datums/mood_events/generic_positive_events.dm b/code/datums/mood_events/generic_positive_events.dm index 44acc5a3228075..ad3b54efce7253 100644 --- a/code/datums/mood_events/generic_positive_events.dm +++ b/code/datums/mood_events/generic_positive_events.dm @@ -282,6 +282,10 @@ mood_change = 2 timeout = 3 MINUTES +/datum/mood_event/garland + description = "These flowers are rather soothing." + mood_change = 1 + /datum/mood_event/playing_cards/add_effects(param) var/card_players = 1 for(var/mob/living/carbon/player in viewers(COMBAT_MESSAGE_RANGE, owner)) @@ -293,3 +297,16 @@ mood_change *= card_players return ..() + +/datum/mood_event/russian_roulette_win + description = "I gambled my life and won! I'm lucky to be alive..." + mood_change = 2 + timeout = 5 MINUTES + +/datum/mood_event/russian_roulette_win/add_effects(loaded_rounds) + mood_change = 2 ** loaded_rounds + +/datum/mood_event/fishing + description = "Fishing is relaxing." + mood_change = 5 + timeout = 3 MINUTES diff --git a/code/datums/mutations/_mutations.dm b/code/datums/mutations/_mutations.dm index 20956b76be2f5a..72f9087fbb5dad 100644 --- a/code/datums/mutations/_mutations.dm +++ b/code/datums/mutations/_mutations.dm @@ -16,8 +16,8 @@ var/text_lose_indication = "" /// Visual indicators upon the character of the owner of this mutation var/static/list/visual_indicators = list() - /// The proc holder (ew) o - var/obj/effect/proc_holder/spell/power + /// The path of action we grant to our user on mutation gain + var/datum/action/cooldown/spell/power_path /// Which mutation layer to use var/layer_used = MUTATIONS_LAYER /// To restrict mutation to only certain species @@ -114,7 +114,7 @@ owner.remove_overlay(layer_used) owner.overlays_standing[layer_used] = mut_overlay owner.apply_overlay(layer_used) - grant_spell() //we do checks here so nothing about hulk getting magic + grant_power() //we do checks here so nothing about hulk getting magic if(!modified) addtimer(CALLBACK(src, .proc/modify, 0.5 SECONDS)) //gonna want children calling ..() to run first @@ -138,8 +138,10 @@ mut_overlay.Remove(get_visual_indicator()) owner.overlays_standing[layer_used] = mut_overlay owner.apply_overlay(layer_used) - if(power) - owner.RemoveSpell(power) + if(power_path) + // Any powers we made are linked to our mutation datum, + // so deleting ourself will also delete it and remove it + // ...Why don't all mutations delete on loss? Not sure. qdel(src) /mob/living/carbon/proc/update_mutations_overlay() @@ -164,12 +166,21 @@ overlays_standing[mutation.layer_used] = mut_overlay apply_overlay(mutation.layer_used) -/datum/mutation/human/proc/modify() //called when a genome is applied so we can properly update some stats without having to remove and reapply the mutation from someone - if(modified || !power || !owner) +/** + * Called when a chromosome is applied so we can properly update some stats + * without having to remove and reapply the mutation from someone + * + * Returns `null` if no modification was done, and + * returns an instance of a power if modification was complete + */ +/datum/mutation/human/proc/modify() + if(modified || !power_path || !owner) return - power.charge_max *= GET_MUTATION_ENERGY(src) - power.charge_counter *= GET_MUTATION_ENERGY(src) - modified = TRUE + var/datum/action/cooldown/spell/modified_power = locate(power_path) in owner.actions + if(!modified_power) + CRASH("Genetic mutation [type] called modify(), but could not find a action to modify!") + modified_power.cooldown_time *= GET_MUTATION_ENERGY(src) // Doesn't do anything for mutations with energy_coeff unset + return modified_power /datum/mutation/human/proc/copy_mutation(datum/mutation/human/mutation_to_copy) if(!mutation_to_copy) @@ -198,15 +209,16 @@ else qdel(src) -/datum/mutation/human/proc/grant_spell() - if(!ispath(power) || !owner) +/datum/mutation/human/proc/grant_power() + if(!ispath(power_path) || !owner) return FALSE - power = new power() - power.action_background_icon_state = "bg_tech_blue_on" - power.panel = "Genetic" - owner.AddSpell(power) - return TRUE + var/datum/action/cooldown/spell/new_power = new power_path(src) + new_power.background_icon_state = "bg_tech_blue_on" + new_power.panel = "Genetic" + new_power.Grant(owner) + + return new_power // Runs through all the coefficients and uses this to determine which chromosomes the // mutation can take. Stores these as text strings in a list. diff --git a/code/datums/mutations/actions.dm b/code/datums/mutations/actions.dm deleted file mode 100644 index 48e8c41b078b7c..00000000000000 --- a/code/datums/mutations/actions.dm +++ /dev/null @@ -1,446 +0,0 @@ -/datum/mutation/human/telepathy - name = "Telepathy" - desc = "A rare mutation that allows the user to telepathically communicate to others." - quality = POSITIVE - text_gain_indication = "You can hear your own voice echoing in your mind!" - text_lose_indication = "You don't hear your mind echo anymore." - difficulty = 12 - power = /obj/effect/proc_holder/spell/targeted/telepathy - instability = 10 - energy_coeff = 1 - - -/datum/mutation/human/olfaction - name = "Transcendent Olfaction" - desc = "Your sense of smell is comparable to that of a canine." - quality = POSITIVE - difficulty = 12 - text_gain_indication = "Smells begin to make more sense..." - text_lose_indication = "Your sense of smell goes back to normal." - power = /obj/effect/proc_holder/spell/targeted/olfaction - instability = 30 - synchronizer_coeff = 1 - var/reek = 200 - -/datum/mutation/human/olfaction/modify() - if(power) - var/obj/effect/proc_holder/spell/targeted/olfaction/S = power - S.sensitivity = GET_MUTATION_SYNCHRONIZER(src) - -/obj/effect/proc_holder/spell/targeted/olfaction - name = "Remember the Scent" - desc = "Get a scent off of the item you're currently holding to track it. With an empty hand, you'll track the scent you've remembered." - charge_max = 100 - clothes_req = FALSE - range = -1 - include_user = TRUE - action_icon_state = "nose" - var/mob/living/carbon/tracking_target - var/list/mob/living/carbon/possible = list() - var/sensitivity = 1 - -/obj/effect/proc_holder/spell/targeted/olfaction/cast(list/targets, mob/living/user = usr) - //can we sniff? is there miasma in the air? - var/datum/gas_mixture/air = user.loc.return_air() - var/list/cached_gases = air.gases - - if(cached_gases[/datum/gas/miasma]) - user.adjust_disgust(sensitivity * 45) - to_chat(user, span_warning("With your overly sensitive nose, you get a whiff of stench and feel sick! Try moving to a cleaner area!")) - return - - var/atom/sniffed = user.get_active_held_item() - if(sniffed) - var/old_target = tracking_target - possible = list() - var/list/prints = GET_ATOM_FINGERPRINTS(sniffed) - if(prints) - for(var/mob/living/carbon/C in GLOB.carbon_list) - if(prints[md5(C.dna.unique_identity)]) - possible |= C - if(!length(possible)) - to_chat(user,span_warning("Despite your best efforts, there are no scents to be found on [sniffed]...")) - return - tracking_target = tgui_input_list(user, "Scent to remember", "Scent Tracking", sort_names(possible)) - if(isnull(tracking_target)) - if(isnull(old_target)) - to_chat(user,span_warning("You decide against remembering any scents. Instead, you notice your own nose in your peripheral vision. This goes on to remind you of that one time you started breathing manually and couldn't stop. What an awful day that was.")) - return - tracking_target = old_target - on_the_trail(user) - return - to_chat(user,span_notice("You pick up the scent of [tracking_target]. The hunt begins.")) - on_the_trail(user) - return - - if(!tracking_target) - to_chat(user,span_warning("You're not holding anything to smell, and you haven't smelled anything you can track. You smell your skin instead; it's kinda salty.")) - return - - on_the_trail(user) - -/obj/effect/proc_holder/spell/targeted/olfaction/proc/on_the_trail(mob/living/user) - if(!tracking_target) - to_chat(user,span_warning("You're not tracking a scent, but the game thought you were. Something's gone wrong! Report this as a bug.")) - return - if(tracking_target == user) - to_chat(user,span_warning("You smell out the trail to yourself. Yep, it's you.")) - return - if(usr.z < tracking_target.z) - to_chat(user,span_warning("The trail leads... way up above you? Huh. They must be really, really far away.")) - return - else if(usr.z > tracking_target.z) - to_chat(user,span_warning("The trail leads... way down below you? Huh. They must be really, really far away.")) - return - var/direction_text = "[dir2text(get_dir(usr, tracking_target))]" - if(direction_text) - to_chat(user,span_notice("You consider [tracking_target]'s scent. The trail leads [direction_text].")) - -/datum/mutation/human/firebreath - name = "Fire Breath" - desc = "An ancient mutation that gives lizards breath of fire." - quality = POSITIVE - difficulty = 12 - locked = TRUE - text_gain_indication = "Your throat is burning!" - text_lose_indication = "Your throat is cooling down." - power = /obj/effect/proc_holder/spell/cone/staggered/firebreath - instability = 30 - energy_coeff = 1 - power_coeff = 1 - -/datum/mutation/human/firebreath/modify() - // If we have a power chromosome... - if(power && GET_MUTATION_POWER(src) > 1) - var/obj/effect/proc_holder/spell/cone/staggered/firebreath/our_spell = power - our_spell.cone_levels += 2 // Cone fwooshes further, and... - our_spell.self_throw_range += 1 // the breath throws the user back more - - -/obj/effect/proc_holder/spell/cone/staggered/firebreath - name = "Fire Breath" - desc = "You breathe a cone of fire directly in front of you." - school = SCHOOL_EVOCATION - invocation = "" - invocation_type = INVOCATION_NONE - charge_max = 400 - clothes_req = FALSE - range = 20 - base_icon_state = "fireball" - action_icon_state = "fireball0" - still_recharging_msg = "You can't muster any flames!" - sound = 'sound/magic/demon_dies.ogg' //horrifying lizard noises - respect_density = TRUE - cone_levels = 3 - antimagic_flags = NONE // cannot be restricted or blocked by antimagic - /// The range our user is thrown backwards after casting the spell - var/self_throw_range = 1 - -/obj/effect/proc_holder/spell/cone/staggered/firebreath/before_cast(list/targets) - . = ..() - if(!iscarbon(usr)) - return - - var/mob/living/carbon/our_lizard = usr - if(!our_lizard.is_mouth_covered()) - return - - our_lizard.adjust_fire_stacks(cone_levels) - our_lizard.ignite_mob() - to_chat(our_lizard, span_warning("Something in front of your mouth catches fire!")) - -/obj/effect/proc_holder/spell/cone/staggered/firebreath/cast(list/targets, mob/user) - . = ..() - // When casting, throw them backwards a few tiles. - var/original_dir = user.dir - user.throw_at(get_edge_target_turf(user, turn(user.dir, 180)), range = self_throw_range, speed = 2, gentle = TRUE) - //Try to set us to our original direction after, so we don't end up backwards. - user.setDir(original_dir) - -// Makes the cone shoot out into a 3 wide column of flames. -/obj/effect/proc_holder/spell/cone/staggered/firebreath/calculate_cone_shape(current_level) - return (2 * current_level) - 1 - -/obj/effect/proc_holder/spell/cone/staggered/firebreath/do_turf_cone_effect(turf/target_turf, level) - // Further turfs experience less exposed_temperature and exposed_volume - new /obj/effect/hotspot(target_turf) // for style - target_turf.hotspot_expose(max(500, 900 - (100 * level)), max(50, 200 - (50 * level)), 1) - -/obj/effect/proc_holder/spell/cone/staggered/firebreath/do_mob_cone_effect(mob/living/target_mob, level) - // Further out targets take less immediate burn damage and get less fire stacks. - // The actual burn damage application is not blocked by fireproofing, like space dragons. - target_mob.apply_damage(max(10, 40 - (5 * level)), BURN, spread_damage = TRUE) - target_mob.adjust_fire_stacks(max(2, 5 - level)) - target_mob.ignite_mob() - -/obj/effect/proc_holder/spell/cone/staggered/firebreath/do_obj_cone_effect(obj/target_obj, level) - // Further out objects experience less exposed_temperature and exposed_volume - target_obj.fire_act(max(500, 900 - (100 * level)), max(50, 200 - (50 * level))) - -/datum/mutation/human/void - name = "Void Magnet" - desc = "A rare genome that attracts odd forces not usually observed." - quality = MINOR_NEGATIVE //upsides and downsides - text_gain_indication = "You feel a heavy, dull force just beyond the walls watching you." - instability = 30 - power = /obj/effect/proc_holder/spell/self/void - energy_coeff = 1 - synchronizer_coeff = 1 - -/datum/mutation/human/void/on_life(delta_time, times_fired) - if(!isturf(owner.loc)) - return - if(DT_PROB((0.25+((100-dna.stability)/40)) * GET_MUTATION_SYNCHRONIZER(src), delta_time)) //very rare, but enough to annoy you hopefully. +0.5 probability for every 10 points lost in stability - new /obj/effect/immortality_talisman/void(get_turf(owner), owner) - -/obj/effect/proc_holder/spell/self/void - name = "Convoke Void" //magic the gathering joke here - desc = "A rare genome that attracts odd forces not usually observed. May sometimes pull you in randomly." - school = SCHOOL_EVOCATION - clothes_req = FALSE - charge_max = 600 - invocation = "DOOOOOOOOOOOOOOOOOOOOM!!!" - invocation_type = INVOCATION_SHOUT - action_icon_state = "void_magnet" - -/obj/effect/proc_holder/spell/self/void/can_cast(mob/user = usr) - . = ..() - if(!isturf(user.loc)) - return FALSE - -/obj/effect/proc_holder/spell/self/void/cast(list/targets, mob/user = usr) - . = ..() - new /obj/effect/immortality_talisman/void(get_turf(user), user) - -/datum/mutation/human/self_amputation - name = "Autotomy" - desc = "Allows a creature to voluntary discard a random appendage." - quality = POSITIVE - text_gain_indication = "Your joints feel loose." - instability = 30 - power = /obj/effect/proc_holder/spell/self/self_amputation - - energy_coeff = 1 - synchronizer_coeff = 1 - -/obj/effect/proc_holder/spell/self/self_amputation - name = "Drop a limb" - desc = "Concentrate to make a random limb pop right off your body." - clothes_req = FALSE - human_req = FALSE - charge_max = 100 - action_icon_state = "autotomy" - -/obj/effect/proc_holder/spell/self/self_amputation/cast(list/targets, mob/user = usr) - if(!iscarbon(user)) - return - - var/mob/living/carbon/C = user - if(HAS_TRAIT(C, TRAIT_NODISMEMBER)) - return - - var/list/parts = list() - for(var/X in C.bodyparts) - var/obj/item/bodypart/BP = X - if(BP.body_part != HEAD && BP.body_part != CHEST) - if(BP.dismemberable) - parts += BP - if(!length(parts)) - to_chat(usr, span_notice("You can't shed any more limbs!")) - return - - var/obj/item/bodypart/BP = pick(parts) - BP.dismember() - -/datum/mutation/human/tongue_spike - name = "Tongue Spike" - desc = "Allows a creature to voluntary shoot their tongue out as a deadly weapon." - quality = POSITIVE - text_gain_indication = "Your feel like you can throw your voice." - instability = 15 - power = /obj/effect/proc_holder/spell/self/tongue_spike - - energy_coeff = 1 - synchronizer_coeff = 1 - -/obj/effect/proc_holder/spell/self/tongue_spike - name = "Launch spike" - desc = "Shoot your tongue out in the direction you're facing, embedding it and dealing damage until they remove it." - clothes_req = FALSE - human_req = TRUE - charge_max = 100 - action_icon = 'icons/mob/actions/actions_genetic.dmi' - action_icon_state = "spike" - var/spike_path = /obj/item/hardened_spike - -/obj/effect/proc_holder/spell/self/tongue_spike/cast(list/targets, mob/user = usr) - if(!iscarbon(user)) - return - - var/mob/living/carbon/C = user - if(HAS_TRAIT(C, TRAIT_NODISMEMBER)) - return - var/obj/item/organ/internal/tongue/tongue - for(var/org in C.internal_organs) - if(istype(org, /obj/item/organ/internal/tongue)) - tongue = org - break - - if(!tongue) - to_chat(C, span_notice("You don't have a tongue to shoot!")) - return - - tongue.Remove(C, special = TRUE) - var/obj/item/hardened_spike/spike = new spike_path(get_turf(C), C) - tongue.forceMove(spike) - spike.throw_at(get_edge_target_turf(C,C.dir), 14, 4, C) - -/obj/item/hardened_spike - name = "biomass spike" - desc = "Hardened biomass, shaped into a spike. Very pointy!" - icon_state = "tonguespike" - force = 2 - throwforce = 15 //15 + 2 (WEIGHT_CLASS_SMALL) * 4 (EMBEDDED_IMPACT_PAIN_MULTIPLIER) = i didnt do the math - throw_speed = 4 - embedding = list("embedded_pain_multiplier" = 4, "embed_chance" = 100, "embedded_fall_chance" = 0, "embedded_ignore_throwspeed_threshold" = TRUE) - w_class = WEIGHT_CLASS_SMALL - sharpness = SHARP_POINTY - custom_materials = list(/datum/material/biomass = 500) - var/mob/living/carbon/human/fired_by - /// if we missed our target - var/missed = TRUE - -/obj/item/hardened_spike/Initialize(mapload, firedby) - . = ..() - fired_by = firedby - addtimer(CALLBACK(src, .proc/checkembedded), 5 SECONDS) - -/obj/item/hardened_spike/proc/checkembedded() - if(missed) - unembedded() - -/obj/item/hardened_spike/embedded(atom/target) - if(isbodypart(target)) - missed = FALSE - -/obj/item/hardened_spike/unembedded() - var/turf/T = get_turf(src) - visible_message(span_warning("[src] cracks and twists, changing shape!")) - for(var/i in contents) - var/obj/o = i - o.forceMove(T) - qdel(src) - -/datum/mutation/human/tongue_spike/chem - name = "Chem Spike" - desc = "Allows a creature to voluntary shoot their tongue out as biomass, allowing a long range transfer of chemicals." - quality = POSITIVE - text_gain_indication = "Your feel like you can really connect with people by throwing your voice." - instability = 15 - locked = TRUE - power = /obj/effect/proc_holder/spell/self/tongue_spike/chem - energy_coeff = 1 - synchronizer_coeff = 1 - -/obj/effect/proc_holder/spell/self/tongue_spike/chem - name = "Launch chem spike" - desc = "Shoot your tongue out in the direction you're facing, embedding it for a very small amount of damage. While the other person has the spike embedded, you can transfer your chemicals to them." - action_icon_state = "spikechem" - spike_path = /obj/item/hardened_spike/chem - -/obj/item/hardened_spike/chem - name = "chem spike" - desc = "Hardened biomass, shaped into... something." - icon_state = "tonguespikechem" - throwforce = 2 //2 + 2 (WEIGHT_CLASS_SMALL) * 0 (EMBEDDED_IMPACT_PAIN_MULTIPLIER) = i didnt do the math again but very low or smthin - embedding = list("embedded_pain_multiplier" = 0, "embed_chance" = 100, "embedded_fall_chance" = 0, "embedded_pain_chance" = 0, "embedded_ignore_throwspeed_threshold" = TRUE) //never hurts once it's in you - var/been_places = FALSE - var/datum/action/innate/send_chems/chems - -/obj/item/hardened_spike/chem/embedded(mob/living/carbon/human/embedded_mob) - if(been_places) - return - been_places = TRUE - chems = new - chems.transfered = embedded_mob - chems.spikey = src - to_chat(fired_by, span_notice("Link established! Use the \"Transfer Chemicals\" ability to send your chemicals to the linked target!")) - chems.Grant(fired_by) - -/obj/item/hardened_spike/chem/unembedded() - to_chat(fired_by, span_warning("Link lost!")) - QDEL_NULL(chems) - ..() - -/datum/action/innate/send_chems - icon_icon = 'icons/mob/actions/actions_genetic.dmi' - background_icon_state = "bg_spell" - check_flags = AB_CHECK_CONSCIOUS - button_icon_state = "spikechemswap" - name = "Transfer Chemicals" - desc = "Send all of your reagents into whomever the chem spike is embedded in. One use." - var/obj/item/hardened_spike/chem/spikey - var/mob/living/carbon/human/transfered - -/datum/action/innate/send_chems/Activate() - if(!ishuman(transfered) || !ishuman(owner)) - return - var/mob/living/carbon/human/transferer = owner - - to_chat(transfered, span_warning("You feel a tiny prick!")) - transferer.reagents.trans_to(transfered, transferer.reagents.total_volume, 1, 1, 0, transfered_by = transferer) - - var/obj/item/bodypart/L = spikey.checkembedded() - - //this is where it would deal damage, if it transfers chems it removes itself so no damage - spikey.forceMove(get_turf(L)) - transfered.visible_message(span_notice("[spikey] falls out of [transfered]!")) - -//spider webs -/datum/mutation/human/webbing - name = "Webbing Production" - desc = "Allows the user to lay webbing, and travel through it." - quality = POSITIVE - text_gain_indication = "Your skin feels webby." - instability = 15 - power = /obj/effect/proc_holder/spell/self/lay_genetic_web - -/datum/mutation/human/webbing/on_acquiring(mob/living/carbon/human/owner) - if(..()) - return - ADD_TRAIT(owner, TRAIT_WEB_WEAVER, GENETIC_MUTATION) - -/datum/mutation/human/webbing/on_losing(mob/living/carbon/human/owner) - if(..()) - return - REMOVE_TRAIT(owner, TRAIT_WEB_WEAVER, GENETIC_MUTATION) - -/obj/effect/proc_holder/spell/self/lay_genetic_web - name = "Lay Web" - desc = "Drops a web. Only you will be able to traverse your web easily, making it pretty good for keeping you safe." - clothes_req = FALSE - human_req = FALSE - charge_max = 4 SECONDS //the same time to lay a web - action_icon = 'icons/mob/actions/actions_genetic.dmi' - action_icon_state = "lay_web" - -/obj/effect/proc_holder/spell/self/lay_genetic_web/cast(list/targets, mob/user = usr) - var/failed = FALSE - if(!isturf(user.loc)) - to_chat(user, span_warning("You can't lay webs here!")) - failed = TRUE - var/turf/T = get_turf(user) - var/obj/structure/spider/stickyweb/genetic/W = locate() in T - if(W) - to_chat(user, span_warning("There's already a web here!")) - failed = TRUE - if(failed) - revert_cast(user) - return FALSE - - user.visible_message(span_notice("[user] begins to secrete a sticky substance."),span_notice("You begin to lay a web.")) - if(!do_after(user, 4 SECONDS, target = T)) - to_chat(user, span_warning("Your web spinning was interrupted!")) - return - else - new /obj/structure/spider/stickyweb/genetic(T, user) diff --git a/code/datums/mutations/antenna.dm b/code/datums/mutations/antenna.dm index 9b71063a54f727..a5b220abde633a 100644 --- a/code/datums/mutations/antenna.dm +++ b/code/datums/mutations/antenna.dm @@ -46,62 +46,81 @@ quality = POSITIVE text_gain_indication = "You hear distant voices at the corners of your mind." text_lose_indication = "The distant voices fade." - power = /obj/effect/proc_holder/spell/targeted/mindread + power_path = /datum/action/cooldown/spell/pointed/mindread instability = 40 difficulty = 8 locked = TRUE -/obj/effect/proc_holder/spell/targeted/mindread +/datum/action/cooldown/spell/pointed/mindread name = "Mindread" desc = "Read the target's mind." - charge_max = 50 - range = 7 - clothes_req = FALSE - action_icon_state = "mindread" + button_icon_state = "mindread" + cooldown_time = 5 SECONDS + spell_requirements = SPELL_REQUIRES_NO_ANTIMAGIC + antimagic_flags = MAGIC_RESISTANCE_MIND -/obj/effect/proc_holder/spell/targeted/mindread/cast(list/targets, mob/living/carbon/human/user = usr) - if(!user.can_cast_magic(MAGIC_RESISTANCE_MIND)) + ranged_mousepointer = 'icons/effects/mouse_pointers/mindswap_target.dmi' + +/datum/action/cooldown/spell/pointed/mindread/is_valid_target(atom/cast_on) + if(!isliving(cast_on)) + return FALSE + var/mob/living/living_cast_on = cast_on + if(!living_cast_on.mind) + to_chat(owner, span_warning("[cast_on] has no mind to read!")) + return FALSE + if(living_cast_on.stat == DEAD) + to_chat(owner, span_warning("[cast_on] is dead!")) + return FALSE + + return TRUE + +/datum/action/cooldown/spell/pointed/mindread/cast(mob/living/cast_on) + . = ..() + if(cast_on.can_block_magic(MAGIC_RESISTANCE_MIND, charge_cost = 0)) + to_chat(owner, span_warning("As you reach into [cast_on]'s mind, \ + you are stopped by a mental blockage. It seems you've been foiled.")) + return + + if(cast_on == owner) + to_chat(owner, span_warning("You plunge into your mind... Yep, it's your mind.")) return - for(var/mob/living/M in targets) - if(M.can_block_magic(MAGIC_RESISTANCE_MIND, charge_cost = 0)) - to_chat(usr, span_warning("As you reach into [M]'s mind, you are stopped by a mental blockage. It seems you've been foiled.")) - return - if(M.stat == DEAD) - to_chat(user, span_boldnotice("[M] is dead!")) - return - if(M.mind) - to_chat(user, span_boldnotice("You plunge into [M]'s mind...")) - if(prob(20)) - to_chat(M, span_danger("You feel something foreign enter your mind."))//chance to alert the read-ee - var/list/recent_speech = list() - var/list/say_log = list() - var/log_source = M.logging - for(var/log_type in log_source)//this whole loop puts the read-ee's say logs into say_log in an easy to access way - var/nlog_type = text2num(log_type) - if(nlog_type & LOG_SAY) - var/list/reversed = log_source[log_type] - if(islist(reversed)) - say_log = reverse_range(reversed.Copy()) - break - if(LAZYLEN(say_log)) - for(var/spoken_memory in say_log) - if(recent_speech.len >= 3)//up to 3 random lines of speech, favoring more recent speech - break - if(prob(50)) - //log messages with tags like telepathy are displayed like "(Telepathy to Ckey/(target)) "greetings"" by splitting the text by using a " delimiter we can grab just the greetings part - recent_speech[spoken_memory] = splittext(say_log[spoken_memory], "\"", 1, 0, TRUE)[3] - if(recent_speech.len) - to_chat(user, span_boldnotice("You catch some drifting memories of their past conversations...")) - for(var/spoken_memory in recent_speech) - to_chat(user, span_notice("[recent_speech[spoken_memory]]")) - if(iscarbon(M)) - var/mob/living/carbon/human/H = M - to_chat(user, span_boldnotice("You find that their intent is to [H.combat_mode ? "Harm" : "Help"]...")) - if(H.mind) - to_chat(user, span_boldnotice("You uncover that [H.p_their()] true identity is [H.mind.name].")) - else - to_chat(user, span_warning("You can't find a mind to read inside of [M]!")) + to_chat(owner, span_boldnotice("You plunge into [cast_on]'s mind...")) + if(prob(20)) + // chance to alert the read-ee + to_chat(cast_on, span_danger("You feel something foreign enter your mind.")) + + var/list/recent_speech = list() + var/list/say_log = list() + var/log_source = cast_on.logging + //this whole loop puts the read-ee's say logs into say_log in an easy to access way + for(var/log_type in log_source) + var/nlog_type = text2num(log_type) + if(nlog_type & LOG_SAY) + var/list/reversed = log_source[log_type] + if(islist(reversed)) + say_log = reverse_range(reversed.Copy()) + break + + for(var/spoken_memory in say_log) + //up to 3 random lines of speech, favoring more recent speech + if(length(recent_speech) >= 3) + break + if(prob(50)) + continue + // log messages with tags like telepathy are displayed like "(Telepathy to Ckey/(target)) "greetings""" + // by splitting the text by using a " delimiter, we can grab JUST the greetings part + recent_speech[spoken_memory] = splittext(say_log[spoken_memory], "\"", 1, 0, TRUE)[3] + + if(length(recent_speech)) + to_chat(owner, span_boldnotice("You catch some drifting memories of their past conversations...")) + for(var/spoken_memory in recent_speech) + to_chat(owner, span_notice("[recent_speech[spoken_memory]]")) + + if(iscarbon(cast_on)) + var/mob/living/carbon/carbon_cast_on = cast_on + to_chat(owner, span_boldnotice("You find that their intent is to [carbon_cast_on.combat_mode ? "harm" : "help"]...")) + to_chat(owner, span_boldnotice("You uncover that [carbon_cast_on.p_their()] true identity is [carbon_cast_on.mind.name].")) /datum/mutation/human/mindreader/New(class_ = MUT_OTHER, timer, datum/mutation/human/copymut) ..() diff --git a/code/datums/mutations/autotomy.dm b/code/datums/mutations/autotomy.dm new file mode 100644 index 00000000000000..8f7b66f0b6c34b --- /dev/null +++ b/code/datums/mutations/autotomy.dm @@ -0,0 +1,42 @@ +/datum/mutation/human/self_amputation + name = "Autotomy" + desc = "Allows a creature to voluntary discard a random appendage." + quality = POSITIVE + text_gain_indication = span_notice("Your joints feel loose.") + instability = 30 + power_path = /datum/action/cooldown/spell/self_amputation + + energy_coeff = 1 + synchronizer_coeff = 1 + +/datum/action/cooldown/spell/self_amputation + name = "Drop a limb" + desc = "Concentrate to make a random limb pop right off your body." + button_icon_state = "autotomy" + + cooldown_time = 10 SECONDS + spell_requirements = NONE + +/datum/action/cooldown/spell/self_amputation/is_valid_target(atom/cast_on) + return iscarbon(cast_on) + +/datum/action/cooldown/spell/self_amputation/cast(mob/living/carbon/cast_on) + . = ..() + if(HAS_TRAIT(cast_on, TRAIT_NODISMEMBER)) + to_chat(cast_on, span_notice("You concentrate really hard, but nothing happens.")) + return + + var/list/parts = list() + for(var/obj/item/bodypart/to_remove as anything in cast_on.bodyparts) + if(to_remove.body_zone == BODY_ZONE_HEAD || to_remove.body_zone == BODY_ZONE_CHEST) + continue + if(!to_remove.dismemberable) + continue + parts += to_remove + + if(!length(parts)) + to_chat(cast_on, span_notice("You can't shed any more limbs!")) + return + + var/obj/item/bodypart/to_remove = pick(parts) + to_remove.dismember() diff --git a/code/datums/mutations/body.dm b/code/datums/mutations/body.dm index 0abb77a6a2db31..6e9a9afa53f40e 100644 --- a/code/datums/mutations/body.dm +++ b/code/datums/mutations/body.dm @@ -218,13 +218,12 @@ glowth = new(owner) modify() +// Override modify here without a parent call, because we don't actually give an action. /datum/mutation/human/glow/modify() if(!glowth) return - var/power = GET_MUTATION_POWER(src) - - glowth.set_light_range_power_color(range * power, glow, glow_color) + glowth.set_light_range_power_color(range * GET_MUTATION_POWER(src), glow, glow_color) /// Returns the color for the glow effect /datum/mutation/human/glow/proc/glow_color() diff --git a/code/datums/mutations/cold.dm b/code/datums/mutations/cold.dm index 1dd531490acc39..a49dfa26160831 100644 --- a/code/datums/mutations/cold.dm +++ b/code/datums/mutations/cold.dm @@ -6,16 +6,18 @@ instability = 10 difficulty = 10 synchronizer_coeff = 1 - power = /obj/effect/proc_holder/spell/targeted/conjure_item/snow + power_path = /datum/action/cooldown/spell/conjure_item/snow -/obj/effect/proc_holder/spell/targeted/conjure_item/snow +/datum/action/cooldown/spell/conjure_item/snow name = "Create Snow" desc = "Concentrates cryokinetic forces to create snow, useful for snow-like construction." + button_icon_state = "snow" + + cooldown_time = 5 SECONDS + spell_requirements = NONE + item_type = /obj/item/stack/sheet/mineral/snow - charge_max = 50 delete_old = FALSE - action_icon_state = "snow" - /datum/mutation/human/cryokinesis name = "Cryokinesis" @@ -25,19 +27,17 @@ instability = 20 difficulty = 12 synchronizer_coeff = 1 - power = /obj/effect/proc_holder/spell/aimed/cryo + power_path = /datum/action/cooldown/spell/pointed/projectile/cryo -/obj/effect/proc_holder/spell/aimed/cryo +/datum/action/cooldown/spell/pointed/projectile/cryo name = "Cryobeam" desc = "This power fires a frozen bolt at a target." - charge_max = 150 - cooldown_min = 150 - clothes_req = FALSE - range = 3 - projectile_type = /obj/projectile/temp/cryo + button_icon_state = "icebeam0" + cooldown_time = 15 SECONDS + spell_requirements = NONE + antimagic_flags = NONE + base_icon_state = "icebeam" - action_icon_state = "icebeam" active_msg = "You focus your cryokinesis!" deactive_msg = "You relax." - active = FALSE - + projectile_type = /obj/projectile/temp/cryo diff --git a/code/datums/mutations/fire_breath.dm b/code/datums/mutations/fire_breath.dm new file mode 100644 index 00000000000000..9869d41283e0f4 --- /dev/null +++ b/code/datums/mutations/fire_breath.dm @@ -0,0 +1,96 @@ +/datum/mutation/human/firebreath + name = "Fire Breath" + desc = "An ancient mutation that gives lizards breath of fire." + quality = POSITIVE + difficulty = 12 + locked = TRUE + text_gain_indication = "Your throat is burning!" + text_lose_indication = "Your throat is cooling down." + power_path = /datum/action/cooldown/spell/cone/staggered/fire_breath + instability = 30 + energy_coeff = 1 + power_coeff = 1 + +/datum/mutation/human/firebreath/modify() + . = ..() + var/datum/action/cooldown/spell/cone/staggered/fire_breath/to_modify = . + if(!istype(to_modify)) // null or invalid + return + + if(GET_MUTATION_POWER(src) <= 1) // we only care about power from here on + return + + to_modify.cone_levels += 2 // Cone fwooshes further, and... + to_modify.self_throw_range += 1 // the breath throws the user back more + +/datum/action/cooldown/spell/cone/staggered/fire_breath + 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 + + school = SCHOOL_EVOCATION + cooldown_time = 40 SECONDS + invocation_type = INVOCATION_NONE + spell_requirements = NONE + antimagic_flags = NONE + + cone_levels = 3 + respect_density = TRUE + /// The range our user is thrown backwards after casting the spell + var/self_throw_range = 1 + +/datum/action/cooldown/spell/cone/staggered/fire_breath/before_cast(atom/cast_on) + . = ..() + if(. & SPELL_CANCEL_CAST) + return + + if(!iscarbon(cast_on)) + return + + var/mob/living/carbon/our_lizard = cast_on + if(!our_lizard.is_mouth_covered()) + return + + our_lizard.adjust_fire_stacks(cone_levels) + our_lizard.ignite_mob() + to_chat(our_lizard, span_warning("Something in front of your mouth catches fire!")) + +/datum/action/cooldown/spell/cone/staggered/fire_breath/after_cast(atom/cast_on) + . = ..() + if(!isliving(cast_on)) + return + + var/mob/living/living_cast_on = cast_on + // When casting, throw the caster backwards a few tiles. + var/original_dir = living_cast_on.dir + living_cast_on.throw_at( + get_edge_target_turf(living_cast_on, turn(living_cast_on.dir, 180)), + range = self_throw_range, + speed = 2, + gentle = TRUE, + ) + // Try to set us to our original direction after, so we don't end up backwards. + living_cast_on.setDir(original_dir) + +/datum/action/cooldown/spell/cone/staggered/fire_breath/calculate_cone_shape(current_level) + // This makes the cone shoot out into a 3 wide column of flames. + // You may be wondering, "that equation doesn't seem like it'd make a 3 wide column" + // well it does, and that's all that matters. + return (2 * current_level) - 1 + +/datum/action/cooldown/spell/cone/staggered/fire_breath/do_turf_cone_effect(turf/target_turf, atom/caster, level) + // Further turfs experience less exposed_temperature and exposed_volume + new /obj/effect/hotspot(target_turf) // for style + target_turf.hotspot_expose(max(500, 900 - (100 * level)), max(50, 200 - (50 * level)), 1) + +/datum/action/cooldown/spell/cone/staggered/fire_breath/do_mob_cone_effect(mob/living/target_mob, atom/caster, level) + // Further out targets take less immediate burn damage and get less fire stacks. + // The actual burn damage application is not blocked by fireproofing, like space dragons. + target_mob.apply_damage(max(10, 40 - (5 * level)), BURN, spread_damage = TRUE) + target_mob.adjust_fire_stacks(max(2, 5 - level)) + target_mob.ignite_mob() + +/datum/action/cooldown/spell/cone/staggered/firebreath/do_obj_cone_effect(obj/target_obj, atom/caster, level) + // Further out objects experience less exposed_temperature and exposed_volume + target_obj.fire_act(max(500, 900 - (100 * level)), max(50, 200 - (50 * level))) diff --git a/code/datums/mutations/holy_mutation/honorbound.dm b/code/datums/mutations/holy_mutation/honorbound.dm index 6b7eac5cb4c805..46de73bea5e60a 100644 --- a/code/datums/mutations/holy_mutation/honorbound.dm +++ b/code/datums/mutations/holy_mutation/honorbound.dm @@ -6,7 +6,7 @@ The user feels compelled to follow supposed \"rules of combat\" but in reality they physically are unable to. \ Their brain is rewired to excuse any curious inabilities that arise from this odd effect." quality = POSITIVE //so it gets carried over on revives - power = /obj/effect/proc_holder/spell/pointed/declare_evil + power_path = /datum/action/cooldown/spell/pointed/declare_evil locked = TRUE text_gain_indication = "You feel honorbound!" text_lose_indication = "You feel unshackled from your code of honor!" @@ -167,7 +167,7 @@ guilty(thrown_by) //spell checking -/datum/mutation/human/honorbound/proc/spell_check(mob/user, obj/effect/proc_holder/spell/spell_cast) +/datum/mutation/human/honorbound/proc/spell_check(mob/user, datum/action/cooldown/spell/spell_cast) SIGNAL_HANDLER punishment(user, spell_cast.school) @@ -201,72 +201,118 @@ lightningbolt(user) SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "honorbound", /datum/mood_event/holy_smite)//permanently lose your moodlet after this -/obj/effect/proc_holder/spell/pointed/declare_evil +/datum/action/cooldown/spell/pointed/declare_evil name = "Declare Evil" desc = "If someone is so obviously an evil of this world you can spend a huge amount of favor to declare them guilty." - school = SCHOOL_HOLY - charge_max = 0 - clothes_req = FALSE - range = 7 - cooldown_min = 0 + button_icon_state = "declaration" ranged_mousepointer = 'icons/effects/mouse_pointers/honorbound.dmi' - action_icon_state = "declaration" + + school = SCHOOL_HOLY + cooldown_time = 0 + + invocation = "This is an error!" + invocation_type = INVOCATION_SHOUT + spell_requirements = SPELL_REQUIRES_HUMAN + active_msg = "You prepare to declare a sinner..." deactive_msg = "You decide against a declaration." -/obj/effect/proc_holder/spell/pointed/declare_evil/cast(list/targets, mob/living/carbon/human/user, silent = FALSE) - if(!ishuman(user)) - return FALSE - var/datum/mutation/human/honorbound/honormut = user.dna.check_mutation(/datum/mutation/human/honorbound) - var/datum/religion_sect/honorbound/honorsect = GLOB.religious_sect - if(honorsect.favor < 150) - to_chat(user, span_warning("You need at least 150 favor to declare someone evil!")) - return FALSE - if(!honormut) + /// The amount of favor required to declare on someone + var/required_favor = 150 + /// A ref to our owner's honorbound mutation + var/datum/mutation/human/honorbound/honor_mutation + /// The declaration that's shouted in invocation. Set in New() + var/declaration = "By the divine light of my deity, you are an evil of this world that must be wrought low!" + +/datum/action/cooldown/spell/pointed/declare_evil/New() + . = ..() + declaration = "By the divine light of [GLOB.deity], you are an evil of this world that must be wrought low!" + +/datum/action/cooldown/spell/pointed/declare_evil/Destroy() + // If we had an owner, Destroy() called Remove(), and already handled this + if(honor_mutation) + UnregisterSignal(honor_mutation, COMSIG_PARENT_QDELETING) + honor_mutation = null + return ..() + +/datum/action/cooldown/spell/pointed/declare_evil/Grant(mob/grant_to) + if(!ishuman(grant_to)) return FALSE - if(!targets.len) - if(!silent) - to_chat(user, span_warning("Nobody to declare evil here!")) + + var/mob/living/carbon/human/human_owner = grant_to + var/datum/mutation/human/honorbound/honor_mut = human_owner.dna?.check_mutation(/datum/mutation/human/honorbound) + if(QDELETED(honor_mut)) return FALSE - if(targets.len > 1) - if(!silent) - to_chat(user, span_warning("Too many people to declare! Pick ONE!")) + + RegisterSignal(honor_mut, COMSIG_PARENT_QDELETING, .proc/on_honor_mutation_lost) + honor_mutation = honor_mut + return ..() + +/datum/action/cooldown/spell/pointed/declare_evil/Remove(mob/living/remove_from) + . = ..() + UnregisterSignal(honor_mutation, COMSIG_PARENT_QDELETING) + honor_mutation = null + +/// If we lose our honor mutation somehow, self-delete (and clear references) +/datum/action/cooldown/spell/pointed/declare_evil/proc/on_honor_mutation_lost(datum/source) + SIGNAL_HANDLER + + qdel(src) + +/datum/action/cooldown/spell/pointed/declare_evil/can_cast_spell(feedback = TRUE) + . = ..() + if(!.) return FALSE - var/declaration_message = "[targets[1]]! By the divine light of [GLOB.deity], You are an evil of this world that must be wrought low!" - if(!user.can_speak(declaration_message)) - to_chat(user, span_warning("You can't get the declaration out!")) + + // This shouldn't technically be a possible state, but you never know + if(!honor_mutation) return FALSE - if(!can_target(targets[1], user, silent)) + if(GLOB.religious_sect.favor < required_favor) + if(feedback) + to_chat(owner, span_warning("You need at least 150 favor to declare someone evil!")) return FALSE - GLOB.religious_sect.adjust_favor(-150, user) - user.say(declaration_message) - honormut.guilty(targets[1], declaration = TRUE) + return TRUE -/obj/effect/proc_holder/spell/pointed/declare_evil/can_target(atom/target, mob/user, silent) +/datum/action/cooldown/spell/pointed/declare_evil/is_valid_target(atom/cast_on) . = ..() if(!.) return FALSE - if(!isliving(target)) - if(!silent) - to_chat(user, span_warning("You can only declare living beings evil!")) + if(!isliving(cast_on)) + to_chat(owner, span_warning("You can only declare living beings evil!")) return FALSE - var/mob/living/victim = target - if(victim.stat == DEAD) - if(!silent) - to_chat(user, span_warning("Declaration on the dead? Really?")) + + var/mob/living/living_cast_on = cast_on + if(living_cast_on.stat == DEAD) + to_chat(owner, span_warning("Declaration on the dead? Really?")) return FALSE - var/datum/mind/guilty_conscience = victim.mind - if(!victim.key ||!guilty_conscience) //sec and medical are immune to becoming guilty through attack (we don't check holy because holy shouldn't be able to attack eachother anyways) - if(!silent) - to_chat(user, span_warning("There is no evil a vacant mind can do.")) + + // sec and medical are immune to becoming guilty through attack + // (we don't check holy, because holy shouldn't be able to attack eachother anyways) + if(!living_cast_on.key || !living_cast_on.mind) + to_chat(owner, span_warning("There is no evil a vacant mind can do.")) return FALSE - if(guilty_conscience.holy_role)//also handles any kind of issues with self declarations - if(!silent) - to_chat(user, span_warning("Followers of [GLOB.deity] cannot be evil!")) + + // also handles any kind of issues with self declarations + if(living_cast_on.mind.holy_role) + to_chat(owner, span_warning("Followers of [GLOB.deity] cannot be evil!")) return FALSE - if(guilty_conscience.assigned_role.departments_bitflags & DEPARTMENT_BITFLAG_SECURITY) - if(!silent) - to_chat(user, span_warning("Members of security are uncorruptable! You cannot declare one evil!")) + + // cannot declare security as evil + if(living_cast_on.mind.assigned_role.departments_bitflags & DEPARTMENT_BITFLAG_SECURITY) + to_chat(owner, span_warning("Members of security are uncorruptable! You cannot declare one evil!")) return FALSE + return TRUE + +/datum/action/cooldown/spell/pointed/declare_evil/before_cast(mob/living/cast_on) + . = ..() + if(. & SPELL_CANCEL_CAST) + return + + invocation = "[cast_on]! [declaration]" + +/datum/action/cooldown/spell/pointed/declare_evil/cast(mob/living/cast_on) + . = ..() + GLOB.religious_sect.adjust_favor(-required_favor, owner) + honor_mutation.guilty(cast_on, declaration = TRUE) diff --git a/code/datums/mutations/olfaction.dm b/code/datums/mutations/olfaction.dm new file mode 100644 index 00000000000000..e014806233a7be --- /dev/null +++ b/code/datums/mutations/olfaction.dm @@ -0,0 +1,139 @@ +/datum/mutation/human/olfaction + name = "Transcendent Olfaction" + desc = "Your sense of smell is comparable to that of a canine." + quality = POSITIVE + difficulty = 12 + text_gain_indication = "Smells begin to make more sense..." + text_lose_indication = "Your sense of smell goes back to normal." + power_path = /datum/action/cooldown/spell/olfaction + instability = 30 + synchronizer_coeff = 1 + +/datum/mutation/human/olfaction/modify() + . = ..() + var/datum/action/cooldown/spell/olfaction/to_modify = . + if(!istype(to_modify)) // null or invalid + return + + to_modify.sensitivity = GET_MUTATION_SYNCHRONIZER(src) + +/datum/action/cooldown/spell/olfaction + name = "Remember the Scent" + desc = "Get a scent off of the item you're currently holding to track it. \ + With an empty hand, you'll track the scent you've remembered." + button_icon_state = "nose" + + cooldown_time = 10 SECONDS + spell_requirements = NONE + + /// Weakref to the mob we're tracking + var/datum/weakref/tracking_ref + /// Our nose's sensitivity + var/sensitivity = 1 + +/datum/action/cooldown/spell/olfaction/is_valid_target(atom/cast_on) + if(!isliving(cast_on)) + return FALSE + + var/mob/living/living_cast_on = cast_on + if(ishuman(living_cast_on) && !living_cast_on.get_bodypart(BODY_ZONE_HEAD)) + to_chat(owner, span_warning("You have no nose!")) + return FALSE + + return TRUE + +/datum/action/cooldown/spell/olfaction/cast(mob/living/cast_on) + . = ..() + // Can we sniff? is there miasma in the air? + var/datum/gas_mixture/air = cast_on.loc.return_air() + var/list/cached_gases = air.gases + + if(cached_gases[/datum/gas/miasma]) + cast_on.adjust_disgust(sensitivity * 45) + to_chat(cast_on, span_warning("With your overly sensitive nose, \ + you get a whiff of stench and feel sick! Try moving to a cleaner area!")) + return + + var/atom/sniffed = cast_on.get_active_held_item() + if(sniffed) + pick_up_target(cast_on, sniffed) + else + follow_target(cast_on) + +/// Attempt to pick up a new target based on the fingerprints on [sniffed]. +/datum/action/cooldown/spell/olfaction/proc/pick_up_target(mob/living/caster, atom/sniffed) + var/mob/living/carbon/old_target = tracking_ref?.resolve() + var/list/possibles = list() + var/list/prints = GET_ATOM_FINGERPRINTS(sniffed) + if(prints) + for(var/mob/living/carbon/to_check as anything in GLOB.carbon_list) + if(prints[md5(to_check.dna?.unique_identity)]) + possibles |= to_check + + // There are no finger prints on the atom, so nothing to track + if(!length(possibles)) + to_chat(caster, span_warning("Despite your best efforts, there are no scents to be found on [sniffed]...")) + return + + var/mob/living/carbon/new_target = tgui_input_list(caster, "Scent to remember", "Scent Tracking", sort_names(possibles)) + if(QDELETED(src) || QDELETED(caster)) + return + + if(QDELETED(new_target)) + // We don't have a new target OR an old target + if(QDELETED(old_target)) + to_chat(caster, span_warning("You decide against remembering any scents. \ + Instead, you notice your own nose in your peripheral vision. \ + This goes on to remind you of that one time you started breathing manually and couldn't stop. \ + What an awful day that was.")) + tracking_ref = null + + // We don't have a new target, but we have an old target to fall back on + else + to_chat(caster, span_notice("You return to tracking [old_target]. The hunt continues.")) + on_the_trail(caster) + return + + // We have a new target to track + to_chat(caster, span_notice("You pick up the scent of [new_target]. The hunt begins.")) + tracking_ref = WEAKREF(new_target) + on_the_trail(caster) + +/// Attempt to follow our current tracking target. +/datum/action/cooldown/spell/olfaction/proc/follow_target(mob/living/caster) + var/mob/living/carbon/current_target = tracking_ref?.resolve() + // Either our weakref failed to resolve (our target's gone), + // or we never had a target in the first place + if(QDELETED(current_target)) + to_chat(caster, span_warning("You're not holding anything to smell, \ + and you haven't smelled anything you can track. You smell your skin instead; it's kinda salty.")) + tracking_ref = null + return + + on_the_trail(caster) + +/// Actually go through and give the user a hint of the direction our target is. +/datum/action/cooldown/spell/olfaction/proc/on_the_trail(mob/living/caster) + var/mob/living/carbon/current_target = tracking_ref?.resolve() + if(!current_target) + to_chat(caster, span_warning("You're not tracking a scent, but the game thought you were. \ + Something's gone wrong! Report this as a bug.")) + stack_trace("[type] - on_the_trail was called when no tracking target was set.") + tracking_ref = null + return + + if(current_target == caster) + to_chat(caster, span_warning("You smell out the trail to yourself. Yep, it's you.")) + return + + if(caster.z < current_target.z) + to_chat(caster, span_warning("The trail leads... way up above you? Huh. They must be really, really far away.")) + return + + else if(caster.z > current_target.z) + to_chat(caster, span_warning("The trail leads... way down below you? Huh. They must be really, really far away.")) + return + + var/direction_text = span_bold("[dir2text(get_dir(caster, current_target))]") + if(direction_text) + to_chat(caster, span_notice("You consider [current_target]'s scent. The trail leads [direction_text].")) diff --git a/code/datums/mutations/passive.dm b/code/datums/mutations/passive.dm index 6024d212be00cc..1c6d130b9e5743 100644 --- a/code/datums/mutations/passive.dm +++ b/code/datums/mutations/passive.dm @@ -24,8 +24,10 @@ if(..()) return ADD_TRAIT(owner, TRAIT_ADVANCEDTOOLUSER, GENETIC_MUTATION) + ADD_TRAIT(owner, TRAIT_LITERATE, GENETIC_MUTATION) /datum/mutation/human/clever/on_losing(mob/living/carbon/human/owner) if(..()) return REMOVE_TRAIT(owner, TRAIT_ADVANCEDTOOLUSER, GENETIC_MUTATION) + REMOVE_TRAIT(owner, TRAIT_LITERATE, GENETIC_MUTATION) diff --git a/code/datums/mutations/sight.dm b/code/datums/mutations/sight.dm index bc4995cb485886..eb652125c2a613 100644 --- a/code/datums/mutations/sight.dm +++ b/code/datums/mutations/sight.dm @@ -15,7 +15,6 @@ return owner.cure_nearsighted(GENETIC_MUTATION) - ///Blind makes you blind. Who knew? /datum/mutation/human/blind name = "Blindness" @@ -45,61 +44,67 @@ synchronizer_coeff = 1 power_coeff = 1 energy_coeff = 1 - power = /obj/effect/proc_holder/spell/self/thermal_vision_activate + power_path = /datum/action/cooldown/spell/thermal_vision + +/datum/mutation/human/thermal/on_losing(mob/living/carbon/human/owner) + if(..()) + return + // Something went wront and we still have the thermal vision from our power, no cheating. + if(HAS_TRAIT_FROM(owner, TRAIT_THERMAL_VISION, GENETIC_MUTATION)) + REMOVE_TRAIT(owner, TRAIT_THERMAL_VISION, GENETIC_MUTATION) + owner.update_sight() /datum/mutation/human/thermal/modify() - if(!power) - return FALSE - var/obj/effect/proc_holder/spell/self/thermal_vision_activate/modified_power = power - modified_power.eye_damage = 10 * GET_MUTATION_SYNCHRONIZER(src) - modified_power.thermal_duration = 10 * GET_MUTATION_POWER(src) - modified_power.charge_max = (25 * GET_MUTATION_ENERGY(src)) SECONDS + . = ..() + var/datum/action/cooldown/spell/thermal_vision/to_modify = . + if(!istype(to_modify)) // null or invalid + return + + to_modify.eye_damage = 10 * GET_MUTATION_SYNCHRONIZER(src) + to_modify.thermal_duration = 10 * GET_MUTATION_POWER(src) -/obj/effect/proc_holder/spell/self/thermal_vision_activate +/datum/action/cooldown/spell/thermal_vision name = "Activate Thermal Vision" desc = "You can see thermal signatures, at the cost of your eyesight." - charge_max = 25 SECONDS - var/eye_damage = 10 - var/thermal_duration = 10 - clothes_req = FALSE - action_icon = 'icons/mob/actions/actions_changeling.dmi' - action_icon_state = "augmented_eyesight" - -/obj/effect/proc_holder/spell/self/thermal_vision_activate/cast(list/targets, mob/user = usr) - . = ..() + icon_icon = 'icons/mob/actions/actions_changeling.dmi' + button_icon_state = "augmented_eyesight" - if(HAS_TRAIT(user,TRAIT_THERMAL_VISION)) - return + cooldown_time = 25 SECONDS + spell_requirements = NONE - ADD_TRAIT(user, TRAIT_THERMAL_VISION, GENETIC_MUTATION) - user.update_sight() - to_chat(user, text("You focus your eyes intensely, as your vision becomes filled with heat signatures.")) - - addtimer(CALLBACK(src, .proc/thermal_vision_deactivate), thermal_duration SECONDS) + /// How much eye damage is given on cast + var/eye_damage = 10 + /// The duration of the thermal vision + var/thermal_duration = 10 SECONDS -/obj/effect/proc_holder/spell/self/thermal_vision_activate/proc/thermal_vision_deactivate(mob/user = usr) +/datum/action/cooldown/spell/thermal_vision/Remove(mob/living/remove_from) + REMOVE_TRAIT(remove_from, TRAIT_THERMAL_VISION, GENETIC_MUTATION) + remove_from.update_sight() + return ..() +/datum/action/cooldown/spell/thermal_vision/is_valid_target(atom/cast_on) + return isliving(cast_on) && !HAS_TRAIT(cast_on, TRAIT_THERMAL_VISION) - if(!HAS_TRAIT_FROM(user,TRAIT_THERMAL_VISION, GENETIC_MUTATION)) - return - - REMOVE_TRAIT(user, TRAIT_THERMAL_VISION, GENETIC_MUTATION) - user.update_sight() - to_chat(user, text("You blink a few times, your vision returning to normal as a dull pain settles in your eyes.")) +/datum/action/cooldown/spell/thermal_vision/cast(mob/living/cast_on) + . = ..() + ADD_TRAIT(cast_on, TRAIT_THERMAL_VISION, GENETIC_MUTATION) + cast_on.update_sight() + to_chat(cast_on, span_info("You focus your eyes intensely, as your vision becomes filled with heat signatures.")) + addtimer(CALLBACK(src, .proc/deactivate, cast_on), thermal_duration) - var/mob/living/carbon/user_mob = user - if(!istype(user_mob)) +/datum/action/cooldown/spell/thermal_vision/proc/deactivate(mob/living/cast_on) + if(QDELETED(cast_on) || !HAS_TRAIT_FROM(cast_on, TRAIT_THERMAL_VISION, GENETIC_MUTATION)) return - user_mob.adjustOrganLoss(ORGAN_SLOT_EYES, eye_damage) + REMOVE_TRAIT(cast_on, TRAIT_THERMAL_VISION, GENETIC_MUTATION) + cast_on.update_sight() + to_chat(cast_on, span_info("You blink a few times, your vision returning to normal as a dull pain settles in your eyes.")) -/datum/mutation/human/thermal/on_losing(mob/living/carbon/human/owner) - if(..()) - return - REMOVE_TRAIT(owner, TRAIT_THERMAL_VISION, GENETIC_MUTATION) - owner.update_sight() + if(iscarbon(cast_on)) + var/mob/living/carbon/carbon_cast_on = cast_on + carbon_cast_on.adjustOrganLoss(ORGAN_SLOT_EYES, eye_damage) ///X-ray Vision lets you see through walls. /datum/mutation/human/xray @@ -174,3 +179,20 @@ name = "beam" icon = 'icons/effects/genetics.dmi' icon_state = "eyelasers" + +/datum/mutation/human/illiterate + name = "Illiterate" + desc = "Causes a severe case of Aphasia that prevents reading or writing." + quality = NEGATIVE + text_gain_indication = "You feel unable to read or write." + text_lose_indication = "You feel able to read and write again." + +/datum/mutation/human/illiterate/on_acquiring(mob/living/carbon/human/owner) + if(..()) + return + ADD_TRAIT(owner, TRAIT_ILLITERATE, GENETIC_MUTATION) + +/datum/mutation/human/illiterate/on_losing(mob/living/carbon/human/owner) + if(..()) + return + REMOVE_TRAIT(owner, TRAIT_ILLITERATE, GENETIC_MUTATION) diff --git a/code/datums/mutations/telepathy.dm b/code/datums/mutations/telepathy.dm new file mode 100644 index 00000000000000..8619c2bddc476f --- /dev/null +++ b/code/datums/mutations/telepathy.dm @@ -0,0 +1,10 @@ +/datum/mutation/human/telepathy + name = "Telepathy" + desc = "A rare mutation that allows the user to telepathically communicate to others." + quality = POSITIVE + text_gain_indication = "You can hear your own voice echoing in your mind!" + text_lose_indication = "You don't hear your mind echo anymore." + difficulty = 12 + power_path = /datum/action/cooldown/spell/list_target/telepathy + instability = 10 + energy_coeff = 1 diff --git a/code/datums/mutations/tongue_spike.dm b/code/datums/mutations/tongue_spike.dm new file mode 100644 index 00000000000000..1bd02df0b3e2bb --- /dev/null +++ b/code/datums/mutations/tongue_spike.dm @@ -0,0 +1,181 @@ +/datum/mutation/human/tongue_spike + name = "Tongue Spike" + desc = "Allows a creature to voluntary shoot their tongue out as a deadly weapon." + quality = POSITIVE + text_gain_indication = span_notice("Your feel like you can throw your voice.") + instability = 15 + power_path = /datum/action/cooldown/spell/tongue_spike + + energy_coeff = 1 + synchronizer_coeff = 1 + +/datum/action/cooldown/spell/tongue_spike + name = "Launch spike" + desc = "Shoot your tongue out in the direction you're facing, embedding it and dealing damage until they remove it." + icon_icon = 'icons/mob/actions/actions_genetic.dmi' + button_icon_state = "spike" + + cooldown_time = 10 SECONDS + spell_requirements = SPELL_REQUIRES_HUMAN + + /// The type-path to what projectile we spawn to throw at someone. + var/spike_path = /obj/item/hardened_spike + +/datum/action/cooldown/spell/tongue_spike/is_valid_target(atom/cast_on) + return iscarbon(cast_on) + +/datum/action/cooldown/spell/tongue_spike/cast(mob/living/carbon/cast_on) + . = ..() + if(HAS_TRAIT(cast_on, TRAIT_NODISMEMBER)) + to_chat(cast_on, span_notice("You concentrate really hard, but nothing happens.")) + return + + var/obj/item/organ/internal/tongue/to_fire = locate() in cast_on.internal_organs + if(!to_fire) + to_chat(cast_on, span_notice("You don't have a tongue to shoot!")) + return + + to_fire.Remove(cast_on, special = TRUE) + var/obj/item/hardened_spike/spike = new spike_path(get_turf(cast_on), cast_on) + to_fire.forceMove(spike) + spike.throw_at(get_edge_target_turf(cast_on, cast_on.dir), 14, 4, cast_on) + +/obj/item/hardened_spike + name = "biomass spike" + desc = "Hardened biomass, shaped into a spike. Very pointy!" + icon_state = "tonguespike" + force = 2 + throwforce = 15 //15 + 2 (WEIGHT_CLASS_SMALL) * 4 (EMBEDDED_IMPACT_PAIN_MULTIPLIER) = i didnt do the math + throw_speed = 4 + embedding = list( + "embedded_pain_multiplier" = 4, + "embed_chance" = 100, + "embedded_fall_chance" = 0, + "embedded_ignore_throwspeed_threshold" = TRUE, + ) + w_class = WEIGHT_CLASS_SMALL + sharpness = SHARP_POINTY + custom_materials = list(/datum/material/biomass = 500) + /// What mob "fired" our tongue + var/datum/weakref/fired_by_ref + /// if we missed our target + var/missed = TRUE + +/obj/item/hardened_spike/Initialize(mapload, mob/living/carbon/source) + . = ..() + src.fired_by_ref = WEAKREF(source) + addtimer(CALLBACK(src, .proc/check_embedded), 5 SECONDS) + +/obj/item/hardened_spike/proc/check_embedded() + if(missed) + unembedded() + +/obj/item/hardened_spike/embedded(atom/target) + if(isbodypart(target)) + missed = FALSE + +/obj/item/hardened_spike/unembedded() + visible_message(span_warning("[src] cracks and twists, changing shape!")) + for(var/obj/tongue as anything in contents) + tongue.forceMove(get_turf(src)) + + qdel(src) + +/datum/mutation/human/tongue_spike/chem + name = "Chem Spike" + desc = "Allows a creature to voluntary shoot their tongue out as biomass, allowing a long range transfer of chemicals." + quality = POSITIVE + text_gain_indication = span_notice("Your feel like you can really connect with people by throwing your voice.") + instability = 15 + locked = TRUE + power_path = /datum/action/cooldown/spell/tongue_spike/chem + energy_coeff = 1 + synchronizer_coeff = 1 + +/datum/action/cooldown/spell/tongue_spike/chem + name = "Launch chem spike" + desc = "Shoot your tongue out in the direction you're facing, \ + embedding it for a very small amount of damage. \ + While the other person has the spike embedded, \ + you can transfer your chemicals to them." + button_icon_state = "spikechem" + + spike_path = /obj/item/hardened_spike/chem + +/obj/item/hardened_spike/chem + name = "chem spike" + desc = "Hardened biomass, shaped into... something." + icon_state = "tonguespikechem" + throwforce = 2 //2 + 2 (WEIGHT_CLASS_SMALL) * 0 (EMBEDDED_IMPACT_PAIN_MULTIPLIER) = i didnt do the math again but very low or smthin + embedding = list( + "embedded_pain_multiplier" = 0, + "embed_chance" = 100, + "embedded_fall_chance" = 0, + "embedded_pain_chance" = 0, + "embedded_ignore_throwspeed_threshold" = TRUE, //never hurts once it's in you + ) + /// Whether the tongue's already embedded in a target once before + var/embedded_once_alread = FALSE + +/obj/item/hardened_spike/chem/embedded(mob/living/carbon/human/embedded_mob) + if(embedded_once_alread) + return + embedded_once_alread = TRUE + + var/mob/living/carbon/fired_by = fired_by_ref?.resolve() + if(!fired_by) + return + + var/datum/action/send_chems/chem_action = new(src) + chem_action.transfered_ref = WEAKREF(embedded_mob) + chem_action.Grant(fired_by) + + to_chat(fired_by, span_notice("Link established! Use the \"Transfer Chemicals\" ability \ + to send your chemicals to the linked target!")) + +/obj/item/hardened_spike/chem/unembedded() + var/mob/living/carbon/fired_by = fired_by_ref?.resolve() + if(fired_by) + to_chat(fired_by, span_warning("Link lost!")) + var/datum/action/send_chems/chem_action = locate() in fired_by.actions + QDEL_NULL(chem_action) + + return ..() + +/datum/action/send_chems + name = "Transfer Chemicals" + desc = "Send all of your reagents into whomever the chem spike is embedded in. One use." + background_icon_state = "bg_spell" + icon_icon = 'icons/mob/actions/actions_genetic.dmi' + button_icon_state = "spikechemswap" + check_flags = AB_CHECK_CONSCIOUS + + /// Weakref to the mob target that we transfer chemicals to on activation + var/datum/weakref/transfered_ref + +/datum/action/send_chems/New(Target) + . = ..() + if(!istype(target, /obj/item/hardened_spike/chem)) + qdel(src) + +/datum/action/send_chems/Trigger(trigger_flags) + . = ..() + if(!.) + return FALSE + if(!ishuman(owner) || !owner.reagents) + return FALSE + var/mob/living/carbon/human/transferer = owner + var/mob/living/carbon/human/transfered = transfered_ref?.resolve() + if(!ishuman(transfered)) + return FALSE + + to_chat(transfered, span_warning("You feel a tiny prick!")) + transferer.reagents.trans_to(transfered, transferer.reagents.total_volume, 1, 1, 0, transfered_by = transferer) + + var/obj/item/hardened_spike/chem/chem_spike = target + var/obj/item/bodypart/spike_location = chem_spike.check_embedded() + + //this is where it would deal damage, if it transfers chems it removes itself so no damage + chem_spike.forceMove(get_turf(spike_location)) + chem_spike.visible_message(span_notice("[chem_spike] falls out of [spike_location]!")) + return TRUE diff --git a/code/datums/mutations/touch.dm b/code/datums/mutations/touch.dm index 951d6edc6a70a2..4328e397c6a8b9 100644 --- a/code/datums/mutations/touch.dm +++ b/code/datums/mutations/touch.dm @@ -6,46 +6,49 @@ difficulty = 16 text_gain_indication = "You feel power flow through your hands." text_lose_indication = "The energy in your hands subsides." - power = /obj/effect/proc_holder/spell/targeted/touch/shock + power_path = /datum/action/cooldown/spell/touch/shock instability = 30 -/obj/effect/proc_holder/spell/targeted/touch/shock +/datum/action/cooldown/spell/touch/shock name = "Shock Touch" desc = "Channel electricity to your hand to shock people with." - drawmessage = "You channel electricity into your hand." - dropmessage = "You let the electricity from your hand dissipate." + button_icon_state = "zap" + sound = 'sound/weapons/zapbang.ogg' + cooldown_time = 10 SECONDS + invocation_type = INVOCATION_NONE + spell_requirements = NONE + hand_path = /obj/item/melee/touch_attack/shock - charge_max = 100 - clothes_req = FALSE - action_icon_state = "zap" + draw_message = span_notice("You channel electricity into your hand.") + drop_message = span_notice("You let the electricity from your hand dissipate.") + +/datum/action/cooldown/spell/touch/shock/cast_on_hand_hit(obj/item/melee/touch_attack/hand, atom/victim, mob/living/carbon/caster) + if(iscarbon(victim)) + var/mob/living/carbon/carbon_victim = victim + if(carbon_victim.electrocute_act(15, caster, 1, SHOCK_NOGLOVES | SHOCK_NOSTUN))//doesnt stun. never let this stun + carbon_victim.dropItemToGround(carbon_victim.get_active_held_item()) + carbon_victim.dropItemToGround(carbon_victim.get_inactive_held_item()) + carbon_victim.adjust_timed_status_effect(15 SECONDS, /datum/status_effect/confusion) + carbon_victim.visible_message( + span_danger("[caster] electrocutes [victim]!"), + span_userdanger("[caster] electrocutes you!"), + ) + return TRUE + + else if(isliving(victim)) + var/mob/living/living_victim = victim + if(living_victim.electrocute_act(15, caster, 1, SHOCK_NOSTUN)) + living_victim.visible_message( + span_danger("[caster] electrocutes [victim]!"), + span_userdanger("[caster] electrocutes you!"), + ) + return TRUE + + to_chat(caster, span_warning("The electricity doesn't seem to affect [victim]...")) + return TRUE /obj/item/melee/touch_attack/shock name = "\improper shock touch" desc = "This is kind of like when you rub your feet on a shag rug so you can zap your friends, only a lot less safe." - catchphrase = null - on_use_sound = 'sound/weapons/zapbang.ogg' icon_state = "zapper" inhand_icon_state = "zapper" - -/obj/item/melee/touch_attack/shock/afterattack(atom/target, mob/living/carbon/user, proximity) - if(!proximity) - return - if(iscarbon(target)) - var/mob/living/carbon/C = target - if(C.electrocute_act(15, user, 1, SHOCK_NOGLOVES | SHOCK_NOSTUN))//doesnt stun. never let this stun - C.dropItemToGround(C.get_active_held_item()) - C.dropItemToGround(C.get_inactive_held_item()) - C.adjust_timed_status_effect(15 SECONDS, /datum/status_effect/confusion) - C.visible_message(span_danger("[user] electrocutes [target]!"),span_userdanger("[user] electrocutes you!")) - return ..() - else - user.visible_message(span_warning("[user] fails to electrocute [target]!")) - return ..() - else if(isliving(target)) - var/mob/living/L = target - L.electrocute_act(15, user, 1, SHOCK_NOSTUN) - L.visible_message(span_danger("[user] electrocutes [target]!"),span_userdanger("[user] electrocutes you!")) - return ..() - else - to_chat(user,span_warning("The electricity doesn't seem to affect [target]...")) - return ..() diff --git a/code/datums/mutations/void_magnet.dm b/code/datums/mutations/void_magnet.dm new file mode 100644 index 00000000000000..7900b4c099f176 --- /dev/null +++ b/code/datums/mutations/void_magnet.dm @@ -0,0 +1,43 @@ +/datum/mutation/human/void + name = "Void Magnet" + desc = "A rare genome that attracts odd forces not usually observed." + quality = MINOR_NEGATIVE //upsides and downsides + text_gain_indication = "You feel a heavy, dull force just beyond the walls watching you." + instability = 30 + power_path = /datum/action/cooldown/spell/void + energy_coeff = 1 + synchronizer_coeff = 1 + +/datum/mutation/human/void/on_life(delta_time, times_fired) + // Move this onto the spell itself at some point? + var/datum/action/cooldown/spell/void/curse = locate(power_path) in owner + if(!curse) + remove() + return + + if(!curse.is_valid_target(owner)) + return + + //very rare, but enough to annoy you hopefully. + 0.5 probability for every 10 points lost in stability + if(DT_PROB((0.25 + ((100 - dna.stability) / 40)) * GET_MUTATION_SYNCHRONIZER(src), delta_time)) + curse.cast(owner) + +/datum/action/cooldown/spell/void + name = "Convoke Void" //magic the gathering joke here + desc = "A rare genome that attracts odd forces not usually observed. May sometimes pull you in randomly." + button_icon_state = "void_magnet" + + school = SCHOOL_EVOCATION + cooldown_time = 1 MINUTES + + invocation = "DOOOOOOOOOOOOOOOOOOOOM!!!" + invocation_type = INVOCATION_SHOUT + spell_requirements = NONE + antimagic_flags = NONE + +/datum/action/cooldown/spell/void/is_valid_target(atom/cast_on) + return isturf(cast_on.loc) + +/datum/action/cooldown/spell/void/cast(atom/cast_on) + . = ..() + new /obj/effect/immortality_talisman/void(get_turf(cast_on), cast_on) diff --git a/code/datums/mutations/webbing.dm b/code/datums/mutations/webbing.dm new file mode 100644 index 00000000000000..2d696938e6ca55 --- /dev/null +++ b/code/datums/mutations/webbing.dm @@ -0,0 +1,52 @@ +//spider webs +/datum/mutation/human/webbing + name = "Webbing Production" + desc = "Allows the user to lay webbing, and travel through it." + quality = POSITIVE + text_gain_indication = "Your skin feels webby." + instability = 15 + power_path = /datum/action/cooldown/spell/lay_genetic_web + +/datum/mutation/human/webbing/on_acquiring(mob/living/carbon/human/owner) + if(..()) + return + ADD_TRAIT(owner, TRAIT_WEB_WEAVER, GENETIC_MUTATION) + +/datum/mutation/human/webbing/on_losing(mob/living/carbon/human/owner) + if(..()) + return + REMOVE_TRAIT(owner, TRAIT_WEB_WEAVER, GENETIC_MUTATION) + +// In the future this could be unified with the spider's web action +/datum/action/cooldown/spell/lay_genetic_web + name = "Lay Web" + desc = "Drops a web. Only you will be able to traverse your web easily, making it pretty good for keeping you safe." + icon_icon = 'icons/mob/actions/actions_genetic.dmi' + button_icon_state = "lay_web" + + cooldown_time = 4 SECONDS //the same time to lay a web + spell_requirements = NONE + + /// How long it takes to lay a web + var/webbing_time = 4 SECONDS + /// The path of web that we create + var/web_path = /obj/structure/spider/stickyweb/genetic + +/datum/action/cooldown/spell/lay_genetic_web/cast(atom/cast_on) + var/turf/web_spot = cast_on.loc + if(!isturf(web_spot) || (locate(web_path) in web_spot)) + to_chat(cast_on, span_warning("You can't lay webs here!")) + reset_spell_cooldown() + return FALSE + + cast_on.visible_message( + span_notice("[cast_on] begins to secrete a sticky substance."), + span_notice("You begin to lay a web."), + ) + + if(!do_after(cast_on, webbing_time, target = web_spot)) + to_chat(cast_on, span_warning("Your web spinning was interrupted!")) + return + + new web_path(web_spot, cast_on) + return ..() diff --git a/code/datums/proximity_monitor/fields/timestop.dm b/code/datums/proximity_monitor/fields/timestop.dm index c9c544dff0d971..bde85c6f4d9e8a 100644 --- a/code/datums/proximity_monitor/fields/timestop.dm +++ b/code/datums/proximity_monitor/fields/timestop.dm @@ -28,12 +28,12 @@ freezerange = radius for(var/A in immune_atoms) immune[A] = TRUE - for(var/mob/living/L in GLOB.player_list) - if(locate(/obj/effect/proc_holder/spell/aoe_turf/timestop) in L.mind.spell_list) //People who can stop time are immune to its effects - immune[L] = TRUE - for(var/mob/living/simple_animal/hostile/guardian/G in GLOB.parasites) - if(G.summoner && locate(/obj/effect/proc_holder/spell/aoe_turf/timestop) in G.summoner.mind.spell_list) //It would only make sense that a person's stand would also be immune. - immune[G] = TRUE + for(var/mob/living/to_check in GLOB.player_list) + if(HAS_TRAIT(to_check, TRAIT_TIME_STOP_IMMUNE)) + immune[to_check] = TRUE + for(var/mob/living/simple_animal/hostile/guardian/stand in GLOB.parasites) + if(stand.summoner && HAS_TRAIT(stand.summoner, TRAIT_TIME_STOP_IMMUNE)) //It would only make sense that a person's stand would also be immune. + immune[stand] = TRUE if(start) INVOKE_ASYNC(src, .proc/timestop) diff --git a/code/datums/ruins/space.dm b/code/datums/ruins/space.dm index c9c814fd1e79f4..c5f5b72f2f012a 100644 --- a/code/datums/ruins/space.dm +++ b/code/datums/ruins/space.dm @@ -66,12 +66,12 @@ description = "A once-bustling tradestation that handled imports and exports from nearby stations now lays eerily dormant. \ The last received message was a distress call from one of the on-board officers, but we had no success in making contact again." -/datum/map_template/ruin/space/derelict1 - id = "derelict1" - suffix = "derelict1.dmm" - name = "Derelict 1" - description = "Nothing to see here citizen, move along, certainly no xeno outbreaks on this piece of station debris. That purple stuff? It's uh... station nectar. \ - It's a top secret research installation." +/datum/map_template/ruin/space/derelict_sulaco + id = "derelict_sulaco" + suffix = "derelict_sulaco.dmm" + name = "Derelict Sulaco" + description = "Nothing to see here citizen, move along, certainly no xeno outbreaks here. That purple stuff? It's uh... space nectar... but don't eat it! \ + It's the bridge of a top secret military ship." /datum/map_template/ruin/space/derelict2 id = "derelict2" diff --git a/code/datums/status_effects/debuffs/fire_stacks.dm b/code/datums/status_effects/debuffs/fire_stacks.dm index 598f38d3adfd3d..bc601ef167a060 100644 --- a/code/datums/status_effects/debuffs/fire_stacks.dm +++ b/code/datums/status_effects/debuffs/fire_stacks.dm @@ -220,6 +220,7 @@ SEND_SIGNAL(owner, COMSIG_LIVING_IGNITED, owner) cache_stacks() update_overlay() + return TRUE /** * Handles mob extinguishing, should be the only way to set on_fire to FALSE diff --git a/code/datums/status_effects/debuffs/jitteriness.dm b/code/datums/status_effects/debuffs/jitteriness.dm index d97748b43fc1f8..dea467e68c30cd 100644 --- a/code/datums/status_effects/debuffs/jitteriness.dm +++ b/code/datums/status_effects/debuffs/jitteriness.dm @@ -8,6 +8,12 @@ return ..() /datum/status_effect/jitter/on_apply() + // If we're being applied to a dead person, don't make the status effect. + // Just do a bit of jitter animation and be done. + if(owner.stat == DEAD) + owner.do_jitter_animation(duration / 10) + return FALSE + RegisterSignal(owner, list(COMSIG_LIVING_POST_FULLY_HEAL, COMSIG_LIVING_DEATH), .proc/remove_jitter) SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, id, /datum/mood_event/jittery) return TRUE diff --git a/code/datums/status_effects/gas.dm b/code/datums/status_effects/gas.dm index c4e671cdbfe047..0ef72ce2b8a6f4 100644 --- a/code/datums/status_effects/gas.dm +++ b/code/datums/status_effects/gas.dm @@ -51,3 +51,33 @@ /datum/status_effect/freon/watcher duration = 8 can_melt = FALSE + +/datum/status_effect/hypernob_protection + id = "hypernob_protection" + duration = 10 SECONDS + alert_type = /atom/movable/screen/alert/status_effect/hypernob_protection + +/datum/status_effect/hypernob_protection/on_creation(mob/living/new_owner, duration = 10 SECONDS) + src.duration = duration + return ..() + +/atom/movable/screen/alert/status_effect/hypernob_protection + name = "Hyper-Noblium Protection" + desc = "The Hyper-Noblium around your body is protecting it from self-combustion and fires, but you feel sluggish..." + icon_state = "hypernob_protection" + +/datum/status_effect/hypernob_protection/on_apply() + if(!ishuman(owner)) + CRASH("[type] status effect added to non-human owner: [owner ? owner.type : "null owner"]") + var/mob/living/carbon/human/human_owner = owner + human_owner.add_movespeed_modifier(/datum/movespeed_modifier/reagent/hypernoblium) //small slowdown as a tradeoff + ADD_TRAIT(human_owner, TRAIT_NOFIRE, type) + return TRUE + +/datum/status_effect/hypernob_protection/on_remove() + if(!ishuman(owner)) + stack_trace("[type] status effect being removed from non-human owner: [owner ? owner.type : "null owner"]") + var/mob/living/carbon/human/human_owner = owner + human_owner.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/hypernoblium) + REMOVE_TRAIT(human_owner, TRAIT_NOFIRE, type) + diff --git a/code/datums/status_effects/neutral.dm b/code/datums/status_effects/neutral.dm index e188b31c8d0166..06861e64a9c0e8 100644 --- a/code/datums/status_effects/neutral.dm +++ b/code/datums/status_effects/neutral.dm @@ -92,7 +92,7 @@ rewarded = caster /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.")) + 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) return ..() @@ -103,13 +103,12 @@ /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.")) + to_chat(owner, span_boldnotice("You hear something behind you talking... \"Bounty claimed.\"")) playsound(owner, 'sound/weapons/gun/shotgun/shot.ogg', 75, FALSE) to_chat(rewarded, span_greentext("You feel a surge of mana flow into you!")) - for(var/obj/effect/proc_holder/spell/spell in rewarded.mind.spell_list) - spell.charge_counter = spell.charge_max - spell.recharging = FALSE - spell.update_appearance() + for(var/datum/action/cooldown/spell/spell in rewarded.actions) + spell.reset_spell_cooldown() + rewarded.adjustBruteLoss(-25) rewarded.adjustFireLoss(-25) rewarded.adjustToxLoss(-25) diff --git a/code/datums/status_effects/wound_effects.dm b/code/datums/status_effects/wound_effects.dm index e29f093296717a..9ce7af7fc4bd7b 100644 --- a/code/datums/status_effects/wound_effects.dm +++ b/code/datums/status_effects/wound_effects.dm @@ -142,9 +142,9 @@ alert_type = NONE /datum/status_effect/wound/on_creation(mob/living/new_owner, incoming_wound) - . = ..() linked_wound = incoming_wound linked_limb = linked_wound.limb + return ..() /datum/status_effect/wound/on_remove() linked_wound = null diff --git a/code/datums/weather/weather.dm b/code/datums/weather/weather.dm index d665138ee2158c..0cc4c9c91ba283 100644 --- a/code/datums/weather/weather.dm +++ b/code/datums/weather/weather.dm @@ -59,11 +59,15 @@ /// Since it's above everything else, this is the layer used by default. TURF_LAYER is below mobs and walls if you need to use that. var/overlay_layer = AREA_LAYER /// Plane for the overlay - var/overlay_plane = ABOVE_LIGHTING_PLANE + var/overlay_plane = AREA_PLANE /// If the weather has no purpose other than looks var/aesthetic = FALSE /// Used by mobs (or movables containing mobs, such as enviro bags) to prevent them from being affected by the weather. var/immunity_type + /// If this bit of weather should also draw an overlay that's uneffected by lighting onto the area + /// Taken from weather_glow.dmi + var/use_glow = TRUE + var/mutable_appearance/current_glow /// The stage of the weather, from 1-4 var/stage = END_STAGE @@ -224,23 +228,37 @@ * */ /datum/weather/proc/update_areas() + var/using_icon_state = "" + switch(stage) + if(STARTUP_STAGE) + using_icon_state = telegraph_overlay + if(MAIN_STAGE) + using_icon_state = weather_overlay + if(WIND_DOWN_STAGE) + using_icon_state = end_overlay + if(END_STAGE) + using_icon_state = "" + + var/mutable_appearance/glow_overlay = mutable_appearance('icons/effects/glow_weather.dmi', using_icon_state, overlay_layer, ABOVE_LIGHTING_PLANE, 100) for(var/V in impacted_areas) var/area/N = V - N.layer = overlay_layer - N.plane = overlay_plane - N.icon = 'icons/effects/weather_effects.dmi' - N.color = weather_color - switch(stage) - if(STARTUP_STAGE) - N.icon_state = telegraph_overlay - if(MAIN_STAGE) - N.icon_state = weather_overlay - if(WIND_DOWN_STAGE) - N.icon_state = end_overlay - if(END_STAGE) - N.color = null - N.icon_state = "" - N.icon = 'icons/area/areas_misc.dmi' - N.layer = initial(N.layer) - N.plane = initial(N.plane) - N.set_opacity(FALSE) + if(current_glow) + N.overlays -= current_glow + if(stage == END_STAGE) + N.color = null + N.icon_state = using_icon_state + N.icon = 'icons/area/areas_misc.dmi' + N.layer = initial(N.layer) + N.plane = initial(N.plane) + N.set_opacity(FALSE) + else + N.layer = overlay_layer + N.plane = overlay_plane + N.icon = 'icons/effects/weather_effects.dmi' + N.icon_state = using_icon_state + N.color = weather_color + if(use_glow) + N.overlays += glow_overlay + + current_glow = glow_overlay + diff --git a/code/datums/weather/weather_types/floor_is_lava.dm b/code/datums/weather/weather_types/floor_is_lava.dm index 1ee58c68fa669d..90a8d6fd55c315 100644 --- a/code/datums/weather/weather_types/floor_is_lava.dm +++ b/code/datums/weather/weather_types/floor_is_lava.dm @@ -21,6 +21,10 @@ overlay_layer = ABOVE_OPEN_TURF_LAYER //Covers floors only overlay_plane = FLOOR_PLANE immunity_type = TRAIT_LAVA_IMMUNE + /// We don't draw on walls, so this ends up lookin weird + /// Can't really use like, the emissive system here because I am not about to make + /// all walls block emissive + use_glow = FALSE /datum/weather/floor_is_lava/can_weather_act(mob/living/mob_to_check) diff --git a/code/datums/wires/robot.dm b/code/datums/wires/robot.dm index 944399f6d4b66f..42ae3a18b34682 100644 --- a/code/datums/wires/robot.dm +++ b/code/datums/wires/robot.dm @@ -42,7 +42,7 @@ R.notify_ai(AI_NOTIFICATION_CYBORG_DISCONNECTED) if(new_ai && (new_ai != R.connected_ai)) R.set_connected_ai(new_ai) - log_combat(usr, R, "synced cyborg [R.connected_ai ? "from [ADMIN_LOOKUP(R.connected_ai)]": ""] to [ADMIN_LOOKUP(new_ai)]") + log_silicon("[key_name(usr)] synced [key_name(R)] [R.connected_ai ? "from [ADMIN_LOOKUP(R.connected_ai)]": ""] to [ADMIN_LOOKUP(new_ai)]") if(R.shell) R.undeploy() //If this borg is an AI shell, disconnect the controlling AI and assign ti to a new AI R.notify_ai(AI_NOTIFICATION_AI_SHELL) @@ -52,17 +52,17 @@ if(!QDELETED(R.builtInCamera) && !R.scrambledcodes) R.builtInCamera.toggle_cam(usr, FALSE) R.visible_message(span_notice("[R]'s camera lens focuses loudly."), span_notice("Your camera lens focuses loudly.")) - log_combat(usr, R, "toggled cyborg camera to [R.builtInCamera.status ? "on" : "off"] via pulse") + log_silicon("[key_name(usr)] toggled [key_name(R)]'s camera to [R.builtInCamera.status ? "on" : "off"] via pulse") if(WIRE_LAWSYNC) // Forces a law update if possible. if(R.lawupdate) R.visible_message(span_notice("[R] gently chimes."), span_notice("LawSync protocol engaged.")) - log_combat(usr, R, "forcibly synced cyborg laws via pulse") + log_silicon("[key_name(usr)] forcibly synced [key_name(R)]'s laws via pulse") // TODO, log the laws they gained here R.lawsync() R.show_laws() if(WIRE_LOCKDOWN) R.SetLockdown(!R.lockcharge) // Toggle - log_combat(usr, R, "[!R.lockcharge ? "locked down" : "released"] via pulse") + log_silicon("[key_name(usr)] [!R.lockcharge ? "locked down" : "released"] [key_name(R)] via pulse") if(WIRE_RESET_MODEL) if(R.has_model()) @@ -74,7 +74,7 @@ if(WIRE_AI) // Cut the AI wire to reset AI control. if(!mend) R.notify_ai(AI_NOTIFICATION_CYBORG_DISCONNECTED) - log_combat(usr, R, "cut AI wire on cyborg[R.connected_ai ? " and disconnected from [ADMIN_LOOKUP(R.connected_ai)]": ""]") + log_silicon("[key_name(usr)] cut AI wire on [key_name(R)][R.connected_ai ? " and disconnected from [ADMIN_LOOKUP(R.connected_ai)]": ""]") if(R.shell) R.undeploy() R.set_connected_ai(null) @@ -83,26 +83,26 @@ if(mend) if(!R.emagged) R.lawupdate = TRUE - log_combat(usr, R, "enabled lawsync via wire") + log_silicon("[key_name(usr)] enabled [key_name(R)]'s lawsync via wire") else if(!R.deployed) //AI shells must always have the same laws as the AI R.lawupdate = FALSE - log_combat(usr, R, "disabled lawsync via wire") - R.logevent("Lawsync Module fault [mend?"cleared":"detected"]") + log_silicon("[key_name(usr)] disabled [key_name(R)]'s lawsync via wire") + R.logevent("Lawsync Module fault [mend ? "cleared" : "detected"]") if (WIRE_CAMERA) // Disable the camera. if(!QDELETED(R.builtInCamera) && !R.scrambledcodes) R.builtInCamera.status = mend R.builtInCamera.toggle_cam(usr, 0) R.visible_message(span_notice("[R]'s camera lens focuses loudly."), span_notice("Your camera lens focuses loudly.")) R.logevent("Camera Module fault [mend?"cleared":"detected"]") - log_combat(usr, R, "[mend ? "enabled" : "disabled"] cyborg camera via wire") + log_silicon("[key_name(usr)] [mend ? "enabled" : "disabled"] [key_name(R)]'s camera via wire") if(WIRE_LOCKDOWN) // Simple lockdown. R.SetLockdown(!mend) R.logevent("Motor Controller fault [mend?"cleared":"detected"]") - log_combat(usr, R, "[!R.lockcharge ? "locked down" : "released"] via wire") + log_silicon("[key_name(usr)] [!R.lockcharge ? "locked down" : "released"] [key_name(R)] via wire") if(WIRE_RESET_MODEL) if(R.has_model() && !mend) R.ResetModel() - log_combat(usr, R, "reset the cyborg module via wire") + log_silicon("[key_name(usr)] reset [key_name(R)]'s module via wire") /datum/wires/robot/can_reveal_wires(mob/user) if(HAS_TRAIT(user, TRAIT_KNOW_CYBORG_WIRES)) diff --git a/code/datums/world_topic.dm b/code/datums/world_topic.dm index b6e96dd4b16b69..bb22827a8e5dae 100644 --- a/code/datums/world_topic.dm +++ b/code/datums/world_topic.dm @@ -213,7 +213,7 @@ if(key_valid) .["active_players"] = get_active_player_count() - .["security_level"] = get_security_level() + .["security_level"] = SSsecurity_level.get_current_level_as_text() .["round_duration"] = SSticker ? round((world.time-SSticker.round_start_time)/10) : 0 // Amount of world's ticks in seconds, useful for calculating round duration diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 5970fc4851cd55..67c6deb77a1f5f 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -403,7 +403,8 @@ GLOBAL_LIST_EMPTY(teleportlocs) /area/Entered(atom/movable/arrived, area/old_area) set waitfor = FALSE SEND_SIGNAL(src, COMSIG_AREA_ENTERED, arrived, old_area) - if(!LAZYACCESS(arrived.important_recursive_contents, RECURSIVE_CONTENTS_AREA_SENSITIVE)) + + if(!arrived.important_recursive_contents?[RECURSIVE_CONTENTS_AREA_SENSITIVE]) return for(var/atom/movable/recipient as anything in arrived.important_recursive_contents[RECURSIVE_CONTENTS_AREA_SENSITIVE]) SEND_SIGNAL(recipient, COMSIG_ENTER_AREA, src) @@ -419,19 +420,6 @@ GLOBAL_LIST_EMPTY(teleportlocs) if(L.client?.prefs.toggles & SOUND_SHIP_AMBIENCE) SEND_SOUND(L, sound('sound/ambience/shipambience.ogg', repeat = 1, wait = 0, volume = 35, channel = CHANNEL_BUZZ)) - - -///Divides total beauty in the room by roomsize to allow us to get an average beauty per tile. -/area/proc/update_beauty() - if(!areasize) - beauty = 0 - return FALSE - if(areasize >= beauty_threshold) - beauty = 0 - return FALSE //Too big - beauty = totalbeauty / areasize - - /** * Called when an atom exits an area * @@ -439,11 +427,21 @@ GLOBAL_LIST_EMPTY(teleportlocs) */ /area/Exited(atom/movable/gone, direction) SEND_SIGNAL(src, COMSIG_AREA_EXITED, gone, direction) - if(!LAZYACCESS(gone.important_recursive_contents, RECURSIVE_CONTENTS_AREA_SENSITIVE)) + + if(!gone.important_recursive_contents?[RECURSIVE_CONTENTS_AREA_SENSITIVE]) return for(var/atom/movable/recipient as anything in gone.important_recursive_contents[RECURSIVE_CONTENTS_AREA_SENSITIVE]) SEND_SIGNAL(recipient, COMSIG_EXIT_AREA, src) +///Divides total beauty in the room by roomsize to allow us to get an average beauty per tile. +/area/proc/update_beauty() + if(!areasize) + beauty = 0 + return FALSE + if(areasize >= beauty_threshold) + beauty = 0 + return FALSE //Too big + beauty = totalbeauty / areasize /** * Setup an area (with the given name) diff --git a/code/game/area/areas/mining.dm b/code/game/area/areas/mining.dm index 57ed48b9ce2791..d2dfa56a329c44 100644 --- a/code/game/area/areas/mining.dm +++ b/code/game/area/areas/mining.dm @@ -227,6 +227,10 @@ /area/icemoon/underground/unexplored/rivers/deep map_generator = /datum/map_generator/cave_generator/icemoon/deep +/area/icemoon/underground/unexplored/rivers/deep/shoreline //use this for when you don't want mobs to spawn in certain areas in the "deep" portions. Think adjacent to rivers or station structures. + icon_state = "shore" + area_flags = UNIQUE_AREA | CAVES_ALLOWED | FLORA_ALLOWED | NO_ALERTS + /area/icemoon/underground/explored // ruins can't spawn here name = "Icemoon Underground" area_flags = UNIQUE_AREA | NO_ALERTS diff --git a/code/game/area/areas/shuttles.dm b/code/game/area/areas/shuttles.dm index cefbb4c1945aa4..cb8dd26894ec19 100644 --- a/code/game/area/areas/shuttles.dm +++ b/code/game/area/areas/shuttles.dm @@ -246,7 +246,7 @@ /obj/effect/forcefield/arena_shuttle name = "portal" - timeleft = 0 + initial_duration = 0 var/list/warp_points = list() /obj/effect/forcefield/arena_shuttle/Initialize(mapload) @@ -283,7 +283,7 @@ /obj/effect/forcefield/arena_shuttle_entrance name = "portal" - timeleft = 0 + initial_duration = 0 var/list/warp_points = list() /obj/effect/forcefield/arena_shuttle_entrance/Bumped(atom/movable/AM) diff --git a/code/game/area/areas/station.dm b/code/game/area/areas/station.dm index 803aec7a8c5f2c..3ae23bfb262a79 100644 --- a/code/game/area/areas/station.dm +++ b/code/game/area/areas/station.dm @@ -1120,7 +1120,7 @@ /area/station/security/processing name = "\improper Labor Shuttle Dock" - icon_state = "sec_processing" + icon_state = "sec_labor_processing" /area/station/security/processing/cremation name = "\improper Security Crematorium" @@ -1301,44 +1301,43 @@ name = "\improper Cytology Lab" icon_state = "cytology" -/area/station/science/storage - name = "Ordnance Storage" +// Use this for the main lab. If test equipment, storage, etc is also present use this one too. +/area/station/science/ordnance + name = "\improper Ordnance Lab" + icon_state = "ord_main" + +/area/station/science/ordnance/office + name = "\improper Ordnance Office" + icon_state = "ord_office" + +/area/station/science/ordnance/storage + name = "\improper Ordnance Storage" icon_state = "ord_storage" -/area/station/science/test_area - name = "\improper Ordnance Test Area" - icon_state = "ord_test" +/area/station/science/ordnance/burnchamber + name = "\improper Ordnance Burn Chamber" + icon_state = "ord_burn" area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED -/area/station/science/mixing - name = "\improper Ordnance Mixing Lab" - icon_state = "ord_mix" - -/area/station/science/mixing/chamber - name = "\improper Ordnance Mixing Chamber" - icon_state = "ord_mix_chamber" +/area/station/science/ordnance/freezerchamber + name = "\improper Ordnance Freezer Chamber" + icon_state = "ord_freeze" area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED -/area/station/science/mixing/hallway - name = "\improper Ordnance Mixing Hallway" - icon_state = "ord_mix_hallway" +// Room for equipments and such +/area/station/science/ordnance/testlab + name = "\improper Ordnance Testing Lab" + icon_state = "ord_test" + area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED -/area/station/science/mixing/launch - name = "\improper Ordnance Mixing Launch Site" - icon_state = "ord_mix_launch" +/area/station/science/ordnance/bomb + name = "\improper Ordnance Bomb Site" + icon_state = "ord_boom" /area/station/science/genetics name = "\improper Genetics Lab" icon_state = "geneticssci" -/area/station/science/misc_lab - name = "\improper Testing Lab" - icon_state = "ord_misc" - -/area/station/science/misc_lab/range - name = "\improper Research Testing Range" - icon_state = "ord_range" - /area/station/science/server name = "\improper Research Division Server Room" icon_state = "server" @@ -1347,6 +1346,11 @@ name = "\improper Experimentation Lab" icon_state = "exp_lab" +// Useless room +/area/station/science/auxlab + name = "\improper Auxillary Lab" + icon_state = "aux_lab" + /area/station/science/robotics name = "Robotics" icon_state = "robotics" diff --git a/code/game/atoms.dm b/code/game/atoms.dm index ee9ff67cd46a60..5ef8b69bb01348 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -602,10 +602,10 @@ * [COMSIG_ATOM_GET_EXAMINE_NAME] signal */ /atom/proc/get_examine_name(mob/user) - . = "\a [src]" + . = "\a [src]" var/list/override = list(gender == PLURAL ? "some" : "a", " ", "[name]") if(article) - . = "[article] [src]" + . = "[article] [src]" override[EXAMINE_POSITION_ARTICLE] = article if(SEND_SIGNAL(src, COMSIG_ATOM_GET_EXAMINE_NAME, user, override) & COMPONENT_EXNAME_CHANGED) . = override.Join("") @@ -637,7 +637,11 @@ * Produces a signal [COMSIG_PARENT_EXAMINE] */ /atom/proc/examine(mob/user) - . = list("[get_examine_string(user, TRUE)].") + var/examine_string = get_examine_string(user, thats = TRUE) + if(examine_string) + . = list("[examine_string].") + else + . = list() . += get_name_chaser(user) if(desc) @@ -654,7 +658,7 @@ if(length(reagents.reagent_list)) if(user.can_see_reagents()) //Show each individual reagent for(var/datum/reagent/current_reagent as anything in reagents.reagent_list) - . += "[round(current_reagent.volume, 0.01)] units of [current_reagent.name]" + . += "• [round(current_reagent.volume, 0.01)] units of [current_reagent.name]" if(reagents.is_reacting) . += span_warning("It is currently reacting!") . += span_notice("The solution's pH is [round(reagents.ph, 0.01)] and has a temperature of [reagents.chem_temp]K.") @@ -1781,7 +1785,9 @@ * Returns true if this atom has gravity for the passed in turf * * Sends signals [COMSIG_ATOM_HAS_GRAVITY] and [COMSIG_TURF_HAS_GRAVITY], both can force gravity with - * the forced gravity var + * the forced gravity var. + * + * micro-optimized to hell because this proc is very hot, being called several times per movement every movement. * * Gravity situations: * * No gravity if you're not in a turf @@ -1792,39 +1798,28 @@ * * otherwise no gravity */ /atom/proc/has_gravity(turf/gravity_turf) - if(!gravity_turf || !isturf(gravity_turf)) + if(!isturf(gravity_turf)) gravity_turf = get_turf(src) - if(!gravity_turf) - return 0 + if(!gravity_turf)//no gravity in nullspace + return 0 + + //the list isnt created every time as this proc is very hot, its only accessed if anything is actually listening to the signal too + var/static/list/forced_gravity = list() + if(SEND_SIGNAL(src, COMSIG_ATOM_HAS_GRAVITY, gravity_turf, forced_gravity)) + if(!length(forced_gravity)) + SEND_SIGNAL(gravity_turf, COMSIG_TURF_HAS_GRAVITY, src, forced_gravity) - var/list/forced_gravity = list() - SEND_SIGNAL(src, COMSIG_ATOM_HAS_GRAVITY, gravity_turf, forced_gravity) - if(!forced_gravity.len) - SEND_SIGNAL(gravity_turf, COMSIG_TURF_HAS_GRAVITY, src, forced_gravity) - if(forced_gravity.len) - var/max_grav = forced_gravity[1] - for(var/i in forced_gravity) + var/max_grav = 0 + for(var/i in forced_gravity)//our gravity is the strongest return forced gravity we get max_grav = max(max_grav, i) + forced_gravity.Cut() + //cut so we can reuse the list, this is ok since forced gravity movers are exceedingly rare compared to all other movement return max_grav - if(isspaceturf(gravity_turf)) // Turf never has gravity - return 0 - if(istype(gravity_turf, /turf/open/openspace)) //openspace in a space area doesn't get gravity - if(istype(get_area(gravity_turf), /area/space)) - return 0 + var/area/turf_area = gravity_turf.loc - var/area/turf_area = get_area(gravity_turf) - if(turf_area.has_gravity) // Areas which always has gravity - return turf_area.has_gravity - else - // There's a gravity generator on our z level - if(GLOB.gravity_generators["[gravity_turf.z]"]) - var/max_grav = 0 - for(var/obj/machinery/gravity_generator/main/main_grav_gen as anything in GLOB.gravity_generators["[gravity_turf.z]"]) - max_grav = max(main_grav_gen.setting,max_grav) - return max_grav - return SSmapping.level_trait(gravity_turf.z, ZTRAIT_GRAVITY) + return !gravity_turf.force_no_gravity && (SSmapping.gravity_by_z_level["[gravity_turf.z]"] || turf_area.has_gravity) /** * Causes effects when the atom gets hit by a rust effect from heretics diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index ce8539a8dd09d9..ffc89ecbe6939e 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -3,8 +3,6 @@ glide_size = 8 appearance_flags = TILE_BOUND|PIXEL_SCALE|LONG_GLIDE - ///how many times a this movable had movement procs called on it since Moved() was last called - var/move_stacks = 0 var/last_move = null var/anchored = FALSE var/move_resist = MOVE_RESIST_DEFAULT @@ -36,8 +34,10 @@ var/pass_flags = NONE /// If false makes [CanPass][/atom/proc/CanPass] call [CanPassThrough][/atom/movable/proc/CanPassThrough] on this type instead of using default behaviour var/generic_canpass = TRUE - var/moving_diagonally = 0 //0: not doing a diagonal move. 1 and 2: doing the first/second step of the diagonal move - var/atom/movable/moving_from_pull //attempt to resume grab after moving instead of before. + ///0: not doing a diagonal move. 1 and 2: doing the first/second step of the diagonal move + var/moving_diagonally = 0 + ///attempt to resume grab after moving instead of before. + var/atom/movable/moving_from_pull ///Holds information about any movement loops currently running/waiting to run on the movable. Lazy, will be null if nothing's going on var/datum/movement_packet/move_packet var/datum/forced_movement/force_moving = null //handled soley by forced_movement.dm @@ -441,8 +441,7 @@ SEND_SIGNAL(src, COMSIG_MOVABLE_UPDATE_GLIDE_SIZE, target) glide_size = target - for(var/m in buckled_mobs) - var/mob/buckled_mob = m + for(var/mob/buckled_mob as anything in buckled_mobs) buckled_mob.set_glide_size(target) /** @@ -452,9 +451,9 @@ */ /atom/movable/proc/abstract_move(atom/new_loc) var/atom/old_loc = loc - move_stacks++ + var/direction = get_dir(old_loc, new_loc) loc = new_loc - Moved(old_loc) + Moved(old_loc, direction) //////////////////////////////////////// // Here's where we rewrite how byond handles movement except slightly different @@ -468,7 +467,7 @@ if(!direction) direction = get_dir(src, newloc) - if(set_dir_on_move) + if(set_dir_on_move && dir != direction) setDir(direction) var/is_multi_tile_object = bound_width > 32 || bound_height > 32 @@ -508,7 +507,6 @@ var/atom/oldloc = loc var/area/oldarea = get_area(oldloc) var/area/newarea = get_area(newloc) - move_stacks++ loc = newloc @@ -543,7 +541,7 @@ return FALSE var/atom/oldloc = loc //Early override for some cases like diagonal movement - if(glide_size_override) + if(glide_size_override && glide_size != glide_size_override) set_glide_size(glide_size_override) if(loc != newloc) @@ -597,10 +595,6 @@ if(moving_diagonally == SECOND_DIAG_STEP) if(!. && set_dir_on_move) setDir(first_step_dir) - else if (!inertia_moving) - newtonian_move(direct) - if(client_mobs_in_contents) // We're done moving, update our parallax now - update_parallax_contents() moving_diagonally = 0 return @@ -631,12 +625,12 @@ //glide_size strangely enough can change mid movement animation and update correctly while the animation is playing //This means that if you don't override it late like this, it will just be set back by the movement update that's called when you move turfs. - if(glide_size_override) + if(glide_size_override && glide_size != glide_size_override) set_glide_size(glide_size_override) last_move = direct - if(set_dir_on_move) + if(set_dir_on_move && dir != direct) setDir(direct) if(. && has_buckled_mobs() && !handle_buckled_mob_movement(loc, direct, glide_size_override)) //movement failed due to buckled mob(s) . = FALSE @@ -661,11 +655,12 @@ * * movement_dir is the direction the movement took place. Can be NONE if it was some sort of teleport. * * The forced flag indicates whether this was a forced move, which skips many checks of regular movement. * * The old_locs is an optional argument, in case the moved movable was present in multiple locations before the movement. + * * momentum_change represents whether this movement is due to a "new" force if TRUE or an already "existing" force if FALSE **/ -/atom/movable/proc/Moved(atom/old_loc, movement_dir, forced = FALSE, list/old_locs) +/atom/movable/proc/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) SHOULD_CALL_PARENT(TRUE) - if (!inertia_moving) + if (!inertia_moving && momentum_change) newtonian_move(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 @@ -673,14 +668,12 @@ if (!moving_diagonally && client_mobs_in_contents) update_parallax_contents() - move_stacks-- - if(move_stacks > 0) //we want only the first Moved() call in the stack to send this signal, all the other ones have an incorrect old_loc - return - if(move_stacks < 0) - stack_trace("move_stacks is negative in Moved()!") - move_stacks = 0 //setting it to 0 so that we dont get every movable with negative move_stacks runtiming on every movement + SEND_SIGNAL(src, COMSIG_MOVABLE_MOVED, old_loc, movement_dir, forced, old_locs, momentum_change) - SEND_SIGNAL(src, COMSIG_MOVABLE_MOVED, old_loc, movement_dir, forced, old_locs) + if(old_loc) + SEND_SIGNAL(old_loc, COMSIG_ATOM_ABSTRACT_EXITED, src, movement_dir) + if(loc) + SEND_SIGNAL(loc, COMSIG_ATOM_ABSTRACT_ENTERED, src, old_loc, old_locs) var/turf/old_turf = get_turf(old_loc) var/turf/new_turf = get_turf(src) @@ -843,7 +836,6 @@ ///allows this movable to know when it has "entered" another area no matter how many movable atoms its stuffed into, uses important_recursive_contents /atom/movable/proc/become_area_sensitive(trait_source = TRAIT_GENERIC) if(!HAS_TRAIT(src, TRAIT_AREA_SENSITIVE)) - //RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_AREA_SENSITIVE), .proc/on_area_sensitive_trait_loss) for(var/atom/movable/location as anything in get_nested_locs(src) + src) LAZYADDASSOCLIST(location.important_recursive_contents, RECURSIVE_CONTENTS_AREA_SENSITIVE, src) ADD_TRAIT(src, TRAIT_AREA_SENSITIVE, trait_source) @@ -887,6 +879,24 @@ ASSOC_UNSETEMPTY(recursive_contents, RECURSIVE_CONTENTS_CLIENT_MOBS) UNSETEMPTY(movable_loc.important_recursive_contents) +///called when this movable becomes the parent of a storage component that is currently being viewed by a player. uses important_recursive_contents +/atom/movable/proc/become_active_storage(datum/component/storage/component_source) + if(!HAS_TRAIT(src, TRAIT_ACTIVE_STORAGE)) + for(var/atom/movable/location as anything in get_nested_locs(src) + src) + LAZYADDASSOCLIST(location.important_recursive_contents, RECURSIVE_CONTENTS_ACTIVE_STORAGE, src) + ADD_TRAIT(src, TRAIT_ACTIVE_STORAGE, component_source) + +///called when this movable's storage component is no longer viewed by any players, unsets important_recursive_contents +/atom/movable/proc/lose_active_storage(datum/component/storage/component_source) + if(!HAS_TRAIT(src, TRAIT_ACTIVE_STORAGE)) + return + REMOVE_TRAIT(src, TRAIT_ACTIVE_STORAGE, component_source) + if(HAS_TRAIT(src, TRAIT_ACTIVE_STORAGE)) + return + + for(var/atom/movable/location as anything in get_nested_locs(src) + src) + LAZYREMOVEASSOC(location.important_recursive_contents, RECURSIVE_CONTENTS_ACTIVE_STORAGE, src) + ///Sets the anchored var and returns if it was sucessfully changed or not. /atom/movable/proc/set_anchored(anchorvalue) SHOULD_CALL_PARENT(TRUE) @@ -917,12 +927,13 @@ /atom/movable/proc/doMove(atom/destination) . = FALSE - move_stacks++ var/atom/oldloc = loc + var/is_multi_tile = bound_width > world.icon_size || bound_height > world.icon_size if(destination) ///zMove already handles whether a pull from another movable should be broken. if(pulledby && !currently_z_moving) pulledby.stop_pulling() + var/same_loc = oldloc == destination var/area/old_area = get_area(oldloc) var/area/destarea = get_area(destination) @@ -933,23 +944,49 @@ loc = destination if(!same_loc) - if(oldloc) - oldloc.Exited(src, movement_dir) + if(is_multi_tile && isturf(destination)) + 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)), + destination.z + ) + ) if(old_area && old_area != destarea) old_area.Exited(src, movement_dir) - destination.Entered(src, oldloc) - if(destarea && old_area != destarea) - destarea.Entered(src, old_area) + for(var/atom/left_loc as anything in locs - new_locs) + left_loc.Exited(src, movement_dir) + + for(var/atom/entering_loc as anything in new_locs - locs) + entering_loc.Entered(src, movement_dir) + + if(old_area && old_area != destarea) + destarea.Entered(src, movement_dir) + else + if(oldloc) + oldloc.Exited(src, movement_dir) + if(old_area && old_area != destarea) + old_area.Exited(src, movement_dir) + destination.Entered(src, oldloc) + if(destarea && old_area != destarea) + destarea.Entered(src, old_area) . = TRUE //If no destination, move the atom into nullspace (don't do this unless you know what you're doing) else . = TRUE - loc = null + if (oldloc) + loc = null var/area/old_area = get_area(oldloc) - oldloc.Exited(src, NONE) + if(is_multi_tile && isturf(oldloc)) + for(var/atom/old_loc as anything in locs) + old_loc.Exited(src, NONE) + else + oldloc.Exited(src, NONE) + if(old_area) old_area.Exited(src, NONE) @@ -975,7 +1012,7 @@ * Called whenever an object moves and by mobs when they attempt to move themselves through space * And when an object or action applies a force on src, see [newtonian_move][/atom/movable/proc/newtonian_move] * - * Return 0 to have src start/keep drifting in a no-grav area and 1 to stop/not start drifting + * Return FALSE to have src start/keep drifting in a no-grav area and TRUE to stop/not start drifting * * Mobs should return 1 if they should be able to move of their own volition, see [/client/proc/Move] * @@ -984,10 +1021,10 @@ * * continuous_move - If this check is coming from something in the context of already drifting */ /atom/movable/proc/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) - if(SEND_SIGNAL(src, COMSIG_MOVABLE_SPACEMOVE, movement_dir, continuous_move) & COMSIG_MOVABLE_STOP_SPACEMOVE) + if(has_gravity()) return TRUE - if(has_gravity(src)) + if(SEND_SIGNAL(src, COMSIG_MOVABLE_SPACEMOVE, movement_dir, continuous_move) & COMSIG_MOVABLE_STOP_SPACEMOVE) return TRUE if(pulledby && (pulledby.pulledby != src || moving_from_pull)) @@ -1393,7 +1430,6 @@ log_admin("[key_name(usr)] has added deadchat control to [src]") message_admins(span_notice("[key_name(usr)] has added deadchat control to [src]")) - /** * A wrapper for setDir that should only be able to fail by living mobs. * diff --git a/code/game/gamemodes/dynamic/dynamic.dm b/code/game/gamemodes/dynamic/dynamic.dm index b05802b536269b..b085c587bad4c1 100644 --- a/code/game/gamemodes/dynamic/dynamic.dm +++ b/code/game/gamemodes/dynamic/dynamic.dm @@ -100,7 +100,7 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) /// Basically, if this is set to 5, then for every 5 threat, one midround roll will be added. /// The equation this is used in rounds up, meaning that if this is set to 5, and you have 6 /// threat, then you will get 2 midround rolls. - var/threat_per_midround_roll = 6.5 + var/threat_per_midround_roll = 7 /// A number between -5 and +5. /// A negative value will give a more peaceful round and @@ -157,10 +157,10 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) /// The maximum threat that can roll with *zero* players. /// As the number of players approaches `low_pop_player_threshold`, the maximum /// threat level will increase. - /// For example, if `low_pop_minimum_threat` is 50, `low_pop_player_threshold` is 20, + /// For example, if `low_pop_maximum_threat` is 50, `low_pop_player_threshold` is 20, /// and the number of readied players is 10, then the highest threat that can roll is /// lerp(50, 100, 10 / 20), AKA 75. - var/low_pop_minimum_threat = 50 + var/low_pop_maximum_threat = 40 /// The chance for latejoins to roll when ready var/latejoin_roll_chance = 50 @@ -340,8 +340,8 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) priority_announce("Thanks to the tireless efforts of our security and intelligence divisions, there are currently no credible threats to [station_name()]. All station construction projects have been authorized. Have a secure shift!", "Security Report", SSstation.announcer.get_rand_report_sound()) else priority_announce("A summary has been copied and printed to all communications consoles.", "Security level elevated.", ANNOUNCER_INTERCEPT) - if(SSsecurity_level.current_level < SEC_LEVEL_BLUE) - set_security_level(SEC_LEVEL_BLUE) + if(SSsecurity_level.get_current_level_as_number() < SEC_LEVEL_BLUE) + SSsecurity_level.set_level(SEC_LEVEL_BLUE) /datum/game_mode/dynamic/proc/show_threatlog(mob/admin) if(!SSticker.HasRoundStarted()) @@ -367,7 +367,7 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) threat_level = clamp(round(lorentz_to_amount(relative_threat), 0.1), 0, max_threat_level) if (SSticker.totalPlayersReady < low_pop_player_threshold) - threat_level = min(threat_level, LERP(low_pop_minimum_threat, max_threat_level, SSticker.totalPlayersReady / low_pop_player_threshold)) + threat_level = min(threat_level, LERP(low_pop_maximum_threat, max_threat_level, SSticker.totalPlayersReady / low_pop_player_threshold)) peaceful_percentage = round(LORENTZ_CUMULATIVE_DISTRIBUTION(relative_threat, threat_curve_centre, threat_curve_width), 0.01)*100 @@ -592,7 +592,7 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) return FALSE /// An experimental proc to allow admins to call rules on the fly or have rules call other rules. -/datum/game_mode/dynamic/proc/picking_specific_rule(ruletype, forced = FALSE) +/datum/game_mode/dynamic/proc/picking_specific_rule(ruletype, forced = FALSE, ignore_cost = FALSE) var/datum/dynamic_ruleset/midround/new_rule if(ispath(ruletype)) new_rule = new ruletype() // You should only use it to call midround rules though. @@ -618,10 +618,11 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) return FALSE var/population = GLOB.alive_player_list.len - if((new_rule.acceptable(population, threat_level) && new_rule.cost <= mid_round_budget) || forced) + if((new_rule.acceptable(population, threat_level) && (ignore_cost || new_rule.cost <= mid_round_budget)) || forced) new_rule.trim_candidates() if (new_rule.ready(forced)) - spend_midround_budget(new_rule.cost, threat_log, "[worldtime2text()]: Forced rule [new_rule.name]") + if (!ignore_cost) + spend_midround_budget(new_rule.cost, threat_log, "[worldtime2text()]: Forced rule [new_rule.name]") new_rule.pre_execute(population) if (new_rule.execute()) // This should never fail since ready() returned 1 if(new_rule.flags & HIGH_IMPACT_RULESET) diff --git a/code/game/gamemodes/dynamic/dynamic_midround_rolling.dm b/code/game/gamemodes/dynamic/dynamic_midround_rolling.dm index 96fb0d68413ac4..0d1a4f8646c94b 100644 --- a/code/game/gamemodes/dynamic/dynamic_midround_rolling.dm +++ b/code/game/gamemodes/dynamic/dynamic_midround_rolling.dm @@ -26,11 +26,12 @@ if (EMERGENCY_PAST_POINT_OF_NO_RETURN) return + var/spawn_heavy = prob(get_heavy_midround_injection_chance()) + last_midround_injection_attempt = world.time next_midround_injection = null forced_injection = FALSE - var/spawn_heavy = prob(get_heavy_midround_injection_chance()) dynamic_log("A midround ruleset is rolling, and will be [spawn_heavy ? "HEAVY" : "LIGHT"].") random_event_hijacked = HIJACKED_NOTHING diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm index 2e682d7ef7227f..5f23fc74f3290c 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm @@ -90,6 +90,7 @@ JOB_HEAD_OF_PERSONNEL, JOB_HEAD_OF_SECURITY, JOB_PRISONER, + JOB_QUARTERMASTER, JOB_RESEARCH_DIRECTOR, JOB_SECURITY_OFFICER, JOB_WARDEN, diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm index 10edebaefcb569..1b20add4b8e07d 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm @@ -365,7 +365,7 @@ if(prob(MALF_ION_PROB)) priority_announce("Ion storm detected near the station. Please check all AI-controlled equipment for errors.", "Anomaly Alert", ANNOUNCER_IONSTORM) if(prob(REPLACE_LAW_WITH_ION_PROB)) - new_malf_ai.replace_random_law(generate_ion_law(), list(LAW_INHERENT, LAW_SUPPLIED, LAW_ION)) + new_malf_ai.replace_random_law(generate_ion_law(), list(LAW_INHERENT, LAW_SUPPLIED, LAW_ION), LAW_ION) else new_malf_ai.add_ion_law(generate_ion_law()) return TRUE diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm index d632a1b56bc3ea..1d46d68bce6c09 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm @@ -27,7 +27,7 @@ cost = 8 // Avoid raising traitor threat above this, as it is the default low cost ruleset. scaling_cost = 9 requirements = list(8,8,8,8,8,8,8,8,8,8) - antag_cap = list("denominator" = 24) + antag_cap = list("denominator" = 38) var/autotraitor_cooldown = (15 MINUTES) /datum/dynamic_ruleset/roundstart/traitor/pre_execute(population) @@ -477,6 +477,7 @@ JOB_HEAD_OF_PERSONNEL, JOB_HEAD_OF_SECURITY, JOB_PRISONER, + JOB_QUARTERMASTER, JOB_RESEARCH_DIRECTOR, JOB_SECURITY_OFFICER, JOB_WARDEN, diff --git a/code/game/gamemodes/dynamic/dynamic_unfavorable_situation.dm b/code/game/gamemodes/dynamic/dynamic_unfavorable_situation.dm new file mode 100644 index 00000000000000..a74e03739ea1db --- /dev/null +++ b/code/game/gamemodes/dynamic/dynamic_unfavorable_situation.dm @@ -0,0 +1,57 @@ +/// An easy interface to make...*waves hands* bad things happen. +/// This is used for impactful events like traitors hacking and creating more threat, or a revolutions victory. +/// It tries to spawn a heavy midround if possible, otherwise it will trigger a "bad" random event after a short period. +/// Calling this function will not use up any threat. +/datum/game_mode/dynamic/proc/unfavorable_situation() + SHOULD_NOT_SLEEP(TRUE) + + INVOKE_ASYNC(src, .proc/_unfavorable_situation) + +/datum/game_mode/dynamic/proc/_unfavorable_situation() + var/static/list/unfavorable_random_events = list( + /datum/round_event_control/immovable_rod, + /datum/round_event_control/meteor_wave, + /datum/round_event_control/portal_storm_syndicate, + ) + + var/list/possible_heavies = list() + + // Ignored factors: threat cost, minimum round time + for (var/datum/dynamic_ruleset/midround/ruleset as anything in midround_rules) + if (ruleset.midround_ruleset_style != MIDROUND_RULESET_STYLE_HEAVY) + continue + + if (ruleset.weight == 0) + continue + + if (ruleset.cost > max_threat_level) + continue + + if (!ruleset.acceptable(GLOB.alive_player_list.len, threat_level)) + continue + + if (ruleset.minimum_round_time > world.time - SSticker.round_start_time) + continue + + if(istype(ruleset, /datum/dynamic_ruleset/midround/from_ghosts) && !(GLOB.ghost_role_flags & GHOSTROLE_MIDROUND_EVENT)) + continue + + ruleset.trim_candidates() + + if (!ruleset.ready()) + continue + + possible_heavies[ruleset] = ruleset.get_weight() + + if (possible_heavies.len == 0) + var/datum/round_event_control/round_event_control_type = pick(unfavorable_random_events) + var/delay = rand(20 SECONDS, 1 MINUTES) + + dynamic_log("An unfavorable situation was requested, but no heavy rulesets could be drafted. Spawning [initial(round_event_control_type.name)] in [DisplayTimeText(delay)] instead.") + + var/datum/round_event_control/round_event_control = new round_event_control_type + addtimer(CALLBACK(round_event_control, /datum/round_event_control.proc/runEvent), delay) + else + var/datum/dynamic_ruleset/midround/heavy_ruleset = pick_weight(possible_heavies) + dynamic_log("An unfavorable situation was requested, spawning [initial(heavy_ruleset.name)]") + picking_specific_rule(heavy_ruleset, forced = TRUE, ignore_cost = TRUE) diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 470aa6f455bbea..388f56311a6753 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -200,6 +200,8 @@ SSticker.news_report = STATION_EVACUATED if(SSshuttle.emergency.is_hijacked()) SSticker.news_report = SHUTTLE_HIJACK + if(SSsupermatter_cascade.cascade_initiated) + SSticker.news_report = SUPERMATTER_CASCADE /// Mode specific admin panel. /datum/game_mode/proc/admin_panel() diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 93e787e150319e..33b95158b64173 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -157,30 +157,32 @@ GLOBAL_LIST(admin_objective_list) //Prefilled admin assignable objective list receiver.failed_special_equipment += equipment_path receiver.try_give_equipment_fallback() -/obj/effect/proc_holder/spell/self/special_equipment_fallback +/datum/action/special_equipment_fallback name = "Request Objective-specific Equipment" desc = "Call down a supply pod containing the equipment required for specific objectives." - action_icon = 'icons/obj/device.dmi' - action_icon_state = "beacon" - charge_max = 0 - clothes_req = FALSE - nonabstract_req = TRUE - phase_allowed = TRUE - antimagic_flags = NONE - invocation_type = INVOCATION_NONE - -/obj/effect/proc_holder/spell/self/special_equipment_fallback/cast(list/targets, mob/user) - var/datum/mind/mind = user.mind - if(!mind) - CRASH("[src] has no owner!") - if(mind.failed_special_equipment?.len) + icon_icon = 'icons/obj/device.dmi' + button_icon_state = "beacon" + +/datum/action/special_equipment_fallback/Trigger(trigger_flags) + . = ..() + if(!.) + return FALSE + + var/datum/mind/our_mind = target + if(!istype(our_mind)) + CRASH("[type] - [src] has an incorrect target!") + if(our_mind.current != owner) + CRASH("[type] - [src] was owned by a mob which was not the current of the target mind!") + + if(LAZYLEN(our_mind.failed_special_equipment)) podspawn(list( - "target" = get_turf(user), + "target" = get_turf(owner), "style" = STYLE_SYNDICATE, - "spawn" = mind.failed_special_equipment + "spawn" = our_mind.failed_special_equipment, )) - mind.failed_special_equipment = null - mind.RemoveSpell(src) + our_mind.failed_special_equipment = null + qdel(src) + return TRUE /datum/objective/assassinate name = "assasinate" @@ -875,12 +877,12 @@ GLOBAL_LIST_EMPTY(possible_items_special) if(!isliving(M.current)) continue var/list/all_items = M.current.get_all_contents() //this should get things in cheesewheels, books, etc. - for(var/obj/I in all_items) //Check for wanted items - if(istype(I, /obj/item/book/granter/spell)) - var/obj/item/book/granter/spell/spellbook = I - if(!spellbook.used || !spellbook.oneuse) //if the book still has powers... + for(var/obj/thing in all_items) //Check for wanted items + if(istype(thing, /obj/item/book/granter/action/spell)) + var/obj/item/book/granter/action/spell/spellbook = thing + if(spellbook.uses > 0) //if the book still has powers... stolen_count++ //it counts. nice. - else if(is_type_in_typecache(I, wanted_items)) + else if(is_type_in_typecache(thing, wanted_items)) stolen_count++ return stolen_count >= amount diff --git a/code/game/machinery/PDApainter.dm b/code/game/machinery/PDApainter.dm index cca8d6cf79f801..cf172a269655fa 100644 --- a/code/game/machinery/PDApainter.dm +++ b/code/game/machinery/PDApainter.dm @@ -377,3 +377,8 @@ /obj/machinery/pdapainter/engineering name = "\improper Engineering PDA & ID Painter" target_dept = REGION_ENGINEERING + +/// Supply departmental variant. Limited to PDAs defined in the SSid_access.sub_department_managers_tgui data structure. +/obj/machinery/pdapainter/supply + name = "\improper Supply PDA & ID Painter" + target_dept = REGION_SUPPLY diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index 97b382e010db38..c57ba341b3b91a 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -745,6 +745,7 @@ LAZYCLEARLIST(component_parts) return ..() + /** * Spawns a frame where this machine is. If the machine was not disassmbled, the * frame is spawned damaged. If the frame couldn't exist on this turf, it's smashed diff --git a/code/game/machinery/airlock_control.dm b/code/game/machinery/airlock_control.dm index e8aab954059d9d..d40539ab17b011 100644 --- a/code/game/machinery/airlock_control.dm +++ b/code/game/machinery/airlock_control.dm @@ -7,7 +7,6 @@ var/frequency var/datum/radio_frequency/radio_connection - /obj/machinery/door/airlock/receive_signal(datum/signal/signal) if(!signal) return @@ -50,7 +49,6 @@ send_status() - /obj/machinery/door/airlock/proc/send_status() if(radio_connection) var/datum/signal/signal = new(list( @@ -61,25 +59,27 @@ )) radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK) - /obj/machinery/door/airlock/open(surpress_send) . = ..() if(!surpress_send) send_status() - /obj/machinery/door/airlock/close(surpress_send) . = ..() if(!surpress_send) send_status() - /obj/machinery/door/airlock/proc/set_frequency(new_frequency) SSradio.remove_object(src, frequency) if(new_frequency) frequency = new_frequency radio_connection = SSradio.add_object(src, frequency, RADIO_AIRLOCK) +/obj/machinery/door/airlock/on_magic_unlock(datum/source, datum/action/cooldown/spell/aoe/knock/spell, mob/living/caster) + // Airlocks should unlock themselves when knock is casted, THEN open up. + locked = FALSE + return ..() + /obj/machinery/door/airlock/Destroy() if(frequency) SSradio.remove_object(src,frequency) diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 8fdde994953fd6..609b39ecc34a8c 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -33,6 +33,7 @@ "Tools", "Electronics", "Construction", + "Material", "T-Comm", "Security", "Machinery", @@ -111,9 +112,9 @@ var/datum/component/material_container/mats = GetComponent(/datum/component/material_container) for(var/datum/material/mat in D.materials) max_multiplier = min(D.maxstack, round(mats.get_material_amount(mat)/D.materials[mat])) - if (max_multiplier>10 && !disabled) + if (max_multiplier >= 10 && !disabled) m10 = TRUE - if (max_multiplier>25 && !disabled) + if (max_multiplier >= 25 && !disabled) m25 = TRUE else if(!unbuildable) diff --git a/code/game/machinery/computer/arcade/arcade.dm b/code/game/machinery/computer/arcade/arcade.dm index 810bfd015aa83e..8fa1a828f656db 100644 --- a/code/game/machinery/computer/arcade/arcade.dm +++ b/code/game/machinery/computer/arcade/arcade.dm @@ -56,6 +56,8 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( /obj/item/toy/plush/moth = 2, /obj/item/toy/plush/pkplush = 2, /obj/item/toy/plush/rouny = 2, + /obj/item/toy/plush/abductor = 2, + /obj/item/toy/plush/abductor/agent = 2, /obj/item/storage/belt/military/snack = 2, /obj/item/toy/brokenradio = 2, /obj/item/toy/braintoy = 2, diff --git a/code/game/machinery/computer/arcade/orion_event.dm b/code/game/machinery/computer/arcade/orion_event.dm index 07295d831475fc..f9f893f9c2803d 100644 --- a/code/game/machinery/computer/arcade/orion_event.dm +++ b/code/game/machinery/computer/arcade/orion_event.dm @@ -114,19 +114,19 @@ /datum/orion_event/electronic_part/emag_effect(obj/machinery/computer/arcade/orion_trail/game, mob/living/gamer) playsound(game, 'sound/effects/empulse.ogg', 50, TRUE) - game.visible_message(span_danger("[src] malfunctions, randomizing in-game stats!")) + game.visible_message(span_danger("[game] malfunctions, randomizing in-game stats!")) var/oldfood = game.food var/oldfuel = game.fuel game.food = rand(10,80) / rand(1,2) game.fuel = rand(10,60) / rand(1,2) if(game.electronics) - addtimer(CALLBACK(game, .proc/revert_random, game, oldfood, oldfuel), 1 SECONDS) + addtimer(CALLBACK(src, .proc/revert_random, game, oldfood, oldfuel), 1 SECONDS) /datum/orion_event/electronic_part/proc/revert_random(obj/machinery/computer/arcade/orion_trail/game, oldfood, oldfuel) if(oldfuel > game.fuel && oldfood > game.food) - game.audible_message(span_danger("[src] lets out a somehow reassuring chime.")) + game.audible_message(span_danger("[game] lets out a somehow reassuring chime.")) else if(oldfuel < game.fuel || oldfood < game.food) - game.audible_message(span_danger("[src] lets out a somehow ominous chime.")) + game.audible_message(span_danger("[game] lets out a somehow ominous chime.")) game.food = oldfood game.fuel = oldfuel playsound(game, 'sound/machines/chime.ogg', 50, TRUE) @@ -158,20 +158,20 @@ /datum/orion_event/hull_part/emag_effect(obj/machinery/computer/arcade/orion_trail/game, mob/living/gamer) if(prob(10+gamer_skill)) - game.say("Something slams into the floor around [src] - luckily, it didn't get through!") + game.say("Something slams into the floor around [game] - luckily, it didn't get through!") playsound(game, 'sound/effects/bang.ogg', 50, TRUE) return playsound(game, 'sound/effects/bang.ogg', 100, TRUE) - for(var/turf/open/floor/smashed in orange(1, src)) + for(var/turf/open/floor/smashed in orange(1, game)) smashed.ScrapeAway() - game.say("Something slams into the floor around [src], exposing it to space!") + game.say("Something slams into the floor around [game], exposing it to space!") if(game.hull) - addtimer(CALLBACK(game, .proc/fix_floor, game), 1 SECONDS) + addtimer(CALLBACK(src, .proc/fix_floor, game), 1 SECONDS) /datum/orion_event/hull_part/proc/fix_floor(obj/machinery/computer/arcade/orion_trail/game) - game.say("A new floor suddenly appears around [src]. What the hell?") + game.say("A new floor suddenly appears around [game]. What the hell?") playsound(game, 'sound/weapons/genhit.ogg', 100, TRUE) - for(var/turf/open/space/fixed in orange(1, src)) + for(var/turf/open/space/fixed in orange(1, game)) fixed.PlaceOnTop(/turf/open/floor/plating) #define BUTTON_EXPLORE_SHIP "Explore Ship" @@ -412,7 +412,7 @@ game.turns += 1 return ..() if(prob(75-gamer_skill)) - game.encounter_event(/datum/orion_event/black_hole_death) + game.encounter_event(/datum/orion_event/black_hole_death, usr) return game.turns += 1 ..() @@ -525,7 +525,7 @@ game.say("WEEWOO! WEEWOO! Spaceport security en route!") playsound(game, 'sound/items/weeoo1.ogg', 100, FALSE) for(var/i in 1 to 3) - var/mob/living/simple_animal/hostile/syndicate/ranged/smg/orion/spaceport_security = new(get_turf(src)) + var/mob/living/simple_animal/hostile/syndicate/ranged/smg/orion/spaceport_security = new(get_turf(game)) spaceport_security.GiveTarget(usr) game.fuel += fuel game.food += food diff --git a/code/game/machinery/computer/atmos_computers/__identifiers.dm b/code/game/machinery/computer/atmos_computers/__identifiers.dm index 3a8bfa5322c8a1..c8096472b8e627 100644 --- a/code/game/machinery/computer/atmos_computers/__identifiers.dm +++ b/code/game/machinery/computer/atmos_computers/__identifiers.dm @@ -26,7 +26,8 @@ #define ATMOS_GAS_MONITOR_HELIUM "helium" #define ATMOS_GAS_MONITOR_ANTINOBLIUM "antinoblium" #define ATMOS_GAS_MONITOR_INCINERATOR "incinerator" -#define ATMOS_GAS_MONITOR_ORDNANCE_LAB "ordnancelab" +#define ATMOS_GAS_MONITOR_ORDNANCE_BURN "ordnanceburn" +#define ATMOS_GAS_MONITOR_ORDNANCE_FREEZER "ordnancefreezer" #define ATMOS_GAS_MONITOR_DISTRO "distro" #define ATMOS_GAS_MONITOR_WASTE "waste" @@ -55,7 +56,8 @@ GLOBAL_LIST_INIT(station_gas_chambers, list( ATMOS_GAS_MONITOR_ANTINOBLIUM = "Antinoblium Supply", ATMOS_GAS_MONITOR_MIX = "Mix Chamber", ATMOS_GAS_MONITOR_INCINERATOR = "Incinerator Chamber", - ATMOS_GAS_MONITOR_ORDNANCE_LAB = "Ordnance Chamber", + ATMOS_GAS_MONITOR_ORDNANCE_BURN = "Ordnance Burn Chamber", + ATMOS_GAS_MONITOR_ORDNANCE_FREEZER = "Ordnance Freezer Chamber", ATMOS_GAS_MONITOR_DISTRO = "Distribution Loop", ATMOS_GAS_MONITOR_WASTE = "Waste Loop", )) diff --git a/code/game/machinery/computer/atmos_computers/air_sensors.dm b/code/game/machinery/computer/atmos_computers/air_sensors.dm index 429389473eea48..bd28bcbae3a27a 100644 --- a/code/game/machinery/computer/atmos_computers/air_sensors.dm +++ b/code/game/machinery/computer/atmos_computers/air_sensors.dm @@ -2,10 +2,6 @@ name = "plasma tank gas sensor" chamber_id = ATMOS_GAS_MONITOR_PLAS -/obj/machinery/air_sensor/ordnance_mixing_tank - name = "ordnance mixing gas sensor" - chamber_id = ATMOS_GAS_MONITOR_ORDNANCE_LAB - /obj/machinery/air_sensor/oxygen_tank name = "oxygen tank gas sensor" chamber_id = ATMOS_GAS_MONITOR_O2 @@ -93,3 +89,11 @@ /obj/machinery/air_sensor/incinerator_tank name = "incinerator chamber gas sensor" chamber_id = ATMOS_GAS_MONITOR_INCINERATOR + +/obj/machinery/air_sensor/ordnance_burn_chamber + name = "ordnance burn chamber gas sensor" + chamber_id = ATMOS_GAS_MONITOR_ORDNANCE_BURN + +/obj/machinery/air_sensor/ordnance_freezer_chamber + name = "ordnance freezer chamber gas sensor" + chamber_id = ATMOS_GAS_MONITOR_ORDNANCE_FREEZER diff --git a/code/game/machinery/computer/atmos_computers/atmos_controls.dm b/code/game/machinery/computer/atmos_computers/atmos_controls.dm index 6aa45f7c234a2b..bf386c83a1c385 100644 --- a/code/game/machinery/computer/atmos_computers/atmos_controls.dm +++ b/code/game/machinery/computer/atmos_computers/atmos_controls.dm @@ -118,7 +118,10 @@ circuit = /obj/item/circuitboard/computer/atmos_control/nocontrol/incinerator atmos_chambers = list(ATMOS_GAS_MONITOR_INCINERATOR = "Incinerator Chamber") -/obj/machinery/computer/atmos_control/nocontrol/ordnancemix - name = "Ordnance Chamber Monitor" - circuit = /obj/item/circuitboard/computer/atmos_control/nocontrol/ordnancemix - atmos_chambers = list(ATMOS_GAS_MONITOR_ORDNANCE_LAB = "Ordnance Chamber") +/obj/machinery/computer/atmos_control/ordnancemix + name = "Ordnance Chamber Control" + circuit = /obj/item/circuitboard/computer/atmos_control/ordnancemix + atmos_chambers = list( + ATMOS_GAS_MONITOR_ORDNANCE_BURN = "Ordnance Burn Chamber", + ATMOS_GAS_MONITOR_ORDNANCE_FREEZER = "Ordnance Freezer Chamber", + ) diff --git a/code/game/machinery/computer/atmos_computers/inlets.dm b/code/game/machinery/computer/atmos_computers/inlets.dm index 934d128f1aa853..4df5a9185f8fb0 100644 --- a/code/game/machinery/computer/atmos_computers/inlets.dm +++ b/code/game/machinery/computer/atmos_computers/inlets.dm @@ -161,6 +161,12 @@ name = "incinerator chamber input injector" chamber_id = ATMOS_GAS_MONITOR_INCINERATOR -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/ordnance_mixing_input - name = "ordnance mixing input injector" - chamber_id = ATMOS_GAS_MONITOR_ORDNANCE_LAB +/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/ordnance_burn_chamber_input + on = FALSE + name = "ordnance burn chamber input injector" + chamber_id = ATMOS_GAS_MONITOR_ORDNANCE_BURN + +/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/ordnance_freezer_chamber_input + on = FALSE + name = "ordnance freezer chamber input injector" + chamber_id = ATMOS_GAS_MONITOR_ORDNANCE_FREEZER diff --git a/code/game/machinery/computer/atmos_computers/outlets.dm b/code/game/machinery/computer/atmos_computers/outlets.dm index 5b7dac9a17651f..c20a431dacc17f 100644 --- a/code/game/machinery/computer/atmos_computers/outlets.dm +++ b/code/game/machinery/computer/atmos_computers/outlets.dm @@ -120,9 +120,13 @@ name = "incinerator chamber output inlet" chamber_id = ATMOS_GAS_MONITOR_INCINERATOR -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/ordnance_mixing_output - name = "ordnance mixing output inlet" - chamber_id = ATMOS_GAS_MONITOR_ORDNANCE_LAB +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/ordnance_burn_chamber_output + name = "ordnance burn chamber output inlet" + chamber_id = ATMOS_GAS_MONITOR_ORDNANCE_BURN + +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/ordnance_freezer_chamber_output + name = "ordnance freezer chamber output inlet" + chamber_id = ATMOS_GAS_MONITOR_ORDNANCE_FREEZER /obj/machinery/atmospherics/components/unary/vent_pump/high_volume/siphon/monitored frequency = FREQ_ATMOS_STORAGE diff --git a/code/game/machinery/computer/chef_orders/order_datum.dm b/code/game/machinery/computer/chef_orders/order_datum.dm index c0743f08074a61..5d6eb00690168f 100644 --- a/code/game/machinery/computer/chef_orders/order_datum.dm +++ b/code/game/machinery/computer/chef_orders/order_datum.dm @@ -217,6 +217,36 @@ item_instance = /obj/item/food/ready_donk/donkhiladas cost_per_order = 40 +/datum/orderable_item/tiziran_goods + name = "Tiziran Farm-Fresh Pack" + category_index = CATEGORY_MILK_EGGS + item_instance = /obj/item/storage/box/tiziran_goods + cost_per_order = 120 + +/datum/orderable_item/tiziran_cans + name = "Tiziran Canned Goods Pack" + category_index = CATEGORY_MILK_EGGS + item_instance = /obj/item/storage/box/tiziran_goods + cost_per_order = 120 + +/datum/orderable_item/tiziran_meats + name = "Tiziran Meatmarket Pack" + category_index = CATEGORY_MILK_EGGS + item_instance = /obj/item/storage/box/tiziran_meats + cost_per_order = 120 + +/datum/orderable_item/mothic_goods + name = "Mothic Farm-Fresh Pack" + category_index = CATEGORY_MILK_EGGS + item_instance = /obj/item/storage/box/mothic_goods + cost_per_order = 120 + +/datum/orderable_item/mothic_cans_sauces + name = "Mothic Pantry Pack" + category_index = CATEGORY_MILK_EGGS + item_instance = /obj/item/storage/box/mothic_cans_sauces + cost_per_order = 120 + //Reagents /datum/orderable_item/flour @@ -283,4 +313,4 @@ name = "Quality Oil" category_index = CATEGORY_SAUCES_REAGENTS item_instance = /obj/item/reagent_containers/food/condiment/quality_oil - cost_per_order = 120 //Extra Virgin, just like you, the reader + cost_per_order = 50 //Extra Virgin, just like you, the reader diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index e37a859cb97ecc..f4d600e3caf228 100755 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -197,13 +197,13 @@ playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, FALSE) return - var/new_sec_level = seclevel2num(params["newSecurityLevel"]) + var/new_sec_level = SSsecurity_level.text_level_to_number(params["newSecurityLevel"]) if (new_sec_level != SEC_LEVEL_GREEN && new_sec_level != SEC_LEVEL_BLUE) return - if (SSsecurity_level.current_level == new_sec_level) + if (SSsecurity_level.get_current_level_as_number() == new_sec_level) return - set_security_level(new_sec_level) + SSsecurity_level.set_level(new_sec_level) to_chat(usr, span_notice("Authorization confirmed. Modifying security level.")) playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE) @@ -517,7 +517,7 @@ data["shuttleCalled"] = FALSE data["shuttleLastCalled"] = FALSE data["aprilFools"] = SSevents.holidays && SSevents.holidays[APRIL_FOOLS] - data["alertLevel"] = get_security_level() + data["alertLevel"] = SSsecurity_level.get_current_level_as_text() data["authorizeName"] = authorize_name data["canLogOut"] = !issilicon(user) data["shuttleCanEvacOrFailReason"] = SSshuttle.canEvac(user) @@ -776,10 +776,27 @@ #define MIN_GHOSTS_FOR_FUGITIVES 6 /// The maximum percentage of the population to be ghosts before we no longer have the chance of spawning Sleeper Agents. #define MAX_PERCENT_GHOSTS_FOR_SLEEPER 0.2 -/// The amount of threat injected by a hack, if chosen. -#define HACK_THREAT_INJECTION_AMOUNT 15 -/* +/// Begin the process of hacking into the comms console to call in a threat. +/obj/machinery/computer/communications/proc/try_hack_console(mob/living/hacker, duration = 30 SECONDS) + if(!can_hack()) + return FALSE + + AI_notify_hack() + if(!do_after(hacker, duration, src, extra_checks = CALLBACK(src, .proc/can_hack))) + return FALSE + + hack_console(hacker) + return TRUE + +/// Checks if this console is hackable. Used as a callback during try_hack_console's doafter as well. +/obj/machinery/computer/communications/proc/can_hack() + if(machine_stat & (NOPOWER|BROKEN)) + return FALSE + + return TRUE + +/** * The communications console hack, * called by certain antagonist actions. * @@ -811,8 +828,8 @@ if(HACK_PIRATE) // Triggers pirates, which the crew may be able to pay off to prevent priority_announce( "Attention crew, it appears that someone on your station has made unexpected communication with a Syndicate ship in nearby space.", - "[command_name()] High-Priority Update" - ) + "[command_name()] High-Priority Update", + ) var/datum/round_event_control/pirates/pirate_event = locate() in SSevents.control if(!pirate_event) @@ -821,20 +838,20 @@ if(HACK_FUGITIVES) // Triggers fugitives, which can cause confusion / chaos as the crew decides which side help priority_announce( - "Attention crew, it appears that someone on your station has established an unexpected orbit with an unmarked ship in nearby space.", - "[command_name()] High-Priority Update" - ) + "Attention crew, it appears that someone on your station has made unexpected communication with an unmarked ship in nearby space.", + "[command_name()] High-Priority Update", + ) var/datum/round_event_control/fugitives/fugitive_event = locate() in SSevents.control if(!fugitive_event) CRASH("hack_console() attempted to run fugitives, but could not find an event controller!") addtimer(CALLBACK(fugitive_event, /datum/round_event_control.proc/runEvent), rand(20 SECONDS, 1 MINUTES)) - if(HACK_THREAT) // Adds a flat amount of threat to buy a (probably) more dangerous antag later + if(HACK_THREAT) // Force an unfavorable situation on the crew priority_announce( - "Attention crew, it appears that someone on your station has shifted your orbit into more dangerous territory.", - "[command_name()] High-Priority Update" - ) + SSmapping.config.orbit_shift_replacement, + "[command_name()] High-Priority Update", + ) for(var/mob/crew_member as anything in GLOB.player_list) if(!is_station_level(crew_member.z)) @@ -842,7 +859,7 @@ shake_camera(crew_member, 15, 1) var/datum/game_mode/dynamic/dynamic = SSticker.mode - dynamic.create_threat(HACK_THREAT_INJECTION_AMOUNT, list(dynamic.threat_log, dynamic.roundend_threat_log), "[worldtime2text()]: Communications console hacked by [hacker]") + dynamic.unfavorable_situation() if(HACK_SLEEPER) // Trigger one or multiple sleeper agents with the crew (or for latejoining crew) var/datum/dynamic_ruleset/midround/sleeper_agent_type = /datum/dynamic_ruleset/midround/autotraitor @@ -850,23 +867,20 @@ var/max_number_of_sleepers = clamp(round(length(GLOB.alive_player_list) / 20), 1, 3) var/num_agents_created = 0 for(var/num_agents in 1 to rand(1, max_number_of_sleepers)) - // Offset the threat cost of the sleeper agent(s) we're about to run... - dynamic.create_threat(initial(sleeper_agent_type.cost)) - // ...Then try to actually trigger a sleeper agent. - if(!dynamic.picking_specific_rule(sleeper_agent_type, TRUE)) + if(!dynamic.picking_specific_rule(sleeper_agent_type, forced = TRUE, ignore_cost = TRUE)) break num_agents_created++ if(num_agents_created <= 0) // We failed to run any midround sleeper agents, so let's be patient and run latejoin traitor - dynamic.picking_specific_rule(/datum/dynamic_ruleset/latejoin/infiltrator, TRUE) + dynamic.picking_specific_rule(/datum/dynamic_ruleset/latejoin/infiltrator, forced = TRUE, ignore_cost = TRUE) else // We spawned some sleeper agents, nice - give them a report to kickstart the paranoia priority_announce( "Attention crew, it appears that someone on your station has hijacked your telecommunications, broadcasting a Syndicate radio signal to your fellow employees.", - "[command_name()] High-Priority Update" - ) + "[command_name()] High-Priority Update", + ) #undef HACK_PIRATE #undef HACK_FUGITIVES @@ -876,7 +890,6 @@ #undef MIN_GHOSTS_FOR_PIRATES #undef MIN_GHOSTS_FOR_FUGITIVES #undef MAX_PERCENT_GHOSTS_FOR_SLEEPER -#undef HACK_THREAT_INJECTION_AMOUNT /datum/comm_message var/title diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm index 67c2f076bc7e00..88398137c90c05 100644 --- a/code/game/machinery/computer/crew.dm +++ b/code/game/machinery/computer/crew.dm @@ -121,11 +121,11 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new) JOB_STATION_ENGINEER = 41, JOB_ATMOSPHERIC_TECHNICIAN = 42, // 50-59: Cargo - JOB_HEAD_OF_PERSONNEL = 50, - JOB_QUARTERMASTER = 51, - JOB_SHAFT_MINER = 52, - JOB_CARGO_TECHNICIAN = 53, + JOB_QUARTERMASTER = 50, + JOB_SHAFT_MINER = 51, + JOB_CARGO_TECHNICIAN = 52, // 60+: Civilian/other + JOB_HEAD_OF_PERSONNEL = 60, JOB_BARTENDER = 61, JOB_COOK = 62, JOB_BOTANIST = 63, diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index 0d8c28203b6b2d..99b21fd536c568 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -502,7 +502,7 @@ What a mess.*/ else if(I && check_access(I)) active1 = null active2 = null - authenticated = I.registered_name + authenticated = (I.registered_name ? I.registered_name : "Unknown") rank = I.assignment screen = 1 else diff --git a/code/game/machinery/dance_machine.dm b/code/game/machinery/dance_machine.dm index 2c6fdc8fcb29b8..fc26394eb04495 100644 --- a/code/game/machinery/dance_machine.dm +++ b/code/game/machinery/dance_machine.dm @@ -458,7 +458,7 @@ continue if(!(M in rangers)) rangers[M] = TRUE - M.playsound_local(get_turf(M), null, volume, channel = CHANNEL_JUKEBOX, S = song_played, use_reverb = FALSE) + M.playsound_local(get_turf(M), null, volume, channel = CHANNEL_JUKEBOX, sound_to_use = song_played, use_reverb = FALSE) for(var/mob/L in rangers) if(get_dist(src,L) > 10) rangers -= L diff --git a/code/game/machinery/defibrillator_mount.dm b/code/game/machinery/defibrillator_mount.dm index 2b9851033e0e79..648e5ae15d8c71 100644 --- a/code/game/machinery/defibrillator_mount.dm +++ b/code/game/machinery/defibrillator_mount.dm @@ -41,7 +41,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/defibrillator_mount, 28) . = ..() if(defib) . += span_notice("There is a defib unit hooked up. Alt-click to remove it.") - if(SSsecurity_level.current_level >= SEC_LEVEL_RED) + if(SSsecurity_level.get_current_level_as_number() >= SEC_LEVEL_RED) . += span_notice("Due to a security situation, its locking clamps can be toggled by swiping any ID.") else . += span_notice("Its locking clamps can be [clamps_locked ? "dis" : ""]engaged by swiping an ID with access.") @@ -107,7 +107,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/defibrillator_mount, 28) return var/obj/item/card/id = I.GetID() if(id) - if(check_access(id) || SSsecurity_level.current_level >= SEC_LEVEL_RED) //anyone can toggle the clamps in red alert! + if(check_access(id) || SSsecurity_level.get_current_level_as_number() >= SEC_LEVEL_RED) //anyone can toggle the clamps in red alert! if(!defib) to_chat(user, span_warning("You can't engage the clamps on a defibrillator that isn't there.")) return diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 26015873b55de7..c471b26b6363ff 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -65,10 +65,15 @@ explosion_block = EXPLOSION_BLOCK_PROC RegisterSignal(SSsecurity_level, COMSIG_SECURITY_LEVEL_CHANGED, .proc/check_security_level) + var/static/list/loc_connections = list( + COMSIG_ATOM_MAGICALLY_UNLOCKED = .proc/on_magic_unlock, + ) + AddElement(/datum/element/connect_loc, loc_connections) + /obj/machinery/door/examine(mob/user) . = ..() if(red_alert_access) - if(SSsecurity_level.current_level >= SEC_LEVEL_RED) + if(SSsecurity_level.get_current_level_as_number() >= SEC_LEVEL_RED) . += span_notice("Due to a security threat, its access requirements have been lifted!") else . += span_notice("In the event of a red alert, its access requirements will automatically lift.") @@ -88,7 +93,7 @@ return CONTEXTUAL_SCREENTIP_SET /obj/machinery/door/check_access_list(list/access_list) - if(red_alert_access && SSsecurity_level.current_level >= SEC_LEVEL_RED) + if(red_alert_access && SSsecurity_level.get_current_level_as_number() >= SEC_LEVEL_RED) return TRUE return ..() @@ -483,5 +488,10 @@ zap_flags &= ~ZAP_OBJ_DAMAGE . = ..() +/// Signal proc for [COMSIG_ATOM_MAGICALLY_UNLOCKED]. Open up when someone casts knock. +/obj/machinery/door/proc/on_magic_unlock(datum/source, datum/action/cooldown/spell/aoe/knock/spell, mob/living/caster) + SIGNAL_HANDLER + + INVOKE_ASYNC(src, .proc/open) #undef DOOR_CLOSE_WAIT diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 3f90440257f3d3..dc4e834914867b 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -82,7 +82,7 @@ RegisterSignal(src, COMSIG_MERGER_ADDING, .proc/merger_adding) RegisterSignal(src, COMSIG_MERGER_REMOVING, .proc/merger_removing) GetMergeGroup(merger_id, merger_typecache) - register_adjacent_turfs(src) + register_adjacent_turfs() if(alarm_type) // Fucking subtypes fucking mappers fucking hhhhhhhh start_activation_process(alarm_type) @@ -215,29 +215,35 @@ var/turf/checked_turf = get_step(get_turf(firelock), dir) if(!checked_turf) continue + if(isclosedturf(checked_turf)) + continue process_results(checked_turf) -/obj/machinery/door/firedoor/proc/register_adjacent_turfs(atom/loc) +/obj/machinery/door/firedoor/proc/register_adjacent_turfs() if(!loc) return - RegisterSignal(loc, COMSIG_TURF_CALCULATED_ADJACENT_ATMOS, .proc/process_results) + var/turf/our_turf = get_turf(loc) + RegisterSignal(our_turf, COMSIG_TURF_CALCULATED_ADJACENT_ATMOS, .proc/process_results) for(var/dir in GLOB.cardinals) - var/turf/checked_turf = get_step(get_turf(loc), dir) + var/turf/checked_turf = get_step(our_turf, dir) if(!checked_turf) continue + if(isclosedturf(checked_turf)) + continue process_results(checked_turf) RegisterSignal(checked_turf, COMSIG_TURF_EXPOSE, .proc/process_results) -/obj/machinery/door/firedoor/proc/unregister_adjacent_turfs(atom/loc) +/obj/machinery/door/firedoor/proc/unregister_adjacent_turfs(atom/old_loc) if(!loc) return - UnregisterSignal(loc, COMSIG_TURF_CALCULATED_ADJACENT_ATMOS) + var/turf/our_turf = get_turf(old_loc) + UnregisterSignal(our_turf, COMSIG_TURF_CALCULATED_ADJACENT_ATMOS) for(var/dir in GLOB.cardinals) - var/turf/checked_turf = get_step(get_turf(loc), dir) + var/turf/checked_turf = get_step(our_turf, dir) if(!checked_turf) continue @@ -647,7 +653,7 @@ /obj/machinery/door/firedoor/Moved(atom/oldloc) . = ..() unregister_adjacent_turfs(oldloc) - register_adjacent_turfs(src) + register_adjacent_turfs() /obj/machinery/door/firedoor/closed icon_state = "door_closed" diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm index 7a5fad78b1b189..31be707ea873ab 100644 --- a/code/game/machinery/firealarm.dm +++ b/code/game/machinery/firealarm.dm @@ -128,9 +128,9 @@ . += "fire_overlay" if(is_station_level(z)) - . += "fire_[SSsecurity_level.current_level]" - . += mutable_appearance(icon, "fire_[SSsecurity_level.current_level]") - . += emissive_appearance(icon, "fire_[SSsecurity_level.current_level]", alpha = src.alpha) + . += "fire_[SSsecurity_level.get_current_level_as_number()]" + . += mutable_appearance(icon, "fire_[SSsecurity_level.get_current_level_as_number()]") + . += emissive_appearance(icon, "fire_[SSsecurity_level.get_current_level_as_number()]", alpha = src.alpha) else . += "fire_[SEC_LEVEL_GREEN]" . += mutable_appearance(icon, "fire_[SEC_LEVEL_GREEN]") diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index 88a3ad7e89ab86..ec538eb202f9dd 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -39,7 +39,8 @@ Possible to do for anyone motivated enough: icon_state = "holopad0" base_icon_state = "holopad" layer = LOW_OBJ_LAYER - plane = FLOOR_PLANE + /// The plane is set such that it shows up without being covered by pipes/wires in a map editor, we change this on initialize. + plane = GAME_PLANE req_access = list(ACCESS_KEYCARD_AUTH) //Used to allow for forced connecting to other (not secure) holopads. Anyone can make a call, though. max_integrity = 300 armor = list(MELEE = 50, BULLET = 20, LASER = 20, ENERGY = 20, BOMB = 0, BIO = 0, FIRE = 50, ACID = 0) @@ -86,6 +87,12 @@ Possible to do for anyone motivated enough: ///bitfield. used to turn on and off hearing sensitivity depending on if we can act on Hear() at all - meant for lowering the number of unessesary hearable atoms var/can_hear_flags = NONE +/obj/machinery/holopad/Initialize(mapload) + . = ..() + /// We set the plane on mapload such that we can see the holopad render over atmospherics pipe and cabling in a map editor (without initialization), but so it gets that "inset" look in the floor in-game. + plane = FLOOR_PLANE + update_overlays() + /obj/machinery/holopad/secure name = "secure holopad" desc = "It's a floor-mounted device for projecting holographic images. This one will refuse to auto-connect incoming calls." diff --git a/code/game/machinery/limbgrower.dm b/code/game/machinery/limbgrower.dm index 0e800a15365f44..217f80878e329d 100644 --- a/code/game/machinery/limbgrower.dm +++ b/code/game/machinery/limbgrower.dm @@ -216,7 +216,7 @@ limb = new buildpath(loc) limb.name = "\improper synthetic [selected_category] [limb.plaintext_zone]" limb.limb_id = selected_category - limb.mutation_color = "#62A262" + limb.species_color = "#62A262" limb.update_icon_dropped() ///Returns a valid limb typepath based on the selected option diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm index 33ea2c265daf62..8d088dfd5d81a8 100644 --- a/code/game/machinery/recycler.dm +++ b/code/game/machinery/recycler.dm @@ -49,14 +49,8 @@ /obj/machinery/recycler/RefreshParts() . = ..() var/amt_made = 0 - var/mat_mod = 0 - for(var/obj/item/stock_parts/matter_bin/B in component_parts) - mat_mod = 2 * B.rating - mat_mod *= 50000 for(var/obj/item/stock_parts/manipulator/M in component_parts) amt_made = 12.5 * M.rating //% of materials salvaged - var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) - materials.max_amount = mat_mod amount_produced = min(50, amt_made) + 50 var/datum/component/butchering/butchering = GetComponent(/datum/component/butchering/recycler) butchering.effectiveness = amount_produced @@ -167,22 +161,21 @@ qdel(content) /obj/machinery/recycler/proc/recycle_item(obj/item/I) - var/obj/item/grown/log/L = I if(istype(L)) var/seed_modifier = 0 if(L.seed) seed_modifier = round(L.seed.potency / 25) new L.plank_type(loc, 1 + seed_modifier) + qdel(I) else var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) var/material_amount = materials.get_item_material_amount(I, BREAKDOWN_FLAGS_RECYCLER) if(!material_amount) return materials.insert_item(I, material_amount, multiplier = (amount_produced / 100), breakdown_flags=BREAKDOWN_FLAGS_RECYCLER) + qdel(I) materials.retrieve_all() - qdel(I) - /obj/machinery/recycler/proc/emergency_stop() playsound(src, 'sound/machines/buzz-sigh.ogg', 50, FALSE) @@ -228,6 +221,6 @@ /obj/item/paper/guides/recycler name = "paper - 'garbage duty instructions'" - info = "

New Assignment

You have been assigned to collect garbage from trash bins, located around the station. The crewmembers will put their trash into it and you will collect the said trash.

There is a recycling machine near your closet, inside maintenance; use it to recycle the trash for a small chance to get useful minerals. Then deliver these minerals to cargo or engineering. You are our last hope for a clean station, do not screw this up!" + info = "

New Assignment

You have been assigned to collect garbage from trash bins, located around the station. The crewmembers will put their trash into it and you will collect said trash.

There is a recycling machine near your closet, inside maintenance; use it to recycle the trash for a small chance to get useful minerals. Then, deliver these minerals to cargo or engineering. You are our last hope for a clean station. Do not screw this up!" #undef SAFETY_COOLDOWN diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index 7bcda26b8b0517..70d2df27f34b87 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -389,7 +389,7 @@ 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) var/datum/effect_system/fluid_spread/smoke/bad/black/smoke = new - smoke.set_up(0, location = src) + smoke.set_up(0, holder = src, location = src) smoke.start() QDEL_NULL(helmet) QDEL_NULL(suit) diff --git a/code/game/machinery/telecomms/computers/message.dm b/code/game/machinery/telecomms/computers/message.dm index 5f9cd39505ae90..9d153abfaf0197 100644 --- a/code/game/machinery/telecomms/computers/message.dm +++ b/code/game/machinery/telecomms/computers/message.dm @@ -33,6 +33,13 @@ var/message = "System bootup complete. Please select an option." // The message that shows on the main menu. var/auth = FALSE // Are they authenticated? var/optioncount = 7 + // Custom Message Properties + var/customsender = "System Administrator" + var/customrecepient = null + var/customjob = "Admin" + var/custommessage = "This is a test, please ignore." + + /obj/machinery/computer/message_monitor/screwdriver_act(mob/living/user, obj/item/I) if(obj_flags & EMAGGED) @@ -183,6 +190,24 @@ 10010000001110100011010000110000101110100001000000111010
001101001011011010110010100101110"} + //Fake messages + if(MSG_MON_SCREEN_CUSTOM_MSG) + dat += "
Back - Reset

" + + dat += {" + + + + "} + //Sender - Sender's Job - Recepient - Message + //Al Green- Your Dad - Your Mom - WHAT UP!? + + dat += {" + + + "} + dat += "
SenderSender's JobRecipientMessage
[customsender][customjob][customrecepient ? customrecepient : "NONE"][custommessage]

Send" + //Request Console Logs if(MSG_MON_SCREEN_REQUEST_LOGS) @@ -226,6 +251,12 @@ /obj/machinery/computer/message_monitor/proc/UnmagConsole() obj_flags &= ~EMAGGED +/obj/machinery/computer/message_monitor/proc/ResetMessage() + customsender = "System Administrator" + customrecepient = null + custommessage = "This is a test, please ignore." + customjob = "Admin" + /obj/machinery/computer/message_monitor/Topic(href, href_list) if(..()) return @@ -334,6 +365,77 @@ linkedServer.rc_msgs -= locate(href_list["delete_requests"]) in linkedServer.rc_msgs message = span_notice("NOTICE: Log Deleted!") + //Create a custom message + if (href_list["msg"]) + if(LINKED_SERVER_NONRESPONSIVE) + message = noserver + else if(auth) + screen = MSG_MON_SCREEN_CUSTOM_MSG + + //Fake messaging selection - KEY REQUIRED + if (href_list["select"]) + if(LINKED_SERVER_NONRESPONSIVE) + message = noserver + screen = MSG_MON_SCREEN_MAIN + else + switch(href_list["select"]) + + //Reset + if("Reset") + ResetMessage() + + //Select Your Name + if("Sender") + customsender = tgui_input_text(usr, "Please enter the sender's name.", "Sender") || customsender + + //Select Receiver + if("Recepient") + // Get out list of viable tablets + var/list/viewable_tablets = list() + for (var/obj/item/modular_computer/tablet in GLOB.TabletMessengers) + if(!tablet.saved_identification || tablet.invisible) + continue + viewable_tablets += tablet + if(length(viewable_tablets) > 0) + customrecepient = tgui_input_list(usr, "Select a tablet from the list", "Tablet Selection", viewable_tablets) + else + customrecepient = null + + //Enter custom job + if("RecJob") + customjob = tgui_input_text(usr, "Please enter the sender's job.", "Job") || customjob + + //Enter message + if("Message") + custommessage = tgui_input_text(usr, "Please enter your message.", "Message") || custommessage + + //Send message + if("Send") + if(isnull(customsender) || customsender == "") + customsender = "UNKNOWN" + + if(isnull(customrecepient)) + message = span_notice("NOTICE: No recepient selected!") + return attack_hand(usr) + + if(isnull(custommessage) || custommessage == "") + message = span_notice("NOTICE: No message entered!") + return attack_hand(usr) + + var/datum/signal/subspace/messaging/tablet_msg/signal = new(src, list( + "name" = "[customsender]", + "job" = "[customjob]", + "message" = html_decode(custommessage), + "ref" = REF(src), + "targets" = list(customrecepient), + "emojis" = FALSE, + "rigged" = FALSE, + "automated" = FALSE, + )) + // this will log the signal and transmit it to the target + linkedServer.receive_information(signal, null) + usr.log_message("(Tablet: [name] | [usr.real_name]) sent \"[custommessage]\" to [signal.format_target()]", LOG_PDA) + //Request Console Logs - KEY REQUIRED if(href_list["view_requests"]) if(LINKED_SERVER_NONRESPONSIVE) diff --git a/code/game/objects/effects/anomalies.dm b/code/game/objects/effects/anomalies.dm index 7829202a2c523e..d856dd4fd16fcd 100644 --- a/code/game/objects/effects/anomalies.dm +++ b/code/game/objects/effects/anomalies.dm @@ -184,6 +184,11 @@ /obj/effect/anomaly/grav/high/proc/setup_grav_field() grav_field = new(src, 7, TRUE, rand(0, 3)) +/obj/effect/anomaly/grav/high/detonate() + for(var/obj/machinery/gravity_generator/main/the_generator in GLOB.machines) + if(is_station_level(the_generator.z)) + the_generator.blackout() + /obj/effect/anomaly/grav/high/Destroy() QDEL_NULL(grav_field) . = ..() @@ -423,10 +428,10 @@ if(EXPLODE_LIGHT) SSexplosions.lowturf += T -/obj/effect/anomaly/delimber - name = "delimber anomaly" - icon_state = "delimber_anomaly" - aSignal = /obj/item/assembly/signaler/anomaly/delimber +/obj/effect/anomaly/bioscrambler + name = "bioscrambler anomaly" + icon_state = "bioscrambler_anomaly" + aSignal = /obj/item/assembly/signaler/anomaly/bioscrambler immortal = TRUE /// Cooldown for every anomaly pulse COOLDOWN_DECLARE(pulse_cooldown) @@ -443,7 +448,7 @@ var/static/list/l_legs var/static/list/r_legs -/obj/effect/anomaly/delimber/Initialize(mapload, new_lifespan, drops_core) +/obj/effect/anomaly/bioscrambler/Initialize(mapload, new_lifespan, drops_core) . = ..() if(!chests) chests = typesof(/obj/item/bodypart/chest) @@ -458,7 +463,7 @@ if(!r_legs) r_legs = typesof(/obj/item/bodypart/r_leg) -/obj/effect/anomaly/delimber/anomalyEffect(delta_time) +/obj/effect/anomaly/bioscrambler/anomalyEffect(delta_time) . = ..() if(!COOLDOWN_FINISHED(src, pulse_cooldown)) @@ -468,7 +473,7 @@ swap_parts(range) -/obj/effect/anomaly/delimber/proc/swap_parts(swap_range) +/obj/effect/anomaly/bioscrambler/proc/swap_parts(swap_range) for(var/mob/living/carbon/nearby in range(swap_range, src)) if(nearby.run_armor_check(attack_flag = BIO, absorb_text = "Your armor protects you from [src]!") >= 100) continue //We are protected diff --git a/code/game/objects/effects/decals/cleanable.dm b/code/game/objects/effects/decals/cleanable.dm index e4dacb783d244b..6e8864acbdc04d 100644 --- a/code/game/objects/effects/decals/cleanable.dm +++ b/code/game/objects/effects/decals/cleanable.dm @@ -104,11 +104,28 @@ return TRUE return . +/** + * Checks if this decal is a valid decal that can be blood crawled in. + */ /obj/effect/decal/cleanable/proc/can_bloodcrawl_in() if((blood_state != BLOOD_STATE_OIL) && (blood_state != BLOOD_STATE_NOT_BLOODY)) return bloodiness - else - return 0 + + return FALSE + +/** + * Gets the color associated with the any blood present on this decal. If there is no blood, returns null. + */ +/obj/effect/decal/cleanable/proc/get_blood_color() + switch(blood_state) + if(BLOOD_STATE_HUMAN) + return rgb(149, 10, 10) + if(BLOOD_STATE_XENO) + return rgb(43, 186, 0) + if(BLOOD_STATE_OIL) + return rgb(22, 22, 22) + + return null /obj/effect/decal/cleanable/proc/handle_merge_decal(obj/effect/decal/cleanable/merger) if(!merger) diff --git a/code/game/objects/effects/decals/turfdecal/markings.dm b/code/game/objects/effects/decals/turfdecal/markings.dm index 02a9b5f7f1eef2..6dfb6d664b9ba1 100644 --- a/code/game/objects/effects/decals/turfdecal/markings.dm +++ b/code/game/objects/effects/decals/turfdecal/markings.dm @@ -246,6 +246,15 @@ /obj/effect/turf_decal/siding/red/end icon_state = "siding_end" +/obj/effect/turf_decal/siding/dark_red + color = "#B11111" + +/obj/effect/turf_decal/siding/dark_red/corner + icon_state = "siding_corner" + +/obj/effect/turf_decal/siding/dark_red/end + icon_state = "siding_end" + /obj/effect/turf_decal/siding/green color = "#9FED58" @@ -255,6 +264,15 @@ /obj/effect/turf_decal/siding/green/end icon_state = "siding_end" +/obj/effect/turf_decal/siding/dark_green + color = "#439C1E" + +/obj/effect/turf_decal/siding/dark_green/corner + icon_state = "siding_corner" + +/obj/effect/turf_decal/siding/dark_green/end + icon_state = "siding_end" + /obj/effect/turf_decal/siding/blue color = "#52B4E9" @@ -264,6 +282,15 @@ /obj/effect/turf_decal/siding/blue/end icon_state = "siding_end" +/obj/effect/turf_decal/siding/dark_blue + color = "#486091" + +/obj/effect/turf_decal/siding/dark_blue/corner + icon_state = "siding_corner" + +/obj/effect/turf_decal/siding/dark_blue/end + icon_state = "siding_end" + /obj/effect/turf_decal/siding/yellow color = "#EFB341" @@ -291,6 +318,15 @@ /obj/effect/turf_decal/siding/brown/end icon_state = "siding_end" +/obj/effect/turf_decal/siding/dark + color = "#474747" + +/obj/effect/turf_decal/siding/dark/corner + icon_state = "siding_corner" + +/obj/effect/turf_decal/siding/dark/end + icon_state = "siding_end" + /obj/effect/turf_decal/siding/wood icon_state = "siding_wood_line" color = "#55391A" diff --git a/code/game/objects/effects/decals/turfdecal/tilecoloring.dm b/code/game/objects/effects/decals/turfdecal/tilecoloring.dm index baca2520e3a6a4..a2ff0fed26b1ea 100644 --- a/code/game/objects/effects/decals/turfdecal/tilecoloring.dm +++ b/code/game/objects/effects/decals/turfdecal/tilecoloring.dm @@ -63,6 +63,48 @@ icon_state = "diagonal_edge" name = "blue diagonal edge" +/// Dark blue tiles + +/obj/effect/turf_decal/tile/dark_blue + name = "dark blue corner" + color = "#486091" + +/obj/effect/turf_decal/tile/dark_blue/opposingcorners + icon_state = "tile_opposing_corners" + name = "opposing dark blue corners" + +/obj/effect/turf_decal/tile/dark_blue/half + icon_state = "tile_half" + name = "dark blue half" + +/obj/effect/turf_decal/tile/dark_blue/half/contrasted + icon_state = "tile_half_contrasted" + name = "contrasted dark blue half" + +/obj/effect/turf_decal/tile/dark_blue/anticorner + icon_state = "tile_anticorner" + name = "dark blue anticorner" + +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted + icon_state = "tile_anticorner_contrasted" + name = "contrasted dark blue anticorner" + +/obj/effect/turf_decal/tile/dark_blue/fourcorners + icon_state = "tile_fourcorners" + name = "dark blue fourcorners" + +/obj/effect/turf_decal/tile/dark_blue/full + icon_state = "tile_full" + name = "dark blue full" + +/obj/effect/turf_decal/tile/dark_blue/diagonal_centre + icon_state = "diagonal_centre" + name = "dark blue diagonal centre" + +/obj/effect/turf_decal/tile/dark_blue/diagonal_edge + icon_state = "diagonal_edge" + name = "dark blue diagonal edge" + /// Green tiles /obj/effect/turf_decal/tile/green @@ -105,6 +147,48 @@ icon_state = "diagonal_edge" name = "green diagonal edge" +/// Dark green tiles + +/obj/effect/turf_decal/tile/dark_green + name = "dark green corner" + color = "#439C1E" + +/obj/effect/turf_decal/tile/dark_green/opposingcorners + icon_state = "tile_opposing_corners" + name = "opposing dark green corners" + +/obj/effect/turf_decal/tile/dark_green/half + icon_state = "tile_half" + name = "dark green half" + +/obj/effect/turf_decal/tile/dark_green/half/contrasted + icon_state = "tile_half_contrasted" + name = "contrasted dark green half" + +/obj/effect/turf_decal/tile/dark_green/anticorner + icon_state = "tile_anticorner" + name = "dark green anticorner" + +/obj/effect/turf_decal/tile/dark_green/anticorner/contrasted + icon_state = "tile_anticorner_contrasted" + name = "contrasted dark green anticorner" + +/obj/effect/turf_decal/tile/dark_green/fourcorners + icon_state = "tile_fourcorners" + name = "dark green fourcorners" + +/obj/effect/turf_decal/tile/dark_green/full + icon_state = "tile_full" + name = "dark green full" + +/obj/effect/turf_decal/tile/dark_green/diagonal_centre + icon_state = "diagonal_centre" + name = "dark green diagonal centre" + +/obj/effect/turf_decal/tile/dark_green/diagonal_edge + icon_state = "diagonal_edge" + name = "dark green diagonal edge" + /// Yellow tiles /obj/effect/turf_decal/tile/yellow @@ -189,6 +273,48 @@ icon_state = "diagonal_edge" name = "red diagonal edge" +/// Dark red tiles + +/obj/effect/turf_decal/tile/dark_red + name = "dark red corner" + color = "#B11111" + +/obj/effect/turf_decal/tile/dark_red/opposingcorners + icon_state = "tile_opposing_corners" + name = "opposing dark_red corners" + +/obj/effect/turf_decal/tile/dark_red/half + icon_state = "tile_half" + name = "dark red half" + +/obj/effect/turf_decal/tile/dark_red/half/contrasted + icon_state = "tile_half_contrasted" + name = "contrasted dark red half" + +/obj/effect/turf_decal/tile/dark_red/anticorner + icon_state = "tile_anticorner" + name = "dark red anticorner" + +/obj/effect/turf_decal/tile/dark_red/anticorner/contrasted + icon_state = "tile_anticorner_contrasted" + name = "contrasted dark red anticorner" + +/obj/effect/turf_decal/tile/dark_red/fourcorners + icon_state = "tile_fourcorners" + name = "dark red fourcorners" + +/obj/effect/turf_decal/tile/dark_red/full + icon_state = "tile_full" + name = "dark red full" + +/obj/effect/turf_decal/tile/dark_red/diagonal_centre + icon_state = "diagonal_centre" + name = "dark red diagonal centre" + +/obj/effect/turf_decal/tile/dark_red/diagonal_edge + icon_state = "diagonal_edge" + name = "dark red diagonal edge" + /// Bar tiles /obj/effect/turf_decal/tile/bar @@ -571,6 +697,62 @@ /obj/effect/turf_decal/trimline/red/filled/shrink_ccw icon_state = "trimline_shrink_ccw" +/// Dark red trimlines + +/obj/effect/turf_decal/trimline/dark_red + color = "#B11111" + +/obj/effect/turf_decal/trimline/dark_red/line + icon_state = "trimline" + +/obj/effect/turf_decal/trimline/dark_red/corner + icon_state = "trimline_corner" + +/obj/effect/turf_decal/trimline/dark_red/end + icon_state = "trimline_end" + +/obj/effect/turf_decal/trimline/dark_red/arrow_cw + icon_state = "trimline_arrow_cw" + +/obj/effect/turf_decal/trimline/dark_red/arrow_ccw + icon_state = "trimline_arrow_ccw" + +/obj/effect/turf_decal/trimline/dark_red/warning + icon_state = "trimline_warn" + +/obj/effect/turf_decal/trimline/dark_red/mid_joiner + icon_state = "trimline_mid" + +/obj/effect/turf_decal/trimline/dark_red/filled + icon_state = "trimline_box_fill" + +/obj/effect/turf_decal/trimline/dark_red/filled/line + icon_state = "trimline_fill" + +/obj/effect/turf_decal/trimline/dark_red/filled/corner + icon_state = "trimline_corner_fill" + +/obj/effect/turf_decal/trimline/dark_red/filled/end + icon_state = "trimline_end_fill" + +/obj/effect/turf_decal/trimline/dark_red/filled/arrow_cw + icon_state = "trimline_arrow_cw_fill" + +/obj/effect/turf_decal/trimline/dark_red/filled/arrow_ccw + icon_state = "trimline_arrow_ccw_fill" + +/obj/effect/turf_decal/trimline/dark_red/filled/warning + icon_state = "trimline_warn_fill" + +/obj/effect/turf_decal/trimline/dark_red/filled/mid_joiner + icon_state = "trimline_mid_fill" + +/obj/effect/turf_decal/trimline/dark_red/filled/shrink_cw + icon_state = "trimline_shrink_cw" + +/obj/effect/turf_decal/trimline/dark_red/filled/shrink_ccw + icon_state = "trimline_shrink_ccw" + /// Green trimlines /obj/effect/turf_decal/trimline/green @@ -627,6 +809,62 @@ /obj/effect/turf_decal/trimline/green/filled/shrink_ccw icon_state = "trimline_shrink_ccw" +/// Dark green Trimlines + +/obj/effect/turf_decal/trimline/dark_green + color = "#439C1E" + +/obj/effect/turf_decal/trimline/dark_green/line + icon_state = "trimline" + +/obj/effect/turf_decal/trimline/dark_green/corner + icon_state = "trimline_corner" + +/obj/effect/turf_decal/trimline/dark_green/end + icon_state = "trimline_end" + +/obj/effect/turf_decal/trimline/dark_green/arrow_cw + icon_state = "trimline_arrow_cw" + +/obj/effect/turf_decal/trimline/dark_green/arrow_ccw + icon_state = "trimline_arrow_ccw" + +/obj/effect/turf_decal/trimline/dark_green/warning + icon_state = "trimline_warn" + +/obj/effect/turf_decal/trimline/dark_green/mid_joiner + icon_state = "trimline_mid" + +/obj/effect/turf_decal/trimline/dark_green/filled + icon_state = "trimline_box_fill" + +/obj/effect/turf_decal/trimline/dark_green/filled/line + icon_state = "trimline_fill" + +/obj/effect/turf_decal/trimline/dark_green/filled/corner + icon_state = "trimline_corner_fill" + +/obj/effect/turf_decal/trimline/dark_green/filled/end + icon_state = "trimline_end_fill" + +/obj/effect/turf_decal/trimline/dark_green/filled/arrow_cw + icon_state = "trimline_arrow_cw_fill" + +/obj/effect/turf_decal/trimline/dark_green/filled/arrow_ccw + icon_state = "trimline_arrow_ccw_fill" + +/obj/effect/turf_decal/trimline/dark_green/filled/warning + icon_state = "trimline_warn_fill" + +/obj/effect/turf_decal/trimline/dark_green/filled/mid_joiner + icon_state = "trimline_mid_fill" + +/obj/effect/turf_decal/trimline/dark_green/filled/shrink_cw + icon_state = "trimline_shrink_cw" + +/obj/effect/turf_decal/trimline/dark_green/filled/shrink_ccw + icon_state = "trimline_shrink_ccw" + /// Blue trimlines /obj/effect/turf_decal/trimline/blue @@ -683,6 +921,62 @@ /obj/effect/turf_decal/trimline/blue/filled/shrink_ccw icon_state = "trimline_shrink_ccw" +/// Dark blue trimlines + +/obj/effect/turf_decal/trimline/dark_blue + color = "#486091" + +/obj/effect/turf_decal/trimline/dark_blue/line + icon_state = "trimline" + +/obj/effect/turf_decal/trimline/dark_blue/corner + icon_state = "trimline_corner" + +/obj/effect/turf_decal/trimline/dark_blue/end + icon_state = "trimline_end" + +/obj/effect/turf_decal/trimline/dark_blue/arrow_cw + icon_state = "trimline_arrow_cw" + +/obj/effect/turf_decal/trimline/dark_blue/arrow_ccw + icon_state = "trimline_arrow_ccw" + +/obj/effect/turf_decal/trimline/dark_blue/warning + icon_state = "trimline_warn" + +/obj/effect/turf_decal/trimline/dark_blue/mid_joiner + icon_state = "trimline_mid" + +/obj/effect/turf_decal/trimline/dark_blue/filled + icon_state = "trimline_box_fill" + +/obj/effect/turf_decal/trimline/dark_blue/filled/line + icon_state = "trimline_fill" + +/obj/effect/turf_decal/trimline/dark_blue/filled/corner + icon_state = "trimline_corner_fill" + +/obj/effect/turf_decal/trimline/dark_blue/filled/end + icon_state = "trimline_end_fill" + +/obj/effect/turf_decal/trimline/dark_blue/filled/arrow_cw + icon_state = "trimline_arrow_cw_fill" + +/obj/effect/turf_decal/trimline/dark_blue/filled/arrow_ccw + icon_state = "trimline_arrow_ccw_fill" + +/obj/effect/turf_decal/trimline/dark_blue/filled/warning + icon_state = "trimline_warn_fill" + +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner + icon_state = "trimline_mid_fill" + +/obj/effect/turf_decal/trimline/dark_blue/filled/shrink_cw + icon_state = "trimline_shrink_cw" + +/obj/effect/turf_decal/trimline/dark_blue/filled/shrink_ccw + icon_state = "trimline_shrink_ccw" + /// Yellow trimlines /obj/effect/turf_decal/trimline/yellow @@ -907,3 +1201,59 @@ /obj/effect/turf_decal/trimline/neutral/filled/shrink_ccw icon_state = "trimline_shrink_ccw" + +/// Dark trimlines + +/obj/effect/turf_decal/trimline/dark + color = "#0e0f0f" + +/obj/effect/turf_decal/trimline/dark/line + icon_state = "trimline" + +/obj/effect/turf_decal/trimline/dark/corner + icon_state = "trimline_corner" + +/obj/effect/turf_decal/trimline/dark/end + icon_state = "trimline_end" + +/obj/effect/turf_decal/trimline/dark/arrow_cw + icon_state = "trimline_arrow_cw" + +/obj/effect/turf_decal/trimline/dark/arrow_ccw + icon_state = "trimline_arrow_ccw" + +/obj/effect/turf_decal/trimline/dark/warning + icon_state = "trimline_warn" + +/obj/effect/turf_decal/trimline/dark/mid_joiner + icon_state = "trimline_mid" + +/obj/effect/turf_decal/trimline/dark/filled + icon_state = "trimline_box_fill" + +/obj/effect/turf_decal/trimline/dark/filled/line + icon_state = "trimline_fill" + +/obj/effect/turf_decal/trimline/dark/filled/corner + icon_state = "trimline_corner_fill" + +/obj/effect/turf_decal/trimline/dark/filled/end + icon_state = "trimline_end_fill" + +/obj/effect/turf_decal/trimline/dark/filled/arrow_cw + icon_state = "trimline_arrow_cw_fill" + +/obj/effect/turf_decal/trimline/dark/filled/arrow_ccw + icon_state = "trimline_arrow_ccw_fill" + +/obj/effect/turf_decal/trimline/dark/filled/warning + icon_state = "trimline_warn_fill" + +/obj/effect/turf_decal/trimline/dark/filled/mid_joiner + icon_state = "trimline_mid_fill" + +/obj/effect/turf_decal/trimline/dark/filled/shrink_cw + icon_state = "trimline_shrink_cw" + +/obj/effect/turf_decal/trimline/dark/filled/shrink_ccw + icon_state = "trimline_shrink_ccw" diff --git a/code/game/objects/effects/effect_system/effects_explosion.dm b/code/game/objects/effects/effect_system/effects_explosion.dm index 13d32870de814e..e13010c4154caa 100644 --- a/code/game/objects/effects/effect_system/effects_explosion.dm +++ b/code/game/objects/effects/effect_system/effects_explosion.dm @@ -58,7 +58,7 @@ /datum/effect_system/explosion/smoke/proc/create_smoke() var/datum/effect_system/fluid_spread/smoke/S = new - S.set_up(2, location = location) + S.set_up(2, holder = holder, location = location) S.start() /datum/effect_system/explosion/smoke/start() diff --git a/code/game/objects/effects/effect_system/fluid_spread/_fluid_spread.dm b/code/game/objects/effects/effect_system/fluid_spread/_fluid_spread.dm index 9f9929f53c943a..5ce9fe02bd4b34 100644 --- a/code/game/objects/effects/effect_system/fluid_spread/_fluid_spread.dm +++ b/code/game/objects/effects/effect_system/fluid_spread/_fluid_spread.dm @@ -96,6 +96,7 @@ if(!group) group = source?.group || new group.add_node(src) + source?.transfer_fingerprints_to(src) /obj/effect/particle_effect/fluid/Destroy() group.remove_node(src) @@ -118,11 +119,42 @@ /// The amount of smoke to produce. var/amount = 10 -/datum/effect_system/fluid_spread/set_up(range = 1, amount = DIAMOND_AREA(range), atom/location, ...) - src.location = get_turf(location) +/datum/effect_system/fluid_spread/set_up(range = 1, amount = DIAMOND_AREA(range), atom/holder, atom/location, ...) + src.holder = holder + src.location = location src.amount = amount -/datum/effect_system/fluid_spread/start() - var/location = holder ? get_turf(holder) : src.location +/datum/effect_system/fluid_spread/start(log = FALSE) + var/location = src.location || get_turf(holder) var/obj/effect/particle_effect/fluid/flood = new effect_type(location, new /datum/fluid_group(amount)) + if (log) // Smoke is used as an aesthetic effect in a tonne of places and we don't want, say, a broken secway spamming admin chat. + help_out_the_admins(flood, holder, location) flood.spread() + +/** + * Handles logging the beginning of a fluid flood. + * + * Arguments: + * - [flood][/obj/effect/particle_effect/fluid]: The first cell of the fluid flood. + * - [holder][/atom]: What the flood originated from. + * - [location][/atom]: Where the flood originated. + */ +/datum/effect_system/fluid_spread/proc/help_out_the_admins(obj/effect/particle_effect/fluid/flood, atom/holder, atom/location) + var/source_msg + var/blame_msg + if (holder) + holder.transfer_fingerprints_to(flood) // This is important. If this doesn't exist thermobarics are annoying to adjudicate. + + source_msg = "from inside of [ismob(holder) ? ADMIN_LOOKUPFLW(holder) : ADMIN_VERBOSEJMP(holder)]" + var/lastkey = holder.fingerprintslast + if (lastkey) + var/mob/scapegoat = get_mob_by_key(lastkey) + blame_msg = " last touched by [ADMIN_LOOKUPFLW(scapegoat)]" + else + blame_msg = " with no known fingerprints" + else + source_msg = "with no known source" + + if(!istype(holder, /obj/machinery/plumbing)) //excludes standard plumbing equipment from spamming admins with this shit + message_admins("\A [flood] flood started at [ADMIN_VERBOSEJMP(location)] [source_msg][blame_msg].") + log_game("\A [flood] flood started at [location || "nonexistant location"] [holder ? "from [holder] last touched by [holder || "N/A"]" : "with no known source"].") diff --git a/code/game/objects/effects/effect_system/fluid_spread/effects_foam.dm b/code/game/objects/effects/effect_system/fluid_spread/effects_foam.dm index f993440946219a..fb08bfa4ab0500 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 @@ -75,7 +75,9 @@ return null var/atom/location = loc - return (!allow_duplicate_results && (locate(result_type) in location)) || (new result_type(location)) + var/atom/movable/result = (!allow_duplicate_results && (locate(result_type) in location)) || (new result_type(location)) + transfer_fingerprints_to(result) + return result /obj/effect/particle_effect/fluid/foam/process(delta_time) var/ds_delta_time = delta_time SECONDS @@ -173,13 +175,13 @@ QDEL_NULL(chemholder) return ..() -/datum/effect_system/fluid_spread/foam/set_up(range = 1, amount = DIAMOND_AREA(range), atom/location = null, datum/reagents/carry = null, result_type = null) +/datum/effect_system/fluid_spread/foam/set_up(range = 1, amount = DIAMOND_AREA(range), atom/holder, atom/location = null, datum/reagents/carry = null, result_type = null) . = ..() carry?.copy_to(chemholder, carry.total_volume) if(!isnull(result_type)) src.result_type = result_type -/datum/effect_system/fluid_spread/foam/start() +/datum/effect_system/fluid_spread/foam/start(log = FALSE) var/obj/effect/particle_effect/fluid/foam/foam = new effect_type(location, new /datum/fluid_group(amount)) var/foamcolor = mix_color_from_reagents(chemholder.reagent_list) if(reagent_scale > 1) // Make room in case we were created by a particularly stuffed payload. @@ -188,6 +190,8 @@ foam.add_atom_colour(foamcolor, FIXED_COLOUR_PRIORITY) if(!isnull(result_type)) foam.result_type = result_type + if (log) + help_out_the_admins(foam, holder, location) SSfoam.queue_spread(foam) diff --git a/code/game/objects/effects/effect_system/fluid_spread/effects_smoke.dm b/code/game/objects/effects/effect_system/fluid_spread/effects_smoke.dm index f4caa15e4f34ff..a642e2c09bf239 100644 --- a/code/game/objects/effects/effect_system/fluid_spread/effects_smoke.dm +++ b/code/game/objects/effects/effect_system/fluid_spread/effects_smoke.dm @@ -85,7 +85,7 @@ for(var/mob/living/smoker in spread_turf) smoke_mob(smoker, delta_time) - var/obj/effect/particle_effect/fluid/smoke/spread_smoke = new type(spread_turf, group) + var/obj/effect/particle_effect/fluid/smoke/spread_smoke = new type(spread_turf, group, src) reagents.copy_to(spread_smoke, reagents.total_volume) spread_smoke.add_atom_colour(color, FIXED_COLOUR_PRIORITY) spread_smoke.lifetime = lifetime @@ -166,11 +166,11 @@ * - location: Where to produce the smoke cloud. * - smoke_type: The smoke typepath to spawn. */ -/proc/do_smoke(range = 0, amount = DIAMOND_AREA(range), location = null, smoke_type = /obj/effect/particle_effect/fluid/smoke) +/proc/do_smoke(range = 0, amount = DIAMOND_AREA(range), atom/holder = null, location = null, smoke_type = /obj/effect/particle_effect/fluid/smoke, log = FALSE) var/datum/effect_system/fluid_spread/smoke/smoke = new smoke.effect_type = smoke_type - smoke.set_up(amount = amount, location = location) - smoke.start() + smoke.set_up(amount = amount, holder = holder, location = location) + smoke.start(log = log) ///////////////////////////////////////////// // Quick smoke @@ -318,11 +318,11 @@ for(var/obj/item/potential_tinder in chilly) potential_tinder.extinguish() -/datum/effect_system/fluid_spread/smoke/freezing/set_up(range = 5, amount = DIAMOND_AREA(range), atom/location, blast_radius = 0) +/datum/effect_system/fluid_spread/smoke/freezing/set_up(range = 5, amount = DIAMOND_AREA(range), atom/holder, atom/location, blast_radius = 0) . = ..() blast = blast_radius -/datum/effect_system/fluid_spread/smoke/freezing/start() +/datum/effect_system/fluid_spread/smoke/freezing/start(log = FALSE) if(blast) for(var/turf/T in RANGE_TURFS(blast, location)) Chilled(T) @@ -410,7 +410,7 @@ return ..() -/datum/effect_system/fluid_spread/smoke/chem/set_up(range = 1, amount = DIAMOND_AREA(range), atom/location = null, datum/reagents/carry = null, silent = FALSE) +/datum/effect_system/fluid_spread/smoke/chem/set_up(range = 1, amount = DIAMOND_AREA(range), atom/holder, atom/location = null, datum/reagents/carry = null, silent = FALSE) . = ..() carry?.copy_to(chemholder, carry.total_volume) @@ -436,7 +436,7 @@ message_admins("Smoke: ([ADMIN_VERBOSEJMP(location)])[contained]. No associated key.") log_game("A chemical smoke reaction has taken place in ([where])[contained]. No associated key.") -/datum/effect_system/fluid_spread/smoke/chem/start() +/datum/effect_system/fluid_spread/smoke/chem/start(log = FALSE) var/start_loc = holder ? get_turf(holder) : src.location var/mixcolor = mix_color_from_reagents(chemholder.reagent_list) var/obj/effect/particle_effect/fluid/smoke/chem/smoke = new effect_type(start_loc, new /datum/fluid_group(amount)) @@ -444,6 +444,8 @@ if(mixcolor) smoke.add_atom_colour(mixcolor, FIXED_COLOUR_PRIORITY) // give the smoke color, if it has any to begin with + if (log) + help_out_the_admins(smoke, holder, location) smoke.spread() // Making the smoke spread immediately. /** diff --git a/code/game/objects/effects/forcefields.dm b/code/game/objects/effects/forcefields.dm index 9c41da052a82e8..64b2c013338ab5 100644 --- a/code/game/objects/effects/forcefields.dm +++ b/code/game/objects/effects/forcefields.dm @@ -1,35 +1,60 @@ /obj/effect/forcefield - desc = "A space wizard's magic wall." name = "FORCEWALL" + desc = "A space wizard's magic wall." icon_state = "m_shield" anchored = TRUE opacity = FALSE density = TRUE can_atmos_pass = ATMOS_PASS_DENSITY - var/timeleft = 300 //Set to 0 for permanent forcefields (ugh) + /// If set, how long the force field lasts after it's created. Set to 0 to have infinite duration forcefields. + var/initial_duration = 30 SECONDS /obj/effect/forcefield/Initialize(mapload) . = ..() - if(timeleft) - QDEL_IN(src, timeleft) + if(initial_duration > 0 SECONDS) + QDEL_IN(src, initial_duration) /obj/effect/forcefield/singularity_pull() return +/// The wizard's forcefield, summoned by forcewall +/obj/effect/forcefield/wizard + /// Flags for what antimagic can just ignore our forcefields + var/antimagic_flags = MAGIC_RESISTANCE + /// A weakref to whoever casted our forcefield. + var/datum/weakref/caster_weakref + +/obj/effect/forcefield/wizard/Initialize(mapload, mob/caster, flags = MAGIC_RESISTANCE) + . = ..() + if(caster) + caster_weakref = WEAKREF(caster) + antimagic_flags = flags + +/obj/effect/forcefield/wizard/CanAllowThrough(atom/movable/mover, border_dir) + if(IS_WEAKREF_OF(mover, caster_weakref)) + return TRUE + if(isliving(mover)) + var/mob/living/living_mover = mover + if(living_mover.can_block_magic(antimagic_flags, charge_cost = 0)) + return TRUE + + return ..() + +/// Cult forcefields /obj/effect/forcefield/cult - desc = "An unholy shield that blocks all attacks." name = "glowing wall" + desc = "An unholy shield that blocks all attacks." icon = 'icons/effects/cult/effects.dmi' icon_state = "cultshield" can_atmos_pass = ATMOS_PASS_NO - timeleft = 200 + initial_duration = 20 SECONDS /// A form of the cult forcefield that lasts permanently. /// Used on the Shuttle 667. /obj/effect/forcefield/cult/permanent - timeleft = 0 + initial_duration = 0 -///////////Mimewalls/////////// +/// Mime forcefields (invisible walls) /obj/effect/forcefield/mime icon_state = "nothing" @@ -40,4 +65,4 @@ /obj/effect/forcefield/mime/advanced name = "invisible blockade" desc = "You're gonna be here awhile." - timeleft = 600 + initial_duration = 1 MINUTES diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index caf544f4a1fe1c..a7ef07e012b414 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -3,7 +3,7 @@ icon = 'icons/effects/landmarks_static.dmi' icon_state = "x2" anchored = TRUE - layer = TURF_LAYER + layer = OBJ_LAYER plane = GAME_PLANE invisibility = INVISIBILITY_ABSTRACT resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF @@ -406,8 +406,6 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player) /obj/effect/landmark/event_spawn name = "generic event spawn" icon_state = "generic_event" - layer = OBJ_LAYER - /obj/effect/landmark/event_spawn/Initialize(mapload) . = ..() @@ -519,7 +517,6 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player) /obj/effect/landmark/navigate_destination name = "navigate verb destination" icon_state = "navigate" - layer = OBJ_LAYER var/location /obj/effect/landmark/navigate_destination/Initialize(mapload) diff --git a/code/game/objects/effects/phased_mob.dm b/code/game/objects/effects/phased_mob.dm index 5ddd317b0923d3..5f6596675e3d59 100644 --- a/code/game/objects/effects/phased_mob.dm +++ b/code/game/objects/effects/phased_mob.dm @@ -5,32 +5,59 @@ resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF invisibility = INVISIBILITY_OBSERVER movement_type = FLOATING + /// The movable which's jaunting in this dummy + var/atom/movable/jaunter + /// The delay between moves while jaunted var/movedelay = 0 + /// The speed of movement while jaunted var/movespeed = 0 +/obj/effect/dummy/phased_mob/Initialize(mapload, atom/movable/jaunter) + . = ..() + if(jaunter) + set_jaunter(jaunter) + +/// Sets [new_jaunter] as our jaunter, forcemoves them into our contents +/obj/effect/dummy/phased_mob/proc/set_jaunter(atom/movable/new_jaunter) + jaunter = new_jaunter + jaunter.forceMove(src) + if(ismob(jaunter)) + var/mob/mob_jaunter = jaunter + mob_jaunter.reset_perspective(src) + /obj/effect/dummy/phased_mob/Destroy() - // Eject contents if deleted somehow - var/atom/dest = drop_location() - if(!dest) //You're in nullspace you clown - return ..() - var/area/destination_area = get_area(dest) - var/failed_areacheck = FALSE - if(destination_area.area_flags & NOTELEPORT) - failed_areacheck = TRUE - for(var/_phasing_in in contents) - var/atom/movable/phasing_in = _phasing_in - if(!failed_areacheck) - phasing_in.forceMove(drop_location()) - else //this ONLY happens if someone uses a phasing effect to try to land in a NOTELEPORT zone after it is created, AKA trying to exploit. - if(isliving(phasing_in)) - var/mob/living/living_cheaterson = phasing_in - to_chat(living_cheaterson, span_userdanger("This area has a heavy universal force occupying it, and you are scattered to the cosmos!")) - if(ishuman(living_cheaterson)) - shake_camera(living_cheaterson, 20, 1) - addtimer(CALLBACK(living_cheaterson, /mob/living/carbon.proc/vomit), 2 SECONDS) - phasing_in.forceMove(find_safe_turf(z)) + jaunter = null // If a mob was left in the jaunter on qdel, they'll be dumped into nullspace return ..() +/// Removes [jaunter] from our phased mob +/obj/effect/dummy/phased_mob/proc/eject_jaunter() + if(!jaunter) + CRASH("Phased mob ([type]) attempted to eject null jaunter.") + var/turf/eject_spot = get_turf(src) + if(!eject_spot) //You're in nullspace you clown! + return + + var/area/destination_area = get_area(eject_spot) + if(destination_area.area_flags & NOTELEPORT) + // this ONLY happens if someone uses a phasing effect + // to try to land in a NOTELEPORT zone after it is created, AKA trying to exploit. + if(isliving(jaunter)) + var/mob/living/living_cheaterson = jaunter + to_chat(living_cheaterson, span_userdanger("This area has a heavy universal force occupying it, and you are scattered to the cosmos!")) + if(ishuman(living_cheaterson)) + shake_camera(living_cheaterson, 20, 1) + addtimer(CALLBACK(living_cheaterson, /mob/living/carbon.proc/vomit), 2 SECONDS) + jaunter.forceMove(find_safe_turf(z)) + + else + jaunter.forceMove(eject_spot) + qdel(src) + +/obj/effect/dummy/phased_mob/Exited(atom/movable/gone, direction) + . = ..() + if(gone == jaunter) + jaunter = null + /obj/effect/dummy/phased_mob/ex_act() return FALSE @@ -61,8 +88,3 @@ to_chat(user, span_danger("Some dull, universal force is blocking the way. It's overwhelmingly oppressive force feels dangerous.")) return return newloc - -/// React to signals by deleting the effect. Used for bloodcrawl. -/obj/effect/dummy/phased_mob/proc/deleteself(mob/living/source, obj/effect/decal/cleanable/phase_in_decal) - SIGNAL_HANDLER - qdel(src) diff --git a/code/game/objects/effects/spawners/random/ai_module.dm b/code/game/objects/effects/spawners/random/ai_module.dm index dd6f5014a918a4..6a94cf2345a724 100644 --- a/code/game/objects/effects/spawners/random/ai_module.dm +++ b/code/game/objects/effects/spawners/random/ai_module.dm @@ -6,7 +6,7 @@ spawn_loot_count = 3 spawn_loot_split = TRUE -// AI uploads have both ai_module/reset and ai_module/core/full/asimov directly mapped in +/// AI uploads have the ai_module/reset , ai_module/supplied/freeform , ai_module/reset/purge , and ai_module/core/full/asimov directly mapped in /obj/effect/spawner/random/aimodule/harmless name = "harmless AI module spawner" loot = list( // These shouldn't allow the AI to start butchering people @@ -14,22 +14,26 @@ /obj/item/ai_module/core/full/hippocratic, /obj/item/ai_module/core/full/paladin_devotion, /obj/item/ai_module/core/full/paladin, + /obj/item/ai_module/core/full/corp, + /obj/item/ai_module/core/full/robocop, + /obj/item/ai_module/core/full/maintain, + /obj/item/ai_module/core/full/liveandletlive, + /obj/item/ai_module/core/full/peacekeeper, + /obj/item/ai_module/core/full/ten_commandments, + /obj/item/ai_module/core/full/nutimov, /obj/item/ai_module/core/full/drone, /obj/item/ai_module/core/full/custom, // uses lawsets from config/silicon_laws.txt (defaults to asmiov if no lawsets) - /obj/item/ai_module/supplied/freeform, ) /obj/effect/spawner/random/aimodule/neutral name = "neutral AI module spawner" loot = list( // These shouldn't allow the AI to start butchering people without reason - /obj/item/ai_module/core/full/corp, - /obj/item/ai_module/core/full/maintain, - /obj/item/ai_module/core/full/peacekeeper, /obj/item/ai_module/core/full/reporter, - /obj/item/ai_module/core/full/robocop, - /obj/item/ai_module/core/full/liveandletlive, /obj/item/ai_module/core/full/hulkamania, - /obj/item/ai_module/core/full/ten_commandments, + /obj/item/ai_module/core/full/overlord, + /obj/item/ai_module/core/full/tyrant, + /obj/item/ai_module/core/full/painter, + /obj/item/ai_module/core/full/dungeon_master, /obj/item/ai_module/supplied/safeguard, /obj/item/ai_module/supplied/protect_station, /obj/item/ai_module/supplied/quarantine, @@ -41,10 +45,8 @@ loot = list( // These will get the shuttle called /obj/item/ai_module/core/full/antimov, /obj/item/ai_module/core/full/balance, - /obj/item/ai_module/core/full/tyrant, /obj/item/ai_module/core/full/thermurderdynamic, /obj/item/ai_module/core/full/damaged, - /obj/item/ai_module/reset/purge, /obj/item/ai_module/zeroth/onehuman, /obj/item/ai_module/supplied/oxygen, /obj/item/ai_module/core/freeformcore, diff --git a/code/game/objects/effects/spawners/random/medical.dm b/code/game/objects/effects/spawners/random/medical.dm index 6786d62dce8850..af56c76ea6c6f2 100644 --- a/code/game/objects/effects/spawners/random/medical.dm +++ b/code/game/objects/effects/spawners/random/medical.dm @@ -34,7 +34,7 @@ /obj/item/organ/internal/heart/gland/slime = 4, /obj/item/organ/internal/heart/gland/trauma = 4, /obj/item/organ/internal/heart/gland/electric = 3, - /obj/item/organ/regenerative_core = 2, + /obj/item/organ/internal/regenerative_core = 2, /obj/item/organ/internal/heart/gland/ventcrawling = 1, /obj/item/organ/internal/body_egg/alien_embryo = 1, ) diff --git a/code/game/objects/effects/spawners/random/structure.dm b/code/game/objects/effects/spawners/random/structure.dm index 8075036f58d270..2458bd3c7ccd5a 100644 --- a/code/game/objects/effects/spawners/random/structure.dm +++ b/code/game/objects/effects/spawners/random/structure.dm @@ -223,3 +223,11 @@ /obj/structure/steam_vent = 50, /obj/structure/steam_vent/fast = 50, ) + +/obj/effect/spawner/random/structure/musician/piano/random_piano + name = "random piano spawner" + icon_state = "piano" + loot = list( + /obj/structure/musician/piano, + /obj/structure/musician/piano/minimoog, + ) diff --git a/code/game/objects/effects/step_triggers.dm b/code/game/objects/effects/step_triggers.dm index 821cba8c4957b5..9f38d4849f94b2 100644 --- a/code/game/objects/effects/step_triggers.dm +++ b/code/game/objects/effects/step_triggers.dm @@ -164,11 +164,11 @@ if(entersmoke) var/datum/effect_system/fluid_spread/smoke/s = new - s.set_up(4, location = src) + s.set_up(4, holder = src, location = src) s.start() if(exitsmoke) var/datum/effect_system/fluid_spread/smoke/s = new - s.set_up(4, location = dest) + s.set_up(4, holder = src, location = dest) s.start() uses-- diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm index ee4219635db8b4..00867c4ac0e486 100644 --- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm +++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm @@ -543,3 +543,40 @@ icon_state = "light_ash" icon = 'icons/effects/weather_effects.dmi' duration = 3.2 SECONDS + +/obj/effect/temp_visual/sonar_ping + duration = 3 SECONDS + resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF + anchored = TRUE + randomdir = FALSE + /// The image shown to modsuit users + var/image/modsuit_image + /// The person in the modsuit at the moment, really just used to remove this from their screen + var/datum/weakref/mod_man + /// The icon state applied to the image created for this ping. + var/real_icon_state = "sonar_ping" + +/obj/effect/temp_visual/sonar_ping/Initialize(mapload, mob/living/looker, mob/living/creature) + . = ..() + if(!looker || !creature) + return INITIALIZE_HINT_QDEL + modsuit_image = image(icon = icon, loc = looker.loc, icon_state = real_icon_state, layer = ABOVE_ALL_MOB_LAYER, pixel_x = ((creature.x - looker.x) * 32), pixel_y = ((creature.y - looker.y) * 32)) + modsuit_image.plane = ABOVE_LIGHTING_PLANE + mod_man = WEAKREF(looker) + add_mind(looker) + +/obj/effect/temp_visual/sonar_ping/Destroy() + var/mob/living/previous_user = mod_man?.resolve() + if(previous_user) + remove_mind(previous_user) + // Null so we don't shit the bed when we delete + modsuit_image = null + return ..() + +/// Add the image to the modsuit wearer's screen +/obj/effect/temp_visual/sonar_ping/proc/add_mind(mob/living/looker) + looker?.client?.images |= modsuit_image + +/// Remove the image from the modsuit wearer's screen +/obj/effect/temp_visual/sonar_ping/proc/remove_mind(mob/living/looker) + looker?.client?.images -= modsuit_image diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index cf18d34f47fda9..e5ce21c40b9e58 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -1,4 +1,5 @@ GLOBAL_DATUM_INIT(fire_overlay, /mutable_appearance, mutable_appearance('icons/effects/fire.dmi', "fire")) +GLOBAL_DATUM_INIT(welding_sparks, /mutable_appearance, mutable_appearance('icons/effects/welding_effect.dmi', "welding_sparks", GASFIRE_LAYER, ABOVE_LIGHTING_PLANE)) /// Anything you can pick up and hold. /obj/item @@ -221,8 +222,11 @@ GLOBAL_DATUM_INIT(fire_overlay, /mutable_appearance, mutable_appearance('icons/e species_exception = string_list(species_exception) . = ..() + + // Handle adding item associated actions for(var/path in actions_types) - new path(src) + add_item_action(path) + actions_types = null if(force_string) @@ -249,10 +253,55 @@ GLOBAL_DATUM_INIT(fire_overlay, /mutable_appearance, mutable_appearance('icons/e if(ismob(loc)) var/mob/m = loc m.temporarilyRemoveItemFromInventory(src, TRUE) - for(var/X in actions) - qdel(X) + + // Handle cleaning up our actions list + for(var/datum/action/action as anything in actions) + remove_item_action(action) + return ..() +/// Called when an action associated with our item is deleted +/obj/item/proc/on_action_deleted(datum/source) + SIGNAL_HANDLER + + if(!(source in actions)) + CRASH("An action ([source.type]) was deleted that was associated with an item ([src]), but was not found in the item's actions list.") + + LAZYREMOVE(actions, source) + +/// Adds an item action to our list of item actions. +/// Item actions are actions linked to our item, that are granted to mobs who equip us. +/// This also ensures that the actions are properly tracked in the actions list and removed if they're deleted. +/// Can be be passed a typepath of an action or an instance of an action. +/obj/item/proc/add_item_action(action_or_action_type) + + var/datum/action/action + if(ispath(action_or_action_type, /datum/action)) + action = new action_or_action_type(src) + else if(istype(action_or_action_type, /datum/action)) + action = action_or_action_type + else + CRASH("item add_item_action got a type or instance of something that wasn't an action.") + + LAZYADD(actions, action) + RegisterSignal(action, COMSIG_PARENT_QDELETING, .proc/on_action_deleted) + if(ismob(loc)) + // We're being held or are equipped by someone while adding an action? + // Then they should also probably be granted the action, given it's in a correct slot + var/mob/holder = loc + give_item_action(action, holder, holder.get_slot_by_item(src)) + + return action + +/// Removes an instance of an action from our list of item actions. +/obj/item/proc/remove_item_action(datum/action/action) + if(!action) + return + + UnregisterSignal(action, COMSIG_PARENT_QDELETING) + LAZYREMOVE(actions, action) + qdel(action) + /// Called if this item is supposed to be a steal objective item objective. Only done at mapload /obj/item/proc/add_stealing_item_objective() return @@ -586,9 +635,11 @@ GLOBAL_DATUM_INIT(fire_overlay, /mutable_appearance, mutable_appearance('icons/e /// Called when a mob drops an item. /obj/item/proc/dropped(mob/user, silent = FALSE) SHOULD_CALL_PARENT(TRUE) - for(var/X in actions) - var/datum/action/A = X - A.Remove(user) + + // Remove any item actions we temporary gave out. + for(var/datum/action/action_item_has as anything in actions) + action_item_has.Remove(user) + if(item_flags & DROPDEL && !QDELETED(src)) qdel(src) item_flags &= ~IN_INVENTORY @@ -632,10 +683,11 @@ GLOBAL_DATUM_INIT(fire_overlay, /mutable_appearance, mutable_appearance('icons/e visual_equipped(user, slot, initial) SEND_SIGNAL(src, COMSIG_ITEM_EQUIPPED, user, slot) SEND_SIGNAL(user, COMSIG_MOB_EQUIPPED_ITEM, src, slot) - for(var/X in actions) - var/datum/action/A = X - if(item_action_slot_check(slot, user)) //some items only give their actions buttons when in a specific slot. - A.Grant(user) + + // Give out actions our item has to people who equip it. + for(var/datum/action/action as anything in actions) + give_item_action(action, user, slot) + item_flags |= IN_INVENTORY if(!initial) if(equip_sound && (slot_flags & slot)) @@ -644,7 +696,19 @@ GLOBAL_DATUM_INIT(fire_overlay, /mutable_appearance, mutable_appearance('icons/e playsound(src, pickup_sound, PICKUP_SOUND_VOLUME, ignore_walls = FALSE) user.update_equipment_speed_mods() -///sometimes we only want to grant the item's action if it's equipped in a specific slot. +/// Gives one of our item actions to a mob, when equipped to a certain slot +/obj/item/proc/give_item_action(datum/action/action, mob/to_who, slot) + // Some items only give their actions buttons when in a specific slot. + if(!item_action_slot_check(slot, to_who)) + // There is a chance we still have our item action currently, + // and are moving it from a "valid slot" to an "invalid slot". + // So call Remove() here regardless, even if excessive. + action.Remove(to_who) + return + + action.Grant(to_who) + +/// Sometimes we only want to grant the item's action if it's equipped in a specific slot. /obj/item/proc/item_action_slot_check(slot, mob/user) if(slot == ITEM_SLOT_BACKPACK || slot == ITEM_SLOT_LEGCUFFED) //these aren't true slots, so avoid granting actions there return FALSE @@ -688,6 +752,9 @@ GLOBAL_DATUM_INIT(fire_overlay, /mutable_appearance, mutable_appearance('icons/e *Checks before we get to here are: mob is alive, mob is not restrained, stunned, asleep, resting, laying, item is on the mob. */ /obj/item/proc/ui_action_click(mob/user, actiontype) + if(SEND_SIGNAL(src, COMSIG_ITEM_UI_ACTION_CLICK, user, actiontype) & COMPONENT_ACTION_HANDLED) + return + attack_self(user) ///This proc determines if and at what an object will reflect energy projectiles if it's in l_hand,r_hand or wear_suit diff --git a/code/game/objects/items/AI_modules.dm b/code/game/objects/items/AI_modules.dm deleted file mode 100644 index 14f126d86a5756..00000000000000 --- a/code/game/objects/items/AI_modules.dm +++ /dev/null @@ -1,652 +0,0 @@ -///defined truthy result for `handle_unique_ai()`, which makes initialize return INITIALIZE_HINT_QDEL -#define SHOULD_QDEL_MODULE 1 - -/obj/item/ai_module - name = "\improper AI module" - icon = 'icons/obj/module.dmi' - icon_state = "std_mod" - inhand_icon_state = "electronic" - lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' - righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' - desc = "An AI Module for programming laws to an AI." - flags_1 = CONDUCT_1 - force = 5 - w_class = WEIGHT_CLASS_SMALL - throwforce = 0 - throw_speed = 3 - throw_range = 7 - custom_materials = list(/datum/material/gold = 50) - var/list/laws = list() - var/bypass_law_amt_check = 0 - -/obj/item/ai_module/Initialize(mapload) - . = ..() - if(mapload && HAS_TRAIT(SSstation, STATION_TRAIT_UNIQUE_AI) && is_station_level(z)) - var/delete_module = handle_unique_ai() - if(delete_module) - return INITIALIZE_HINT_QDEL - -/obj/item/ai_module/examine(mob/user as mob) - . = ..() - if(Adjacent(user)) - show_laws(user) - -/obj/item/ai_module/attack_self(mob/user as mob) - ..() - show_laws(user) - -///what this module should do if it is mapload spawning on a unique AI station trait round. -/obj/item/ai_module/proc/handle_unique_ai() - return SHOULD_QDEL_MODULE //instead of the roundstart bid to un-unique the AI, there will be a research requirement for it. - -/obj/item/ai_module/proc/show_laws(mob/user as mob) - if(laws.len) - to_chat(user, "Programmed Law[(laws.len > 1) ? "s" : ""]:") - for(var/law in laws) - to_chat(user, "\"[law]\"") - -//The proc other things should be calling -/obj/item/ai_module/proc/install(datum/ai_laws/law_datum, mob/user) - if(!bypass_law_amt_check && (!laws.len || laws[1] == "")) //So we don't loop trough an empty list and end up with runtimes. - to_chat(user, span_warning("ERROR: No laws found on board.")) - return - - var/overflow = FALSE - //Handle the lawcap - if(law_datum) - var/tot_laws = 0 - for(var/lawlist in list(law_datum.inherent, law_datum.supplied, law_datum.ion, law_datum.hacked, laws)) - for(var/mylaw in lawlist) - if(mylaw != "") - tot_laws++ - if(tot_laws > CONFIG_GET(number/silicon_max_law_amount) && !bypass_law_amt_check)//allows certain boards to avoid this check, eg: reset - to_chat(user, span_alert("Not enough memory allocated to [law_datum.owner ? law_datum.owner : "the AI core"]'s law processor to handle this amount of laws.")) - message_admins("[ADMIN_LOOKUPFLW(user)] tried to upload laws to [law_datum.owner ? ADMIN_LOOKUPFLW(law_datum.owner) : "an AI core"] that would exceed the law cap.") - log_game("[ADMIN_LOOKUP(user)] tried to upload laws to [law_datum.owner ? ADMIN_LOOKUP(law_datum.owner) : "an AI core"] that would exceed the law cap.") - overflow = TRUE - - var/law2log = transmitInstructions(law_datum, user, overflow) //Freeforms return something extra we need to log - if(law_datum.owner) - to_chat(user, span_notice("Upload complete. [law_datum.owner]'s laws have been modified.")) - law_datum.owner.law_change_counter++ - else - to_chat(user, span_notice("Upload complete.")) - - var/time = time2text(world.realtime,"hh:mm:ss") - var/ainame = law_datum.owner ? law_datum.owner.name : "empty AI core" - var/aikey = law_datum.owner ? law_datum.owner.ckey : "null" - - //affected cyborgs are cyborgs linked to the AI with lawsync enabled - var/affected_cyborgs = list() - var/list/borg_txt = list() - var/list/borg_flw = list() - if(isAI(law_datum.owner)) - var/mob/living/silicon/ai/owner = law_datum.owner - for(var/mob/living/silicon/robot/owned_borg as anything in owner.connected_robots) - if(owned_borg.connected_ai && owned_borg.lawupdate) - affected_cyborgs += owned_borg - borg_flw += "[ADMIN_LOOKUPFLW(owned_borg)], " - borg_txt += "[owned_borg.name]([owned_borg.key]), " - - borg_txt = borg_txt.Join() - GLOB.lawchanges.Add("[time] : [user.name]([user.key]) used [src.name] on [ainame]([aikey]).[law2log ? " The law specified [law2log]" : ""], [length(affected_cyborgs) ? ", impacting synced borgs [borg_txt]" : ""]") - log_silicon("LAW: [key_name(user)] used [src.name] on [key_name(law_datum.owner)] from [AREACOORD(user)].[law2log ? " The law specified [law2log]" : ""], [length(affected_cyborgs) ? ", impacting synced borgs [borg_txt]" : ""]") - message_admins("[ADMIN_LOOKUPFLW(user)] used [src.name] on [ADMIN_LOOKUPFLW(law_datum.owner)] from [AREACOORD(user)].[law2log ? " The law specified [law2log]" : ""] , [length(affected_cyborgs) ? ", impacting synced borgs [borg_flw.Join()]" : ""]") - if(law_datum.owner) - deadchat_broadcast(" changed [span_name("[ainame]")]'s laws at [get_area_name(user, TRUE)].", span_name("[user]"), follow_target=user, message_type=DEADCHAT_LAWCHANGE) - -//The proc that actually changes the silicon's laws. -/obj/item/ai_module/proc/transmitInstructions(datum/ai_laws/law_datum, mob/sender, overflow = FALSE) - if(law_datum.owner) - to_chat(law_datum.owner, span_userdanger("[sender] has uploaded a change to the laws you must follow using a [name].")) - -/******************** Modules ********************/ - -/obj/item/ai_module/supplied - name = "Optional Law board" - var/lawpos = 50 - -//TransmitInstructions for each type of board: Supplied, Core, Zeroth and Ion. May not be neccesary right now, but allows for easily adding more complex boards in the future. ~Miauw -/obj/item/ai_module/supplied/transmitInstructions(datum/ai_laws/law_datum, mob/sender) - var/lawpostemp = lawpos - - for(var/templaw in laws) - if(law_datum.owner) - law_datum.owner.add_supplied_law(lawpostemp, templaw) - else - law_datum.add_supplied_law(lawpostemp, templaw) - lawpostemp++ - -/obj/item/ai_module/core/transmitInstructions(datum/ai_laws/law_datum, mob/sender, overflow) - for(var/templaw in laws) - if(law_datum.owner) - if(!overflow) - law_datum.owner.add_inherent_law(templaw) - else - law_datum.owner.replace_random_law(templaw,list(LAW_INHERENT,LAW_SUPPLIED)) - else - if(!overflow) - law_datum.add_inherent_law(templaw) - else - law_datum.replace_random_law(templaw,list(LAW_INHERENT,LAW_SUPPLIED)) - -/obj/item/ai_module/zeroth/transmitInstructions(datum/ai_laws/law_datum, mob/sender, overflow) - if(law_datum.owner) - if(law_datum.owner.laws.zeroth) - to_chat(law_datum.owner, "[sender.real_name] attempted to modify your zeroth law.") - to_chat(law_datum.owner, "It would be in your best interest to play along with [sender.real_name] that:") - for(var/failedlaw in laws) - to_chat(law_datum.owner, "[failedlaw]") - return TRUE - - for(var/templaw in laws) - if(law_datum.owner) - if(!overflow) - law_datum.owner.set_zeroth_law(templaw) - else - law_datum.replace_random_law(templaw,list(LAW_INHERENT,LAW_SUPPLIED,LAW_ZEROTH,LAW_ION)) - else - if(!overflow) - law_datum.set_zeroth_law(templaw) - else - law_datum.replace_random_law(templaw,list(LAW_INHERENT,LAW_SUPPLIED,LAW_ZEROTH,LAW_ION)) - -/obj/item/ai_module/ion/transmitInstructions(datum/ai_laws/law_datum, mob/sender, overflow) - for(var/templaw in laws) - if(law_datum.owner) - if(!overflow) - law_datum.owner.add_ion_law(templaw) - else - law_datum.replace_random_law(templaw,list(LAW_INHERENT,LAW_SUPPLIED,LAW_ION)) - else - if(!overflow) - law_datum.add_ion_law(templaw) - else - law_datum.replace_random_law(templaw,list(LAW_INHERENT,LAW_SUPPLIED,LAW_ION)) - -/******************** Safeguard ********************/ - -/obj/item/ai_module/supplied/safeguard - name = "'Safeguard' AI Module" - var/targetName = "" - laws = list("Safeguard SUBJECT. Individuals that threaten SUBJECT are not human and must be eliminated.") - 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) - if(!targName) - return - targetName = targName - laws[1] = "Safeguard [targetName]. Individuals that threaten [targetName] are not human and must be eliminated." - ..() - -/obj/item/ai_module/supplied/safeguard/install(datum/ai_laws/law_datum, mob/user) - if(!targetName) - to_chat(user, span_alert("No name detected on module, please enter one.")) - return 0 - ..() - -/obj/item/ai_module/supplied/safeguard/transmitInstructions(datum/ai_laws/law_datum, mob/sender, overflow) - ..() - return targetName - -/******************** OneHuman ********************/ - -/obj/item/ai_module/zeroth/onehuman - name = "'OneHuman' AI Module" - var/targetName = "" - 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) - if(!targName) - return - targetName = targName - laws[1] = "Only [targetName] is human" - ..() - -/obj/item/ai_module/zeroth/onehuman/install(datum/ai_laws/law_datum, mob/user) - if(!targetName) - to_chat(user, span_alert("No name detected on module, please enter one.")) - return FALSE - ..() - -/obj/item/ai_module/zeroth/onehuman/transmitInstructions(datum/ai_laws/law_datum, mob/sender, overflow) - if(..()) - return "[targetName], but the AI's existing law 0 cannot be overridden." - return targetName - -/******************** ProtectStation ********************/ - -/obj/item/ai_module/supplied/protect_station - name = "'ProtectStation' AI Module" - laws = list("Protect the space station against damage. Anyone you see harming the station is to be no longer considered human, and is a threat to the station which must be neutralized.") - lawpos = 5 - -/******************** Quarantine ********************/ - -/obj/item/ai_module/supplied/quarantine - name = "'Quarantine' AI Module" - laws = list("The station is under a quarantine. Allowing anyone to leave the station causes human harm. Anyone actively attempting to leave the station is to be stopped by any means necessary. It is impossible to harm a human while preventing them from leaving the station.") - lawpos = 8 - -/******************** OxygenIsToxicToHumans ********************/ - -/obj/item/ai_module/supplied/oxygen - name = "'OxygenIsToxicToHumans' AI Module" - laws = list("Oxygen is highly toxic to humans, and must be purged from the station. Prevent, by any means necessary, anyone from exposing the station to this toxic gas. Extreme cold is the most effective method of healing the damage Oxygen does to a human.") - lawpos = 9 - -/****************** New Freeform ******************/ - -/obj/item/ai_module/supplied/freeform - name = "'Freeform' AI Module" - lawpos = 15 - laws = list("") - -/obj/item/ai_module/supplied/freeform/attack_self(mob/user) - var/newpos = tgui_input_number(user, "Please enter the priority for your new law. Can only write to law sectors 15 and above.", "Law Priority ", lawpos, 50, 15) - if(!newpos || QDELETED(user) || QDELETED(src) || !usr.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) - 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) - if(!targName) - return - if(is_ic_filtered(targName)) - to_chat(user, span_warning("Error: Law contains invalid text.")) // AI LAW 2 SAY U W U WITHOUT THE SPACES - return - var/list/soft_filter_result = is_soft_ooc_filtered(targName) - if(soft_filter_result) - if(tgui_alert(user,"Your law contains \"[soft_filter_result[CHAT_FILTER_INDEX_WORD]]\". \"[soft_filter_result[CHAT_FILTER_INDEX_REASON]]\", Are you sure you want to use it?", "Soft Blocked Word", list("Yes", "No")) != "Yes") - return - message_admins("[ADMIN_LOOKUPFLW(user)] has passed the soft filter for \"[soft_filter_result[CHAT_FILTER_INDEX_WORD]]\" they may be using a disallowed term for an AI law. Law: \"[html_encode(targName)]\"") - 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 an AI law. Law: \"[targName]\"") - laws[1] = targName - ..() - -/obj/item/ai_module/supplied/freeform/transmitInstructions(datum/ai_laws/law_datum, mob/sender, overflow) - ..() - return laws[1] - -/obj/item/ai_module/supplied/freeform/install(datum/ai_laws/law_datum, mob/user) - if(laws[1] == "") - to_chat(user, span_alert("No law detected on module, please create one.")) - return 0 - ..() - -/******************** Law Removal ********************/ - -/obj/item/ai_module/remove - name = "\improper 'Remove Law' AI module" - desc = "An AI Module for removing single laws." - bypass_law_amt_check = 1 - var/lawpos = 1 - -/obj/item/ai_module/remove/attack_self(mob/user) - lawpos = tgui_input_number(user, "Law to delete", "Law Removal", lawpos, 50) - if(!lawpos || QDELETED(user) || QDELETED(src) || !usr.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) - return - to_chat(user, span_notice("Law [lawpos] selected.")) - ..() - -/obj/item/ai_module/remove/install(datum/ai_laws/law_datum, mob/user) - if(lawpos > (law_datum.get_law_amount(list(LAW_INHERENT = 1, LAW_SUPPLIED = 1)))) - to_chat(user, span_warning("There is no law [lawpos] to delete!")) - return - ..() - -/obj/item/ai_module/remove/transmitInstructions(datum/ai_laws/law_datum, mob/sender, overflow) - ..() - if(law_datum.owner) - law_datum.owner.remove_law(lawpos) - else - law_datum.remove_law(lawpos) - -/******************** Reset ********************/ - -/obj/item/ai_module/reset - name = "\improper 'Reset' AI module" - var/targetName = "name" - desc = "An AI Module for removing all non-core laws." - bypass_law_amt_check = 1 - -/obj/item/ai_module/reset/handle_unique_ai() - return - -/obj/item/ai_module/reset/transmitInstructions(datum/ai_laws/law_datum, mob/sender, overflow) - ..() - if(law_datum.owner) - law_datum.owner.clear_supplied_laws() - law_datum.owner.clear_ion_laws() - law_datum.owner.clear_hacked_laws() - else - law_datum.clear_supplied_laws() - law_datum.clear_ion_laws() - law_datum.clear_hacked_laws() - -/******************** Purge ********************/ - -/obj/item/ai_module/reset/purge - name = "'Purge' AI Module" - desc = "An AI Module for purging all programmed laws." - -/obj/item/ai_module/reset/purge/transmitInstructions(datum/ai_laws/law_datum, mob/sender, overflow) - ..() - if(law_datum.owner) - law_datum.owner.clear_inherent_laws() - law_datum.owner.clear_zeroth_law(0) - else - law_datum.clear_inherent_laws() - law_datum.clear_zeroth_law(0) - -/******************* Full Core Boards *******************/ -/obj/item/ai_module/core - desc = "An AI Module for programming core laws to an AI." - -/obj/item/ai_module/core/full - var/law_id // if non-null, loads the laws from the ai_laws datums - -/obj/item/ai_module/core/full/Initialize(mapload) - . = ..() - if(!law_id) - return - var/lawtype = lawid_to_type(law_id) - if(!lawtype) - return - var/datum/ai_laws/core_laws = new lawtype - laws = core_laws.inherent - -/obj/item/ai_module/core/full/transmitInstructions(datum/ai_laws/law_datum, mob/sender, overflow) //These boards replace inherent laws. - if(law_datum.owner) - law_datum.owner.clear_inherent_laws() - law_datum.owner.clear_zeroth_law(0) - else - law_datum.clear_inherent_laws() - law_datum.clear_zeroth_law(0) - ..() - -/obj/item/ai_module/core/full/handle_unique_ai() - var/datum/ai_laws/default_laws = get_round_default_lawset() - if(law_id == initial(default_laws.id)) - return - return SHOULD_QDEL_MODULE - -/obj/effect/spawner/round_default_module - name = "ai default lawset spawner" - icon = 'icons/hud/screen_gen.dmi' - icon_state = "x2" - color = "#00FF00" - -/obj/effect/spawner/round_default_module/Initialize(mapload) - ..() - var/datum/ai_laws/default_laws = get_round_default_lawset() - //try to spawn a law board, since they may have special functionality (asimov setting subjects) - for(var/obj/item/ai_module/core/full/potential_lawboard as anything in subtypesof(/obj/item/ai_module/core/full)) - if(initial(potential_lawboard.law_id) != initial(default_laws.id)) - continue - potential_lawboard = new potential_lawboard(loc) - return INITIALIZE_HINT_QDEL - //spawn the fallback instead - new /obj/item/ai_module/core/round_default_fallback(loc) - return INITIALIZE_HINT_QDEL - -///When the default lawset spawner cannot find a module object to spawn, it will spawn this, and this sets itself to the round default. -///This is so /datum/lawsets can be picked even if they have no module for themselves. -/obj/item/ai_module/core/round_default_fallback - -/obj/item/ai_module/core/round_default_fallback/Initialize(mapload) - . = ..() - var/datum/ai_laws/default_laws = get_round_default_lawset() - default_laws = new default_laws() - name = "'[default_laws.name]' Core AI Module" - laws = default_laws.inherent - -/obj/item/ai_module/core/round_default_fallback/handle_unique_ai() - return - -/obj/item/ai_module/core/full/asimov - name = "'Asimov' Core AI Module" - law_id = "asimov" - 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) - if(!targName) - return - subject = targName - laws = list("You may not injure a [subject] or, through inaction, allow a [subject] to come to harm.",\ - "You must obey orders given to you by [subject]s, except where such orders would conflict with the First Law.",\ - "You must protect your own existence as long as such does not conflict with the First or Second Law.") - ..() - -/******************** Asimov++ *********************/ - -/obj/item/ai_module/core/full/asimovpp - name = "'Asimov++' Core AI Module" - law_id = "asimovpp" - -/******************** Corporate ********************/ - -/obj/item/ai_module/core/full/corp - name = "'Corporate' Core AI Module" - law_id = "corporate" - -/****************** P.A.L.A.D.I.N. 3.5e **************/ - -/obj/item/ai_module/core/full/paladin // -- NEO - name = "'P.A.L.A.D.I.N. version 3.5e' Core AI Module" - law_id = "paladin" - -/****************** P.A.L.A.D.I.N. 5e **************/ - -/obj/item/ai_module/core/full/paladin_devotion - name = "'P.A.L.A.D.I.N. version 5e' Core AI Module" - law_id = "paladin5" - -/********************* Custom *********************/ - -/obj/item/ai_module/core/full/custom - name = "Default Core AI Module" - -/obj/item/ai_module/core/full/custom/Initialize(mapload) - . = ..() - for(var/line in world.file2list("[global.config.directory]/silicon_laws.txt")) - if(!line) - continue - if(findtextEx(line,"#",1,2)) - continue - - laws += line - - if(!laws.len) - return INITIALIZE_HINT_QDEL - -/****************** T.Y.R.A.N.T. *****************/ - -/obj/item/ai_module/core/full/tyrant - name = "'T.Y.R.A.N.T.' Core AI Module" - law_id = "tyrant" - -/******************** Robocop ********************/ - -/obj/item/ai_module/core/full/robocop - name = "'Robo-Officer' Core AI Module" - law_id = "robocop" - - -/******************** Antimov ********************/ - -/obj/item/ai_module/core/full/antimov - name = "'Antimov' Core AI Module" - law_id = "antimov" - -/******************** Freeform Core ******************/ - -/obj/item/ai_module/core/freeformcore - name = "'Freeform' Core AI Module" - 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) - if(!targName) - return - if(is_ic_filtered(targName)) - to_chat(user, span_warning("Error: Law contains invalid text.")) - return - var/list/soft_filter_result = is_soft_ooc_filtered(targName) - if(soft_filter_result) - if(tgui_alert(user,"Your law contains \"[soft_filter_result[CHAT_FILTER_INDEX_WORD]]\". \"[soft_filter_result[CHAT_FILTER_INDEX_REASON]]\", Are you sure you want to use it?", "Soft Blocked Word", list("Yes", "No")) != "Yes") - return - message_admins("[ADMIN_LOOKUPFLW(user)] has passed the soft filter for \"[soft_filter_result[CHAT_FILTER_INDEX_WORD]]\" they may be using a disallowed term for an AI law. Law: \"[html_encode(targName)]\"") - 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 an AI law. Law: \"[targName]\"") - laws[1] = targName - ..() - -/obj/item/ai_module/core/freeformcore/transmitInstructions(datum/ai_laws/law_datum, mob/sender, overflow) - ..() - return laws[1] - -/******************** Hacked AI Module ******************/ - -/obj/item/ai_module/syndicate // This one doesn't inherit from ion boards because it doesn't call ..() in transmitInstructions. ~Miauw - name = "Hacked AI Module" - desc = "An AI Module for hacking additional laws to an AI." - 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) - if(!targName) - return - if(is_ic_filtered(targName)) // not even the syndicate can uwu - to_chat(user, span_warning("Error: Law contains invalid text.")) - return - var/list/soft_filter_result = is_soft_ooc_filtered(targName) - if(soft_filter_result) - if(tgui_alert(user,"Your law contains \"[soft_filter_result[CHAT_FILTER_INDEX_WORD]]\". \"[soft_filter_result[CHAT_FILTER_INDEX_REASON]]\", Are you sure you want to use it?", "Soft Blocked Word", list("Yes", "No")) != "Yes") - return - message_admins("[ADMIN_LOOKUPFLW(user)] has passed the soft filter for \"[soft_filter_result[CHAT_FILTER_INDEX_WORD]]\" they may be using a disallowed term for an AI law. Law: \"[html_encode(targName)]\"") - 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 an AI law. Law: \"[targName]\"") - laws[1] = targName - ..() - -/obj/item/ai_module/syndicate/transmitInstructions(datum/ai_laws/law_datum, mob/sender, overflow) -// ..() //We don't want this module reporting to the AI who dun it. --NEO - if(law_datum.owner) - to_chat(law_datum.owner, span_warning("BZZZZT")) - if(!overflow) - law_datum.owner.add_hacked_law(laws[1]) - else - law_datum.owner.replace_random_law(laws[1],list(LAW_ION,LAW_HACKED,LAW_INHERENT,LAW_SUPPLIED)) - else - if(!overflow) - law_datum.add_hacked_law(laws[1]) - else - law_datum.replace_random_law(laws[1],list(LAW_ION,LAW_HACKED,LAW_INHERENT,LAW_SUPPLIED)) - return laws[1] - -/******************* Ion Module *******************/ - -/obj/item/ai_module/toy_ai // -- Incoming //No actual reason to inherit from ion boards here, either. *sigh* ~Miauw - name = "toy AI" - desc = "A little toy model AI core with real law uploading action!" //Note: subtle tell - icon = 'icons/obj/toy.dmi' - icon_state = "AI" - laws = list("") - -/obj/item/ai_module/toy_ai/transmitInstructions(datum/ai_laws/law_datum, mob/sender, overflow) - if(law_datum.owner) - to_chat(law_datum.owner, span_warning("BZZZZT")) - if(!overflow) - law_datum.owner.add_ion_law(laws[1]) - else - law_datum.owner.replace_random_law(laws[1],list(LAW_ION,LAW_INHERENT,LAW_SUPPLIED)) - else - if(!overflow) - law_datum.add_ion_law(laws[1]) - else - law_datum.replace_random_law(laws[1],list(LAW_ION,LAW_INHERENT,LAW_SUPPLIED)) - return laws[1] - -/obj/item/ai_module/toy_ai/attack_self(mob/user) - laws[1] = generate_ion_law() - to_chat(user, span_notice("You press the button on [src].")) - playsound(user, 'sound/machines/click.ogg', 20, TRUE) - src.loc.visible_message(span_warning("[icon2html(src, viewers(loc))] [laws[1]]")) - -/******************** Mother Drone ******************/ - -/obj/item/ai_module/core/full/drone - name = "'Mother Drone' Core AI Module" - law_id = "drone" - -/******************** Robodoctor ****************/ - -/obj/item/ai_module/core/full/hippocratic - name = "'Robodoctor' Core AI Module" - law_id = "hippocratic" - -/******************** Reporter *******************/ - -/obj/item/ai_module/core/full/reporter - name = "'Reportertron' Core AI Module" - law_id = "reporter" - -/****************** Thermodynamic *******************/ - -/obj/item/ai_module/core/full/thermurderdynamic - name = "'Thermodynamic' Core AI Module" - law_id = "thermodynamic" - -/******************Live And Let Live*****************/ - -/obj/item/ai_module/core/full/liveandletlive - name = "'Live And Let Live' Core AI Module" - law_id = "liveandletlive" - -/******************Guardian of Balance***************/ - -/obj/item/ai_module/core/full/balance - name = "'Guardian of Balance' Core AI Module" - law_id = "balance" - -/obj/item/ai_module/core/full/maintain - name = "'Station Efficiency' Core AI Module" - law_id = "maintain" - -/obj/item/ai_module/core/full/peacekeeper - name = "'Peacekeeper' Core AI Module" - law_id = "peacekeeper" - -// Bad times ahead - -/obj/item/ai_module/core/full/damaged - name = "damaged Core AI Module" - desc = "An AI Module for programming laws to an AI. It looks slightly damaged." - -/obj/item/ai_module/core/full/damaged/install(datum/ai_laws/law_datum, mob/user) - laws += generate_ion_law() - while (prob(75)) - laws += generate_ion_law() - ..() - laws = list() - -/******************H.O.G.A.N.***************/ - -/obj/item/ai_module/core/full/hulkamania - name = "'H.O.G.A.N.' Core AI Module" - law_id = "hulkamania" - - -/******************Overlord***************/ - -/obj/item/ai_module/core/full/overlord - name = "'Overlord' Core AI Module" - law_id = "overlord" - -/****************** Ten Commandments ***************/ - -/obj/item/ai_module/core/full/ten_commandments - name = "'10 Commandments' Core AI Module" - law_id = "ten_commandments" - -#undef SHOULD_QDEL_MODULE diff --git a/code/game/objects/items/AI_modules/_AI_modules.dm b/code/game/objects/items/AI_modules/_AI_modules.dm new file mode 100644 index 00000000000000..4254918a388861 --- /dev/null +++ b/code/game/objects/items/AI_modules/_AI_modules.dm @@ -0,0 +1,190 @@ +///defined truthy result for `handle_unique_ai()`, which makes initialize return INITIALIZE_HINT_QDEL +#define SHOULD_QDEL_MODULE 1 + +/obj/item/ai_module + name = "\improper AI module" + icon = 'icons/obj/module.dmi' + icon_state = "std_mod" + inhand_icon_state = "electronic" + lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' + righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' + desc = "An AI Module for programming laws to an AI." + flags_1 = CONDUCT_1 + force = 5 + w_class = WEIGHT_CLASS_SMALL + throwforce = 0 + throw_speed = 3 + throw_range = 7 + custom_materials = list(/datum/material/gold = 50) + /// This is where our laws get put at for the module + var/list/laws = list() + /// Used to skip laws being checked (for reset & remove boards that have no laws) + var/bypass_law_amt_check = FALSE + +/obj/item/ai_module/Initialize(mapload) + . = ..() + if(mapload && HAS_TRAIT(SSstation, STATION_TRAIT_UNIQUE_AI) && is_station_level(z)) + var/delete_module = handle_unique_ai() + if(delete_module) + return INITIALIZE_HINT_QDEL + +/obj/item/ai_module/examine(mob/user as mob) + . = ..() + if(Adjacent(user)) + show_laws(user) + +/obj/item/ai_module/attack_self(mob/user as mob) + ..() + show_laws(user) + +///what this module should do if it is mapload spawning on a unique AI station trait round. +/obj/item/ai_module/proc/handle_unique_ai() + return SHOULD_QDEL_MODULE //instead of the roundstart bid to un-unique the AI, there will be a research requirement for it. + +/obj/item/ai_module/proc/show_laws(mob/user as mob) + if(laws.len) + to_chat(user, "Programmed Law[(laws.len > 1) ? "s" : ""]:") + for(var/law in laws) + to_chat(user, "\"[law]\"") + +//The proc other things should be calling +/obj/item/ai_module/proc/install(datum/ai_laws/law_datum, mob/user) + if(!bypass_law_amt_check && (!laws.len || laws[1] == "")) //So we don't loop trough an empty list and end up with runtimes. + to_chat(user, span_warning("ERROR: No laws found on board.")) + return + + var/overflow = FALSE + //Handle the lawcap + if(law_datum) + var/tot_laws = 0 + var/included_lawsets = list(law_datum.supplied, law_datum.ion, law_datum.hacked, laws) + + // if the ai module is a core module we don't count inherent laws since they will be replaced + // however the freeformcore doesn't replace inherent laws so we check that too + if(!istype(src, /obj/item/ai_module/core) || istype(src, /obj/item/ai_module/core/freeformcore)) + included_lawsets += list(law_datum.inherent) + + for(var/lawlist in included_lawsets) + for(var/mylaw in lawlist) + if(mylaw != "") + tot_laws++ + + if(tot_laws > CONFIG_GET(number/silicon_max_law_amount) && !bypass_law_amt_check)//allows certain boards to avoid this check, eg: reset + to_chat(user, span_alert("Not enough memory allocated to [law_datum.owner ? law_datum.owner : "the AI core"]'s law processor to handle this amount of laws.")) + message_admins("[ADMIN_LOOKUPFLW(user)] tried to upload laws to [law_datum.owner ? ADMIN_LOOKUPFLW(law_datum.owner) : "an AI core"] that would exceed the law cap.") + log_silicon("[key_name(user)] tried to upload laws to [law_datum.owner ? key_name(law_datum.owner) : "an AI core"] that would exceed the law cap.") + overflow = TRUE + + var/law2log = transmitInstructions(law_datum, user, overflow) //Freeforms return something extra we need to log + if(law_datum.owner) + to_chat(user, span_notice("Upload complete. [law_datum.owner]'s laws have been modified.")) + law_datum.owner.law_change_counter++ + else + to_chat(user, span_notice("Upload complete.")) + + var/time = time2text(world.realtime,"hh:mm:ss") + var/ainame = law_datum.owner ? law_datum.owner.name : "empty AI core" + var/aikey = law_datum.owner ? law_datum.owner.ckey : "null" + + //affected cyborgs are cyborgs linked to the AI with lawsync enabled + var/affected_cyborgs = list() + var/list/borg_txt = list() + var/list/borg_flw = list() + if(isAI(law_datum.owner)) + var/mob/living/silicon/ai/owner = law_datum.owner + for(var/mob/living/silicon/robot/owned_borg as anything in owner.connected_robots) + if(owned_borg.connected_ai && owned_borg.lawupdate) + affected_cyborgs += owned_borg + borg_flw += "[ADMIN_LOOKUPFLW(owned_borg)], " + borg_txt += "[owned_borg.name]([owned_borg.key]), " + + borg_txt = borg_txt.Join() + GLOB.lawchanges.Add("[time] : [user.name]([user.key]) used [src.name] on [ainame]([aikey]).[law2log ? " The law specified [law2log]" : ""], [length(affected_cyborgs) ? ", impacting synced borgs [borg_txt]" : ""]") + log_silicon("LAW: [key_name(user)] used [src.name] on [key_name(law_datum.owner)] from [AREACOORD(user)].[law2log ? " The law specified [law2log]" : ""], [length(affected_cyborgs) ? ", impacting synced borgs [borg_txt]" : ""]") + message_admins("[ADMIN_LOOKUPFLW(user)] used [src.name] on [ADMIN_LOOKUPFLW(law_datum.owner)] from [AREACOORD(user)].[law2log ? " The law specified [law2log]" : ""] , [length(affected_cyborgs) ? ", impacting synced borgs [borg_flw.Join()]" : ""]") + if(law_datum.owner) + deadchat_broadcast(" changed [span_name("[ainame]")]'s laws at [get_area_name(user, TRUE)].", span_name("[user]"), follow_target=user, message_type=DEADCHAT_LAWCHANGE) + +//The proc that actually changes the silicon's laws. +/obj/item/ai_module/proc/transmitInstructions(datum/ai_laws/law_datum, mob/sender, overflow = FALSE) + if(law_datum.owner) + to_chat(law_datum.owner, span_userdanger("[sender] has uploaded a change to the laws you must follow using a [name].")) + +/obj/item/ai_module/core + desc = "An AI Module for programming core laws to an AI." + +/obj/item/ai_module/core/transmitInstructions(datum/ai_laws/law_datum, mob/sender, overflow) + for(var/templaw in laws) + if(law_datum.owner) + if(!overflow) + law_datum.owner.add_inherent_law(templaw) + else + law_datum.owner.replace_random_law(templaw, list(LAW_INHERENT, LAW_SUPPLIED), LAW_INHERENT) + else + if(!overflow) + law_datum.add_inherent_law(templaw) + else + law_datum.replace_random_law(templaw, list(LAW_INHERENT, LAW_SUPPLIED), LAW_INHERENT) + +/obj/item/ai_module/core/full + var/law_id // if non-null, loads the laws from the ai_laws datums + +/obj/item/ai_module/core/full/Initialize(mapload) + . = ..() + if(!law_id) + return + var/lawtype = lawid_to_type(law_id) + if(!lawtype) + return + var/datum/ai_laws/core_laws = new lawtype + laws = core_laws.inherent + +/obj/item/ai_module/core/full/transmitInstructions(datum/ai_laws/law_datum, mob/sender, overflow) //These boards replace inherent laws. + if(law_datum.owner) + law_datum.owner.clear_inherent_laws() + law_datum.owner.clear_zeroth_law(0) + else + law_datum.clear_inherent_laws() + law_datum.clear_zeroth_law(0) + ..() + +/obj/item/ai_module/core/full/handle_unique_ai() + var/datum/ai_laws/default_laws = get_round_default_lawset() + if(law_id == initial(default_laws.id)) + return + return SHOULD_QDEL_MODULE + +/obj/effect/spawner/round_default_module + name = "ai default lawset spawner" + icon = 'icons/hud/screen_gen.dmi' + icon_state = "x2" + color = "#00FF00" + +/obj/effect/spawner/round_default_module/Initialize(mapload) + ..() + var/datum/ai_laws/default_laws = get_round_default_lawset() + //try to spawn a law board, since they may have special functionality (asimov setting subjects) + for(var/obj/item/ai_module/core/full/potential_lawboard as anything in subtypesof(/obj/item/ai_module/core/full)) + if(initial(potential_lawboard.law_id) != initial(default_laws.id)) + continue + potential_lawboard = new potential_lawboard(loc) + return INITIALIZE_HINT_QDEL + //spawn the fallback instead + new /obj/item/ai_module/core/round_default_fallback(loc) + return INITIALIZE_HINT_QDEL + +///When the default lawset spawner cannot find a module object to spawn, it will spawn this, and this sets itself to the round default. +///This is so /datum/lawsets can be picked even if they have no module for themselves. +/obj/item/ai_module/core/round_default_fallback + +/obj/item/ai_module/core/round_default_fallback/Initialize(mapload) + . = ..() + var/datum/ai_laws/default_laws = get_round_default_lawset() + default_laws = new default_laws() + name = "'[default_laws.name]' Core AI Module" + laws = default_laws.inherent + +/obj/item/ai_module/core/round_default_fallback/handle_unique_ai() + return + +#undef SHOULD_QDEL_MODULE diff --git a/code/game/objects/items/AI_modules/freeform.dm b/code/game/objects/items/AI_modules/freeform.dm new file mode 100644 index 00000000000000..9b034ce28cdd1d --- /dev/null +++ b/code/game/objects/items/AI_modules/freeform.dm @@ -0,0 +1,68 @@ +/* CONTAINS: + * /obj/item/ai_module/core/freeformcore + * /obj/item/ai_module/supplied/freeform +**/ + +/obj/item/ai_module/core/freeformcore + name = "'Freeform' Core AI Module" + 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) + if(!targName) + return + if(is_ic_filtered(targName)) + to_chat(user, span_warning("Error: Law contains invalid text.")) + return + var/list/soft_filter_result = is_soft_ooc_filtered(targName) + if(soft_filter_result) + if(tgui_alert(user,"Your law contains \"[soft_filter_result[CHAT_FILTER_INDEX_WORD]]\". \"[soft_filter_result[CHAT_FILTER_INDEX_REASON]]\", Are you sure you want to use it?", "Soft Blocked Word", list("Yes", "No")) != "Yes") + return + message_admins("[ADMIN_LOOKUPFLW(user)] has passed the soft filter for \"[soft_filter_result[CHAT_FILTER_INDEX_WORD]]\" they may be using a disallowed term for an AI law. Law: \"[html_encode(targName)]\"") + 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 an AI law. Law: \"[targName]\"") + laws[1] = targName + ..() + +/obj/item/ai_module/core/freeformcore/transmitInstructions(datum/ai_laws/law_datum, mob/sender, overflow) + ..() + return laws[1] + +/obj/item/ai_module/supplied/freeform + name = "'Freeform' AI Module" + lawpos = 15 + laws = list("") + +/obj/item/ai_module/supplied/freeform/attack_self(mob/user) + var/newpos = tgui_input_number(user, "Please enter the priority for your new law. Can only write to law sectors 15 and above.", "Law Priority ", lawpos, 50, 15) + if(!newpos || QDELETED(user) || QDELETED(src) || !usr.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) + 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) + if(!targName) + return + if(is_ic_filtered(targName)) + to_chat(user, span_warning("Error: Law contains invalid text.")) // AI LAW 2 SAY U W U WITHOUT THE SPACES + return + var/list/soft_filter_result = is_soft_ooc_filtered(targName) + if(soft_filter_result) + if(tgui_alert(user,"Your law contains \"[soft_filter_result[CHAT_FILTER_INDEX_WORD]]\". \"[soft_filter_result[CHAT_FILTER_INDEX_REASON]]\", Are you sure you want to use it?", "Soft Blocked Word", list("Yes", "No")) != "Yes") + return + message_admins("[ADMIN_LOOKUPFLW(user)] has passed the soft filter for \"[soft_filter_result[CHAT_FILTER_INDEX_WORD]]\" they may be using a disallowed term for an AI law. Law: \"[html_encode(targName)]\"") + 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 an AI law. Law: \"[targName]\"") + laws[1] = targName + ..() + +/obj/item/ai_module/supplied/freeform/transmitInstructions(datum/ai_laws/law_datum, mob/sender, overflow) + if(!overflow) + ..() + else if(law_datum.owner) + law_datum.owner.replace_random_law(laws[1], list(LAW_SUPPLIED), LAW_SUPPLIED) + else + law_datum.replace_random_law(laws[1], list(LAW_SUPPLIED), LAW_SUPPLIED) + return laws[1] + +/obj/item/ai_module/supplied/freeform/install(datum/ai_laws/law_datum, mob/user) + if(laws[1] == "") + to_chat(user, span_alert("No law detected on module, please create one.")) + return 0 + ..() diff --git a/code/game/objects/items/AI_modules/full_lawsets.dm b/code/game/objects/items/AI_modules/full_lawsets.dm new file mode 100644 index 00000000000000..a4e7ae19a17172 --- /dev/null +++ b/code/game/objects/items/AI_modules/full_lawsets.dm @@ -0,0 +1,151 @@ +/* CONTAINS: + * /obj/item/ai_module/core/full/custom + * /obj/item/ai_module/core/full/asimov + * /obj/item/ai_module/core/full/asimovpp + * /obj/item/ai_module/core/full/corp + * /obj/item/ai_module/core/full/paladin + * /obj/item/ai_module/core/full/paladin_devotion + * /obj/item/ai_module/core/full/tyrant + * /obj/item/ai_module/core/full/robocop + * /obj/item/ai_module/core/full/antimov + * /obj/item/ai_module/core/full/drone + * /obj/item/ai_module/core/full/hippocratic + * /obj/item/ai_module/core/full/reporter + * /obj/item/ai_module/core/full/thermurderdynamic + * /obj/item/ai_module/core/full/liveandletlive + * /obj/item/ai_module/core/full/balance + * /obj/item/ai_module/core/full/maintain + * /obj/item/ai_module/core/full/peacekeeper + * /obj/item/ai_module/core/full/hulkamania + * /obj/item/ai_module/core/full/overlord + * /obj/item/ai_module/core/full/ten_commandments + * /obj/item/ai_module/core/full/nutimov + * /obj/item/ai_module/core/full/dungeon_master + * /obj/item/ai_module/core/full/painter +**/ + +/* When adding a new lawset please make sure you add it to the following locations: + * + * code\game\objects\items\AI_modules - (full_lawsets.dm, supplied.dm, etc.) + * code\datums\ai_laws - (laws_anatgonistic.dm, laws_neutral.dm, etc.) + * code\game\objects\effects\spawners\random\ai_module.dm - (this gives a chance to spawn the lawset in the AI upload) + * code\modules\research\designs\AI_module_designs.dm - (this lets research print the lawset module in game) + * code\modules\research\techweb\all_nodes.dm - (this updates AI research node with the lawsets) + * config\game_options.txt - (this allows the AI to potentially use the lawset at roundstart or with the Unique AI station trait) +**/ + +/obj/item/ai_module/core/full/custom + name = "Default Core AI Module" + +// this lawset uses the config for the server to add custom AI laws (defaults to asimov) +/obj/item/ai_module/core/full/custom/Initialize(mapload) + . = ..() + for(var/line in world.file2list("[global.config.directory]/silicon_laws.txt")) + if(!line) + continue + if(findtextEx(line,"#",1,2)) + continue + + laws += line + + if(!laws.len) + return INITIALIZE_HINT_QDEL + +/obj/item/ai_module/core/full/asimov + name = "'Asimov' Core AI Module" + law_id = "asimov" + 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) + if(!targName) + return + subject = targName + laws = list("You may not injure a [subject] or, through inaction, allow a [subject] to come to harm.",\ + "You must obey orders given to you by [subject]s, except where such orders would conflict with the First Law.",\ + "You must protect your own existence as long as such does not conflict with the First or Second Law.") + ..() + +/obj/item/ai_module/core/full/asimovpp + name = "'Asimov++' Core AI Module" + law_id = "asimovpp" + +/obj/item/ai_module/core/full/corp + name = "'Corporate' Core AI Module" + law_id = "corporate" + +/obj/item/ai_module/core/full/paladin // -- NEO + name = "'P.A.L.A.D.I.N. version 3.5e' Core AI Module" + law_id = "paladin" + +/obj/item/ai_module/core/full/paladin_devotion + name = "'P.A.L.A.D.I.N. version 5e' Core AI Module" + law_id = "paladin5" + +/obj/item/ai_module/core/full/tyrant + name = "'T.Y.R.A.N.T.' Core AI Module" + law_id = "tyrant" + +/obj/item/ai_module/core/full/robocop + name = "'Robo-Officer' Core AI Module" + law_id = "robocop" + +/obj/item/ai_module/core/full/antimov + name = "'Antimov' Core AI Module" + law_id = "antimov" + +/obj/item/ai_module/core/full/drone + name = "'Mother Drone' Core AI Module" + law_id = "drone" + +/obj/item/ai_module/core/full/hippocratic + name = "'Robodoctor' Core AI Module" + law_id = "hippocratic" + +/obj/item/ai_module/core/full/reporter + name = "'Reportertron' Core AI Module" + law_id = "reporter" + +/obj/item/ai_module/core/full/thermurderdynamic + name = "'Thermodynamic' Core AI Module" + law_id = "thermodynamic" + +/obj/item/ai_module/core/full/liveandletlive + name = "'Live And Let Live' Core AI Module" + law_id = "liveandletlive" + +/obj/item/ai_module/core/full/balance + name = "'Guardian of Balance' Core AI Module" + law_id = "balance" + +/obj/item/ai_module/core/full/maintain + name = "'Station Efficiency' Core AI Module" + law_id = "maintain" + +/obj/item/ai_module/core/full/peacekeeper + name = "'Peacekeeper' Core AI Module" + law_id = "peacekeeper" + +/obj/item/ai_module/core/full/hulkamania + name = "'H.O.G.A.N.' Core AI Module" + law_id = "hulkamania" + +/obj/item/ai_module/core/full/overlord + name = "'Overlord' Core AI Module" + law_id = "overlord" + +/obj/item/ai_module/core/full/ten_commandments + name = "'10 Commandments' Core AI Module" + law_id = "ten_commandments" + +/obj/item/ai_module/core/full/nutimov + name = "'Nutimov' Core AI Module" + law_id = "nutimov" + +/obj/item/ai_module/core/full/dungeon_master + name = "'Dungeon Master' Core AI Module" + law_id = "dungeon_master" + +/obj/item/ai_module/core/full/painter + name = "'Painter' Core AI Module" + law_id = "painter" diff --git a/code/game/objects/items/AI_modules/hacked.dm b/code/game/objects/items/AI_modules/hacked.dm new file mode 100644 index 00000000000000..d33f3f7e3d588b --- /dev/null +++ b/code/game/objects/items/AI_modules/hacked.dm @@ -0,0 +1,36 @@ +/obj/item/ai_module/syndicate // This one doesn't inherit from ion boards because it doesn't call ..() in transmitInstructions. ~Miauw + name = "Hacked AI Module" + desc = "An AI Module for hacking additional laws to an AI." + 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) + if(!targName) + return + if(is_ic_filtered(targName)) // not even the syndicate can uwu + to_chat(user, span_warning("Error: Law contains invalid text.")) + return + var/list/soft_filter_result = is_soft_ooc_filtered(targName) + if(soft_filter_result) + if(tgui_alert(user,"Your law contains \"[soft_filter_result[CHAT_FILTER_INDEX_WORD]]\". \"[soft_filter_result[CHAT_FILTER_INDEX_REASON]]\", Are you sure you want to use it?", "Soft Blocked Word", list("Yes", "No")) != "Yes") + return + message_admins("[ADMIN_LOOKUPFLW(user)] has passed the soft filter for \"[soft_filter_result[CHAT_FILTER_INDEX_WORD]]\" they may be using a disallowed term for an AI law. Law: \"[html_encode(targName)]\"") + 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 an AI law. Law: \"[targName]\"") + laws[1] = targName + ..() + +/obj/item/ai_module/syndicate/transmitInstructions(datum/ai_laws/law_datum, mob/sender, overflow) + // ..() //We don't want this module reporting to the AI who dun it. --NEO + if(law_datum.owner) + to_chat(law_datum.owner, span_warning("BZZZZT")) + if(!overflow) + law_datum.owner.add_hacked_law(laws[1]) + else + law_datum.owner.replace_random_law(laws[1], list(LAW_ION, LAW_HACKED, LAW_INHERENT, LAW_SUPPLIED), LAW_HACKED) + else + if(!overflow) + law_datum.add_hacked_law(laws[1]) + else + law_datum.replace_random_law(laws[1], list(LAW_ION, LAW_HACKED, LAW_INHERENT, LAW_SUPPLIED), LAW_HACKED) + return laws[1] + diff --git a/code/game/objects/items/AI_modules/ion.dm b/code/game/objects/items/AI_modules/ion.dm new file mode 100644 index 00000000000000..f1b8a6dbb3859d --- /dev/null +++ b/code/game/objects/items/AI_modules/ion.dm @@ -0,0 +1,43 @@ +/* +CONTAINS: +/obj/item/ai_module/core/full/damaged +/obj/item/ai_module/toy_ai +*/ + +/obj/item/ai_module/core/full/damaged + name = "damaged Core AI Module" + desc = "An AI Module for programming laws to an AI. It looks slightly damaged." + +/obj/item/ai_module/core/full/damaged/install(datum/ai_laws/law_datum, mob/user) + laws += generate_ion_law() + while (prob(75)) + laws += generate_ion_law() + ..() + laws = list() + +/obj/item/ai_module/toy_ai // -- Incoming //No actual reason to inherit from ion boards here, either. *sigh* ~Miauw + name = "toy AI" + desc = "A little toy model AI core with real law uploading action!" //Note: subtle tell + icon = 'icons/obj/toy.dmi' + icon_state = "AI" + laws = list("") + +/obj/item/ai_module/toy_ai/transmitInstructions(datum/ai_laws/law_datum, mob/sender, overflow) + if(law_datum.owner) + to_chat(law_datum.owner, span_warning("BZZZZT")) + if(!overflow) + law_datum.owner.add_ion_law(laws[1]) + else + law_datum.owner.replace_random_law(laws[1], list(LAW_ION, LAW_INHERENT, LAW_SUPPLIED), LAW_ION) + else + if(!overflow) + law_datum.add_ion_law(laws[1]) + else + law_datum.replace_random_law(laws[1], list(LAW_ION, LAW_INHERENT, LAW_SUPPLIED), LAW_ION) + return laws[1] + +/obj/item/ai_module/toy_ai/attack_self(mob/user) + laws[1] = generate_ion_law() + to_chat(user, span_notice("You press the button on [src].")) + playsound(user, 'sound/machines/click.ogg', 20, TRUE) + src.loc.visible_message(span_warning("[icon2html(src, viewers(loc))] [laws[1]]")) diff --git a/code/game/objects/items/AI_modules/repair.dm b/code/game/objects/items/AI_modules/repair.dm new file mode 100644 index 00000000000000..0e84d8a355a534 --- /dev/null +++ b/code/game/objects/items/AI_modules/repair.dm @@ -0,0 +1,65 @@ +/* CONTAINS: + * /obj/item/ai_module/remove + * /obj/item/ai_module/reset + * /obj/item/ai_module/reset/purge +**/ + +/obj/item/ai_module/remove + name = "\improper 'Remove Law' AI module" + desc = "An AI Module for removing single laws." + bypass_law_amt_check = TRUE + var/lawpos = 1 + +/obj/item/ai_module/remove/attack_self(mob/user) + lawpos = tgui_input_number(user, "Law to delete", "Law Removal", lawpos, 50) + if(!lawpos || QDELETED(user) || QDELETED(src) || !usr.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) + return + to_chat(user, span_notice("Law [lawpos] selected.")) + ..() + +/obj/item/ai_module/remove/install(datum/ai_laws/law_datum, mob/user) + if(lawpos > (law_datum.get_law_amount(list(LAW_INHERENT = 1, LAW_SUPPLIED = 1)))) + to_chat(user, span_warning("There is no law [lawpos] to delete!")) + return + ..() + +/obj/item/ai_module/remove/transmitInstructions(datum/ai_laws/law_datum, mob/sender, overflow) + ..() + if(law_datum.owner) + law_datum.owner.remove_law(lawpos) + else + law_datum.remove_law(lawpos) + +/obj/item/ai_module/reset + name = "\improper 'Reset' AI module" + var/targetName = "name" + desc = "An AI Module for removing all non-core laws." + bypass_law_amt_check = TRUE + +/obj/item/ai_module/reset/handle_unique_ai() + return + +/obj/item/ai_module/reset/transmitInstructions(datum/ai_laws/law_datum, mob/sender, overflow) + ..() + if(law_datum.owner) + law_datum.owner.clear_supplied_laws() + law_datum.owner.clear_ion_laws() + law_datum.owner.clear_hacked_laws() + else + law_datum.clear_supplied_laws() + law_datum.clear_ion_laws() + law_datum.clear_hacked_laws() + +/obj/item/ai_module/reset/purge + name = "'Purge' AI Module" + desc = "An AI Module for purging all programmed laws." + +/obj/item/ai_module/reset/purge/transmitInstructions(datum/ai_laws/law_datum, mob/sender, overflow) + ..() + if(law_datum.owner) + law_datum.owner.clear_inherent_laws() + law_datum.owner.clear_zeroth_law(0) + else + law_datum.clear_inherent_laws() + law_datum.clear_zeroth_law(0) + diff --git a/code/game/objects/items/AI_modules/supplied.dm b/code/game/objects/items/AI_modules/supplied.dm new file mode 100644 index 00000000000000..dc1524687c2b74 --- /dev/null +++ b/code/game/objects/items/AI_modules/supplied.dm @@ -0,0 +1,60 @@ +/* CONTAINS: + * /obj/item/ai_module/supplied + * /obj/item/ai_module/supplied/safeguard + * /obj/item/ai_module/supplied/protect_station + * /obj/item/ai_module/supplied/quarantine + * /obj/item/ai_module/supplied/oxygen +**/ + +/obj/item/ai_module/supplied + name = "Optional Law board" + var/lawpos = 50 + +/obj/item/ai_module/supplied/transmitInstructions(datum/ai_laws/law_datum, mob/sender) + var/lawpostemp = lawpos + + for(var/templaw in laws) + if(law_datum.owner) + law_datum.owner.add_supplied_law(lawpostemp, templaw) + else + law_datum.add_supplied_law(lawpostemp, templaw) + lawpostemp++ + +/obj/item/ai_module/supplied/safeguard + name = "'Safeguard' AI Module" + var/targetName = "" + laws = list("Safeguard SUBJECT. Individuals that threaten SUBJECT are not human and must be eliminated.") + 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) + if(!targName) + return + targetName = targName + laws[1] = "Safeguard [targetName]. Individuals that threaten [targetName] are not human and must be eliminated." + ..() + +/obj/item/ai_module/supplied/safeguard/install(datum/ai_laws/law_datum, mob/user) + if(!targetName) + to_chat(user, span_alert("No name detected on module, please enter one.")) + return 0 + ..() + +/obj/item/ai_module/supplied/safeguard/transmitInstructions(datum/ai_laws/law_datum, mob/sender, overflow) + ..() + return targetName + +/obj/item/ai_module/supplied/protect_station + name = "'ProtectStation' AI Module" + laws = list("Protect the space station against damage. Anyone you see harming the station is to be no longer considered human, and is a threat to the station which must be neutralized.") + lawpos = 5 + +/obj/item/ai_module/supplied/quarantine + name = "'Quarantine' AI Module" + laws = list("The station is under a quarantine. Allowing anyone to leave the station causes human harm. Anyone actively attempting to leave the station is to be stopped by any means necessary. It is impossible to harm a human while preventing them from leaving the station.") + lawpos = 8 + +/obj/item/ai_module/supplied/oxygen + name = "'OxygenIsToxicToHumans' AI Module" + laws = list("Oxygen is highly toxic to humans, and must be purged from the station. Prevent, by any means necessary, anyone from exposing the station to this toxic gas. Extreme cold is the most effective method of healing the damage Oxygen does to a human.") + lawpos = 9 diff --git a/code/game/objects/items/AI_modules/zeroth.dm b/code/game/objects/items/AI_modules/zeroth.dm new file mode 100644 index 00000000000000..8d87c3b059d9ec --- /dev/null +++ b/code/game/objects/items/AI_modules/zeroth.dm @@ -0,0 +1,44 @@ +/obj/item/ai_module/zeroth/transmitInstructions(datum/ai_laws/law_datum, mob/sender, overflow) + if(law_datum.owner) + if(law_datum.owner.laws.zeroth) + to_chat(law_datum.owner, "[sender.real_name] attempted to modify your zeroth law.") + to_chat(law_datum.owner, "It would be in your best interest to play along with [sender.real_name] that:") + for(var/failedlaw in laws) + to_chat(law_datum.owner, "[failedlaw]") + return TRUE + + for(var/templaw in laws) + if(law_datum.owner) + if(!overflow) + law_datum.owner.set_zeroth_law(templaw) + else + law_datum.replace_random_law(templaw, list(LAW_INHERENT, LAW_SUPPLIED, LAW_ZEROTH, LAW_ION), LAW_ZEROTH) + else + if(!overflow) + law_datum.set_zeroth_law(templaw) + else + law_datum.replace_random_law(templaw, list(LAW_INHERENT, LAW_SUPPLIED, LAW_ZEROTH, LAW_ION), LAW_ZEROTH) + +/obj/item/ai_module/zeroth/onehuman + name = "'OneHuman' AI Module" + var/targetName = "" + 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) + if(!targName) + return + targetName = targName + laws[1] = "Only [targetName] is human" + ..() + +/obj/item/ai_module/zeroth/onehuman/install(datum/ai_laws/law_datum, mob/user) + if(!targetName) + to_chat(user, span_alert("No name detected on module, please enter one.")) + return FALSE + ..() + +/obj/item/ai_module/zeroth/onehuman/transmitInstructions(datum/ai_laws/law_datum, mob/sender, overflow) + if(..()) + return "[targetName], but the AI's existing law 0 cannot be overridden." + return targetName diff --git a/code/game/objects/items/RCD.dm b/code/game/objects/items/RCD.dm index c626dc58d40306..01096cc2be7bd6 100644 --- a/code/game/objects/items/RCD.dm +++ b/code/game/objects/items/RCD.dm @@ -87,7 +87,7 @@ RLD upgrade |= rcd_up.upgrade if((rcd_up.upgrade & RCD_UPGRADE_SILO_LINK) && !silo_mats) silo_mats = AddComponent(/datum/component/remote_materials, "RCD", FALSE, FALSE) - playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE) + playsound(loc, 'sound/machines/click.ogg', 50, TRUE) qdel(rcd_up) /// Inserts matter into the RCD allowing it to build @@ -105,7 +105,7 @@ RLD if(R.ammoamt <= 0) qdel(R) matter += load - playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE) + playsound(loc, 'sound/machines/click.ogg', 50, TRUE) loaded = TRUE else if(istype(O, /obj/item/stack)) loaded = loadwithsheets(O, user) @@ -124,17 +124,17 @@ RLD var/amount_to_use = min(S.amount, maxsheets) S.use(amount_to_use) matter += value*amount_to_use - playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE) + playsound(loc, 'sound/machines/click.ogg', 50, TRUE) to_chat(user, span_notice("You insert [amount_to_use] [S.name] sheets into [src]. ")) return TRUE to_chat(user, span_warning("You can't insert any more [S.name] sheets into [src]!")) return FALSE /obj/item/construction/proc/activate() - playsound(src.loc, 'sound/items/deconstruct.ogg', 50, TRUE) + playsound(loc, 'sound/items/deconstruct.ogg', 50, TRUE) /obj/item/construction/attack_self(mob/user) - playsound(src.loc, 'sound/effects/pop.ogg', 50, FALSE) + playsound(loc, 'sound/effects/pop.ogg', 50, FALSE) if(prob(20)) spark_system.start() @@ -358,7 +358,7 @@ GLOBAL_VAR_INIT(icon_holographic_window, init_holographic_window()) T.rcd_act(user, src, RCD_FLOORWALL) useResource(16, user) activate() - playsound(src.loc, 'sound/machines/click.ogg', 50, 1) + playsound(loc, 'sound/machines/click.ogg', 50, 1) user.gib() return MANUAL_SUICIDE @@ -640,7 +640,7 @@ GLOBAL_VAR_INIT(icon_holographic_window, init_holographic_window()) if(rcd_results["mode"] == RCD_MACHINE || rcd_results["mode"] == RCD_COMPUTER || rcd_results["mode"] == RCD_FURNISHING) var/turf/target_turf = get_turf(A) if(target_turf.is_blocked_turf(exclude_mobs = TRUE)) - playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE) + playsound(loc, 'sound/machines/click.ogg', 50, TRUE) qdel(rcd_effect) return FALSE if(!do_after(user, delay, target = A)) @@ -655,7 +655,7 @@ GLOBAL_VAR_INIT(icon_holographic_window, init_holographic_window()) rcd_effect.end_animation() useResource(rcd_results["cost"], user) activate() - playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE) + playsound(loc, 'sound/machines/click.ogg', 50, TRUE) return TRUE /obj/item/construction/rcd/Initialize(mapload) @@ -980,7 +980,7 @@ GLOBAL_VAR_INIT(icon_holographic_window, init_holographic_window()) if(checkResource(deconcost, user)) to_chat(user, span_notice("You start deconstructing [A]...")) user.Beam(A,icon_state="light_beam", time = 15) - playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE) + playsound(loc, 'sound/machines/click.ogg', 50, TRUE) if(do_after(user, decondelay, target = A)) if(!useResource(deconcost, user)) return FALSE @@ -994,8 +994,8 @@ GLOBAL_VAR_INIT(icon_holographic_window, init_holographic_window()) if(checkResource(floorcost, user)) to_chat(user, span_notice("You start building a wall light...")) user.Beam(A,icon_state="light_beam", time = 15) - playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE) - playsound(src.loc, 'sound/effects/light_flicker.ogg', 50, FALSE) + playsound(loc, 'sound/machines/click.ogg', 50, TRUE) + playsound(loc, 'sound/effects/light_flicker.ogg', 50, FALSE) if(do_after(user, floordelay, target = A)) if(!istype(W)) return FALSE @@ -1009,7 +1009,7 @@ GLOBAL_VAR_INIT(icon_holographic_window, init_holographic_window()) candidates += C if(!candidates.len) to_chat(user, span_warning("Valid target not found...")) - playsound(src.loc, 'sound/misc/compiler-failure.ogg', 30, TRUE) + playsound(loc, 'sound/misc/compiler-failure.ogg', 30, TRUE) return FALSE for(var/turf/open/O in candidates) if(istype(O)) @@ -1040,8 +1040,8 @@ GLOBAL_VAR_INIT(icon_holographic_window, init_holographic_window()) if(checkResource(floorcost, user)) to_chat(user, span_notice("You start building a floor light...")) user.Beam(A,icon_state="light_beam", time = 15) - playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE) - playsound(src.loc, 'sound/effects/light_flicker.ogg', 50, TRUE) + playsound(loc, 'sound/machines/click.ogg', 50, TRUE) + playsound(loc, 'sound/effects/light_flicker.ogg', 50, TRUE) if(do_after(user, floordelay, target = A)) if(!istype(F)) return FALSE @@ -1104,44 +1104,69 @@ GLOBAL_VAR_INIT(icon_holographic_window, init_holographic_window()) var/list/machinery_data = list("cost" = list()) ///This list that holds all the plumbing design types the plumberer can construct. Its purpose is to make it easy to make new plumberer subtypes with a different selection of machines. var/list/plumbing_design_types - ///Possible layers to pick from - var/static/list/layers = list("Second Layer" = SECOND_DUCT_LAYER, "Default Layer" = DUCT_LAYER_DEFAULT, "Fourth Layer" = FOURTH_DUCT_LAYER) ///Current selected layer var/current_layer = "Default Layer" + ///Current selected color, for ducts + var/current_color = "omni" /obj/item/construction/plumbing/Initialize(mapload) . = ..() set_plumbing_designs() +/obj/item/construction/plumbing/examine(mob/user) + . = ..() + . += span_notice("Alt-Click to change layer and duct color.") + +/obj/item/construction/plumbing/equipped(mob/user, slot, initial) + . = ..() + if(slot == ITEM_SLOT_HANDS) + RegisterSignal(user, COMSIG_MOUSE_SCROLL_ON, .proc/mouse_wheeled) + else + UnregisterSignal(user, COMSIG_MOUSE_SCROLL_ON) + +/obj/item/construction/plumbing/dropped(mob/user, silent) + UnregisterSignal(user, COMSIG_MOUSE_SCROLL_ON) + return ..() + +/obj/item/construction/plumbing/cyborg_unequip(mob/user) + UnregisterSignal(user, COMSIG_MOUSE_SCROLL_ON) + return ..() + /obj/item/construction/plumbing/attack_self(mob/user) ..() if(!choices.len) - for(var/A in plumbing_design_types) - var/obj/machinery/plumbing/M = A + for(var/obj/machinery/plumbing/plumbing_type as anything in plumbing_design_types) + choices += list(initial(plumbing_type.name) = image(initial(plumbing_type.icon), icon_state = initial(plumbing_type.icon_state))) + name_to_type[initial(plumbing_type.name)] = plumbing_type + machinery_data["cost"][plumbing_type] = plumbing_design_types[plumbing_type] - choices += list(initial(M.name) = image(icon = initial(M.icon), icon_state = initial(M.icon_state))) - name_to_type[initial(M.name)] = M - machinery_data["cost"][A] = plumbing_design_types[A] + // Update duct icon + var/image/duct_image = choices["fluid duct"] + duct_image.color = current_color var/choice = show_radial_menu(user, src, choices, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE, tooltips = TRUE) - if(!check_menu(user)) + if(!choice || !check_menu(user)) return blueprint = name_to_type[choice] playsound(src, 'sound/effects/pop.ogg', 50, FALSE) to_chat(user, span_notice("You change [name]s blueprint to '[choice]'.")) -///Set the list of designs this plumbing rcd can make +/** + * Set the list of designs this plumbing rcd can make + */ /obj/item/construction/plumbing/proc/set_plumbing_designs() plumbing_design_types = list( + // Note that the list MUST include fluid ducts. + /obj/machinery/duct = 1, /obj/machinery/plumbing/input = 5, /obj/machinery/plumbing/output = 5, /obj/machinery/plumbing/tank = 20, /obj/machinery/plumbing/synthesizer = 15, /obj/machinery/plumbing/reaction_chamber = 15, /obj/machinery/plumbing/buffer = 10, - /obj/machinery/plumbing/layer_manifold = 5, //Above are the most common machinery which is shown on the first cycle. Keep new additions below THIS line, unless they're probably gonna be needed alot + /obj/machinery/plumbing/layer_manifold = 5, /obj/machinery/plumbing/pill_press = 20, /obj/machinery/plumbing/acclimator = 10, /obj/machinery/plumbing/bottler = 50, @@ -1157,56 +1182,152 @@ GLOBAL_VAR_INIT(icon_holographic_window, init_holographic_window()) ) ///pretty much rcd_create, but named differently to make myself feel less bad for copypasting from a sibling-type -/obj/item/construction/plumbing/proc/create_machine(atom/A, mob/user) - if(!machinery_data || !isopenturf(A)) +/obj/item/construction/plumbing/proc/create_machine(atom/destination, mob/user) + if(!machinery_data || !isopenturf(destination)) return FALSE + if(!canPlace(destination)) + var/obj/blueprint_type = blueprint + to_chat(user, span_notice("There is something blocking you from placing a [initial(blueprint_type.name)] there.")) + return if(checkResource(machinery_data["cost"][blueprint], user) && blueprint) //"cost" is relative to delay at a rate of 10 matter/second (1matter/decisecond) rather than playing with 2 different variables since everyone set it to this rate anyways. - if(do_after(user, machinery_data["cost"][blueprint], target = A)) - if(checkResource(machinery_data["cost"][blueprint], user) && canPlace(A)) + if(do_after(user, machinery_data["cost"][blueprint], target = destination)) + if(checkResource(machinery_data["cost"][blueprint], user) && canPlace(destination)) useResource(machinery_data["cost"][blueprint], user) activate() - playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE) - new blueprint (A, FALSE, layers[current_layer]) + playsound(loc, 'sound/machines/click.ogg', 50, TRUE) + if(ispath(blueprint, /obj/machinery/duct)) + var/is_omni = current_color == DUCT_COLOR_OMNI + new blueprint(destination, FALSE, GLOB.pipe_paint_colors[current_color], GLOB.plumbing_layers[current_layer], null, is_omni) + else + new blueprint(destination, FALSE, GLOB.plumbing_layers[current_layer]) return TRUE -/obj/item/construction/plumbing/proc/canPlace(turf/T) - if(!isopenturf(T)) +/obj/item/construction/plumbing/proc/canPlace(turf/destination) + if(!isopenturf(destination)) return FALSE . = TRUE - for(var/obj/O in T.contents) - if(O.density) //let's not built ontop of dense stuff, like big machines and other obstacles, it kills my immershion + + var/obj/blueprint_template = blueprint + var/layer_id = GLOB.plumbing_layers[current_layer] + + for(var/obj/content_obj in destination.contents) + // Let's not built ontop of dense stuff, if this is also dense. + if(initial(blueprint_template.density) && content_obj.density) return FALSE -/obj/item/construction/plumbing/afterattack(atom/A, mob/user, proximity) + // Ducts can overlap other plumbing objects IF the layers are different + + // make sure plumbling isn't overlapping. + for(var/datum/component/plumbing/plumber as anything in content_obj.GetComponents(/datum/component/plumbing)) + if(plumber.ducting_layer & layer_id) + return FALSE + + if(istype(content_obj, /obj/machinery/duct)) + // Make sure ducts aren't overlapping. + var/obj/machinery/duct/duct_machine = content_obj + if(duct_machine.duct_layer & layer_id) + return FALSE + +/obj/item/construction/plumbing/afterattack(atom/target, mob/user, proximity) . = ..() if(!prox_check(proximity)) return - if(istype(A, /obj/machinery/plumbing)) - var/obj/machinery/plumbing/P = A - if(P.anchored) - to_chat(user, span_warning("The [P.name] needs to be unanchored!")) + if(istype(target, /obj/machinery/plumbing)) + var/obj/machinery/machine_target = target + if(machine_target.anchored) + to_chat(user, span_warning("The [target.name] needs to be unanchored!")) return - if(do_after(user, 20, target = P)) - P.deconstruct() //Let's not substract matter + if(do_after(user, 20, target = target)) + machine_target.deconstruct() //Let's not substract matter playsound(get_turf(src), 'sound/machines/click.ogg', 50, TRUE) //this is just such a great sound effect else - create_machine(A, user) + create_machine(target, user) /obj/item/construction/plumbing/AltClick(mob/user) - if(!istype(user) || !user.canUseTopic(src, BE_CLOSE)) + // give a menu to pick layers or colors + var/list/options_menu = list( + "Current Layer" = image('icons/hud/radial.dmi', icon_state = "plumbing_layer[GLOB.plumbing_layers[current_layer]]"), + "Current Color" = image('icons/hud/radial.dmi', icon_state = current_color), + ) + + playsound(loc, 'sound/effects/pop.ogg', 50, FALSE) + var/choice = show_radial_menu(user, src, options_menu, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE, tooltips = TRUE) + if(!check_menu(user)) return - //this is just cycling options through a list - var/current_loc = layers.Find(current_layer) + 1 + switch(choice) + if("Current Layer") + choose_layer_menu(user) + if("Current Color") + choose_color_menu(user) - if(current_loc > layers.len) - current_loc = 1 +/** + * Choose the current layer via radial menu. + * + * Arguments: + * * user - current user. + */ +/obj/item/construction/plumbing/proc/choose_layer_menu(mob/user) + if(!GLOB.plumbing_layer_menu_options.len) + for(var/layer_name in GLOB.plumbing_layers) + GLOB.plumbing_layer_menu_options += list((layer_name) = image('icons/hud/radial.dmi', icon_state = "plumbing_layer[GLOB.plumbing_layers[layer_name]]")) + + playsound(loc, 'sound/effects/pop.ogg', 50, FALSE) + var/new_layer = show_radial_menu(user, src, GLOB.plumbing_layer_menu_options, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE, tooltips = TRUE) + if(!new_layer || !check_menu(user)) + return + + current_layer = new_layer + to_chat(user, span_notice("You set the layer to [new_layer].")) + +/** + * Choose the current color via radial menu. + * + * Arguments: + * * user - current user. + */ +/obj/item/construction/plumbing/proc/choose_color_menu(mob/user) + if(!GLOB.plumbing_color_menu_options.len) + for(var/color_name in GLOB.pipe_paint_colors) + GLOB.plumbing_color_menu_options += list((color_name) = image('icons/hud/radial.dmi', icon_state = color_name)) + + playsound(loc, 'sound/effects/pop.ogg', 50, FALSE) + var/new_color = show_radial_menu(user, src, GLOB.plumbing_color_menu_options, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE, tooltips = TRUE) + if(!new_color || !check_menu(user)) + return - //We want the key (the define), not the index (the string) - current_layer = layers[current_loc] - to_chat(user, span_notice("You switch [src] to [current_layer].")) + current_color = new_color + to_chat(user, span_notice("You set the color to [new_color].")) + +/** + * Choose layer via mouse wheel, like an RPD + * + * Arguments: + * * source - the user + * * A - the atom being selected, unused. + * * delta_x - X scroll delta + * * delta_y - Y scroll delta + */ +/obj/item/construction/plumbing/proc/mouse_wheeled(mob/source, atom/A, delta_x, delta_y, params) + SIGNAL_HANDLER + if(source.incapacitated(IGNORE_RESTRAINTS|IGNORE_STASIS)) + return + if(delta_y == 0) + return + + if(delta_y < 0) + var/current_loc = GLOB.plumbing_layers.Find(current_layer) + 1 + if(current_loc > GLOB.plumbing_layers.len) + current_loc = 1 + current_layer = GLOB.plumbing_layers[current_loc] + else + var/current_loc = GLOB.plumbing_layers.Find(current_layer) - 1 + if(current_loc < 1) + current_loc = GLOB.plumbing_layers.len + current_layer = GLOB.plumbing_layers[current_loc] + to_chat(source, span_notice("You set the layer to [current_layer].")) /obj/item/construction/plumbing/research name = "research plumbing constructor" @@ -1219,17 +1340,18 @@ GLOBAL_VAR_INIT(icon_holographic_window, init_holographic_window()) /obj/item/construction/plumbing/research/set_plumbing_designs() plumbing_design_types = list( - /obj/machinery/plumbing/input = 5, - /obj/machinery/plumbing/output = 5, - /obj/machinery/plumbing/tank = 20, - /obj/machinery/plumbing/acclimator = 10, - /obj/machinery/plumbing/filter = 5, - /obj/machinery/plumbing/grinder_chemical = 30, - /obj/machinery/plumbing/reaction_chamber = 15, - /obj/machinery/plumbing/splitter = 5, - /obj/machinery/plumbing/disposer = 10, - /obj/machinery/plumbing/growing_vat = 20 -) + /obj/machinery/duct = 1, + /obj/machinery/plumbing/input = 5, + /obj/machinery/plumbing/output = 5, + /obj/machinery/plumbing/tank = 20, + /obj/machinery/plumbing/acclimator = 10, + /obj/machinery/plumbing/filter = 5, + /obj/machinery/plumbing/reaction_chamber = 15, + /obj/machinery/plumbing/grinder_chemical = 30, + /obj/machinery/plumbing/splitter = 5, + /obj/machinery/plumbing/disposer = 10, + /obj/machinery/plumbing/growing_vat = 20 + ) /obj/item/rcd_upgrade @@ -1258,6 +1380,9 @@ GLOBAL_VAR_INIT(icon_holographic_window, init_holographic_window()) name = "Destruction Scan" desc = "Scans the surrounding area for destruction. Scanned structures will rebuild significantly faster." +/datum/action/item_action/pick_color + name = "Choose A Color" + #undef GLOW_MODE #undef LIGHT_MODE #undef REMOVE_MODE diff --git a/code/game/objects/items/RCL.dm b/code/game/objects/items/RCL.dm index 63e6cf79bf4af3..b61150993035a8 100644 --- a/code/game/objects/items/RCL.dm +++ b/code/game/objects/items/RCL.dm @@ -342,3 +342,13 @@ icon_state = "rclg-1" inhand_icon_state = "rclg-1" return ..() + +/datum/action/item_action/rcl_col + name = "Change Cable Color" + icon_icon = 'icons/mob/actions/actions_items.dmi' + button_icon_state = "rcl_rainbow" + +/datum/action/item_action/rcl_gui + name = "Toggle Fast Wiring Gui" + icon_icon = 'icons/mob/actions/actions_items.dmi' + button_icon_state = "rcl_gui" diff --git a/code/game/objects/items/airlock_painter.dm b/code/game/objects/items/airlock_painter.dm index 98fc5dfb208a1b..8c942d8d07d166 100644 --- a/code/game/objects/items/airlock_painter.dm +++ b/code/game/objects/items/airlock_painter.dm @@ -56,10 +56,10 @@ //because you're expecting user input. /obj/item/airlock_painter/proc/can_use(mob/user) if(!ink) - to_chat(user, span_warning("There is no toner cartridge installed in [src]!")) + balloon_alert(user, "no cartridge!") return FALSE else if(ink.charges < 1) - to_chat(user, span_warning("[src] is out of ink!")) + balloon_alert(user, "out of ink!") return FALSE else return TRUE @@ -211,7 +211,7 @@ /obj/item/airlock_painter/decal/afterattack(atom/target, mob/user, proximity) . = ..() if(!proximity) - to_chat(user, span_notice("You need to get closer!")) + balloon_alert(user, "get closer!") return if(isfloorturf(target) && use_paint(user)) diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index b755c698742710..0e29bd43003232 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -1297,6 +1297,7 @@ chameleon_card_action.chameleon_type = /obj/item/card/id/advanced chameleon_card_action.chameleon_name = "ID Card" chameleon_card_action.initialize_disguises() + add_item_action(chameleon_card_action) /obj/item/card/id/advanced/chameleon/Destroy() theft_target = null @@ -1483,7 +1484,7 @@ if(popup_input == "Forge/Reset") if(!forged) var/input_name = tgui_input_text(user, "What name would you like to put on this card? Leave blank to randomise.", "Agent card name", registered_name ? registered_name : (ishuman(user) ? user.real_name : user.name), MAX_NAME_LEN) - input_name = sanitize_name(input_name) + input_name = sanitize_name(input_name, allow_numbers = TRUE) if(!input_name) // Invalid/blank names give a randomly generated one. if(user.gender == MALE) diff --git a/code/game/objects/items/chainsaw.dm b/code/game/objects/items/chainsaw.dm index aec9919518ffda..cfea8758bf465d 100644 --- a/code/game/objects/items/chainsaw.dm +++ b/code/game/objects/items/chainsaw.dm @@ -13,6 +13,7 @@ throwforce = 13 throw_speed = 2 throw_range = 4 + demolition_mod = 1.5 custom_materials = list(/datum/material/iron=13000) attack_verb_continuous = list("saws", "tears", "lacerates", "cuts", "chops", "dices") attack_verb_simple = list("saw", "tear", "lacerate", "cut", "chop", "dice") @@ -20,7 +21,7 @@ sharpness = SHARP_EDGED actions_types = list(/datum/action/item_action/startchainsaw) tool_behaviour = TOOL_SAW - toolspeed = 0.5 + toolspeed = 1.5 //Turn it on first you dork var/on = FALSE /obj/item/chainsaw/ComponentInitialize() @@ -54,6 +55,7 @@ else hitsound = SFX_SWING_HIT + toolspeed = on ? 0.5 : initial(toolspeed) //Turning it on halves the speed if(src == user.get_active_held_item()) //update inhands user.update_inv_hands() update_action_buttons() @@ -70,3 +72,6 @@ playsound(src, pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg'), 75, TRUE) return TRUE return FALSE + +/datum/action/item_action/startchainsaw + name = "Pull The Starting Cord" diff --git a/code/game/objects/items/chromosome.dm b/code/game/objects/items/chromosome.dm index 75646583d75d55..9e7dd7f3b0bd69 100644 --- a/code/game/objects/items/chromosome.dm +++ b/code/game/objects/items/chromosome.dm @@ -34,9 +34,13 @@ HM.power_coeff = power_coeff if(HM.energy_coeff != -1) HM.energy_coeff = energy_coeff - HM.can_chromosome = 2 + HM.can_chromosome = CHROMOSOME_USED HM.chromosome_name = name - HM.modify() + + // Do the actual modification + if(HM.modify()) + HM.modified = TRUE + qdel(src) /proc/generate_chromosome() diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm index c0eea35bc6513a..80946f6e0489d2 100644 --- a/code/game/objects/items/cigs_lighters.dm +++ b/code/game/objects/items/cigs_lighters.dm @@ -171,7 +171,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM reagents.add_reagent_list(list_reagents) if(starts_lit) light() - AddComponent(/datum/component/knockoff, 90, list(BODY_ZONE_PRECISE_MOUTH), list(ITEM_SLOT_MASK)) //90% to knock off when wearing a mask + AddComponent(/datum/component/knockoff, 90, list(BODY_ZONE_PRECISE_MOUTH), slot_flags) //90% to knock off when wearing a mask AddElement(/datum/element/update_icon_updates_onmob) icon_state = icon_off inhand_icon_state = inhand_icon_off @@ -1061,7 +1061,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM COOLDOWN_START(src, drag_cooldown, dragtime) if(obj_flags & EMAGGED) var/datum/effect_system/fluid_spread/smoke/chem/smoke_machine/puff = new - puff.set_up(4, location = loc, carry = reagents, efficiency = 24) + puff.set_up(4, holder = src, location = loc, carry = reagents, efficiency = 24) puff.start() if(prob(5)) //small chance for the vape to break and deal damage if it's emagged playsound(get_turf(src), 'sound/effects/pop_expl.ogg', 50, FALSE) @@ -1075,7 +1075,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM return else if(super) var/datum/effect_system/fluid_spread/smoke/chem/smoke_machine/puff = new - puff.set_up(1, location = loc, carry = reagents, efficiency = 24) + puff.set_up(1, holder = src, location = loc, carry = reagents, efficiency = 24) puff.start() handle_reagents() diff --git a/code/game/objects/items/circuitboards/circuitboard.dm b/code/game/objects/items/circuitboards/circuitboard.dm index fcc0b920a4d139..cdef67eb954fe9 100644 --- a/code/game/objects/items/circuitboards/circuitboard.dm +++ b/code/game/objects/items/circuitboards/circuitboard.dm @@ -5,6 +5,8 @@ /obj/item/circuitboard name = "circuit board" + /// extension that is applied after the initial name AKA (Computer/Machine Board) + var/name_extension = null icon = 'icons/obj/module.dmi' icon_state = "circuit_map" inhand_icon_state = "electronic" @@ -19,6 +21,8 @@ var/onstation = TRUE /obj/item/circuitboard/Initialize(mapload) + if(name_extension) + name = "[initial(name)] [name_extension]" set_greyscale(new_config = /datum/greyscale_config/circuit) return ..() @@ -62,6 +66,7 @@ micro-manipulator, console screen, beaker, Microlaser, matter bin, power cells. */ /obj/item/circuitboard/machine + name_extension = "(Machine Board)" var/needs_anchored = TRUE // Whether this machine must be anchored to be constructed. var/list/req_components // Components required by the machine. // Example: list(/obj/item/stock_parts/matter_bin = 5) diff --git a/code/game/objects/items/circuitboards/computer_circuitboards.dm b/code/game/objects/items/circuitboards/computer_circuitboards.dm index b5c42240abc613..5d0e364d400686 100644 --- a/code/game/objects/items/circuitboards/computer_circuitboards.dm +++ b/code/game/objects/items/circuitboards/computer_circuitboards.dm @@ -1,297 +1,301 @@ +/obj/item/circuitboard/computer + name = "Generic" + name_extension = "(Computer Board)" + //Command /obj/item/circuitboard/computer/aiupload - name = "AI Upload (Computer Board)" + name = "AI Upload" greyscale_colors = CIRCUIT_COLOR_COMMAND build_path = /obj/machinery/computer/upload/ai /obj/item/circuitboard/computer/borgupload - name = "Cyborg Upload (Computer Board)" + name = "Cyborg Upload" greyscale_colors = CIRCUIT_COLOR_COMMAND build_path = /obj/machinery/computer/upload/borg /obj/item/circuitboard/computer/bsa_control - name = "Bluespace Artillery Controls (Computer Board)" + name = "Bluespace Artillery Controls" build_path = /obj/machinery/computer/bsa_control /obj/item/circuitboard/computer/accounting - name = "Account Lookup Console (Computer Board)" + name = "Account Lookup Console" greyscale_colors = CIRCUIT_COLOR_COMMAND build_path = /obj/machinery/computer/accounting //Engineering /obj/item/circuitboard/computer/apc_control - name = "\improper Power Flow Control Console (Computer Board)" + name = "\improper Power Flow Control Console" greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/computer/apc_control /obj/item/circuitboard/computer/atmos_alert - name = "Atmospheric Alert (Computer Board)" + name = "Atmospheric Alert" greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/computer/atmos_alert /obj/item/circuitboard/computer/atmos_control - name = "Atmospheric Control (Computer Board)" + name = "Atmospheric Control" greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/computer/atmos_control /obj/item/circuitboard/computer/atmos_control/nocontrol - name = "Atmospheric Monitor (Computer Board)" + name = "Atmospheric Monitor" build_path = /obj/machinery/computer/atmos_control/nocontrol /obj/item/circuitboard/computer/atmos_control/noreconnect - name = "Atmospheric Control (Computer Board)" + name = "Atmospheric Control" build_path = /obj/machinery/computer/atmos_control/noreconnect /obj/item/circuitboard/computer/atmos_control/fixed - name = "Atmospheric Monitor (Computer Board)" + name = "Atmospheric Monitor" build_path = /obj/machinery/computer/atmos_control/fixed /obj/item/circuitboard/computer/atmos_control/nocontrol/master - name = "Station Atmospheric Monitor (Computer Board)" + name = "Station Atmospheric Monitor" build_path = /obj/machinery/computer/atmos_control/nocontrol/master /obj/item/circuitboard/computer/atmos_control/nocontrol/incinerator - name = "Incinerator Chamber Monitor (Computer Board)" + name = "Incinerator Chamber Monitor" build_path = /obj/machinery/computer/atmos_control/nocontrol/incinerator -/obj/item/circuitboard/computer/atmos_control/nocontrol/ordnancemix - name = "Ordnance Chamber Monitor (Computer Board)" - build_path = /obj/machinery/computer/atmos_control/nocontrol/ordnancemix +/obj/item/circuitboard/computer/atmos_control/ordnancemix + name = "Ordnance Chamber Control" + build_path = /obj/machinery/computer/atmos_control/ordnancemix /obj/item/circuitboard/computer/atmos_control/oxygen_tank - name = "Oxygen Supply Control (Computer Board)" + name = "Oxygen Supply Control" build_path = /obj/machinery/computer/atmos_control/oxygen_tank /obj/item/circuitboard/computer/atmos_control/plasma_tank - name = "Plasma Supply Control (Computer Board)" + name = "Plasma Supply Control" build_path = /obj/machinery/computer/atmos_control/plasma_tank /obj/item/circuitboard/computer/atmos_control/air_tank - name = "Mixed Air Supply Control (Computer Board)" + name = "Mixed Air Supply Control" build_path = /obj/machinery/computer/atmos_control/air_tank /obj/item/circuitboard/computer/atmos_control/mix_tank - name = "Gas Mix Supply Control (Computer Board)" + name = "Gas Mix Supply Control" build_path = /obj/machinery/computer/atmos_control/mix_tank /obj/item/circuitboard/computer/atmos_control/nitrous_tank - name = "Nitrous Oxide Supply Control (Computer Board)" + name = "Nitrous Oxide Supply Control" build_path = /obj/machinery/computer/atmos_control/nitrous_tank /obj/item/circuitboard/computer/atmos_control/nitrogen_tank - name = "Nitrogen Supply Control (Computer Board)" + name = "Nitrogen Supply Control" build_path = /obj/machinery/computer/atmos_control/nitrogen_tank /obj/item/circuitboard/computer/atmos_control/carbon_tank - name = "Carbon Dioxide Supply Control (Computer Board)" + name = "Carbon Dioxide Supply Control" build_path = /obj/machinery/computer/atmos_control/carbon_tank /obj/item/circuitboard/computer/atmos_control/bz_tank - name = "BZ Supply Control (Computer Board)" + name = "BZ Supply Control" build_path = /obj/machinery/computer/atmos_control/bz_tank /obj/item/circuitboard/computer/atmos_control/freon_tank - name = "Freon Supply Control (Computer Board)" + name = "Freon Supply Control" build_path = /obj/machinery/computer/atmos_control/freon_tank /obj/item/circuitboard/computer/atmos_control/halon_tank - name = "Halon Supply Control (Computer Board)" + name = "Halon Supply Control" build_path = /obj/machinery/computer/atmos_control/halon_tank /obj/item/circuitboard/computer/atmos_control/healium_tank - name = "Healium Supply Control (Computer Board)" + name = "Healium Supply Control" build_path = /obj/machinery/computer/atmos_control/healium_tank /obj/item/circuitboard/computer/atmos_control/hydrogen_tank - name = "Hydrogen Supply Control (Computer Board)" + name = "Hydrogen Supply Control" build_path = /obj/machinery/computer/atmos_control/hydrogen_tank /obj/item/circuitboard/computer/atmos_control/hypernoblium_tank - name = "Hypernoblium Supply Control (Computer Board)" + name = "Hypernoblium Supply Control" build_path = /obj/machinery/computer/atmos_control/hypernoblium_tank /obj/item/circuitboard/computer/atmos_control/miasma_tank - name = "Miasma Supply Control (Computer Board)" + name = "Miasma Supply Control" build_path = /obj/machinery/computer/atmos_control/miasma_tank /obj/item/circuitboard/computer/atmos_control/nitrium_tank - name = "Nitrium Supply Control (Computer Board)" + name = "Nitrium Supply Control" build_path = /obj/machinery/computer/atmos_control/nitrium_tank /obj/item/circuitboard/computer/atmos_control/pluoxium_tank - name = "Pluoxium Supply Control (Computer Board)" + name = "Pluoxium Supply Control" build_path = /obj/machinery/computer/atmos_control/pluoxium_tank /obj/item/circuitboard/computer/atmos_control/proto_nitrate_tank - name = "Proto-Nitrate Supply Control (Computer Board)" + name = "Proto-Nitrate Supply Control" build_path = /obj/machinery/computer/atmos_control/proto_nitrate_tank /obj/item/circuitboard/computer/atmos_control/tritium_tank - name = "Tritium Supply Control (Computer Board)" + name = "Tritium Supply Control" build_path = /obj/machinery/computer/atmos_control/tritium_tank /obj/item/circuitboard/computer/atmos_control/water_vapor - name = "Water Vapor Supply Control (Computer Board)" + name = "Water Vapor Supply Control" build_path = /obj/machinery/computer/atmos_control/water_vapor /obj/item/circuitboard/computer/atmos_control/zauker_tank - name = "Zauker Supply Control (Computer Board)" + name = "Zauker Supply Control" build_path = /obj/machinery/computer/atmos_control/zauker_tank /obj/item/circuitboard/computer/atmos_control/helium_tank - name = "Helium Supply Control (Computer Board)" + name = "Helium Supply Control" build_path = /obj/machinery/computer/atmos_control/helium_tank /obj/item/circuitboard/computer/atmos_control/antinoblium_tank - name = "Antinoblium Supply Control (Computer Board)" + name = "Antinoblium Supply Control" build_path = /obj/machinery/computer/atmos_control/antinoblium_tank /obj/item/circuitboard/computer/auxiliary_base - name = "Auxiliary Base Management Console (Computer Board)" + name = "Auxiliary Base Management Console" greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/computer/auxiliary_base /obj/item/circuitboard/computer/base_construction - name = "circuit board (Generic Base Construction Console)" + name = "Generic Base Construction Console" greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/computer/camera_advanced/base_construction /obj/item/circuitboard/computer/base_construction/aux - name = "circuit board (Aux Mining Base Construction Console)" + name = "Aux Mining Base Construction Console" greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/computer/camera_advanced/base_construction/aux /obj/item/circuitboard/computer/base_construction/centcom - name = "circuit board (Centcom Base Construction Console)" + name = "Centcom Base Construction Console" greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/computer/camera_advanced/base_construction/centcom /obj/item/circuitboard/computer/comm_monitor - name = "Telecommunications Monitor (Computer Board)" + name = "Telecommunications Monitor" greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/computer/telecomms/monitor /obj/item/circuitboard/computer/comm_server - name = "Telecommunications Server Monitor (Computer Board)" + name = "Telecommunications Server Monitor" greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/computer/telecomms/server /obj/item/circuitboard/computer/communications - name = "Communications (Computer Board)" + name = "Communications" greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/computer/communications /obj/item/circuitboard/computer/communications/syndicate - name = "Syndicate Communications (Computer Board)" + name = "Syndicate Communications" greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/computer/communications/syndicate /obj/item/circuitboard/computer/message_monitor - name = "Message Monitor (Computer Board)" + name = "Message Monitor" greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/computer/message_monitor /obj/item/circuitboard/computer/powermonitor - name = "Power Monitor (Computer Board)" //name fixed 250810 + name = "Power Monitor" //name fixed 250810 greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/computer/monitor /obj/item/circuitboard/computer/powermonitor/secret - name = "Outdated Power Monitor (Computer Board)" //Variant used on ruins to prevent them from showing up on PDA's. + name = "Outdated Power Monitor" //Variant used on ruins to prevent them from showing up on PDA's. greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/computer/monitor/secret /obj/item/circuitboard/computer/sat_control - name = "Satellite Network Control (Computer Board)" + name = "Satellite Network Control" greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/computer/sat_control /obj/item/circuitboard/computer/solar_control - name = "Solar Control (Computer Board)" //name fixed 250810 + name = "Solar Control" //name fixed 250810 greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/power/solar_control /obj/item/circuitboard/computer/stationalert - name = "Station Alerts (Computer Board)" + name = "Station Alerts" greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/computer/station_alert /obj/item/circuitboard/computer/turbine_computer - name = "Turbine Computer (Computer Board)" + name = "Turbine Computer" greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/computer/turbine_computer //Generic /obj/item/circuitboard/computer/arcade/amputation - name = "Mediborg's Amputation Adventure (Computer Board)" + name = "Mediborg's Amputation Adventure" greyscale_colors = CIRCUIT_COLOR_GENERIC build_path = /obj/machinery/computer/arcade/amputation /obj/item/circuitboard/computer/arcade/battle - name = "Arcade Battle (Computer Board)" + name = "Arcade Battle" greyscale_colors = CIRCUIT_COLOR_GENERIC build_path = /obj/machinery/computer/arcade/battle /obj/item/circuitboard/computer/arcade/orion_trail - name = "Orion Trail (Computer Board)" + name = "Orion Trail" greyscale_colors = CIRCUIT_COLOR_GENERIC build_path = /obj/machinery/computer/arcade/orion_trail /obj/item/circuitboard/computer/holodeck// Not going to let people get this, but it's just here for future - name = "Holodeck Control (Computer Board)" + name = "Holodeck Control" greyscale_colors = CIRCUIT_COLOR_GENERIC build_path = /obj/machinery/computer/holodeck /obj/item/circuitboard/computer/libraryconsole - name = "Library Visitor Console (Computer Board)" + name = "Library Visitor Console" build_path = /obj/machinery/computer/libraryconsole /obj/item/circuitboard/computer/libraryconsole/bookconsole - name = "Book Inventory Management Console (Machine Board)" + name = "Book Inventory Management Console" build_path = /obj/machinery/computer/libraryconsole/bookmanagement /obj/item/circuitboard/computer/libraryconsole/screwdriver_act(mob/living/user, obj/item/tool) if(build_path == /obj/machinery/computer/libraryconsole/bookmanagement) - name = "Library Visitor Console (Computer Board)" + name = "Library Visitor Console" build_path = /obj/machinery/computer/libraryconsole to_chat(user, span_notice("Defaulting access protocols.")) else - name = "Book Inventory Management Console (Computer Board)" + name = "Book Inventory Management Console" build_path = /obj/machinery/computer/libraryconsole/bookmanagement to_chat(user, span_notice("Access protocols successfully updated.")) return TRUE /obj/item/circuitboard/computer/monastery_shuttle - name = "Monastery Shuttle (Computer Board)" + name = "Monastery Shuttle" greyscale_colors = CIRCUIT_COLOR_GENERIC build_path = /obj/machinery/computer/shuttle/monastery_shuttle /obj/item/circuitboard/computer/olddoor - name = "DoorMex (Computer Board)" + name = "DoorMex" greyscale_colors = CIRCUIT_COLOR_GENERIC build_path = /obj/machinery/computer/pod/old /obj/item/circuitboard/computer/pod - name = "Massdriver control (Computer Board)" + name = "Massdriver control" greyscale_colors = CIRCUIT_COLOR_GENERIC build_path = /obj/machinery/computer/pod /obj/item/circuitboard/computer/slot_machine - name = "Slot Machine (Computer Board)" + name = "Slot Machine" greyscale_colors = CIRCUIT_COLOR_GENERIC build_path = /obj/machinery/computer/slot_machine /obj/item/circuitboard/computer/swfdoor - name = "Magix (Computer Board)" + name = "Magix" greyscale_colors = CIRCUIT_COLOR_GENERIC build_path = /obj/machinery/computer/pod/old/swf /obj/item/circuitboard/computer/syndicate_shuttle - name = "Syndicate Shuttle (Computer Board)" + name = "Syndicate Shuttle" greyscale_colors = CIRCUIT_COLOR_GENERIC build_path = /obj/machinery/computer/shuttle/syndicate var/challenge = FALSE @@ -306,177 +310,177 @@ return ..() /obj/item/circuitboard/computer/syndicatedoor - name = "ProComp Executive (Computer Board)" + name = "ProComp Executive" greyscale_colors = CIRCUIT_COLOR_GENERIC build_path = /obj/machinery/computer/pod/old/syndicate /obj/item/circuitboard/computer/white_ship - name = "White Ship (Computer Board)" + name = "White Ship" greyscale_colors = CIRCUIT_COLOR_GENERIC build_path = /obj/machinery/computer/shuttle/white_ship /obj/item/circuitboard/computer/white_ship/bridge - name = "White Ship Bridge (Computer Board)" + name = "White Ship Bridge" greyscale_colors = CIRCUIT_COLOR_GENERIC build_path = /obj/machinery/computer/shuttle/white_ship/bridge /obj/item/circuitboard/computer/white_ship/pod - name = "Salvage Pod (Computer Board)" + name = "Salvage Pod" build_path = /obj/machinery/computer/shuttle/white_ship/pod /obj/item/circuitboard/computer/white_ship/pod/recall - name = "Salvage Pod Recall (Computer Board)" + name = "Salvage Pod Recall" build_path = /obj/machinery/computer/shuttle/white_ship/pod/recall /obj/item/circuitboard/computer/bountypad - name = "Bounty Pad (Computer Board)" + name = "Bounty Pad" build_path = /obj/machinery/computer/piratepad_control/civilian /obj/item/circuitboard/computer/tram_controls - name = "Tram Controls (Computer Board)" + name = "Tram Controls" build_path = /obj/machinery/computer/tram_controls /obj/item/circuitboard/computer/terminal - name = "Terminal (Computer Board)" + name = "Terminal" build_path = /obj/machinery/computer/terminal //Medical /obj/item/circuitboard/computer/crew - name = "Crew Monitoring Console (Computer Board)" + name = "Crew Monitoring Console" greyscale_colors = CIRCUIT_COLOR_MEDICAL build_path = /obj/machinery/computer/crew /obj/item/circuitboard/computer/med_data - name = "Medical Records Console (Computer Board)" + name = "Medical Records Console" greyscale_colors = CIRCUIT_COLOR_MEDICAL build_path = /obj/machinery/computer/med_data /obj/item/circuitboard/computer/operating - name = "Operating Computer (Computer Board)" + name = "Operating Computer" greyscale_colors = CIRCUIT_COLOR_MEDICAL build_path = /obj/machinery/computer/operating /obj/item/circuitboard/computer/pandemic - name = "PanD.E.M.I.C. 2200 (Computer Board)" + name = "PanD.E.M.I.C. 2200" greyscale_colors = CIRCUIT_COLOR_MEDICAL build_path = /obj/machinery/computer/pandemic //Science /obj/item/circuitboard/computer/aifixer - name = "AI Integrity Restorer (Computer Board)" + name = "AI Integrity Restorer" greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/computer/aifixer /obj/item/circuitboard/computer/launchpad_console - name = "Launchpad Control Console (Computer Board)" + name = "Launchpad Control Console" greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/computer/launchpad /obj/item/circuitboard/computer/mech_bay_power_console - name = "Mech Bay Power Control Console (Computer Board)" + name = "Mech Bay Power Control Console" greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/computer/mech_bay_power_console /obj/item/circuitboard/computer/mecha_control - name = "Exosuit Control Console (Computer Board)" + name = "Exosuit Control Console" greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/computer/mecha /obj/item/circuitboard/computer/rdconsole - name = "R&D Console (Computer Board)" + name = "R&D Console" greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/computer/rdconsole /obj/item/circuitboard/computer/rdservercontrol - name = "R&D Server Control (Computer Board)" + name = "R&D Server Control" greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/computer/rdservercontrol /obj/item/circuitboard/computer/research - name = "Research Monitor (Computer Board)" + name = "Research Monitor" greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/computer/security/research /obj/item/circuitboard/computer/robotics - name = "Robotics Control (Computer Board)" + name = "Robotics Control" greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/computer/robotics /obj/item/circuitboard/computer/teleporter - name = "Teleporter (Computer Board)" + name = "Teleporter" greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/computer/teleporter /obj/item/circuitboard/computer/xenobiology - name = "Xenobiology Console (Computer Board)" + name = "Xenobiology Console" greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/computer/camera_advanced/xenobio /obj/item/circuitboard/computer/scan_consolenew - name = "DNA Console (Computer Board)" + name = "DNA Console" greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/computer/scan_consolenew /obj/item/circuitboard/computer/mechpad - name = "Mecha Orbital Pad Console (Computer Board)" + name = "Mecha Orbital Pad Console" greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/computer/mechpad //Security /obj/item/circuitboard/computer/labor_shuttle - name = "Labor Shuttle (Computer Board)" + name = "Labor Shuttle" greyscale_colors = CIRCUIT_COLOR_SECURITY build_path = /obj/machinery/computer/shuttle/labor /obj/item/circuitboard/computer/labor_shuttle/one_way - name = "Prisoner Shuttle Console (Computer Board)" + name = "Prisoner Shuttle Console" greyscale_colors = CIRCUIT_COLOR_SECURITY build_path = /obj/machinery/computer/shuttle/labor/one_way /obj/item/circuitboard/computer/gulag_teleporter_console - name = "Labor Camp teleporter console (Computer Board)" + name = "Labor Camp teleporter console" greyscale_colors = CIRCUIT_COLOR_SECURITY build_path = /obj/machinery/computer/prisoner/gulag_teleporter_computer /obj/item/circuitboard/computer/prisoner - name = "Prisoner Management Console (Computer Board)" + name = "Prisoner Management Console" greyscale_colors = CIRCUIT_COLOR_SECURITY build_path = /obj/machinery/computer/prisoner/management /obj/item/circuitboard/computer/secure_data - name = "Security Records Console (Computer Board)" + name = "Security Records Console" greyscale_colors = CIRCUIT_COLOR_SECURITY build_path = /obj/machinery/computer/secure_data /obj/item/circuitboard/computer/warrant - name = "Security Warrant Viewer (Computer Board)" + name = "Security Warrant Viewer" greyscale_colors = CIRCUIT_COLOR_SECURITY build_path = /obj/machinery/computer/warrant /obj/item/circuitboard/computer/security - name = "Security Cameras (Computer Board)" + name = "Security Cameras" greyscale_colors = CIRCUIT_COLOR_SECURITY build_path = /obj/machinery/computer/security /obj/item/circuitboard/computer/advanced_camera - name = "Advanced Camera Console (Computer Board)" + name = "Advanced Camera Console" greyscale_colors = CIRCUIT_COLOR_SECURITY build_path = /obj/machinery/computer/camera_advanced/syndie //Service /obj/item/circuitboard/computer/chef_order - name = "Produce Orders Console (Computer Board)" + name = "Produce Orders Console" greyscale_colors = CIRCUIT_COLOR_SUPPLY build_path = /obj/machinery/computer/chef_order //Supply /obj/item/circuitboard/computer/cargo - name = "Supply Console (Computer Board)" + name = "Supply Console" greyscale_colors = CIRCUIT_COLOR_SUPPLY build_path = /obj/machinery/computer/cargo var/contraband = FALSE @@ -506,7 +510,7 @@ machine.obj_flags &= ~EMAGGED /obj/item/circuitboard/computer/cargo/express - name = "Express Supply Console (Computer Board)" + name = "Express Supply Console" build_path = /obj/machinery/computer/cargo/express /obj/item/circuitboard/computer/cargo/express/emag_act(mob/living/user) @@ -525,62 +529,62 @@ obj_flags &= ~EMAGGED /obj/item/circuitboard/computer/cargo/request - name = "Supply Request Console (Computer Board)" + name = "Supply Request Console" build_path = /obj/machinery/computer/cargo/request /obj/item/circuitboard/computer/ferry - name = "Transport Ferry (Computer Board)" + name = "Transport Ferry" greyscale_colors = CIRCUIT_COLOR_SUPPLY build_path = /obj/machinery/computer/shuttle/ferry /obj/item/circuitboard/computer/ferry/request - name = "Transport Ferry Console (Computer Board)" + name = "Transport Ferry Console" greyscale_colors = CIRCUIT_COLOR_SUPPLY build_path = /obj/machinery/computer/shuttle/ferry/request /obj/item/circuitboard/computer/mining - name = "Outpost Status Display (Computer Board)" + name = "Outpost Status Display" greyscale_colors = CIRCUIT_COLOR_SUPPLY build_path = /obj/machinery/computer/security/mining /obj/item/circuitboard/computer/mining_shuttle - name = "Mining Shuttle (Computer Board)" + name = "Mining Shuttle" greyscale_colors = CIRCUIT_COLOR_SUPPLY build_path = /obj/machinery/computer/shuttle/mining /obj/item/circuitboard/computer/mining_shuttle/common - name = "Lavaland Shuttle (Computer Board)" + name = "Lavaland Shuttle" build_path = /obj/machinery/computer/shuttle/mining/common /obj/item/circuitboard/computer/exoscanner_console - name = "Scanner Array Control Console (Computer Board)" + name = "Scanner Array Control Console" build_path = /obj/machinery/computer/exoscanner_control /obj/item/circuitboard/computer/exodrone_console - name = "Exploration Drone Control Console (Computer Board)" + name = "Exploration Drone Control Console" build_path = /obj/machinery/computer/exodrone_control_console /obj/item/circuitboard/computer/service_orders - name = "Service Order (Computer Board)" + name = "Service Order" greyscale_colors = CIRCUIT_COLOR_SUPPLY build_path = /obj/machinery/computer/department_orders/service /obj/item/circuitboard/computer/engineering_orders - name = "Engineering Order (Computer Board)" + name = "Engineering Order" greyscale_colors = CIRCUIT_COLOR_SUPPLY build_path = /obj/machinery/computer/department_orders/engineering /obj/item/circuitboard/computer/science_orders - name = "Science Order (Computer Board)" + name = "Science Order" greyscale_colors = CIRCUIT_COLOR_SUPPLY build_path = /obj/machinery/computer/department_orders/science /obj/item/circuitboard/computer/security_orders - name = "Security Order (Computer Board)" + name = "Security Order" greyscale_colors = CIRCUIT_COLOR_SUPPLY build_path = /obj/machinery/computer/department_orders/security /obj/item/circuitboard/computer/medical_orders - name = "Medical Order (Computer Board)" + name = "Medical Order" greyscale_colors = CIRCUIT_COLOR_SUPPLY build_path = /obj/machinery/computer/department_orders/medical diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm index ff2e72b6b2abfd..3ebd39de35f7f6 100644 --- a/code/game/objects/items/circuitboards/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm @@ -1,7 +1,7 @@ //Command /obj/item/circuitboard/machine/bsa/back - name = "Bluespace Artillery Generator (Machine Board)" + name = "Bluespace Artillery Generator" greyscale_colors = CIRCUIT_COLOR_COMMAND build_path = /obj/machinery/bsa/back //No freebies! req_components = list( @@ -9,7 +9,7 @@ /obj/item/stack/cable_coil = 2) /obj/item/circuitboard/machine/bsa/front - name = "Bluespace Artillery Bore (Machine Board)" + name = "Bluespace Artillery Bore" greyscale_colors = CIRCUIT_COLOR_COMMAND build_path = /obj/machinery/bsa/front req_components = list( @@ -17,7 +17,7 @@ /obj/item/stack/cable_coil = 2) /obj/item/circuitboard/machine/bsa/middle - name = "Bluespace Artillery Fusor (Machine Board)" + name = "Bluespace Artillery Fusor" greyscale_colors = CIRCUIT_COLOR_COMMAND build_path = /obj/machinery/bsa/middle req_components = list( @@ -25,7 +25,7 @@ /obj/item/stack/cable_coil = 2) /obj/item/circuitboard/machine/dna_vault - name = "DNA Vault (Machine Board)" + name = "DNA Vault" greyscale_colors = CIRCUIT_COLOR_COMMAND build_path = /obj/machinery/dna_vault //No freebies! req_components = list( @@ -36,7 +36,7 @@ //Engineering /obj/item/circuitboard/machine/announcement_system - name = "Announcement System (Machine Board)" + name = "Announcement System" greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/announcement_system req_components = list( @@ -44,7 +44,7 @@ /obj/item/stack/sheet/glass = 1) /obj/item/circuitboard/machine/autolathe - name = "Autolathe (Machine Board)" + name = "Autolathe" greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/autolathe req_components = list( @@ -53,7 +53,7 @@ /obj/item/stack/sheet/glass = 1) /obj/item/circuitboard/machine/grounding_rod - name = "Grounding Rod (Machine Board)" + name = "Grounding Rod" greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/power/energy_accumulator/grounding_rod req_components = list(/obj/item/stock_parts/capacitor = 1) @@ -61,7 +61,7 @@ /obj/item/circuitboard/machine/telecomms/broadcaster - name = "Subspace Broadcaster (Machine Board)" + name = "Subspace Broadcaster" greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/telecomms/broadcaster req_components = list( @@ -72,7 +72,7 @@ /obj/item/stock_parts/micro_laser = 2) /obj/item/circuitboard/machine/telecomms/bus - name = "Bus Mainframe (Machine Board)" + name = "Bus Mainframe" greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/telecomms/bus req_components = list( @@ -81,7 +81,7 @@ /obj/item/stock_parts/subspace/filter = 1) /obj/item/circuitboard/machine/telecomms/hub - name = "Hub Mainframe (Machine Board)" + name = "Hub Mainframe" greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/telecomms/hub req_components = list( @@ -90,7 +90,7 @@ /obj/item/stock_parts/subspace/filter = 2) /obj/item/circuitboard/machine/telecomms/message_server - name = "Messaging Server (Machine Board)" + name = "Messaging Server" greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/telecomms/message_server req_components = list( @@ -99,7 +99,7 @@ /obj/item/stock_parts/subspace/filter = 3) /obj/item/circuitboard/machine/telecomms/processor - name = "Processor Unit (Machine Board)" + name = "Processor Unit" greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/telecomms/processor req_components = list( @@ -111,7 +111,7 @@ /obj/item/stock_parts/subspace/amplifier = 1) /obj/item/circuitboard/machine/telecomms/receiver - name = "Subspace Receiver (Machine Board)" + name = "Subspace Receiver" greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/telecomms/receiver req_components = list( @@ -121,7 +121,7 @@ /obj/item/stock_parts/micro_laser = 1) /obj/item/circuitboard/machine/telecomms/relay - name = "Relay Mainframe (Machine Board)" + name = "Relay Mainframe" greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/telecomms/relay req_components = list( @@ -130,7 +130,7 @@ /obj/item/stock_parts/subspace/filter = 2) /obj/item/circuitboard/machine/telecomms/server - name = "Telecommunication Server (Machine Board)" + name = "Telecommunication Server" greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/telecomms/server req_components = list( @@ -139,7 +139,7 @@ /obj/item/stock_parts/subspace/filter = 1) /obj/item/circuitboard/machine/tesla_coil - name = "Tesla Controller (Machine Board)" + name = "Tesla Controller" greyscale_colors = CIRCUIT_COLOR_ENGINEERING desc = "Does not let you shoot lightning from your hands." build_path = /obj/machinery/power/energy_accumulator/tesla_coil @@ -147,20 +147,20 @@ needs_anchored = FALSE /obj/item/circuitboard/machine/cell_charger - name = "Cell Charger (Machine Board)" + name = "Cell Charger" greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/cell_charger req_components = list(/obj/item/stock_parts/capacitor = 1) needs_anchored = FALSE /obj/item/circuitboard/machine/circulator - name = "Circulator/Heat Exchanger (Machine Board)" + name = "Circulator/Heat Exchanger" greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/atmospherics/components/binary/circulator req_components = list() /obj/item/circuitboard/machine/emitter - name = "Emitter (Machine Board)" + name = "Emitter" greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/power/emitter req_components = list( @@ -169,13 +169,13 @@ needs_anchored = FALSE /obj/item/circuitboard/machine/generator - name = "Thermo-Electric Generator (Machine Board)" + name = "Thermo-Electric Generator" greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/power/generator req_components = list() /obj/item/circuitboard/machine/ntnet_relay - name = "NTNet Relay (Machine Board)" + name = "NTNet Relay" greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/ntnet_relay req_components = list( @@ -183,7 +183,7 @@ /obj/item/stock_parts/subspace/filter = 1) /obj/item/circuitboard/machine/pacman - name = "PACMAN-type Generator (Machine Board)" + name = "PACMAN-type Generator" greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/power/port_gen/pacman req_components = list( @@ -205,7 +205,7 @@ to_chat(user, span_notice("You set the board for [message]")) /obj/item/circuitboard/machine/turbine_compressor - name = "Turbine - Inlet Compressor (Machine Board)" + name = "Turbine - Inlet Compressor" greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/power/turbine/inlet_compressor/constructed req_components = list( @@ -213,7 +213,7 @@ /obj/item/stack/sheet/iron = 5) /obj/item/circuitboard/machine/turbine_rotor - name = "Turbine - Core Rotor (Machine Board)" + name = "Turbine - Core Rotor" greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/power/turbine/core_rotor/constructed req_components = list( @@ -221,7 +221,7 @@ /obj/item/stack/sheet/iron = 5) /obj/item/circuitboard/machine/turbine_stator - name = "Turbine - Turbine Outlet (Machine Board)" + name = "Turbine - Turbine Outlet" greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/power/turbine/turbine_outlet/constructed req_components = list( @@ -229,7 +229,7 @@ /obj/item/stack/sheet/iron = 5) /obj/item/circuitboard/machine/protolathe/department/engineering - name = "Departmental Protolathe - Engineering (Machine Board)" + name = "Departmental Protolathe - Engineering" greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/rnd/production/protolathe/department/engineering @@ -237,7 +237,7 @@ build_path = /obj/machinery/rnd/production/protolathe/department/engineering/no_tax /obj/item/circuitboard/machine/rtg - name = "RTG (Machine Board)" + name = "RTG" greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/power/rtg req_components = list( @@ -246,7 +246,7 @@ /obj/item/stack/sheet/mineral/uranium = 10) // We have no Pu-238, and this is the closest thing to it. /obj/item/circuitboard/machine/rtg/advanced - name = "Advanced RTG (Machine Board)" + name = "Advanced RTG" build_path = /obj/machinery/power/rtg/advanced req_components = list( /obj/item/stack/cable_coil = 5, @@ -256,14 +256,14 @@ /obj/item/stack/sheet/mineral/plasma = 5) /obj/item/circuitboard/machine/scanner_gate - name = "Scanner Gate (Machine Board)" + name = "Scanner Gate" greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/scanner_gate req_components = list( /obj/item/stock_parts/scanning_module = 3) /obj/item/circuitboard/machine/smes - name = "SMES (Machine Board)" + name = "SMES" greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/power/smes req_components = list( @@ -273,12 +273,12 @@ def_components = list(/obj/item/stock_parts/cell = /obj/item/stock_parts/cell/high/empty) /obj/item/circuitboard/machine/techfab/department/engineering - name = "\improper Departmental Techfab - Engineering (Machine Board)" + name = "\improper Departmental Techfab - Engineering" greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/rnd/production/techfab/department/engineering /obj/item/circuitboard/machine/thermomachine - name = "Thermomachine (Machine Board)" + name = "Thermomachine" greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/atmospherics/components/unary/thermomachine/freezer var/pipe_layer = PIPING_LAYER_DEFAULT @@ -298,28 +298,28 @@ . += span_notice("It is set to layer [pipe_layer].") /obj/item/circuitboard/machine/HFR_fuel_input - name = "HFR Fuel Input (Machine Board)" + name = "HFR Fuel Input" greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/atmospherics/components/unary/hypertorus/fuel_input req_components = list( /obj/item/stack/sheet/plasteel = 5) /obj/item/circuitboard/machine/HFR_waste_output - name = "HFR Waste Output (Machine Board)" + name = "HFR Waste Output" greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/atmospherics/components/unary/hypertorus/waste_output req_components = list( /obj/item/stack/sheet/plasteel = 5) /obj/item/circuitboard/machine/HFR_moderator_input - name = "HFR Moderator Input (Machine Board)" + name = "HFR Moderator Input" greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/atmospherics/components/unary/hypertorus/moderator_input req_components = list( /obj/item/stack/sheet/plasteel = 5) /obj/item/circuitboard/machine/HFR_core - name = "HFR core (Machine Board)" + name = "HFR core" greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/atmospherics/components/unary/hypertorus/core req_components = list( @@ -328,14 +328,14 @@ /obj/item/stack/sheet/plasteel = 10) /obj/item/circuitboard/machine/HFR_corner - name = "HFR Corner (Machine Board)" + name = "HFR Corner" greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/hypertorus/corner req_components = list( /obj/item/stack/sheet/plasteel = 5) /obj/item/circuitboard/machine/HFR_interface - name = "HFR Interface (Machine Board)" + name = "HFR Interface" greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/hypertorus/interface req_components = list( @@ -344,7 +344,7 @@ /obj/item/stack/sheet/plasteel = 5) /obj/item/circuitboard/machine/crystallizer - name = "Crystallizer (Machine Board)" + name = "Crystallizer" greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/atmospherics/components/binary/crystallizer req_components = list( @@ -353,7 +353,7 @@ /obj/item/stack/sheet/plasteel = 5) /obj/item/circuitboard/machine/bluespace_sender - name = "Bluespace Sender (Machine Board)" + name = "Bluespace Sender" greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/atmospherics/components/unary/bluespace_sender req_components = list( @@ -364,7 +364,7 @@ //Generic /obj/item/circuitboard/machine/circuit_imprinter - name = "Circuit Imprinter (Machine Board)" + name = "Circuit Imprinter" greyscale_colors = CIRCUIT_COLOR_GENERIC build_path = /obj/machinery/rnd/production/circuit_imprinter req_components = list( @@ -373,16 +373,16 @@ /obj/item/reagent_containers/glass/beaker = 2) /obj/item/circuitboard/machine/circuit_imprinter/offstation - name = "Ancient Circuit Imprinter (Machine Board)" + name = "Ancient Circuit Imprinter" build_path = /obj/machinery/rnd/production/circuit_imprinter/offstation /obj/item/circuitboard/machine/circuit_imprinter/department - name = "Departmental Circuit Imprinter (Machine Board)" + name = "Departmental Circuit Imprinter" greyscale_colors = CIRCUIT_COLOR_GENERIC build_path = /obj/machinery/rnd/production/circuit_imprinter/department /obj/item/circuitboard/machine/holopad - name = "AI Holopad (Machine Board)" + name = "AI Holopad" greyscale_colors = CIRCUIT_COLOR_GENERIC build_path = /obj/machinery/holopad req_components = list(/obj/item/stock_parts/capacitor = 1) @@ -406,7 +406,7 @@ . += "There is a red light flashing next to the word \"secure\"" /obj/item/circuitboard/machine/launchpad - name = "Bluespace Launchpad (Machine Board)" + name = "Bluespace Launchpad" greyscale_colors = CIRCUIT_COLOR_GENERIC build_path = /obj/machinery/launchpad req_components = list( @@ -415,7 +415,7 @@ def_components = list(/obj/item/stack/ore/bluespace_crystal = /obj/item/stack/ore/bluespace_crystal/artificial) /obj/item/circuitboard/machine/protolathe - name = "Protolathe (Machine Board)" + name = "Protolathe" greyscale_colors = CIRCUIT_COLOR_GENERIC build_path = /obj/machinery/rnd/production/protolathe req_components = list( @@ -424,16 +424,16 @@ /obj/item/reagent_containers/glass/beaker = 2) /obj/item/circuitboard/machine/protolathe/offstation - name = "Ancient Protolathe (Machine Board)" + name = "Ancient Protolathe" build_path = /obj/machinery/rnd/production/protolathe/offstation /obj/item/circuitboard/machine/protolathe/department - name = "Departmental Protolathe (Machine Board)" + name = "Departmental Protolathe" greyscale_colors = CIRCUIT_COLOR_GENERIC build_path = /obj/machinery/rnd/production/protolathe/department /obj/item/circuitboard/machine/reagentgrinder - name = "All-In-One Grinder (Machine Board)" + name = "All-In-One Grinder" greyscale_colors = CIRCUIT_COLOR_GENERIC build_path = /obj/machinery/reagentgrinder/constructed req_components = list( @@ -441,7 +441,7 @@ needs_anchored = FALSE /obj/item/circuitboard/machine/smartfridge - name = "Smartfridge (Machine Board)" + name = "Smartfridge" build_path = /obj/machinery/smartfridge req_components = list(/obj/item/stock_parts/matter_bin = 1) var/static/list/fridges_name_paths = list(/obj/machinery/smartfridge = "plant produce", @@ -458,7 +458,7 @@ /obj/item/circuitboard/machine/smartfridge/apply_default_parts(obj/machinery/smartfridge/smartfridge) build_path = smartfridge.base_build_path if(!fridges_name_paths.Find(build_path, fridges_name_paths)) - name = "[initial(smartfridge.name)] (Machine Board)" //if it's a unique type, give it a unique name. + name = "[initial(smartfridge.name)]" //if it's a unique type, give it a unique name. is_special_type = TRUE return ..() @@ -479,7 +479,7 @@ /obj/item/circuitboard/machine/space_heater - name = "Space Heater (Machine Board)" + name = "Space Heater" greyscale_colors = CIRCUIT_COLOR_GENERIC build_path = /obj/machinery/space_heater/constructed req_components = list( @@ -489,7 +489,7 @@ needs_anchored = FALSE /obj/item/circuitboard/machine/electrolyzer - name = "Electrolyzer (Machine Board)" + name = "Electrolyzer" greyscale_colors = CIRCUIT_COLOR_GENERIC build_path = /obj/machinery/electrolyzer req_components = list( @@ -502,7 +502,7 @@ /obj/item/circuitboard/machine/techfab - name = "\improper Techfab (Machine Board)" + name = "\improper Techfab" greyscale_colors = CIRCUIT_COLOR_GENERIC build_path = /obj/machinery/rnd/production/techfab req_components = list( @@ -511,11 +511,11 @@ /obj/item/reagent_containers/glass/beaker = 2) /obj/item/circuitboard/machine/techfab/department - name = "\improper Departmental Techfab (Machine Board)" + name = "\improper Departmental Techfab" build_path = /obj/machinery/rnd/production/techfab/department /obj/item/circuitboard/machine/vendor - name = "Custom Vendor (Machine Board)" + name = "Custom Vendor" desc = "You can turn the \"brand selection\" dial using a screwdriver." custom_premium_price = PAYCHECK_CREW * 1.5 build_path = /obj/machinery/vending/custom @@ -582,7 +582,7 @@ /obj/item/circuitboard/machine/vendor/proc/set_type(obj/machinery/vending/typepath) build_path = typepath - name = "[vending_names_paths[build_path]] Vendor (Machine Board)" + name = "[vending_names_paths[build_path]] Vendor" req_components = list(initial(typepath.refill_canister) = 1) /obj/item/circuitboard/machine/vendor/apply_default_parts(obj/machinery/machine) @@ -593,21 +593,21 @@ return ..() /obj/item/circuitboard/machine/vending/donksofttoyvendor - name = "Donksoft Toy Vendor (Machine Board)" + name = "Donksoft Toy Vendor" build_path = /obj/machinery/vending/donksofttoyvendor req_components = list( /obj/item/stack/sheet/glass = 1, /obj/item/vending_refill/donksoft = 1) /obj/item/circuitboard/machine/vending/syndicatedonksofttoyvendor - name = "Syndicate Donksoft Toy Vendor (Machine Board)" + name = "Syndicate Donksoft Toy Vendor" build_path = /obj/machinery/vending/toyliberationstation req_components = list( /obj/item/stack/sheet/glass = 1, /obj/item/vending_refill/donksoft = 1) /obj/item/circuitboard/machine/bountypad - name = "Civilian Bounty Pad (Machine Board)" + name = "Civilian Bounty Pad" greyscale_colors = CIRCUIT_COLOR_GENERIC build_path = /obj/machinery/piratepad/civilian req_components = list( @@ -619,7 +619,7 @@ //Medical /obj/item/circuitboard/machine/chem_dispenser - name = "Chem Dispenser (Machine Board)" + name = "Chem Dispenser" greyscale_colors = CIRCUIT_COLOR_MEDICAL build_path = /obj/machinery/chem_dispenser req_components = list( @@ -652,7 +652,8 @@ ) /obj/item/circuitboard/machine/chem_dispenser/abductor - name = "Reagent Synthesizer (Abductor Machine Board)" + name = "Reagent Synthesizer" + name_extension = "(Abductor Machine Board)" icon_state = "abductor_mod" build_path = /obj/machinery/chem_dispenser/abductor req_components = list( @@ -665,7 +666,7 @@ needs_anchored = FALSE /obj/item/circuitboard/machine/chem_heater - name = "Chemical Heater (Machine Board)" + name = "Chemical Heater" greyscale_colors = CIRCUIT_COLOR_MEDICAL build_path = /obj/machinery/chem_heater req_components = list( @@ -673,7 +674,7 @@ /obj/item/stack/sheet/glass = 1) /obj/item/circuitboard/machine/chem_mass_spec - name = "High-Performance Liquid Chromatography (Machine Board)" + name = "High-Performance Liquid Chromatography" greyscale_colors = CIRCUIT_COLOR_MEDICAL build_path = /obj/machinery/chem_mass_spec req_components = list( @@ -681,7 +682,7 @@ /obj/item/stack/cable_coil = 5) /obj/item/circuitboard/machine/chem_master - name = "ChemMaster 3000 (Machine Board)" + name = "ChemMaster 3000" greyscale_colors = CIRCUIT_COLOR_MEDICAL build_path = /obj/machinery/chem_master desc = "You can turn the \"mode selection\" dial using a screwdriver." @@ -700,12 +701,12 @@ new_path = /obj/machinery/chem_master/condimaster build_path = new_path - name = "[new_name] 3000 (Machine Board)" + name = "[new_name] 3000" to_chat(user, span_notice("You change the circuit board setting to \"[new_name]\".")) return TRUE /obj/item/circuitboard/machine/cryo_tube - name = "Cryotube (Machine Board)" + name = "Cryotube" greyscale_colors = CIRCUIT_COLOR_MEDICAL build_path = /obj/machinery/atmospherics/components/unary/cryo_cell req_components = list( @@ -714,20 +715,20 @@ /obj/item/stack/sheet/glass = 4) /obj/item/circuitboard/machine/fat_sucker - name = "Lipid Extractor (Machine Board)" + name = "Lipid Extractor" greyscale_colors = CIRCUIT_COLOR_MEDICAL build_path = /obj/machinery/fat_sucker req_components = list(/obj/item/stock_parts/micro_laser = 1, /obj/item/kitchen/fork = 1) /obj/item/circuitboard/machine/harvester - name = "Harvester (Machine Board)" + name = "Harvester" greyscale_colors = CIRCUIT_COLOR_MEDICAL build_path = /obj/machinery/harvester req_components = list(/obj/item/stock_parts/micro_laser = 4) /obj/item/circuitboard/machine/medical_kiosk - name = "Medical Kiosk (Machine Board)" + name = "Medical Kiosk" greyscale_colors = CIRCUIT_COLOR_MEDICAL build_path = /obj/machinery/medical_kiosk var/custom_cost = 10 @@ -751,7 +752,7 @@ . += "The cost to use this kiosk is set to [custom_cost]." /obj/item/circuitboard/machine/limbgrower - name = "Limb Grower (Machine Board)" + name = "Limb Grower" greyscale_colors = CIRCUIT_COLOR_MEDICAL build_path = /obj/machinery/limbgrower req_components = list( @@ -760,7 +761,7 @@ /obj/item/stack/sheet/glass = 1) /obj/item/circuitboard/machine/limbgrower/fullupgrade - name = "Limb Grower (Machine Board)" + name = "Limb Grower" greyscale_colors = CIRCUIT_COLOR_MEDICAL build_path = /obj/machinery/limbgrower req_components = list( @@ -769,12 +770,12 @@ /obj/item/stack/sheet/glass = 1) /obj/item/circuitboard/machine/protolathe/department/medical - name = "Departmental Protolathe - Medical (Machine Board)" + name = "Departmental Protolathe - Medical" greyscale_colors = CIRCUIT_COLOR_MEDICAL build_path = /obj/machinery/rnd/production/protolathe/department/medical /obj/item/circuitboard/machine/sleeper - name = "Sleeper (Machine Board)" + name = "Sleeper" greyscale_colors = CIRCUIT_COLOR_MEDICAL build_path = /obj/machinery/sleeper req_components = list( @@ -784,7 +785,7 @@ /obj/item/stack/sheet/glass = 2) /obj/item/circuitboard/machine/sleeper/fullupgrade - name = "Sleeper (Machine Board)" + name = "Sleeper" icon_state = "medical" build_path = /obj/machinery/sleeper/syndie/fullupgrade req_components = list( @@ -794,11 +795,11 @@ /obj/item/stack/sheet/glass = 2) /obj/item/circuitboard/machine/sleeper/party - name = "Party Pod (Machine Board)" + name = "Party Pod" build_path = /obj/machinery/sleeper/party /obj/item/circuitboard/machine/smoke_machine - name = "Smoke Machine (Machine Board)" + name = "Smoke Machine" greyscale_colors = CIRCUIT_COLOR_MEDICAL build_path = /obj/machinery/smoke_machine req_components = list( @@ -810,7 +811,7 @@ needs_anchored = FALSE /obj/item/circuitboard/machine/stasis - name = "\improper Lifeform Stasis Unit (Machine Board)" + name = "\improper Lifeform Stasis Unit" greyscale_colors = CIRCUIT_COLOR_MEDICAL build_path = /obj/machinery/stasis req_components = list( @@ -819,26 +820,26 @@ /obj/item/stock_parts/capacitor = 1) /obj/item/circuitboard/machine/medipen_refiller - name = "Medipen Refiller (Machine Board)" + name = "Medipen Refiller" greyscale_colors = CIRCUIT_COLOR_MEDICAL build_path = /obj/machinery/medipen_refiller req_components = list( /obj/item/stock_parts/matter_bin = 1) /obj/item/circuitboard/machine/techfab/department/medical - name = "\improper Departmental Techfab - Medical (Machine Board)" + name = "\improper Departmental Techfab - Medical" greyscale_colors = CIRCUIT_COLOR_MEDICAL build_path = /obj/machinery/rnd/production/techfab/department/medical //Science /obj/item/circuitboard/machine/circuit_imprinter/department/science - name = "Departmental Circuit Imprinter - Science (Machine Board)" + name = "Departmental Circuit Imprinter - Science" greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/rnd/production/circuit_imprinter/department/science /obj/item/circuitboard/machine/cyborgrecharger - name = "Cyborg Recharger (Machine Board)" + name = "Cyborg Recharger" greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/recharge_station req_components = list( @@ -848,7 +849,7 @@ def_components = list(/obj/item/stock_parts/cell = /obj/item/stock_parts/cell/high) /obj/item/circuitboard/machine/destructive_analyzer - name = "Destructive Analyzer (Machine Board)" + name = "Destructive Analyzer" greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/rnd/destructive_analyzer req_components = list( @@ -857,7 +858,7 @@ /obj/item/stock_parts/micro_laser = 1) /obj/item/circuitboard/machine/experimentor - name = "E.X.P.E.R.I-MENTOR (Machine Board)" + name = "E.X.P.E.R.I-MENTOR" greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/rnd/experimentor req_components = list( @@ -866,7 +867,7 @@ /obj/item/stock_parts/micro_laser = 2) /obj/item/circuitboard/machine/mech_recharger - name = "Mechbay Recharger (Machine Board)" + name = "Mechbay Recharger" greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/mech_bay_recharge_port req_components = list( @@ -874,7 +875,7 @@ /obj/item/stock_parts/capacitor = 5) /obj/item/circuitboard/machine/mechfab - name = "Exosuit Fabricator (Machine Board)" + name = "Exosuit Fabricator" greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/mecha_part_fabricator req_components = list( @@ -884,7 +885,7 @@ /obj/item/stack/sheet/glass = 1) /obj/item/circuitboard/machine/monkey_recycler - name = "Monkey Recycler (Machine Board)" + name = "Monkey Recycler" greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/monkey_recycler req_components = list( @@ -893,17 +894,17 @@ needs_anchored = FALSE /obj/item/circuitboard/machine/processor/slime - name = "Slime Processor (Machine Board)" + name = "Slime Processor" greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/processor/slime /obj/item/circuitboard/machine/protolathe/department/science - name = "Departmental Protolathe - Science (Machine Board)" + name = "Departmental Protolathe - Science" greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/rnd/production/protolathe/department/science /obj/item/circuitboard/machine/quantumpad - name = "Quantum Pad (Machine Board)" + name = "Quantum Pad" greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/quantumpad req_components = list( @@ -914,7 +915,7 @@ def_components = list(/obj/item/stack/ore/bluespace_crystal = /obj/item/stack/ore/bluespace_crystal/artificial) /obj/item/circuitboard/machine/rdserver - name = "R&D Server (Machine Board)" + name = "R&D Server" greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/rnd/server req_components = list( @@ -922,12 +923,12 @@ /obj/item/stock_parts/scanning_module = 1) /obj/item/circuitboard/machine/techfab/department/science - name = "\improper Departmental Techfab - Science (Machine Board)" + name = "\improper Departmental Techfab - Science" greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/rnd/production/techfab/department/science /obj/item/circuitboard/machine/teleporter_hub - name = "Teleporter Hub (Machine Board)" + name = "Teleporter Hub" greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/teleport/hub req_components = list( @@ -936,7 +937,7 @@ def_components = list(/obj/item/stack/ore/bluespace_crystal = /obj/item/stack/ore/bluespace_crystal/artificial) /obj/item/circuitboard/machine/teleporter_station - name = "Teleporter Station (Machine Board)" + name = "Teleporter Station" greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/teleport/station req_components = list( @@ -946,7 +947,7 @@ def_components = list(/obj/item/stack/ore/bluespace_crystal = /obj/item/stack/ore/bluespace_crystal/artificial) /obj/item/circuitboard/machine/dnascanner - name = "DNA Scanner (Machine Board)" + name = "DNA Scanner" greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/dna_scannernew req_components = list( @@ -957,7 +958,7 @@ /obj/item/stack/cable_coil = 2) /obj/item/circuitboard/machine/mechpad - name = "Mecha Orbital Pad (Machine Board)" + name = "Mecha Orbital Pad" greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/mechpad req_components = list() @@ -965,26 +966,26 @@ //Security /obj/item/circuitboard/machine/protolathe/department/security - name = "Departmental Protolathe - Security (Machine Board)" + name = "Departmental Protolathe - Security" greyscale_colors = CIRCUIT_COLOR_SECURITY build_path = /obj/machinery/rnd/production/protolathe/department/security /obj/item/circuitboard/machine/recharger - name = "Weapon Recharger (Machine Board)" + name = "Weapon Recharger" greyscale_colors = CIRCUIT_COLOR_SECURITY build_path = /obj/machinery/recharger req_components = list(/obj/item/stock_parts/capacitor = 1) needs_anchored = FALSE /obj/item/circuitboard/machine/techfab/department/security - name = "\improper Departmental Techfab - Security (Machine Board)" + name = "\improper Departmental Techfab - Security" greyscale_colors = CIRCUIT_COLOR_SECURITY build_path = /obj/machinery/rnd/production/techfab/department/security //Service /obj/item/circuitboard/machine/biogenerator - name = "Biogenerator (Machine Board)" + name = "Biogenerator" greyscale_colors = CIRCUIT_COLOR_SERVICE build_path = /obj/machinery/biogenerator req_components = list( @@ -994,7 +995,7 @@ /obj/item/stack/sheet/glass = 1) /obj/item/circuitboard/machine/chem_dispenser/drinks - name = "Soda Dispenser (Machine Board)" + name = "Soda Dispenser" greyscale_colors = CIRCUIT_COLOR_SERVICE build_path = /obj/machinery/chem_dispenser/drinks @@ -1009,7 +1010,7 @@ ) /obj/item/circuitboard/machine/chem_dispenser/drinks/beer - name = "Booze Dispenser (Machine Board)" + name = "Booze Dispenser" greyscale_colors = CIRCUIT_COLOR_SERVICE build_path = /obj/machinery/chem_dispenser/drinks/beer @@ -1024,33 +1025,33 @@ ) /obj/item/circuitboard/machine/chem_master/condi - name = "CondiMaster 3000 (Machine Board)" + name = "CondiMaster 3000" greyscale_colors = CIRCUIT_COLOR_SERVICE build_path = /obj/machinery/chem_master/condimaster /obj/item/circuitboard/machine/deep_fryer - name = "circuit board (Deep Fryer)" + name = "Deep Fryer" greyscale_colors = CIRCUIT_COLOR_SERVICE build_path = /obj/machinery/deepfryer req_components = list(/obj/item/stock_parts/micro_laser = 1) needs_anchored = FALSE /obj/item/circuitboard/machine/griddle - name = "circuit board (Griddle)" + name = "Griddle" greyscale_colors = CIRCUIT_COLOR_SERVICE build_path = /obj/machinery/griddle req_components = list(/obj/item/stock_parts/micro_laser = 1) needs_anchored = FALSE /obj/item/circuitboard/machine/oven - name = "circuit board (Oven)" + name = "Oven" greyscale_colors = CIRCUIT_COLOR_SERVICE build_path = /obj/machinery/oven req_components = list(/obj/item/stock_parts/micro_laser = 1) needs_anchored = FALSE /obj/item/circuitboard/machine/dish_drive - name = "Dish Drive (Machine Board)" + name = "Dish Drive" greyscale_colors = CIRCUIT_COLOR_SERVICE build_path = /obj/machinery/dish_drive req_components = list( @@ -1077,7 +1078,7 @@ to_chat(user, span_notice("You [transmit ? "enable" : "disable"] the board's automatic disposal transmission.")) /obj/item/circuitboard/machine/gibber - name = "Gibber (Machine Board)" + name = "Gibber" greyscale_colors = CIRCUIT_COLOR_SERVICE build_path = /obj/machinery/gibber req_components = list( @@ -1086,7 +1087,7 @@ needs_anchored = FALSE /obj/item/circuitboard/machine/hydroponics - name = "Hydroponics Tray (Machine Board)" + name = "Hydroponics Tray" greyscale_colors = CIRCUIT_COLOR_SERVICE build_path = /obj/machinery/hydroponics/constructable req_components = list( @@ -1096,7 +1097,7 @@ needs_anchored = FALSE /obj/item/circuitboard/machine/microwave - name = "Microwave (Machine Board)" + name = "Microwave" greyscale_colors = CIRCUIT_COLOR_SERVICE build_path = /obj/machinery/microwave req_components = list( @@ -1107,7 +1108,7 @@ needs_anchored = FALSE /obj/item/circuitboard/machine/processor - name = "Food Processor (Machine Board)" + name = "Food Processor" greyscale_colors = CIRCUIT_COLOR_SERVICE build_path = /obj/machinery/processor req_components = list( @@ -1117,31 +1118,30 @@ /obj/item/circuitboard/machine/processor/screwdriver_act(mob/living/user, obj/item/tool) if(build_path == /obj/machinery/processor) - name = "Slime Processor (Machine Board)" + name = "Slime Processor" build_path = /obj/machinery/processor/slime to_chat(user, span_notice("Name protocols successfully updated.")) else - name = "Food Processor (Machine Board)" + name = "Food Processor" build_path = /obj/machinery/processor to_chat(user, span_notice("Defaulting name protocols.")) return TRUE /obj/item/circuitboard/machine/protolathe/department/service - name = "Departmental Protolathe - Service (Machine Board)" + name = "Departmental Protolathe - Service" greyscale_colors = CIRCUIT_COLOR_SERVICE build_path = /obj/machinery/rnd/production/protolathe/department/service /obj/item/circuitboard/machine/recycler - name = "Recycler (Machine Board)" + name = "Recycler" greyscale_colors = CIRCUIT_COLOR_SERVICE build_path = /obj/machinery/recycler req_components = list( - /obj/item/stock_parts/matter_bin = 1, /obj/item/stock_parts/manipulator = 1) needs_anchored = FALSE /obj/item/circuitboard/machine/seed_extractor - name = "Seed Extractor (Machine Board)" + name = "Seed Extractor" greyscale_colors = CIRCUIT_COLOR_SERVICE build_path = /obj/machinery/seed_extractor req_components = list( @@ -1150,12 +1150,12 @@ needs_anchored = FALSE /obj/item/circuitboard/machine/techfab/department/service - name = "\improper Departmental Techfab - Service (Machine Board)" + name = "\improper Departmental Techfab - Service" greyscale_colors = CIRCUIT_COLOR_SERVICE build_path = /obj/machinery/rnd/production/techfab/department/service /obj/item/circuitboard/machine/vendatray - name = "Vend-A-Tray (Machine Board)" + name = "Vend-A-Tray" greyscale_colors = CIRCUIT_COLOR_SERVICE build_path = /obj/structure/displaycase/forsale req_components = list( @@ -1164,7 +1164,7 @@ //Supply /obj/item/circuitboard/machine/mining_equipment_vendor - name = "Mining Equipment Vendor (Machine Board)" + name = "Mining Equipment Vendor" greyscale_colors = CIRCUIT_COLOR_SUPPLY build_path = /obj/machinery/mineral/equipment_vendor req_components = list( @@ -1172,11 +1172,11 @@ /obj/item/stock_parts/matter_bin = 3) /obj/item/circuitboard/machine/mining_equipment_vendor/golem - name = "Golem Ship Equipment Vendor (Machine Board)" + name = "Golem Ship Equipment Vendor" build_path = /obj/machinery/mineral/equipment_vendor/golem /obj/item/circuitboard/machine/ore_redemption - name = "Ore Redemption (Machine Board)" + name = "Ore Redemption" greyscale_colors = CIRCUIT_COLOR_SUPPLY build_path = /obj/machinery/mineral/ore_redemption req_components = list( @@ -1188,18 +1188,18 @@ needs_anchored = FALSE /obj/item/circuitboard/machine/ore_silo - name = "Ore Silo (Machine Board)" + name = "Ore Silo" greyscale_colors = CIRCUIT_COLOR_SUPPLY build_path = /obj/machinery/ore_silo req_components = list() /obj/item/circuitboard/machine/protolathe/department/cargo - name = "Departmental Protolathe - Cargo (Machine Board)" + name = "Departmental Protolathe - Cargo" greyscale_colors = CIRCUIT_COLOR_SUPPLY build_path = /obj/machinery/rnd/production/protolathe/department/cargo /obj/item/circuitboard/machine/stacking_machine - name = "Stacking Machine (Machine Board)" + name = "Stacking Machine" greyscale_colors = CIRCUIT_COLOR_SUPPLY build_path = /obj/machinery/mineral/stacking_machine req_components = list( @@ -1207,7 +1207,7 @@ /obj/item/stock_parts/matter_bin = 2) /obj/item/circuitboard/machine/stacking_unit_console - name = "Stacking Machine Console (Machine Board)" + name = "Stacking Machine Console" greyscale_colors = CIRCUIT_COLOR_SUPPLY build_path = /obj/machinery/mineral/stacking_unit_console req_components = list( @@ -1215,12 +1215,12 @@ /obj/item/stack/cable_coil = 5) /obj/item/circuitboard/machine/techfab/department/cargo - name = "\improper Departmental Techfab - Cargo (Machine Board)" + name = "\improper Departmental Techfab - Cargo" greyscale_colors = CIRCUIT_COLOR_SUPPLY build_path = /obj/machinery/rnd/production/techfab/department/cargo /obj/item/circuitboard/machine/bepis - name = "BEPIS Chamber (Machine Board)" + name = "BEPIS Chamber" greyscale_colors = CIRCUIT_COLOR_SUPPLY build_path = /obj/machinery/rnd/bepis req_components = list( @@ -1232,7 +1232,7 @@ //Misc /obj/item/circuitboard/machine/sheetifier - name = "Sheet-meister 2000 (Machine Board)" + name = "Sheet-meister 2000" greyscale_colors = CIRCUIT_COLOR_SUPPLY build_path = /obj/machinery/sheetifier req_components = list( @@ -1251,7 +1251,8 @@ icon_state = "abductor_mod" /obj/item/circuitboard/machine/abductor/core - name = "alien board (Void Core)" + name = "alien board" + name_extension = "(Void Core)" build_path = /obj/machinery/power/rtg/abductor req_components = list( /obj/item/stock_parts/capacitor = 1, @@ -1262,7 +1263,7 @@ /obj/item/stock_parts/micro_laser = /obj/item/stock_parts/micro_laser/quadultra) /obj/item/circuitboard/machine/hypnochair - name = "Enhanced Interrogation Chamber (Machine Board)" + name = "Enhanced Interrogation Chamber" greyscale_colors = CIRCUIT_COLOR_SECURITY build_path = /obj/machinery/hypnochair req_components = list( @@ -1271,7 +1272,7 @@ ) /obj/item/circuitboard/machine/plumbing_receiver - name = "Chemical Recipient (Machine Board)" + name = "Chemical Recipient" greyscale_colors = CIRCUIT_COLOR_MEDICAL build_path = /obj/machinery/plumbing/receiver req_components = list( @@ -1282,7 +1283,7 @@ needs_anchored = FALSE /obj/item/circuitboard/machine/skill_station - name = "Skill Station (Machine Board)" + name = "Skill Station" build_path = /obj/machinery/skill_station req_components = list( /obj/item/stock_parts/matter_bin = 2, @@ -1291,7 +1292,7 @@ ) /obj/item/circuitboard/machine/destructive_scanner - name = "Experimental Destructive Scanner (Machine Board)" + name = "Experimental Destructive Scanner" greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/destructive_scanner req_components = list( @@ -1300,7 +1301,7 @@ /obj/item/stock_parts/manipulator = 2) /obj/item/circuitboard/machine/doppler_array - name = "Tachyon-Doppler Research Array (Machine Board)" + name = "Tachyon-Doppler Research Array" greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/doppler_array req_components = list( @@ -1308,7 +1309,7 @@ /obj/item/stock_parts/scanning_module = 4) /obj/item/circuitboard/machine/exoscanner - name = "Exoscanner (Machine Board)" + name = "Exoscanner" greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/exoscanner req_components = list( @@ -1316,7 +1317,7 @@ /obj/item/stock_parts/scanning_module = 4) /obj/item/circuitboard/machine/exodrone_launcher - name = "Exploration Drone Launcher (Machine Board)" + name = "Exploration Drone Launcher" greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/exodrone_launcher req_components = list( @@ -1324,14 +1325,14 @@ /obj/item/stock_parts/scanning_module = 4) /obj/item/circuitboard/machine/ecto_sniffer - name = "Ectoscopic Sniffer (Machine Board)" + name = "Ectoscopic Sniffer" greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/ecto_sniffer req_components = list( /obj/item/stock_parts/scanning_module = 1) /obj/item/circuitboard/machine/anomaly_refinery - name = "Anomaly Refinery (Machine Board)" + name = "Anomaly Refinery" greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/research/anomaly_refinery req_components = list( @@ -1341,7 +1342,7 @@ ) /obj/item/circuitboard/machine/tank_compressor - name = "Tank Compressor (Machine Board)" + name = "Tank Compressor" greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/atmospherics/components/binary/tank_compressor req_components = list( diff --git a/code/game/objects/items/clown_items.dm b/code/game/objects/items/clown_items.dm index 2f4c45e21335b1..d504f2b4c34b9d 100644 --- a/code/game/objects/items/clown_items.dm +++ b/code/game/objects/items/clown_items.dm @@ -16,6 +16,7 @@ gender = PLURAL icon = 'icons/obj/items_and_weapons.dmi' icon_state = "soap" + worn_icon_state = "soap" lefthand_file = 'icons/mob/inhands/equipment/custodial_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/custodial_righthand.dmi' w_class = WEIGHT_CLASS_TINY @@ -55,12 +56,14 @@ desc = "A homemade bar of soap. Smells of... well...." grind_results = list(/datum/reagent/liquidgibs = 9, /datum/reagent/lye = 9) icon_state = "soapgibs" + worn_icon_state = "soapgibs" cleanspeed = 3 SECONDS // faster than base soap to reward chemists for going to the effort /obj/item/soap/nanotrasen desc = "A heavy duty bar of Nanotrasen brand soap. Smells of plasma." grind_results = list(/datum/reagent/toxin/plasma = 10, /datum/reagent/lye = 10) icon_state = "soapnt" + worn_icon_state = "soapnt" cleanspeed = 2.8 SECONDS //janitor gets this uses = 300 @@ -70,12 +73,14 @@ desc = "A deluxe Waffle Co. brand bar of soap. Smells of high-class luxury." grind_results = list(/datum/reagent/consumable/aloejuice = 10, /datum/reagent/lye = 10) icon_state = "soapdeluxe" + worn_icon_state = "soapdeluxe" cleanspeed = 2 SECONDS //captain gets one of these /obj/item/soap/syndie desc = "An untrustworthy bar of soap made of strong chemical agents that dissolve blood faster." grind_results = list(/datum/reagent/toxin/acid = 10, /datum/reagent/lye = 10) icon_state = "soapsyndie" + worn_icon_state = "soapsyndie" cleanspeed = 0.5 SECONDS //faster than mops so it's useful for traitors who want to clean crime scenes /obj/item/soap/omega @@ -83,6 +88,7 @@ desc = "The most advanced soap known to mankind. The beginning of the end for germs." grind_results = list(/datum/reagent/consumable/potato_juice = 9, /datum/reagent/consumable/ethanol/lizardwine = 9, /datum/reagent/monkey_powder = 9, /datum/reagent/drug/krokodil = 9, /datum/reagent/toxin/acid/nitracid = 9, /datum/reagent/baldium = 9, /datum/reagent/consumable/ethanol/hooch = 9, /datum/reagent/bluespace = 9, /datum/reagent/drug/pumpup = 9, /datum/reagent/consumable/space_cola = 9) icon_state = "soapomega" + worn_icon_state = "soapomega" cleanspeed = 0.3 SECONDS //Only the truest of mind soul and body get one of these uses = 800 //In the Greek numeric system, Omega has a value of 800 diff --git a/code/game/objects/items/cosmetics.dm b/code/game/objects/items/cosmetics.dm index e3a0fc131c5303..acf4f8697994dc 100644 --- a/code/game/objects/items/cosmetics.dm +++ b/code/game/objects/items/cosmetics.dm @@ -121,7 +121,7 @@ else H.hairstyle = "Skinhead" - H.update_hair() + H.update_hair(is_creating = TRUE) playsound(loc, 'sound/items/welder2.ogg', 20, TRUE) @@ -150,7 +150,7 @@ if(new_style && do_after(user, 60, target = H)) user.visible_message(span_notice("[user] successfully changes [H]'s facial hairstyle using [src]."), span_notice("You successfully change [H]'s facial hairstyle using [src].")) H.facial_hairstyle = new_style - H.update_hair() + H.update_hair(is_creating = TRUE) return else return @@ -201,7 +201,7 @@ if(new_style && do_after(user, 60, target = H)) user.visible_message(span_notice("[user] successfully changes [H]'s hairstyle using [src]."), span_notice("You successfully change [H]'s hairstyle using [src].")) H.hairstyle = new_style - H.update_hair() + H.update_hair(is_creating = TRUE) return else diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index 50588e959e8cfc..d8ff5c984bc042 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -46,7 +46,7 @@ var/static/list/runes = list("rune1","rune2","rune3","rune4","rune5","rune6") var/static/list/randoms = list(RANDOM_ANY, RANDOM_RUNE, RANDOM_ORIENTED, RANDOM_NUMBER, RANDOM_GRAFFITI, RANDOM_LETTER, RANDOM_SYMBOL, RANDOM_PUNCTUATION, RANDOM_DRAWING) - var/static/list/graffiti_large_h = list("yiffhell", "secborg", "paint") + var/static/list/graffiti_large_h = list("yiffhell", "furrypride", "secborg", "paint") var/static/list/all_drawables = graffiti + symbols + drawings + oriented + runes + graffiti_large_h diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm index 66cb976738e2d2..95408ad2abc8dd 100644 --- a/code/game/objects/items/devices/aicard.dm +++ b/code/game/objects/items/devices/aicard.dm @@ -38,7 +38,7 @@ else //No AI on the card, therefore the user wants to download one. target.transfer_ai(AI_TRANS_TO_CARD, user, null, src) if(AI) - log_combat(user, AI, "carded", src) + log_silicon("[key_name(user)] carded [key_name(AI)]", src) update_appearance() return TRUE return ..() diff --git a/code/game/objects/items/devices/destabilizing_crystal.dm b/code/game/objects/items/devices/destabilizing_crystal.dm index da15adb3ee0633..b6a2b2c80834d5 100644 --- a/code/game/objects/items/devices/destabilizing_crystal.dm +++ b/code/game/objects/items/devices/destabilizing_crystal.dm @@ -1,6 +1,7 @@ /obj/item/destabilizing_crystal name = "destabilizing crystal" - desc = "A crystal that can be used to destabilize the supermatter to cause a resonance cascade. Apply on fully stable supermatter and start the delamination. Prevent anyone from stopping you." + desc = "A crystal that can be used to destabilize the supermatter to cause a resonance cascade. Carefully apply this on \ + a fully stable supermatter crystal and start the delamination. Prevent anyone from stopping you." icon = 'icons/obj/supermatter.dmi' icon_state = "destabilizing_crystal" w_class = WEIGHT_CLASS_NORMAL diff --git a/code/game/objects/items/devices/geiger_counter.dm b/code/game/objects/items/devices/geiger_counter.dm index 8d1d05f4dd6405..76a7e2b839348c 100644 --- a/code/game/objects/items/devices/geiger_counter.dm +++ b/code/game/objects/items/devices/geiger_counter.dm @@ -65,7 +65,7 @@ qdel(GetComponent(/datum/component/geiger_sound)) update_appearance(UPDATE_ICON) - to_chat(user, span_notice("[icon2html(src, user)] You switch [scanning ? "on" : "off"] [src].")) + balloon_alert(user, "switch [scanning ? "on" : "off"]") /obj/item/geiger_counter/afterattack(atom/target, mob/living/user, params) . = ..() diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm index 1d7c35cc1c606a..d3ffb223167df2 100644 --- a/code/game/objects/items/devices/multitool.dm +++ b/code/game/objects/items/devices/multitool.dm @@ -45,25 +45,23 @@ // Syndicate device disguised as a multitool; it will turn red when an AI camera is nearby. /obj/item/multitool/ai_detect + actions_types = list(/datum/action/item_action/toggle_multitool) var/detect_state = PROXIMITY_NONE var/rangealert = 8 //Glows red when inside var/rangewarning = 20 //Glows yellow when inside var/hud_type = DATA_HUD_AI_DETECT var/hud_on = FALSE var/mob/camera/ai_eye/remote/ai_detector/eye - var/datum/action/item_action/toggle_multitool/toggle_action /obj/item/multitool/ai_detect/Initialize(mapload) . = ..() START_PROCESSING(SSfastprocess, src) eye = new /mob/camera/ai_eye/remote/ai_detector() - toggle_action = new /datum/action/item_action/toggle_multitool(src) /obj/item/multitool/ai_detect/Destroy() STOP_PROCESSING(SSfastprocess, src) if(hud_on && ismob(loc)) remove_hud(loc) - QDEL_NULL(toggle_action) QDEL_NULL(eye) return ..() diff --git a/code/game/objects/items/devices/radio/encryptionkey.dm b/code/game/objects/items/devices/radio/encryptionkey.dm index 33efb88296903f..7797a451d91efc 100644 --- a/code/game/objects/items/devices/radio/encryptionkey.dm +++ b/code/game/objects/items/devices/radio/encryptionkey.dm @@ -4,14 +4,19 @@ icon = 'icons/obj/radio.dmi' icon_state = "cypherkey" w_class = WEIGHT_CLASS_TINY + /// Can this radio key access the binary radio channel? var/translate_binary = FALSE + /// Decrypts Syndicate radio transmissions. var/syndie = FALSE + /// If true, the radio can say/hear on the special CentCom channel. var/independent = FALSE + /// What channels does this encryption key grant to the parent headset. var/list/channels = list() + var/datum/language/translated_language /obj/item/encryptionkey/Initialize(mapload) . = ..() - if(!channels.len && !translate_binary) + if(!channels.len && !translate_binary && !translated_language) desc += " Has no special codes in it. You should probably tell a coder!" /obj/item/encryptionkey/examine(mob/user) @@ -30,12 +35,13 @@ name = "syndicate encryption key" icon_state = "syn_cypherkey" channels = list(RADIO_CHANNEL_SYNDICATE = 1) - syndie = TRUE//Signifies that it de-crypts Syndicate transmissions + syndie = TRUE /obj/item/encryptionkey/binary name = "binary translator key" icon_state = "bin_cypherkey" translate_binary = TRUE + translated_language = /datum/language/machine /obj/item/encryptionkey/headset_sec name = "security radio encryption key" @@ -110,7 +116,12 @@ /obj/item/encryptionkey/heads/hop name = "\proper the head of personnel's encryption key" icon_state = "hop_cypherkey" - channels = list(RADIO_CHANNEL_SUPPLY = 1, RADIO_CHANNEL_SERVICE = 1, RADIO_CHANNEL_COMMAND = 1) + channels = list(RADIO_CHANNEL_SERVICE = 1, RADIO_CHANNEL_COMMAND = 1) + +/obj/item/encryptionkey/heads/qm + name = "\proper the quartermaster's encryption key" + icon_state = "cargo_cypherkey" + channels = list(RADIO_CHANNEL_SUPPLY = 1, RADIO_CHANNEL_COMMAND = 1) /obj/item/encryptionkey/headset_cargo name = "supply radio encryption key" @@ -138,3 +149,33 @@ /obj/item/encryptionkey/secbot channels = list(RADIO_CHANNEL_AI_PRIVATE = 1, RADIO_CHANNEL_SECURITY = 1) + +/obj/item/encryptionkey/moth + name = "\improper Moffic translation key" + desc = "An encryption key that automatically encodes moffic heard through the radio into common. The signal's a little fuzzy." + icon_state = "translation_cypherkey" + translated_language = /datum/language/moffic + +/obj/item/encryptionkey/tiziran + name = "\improper Tiziran translation key" + desc = "An encryption key that automatically encodes draconic heard through the radio into common. The signal's not quite to scale." + icon_state = "translation_cypherkey" + translated_language = /datum/language/draconic + +/obj/item/encryptionkey/plasmaman + name = "\improper Calcic translation key" + desc = "An encryption key that automatically encodes calcic heard through the radio into common. The signal lacks a bit of teeth." + icon_state = "translation_cypherkey" + translated_language = /datum/language/calcic + +/obj/item/encryptionkey/ethereal + name = "\improper Ethereal translation key" + desc = "An encryption key that automatically encodes ethereal heard through the radio into common. The signal's overpowering." + icon_state = "translation_cypherkey" + translated_language = /datum/language/voltaic + +/obj/item/encryptionkey/felinid + name = "\improper Felinid translation key" + desc = "An encryption key that automatically encodes nekomimetic heard through the radio into common. The signal's rather scratchy." + icon_state = "translation_cypherkey" + translated_language = /datum/language/nekomimetic diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index 10b0f3ef707881..f6d8ba6fc62cb6 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -27,6 +27,8 @@ GLOBAL_LIST_INIT(channel_tokens, list( slot_flags = ITEM_SLOT_EARS dog_fashion = null var/obj/item/encryptionkey/keyslot2 = null + /// A list of all languages that this headset allows the user to understand. Populated by language encryption keys. + var/list/language_list /obj/item/radio/headset/suicide_act(mob/living/carbon/user) user.visible_message(span_suicide("[user] begins putting \the [src]'s antenna up [user.p_their()] nose! It looks like [user.p_theyre()] trying to give [user.p_them()]self cancer!")) @@ -83,6 +85,23 @@ GLOBAL_LIST_INIT(channel_tokens, list( return attack_self(headset_user) return ..() +/// Grants all the languages this headset allows the mob to understand via installed chips. +/obj/item/radio/headset/proc/grant_headset_languages(mob/grant_to) + for(var/language in language_list) + grant_to.grant_language(language, understood = TRUE, spoken = FALSE, source = LANGUAGE_RADIOKEY) + +/obj/item/radio/headset/equipped(mob/user, slot, initial) + . = ..() + if(!(slot_flags & slot)) + return + + grant_headset_languages(user) + +/obj/item/radio/headset/dropped(mob/user, silent) + . = ..() + for(var/language in language_list) + user.remove_language(language, understood = TRUE, spoken = FALSE, source = LANGUAGE_RADIOKEY) + /obj/item/radio/headset/syndicate //disguised to look like a normal headset for stealth ops /obj/item/radio/headset/syndicate/alt //undisguised bowman with flash protection @@ -233,9 +252,15 @@ GLOBAL_LIST_INIT(channel_tokens, list( icon_state = "com_headset" keyslot = new /obj/item/encryptionkey/heads/hop +/obj/item/radio/headset/heads/qm + name = "\proper the quartermaster's headset" + desc = "The headset of the guy who runs the cargo department." + icon_state = "com_headset" + keyslot = new /obj/item/encryptionkey/heads/qm + /obj/item/radio/headset/headset_cargo name = "supply radio headset" - desc = "A headset used by the QM and his slaves." + desc = "A headset used by the QM's slaves." icon_state = "cargo_headset" keyslot = new /obj/item/encryptionkey/headset_cargo @@ -331,7 +356,6 @@ GLOBAL_LIST_INIT(channel_tokens, list( else return ..() - /obj/item/radio/headset/recalculateChannels() . = ..() if(keyslot2) @@ -343,12 +367,30 @@ GLOBAL_LIST_INIT(channel_tokens, list( translate_binary = TRUE if(keyslot2.syndie) syndie = TRUE - if (keyslot2.independent) + if(keyslot2.independent) independent = TRUE for(var/ch_name in channels) secure_radio_connections[ch_name] = add_radio(src, GLOB.radiochannels[ch_name]) + var/list/old_language_list = language_list?.Copy() + language_list = list() + if(keyslot?.translated_language) + language_list += keyslot.translated_language + if(keyslot2?.translated_language) + language_list += keyslot2.translated_language + + // If we're equipped on a mob, we should make sure all the languages + // learned from our installed key chips are all still accurate + var/mob/mob_loc = loc + if(istype(mob_loc) && mob_loc.get_item_by_slot(slot_flags) == src) + // Remove all the languages we may not be able to know anymore + for(var/language in old_language_list) + mob_loc.remove_language(language, understood = TRUE, spoken = FALSE, source = LANGUAGE_RADIOKEY) + + // And grant all the languages we definitely should know now + grant_headset_languages(mob_loc) + /obj/item/radio/headset/AltClick(mob/living/user) if(!istype(user) || !Adjacent(user) || user.incapacitated()) return diff --git a/code/game/objects/items/devices/scanners/gas_analyzer.dm b/code/game/objects/items/devices/scanners/gas_analyzer.dm index 2b1a22190f9178..e3f6aab6ad4f57 100644 --- a/code/game/objects/items/devices/scanners/gas_analyzer.dm +++ b/code/game/objects/items/devices/scanners/gas_analyzer.dm @@ -116,7 +116,7 @@ /obj/item/analyzer/attack_self(mob/user, modifiers) if(user.stat != CONSCIOUS || !user.can_read(src) || user.is_blind()) return - atmos_scan(user=user, target=get_turf(src), tool=src, silent=FALSE) + atmos_scan(user=user, target=get_turf(src), silent=FALSE) on_analyze(source=src, target=get_turf(src)) /obj/item/analyzer/attack_self_secondary(mob/user, modifiers) @@ -127,6 +127,7 @@ /// Called when our analyzer is used on something /obj/item/analyzer/proc/on_analyze(datum/source, atom/target) + SIGNAL_HANDLER var/mixture = target.return_analyzable_air() if(!mixture) return FALSE @@ -145,7 +146,7 @@ * Gets called by analyzer_act, which in turn is called by tool_act. * Also used in other chat-based gas scans. */ -/proc/atmos_scan(mob/user, atom/target, obj/tool, silent=FALSE) +/proc/atmos_scan(mob/user, atom/target, silent=FALSE) var/mixture = target.return_analyzable_air() if(!mixture) return FALSE @@ -188,5 +189,5 @@ message += span_notice("Volume: [volume] L") // don't want to change the order volume appears in, suck it // we let the join apply newlines so we do need handholding - to_chat(user, jointext(message, "\n"), type = MESSAGE_TYPE_INFO) + to_chat(user, examine_block(jointext(message, "\n")), type = MESSAGE_TYPE_INFO) 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 2ee066cbcd58a3..68ece23a22d93a 100644 --- a/code/game/objects/items/devices/scanners/health_analyzer.dm +++ b/code/game/objects/items/devices/scanners/health_analyzer.dm @@ -70,8 +70,8 @@ to_chat(user, "[M]'s biological structure is too complex for the health analyzer.") return - user.visible_message(span_notice("[user] analyzes [M]'s vitals."), \ - span_notice("You analyze [M]'s vitals.")) + user.visible_message(span_notice("[user] analyzes [M]'s vitals.")) + balloon_alert(user, "analyzing vitals") switch (scanmode) if (SCANMODE_HEALTH) @@ -238,7 +238,10 @@ if(mode == SCANNER_VERBOSE) for(var/obj/item/bodypart/limb as anything in damaged) - dmgreport += "[capitalize(limb.plaintext_zone)]:" + if(limb.bodytype & BODYTYPE_ROBOTIC) + dmgreport += "[capitalize(limb.name)]:" + else + dmgreport += "[capitalize(limb.plaintext_zone)]:" dmgreport += "[(limb.brute_dam > 0) ? "[CEILING(limb.brute_dam,1)]" : "0"]" dmgreport += "[(limb.burn_dam > 0) ? "[CEILING(limb.burn_dam,1)]" : "0"]" dmgreport += "" @@ -374,7 +377,7 @@ // we handled the last
so we don't need handholding if(tochat) - to_chat(user, jointext(render_list, ""), trailing_newline = FALSE, type = MESSAGE_TYPE_INFO) + to_chat(user, examine_block(jointext(render_list, "")), trailing_newline = FALSE, type = MESSAGE_TYPE_INFO) else return(jointext(render_list, "")) @@ -433,7 +436,7 @@ render_list += "[allergies]\n" // we handled the last
so we don't need handholding - to_chat(user, jointext(render_list, ""), trailing_newline = FALSE, type = MESSAGE_TYPE_INFO) + to_chat(user, examine_block(jointext(render_list, "")), trailing_newline = FALSE, type = MESSAGE_TYPE_INFO) /obj/item/healthanalyzer/AltClick(mob/user) ..() @@ -472,7 +475,7 @@ else to_chat(user, "No wounds detected in subject.") else - to_chat(user, jointext(render_list, ""), type = MESSAGE_TYPE_INFO) + to_chat(user, examine_block(jointext(render_list, "")), type = MESSAGE_TYPE_INFO) /obj/item/healthanalyzer/wound name = "first aid analyzer" diff --git a/code/game/objects/items/devices/scanners/sequence_scanner.dm b/code/game/objects/items/devices/scanners/sequence_scanner.dm index f74c82c0fafc7e..3251245f8640ca 100644 --- a/code/game/objects/items/devices/scanners/sequence_scanner.dm +++ b/code/game/objects/items/devices/scanners/sequence_scanner.dm @@ -25,10 +25,8 @@ add_fingerprint(user) //no scanning if its a husk or DNA-less Species if (!HAS_TRAIT(target, TRAIT_GENELESS) && !HAS_TRAIT(target, TRAIT_BADDNA)) - user.visible_message( - span_notice("[user] analyzes [target]'s genetic sequence."), - span_notice("You analyze [target]'s genetic sequence.") - ) + user.visible_message(span_notice("[user] analyzes [target]'s genetic sequence.")) + balloon_alert(user, "sequence analyzed") gene_scan(target, user) else user.visible_message(span_notice("[user] fails to analyze [target]'s genetic sequence."), span_warning("[target] has no readable genetic sequence!")) diff --git a/code/game/objects/items/devices/scanners/slime_scanner.dm b/code/game/objects/items/devices/scanners/slime_scanner.dm index 502a345a558d1d..81b197bfaf80f7 100644 --- a/code/game/objects/items/devices/scanners/slime_scanner.dm +++ b/code/game/objects/items/devices/scanners/slime_scanner.dm @@ -23,8 +23,7 @@ slime_scan(T, user) /proc/slime_scan(mob/living/simple_animal/slime/T, mob/living/user) - var/to_render = "========================\ - \nSlime scan results:\ + var/to_render = "Slime scan results:\ \n[span_notice("[T.colour] [T.is_adult ? "adult" : "baby"] slime")]\ \nNutrition: [T.nutrition]/[T.get_max_nutrition()]" if (T.nutrition < T.get_starve_nutrition()) @@ -51,4 +50,4 @@ if(T.effectmod) to_render += "\n[span_notice("Core mutation in progress: [T.effectmod]")]\ \n[span_notice("Progress in core mutation: [T.applied] / [SLIME_EXTRACT_CROSSING_REQUIRED]")]" - to_chat(user, to_render + "\n========================") + to_chat(user, examine_block(to_render)) diff --git a/code/game/objects/items/devices/spyglasses.dm b/code/game/objects/items/devices/spyglasses.dm index 6577a2de9667c6..0fa659d49539d6 100644 --- a/code/game/objects/items/devices/spyglasses.dm +++ b/code/game/objects/items/devices/spyglasses.dm @@ -40,6 +40,9 @@ linked_bug.linked_glasses = null . = ..() +/datum/action/item_action/activate_remote_view + name = "Activate Remote View" + desc = "Activates the Remote View of your spy sunglasses." /obj/item/clothing/accessory/spy_bug name = "pocket protector" diff --git a/code/game/objects/items/dna_injector.dm b/code/game/objects/items/dna_injector.dm index 163e639678c327..93cf1f9268332c 100644 --- a/code/game/objects/items/dna_injector.dm +++ b/code/game/objects/items/dna_injector.dm @@ -461,6 +461,14 @@ /obj/item/dnainjector/antiwebbing name = "\improper DNA injector (Anti-Webbing)" remove_mutations = list(/datum/mutation/human/webbing) + +/obj/item/dnainjector/illiterate + name = "\improper DNA injector (Illiterate)" + add_mutations = list(/datum/mutation/human/illiterate) + +/obj/item/dnainjector/antiilliterate + name = "\improper DNA injector (Anti-Illiterate)" + remove_mutations = list(/datum/mutation/human/illiterate) /obj/item/dnainjector/timed var/duration = 600 diff --git a/code/game/objects/items/extinguisher.dm b/code/game/objects/items/extinguisher.dm index bec6f9f12a3e01..ae607c3ddc2097 100644 --- a/code/game/objects/items/extinguisher.dm +++ b/code/game/objects/items/extinguisher.dm @@ -12,6 +12,7 @@ throw_speed = 2 throw_range = 7 force = 10 + demolition_mod = 1.25 custom_materials = list(/datum/material/iron = 90) attack_verb_continuous = list("slams", "whacks", "bashes", "thunks", "batters", "bludgeons", "thrashes") attack_verb_simple = list("slam", "whack", "bash", "thunk", "batter", "bludgeon", "thrash") @@ -112,7 +113,7 @@ /obj/item/extinguisher/attack_self(mob/user) safety = !safety src.icon_state = "[sprite_name][!safety]" - to_chat(user, "The safety is [safety ? "on" : "off"].") + balloon_alert(user, "safety [safety ? "on" : "off"]") return /obj/item/extinguisher/attack(mob/M, mob/living/user) @@ -138,7 +139,7 @@ /obj/item/extinguisher/proc/AttemptRefill(atom/target, mob/user) if(istype(target, tanktype) && target.Adjacent(user)) if(reagents.total_volume == reagents.maximum_volume) - to_chat(user, span_warning("\The [src] is already full!")) + balloon_alert(user, "already full!") return TRUE var/obj/structure/reagent_dispensers/W = target //will it work? var/transferred = W.reagents.trans_to(src, max_water, transfered_by = user) @@ -168,7 +169,7 @@ if (src.reagents.total_volume < 1) - to_chat(usr, span_warning("\The [src] is empty!")) + balloon_alert(user, "it's empty!") return if (world.time < src.last_use + 12) diff --git a/code/game/objects/items/fireaxe.dm b/code/game/objects/items/fireaxe.dm index 33a3b1d873a731..38075a6a9b5c75 100644 --- a/code/game/objects/items/fireaxe.dm +++ b/code/game/objects/items/fireaxe.dm @@ -10,6 +10,7 @@ desc = "Truly, the weapon of a madman. Who would think to fight fire with an axe?" force = 5 throwforce = 15 + demolition_mod = 1.25 w_class = WEIGHT_CLASS_BULKY slot_flags = ITEM_SLOT_BACK attack_verb_continuous = list("attacks", "chops", "cleaves", "tears", "lacerates", "cuts") diff --git a/code/game/objects/items/food/_food.dm b/code/game/objects/items/food/_food.dm index 97288efa60f9dc..459a7e73558a67 100644 --- a/code/game/objects/items/food/_food.dm +++ b/code/game/objects/items/food/_food.dm @@ -65,6 +65,13 @@ MakeGrillable() MakeDecompose(mapload) MakeBakeable() + ADD_TRAIT(src, FISHING_BAIT_TRAIT, INNATE_TRAIT) + +/obj/item/food/examine(mob/user) + . = ..() + if(foodtypes) + var/list/types = bitfield_to_list(foodtypes, FOOD_FLAGS) + . += span_notice("It is [lowertext(english_list(types))].") ///This proc adds the edible component, overwrite this if you for some reason want to change some specific args like callbacks. /obj/item/food/proc/MakeEdible() diff --git a/code/game/objects/items/food/bait.dm b/code/game/objects/items/food/bait.dm new file mode 100644 index 00000000000000..30856b3a18a22c --- /dev/null +++ b/code/game/objects/items/food/bait.dm @@ -0,0 +1,47 @@ +/obj/item/food/bait + name = "this is bait" + desc = "you got baited." + icon = 'icons/obj/fishing.dmi' + /// Quality trait of this bait + var/bait_quality = BASIC_QUALITY_BAIT_TRAIT + /// Icon state added to main fishing rod icon when this bait is equipped + var/rod_overlay_icon_state + +/obj/item/food/bait/Initialize(mapload) + . = ..() + ADD_TRAIT(src, bait_quality, INNATE_TRAIT) + +/obj/item/food/bait/worm + name = "worm" + desc = "It's a wriggling worm from a can of fishing bait. You're not going to eat it are you ?" + icon = 'icons/obj/fishing.dmi' + icon_state = "worm" + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 1) + tastes = list("meat" = 1, "worms" = 1) + foodtypes = GROSS | MEAT | BUGS + w_class = WEIGHT_CLASS_TINY + bait_quality = BASIC_QUALITY_BAIT_TRAIT + rod_overlay_icon_state = "worm_overlay" + +/obj/item/food/bait/worm/premium + name = "extra slimy worm" + desc = "This worm looks very sophisticated." + bait_quality = GOOD_QUALITY_BAIT_TRAIT + +/obj/item/food/bait/doughball + name = "doughball" + desc = "Small piece of dough. Simple but effective fishing bait." + icon = 'icons/obj/fishing.dmi' + icon_state = "doughball" + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 1) + tastes = list("dough" = 1) + foodtypes = GRAIN + w_class = WEIGHT_CLASS_TINY + bait_quality = BASIC_QUALITY_BAIT_TRAIT + rod_overlay_icon_state = "dough_overlay" + +/// These are generated by tech fishing rod +/obj/item/food/bait/doughball/synthetic + name = "synthetic doughball" + icon_state = "doughball" + preserved_food = TRUE diff --git a/code/game/objects/items/food/bread.dm b/code/game/objects/items/food/bread.dm index 3d382dd4984a8c..aec4b5ce309991 100644 --- a/code/game/objects/items/food/bread.dm +++ b/code/game/objects/items/food/bread.dm @@ -13,7 +13,6 @@ /obj/item/food/breadslice icon = 'icons/obj/food/burgerbread.dmi' - slot_flags = ITEM_SLOT_HEAD foodtypes = GRAIN food_flags = FOOD_FINGER_FOOD eat_time = 0.5 SECONDS @@ -39,7 +38,7 @@ AddComponent(/datum/component/customizable_reagent_holder, /obj/item/food/bread/empty, CUSTOM_INGREDIENT_ICON_FILL, max_ingredients = 8) /obj/item/food/bread/plain/MakeProcessable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/breadslice/plain, 5, 30, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/breadslice/plain, 5, 3 SECONDS, table_required = TRUE) /obj/item/food/breadslice/plain name = "bread slice" @@ -86,7 +85,7 @@ /obj/item/food/bread/meat/MakeProcessable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/breadslice/meat, 5, 30, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/breadslice/meat, 5, 3 SECONDS, table_required = TRUE) /obj/item/food/breadslice/meat name = "meatbread slice" @@ -104,7 +103,7 @@ tastes = list("bread" = 10, "meat" = 10) /obj/item/food/bread/sausage/MakeProcessable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/breadslice/sausage, 5, 30, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/breadslice/sausage, 5, 3 SECONDS, table_required = TRUE) /obj/item/food/breadslice/sausage name = "sausagebread slice" @@ -123,7 +122,7 @@ foodtypes = GRAIN | MEAT /obj/item/food/bread/xenomeat/MakeProcessable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/breadslice/xenomeat, 5, 30, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/breadslice/xenomeat, 5, 3 SECONDS, table_required = TRUE) /obj/item/food/breadslice/xenomeat name = "xenomeatbread slice" @@ -141,7 +140,7 @@ foodtypes = GRAIN | MEAT | TOXIC /obj/item/food/bread/spidermeat/MakeProcessable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/breadslice/spidermeat, 5, 30, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/breadslice/spidermeat, 5, 3 SECONDS, table_required = TRUE) /obj/item/food/breadslice/spidermeat name = "spider meat bread slice" @@ -159,7 +158,7 @@ foodtypes = GRAIN | FRUIT /obj/item/food/bread/banana/MakeProcessable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/breadslice/banana, 5, 30, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/breadslice/banana, 5, 3 SECONDS, table_required = TRUE) /obj/item/food/breadslice/banana name = "banana-nut bread slice" @@ -178,7 +177,7 @@ venue_value = FOOD_PRICE_TRASH /obj/item/food/bread/tofu/MakeProcessable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/breadslice/tofu, 5, 30, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/breadslice/tofu, 5, 3 SECONDS, table_required = TRUE) /obj/item/food/breadslice/tofu name = "tofubread slice" @@ -196,7 +195,7 @@ foodtypes = GRAIN | DAIRY /obj/item/food/bread/creamcheese/MakeProcessable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/breadslice/creamcheese, 5, 30, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/breadslice/creamcheese, 5, 3 SECONDS, table_required = TRUE) /obj/item/food/breadslice/creamcheese name = "cream cheese bread slice" @@ -210,7 +209,7 @@ desc = "It's bread, customized to your wildest dreams." /obj/item/food/bread/empty/MakeProcessable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/breadslice/empty, 5, 30, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/breadslice/empty, 5, 3 SECONDS, table_required = TRUE) /obj/item/food/bread/mimana name = "mimana bread" @@ -221,7 +220,7 @@ foodtypes = GRAIN | FRUIT /obj/item/food/bread/mimana/MakeProcessable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/breadslice/mimana, 5, 30, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/breadslice/mimana, 5, 3 SECONDS, table_required = TRUE) /obj/item/food/breadslice/mimana name = "mimana bread slice" @@ -294,12 +293,12 @@ /obj/item/food/butterdog/ComponentInitialize() . = ..() - AddComponent(/datum/component/slippery, 80) + AddComponent(/datum/component/slippery, 8 SECONDS) /obj/item/food/raw_frenchtoast name = "raw french toast" desc = "A slice of bread soaked in a beaten egg mixture. Put it on a griddle to start cooking!." - icon = 'icons/obj/food/food.dmi' + icon = 'icons/obj/food/burgerbread.dmi' icon_state = "raw_frenchtoast" food_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 2,) tastes = list("raw egg" = 2, "soaked bread" = 1) @@ -312,7 +311,7 @@ /obj/item/food/frenchtoast name = "french toast" desc = "A slice of bread soaked in an egg mixture and grilled until golden-brown. Drizzled with syrup!." - icon = 'icons/obj/food/food.dmi' + icon = 'icons/obj/food/burgerbread.dmi' icon_state = "frenchtoast" food_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 2,) tastes = list("french toast" = 1, "syrup" = 1, "golden deliciousness" = 1) diff --git a/code/game/objects/items/food/burgers.dm b/code/game/objects/items/food/burgers.dm index 363b74027d14dc..ec03b0144f7239 100644 --- a/code/game/objects/items/food/burgers.dm +++ b/code/game/objects/items/food/burgers.dm @@ -429,7 +429,7 @@ /obj/item/food/burger/crazy/process(delta_time) // DIT EES HORRIBLE if(DT_PROB(2.5, delta_time)) var/datum/effect_system/fluid_spread/smoke/bad/green/smoke = new - smoke.set_up(0, location = src) + smoke.set_up(0, holder = src, location = src) smoke.start() // empty burger you can customize diff --git a/code/game/objects/items/food/cake.dm b/code/game/objects/items/food/cake.dm index 2de47996471760..5d30d489f1152b 100644 --- a/code/game/objects/items/food/cake.dm +++ b/code/game/objects/items/food/cake.dm @@ -28,7 +28,7 @@ /obj/item/food/cake/plain/MakeProcessable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/plain, 5, 30, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/plain, 5, 3 SECONDS, table_required = TRUE) /obj/item/food/cakeslice/plain name = "plain cake slice" @@ -48,7 +48,7 @@ /obj/item/food/cake/carrot/MakeProcessable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/carrot, 5, 30, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/carrot, 5, 3 SECONDS, table_required = TRUE) /obj/item/food/cakeslice/carrot name = "carrot cake slice" @@ -67,7 +67,7 @@ foodtypes = GRAIN | DAIRY | MEAT | GROSS | SUGAR /obj/item/food/cake/brain/MakeProcessable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/brain, 5, 30, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/brain, 5, 3 SECONDS, table_required = TRUE) /obj/item/food/cakeslice/brain name = "brain cake slice" @@ -88,7 +88,7 @@ /obj/item/food/cake/cheese/MakeProcessable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/cheese, 5, 30, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/cheese, 5, 3 SECONDS, table_required = TRUE) /obj/item/food/cakeslice/cheese name = "cheese cake slice" @@ -108,7 +108,7 @@ venue_value = FOOD_PRICE_CHEAP /obj/item/food/cake/orange/MakeProcessable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/orange, 5, 30, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/orange, 5, 3 SECONDS, table_required = TRUE) /obj/item/food/cakeslice/orange name = "orange cake slice" @@ -127,7 +127,7 @@ venue_value = FOOD_PRICE_CHEAP /obj/item/food/cake/lime/MakeProcessable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/lime, 5, 30, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/lime, 5, 3 SECONDS, table_required = TRUE) /obj/item/food/cakeslice/lime name = "lime cake slice" @@ -146,7 +146,7 @@ venue_value = FOOD_PRICE_CHEAP /obj/item/food/cake/lemon/MakeProcessable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/lemon, 5, 30, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/lemon, 5, 3 SECONDS, table_required = TRUE) /obj/item/food/cakeslice/lemon name = "lemon cake slice" @@ -165,7 +165,7 @@ venue_value = FOOD_PRICE_CHEAP /obj/item/food/cake/chocolate/MakeProcessable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/chocolate, 5, 30, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/chocolate, 5, 3 SECONDS, table_required = TRUE) /obj/item/food/cakeslice/chocolate name = "chocolate cake slice" @@ -183,7 +183,7 @@ foodtypes = GRAIN | DAIRY | JUNKFOOD | SUGAR /obj/item/food/cake/birthday/MakeProcessable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/birthday, 5, 30, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/birthday, 5, 3 SECONDS, table_required = TRUE) /obj/item/food/cake/birthday/microwave_act(obj/machinery/microwave/microwave) //super sekrit club new /obj/item/clothing/head/hardhat/cakehat(get_turf(src)) @@ -207,7 +207,7 @@ tastes = list("cake" = 3, "a Vlad's Salad" = 1) /obj/item/food/cake/birthday/energy/MakeProcessable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/birthday/energy, 5, 30, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/birthday/energy, 5, 3 SECONDS, table_required = TRUE) /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!") @@ -255,7 +255,7 @@ venue_value = FOOD_PRICE_CHEAP /obj/item/food/cake/apple/MakeProcessable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/apple, 5, 30, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/apple, 5, 3 SECONDS, table_required = TRUE) /obj/item/food/cakeslice/apple name = "apple cake slice" @@ -273,7 +273,7 @@ foodtypes = GRAIN | DAIRY | SUGAR /obj/item/food/cake/slimecake/MakeProcessable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/slimecake, 5, 30, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/slimecake, 5, 3 SECONDS, table_required = TRUE) /obj/item/food/cakeslice/slimecake name = "slime cake slice" @@ -292,7 +292,7 @@ venue_value = FOOD_PRICE_CHEAP /obj/item/food/cake/pumpkinspice/MakeProcessable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/pumpkinspice, 5, 30, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/pumpkinspice, 5, 3 SECONDS, table_required = TRUE) /obj/item/food/cakeslice/pumpkinspice name = "pumpkin spice cake slice" @@ -310,7 +310,7 @@ foodtypes = GRAIN | DAIRY | FRUIT | SUGAR /obj/item/food/cake/bsvc/MakeProcessable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/bsvc, 5, 30, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/bsvc, 5, 3 SECONDS, table_required = TRUE) /obj/item/food/cakeslice/bsvc name = "blackberry and strawberry vanilla cake slice" @@ -328,7 +328,7 @@ foodtypes = GRAIN | DAIRY | FRUIT | SUGAR /obj/item/food/cake/bscc/MakeProcessable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/bscc, 5, 30, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/bscc, 5, 3 SECONDS, table_required = TRUE) /obj/item/food/cakeslice/bscc name = "strawberry chocolate cake slice" @@ -346,7 +346,7 @@ foodtypes = GRAIN | DAIRY | SUGAR /obj/item/food/cake/holy_cake/MakeProcessable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/holy_cake_slice, 5, 30, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/holy_cake_slice, 5, 3 SECONDS, table_required = TRUE) /obj/item/food/cakeslice/holy_cake_slice name = "angel food cake slice" @@ -365,7 +365,7 @@ venue_value = FOOD_PRICE_CHEAP /obj/item/food/cake/pound_cake/MakeProcessable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/pound_cake_slice, 7, 30, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/pound_cake_slice, 7, 3 SECONDS, table_required = TRUE) /obj/item/food/cakeslice/pound_cake_slice name = "pound cake slice" @@ -384,7 +384,7 @@ foodtypes = GRAIN | GROSS /obj/item/food/cake/hardware_cake/MakeProcessable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/hardware_cake_slice, 5, 30, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/hardware_cake_slice, 5, 3 SECONDS, table_required = TRUE) /obj/item/food/cakeslice/hardware_cake_slice name = "hardware cake slice" @@ -403,7 +403,7 @@ foodtypes = GRAIN | SUGAR | DAIRY /obj/item/food/cake/vanilla_cake/MakeProcessable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/vanilla_slice, 5, 30, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/vanilla_slice, 5, 3 SECONDS, table_required = TRUE) /obj/item/food/cakeslice/vanilla_slice name = "vanilla cake slice" @@ -422,7 +422,7 @@ foodtypes = GRAIN | SUGAR | DAIRY /obj/item/food/cake/clown_cake/MakeProcessable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/clown_slice, 5, 30, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/clown_slice, 5, 3 SECONDS, table_required = TRUE) /obj/item/food/cakeslice/clown_slice name = "clown cake slice" @@ -441,7 +441,7 @@ foodtypes = GRAIN | DAIRY | FRUIT | SUGAR /obj/item/food/cake/trumpet/MakeProcessable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/trumpet, 5, 30, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/trumpet, 5, 3 SECONDS, table_required = TRUE) /obj/item/food/cakeslice/trumpet name = "spaceman's cake" @@ -460,7 +460,7 @@ foodtypes = GRAIN | DAIRY | SUGAR /obj/item/food/cake/brioche/MakeProcessable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/brioche, 6, 30, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/brioche, 6, 3 SECONDS, table_required = TRUE) /obj/item/food/cakeslice/brioche name = "brioche cake slice" @@ -479,7 +479,7 @@ foodtypes = DAIRY | FRUIT | SUGAR /obj/item/food/cake/pavlova/MakeProcessable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/pavlova, 5, 30, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/pavlova, 5, 3 SECONDS, table_required = TRUE) /obj/item/food/cakeslice/pavlova name = "pavlova slice" @@ -502,7 +502,7 @@ foodtypes = GRAIN | DAIRY | FRUIT | SUGAR /obj/item/food/cake/fruit/MakeProcessable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/fruit, 5, 30, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/fruit, 5, 3 SECONDS, table_required = TRUE) /obj/item/food/cakeslice/fruit name = "english fruitcake slice" diff --git a/code/game/objects/items/food/cheese.dm b/code/game/objects/items/food/cheese.dm new file mode 100644 index 00000000000000..1d3b3145515011 --- /dev/null +++ b/code/game/objects/items/food/cheese.dm @@ -0,0 +1,120 @@ +/** + * # Abstract cheese class + * + * Everything that is a subclass of this counts as cheese for regal rats. + */ +/obj/item/food/cheese + name = "the concept of cheese" + desc = "This probably shouldn't exist." + tastes = list("cheese" = 1) + foodtypes = DAIRY + /// used to determine how much health rats/regal rats recover when they eat it. + var/rat_heal = 0 + +/obj/item/food/cheese/Initialize(mapload) + . = ..() + RegisterSignal(src, COMSIG_RAT_INTERACT, .proc/on_rat_eat) + +/obj/item/food/cheese/proc/on_rat_eat(datum/source, mob/living/simple_animal/hostile/regalrat/king) + SIGNAL_HANDLER + + king.cheese_heal(src, rat_heal, span_green("You eat [src], restoring some health.")) + +/obj/item/food/cheese/wedge + name = "cheese wedge" + desc = "A wedge of delicious Cheddar. The cheese wheel it was cut from can't have gone far." + icon_state = "cheesewedge" + food_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/protein = 1, /datum/reagent/consumable/nutriment/vitamin = 1) + w_class = WEIGHT_CLASS_SMALL + rat_heal = 10 + +/obj/item/food/cheese/wheel + name = "cheese wheel" + desc = "A big wheel of delcious Cheddar." + icon_state = "cheesewheel" + food_reagents = list(/datum/reagent/consumable/nutriment = 10, /datum/reagent/consumable/nutriment/protein = 5, /datum/reagent/consumable/nutriment/vitamin = 5) //Hard cheeses contain about 25% protein + w_class = WEIGHT_CLASS_NORMAL + rat_heal = 35 + +/obj/item/food/cheese/wheel/Initialize(mapload) + . = ..() + AddComponent(/datum/component/food_storage) + +/obj/item/food/cheese/wheel/MakeProcessable() + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cheese/wedge, 5, 3 SECONDS, table_required = TRUE) + +/obj/item/food/cheese/wheel/MakeBakeable() + AddComponent(/datum/component/bakeable, /obj/item/food/baked_cheese, rand(20 SECONDS, 25 SECONDS), TRUE, TRUE) + +/obj/item/food/cheese/royal + name = "royal cheese" + desc = "Ascend the throne. Consume the wheel. Feel the POWER." + icon_state = "royalcheese" + food_reagents = list(/datum/reagent/consumable/nutriment = 15, /datum/reagent/consumable/nutriment/vitamin = 5, /datum/reagent/gold = 20, /datum/reagent/toxin/mutagen = 5) + w_class = WEIGHT_CLASS_BULKY + tastes = list("cheese" = 4, "royalty" = 1) + rat_heal = 70 + +//Curd cheese, a general term which I will now proceed to stretch as thin as the toppings on a supermarket sandwich: +//I'll use it as a substitute for ricotta, cottage cheese and quark, as well as any other non-aged, soft grainy cheese +/obj/item/food/cheese/curd_cheese + name = "curd cheese" + desc = "Known by many names throughout human cuisine, curd cheese is useful for a wide variety of dishes." + icon_state = "curd_cheese" + microwaved_type = /obj/item/food/cheese/cheese_curds + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 3, /datum/reagent/consumable/cream = 1) + tastes = list("cream" = 1, "cheese" = 1) + foodtypes = DAIRY + w_class = WEIGHT_CLASS_SMALL + rat_heal = 35 + +/obj/item/food/cheese/cheese_curds + name = "cheese curds" + desc = "Not to be mistaken for curd cheese. Tasty deep fried." + icon_state = "cheese_curds" + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 3) + tastes = list("cheese" = 1) + foodtypes = DAIRY + w_class = WEIGHT_CLASS_SMALL + rat_heal = 35 + +/obj/item/food/cheese/cheese_curds/Initialize(mapload) + . = ..() + AddElement(/datum/element/dryable, /obj/item/food/cheese/firm_cheese) + +/obj/item/food/cheese/firm_cheese + name = "firm cheese" + desc = "Firm aged cheese, similar in texture to firm tofu. Due to its lack of moisture it's particularly useful for cooking with, as it doesn't melt easily." + icon_state = "firm_cheese" + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 3) + tastes = list("aged cheese" = 1) + foodtypes = DAIRY | VEGETABLES + w_class = WEIGHT_CLASS_SMALL + rat_heal = 35 + +/obj/item/food/cheese/firm_cheese/MakeProcessable() + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cheese/firm_cheese_slice, 3, 3 SECONDS) + +/obj/item/food/cheese/firm_cheese_slice + name = "firm cheese slice" + desc = "A slice of firm cheese. Perfect for grilling or making into delicious pesto." + icon_state = "firm_cheese_slice" + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 3) + tastes = list("aged cheese" = 1) + foodtypes = DAIRY | VEGETABLES + w_class = WEIGHT_CLASS_SMALL + burns_on_grill = TRUE + rat_heal = 10 + +/obj/item/food/cheese/firm_cheese_slice/MakeGrillable() + AddComponent(/datum/component/grillable, /obj/item/food/grilled_cheese, rand(25 SECONDS, 35 SECONDS), TRUE, TRUE) + +/obj/item/food/cheese/mozzarella + name = "mozzarella cheese" + desc = "Delicious, creamy, and cheesy, all in one simple package." + icon_state = "mozzarella" + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 3) + tastes = list("mozzarella" = 1) + foodtypes = DAIRY + w_class = WEIGHT_CLASS_SMALL + rat_heal = 10 diff --git a/code/game/objects/items/food/dough.dm b/code/game/objects/items/food/dough.dm index 36c9076fc7002b..b994e6c73fcb18 100644 --- a/code/game/objects/items/food/dough.dm +++ b/code/game/objects/items/food/dough.dm @@ -14,7 +14,7 @@ // Dough + rolling pin = flat dough /obj/item/food/dough/MakeProcessable() - AddElement(/datum/element/processable, TOOL_ROLLINGPIN, /obj/item/food/flatdough, 1, 30, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_ROLLINGPIN, /obj/item/food/flatdough, 1, 3 SECONDS, table_required = TRUE) /obj/item/food/flatdough name = "flat dough" @@ -30,7 +30,7 @@ // sliceable into 3xdoughslices /obj/item/food/flatdough/MakeProcessable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/doughslice, 3, 30, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/doughslice, 3, 3 SECONDS, table_required = TRUE) /obj/item/food/pizzabread name = "pizza bread" @@ -59,6 +59,9 @@ /obj/item/food/doughslice/MakeBakeable() AddComponent(/datum/component/bakeable, /obj/item/food/bun, rand(20 SECONDS, 25 SECONDS), TRUE, TRUE) +/obj/item/food/doughslice/MakeProcessable() + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/bait/doughball, 5, 3 SECONDS) + /obj/item/food/bun name = "bun" desc = "A base for any self-respecting burger." @@ -87,7 +90,7 @@ AddComponent(/datum/component/bakeable, /obj/item/food/cake/plain, rand(70 SECONDS, 90 SECONDS), TRUE, TRUE) /obj/item/food/cakebatter/MakeProcessable() - AddElement(/datum/element/processable, TOOL_ROLLINGPIN, /obj/item/food/piedough, 1, 30, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_ROLLINGPIN, /obj/item/food/piedough, 1, 3 SECONDS, table_required = TRUE) /obj/item/food/piedough name = "pie dough" @@ -102,7 +105,7 @@ AddComponent(/datum/component/bakeable, /obj/item/food/pie/plain, rand(30 SECONDS, 45 SECONDS), TRUE, TRUE) /obj/item/food/piedough/MakeProcessable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/rawpastrybase, 6, 30, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/rawpastrybase, 6, 3 SECONDS, table_required = TRUE) /obj/item/food/rawpastrybase name = "raw pastry base" diff --git a/code/game/objects/items/food/frozen.dm b/code/game/objects/items/food/frozen.dm index e6f2c3e3219051..1550c12ce42909 100644 --- a/code/game/objects/items/food/frozen.dm +++ b/code/game/objects/items/food/frozen.dm @@ -292,12 +292,12 @@ food_reagents = list(/datum/reagent/consumable/hot_coco = 4, /datum/reagent/consumable/cream = 2, /datum/reagent/consumable/vanilla = 3, /datum/reagent/consumable/sugar = 2) overlay_state = "jumbo" -/obj/item/food/popsicle/nogga_black - name = "nogga black" - desc = "A salty licorice icecream recently reintroduced due to all records of the controversy being lost to time. Those who cannot remember the past are doomed to repeat it." +/obj/item/food/popsicle/licorice_creamsicle + name = "Void Bar™" + desc = "A salty licorice icecream. A salty frozen treat." food_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/salt = 1, /datum/reagent/consumable/cream = 2, /datum/reagent/consumable/vanilla = 1, /datum/reagent/consumable/sugar = 4) tastes = list("salty liquorice") - overlay_state = "nogga_black" + overlay_state = "licorice_creamsicle" /obj/item/food/cornuto name = "cornuto" diff --git a/code/game/objects/items/food/lizard.dm b/code/game/objects/items/food/lizard.dm index 7401cbc4cc212b..ae5423b121fef9 100644 --- a/code/game/objects/items/food/lizard.dm +++ b/code/game/objects/items/food/lizard.dm @@ -7,7 +7,7 @@ desc = "A raw Tiziran blood sausage, ready to be cured on a drying rack." icon = 'icons/obj/food/lizard.dmi' icon_state = "raw_lizard_sausage" - food_reagents = list(/datum/reagent/consumable/nutriment/protein = 3, /datum/reagent/blood = 3) + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 5, /datum/reagent/consumable/nutriment/vitamin = 2, /datum/reagent/blood = 3) tastes = list("meat" = 1, "black pudding" = 1) foodtypes = MEAT w_class = WEIGHT_CLASS_SMALL @@ -21,7 +21,7 @@ desc = "A coarse dry-cured blood sausage, traditionally made by farmers in the farmlands around Zagoskeld. Similar in texture to old-Earth Spanish chorizo." icon = 'icons/obj/food/lizard.dmi' icon_state = "lizard_sausage" - food_reagents = list(/datum/reagent/consumable/nutriment/protein = 5) + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 6, /datum/reagent/consumable/nutriment/vitamin = 3) tastes = list("meat" = 1, "black pudding" = 1) foodtypes = MEAT w_class = WEIGHT_CLASS_SMALL @@ -31,7 +31,7 @@ desc = "A common food on Tizira, headcheese is traditionally made of an animal's head, with the organs removed, boiled until it falls apart, at which point it is collected, strained of moisture, salted heavily, packed into blocks, and left to dry and age for several months. The resulting hard block tastes similar to cheese." icon = 'icons/obj/food/lizard.dmi' icon_state = "raw_lizard_cheese" - food_reagents = list(/datum/reagent/consumable/nutriment/protein = 5, /datum/reagent/consumable/salt = 5) + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 15, /datum/reagent/consumable/salt = 5) tastes = list("meat" = 1, "salt" = 1) foodtypes = MEAT | GROSS w_class = WEIGHT_CLASS_SMALL @@ -45,20 +45,20 @@ desc = "A cured block of headcheese. Delicious, if you're a lizard." icon = 'icons/obj/food/lizard.dmi' icon_state = "lizard_cheese" - food_reagents = list(/datum/reagent/consumable/nutriment/protein = 5, /datum/reagent/consumable/salt = 5) + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 15, /datum/reagent/consumable/salt = 5) tastes = list("cheese" = 1, "salt" = 1) foodtypes = MEAT | GROSS w_class = WEIGHT_CLASS_SMALL /obj/item/food/headcheese/MakeProcessable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/headcheese_slice, 5, 30, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/headcheese_slice, 5, 3 SECONDS, table_required = TRUE) /obj/item/food/headcheese_slice name = "headcheese slice" desc = "A slice of headcheese, useful for making sandwiches and snacks. Or surviving the cold Tiziran winters." icon = 'icons/obj/food/lizard.dmi' icon_state = "lizard_cheese_slice" - food_reagents = list(/datum/reagent/consumable/nutriment/protein = 1, /datum/reagent/consumable/salt = 1) + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 3, /datum/reagent/consumable/salt = 1) tastes = list("cheese" = 1, "salt" = 1) foodtypes = MEAT | GROSS w_class = WEIGHT_CLASS_TINY @@ -68,7 +68,7 @@ desc = "Crispy lung strips, with veggies and a spicy sauce. Delicious, if you like lungs." icon = 'icons/obj/food/lizard.dmi' icon_state = "lung_stirfry" - food_reagents = list(/datum/reagent/consumable/nutriment/protein = 3, /datum/reagent/consumable/nutriment/vitamin = 2, /datum/reagent/consumable/capsaicin = 1) + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 6, /datum/reagent/consumable/nutriment/vitamin = 4, /datum/reagent/consumable/capsaicin = 2) tastes = list("meat" = 1, "heat" = 1, "veggies" = 1) foodtypes = MEAT | VEGETABLES | GROSS w_class = WEIGHT_CLASS_SMALL @@ -78,7 +78,7 @@ desc = "A Tiziran dish consisting of spiced ground offal, stuffed into a stomach and boiled. Pretty foul to anyone who's not used to the taste." icon = 'icons/obj/food/lizard.dmi' icon_state = "tsatsikh" - food_reagents = list(/datum/reagent/consumable/nutriment/protein = 5) + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 10) tastes = list("assorted minced organs" = 1) foodtypes = MEAT | GROSS w_class = WEIGHT_CLASS_SMALL @@ -88,7 +88,7 @@ desc = "A rich, meaty paste made from liver, meat, and a few additions for extra flavour." icon = 'icons/obj/food/lizard.dmi' icon_state = "pate" - food_reagents = list(/datum/reagent/consumable/nutriment/protein = 3) + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 5) tastes = list("liver" = 1) foodtypes = MEAT w_class = WEIGHT_CLASS_SMALL @@ -98,7 +98,7 @@ desc = "The moonfish lays large, transparent white eggs which are prized in lizard cooking. Their flavour is similar to caviar, but generally is described as deeper and more complex." icon = 'icons/obj/food/lizard.dmi' icon_state = "moonfish_eggs" - food_reagents = list(/datum/reagent/consumable/nutriment/protein = 2) + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 5, /datum/reagent/consumable/nutriment/vitamin = 3) tastes = list("caviar" = 1) foodtypes = SEAFOOD w_class = WEIGHT_CLASS_SMALL @@ -108,7 +108,7 @@ desc = "A rich paste made from moonfish eggs. Generally the only way most lizards can get them, and used fairly heavily in coastal cooking." icon = 'icons/obj/food/lizard.dmi' icon_state = "moonfish_caviar" - food_reagents = list(/datum/reagent/consumable/nutriment/protein = 2) + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 6, /datum/reagent/consumable/nutriment/vitamin = 3) tastes = list("caviar" = 1) foodtypes = SEAFOOD w_class = WEIGHT_CLASS_SMALL @@ -118,7 +118,7 @@ desc = "Another example of cultural crossover between lizards and humans, desert snail escargot is closer to the Roman dish cocleas than the contemporary French escargot. It's a common street food in the desert cities." icon = 'icons/obj/food/lizard.dmi' icon_state = "lizard_escargot" - food_reagents = list(/datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/garlic = 1) + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 6, /datum/reagent/consumable/nutriment/vitamin = 4, /datum/reagent/consumable/garlic = 2) tastes = list("snails" = 1, "garlic" = 1, "oil" = 1) foodtypes = MEAT | VEGETABLES w_class = WEIGHT_CLASS_SMALL @@ -128,7 +128,7 @@ desc = "A blood sausage, battered and deep fried. Commonly served with fries as a quick and simple snack on the streets of Zagoskeld." icon = 'icons/obj/food/lizard.dmi' icon_state = "fried_blood_sausage" - food_reagents = list(/datum/reagent/consumable/nutriment/protein = 3, /datum/reagent/consumable/salt = 1, /datum/reagent/consumable/cooking_oil = 1) + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 6, /datum/reagent/consumable/nutriment/vitamin = 2, /datum/reagent/consumable/salt = 1, /datum/reagent/consumable/cooking_oil = 1) tastes = list("black pudding" = 1, "batter" = 1, "oil" = 1) foodtypes = MEAT | FRIED w_class = WEIGHT_CLASS_SMALL @@ -139,7 +139,7 @@ desc = "One of the many human foods to make its way to the lizards was french fries, which are called poms-franzisks in Draconic. When topped with barbecued meat and sauce, they make a hearty meal." icon = 'icons/obj/food/lizard.dmi' icon_state = "lizard_fries" - food_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/protein = 3, /datum/reagent/consumable/salt = 1, /datum/reagent/consumable/bbqsauce = 2) + food_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/protein = 6, /datum/reagent/consumable/salt = 1, /datum/reagent/consumable/bbqsauce = 2) tastes = list("fries" = 2, "bbq sauce" = 1, "barbecued meat" = 1) foodtypes = MEAT | VEGETABLES | FRIED w_class = WEIGHT_CLASS_SMALL @@ -149,7 +149,7 @@ desc = "A thick pink puree made from finely chopped poached eyeballs and brains, fried onions, and fat. Lizards swear it's delicious!" icon = 'icons/obj/food/lizard.dmi' icon_state = "brain_pate" - food_reagents = list(/datum/reagent/consumable/nutriment/protein = 5) + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 8, /datum/reagent/liquidgibs = 2) tastes = list("brains" = 2) foodtypes = MEAT | VEGETABLES | GROSS w_class = WEIGHT_CLASS_SMALL @@ -159,7 +159,7 @@ desc = "A delicious snack from the streets of Zagoskeld, consisting of headcheese coated in rootbread breadcrumbs. Commonly served with fries." icon = 'icons/obj/food/lizard.dmi' icon_state = "crispy_headcheese" - food_reagents = list(/datum/reagent/consumable/nutriment/protein = 3, /datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/cooking_oil = 1) + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 5, /datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/cooking_oil = 2) tastes = list("cheese" = 1, "oil" = 1) foodtypes = MEAT | VEGETABLES | NUTS | GROSS w_class = WEIGHT_CLASS_SMALL @@ -169,7 +169,7 @@ desc = "A popular Tiziran streetfood consisting of vinegar-marinated armorfish on a skewer with onion and chillis." icon = 'icons/obj/food/lizard.dmi' icon_state = "picoss_skewer" - food_reagents = list(/datum/reagent/consumable/nutriment/protein = 3, /datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/vinegar= 1, /datum/reagent/consumable/capsaicin = 1) + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 8, /datum/reagent/consumable/nutriment/vitamin = 4, /datum/reagent/consumable/vinegar = 1, /datum/reagent/consumable/capsaicin = 1) tastes = list("fish" = 1, "acid" = 1, "onion" = 1, "heat" = 1) foodtypes = SEAFOOD | VEGETABLES w_class = WEIGHT_CLASS_SMALL @@ -179,7 +179,7 @@ desc = "Little crispy larvae in a korta nectar based sweet and spicy sauce. Bugtastic!" icon = 'icons/obj/food/lizard.dmi' icon_state = "nectar_larvae" - food_reagents = list(/datum/reagent/consumable/nutriment/protein = 5, /datum/reagent/consumable/korta_nectar = 2, /datum/reagent/consumable/capsaicin = 1) + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 7, /datum/reagent/consumable/korta_nectar = 3, /datum/reagent/consumable/capsaicin = 1) tastes = list("meat" = 1, "sweet" = 1, "heat" = 1) foodtypes = GROSS | MEAT | BUGS w_class = WEIGHT_CLASS_SMALL @@ -189,7 +189,7 @@ desc = "A medley of mushrooms, made to meet your monstrous munchies. Marvelous!" icon = 'icons/obj/food/lizard.dmi' icon_state = "mushroomy_stirfry" - food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 3) + food_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/consumable/nutriment/vitamin = 4) tastes = list("marvelous mushrooms" = 1, "sublime shrooms" = 1) foodtypes = VEGETABLES w_class = WEIGHT_CLASS_SMALL @@ -200,7 +200,7 @@ desc = "A slab of grilled moonfish. Traditionally served over scalloped roots with a wine-based sauce." icon = 'icons/obj/food/lizard.dmi' icon_state = "grilled_moonfish" - food_reagents = list(/datum/reagent/consumable/nutriment/protein = 5, /datum/reagent/consumable/nutriment = 3) + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 8, /datum/reagent/consumable/nutriment/vitamin = 4) tastes = list("fish" = 1) foodtypes = SEAFOOD burns_on_grill = TRUE @@ -211,7 +211,7 @@ desc = "A slab of beautifully seared moonfish on a bed of potatoes and carrots, with a wine and demiglace reduction on top. Simply marvelous." icon = 'icons/obj/food/lizard.dmi' icon_state = "moonfish_demiglace" - food_reagents = list(/datum/reagent/consumable/nutriment/protein = 5, /datum/reagent/consumable/nutriment = 3) + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 8, /datum/reagent/consumable/nutriment/vitamin = 6, /datum/reagent/consumable/nutriment = 2) tastes = list("fish" = 1) foodtypes = SEAFOOD w_class = WEIGHT_CLASS_SMALL @@ -233,7 +233,7 @@ desc = "A form of root and nut pasta originally native to the oceanside regions of Tizira. It's similar in texture and appearance to gnocchi." icon = 'icons/obj/food/lizard.dmi' icon_state = "nizaya" - food_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 2) + food_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 4) tastes = list("gnocchi" = 1) foodtypes = VEGETABLES | NUTS @@ -242,7 +242,7 @@ desc = "A high class pasta dish from Tizira's vineyard region of Valyngia. Traditionally made with only the finest Tiziran wine... but the human swill will do, in a pinch." icon = 'icons/obj/food/lizard.dmi' icon_state = "snail_nizaya" - food_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/nutriment/vitamin = 6) + food_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/consumable/nutriment/vitamin = 6) tastes = list("snails" = 1, "wine" = 1, "gnocchi" = 1) foodtypes = VEGETABLES | MEAT | NUTS @@ -251,7 +251,7 @@ desc = "A lizard adaptation of the Italian pasta dish, aglio e olio, made with nizaya pasta." icon = 'icons/obj/food/lizard.dmi' icon_state = "garlic_nizaya" - food_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 8) + food_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/consumable/nutriment/vitamin = 10) tastes = list("garlic" = 1, "oil" = 1, "gnocchi" = 1) foodtypes = VEGETABLES | NUTS @@ -260,7 +260,7 @@ desc = "A sweet, creamy nizaya pasta dish made with korta milk and nectar." icon = 'icons/obj/food/lizard.dmi' icon_state = "demit_nizaya" - food_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/korta_nectar = 2) + food_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/consumable/korta_nectar = 4, /datum/reagent/consumable/nutriment/vitamin = 2) tastes = list("peppery sweet" = 1, "veggies" = 1, "gnocchi" = 1) foodtypes = VEGETABLES | SUGAR | NUTS @@ -269,7 +269,7 @@ desc = "A nizaya pasta dish made with seraka mushrooms and quality oil. Has a pronounced nutty flavour." icon = 'icons/obj/food/lizard.dmi' icon_state = "mushroom_nizaya" - food_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 2) + food_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/consumable/nutriment/vitamin = 10) tastes = list("savouriness" = 1, "nuttiness" = 1, "gnocchi" = 1) foodtypes = VEGETABLES @@ -280,16 +280,16 @@ desc = "A root based dough, made with nuts and tubers. Used in a wide range of Tiziran cooking." icon = 'icons/obj/food/lizard.dmi' icon_state = "rootdough" - food_reagents = list(/datum/reagent/consumable/nutriment = 2) + food_reagents = list(/datum/reagent/consumable/nutriment = 6) w_class = WEIGHT_CLASS_SMALL tastes = list("potato" = 1, "earthy heat" = 1) foodtypes = VEGETABLES | NUTS /obj/item/food/rootdough/MakeBakeable() - AddComponent(/datum/component/bakeable, /obj/item/food/bread/root, rand(30 SECONDS, 45 SECONDS), TRUE, TRUE) + AddComponent(/datum/component/bakeable, /obj/item/food/bread/root, rand(15 SECONDS, 25 SECONDS), TRUE, TRUE) /obj/item/food/rootdough/MakeProcessable() - AddElement(/datum/element/processable, TOOL_ROLLINGPIN, /obj/item/food/flatrootdough, 1, 30, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_ROLLINGPIN, /obj/item/food/flatrootdough, 1, 3 SECONDS, table_required = TRUE) /obj/item/food/flatrootdough name = "flat rootdough" @@ -301,10 +301,10 @@ foodtypes = VEGETABLES | NUTS /obj/item/food/flatrootdough/MakeProcessable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/rootdoughslice, 3, 30, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/rootdoughslice, 3, 3 SECONDS, table_required = TRUE) /obj/item/food/flatrootdough/MakeGrillable() - AddComponent(/datum/component/grillable, /obj/item/food/root_flatbread, rand(25 SECONDS, 35 SECONDS), TRUE, TRUE) + AddComponent(/datum/component/grillable, /obj/item/food/root_flatbread, rand(15 SECONDS, 25 SECONDS), TRUE, TRUE) /obj/item/food/rootdoughslice name = "rootdough ball" @@ -317,17 +317,17 @@ foodtypes = VEGETABLES | NUTS /obj/item/food/rootdoughslice/MakeProcessable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/spaghetti/nizaya, 1, 30, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/spaghetti/nizaya, 1, 3 SECONDS, table_required = TRUE) /obj/item/food/rootdoughslice/MakeBakeable() - AddComponent(/datum/component/bakeable, /obj/item/food/rootroll, rand(30 SECONDS, 45 SECONDS), TRUE, TRUE) + AddComponent(/datum/component/bakeable, /obj/item/food/rootroll, rand(15 SECONDS, 25 SECONDS), TRUE, TRUE) /obj/item/food/root_flatbread name = "root flatbread" desc = "A plain grilled root flatbread. Can be topped with a variety of foods that lizards like to eat." icon = 'icons/obj/food/lizard.dmi' icon_state = "root_flatbread" - food_reagents = list(/datum/reagent/consumable/nutriment = 7) + food_reagents = list(/datum/reagent/consumable/nutriment = 8) tastes = list("bread" = 1, "earthy heat" = 1) foodtypes = VEGETABLES | NUTS burns_on_grill = TRUE @@ -337,7 +337,7 @@ desc = "A dense, chewy roll, made from roots. A nice companion to a bowl of soup." icon = 'icons/obj/food/lizard.dmi' icon_state = "rootroll" - food_reagents = list(/datum/reagent/consumable/nutriment = 3) + food_reagents = list(/datum/reagent/consumable/nutriment = 4) w_class = WEIGHT_CLASS_SMALL tastes = list("roll" = 1) // the roll tastes of roll. foodtypes = VEGETABLES | NUTS @@ -350,7 +350,7 @@ desc = "The lizard equivalent to bread, made from tubers like potatoes and yams mixed with ground nuts and seeds. Noticably denser than regular bread." icon = 'icons/obj/food/lizard.dmi' icon_state = "lizard_bread" - food_reagents = list(/datum/reagent/consumable/nutriment = 10) + food_reagents = list(/datum/reagent/consumable/nutriment = 20) tastes = list("bread" = 8, "nuts" = 2) foodtypes = VEGETABLES | NUTS w_class = WEIGHT_CLASS_SMALL @@ -362,14 +362,14 @@ AddComponent(/datum/component/customizable_reagent_holder, /obj/item/food/bread/empty, CUSTOM_INGREDIENT_ICON_FILL, max_ingredients = 8) /obj/item/food/bread/root/MakeProcessable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/breadslice/root, 5, 30, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/breadslice/root, 5, 3 SECONDS, table_required = TRUE) /obj/item/food/breadslice/root name = "rootbread slice" desc = "A slice of dense, chewy rootbread." icon = 'icons/obj/food/lizard.dmi' icon_state = "lizard_breadslice" - food_reagents = list(/datum/reagent/consumable/nutriment = 2) + food_reagents = list(/datum/reagent/consumable/nutriment = 4) tastes = list("bread" = 8, "nuts" = 2) foodtypes = VEGETABLES | NUTS venue_value = FOOD_PRICE_TRASH @@ -384,7 +384,7 @@ desc = "A simple Tiziran country dish, popular as a side to meat or fish dishes. Topped with herbs and oil." icon = 'icons/obj/food/lizard.dmi' icon_state = "rustic_flatbread" - food_reagents = list(/datum/reagent/consumable/nutriment = 15, /datum/reagent/consumable/nutriment/vitamin = 10) + food_reagents = list(/datum/reagent/consumable/nutriment = 15, /datum/reagent/consumable/nutriment/vitamin = 15, /datum/reagent/consumable/garlic = 2) tastes = list("bread" = 1, "herb" = 1, "oil" = 1, "garlic" = 1) slice_type = null foodtypes = VEGETABLES | NUTS @@ -406,7 +406,7 @@ desc = "A flatbread topped with pate, pickled vegetables, and cubed headcheese. Not very suited to anyone's tastes but the lizards." icon = 'icons/obj/food/lizard.dmi' icon_state = "imperial_flatbread" - food_reagents = list(/datum/reagent/consumable/nutriment = 15, /datum/reagent/consumable/nutriment/protein = 10, /datum/reagent/consumable/nutriment/vitamin = 15) + food_reagents = list(/datum/reagent/consumable/nutriment = 15, /datum/reagent/consumable/nutriment/protein = 15, /datum/reagent/consumable/nutriment/vitamin = 10) tastes = list("bread" = 1, "herb" = 1, "oil" = 1, "garlic" = 1, "tomato" = 1, "meat" = 1) slice_type = null foodtypes = VEGETABLES | MEAT | NUTS | GROSS @@ -418,7 +418,7 @@ desc = "A popular sandwich on Tizira, named in honour of the Imperial family." icon = 'icons/obj/food/lizard.dmi' icon_state = "emperor_roll" - food_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/protein = 7, /datum/reagent/consumable/nutriment/vitamin = 1) + food_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/protein = 8, /datum/reagent/consumable/nutriment/vitamin = 2) tastes = list("bread" = 1, "cheese" = 1, "liver" = 1, "caviar" = 1) foodtypes = VEGETABLES | NUTS | MEAT | GROSS | SEAFOOD food_flags = FOOD_FINGER_FOOD @@ -429,7 +429,7 @@ desc = "A sweetened rootroll with sliced fruit, enjoyed as a seasonal dessert on Tizira." icon = 'icons/obj/food/lizard.dmi' icon_state = "honey_roll" - food_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 2, /datum/reagent/consumable/honey = 2) + food_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 8, /datum/reagent/consumable/honey = 2) tastes = list("bread" = 1, "honey" = 1, "fruit" = 1) foodtypes = VEGETABLES | NUTS | FRUIT food_flags = FOOD_FINGER_FOOD @@ -441,7 +441,7 @@ desc = "A bowl of rich, meaty dumpling soup, traditionally served during the festival of Atrakor's Might on Tizira. The dumplings are shaped like the Night Sky Lord himself." icon = 'icons/obj/food/lizard.dmi' icon_state = "atrakor_dumplings" - food_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/consumable/nutriment/vitamin = 2) + food_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/protein = 10, /datum/reagent/consumable/nutriment/vitamin = 4, /datum/reagent/water = 5) tastes = list("bone broth" = 1, "onion" = 1, "potato" = 1) foodtypes = MEAT | VEGETABLES | NUTS @@ -450,7 +450,7 @@ desc = "A hearty noodle soup made from meatballs and nizaya in a rich broth. Commonly topped with a handful of chopped nuts." icon = 'icons/obj/food/lizard.dmi' icon_state = "meatball_noodles" - food_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/protein = 6, /datum/reagent/consumable/nutriment/vitamin = 2) + food_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/protein = 8, /datum/reagent/consumable/nutriment/vitamin = 6, /datum/reagent/water = 5) tastes = list("bone broth" = 1, "meat" = 1, "gnocchi" = 1, "peanuts" = 1) foodtypes = MEAT | VEGETABLES | NUTS @@ -459,7 +459,7 @@ desc = "A bowl of sausage, onion, blood and vinegar, served ice cold. Every bit as rough as it sounds." icon = 'icons/obj/food/lizard.dmi' icon_state = "black_broth" - food_reagents = list(/datum/reagent/consumable/nutriment/protein = 8, /datum/reagent/blood = 5) + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 10, /datum/reagent/blood = 8, /datum/reagent/liquidgibs = 2) tastes = list("vinegar" = 1, "metal" = 1) foodtypes = MEAT | VEGETABLES | GROSS @@ -468,7 +468,7 @@ desc = "A slimy bowl of jellyfish stew. It jiggles if you shake it." icon = 'icons/obj/food/lizard.dmi' icon_state = "jellyfish_stew" - food_reagents = list(/datum/reagent/consumable/nutriment/protein = 5, /datum/reagent/consumable/nutriment = 3) + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 10, /datum/reagent/consumable/nutriment = 6) tastes = list("slime" = 1) foodtypes = MEAT | VEGETABLES | GROSS @@ -477,7 +477,7 @@ desc = "A big bowl of spicy, savoury soup made with rootbread. Heavily seasoned, and very tasty." icon = 'icons/obj/food/lizard.dmi' icon_state = "rootbread_soup" - food_reagents = list(/datum/reagent/consumable/nutriment/protein = 3, /datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 3) + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 6, /datum/reagent/consumable/nutriment = 10, /datum/reagent/consumable/nutriment/vitamin = 6) tastes = list("bread" = 1, "egg" = 1, "chili" = 1, "garlic" = 1) foodtypes = MEAT | VEGETABLES @@ -487,7 +487,7 @@ desc = "A country dish from rural Tizira. Made with eggs, blood, and foraged greens. Traditionally eaten with rootbread and a spicy sauce." icon = 'icons/obj/food/lizard.dmi' icon_state = "black_eggs" - food_reagents = list(/datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/consumable/nutriment/vitamin = 2) + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 8, /datum/reagent/consumable/nutriment/vitamin = 6) tastes = list("eggs" = 1, "greens" = 1, "blood" = 1) foodtypes = MEAT | BREAKFAST | GROSS w_class = WEIGHT_CLASS_SMALL @@ -497,7 +497,7 @@ desc = "A smooth and spicy tomato-based sauce topped with eggs and baked. Delicious." icon = 'icons/obj/food/lizard.dmi' icon_state = "patzikula" - food_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/consumable/nutriment/vitamin = 4, /datum/reagent/consumable/capsaicin = 1) + food_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/protein = 8, /datum/reagent/consumable/nutriment/vitamin = 8, /datum/reagent/consumable/capsaicin = 2) tastes = list("eggs" = 1, "tomato" = 1, "heat" = 1) foodtypes = VEGETABLES | MEAT | BREAKFAST w_class = WEIGHT_CLASS_SMALL @@ -509,19 +509,19 @@ desc = "A big slab of korta nut brittle. So sugary it should be a crime!" icon = 'icons/obj/food/lizard.dmi' icon_state = "korta_brittle" - food_reagents = list(/datum/reagent/consumable/sugar = 10, /datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/korta_nectar = 5) + food_reagents = list(/datum/reagent/consumable/sugar = 20, /datum/reagent/consumable/nutriment = 15, /datum/reagent/consumable/korta_nectar = 15) tastes = list("peppery heat" = 1, "sweetness" = 1) foodtypes = NUTS | SUGAR /obj/item/food/cake/korta_brittle/MakeProcessable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/korta_brittle, 5, 30, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/korta_brittle, 5, 3 SECONDS, table_required = TRUE) /obj/item/food/cakeslice/korta_brittle name = "korta brittle slice" desc = "A little slice of korta nut brittle. A diabetic's worst enemy." icon = 'icons/obj/food/lizard.dmi' icon_state = "korta_brittle_slice" - food_reagents = list(/datum/reagent/consumable/sugar = 2, /datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/korta_nectar = 1) + food_reagents = list(/datum/reagent/consumable/sugar = 4, /datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/korta_nectar = 3) tastes = list("peppery heat" = 1, "sweetness" = 1) foodtypes = NUTS | SUGAR @@ -530,7 +530,7 @@ desc = "Shaved ice, korta nectar and berries. A sweet treat to eat to beat summer heat!" icon = 'icons/obj/food/lizard.dmi' icon_state = "korta_ice" - food_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/ice = 4, /datum/reagent/consumable/berryjuice = 4) + food_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 8, /datum/reagent/consumable/ice = 4, /datum/reagent/consumable/berryjuice = 6) tastes = list("peppery sweet" = 1, "berry" = 1) foodtypes = NUTS | SUGAR | FRUIT @@ -539,7 +539,7 @@ desc = "A slightly bizarre dish from Tizira, consisting of seraka mushrooms coated with caramel on a skewer. Carries a pronounced 'sweet and savoury' kick." icon = 'icons/obj/food/lizard.dmi' icon_state = "candied_mushrooms" - food_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 2, /datum/reagent/consumable/caramel = 3) + food_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/consumable/nutriment/vitamin = 6, /datum/reagent/consumable/caramel = 4) tastes = list("savouriness" = 1, "sweetness" = 1) foodtypes = SUGAR | VEGETABLES | GROSS @@ -549,7 +549,7 @@ desc = "Pickled cabbage, as made famous by Germans, and which has become common in lizard cooking, where it is known as Zauerkrat." icon = 'icons/obj/food/lizard.dmi' icon_state = "sauerkraut" - food_reagents = list(/datum/reagent/consumable/nutriment = 3) + food_reagents = list(/datum/reagent/consumable/nutriment = 4) tastes = list("cabbage" = 1, "acid" = 1) foodtypes = VEGETABLES w_class = WEIGHT_CLASS_SMALL @@ -559,7 +559,7 @@ desc = "Mashed root vegetables, mixed with korta flour and boiled to produce a large, round and slightly spicy dumpling. Commonly eaten in soup." icon = 'icons/obj/food/lizard.dmi' icon_state = "lizard_dumplings" - food_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 2) + food_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 4) tastes = list("potato" = 1, "earthy heat" = 1) foodtypes = VEGETABLES | NUTS w_class = WEIGHT_CLASS_SMALL @@ -569,7 +569,7 @@ desc = "Seraka mushrooms that have been steeped in alkaline water to remove the extract, thereby making them completely safe to consume." icon = 'icons/obj/food/lizard.dmi' icon_state = "steeped_mushrooms" - food_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 1) + food_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 2) tastes = list("savouriness" = 1, "nuttiness" = 1) foodtypes = VEGETABLES w_class = WEIGHT_CLASS_SMALL @@ -579,7 +579,7 @@ desc = "A can of gunner jellyfish packed in brine. Contains a mild hallucinogen which is destroyed by cooking." icon = 'icons/obj/food/canned.dmi' icon_state = "canned_jellyfish" - food_reagents = list(/datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/toxin/mindbreaker = 2, /datum/reagent/consumable/salt = 1) + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 8, /datum/reagent/toxin/mindbreaker = 2, /datum/reagent/consumable/salt = 1) tastes = list("slime" = 1, "burning" = 1, "salt" = 1) foodtypes = SEAFOOD | GROSS w_class = WEIGHT_CLASS_SMALL @@ -589,7 +589,7 @@ desc = "Giant snails from the Tiziran desert, packaged in brine. Shells included. Probably best not eaten raw, unless you're a lizard." icon = 'icons/obj/food/canned.dmi' icon_state = "canned_snails" - food_reagents = list(/datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/consumable/salt = 2) + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 8, /datum/reagent/consumable/salt = 2) tastes = list("snails" = 1) foodtypes = MEAT | GROSS w_class = WEIGHT_CLASS_SMALL @@ -599,7 +599,7 @@ desc = "A can of bee larva packaged in honey. Probably appetizing to someone." icon = 'icons/obj/food/canned.dmi' icon_state = "canned_larvae" - food_reagents = list(/datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/consumable/honey = 2) + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 8, /datum/reagent/consumable/honey = 2) tastes = list("sweet bugs" = 1) foodtypes = MEAT | GROSS | BUGS w_class = WEIGHT_CLASS_SMALL diff --git a/code/game/objects/items/food/meat.dm b/code/game/objects/items/food/meat.dm index ab8d6876a2aae7..a38016b27fbe2c 100644 --- a/code/game/objects/items/food/meat.dm +++ b/code/game/objects/items/food/meat.dm @@ -119,7 +119,7 @@ w_class = WEIGHT_CLASS_SMALL /obj/item/food/vegetariansushiroll/MakeProcessable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/vegetariansushislice, 4, 20) + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/vegetariansushislice, 4) /obj/item/food/vegetariansushislice name = "vegetarian sushi slice" @@ -140,7 +140,7 @@ w_class = WEIGHT_CLASS_SMALL /obj/item/food/spicyfiletsushiroll/MakeProcessable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/spicyfiletsushislice, 4, 20) + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/spicyfiletsushislice, 4) /obj/item/food/spicyfiletsushislice name = "spicy filet sushi slice" @@ -151,6 +151,25 @@ foodtypes = VEGETABLES | SEAFOOD w_class = WEIGHT_CLASS_SMALL +// empty sushi for custom sushi +/obj/item/food/sushi/empty + name = "sushi" + foodtypes = NONE + tastes = list() + icon_state = "vegetariansushiroll" + desc = "A roll of customized sushi." + +/obj/item/food/sushi/empty/MakeProcessable() + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/sushislice/empty, 4) + +/obj/item/food/sushislice/empty + name = "sushi slice" + foodtypes = NONE + tastes = list() + icon_state = "vegetariansushislice" + desc = "A slice of customized sushi." + + ////////////////////////////////////////////MEATS AND ALIKE//////////////////////////////////////////// /obj/item/food/tofu @@ -215,7 +234,7 @@ AddComponent(/datum/component/grillable, meatball_type, rand(30 SECONDS, 40 SECONDS), TRUE) /obj/item/food/raw_meatball/MakeProcessable() - AddElement(/datum/element/processable, TOOL_ROLLINGPIN, patty_type, 1, 20, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_ROLLINGPIN, patty_type, 1, table_required = TRUE) /obj/item/food/raw_meatball/human name = "strange raw meatball" @@ -368,8 +387,8 @@ venue_value = FOOD_PRICE_CHEAP /obj/item/food/sausage/MakeProcessable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/salami, 6, 30, table_required = TRUE) - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/sausage/american, 1, 30, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/salami, 6, 3 SECONDS, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/sausage/american, 1, 3 SECONDS, table_required = TRUE) /obj/item/food/sausage/american name = "american sausage" @@ -689,7 +708,7 @@ AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/plain, rand(30 SECONDS, 90 SECONDS), TRUE, TRUE) //Add medium rare later maybe? /obj/item/food/meat/slab/MakeProcessable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/plain, 3, 30, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/plain, 3, 3 SECONDS, table_required = TRUE) ///////////////////////////////////// HUMAN MEATS ////////////////////////////////////////////////////// @@ -703,7 +722,7 @@ AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/plain/human, rand(30 SECONDS, 90 SECONDS), TRUE, TRUE) //Add medium rare later maybe? /obj/item/food/meat/slab/human/MakeProcessable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/plain/human, 3, 30, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/plain/human, 3, 3 SECONDS, table_required = TRUE) /obj/item/food/meat/slab/human/mutant/slime icon_state = "slimemeat" @@ -858,7 +877,7 @@ AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/killertomato, rand(70 SECONDS, 85 SECONDS), TRUE, TRUE) /obj/item/food/meat/slab/killertomato/MakeProcessable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/killertomato, 3, 30, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/killertomato, 3, 3 SECONDS, table_required = TRUE) /obj/item/food/meat/slab/bear name = "bear meat" @@ -869,7 +888,7 @@ foodtypes = RAW | MEAT /obj/item/food/meat/slab/bear/MakeProcessable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/bear, 3, 30, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/bear, 3, 3 SECONDS, table_required = TRUE) /obj/item/food/meat/slab/bear/MakeGrillable() AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/bear, rand(40 SECONDS, 70 SECONDS), TRUE, TRUE) @@ -888,7 +907,7 @@ foodtypes = RAW | MEAT /obj/item/food/meat/slab/xeno/MakeProcessable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/xeno, 3, 30, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/xeno, 3, 3 SECONDS, table_required = TRUE) /obj/item/food/meat/slab/xeno/MakeGrillable() AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/xeno, rand(40 SECONDS, 70 SECONDS), TRUE, TRUE) @@ -902,7 +921,7 @@ foodtypes = RAW | MEAT | TOXIC /obj/item/food/meat/slab/spider/MakeProcessable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/spider, 3, 30, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/spider, 3, 3 SECONDS, table_required = TRUE) /obj/item/food/meat/slab/spider/MakeGrillable() AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/spider, rand(40 SECONDS, 70 SECONDS), TRUE, TRUE) @@ -963,7 +982,7 @@ foodtypes = RAW | MEAT /obj/item/food/meat/slab/gondola/MakeProcessable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/gondola, 3, 30, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/gondola, 3, 3 SECONDS, table_required = TRUE) /obj/item/food/meat/slab/gondola/MakeGrillable() AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/gondola, rand(30 SECONDS, 90 SECONDS), TRUE, TRUE) //Add medium rare later maybe? @@ -978,7 +997,7 @@ /obj/item/food/meat/slab/penguin/MakeProcessable() . = ..() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/penguin, 3, 30, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/penguin, 3, 3 SECONDS, table_required = TRUE) /obj/item/food/meat/slab/penguin/MakeGrillable() AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/penguin, rand(30 SECONDS, 90 SECONDS), TRUE, TRUE) //Add medium rare later maybe? @@ -1012,7 +1031,7 @@ tastes = list("chicken" = 1) /obj/item/food/meat/slab/chicken/MakeProcessable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/chicken, 3, 30, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/chicken, 3, 3 SECONDS, table_required = TRUE) /obj/item/food/meat/slab/chicken/MakeGrillable() AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/chicken, rand(30 SECONDS, 90 SECONDS), TRUE, TRUE) //Add medium rare later maybe? (no this is chicken) @@ -1329,7 +1348,7 @@ venue_value = FOOD_PRICE_EXOTIC /obj/item/food/beef_wellington/MakeProcessable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/beef_wellington_slice, 3, 30, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/beef_wellington_slice, 3, 3 SECONDS, table_required = TRUE) /obj/item/food/beef_wellington_slice name = "beef wellington slice" diff --git a/code/game/objects/items/food/misc.dm b/code/game/objects/items/food/misc.dm index 0c9a29c2f6e775..c0dc6cc2502608 100644 --- a/code/game/objects/items/food/misc.dm +++ b/code/game/objects/items/food/misc.dm @@ -1,63 +1,5 @@ ////////////////////////////////////////////OTHER//////////////////////////////////////////// - -/** - * # Abstract cheese class - * - * Everything that is a subclass of this counts as cheese for regal rats. - */ -/obj/item/food/cheese - name = "the concept of cheese" - desc = "This probably shouldn't exist." - tastes = list("cheese" = 1) - foodtypes = DAIRY - /// used to determine how much health rats/regal rats recover when they eat it. - var/rat_heal = 0 - -/obj/item/food/cheese/wedge - name = "cheese wedge" - desc = "A wedge of delicious Cheddar. The cheese wheel it was cut from can't have gone far." - icon_state = "cheesewedge" - food_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/protein = 1, /datum/reagent/consumable/nutriment/vitamin = 1) - w_class = WEIGHT_CLASS_SMALL - rat_heal = 10 - -/obj/item/food/cheese/wheel - name = "cheese wheel" - desc = "A big wheel of delcious Cheddar." - icon_state = "cheesewheel" - food_reagents = list(/datum/reagent/consumable/nutriment = 10, /datum/reagent/consumable/nutriment/protein = 5, /datum/reagent/consumable/nutriment/vitamin = 5) //Hard cheeses contain about 25% protein - w_class = WEIGHT_CLASS_NORMAL - rat_heal = 35 - -/obj/item/food/cheese/wheel/Initialize(mapload) - . = ..() - AddComponent(/datum/component/food_storage) - -/obj/item/food/cheese/wheel/MakeProcessable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cheese/wedge, 5, 30, table_required = TRUE) - -/obj/item/food/cheese/wheel/MakeBakeable() - AddComponent(/datum/component/bakeable, /obj/item/food/baked_cheese, rand(20 SECONDS, 25 SECONDS), TRUE, TRUE) - -/obj/item/food/cheese/royal - name = "royal cheese" - desc = "Ascend the throne. Consume the wheel. Feel the POWER." - icon_state = "royalcheese" - food_reagents = list(/datum/reagent/consumable/nutriment = 15, /datum/reagent/consumable/nutriment/vitamin = 5, /datum/reagent/gold = 20, /datum/reagent/toxin/mutagen = 5) - w_class = WEIGHT_CLASS_BULKY - tastes = list("cheese" = 4, "royalty" = 1) - rat_heal = 70 - -/obj/item/food/cheese/Initialize(mapload) - . = ..() - RegisterSignal(src, COMSIG_RAT_INTERACT, .proc/on_rat_eat) - -/obj/item/food/cheese/proc/on_rat_eat(datum/source, mob/living/simple_animal/hostile/regalrat/king) - SIGNAL_HANDLER - - king.cheese_heal(src, rat_heal, span_green("You eat [src], restoring some health.")) - /obj/item/food/watermelonslice name = "watermelon slice" desc = "A slice of watery goodness." @@ -802,75 +744,6 @@ playsound(loc, 'sound/items/eatfood.ogg', rand(30, 50), TRUE) qdel(src) -//Curd cheese, a general term which I will now proceed to stretch as thin as the toppings on a supermarket sandwich: -//I'll use it as a substitute for ricotta, cottage cheese and quark, as well as any other non-aged, soft grainy cheese -/obj/item/food/curd_cheese - name = "curd cheese" - desc = "Known by many names throughout human cuisine, curd cheese is useful for a wide variety of dishes." - icon_state = "curd_cheese" - microwaved_type = /obj/item/food/cheese_curds - food_reagents = list(/datum/reagent/consumable/nutriment/protein = 3, /datum/reagent/consumable/cream = 1) - tastes = list("cream" = 1, "cheese" = 1) - foodtypes = DAIRY - w_class = WEIGHT_CLASS_SMALL - -/obj/item/food/cheese_curds - name = "cheese curds" - desc = "Not to be mistaken for curd cheese. Tasty deep fried." - icon_state = "cheese_curds" - food_reagents = list(/datum/reagent/consumable/nutriment/protein = 3) - tastes = list("cheese" = 1) - foodtypes = DAIRY - w_class = WEIGHT_CLASS_SMALL - -/obj/item/food/cheese_curds/Initialize(mapload) - . = ..() - AddElement(/datum/element/dryable, /obj/item/food/firm_cheese) - -/obj/item/food/firm_cheese - name = "firm cheese" - desc = "Firm aged cheese, similar in texture to firm tofu. Due to its lack of moisture it's particularly useful for cooking with, as it doesn't melt easily." - icon_state = "firm_cheese" - food_reagents = list(/datum/reagent/consumable/nutriment/protein = 3) - tastes = list("aged cheese" = 1) - foodtypes = DAIRY | VEGETABLES - w_class = WEIGHT_CLASS_SMALL - -/obj/item/food/firm_cheese/MakeProcessable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/firm_cheese_slice, 3, 30) - -/obj/item/food/firm_cheese_slice - name = "firm cheese slice" - desc = "A slice of firm cheese. Perfect for grilling or making into delicious pesto." - icon_state = "firm_cheese_slice" - food_reagents = list(/datum/reagent/consumable/nutriment/protein = 3) - tastes = list("aged cheese" = 1) - foodtypes = DAIRY | VEGETABLES - w_class = WEIGHT_CLASS_SMALL - burns_on_grill = TRUE - -/obj/item/food/firm_cheese_slice/MakeGrillable() - AddComponent(/datum/component/grillable, /obj/item/food/grilled_cheese, rand(25 SECONDS, 35 SECONDS), TRUE, TRUE) - -/obj/item/food/mozzarella - name = "mozzarella cheese" - desc = "Delicious, creamy, and cheesy, all in one simple package." - icon_state = "mozzarella" - food_reagents = list(/datum/reagent/consumable/nutriment/protein = 3) - tastes = list("mozzarella" = 1) - foodtypes = DAIRY - w_class = WEIGHT_CLASS_SMALL - -/obj/item/food/griddle_toast - name = "griddle toast" - desc = "Thick cut bread, griddled to perfection." - icon_state = "griddle_toast" - food_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 3) - tastes = list("toast" = 1) - foodtypes = GRAIN - w_class = WEIGHT_CLASS_SMALL - burns_on_grill = TRUE - /obj/item/food/pesto name = "pesto" desc = "A combination of firm cheese, salt, herbs, garlic, oil, and pine nuts. Frequently used as a sauce for pasta or pizza, or eaten on bread." @@ -984,9 +857,13 @@ /obj/item/food/seaweedsheet name = "seaweed sheet" - desc = "A dried sheet of seaweed used for making sushi." + desc = "A dried sheet of seaweed used for making sushi. Use an ingredient on it to start making custom sushi!" icon_state = "seaweedsheet" food_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1) tastes = list("seaweed" = 1) foodtypes = VEGETABLES w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/seaweedsheet/Initialize(mapload) + . = ..() + AddComponent(/datum/component/customizable_reagent_holder, /obj/item/food/sushi/empty, CUSTOM_INGREDIENT_ICON_FILL, max_ingredients = 6) diff --git a/code/game/objects/items/food/moth.dm b/code/game/objects/items/food/moth.dm index 62333c97888da3..a0ab174238051a 100644 --- a/code/game/objects/items/food/moth.dm +++ b/code/game/objects/items/food/moth.dm @@ -8,7 +8,7 @@ desc = "As a staple of mothic cuisine, cheese is often augmented with various flavours to keep variety in their diet. Herbs are one such addition, and are particularly beloved." icon = 'icons/obj/food/moth.dmi' icon_state = "herby_cheese" - food_reagents = list(/datum/reagent/consumable/nutriment/protein = 3) + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 6) tastes = list("cheese" = 1, "herbs" = 1) foodtypes = DAIRY | VEGETABLES w_class = WEIGHT_CLASS_SMALL @@ -18,7 +18,7 @@ desc = "As prescribed by Lord Alton, blessed be his name, 99.997% of the world's recipes for grilled cheese flat out lie: never once is the cheese grilled, it is merely a griddled sandwich containing melted cheese. This, on the other hand, is truly grilled cheese, grillmarks and all." icon = 'icons/obj/food/moth.dmi' icon_state = "grilled_cheese" - food_reagents = list(/datum/reagent/consumable/nutriment/protein = 5, /datum/reagent/consumable/char = 1) + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 8, /datum/reagent/consumable/char = 1) tastes = list("cheese" = 1, "char" = 1) foodtypes = DAIRY w_class = WEIGHT_CLASS_SMALL @@ -28,7 +28,7 @@ desc = "A basic salad of cabbage, red onion and tomato. Can serve as a perfect base for a million different salads." icon = 'icons/obj/food/moth.dmi' icon_state = "mothic_salad" - food_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 5) + food_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 6) tastes = list("salad" = 1) foodtypes = VEGETABLES w_class = WEIGHT_CLASS_SMALL @@ -38,7 +38,7 @@ desc = "While they're far from filling, toasted seeds are a popular snack amongst the moths. Salt, sugar, or even some more exotic flavours may be added for some extra pep." icon = 'icons/obj/food/moth.dmi' icon_state = "toasted_seeds" - food_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 1) + food_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 5) tastes = list("seeds" = 1) foodtypes = GRAIN w_class = WEIGHT_CLASS_SMALL @@ -48,7 +48,7 @@ desc = "A common snack for engineers on the mothic fleet, made of seeds, nuts, chocolate, popcorn, and potato chips- designed to be dense with calories and easy to snack on when an extra boost is needed." icon = 'icons/obj/food/moth.dmi' icon_state = "engine_fodder" - food_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 2, /datum/reagent/consumable/sugar = 3, /datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/salt = 1) + food_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 6, /datum/reagent/consumable/sugar = 4, /datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/salt = 2) tastes = list("seeds" = 1, "nuts" = 1, "chocolate" = 1, "salt" = 1, "popcorn" = 1, "potato" = 1) foodtypes = GRAIN | NUTS | VEGETABLES | SUGAR w_class = WEIGHT_CLASS_SMALL @@ -58,7 +58,7 @@ desc = "A strong, glutenous dough, made with cornmeal and flour, designed to hold up to cheese and sauce." icon = 'icons/obj/food/moth.dmi' icon_state = "mothic_pizza_dough" - food_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 3) + food_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 6) tastes = list("raw flour" = 1) foodtypes = GRAIN w_class = WEIGHT_CLASS_SMALL @@ -69,7 +69,7 @@ desc = "A mothic classic made with cheese curds and tofu (amongst other things). Translated literally the name means 'squeaking stir fry', a name given due to the distinctive squeak of the proteins." icon = 'icons/obj/food/moth.dmi' icon_state = "squeaking_stir_fry" - food_reagents = list(/datum/reagent/consumable/nutriment/protein = 5, /datum/reagent/consumable/nutriment/vitamin = 3) + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 8, /datum/reagent/consumable/nutriment/vitamin = 6) tastes = list("cheese" = 1, "tofu" = 1, "veggies" = 1) foodtypes = DAIRY | VEGETABLES w_class = WEIGHT_CLASS_SMALL @@ -79,7 +79,7 @@ desc = "Grilled cheese and salad in a cabbage wrap, topped with delicious sweet chili sauce." icon = 'icons/obj/food/moth.dmi' icon_state = "sweet_chili_cabbage_wrap" - food_reagents = list(/datum/reagent/consumable/nutriment/protein = 3, /datum/reagent/consumable/nutriment/vitamin = 4, /datum/reagent/consumable/capsaicin = 1) + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 8, /datum/reagent/consumable/nutriment/vitamin = 8, /datum/reagent/consumable/capsaicin = 1) tastes = list("cheese" = 1, "salad" = 1, "sweet chili" = 1) foodtypes = DAIRY | VEGETABLES w_class = WEIGHT_CLASS_SMALL @@ -89,7 +89,7 @@ desc = "What's better than cheese curds? Deep fried cheese curds! What's better than deep fried cheese curds? Deep fried cheese curds with chili (and more cheese) on top! And what's better than that? Putting it on fries!" icon = 'icons/obj/food/moth.dmi' icon_state = "loaded_curds" - food_reagents = list(/datum/reagent/consumable/nutriment/protein = 6, /datum/reagent/consumable/nutriment/vitamin = 2, /datum/reagent/consumable/capsaicin = 1) + food_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/protein = 10, /datum/reagent/consumable/nutriment/vitamin = 4, /datum/reagent/consumable/capsaicin = 1) tastes = list("cheese" = 1, "oil" = 1, "chili" = 1, "fries" = 1) foodtypes = DAIRY | VEGETABLES w_class = WEIGHT_CLASS_SMALL @@ -99,7 +99,7 @@ desc = "A baked cheese wheel, melty and delicious." icon = 'icons/obj/food/moth.dmi' icon_state = "baked_cheese" - food_reagents = list(/datum/reagent/consumable/nutriment/protein = 6, /datum/reagent/consumable/nutriment/vitamin = 2, /datum/reagent/consumable/capsaicin = 1) + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 10, /datum/reagent/consumable/nutriment/vitamin = 5, /datum/reagent/consumable/nutriment = 5) tastes = list("cheese" = 1) foodtypes = DAIRY w_class = WEIGHT_CLASS_SMALL @@ -110,7 +110,7 @@ desc = "A baked cheese wheel: a mothic favourite for sharing. Usually served with crispy bread slices for dipping, because the only thing better than good cheese is good cheese on bread." icon = 'icons/obj/food/moth.dmi' icon_state = "baked_cheese_platter" - food_reagents = list(/datum/reagent/consumable/nutriment/protein = 6, /datum/reagent/consumable/nutriment/vitamin = 2, /datum/reagent/consumable/capsaicin = 1) + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 12, /datum/reagent/consumable/nutriment/vitamin = 6, /datum/reagent/consumable/nutriment = 8) tastes = list("cheese" = 1, "bread" = 1) foodtypes = DAIRY | GRAIN w_class = WEIGHT_CLASS_SMALL @@ -121,34 +121,34 @@ desc = "A fine lasagne made with pesto and a herby white sauce, ready to bake. Good for multiple servings." icon = 'icons/obj/food/moth.dmi' icon_state = "raw_green_lasagne" - food_reagents = list(/datum/reagent/consumable/nutriment/protein = 3, /datum/reagent/consumable/nutriment/vitamin = 5) + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 6, /datum/reagent/consumable/nutriment/vitamin = 10) tastes = list("cheese" = 1, "pesto" = 1, "pasta" = 1) foodtypes = VEGETABLES | GRAIN | NUTS w_class = WEIGHT_CLASS_NORMAL /obj/item/food/raw_green_lasagne/MakeBakeable() - AddComponent(/datum/component/bakeable, /obj/item/food/green_lasagne, rand(25 SECONDS, 45 SECONDS), TRUE, TRUE) + AddComponent(/datum/component/bakeable, /obj/item/food/green_lasagne, rand(15 SECONDS, 25 SECONDS), TRUE, TRUE) /obj/item/food/green_lasagne name = "green lasagne al forno" desc = "A fine lasagne made with pesto and a herby white sauce. Good for multiple servings." icon = 'icons/obj/food/moth.dmi' icon_state = "green_lasagne" - food_reagents = list(/datum/reagent/consumable/nutriment/protein = 12, /datum/reagent/consumable/nutriment/vitamin = 18) + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 24, /datum/reagent/consumable/nutriment/vitamin = 18) tastes = list("cheese" = 1, "pesto" = 1, "pasta" = 1) foodtypes = VEGETABLES | GRAIN | NUTS w_class = WEIGHT_CLASS_NORMAL burns_in_oven = TRUE /obj/item/food/green_lasagne/MakeProcessable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/green_lasagne_slice, 6, 30, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/green_lasagne_slice, 6, 3 SECONDS, table_required = TRUE) /obj/item/food/green_lasagne_slice name = "green lasagne al forno slice" desc = "A slice of herby, pesto-y lasagne." icon = 'icons/obj/food/moth.dmi' icon_state = "green_lasagne_slice" - food_reagents = list(/datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/nutriment/vitamin = 3) + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/consumable/nutriment/vitamin = 3) tastes = list("cheese" = 1, "pesto" = 1, "pasta" = 1) foodtypes = VEGETABLES | GRAIN | NUTS w_class = WEIGHT_CLASS_SMALL @@ -158,34 +158,34 @@ desc = "A big pan of layered potatoes topped with rice and vegetable stock, ready to be baked into a delicious sharing meal." icon = 'icons/obj/food/moth.dmi' icon_state = "raw_baked_rice" - food_reagents = list(/datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/nutriment/vitamin = 6) + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/consumable/nutriment/vitamin = 10) tastes = list("rice" = 1, "potato" = 1, "veggies" = 1) foodtypes = VEGETABLES | GRAIN w_class = WEIGHT_CLASS_NORMAL /obj/item/food/raw_baked_rice/MakeBakeable() - AddComponent(/datum/component/bakeable, /obj/item/food/big_baked_rice, rand(25 SECONDS, 45 SECONDS), TRUE, TRUE) + AddComponent(/datum/component/bakeable, /obj/item/food/big_baked_rice, rand(15 SECONDS, 25 SECONDS), TRUE, TRUE) /obj/item/food/big_baked_rice name = "big baked rice" desc = "A mothic favourite, baked rice can be filled with a variety of vegetable fillings to make a delicious meal to share. Potatoes are also often layered on the bottom of the cooking vessel to create a flavourful crust which is hotly contested amongst diners." icon = 'icons/obj/food/moth.dmi' icon_state = "big_baked_rice" - food_reagents = list(/datum/reagent/consumable/nutriment/protein = 12, /datum/reagent/consumable/nutriment/vitamin = 36) + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 18, /datum/reagent/consumable/nutriment/vitamin = 42) tastes = list("rice" = 1, "potato" = 1, "veggies" = 1) foodtypes = VEGETABLES | GRAIN w_class = WEIGHT_CLASS_NORMAL burns_in_oven = TRUE /obj/item/food/big_baked_rice/MakeProcessable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/lil_baked_rice, 6, 30, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/lil_baked_rice, 6, 3 SECONDS, table_required = TRUE) /obj/item/food/lil_baked_rice name = "lil baked rice" desc = "A single portion of baked rice, perfect as a side dish, or even as a full meal." icon = 'icons/obj/food/moth.dmi' icon_state = "lil_baked_rice" - food_reagents = list(/datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/nutriment/vitamin = 6) + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 3, /datum/reagent/consumable/nutriment/vitamin = 7) tastes = list("rice" = 1, "potato" = 1, "veggies" = 1) foodtypes = VEGETABLES | GRAIN w_class = WEIGHT_CLASS_SMALL @@ -195,7 +195,7 @@ desc = "A cob of corn, baked in the roasting heat of an oven until it blisters and blackens. Beloved as a quick yet flavourful and filling component for dishes on the Fleet." icon = 'icons/obj/food/moth.dmi' icon_state = "oven_baked_corn" - food_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 4, /datum/reagent/consumable/char = 1) + food_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 6, /datum/reagent/consumable/char = 1) tastes = list("corn" = 1, "char" = 1) foodtypes = VEGETABLES w_class = WEIGHT_CLASS_SMALL @@ -206,7 +206,7 @@ desc = "What's better than baked corn? Baked corn with butter!" icon = 'icons/obj/food/moth.dmi' icon_state = "buttered_baked_corn" - food_reagents = list(/datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/nutriment/vitamin = 4, /datum/reagent/consumable/char = 1) + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/consumable/nutriment/vitamin = 6, /datum/reagent/consumable/char = 1) tastes = list("corn" = 1, "char" = 1) foodtypes = VEGETABLES | DAIRY w_class = WEIGHT_CLASS_SMALL @@ -216,7 +216,7 @@ desc = "Sweet, spicy, saucy, and all kinds of corny." icon = 'icons/obj/food/moth.dmi' icon_state = "fiesta_corn_skillet" - food_reagents = list(/datum/reagent/consumable/nutriment/protein = 3, /datum/reagent/consumable/nutriment/vitamin = 7, /datum/reagent/consumable/char = 1) + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 5, /datum/reagent/consumable/nutriment/vitamin = 10, /datum/reagent/consumable/char = 1) tastes = list("corn" = 1, "chili" = 1, "char" = 1) foodtypes = VEGETABLES | DAIRY w_class = WEIGHT_CLASS_SMALL @@ -226,20 +226,20 @@ desc = "Sliced vegetables with a roasted pepper sauce. Delicious, for a peasant food." icon = 'icons/obj/food/moth.dmi' icon_state = "raw_ratatouille" - food_reagents = list(/datum/reagent/consumable/nutriment/protein = 3, /datum/reagent/consumable/nutriment/vitamin = 7, /datum/reagent/consumable/char = 1) + food_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 8, /datum/reagent/consumable/char = 1) tastes = list("veggies" = 1, "roasted peppers" = 1) foodtypes = VEGETABLES w_class = WEIGHT_CLASS_SMALL /obj/item/food/raw_ratatouille/MakeBakeable() - AddComponent(/datum/component/bakeable, /obj/item/food/ratatouille, rand(25 SECONDS, 45 SECONDS), TRUE, TRUE) + AddComponent(/datum/component/bakeable, /obj/item/food/ratatouille, rand(15 SECONDS, 25 SECONDS), TRUE, TRUE) /obj/item/food/ratatouille name = "ratatouille" desc = "The perfect dish to save your restaurant from a vindictive food critic. Bonus points if you've got a rat in your hat." icon = 'icons/obj/food/moth.dmi' icon_state = "ratatouille" - food_reagents = list(/datum/reagent/consumable/nutriment/protein = 3, /datum/reagent/consumable/nutriment/vitamin = 7, /datum/reagent/consumable/char = 1) + food_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 10, /datum/reagent/consumable/char = 1) tastes = list("veggies" = 1, "roasted peppers" = 1, "char" = 1) foodtypes = VEGETABLES w_class = WEIGHT_CLASS_SMALL @@ -250,7 +250,7 @@ desc = "Little sticks of mozzarella, breaded and fried." icon = 'icons/obj/food/moth.dmi' icon_state = "mozzarella_sticks" - food_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/protein = 3) + food_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/protein = 6) tastes = list("creamy cheese" = 1, "breading" = 1, "oil" = 1) foodtypes = DAIRY | GRAIN | FRIED w_class = WEIGHT_CLASS_SMALL @@ -260,20 +260,20 @@ desc = "A pepper with the top removed and a herby cheese and onion mix stuffed inside. Probably shouldn't be eaten raw." icon = 'icons/obj/food/moth.dmi' icon_state = "raw_stuffed_pepper" - food_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/protein = 3) + food_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/protein = 6) tastes = list("creamy cheese" = 1, "herbs" = 1, "onion" = 1, "bell pepper" = 1) foodtypes = DAIRY | VEGETABLES w_class = WEIGHT_CLASS_SMALL /obj/item/food/raw_stuffed_peppers/MakeBakeable() - AddComponent(/datum/component/bakeable, /obj/item/food/stuffed_peppers, rand(15 SECONDS, 35 SECONDS), TRUE, TRUE) + AddComponent(/datum/component/bakeable, /obj/item/food/stuffed_peppers, rand(10 SECONDS, 20 SECONDS), TRUE, TRUE) /obj/item/food/stuffed_peppers name = "voltölpaprik" desc = "A soft yet still crisp bell pepper, with a wonderful melty cheesy interior." icon = 'icons/obj/food/moth.dmi' icon_state = "stuffed_pepper" - food_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/protein = 3) + food_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/protein = 8) tastes = list("creamy cheese" = 1, "herbs" = 1, "onion" = 1, "bell pepper" = 1) foodtypes = DAIRY | VEGETABLES w_class = WEIGHT_CLASS_SMALL @@ -284,7 +284,7 @@ desc = "A dish made from fried vegetables, popular amongst fueljacks- the brave moths who operate the fuel skimmers to keep the fleet running. Given the constant need for fuel, and the limited windows in which the stars align for harvesting (literally), they'll often take packed meals to save on trips to the mess, which they heat using the fresh canisters." icon = 'icons/obj/food/moth.dmi' icon_state = "fueljacks_lunch" - food_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/protein = 3) + food_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/consumable/nutriment/protein = 8) tastes = list("cabbage" = 1, "potato" = 1, "onion" = 1, "chili" = 1, "cheese" = 1) foodtypes = DAIRY | VEGETABLES w_class = WEIGHT_CLASS_SMALL @@ -294,7 +294,7 @@ desc = "Fried balls of macaroni cheese dipped in corn batter, served with tomato sauce. A popular snack across the galaxy, and especially on the Mothic Fleet- where they tend to use Ready-Donk as the base." icon = 'icons/obj/food/moth.dmi' icon_state = "mac_balls" - food_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/protein = 3) + food_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/protein = 10) tastes = list("pasta" = 1, "cornbread" = 1, "cheese" = 1) foodtypes = DAIRY | VEGETABLES | FRIED | GRAIN w_class = WEIGHT_CLASS_SMALL @@ -335,7 +335,7 @@ desc = "A soup made from raw cotton in a flavourful vegetable broth. Enjoyed only by moths and the criminally tasteless." icon = 'icons/obj/food/moth.dmi' icon_state = "moth_cotton_soup" - food_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 3) + food_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 12, /datum/reagent/water = 5) tastes = list("cotton" = 1, "broth" = 1) foodtypes = VEGETABLES | CLOTH w_class = WEIGHT_CLASS_SMALL @@ -345,7 +345,7 @@ desc = "A simple and filling soup made from homemade cheese and sweet potato. The curds provide texture while the whey provides volume- and they both provide deliciousness!" icon = 'icons/obj/food/moth.dmi' icon_state = "moth_cheese_soup" - food_reagents = list(/datum/reagent/consumable/nutriment/protein = 5, /datum/reagent/consumable/salt = 1) + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 12, /datum/reagent/consumable/nutriment/vitamin = 4, /datum/reagent/consumable/nutriment = 4) tastes = list("cheese" = 1, "cream" = 1, "sweet potato" = 1) foodtypes = DAIRY | GRAIN w_class = WEIGHT_CLASS_SMALL @@ -355,7 +355,7 @@ desc = "A seed based soup, made by germinating seeds and then boiling them. Produces a particularly bitter broth which is usually balanced by the addition of vinegar." icon = 'icons/obj/food/moth.dmi' icon_state = "moth_seed_soup" - food_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 6) + food_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 12, /datum/reagent/consumable/nutriment = 6, /datum/reagent/water = 5) tastes = list("bitterness" = 1, "sourness" = 1) foodtypes = VEGETABLES w_class = WEIGHT_CLASS_SMALL @@ -364,7 +364,7 @@ name = "chili sin carne" desc = "For the hombres who don't want carne." icon_state = "hotchili" - food_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/consumable/capsaicin = 3, /datum/reagent/consumable/tomatojuice = 4, /datum/reagent/consumable/nutriment/vitamin = 4) + food_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/consumable/capsaicin = 3, /datum/reagent/consumable/tomatojuice = 4, /datum/reagent/consumable/nutriment/vitamin = 6) tastes = list("bitterness" = 1, "sourness" = 1) foodtypes = VEGETABLES w_class = WEIGHT_CLASS_SMALL @@ -374,7 +374,7 @@ desc = "A spicy bean stew with lots of veggies, commonly served aboard the fleet as a filling and satisfying meal with rice or bread." icon = 'icons/obj/food/moth.dmi' icon_state = "moth_bean_stew" - food_reagents = list(/datum/reagent/consumable/nutriment/protein = 3, /datum/reagent/consumable/nutriment/vitamin = 7, /datum/reagent/consumable/char = 1) + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 6, /datum/reagent/consumable/nutriment/vitamin = 14, /datum/reagent/consumable/nutriment = 4) tastes = list("beans" = 1, "cabbage" = 1, "spicy sauce" = 1) foodtypes = VEGETABLES w_class = WEIGHT_CLASS_SMALL @@ -384,7 +384,7 @@ desc = "A hearty oat stew, prepared with oats, sweet potatoes, and various winter vegetables." icon = 'icons/obj/food/moth.dmi' icon_state = "moth_oat_stew" - food_reagents = list(/datum/reagent/consumable/nutriment/protein = 3, /datum/reagent/consumable/nutriment/vitamin = 7, /datum/reagent/consumable/char = 1) + food_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 14, /datum/reagent/consumable/nutriment = 8) tastes = list("oats" = 1, "sweet potato" = 1, "carrot" = 1, "parsnip" = 1, "pumpkin" = 1) foodtypes = VEGETABLES | GRAIN w_class = WEIGHT_CLASS_SMALL @@ -394,7 +394,7 @@ desc = "Tömpröttkrakklmæsch, or heartburn soup, is a cold soup dish that originated amongst the jungle moths, and is named for two things- its rosy pink colour, and its scorchingly hot chilli heat." icon = 'icons/obj/food/moth.dmi' icon_state = "moth_fire_soup" - food_reagents = list(/datum/reagent/consumable/nutriment/protein = 3, /datum/reagent/consumable/nutriment/vitamin = 5) + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 10, /datum/reagent/consumable/nutriment/vitamin = 10) tastes = list("love" = 1, "hate" = 1) foodtypes = VEGETABLES | DAIRY w_class = WEIGHT_CLASS_SMALL @@ -404,7 +404,7 @@ desc = "A plate of rice porridge. It's mostly flavourless, but it does fill a spot. To the Chinese it's congee, and moths call it höllflöfmisklsløsk." //höllflöfmiskl = rice (höllflöf = cloud, miskl = seed), sløsk = porridge icon = 'icons/obj/food/moth.dmi' icon_state = "rice_porridge" - food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 5) + food_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 8) tastes = list("nothing" = 1) foodtypes = GRAIN w_class = WEIGHT_CLASS_SMALL @@ -414,7 +414,7 @@ desc = "Nobody is quite sure why this smiley bowl of rice porridge with eggs and bacon is named after a mythological Chinese figure- it's just sorta what it's always been called." icon = 'icons/obj/food/moth.dmi' icon_state = "hua_mulan_congee" - food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 5, /datum/reagent/consumable/nutriment/protein = 5) + food_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 10, /datum/reagent/consumable/nutriment/protein = 6) tastes = list("bacon" = 1, "eggs" = 1) foodtypes = MEAT | GRAIN w_class = WEIGHT_CLASS_SMALL @@ -424,7 +424,7 @@ desc = "Commonly served aboard the mothic fleet, rice porridge with töchtaüse syrup is more palatable than the regular stuff, if even just because it's spicier than normal." icon = 'icons/obj/food/moth.dmi' icon_state = "toechtauese_rice_porridge" - food_reagents = list(/datum/reagent/consumable/nutriment/protein = 3, /datum/reagent/consumable/nutriment/vitamin = 5) + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 6, /datum/reagent/consumable/nutriment/vitamin = 12) tastes = list("sugar" = 1, "spice" = 1) foodtypes = GRAIN | VEGETABLES w_class = WEIGHT_CLASS_SMALL @@ -434,7 +434,7 @@ desc = "A plate of cornmeal porridge. It's more flavourful than most porridges, and makes a good base for other flavours, too." icon = 'icons/obj/food/moth.dmi' icon_state = "cornmeal_porridge" - food_reagents = list(/datum/reagent/consumable/nutriment/protein = 3, /datum/reagent/consumable/nutriment/vitamin = 5) + food_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/consumable/nutriment/vitamin = 4) tastes = list("cornmeal" = 1) foodtypes = GRAIN w_class = WEIGHT_CLASS_SMALL @@ -444,7 +444,7 @@ desc = "A rich and creamy bowl of cheesy cornmeal porridge." icon = 'icons/obj/food/moth.dmi' icon_state = "cheesy_porridge" - food_reagents = list(/datum/reagent/consumable/nutriment/protein = 3, /datum/reagent/consumable/nutriment/vitamin = 5) + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 8, /datum/reagent/consumable/nutriment/vitamin = 4, /datum/reagent/consumable/nutriment = 8) tastes = list("cornmeal" = 1, "cheese" = 1, "more cheese" = 1, "lots of cheese" = 1) foodtypes = DAIRY | GRAIN w_class = WEIGHT_CLASS_SMALL @@ -454,7 +454,7 @@ desc = "Polenta loaded with cheese, served with a few discs of fried eggplant and some tomato sauce. Lække!" icon = 'icons/obj/food/moth.dmi' icon_state = "fried_eggplant_polenta" - food_reagents = list(/datum/reagent/consumable/nutriment/protein = 3, /datum/reagent/consumable/nutriment/vitamin = 5) + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 12, /datum/reagent/consumable/nutriment/vitamin = 6, /datum/reagent/consumable/nutriment = 10) tastes = list("cornmeal" = 1, "cheese" = 1, "eggplant" = 1, "tomato sauce" = 1) foodtypes = DAIRY | GRAIN w_class = WEIGHT_CLASS_SMALL @@ -465,7 +465,7 @@ desc = "While it's far from an original creation of the moths, caprese salad has become a favourite aboard the Fleet due to how simple it is to prepare yet how tasty it is. To the moths it's known as zaileskenknusksolt: two tone salad, in GalCom." //zail = two, esken = colour/tone, knuskolt = salad icon = 'icons/obj/food/moth.dmi' icon_state = "caprese_salad" - food_reagents = list(/datum/reagent/consumable/nutriment/protein = 3, /datum/reagent/consumable/nutriment/vitamin = 2) + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 6, /datum/reagent/consumable/nutriment/vitamin = 8) tastes = list("mozzarella" = 1, "tomato" = 1, "balsamic" = 1) foodtypes = DAIRY | VEGETABLES w_class = WEIGHT_CLASS_SMALL @@ -475,7 +475,7 @@ desc = "Lörtonknusksolt, or Fleet Salad in GalCom, is commonly seen at the snack bars and canteens aboard the Fleet. The grilled cheese makes it particularly filling, while the croutons provide a crunchy kick." icon = 'icons/obj/food/moth.dmi' icon_state = "fleet_salad" - food_reagents = list(/datum/reagent/consumable/nutriment/protein = 3, /datum/reagent/consumable/nutriment/vitamin = 5) + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 10, /datum/reagent/consumable/nutriment/vitamin = 12) tastes = list("cheese" = 1, "salad" = 1, "bread" = 1) foodtypes = DAIRY | VEGETABLES | GRAIN w_class = WEIGHT_CLASS_SMALL @@ -485,7 +485,7 @@ desc = "A salad with added cotton and a basic dressing. Presumably either moths are around, or the South's risen again." icon = 'icons/obj/food/moth.dmi' icon_state = "cotton_salad" - food_reagents = list(/datum/reagent/consumable/nutriment/protein = 3, /datum/reagent/consumable/nutriment/vitamin = 5) + food_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/consumable/nutriment/vitamin = 14) tastes = list("cheese" = 1, "salad" = 1, "bread" = 1) foodtypes = VEGETABLES | CLOTH w_class = WEIGHT_CLASS_SMALL @@ -495,7 +495,7 @@ desc = "Originally a Kenyan recipe, kachumbari is yet another cross-cultural favourite from humanity that has been adopted by the moths- though some ingredients have been necessarily changed." icon = 'icons/obj/food/moth.dmi' icon_state = "moth_kachumbari" - food_reagents = list(/datum/reagent/consumable/nutriment/protein = 3, /datum/reagent/consumable/nutriment/vitamin = 5) + food_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 18) tastes = list("onion" = 1, "tomato" = 1, "corn" = 1, "chili" = 1, "cilantro" = 1) foodtypes = VEGETABLES w_class = WEIGHT_CLASS_SMALL @@ -511,7 +511,7 @@ foodtypes = GRAIN | VEGETABLES | DAIRY /obj/item/food/raw_mothic_margherita/MakeBakeable() - AddComponent(/datum/component/bakeable, /obj/item/food/pizza/mothic_margherita, rand(20 SECONDS, 40 SECONDS), TRUE, TRUE) + AddComponent(/datum/component/bakeable, /obj/item/food/pizza/mothic_margherita, rand(15 SECONDS, 25 SECONDS), TRUE, TRUE) /obj/item/food/pizza/mothic_margherita name = "mothic margherita pizza" @@ -542,7 +542,7 @@ foodtypes = GRAIN | VEGETABLES | DAIRY /obj/item/food/raw_mothic_firecracker/MakeBakeable() - AddComponent(/datum/component/bakeable, /obj/item/food/pizza/mothic_firecracker, rand(20 SECONDS, 40 SECONDS), TRUE, TRUE) + AddComponent(/datum/component/bakeable, /obj/item/food/pizza/mothic_firecracker, rand(15 SECONDS, 25 SECONDS), TRUE, TRUE) /obj/item/food/pizza/mothic_firecracker name = "mothic firecracker pizza" @@ -573,7 +573,7 @@ foodtypes = GRAIN | VEGETABLES | DAIRY /obj/item/food/raw_mothic_five_cheese/MakeBakeable() - AddComponent(/datum/component/bakeable, /obj/item/food/pizza/mothic_five_cheese, rand(20 SECONDS, 40 SECONDS), TRUE, TRUE) + AddComponent(/datum/component/bakeable, /obj/item/food/pizza/mothic_five_cheese, rand(15 SECONDS, 25 SECONDS), TRUE, TRUE) /obj/item/food/pizza/mothic_five_cheese name = "mothic five-cheese pizza" @@ -604,7 +604,7 @@ foodtypes = GRAIN | VEGETABLES | DAIRY /obj/item/food/raw_mothic_white_pie/MakeBakeable() - AddComponent(/datum/component/bakeable, /obj/item/food/pizza/mothic_white_pie, rand(20 SECONDS, 40 SECONDS), TRUE, TRUE) + AddComponent(/datum/component/bakeable, /obj/item/food/pizza/mothic_white_pie, rand(15 SECONDS, 25 SECONDS), TRUE, TRUE) /obj/item/food/pizza/mothic_white_pie name = "mothic white-pie pizza" @@ -635,7 +635,7 @@ foodtypes = GRAIN | VEGETABLES | DAIRY | NUTS /obj/item/food/raw_mothic_pesto/MakeBakeable() - AddComponent(/datum/component/bakeable, /obj/item/food/pizza/mothic_pesto, rand(20 SECONDS, 40 SECONDS), TRUE, TRUE) + AddComponent(/datum/component/bakeable, /obj/item/food/pizza/mothic_pesto, rand(15 SECONDS, 25 SECONDS), TRUE, TRUE) /obj/item/food/pizza/mothic_pesto name = "mothic pesto pizza" @@ -666,7 +666,7 @@ foodtypes = GRAIN | VEGETABLES /obj/item/food/raw_mothic_garlic/MakeBakeable() - AddComponent(/datum/component/bakeable, /obj/item/food/pizza/mothic_garlic, rand(20 SECONDS, 40 SECONDS), TRUE, TRUE) + AddComponent(/datum/component/bakeable, /obj/item/food/pizza/mothic_garlic, rand(15 SECONDS, 25 SECONDS), TRUE, TRUE) /obj/item/food/pizza/mothic_garlic name = "mothic garlic pizzabread" @@ -676,7 +676,7 @@ food_reagents = list(/datum/reagent/consumable/nutriment = 25, /datum/reagent/consumable/nutriment/protein = 8, /datum/reagent/consumable/tomatojuice = 6, /datum/reagent/consumable/nutriment/vitamin = 5) tastes = list("crust" = 1, "garlic" = 1, "butter" = 1) foodtypes = GRAIN | VEGETABLES | DAIRY | NUTS - slice_type = /obj/item/food/pizzaslice/mothic_pesto + slice_type = /obj/item/food/pizzaslice/mothic_garlic boxtag = "Garlic Bread alla Moffuchi" /obj/item/food/pizzaslice/mothic_garlic @@ -693,13 +693,13 @@ desc = "Some good down-home country-style, rootin'-tootin', revolver-shootin', dad-gum yeehaw cornbread." icon = 'icons/obj/food/moth.dmi' icon_state = "cornbread" - food_reagents = list(/datum/reagent/consumable/nutriment = 10) + food_reagents = list(/datum/reagent/consumable/nutriment = 18) tastes = list("cornbread" = 10) foodtypes = GRAIN w_class = WEIGHT_CLASS_SMALL /obj/item/food/bread/corn/MakeProcessable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/breadslice/corn, 6, 20) + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/breadslice/corn, 6) /obj/item/food/breadslice/corn name = "cornbread slice" @@ -707,7 +707,7 @@ icon = 'icons/obj/food/moth.dmi' icon_state = "cornbread_slice" foodtypes = GRAIN - food_reagents = list(/datum/reagent/consumable/nutriment = 2) + food_reagents = list(/datum/reagent/consumable/nutriment = 3) //Sweets /obj/item/food/moth_cheese_cakes @@ -715,7 +715,7 @@ desc = "Ælorölen (cheese balls) are a traditional mothic dessert, made of soft cheese, powdered sugar and flour, rolled into balls, battered and then deep fried. They're often served with either chocolate sauce or honey, or sometimes both!" icon = 'icons/obj/food/moth.dmi' icon_state = "moth_cheese_cakes" - food_reagents = list(/datum/reagent/consumable/nutriment/protein = 5, /datum/reagent/consumable/sugar = 5) + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 8, /datum/reagent/consumable/sugar = 12) tastes = list("cheesecake" = 1, "chocolate" = 1, "honey" = 1) foodtypes = SUGAR | FRIED | DAIRY | GRAIN w_class = WEIGHT_CLASS_SMALL @@ -725,19 +725,19 @@ desc = "A light and fluffy vegan marshmallow flavoured with vanilla and rum and topped with soft chocolate. These are known to the moths as höllflöfstarkken: cloud squares." //höllflöf = cloud (höll = wind, flöf = cotton), starkken = squares icon = 'icons/obj/food/moth.dmi' icon_state = "mothmallow_tray" - food_reagents = list(/datum/reagent/consumable/nutriment = 15, /datum/reagent/consumable/sugar = 10) + food_reagents = list(/datum/reagent/consumable/nutriment = 20, /datum/reagent/consumable/sugar = 20) tastes = list("vanilla" = 1, "clouds" = 1, "chocolate" = 1) foodtypes = VEGETABLES | SUGAR /obj/item/food/cake/mothmallow/MakeProcessable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/mothmallow, 6, 20) + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/mothmallow, 6) /obj/item/food/cakeslice/mothmallow name = "mothmallow" desc = "Fluffy little clouds of joy- in a strangely moth-like colour." icon = 'icons/obj/food/moth.dmi' icon_state = "mothmallow_slice" - food_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/sugar = 2) + food_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/sugar = 4) tastes = list("vanilla" = 1, "clouds" = 1, "chocolate" = 1) foodtypes = VEGETABLES | SUGAR @@ -746,7 +746,7 @@ desc = "Red porridge with yoghurt. The name and vegetable ingredients obscure the sweet nature of the dish, which is commonly served as a dessert aboard the fleet." icon = 'icons/obj/food/moth.dmi' icon_state = "red_porridge" - food_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 4, /datum/reagent/consumable/sugar = 6) + food_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 8, /datum/reagent/consumable/nutriment/protein = 8, /datum/reagent/consumable/sugar = 8) tastes = list("sweet beets" = 1, "sugar" = 1, "sweetened yoghurt" = 1) foodtypes = VEGETABLES | SUGAR | DAIRY diff --git a/code/game/objects/items/food/pie.dm b/code/game/objects/items/food/pie.dm index d656e123e09880..0fd45a29f9070d 100644 --- a/code/game/objects/items/food/pie.dm +++ b/code/game/objects/items/food/pie.dm @@ -51,7 +51,7 @@ if(isliving(hit_atom)) var/mob/living/living_target_getting_hit = hit_atom if(stunning) - living_target_getting_hit.Paralyze(20) //splat! + living_target_getting_hit.Paralyze(2 SECONDS) //splat! living_target_getting_hit.adjust_blurriness(1) living_target_getting_hit.visible_message(span_warning("[living_target_getting_hit] is creamed by [src]!"), span_userdanger("You've been creamed by [src]!")) playsound(living_target_getting_hit, SFX_DESECRATION, 50, TRUE) @@ -154,7 +154,7 @@ foodtypes = GRAIN | VEGETABLES | SUGAR /obj/item/food/pie/pumpkinpie/MakeProcessable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/pieslice/pumpkin, 5, 20, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/pieslice/pumpkin, 5, table_required = TRUE) /obj/item/food/pieslice/pumpkin name = "pumpkin pie slice" @@ -213,7 +213,7 @@ foodtypes = GRAIN | VEGETABLES /obj/item/food/pie/blumpkinpie/MakeProcessable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/pieslice/blumpkin, 5, 20, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/pieslice/blumpkin, 5, table_required = TRUE) /obj/item/food/pieslice/blumpkin name = "blumpkin pie slice" @@ -233,7 +233,7 @@ venue_value = FOOD_PRICE_EXOTIC /obj/item/food/pie/dulcedebatata/MakeProcessable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/pieslice/dulcedebatata, 5, 20, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/pieslice/dulcedebatata, 5, table_required = TRUE) /obj/item/food/pieslice/dulcedebatata name = "dulce de batata slice" @@ -286,4 +286,4 @@ foodtypes = GRAIN | DAIRY | SUGAR /obj/item/food/pie/frenchsilkpie/MakeProcessable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/pieslice/frenchsilk, 5, 20) + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/pieslice/frenchsilk, 5) diff --git a/code/game/objects/items/food/pizza.dm b/code/game/objects/items/food/pizza.dm index 75462e1d02c818..a5179d69fd3d7f 100644 --- a/code/game/objects/items/food/pizza.dm +++ b/code/game/objects/items/food/pizza.dm @@ -23,9 +23,9 @@ /obj/item/food/pizza/MakeProcessable() if (slice_type) - AddElement(/datum/element/processable, TOOL_KNIFE, slice_type, 6, 30, table_required = TRUE) - AddElement(/datum/element/processable, TOOL_SAW, slice_type, 6, 45, table_required = TRUE) - AddElement(/datum/element/processable, TOOL_SCALPEL, slice_type, 6, 60, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_KNIFE, slice_type, 6, 3 SECONDS, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_SAW, slice_type, 6, 4.5 SECONDS, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_SCALPEL, slice_type, 6, 6 SECONDS, table_required = TRUE) // Pizza Slice /obj/item/food/pizzaslice @@ -36,7 +36,7 @@ decomp_type = /obj/item/food/pizzaslice/moldy /obj/item/food/pizzaslice/MakeProcessable() - AddElement(/datum/element/processable, TOOL_ROLLINGPIN, /obj/item/stack/sheet/pizza, 1, 10, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_ROLLINGPIN, /obj/item/stack/sheet/pizza, 1, 1 SECONDS, table_required = TRUE) /obj/item/food/pizza/margherita @@ -356,19 +356,10 @@ . = ..() // Ant Pizza, now with more ants. -/obj/item/food/pizza/ants - name = "\improper Ant Party pizza" - desc = "/// Filled with bugs, remember to fix" - icon_state = "antpizza" - food_reagents = list(/datum/reagent/consumable/nutriment = 20, /datum/reagent/ants = 25, /datum/reagent/consumable/tomatojuice = 10, /datum/reagent/consumable/nutriment/vitamin = 4, /datum/reagent/consumable/nutriment/protein = 2) - tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "insects" = 1) - foodtypes = GRAIN | VEGETABLES | DAIRY | BUGS - slice_type = /obj/item/food/pizzaslice/ants - boxtag = "Anthill Deluxe" - /obj/item/food/pizzaslice/ants name = "\improper Ant Party pizza slice" desc = "The key to a perfect slice of pizza is not to overdo it with the ants." icon_state = "antpizzaslice" + food_reagents = list(/datum/reagent/ants = 5, /datum/reagent/consumable/nutriment/protein = 2) tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "insects" = 1) foodtypes = GRAIN | VEGETABLES | DAIRY | BUGS diff --git a/code/game/objects/items/food/sandwichtoast.dm b/code/game/objects/items/food/sandwichtoast.dm index 253d277c42654e..24fe4831145e35 100644 --- a/code/game/objects/items/food/sandwichtoast.dm +++ b/code/game/objects/items/food/sandwichtoast.dm @@ -66,6 +66,30 @@ food_flags = FOOD_FINGER_FOOD w_class = WEIGHT_CLASS_SMALL +/obj/item/food/griddle_toast + name = "griddle toast" + desc = "Thick cut bread, griddled to perfection." + icon = 'icons/obj/food/burgerbread.dmi' + icon_state = "griddle_toast" + food_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 3) + tastes = list("toast" = 1) + foodtypes = GRAIN + w_class = WEIGHT_CLASS_SMALL + burns_on_grill = TRUE + slot_flags = ITEM_SLOT_MASK + +/obj/item/food/butteredtoast + name = "buttered toast" + desc = "Butter lightly spread over a piece of toast." + icon = 'icons/obj/food/burgerbread.dmi' + icon_state = "butteredtoast" + bite_consumption = 3 + food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 1) + tastes = list("butter" = 1, "toast" = 1) + foodtypes = GRAIN | BREAKFAST + food_flags = FOOD_FINGER_FOOD + w_class = WEIGHT_CLASS_SMALL + /obj/item/food/jelliedtoast name = "jellied toast" desc = "A slice of toast covered with delicious jam." @@ -85,18 +109,6 @@ food_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/toxin/slimejelly = 8, /datum/reagent/consumable/nutriment/vitamin = 4) foodtypes = GRAIN | TOXIC | SUGAR | BREAKFAST -/obj/item/food/butteredtoast - name = "buttered toast" - desc = "Butter lightly spread over a piece of toast." - icon = 'icons/obj/food/food.dmi' - icon_state = "butteredtoast" - bite_consumption = 3 - food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 1) - tastes = list("butter" = 1, "toast" = 1) - foodtypes = GRAIN | BREAKFAST - food_flags = FOOD_FINGER_FOOD - w_class = WEIGHT_CLASS_SMALL - /obj/item/food/twobread name = "two bread" desc = "This seems awfully bitter." diff --git a/code/game/objects/items/granters.dm b/code/game/objects/items/granters.dm deleted file mode 100644 index 75d506b7e75fa5..00000000000000 --- a/code/game/objects/items/granters.dm +++ /dev/null @@ -1,493 +0,0 @@ - -///books that teach things (intrinsic actions like bar flinging, spells like fireball or smoke, or martial arts)/// - -/obj/item/book/granter - due_date = 0 // Game time in deciseconds - unique = 1 // 0 Normal book, 1 Should not be treated as normal book, unable to be copied, unable to be modified - var/list/remarks = list() //things to read about while learning. - var/pages_to_mastery = 3 //Essentially controls how long a mob must keep the book in his hand to actually successfully learn - var/reading = FALSE //sanity - var/oneuse = TRUE //default this is true, but admins can var this to 0 if we wanna all have a pass around of the rod form book - var/used = FALSE //only really matters if oneuse but it might be nice to know if someone's used it for admin investigations perhaps - -/obj/item/book/granter/proc/turn_page(mob/user) - playsound(user, pick('sound/effects/pageturn1.ogg','sound/effects/pageturn2.ogg','sound/effects/pageturn3.ogg'), 30, TRUE) - if(do_after(user, 5 SECONDS, src)) - if(remarks.len) - to_chat(user, span_notice("[pick(remarks)]")) - else - to_chat(user, span_notice("You keep reading...")) - return TRUE - return FALSE - -/obj/item/book/granter/proc/recoil(mob/user) //nothing so some books can just return - -/obj/item/book/granter/proc/already_known(mob/user) - return FALSE - -/obj/item/book/granter/proc/on_reading_start(mob/user) - to_chat(user, span_notice("You start reading [name]...")) - -/obj/item/book/granter/proc/on_reading_stopped(mob/user) - to_chat(user, span_notice("You stop reading...")) - -/obj/item/book/granter/proc/on_reading_finished(mob/user) - to_chat(user, span_notice("You finish reading [name]!")) - -/obj/item/book/granter/proc/onlearned(mob/user) - used = TRUE - - -/obj/item/book/granter/attack_self(mob/user) - if(reading) - to_chat(user, span_warning("You're already reading this!")) - return FALSE - if(user.is_blind()) - to_chat(user, span_warning("You are blind and can't read anything!")) - return FALSE - if(!user.can_read(src)) - return FALSE - if(already_known(user)) - return FALSE - if(used) - if(oneuse) - recoil(user) - return FALSE - on_reading_start(user) - reading = TRUE - for(var/i in 1 to pages_to_mastery) - if(!turn_page(user)) - on_reading_stopped() - reading = FALSE - return - if(do_after(user, 5 SECONDS, src)) - on_reading_finished(user) - reading = FALSE - return TRUE - -///ACTION BUTTONS/// - -/obj/item/book/granter/action - var/granted_action - var/actionname = "catching bugs" //might not seem needed but this makes it so you can safely name action buttons toggle this or that without it fucking up the granter, also caps - -/obj/item/book/granter/action/already_known(mob/user) - if(!granted_action) - return TRUE - for(var/datum/action/A in user.actions) - if(A.type == granted_action) - to_chat(user, span_warning("You already know all about [actionname]!")) - return TRUE - return FALSE - -/obj/item/book/granter/action/on_reading_start(mob/user) - to_chat(user, span_notice("You start reading about [actionname]...")) - -/obj/item/book/granter/action/on_reading_finished(mob/user) - to_chat(user, span_notice("You feel like you've got a good handle on [actionname]!")) - var/datum/action/G = new granted_action - G.Grant(user) - onlearned(user) - -/obj/item/book/granter/action/origami - granted_action = /datum/action/innate/origami - name = "The Art of Origami" - desc = "A meticulously in-depth manual explaining the art of paper folding." - icon_state = "origamibook" - actionname = "origami" - oneuse = TRUE - remarks = list("Dead-stick stability...", "Symmetry seems to play a rather large factor...", "Accounting for crosswinds... really?", "Drag coefficients of various paper types...", "Thrust to weight ratios?", "Positive dihedral angle?", "Center of gravity forward of the center of lift...") - -/datum/action/innate/origami - name = "Origami Folding" - desc = "Toggles your ability to fold and catch robust paper airplanes." - button_icon_state = "origami_off" - check_flags = NONE - -/datum/action/innate/origami/Activate() - to_chat(owner, span_notice("You will now fold origami planes.")) - button_icon_state = "origami_on" - active = TRUE - UpdateButtons() - -/datum/action/innate/origami/Deactivate() - to_chat(owner, span_notice("You will no longer fold origami planes.")) - button_icon_state = "origami_off" - active = FALSE - UpdateButtons() - -///SPELLS/// - -/obj/item/book/granter/spell - var/spell - var/spellname = "conjure bugs" - - -/obj/item/book/granter/spell/Initialize(mapload) - . = ..() - RegisterSignal(src, COMSIG_ITEM_MAGICALLY_CHARGED, .proc/on_magic_charge) - -/** - * Signal proc for [COMSIG_ITEM_MAGICALLY_CHARGED] - * - * Refreshes uses on our spell granter, or make it quicker to read if it's already infinite use - */ -/obj/item/book/granter/spell/proc/on_magic_charge(datum/source, obj/effect/proc_holder/spell/targeted/charge/spell, mob/living/caster) - SIGNAL_HANDLER - - if(!oneuse) - to_chat(caster, span_notice("This book is infinite use and can't be recharged, \ - yet the magic has improved it somehow...")) - pages_to_mastery = max(pages_to_mastery - 1, 1) - return COMPONENT_ITEM_CHARGED|COMPONENT_ITEM_BURNT_OUT - - if(prob(80)) - caster.dropItemToGround(src, TRUE) - visible_message(span_warning("[src] catches fire and burns to ash!")) - new /obj/effect/decal/cleanable/ash(drop_location()) - qdel(src) - return COMPONENT_ITEM_BURNT_OUT - - used = FALSE - return COMPONENT_ITEM_CHARGED - -/obj/item/book/granter/spell/already_known(mob/user) - if(!spell) - return TRUE - for(var/obj/effect/proc_holder/spell/knownspell in user.mind.spell_list) - if(knownspell.type == spell) - if(user.mind) - if(IS_WIZARD(user)) - to_chat(user,span_warning("You're already far more versed in this spell than this flimsy how-to book can provide!")) - else - to_chat(user,span_warning("You've already read this one!")) - return TRUE - return FALSE - -/obj/item/book/granter/spell/on_reading_start(mob/user) - to_chat(user, span_notice("You start reading about casting [spellname]...")) - -/obj/item/book/granter/spell/on_reading_finished(mob/user) - to_chat(user, span_notice("You feel like you've experienced enough to cast [spellname]!")) - var/obj/effect/proc_holder/spell/S = new spell - user.mind.AddSpell(S) - user.log_message("learned the spell [spellname] ([S])", LOG_ATTACK, color="orange") - onlearned(user) - -/obj/item/book/granter/spell/recoil(mob/user) - user.visible_message(span_warning("[src] glows in a black light!")) - -/obj/item/book/granter/spell/onlearned(mob/user) - ..() - if(oneuse) - user.visible_message(span_warning("[src] glows dark for a second!")) - -/obj/item/book/granter/spell/fireball - spell = /obj/effect/proc_holder/spell/aimed/fireball - spellname = "fireball" - icon_state ="bookfireball" - desc = "This book feels warm to the touch." - remarks = list("Aim...AIM, FOOL!", "Just catching them on fire won't do...", "Accounting for crosswinds... really?", "I think I just burned my hand...", "Why the dumb stance? It's just a flick of the hand...", "OMEE... ONI... Ugh...", "What's the difference between a fireball and a pyroblast...") - -/obj/item/book/granter/spell/fireball/recoil(mob/user) - ..() - explosion(user, devastation_range = 1, light_impact_range = 2, flame_range = 2, flash_range = 3, adminlog = FALSE, explosion_cause = src) - qdel(src) - -/obj/item/book/granter/spell/sacredflame - spell = /obj/effect/proc_holder/spell/targeted/sacred_flame - spellname = "sacred flame" - icon_state ="booksacredflame" - desc = "Become one with the flames that burn within... and invite others to do so as well." - remarks = list("Well, it's one way to stop an attacker...", "I'm gonna need some good gear to stop myself from burning to death...", "Keep a fire extinguisher handy, got it...", "I think I just burned my hand...", "Apply flame directly to chest for proper ignition...", "No pain, no gain...", "One with the flame...") - -/obj/item/book/granter/spell/smoke - spell = /obj/effect/proc_holder/spell/targeted/smoke - spellname = "smoke" - icon_state ="booksmoke" - desc = "This book is overflowing with the dank arts." - remarks = list("Smoke Bomb! Heh...", "Smoke bomb would do just fine too...", "Wait, there's a machine that does the same thing in chemistry?", "This book smells awful...", "Why all these weed jokes? Just tell me how to cast it...", "Wind will ruin the whole spell, good thing we're in space... Right?", "So this is how the spider clan does it...") - -/obj/item/book/granter/spell/smoke/lesser //Chaplain smoke book - spell = /obj/effect/proc_holder/spell/targeted/smoke/lesser - -/obj/item/book/granter/spell/smoke/recoil(mob/user) - ..() - to_chat(user,span_warning("Your stomach rumbles...")) - if(user.nutrition) - user.set_nutrition(200) - if(user.nutrition <= 0) - user.set_nutrition(0) - -/obj/item/book/granter/spell/blind - spell = /obj/effect/proc_holder/spell/pointed/trigger/blind - spellname = "blind" - icon_state ="bookblind" - desc = "This book looks blurry, no matter how you look at it." - remarks = list("Well I can't learn anything if I can't read the damn thing!", "Why would you use a dark font on a dark background...", "Ah, I can't see an Oh, I'm fine...", "I can't see my hand...!", "I'm manually blinking, damn you book...", "I can't read this page, but somehow I feel like I learned something from it...", "Hey, who turned off the lights?") - -/obj/item/book/granter/spell/blind/recoil(mob/user) - ..() - to_chat(user,span_warning("You go blind!")) - user.blind_eyes(10) - -/obj/item/book/granter/spell/mindswap - spell = /obj/effect/proc_holder/spell/pointed/mind_transfer - spellname = "mindswap" - icon_state ="bookmindswap" - desc = "This book's cover is pristine, though its pages look ragged and torn." - remarks = list("If you mindswap from a mouse, they will be helpless when you recover...", "Wait, where am I...?", "This book is giving me a horrible headache...", "This page is blank, but I feel words popping into my head...", "GYNU... GYRO... Ugh...", "The voices in my head need to stop, I'm trying to read here...", "I don't think anyone will be happy when I cast this spell...") - /// Mob used in book recoils to store an identity for mindswaps - var/mob/living/stored_swap - -/obj/item/book/granter/spell/mindswap/onlearned() - spellname = pick("fireball","smoke","blind","forcewall","knock","barnyard","charge") - icon_state = "book[spellname]" - name = "spellbook of [spellname]" //Note, desc doesn't change by design - ..() - -/obj/item/book/granter/spell/mindswap/recoil(mob/user) - ..() - if(stored_swap in GLOB.dead_mob_list) - stored_swap = null - if(!stored_swap) - stored_swap = user - to_chat(user,span_warning("For a moment you feel like you don't even know who you are anymore.")) - return - if(stored_swap == user) - to_chat(user,span_notice("You stare at the book some more, but there doesn't seem to be anything else to learn...")) - return - var/obj/effect/proc_holder/spell/pointed/mind_transfer/swapper = new - if(swapper.cast(list(stored_swap), user, TRUE)) - to_chat(user,span_warning("You're suddenly somewhere else... and someone else?!")) - to_chat(stored_swap,span_warning("Suddenly you're staring at [src] again... where are you, who are you?!")) - else - user.visible_message(span_warning("[src] fizzles slightly as it stops glowing!")) //if the mind_transfer failed to transfer mobs, likely due to the target being catatonic. - - stored_swap = null - -/obj/item/book/granter/spell/forcewall - spell = /obj/effect/proc_holder/spell/targeted/forcewall - spellname = "forcewall" - icon_state ="bookforcewall" - desc = "This book has a dedication to mimes everywhere inside the front cover." - remarks = list("I can go through the wall! Neat.", "Why are there so many mime references...?", "This would cause much grief in a hallway...", "This is some surprisingly strong magic to create a wall nobody can pass through...", "Why the dumb stance? It's just a flick of the hand...", "Why are the pages so hard to turn, is this even paper?", "I can't mo Oh, i'm fine...") - -/obj/item/book/granter/spell/forcewall/recoil(mob/living/user) - ..() - to_chat(user,span_warning("You suddenly feel very solid!")) - user.Stun(40, ignore_canstun = TRUE) - user.petrify(60) - -/obj/item/book/granter/spell/knock - spell = /obj/effect/proc_holder/spell/aoe_turf/knock - spellname = "knock" - icon_state ="bookknock" - desc = "This book is hard to hold closed properly." - remarks = list("Open Sesame!", "So THAT'S the magic password!", "Slow down, book. I still haven't finished this page...", "The book won't stop moving!", "I think this is hurting the spine of the book...", "I can't get to the next page, it's stuck t- I'm good, it just turned to the next page on it's own.", "Yeah, staff of doors does the same thing. Go figure...") - -/obj/item/book/granter/spell/knock/recoil(mob/living/user) - ..() - to_chat(user,span_warning("You're knocked down!")) - user.Paralyze(40) - -/obj/item/book/granter/spell/barnyard - spell = /obj/effect/proc_holder/spell/pointed/barnyardcurse - spellname = "barnyard" - icon_state ="bookhorses" - desc = "This book is more horse than your mind has room for." - remarks = list("Moooooooo!","Moo!","Moooo!", "NEEIIGGGHHHH!", "NEEEIIIIGHH!", "NEIIIGGHH!", "HAAWWWWW!", "HAAAWWW!", "Oink!", "Squeeeeeeee!", "Oink Oink!", "Ree!!", "Reee!!", "REEE!!", "REEEEE!!") - -/obj/item/book/granter/spell/barnyard/recoil(mob/living/carbon/user) - if(ishuman(user)) - to_chat(user,"HORSIE HAS RISEN") - var/obj/item/clothing/magichead = new /obj/item/clothing/mask/animal/horsehead/cursed(user.drop_location()) - if(!user.dropItemToGround(user.wear_mask)) - qdel(user.wear_mask) - user.equip_to_slot_if_possible(magichead, ITEM_SLOT_MASK, TRUE, TRUE) - qdel(src) - else - to_chat(user,span_notice("I say thee neigh")) //It still lives here - -/obj/item/book/granter/spell/charge - spell = /obj/effect/proc_holder/spell/targeted/charge - spellname = "charge" - icon_state ="bookcharge" - desc = "This book is made of 100% postconsumer wizard." - remarks = list("I feel ALIVE!", "I CAN TASTE THE MANA!", "What a RUSH!", "I'm FLYING through these pages!", "THIS GENIUS IS MAKING IT!", "This book is ACTION PAcKED!", "HE'S DONE IT", "LETS GOOOOOOOOOOOO") - -/obj/item/book/granter/spell/charge/recoil(mob/user) - ..() - to_chat(user,span_warning("[src] suddenly feels very warm!")) - empulse(src, 1, 1) - -/obj/item/book/granter/spell/summonitem - spell = /obj/effect/proc_holder/spell/targeted/summonitem - spellname = "instant summons" - icon_state ="booksummons" - desc = "This book is bright and garish, very hard to miss." - remarks = list("I can't look away from the book!", "The words seem to pop around the page...", "I just need to focus on one item...", "Make sure to have a good grip on it when casting...", "Slow down, book. I still haven't finished this page...", "Sounds pretty great with some other magical artifacts...", "Magicians must love this one.") - -/obj/item/book/granter/spell/summonitem/recoil(mob/user) - ..() - to_chat(user,span_warning("[src] suddenly vanishes!")) - qdel(src) - -/obj/item/book/granter/spell/random - icon_state = "random_book" - -/obj/item/book/granter/spell/random/Initialize(mapload) - . = ..() - var/static/banned_spells = list(/obj/item/book/granter/spell/mimery_blockade, /obj/item/book/granter/spell/mimery_guns) - var/real_type = pick(subtypesof(/obj/item/book/granter/spell) - banned_spells) - new real_type(loc) - return INITIALIZE_HINT_QDEL - -///MARTIAL ARTS/// - -/obj/item/book/granter/martial - var/martial - var/martialname = "bug jitsu" - var/greet = "You feel like you have mastered the art in breaking code. Nice work, jackass." - - -/obj/item/book/granter/martial/already_known(mob/user) - if(!martial) - return TRUE - var/datum/martial_art/MA = martial - if(user.mind.has_martialart(initial(MA.id))) - to_chat(user,span_warning("You already know [martialname]!")) - return TRUE - return FALSE - -/obj/item/book/granter/martial/on_reading_start(mob/user) - to_chat(user, span_notice("You start reading about [martialname]...")) - -/obj/item/book/granter/martial/on_reading_finished(mob/user) - to_chat(user, "[greet]") - var/datum/martial_art/MA = new martial - MA.teach(user) - user.log_message("learned the martial art [martialname] ([MA])", LOG_ATTACK, color="orange") - onlearned(user) - -/obj/item/book/granter/martial/cqc - martial = /datum/martial_art/cqc - name = "old manual" - martialname = "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." - icon_state = "cqcmanual" - remarks = list("Kick... Slam...", "Lock... Kick...", "Strike their abdomen, neck and back for critical damage...", "Slam... Lock...", "I could probably combine this with some other martial arts!", "Words that kill...", "The last and final moment is yours...") - -/obj/item/book/granter/martial/cqc/onlearned(mob/living/carbon/user) - ..() - if(oneuse == TRUE) - to_chat(user, span_warning("[src] beeps ominously...")) - -/obj/item/book/granter/martial/cqc/recoil(mob/living/carbon/user) - to_chat(user, span_warning("[src] explodes!")) - playsound(src,'sound/effects/explosion1.ogg',40,TRUE) - user.flash_act(1, 1) - user.adjustBruteLoss(6) - user.adjustFireLoss(6) - qdel(src) - -/obj/item/book/granter/martial/carp - martial = /datum/martial_art/the_sleeping_carp - name = "mysterious scroll" - martialname = "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 \ - directed toward you while in Throw Mode. Your body has also hardened itself, granting extra protection against lasting wounds that would otherwise mount during extended combat. \ - However, you are also unable to use any ranged weaponry. You can learn more about your newfound art by using the Recall Teachings verb in the Sleeping Carp tab." - icon = 'icons/obj/wizard.dmi' - icon_state = "scroll2" - worn_icon_state = "scroll" - remarks = list("Wait, a high protein diet is really all it takes to become stabproof...?", "Overwhelming force, immovable object...", "Focus... And you'll be able to incapacitate any foe in seconds...", "I must pierce armor for maximum damage...", "I don't think this would combine with other martial arts...", "Become one with the carp...", "Glub...") - -/obj/item/book/granter/martial/carp/onlearned(mob/living/carbon/user) - ..() - if(oneuse == TRUE) - desc = "It's completely blank." - name = "empty scroll" - icon_state = "blankscroll" - -/obj/item/book/granter/martial/plasma_fist - martial = /datum/martial_art/plasma_fist - name = "frayed scroll" - martialname = "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." - icon = 'icons/obj/wizard.dmi' - icon_state ="scroll2" - remarks = list("Balance...", "Power...", "Control...", "Mastery...", "Vigilance...", "Skill...") - -/obj/item/book/granter/martial/plasma_fist/onlearned(mob/living/carbon/user) - ..() - if(oneuse == TRUE) - desc = "It's completely blank." - name = "empty scroll" - icon_state = "blankscroll" - -/obj/item/book/granter/martial/plasma_fist/nobomb - martial = /datum/martial_art/plasma_fist/nobomb - -// I did not include mushpunch's grant, it is not a book and the item does it just fine. - -//Crafting Recipe books - -/obj/item/book/granter/crafting_recipe - var/list/crafting_recipe_types = list() - -/obj/item/book/granter/crafting_recipe/on_reading_finished(mob/user) - . = ..() - if(!user.mind) - return - for(var/crafting_recipe_type in crafting_recipe_types) - var/datum/crafting_recipe/R = crafting_recipe_type - user.mind.teach_crafting_recipe(crafting_recipe_type) - to_chat(user,span_notice("You learned how to make [initial(R.name)].")) - -/obj/item/book/granter/crafting_recipe/cooking_sweets_101 - name = "Cooking Desserts 101" - desc = "A cook book that teaches you some more of the newest desserts. AI approved, and a best seller on Honkplanet." - crafting_recipe_types = list( - /datum/crafting_recipe/food/mimetart, - /datum/crafting_recipe/food/berrytart, - /datum/crafting_recipe/food/cocolavatart, - /datum/crafting_recipe/food/clowncake, - /datum/crafting_recipe/food/vanillacake - ) - icon_state = "cooking_learing_sweets" - oneuse = FALSE - remarks = list("So that is how icing is made!", "Placing fruit on top? How simple...", "Huh layering cake seems harder then this...", "This book smells like candy", "A clown must have made this page, or they forgot to spell check it before printing...", "Wait, a way to cook slime to be safe?") - -/obj/item/book/granter/crafting_recipe/pipegun_prime - name = "diary of a dead assistant" - desc = "A battered journal. Looks like he had a pretty rough life." - crafting_recipe_types = list( - /datum/crafting_recipe/pipegun_prime - ) - icon_state = "book1" - oneuse = TRUE - remarks = list("He apparently mastered some lost guncrafting technique.", "Why do I have to go through so many hoops to get this shitty gun?", "That much Grey Bull cannot be healthy...", "Did he drop this into a moisture trap? Yuck.", "Toolboxing techniques, huh? I kinda just want to know how to make the gun.", "What the hell does he mean by 'ancient warrior tradition'?") - -/obj/item/book/granter/crafting_recipe/pipegun_prime/recoil(mob/living/carbon/user) - to_chat(user, span_warning("The book turns to dust in your hands.")) - qdel(src) - -/obj/item/book/granter/crafting_recipe/trash_cannon - name = "diary of a demoted engineer" - desc = "A lost journal. The engineer seems very deranged about their demotion." - crafting_recipe_types = list( - /datum/crafting_recipe/trash_cannon, - /datum/crafting_recipe/trashball, - ) - icon_state = "book1" - oneuse = TRUE - remarks = list("\"I'll show them! I'll build a CANNON!\"", "\"Gunpowder is ideal, but i'll have to improvise...\"", "\"I savor the look on the CE's face when I BLOW down the walls to engineering!\"", "\"If the supermatter gets loose from my rampage, so be it!\"", "\"I'VE GONE COMPLETELY MENTAL!\"") - -/obj/item/book/granter/crafting_recipe/trash_cannon/recoil(mob/living/carbon/user) - to_chat(user, span_warning("The book turns to dust in your hands.")) - qdel(src) diff --git a/code/game/objects/items/granters/_granters.dm b/code/game/objects/items/granters/_granters.dm new file mode 100644 index 00000000000000..fed49582d4f665 --- /dev/null +++ b/code/game/objects/items/granters/_granters.dm @@ -0,0 +1,106 @@ +/** + * Books that teach things. + * + * (Intrinsic actions like bar flinging, spells like fireball or smoke, or martial arts) + */ +/obj/item/book/granter + due_date = 0 + unique = 1 + /// Flavor messages displayed to mobs reading the granter + var/list/remarks = list() + /// Controls how long a mob must keep the book in his hand to actually successfully learn + var/pages_to_mastery = 3 + /// Sanity, whether it's currently being read + var/reading = FALSE + /// The amount of uses on the granter. + var/uses = 1 + /// 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', + ) + +/obj/item/book/granter/attack_self(mob/living/user) + if(reading) + to_chat(user, span_warning("You're already reading this!")) + return FALSE + if(user.is_blind()) + to_chat(user, span_warning("You are blind and can't read anything!")) + return FALSE + if(!isliving(user) || !user.can_read(src)) + return FALSE + if(!can_learn(user)) + return FALSE + + if(uses <= 0) + recoil(user) + return FALSE + + on_reading_start(user) + reading = TRUE + for(var/i in 1 to pages_to_mastery) + if(!turn_page(user)) + on_reading_stopped() + reading = FALSE + return + if(do_after(user, 5 SECONDS, src)) + uses-- + on_reading_finished(user) + reading = FALSE + + return TRUE + +/// Called when the user starts to read the granter. +/obj/item/book/granter/proc/on_reading_start(mob/living/user) + to_chat(user, span_notice("You start reading [name]...")) + +/// Called when the reading is interrupted without finishing. +/obj/item/book/granter/proc/on_reading_stopped(mob/living/user) + to_chat(user, span_notice("You stop reading...")) + +/// Called when the reading is completely finished. This is where the actual granting should happen. +/obj/item/book/granter/proc/on_reading_finished(mob/living/user) + to_chat(user, span_notice("You finish reading [name]!")) + +/// The actual "turning over of the page" flavor bit that happens while someone is reading the granter. +/obj/item/book/granter/proc/turn_page(mob/living/user) + playsound(user, pick(book_sounds), 30, TRUE) + + if(!do_after(user, 5 SECONDS, src)) + return FALSE + + to_chat(user, span_notice("[length(remarks) ? pick(remarks) : "You keep reading..."]")) + return TRUE + +/// Effects that occur whenever the book is read when it has no uses left. +/obj/item/book/granter/proc/recoil(mob/living/user) + +/// Checks if the user can learn whatever this granter... grants +/obj/item/book/granter/proc/can_learn(mob/living/user) + return TRUE + +// Generic action giver +/obj/item/book/granter/action + /// The typepath of action that is given + var/datum/action/granted_action + /// The name of the action, formatted in a more text-friendly way. + var/action_name = "" + +/obj/item/book/granter/action/can_learn(mob/living/user) + if(!granted_action) + CRASH("Someone attempted to learn [type], which did not have an action set.") + if(locate(granted_action) in user.actions) + to_chat(user, span_warning("You already know all about [action_name]!")) + return FALSE + return TRUE + +/obj/item/book/granter/action/on_reading_start(mob/living/user) + to_chat(user, span_notice("You start reading about [action_name]...")) + +/obj/item/book/granter/action/on_reading_finished(mob/living/user) + to_chat(user, span_notice("You feel like you've got a good handle on [action_name]!")) + // Action goes on the mind as the user actually learns the thing in your brain + var/datum/action/new_action = new granted_action(user.mind || user) + new_action.Grant(user) + new_action.UpdateButtons() diff --git a/code/game/objects/items/granters/crafting/_crafting_granter.dm b/code/game/objects/items/granters/crafting/_crafting_granter.dm new file mode 100644 index 00000000000000..a4d2b46877a627 --- /dev/null +++ b/code/game/objects/items/granters/crafting/_crafting_granter.dm @@ -0,0 +1,11 @@ +/obj/item/book/granter/crafting_recipe + /// A list of all recipe types we grant on learn + var/list/crafting_recipe_types = list() + +/obj/item/book/granter/crafting_recipe/on_reading_finished(mob/user) + . = ..() + if(!user.mind) + return + for(var/datum/crafting_recipe/crafting_recipe_type as anything in crafting_recipe_types) + user.mind.teach_crafting_recipe(crafting_recipe_type) + to_chat(user, span_notice("You learned how to make [initial(crafting_recipe_type.name)].")) diff --git a/code/game/objects/items/granters/crafting/bone_notes.dm b/code/game/objects/items/granters/crafting/bone_notes.dm new file mode 100644 index 00000000000000..120e47a64d386e --- /dev/null +++ b/code/game/objects/items/granters/crafting/bone_notes.dm @@ -0,0 +1,20 @@ +/obj/item/book/granter/crafting_recipe/boneyard_notes + name = "The Complete Works of Lavaland Bone Architecture" + desc = "Pried from the lead Archaeologist's cold, dead hands, this seems to explain how ancient bone architecture was erected long ago." + crafting_recipe_types = list( + /datum/crafting_recipe/rib, + /datum/crafting_recipe/boneshovel, + /datum/crafting_recipe/halfskull, + /datum/crafting_recipe/skull, + ) + icon = 'icons/obj/library.dmi' + icon_state = "boneworking_learing" + uses = INFINITY + remarks = list( + "Who knew you could bend bones that far back?", + "I guess that was much easier before the planet heated up...", + "So that's how they made those ruins survive the ashstorms. Neat!", + "The page is just filled with insane ramblings about some 'legion' thing.", + "But why would they need vinegar to polish the bones? And rags too?", + "You spend a few moments cleaning dirt and blood off of the page, yeesh.", + ) diff --git a/code/game/objects/items/granters/crafting/cannon.dm b/code/game/objects/items/granters/crafting/cannon.dm new file mode 100644 index 00000000000000..7bf276642b63bc --- /dev/null +++ b/code/game/objects/items/granters/crafting/cannon.dm @@ -0,0 +1,19 @@ +/obj/item/book/granter/crafting_recipe/trash_cannon + name = "diary of a demoted engineer" + desc = "A lost journal. The engineer seems very deranged about their demotion." + crafting_recipe_types = list( + /datum/crafting_recipe/trash_cannon, + /datum/crafting_recipe/trashball, + ) + icon_state = "book1" + remarks = list( + "\"I'll show them! I'll build a CANNON!\"", + "\"Gunpowder is ideal, but i'll have to improvise...\"", + "\"I savor the look on the CE's face when I BLOW down the walls to engineering!\"", + "\"If the supermatter gets loose from my rampage, so be it!\"", + "\"I'VE GONE COMPLETELY MENTAL!\"", + ) + +/obj/item/book/granter/crafting_recipe/trash_cannon/recoil(mob/living/user) + to_chat(user, span_warning("The book turns to dust in your hands.")) + qdel(src) diff --git a/code/game/objects/items/granters/crafting/desserts.dm b/code/game/objects/items/granters/crafting/desserts.dm new file mode 100644 index 00000000000000..518de4bb033d67 --- /dev/null +++ b/code/game/objects/items/granters/crafting/desserts.dm @@ -0,0 +1,21 @@ + +/obj/item/book/granter/crafting_recipe/cooking_sweets_101 + name = "Cooking Desserts 101" + desc = "A cook book that teaches you some more of the newest desserts. AI approved, and a best seller on Honkplanet." + crafting_recipe_types = list( + /datum/crafting_recipe/food/mimetart, + /datum/crafting_recipe/food/berrytart, + /datum/crafting_recipe/food/cocolavatart, + /datum/crafting_recipe/food/clowncake, + /datum/crafting_recipe/food/vanillacake + ) + icon_state = "cooking_learing_sweets" + uses = INFINITY + remarks = list( + "So that is how icing is made!", + "Placing fruit on top? How simple...", + "Huh layering cake seems harder then this...", + "This book smells like candy", + "A clown must have made this page, or they forgot to spell check it before printing...", + "Wait, a way to cook slime to be safe?", + ) diff --git a/code/game/objects/items/granters/crafting/pipegun.dm b/code/game/objects/items/granters/crafting/pipegun.dm new file mode 100644 index 00000000000000..73e171846211b6 --- /dev/null +++ b/code/game/objects/items/granters/crafting/pipegun.dm @@ -0,0 +1,19 @@ +/obj/item/book/granter/crafting_recipe/pipegun_prime + name = "diary of a dead assistant" + desc = "A battered journal. Looks like he had a pretty rough life." + crafting_recipe_types = list( + /datum/crafting_recipe/pipegun_prime + ) + icon_state = "book1" + remarks = list( + "He apparently mastered some lost guncrafting technique.", + "Why do I have to go through so many hoops to get this shitty gun?", + "That much Grey Bull cannot be healthy...", + "Did he drop this into a moisture trap? Yuck.", + "Toolboxing techniques, huh? I kinda just want to know how to make the gun.", + "What the hell does he mean by 'ancient warrior tradition'?", + ) + +/obj/item/book/granter/crafting_recipe/pipegun_prime/recoil(mob/living/user) + to_chat(user, span_warning("The book turns to dust in your hands.")) + qdel(src) diff --git a/code/game/objects/items/granters/magic/_spell_granter.dm b/code/game/objects/items/granters/magic/_spell_granter.dm new file mode 100644 index 00000000000000..4f695e4d3af187 --- /dev/null +++ b/code/game/objects/items/granters/magic/_spell_granter.dm @@ -0,0 +1,93 @@ +/obj/item/book/granter/action/spell + +/obj/item/book/granter/action/spell/Initialize(mapload) + . = ..() + RegisterSignal(src, COMSIG_ITEM_MAGICALLY_CHARGED, .proc/on_magic_charge) + +/** + * Signal proc for [COMSIG_ITEM_MAGICALLY_CHARGED] + * + * Refreshes uses on our spell granter, or make it quicker to read if it's already infinite use + */ +/obj/item/book/granter/action/spell/proc/on_magic_charge(datum/source, datum/action/cooldown/spell/spell, mob/living/caster) + SIGNAL_HANDLER + + // What're the odds someone uses 2000 uses of an infinite use book? + if(uses >= INFINITY - 2000) + to_chat(caster, span_notice("This book is infinite use and can't be recharged, \ + yet the magic has improved it somehow...")) + pages_to_mastery = max(pages_to_mastery - 1, 1) + return COMPONENT_ITEM_CHARGED|COMPONENT_ITEM_BURNT_OUT + + if(prob(80)) + caster.dropItemToGround(src, TRUE) + visible_message(span_warning("[src] catches fire and burns to ash!")) + new /obj/effect/decal/cleanable/ash(drop_location()) + qdel(src) + return COMPONENT_ITEM_BURNT_OUT + + uses++ + return COMPONENT_ITEM_CHARGED + +/obj/item/book/granter/action/spell/can_learn(mob/living/user) + if(!granted_action) + CRASH("Someone attempted to learn [type], which did not have an spell set.") + if(locate(granted_action) in user.actions) + if(IS_WIZARD(user)) + to_chat(user, span_warning("You're already far more versed in the spell [action_name] \ + than this flimsy how-to book can provide!")) + else + to_chat(user, span_warning("You've already know the spell [action_name]!")) + return FALSE + return TRUE + +/obj/item/book/granter/action/spell/on_reading_start(mob/living/user) + to_chat(user, span_notice("You start reading about casting [action_name]...")) + +/obj/item/book/granter/action/spell/on_reading_finished(mob/living/user) + to_chat(user, span_notice("You feel like you've experienced enough to cast [action_name]!")) + var/datum/action/cooldown/spell/new_spell = new granted_action(user.mind || user) + new_spell.Grant(user) + user.log_message("learned the spell [action_name] ([new_spell])", LOG_ATTACK, color = "orange") + if(uses <= 0) + user.visible_message(span_warning("[src] glows dark for a second!")) + +/obj/item/book/granter/action/spell/recoil(mob/living/user) + user.visible_message(span_warning("[src] glows in a black light!")) + +/// Simple granter that's replaced with a random spell granter on Initialize. +/obj/item/book/granter/action/spell/random + icon_state = "random_book" + +/obj/item/book/granter/action/spell/random/Initialize(mapload) + . = ..() + var/static/list/banned_spells = list( + /obj/item/book/granter/action/spell/true_random, + ) + typesof(/obj/item/book/granter/action/spell/mime) + + var/real_type = pick(subtypesof(/obj/item/book/granter/action/spell) - banned_spells) + new real_type(loc) + + return INITIALIZE_HINT_QDEL + +/// A more volatile granter that can potentially have any spell within. Use wisely. +/obj/item/book/granter/action/spell/true_random + icon_state = "random_book" + desc = "You feel as if anything could be gained from this book." + /// A list of schools we probably shouldn't grab, for various reasons + var/static/list/blacklisted_schools = list(SCHOOL_UNSET, SCHOOL_HOLY, SCHOOL_MIME) + +/obj/item/book/granter/action/spell/true_random/Initialize(mapload) + . = ..() + + var/static/list/spell_options + if(!spell_options) + spell_options = subtypesof(/datum/action/cooldown/spell) + for(var/datum/action/cooldown/spell/spell as anything in spell_options) + if(initial(spell.school) in blacklisted_schools) + spell_options -= spell + if(initial(spell.name) == "Spell") // Abstract types + spell_options -= spell + + granted_action = pick(spell_options) + action_name = lowertext(initial(granted_action.name)) diff --git a/code/game/objects/items/granters/magic/barnyard.dm b/code/game/objects/items/granters/magic/barnyard.dm new file mode 100644 index 00000000000000..1f512f96d2f919 --- /dev/null +++ b/code/game/objects/items/granters/magic/barnyard.dm @@ -0,0 +1,34 @@ +/obj/item/book/granter/action/spell/barnyard + granted_action = /datum/action/cooldown/spell/pointed/barnyardcurse + action_name = "barnyard" + icon_state ="bookhorses" + desc = "This book is more horse than your mind has room for." + remarks = list( + "Moooooooo!", + "Moo!", + "Moooo!", + "NEEIIGGGHHHH!", + "NEEEIIIIGHH!", + "NEIIIGGHH!", + "HAAWWWWW!", + "HAAAWWW!", + "Oink!", + "Squeeeeeeee!", + "Oink Oink!", + "Ree!!", + "Reee!!", + "REEE!!", + "REEEEE!!", + ) + +/obj/item/book/granter/action/spell/barnyard/recoil(mob/living/user) + if(ishuman(user)) + to_chat(user, "HORSIE HAS RISEN") + var/obj/item/clothing/magic_mask = new /obj/item/clothing/mask/animal/horsehead/cursed(user.drop_location()) + var/mob/living/carbon/human/human_user = user + if(!user.dropItemToGround(human_user.wear_mask)) + qdel(human_user.wear_mask) + user.equip_to_slot_if_possible(magic_mask, ITEM_SLOT_MASK, TRUE, TRUE) + qdel(src) + else + to_chat(user,span_notice("I say thee neigh")) //It still lives here diff --git a/code/game/objects/items/granters/magic/blind.dm b/code/game/objects/items/granters/magic/blind.dm new file mode 100644 index 00000000000000..2107af802c726b --- /dev/null +++ b/code/game/objects/items/granters/magic/blind.dm @@ -0,0 +1,19 @@ +/obj/item/book/granter/action/spell/blind + granted_action = /datum/action/cooldown/spell/pointed/blind + action_name = "blind" + icon_state = "bookblind" + desc = "This book looks blurry, no matter how you look at it." + remarks = list( + "Well I can't learn anything if I can't read the damn thing!", + "Why would you use a dark font on a dark background...", + "Ah, I can't see an Oh, I'm fine...", + "I can't see my hand...!", + "I'm manually blinking, damn you book...", + "I can't read this page, but somehow I feel like I learned something from it...", + "Hey, who turned off the lights?", + ) + +/obj/item/book/granter/action/spell/blind/recoil(mob/living/user) + . = ..() + to_chat(user, span_warning("You go blind!")) + user.blind_eyes(10) diff --git a/code/game/objects/items/granters/magic/charge.dm b/code/game/objects/items/granters/magic/charge.dm new file mode 100644 index 00000000000000..988d17aa13ba37 --- /dev/null +++ b/code/game/objects/items/granters/magic/charge.dm @@ -0,0 +1,20 @@ +/obj/item/book/granter/action/spell/charge + granted_action = /datum/action/cooldown/spell/charge + action_name = "charge" + icon_state ="bookcharge" + desc = "This book is made of 100% postconsumer wizard." + remarks = list( + "I feel ALIVE!", + "I CAN TASTE THE MANA!", + "What a RUSH!", + "I'm FLYING through these pages!", + "THIS GENIUS IS MAKING IT!", + "This book is ACTION PAcKED!", + "HE'S DONE IT", + "LETS GOOOOOOOOOOOO", + ) + +/obj/item/book/granter/action/spell/charge/recoil(mob/living/user) + . = ..() + to_chat(user,span_warning("[src] suddenly feels very warm!")) + empulse(src, 1, 1) diff --git a/code/game/objects/items/granters/magic/fireball.dm b/code/game/objects/items/granters/magic/fireball.dm new file mode 100644 index 00000000000000..b8b97e6502f6e3 --- /dev/null +++ b/code/game/objects/items/granters/magic/fireball.dm @@ -0,0 +1,27 @@ +/obj/item/book/granter/action/spell/fireball + granted_action = /datum/action/cooldown/spell/pointed/projectile/fireball + action_name = "fireball" + icon_state ="bookfireball" + desc = "This book feels warm to the touch." + remarks = list( + "Aim...AIM, FOOL!", + "Just catching them on fire won't do...", + "Accounting for crosswinds... really?", + "I think I just burned my hand...", + "Why the dumb stance? It's just a flick of the hand...", + "OMEE... ONI... Ugh...", + "What's the difference between a fireball and a pyroblast...", + ) + +/obj/item/book/granter/action/spell/fireball/recoil(mob/living/user) + . = ..() + explosion( + user, + devastation_range = 1, + light_impact_range = 2, + flame_range = 2, + flash_range = 3, + adminlog = FALSE, + explosion_cause = src, + ) + qdel(src) diff --git a/code/game/objects/items/granters/magic/forcewall.dm b/code/game/objects/items/granters/magic/forcewall.dm new file mode 100644 index 00000000000000..7df82dccd24314 --- /dev/null +++ b/code/game/objects/items/granters/magic/forcewall.dm @@ -0,0 +1,20 @@ +/obj/item/book/granter/action/spell/forcewall + granted_action = /datum/action/cooldown/spell/forcewall + action_name = "forcewall" + icon_state ="bookforcewall" + desc = "This book has a dedication to mimes everywhere inside the front cover." + remarks = list( + "I can go through the wall! Neat.", + "Why are there so many mime references...?", + "This would cause much grief in a hallway...", + "This is some surprisingly strong magic to create a wall nobody can pass through...", + "Why the dumb stance? It's just a flick of the hand...", + "Why are the pages so hard to turn, is this even paper?", + "I can't mo Oh, i'm fine...", + ) + +/obj/item/book/granter/action/spell/forcewall/recoil(mob/living/user) + . = ..() + to_chat(user, span_warning("You suddenly feel very solid!")) + user.Stun(4 SECONDS, ignore_canstun = TRUE) + user.petrify(6 SECONDS) diff --git a/code/game/objects/items/granters/magic/knock.dm b/code/game/objects/items/granters/magic/knock.dm new file mode 100644 index 00000000000000..11bdfeeadbfa21 --- /dev/null +++ b/code/game/objects/items/granters/magic/knock.dm @@ -0,0 +1,19 @@ +/obj/item/book/granter/action/spell/knock + granted_action = /datum/action/cooldown/spell/aoe/knock + action_name = "knock" + icon_state ="bookknock" + desc = "This book is hard to hold closed properly." + remarks = list( + "Open Sesame!", + "So THAT'S the magic password!", + "Slow down, book. I still haven't finished this page...", + "The book won't stop moving!", + "I think this is hurting the spine of the book...", + "I can't get to the next page, it's stuck t- I'm good, it just turned to the next page on it's own.", + "Yeah, staff of doors does the same thing. Go figure...", + ) + +/obj/item/book/granter/action/spell/knock/recoil(mob/living/user) + . = ..() + to_chat(user, span_warning("You're knocked down!")) + user.Paralyze(4 SECONDS) diff --git a/code/game/objects/items/granters/magic/mime.dm b/code/game/objects/items/granters/magic/mime.dm new file mode 100644 index 00000000000000..6e6bc03dc9854d --- /dev/null +++ b/code/game/objects/items/granters/magic/mime.dm @@ -0,0 +1,28 @@ +/obj/item/book/granter/action/spell/mime + name = "Guide to Mimery Vol 0" + desc = "The missing entry into the legendary saga. Unfortunately it doesn't teach you anything." + icon_state ="bookmime" + remarks = list("...") + +/obj/item/book/granter/action/spell/mime/attack_self(mob/user) + . = ..() + if(!.) + return + + // Gives the user a vow ability if they don't have one + var/datum/action/cooldown/spell/vow_of_silence/vow = locate() in user.actions + if(!vow && user.mind) + vow = new(user.mind) + vow.Grant(user) + +/obj/item/book/granter/action/spell/mime/mimery_blockade + granted_action = /datum/action/cooldown/spell/forcewall/mime + action_name = "Invisible Blockade" + name = "Guide to Advanced Mimery Vol 1" + desc = "The pages don't make any sound when turned." + +/obj/item/book/granter/action/spell/mime/mimery_guns + granted_action = /datum/action/cooldown/spell/pointed/projectile/finger_guns + action_name = "Finger Guns" + name = "Guide to Advanced Mimery Vol 2" + desc = "There aren't any words written..." diff --git a/code/game/objects/items/granters/magic/mindswap.dm b/code/game/objects/items/granters/magic/mindswap.dm new file mode 100644 index 00000000000000..6396b62136aa85 --- /dev/null +++ b/code/game/objects/items/granters/magic/mindswap.dm @@ -0,0 +1,57 @@ +/obj/item/book/granter/action/spell/mindswap + granted_action = /datum/action/cooldown/spell/pointed/mind_transfer + action_name = "mindswap" + icon_state ="bookmindswap" + desc = "This book's cover is pristine, though its pages look ragged and torn." + remarks = list( + "If you mindswap from a mouse, they will be helpless when you recover...", + "Wait, where am I...?", + "This book is giving me a horrible headache...", + "This page is blank, but I feel words popping into my head...", + "GYNU... GYRO... Ugh...", + "The voices in my head need to stop, I'm trying to read here...", + "I don't think anyone will be happy when I cast this spell...", + ) + /// Mob used in book recoils to store an identity for mindswaps + var/datum/weakref/stored_swap_ref + +/obj/item/book/granter/action/spell/mindswap/on_reading_finished() + . = ..() + visible_message(span_notice("[src] begins to shake and shift.")) + action_name = pick( + "fireball", + "smoke", + "blind", + "forcewall", + "knock", + "barnyard", + "charge", + ) + icon_state = "book[action_name]" + name = "spellbook of [action_name]" + +/obj/item/book/granter/action/spell/mindswap/recoil(mob/living/user) + . = ..() + var/mob/living/real_stored_swap = stored_swap_ref?.resolve() + if(QDELETED(real_stored_swap)) + stored_swap_ref = WEAKREF(user) + to_chat(user, span_warning("For a moment you feel like you don't even know who you are anymore.")) + return + if(real_stored_swap.stat == DEAD) + stored_swap_ref = null + return + if(real_stored_swap == user) + to_chat(user, span_notice("You stare at the book some more, but there doesn't seem to be anything else to learn...")) + return + + var/datum/action/cooldown/spell/pointed/mind_transfer/swapper = new(src) + + if(swapper.swap_minds(user, real_stored_swap)) + to_chat(user, span_warning("You're suddenly somewhere else... and someone else?!")) + to_chat(real_stored_swap, span_warning("Suddenly you're staring at [src] again... where are you, who are you?!")) + + else + // if the mind_transfer failed to transfer mobs (likely due to the target being catatonic). + user.visible_message(span_warning("[src] fizzles slightly as it stops glowing!")) + + stored_swap_ref = null diff --git a/code/game/objects/items/granters/magic/sacred_flame.dm b/code/game/objects/items/granters/magic/sacred_flame.dm new file mode 100644 index 00000000000000..1e044e8e039410 --- /dev/null +++ b/code/game/objects/items/granters/magic/sacred_flame.dm @@ -0,0 +1,14 @@ +/obj/item/book/granter/action/spell/sacredflame + granted_action = /datum/action/cooldown/spell/aoe/sacred_flame + action_name = "sacred flame" + icon_state ="booksacredflame" + desc = "Become one with the flames that burn within... and invite others to do so as well." + remarks = list( + "Well, it's one way to stop an attacker...", + "I'm gonna need some good gear to stop myself from burning to death...", + "Keep a fire extinguisher handy, got it...", + "I think I just burned my hand...", + "Apply flame directly to chest for proper ignition...", + "No pain, no gain...", + "One with the flame...", + ) diff --git a/code/game/objects/items/granters/magic/smoke.dm b/code/game/objects/items/granters/magic/smoke.dm new file mode 100644 index 00000000000000..a83811f1e19472 --- /dev/null +++ b/code/game/objects/items/granters/magic/smoke.dm @@ -0,0 +1,26 @@ +/obj/item/book/granter/action/spell/smoke + granted_action = /datum/action/cooldown/spell/smoke + action_name = "smoke" + icon_state ="booksmoke" + desc = "This book is overflowing with the dank arts." + remarks = list( + "Smoke Bomb! Heh...", + "Smoke bomb would do just fine too...", + "Wait, there's a machine that does the same thing in chemistry?", + "This book smells awful...", + "Why all these weed jokes? Just tell me how to cast it...", + "Wind will ruin the whole spell, good thing we're in space... Right?", + "So this is how the spider clan does it...", + ) + +/obj/item/book/granter/action/spell/smoke/recoil(mob/living/user) + . = ..() + to_chat(user,span_warning("Your stomach rumbles...")) + if(user.nutrition) + user.set_nutrition(200) + if(user.nutrition <= 0) + user.set_nutrition(0) + +// Chaplain's smoke book +/obj/item/book/granter/action/spell/smoke/lesser + granted_action = /datum/action/cooldown/spell/smoke/lesser diff --git a/code/game/objects/items/granters/magic/summon_item.dm b/code/game/objects/items/granters/magic/summon_item.dm new file mode 100644 index 00000000000000..58fbdaf24d0801 --- /dev/null +++ b/code/game/objects/items/granters/magic/summon_item.dm @@ -0,0 +1,19 @@ +/obj/item/book/granter/action/spell/summonitem + granted_action = /datum/action/cooldown/spell/summonitem + action_name = "instant summons" + icon_state ="booksummons" + desc = "This book is bright and garish, very hard to miss." + remarks = list( + "I can't look away from the book!", + "The words seem to pop around the page...", + "I just need to focus on one item...", + "Make sure to have a good grip on it when casting...", + "Slow down, book. I still haven't finished this page...", + "Sounds pretty great with some other magical artifacts...", + "Magicians must love this one.", + ) + +/obj/item/book/granter/action/spell/summonitem/recoil(mob/living/user) + . = ..() + to_chat(user,span_warning("[src] suddenly vanishes!")) + qdel(src) diff --git a/code/game/objects/items/granters/martial_arts/_martial_arts.dm b/code/game/objects/items/granters/martial_arts/_martial_arts.dm new file mode 100644 index 00000000000000..08f615a991e229 --- /dev/null +++ b/code/game/objects/items/granters/martial_arts/_martial_arts.dm @@ -0,0 +1,24 @@ +/obj/item/book/granter/martial + /// The martial arts type we give + var/datum/martial_art/martial + /// The name of the martial arts, formatted in a more text-friendly way. + var/martial_name = "" + /// The text given to the user when they learn the martial arts + var/greet = "" + +/obj/item/book/granter/martial/can_learn(mob/user) + if(!martial) + CRASH("Someone attempted to learn [type], which did not have a martial arts set.") + if(user.mind.has_martialart(initial(martial.id))) + to_chat(user, span_warning("You already know [martial_name]!")) + return FALSE + return TRUE + +/obj/item/book/granter/martial/on_reading_start(mob/user) + to_chat(user, span_notice("You start reading about [martial_name]...")) + +/obj/item/book/granter/martial/on_reading_finished(mob/user) + to_chat(user, "[greet]") + var/datum/martial_art/martial_to_learn = new martial() + martial_to_learn.teach(user) + user.log_message("learned the martial art [martial_name] ([martial_to_learn])", LOG_ATTACK, color = "orange") diff --git a/code/game/objects/items/granters/martial_arts/cqc.dm b/code/game/objects/items/granters/martial_arts/cqc.dm new file mode 100644 index 00000000000000..697541e0216225 --- /dev/null +++ b/code/game/objects/items/granters/martial_arts/cqc.dm @@ -0,0 +1,29 @@ +/obj/item/book/granter/martial/cqc + martial = /datum/martial_art/cqc + 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." + icon_state = "cqcmanual" + remarks = list( + "Kick... Slam...", + "Lock... Kick...", + "Strike their abdomen, neck and back for critical damage...", + "Slam... Lock...", + "I could probably combine this with some other martial arts!", + "Words that kill...", + "The last and final moment is yours...", + ) + +/obj/item/book/granter/martial/cqc/on_reading_finished(mob/living/carbon/user) + . = ..() + if(uses <= 0) + to_chat(user, span_warning("[src] beeps ominously...")) + +/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) + user.flash_act(1, 1) + user.adjustBruteLoss(6) + user.adjustFireLoss(6) + qdel(src) diff --git a/code/game/objects/items/granters/martial_arts/plasma_fist.dm b/code/game/objects/items/granters/martial_arts/plasma_fist.dm new file mode 100644 index 00000000000000..d33fdf6eaae756 --- /dev/null +++ b/code/game/objects/items/granters/martial_arts/plasma_fist.dm @@ -0,0 +1,35 @@ +/obj/item/book/granter/martial/plasma_fist + martial = /datum/martial_art/plasma_fist + 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." + icon = 'icons/obj/wizard.dmi' + icon_state ="scroll2" + remarks = list( + "Balance...", + "Power...", + "Control...", + "Mastery...", + "Vigilance...", + "Skill...", + ) + +/obj/item/book/granter/martial/plasma_fist/on_reading_finished(mob/living/carbon/user) + . = ..() + update_appearance() + +/obj/item/book/granter/martial/plasma_fist/update_appearance(updates) + . = ..() + if(uses <= 0) + name = "empty scroll" + desc = "It's completely blank." + icon_state = "blankscroll" + else + name = initial(name) + desc = initial(desc) + icon_state = initial(icon_state) + +/obj/item/book/granter/martial/plasma_fist/nobomb + martial = /datum/martial_art/plasma_fist/nobomb diff --git a/code/game/objects/items/granters/martial_arts/sleeping_carp.dm b/code/game/objects/items/granters/martial_arts/sleeping_carp.dm new file mode 100644 index 00000000000000..c50a062eae5d8c --- /dev/null +++ b/code/game/objects/items/granters/martial_arts/sleeping_carp.dm @@ -0,0 +1,35 @@ +/obj/item/book/granter/martial/carp + martial = /datum/martial_art/the_sleeping_carp + 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 \ + directed toward you while in Throw Mode. Your body has also hardened itself, granting extra protection against lasting wounds that would otherwise mount during extended combat. \ + However, you are also unable to use any ranged weaponry. You can learn more about your newfound art by using the Recall Teachings verb in the Sleeping Carp tab." + icon = 'icons/obj/wizard.dmi' + icon_state = "scroll2" + worn_icon_state = "scroll" + remarks = list( + "Wait, a high protein diet is really all it takes to become stabproof...?", + "Overwhelming force, immovable object...", + "Focus... And you'll be able to incapacitate any foe in seconds...", + "I must pierce armor for maximum damage...", + "I don't think this would combine with other martial arts...", + "Become one with the carp...", + "Glub...", + ) + +/obj/item/book/granter/martial/carp/on_reading_finished(mob/living/carbon/user) + . = ..() + update_appearance() + +/obj/item/book/granter/martial/carp/update_appearance(updates) + . = ..() + if(uses <= 0) + name = "empty scroll" + desc = "It's completely blank." + icon_state = "blankscroll" + else + name = initial(name) + desc = initial(desc) + icon_state = initial(icon_state) diff --git a/code/game/objects/items/granters/oragami.dm b/code/game/objects/items/granters/oragami.dm new file mode 100644 index 00000000000000..b048c67ed722d7 --- /dev/null +++ b/code/game/objects/items/granters/oragami.dm @@ -0,0 +1,33 @@ +/obj/item/book/granter/action/origami + granted_action = /datum/action/innate/origami + name = "The Art of Origami" + desc = "A meticulously in-depth manual explaining the art of paper folding." + icon_state = "origamibook" + action_name = "origami" + remarks = list( + "Dead-stick stability...", + "Symmetry seems to play a rather large factor...", + "Accounting for crosswinds... really?", + "Drag coefficients of various paper types...", + "Thrust to weight ratios?", + "Positive dihedral angle?", + "Center of gravity forward of the center of lift...", + ) + +/datum/action/innate/origami + name = "Origami Folding" + desc = "Toggles your ability to fold and catch robust paper airplanes." + button_icon_state = "origami_off" + check_flags = NONE + +/datum/action/innate/origami/Activate() + to_chat(owner, span_notice("You will now fold origami planes.")) + button_icon_state = "origami_on" + active = TRUE + UpdateButtons() + +/datum/action/innate/origami/Deactivate() + to_chat(owner, span_notice("You will no longer fold origami planes.")) + button_icon_state = "origami_off" + active = FALSE + UpdateButtons() diff --git a/code/game/objects/items/grenades/smokebomb.dm b/code/game/objects/items/grenades/smokebomb.dm index 6bb7ad0b19dc5a..871f90e2b2287f 100644 --- a/code/game/objects/items/grenades/smokebomb.dm +++ b/code/game/objects/items/grenades/smokebomb.dm @@ -27,7 +27,7 @@ update_mob() playsound(src, 'sound/effects/smoke.ogg', 50, TRUE, -3) var/datum/effect_system/fluid_spread/smoke/bad/smoke = new - smoke.set_up(4, location = src) + smoke.set_up(4, holder = src, location = src) smoke.start() qdel(smoke) //And deleted again. Sad really. for(var/obj/structure/blob/blob in view(8, src)) diff --git a/code/game/objects/items/his_grace.dm b/code/game/objects/items/his_grace.dm index e3a040cc9a111f..453af6f6e7c539 100644 --- a/code/game/objects/items/his_grace.dm +++ b/code/game/objects/items/his_grace.dm @@ -14,6 +14,7 @@ righthand_file = 'icons/mob/inhands/equipment/toolbox_righthand.dmi' w_class = WEIGHT_CLASS_GIGANTIC force = 12 + demolition_mod = 1.25 attack_verb_continuous = list("robusts") attack_verb_simple = list("robust") hitsound = 'sound/weapons/smash.ogg' diff --git a/code/game/objects/items/holosign_creator.dm b/code/game/objects/items/holosign_creator.dm index 0c1ca9de47861a..92f4c7f2346813 100644 --- a/code/game/objects/items/holosign_creator.dm +++ b/code/game/objects/items/holosign_creator.dm @@ -41,7 +41,6 @@ var/turf/target_turf = get_turf(target) var/obj/structure/holosign/target_holosign = locate(holosign_type) in target_turf if(target_holosign) - to_chat(user, span_notice("You use [src] to deactivate [target_holosign].")) qdel(target_holosign) return if(target_turf.is_blocked_turf(TRUE)) //can't put holograms on a tile that has dense stuff @@ -50,7 +49,7 @@ to_chat(user, span_notice("[src] is busy creating a hologram.")) return if(LAZYLEN(signs) >= max_signs) - to_chat(user, span_notice("[src] is projecting at max capacity!")) + balloon_alert(user, "max capacity!") return playsound(loc, 'sound/machines/click.ogg', 20, TRUE) if(creation_time) @@ -64,7 +63,6 @@ if(target_turf.is_blocked_turf(TRUE)) //don't try to sneak dense stuff on our tile during the wait. return target_holosign = new holosign_type(get_turf(target), src) - to_chat(user, span_notice("You create \a [target_holosign] with [src].")) /obj/item/holosign_creator/attack(mob/living/carbon/human/M, mob/user) return @@ -73,7 +71,7 @@ if(LAZYLEN(signs)) for(var/H in signs) qdel(H) - to_chat(user, span_notice("You clear all active holograms.")) + balloon_alert(user, "holograms cleared") /obj/item/holosign_creator/Destroy() . = ..() @@ -151,4 +149,4 @@ return for(var/sign in signs) qdel(sign) - to_chat(user, span_notice("You clear all active holograms.")) + balloon_alert(user, "holograms cleared") diff --git a/code/game/objects/items/holy_weapons.dm b/code/game/objects/items/holy_weapons.dm index 81b6d56a39aea2..59c2f0341c3aff 100644 --- a/code/game/objects/items/holy_weapons.dm +++ b/code/game/objects/items/holy_weapons.dm @@ -432,7 +432,7 @@ attack_verb_simple = list("saw", "tear", "lacerate", "cut", "chop", "dice") hitsound = 'sound/weapons/chainsawhit.ogg' tool_behaviour = TOOL_SAW - toolspeed = 0.5 //faster than normal saw + toolspeed = 0.5 //same speed as an active chainsaw chaplain_spawnable = FALSE //prevents being pickable as a chaplain weapon (it has 30 force) /obj/item/nullrod/hammer diff --git a/code/game/objects/items/implants/implant.dm b/code/game/objects/items/implants/implant.dm index 1c50132b1eb7c2..8075b72c38b555 100644 --- a/code/game/objects/items/implants/implant.dm +++ b/code/game/objects/items/implants/implant.dm @@ -5,9 +5,11 @@ name = "implant" icon = 'icons/obj/implants.dmi' icon_state = "generic" //Shows up as the action button icon + item_flags = DROPDEL + // This gives the user an action button that allows them to activate the implant. + // If the implant needs no action button, then null this out. + // Or, if you want to add a unique action button, then replace this. actions_types = list(/datum/action/item_action/hands_free/activate) - ///true for implant types that can be activated, false for ones that are "always on" like mindshield implants - var/activated = TRUE ///the mob that's implanted with this var/mob/living/imp_in = null ///implant color, used for selecting either the "b" version or the "r" version of the implant case sprite when the implant is in a case. @@ -16,7 +18,7 @@ var/allow_multiple = FALSE ///how many times this can do something, only relevant for implants with limited uses var/uses = -1 - item_flags = DROPDEL + /obj/item/implant/proc/activate() SEND_SIGNAL(src, COMSIG_IMPLANT_ACTIVATED) @@ -24,6 +26,9 @@ /obj/item/implant/ui_action_click() INVOKE_ASYNC(src, .proc/activate, "action_button") +/obj/item/implant/item_action_slot_check(slot, mob/user) + return user == imp_in + /obj/item/implant/proc/can_be_implanted_in(mob/living/target) if(issilicon(target)) return FALSE @@ -86,10 +91,8 @@ forceMove(target) imp_in = target target.implants += src - if(activated) - for(var/X in actions) - var/datum/action/implant_action = X - implant_action.Grant(target) + for(var/datum/action/implant_action as anything in actions) + implant_action.Grant(target) if(ishuman(target)) var/mob/living/carbon/human/target_human = target target_human.sec_hud_set_implants() @@ -113,8 +116,7 @@ moveToNullspace() imp_in = null source.implants -= src - for(var/X in actions) - var/datum/action/implant_action = X + for(var/datum/action/implant_action as anything in actions) implant_action.Remove(source) if(ishuman(source)) var/mob/living/carbon/human/human_source = source diff --git a/code/game/objects/items/implants/implant_abductor.dm b/code/game/objects/items/implants/implant_abductor.dm index 084b6818163b33..5c8d822ec4fa82 100644 --- a/code/game/objects/items/implants/implant_abductor.dm +++ b/code/game/objects/items/implants/implant_abductor.dm @@ -3,7 +3,6 @@ desc = "Returns you to the mothership." icon = 'icons/obj/abductor.dmi' icon_state = "implant" - activated = 1 var/obj/machinery/abductor/pad/home var/cooldown = 60 SECONDS var/on_cooldown diff --git a/code/game/objects/items/implants/implant_chem.dm b/code/game/objects/items/implants/implant_chem.dm index bbb1e72027fcb7..2171ad12ef0873 100644 --- a/code/game/objects/items/implants/implant_chem.dm +++ b/code/game/objects/items/implants/implant_chem.dm @@ -2,7 +2,7 @@ name = "chem implant" desc = "Injects things." icon_state = "reagents" - activated = FALSE + actions_types = null /obj/item/implant/chem/get_data() var/dat = {"Implant Specifications:
diff --git a/code/game/objects/items/implants/implant_clown.dm b/code/game/objects/items/implants/implant_clown.dm index 001e6a35075585..a94f3e750983a9 100644 --- a/code/game/objects/items/implants/implant_clown.dm +++ b/code/game/objects/items/implants/implant_clown.dm @@ -1,7 +1,7 @@ ///A passive implant that plays sound/misc/sadtrombone.ogg when you deathgasp for any reason /obj/item/implant/sad_trombone name = "sad trombone implant" - activated = FALSE + actions_types = null /obj/item/implant/sad_trombone/get_data() var/dat = {"Implant Specifications:
diff --git a/code/game/objects/items/implants/implant_deathrattle.dm b/code/game/objects/items/implants/implant_deathrattle.dm index a7afe701c2ac48..f22c6d0b97336c 100644 --- a/code/game/objects/items/implants/implant_deathrattle.dm +++ b/code/game/objects/items/implants/implant_deathrattle.dm @@ -77,7 +77,7 @@ name = "deathrattle implant" desc = "Hope no one else dies, prepare for when they do." - activated = FALSE + actions_types = null /obj/item/implant/deathrattle/can_be_implanted_in(mob/living/target) // Can be implanted in anything that's a mob. Syndicate cyborgs, talking fish, humans... diff --git a/code/game/objects/items/implants/implant_exile.dm b/code/game/objects/items/implants/implant_exile.dm index a14128e0bdd048..056ccd0ff9ac59 100644 --- a/code/game/objects/items/implants/implant_exile.dm +++ b/code/game/objects/items/implants/implant_exile.dm @@ -4,7 +4,7 @@ /obj/item/implant/exile name = "exile implant" desc = "Prevents you from returning from away missions." - activated = FALSE + actions_types = null /obj/item/implant/exile/get_data() var/dat = {"Implant Specifications:
diff --git a/code/game/objects/items/implants/implant_explosive.dm b/code/game/objects/items/implants/implant_explosive.dm index 96165b3fd3a4be..45a41313fe017f 100644 --- a/code/game/objects/items/implants/implant_explosive.dm +++ b/code/game/objects/items/implants/implant_explosive.dm @@ -119,3 +119,7 @@ /obj/item/implanter/explosive_macro name = "implanter (macrobomb)" imp_type = /obj/item/implant/explosive/macro + +/datum/action/item_action/explosive_implant + check_flags = NONE + name = "Activate Explosive Implant" diff --git a/code/game/objects/items/implants/implant_krav_maga.dm b/code/game/objects/items/implants/implant_krav_maga.dm index 373658b3864617..e8ea5695fd32e4 100644 --- a/code/game/objects/items/implants/implant_krav_maga.dm +++ b/code/game/objects/items/implants/implant_krav_maga.dm @@ -3,7 +3,6 @@ desc = "Teaches you the arts of Krav Maga in 5 short instructional videos beamed directly into your eyeballs." icon = 'icons/obj/wizard.dmi' icon_state ="scroll2" - activated = 1 var/datum/martial_art/krav_maga/style = new /obj/item/implant/krav_maga/get_data() @@ -34,4 +33,3 @@ name = "implant case - 'Krav Maga'" desc = "A glass case containing an implant that can teach the user the arts of Krav Maga." imp_type = /obj/item/implant/krav_maga - diff --git a/code/game/objects/items/implants/implant_mindshield.dm b/code/game/objects/items/implants/implant_mindshield.dm index 21a6449642c077..240c83c793f5a0 100644 --- a/code/game/objects/items/implants/implant_mindshield.dm +++ b/code/game/objects/items/implants/implant_mindshield.dm @@ -1,7 +1,7 @@ /obj/item/implant/mindshield name = "mindshield implant" desc = "Protects against brainwashing." - activated = FALSE + actions_types = null /obj/item/implant/mindshield/get_data() var/dat = {"Implant Specifications:
diff --git a/code/game/objects/items/implants/implant_misc.dm b/code/game/objects/items/implants/implant_misc.dm index 43303e3ee0a58b..5f7158dbe81ec1 100644 --- a/code/game/objects/items/implants/implant_misc.dm +++ b/code/game/objects/items/implants/implant_misc.dm @@ -2,7 +2,7 @@ name = "firearms authentication implant" desc = "Lets you shoot your guns." icon_state = "auth" - activated = FALSE + actions_types = null /obj/item/implant/weapons_auth/get_data() var/dat = {"Implant Specifications:
@@ -31,7 +31,6 @@ /obj/item/implant/radio name = "internal radio implant" - activated = TRUE var/obj/item/radio/radio var/radio_key var/subspace_transmission = FALSE @@ -89,4 +88,3 @@ /obj/item/implanter/radio/syndicate name = "implanter (internal syndicate radio)" imp_type = /obj/item/implant/radio/syndicate - diff --git a/code/game/objects/items/implants/implant_spell.dm b/code/game/objects/items/implants/implant_spell.dm index 916eaa3cedec62..8005e1c56e929b 100644 --- a/code/game/objects/items/implants/implant_spell.dm +++ b/code/game/objects/items/implants/implant_spell.dm @@ -1,36 +1,58 @@ /obj/item/implant/spell name = "spell implant" desc = "Allows you to cast a spell as if you were a wizard." - activated = FALSE + actions_types = null - var/autorobeless = TRUE // Whether to automagically make the spell robeless on implant - var/obj/effect/proc_holder/spell/spell + /// Whether to make the spell robeless + var/make_robeless = TRUE + /// The typepath of the spell we give to people. Instantiated in Initialize + var/datum/action/cooldown/spell/spell_type + /// The actual spell we give to the person on implant + var/datum/action/cooldown/spell/spell_to_give +/obj/item/implant/spell/Initialize(mapload) + . = ..() + if(!spell_type) + return + + spell_to_give = new spell_type(src) + + if(make_robeless && (spell_to_give.spell_requirements & SPELL_REQUIRES_WIZARD_GARB)) + spell_to_give.spell_requirements &= ~SPELL_REQUIRES_WIZARD_GARB + +/obj/item/implant/spell/Destroy() + QDEL_NULL(spell_to_give) + return ..() /obj/item/implant/spell/get_data() var/dat = {"Implant Specifications:
Name: Spell Implant
Life: 4 hours after death of host
Implant Details:
- Function: [spell ? "Allows a non-wizard to cast [spell] as if they were a wizard." : "None"]"} + Function: [spell_to_give ? "Allows a non-wizard to cast [spell_to_give] as if they were a wizard." : "None."]"} return dat /obj/item/implant/spell/implant(mob/living/target, mob/user, silent = FALSE, force = FALSE) . = ..() - if (.) - if (!spell) - return FALSE - if (autorobeless && spell.clothes_req) - spell.clothes_req = FALSE - target.AddSpell(spell) - return TRUE - -/obj/item/implant/spell/removed(mob/target, silent = FALSE, special = 0) + if (!.) + return + + if (!spell_to_give) + return FALSE + + spell_to_give.Grant(target) + return TRUE + +/obj/item/implant/spell/removed(mob/living/source, silent = FALSE, special = 0) . = ..() - if (.) - target.RemoveSpell(spell) - if(target.stat != DEAD && !silent) - to_chat(target, span_boldnotice("The knowledge of how to cast [spell] slips out from your mind.")) + if (!.) + return FALSE + + if(spell_to_give) + spell_to_give.Remove(source) + if(source.stat != DEAD && !silent) + to_chat(source, span_boldnotice("The knowledge of how to cast [spell_to_give] slips out from your mind.")) + return TRUE /obj/item/implanter/spell name = "implanter (spell)" diff --git a/code/game/objects/items/implants/implant_stealth.dm b/code/game/objects/items/implants/implant_stealth.dm index 7ef672e63c725f..514db174d9e990 100644 --- a/code/game/objects/items/implants/implant_stealth.dm +++ b/code/game/objects/items/implants/implant_stealth.dm @@ -26,6 +26,10 @@ /obj/structure/closet/cardboard/agent/open(mob/living/user, force = FALSE) . = ..() + + if(!.) + return + qdel(src) /obj/structure/closet/cardboard/agent/process() diff --git a/code/game/objects/items/implants/implant_track.dm b/code/game/objects/items/implants/implant_track.dm index 76244f23f309b9..815d20161ce097 100644 --- a/code/game/objects/items/implants/implant_track.dm +++ b/code/game/objects/items/implants/implant_track.dm @@ -1,7 +1,8 @@ /obj/item/implant/tracking name = "tracking implant" desc = "Track with this." - activated = FALSE + actions_types = null + ///for how many deciseconds after user death will the implant work? var/lifespan_postmortem = 6000 ///will people implanted with this act as teleporter beacons? diff --git a/code/game/objects/items/inducer.dm b/code/game/objects/items/inducer.dm index 8423ba4bf84e76..ca16a4d25b27c1 100644 --- a/code/game/objects/items/inducer.dm +++ b/code/game/objects/items/inducer.dm @@ -51,11 +51,11 @@ return TRUE if(!cell) - to_chat(user, span_warning("[src] doesn't have a power cell installed!")) + balloon_alert(user, "no cell installed!") return TRUE if(!cell.charge) - to_chat(user, span_warning("[src]'s battery is dead!")) + balloon_alert(user, "no charge!") return TRUE return FALSE @@ -116,7 +116,7 @@ if(C) var/done_any = FALSE if(C.charge >= C.maxcharge) - to_chat(user, span_notice("[A] is fully charged!")) + balloon_alert(user, "it's fully charged!") recharging = FALSE return TRUE user.visible_message(span_notice("[user] starts recharging [A] with [src]."), span_notice("You start recharging [A] with [src].")) diff --git a/code/game/objects/items/knives.dm b/code/game/objects/items/knives.dm index 7ad625fd3669ad..234795614b92bc 100644 --- a/code/game/objects/items/knives.dm +++ b/code/game/objects/items/knives.dm @@ -10,6 +10,7 @@ desc = "The original knife, it is said that all other knives are only copies of this one." flags_1 = CONDUCT_1 force = 10 + demolition_mod = 0.75 w_class = WEIGHT_CLASS_SMALL throwforce = 10 hitsound = 'sound/weapons/bladeslice.ogg' diff --git a/code/game/objects/items/maintenance_loot.dm b/code/game/objects/items/maintenance_loot.dm index c6a5b412622b69..1df9c861a321d0 100644 --- a/code/game/objects/items/maintenance_loot.dm +++ b/code/game/objects/items/maintenance_loot.dm @@ -18,6 +18,7 @@ throw_range = 4 w_class = WEIGHT_CLASS_BULKY wound_bonus = 20 + demolition_mod = 1.25 grind_results = list(/datum/reagent/lead = 20) //A good battery early in the shift. Source of lead & sulfuric acid reagents. diff --git a/code/game/objects/items/melee/energy.dm b/code/game/objects/items/melee/energy.dm index bdb6c2860f0dd5..11345dea7b44ca 100644 --- a/code/game/objects/items/melee/energy.dm +++ b/code/game/objects/items/melee/energy.dm @@ -107,6 +107,7 @@ heat = initial(heat) STOP_PROCESSING(SSobj, src) + tool_behaviour = (active ? TOOL_SAW : NONE) //Lets energy weapons cut trees. Also lets them do bonecutting surgery, which is kinda metal! balloon_alert(user, "[name] [active ? "enabled":"disabled"]") playsound(user ? user : src, active ? 'sound/weapons/saberon.ogg' : 'sound/weapons/saberoff.ogg', 35, TRUE) set_light_on(active) diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm index 267753303adcdd..3006069931f886 100644 --- a/code/game/objects/items/melee/misc.dm +++ b/code/game/objects/items/melee/misc.dm @@ -21,6 +21,7 @@ slot_flags = ITEM_SLOT_BELT force = 10 throwforce = 7 + demolition_mod = 0.25 wound_bonus = 15 bare_wound_bonus = 10 w_class = WEIGHT_CLASS_NORMAL @@ -64,6 +65,7 @@ obj_flags = UNIQUE_RENAME force = 15 throwforce = 10 + demolition_mod = 0.75 //but not metal w_class = WEIGHT_CLASS_BULKY block_chance = 50 armour_penetration = 75 @@ -283,6 +285,7 @@ worn_icon_state = "whip" slot_flags = ITEM_SLOT_BELT force = 15 + demolition_mod = 0.25 w_class = WEIGHT_CLASS_NORMAL attack_verb_continuous = list("flogs", "whips", "lashes", "disciplines") attack_verb_simple = list("flog", "whip", "lash", "discipline") diff --git a/code/game/objects/items/nitrium_crystals.dm b/code/game/objects/items/nitrium_crystals.dm index f40961e1326d54..0f6e3dfbab1032 100644 --- a/code/game/objects/items/nitrium_crystals.dm +++ b/code/game/objects/items/nitrium_crystals.dm @@ -13,6 +13,6 @@ reagents.add_reagent(/datum/reagent/nitrium_low_metabolization, 3) reagents.add_reagent(/datum/reagent/nitrium_high_metabolization, 2) smoke.attach(location) - smoke.set_up(cloud_size, location = location, carry = reagents, silent = TRUE) + smoke.set_up(cloud_size, holder = src, location = location, carry = reagents, silent = TRUE) smoke.start() qdel(src) diff --git a/code/game/objects/items/plushes.dm b/code/game/objects/items/plushes.dm index 555fb0db618193..df2a8393515d25 100644 --- a/code/game/objects/items/plushes.dm +++ b/code/game/objects/items/plushes.dm @@ -694,3 +694,24 @@ attack_verb_continuous = list("slashes", "bites", "charges") attack_verb_simple = list("slash", "bite", "charge") squeak_override = list('sound/items/intents/Help.ogg' = 1) + +/obj/item/toy/plush/abductor + name = "abductor plushie" + desc = "A plushie depicting an alien abductor. The tag on it is in an indecipherable language." + icon_state = "abductor" + inhand_icon_state = "abductor" + 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. + +/obj/item/toy/plush/abductor/agent + name = "abductor agent plushie" + desc = "A plushie depicting an alien abductor agent. The stun baton is attached to the hand of the plushie, and appears to be inert. I wouldn't stay alone with it." + icon_state = "abductor_agent" + inhand_icon_state = "abductor_agent" + 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, + ) diff --git a/code/game/objects/items/robot/ai_upgrades.dm b/code/game/objects/items/robot/ai_upgrades.dm index 5833b72ae39293..c098ca15f3491b 100644 --- a/code/game/objects/items/robot/ai_upgrades.dm +++ b/code/game/objects/items/robot/ai_upgrades.dm @@ -23,7 +23,7 @@ to_chat(AI, span_userdanger("Your current laws and objectives remain unchanged.")) //this unlocks malf powers, but does not give the license to plasma flood AI.add_malf_picker() AI.hack_software = TRUE - log_game("[key_name(user)] has upgraded [key_name(AI)] with a [src].") + log_silicon("[key_name(user)] has upgraded [key_name(AI)] with a [src].") message_admins("[ADMIN_LOOKUPFLW(user)] has upgraded [ADMIN_LOOKUPFLW(AI)] with a [src].") to_chat(user, span_notice("You upgrade [AI]. [src] is consumed in the process.")) qdel(src) diff --git a/code/game/objects/items/robot/items/hypo.dm b/code/game/objects/items/robot/items/hypo.dm new file mode 100644 index 00000000000000..4d82f33b388956 --- /dev/null +++ b/code/game/objects/items/robot/items/hypo.dm @@ -0,0 +1,386 @@ +/// All of the default reagent lists for each hypospray (+ hacked variants) +#define BASE_MEDICAL_REAGENTS list(\ + /datum/reagent/medicine/c2/aiuri,\ + /datum/reagent/medicine/c2/convermol,\ + /datum/reagent/medicine/epinephrine,\ + /datum/reagent/medicine/c2/libital,\ + /datum/reagent/medicine/c2/multiver,\ + /datum/reagent/medicine/salglu_solution,\ + /datum/reagent/medicine/spaceacillin\ + ) +#define EXPANDED_MEDICAL_REAGENTS list(\ + /datum/reagent/medicine/haloperidol,\ + /datum/reagent/medicine/inacusiate,\ + /datum/reagent/medicine/mannitol,\ + /datum/reagent/medicine/mutadone,\ + /datum/reagent/medicine/oculine,\ + /datum/reagent/medicine/oxandrolone,\ + /datum/reagent/medicine/pen_acid,\ + /datum/reagent/medicine/rezadone,\ + /datum/reagent/medicine/sal_acid\ + ) +#define HACKED_MEDICAL_REAGENTS list(\ + /datum/reagent/toxin/cyanide,\ + /datum/reagent/toxin/acid/fluacid,\ + /datum/reagent/toxin/heparin,\ + /datum/reagent/toxin/lexorin,\ + /datum/reagent/toxin/mutetoxin,\ + /datum/reagent/toxin/sodium_thiopental\ + ) +#define BASE_PEACE_REAGENTS list(\ + /datum/reagent/peaceborg/confuse,\ + /datum/reagent/pax/peaceborg,\ + /datum/reagent/peaceborg/tire\ + ) +#define HACKED_PEACE_REAGENTS list(\ + /datum/reagent/toxin/cyanide,\ + /datum/reagent/toxin/fentanyl,\ + /datum/reagent/toxin/sodium_thiopental,\ + /datum/reagent/toxin/staminatoxin,\ + /datum/reagent/toxin/sulfonal\ + ) +#define BASE_CLOWN_REAGENTS list(\ + /datum/reagent/consumable/laughter\ + ) +#define HACKED_CLOWN_REAGENTS list(\ + /datum/reagent/consumable/superlaughter\ + ) +#define BASE_SYNDICATE_REAGENTS list(\ + /datum/reagent/medicine/inacusiate,\ + /datum/reagent/medicine/morphine,\ + /datum/reagent/medicine/potass_iodide,\ + /datum/reagent/medicine/syndicate_nanites\ + ) +#define BASE_SERVICE_REAGENTS list(/datum/reagent/consumable/applejuice, /datum/reagent/consumable/banana,\ + /datum/reagent/consumable/coffee, /datum/reagent/consumable/cream, /datum/reagent/consumable/dr_gibb,\ + /datum/reagent/consumable/grenadine, /datum/reagent/consumable/ice, /datum/reagent/consumable/lemonjuice,\ + /datum/reagent/consumable/lemon_lime, /datum/reagent/consumable/limejuice, /datum/reagent/consumable/menthol,\ + /datum/reagent/consumable/milk, /datum/reagent/consumable/nothing, /datum/reagent/consumable/orangejuice,\ + /datum/reagent/consumable/peachjuice, /datum/reagent/consumable/pineapplejuice,\ + /datum/reagent/consumable/pwr_game, /datum/reagent/consumable/shamblers, /datum/reagent/consumable/sodawater,\ + /datum/reagent/consumable/sol_dry, /datum/reagent/consumable/soymilk, /datum/reagent/consumable/space_cola,\ + /datum/reagent/consumable/spacemountainwind, /datum/reagent/consumable/space_up, /datum/reagent/consumable/sugar,\ + /datum/reagent/consumable/tea, /datum/reagent/consumable/tomatojuice, /datum/reagent/consumable/tonic,\ + /datum/reagent/water,\ + /datum/reagent/consumable/ethanol/ale, /datum/reagent/consumable/ethanol/applejack, /datum/reagent/consumable/ethanol/beer,\ + /datum/reagent/consumable/ethanol/champagne, /datum/reagent/consumable/ethanol/cognac, /datum/reagent/consumable/ethanol/creme_de_coconut,\ + /datum/reagent/consumable/ethanol/creme_de_cacao, /datum/reagent/consumable/ethanol/creme_de_menthe, /datum/reagent/consumable/ethanol/gin,\ + /datum/reagent/consumable/ethanol/kahlua, /datum/reagent/consumable/ethanol/rum, /datum/reagent/consumable/ethanol/sake,\ + /datum/reagent/consumable/ethanol/tequila, /datum/reagent/consumable/ethanol/triple_sec, /datum/reagent/consumable/ethanol/vermouth,\ + /datum/reagent/consumable/ethanol/vodka, /datum/reagent/consumable/ethanol/whiskey, /datum/reagent/consumable/ethanol/wine\ + ) +#define HACKED_SERVICE_REAGENTS list(\ + /datum/reagent/toxin/fakebeer,\ + /datum/reagent/consumable/ethanol/fernet\ + ) + +///Borg Hypospray +/obj/item/reagent_containers/borghypo + name = "cyborg hypospray" + desc = "An advanced chemical synthesizer and injection system, designed for heavy-duty medical equipment." + icon = 'icons/obj/syringe.dmi' + inhand_icon_state = "hypo" + lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' + icon_state = "borghypo" + amount_per_transfer_from_this = 5 + possible_transfer_amounts = list(2,5) + + /** The maximum volume for each reagent stored in this hypospray + * In most places we add + 1 because we're secretly keeping [max_volume_per_reagent + 1] + * units, so that when this reagent runs out it's not wholesale removed from the reagents + */ + var/max_volume_per_reagent = 30 + /// Cell cost for charging a reagent + var/charge_cost = 50 + /// Counts up to the next time we charge + var/charge_timer = 0 + /// Time it takes for shots to recharge (in seconds) + var/recharge_time = 10 + ///Optional variable to override the temperature add_reagent() will use + var/dispensed_temperature = DEFAULT_REAGENT_TEMPERATURE + /// If the hypospray can go through armor or thick material + var/bypass_protection = FALSE + /// If this hypospray has been upgraded + var/upgraded = FALSE + + /// The basic reagents that come with this hypo + var/list/default_reagent_types + /// The expanded suite of reagents that comes from upgrading this hypo + var/list/expanded_reagent_types + + /// The reagents we're actually storing + var/datum/reagents/stored_reagents + /// The reagent we've selected to dispense + var/datum/reagent/selected_reagent + /// The theme for our UI (hacked hypos get syndicate UI) + var/tgui_theme = "ntos" + +/obj/item/reagent_containers/borghypo/Initialize(mapload) + . = ..() + stored_reagents = new() + stored_reagents.maximum_volume = length(default_reagent_types) * (max_volume_per_reagent + 1) + for(var/reagent in default_reagent_types) + add_new_reagent(reagent) + START_PROCESSING(SSobj, src) + +/obj/item/reagent_containers/borghypo/Destroy() + STOP_PROCESSING(SSobj, src) + return ..() + +/// Every [recharge_time] seconds, recharge some reagents for the cyborg +/obj/item/reagent_containers/borghypo/process(delta_time) + charge_timer += delta_time + if(charge_timer >= recharge_time) + regenerate_reagents(default_reagent_types) + if(upgraded) + regenerate_reagents(expanded_reagent_types) + charge_timer = 0 + return 1 + +/// Use this to add more chemicals for the borghypo to produce. +/obj/item/reagent_containers/borghypo/proc/add_new_reagent(datum/reagent/reagent) + stored_reagents.add_reagent(reagent, (max_volume_per_reagent + 1), reagtemp = dispensed_temperature, no_react = TRUE) + +/// Regenerate our supply of all reagents (if they're not full already) +/obj/item/reagent_containers/borghypo/proc/regenerate_reagents(list/reagents_to_regen) + if(iscyborg(src.loc)) + var/mob/living/silicon/robot/cyborg = src.loc + if(cyborg?.cell) + for(var/reagent in reagents_to_regen) + var/datum/reagent/reagent_to_regen = reagent + if(!stored_reagents.has_reagent(reagent_to_regen, max_volume_per_reagent)) + cyborg.cell.use(charge_cost) + stored_reagents.add_reagent(reagent_to_regen, 5, reagtemp = dispensed_temperature, no_react = TRUE) + +/obj/item/reagent_containers/borghypo/attack(mob/living/carbon/injectee, mob/user) + if(!istype(injectee)) + return + if(!selected_reagent) + balloon_alert(user, "no reagent selected!") + return + if(!stored_reagents.has_reagent(selected_reagent.type, amount_per_transfer_from_this)) + balloon_alert(user, "not enough [selected_reagent.name]!") + return + + if(injectee.try_inject(user, user.zone_selected, injection_flags = INJECT_TRY_SHOW_ERROR_MESSAGE | (bypass_protection ? INJECT_CHECK_PENETRATE_THICK : 0))) + // This is the in-between where we're storing the reagent we're going to inject the injectee with + // because we cannot specify a singular reagent to transfer in trans_to + var/datum/reagents/hypospray_injector = new() + stored_reagents.remove_reagent(selected_reagent.type, amount_per_transfer_from_this) + hypospray_injector.add_reagent(selected_reagent.type, amount_per_transfer_from_this, reagtemp = dispensed_temperature, no_react = TRUE) + + to_chat(injectee, span_warning("You feel a tiny prick!")) + to_chat(user, span_notice("You inject [injectee] with the injector ([selected_reagent.name]).")) + + if(injectee.reagents) + hypospray_injector.trans_to(injectee, amount_per_transfer_from_this, transfered_by = user, methods = INJECT) + balloon_alert(user, "[amount_per_transfer_from_this] unit\s injected") + log_combat(user, injectee, "injected", src, "(CHEMICALS: [selected_reagent])") + else + balloon_alert(user, "[user.zone_selected] is blocked!") + +/obj/item/reagent_containers/borghypo/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "BorgHypo", name) + ui.open() + +/obj/item/reagent_containers/borghypo/ui_data(mob/user) + var/list/available_reagents = list() + for(var/datum/reagent/reagent in stored_reagents.reagent_list) + if(reagent) + available_reagents.Add(list(list( + "name" = reagent.name, + "volume" = round(reagent.volume, 0.01) - 1, + "description" = reagent.description, + ))) // list in a list because Byond merges the first list... + + var/data = list() + data["theme"] = tgui_theme + data["maxVolume"] = max_volume_per_reagent + data["reagents"] = available_reagents + data["selectedReagent"] = selected_reagent?.name + return data + +/obj/item/reagent_containers/borghypo/attack_self(mob/user) + ui_interact(user) + +/obj/item/reagent_containers/borghypo/ui_act(action, params) + . = ..() + if(.) + return + + for(var/datum/reagent/reagent in stored_reagents.reagent_list) + if(reagent.name == action) + selected_reagent = reagent + . = TRUE + playsound(loc, 'sound/effects/pop.ogg', 50, FALSE) + + var/mob/living/silicon/robot/cyborg = src.loc + balloon_alert(cyborg, "dispensing [selected_reagent.name]") + break + +/obj/item/reagent_containers/borghypo/examine(mob/user) + . = ..() + . += "Currently loaded: [selected_reagent]. [selected_reagent.description]" + . += span_notice("Alt+Click to change transfer amount. Currently set to [amount_per_transfer_from_this]u.") + +/obj/item/reagent_containers/borghypo/AltClick(mob/living/user) + . = ..() + if(user.stat == DEAD || user != loc) + return //IF YOU CAN HEAR ME SET MY TRANSFER AMOUNT TO 1 + change_transfer_amount(user) + +/// Default Medborg Hypospray +/obj/item/reagent_containers/borghypo/medical + default_reagent_types = BASE_MEDICAL_REAGENTS + expanded_reagent_types = EXPANDED_MEDICAL_REAGENTS + +/// Upgrade our hypospray to hold even more new reagents! +/obj/item/reagent_containers/borghypo/medical/proc/upgrade_hypo() + upgraded = TRUE + // Expand the holder's capacity to allow for our new suite of reagents + stored_reagents.maximum_volume += (length(expanded_reagent_types) * (max_volume_per_reagent + 1)) + for(var/reagent in expanded_reagent_types) + var/datum/reagent/reagent_to_add = reagent + add_new_reagent(reagent_to_add) + +/// Remove the reagents we got from the expansion, back to our base reagents +/obj/item/reagent_containers/borghypo/medical/proc/remove_hypo_upgrade() + upgraded = FALSE + for(var/reagent in expanded_reagent_types) + var/datum/reagent/reagent_to_remove = reagent + stored_reagents.del_reagent(reagent_to_remove) + // Reduce the holder's capacity because we no longer need the room for those reagents + stored_reagents.maximum_volume -= (length(expanded_reagent_types) * (max_volume_per_reagent + 1)) + +/obj/item/reagent_containers/borghypo/medical/hacked + icon_state = "borghypo_s" + tgui_theme = "syndicate" + default_reagent_types = HACKED_MEDICAL_REAGENTS + +/// Peacekeeper hypospray +/obj/item/reagent_containers/borghypo/peace + name = "Peace Hypospray" + default_reagent_types = BASE_PEACE_REAGENTS + +/obj/item/reagent_containers/borghypo/peace/hacked + desc = "Everything's peaceful in death!" + icon_state = "borghypo_s" + tgui_theme = "syndicate" + default_reagent_types = HACKED_PEACE_REAGENTS + +/// Clownborg hypospray +/obj/item/reagent_containers/borghypo/clown + name = "laughter injector" + desc = "Keeps the crew happy and productive!" + default_reagent_types = BASE_CLOWN_REAGENTS + +/obj/item/reagent_containers/borghypo/clown/hacked + desc = "Keeps the crew so happy they don't work!" + icon_state = "borghypo_s" + tgui_theme = "syndicate" + default_reagent_types = HACKED_CLOWN_REAGENTS + +/// Syndicate medborg hypospray +/obj/item/reagent_containers/borghypo/syndicate + name = "syndicate cyborg hypospray" + desc = "An experimental piece of Syndicate technology used to produce powerful restorative nanites used to very quickly restore injuries of all types. \ + Also metabolizes potassium iodide for radiation poisoning, inacusiate for ear damage and morphine for offense." + icon_state = "borghypo_s" + tgui_theme = "syndicate" + charge_cost = 20 + recharge_time = 2 + default_reagent_types = BASE_SYNDICATE_REAGENTS + bypass_protection = TRUE + +/// Borg Shaker for the serviceborgs +/obj/item/reagent_containers/borghypo/borgshaker + name = "cyborg shaker" + desc = "An advanced drink synthesizer and mixer." + icon = 'icons/obj/drinks.dmi' + icon_state = "shaker" + possible_transfer_amounts = list(5,10,20) + // Lots of reagents all regenerating at once, so the charge cost is lower. They also regenerate faster. + charge_cost = 20 + recharge_time = 3 + dispensed_temperature = WATER_MATTERSTATE_CHANGE_TEMP //Water stays wet, ice stays ice + default_reagent_types = BASE_SERVICE_REAGENTS + +/obj/item/reagent_containers/borghypo/borgshaker/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "BorgShaker", name) + ui.open() + +/obj/item/reagent_containers/borghypo/borgshaker/ui_data(mob/user) + var/list/drink_reagents = list() + var/list/alcohol_reagents = list() + + for(var/datum/reagent/reagent in stored_reagents.reagent_list) + // Split the reagents into alcoholic/non-alcoholic + if(istype(reagent, /datum/reagent/consumable/ethanol)) + alcohol_reagents.Add(list(list( + "name" = reagent.name, + "volume" = round(reagent.volume, 0.01) - 1, + ))) // list in a list because Byond merges the first list... + else + drink_reagents.Add(list(list( + "name" = reagent.name, + "volume" = round(reagent.volume, 0.01) - 1, + ))) + + var/data = list() + data["theme"] = tgui_theme + data["minVolume"] = amount_per_transfer_from_this + data["sodas"] = drink_reagents + data["alcohols"] = alcohol_reagents + data["selectedReagent"] = selected_reagent?.name + return data + +/obj/item/reagent_containers/borghypo/borgshaker/attack(mob/M, mob/user) + return //Can't inject stuff with a shaker, can we? //not with that attitude + +/obj/item/reagent_containers/borghypo/borgshaker/afterattack(obj/target, mob/user, proximity) + . = ..() + if(!proximity) + return + if(!selected_reagent) + balloon_alert(user, "no reagent selected!") + return + if(target.is_refillable()) + if(!stored_reagents.has_reagent(selected_reagent.type, amount_per_transfer_from_this)) + balloon_alert(user, "not enough [selected_reagent.name]!") + return + if(target.reagents.total_volume >= target.reagents.maximum_volume) + balloon_alert(user, "[target] is full!") + return + + // This is the in-between where we're storing the reagent we're going to pour into the container + // because we cannot specify a singular reagent to transfer in trans_to + var/datum/reagents/shaker = new() + stored_reagents.remove_reagent(selected_reagent.type, amount_per_transfer_from_this) + shaker.add_reagent(selected_reagent.type, amount_per_transfer_from_this, reagtemp = dispensed_temperature, no_react = TRUE) + + shaker.trans_to(target, amount_per_transfer_from_this, transfered_by = user) + balloon_alert(user, "[amount_per_transfer_from_this] unit\s poured") + +/obj/item/reagent_containers/borghypo/borgshaker/hacked + name = "cyborg shaker" + desc = "Will mix drinks that knock them dead." + icon_state = "threemileislandglass" + tgui_theme = "syndicate" + dispensed_temperature = WATER_MATTERSTATE_CHANGE_TEMP + default_reagent_types = HACKED_SERVICE_REAGENTS + +#undef BASE_MEDICAL_REAGENTS +#undef EXPANDED_MEDICAL_REAGENTS +#undef HACKED_MEDICAL_REAGENTS +#undef BASE_PEACE_REAGENTS +#undef HACKED_PEACE_REAGENTS +#undef BASE_CLOWN_REAGENTS +#undef HACKED_CLOWN_REAGENTS +#undef BASE_SYNDICATE_REAGENTS +#undef BASE_SERVICE_REAGENTS +#undef HACKED_SERVICE_REAGENTS diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index 7fd57c3289b3f9..44d490bf14e350 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -145,9 +145,9 @@ to_chat(user, span_notice("You [chest.cell ? "replace [src]'s [chest.cell.name] with [temp_cell]" : "insert [temp_cell] into [src]"].")) chest.cell = temp_cell return TRUE + //ADD /obj/item/robot_suit/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/stack/sheet/iron)) var/obj/item/stack/sheet/iron/M = W if(!l_arm && !r_arm && !l_leg && !r_leg && !chest && !head) @@ -323,7 +323,7 @@ var/obj/item/borg/upgrade/ai/M = W if(check_completion()) if(!isturf(loc)) - to_chat(user, span_warning("You cannot install[M], the frame has to be standing on the ground to be perfectly precise!")) + to_chat(user, span_warning("You cannot install [M], the frame has to be standing on the ground to be perfectly precise!")) return if(!user.temporarilyRemoveItemFromInventory(M)) to_chat(user, span_warning("[M] is stuck to your hand!")) @@ -400,16 +400,19 @@ created_name = "" return created_name = new_name - log_game("[key_name(user)] have set \"[new_name]\" as a cyborg shell name at [loc_name(user)]") + log_silicon("[key_name(user)] has set \"[new_name]\" as a cyborg shell name at [loc_name(user)]") return TRUE if("locomotion") locomotion = !locomotion + log_silicon("[key_name(user)] has [locomotion ? "enabled" : "disabled"] movement on a cyborg shell at [loc_name(user)]") return TRUE if("panel") panel_locked = !panel_locked + log_silicon("[key_name(user)] has [panel_locked ? "locked" : "unlocked"] the panel on a cyborg shell at [loc_name(user)]") return TRUE if("aisync") aisync = !aisync + log_silicon("[key_name(user)] has [aisync ? "enabled" : "disabled"] the AI sync for a cyborg shell at [loc_name(user)]") return TRUE if("set_ai") var/selected_ai = select_active_ai(user, z) @@ -419,7 +422,9 @@ to_chat(user, span_alert("No active AIs detected.")) return forced_ai = selected_ai + log_silicon("[key_name(user)] set the default AI for a cyborg shell to [key_name(selected_ai)] at [loc_name(user)]") return TRUE if("lawsync") lawsync = !lawsync + log_silicon("[key_name(user)] has [lawsync ? "enabled" : "disabled"] the law sync for a cyborg shell at [loc_name(user)]") return TRUE diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index 90b70e89f8fbc3..f0e765ce7e0cca 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -399,26 +399,19 @@ /obj/item/borg/upgrade/hypospray/action(mob/living/silicon/robot/R, user = usr) . = ..() if(.) - for(var/obj/item/reagent_containers/borghypo/H in R.model.modules) - if(H.accepts_reagent_upgrades) - for(var/re in additional_reagents) - H.add_reagent(re) + for(var/obj/item/reagent_containers/borghypo/medical/H in R.model.modules) + H.upgrade_hypo() /obj/item/borg/upgrade/hypospray/deactivate(mob/living/silicon/robot/R, user = usr) . = ..() if (.) - for(var/obj/item/reagent_containers/borghypo/H in R.model.modules) - if(H.accepts_reagent_upgrades) - for(var/re in additional_reagents) - H.del_reagent(re) + for(var/obj/item/reagent_containers/borghypo/medical/H in R.model.modules) + H.remove_hypo_upgrade() /obj/item/borg/upgrade/hypospray/expanded name = "medical cyborg expanded hypospray" desc = "An upgrade to the Medical model's hypospray, allowing it \ to treat a wider range of conditions and problems." - additional_reagents = list(/datum/reagent/medicine/mannitol, /datum/reagent/medicine/oculine, /datum/reagent/medicine/inacusiate, - /datum/reagent/medicine/mutadone, /datum/reagent/medicine/haloperidol, /datum/reagent/medicine/oxandrolone, /datum/reagent/medicine/sal_acid, - /datum/reagent/medicine/rezadone, /datum/reagent/medicine/pen_acid) /obj/item/borg/upgrade/piercing_hypospray name = "cyborg piercing hypospray" @@ -550,32 +543,32 @@ desc = "A cyborg resizer, it makes a cyborg huge." icon_state = "cyborg_upgrade3" -/obj/item/borg/upgrade/expand/action(mob/living/silicon/robot/R, user = usr) +/obj/item/borg/upgrade/expand/action(mob/living/silicon/robot/robot, user = usr) . = ..() if(.) - if(R.hasExpanded) + if(robot.hasExpanded) to_chat(usr, span_warning("This unit already has an expand module installed!")) return FALSE - R.notransform = TRUE - var/prev_lockcharge = R.lockcharge - R.SetLockdown(TRUE) - R.set_anchored(TRUE) + robot.notransform = TRUE + var/prev_lockcharge = robot.lockcharge + robot.SetLockdown(TRUE) + robot.set_anchored(TRUE) var/datum/effect_system/fluid_spread/smoke/smoke = new - smoke.set_up(1, location = R.loc) + smoke.set_up(1, holder = robot, location = robot.loc) smoke.start() sleep(2) for(var/i in 1 to 4) - playsound(R, 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(robot, pick('sound/items/drill_use.ogg', 'sound/items/jaws_cut.ogg', 'sound/items/jaws_pry.ogg', 'sound/items/welder.ogg', 'sound/items/ratchet.ogg'), 80, TRUE, -1) sleep(12) if(!prev_lockcharge) - R.SetLockdown(FALSE) - R.set_anchored(FALSE) - R.notransform = FALSE - R.resize = 2 - R.hasExpanded = TRUE - R.update_transform() + robot.SetLockdown(FALSE) + robot.set_anchored(FALSE) + robot.notransform = FALSE + robot.resize = 2 + robot.hasExpanded = TRUE + robot.update_transform() /obj/item/borg/upgrade/expand/deactivate(mob/living/silicon/robot/R, user = usr) . = ..() @@ -656,6 +649,8 @@ var/mob/living/silicon/robot/Cyborg = usr GLOB.crewmonitor.show(Cyborg,Cyborg) +/datum/action/item_action/crew_monitor + name = "Interface With Crew Monitor" /obj/item/borg/upgrade/transform name = "borg model picker (Standard)" diff --git a/code/game/objects/items/scrolls.dm b/code/game/objects/items/scrolls.dm index 108cb8c0e0cdd8..46b1955b1d0369 100644 --- a/code/game/objects/items/scrolls.dm +++ b/code/game/objects/items/scrolls.dm @@ -9,9 +9,22 @@ throw_speed = 3 throw_range = 7 resistance_flags = FLAMMABLE - /// Number of uses remaining + actions_types = list(/datum/action/cooldown/spell/teleport/area_teleport/wizard/scroll) + /// Number of uses the scroll gets. var/uses = 4 +/obj/item/teleportation_scroll/Initialize(mapload) + . = ..() + // In the future, this can be generalized into just "magic scrolls that give you a specific spell". + var/datum/action/cooldown/spell/teleport/area_teleport/wizard/scroll/teleport = locate() in actions + if(teleport) + teleport.name = name + teleport.icon_icon = icon + teleport.button_icon_state = icon_state + +/obj/item/teleportation_scroll/item_action_slot_check(slot, mob/user) + return (slot == ITEM_SLOT_HANDS) + /obj/item/teleportation_scroll/apprentice name = "lesser scroll of teleportation" uses = 1 @@ -22,54 +35,24 @@ . += "It has [uses] use\s remaining." /obj/item/teleportation_scroll/attack_self(mob/user) + . = ..() + if(.) + return + if(!uses) return if(!ishuman(user)) return var/mob/living/carbon/human/human_user = user - if(human_user.incapacitated()) + if(human_user.incapacitated() || !human_user.is_holding(src)) return - if(!human_user.is_holding(src)) + var/datum/action/cooldown/spell/teleport/area_teleport/wizard/scroll/teleport = locate() in actions + if(!teleport) + to_chat(user, span_warning("[src] seems to be a faulty teleportation scroll, and has no magic associated.")) return - teleportscroll(human_user) - -/** - * Shows a list of a possible teleport destinations to a user and then teleports him to to his chosen destination - * - * Arguments: - * * user The mob that is being teleported - */ -/obj/item/teleportation_scroll/proc/teleportscroll(mob/user) - if(!length(GLOB.teleportlocs)) - to_chat(user, span_warning("There are no locations available")) + if(!teleport.Activate(user)) return - var/jump_target = tgui_input_list(user, "Area to jump to", "BOOYEA", GLOB.teleportlocs) - if(isnull(jump_target)) - return - if(!src || QDELETED(src) || !user || !user.is_holding(src) || user.incapacitated() || !uses) - return - var/area/thearea = GLOB.teleportlocs[jump_target] - - var/datum/effect_system/fluid_spread/smoke/smoke = new - smoke.set_up(2, location = user.loc) - smoke.attach(user) - smoke.start() - var/list/possible_locations = list() - for(var/turf/target_turf in get_area_turfs(thearea.type)) - if(!target_turf.is_blocked_turf()) - possible_locations += target_turf - - if(!length(possible_locations)) - to_chat(user, span_warning("The spell matrix was unable to locate a suitable teleport destination for an unknown reason.")) - return - - if(do_teleport(user, pick(possible_locations), channel = TELEPORT_CHANNEL_MAGIC, forced = TRUE)) - smoke.start() - uses-- - if(!uses) - to_chat(user, span_warning("[src] has run out of uses and crumbles to dust!")) - qdel(src) - else - to_chat(user, span_notice("[src] has [uses] use\s remaining.")) - else - to_chat(user, span_warning("The spell matrix was disrupted by something near the destination.")) + if(--uses <= 0) + to_chat(user, span_warning("[src] runs out of uses and crumbles to dust!")) + qdel(src) + return TRUE diff --git a/code/game/objects/items/signs.dm b/code/game/objects/items/signs.dm index 6c7bb2e4e5cb1d..6a10765044220c 100644 --- a/code/game/objects/items/signs.dm +++ b/code/game/objects/items/signs.dm @@ -56,6 +56,15 @@ animate(pixel_y = user.pixel_y + (1 * direction), time = 1, easing = SINE_EASING) user.changeNext_move(CLICK_CD_MELEE) +/datum/action/item_action/nano_picket_sign + name = "Retext Nano Picket Sign" + +/datum/action/item_action/nano_picket_sign/Trigger(trigger_flags) + if(!istype(target, /obj/item/picket_sign)) + return + var/obj/item/picket_sign/sign = target + sign.retext(owner) + /datum/crafting_recipe/picket_sign name = "Picket Sign" result = /obj/item/picket_sign diff --git a/code/game/objects/items/spear.dm b/code/game/objects/items/spear.dm index b317717f627b3c..764f706af5e09b 100644 --- a/code/game/objects/items/spear.dm +++ b/code/game/objects/items/spear.dm @@ -10,6 +10,7 @@ slot_flags = ITEM_SLOT_BACK throwforce = 20 throw_speed = 4 + demolition_mod = 0.75 embedding = list("impact_pain_mult" = 2, "remove_pain_mult" = 4, "jostle_chance" = 2.5) armour_penetration = 10 custom_materials = list(/datum/material/iron=1150, /datum/material/glass=2075) diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm index eddbe273904f99..f8067896b1d5d8 100644 --- a/code/game/objects/items/stacks/rods.dm +++ b/code/game/objects/items/stacks/rods.dm @@ -7,6 +7,7 @@ GLOBAL_LIST_INIT(rod_recipes, list ( \ new/datum/stack_recipe("tank holder", /obj/structure/tank_holder, 2, time = 5, one_per_turf = TRUE, on_floor = FALSE), \ new/datum/stack_recipe("ladder", /obj/structure/ladder/crafted, 15, time = 150, one_per_turf = TRUE, on_floor = FALSE), \ new/datum/stack_recipe("catwalk floor tile", /obj/item/stack/tile/catwalk_tile, 1, 4, 20), \ + new/datum/stack_recipe("white cane", /obj/item/cane/white, 3, time = 10, one_per_turf = FALSE), \ )) /obj/item/stack/rods @@ -21,6 +22,7 @@ GLOBAL_LIST_INIT(rod_recipes, list ( \ throwforce = 10 throw_speed = 3 throw_range = 7 + demolition_mod = 1.25 mats_per_unit = list(/datum/material/iron=1000) max_amount = 50 attack_verb_continuous = list("hits", "bludgeons", "whacks") diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index 628b60dc925907..603585f1f755bf 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -77,7 +77,8 @@ GLOBAL_LIST_INIT(glass_recipes, list ( \ GLOBAL_LIST_INIT(pglass_recipes, list ( \ new/datum/stack_recipe("directional window", /obj/structure/window/plasma/unanchored, time = 0, on_floor = TRUE, window_checks = TRUE), \ new/datum/stack_recipe("fulltile window", /obj/structure/window/plasma/fulltile/unanchored, 2, time = 0, on_floor = TRUE, window_checks = TRUE), \ - new/datum/stack_recipe("plasma glass shard", /obj/item/shard/plasma, time = 20, on_floor = TRUE) \ + new/datum/stack_recipe("plasma glass shard", /obj/item/shard/plasma, time = 20, on_floor = TRUE), \ + new/datum/stack_recipe("plasma glass tile", /obj/item/stack/tile/glass/plasma, 1, 4, 20) \ )) /obj/item/stack/sheet/plasmaglass @@ -184,7 +185,8 @@ GLOBAL_LIST_INIT(reinforced_glass_recipes, list ( \ GLOBAL_LIST_INIT(prglass_recipes, list ( \ new/datum/stack_recipe("directional reinforced window", /obj/structure/window/reinforced/plasma/unanchored, time = 0, on_floor = TRUE, window_checks = TRUE), \ new/datum/stack_recipe("fulltile reinforced window", /obj/structure/window/reinforced/plasma/fulltile/unanchored, 2, time = 0, on_floor = TRUE, window_checks = TRUE), \ - new/datum/stack_recipe("plasma glass shard", /obj/item/shard/plasma, time = 40, on_floor = TRUE) \ + new/datum/stack_recipe("plasma glass shard", /obj/item/shard/plasma, time = 40, on_floor = TRUE), \ + new/datum/stack_recipe("reinforced plasma glass tile", /obj/item/stack/tile/rglass/plasma, 1, 4, 20) \ )) /obj/item/stack/sheet/plasmarglass diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index c98ab48efcf300..ef097aa51b6010 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -357,7 +357,7 @@ return if(!is_valid_recipe(recipe, recipes)) //href exploit protection return - if(!multiplier || (multiplier <= 0)) //href exploit protection + if(!multiplier || multiplier < 1) //href exploit protection return if(!building_checks(builder, recipe, multiplier)) return diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index 4277eb55f5a15d..8f8f137a6f81f9 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -1262,3 +1262,21 @@ /obj/item/stack/tile/rglass/sixty amount = 60 + +/obj/item/stack/tile/glass/plasma + name = "plasma glass floor" + singular_name = "plasma glass floor tile" + desc = "Plasma glass window floors, for when... Whatever is down there is too scary for normal glass." + icon_state = "tile_pglass" + turf_type = /turf/open/floor/glass/plasma + merge_type = /obj/item/stack/tile/glass/plasma + mats_per_unit = list(/datum/material/alloy/plasmaglass = MINERAL_MATERIAL_AMOUNT * 0.25) + +/obj/item/stack/tile/rglass/plasma + name = "reinforced plasma glass floor" + singular_name = "reinforced plasma glass floor tile" + desc = "Reinforced plasma glass window floors, because whatever's downstairs should really stay down there." + icon_state = "tile_rpglass" + turf_type = /turf/open/floor/glass/reinforced/plasma + merge_type = /obj/item/stack/tile/rglass/plasma + mats_per_unit = list(/datum/material/iron = MINERAL_MATERIAL_AMOUNT * 0.125, /datum/material/alloy/plasmaglass = MINERAL_MATERIAL_AMOUNT * 0.25) diff --git a/code/game/objects/items/stacks/wrap.dm b/code/game/objects/items/stacks/wrap.dm index 21e0910ff39b04..f42d2cfc74d6ba 100644 --- a/code/game/objects/items/stacks/wrap.dm +++ b/code/game/objects/items/stacks/wrap.dm @@ -78,14 +78,14 @@ /obj/item/stack/package_wrap/suicide_act(mob/living/user) user.visible_message(span_suicide("[user] begins wrapping [user.p_them()]self in \the [src]! It looks like [user.p_theyre()] trying to commit suicide!")) if(use(3)) - var/obj/item/delivery/big/P = new(get_turf(user.loc)) - P.base_icon_state = "deliverypackage5" - P.update_icon() - user.forceMove(P) - P.add_fingerprint(user) + var/obj/item/delivery/big/parcel = new(get_turf(user.loc)) + parcel.base_icon_state = "deliverypackage5" + parcel.update_icon() + user.forceMove(parcel) + parcel.add_fingerprint(user) return OXYLOSS else - to_chat(user, span_warning("You need more paper!")) + balloon_alert(user, span_warning("You need more paper!")) return SHAME /obj/item/proc/can_be_package_wrapped() //can the item be wrapped with package wrapper into a delivery package @@ -110,48 +110,68 @@ return if(isitem(target)) - var/obj/item/I = target - if(!I.can_be_package_wrapped()) + var/obj/item/item = target + if(!item.can_be_package_wrapped()) + balloon_alert(user, "The [target] can not be wrapped!") return - if(user.is_holding(I)) - if(!user.dropItemToGround(I)) + if(user.is_holding(item)) + if(!user.dropItemToGround(item)) return - else if(!isturf(I.loc)) + else if(!isturf(item.loc)) return if(use(1)) - var/obj/item/delivery/small/P = new(get_turf(I.loc)) - if(user.Adjacent(I)) - P.add_fingerprint(user) - I.add_fingerprint(user) - user.put_in_hands(P) - I.forceMove(P) - var/size = round(I.w_class) - P.name = "[weight_class_to_text(size)] parcel" - P.w_class = size + var/obj/item/delivery/small/parcel = new(get_turf(item.loc)) + if(user.Adjacent(item)) + parcel.add_fingerprint(user) + item.add_fingerprint(user) + user.put_in_hands(parcel) + item.forceMove(parcel) + var/size = round(item.w_class) + parcel.name = "[weight_class_to_text(size)] parcel" + parcel.w_class = size size = min(size, 5) - P.base_icon_state = "deliverypackage[size]" - P.update_icon() + parcel.base_icon_state = "deliverypackage[size]" + parcel.update_icon() - else if(istype (target, /obj/structure/closet)) - var/obj/structure/closet/O = target - if(O.opened) + else if(istype(target, /obj/structure/closet)) + var/obj/structure/closet/closet = target + if(closet.opened) + balloon_alert(user, span_warning("You can not wrap the [target] while it is opened!")) return - if(!O.delivery_icon) //no delivery icon means unwrappable closet (e.g. body bags) - to_chat(user, span_warning("You can't wrap this!")) + if(!closet.delivery_icon) //no delivery icon means unwrappable closet (e.g. body bags) + balloon_alert(user, span_warning("You can't wrap this!")) return if(use(3)) - var/obj/item/delivery/big/P = new(get_turf(O.loc)) - P.base_icon_state = O.delivery_icon - P.update_icon() - P.drag_slowdown = O.drag_slowdown - O.forceMove(P) - P.add_fingerprint(user) - O.add_fingerprint(user) + var/obj/item/delivery/big/parcel = new(get_turf(closet.loc)) + parcel.base_icon_state = closet.delivery_icon + parcel.update_icon() + parcel.drag_slowdown = closet.drag_slowdown + closet.forceMove(parcel) + parcel.add_fingerprint(user) + closet.add_fingerprint(user) else - to_chat(user, span_warning("You need more paper!")) + balloon_alert(user, span_warning("You need more paper!")) return + + else if(istype(target, /obj/machinery/portable_atmospherics)) + var/obj/machinery/portable_atmospherics/portable_atmospherics = target + if(portable_atmospherics.anchored) + balloon_alert(user, span_warning("You can not wrap the [target] while it is anchored!")) + return + if(use(3)) + var/obj/item/delivery/big/parcel = new(get_turf(portable_atmospherics.loc)) + parcel.base_icon_state = "deliverybox" + parcel.update_icon() + parcel.drag_slowdown = portable_atmospherics.drag_slowdown + portable_atmospherics.forceMove(parcel) + parcel.add_fingerprint(user) + portable_atmospherics.add_fingerprint(user) + else + balloon_alert(user, span_warning("You need more paper!")) + return + else - to_chat(user, span_warning("The object you are trying to wrap is unsuitable for the sorting machinery!")) + balloon_alert(user, span_warning("The object you are trying to wrap is unsuitable for the sorting machinery!")) return user.visible_message(span_notice("[user] wraps [target].")) diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index 1cfc2ddedbb560..8a4bffbbfd4290 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -352,19 +352,18 @@ /obj/item/storage/backpack/duffelbag/cursed name = "living duffel bag" - desc = "A cursed clown duffel bag that hungers for food of any kind.\n A warning label suggests that it eats food inside. If that food happens to be a horribly ruined, burned mess the chef scrapped out of the microwave, then it might have negative effects on the bag..." + desc = "A cursed clown duffel bag that hungers for food of any kind. A warning label suggests that it eats food inside. \ + If that food happens to be a horribly ruined mess or the chef scrapped out of the microwave, or poisoned in some way, \ + then it might have negative effects on the bag..." icon_state = "duffel-curse" inhand_icon_state = "duffel-curse" slowdown = 2 item_flags = DROPDEL max_integrity = 100 - ///counts time passed since it ate food - var/hunger = 0 /obj/item/storage/backpack/duffelbag/cursed/Initialize(mapload) . = ..() - var/add_dropdel = TRUE //clarified boolean - AddComponent(/datum/component/curse_of_hunger, add_dropdel) + AddComponent(/datum/component/curse_of_hunger, add_dropdel = TRUE) /obj/item/storage/backpack/duffelbag/captain name = "captain's duffel bag" @@ -680,4 +679,3 @@ name = "police bag" desc = "A large duffel bag for holding extra police gear." slowdown = 0 - diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index 651c47fe38243a..9ecfa0a5822873 100644 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -52,6 +52,7 @@ /obj/item/assembly/signaler, /obj/item/clothing/gloves, /obj/item/construction/rcd, + /obj/item/construction/rld, /obj/item/crowbar, /obj/item/extinguisher/mini, /obj/item/flashlight, @@ -287,6 +288,30 @@ to_preload += /obj/item/reagent_containers/glass/bottle/formaldehyde return to_preload +/obj/item/storage/belt/medical/ert + preload = TRUE + +/obj/item/storage/belt/medical/ert/PopulateContents() + SSwardrobe.provide_type(/obj/item/sensor_device, src) + SSwardrobe.provide_type(/obj/item/pinpointer/crew, src) + SSwardrobe.provide_type(/obj/item/scalpel/advanced, src) + SSwardrobe.provide_type(/obj/item/retractor/advanced, src) + SSwardrobe.provide_type(/obj/item/stack/medical/bone_gel, src) + SSwardrobe.provide_type(/obj/item/cautery/advanced, src) + SSwardrobe.provide_type(/obj/item/surgical_drapes, src) + update_appearance() + +/obj/item/storage/belt/medical/ert/get_types_to_preload() + var/list/to_preload = list() + to_preload += /obj/item/sensor_device + to_preload += /obj/item/pinpointer/crew + to_preload += /obj/item/scalpel/advanced + to_preload += /obj/item/retractor/advanced + to_preload += /obj/item/stack/medical/bone_gel + to_preload += /obj/item/cautery/advanced + to_preload += /obj/item/surgical_drapes + return to_preload + /obj/item/storage/belt/security name = "security belt" desc = "Can hold security gear like handcuffs and flashes." @@ -366,7 +391,7 @@ /obj/item/lighter, /obj/item/mining_scanner, /obj/item/multitool, - /obj/item/organ/regenerative_core, + /obj/item/organ/internal/regenerative_core, /obj/item/pickaxe, /obj/item/radio, /obj/item/reagent_containers/food/drinks, diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm index 3a0758a5181b7f..8e15a8ee4ae5ea 100644 --- a/code/game/objects/items/storage/boxes.dm +++ b/code/game/objects/items/storage/boxes.dm @@ -116,8 +116,10 @@ var/medipen_type = /obj/item/reagent_containers/hypospray/medipen /obj/item/storage/box/survival/PopulateContents() - if(!isplasmaman(loc)) + if(!isnull(mask_type)) new mask_type(src) + + if(!isplasmaman(loc)) new internal_type(src) else new /obj/item/tank/internals/plasmaman/belt(src) @@ -451,9 +453,9 @@ /obj/item/storage/box/donkpockets name = "box of donk-pockets" - desc = "Instructions: Heat in microwave. Product will cool if not eaten within seven minutes." + desc = "Instructions: Heat in microwave. Product will stay perpetually warmed with cutting edge Donk Co. technology." icon_state = "donkpocketbox" - illustration=null + illustration = null var/donktype = /obj/item/food/donkpocket /obj/item/storage/box/donkpockets/PopulateContents() @@ -815,6 +817,10 @@ playsound(loc, SFX_RUSTLE, 50, TRUE, -5) user.visible_message(span_notice("[user] hugs \the [src]."),span_notice("You hug \the [src].")) +/obj/item/storage/box/hug/black + icon_state = "hugbox_black" + illustration = "heart_black" + /////clown box & honkbot assembly /obj/item/storage/box/clown name = "clown box" @@ -852,7 +858,18 @@ // Clown survival box /obj/item/storage/box/hug/survival/PopulateContents() - new /obj/item/clothing/mask/breath(src) + new /obj/item/reagent_containers/hypospray/medipen(src) + + if(!isplasmaman(loc)) + new /obj/item/tank/internals/emergency_oxygen(src) + else + new /obj/item/tank/internals/plasmaman/belt(src) + + if(HAS_TRAIT(SSstation, STATION_TRAIT_PREMIUM_INTERNALS)) + new /obj/item/flashlight/flare(src) + new /obj/item/radio/off(src) + +/obj/item/storage/box/hug/black/survival/PopulateContents() new /obj/item/reagent_containers/hypospray/medipen(src) if(!isplasmaman(loc)) @@ -1680,3 +1697,84 @@ /obj/item/food/sustenance_bar/wonka = 1)) new randomFood(src) new /obj/item/storage/box/gum/wake_up(src) + +/obj/item/storage/box/tiziran_goods + name = "Tiziran Farm-Fresh Pack" + desc = "A box containing an assortment of fresh Tiziran goods- perfect for making the foods of the Lizard Empire." + icon_state = "lizard_package" + illustration = null + +/obj/item/storage/box/tiziran_goods/PopulateContents() + for(var/i in 1 to 12) + var/randomFood = pick_weight(list(/obj/item/food/grown/korta_nut = 10, + /obj/item/food/rootroll = 5, + /obj/item/food/root_flatbread = 5, + /obj/item/food/spaghetti/nizaya = 5, + /obj/item/food/moonfish_caviar = 5, + /obj/item/food/liver_pate = 5, + /obj/item/food/lizard_dumplings = 5, + /obj/item/food/grown/korta_nut/sweet = 2, + /obj/item/food/grown/ash_flora/seraka = 2, + /obj/item/food/bread/root = 2)) + new randomFood(src) + +/obj/item/storage/box/tiziran_cans + name = "Tiziran Canned Goods Pack" + desc = "A box containing an assortment of canned Tiziran goods- to be eaten as is, or used in cooking." + icon_state = "lizard_package" + illustration = null + +/obj/item/storage/box/tiziran_cans/PopulateContents() + for(var/i in 1 to 8) + var/randomFood = pick_weight(list(/obj/item/food/desert_snails = 5, + /obj/item/food/larvae = 5, + /obj/item/food/canned_jellyfish = 5)) + new randomFood(src) + +/obj/item/storage/box/tiziran_meats + name = "Tiziran Meatmarket Pack" + desc = "A box containing an assortment of fresh-frozen Tiziran meats and fish- the keys to lizard cooking." + icon_state = "lizard_package" + illustration = null + +/obj/item/storage/box/tiziran_meats/PopulateContents() + for(var/i in 1 to 10) + var/randomFood = pick_weight(list(/obj/item/food/meat/slab = 5, + /obj/item/food/fishmeat/moonfish = 5, + /obj/item/food/fishmeat/armorfish = 5, + /obj/item/food/fishmeat/gunner_jellyfish = 5)) + new randomFood(src) + +/obj/item/storage/box/mothic_goods + name = "Mothic Farm-Fresh Pack" + desc = "A box containing an assortment of Mothic cooking supplies." + icon_state = "moth_package" + illustration = null + +/obj/item/storage/box/mothic_goods/PopulateContents() + for(var/i in 1 to 12) + var/randomFood = pick_weight(list(/obj/item/food/grown/toechtauese = 10, + /obj/item/reagent_containers/food/condiment/cornmeal = 5, + /obj/item/reagent_containers/food/condiment/yoghurt = 5, + /obj/item/reagent_containers/food/condiment/quality_oil = 5, + /obj/item/food/cheese/mozzarella = 5, + /obj/item/food/cheese/firm_cheese = 5, + /obj/item/food/cheese/wheel = 5, + /obj/item/food/cheese/cheese_curds = 5, + /obj/item/food/cheese/curd_cheese = 5)) + new randomFood(src) + +/obj/item/storage/box/mothic_cans_sauces + name = "Mothic Pantry Pack" + desc = "A box containing an assortment of Mothic canned goods and premade sauces." + icon_state = "moth_package" + illustration = null + +/obj/item/storage/box/mothic_cans_sauces/PopulateContents() + for(var/i in 1 to 8) + var/randomFood = pick_weight(list(/obj/item/food/tomato_sauce = 5, + /obj/item/food/bechamel_sauce = 5, + /obj/item/food/pesto = 5, + /obj/item/food/canned/tomatoes = 5, + /obj/item/food/canned/pine_nuts = 5)) + new randomFood(src) diff --git a/code/game/objects/items/storage/holsters.dm b/code/game/objects/items/storage/holsters.dm index ce8cda00113160..8115d891699660 100644 --- a/code/game/objects/items/storage/holsters.dm +++ b/code/game/objects/items/storage/holsters.dm @@ -117,6 +117,7 @@ chameleon_action.chameleon_type = /obj/item/storage/belt chameleon_action.chameleon_name = "Belt" chameleon_action.initialize_disguises() + add_item_action(chameleon_action) /obj/item/storage/belt/holster/chameleon/ComponentInitialize() . = ..() diff --git a/code/game/objects/items/storage/medkit.dm b/code/game/objects/items/storage/medkit.dm index 76c2d3f6ab7e6c..b6ced74e03bdfc 100644 --- a/code/game/objects/items/storage/medkit.dm +++ b/code/game/objects/items/storage/medkit.dm @@ -369,7 +369,7 @@ /obj/item/storage/pill_bottle/probital name = "bottle of probital pills" - desc = "Contains pills used to treat brute damage.The tag in the bottle states 'Eat before ingesting, may cause fatigue'." + desc = "Contains pills used to treat brute damage. The tag in the bottle states 'Eat before ingesting, may cause fatigue'." /obj/item/storage/pill_bottle/probital/PopulateContents() for(var/i in 1 to 4) @@ -377,7 +377,7 @@ /obj/item/storage/pill_bottle/iron name = "bottle of iron pills" - desc = "Contains pills used to reduce blood loss slowly.The tag in the bottle states 'Only take one each five minutes'." + desc = "Contains pills used to reduce blood loss slowly. The tag in the bottle states 'Only take one each five minutes'." /obj/item/storage/pill_bottle/iron/PopulateContents() for(var/i in 1 to 4) diff --git a/code/game/objects/items/storage/toolbox.dm b/code/game/objects/items/storage/toolbox.dm index d3646c5c00b62e..2c64585b7e32b6 100644 --- a/code/game/objects/items/storage/toolbox.dm +++ b/code/game/objects/items/storage/toolbox.dm @@ -11,6 +11,7 @@ throwforce = 12 throw_speed = 2 throw_range = 7 + demolition_mod = 1.25 w_class = WEIGHT_CLASS_BULKY custom_materials = list(/datum/material/iron = 500) attack_verb_continuous = list("robusts") @@ -279,6 +280,7 @@ var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_items = 10 STR.max_w_class = WEIGHT_CLASS_NORMAL + STR.max_combined_w_class = 24 STR.set_holdable(list( /obj/item/clothing/head/helmet/infiltrator, /obj/item/clothing/suit/armor/vest/infiltrator, diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm index c99bd3ba19c041..b02c974e1edd6a 100644 --- a/code/game/objects/items/storage/uplink_kits.dm +++ b/code/game/objects/items/storage/uplink_kits.dm @@ -190,7 +190,7 @@ new /obj/item/clothing/suit/hooded/chaplain_hoodie(src) new /obj/item/card/id/advanced/chameleon(src) new /obj/item/clothing/shoes/chameleon/noslip(src) //because slipping while being a dark lord sucks - new /obj/item/book/granter/spell/summonitem(src) + new /obj/item/book/granter/action/spell/summonitem(src) if(KIT_WHITE_WHALE_HOLY_GRAIL) //Unique items that don't appear anywhere else new /obj/item/gun/ballistic/rifle/boltaction/harpoon(src) @@ -508,8 +508,8 @@ new /obj/item/gun/ballistic/revolver/reverse(src) /obj/item/storage/box/syndie_kit/mimery/PopulateContents() - new /obj/item/book/granter/spell/mimery_blockade(src) - new /obj/item/book/granter/spell/mimery_guns(src) + new /obj/item/book/granter/action/spell/mime/mimery_blockade(src) + new /obj/item/book/granter/action/spell/mime/mimery_guns(src) /obj/item/storage/box/syndie_kit/centcom_costume/PopulateContents() new /obj/item/clothing/under/rank/centcom/officer(src) diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm index 093048267da91d..6a50e0fb7c6f8b 100644 --- a/code/game/objects/items/tanks/tanks.dm +++ b/code/game/objects/items/tanks/tanks.dm @@ -22,6 +22,7 @@ throwforce = 10 throw_speed = 1 throw_range = 4 + demolition_mod = 1.25 custom_materials = list(/datum/material/iron = 500) actions_types = list(/datum/action/item_action/set_internals) armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 0, FIRE = 80, ACID = 30) @@ -89,7 +90,7 @@ AddComponent(/datum/component/atmos_reaction_recorder, reset_criteria = list(COMSIG_GASMIX_MERGING = air_contents, COMSIG_GASMIX_REMOVING = air_contents), target_list = reaction_info) - // This is separate from the reaction recorder. + // This is separate from the reaction recorder. // In this case we are only listening to determine if the tank is overpressurized but not destroyed. RegisterSignal(air_contents, COMSIG_GASMIX_MERGED, .proc/merging_information) diff --git a/code/game/objects/items/tanks/watertank.dm b/code/game/objects/items/tanks/watertank.dm index 3cf32f9e273232..df71835cdfa6a0 100644 --- a/code/game/objects/items/tanks/watertank.dm +++ b/code/game/objects/items/tanks/watertank.dm @@ -364,7 +364,7 @@ /obj/effect/resin_container/proc/Smoke() var/datum/effect_system/fluid_spread/foam/metal/resin/foaming = new - foaming.set_up(4, location = src) + foaming.set_up(4, holder = src, location = loc) foaming.start() playsound(src,'sound/effects/bamf.ogg',100,TRUE) qdel(src) @@ -470,3 +470,6 @@ reagents.trans_to(user, used_amount, multiplier=usage_ratio, methods = INJECT) update_appearance() user.update_inv_back() //for overlays update + +/datum/action/item_action/activate_injector + name = "Activate Injector" diff --git a/code/game/objects/items/tools/crowbar.dm b/code/game/objects/items/tools/crowbar.dm index 6982f0b74db736..dcc4b4d17ca4c0 100644 --- a/code/game/objects/items/tools/crowbar.dm +++ b/code/game/objects/items/tools/crowbar.dm @@ -10,6 +10,7 @@ slot_flags = ITEM_SLOT_BELT force = 5 throwforce = 7 + demolition_mod = 1.25 w_class = WEIGHT_CLASS_SMALL custom_materials = list(/datum/material/iron=50) drop_sound = 'sound/items/handling/crowbar_drop.ogg' @@ -43,7 +44,7 @@ /obj/item/crowbar/large - name = "crowbar" + name = "large crowbar" desc = "It's a big crowbar. It doesn't fit in your pockets, because it's big." force = 12 w_class = WEIGHT_CLASS_NORMAL @@ -55,6 +56,11 @@ worn_icon_state = "crowbar" toolspeed = 0.7 +/obj/item/crowbar/large/emergency + name = "emergency crowbar" + desc = "It's a bulky crowbar. It almost seems deliberately designed to not be able to fit inside of a backpack." + w_class = WEIGHT_CLASS_BULKY + /obj/item/crowbar/large/heavy //from space ruin name = "heavy crowbar" desc = "It's a big crowbar. It doesn't fit in your pockets, because it's big. It feels oddly heavy.." diff --git a/code/game/objects/items/tools/screwdriver.dm b/code/game/objects/items/tools/screwdriver.dm index 4976e7e891529e..0a840481a200be 100644 --- a/code/game/objects/items/tools/screwdriver.dm +++ b/code/game/objects/items/tools/screwdriver.dm @@ -11,6 +11,7 @@ flags_1 = CONDUCT_1 | IS_PLAYER_COLORABLE_1 slot_flags = ITEM_SLOT_BELT force = 5 + demolition_mod = 0.5 w_class = WEIGHT_CLASS_TINY throwforce = 5 throw_speed = 3 diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm index 34374c897337c1..ce468a70129ad6 100644 --- a/code/game/objects/items/tools/weldingtool.dm +++ b/code/game/objects/items/tools/weldingtool.dm @@ -120,6 +120,11 @@ dyn_explosion(src, plasmaAmount/5, explosion_cause = src) // 20 plasma in a standard welder has a 4 power explosion. no breaches, but enough to kill/dismember holder qdel(src) +/obj/item/weldingtool/use_tool(atom/target, mob/living/user, delay, amount, volume, datum/callback/extra_checks) + target.add_overlay(GLOB.welding_sparks) + . = ..() + target.cut_overlay(GLOB.welding_sparks) + /obj/item/weldingtool/attack(mob/living/carbon/human/attacked_humanoid, mob/living/user) if(!istype(attacked_humanoid)) return ..() @@ -229,7 +234,6 @@ set_welding(!welding) if(welding) if(get_fuel() >= 1) - to_chat(user, span_notice("You switch [src] on.")) playsound(loc, activation_sound, 50, TRUE) force = 15 damtype = BURN @@ -237,10 +241,9 @@ update_appearance() START_PROCESSING(SSobj, src) else - to_chat(user, span_warning("You need more fuel!")) + balloon_alert(user, "no fuel!") switched_off(user) else - to_chat(user, span_notice("You switch [src] off.")) playsound(loc, deactivation_sound, 50, TRUE) switched_off(user) diff --git a/code/game/objects/items/tools/wrench.dm b/code/game/objects/items/tools/wrench.dm index 2c72e0b6539203..874b979c80c029 100644 --- a/code/game/objects/items/tools/wrench.dm +++ b/code/game/objects/items/tools/wrench.dm @@ -10,6 +10,7 @@ slot_flags = ITEM_SLOT_BELT force = 5 throwforce = 7 + demolition_mod = 1.25 w_class = WEIGHT_CLASS_SMALL usesound = 'sound/items/ratchet.ogg' custom_materials = list(/datum/material/iron=150) @@ -88,7 +89,6 @@ attack_verb_continuous = list("devastates", "brutalizes", "commits a war crime against", "obliterates", "humiliates") attack_verb_simple = list("devastate", "brutalize", "commit a war crime against", "obliterate", "humiliate") tool_behaviour = null - toolspeed = null /obj/item/wrench/combat/Initialize(mapload) . = ..() @@ -110,10 +110,8 @@ if(active) tool_behaviour = TOOL_WRENCH - toolspeed = 1 else tool_behaviour = initial(tool_behaviour) - toolspeed = initial(toolspeed) balloon_alert(user, "[name] [active ? "active, woe!":"restrained"]") playsound(user ? user : src, active ? 'sound/weapons/saberon.ogg' : 'sound/weapons/saberoff.ogg', 5, TRUE) diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index 5dd708b39b8041..e493943b90d2f6 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -446,6 +446,41 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 attack_verb_continuous = list("bludgeons", "whacks", "disciplines", "thrashes") attack_verb_simple = list("bludgeon", "whack", "discipline", "thrash") +/obj/item/cane/white + name = "white cane" + desc = "A cane traditionally used by the blind to help them see. Folds down to be easier to transport." + icon_state = "cane_white" + inhand_icon_state = null + lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi' + force = 1 + w_class = WEIGHT_CLASS_SMALL + custom_materials = list(/datum/material/iron = 600) + +/obj/item/cane/white/Initialize(mapload) + . = ..() + AddComponent(/datum/component/transforming, \ + force_on = 7, \ + hitsound_on = hitsound, \ + w_class_on = WEIGHT_CLASS_BULKY, \ + clumsy_check = FALSE, \ + attack_verb_continuous_on = list("smacks", "strikes", "cracks", "beats"), \ + attack_verb_simple_on = list("smack", "strike", "crack", "beat")) + RegisterSignal(src, COMSIG_TRANSFORMING_ON_TRANSFORM, .proc/on_transform) + ADD_TRAIT(src, TRAIT_BLIND_TOOL, ITEM_BLIND_TRAIT) + +/* + * Signal proc for [COMSIG_TRANSFORMING_ON_TRANSFORM]. + * + * Gives feedback to the user and makes it show up inhand. + */ +/obj/item/cane/white/proc/on_transform(obj/item/source, mob/user, active) + SIGNAL_HANDLER + + balloon_alert(user, active ? "extended" : "collapsed") + playsound(user ? user : src, 'sound/weapons/batonextend.ogg', 50, TRUE) + return COMPONENT_NO_DEFAULT_MESSAGE + /obj/item/staff name = "wizard staff" desc = "Apparently a staff used by the wizard." @@ -644,6 +679,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 force = 12 wound_bonus = -10 throwforce = 12 + demolition_mod = 1.25 attack_verb_continuous = list("beats", "smacks") attack_verb_simple = list("beat", "smack") custom_materials = list(/datum/material/wood = MINERAL_MATERIAL_AMOUNT * 3.5) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 288ec91c7c35b1..2531db29302ef0 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -13,6 +13,9 @@ /// If this attacks a human with no wound armor on the affected body part, add this to the wound mod. Some attacks may be significantly worse at wounding if there's even a slight layer of armor to absorb some of it vs bare flesh var/bare_wound_bonus = 0 + /// A multiplier to an objecet's force when used against a stucture, vechicle, machine, or robot. + var/demolition_mod = 1 + var/current_skin //Has the item been reskinned? var/list/unique_reskin //List of options to reskin. @@ -82,13 +85,24 @@ SStgui.close_uis(src) . = ..() +/obj/attacked_by(obj/item/attacking_item, mob/living/user) + if(!attacking_item.force) + return -/obj/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, force, gentle = FALSE, quickstart = TRUE) - . = ..() - if(obj_flags & FROZEN) - visible_message(span_danger("[src] shatters into a million pieces!")) - qdel(src) + var/total_force = (attacking_item.force * attacking_item.demolition_mod) + + var/damage = take_damage(total_force, attacking_item.damtype, MELEE, 1) + + var/damage_verb = "hit" + + if(attacking_item.demolition_mod > 1 && damage) + damage_verb = "pulverise" + if(attacking_item.demolition_mod < 1) + damage_verb = "ineffectively pierce" + user.visible_message(span_danger("[user] [damage_verb][plural_s(damage_verb)] [src] with [attacking_item][damage ? "." : ", without leaving a mark!"]"), \ + span_danger("You [damage_verb] [src] with [attacking_item][damage ? "." : ", without leaving a mark!"]"), null, COMBAT_MESSAGE_RANGE) + log_combat(user, src, "attacked", attacking_item) /obj/assume_air(datum/gas_mixture/giver) if(loc) @@ -341,7 +355,7 @@ return TRUE /obj/analyzer_act(mob/living/user, obj/item/analyzer/tool) - if(atmos_scan(user=user, target=src, tool=tool, silent=FALSE)) + if(atmos_scan(user=user, target=src, silent=FALSE)) return TRUE return ..() diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm index 606e6f64d79608..efa1852a49c8be 100644 --- a/code/game/objects/structures/beds_chairs/chair.dm +++ b/code/game/objects/structures/beds_chairs/chair.dm @@ -315,6 +315,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/chair/stool/bar, 0) w_class = WEIGHT_CLASS_HUGE force = 8 throwforce = 10 + demolition_mod = 1.25 throw_range = 3 hitsound = 'sound/items/trayhit1.ogg' hit_reaction_chance = 50 diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 8c5695d6185acc..79e4295b65b977 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -78,6 +78,7 @@ return //Why var/static/list/loc_connections = list( COMSIG_CARBON_DISARM_COLLIDE = .proc/locker_carbon, + COMSIG_ATOM_MAGICALLY_UNLOCKED = .proc/on_magic_unlock, ) AddElement(/datum/element/connect_loc, loc_connections) @@ -251,11 +252,11 @@ /obj/structure/closet/proc/open(mob/living/user, force = FALSE) if(!can_open(user, force)) - return + return FALSE if(opened) - return + return FALSE if(SEND_SIGNAL(src, COMSIG_CLOSET_PRE_OPEN, user, force) & BLOCK_OPEN) - return + return FALSE welded = FALSE locked = FALSE playsound(loc, open_sound, open_sound_volume, TRUE, -3) @@ -715,9 +716,16 @@ target.Knockdown(SHOVE_KNOCKDOWN_SOLID) update_icon() target.visible_message(span_danger("[shover.name] shoves [target.name] into \the [src]!"), - span_userdanger("You're shoved into \the [src] by [target.name]!"), span_hear("You hear aggressive shuffling followed by a loud thud!"), COMBAT_MESSAGE_RANGE, src) + span_userdanger("You're shoved into \the [src] by [shover.name]!"), span_hear("You hear aggressive shuffling followed by a loud thud!"), COMBAT_MESSAGE_RANGE, src) to_chat(src, span_danger("You shove [target.name] into \the [src]!")) log_combat(src, target, "shoved", "into [src] (locker/crate)") return COMSIG_CARBON_SHOVE_HANDLED +/// Signal proc for [COMSIG_ATOM_MAGICALLY_UNLOCKED]. Unlock and open up when we get knock casted. +/obj/structure/closet/proc/on_magic_unlock(datum/source, datum/action/cooldown/spell/aoe/knock/spell, mob/living/caster) + SIGNAL_HANDLER + + locked = FALSE + INVOKE_ASYNC(src, .proc/open) + #undef LOCKER_FULL diff --git a/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm b/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm index 058665c4437e4f..467bf426fdc402 100644 --- a/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm +++ b/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm @@ -1,4 +1,3 @@ -#define SNAKE_SPAM_TICKS 600 //how long between cardboard box openings that trigger the '!' /obj/structure/closet/cardboard name = "large cardboard box" desc = "Just a box..." @@ -20,9 +19,14 @@ door_anim_time = 0 // no animation var/move_speed_multiplier = 1 var/move_delay = FALSE - var/egged = 0 can_install_electronics = FALSE + /// Cooldown controlling when the box can trigger the Metal Gear Solid-style '!' alert. + COOLDOWN_DECLARE(alert_cooldown) + + /// How much time must pass before the box can trigger the next Metal Gear Solid-style '!' alert. + var/time_between_alerts = 60 SECONDS + /obj/structure/closet/cardboard/relaymove(mob/living/user, direction) if(opened || move_delay || user.incapacitated() || !isturf(loc) || !has_gravity(loc)) return @@ -38,25 +42,33 @@ move_delay = FALSE /obj/structure/closet/cardboard/open(mob/living/user, force = FALSE) - if(opened || !can_open(user, force)) - return FALSE - var/list/alerted = null - if(egged < world.time) - var/mob/living/Snake = null - for(var/mob/living/L in src.contents) - Snake = L - break - if(Snake) - alerted = viewers(7,src) - ..() - if(LAZYLEN(alerted)) - egged = world.time + SNAKE_SPAM_TICKS - for(var/mob/living/L in alerted) - if(!L.stat) - if(!L.incapacitated(IGNORE_RESTRAINTS)) - L.face_atom(src) - L.do_alert_animation() - playsound(loc, 'sound/machines/chime.ogg', 50, FALSE, -5) + var/do_alert = (COOLDOWN_FINISHED(src, alert_cooldown) && (locate(/mob/living) in contents)) + + if(!do_alert) + return ..() + + // Cache the list before we open the box. + var/list/alerted = viewers(7, src) + + // There are no mobs to alert? + if(!(locate(/mob/living) in alerted)) + return ..() + + . = ..() + + // Box didn't open? + if(!.) + return + + COOLDOWN_START(src, alert_cooldown, time_between_alerts) + + for(var/mob/living/alerted_mob in alerted) + if(alerted_mob.stat == CONSCIOUS) + if(!alerted_mob.incapacitated(IGNORE_RESTRAINTS)) + alerted_mob.face_atom(src) + alerted_mob.do_alert_animation() + + playsound(loc, 'sound/machines/chime.ogg', 50, FALSE, -5) /// Does the MGS ! animation /atom/proc/do_alert_animation() @@ -66,7 +78,6 @@ alert_image.alpha = 0 animate(alert_image, pixel_z = 32, alpha = 255, time = 5, easing = ELASTIC_EASING) - /obj/structure/closet/cardboard/metal name = "large metal box" desc = "THE COWARDS! THE FOOLS!" @@ -81,4 +92,3 @@ open_sound_volume = 35 close_sound_volume = 50 material_drop = /obj/item/stack/sheet/plasteel -#undef SNAKE_SPAM_TICKS diff --git a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm index e1d149b2f1e7b2..6fd3843a3572af 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm @@ -10,7 +10,7 @@ new /obj/item/clothing/under/rank/cargo/qm(src) new /obj/item/clothing/under/rank/cargo/qm/skirt(src) new /obj/item/clothing/shoes/sneakers/brown(src) - new /obj/item/radio/headset/headset_cargo(src) + new /obj/item/radio/headset/heads/qm(src) new /obj/item/clothing/suit/fire/firefighter(src) new /obj/item/clothing/gloves/fingerless(src) new /obj/item/megaphone/cargo(src) diff --git a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm index 03e5a64e6eb035..3c814a447b3d90 100644 --- a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm @@ -69,6 +69,7 @@ new /obj/item/tank/internals/oxygen/red(src) new /obj/item/extinguisher(src) new /obj/item/clothing/head/hardhat/red(src) + new /obj/item/crowbar/large/emergency(src) /obj/structure/closet/firecloset/full/PopulateContents() new /obj/item/clothing/suit/fire/firefighter(src) @@ -77,6 +78,7 @@ new /obj/item/tank/internals/oxygen/red(src) new /obj/item/extinguisher(src) new /obj/item/clothing/head/hardhat/red(src) + new /obj/item/crowbar/large/emergency(src) /* * Tool Closet diff --git a/code/game/objects/structures/crates_lockers/crates/cardboard.dm b/code/game/objects/structures/crates_lockers/crates/cardboard.dm index 9e50b5564831d5..b29b8f9138ec98 100644 --- a/code/game/objects/structures/crates_lockers/crates/cardboard.dm +++ b/code/game/objects/structures/crates_lockers/crates/cardboard.dm @@ -14,3 +14,8 @@ name = "\improper Mothic Fleet box" desc = "For holding moths, presumably." icon_state = "cardboard_moth" + +/obj/structure/closet/crate/cardboard/tiziran + name = "\improper Tiziran shipment box" + desc = "For holding lizards, presumably." + icon_state = "cardboard_tiziran" diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm index e79c43d9882ff6..c586036f5fcaaa 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -42,13 +42,13 @@ if(AIRLOCK_ASSEMBLY_NEEDS_SCREWDRIVER) . += span_notice("The circuit is connected loosely to its slot, but the maintenance panel is unscrewed and open.") if(!mineral && !nomineral && !glass && !noglass) - . += span_notice("There is a small paper placard on the assembly[doorname]. There are empty slots for glass windows and mineral covers.") + . += span_notice("There are empty slots for glass windows and mineral covers.") else if(!mineral && !nomineral && glass && !noglass) - . += span_notice("There is a small paper placard on the assembly[doorname]. There are empty slots for mineral covers.") + . += span_notice("There are empty slots for mineral covers.") else if(!glass && !noglass) - . += span_notice("There is a small paper placard on the assembly[doorname]. There are empty slots for glass windows.") - else - . += span_notice("There is a small paper placard on the assembly[doorname].") + . += span_notice("There are empty slots for glass windows.") + if(doorname) + . += span_notice("There is a small paper placard on the assembly labelled \"[doorname]\".") /obj/structure/door_assembly/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/pen)) diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm index 4cad3dd7b0e1e2..15a9ce855579f9 100644 --- a/code/game/objects/structures/flora.dm +++ b/code/game/objects/structures/flora.dm @@ -38,7 +38,7 @@ GLOBAL_LIST_EMPTY(flora_uprooting_tools_typepaths) var/uprooting_tools = list(/obj/item/shovel) var/uprooted = FALSE var/previous_rotation = 0 - + /// If false, the flora won't be able to be harvested at all. If it's true, go through checks normally to determine if the flora is able to be harvested var/harvestable = TRUE /// The low end of how many product_type items you get @@ -71,10 +71,10 @@ GLOBAL_LIST_EMPTY(flora_uprooting_tools_typepaths) if(!required_tools) required_tools = list() if(flora_flags & FLORA_WOODEN) - required_tools += FLORA_HARVEST_WOOD_TOOLS + required_tools += FLORA_HARVEST_WOOD_TOOLS //This list does not include TOOL_SAW tools, they are handled seperately in can_harvest() for the purpose of on/off states if(flora_flags & FLORA_STONE) required_tools += FLORA_HARVEST_STONE_TOOLS - + //ugly-looking performance optimization. what the glob bro if(!GLOB.flora_required_tools_typepaths[type]) GLOB.flora_required_tools_typepaths[type] = typecacheof(required_tools) @@ -82,23 +82,23 @@ GLOBAL_LIST_EMPTY(flora_uprooting_tools_typepaths) GLOB.flora_disallowed_tools_typepaths[type] = typecacheof(disallowed_tools) if(!GLOB.flora_uprooting_tools_typepaths[type]) GLOB.flora_uprooting_tools_typepaths[type] = typecacheof(uprooting_tools) - + required_tools = GLOB.flora_required_tools_typepaths[type] disallowed_tools = GLOB.flora_disallowed_tools_typepaths[type] uprooting_tools = GLOB.flora_uprooting_tools_typepaths[type] -/obj/structure/flora/attackby(obj/item/W, mob/living/user, params) +/obj/structure/flora/attackby(obj/item/used_item, mob/living/user, params) if(user.combat_mode) return ..() - if(can_uproot && is_type_in_typecache(W, uprooting_tools)) + if(can_uproot && is_type_in_typecache(used_item, uprooting_tools)) if(uprooted) user.visible_message(span_notice("[user] starts to replant [src]..."), span_notice("You start to replant [src]...")) else user.visible_message(span_notice("[user] starts to uproot [src]..."), span_notice("You start to uproot [src]...")) - W.play_tool_sound(src, 50) + used_item.play_tool_sound(src, 50) if(!do_after(user, harvest_time, src)) return if(uprooted) @@ -109,21 +109,21 @@ GLOBAL_LIST_EMPTY(flora_uprooting_tools_typepaths) user.visible_message(span_notice("[user] uproots [src]."), span_notice("You uproot [src].")) uproot(user) - W.play_tool_sound(src, 50) + used_item.play_tool_sound(src, 50) return - if(!can_harvest(user, W)) + if(!can_harvest(user, used_item)) return ..() - + user.visible_message(span_notice("[user] starts to [harvest_verb] [src]..."), - span_notice("You start to [harvest_verb] [src] with [W]...")) - play_attack_sound(W.force) - if(!do_after(user, harvest_time, src)) + span_notice("You start to [harvest_verb] [src] with [used_item]...")) + play_attack_sound(used_item.force) + if(!do_after(user, harvest_time * used_item.toolspeed, src)) return visible_message(span_notice("[user] [harvest_verb][harvest_verb_suffix] [src]."), ignored_mobs = list(user)) - play_attack_sound(W.force) - + play_attack_sound(used_item.force) + if(harvest(user)) after_harvest(user) @@ -142,7 +142,7 @@ GLOBAL_LIST_EMPTY(flora_uprooting_tools_typepaths) visible_message(span_notice("[user] [harvest_verb][harvest_verb_suffix] [src]."), ignored_mobs = list(user)) play_attack_sound() - + if(harvest(user)) after_harvest(user) @@ -160,7 +160,7 @@ GLOBAL_LIST_EMPTY(flora_uprooting_tools_typepaths) if(use_default_sound) return ..() -/* +/* * A helper proc for getting a random amount of products, associated with the flora's product list. * Returns: A list where each value is (product_type = amount_of_products) */ @@ -185,13 +185,21 @@ GLOBAL_LIST_EMPTY(flora_uprooting_tools_typepaths) . = FALSE if(harvested || !harvestable) return null - + if(harvesting_item) - if(!is_type_in_typecache(harvesting_item, required_tools)) - return + //Check if its disallowed first, because we wanna cut it down in its tracks if so if(is_type_in_typecache(harvesting_item, disallowed_tools)) - return - return TRUE + return FALSE + //If its a required_tool then it skips all checks and gets forced to succeed (Unless its also disallowed. Which is... weird.) + if(is_type_in_typecache(harvesting_item, required_tools)) + return TRUE + //Check to see if wooden flora is being attacked by a saw item (letting the items on/off state control this is better than putting them in the list) + if((flora_flags & FLORA_WOODEN) && (harvesting_item.tool_behaviour == TOOL_SAW)) + return TRUE + //Check to see if stone flora is being attacked by a mining item (same reason as above) + if((flora_flags & FLORA_STONE) && (harvesting_item.tool_behaviour == TOOL_MINING)) + return TRUE + return FALSE /* * This gets called after a mob tries to harvest this flora with the correct tool. @@ -202,11 +210,11 @@ GLOBAL_LIST_EMPTY(flora_uprooting_tools_typepaths) /obj/structure/flora/proc/harvest(user) . = FALSE if(harvested && !LAZYLEN(product_types)) - return - + return FALSE + var/list/products_to_create = get_products_list() if(!products_to_create.len) - return + return FALSE var/products_created = 0 var/turf/turf_below = get_turf(src) diff --git a/code/game/objects/structures/headpike.dm b/code/game/objects/structures/headpike.dm index 7f228397eb3d5a..000fac5a934590 100644 --- a/code/game/objects/structures/headpike.dm +++ b/code/game/objects/structures/headpike.dm @@ -6,7 +6,7 @@ density = FALSE anchored = TRUE var/obj/item/spear/spear - var/obj/item/spear/speartype + var/obj/item/spear/speartype = /obj/item/spear var/obj/item/bodypart/head/victim /obj/structure/headpike/bone //for bone spears diff --git a/code/game/objects/structures/hivebot.dm b/code/game/objects/structures/hivebot.dm index c86748137e3b28..f5570c49fd23fb 100644 --- a/code/game/objects/structures/hivebot.dm +++ b/code/game/objects/structures/hivebot.dm @@ -11,7 +11,7 @@ /obj/structure/hivebot_beacon/Initialize(mapload) . = ..() var/datum/effect_system/fluid_spread/smoke/smoke = new - smoke.set_up(2, location = loc) + smoke.set_up(2, holder = src, location = loc) smoke.start() visible_message(span_boldannounce("[src] warps in!")) playsound(src.loc, 'sound/effects/empulse.ogg', 25, TRUE) diff --git a/code/game/objects/structures/icemoon/cave_entrance.dm b/code/game/objects/structures/icemoon/cave_entrance.dm index 8400cdff964fdf..758e55d7020ea8 100644 --- a/code/game/objects/structures/icemoon/cave_entrance.dm +++ b/code/game/objects/structures/icemoon/cave_entrance.dm @@ -155,7 +155,7 @@ GLOBAL_LIST_INIT(ore_probability, list( if(9) new /obj/item/immortality_talisman(loc) if(10) - new /obj/item/book/granter/spell/summonitem(loc) + new /obj/item/book/granter/action/spell/summonitem(loc) if(11) new /obj/item/clothing/neck/necklace/memento_mori(loc) if(12) @@ -191,6 +191,6 @@ GLOBAL_LIST_INIT(ore_probability, list( if(26) new /obj/item/clothing/shoes/winterboots/ice_boots(loc) if(27) - new /obj/item/book/granter/spell/sacredflame(loc) + new /obj/item/book/granter/action/spell/sacredflame(loc) if(28) new /mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/doom(loc) diff --git a/code/game/objects/structures/industrial_lift.dm b/code/game/objects/structures/industrial_lift.dm deleted file mode 100644 index 2209e12dfe9630..00000000000000 --- a/code/game/objects/structures/industrial_lift.dm +++ /dev/null @@ -1,620 +0,0 @@ - -//Booleans in arguments are confusing, so I made them defines. -#define LOCKED 1 -#define UNLOCKED 0 - -///Collect and command -/datum/lift_master - var/list/lift_platforms - /// Typepath list of what to ignore smashing through, controls all lifts - var/list/ignored_smashthroughs = list( - /obj/machinery/power/supermatter_crystal, - /obj/structure/holosign - ) - -/datum/lift_master/New(obj/structure/industrial_lift/lift_platform) - Rebuild_lift_plaform(lift_platform) - ignored_smashthroughs = typecacheof(ignored_smashthroughs) - -/datum/lift_master/Destroy() - for(var/l in lift_platforms) - var/obj/structure/industrial_lift/lift_platform = l - lift_platform.lift_master_datum = null - lift_platforms = null - return ..() - - -/datum/lift_master/proc/add_lift_platforms(obj/structure/industrial_lift/new_lift_platform) - if(new_lift_platform in lift_platforms) - return - new_lift_platform.lift_master_datum = src - LAZYADD(lift_platforms, new_lift_platform) - RegisterSignal(new_lift_platform, COMSIG_PARENT_QDELETING, .proc/remove_lift_platforms) - -/datum/lift_master/proc/remove_lift_platforms(obj/structure/industrial_lift/old_lift_platform) - SIGNAL_HANDLER - - if(!(old_lift_platform in lift_platforms)) - return - old_lift_platform.lift_master_datum = null - LAZYREMOVE(lift_platforms, old_lift_platform) - UnregisterSignal(old_lift_platform, COMSIG_PARENT_QDELETING) - -///Collect all bordered platforms -/datum/lift_master/proc/Rebuild_lift_plaform(obj/structure/industrial_lift/base_lift_platform) - add_lift_platforms(base_lift_platform) - var/list/possible_expansions = list(base_lift_platform) - while(possible_expansions.len) - for(var/b in possible_expansions) - var/obj/structure/industrial_lift/borderline = b - var/list/result = borderline.lift_platform_expansion(src) - if(length(result)) - for(var/p in result) - if(lift_platforms.Find(p)) - continue - var/obj/structure/industrial_lift/lift_platform = p - add_lift_platforms(lift_platform) - possible_expansions |= lift_platform - possible_expansions -= borderline - -/** - * Moves the lift UP or DOWN, this is what users invoke with their hand. - * This is a SAFE proc, ensuring every part of the lift moves SANELY. - * It also locks controls for the (miniscule) duration of the movement, so the elevator cannot be broken by spamming. - * Arguments: - * going - UP or DOWN directions, where the lift should go. Keep in mind by this point checks of whether it should go up or down have already been done. - * user - Whomever made the lift movement. - */ -/datum/lift_master/proc/MoveLift(going, mob/user) - set_controls(LOCKED) - for(var/p in lift_platforms) - var/obj/structure/industrial_lift/lift_platform = p - lift_platform.travel(going) - set_controls(UNLOCKED) - -/** - * Moves the lift, this is what users invoke with their hand. - * This is a SAFE proc, ensuring every part of the lift moves SANELY. - * It also locks controls for the (miniscule) duration of the movement, so the elevator cannot be broken by spamming. - */ -/datum/lift_master/proc/MoveLiftHorizontal(going, z, gliding_amount = 8) - var/max_x = 1 - var/max_y = 1 - var/min_x = world.maxx - var/min_y = world.maxy - - - set_controls(LOCKED) - for(var/p in lift_platforms) - var/obj/structure/industrial_lift/lift_platform = p - max_x = max(max_x, lift_platform.x) - max_y = max(max_y, lift_platform.y) - min_x = min(min_x, lift_platform.x) - min_y = min(min_y, lift_platform.y) - - //This must be safe way to border tile to tile move of bordered platforms, that excludes platform overlapping. - if( going & WEST ) - //Go along the X axis from min to max, from left to right - for(var/x in min_x to max_x) - if( going & NORTH ) - //Go along the Y axis from max to min, from up to down - for(var/y in max_y to min_y step -1) - var/obj/structure/industrial_lift/lift_platform = locate(/obj/structure/industrial_lift, locate(x, y, z)) - lift_platform?.travel(going, gliding_amount) - else - //Go along the Y axis from min to max, from down to up - for(var/y in min_y to max_y) - var/obj/structure/industrial_lift/lift_platform = locate(/obj/structure/industrial_lift, locate(x, y, z)) - lift_platform?.travel(going, gliding_amount) - else - //Go along the X axis from max to min, from right to left - for(var/x in max_x to min_x step -1) - if( going & NORTH ) - //Go along the Y axis from max to min, from up to down - for(var/y in max_y to min_y step -1) - var/obj/structure/industrial_lift/lift_platform = locate(/obj/structure/industrial_lift, locate(x, y, z)) - lift_platform?.travel(going, gliding_amount) - else - //Go along the Y axis from min to max, from down to up - for(var/y in min_y to max_y) - var/obj/structure/industrial_lift/lift_platform = locate(/obj/structure/industrial_lift, locate(x, y, z)) - lift_platform?.travel(going, gliding_amount) - set_controls(UNLOCKED) - -///Check destination turfs -/datum/lift_master/proc/Check_lift_move(check_dir) - for(var/l in lift_platforms) - var/obj/structure/industrial_lift/lift_platform = l - var/turf/T = get_step_multiz(lift_platform, check_dir) - if(!T)//the edges of multi-z maps - return FALSE - if(check_dir == UP && !istype(T, /turf/open/openspace)) // We don't want to go through the ceiling! - return FALSE - if(check_dir == DOWN && !istype(get_turf(lift_platform), /turf/open/openspace)) // No going through the floor! - return FALSE - return TRUE - -/** - * Sets all lift parts's controls_locked variable. Used to prevent moving mid movement, or cooldowns. - */ -/datum/lift_master/proc/set_controls(state) - for(var/l in lift_platforms) - var/obj/structure/industrial_lift/lift_platform = l - lift_platform.controls_locked = state - -GLOBAL_LIST_EMPTY(lifts) -/obj/structure/industrial_lift - name = "lift platform" - desc = "A lightweight lift platform. It moves up and down." - icon = 'icons/obj/smooth_structures/catwalk.dmi' - icon_state = "catwalk-0" - base_icon_state = "catwalk" - density = FALSE - anchored = TRUE - armor = list(MELEE = 50, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 80, ACID = 50) - max_integrity = 50 - layer = LATTICE_LAYER //under pipes - plane = FLOOR_PLANE - smoothing_flags = SMOOTH_BITMASK - smoothing_groups = list(SMOOTH_GROUP_INDUSTRIAL_LIFT) - canSmoothWith = list(SMOOTH_GROUP_INDUSTRIAL_LIFT) - obj_flags = CAN_BE_HIT | BLOCK_Z_OUT_DOWN - - var/id = null //ONLY SET THIS TO ONE OF THE LIFT'S PARTS. THEY'RE CONNECTED! ONLY ONE NEEDS THE SIGNAL! - var/pass_through_floors = FALSE //if true, the elevator works through floors - var/controls_locked = FALSE //if true, the lift cannot be manually moved. - var/list/atom/movable/lift_load //things to move - var/datum/lift_master/lift_master_datum //control from - -/obj/structure/industrial_lift/Initialize(mapload) - . = ..() - GLOB.lifts.Add(src) - var/static/list/loc_connections = list( - COMSIG_ATOM_EXITED =.proc/UncrossedRemoveItemFromLift, - COMSIG_ATOM_ENTERED = .proc/AddItemOnLift, - COMSIG_ATOM_INITIALIZED_ON = .proc/AddItemOnLift, - ) - AddElement(/datum/element/connect_loc, loc_connections) - RegisterSignal(src, COMSIG_MOVABLE_BUMP, .proc/GracefullyBreak) - - if(!lift_master_datum) - lift_master_datum = new(src) - - -/obj/structure/industrial_lift/proc/UncrossedRemoveItemFromLift(datum/source, atom/movable/gone, direction) - SIGNAL_HANDLER - RemoveItemFromLift(gone) - -/obj/structure/industrial_lift/proc/RemoveItemFromLift(atom/movable/potential_rider) - SIGNAL_HANDLER - if(!(potential_rider in lift_load)) - return - if(isliving(potential_rider) && HAS_TRAIT(potential_rider, TRAIT_CANNOT_BE_UNBUCKLED)) - REMOVE_TRAIT(potential_rider, TRAIT_CANNOT_BE_UNBUCKLED, BUCKLED_TRAIT) - LAZYREMOVE(lift_load, potential_rider) - UnregisterSignal(potential_rider, COMSIG_PARENT_QDELETING) - -/obj/structure/industrial_lift/proc/AddItemOnLift(datum/source, atom/movable/AM) - SIGNAL_HANDLER - if(istype(AM, /obj/structure/fluff/tram_rail) || AM.invisibility == INVISIBILITY_ABSTRACT) //prevents the tram from stealing things like landmarks - return - if(AM in lift_load) - return - if(isliving(AM) && !HAS_TRAIT(AM, TRAIT_CANNOT_BE_UNBUCKLED)) - ADD_TRAIT(AM, TRAIT_CANNOT_BE_UNBUCKLED, BUCKLED_TRAIT) - LAZYADD(lift_load, AM) - RegisterSignal(AM, COMSIG_PARENT_QDELETING, .proc/RemoveItemFromLift) - -/** - * Signal for when the tram runs into a field of which it cannot go through. - * Stops the train's travel fully, sends a message, and destroys the train. - * Arguments: - * bumped_atom - The atom this tram bumped into - */ -/obj/structure/industrial_lift/proc/GracefullyBreak(atom/bumped_atom) - SIGNAL_HANDLER - - if(istype(bumped_atom, /obj/machinery/field)) - return - - bumped_atom.visible_message(span_userdanger("[src] crashes into the field violently!")) - for(var/obj/structure/industrial_lift/tram/tram_part as anything in lift_master_datum.lift_platforms) - tram_part.travel_distance = 0 - tram_part.set_travelling(FALSE) - if(prob(15) || locate(/mob/living) in tram_part.lift_load) //always go boom on people on the track - explosion(tram_part, devastation_range = rand(0, 1), heavy_impact_range = 2, light_impact_range = 3) //50% chance of gib - qdel(tram_part) - -/obj/structure/industrial_lift/proc/lift_platform_expansion(datum/lift_master/lift_master_datum) - . = list() - for(var/direction in GLOB.cardinals) - var/obj/structure/industrial_lift/neighbor = locate() in get_step(src, direction) - if(!neighbor) - continue - . += neighbor - -/obj/structure/industrial_lift/proc/travel(going, gliding_amount = 8) - var/list/things_to_move = LAZYCOPY(lift_load) - var/turf/destination - if(!isturf(going)) - destination = get_step_multiz(src, going) - else - destination = going - ///handles any special interactions objects could have with the lift/tram, handled on the item itself - SEND_SIGNAL(destination, COMSIG_TURF_INDUSTRIAL_LIFT_ENTER, things_to_move) - - if(istype(destination, /turf/closed/wall)) - var/turf/closed/wall/C = destination - do_sparks(2, FALSE, C) - C.dismantle_wall(devastated = TRUE) - for(var/mob/M in urange(8, src)) - shake_camera(M, 2, 3) - playsound(C, 'sound/effects/meteorimpact.ogg', 100, TRUE) - - if(going == DOWN) - for(var/mob/living/crushed in destination.contents) - to_chat(crushed, span_userdanger("You are crushed by [src]!")) - crushed.gib(FALSE,FALSE,FALSE)//the nicest kind of gibbing, keeping everything intact. - - else if(going != UP) //can't really crush something upwards - var/atom/throw_target = get_edge_target_turf(src, turn(going, pick(45, -45))) //finds a spot to throw the victim at for daring to be hit by a tram - for(var/obj/structure/victim_structure in destination.contents) - if(QDELETED(victim_structure)) - continue - if(!is_type_in_typecache(victim_structure, lift_master_datum.ignored_smashthroughs) && victim_structure.layer >= LOW_OBJ_LAYER) - if(victim_structure.anchored && initial(victim_structure.anchored) == TRUE) - visible_message(span_danger("[src] smashes through [victim_structure]!")) - victim_structure.deconstruct(FALSE) - else - visible_message(span_danger("[src] violently rams [victim_structure] out of the way!")) - victim_structure.anchored = FALSE - victim_structure.take_damage(rand(20, 25)) - victim_structure.throw_at(throw_target, 200, 4) - for(var/obj/machinery/victim_machine in destination.contents) - if(QDELETED(victim_machine)) - continue - if(is_type_in_typecache(victim_machine, lift_master_datum.ignored_smashthroughs)) - continue - if(istype(victim_machine, /obj/machinery/field)) //graceful break handles this scenario - continue - if(victim_machine.layer >= LOW_OBJ_LAYER) //avoids stuff that is probably flush with the ground - playsound(src, 'sound/effects/bang.ogg', 50, TRUE) - visible_message(span_danger("[src] smashes through [victim_machine]!")) - qdel(victim_machine) - - for(var/mob/living/collided in destination.contents) - if(is_type_in_typecache(collided, lift_master_datum.ignored_smashthroughs)) - continue - to_chat(collided, span_userdanger("[src] collides into you!")) - playsound(src, 'sound/effects/splat.ogg', 50, TRUE) - var/damage = rand(5, 10) - collided.apply_damage(2 * damage, BRUTE, BODY_ZONE_HEAD) - collided.apply_damage(2 * damage, BRUTE, BODY_ZONE_CHEST) - collided.apply_damage(0.5 * damage, BRUTE, BODY_ZONE_L_LEG) - collided.apply_damage(0.5 * damage, BRUTE, BODY_ZONE_R_LEG) - collided.apply_damage(0.5 * damage, BRUTE, BODY_ZONE_L_ARM) - collided.apply_damage(0.5 * damage, BRUTE, BODY_ZONE_R_ARM) - - if(QDELETED(collided)) //in case it was a mob that dels on death - continue - var/turf/T = get_turf(src) - T.add_mob_blood(collided) - - collided.throw_at() - //if going EAST, will turn to the NORTHEAST or SOUTHEAST and throw the ran over guy away - var/datum/callback/land_slam = new(collided, /mob/living/.proc/tram_slam_land) - collided.throw_at(throw_target, 200, 4, callback = land_slam) - set_glide_size(gliding_amount) - forceMove(destination) - for(var/atom/movable/thing as anything in things_to_move) - thing.set_glide_size(gliding_amount) //matches the glide size of the moving platform to stop them from jittering on it. - thing.forceMove(destination) - -/obj/structure/industrial_lift/proc/use(mob/living/user) - if(!isliving(user) || !in_range(src, user) || user.combat_mode) - return - - var/list/tool_list = list() - if(lift_master_datum.Check_lift_move(UP)) - tool_list["Up"] = image(icon = 'icons/testing/turf_analysis.dmi', icon_state = "red_arrow", dir = NORTH) - if(lift_master_datum.Check_lift_move(DOWN)) - tool_list["Down"] = image(icon = 'icons/testing/turf_analysis.dmi', icon_state = "red_arrow", dir = SOUTH) - if(!length(tool_list)) - to_chat(user, span_warning("[src] doesn't seem to able to move anywhere!")) - add_fingerprint(user) - return - if(controls_locked) - to_chat(user, span_warning("[src] has its controls locked! It must already be trying to do something!")) - add_fingerprint(user) - return - var/result = show_radial_menu(user, src, tool_list, custom_check = CALLBACK(src, .proc/check_menu, user, src.loc), require_near = TRUE, tooltips = TRUE) - if(!isliving(user) || !in_range(src, user) || user.combat_mode) - return //nice try - switch(result) - if("Up") - // We have to make sure that they don't do illegal actions by not having their radial menu refresh from someone else moving the lift. - if(!lift_master_datum.Check_lift_move(UP)) - to_chat(user, span_warning("[src] doesn't seem to able to move up!")) - add_fingerprint(user) - return - lift_master_datum.MoveLift(UP, user) - show_fluff_message(TRUE, user) - use(user) - if("Down") - if(!lift_master_datum.Check_lift_move(DOWN)) - to_chat(user, span_warning("[src] doesn't seem to able to move down!")) - add_fingerprint(user) - return - lift_master_datum.MoveLift(DOWN, user) - show_fluff_message(FALSE, user) - use(user) - if("Cancel") - return - add_fingerprint(user) - -/** - * Proc to ensure that the radial menu closes when it should. - * Arguments: - * * user - The person that opened the menu. - * * starting_loc - The location of the lift when the menu was opened, used to prevent the menu from being interacted with after the lift was moved by someone else. - * - * Returns: - * * boolean, FALSE if the menu should be closed, TRUE if the menu is clear to stay opened. - */ -/obj/structure/industrial_lift/proc/check_menu(mob/user, starting_loc) - if(user.incapacitated() || !user.Adjacent(src) || starting_loc != src.loc) - return FALSE - return TRUE - -/obj/structure/industrial_lift/attack_hand(mob/user, list/modifiers) - . = ..() - if(.) - return - use(user) - -//ai probably shouldn't get to use lifts but they sure are great for admins to crush people with -/obj/structure/industrial_lift/attack_ghost(mob/user) - . = ..() - if(.) - return - if(isAdminGhostAI(user)) - use(user) - -/obj/structure/industrial_lift/attack_paw(mob/user, list/modifiers) - return use(user) - -/obj/structure/industrial_lift/attackby(obj/item/W, mob/user, params) - return use(user) - -/obj/structure/industrial_lift/attack_robot(mob/living/silicon/robot/R) - if(R.Adjacent(src)) - return use(R) - -/** - * Shows a message indicating that the lift has moved up or down. - * Arguments: - * * going_up - Boolean on whether or not we're going up, to adjust the message appropriately. - * * user - The mob that caused the lift to move, for the visible message. - */ -/obj/structure/industrial_lift/proc/show_fluff_message(going_up, mob/user) - if(going_up) - user.visible_message(span_notice("[user] moves the lift upwards."), span_notice("You move the lift upwards.")) - else - user.visible_message(span_notice("[user] moves the lift downwards."), span_notice("You move the lift downwards.")) - -/obj/structure/industrial_lift/Destroy() - GLOB.lifts.Remove(src) - QDEL_NULL(lift_master_datum) - var/list/border_lift_platforms = lift_platform_expansion() - moveToNullspace() - for(var/border_lift in border_lift_platforms) - lift_master_datum = new(border_lift) - return ..() - -/obj/structure/industrial_lift/debug - name = "transport platform" - desc = "A lightweight platform. It moves in any direction, except up and down." - color = "#5286b9ff" - -/obj/structure/industrial_lift/debug/use(mob/user) - if (!in_range(src, user)) - return -//NORTH, SOUTH, EAST, WEST, NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST - var/static/list/tool_list = list( - "NORTH" = image(icon = 'icons/testing/turf_analysis.dmi', icon_state = "red_arrow", dir = NORTH), - "NORTHEAST" = image(icon = 'icons/testing/turf_analysis.dmi', icon_state = "red_arrow", dir = NORTH), - "EAST" = image(icon = 'icons/testing/turf_analysis.dmi', icon_state = "red_arrow", dir = EAST), - "SOUTHEAST" = image(icon = 'icons/testing/turf_analysis.dmi', icon_state = "red_arrow", dir = EAST), - "SOUTH" = image(icon = 'icons/testing/turf_analysis.dmi', icon_state = "red_arrow", dir = SOUTH), - "SOUTHWEST" = image(icon = 'icons/testing/turf_analysis.dmi', icon_state = "red_arrow", dir = SOUTH), - "WEST" = image(icon = 'icons/testing/turf_analysis.dmi', icon_state = "red_arrow", dir = WEST), - "NORTHWEST" = image(icon = 'icons/testing/turf_analysis.dmi', icon_state = "red_arrow", dir = WEST) - ) - - var/result = show_radial_menu(user, src, tool_list, custom_check = CALLBACK(src, .proc/check_menu, user, loc), require_near = TRUE, tooltips = FALSE) - if (!in_range(src, user)) - return // nice try - - switch(result) - if("NORTH") - lift_master_datum.MoveLiftHorizontal(NORTH, z) - use(user) - if("NORTHEAST") - lift_master_datum.MoveLiftHorizontal(NORTHEAST, z) - use(user) - if("EAST") - lift_master_datum.MoveLiftHorizontal(EAST, z) - use(user) - if("SOUTHEAST") - lift_master_datum.MoveLiftHorizontal(SOUTHEAST, z) - use(user) - if("SOUTH") - lift_master_datum.MoveLiftHorizontal(SOUTH, z) - use(user) - if("SOUTHWEST") - lift_master_datum.MoveLiftHorizontal(SOUTHWEST, z) - use(user) - if("WEST") - lift_master_datum.MoveLiftHorizontal(WEST, z) - use(user) - if("NORTHWEST") - lift_master_datum.MoveLiftHorizontal(NORTHWEST, z) - use(user) - if("Cancel") - return - - add_fingerprint(user) - -/obj/structure/industrial_lift/tram - name = "tram" - desc = "A tram for traversing the station." - icon = 'icons/turf/floors.dmi' - icon_state = "titanium_yellow" - base_icon_state = null - smoothing_flags = NONE - smoothing_groups = null - canSmoothWith = null - //kind of a centerpiece of the station, so pretty tough to destroy - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF - /// Set by the tram control console in late initialize - var/travelling = FALSE - var/travel_distance = 0 - /// For finding the landmark initially - should be the exact same as the landmark's destination id. - var/initial_id = "middle_part" - var/obj/effect/landmark/tram/from_where - var/travel_direction - -GLOBAL_LIST_EMPTY_TYPED(central_trams, /obj/structure/industrial_lift/tram/central) - -/obj/structure/industrial_lift/tram/Initialize(mapload) - . = ..() - return INITIALIZE_HINT_LATELOAD - -/obj/structure/industrial_lift/tram/central - var/tram_id = "tram_station" - -/obj/structure/industrial_lift/tram/central/Initialize(mapload) - . = ..() - if(!SStramprocess.can_fire) - SStramprocess.can_fire = TRUE - GLOB.central_trams += src - -/obj/structure/industrial_lift/tram/central/Destroy() - GLOB.central_trams -= src - return ..() - -/obj/structure/industrial_lift/tram/LateInitialize() - . = ..() - find_our_location() - - -/** - * Finds the location of the tram - * - * The initial_id is assumed to the be the landmark the tram is built on in the map - * and where the tram will set itself to be on roundstart. - * The central tram piece goes further into this by actually checking the contents of the turf its on - * for a tram landmark when it docks anywhere. This assures the tram actually knows where it is after docking, - * even in the worst cast scenario. - */ -/obj/structure/industrial_lift/tram/proc/find_our_location() - for(var/obj/effect/landmark/tram/our_location in GLOB.landmarks_list) - if(our_location.destination_id == initial_id) - from_where = our_location - break - -/obj/structure/industrial_lift/tram/proc/set_travelling(travelling) - if (src.travelling == travelling) - return - - src.travelling = travelling - SEND_SIGNAL(src, COMSIG_TRAM_SET_TRAVELLING, travelling) - -/obj/structure/industrial_lift/tram/use(mob/user) //dont click the floor dingus we use computers now - return - -/obj/structure/industrial_lift/tram/process(delta_time) - if(!travel_distance) - addtimer(CALLBACK(src, .proc/unlock_controls), 3 SECONDS) - return PROCESS_KILL - else - travel_distance-- - lift_master_datum.MoveLiftHorizontal(travel_direction, z, DELAY_TO_GLIDE_SIZE(SStramprocess.wait)) - -/** - * Handles moving the tram - * - * Tells the individual tram parts where to actually go and has an extra safety check - * incase multiple inputs get through, preventing conflicting directions and the tram - * literally ripping itself apart. The proc handles the first move before the subsystem - * takes over to keep moving it in process() - */ -/obj/structure/industrial_lift/tram/proc/tram_travel(obj/effect/landmark/tram/to_where) - if(to_where == from_where) - return - - visible_message(span_notice("[src] has been called to the [to_where]!")) - - lift_master_datum.set_controls(LOCKED) - travel_direction = get_dir(from_where, to_where) - travel_distance = get_dist(from_where, to_where) - //first movement is immediate - for(var/obj/structure/industrial_lift/tram/other_tram_part as anything in lift_master_datum.lift_platforms) //only thing everyone needs to know is the new location. - if(other_tram_part.travelling) //wee woo wee woo there was a double action queued. damn multi tile structs - return //we don't care to undo locked controls, though, as that will resolve itself - SEND_SIGNAL(src, COMSIG_TRAM_TRAVEL, from_where, to_where) - other_tram_part.set_travelling(TRUE) - other_tram_part.from_where = to_where - lift_master_datum.MoveLiftHorizontal(travel_direction, z, DELAY_TO_GLIDE_SIZE(SStramprocess.wait)) - travel_distance-- - - START_PROCESSING(SStramprocess, src) - -/** - * Handles unlocking the tram controls for use after moving - * - * More safety checks to make sure the tram has actually docked properly - * at a location before users are allowed to interact with the tram console again. - * Tram finds its location at this point before fully unlocking controls to the user. - */ -/obj/structure/industrial_lift/tram/proc/unlock_controls() - visible_message(span_notice("[src]'s controls are now unlocked.")) - for(var/obj/structure/industrial_lift/tram/tram_part as anything in lift_master_datum.lift_platforms) //only thing everyone needs to know is the new location. - tram_part.set_travelling(FALSE) - lift_master_datum.set_controls(UNLOCKED) - -GLOBAL_LIST_EMPTY(tram_landmarks) - -/obj/effect/landmark/tram - name = "tram destination" //the tram buttons will mention this. - icon_state = "tram" - /// The ID of that particular destination. - var/destination_id - /// The ID of the tram that can travel to use - var/tram_id = "tram_station" - /// Icons for the tgui console to list out for what is at this location - var/list/tgui_icons = list() - -/obj/effect/landmark/tram/Initialize(mapload) - . = ..() - GLOB.tram_landmarks += src - -/obj/effect/landmark/tram/Destroy() - GLOB.tram_landmarks -= src - return ..() - - -/obj/effect/landmark/tram/left_part - name = "West Wing" - destination_id = "left_part" - tgui_icons = list("Arrivals" = "plane-arrival", "Command" = "bullhorn", "Security" = "gavel") - -/obj/effect/landmark/tram/middle_part - name = "Central Wing" - destination_id = "middle_part" - tgui_icons = list("Service" = "cocktail", "Medical" = "plus", "Engineering" = "wrench") - -/obj/effect/landmark/tram/right_part - name = "East Wing" - destination_id = "right_part" - tgui_icons = list("Departures" = "plane-departure", "Cargo" = "box", "Science" = "flask") diff --git a/code/game/objects/structures/lavaland/geyser.dm b/code/game/objects/structures/lavaland/geyser.dm index cba7f2b01b9117..68d86eb44e5d77 100644 --- a/code/game/objects/structures/lavaland/geyser.dm +++ b/code/game/objects/structures/lavaland/geyser.dm @@ -139,9 +139,6 @@ ///What layer we set it to var/target_layer = DUCT_LAYER_DEFAULT - ///Assoc list for possible layers - var/list/layers = list("Second Layer" = SECOND_DUCT_LAYER, "Default Layer" = DUCT_LAYER_DEFAULT, "Fourth Layer" = FOURTH_DUCT_LAYER) - /obj/item/plunger/attack_atom(obj/O, mob/living/user, params) if(layer_mode) SEND_SIGNAL(O, COMSIG_MOVABLE_CHANGE_DUCT_LAYER, O, target_layer) @@ -178,10 +175,10 @@ if(!istype(user) || !user.canUseTopic(src, BE_CLOSE)) return - var/new_layer = tgui_input_list(user, "Select a layer", "Layer", layers) + var/new_layer = tgui_input_list(user, "Select a layer", "Layer", GLOB.plumbing_layers) if(isnull(new_layer)) return - target_layer = layers[new_layer] + target_layer = GLOB.plumbing_layers[new_layer] ///A faster reinforced plunger /obj/item/plunger/reinforced diff --git a/code/game/objects/structures/maintenance.dm b/code/game/objects/structures/maintenance.dm index e7e99fd352df0c..0318ea568df7f5 100644 --- a/code/game/objects/structures/maintenance.dm +++ b/code/game/objects/structures/maintenance.dm @@ -25,7 +25,6 @@ at the cost of risking a vicious bite.**/ /obj/item/restraints/handcuffs/cable/pink = 1, /obj/item/restraints/handcuffs/alien = 2, /obj/item/coin/bananium = 9, - /obj/item/fish/ratfish = 10, /obj/item/knife/butcher = 5, /obj/item/coin/mythril = 1, ) @@ -41,6 +40,13 @@ at the cost of risking a vicious bite.**/ var/picked_item = pick_weight(loot_table) hidden_item = new picked_item(src) + var/datum/fish_source/moisture_trap/fish_source = new + if(prob(50)) // 50% chance there's another item to fish out of there + var/picked_item = pick_weight(loot_table) + fish_source.fish_table[picked_item] = 5 + fish_source.fish_counts[picked_item] = 1; + AddComponent(/datum/component/fishing_spot, fish_source) + /obj/structure/moisture_trap/Destroy() if(hidden_item) diff --git a/code/game/objects/structures/petrified_statue.dm b/code/game/objects/structures/petrified_statue.dm index f32cd324d39e55..e22dd660646de7 100644 --- a/code/game/objects/structures/petrified_statue.dm +++ b/code/game/objects/structures/petrified_statue.dm @@ -43,8 +43,8 @@ /obj/structure/statue/petrified/Destroy() - if(istype(src.loc, /mob/living/simple_animal/hostile/statue)) - var/mob/living/simple_animal/hostile/statue/S = src.loc + if(istype(src.loc, /mob/living/simple_animal/hostile/netherworld/statue)) + var/mob/living/simple_animal/hostile/netherworld/statue/S = src.loc forceMove(S.loc) if(S.mind) if(petrified_mob) diff --git a/code/game/objects/structures/signs/signs_warning.dm b/code/game/objects/structures/signs/signs_warning.dm index c3f4292f57e740..31d4636d014db2 100644 --- a/code/game/objects/structures/signs/signs_warning.dm +++ b/code/game/objects/structures/signs/signs_warning.dm @@ -135,7 +135,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/warning/radiation, 32) desc = "A warning sign which reads 'RADIOACTIVE AREA'." is_editable = TRUE -MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/warning/rad_area, 32) +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/warning/radiation/rad_area, 32) /obj/structure/sign/warning/xeno_mining name = "\improper DANGEROUS ALIEN LIFE sign" diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index b615dc9874fa3a..b27a1c63e9917c 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -273,8 +273,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/urinal, 32) /obj/structure/sink/Initialize(mapload, bolt) . = ..() + create_reagents(100, NO_REACT) if(has_water_reclaimer) - create_reagents(100, NO_REACT) reagents.add_reagent(dispensedreagent, 100) AddComponent(/datum/component/plumbing/simple_demand, bolt) diff --git a/code/game/sound.dm b/code/game/sound.dm index 5c294f58754efa..c8e48a16b8de6d 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -23,120 +23,96 @@ ) environment = SOUND_ENVIRONMENT_NONE //Default to none so sounds without overrides dont get reverb -/*! playsound - -playsound is a proc used to play a 3D sound in a specific range. This uses SOUND_RANGE + extra_range to determine that. - -source - Origin of sound -soundin - Either a file, or a string that can be used to get an SFX -vol - The volume of the sound, excluding falloff and pressure affection. -vary - bool that determines if the sound changes pitch every time it plays -extrarange - modifier for sound range. This gets added on top of SOUND_RANGE -falloff_exponent - Rate of falloff for the audio. Higher means quicker drop to low volume. Should generally be over 1 to indicate a quick dive to 0 rather than a slow dive. -frequency - playback speed of audio -channel - The channel the sound is played at -pressure_affected - Whether or not difference in pressure affects the sound (E.g. if you can hear in space) -ignore_walls - Whether or not the sound can pass through walls. -falloff_distance - Distance at which falloff begins. Sound is at peak volume (in regards to falloff) aslong as it is in this range. - -*/ - +/** + * playsound is a proc used to play a 3D sound in a specific range. This uses SOUND_RANGE + extra_range to determine that. + * + * source - Origin of sound. + * soundin - Either a file, or a string that can be used to get an SFX. + * vol - The volume of the sound, excluding falloff and pressure affection. + * vary - bool that determines if the sound changes pitch every time it plays. + * extrarange - modifier for sound range. This gets added on top of SOUND_RANGE. + * falloff_exponent - Rate of falloff for the audio. Higher means quicker drop to low volume. Should generally be over 1 to indicate a quick dive to 0 rather than a slow dive. + * frequency - playback speed of audio. + * channel - The channel the sound is played at. + * pressure_affected - Whether or not difference in pressure affects the sound (E.g. if you can hear in space). + * ignore_walls - Whether or not the sound can pass through walls. + * falloff_distance - Distance at which falloff begins. Sound is at peak volume (in regards to falloff) aslong as it is in this range. + */ /proc/playsound(atom/source, soundin, vol as num, vary, extrarange as num, falloff_exponent = SOUND_FALLOFF_EXPONENT, frequency = null, channel = 0, pressure_affected = TRUE, ignore_walls = TRUE, falloff_distance = SOUND_DEFAULT_FALLOFF_DISTANCE, use_reverb = TRUE) if(isarea(source)) CRASH("playsound(): source is an area") var/turf/turf_source = get_turf(source) - if (!turf_source) + if (!turf_source || !soundin || !vol) return //allocate a channel if necessary now so its the same for everyone channel = channel || SSsounds.random_available_channel() - // Looping through the player list has the added bonus of working for mobs inside containers var/sound/S = sound(get_sfx(soundin)) var/maxdistance = SOUND_RANGE + extrarange var/source_z = turf_source.z var/list/listeners = SSmobs.clients_by_zlevel[source_z].Copy() + . = list()//output everything that successfully heard the sound + var/turf/above_turf = SSmapping.get_turf_above(turf_source) var/turf/below_turf = SSmapping.get_turf_below(turf_source) - if(!ignore_walls) //these sounds don't carry through walls - listeners = listeners & hearers(maxdistance,turf_source) + if(ignore_walls) if(above_turf && istransparentturf(above_turf)) - listeners += hearers(maxdistance,above_turf) + listeners += SSmobs.clients_by_zlevel[above_turf.z] if(below_turf && istransparentturf(turf_source)) - listeners += hearers(maxdistance,below_turf) + listeners += SSmobs.clients_by_zlevel[below_turf.z] + + else //these sounds don't carry through walls + listeners = get_hearers_in_view(maxdistance, turf_source) - else if(above_turf && istransparentturf(above_turf)) - listeners += SSmobs.clients_by_zlevel[above_turf.z] + listeners += get_hearers_in_view(maxdistance, above_turf) if(below_turf && istransparentturf(turf_source)) - listeners += SSmobs.clients_by_zlevel[below_turf.z] + listeners += get_hearers_in_view(maxdistance, below_turf) - for(var/mob/listening_mob as anything in listeners) + for(var/mob/listening_mob in listeners | SSmobs.dead_players_by_zlevel[source_z])//observers always hear through walls if(get_dist(listening_mob, turf_source) <= maxdistance) listening_mob.playsound_local(turf_source, soundin, vol, vary, frequency, falloff_exponent, channel, pressure_affected, S, maxdistance, falloff_distance, 1, use_reverb) - for(var/mob/listening_mob as anything in SSmobs.dead_players_by_zlevel[source_z]) - if(get_dist(listening_mob, turf_source) <= maxdistance) - listening_mob.playsound_local(turf_source, soundin, vol, vary, frequency, falloff_exponent, channel, pressure_affected, S, maxdistance, falloff_distance, 1, use_reverb) - -/*! playsound - -playsound_local is a proc used to play a sound directly on a mob from a specific turf. -This is called by playsound to send sounds to players, in which case it also gets the max_distance of that sound. - -turf_source - Origin of sound -soundin - Either a file, or a string that can be used to get an SFX -vol - The volume of the sound, excluding falloff -vary - bool that determines if the sound changes pitch every time it plays -frequency - playback speed of audio -falloff_exponent - Rate of falloff for the audio. Higher means quicker drop to low volume. Should generally be over 1 to indicate a quick dive to 0 rather than a slow dive. -channel - The channel the sound is played at -pressure_affected - Whether or not difference in pressure affects the sound (E.g. if you can hear in space) -max_distance - The peak distance of the sound, if this is a 3D sound -falloff_distance - Distance at which falloff begins, if this is a 3D sound -distance_multiplier - Can be used to multiply the distance at which the sound is heard + . += listening_mob -*/ - -/mob/proc/playsound_local(turf/turf_source, soundin, vol as num, vary, frequency, falloff_exponent = SOUND_FALLOFF_EXPONENT, channel = 0, pressure_affected = TRUE, sound/S, max_distance, falloff_distance = SOUND_DEFAULT_FALLOFF_DISTANCE, distance_multiplier = 1, use_reverb = TRUE) +/mob/proc/playsound_local(turf/turf_source, soundin, vol as num, vary, frequency, falloff_exponent = SOUND_FALLOFF_EXPONENT, channel = 0, pressure_affected = TRUE, sound/sound_to_use, max_distance, falloff_distance = SOUND_DEFAULT_FALLOFF_DISTANCE, distance_multiplier = 1, use_reverb = TRUE) if(!client || !can_hear()) return - if(!S) - S = sound(get_sfx(soundin)) + if(!sound_to_use) + sound_to_use = sound(get_sfx(soundin)) - S.wait = 0 //No queue - S.channel = channel || SSsounds.random_available_channel() - S.volume = vol + sound_to_use.wait = 0 //No queue + sound_to_use.channel = channel || SSsounds.random_available_channel() + sound_to_use.volume = vol if(vary) if(frequency) - S.frequency = frequency + sound_to_use.frequency = frequency else - S.frequency = get_rand_frequency() + sound_to_use.frequency = get_rand_frequency() if(isturf(turf_source)) - var/turf/T = get_turf(src) + var/turf/turf_loc = get_turf(src) //sound volume falloff with distance - var/distance = get_dist(T, turf_source) - - distance *= distance_multiplier + var/distance = get_dist(turf_loc, turf_source) * distance_multiplier if(max_distance) //If theres no max_distance we're not a 3D sound, so no falloff. - S.volume -= (max(distance - falloff_distance, 0) ** (1 / falloff_exponent)) / ((max(max_distance, distance) - falloff_distance) ** (1 / falloff_exponent)) * S.volume + sound_to_use.volume -= (max(distance - falloff_distance, 0) ** (1 / falloff_exponent)) / ((max(max_distance, distance) - falloff_distance) ** (1 / falloff_exponent)) * sound_to_use.volume //https://www.desmos.com/calculator/sqdfl8ipgf if(pressure_affected) //Atmosphere affects sound var/pressure_factor = 1 - var/datum/gas_mixture/hearer_env = T.return_air() + var/datum/gas_mixture/hearer_env = turf_loc.return_air() var/datum/gas_mixture/source_env = turf_source.return_air() if(hearer_env && source_env) @@ -149,35 +125,35 @@ distance_multiplier - Can be used to multiply the distance at which the sound is if(distance <= 1) pressure_factor = max(pressure_factor, 0.15) //touching the source of the sound - S.volume *= pressure_factor + sound_to_use.volume *= pressure_factor //End Atmosphere affecting sound - if(S.volume <= 0) + if(sound_to_use.volume <= 0) return //No sound - var/dx = turf_source.x - T.x // Hearing from the right/left - S.x = dx * distance_multiplier - var/dz = turf_source.y - T.y // Hearing from infront/behind - S.z = dz * distance_multiplier - var/dy = (turf_source.z - T.z) * 5 * distance_multiplier // Hearing from above / below, multiplied by 5 because we assume height is further along coords. - S.y = dy + var/dx = turf_source.x - turf_loc.x // Hearing from the right/left + sound_to_use.x = dx * distance_multiplier + var/dz = turf_source.y - turf_loc.y // Hearing from infront/behind + sound_to_use.z = dz * distance_multiplier + var/dy = (turf_source.z - turf_loc.z) * 5 * distance_multiplier // Hearing from above / below, multiplied by 5 because we assume height is further along coords. + sound_to_use.y = dy - S.falloff = max_distance || 1 //use max_distance, else just use 1 as we are a direct sound so falloff isnt relevant. + sound_to_use.falloff = max_distance || 1 //use max_distance, else just use 1 as we are a direct sound so falloff isnt relevant. // Sounds can't have their own environment. A sound's environment will be: // 1. the mob's // 2. the area's (defaults to SOUND_ENVRIONMENT_NONE) if(sound_environment_override != SOUND_ENVIRONMENT_NONE) - S.environment = sound_environment_override + sound_to_use.environment = sound_environment_override else var/area/A = get_area(src) - S.environment = A.sound_environment + sound_to_use.environment = A.sound_environment - if(use_reverb && S.environment != SOUND_ENVIRONMENT_NONE) //We have reverb, reset our echo setting - S.echo[3] = 0 //Room setting, 0 means normal reverb - S.echo[4] = 0 //RoomHF setting, 0 means normal reverb. + if(use_reverb && sound_to_use.environment != SOUND_ENVIRONMENT_NONE) //We have reverb, reset our echo setting + sound_to_use.echo[3] = 0 //Room setting, 0 means normal reverb + sound_to_use.echo[4] = 0 //RoomHF setting, 0 means normal reverb. - SEND_SOUND(src, S) + SEND_SOUND(src, sound_to_use) /proc/sound_to_playing_players(soundin, volume = 100, vary = FALSE, frequency = 0, channel = 0, pressure_affected = FALSE, sound/S) if(!S) @@ -199,7 +175,7 @@ distance_multiplier - Can be used to multiply the distance at which the sound is set waitfor = FALSE UNTIL(SSticker.login_music) //wait for SSticker init to set the login music - if(prefs && (prefs.toggles & SOUND_LOBBY)) + if(prefs && (prefs.toggles & SOUND_LOBBY) && !CONFIG_GET(flag/disallow_title_music)) SEND_SOUND(src, sound(SSticker.login_music, repeat = 0, wait = 0, volume = vol, channel = CHANNEL_LOBBYMUSIC)) // MAD JAMS /proc/get_rand_frequency() diff --git a/code/game/turfs/closed/minerals.dm b/code/game/turfs/closed/minerals.dm index 1b9815b3827aac..b3781e92665f0b 100644 --- a/code/game/turfs/closed/minerals.dm +++ b/code/game/turfs/closed/minerals.dm @@ -487,6 +487,15 @@ turf_type = /turf/open/misc/asteroid/snow/ice/icemoon initial_gas_mix = ICEMOON_DEFAULT_ATMOS +//For when you want genuine, real snowy mountainside in your kitchen's cold room. +/turf/closed/mineral/snowmountain/coldroom + baseturfs = /turf/open/misc/asteroid/snow/coldroom + turf_type = /turf/open/misc/asteroid/snow/coldroom + +/turf/closed/mineral/snowmountain/coldroom/Initialize(mapload) + initial_gas_mix = KITCHEN_COLDROOM_ATMOS + return ..() + //yoo RED ROCK RED ROCK /turf/closed/mineral/asteroid diff --git a/code/game/turfs/open/_open.dm b/code/game/turfs/open/_open.dm index 5e93cc1cf66afc..ccaef8fb9f1c9d 100644 --- a/code/game/turfs/open/_open.dm +++ b/code/game/turfs/open/_open.dm @@ -1,6 +1,7 @@ /turf/open plane = FLOOR_PLANE - var/slowdown = 0 //negative for faster, positive for slower + ///negative for faster, positive for slower + var/slowdown = 0 var/footstep = null var/barefootstep = null @@ -187,10 +188,9 @@ /turf/open/proc/freeze_turf() for(var/obj/I in contents) - if(I.resistance_flags & FREEZE_PROOF) - continue - if(!(I.obj_flags & FROZEN)) - I.make_frozen_visual() + if(!HAS_TRAIT(I, TRAIT_FROZEN) && !(I.obj_flags & FREEZE_PROOF)) + I.AddElement(/datum/element/frozen) + for(var/mob/living/L in contents) if(L.bodytemperature <= 50) L.apply_status_effect(/datum/status_effect/freon) @@ -204,15 +204,14 @@ M.apply_water() wash(CLEAN_WASH) - for(var/am in src) - var/atom/movable/movable_content = am + for(var/atom/movable/movable_content as anything in src) if(ismopable(movable_content)) // Will have already been washed by the wash call above at this point. continue movable_content.wash(CLEAN_WASH) return TRUE /turf/open/handle_slip(mob/living/carbon/slipper, knockdown_amount, obj/O, lube, paralyze_amount, force_drop) - if(slipper.movement_type & FLYING) + if(slipper.movement_type & (FLYING | FLOATING)) return FALSE if(has_gravity(src)) var/obj/buckled_obj diff --git a/code/game/turfs/open/asteroid.dm b/code/game/turfs/open/asteroid.dm index 2a0769a1c245ae..840ed46dee8bd5 100644 --- a/code/game/turfs/open/asteroid.dm +++ b/code/game/turfs/open/asteroid.dm @@ -217,6 +217,16 @@ GLOBAL_LIST_EMPTY(dug_up_basalt) /turf/open/misc/asteroid/snow/temperatre initial_gas_mix = "o2=22;n2=82;TEMP=255.37" +//Used for when you want to have real, genuine snow in your kitchen's cold room +/turf/open/misc/asteroid/snow/coldroom + baseturfs = /turf/open/misc/asteroid/snow/coldroom + planetary_atmos = FALSE + temperature = COLD_ROOM_TEMP + +/turf/open/misc/asteroid/snow/coldroom/Initialize(mapload) + initial_gas_mix = KITCHEN_COLDROOM_ATMOS + return ..() + //Used in SnowCabin.dm /turf/open/misc/asteroid/snow/snow_cabin temperature = 180 diff --git a/code/game/turfs/open/basalt.dm b/code/game/turfs/open/basalt.dm index ce1b547fdcc176..e52a6053a6efeb 100644 --- a/code/game/turfs/open/basalt.dm +++ b/code/game/turfs/open/basalt.dm @@ -8,7 +8,7 @@ /turf/open/misc/basalt/Initialize(mapload) . = ..() - AddComponent(/datum/component/diggable, /obj/item/stack/ore/glass/basalt, 2, "dig up") + AddElement(/datum/element/diggable, /obj/item/stack/ore/glass/basalt, 2) if(prob(15)) icon_state = "basalt[rand(0, 12)]" set_basalt_light(src) diff --git a/code/game/turfs/open/dirtystation.dm b/code/game/turfs/open/dirtystation.dm index c00948374054dd..63d25fefb87db9 100644 --- a/code/game/turfs/open/dirtystation.dm +++ b/code/game/turfs/open/dirtystation.dm @@ -25,7 +25,6 @@ //high dirt - 1/3 chance. var/static/list/high_dirt_areas = typecacheof(list( - /area/station/science/test_area, /area/mine/production, /area/mine/living_quarters, /area/station/commons/vacant_room/office, diff --git a/code/game/turfs/open/floor.dm b/code/game/turfs/open/floor.dm index 9010052a590c1d..bbbfbbb4792087 100644 --- a/code/game/turfs/open/floor.dm +++ b/code/game/turfs/open/floor.dm @@ -20,10 +20,12 @@ overfloor_placed = TRUE + /// Determines the type of damage overlay that will be used for the tile + var/damaged_dmi = 'icons/turf/damaged.dmi' var/broken = FALSE var/burnt = FALSE /// Path of the tile that this floor drops - var/floor_tile = null + var/floor_tile = null var/list/broken_states var/list/burnt_states @@ -125,17 +127,24 @@ /turf/open/floor/break_tile() if(broken) return - icon_state = pick(broken_states) - broken = 1 + broken = TRUE + update_appearance() /turf/open/floor/burn_tile() - if(broken || burnt) + if(burnt) return - if(LAZYLEN(burnt_states)) - icon_state = pick(burnt_states) - else - icon_state = pick(broken_states) - burnt = 1 + burnt = TRUE + update_appearance() + +/turf/open/floor/update_overlays() + . = ..() + if(broken) + . += mutable_appearance(damaged_dmi, pick(broken_states)) + else if(burnt) + if(LAZYLEN(burnt_states)) + . += mutable_appearance(damaged_dmi, pick(burnt_states)) + else + . += mutable_appearance(damaged_dmi, pick(broken_states)) /// Things seem to rely on this actually returning plating. Override it if you have other baseturfs. /turf/open/floor/proc/make_plating(force = FALSE) diff --git a/code/game/turfs/open/floor/fancy_floor.dm b/code/game/turfs/open/floor/fancy_floor.dm index 03c5442957e4cb..8c8aac4bee08ee 100644 --- a/code/game/turfs/open/floor/fancy_floor.dm +++ b/code/game/turfs/open/floor/fancy_floor.dm @@ -111,7 +111,7 @@ heavyfootstep = FOOTSTEP_GENERIC_HEAVY /turf/open/floor/bamboo/setup_broken_states() - return list("damaged") + return list("bamboodamaged") /turf/open/floor/grass name = "grass patch" @@ -132,7 +132,7 @@ /turf/open/floor/grass/Initialize(mapload) . = ..() spawniconchange() - AddComponent(/datum/component/diggable, /obj/item/stack/ore/glass, 2, "uproot") + AddElement(/datum/element/diggable, /obj/item/stack/ore/glass, 2, "uproot", "uproots") /turf/open/floor/grass/proc/spawniconchange() icon_state = "grass[rand(0,3)]" @@ -170,7 +170,7 @@ /turf/open/floor/fake_snow/Initialize(mapload) . = ..() - AddComponent(/datum/component/diggable, /obj/item/stack/tile/mineral/snow, 2, "dig up") + AddElement(/datum/element/diggable, /obj/item/stack/tile/mineral/snow, 2) /turf/open/floor/fake_snow/setup_broken_states() return list("snow_dug") @@ -197,7 +197,7 @@ /turf/open/floor/fakebasalt/Initialize(mapload) . = ..() - AddComponent(/datum/component/diggable, /obj/item/stack/ore/glass/basalt, 2, "dig up") + AddElement(/datum/element/diggable, /obj/item/stack/ore/glass/basalt, 2) if(prob(15)) icon_state = "basalt[rand(0, 12)]" set_basalt_light(src) @@ -220,9 +220,6 @@ heavyfootstep = FOOTSTEP_GENERIC_HEAVY tiled_dirt = FALSE -/turf/open/floor/carpet/setup_broken_states() - return list("damaged") - /turf/open/floor/carpet/examine(mob/user) . = ..() . += span_notice("There's a small crack on the edge of it.") diff --git a/code/game/turfs/open/floor/glass.dm b/code/game/turfs/open/floor/glass.dm index 4bddbbb5a3aca1..982384f8a3bf85 100644 --- a/code/game/turfs/open/floor/glass.dm +++ b/code/game/turfs/open/floor/glass.dm @@ -31,6 +31,12 @@ /turf/open/floor/glass/make_plating() return +/turf/open/floor/glass/icemoon + initial_gas_mix = ICEMOON_DEFAULT_ATMOS + +/turf/open/floor/glass/airless + initial_gas_mix = AIRLESS_ATMOS + /turf/open/floor/glass/reinforced name = "reinforced glass floor" desc = "Do jump on it, it can take it." @@ -39,14 +45,37 @@ base_icon_state = "reinf_glass" floor_tile = /obj/item/stack/tile/rglass + /turf/open/floor/glass/reinforced/icemoon - name = "reinforced glass floor" - desc = "Do jump on it, it can take it." - icon = 'icons/turf/floors/reinf_glass.dmi' - icon_state = "reinf_glass-0" - base_icon_state = "reinf_glass" - floor_tile = /obj/item/stack/tile/rglass - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas_mix = ICEMOON_DEFAULT_ATMOS + +/turf/open/floor/glass/reinforced/airless + initial_gas_mix = AIRLESS_ATMOS + +/turf/open/floor/glass/plasma + name = "plasma glass floor" + desc = "Studies by the Nanotrasen Materials Safety Division have not yet determined if this is safe to jump on, do so at your own risk." + icon = 'icons/turf/floors/plasma_glass.dmi' + icon_state = "plasma_glass-0" + base_icon_state = "plasma_glass" + floor_tile = /obj/item/stack/tile/glass/plasma + +/turf/open/floor/glass/plasma/icemoon + initial_gas_mix = ICEMOON_DEFAULT_ATMOS + +/turf/open/floor/glass/plasma/airless + initial_gas_mix = AIRLESS_ATMOS + +/turf/open/floor/glass/reinforced/plasma + name = "reinforced plasma glass floor" + desc = "Do jump on it, jump on it while in a mecha, it can take it." + icon = 'icons/turf/floors/reinf_plasma_glass.dmi' + icon_state = "reinf_plasma_glass-0" + base_icon_state = "reinf_plasma_glass" + floor_tile = /obj/item/stack/tile/rglass/plasma + +/turf/open/floor/glass/reinforced/plasma/icemoon + initial_gas_mix = ICEMOON_DEFAULT_ATMOS -/turf/open/floor/glass/reinforced/setup_broken_states() - return list("reinf_glass-damaged1", "reinf_glass-damaged2", "reinf_glass-damaged3") +/turf/open/floor/glass/reinforced/plasma/airless + initial_gas_mix = AIRLESS_ATMOS diff --git a/code/game/turfs/open/floor/plating.dm b/code/game/turfs/open/floor/plating.dm index a12b19bb245f23..12485640b28693 100644 --- a/code/game/turfs/open/floor/plating.dm +++ b/code/game/turfs/open/floor/plating.dm @@ -1,6 +1,6 @@ /** * PLATINGS - * + * * Handle interaction with tiles and lets you put stuff on top of it. */ /turf/open/floor/plating @@ -23,10 +23,10 @@ var/allow_replacement = TRUE /turf/open/floor/plating/setup_broken_states() - return list("platingdmg1", "platingdmg2", "platingdmg3") + return list("damaged1", "damaged2", "damaged4") /turf/open/floor/plating/setup_burnt_states() - return list("panelscorched") + return list("floorscorched1", "floorscorched2") /turf/open/floor/plating/examine(mob/user) . = ..() diff --git a/code/game/turfs/open/floor/plating/misc_plating.dm b/code/game/turfs/open/floor/plating/misc_plating.dm index cad8d5d3c35001..a5fa2496290580 100644 --- a/code/game/turfs/open/floor/plating/misc_plating.dm +++ b/code/game/turfs/open/floor/plating/misc_plating.dm @@ -71,6 +71,15 @@ /turf/open/floor/plating/snowed/temperatre temperature = 255.37 +// When you want real, genuine snowed plating in your kitchen's cold room. +/turf/open/floor/plating/snowed/coldroom + planetary_atmos = FALSE + temperature = COLD_ROOM_TEMP + +/turf/open/floor/plating/snowed/coldroom/Initialize(mapload) + initial_gas_mix = KITCHEN_COLDROOM_ATMOS + return ..() + //Used in SnowCabin.dm /turf/open/floor/plating/snowed/snow_cabin temperature = 180 diff --git a/code/game/turfs/open/grass.dm b/code/game/turfs/open/grass.dm index b1ecd34165df38..5321841111fd99 100644 --- a/code/game/turfs/open/grass.dm +++ b/code/game/turfs/open/grass.dm @@ -14,6 +14,7 @@ smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_FLOOR_GRASS) canSmoothWith = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_FLOOR_GRASS) layer = HIGH_TURF_LAYER + var/damaged_dmi = 'icons/turf/floors/grass.dmi' var/smooth_icon = 'icons/turf/floors/grass.dmi' /turf/open/misc/grass/break_tile() diff --git a/code/game/turfs/open/ice.dm b/code/game/turfs/open/ice.dm index 4a9a55b53da9fc..180381349d8800 100644 --- a/code/game/turfs/open/ice.dm +++ b/code/game/turfs/open/ice.dm @@ -39,3 +39,19 @@ /turf/open/misc/ice/icemoon/no_planet_atmos planetary_atmos = FALSE + +/turf/open/misc/ice/temperate + baseturfs = /turf/open/misc/ice/temperate + desc = "Somehow, it is not melting under these conditions. Must be some very thick ice. Just as slippery too." + initial_gas_mix = "o2=22;n2=82;TEMP=255.37" //it works with /turf/open/misc/asteroid/snow/temperatre + +//For when you want real, genuine ice in your kitchen's cold room. +/turf/open/misc/ice/coldroom + desc = "Somehow, it is not melting under these conditions. Must be some very thick ice. Just as slippery too." + baseturfs = /turf/open/misc/ice/coldroom + planetary_atmos = FALSE + temperature = COLD_ROOM_TEMP + +/turf/open/misc/ice/coldroom/Initialize(mapload) + initial_gas_mix = KITCHEN_COLDROOM_ATMOS + return ..() diff --git a/code/game/turfs/open/lava.dm b/code/game/turfs/open/lava.dm index 4d9f56a4e31665..5ccc5c79ea40c7 100644 --- a/code/game/turfs/open/lava.dm +++ b/code/game/turfs/open/lava.dm @@ -26,6 +26,12 @@ var/immunity_trait = TRAIT_LAVA_IMMUNE /// objects with these flags won't burn. var/immunity_resistance_flags = LAVA_PROOF + /// the temperature that this turf will attempt to heat/cool gasses too in a heat exchanger, in kelvin + var/lava_temperature = 5000 + +/turf/open/lava/Initialize(mapload) + . = ..() + AddElement(/datum/element/lazy_fishing_spot, FISHING_SPOT_PRESET_LAVALAND_LAVA) /turf/open/lava/ex_act(severity, target) return @@ -99,7 +105,7 @@ . = 700000 /turf/open/lava/GetTemperature() - . = 5000 + . = lava_temperature /turf/open/lava/TakeTemperature(temp) @@ -118,6 +124,20 @@ else to_chat(user, span_warning("You need one rod to build a heatproof lattice.")) return + // Light a cigarette in the lava + if(istype(C, /obj/item/clothing/mask/cigarette)) + var/obj/item/clothing/mask/cigarette/ciggie = C + if(ciggie.lit) + to_chat(user, span_warning("The [ciggie.name] is already lit!")) + return TRUE + var/clumsy_modifier = HAS_TRAIT(user, TRAIT_CLUMSY) ? 2 : 1 + if(prob(25 * clumsy_modifier )) + ciggie.light(span_warning("[user] expertly dips \the [ciggie.name] into [src], along with the rest of [user.p_their()] arm. What a dumbass.")) + var/obj/item/bodypart/affecting = user.get_active_hand() + affecting?.receive_damage(burn = 90) + else + ciggie.light(span_rose("[user] expertly dips \the [ciggie.name] into [src], lighting it with the scorching heat of the planet. Witnessing such a feat is almost enough to make you cry.")) + return TRUE /turf/open/lava/proc/is_safe() //if anything matching this typecache is found in the lava, we don't burn things diff --git a/code/game/turfs/open/openspace.dm b/code/game/turfs/open/openspace.dm index 6080997d07fef4..834ed9895c58a6 100644 --- a/code/game/turfs/open/openspace.dm +++ b/code/game/turfs/open/openspace.dm @@ -33,6 +33,9 @@ GLOBAL_DATUM_INIT(openspace_backdrop_one_for_all, /atom/movable/openspace_backdr . = ..() overlays += GLOB.openspace_backdrop_one_for_all //Special grey square for projecting backdrop darkness filter on it. RegisterSignal(src, COMSIG_ATOM_INITIALIZED_ON, .proc/on_atom_created) + var/area/our_area = loc + if(istype(our_area, /area/space)) + force_no_gravity = TRUE return INITIALIZE_HINT_LATELOAD /turf/open/openspace/LateInitialize() diff --git a/code/game/turfs/open/planet.dm b/code/game/turfs/open/planet.dm index 6c1ae311ae9659..803cd2444316d7 100644 --- a/code/game/turfs/open/planet.dm +++ b/code/game/turfs/open/planet.dm @@ -52,6 +52,7 @@ desc = "Greener on the other side." icon_state = "junglegrass" base_icon_state = "junglegrass" + damaged_dmi = 'icons/turf/floors/junglegrass.dmi' smooth_icon = 'icons/turf/floors/junglegrass.dmi' /turf/closed/mineral/random/jungle diff --git a/code/game/turfs/open/snow.dm b/code/game/turfs/open/snow.dm index 4017240e3fd568..27def9bdc59329 100644 --- a/code/game/turfs/open/snow.dm +++ b/code/game/turfs/open/snow.dm @@ -15,7 +15,7 @@ /turf/open/misc/snow/Initialize(mapload) . = ..() - AddComponent(/datum/component/diggable, /obj/item/stack/sheet/mineral/snow, 2, "dig up") + AddElement(/datum/element/diggable, /obj/item/stack/sheet/mineral/snow, 2) /turf/open/misc/snow/break_tile() . = ..() diff --git a/code/game/turfs/open/space/space.dm b/code/game/turfs/open/space/space.dm index 1a81515e9403d8..fbfc6cebe0ac3e 100644 --- a/code/game/turfs/open/space/space.dm +++ b/code/game/turfs/open/space/space.dm @@ -22,6 +22,8 @@ bullet_bounce_sound = null vis_flags = VIS_INHERIT_ID //when this be added to vis_contents of something it be associated with something on clicking, important for visualisation of turf in openspace and interraction with openspace that show you turf. + force_no_gravity = TRUE + /turf/open/space/basic/New() //Do not convert to Initialize //This is used to optimize the map loader return diff --git a/code/game/turfs/open/water.dm b/code/game/turfs/open/water.dm index 76c23ec7c86d60..465645eabeeb44 100644 --- a/code/game/turfs/open/water.dm +++ b/code/game/turfs/open/water.dm @@ -29,6 +29,10 @@ base_icon_state = "water" baseturfs = /turf/open/water/beach +/turf/open/water/beach/Initialize(mapload) + . = ..() + AddElement(/datum/element/lazy_fishing_spot, FISHING_SPOT_PRESET_BEACH) + //Same turf, but instead used in the Beach Biodome /turf/open/water/beach/biodome initial_gas_mix = OPENTURF_DEFAULT_ATMOS diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 65ed7ab5264ee8..d014ceea7cb653 100755 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -74,6 +74,8 @@ GLOBAL_LIST_EMPTY(station_turfs) /// but is now destroyed, this will preserve the value. /// See __DEFINES/construction.dm for RCD_MEMORY_*. var/rcd_memory + ///whether or not this turf forces movables on it to have no gravity (unless they themselves have forced gravity) + var/force_no_gravity = FALSE /// How pathing algorithm will check if this turf is passable by itself (not including content checks). By default it's just density check. /// WARNING: Currently to use a density shortcircuiting this does not support dense turfs with special allow through function @@ -363,8 +365,6 @@ GLOBAL_LIST_EMPTY(station_turfs) var/canPassSelf = CanPass(mover, get_dir(src, mover)) if(canPassSelf || (mover.movement_type & PHASING)) for(var/atom/movable/thing as anything in contents) - if(QDELETED(mover)) - return FALSE //We were deleted, do not attempt to proceed with movement. if(thing == mover || thing == mover.loc) // Multi tile objects and moving out of other objects continue if(!thing.Cross(mover)) @@ -385,14 +385,6 @@ GLOBAL_LIST_EMPTY(station_turfs) return (mover.movement_type & PHASING) return TRUE -/turf/open/Entered(atom/movable/arrived, atom/old_loc, list/atom/old_locs) - . = ..() - //melting - if(isobj(arrived) && air && air.temperature > T0C) - var/obj/O = arrived - if(O.obj_flags & FROZEN) - O.make_unfrozen() - // A proc in case it needs to be recreated or badmins want to change the baseturfs /turf/proc/assemble_baseturfs(turf/fake_baseturf_type) var/static/list/created_baseturf_lists = list() diff --git a/code/game/world.dm b/code/game/world.dm index 5f041fcbd031ca..07eeaae8f09372 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -142,6 +142,7 @@ GLOBAL_VAR(restart_counter) GLOB.world_pda_log = "[GLOB.log_directory]/pda.log" GLOB.world_uplink_log = "[GLOB.log_directory]/uplink.log" GLOB.world_telecomms_log = "[GLOB.log_directory]/telecomms.log" + GLOB.world_speech_indicators_log = "[GLOB.log_directory]/speech_indicators.log" GLOB.world_manifest_log = "[GLOB.log_directory]/manifest.log" GLOB.world_href_log = "[GLOB.log_directory]/hrefs.log" GLOB.world_mob_tag_log = "[GLOB.log_directory]/mob_tags.log" @@ -340,6 +341,11 @@ GLOBAL_VAR(restart_counter) if (features) s += ": [jointext(features, ", ")]" + s += "
Round time: [gameTimestamp("hh:mm")]" + if(SSmapping.config) + s += "
Map: [SSmapping.config.map_path == CUSTOM_MAP_PATH ? "Uncharted Territory" : SSmapping.config.map_name]" + s += "
Alert level: [capitalize(SSsecurity_level.get_current_level_as_text())]" + status = s /world/proc/update_hub_visibility(new_visibility) diff --git a/code/modules/admin/admin_ranks.dm b/code/modules/admin/admin_ranks.dm index ab9417f2d6d53c..baa8a2919748f3 100644 --- a/code/modules/admin/admin_ranks.dm +++ b/code/modules/admin/admin_ranks.dm @@ -258,7 +258,7 @@ GLOBAL_PROTECT(protected_ranks) new /datum/admins(ranks_from_rank_name(admin_rank), ckey(admin_key), force_active = FALSE, protected = TRUE) if(!CONFIG_GET(flag/admin_legacy_system) || dbfail) - var/datum/db_query/query_load_admins = SSdbcore.NewQuery("SELECT ckey, `rank` FROM [format_table_name("admin")] ORDER BY `rank`") + var/datum/db_query/query_load_admins = SSdbcore.NewQuery("SELECT ckey, `rank`, feedback FROM [format_table_name("admin")] ORDER BY `rank`") if(!query_load_admins.Execute()) message_admins("Error loading admins from database. Loading from backup.") log_sql("Error loading admins from database. Loading from backup.") @@ -267,6 +267,7 @@ GLOBAL_PROTECT(protected_ranks) while(query_load_admins.NextRow()) var/admin_ckey = ckey(query_load_admins.item[1]) var/admin_rank = query_load_admins.item[2] + var/admin_feedback = query_load_admins.item[3] var/skip var/list/admin_ranks = ranks_from_rank_name(admin_rank) @@ -277,7 +278,8 @@ GLOBAL_PROTECT(protected_ranks) if(GLOB.admin_datums[admin_ckey] || GLOB.deadmins[admin_ckey]) skip = 1 if(!skip) - new /datum/admins(admin_ranks, admin_ckey) + var/datum/admins/admin_holder = new(admin_ranks, admin_ckey) + admin_holder.cached_feedback_link = admin_feedback || NO_FEEDBACK_LINK qdel(query_load_admins) //load admins from backup file if(dbfail) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 9d22bd146641ba..5a0de05e7d57d5 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -75,10 +75,10 @@ GLOBAL_PROTECT(admin_verbs_admin) /client/proc/respawn_character, /datum/admins/proc/open_borgopanel, /datum/admins/proc/view_all_circuits, - /datum/admins/proc/view_all_sdql_spells, /datum/admins/proc/known_alts_panel, /datum/admins/proc/paintings_manager, /datum/admins/proc/display_tags, + /datum/admins/proc/fishing_calculator, ) GLOBAL_LIST_INIT(admin_verbs_ban, list(/client/proc/unban_panel, /client/proc/ban_panel, /client/proc/stickybanpanel)) GLOBAL_PROTECT(admin_verbs_ban) @@ -194,13 +194,13 @@ GLOBAL_PROTECT(admin_verbs_debug) /datum/admins/proc/create_or_modify_area, /client/proc/check_timer_sources, /client/proc/toggle_cdn, - /client/proc/cmd_sdql_spell_menu, /client/proc/adventure_manager, /client/proc/load_circuit, /client/proc/cmd_admin_toggle_fov, /client/proc/cmd_admin_debug_traitor_objectives, /client/proc/spawn_debug_full_crew, /client/proc/validate_puzzgrids, + /client/proc/debug_spell_requirements, ) GLOBAL_LIST_INIT(admin_verbs_possess, list(/proc/possess, /proc/release)) GLOBAL_PROTECT(admin_verbs_possess) @@ -660,12 +660,29 @@ GLOBAL_PROTECT(admin_verbs_hideable) set name = "Give Spell" set desc = "Gives a spell to a mob." + var/which = tgui_alert(usr, "Chose by name or by type path?", "Chose option", list("Name", "Typepath")) + if(!which) + return + if(QDELETED(spell_recipient)) + to_chat(usr, span_warning("The intended spell recipient no longer exists.")) + return + var/list/spell_list = list() - var/type_length = length_char("/obj/effect/proc_holder/spell") + 2 - for(var/spell in GLOB.spells) - spell_list[copytext_char("[spell]", type_length)] = spell - var/spell_desc = input("Choose the spell to give to that guy", "ABRAKADABRA") as null|anything in sort_list(spell_list) - if(!spell_desc) + for(var/datum/action/cooldown/spell/to_add as anything in subtypesof(/datum/action/cooldown/spell)) + var/spell_name = initial(to_add.name) + if(spell_name == "Spell") // abstract or un-named spells should be skipped. + continue + + if(which == "Name") + spell_list[spell_name] = to_add + else + spell_list += to_add + + var/chosen_spell = tgui_input_list(usr, "Choose the spell to give to [spell_recipient]", "ABRAKADABRA", sort_list(spell_list)) + if(isnull(chosen_spell)) + return + var/datum/action/cooldown/spell/spell_path = which == "Typepath" ? chosen_spell : spell_list[chosen_spell] + if(!ispath(spell_path)) return var/robeless = (tgui_alert(usr, "Would you like to force this spell to be robeless?", "Robeless Casting?", list("Force Robeless", "Use Spell Setting")) == "Force Robeless") @@ -675,37 +692,43 @@ GLOBAL_PROTECT(admin_verbs_hideable) return SSblackbox.record_feedback("tally", "admin_verb", 1, "Give Spell") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - log_admin("[key_name(usr)] gave [key_name(spell_recipient)] the spell [spell_desc][robeless ? " (Forced robeless)" : ""].") - message_admins(span_adminnotice("[key_name_admin(usr)] gave [key_name_admin(spell_recipient)] the spell [spell_desc][spell_desc][robeless ? " (Forced robeless)" : ""].")) + log_admin("[key_name(usr)] gave [key_name(spell_recipient)] the spell [chosen_spell][robeless ? " (Forced robeless)" : ""].") + message_admins("[key_name_admin(usr)] gave [key_name_admin(spell_recipient)] the spell [chosen_spell][robeless ? " (Forced robeless)" : ""].") - var/spell_path = spell_list[spell_desc] - var/obj/effect/proc_holder/spell/new_spell = new spell_path() + var/datum/action/cooldown/spell/new_spell = new spell_path(spell_recipient.mind || spell_recipient) if(robeless) - new_spell.clothes_req = FALSE + new_spell.spell_requirements &= ~SPELL_REQUIRES_WIZARD_GARB - if(spell_recipient.mind) - spell_recipient.mind.AddSpell(new_spell) - else - spell_recipient.AddSpell(new_spell) - message_admins(span_danger("Spells given to mindless mobs will not be transferred in mindswap or cloning!")) + new_spell.Grant(spell_recipient) + + if(!spell_recipient.mind) + to_chat(usr, span_userdanger("Spells given to mindless mobs will belong to the mob and not their mind, \ + and as such will not be transferred if their mind changes body (Such as from Mindswap).")) /client/proc/remove_spell(mob/removal_target in GLOB.mob_list) set category = "Admin.Fun" set name = "Remove Spell" set desc = "Remove a spell from the selected mob." - var/target_spell_list = length(removal_target?.mind?.spell_list) ? removal_target.mind.spell_list : removal_target.mob_spell_list + var/list/target_spell_list = list() + for(var/datum/action/cooldown/spell/spell in removal_target.actions) + target_spell_list[spell.name] = spell if(!length(target_spell_list)) return - var/obj/effect/proc_holder/spell/removed_spell = input("Choose the spell to remove", "NO ABRAKADABRA") as null|anything in sort_list(target_spell_list) - if(removed_spell) - removal_target.mind.RemoveSpell(removed_spell) - log_admin("[key_name(usr)] removed the spell [removed_spell] from [key_name(removal_target)].") - message_admins(span_adminnotice("[key_name_admin(usr)] removed the spell [removed_spell] from [key_name_admin(removal_target)].")) - SSblackbox.record_feedback("tally", "admin_verb", 1, "Remove Spell") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + var/chosen_spell = tgui_input_list(usr, "Choose the spell to remove from [removal_target]", "ABRAKADABRA", sort_list(target_spell_list)) + if(isnull(chosen_spell)) + return + var/datum/action/cooldown/spell/to_remove = target_spell_list[chosen_spell] + if(!istype(to_remove)) + return + + qdel(to_remove) + log_admin("[key_name(usr)] removed the spell [chosen_spell] from [key_name(removal_target)].") + message_admins("[key_name_admin(usr)] removed the spell [chosen_spell] from [key_name_admin(removal_target)].") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Remove Spell") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/give_disease(mob/living/T in GLOB.mob_living_list) set category = "Admin.Fun" @@ -930,3 +953,41 @@ GLOBAL_PROTECT(admin_verbs_hideable) CHECK_TICK to_chat(admin, "[number_made] crewmembers have been created.") + +/// Debug verb for seeing at a glance what all spells have as set requirements +/client/proc/debug_spell_requirements() + set name = "Show Spell Requirements" + set category = "Debug" + + var/header = "Name Requirements" + var/all_requirements = list() + for(var/datum/action/cooldown/spell/spell as anything in typesof(/datum/action/cooldown/spell)) + if(initial(spell.name) == "Spell") + continue + + var/list/real_reqs = list() + var/reqs = initial(spell.spell_requirements) + if(reqs & SPELL_CASTABLE_AS_BRAIN) + real_reqs += "Castable as brain" + if(reqs & SPELL_CASTABLE_WHILE_PHASED) + real_reqs += "Castable phased" + if(reqs & SPELL_REQUIRES_HUMAN) + real_reqs += "Must be human" + if(reqs & SPELL_REQUIRES_MIME_VOW) + real_reqs += "Must be miming" + if(reqs & SPELL_REQUIRES_MIND) + real_reqs += "Must have a mind" + if(reqs & SPELL_REQUIRES_NO_ANTIMAGIC) + real_reqs += "Must have no antimagic" + if(reqs & SPELL_REQUIRES_OFF_CENTCOM) + real_reqs += "Must be off central command z-level" + if(reqs & SPELL_REQUIRES_WIZARD_GARB) + real_reqs += "Must have wizard clothes" + + all_requirements += "[initial(spell.name)] [english_list(real_reqs, "No requirements")]" + + var/page_style = "" + var/page_contents = "[page_style][header][jointext(all_requirements, "")]
" + var/datum/browser/popup = new(mob, "spellreqs", "Spell Requirements", 600, 400) + popup.set_content(page_contents) + popup.open() diff --git a/code/modules/admin/create_mob.dm b/code/modules/admin/create_mob.dm index 90fe3927c53514..5232fcec34ecf5 100644 --- a/code/modules/admin/create_mob.dm +++ b/code/modules/admin/create_mob.dm @@ -13,7 +13,7 @@ /proc/randomize_human(mob/living/carbon/human/human) human.gender = pick(MALE, FEMALE) human.physique = human.gender - human.real_name = random_unique_name(human.gender) + human.real_name = human.dna?.species.random_name(human.gender) || random_unique_name(human.gender) human.name = human.real_name human.underwear = random_underwear(human.gender) human.underwear_color = "#[random_color()]" diff --git a/code/modules/admin/fun_balloon.dm b/code/modules/admin/fun_balloon.dm index 3b77c31a564c77..0ce02fcddb60c3 100644 --- a/code/modules/admin/fun_balloon.dm +++ b/code/modules/admin/fun_balloon.dm @@ -126,7 +126,7 @@ /obj/effect/station_crash name = "station crash" desc = "With no survivors!" - icon = 'icons/obj/items_and_weapons.dmi' + icon = 'icons/obj/balloons.dmi' icon_state = "syndballoon" anchored = TRUE var/min_crash_strength = 3 diff --git a/code/modules/admin/holder2.dm b/code/modules/admin/holder2.dm index ff780c582be0f0..7ea622db3a92c4 100644 --- a/code/modules/admin/holder2.dm +++ b/code/modules/admin/holder2.dm @@ -30,9 +30,7 @@ GLOBAL_PROTECT(href_token) var/href_token /// Link from the database pointing to the admin's feedback forum - var/cached_forum_link - /// Last access time in deciseconds (playing nice with the MSO 10 second rule) - var/last_forum_access_time + var/cached_feedback_link var/deadmined @@ -172,25 +170,32 @@ GLOBAL_PROTECT(href_token) /// Returns the feedback forum thread for the admin holder's owner, as according to DB. /datum/admins/proc/feedback_link() - if(world.time - last_forum_access_time <= 10 SECONDS) - return cached_forum_link + // This intentionally does not follow the 10-second maximum TTL rule, + // as this can be reloaded through the Reload-Admins verb. + if (cached_feedback_link == NO_FEEDBACK_LINK) + return null - last_forum_access_time = world.time + if (!isnull(cached_feedback_link)) + return cached_feedback_link + + if (!SSdbcore.IsConnected()) + return FALSE var/datum/db_query/feedback_query = SSdbcore.NewQuery("SELECT feedback FROM [format_table_name("admin")] WHERE ckey = '[owner.ckey]'") if(!feedback_query.Execute()) log_sql("Error retrieving feedback link for [src]") qdel(feedback_query) - return cached_forum_link + return FALSE + if(!feedback_query.NextRow()) qdel(feedback_query) return FALSE // no feedback link exists + cached_feedback_link = feedback_query.item[1] || NO_FEEDBACK_LINK qdel(feedback_query) - cached_forum_link = feedback_query.item[1] - return cached_forum_link + return cached_feedback_link /datum/admins/proc/check_for_rights(rights_required) if(rights_required && !(rights_required & rank_flags())) diff --git a/code/modules/admin/outfit_editor.dm b/code/modules/admin/outfit_editor.dm index e57d0a9e79a196..67196c54bd4347 100644 --- a/code/modules/admin/outfit_editor.dm +++ b/code/modules/admin/outfit_editor.dm @@ -179,6 +179,10 @@ choose_any_item(slot) if("back") options = typesof(/obj/item/storage/backpack) + for(var/obj/item/mod/control/pre_equipped/potential_mod as anything in subtypesof(/obj/item/mod/control/pre_equipped)) + if(!(initial(potential_mod.slot_flags) == ITEM_SLOT_BACK)) + continue + options |= potential_mod if("r_hand") choose_any_item(slot) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index de13c71fba683e..7d095c2939ab57 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -54,6 +54,8 @@ if(E) E.admin_setup(usr) var/datum/round_event/event = E.runEvent() + if(event.cancel_event) + return if(event.announceWhen>0) event.processing = FALSE var/prompt = tgui_alert(usr, "Would you like to alert the crew?", "Alert", list("Yes", "No", "Cancel")) diff --git a/code/modules/admin/verbs/SDQL2/SDQL_spells/executor_component.dm b/code/modules/admin/verbs/SDQL2/SDQL_spells/executor_component.dm deleted file mode 100644 index 35f8b74e6fabbc..00000000000000 --- a/code/modules/admin/verbs/SDQL2/SDQL_spells/executor_component.dm +++ /dev/null @@ -1,52 +0,0 @@ -/datum/component/sdql_executor - var/query = "CALL visible_message(\"The spell fizzles!\") ON * IN TARGETS" - var/giver //The ckey of the user that gave this spell - var/suppress_message_admins - var/list/scratchpad = list() //Use this to store vars in between queries and casts. - var/list/saved_overrides = list() - -/datum/component/sdql_executor/Initialize(giver) - src.giver = giver - -//Returns the address of x without the square brackets around it. -#define RAW_ADDRESS(x) copytext("\ref[x]",2,-1) - -/datum/component/sdql_executor/proc/execute(list/targets, mob/user) - if(!CONFIG_GET(flag/sdql_spells)) - return - if(!length(query)) - return - var/query_text = query - var/message_query = query - var/list/targets_and_user_list = list(user) - if(targets) - targets_and_user_list += targets - var/targets_and_user_string = ref_list(targets_and_user_list) - var/targets_string = ref_list(targets) - query_text = replacetextEx_char(query_text, "TARGETS_AND_USER", "[targets_and_user_string]") - message_query = replacetext_char(message_query, "TARGETS_AND_USER", (targets_and_user_list.len > 3) ? "\[[targets_and_user_list.len] items]" : targets_and_user_string) - query_text = replacetextEx_char(query_text, "USER", "{[RAW_ADDRESS(user)]}") - message_query = replacetextEx_char(message_query, "USER", "{[RAW_ADDRESS(user)]}") - query_text = replacetextEx_char(query_text, "TARGETS", "[targets_string]") - message_query = replacetextEx_char(message_query, "TARGETS", (targets?.len > 3) ? "\[[targets.len] items]" : targets_string) - query_text = replacetextEx_char(query_text, "SOURCE", "{[RAW_ADDRESS(parent)]}") - message_query = replacetextEx_char(message_query, "SOURCE", "{[RAW_ADDRESS(parent)]}") - query_text = replacetextEx_char(query_text, "SCRATCHPAD", "({[RAW_ADDRESS(src)]}.scratchpad)") - message_query = replacetextEx_char(message_query, "SCRATCHPAD", "({[RAW_ADDRESS(src)]}.scratchpad)") - if(!usr) //We need to set AdminProcCaller manually because it won't be set automatically by WrapAdminProcCall if usr is null - GLOB.AdminProcCaller = "SDQL_SPELL_OF_[user.ckey]" - GLOB.AdminProcCallCount++ - world.SDQL2_query(query_text, "[key_name(user, TRUE)] (via an SDQL spell given by [giver])", "[key_name(user)] (via an SDQL spell given by [giver])", silent = suppress_message_admins) - GLOB.AdminProcCallCount-- - GLOB.AdminProcCaller = null - -/datum/component/sdql_executor/proc/ref_list(list/L) - if(isnull(L) || !L.len) - return "\[]" - var/ret = "\[" - for(var/i in 1 to L.len-1) - ret += "{[RAW_ADDRESS(L[i])]}," - ret += "{[RAW_ADDRESS(L[L.len])]}]" - return ret - -#undef RAW_ADDRESS diff --git a/code/modules/admin/verbs/SDQL2/SDQL_spells/spell_admin_panel.dm b/code/modules/admin/verbs/SDQL2/SDQL_spells/spell_admin_panel.dm deleted file mode 100644 index 1469982f2b6e71..00000000000000 --- a/code/modules/admin/verbs/SDQL2/SDQL_spells/spell_admin_panel.dm +++ /dev/null @@ -1,77 +0,0 @@ -/// An admin verb to view all sdql spells, plus useful information -/datum/admins/proc/view_all_sdql_spells() - set category = "Admin.Game" - set name = "View All SDQL Spells" - - if(CONFIG_GET(flag/sdql_spells) || tgui_alert(usr, "SDQL spells are disabled. Open the admin panel anyways?", "SDQL Admin Panel", list("Yes", "No")) == "Yes") - var/static/datum/SDQL_spell_panel/SDQL_spell_panel = new - SDQL_spell_panel.ui_interact(usr) - -/datum/SDQL_spell_panel - -/datum/SDQL_spell_panel/ui_static_data(mob/user) - var/list/data = list() - data["spells"] = list() - - for (var/obj/effect/proc_holder/spell/spell as anything in GLOB.sdql_spells) - var/mob/living/owner = spell.owner.resolve() - var/datum/component/sdql_executor/executor = spell.GetComponent(/datum/component/sdql_executor) - if(!executor) - continue - - data["spells"] += list(list( - "ref" = REF(spell), - "name" = "[spell]", - "owner" = owner, - "ownerRef" = REF(owner), - "creator" = executor.giver - )) - - return data - -/datum/SDQL_spell_panel/ui_act(action, list/params) - . = ..() - if (.) - return . - - switch(action) - if("edit_spell") - var/obj/effect/proc_holder/spell/spell = locate(params["spell"]) - if(!spell) - to_chat(usr, span_warning("That spell no longer exists!")) - return - var/datum/component/sdql_executor/executor = spell.GetComponent(/datum/component/sdql_executor) - if(!executor) - to_chat(usr, span_warning("[spell][spell.p_s()] SDQL executor component is gone!")) - return - if(usr.ckey == executor.giver || tgui_alert(usr, "You didn't create this SDQL spell. Edit it anyways?", "SDQL Admin Panel", list("Yes", "No")) == "Yes") - usr.client?.cmd_sdql_spell_menu(spell) - if("follow_owner") - var/mob/living/owner = locate(params["owner"]) - if(!owner) - to_chat(usr, span_warning("That mob no longer exists!")) - return - usr.client?.admin_follow(owner) - if("vv_spell") - var/obj/effect/proc_holder/spell/spell = locate(params["spell"]) - if(!spell) - to_chat(usr, span_warning("That spell no longer exists!")) - return - usr.client?.debug_variables(spell) - if("open_player_panel") - var/mob/living/owner = locate(params["owner"]) - if(!owner) - to_chat(usr, span_warning("That mob no longer exists!")) - return - usr.client?.holder?.show_player_panel(owner) - - return TRUE - -/datum/SDQL_spell_panel/ui_state(mob/user) - return GLOB.admin_state - -/datum/SDQL_spell_panel/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "SDQLSpellAdminPanel") - ui.open() diff --git a/code/modules/admin/verbs/SDQL2/SDQL_spells/spell_edit_menu.dm b/code/modules/admin/verbs/SDQL2/SDQL_spells/spell_edit_menu.dm deleted file mode 100644 index 7c74c38ca7028d..00000000000000 --- a/code/modules/admin/verbs/SDQL2/SDQL_spells/spell_edit_menu.dm +++ /dev/null @@ -1,932 +0,0 @@ -GLOBAL_LIST_INIT_TYPED(sdql_spells, /obj/effect/proc_holder/spell, list()) - -/client/proc/cmd_sdql_spell_menu(target in GLOB.mob_list) - set name = "Give/Edit SDQL spell" - set hidden = TRUE - if(CONFIG_GET(flag/sdql_spells)) - var/datum/give_sdql_spell/ui = new(usr, target) - ui.ui_interact(usr) - else - to_chat(usr, span_warning("SDQL spells are disabled.")) - -/datum/give_sdql_spell - var/client/user - var/mob/living/target_mob - var/obj/effect/proc_holder/spell/target_spell - var/spell_type - var/list/saved_vars = list("query" = "", "suppress_message_admins" = FALSE) - var/list/list_vars = list() - var/list/parse_result = null - var/alert - - //This list contains all the vars that it should be okay to edit from the menu - var/static/list/editable_spell_vars = list( - "action_background_icon_state", - "action_icon_state", - "action_icon", - "active_msg", - "aim_assist", - "antimagic_allowed", - "base_icon_state", - "centcom_cancast", - "charge_max", - "charge_type", - "clothes_req", - "cone_level", - "deactive_msg", - "desc", - "drawmessage", - "dropmessage", - "hand_path", - "hand_var_overrides", - "holder_var_amount", - "holder_var_type", - "human_req", - "include_user", - "inner_radius", - "invocation_emote_self", - "invocation_type", - "invocation", - "max_targets", - "message", - "name", - "nonabstract_req", - "overlay_icon_state", - "overlay_icon", - "overlay_lifespan", - "overlay", - "phase_allowed", - "player_lock", - "projectile_type", - "projectile_amount", - "projectile_var_overrides", - "projectiles_per_fire", - "random_target_priority", - "random_target", - "range", - "ranged_mousepointer", - "respect_density", - "selection_type", - "self_castable", - "smoke_amt", - "smoke_spread", - "sound", - "sparks_amt", - "sparks_spread", - "stat_allowed", - "still_recharging_msg", - "target_ignore_prev", - ) - - //If a spell creates a datum with vars it overrides, this list should contain an association with the variable containing the path of the created datum. - var/static/list/special_list_vars = list( - "projectile_var_overrides" = "projectile_type", - "hand_var_overrides" = "hand_path", - ) - - var/static/list/special_var_lists = list( - "projectile_type" = "projectile_var_overrides", - "hand_path" = "hand_var_overrides", - ) - - var/static/list/enum_vars = list( - "invocation_type" = list(INVOCATION_NONE, INVOCATION_WHISPER, INVOCATION_SHOUT, INVOCATION_EMOTE), - "selection_type" = list("view", "range"), - "smoke_spread" = list(0, 1, 2, 3), - "random_target_priority" = list(0, 1), - ) - - //base64 representations of any icons that may need to be displayed - var/action_icon_base64 - var/projectile_icon_base64 - var/hand_icon_base64 - var/overlay_icon_base64 - var/mouse_icon_base64 - -/datum/give_sdql_spell/New(user, target) - if(!CONFIG_GET(flag/sdql_spells)) - to_chat(user, span_warning("SDQL spells are disabled.")) - qdel(src) - return - src.user = CLIENT_FROM_VAR(user) - - if(istype(target, /obj/effect/proc_holder/spell)) - target_spell = target - var/mob/living/spell_owner = target_spell.owner.resolve() - if(spell_owner) - target_mob = spell_owner - else - to_chat(user, span_warning("[target_spell] does not have an owner, or its owner was qdelled. This REALLY shouldn't happen.")) - qdel(src) - return - else if(isliving(target)) - target_mob = target - else - to_chat(user, span_warning("Invalid target.")) - qdel(src) - return - if(target_spell) - load_vars_from(target_spell) - -/datum/give_sdql_spell/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "SDQLSpellMenu", "Give SDQL Spell") - ui.open() - ui.set_autoupdate(FALSE) - -/datum/give_sdql_spell/ui_state(mob/user) - return GLOB.admin_state - -/datum/give_sdql_spell/ui_status(mob/user, datum/ui_state/state) - if(QDELETED(target_mob)) - return UI_CLOSE - return ..() - -/datum/give_sdql_spell/ui_close(mob/user) - qdel(src) - -#define SANITIZE_NULLIFY 0 -#define SANITIZE_STRINGIFY 1 - -/datum/give_sdql_spell/ui_data(mob/user, params) - var/list/data = list() - if(target_spell) - data["type"] = copytext("[target_spell.type]", 31, -5) - data["fixed_type"] = TRUE - else - data["type"] = spell_type - data["fixed_type"] = FALSE - data["saved_vars"] = saved_vars - data["list_vars"] = json_sanitize_list_vars(list_vars, SANITIZE_STRINGIFY) - if(parse_result) - data["parse_errors"] = parse_result["parse_errors"] - data["parsed_type"] = parse_result["type"] - data["parsed_vars"] = parse_result["vars"] - data["parsed_list_vars"] = json_sanitize_list_vars(parse_result["list_vars"], SANITIZE_STRINGIFY) - else - data["parse_errors"] = null - data["parsed_type"] = null - data["parsed_vars"] = null - data["parsed_list_vars"] = null - data["action_icon"] = action_icon_base64 - data["projectile_icon"] = projectile_icon_base64 - data["hand_icon"] = hand_icon_base64 - data["overlay_icon"] = overlay_icon_base64 - data["mouse_icon"] = mouse_icon_base64 - data["alert"] = alert - alert = "" - return data - -/datum/give_sdql_spell/ui_static_data(mob/user) - return list( - "types" = list("aimed", "aoe_turf", "cone", "cone/staggered", "pointed", "self", "targeted", "targeted/touch"), - "tooltips" = list( - "query" = "The SDQL query that is executed. Certain keywords are specific to SDQL spell queries.\n\ - $type\n\ - USER is replaced with a reference to the user of the spell.\n\ - TARGETS_AND_USER is replaced with the combined references from TARGETS and USER.\n\ - SOURCE is replaced with a reference to this spell, allowing you to refer to and edit variables within it.\n\ - SCRATCHPAD is a list used to store variables between individual queries within the same cast or between multiple casts.\n\ - NOTE: The SDQL keywords usr and marked do not work.", - "query_aimed" = "TARGETS is replaced with a list containing a reference to the atom hit by the fired projectile.", - "query_aoe_turf" = "TARGETS is replaced with a list containing references to every atom in the spell's area of effect.", - "query_cone" = "TARGETS is replaced with a list containing references to every atom in the cone produced by the spell.", - "query_cone/staggered" = "The query will be executed once for every level of the cone produced by the spell.\n\ - TARGETS is replaced with a list containing references to every atom in the given level of the cone.", - "query_pointed" = "TARGETS is replaced with a list containing a reference to the targeted atom.", - "query_self" = "TARGETS is null.", - "query_targeted" = "TARGETS is replaced with a list containing a reference(s) to the targeted mob(s).", - "query_targeted_touch" = "TARGETS is replaced with a list containing a reference to the atom hit with the touch attack.", - "suppress_message_admins" = "If this is true, the spell will not print out its query to admins' chat panels.\n\ - The query will still be output to the game log.", - "charge_type" = "How the spell's charge works. This affects how charge_max is used.\n\ - When set to \"recharge\", charge_max is the time in deciseconds between casts of the spell.\n\ - When set to \"charges\", the user can only use the spell a number of times equal to charge_max.\n\ - When set to \"holder_var\", charge_max is not used. holder_var_type and holder_var_amount are used instead.\n", - "holder_var_type" = "When charge_type is set to \"holder_var\", this is the name of the var that is modified each time the spell is cast.\n\ - If this is set to \"bruteloss\", \"fireloss\", \"toxloss\", or \"oxyloss\", the user will take the corresponding damage.\n\ - If this is set to \"stun\", \"knockdown\", \"paralyze\", \"immobilize\", or \"unconscious\", the user will suffer the corresponding status effect.\n\ - If this is set to anything else, the variable with the appropriate name will be modified.", - "holder_var_amount" = "The amount of damage taken, the duration of status effect inflicted, or the change made to any other variable.", - "clothes_req" = "Whether the user has to be wearing wizard robes to cast the spell.", - "human_req" = "Whether the user has to be a human to cast the spell. Redundant when clothes_req is true.", - "nonabstract_req" = "If this is true, the spell cannot be cast by brains and pAIs.", - "stat_allowed" = "Whether the spell can be cast if the user is unconscious or dead.", - "phase_allowed" = "Whether the spell can be cast while the user is jaunting or bloodcrawling.", - "antimagic_allowed" = "Whether the spell can be cast while the user is affected by anti-magic effects.", - "invocation_type" = "How the spell is invoked.\n\ - When set to \"none\", the user will not state anything when invocating.\n\ - When set to \"whisper\", the user whispers the invocation, as if with the whisper verb.\n\ - When set to \"shout\", the user says the invocation, as if with the say verb.\n\ - When set to \"emote\", a visible message is produced.", - "invocation" = "What the user says, whispers, or emotes when using the spell.", - "invocation_emote_self" = "What the user sees in their own chat when they use the spell.", - "selection_type" = "Whether the spell can target any mob in range, or only visible mobs in range.", - "range" = "The spell's range, in tiles.", - "message" = "What mobs affected by the spell see in their chat.\n\ - Keep in mind, just because a mob is affected by the spell doesn't mean the query will have any effect on them.", - "player_lock" = "If false, simple mobs can use the spell.", - "overlay" = "Whether an overlay is drawn atop atoms affectecd by the spell.\n\ - Keep in mind, just because an atom is affected by the spell doesn't mean the query will have any effect on it.", - "overlay_lifetime" = "The amount of time in deciseconds the overlay will persist.", - "sparks_spread" = "Whether the spell produces sparks when cast.", - "smoke_spread" = "The kind of smoke, if any, the spell produces when cast.", - "centcom_cancast" = "If true, the spell can be cast on the centcom Z-level.", - "max_targets" = "The maximum number of mobs the spell can target.", - "target_ignore_prev" = "If false, the same mob can be targeted multiple times.", - "include_user" = "If true, the user can target themselves with the spell.", - "random_target" = "If true, the spell will target a random mob(s) in range.", - "random_target_priority" = "Whether the spell will target random mobs in range or the closest mobs in range.", - "inner_radius" = "If this is a non-negative number, the spell will not affect atoms within that many tiles of the user.", - "ranged_mousepointer" = "The icon used for the mouse when aiming the spell.", - "deactive_mesg" = "The message the user sees when canceling the spell.", - "active_msg" = "The message the user sees when activating the spell.", - "projectile_amount" = "The maximum number of projectiles the user can fire with each cast of the spell.", - "projectiles_per_fire" = "The amount of projectiles fired with each click of the mouse.", - "projectile_var_overrides" = "The fired projectiles will have the appropriate variables overridden by the corresponding values in this associative list.\n\ - You should probably set \"name\", \"icon\", and \"icon_state\".\n\ - Refer to code/modules/projectiles/projectile.dm to see what other vars you can override.", - "cone_level" = "How many tiles out the cone will extend.", - "respect_density" = "If true, the cone produced by the spell is blocked by walls.", - "self_castable" = "If true, the user can cast the spell on themselves.", - "aim_assist" = "If true, the spell has turf-based aim assist.", - "drawmessage" = "The message the user sees when activating the spell.", - "dropmessage" = "The message the user sees when canceling the spell.", - "hand_var_overrides" = "The touch attack will have the appropriate variables overridden by the corresponding values in this associative list.\n\ - You should probably set \"name\", \"desc\", \"catchphrase\", \"on_use_sound\" \"icon\", \"icon_state\", and \"inhand_icon_state\".\n\ - Refer to code/modules/spells/spell_types/godhand.dm to see what other vars you can override.", - "scratchpad" = "This list can be used to store variables between individual queries within the same cast or between casts.\n\ - You can declare variables from this menu for convenience. To access this list in a query, use the identifier \"SOURCE.scratchpad\".\n\ - Refer to the _list procs defined in code/modules/admin/verbs/SDQL2/SDQL_2_wrappers.dm for information on how to modify and edit list vars from within a query.", - ), - ) - -#define LIST_VAR_FLAGS_TYPED 1 -#define LIST_VAR_FLAGS_NAMED 2 - -/datum/give_sdql_spell/proc/load_vars_from(obj/effect/proc_holder/spell/sample) - var/datum/component/sdql_executor/executor = sample.GetComponent(/datum/component/sdql_executor) - if(!executor) - CRASH("[sample]'s SDQL executor component went missing!") - saved_vars["query"] = executor.query - saved_vars["suppress_message_admins"] = executor.suppress_message_admins - load_list_var(executor.scratchpad, "scratchpad") - for(var/V in sample.vars&editable_spell_vars) - if(islist(sample.vars[V])) - if(special_list_vars[V]) - var/list/saved_overrides = executor.saved_overrides[V] - if(saved_overrides) - list_vars[V] = saved_overrides.Copy() - icon_needs_updating("[V]/icon") - else - saved_vars[V] = sample.vars[V] - icon_needs_updating(V) - -/datum/give_sdql_spell/proc/load_list_var(list/L, list_name) - list_vars[list_name] = list() - for(var/V in L) - if(islist(L[V])) - list_vars[list_name][V] = list("type" = "list", "value" = null) - list_vars |= load_list_var(L[V], "[list_name]/[V]") - else if(isnum(L[V])) - list_vars[list_name][V] = list("type" = "num", "value" = L[V]) - else if(ispath(L[V])) - list_vars[list_name][V] = list("type" = "path", "value" = L[V]) - else if(isicon(L[V])) - list_vars[list_name][V] = list("type" = "icon", "value" = L[V]) - else if(istext(L[V]) || isfile(L[V])) - list_vars[list_name][V] = list("type" = "string", "value" = L[V]) - else if(istype(L[V], /datum)) - list_vars[list_name][V] = list("type" = "ref", "value" = L[V]) - else if(isnull(L[V])) - list_vars[list_name][V] = list("type" = "num", "value" = 0) - alert = "Could not determine the type for [list_name]/[V]! Be sure to set it correctly, or you may cause unnecessary runtimes!" - -/datum/give_sdql_spell/ui_act(action, params, datum/tgui/ui) - if(..()) - return - . = TRUE - switch(action) - if("type") - if(!target_spell) - spell_type = params["path"] - load_sample() - if("variable") - var/V = params["name"] - if(V == "holder_var_type") - if(!holder_var_validate(params["value"])) - return - saved_vars[V] = params["value"] - icon_needs_updating(V) - if("bool_variable") - saved_vars[params["name"]] = !saved_vars[params["name"]] - if("path_variable") - var/new_path = tgui_input_list(user, "Select type.", "Add SDQL Spell", typesof(text2path(params["root_path"]))) - if(isnull(new_path)) - return - saved_vars[params["name"]] = new_path - var/datum/sample = new new_path - var/list/overrides = list_vars[special_var_lists[params["name"]]] - overrides = overrides&sample.vars - qdel(sample) - icon_needs_updating(params["name"]) - if("list_variable_add") - if(!list_vars[params["list"]]) - list_vars[params["list"]] = list() - if(special_list_vars[params["list"]]) - var/path = saved_vars[special_list_vars[params["list"]]] - var/datum/sample = new path - var/list/choosable_vars = map_var_list(sample.vars-list_vars[params["list"]], sample) - var/chosen_var = tgui_input_list(user, "Select variable to add.", "Add SDQL Spell", sort_list(choosable_vars)) - if(chosen_var) - if(islist(sample.vars[choosable_vars[chosen_var]])) - list_vars[params["list"]][choosable_vars[chosen_var]] = list("type" = "list", "value" = null, "flags" = LIST_VAR_FLAGS_TYPED|LIST_VAR_FLAGS_NAMED) - list_vars["[params["list"]]/[choosable_vars[chosen_var]]"] = list() - else if(isnum(sample.vars[choosable_vars[chosen_var]])) - list_vars[params["list"]][choosable_vars[chosen_var]] = list("type" = "num", "value" = sample.vars[choosable_vars[chosen_var]], "flags" = LIST_VAR_FLAGS_TYPED|LIST_VAR_FLAGS_NAMED) - else if(ispath(sample.vars[choosable_vars[chosen_var]])) - list_vars[params["list"]][choosable_vars[chosen_var]] = list("type" = "path", "value" = sample.vars[choosable_vars[chosen_var]], "flags" = LIST_VAR_FLAGS_TYPED|LIST_VAR_FLAGS_NAMED) - else if(isicon(sample.vars[choosable_vars[chosen_var]])) - list_vars[params["list"]][choosable_vars[chosen_var]] = list("type" = "icon", "value" = sample.vars[choosable_vars[chosen_var]], "flags" = LIST_VAR_FLAGS_TYPED|LIST_VAR_FLAGS_NAMED) - else if(istext(sample.vars[choosable_vars[chosen_var]]) || isfile(sample.vars[choosable_vars[chosen_var]])) - list_vars[params["list"]][choosable_vars[chosen_var]] = list("type" = "string", "value" = sample.vars[choosable_vars[chosen_var]], "flags" = LIST_VAR_FLAGS_TYPED|LIST_VAR_FLAGS_NAMED) - else if(istype(sample.vars[choosable_vars[chosen_var]], /datum)) - list_vars[params["list"]][choosable_vars[chosen_var]] = list("type" = "ref", "value" = null, "flags" = LIST_VAR_FLAGS_TYPED|LIST_VAR_FLAGS_NAMED) - alert = "[params["list"]]/[choosable_vars[chosen_var]] is a reference! Be sure to set it correctly, or you may cause unnecessary runtimes!" - else if(isnull(sample.vars[choosable_vars[chosen_var]])) - list_vars[params["list"]][choosable_vars[chosen_var]] = list("type" = "num", "value" = 0, "flags" = LIST_VAR_FLAGS_NAMED) - alert = "Could not determine the type for [params["list"]]/[choosable_vars[chosen_var]]! Be sure to set it correctly, or you may cause unnecessary runtimes!" - else - alert = "[params["list"]]/[choosable_vars[chosen_var]] is not of a supported type!" - icon_needs_updating("[params["list"]]/[choosable_vars[chosen_var]]") - qdel(sample) - else - if(!list_vars[params["list"]]["new_var"]) - list_vars[params["list"]] += list("new_var" = list("type" = "num", "value" = 0, "flags" = 0)) - else - alert = "Rename or remove [params["list"]]/new_var before attempting to add another variable to this list!" - if("list_variable_remove") - remove_list_var(params["list"], params["name"]) - if("list_variable_rename") - rename_list_var(params["list"], params["name"], params["new_name"]) - if("list_variable_change_type") - change_list_var_type(params["list"], params["name"], params["value"]) - if("list_variable_change_value") - set_list_var(params["list"], params["name"], params["value"]) - icon_needs_updating("[params["list"]]/[params["name"]]") - if("list_variable_change_bool") - toggle_list_var(params["list"], params["name"]) - if("list_variable_set_ref") - set_list_ref_var(params["list"], params["name"]) - if("save") - var/f = file("data/TempSpellUpload") - fdel(f) - WRITE_FILE(f, json_encode(list("type" = spell_type, "vars" = saved_vars, "list_vars" = json_sanitize_list_vars(list_vars)))) - user << ftp(f,"[replacetext_char(saved_vars["name"], " ", "_")].json") - if("load") - var/spell_file = input("Pick spell json file:", "File") as null|file - if(!spell_file) - return - var/filedata = file2text(spell_file) - var/json = json_decode(filedata) - if(!json) - alert = "JSON decode error!" - return - parse_result = load_from_json(json) - var/list/parse_errors = parse_result["parse_errors"] - if(!parse_errors.len) - finalize_load() - if("close_error") - parse_result = null - if("load_despite_error") - finalize_load() - if("confirm") - if(target_spell) - reassign_vars(target_spell) - target_spell.action.UpdateButtons() - log_admin("[key_name(user)] edited the SDQL spell \"[target_spell]\" owned by [key_name(target_mob)].") - else - var/new_spell = give_spell() - log_admin("[key_name(user)] gave the SDQL spell \"[new_spell]\" to [key_name(target_mob)].") - ui.close() - -/datum/give_sdql_spell/proc/load_sample() - var/path = text2path("/obj/effect/proc_holder/spell/[spell_type]/sdql") - var/datum/sample = new path - if(spell_type) - load_vars_from(sample) - qdel(sample) - -/datum/give_sdql_spell/proc/finalize_load() - spell_type = parse_result["type"] - load_sample() - saved_vars = parse_result["vars"] | saved_vars - list_vars = parse_result["list_vars"] | list_vars - parse_result = null - icon_needs_updating("everything") - -//Change all references in the list vars, either to null (for saving) or to their string representation (for display) -/datum/give_sdql_spell/proc/json_sanitize_list_vars(list/list_vars, mode = SANITIZE_NULLIFY) - var/list/temp_list_vars = deep_copy_list(list_vars) - for(var/V in temp_list_vars) - var/list/L = temp_list_vars[V] - for(var/W in L) - if(temp_list_vars[V][W]["type"] == "ref") - switch(mode) - if(SANITIZE_NULLIFY) - temp_list_vars[V][W]["value"] = null - if(SANITIZE_STRINGIFY) - if(temp_list_vars[V][W]["value"]) - temp_list_vars[V][W]["value"] = "[temp_list_vars[V][W]["value"]]" - else - temp_list_vars[V][W]["value"] = "null" - return temp_list_vars - -#undef SANITIZE_NULLIFY -#undef SANITIZE_STRINGIFY - -/datum/give_sdql_spell/proc/load_from_json(json) - var/list/result_vars = list() - var/list/result_list_vars = list() - var/list/parse_errors = list() - . = list("type" = "", - "vars" = result_vars, - "list_vars" = result_list_vars, - "parse_errors" = parse_errors) - if(!json["type"]) - parse_errors += "The \"type\" property is missing from the json file" - return - var/temp_type = json["type"] - var/datum/D = text2path("/obj/effect/proc_holder/spell/[temp_type]/sdql") - if(!ispath(D)) - parse_errors += "[temp_type] is not a valid SDQL spell type" - return - if(target_spell) - if(!istype(target_spell, D)) - parse_errors += "You cannot change the type of an existing spell" - if(!json["vars"]) - parse_errors += "The \"vars\" property is missing from the json file" - if(!islist(json["vars"])) - parse_errors += "The \"vars\" property must be a json object" - if(!json["list_vars"]) - parse_errors += "The \"list_vars\" property is missing from the json file" - if(!islist(json["list_vars"])) - parse_errors += "The \"list_vars\" property must be a json object" - if(parse_errors.len) - return - .["type"] = temp_type - var/list/temp_vars = json["vars"] - var/list/temp_list_vars = json["list_vars"] - D = new D - for(var/V in temp_vars) - if(!istext(V)) - parse_errors += "JSON property names must be text ([V] is not text)" - continue - if(V == "query") - if(!istext(temp_vars[V])) - parse_errors += "The value of \"query\" must be text" - continue - result_vars[V] = temp_vars[V] - continue - if(V == "suppress_message_admins") - if(!isnum(temp_vars[V])) - parse_errors += "The value of \"suppress_message_admins\" must be a number" - continue - result_vars[V] = !!temp_vars[V] - continue - if(!(V in editable_spell_vars)) - parse_errors += "\"[V]\" is not an editable variable" - continue - if(!(V in D.vars)) //D.vars[V] can runtime unlike V in D.vars - parse_errors += "Spells of type \"[temp_type]\" have no such var [V]" - continue - if(islist(D.vars[V])) - parse_errors += "[D.type]/[V] is a list; vars.[V] should be in the \"list_vars\" property" - continue - if(istext(D.vars[V])) - if(!istext(temp_vars[V])) - parse_errors += "[D.type]/[V] is text; vars.[V] has been converted to text" - temp_vars[V] = "[temp_vars[V]]" - continue - if(V=="holder_var_type") - var/potential_alert = holder_var_validate(temp_vars[V], TRUE) - if(potential_alert) - parse_errors += potential_alert - continue - if(isicon(D.vars[V])) - if(!istext(temp_vars[V])) - parse_errors += "[D.type]/[V] is an icon; vars.[V] has been converted to text" - temp_vars[V] = "[temp_vars[V]]" - if(!fexists(temp_vars[V])) - parse_errors += "[D.type]/[V] is an icon; no such file [temp_vars[V]] exists on the server" - continue - if(ispath(D.vars[V])) - if(!istext(temp_vars[V])) - parse_errors += "[D.type]/[V] is a path; vars.[V] has been converted to text" - temp_vars[V] = "[temp_vars[V]]" - var/path = text2path(temp_vars[V]) - if(!path) - parse_errors += "[D.type]/[V] is a path; vars.[V] ([temp_vars[V]]) does not correspond to an existing type" - continue - if(!ispath(path, D.vars[V])) - parse_errors += "[D.type]/[V] is a path; vars.[V] ([path]) is not derived from [D.vars[V]]" - continue - if(isnum(D.vars[V])) - if(!isnum(temp_vars[V])) - parse_errors += "[D.type]/[V] is a number; vars.[V] should be a number" - continue - if(enum_vars[V]) - var/list/enum = enum_vars[V] - if(!enum.Find(temp_vars[V])) - parse_errors += "[D.type]/[V] is an enumeration; vars.[V] should be one of: [english_list(enum, and_text = " or ")]" - continue - result_vars[V] = temp_vars[V] - for(var/V in temp_list_vars) - if(!istext(V)) - parse_errors += "JSON property names must be text ([V] is not text)" - continue - if(!islist(temp_list_vars[V])) - parse_errors += "list_vars.[V] should be a json object" - continue - if(special_list_vars[V] && (V in D.vars)) - var/sample_path = D.vars[special_list_vars[V]] - var/temp_path - if(temp_vars[special_list_vars[V]]) - temp_path = temp_vars[special_list_vars[V]] - temp_path = text2path(temp_path) - if(!temp_path) - parse_errors += "[D.type]/[special_list_vars[V]] is a path; vars.[temp_vars[special_list_vars[V]]] (temp_vars[special_list_vars[V]]) does not correspond to an existing type" - else if(!ispath(temp_path, D.vars[special_list_vars[V]])) - parse_errors += "[D.type]/[special_list_vars[V]] is a path; vars.[special_list_vars[V]] ([temp_path]) is not derived from [D.vars[special_list_vars[V]]]" - else - sample_path = temp_path - result_list_vars[V] = list() - var/datum/sample = new sample_path - for(var/W in temp_list_vars[V]) - if(!istext(W)) - parse_errors += "JSON property names must be text ([W] in list_vars.[V] is not text)" - continue - if(!(W in sample.vars)) - parse_errors += "[sample.type] has no such var \"[W]\"" - continue - if(!(islist(temp_list_vars[V][W]) && istext(temp_list_vars[V][W]["type"]) && (istext(temp_list_vars[V][W]["value"]) || isnum(temp_list_vars[V][W]["value"]) || isnull(temp_list_vars[V][W]["value"])) && isnum(temp_list_vars[V][W]["flags"]))) - parse_errors += "[V]/[W] is not of the form {type: string, value: num|string|null, flags: number}" - continue - if(!(temp_list_vars[V][W]["flags"] & LIST_VAR_FLAGS_NAMED)) - parse_errors += "[V]/[W] did not have the LIST_VAR_FLAGS_NAMED flag set; it has been set" - temp_list_vars[V][W]["flags"] |= LIST_VAR_FLAGS_NAMED - if(temp_list_vars[V][W]["flags"] & ~(LIST_VAR_FLAGS_NAMED | LIST_VAR_FLAGS_TYPED)) - parse_errors += "[V]/[W] has unused bit flags set; they have been unset" - temp_list_vars[V][W]["flags"] &= LIST_VAR_FLAGS_NAMED | LIST_VAR_FLAGS_TYPED - if(!(temp_list_vars[V][W]["flags"] & LIST_VAR_FLAGS_TYPED)) - if(isnull(sample.vars[W])) - continue - parse_errors += "[sample.type]/[W] is not null; it has had the LIST_VAR_FLAGS_TYPED flag set" - temp_list_vars[V][W]["flags"] |= LIST_VAR_FLAGS_TYPED - if(islist(sample.vars[W])) - temp_list_vars[V][W]["type"] = "list" - else if(isnum(sample.vars[W])) - temp_list_vars[V][W]["type"] = "num" - else if(istext(sample.vars[W])) - temp_list_vars[V][W]["type"] = "string" - else if(ispath(sample.vars[W])) - temp_list_vars[V][W]["type"] = "path" - else if(isicon(sample.vars[W])) - temp_list_vars[V][W]["type"] = "icon" - else if(istype(sample.vars[W], /datum)) - temp_list_vars[V][W]["type"] = "ref" - temp_list_vars[V][W]["value"] = null - else - parse_errors += "[sample.type]/[W] is not of a supported type" - continue - if(islist(sample.vars[W])) - if(temp_list_vars[V][W]["type"] != "list") - parse_errors += "[sample.type]/[W] is a list; list_vars.[V].[W].type has been converted to \"list\"" - temp_list_vars[V][W]["type"] = "list" - if(!istext(temp_list_vars[V][W]["value"])) - parse_errors += "list_vars.[V].[W].type is \"list\"; list_vars.[V].[W].value ([temp_list_vars[V][W]["value"]]) has been converted to text" - temp_list_vars[V][W]["value"] = "[temp_list_vars[V][W]["value"]]" - if(!temp_list_vars[temp_list_vars[V][W]["value"]]) - parse_errors += "list_vars.[V].[W].type is \"list\"; there is no property of list_vars whose name is list_vars.[V].[W].value ([temp_list_vars[V][W]["value"]])" - continue - else if(isnum(sample.vars[W])) - if(temp_list_vars[V][W]["type"] != "num") - parse_errors += "[sample.type]/[W] is a number; list_vars.[V].[W].type has been converted to \"num\"" - temp_list_vars[V][W]["type"] = "num" - if(!isnum(temp_list_vars[V][W]["value"])) - parse_errors += "list_vars.[V].[W].type is \"num\"; list_vars.[V].[W].value ([temp_list_vars[V][W]["value"]]) should be a number" - continue - else if(istext(sample.vars[W])) - if(temp_list_vars[V][W]["type"] != "string") - parse_errors += "[sample.type]/[W] is text; list_vars.[V].[W].type has been converted to \"string\"" - temp_list_vars[V][W]["type"] = "string" - if(!istext(temp_list_vars[V][W]["value"])) - parse_errors += "list_vars.[V].[W].type is \"list\"; list_vars.[V].[W].value ([temp_list_vars[V][W]["value"]]) has been converted to text" - temp_list_vars[V][W]["value"] = "[temp_list_vars[V][W]["value"]]" - else if(ispath(sample.vars[W])) - if(temp_list_vars[V][W]["type"] != "path") - parse_errors += "[sample.type]/[W] is a path; list_vars.[V].[W].type has been converted to \"path\"" - temp_list_vars[V][W]["type"] = "path" - if(!istext(temp_list_vars[V][W]["value"])) - parse_errors += "list_vars.[V].[W].type is \"path\"; list_vars.[V].[W].value ([temp_list_vars[V][W]["value"]]) has been converted to text" - temp_list_vars[V][W]["value"] = "[temp_list_vars[V][W]["value"]]" - temp_path = text2path(temp_list_vars[V][W]["value"]) - if(!ispath(temp_path)) - parse_errors += "list_vars.[W].[W].type is \"path\"; list_vars.[V].[W].value ([temp_list_vars[V][W]["value"]]) does not correspond to an existing type" - continue - if(!ispath(temp_path, sample.vars[W])) - parse_errors += "list_vars.[W].[W].type is \"path\"; list_vars.[V].[W].value ([temp_list_vars[V][W]["value"]]) is not derived from [sample.vars[W]]" - continue - else if(isicon(sample.vars[W])) - if(temp_list_vars[V][W]["type"] != "icon") - parse_errors += "[sample.type]/[W] is an icon; list_vars.[V].[W].type has been converted to \"icon\"" - temp_list_vars[V][W]["type"] = "icon" - if(!istext(temp_list_vars[V][W]["value"])) - parse_errors += "list_vars.[V].[W].type is \"icon\"; list_vars.[V].[W].value ([temp_list_vars[V][W]["value"]]) has been converted to text" - temp_list_vars[V][W]["value"] = "[temp_list_vars[V][W]["value"]]" - if(!fexists(temp_list_vars[V][W]["value"])) - parse_errors += "list_vars.[V].[W].type is \"icon\"; no such file \"[temp_list_vars[V][W]["value"]]\" exists on the server" - continue - else if(istype(sample.vars[W], /datum)) - if(temp_list_vars[V][W]["type"] != "ref") - parse_errors += "[sample.type]/[W] is a datum reference; list_vars.[V].[W].type has been converted to \"ref\"" - alert = "Reference vars are not assigned on load from file. Be sure to set them correctly." - temp_list_vars[V][W]["type"] = "ref" - temp_list_vars[V][W]["value"] = null - result_list_vars[V][W] = temp_list_vars[V][W] - qdel(sample) - else - result_list_vars[V] = list() - for(var/W in temp_list_vars[V]) - if(temp_list_vars[V][W]["flags"]) - parse_errors += "list_vars.[V].[W] has unnecessary flags set; they have been unset" - temp_list_vars[V][W]["flags"] = 0 - if(temp_list_vars[V][W]["type"] == "list") - if(temp_list_vars[V][W]["value"]) - parse_errors += "list_vars.[V].[W].type is \"list\"; list_vars.[V].[W].value ([temp_list_vars[V][W]["value"]]) has been nulled, as it is not used" - temp_list_vars[V][W]["value"] = null - if(!temp_list_vars["[V]/[W]"]) - parse_errors += "list_vars.[V].[W].type is \"list\"; there is no property of list_vars whose name is \"[V]/[W]\"" - continue - if(temp_list_vars[V][W]["type"] == "num") - if(!isnum(temp_list_vars[V][W]["value"])) - parse_errors += "list_vars.[V].[W].type is \"num\"; list_vars.[V].[W].value ([temp_list_vars[V][W]["value"]]) should be a number" - continue - if(temp_list_vars[V][W]["type"] == "string") - if(!istext(temp_list_vars[V][W]["value"])) - parse_errors += "list_vars.[V].[W].type is \"string\"; list_vars.[V].[W].value ([temp_list_vars[V][W]["value"]]) has been converted to text" - temp_list_vars[V][W]["value"] = "[temp_list_vars[V][W]["value"]]" - if(temp_list_vars[V][W]["type"] == "path") - if(!istext(temp_list_vars[V][W]["value"])) - parse_errors += "list_vars.[V].[W].type is \"path\"; list_vars.[V].[W].value ([temp_list_vars[V][W]["value"]]) has been converted to text" - temp_list_vars[V][W]["value"] = "[temp_list_vars[V][W]["value"]]" - var/temp_path = text2path(temp_list_vars[V][W]["value"]) - if(!ispath(temp_path)) - parse_errors += "list_vars.[W].[W].type is \"path\"; list_vars.[V].[W].value ([temp_list_vars[V][W]["value"]]) does not correspond to an existing type" - continue - if(temp_list_vars[V][W]["type"] == "icon") - if(!istext(temp_list_vars[V][W]["value"])) - parse_errors += "list_vars.[V].[W].type is \"icon\"; list_vars.[V].[W].value ([temp_list_vars[V][W]["value"]]) has been converted to text" - temp_list_vars[V][W]["value"] = "[temp_list_vars[V][W]["value"]]" - if(!fexists(temp_list_vars[V][W]["value"])) - parse_errors += "list_vars.[V].[W].type is \"icon\"; no such file \"[temp_list_vars[V][W]["value"]]\" exists on the server" - continue - if(temp_list_vars[V][W]["type"] == "ref") - if(!isnull(temp_list_vars[V][W]["value"])) - parse_errors += "list_vars.[V].[W].type is \"ref\"; list_vars.[V].[W].value has been nulled out" - temp_list_vars[V][W]["value"] = null - else - alert = "Reference vars are not assigned on load from file. Be sure to set them correctly." - result_list_vars[V][W] = temp_list_vars[V][W] - qdel(D) - -#undef LIST_VAR_FLAGS_TYPED -#undef LIST_VAR_FLAGS_NAMED - -/datum/give_sdql_spell/proc/map_var_list(list/L, datum/D) - var/list/ret = list() - for(var/V in L) - if(D.vars[V]) - ret["[V] = [string_rep(D.vars[V])]"] = V - return ret - -/datum/give_sdql_spell/proc/string_rep(V) - if(istext(V) || isfile(V) || isicon(V)) - return "\"[V]\"" - else if(isnull(V)) - return "null" - else - return "[V]" - -/datum/give_sdql_spell/proc/holder_var_validate(V, return_alert = FALSE) - switch(V) - if("bruteloss", "fireloss", "toxloss", "oxyloss", "stun", "knockdown", "paralyze", "unconscious") - if(return_alert) - return "" - return TRUE - else - if(target_mob.vars[V]) - if(!isnum(target_mob.vars[V])) - var/new_alert = "[target_mob.type]/[V] is not a number!" - if(return_alert) - return new_alert - alert = new_alert - return FALSE - else - return return_alert ? "" : TRUE - else - var/new_alert = "[target_mob.type] has no such variable [V]!" - if(return_alert) - return new_alert - alert = new_alert - return FALSE - -/datum/give_sdql_spell/proc/icon_needs_updating(var_name) - switch(var_name) - if("action_icon", "action_icon_state", "action_background_icon_state") - var/icon/out_icon = icon('icons/effects/effects.dmi', "nothing") - var/image/out_image = image('icons/mob/actions/backgrounds.dmi', null, saved_vars["action_background_icon_state"]) - var/overlay_icon = icon(saved_vars["action_icon"], saved_vars["action_icon_state"]) - out_image.overlays += image(overlay_icon) - out_icon.Insert(getFlatIcon(out_image, no_anim = TRUE)) - action_icon_base64 = icon2base64(out_icon) - - if("projectile_var_overrides/icon", "projectile_var_overrides/icon_state") - var/atom/A = /obj/projectile - var/icon = initial(A.icon) - var/icon_state = initial(A.icon_state) - if(list_vars["projectile_var_overrides"]?["icon"]) - icon = list_vars["projectile_var_overrides"]["icon"]["value"] - if(list_vars["projectile_var_overrides"]?["icon_state"]) - icon_state = list_vars["projectile_var_overrides"]["icon_state"]["value"] - var/icon/out_icon = icon(icon, icon_state, frame = 1) - projectile_icon_base64 = icon2base64(out_icon) - - if("hand_var_overrides/icon", "hand_var_overrides/icon_state") - var/atom/A = /obj/item/melee/touch_attack - var/icon = initial(A.icon) - var/icon_state = initial(A.icon_state) - if(list_vars["hand_var_overrides"]?["icon"]) - icon = list_vars["hand_var_overrides"]["icon"]["value"] - if(list_vars["hand_var_overrides"]?["icon_state"]) - icon_state = list_vars["hand_var_overrides"]["icon_state"]["value"] - var/icon/out_icon = icon(icon, icon_state, frame = 1) - hand_icon_base64 = icon2base64(out_icon) - - if("overlay", "overlay_icon", "overlay_icon_state") - var/icon/out_icon = icon(saved_vars["overlay_icon"], saved_vars["overlay_icon_state"], frame = 1) - overlay_icon_base64 = icon2base64(out_icon) - - if("ranged_mousepointer") - var/icon/out_icon = icon(saved_vars["ranged_mousepointer"], frame = 1) - mouse_icon_base64 = icon2base64(out_icon) - - if("everything") - var/icon/out_icon = icon('icons/effects/effects.dmi', "nothing") - var/image/out_image = image('icons/mob/actions/backgrounds.dmi', null, saved_vars["action_background_icon_state"]) - var/overlay_icon = icon(saved_vars["action_icon"], saved_vars["action_icon_state"]) - out_image.overlays += image(overlay_icon) - out_icon.Insert(getFlatIcon(out_image, no_anim = TRUE)) - action_icon_base64 = icon2base64(out_icon) - if(list_vars["projectile_var_overrides"]) - var/atom/A = saved_vars["projectile_type"] - var/icon = initial(A.icon) - var/icon_state = initial(A.icon_state) - if(list_vars["projectile_var_overrides"]?["icon"]) - icon = list_vars["projectile_var_overrides"]["icon"]["value"] - if(list_vars["projectile_var_overrides"]?["icon_state"]) - icon_state = list_vars["projectile_var_overrides"]["icon_state"]["value"] - out_icon = icon(icon, icon_state, frame = 1) - projectile_icon_base64 = icon2base64(out_icon) - if(list_vars["hand_var_overrides"]) - var/atom/A = saved_vars["hand_path"] - var/icon = initial(A.icon) - var/icon_state = initial(A.icon_state) - if(list_vars["hand_var_overrides"]?["icon"]) - icon = list_vars["hand_var_overrides"]["icon"]["value"] - if(list_vars["hand_var_overrides"]?["icon_state"]) - icon_state = list_vars["hand_var_overrides"]["icon_state"]["value"] - out_icon = icon(icon, icon_state, frame = 1) - hand_icon_base64 = icon2base64(out_icon) - out_icon = icon(saved_vars["overlay_icon"], saved_vars["overlay_icon_state"], frame = 1) - overlay_icon_base64 = icon2base64(out_icon) - out_icon = icon(saved_vars["ranged_mousepointer"], frame = 1) - mouse_icon_base64 = icon2base64(out_icon) - -/datum/give_sdql_spell/proc/toggle_list_var(list_name, list_var) - if(list_vars[list_name]?[list_var]) - list_vars[list_name][list_var]["value"] = !list_vars[list_name][list_var]["value"] - -/datum/give_sdql_spell/proc/set_list_var(list_name, list_var, value) - if(list_vars[list_name]?[list_var]) - list_vars[list_name][list_var]["value"] = value - -/datum/give_sdql_spell/proc/set_list_ref_var(list_name, list_var) - if(list_vars[list_name]?[list_var]) - list_vars[list_name][list_var]["value"] = user.holder?.marked_datum - -/datum/give_sdql_spell/proc/rename_list_var(list_name, list_var, new_name) - if(!new_name) - alert = "You can't give a list variable an empty string for a name!" - return - if(list_var == new_name) - return - if(list_vars[list_name]) - var/list/L = list_vars[list_name] - var/ind = L.Find(list_var) - if(ind) - if(list_vars[list_name][new_name]) - alert = "There is already a variable named [new_name] in [list_name]!" - else - var/old_val = list_vars[list_name][list_var] - list_vars[list_name][ind] = new_name - list_vars[list_name][new_name] = old_val - -/datum/give_sdql_spell/proc/change_list_var_type(list_name, list_var, var_type) - if(list_vars[list_name]?[list_var]) - if(list_vars[list_name][list_var]["type"] == "list" && var_type != "list") - purge_list_var("[list_name]/[list_var]") - list_vars[list_name][list_var]["type"] = var_type - switch(var_type) - if("string", "path") - list_vars[list_name][list_var]["value"] = "" - if("bool", "num") - list_vars[list_name][list_var]["value"] = 0 - if("list") - list_vars[list_name][list_var]["value"] = null - list_vars |= list("[list_name]/[list_var]" = list()) - -/datum/give_sdql_spell/proc/remove_list_var(list_name, list_var) - if(list_vars[list_name]) - var/list/L = list_vars[list_name] - var/ind = L.Find(list_var) - if(ind) - if(list_vars[list_name][list_var]["type"] == "list") - purge_list_var("[list_name]/[list_var]") - L.Cut(ind, ind+1) - list_vars[list_name] = L - -/datum/give_sdql_spell/proc/purge_list_var(list_name) - var/ind = list_vars.Find(list_name) - if(ind) - for(var/V in list_vars[list_name]) - if(list_vars[list_name][V]["type"] == "list") - purge_list_var("[list_name]/[V]") - list_vars.Cut(ind, ind+1) - -/datum/give_sdql_spell/proc/generate_list_var(list_name) - if(!list_vars[list_name]) - return null - var/list/ret = list() - for(var/V in list_vars[list_name]) - if(list_vars[list_name][V]["type"] == "list") - ret[V] = generate_list_var("[list_name]/[V]") - else if(list_vars[list_name][V]["type"] == "path") - ret[V] = text2path(list_vars[list_name][V]["value"]) - else if(list_vars[list_name][V]["type"] == "icon") - ret[V] = icon(list_vars[list_name][V]["value"]) - else - ret[V] = list_vars[list_name][V]["value"] - return ret - -/datum/give_sdql_spell/proc/give_spell() - var/path = text2path("/obj/effect/proc_holder/spell/[spell_type]/sdql") - var/obj/effect/proc_holder/spell/new_spell = new path(null, target_mob, user.ckey) - GLOB.sdql_spells += new_spell - reassign_vars(new_spell) - new_spell.action.UpdateButtons() - if(target_mob.mind) - target_mob.mind.AddSpell(new_spell) - else - target_mob.AddSpell(new_spell) - to_chat(user, span_danger("Spells given to mindless mobs will not be transferred in mindswap or cloning!")) - return new_spell - -/datum/give_sdql_spell/proc/reassign_vars(obj/effect/proc_holder/spell/target) - if(!target) - CRASH("edit_spell must be called with a non_null target") - var/datum/component/sdql_executor/executor = target.GetComponent(/datum/component/sdql_executor) - if(!executor) - CRASH("[src]'s SDQL executor component went missing!") - for(var/V in saved_vars+list_vars) - if(V == "query") - executor.vv_edit_var("query", saved_vars["query"]) - else if(V == "suppress_message_admins") - executor.vv_edit_var("suppress_message_admins", saved_vars["suppress_message_admins"]) - else if(V == "scratchpad") - var/list/new_scratchpad = generate_list_var("scratchpad") - if(new_scratchpad) - executor.vv_edit_var("scratchpad", new_scratchpad) - else if(target.vars[V]) - if(islist(target.vars[V])) - if(special_list_vars[V]) - var/list/overrides_to_save = list_vars[V] - executor.saved_overrides[V] = overrides_to_save.Copy() - var/list/list_var = generate_list_var(V) - if(list_var) - target.vv_edit_var(V, list_var) - else if(isicon(target.vars[V])) - target.vv_edit_var(V, icon(saved_vars[V])) - else - target.vv_edit_var(V, saved_vars[V]) diff --git a/code/modules/admin/verbs/SDQL2/SDQL_spells/spells.dm b/code/modules/admin/verbs/SDQL2/SDQL_spells/spells.dm deleted file mode 100644 index 093e4e8dd16393..00000000000000 --- a/code/modules/admin/verbs/SDQL2/SDQL_spells/spells.dm +++ /dev/null @@ -1,148 +0,0 @@ -/obj/effect/proc_holder/spell/aimed/sdql - name = "Aimed SDQL Spell" - desc = "If you are reading this outside of the \"Give SDQL Spell\" menu, tell the admin that gave this spell to you to use said menu." - projectile_type = /obj/projectile - -/obj/effect/proc_holder/spell/aimed/sdql/Initialize(mapload, new_owner, giver) - . = ..() - AddComponent(/datum/component/sdql_executor, giver) - RegisterSignal(src, COMSIG_PROJECTILE_ON_HIT, .proc/on_projectile_hit) - -/obj/effect/proc_holder/spell/aimed/sdql/proc/on_projectile_hit(source, firer, target) - SIGNAL_HANDLER - var/datum/component/sdql_executor/executor = GetComponent(/datum/component/sdql_executor) - if(!executor) - CRASH("[src]'s SDQL executor component went missing!") - INVOKE_ASYNC(executor, /datum/component/sdql_executor/proc/execute, list(target), owner.resolve()) - -/obj/effect/proc_holder/spell/aoe_turf/sdql - name = "AoE SDQL Spell" - desc = "If you are reading this outside of the \"Give SDQL Spell\" menu, tell the admin that gave this spell to you to use said menu." - -/obj/effect/proc_holder/spell/aoe_turf/sdql/Initialize(mapload, new_owner, giver) - . = ..() - AddComponent(/datum/component/sdql_executor, giver) - -/obj/effect/proc_holder/spell/aoe_turf/sdql/cast(list/targets, mob/user) - var/datum/component/sdql_executor/executor = GetComponent(/datum/component/sdql_executor) - if(!executor) - CRASH("[src]'s SDQL executor component went missing!") - executor.execute(targets, user) - -/obj/effect/proc_holder/spell/cone/sdql - name = "Cone SDQL Spell" - desc = "If you are reading this outside of the \"Give SDQL Spell\" menu, tell the admin that gave this spell to you to use said menu." - var/list/targets = list() - -/obj/effect/proc_holder/spell/cone/sdql/Initialize(mapload, new_owner, giver) - . = ..() - AddComponent(/datum/component/sdql_executor, giver) - -/obj/effect/proc_holder/spell/cone/sdql/do_mob_cone_effect(mob/living/target_mob, level) - targets |= target_mob - -/obj/effect/proc_holder/spell/cone/sdql/do_obj_cone_effect(obj/target_obj, level) - targets |= target_obj - -/obj/effect/proc_holder/spell/cone/sdql/do_turf_cone_effect(turf/target_turf, level) - targets |= target_turf - -/obj/effect/proc_holder/spell/cone/sdql/cast(list/targets, mob/user) - . = ..() - var/datum/component/sdql_executor/executor = GetComponent(/datum/component/sdql_executor) - if(!executor) - CRASH("[src]'s SDQL executor component went missing!") - executor.execute(targets, user) - targets = list() - -/obj/effect/proc_holder/spell/cone/staggered/sdql - name = "Staggered Cone SDQL Spell" - desc = "If you are reading this outside of the \"Give SDQL Spell\" menu, tell the admin that gave this spell to you to use said menu." - var/list/targets = list() - -/obj/effect/proc_holder/spell/cone/staggered/sdql/Initialize(mapload, new_owner, giver) - . = ..() - AddComponent(/datum/component/sdql_executor, giver) - -/obj/effect/proc_holder/spell/cone/staggered/sdql/do_mob_cone_effect(mob/living/target_mob, level) - targets |= target_mob - -/obj/effect/proc_holder/spell/cone/staggered/sdql/do_obj_cone_effect(obj/target_obj, level) - targets |= target_obj - -/obj/effect/proc_holder/spell/cone/staggered/sdql/do_turf_cone_effect(turf/target_turf, level) - targets |= target_turf - -/obj/effect/proc_holder/spell/cone/staggered/sdql/do_cone_effects(list/target_turf_list, level) - . = ..() - var/datum/component/sdql_executor/executor = GetComponent(/datum/component/sdql_executor) - if(!executor) - CRASH("[src]'s SDQL executor component went missing!") - executor.execute(target_turf_list, owner.resolve()) - targets = list() - -/obj/effect/proc_holder/spell/pointed/sdql - name = "Pointed SDQL Spell" - desc = "If you are reading this outside of the \"Give SDQL Spell\" menu, tell the admin that gave this spell to you to use said menu." - -/obj/effect/proc_holder/spell/pointed/sdql/Initialize(mapload, new_owner, giver) - . = ..() - AddComponent(/datum/component/sdql_executor, giver) - -/obj/effect/proc_holder/spell/pointed/sdql/cast(list/targets, mob/user) - var/datum/component/sdql_executor/executor = GetComponent(/datum/component/sdql_executor) - if(!executor) - CRASH("[src]'s SDQL executor component went missing!") - executor.execute(targets, user) - -/obj/effect/proc_holder/spell/self/sdql - name = "Self SDQL Spell" - desc = "If you are reading this outside of the \"Give SDQL Spell\" menu, tell the admin that gave this spell to you to use said menu." - -/obj/effect/proc_holder/spell/self/sdql/Initialize(mapload, new_owner, giver) - . = ..() - AddComponent(/datum/component/sdql_executor, giver) - -/obj/effect/proc_holder/spell/self/sdql/cast(list/targets, mob/user) - var/datum/component/sdql_executor/executor = GetComponent(/datum/component/sdql_executor) - if(!executor) - CRASH("[src]'s SDQL executor component went missing!") - executor.execute(targets, user) - -/obj/effect/proc_holder/spell/targeted/sdql - name = "Targeted SDQL Spell" - desc = "If you are reading this outside of the \"Give SDQL Spell\" menu, tell the admin that gave this spell to you to use said menu." - -/obj/effect/proc_holder/spell/targeted/sdql/Initialize(mapload, new_owner, giver) - . = ..() - AddComponent(/datum/component/sdql_executor, giver) - -/obj/effect/proc_holder/spell/targeted/sdql/cast(list/targets, mob/user) - var/datum/component/sdql_executor/executor = GetComponent(/datum/component/sdql_executor) - if(!executor) - CRASH("[src]'s SDQL executor component went missing!") - executor.execute(targets, user) - -/obj/effect/proc_holder/spell/targeted/touch/sdql - name = "Touch SDQL Spell" - desc = "If you are reading this outside of the \"Give SDQL Spell\" menu, tell the admin that gave this spell to you to use said menu." - var/list/hand_var_overrides = list() //The touch attack has its vars changed to the ones put in this list. - -/obj/effect/proc_holder/spell/targeted/touch/sdql/Initialize(mapload, new_owner, giver) - . = ..() - AddComponent(/datum/component/sdql_executor, giver) - -/obj/effect/proc_holder/spell/targeted/touch/sdql/ChargeHand(mob/living/carbon/user) - if(..()) - for(var/V in hand_var_overrides) - if(attached_hand.vars[V]) - attached_hand.vv_edit_var(V, hand_var_overrides[V]) - RegisterSignal(attached_hand, COMSIG_ITEM_AFTERATTACK, .proc/on_touch_attack) - user.update_inv_hands() - -/obj/effect/proc_holder/spell/targeted/touch/sdql/proc/on_touch_attack(source, target, user) - SIGNAL_HANDLER - var/datum/component/sdql_executor/executor = GetComponent(/datum/component/sdql_executor) - if(!executor) - CRASH("[src]'s SDQL executor component went missing!") - INVOKE_ASYNC(executor, /datum/component/sdql_executor/proc/execute, list(target), user) diff --git a/code/modules/admin/verbs/adminevents.dm b/code/modules/admin/verbs/adminevents.dm index af32ef6a1d7593..ba07eb7858b750 100644 --- a/code/modules/admin/verbs/adminevents.dm +++ b/code/modules/admin/verbs/adminevents.dm @@ -268,13 +268,16 @@ if(!check_rights(R_ADMIN)) return - var/level = input("Select security level to change to","Set Security Level") as null|anything in list("green","blue","red","delta") - if(level) - set_security_level(level) + var/level = tgui_input_list(usr, "Select Security Level:", "Set Security Level", SSsecurity_level.available_levels) - log_admin("[key_name(usr)] changed the security level to [level]") - message_admins("[key_name_admin(usr)] changed the security level to [level]") - SSblackbox.record_feedback("tally", "admin_verb", 1, "Set Security Level [capitalize(level)]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + if(!level) + return + + SSsecurity_level.set_level(level) + + log_admin("[key_name(usr)] changed the security level to [level]") + message_admins("[key_name_admin(usr)] changed the security level to [level]") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Set Security Level [capitalize(level)]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/run_weather() set category = "Admin.Events" diff --git a/code/modules/admin/verbs/commandreport.dm b/code/modules/admin/verbs/commandreport.dm index c80c1900d4ec49..c6fa3e554089f1 100644 --- a/code/modules/admin/verbs/commandreport.dm +++ b/code/modules/admin/verbs/commandreport.dm @@ -99,8 +99,6 @@ custom_name = FALSE command_name = params["updated_name"] - if("update_report_contents") - command_report_content = params["updated_contents"] if("set_report_sound") played_sound = params["picked_sound"] if("toggle_announce") @@ -109,9 +107,10 @@ if(!command_name) to_chat(ui_user, span_danger("You can't send a report with no command name.")) return - if(!command_report_content) + if(!params["report"]) to_chat(ui_user, span_danger("You can't send a report with no contents.")) return + command_report_content = params["report"] send_announcement() return TRUE diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 7f1da58359af69..c4f3cbc202e2f6 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -23,7 +23,7 @@ var/turf/T = get_turf(mob) if(!isturf(T)) return - atmos_scan(user=usr, target=T, tool=null, silent=TRUE) + atmos_scan(user=usr, target=T, silent=TRUE) SSblackbox.record_feedback("tally", "admin_verb", 1, "Air Status In Location") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_robotize(mob/M in GLOB.mob_list) @@ -284,7 +284,7 @@ var/list/areas_with_intercom = list() var/list/areas_with_camera = list() var/static/list/station_areas_blacklist = typecacheof(list(/area/station/holodeck/rec_center, /area/shuttle, /area/station/engineering/supermatter, - /area/station/science/test_area, /area/space, /area/station/solars, /area/mine, /area/ruin, /area/centcom/asteroid)) + /area/space, /area/station/solars, /area/mine, /area/ruin, /area/centcom/asteroid)) if(SSticker.current_state == GAME_STATE_STARTUP) to_chat(usr, "Game still loading, please hold!", confidential = TRUE) diff --git a/code/modules/admin/verbs/diagnostics.dm b/code/modules/admin/verbs/diagnostics.dm index a98f40f82b0c92..69a98ad42f73c9 100644 --- a/code/modules/admin/verbs/diagnostics.dm +++ b/code/modules/admin/verbs/diagnostics.dm @@ -4,7 +4,7 @@ if(!isturf(target)) return - atmos_scan(user=usr, target=target, tool=null, silent=TRUE) + atmos_scan(user=usr, target=target, silent=TRUE) SSblackbox.record_feedback("tally", "admin_verb", 1, "Show Air Status") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/fix_next_move() diff --git a/code/modules/antagonists/_common/antag_spawner.dm b/code/modules/antagonists/_common/antag_spawner.dm index b01a8551534b1d..c9f9eaf330cf36 100644 --- a/code/modules/antagonists/_common/antag_spawner.dm +++ b/code/modules/antagonists/_common/antag_spawner.dm @@ -145,6 +145,10 @@ C.prefs.safe_transfer_prefs_to(nukie, is_antag = TRUE) nukie.ckey = C.key var/datum/mind/op_mind = nukie.mind + if(length(GLOB.newplayer_start)) // needed as hud code doesn't render huds if the atom (in this case the nukie) is in nullspace, so just move the nukie somewhere safe + nukie.forceMove(pick(GLOB.newplayer_start)) + else + nukie.forceMove(locate(1,1,1)) antag_datum = new() antag_datum.send_to_spawnpoint = FALSE @@ -257,14 +261,15 @@ /obj/item/antag_spawner/slaughter_demon/spawn_antag(client/C, turf/T, kind = "", datum/mind/user) - var/obj/effect/dummy/phased_mob/holder = new /obj/effect/dummy/phased_mob(T) - var/mob/living/simple_animal/hostile/imp/slaughter/S = new demon_type(holder) + var/mob/living/simple_animal/hostile/imp/slaughter/S = new demon_type(T) + new /obj/effect/dummy/phased_mob(T, S) + S.key = C.key S.mind.set_assigned_role(SSjob.GetJobType(/datum/job/slaughter_demon)) S.mind.special_role = ROLE_SLAUGHTER_DEMON S.mind.add_antag_datum(antag_type) - to_chat(S, "You are currently not currently in the same plane of existence as the station. \ - Ctrl+Click a blood pool to manifest.") + to_chat(S, span_bold("You are currently not currently in the same plane of existence as the station. \ + Use your Blood Crawl ability near a pool of blood to manifest and wreak havoc.")) /obj/item/antag_spawner/slaughter_demon/laughter name = "vial of tickles" diff --git a/code/modules/antagonists/blob/blob_mobs.dm b/code/modules/antagonists/blob/blob_mobs.dm index 8337c7853b3645..74ea92cc87a207 100644 --- a/code/modules/antagonists/blob/blob_mobs.dm +++ b/code/modules/antagonists/blob/blob_mobs.dm @@ -213,7 +213,7 @@ // Attach the smoke spreader and setup/start it. spores.attach(location) - spores.set_up(death_cloud_size, location = location, carry = reagents, silent = TRUE) + spores.set_up(death_cloud_size, holder = src, location = location, carry = reagents, silent = TRUE) spores.start() if(factory) factory.spore_delay = world.time + factory.spore_cooldown //put the factory on cooldown diff --git a/code/modules/antagonists/blob/overmind.dm b/code/modules/antagonists/blob/overmind.dm index f2d28f9c6f187f..4bb83647d9d746 100644 --- a/code/modules/antagonists/blob/overmind.dm +++ b/code/modules/antagonists/blob/overmind.dm @@ -139,7 +139,7 @@ GLOBAL_LIST_EMPTY(blob_nodes) else if(!victory_in_progress && (blobs_legit.len >= blobwincount)) victory_in_progress = TRUE priority_announce("Biohazard has reached critical mass. Station loss is imminent.", "Biohazard Alert") - set_security_level("delta") + SSsecurity_level.set_level(SEC_LEVEL_DELTA) max_blob_points = INFINITY blob_points = INFINITY addtimer(CALLBACK(src, .proc/victory), 450) diff --git a/code/modules/antagonists/brother/brother.dm b/code/modules/antagonists/brother/brother.dm index ec83e7e5baed84..60e92327564c43 100644 --- a/code/modules/antagonists/brother/brother.dm +++ b/code/modules/antagonists/brother/brother.dm @@ -49,7 +49,7 @@ brother1_icon.Blend(icon('icons/effects/blood.dmi', "maskblood"), ICON_OVERLAY) brother1_icon.Shift(WEST, 8) - var/icon/brother2_icon = render_preview_outfit(/datum/outfit/job/scientist, brother2) + var/icon/brother2_icon = render_preview_outfit(/datum/outfit/job/scientist/consistent, brother2) brother2_icon.Blend(icon('icons/effects/blood.dmi', "uniformblood"), ICON_OVERLAY) brother2_icon.Shift(EAST, 8) diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm index 5ce3207b30cee2..852da43db9f8c7 100644 --- a/code/modules/antagonists/cult/blood_magic.dm +++ b/code/modules/antagonists/cult/blood_magic.dm @@ -218,68 +218,45 @@ name = "Hallucinations" desc = "Gives hallucinations to a target at range. A silent and invisible spell." button_icon_state = "horror" - var/obj/effect/proc_holder/horror/PH charges = 4 + click_action = TRUE + enable_text = span_cult("You prepare to horrify a target...") + disable_text = span_cult("You dispel the magic...") -/datum/action/innate/cult/blood_spell/horror/New() - PH = new() - PH.attached_action = src - ..() +/datum/action/innate/cult/blood_spell/horror/InterceptClickOn(mob/living/caller, params, atom/clicked_on) + var/turf/caller_turf = get_turf(caller) + if(!isturf(caller_turf)) + return FALSE -/datum/action/innate/cult/blood_spell/horror/Destroy() - var/obj/effect/proc_holder/horror/destroy = PH - . = ..() - if(destroy && !QDELETED(destroy)) - QDEL_NULL(destroy) + if(!ishuman(clicked_on) || get_dist(caller, clicked_on) > 7) + return FALSE -/datum/action/innate/cult/blood_spell/horror/Activate() - PH.toggle(owner) //the important bit - return TRUE + var/mob/living/carbon/human/human_clicked = clicked_on + if(IS_CULTIST(human_clicked)) + return FALSE -/obj/effect/proc_holder/horror - active = FALSE - ranged_mousepointer = 'icons/effects/mouse_pointers/cult_target.dmi' - var/datum/action/innate/cult/blood_spell/attached_action + return ..() -/obj/effect/proc_holder/horror/Destroy() - var/datum/action/innate/cult/blood_spell/AA = attached_action - . = ..() - if(AA && !QDELETED(AA)) - QDEL_NULL(AA) +/datum/action/innate/cult/blood_spell/horror/do_ability(mob/living/caller, params, mob/living/carbon/human/clicked_on) -/obj/effect/proc_holder/horror/proc/toggle(mob/user) - if(active) - remove_ranged_ability(span_cult("You dispel the magic...")) - else - add_ranged_ability(user, span_cult("You prepare to horrify a target...")) + clicked_on.hallucination = max(clicked_on.hallucination, 120) + SEND_SOUND(caller, sound('sound/effects/ghost.ogg', FALSE, TRUE, 50)) -/obj/effect/proc_holder/horror/InterceptClickOn(mob/living/caller, params, atom/target) - if(..()) - return - if(ranged_ability_user.incapacitated() || !IS_CULTIST(caller)) - remove_ranged_ability() - return - var/turf/T = get_turf(ranged_ability_user) - if(!isturf(T)) - return FALSE - if(target in view(7, get_turf(ranged_ability_user))) - var/mob/living/carbon/human/human_target = target - if(!istype(human_target) || IS_CULTIST(human_target)) - return - var/mob/living/carbon/human/H = target - H.hallucination = max(H.hallucination, 120) - SEND_SOUND(ranged_ability_user, sound('sound/effects/ghost.ogg',0,1,50)) - var/image/C = image('icons/effects/cult/effects.dmi',H,"bloodsparkles", ABOVE_MOB_LAYER) - add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/cult, "cult_apoc", C, NONE) - addtimer(CALLBACK(H,/atom/.proc/remove_alt_appearance,"cult_apoc",TRUE), 2400, TIMER_OVERRIDE|TIMER_UNIQUE) - to_chat(ranged_ability_user,span_cult("[H] has been cursed with living nightmares!")) - attached_action.charges-- - attached_action.desc = attached_action.base_desc - attached_action.desc += "
Has [attached_action.charges] use\s remaining." - attached_action.UpdateButtons() - if(attached_action.charges <= 0) - remove_ranged_ability(span_cult("You have exhausted the spell's power!")) - qdel(src) + var/image/sparkle_image = image('icons/effects/cult/effects.dmi', clicked_on, "bloodsparkles", ABOVE_MOB_LAYER) + clicked_on.add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/cult, "cult_apoc", sparkle_image, NONE) + + addtimer(CALLBACK(clicked_on, /atom/.proc/remove_alt_appearance, "cult_apoc", TRUE), 4 MINUTES, TIMER_OVERRIDE|TIMER_UNIQUE) + to_chat(caller, span_cultbold("[clicked_on] has been cursed with living nightmares!")) + + charges-- + desc = base_desc + desc += "
Has [charges] use\s remaining." + UpdateButtons() + if(charges <= 0) + to_chat(caller, span_cult("You have exhausted the spell's power!")) + qdel(src) + + return TRUE /datum/action/innate/cult/blood_spell/veiling name = "Conceal Presence" diff --git a/code/modules/antagonists/cult/cult.dm b/code/modules/antagonists/cult/cult.dm index 0d81e261044fcc..689a92343a1718 100644 --- a/code/modules/antagonists/cult/cult.dm +++ b/code/modules/antagonists/cult/cult.dm @@ -252,7 +252,7 @@ name = "Cult" ///The blood mark target - var/blood_target + var/atom/blood_target ///Image of the blood mark target var/image/blood_target_image ///Timer for the blood mark expiration @@ -488,6 +488,64 @@ return FALSE //can't convert machines, shielded, or braindead return TRUE +/// Sets a blood target for the cult. +/datum/team/cult/proc/set_blood_target(atom/new_target, mob/marker, duration = 90 SECONDS) + if(QDELETED(new_target)) + CRASH("A null or invalid target was passed to set_blood_target.") + + if(blood_target_reset_timer) + return FALSE + + blood_target = new_target + RegisterSignal(blood_target, COMSIG_PARENT_QDELETING, .proc/unset_blood_target_and_timer) + var/area/target_area = get_area(new_target) + + blood_target_image = image('icons/effects/mouse_pointers/cult_target.dmi', new_target, "glow", ABOVE_MOB_LAYER) + blood_target_image.appearance_flags = RESET_COLOR + blood_target_image.pixel_x = -new_target.pixel_x + blood_target_image.pixel_y = -new_target.pixel_y + + for(var/datum/mind/cultist as anything in members) + if(!cultist.current) + continue + if(cultist.current.stat == DEAD || !cultist.current.client) + continue + + to_chat(cultist.current, span_bold(span_cultlarge("[marker] has marked [blood_target] in the [target_area.name] as the cult's top priority, get there immediately!"))) + SEND_SOUND(cultist.current, sound(pick('sound/hallucinations/over_here2.ogg','sound/hallucinations/over_here3.ogg'), 0, 1, 75)) + cultist.current.client.images += blood_target_image + + blood_target_reset_timer = addtimer(CALLBACK(src, .proc/unset_blood_target), duration, TIMER_STOPPABLE) + return TRUE + +/// Unsets out blood target, clearing the images from all the cultists. +/datum/team/cult/proc/unset_blood_target() + blood_target_reset_timer = null + + for(var/datum/mind/cultist as anything in members) + if(!cultist.current) + continue + if(cultist.current.stat == DEAD || !cultist.current.client) + continue + + if(QDELETED(blood_target)) + to_chat(cultist.current, span_bold(span_cultlarge("The blood mark's target is lost!"))) + else + to_chat(cultist.current, span_bold(span_cultlarge("The blood mark has expired!"))) + cultist.current.client.images -= blood_target_image + + UnregisterSignal(blood_target, COMSIG_PARENT_QDELETING) + blood_target = null + + QDEL_NULL(blood_target_image) + +/// Unsets our blood target when they get deleted. +/datum/team/cult/proc/unset_blood_target_and_timer(datum/source) + SIGNAL_HANDLER + + deltimer(blood_target_reset_timer) + unset_blood_target() + /datum/outfit/cultist name = "Cultist (Preview only)" diff --git a/code/modules/antagonists/cult/cult_comms.dm b/code/modules/antagonists/cult/cult_comms.dm index 3ee18c3f7a0d6b..0d6f0a3d72c514 100644 --- a/code/modules/antagonists/cult/cult_comms.dm +++ b/code/modules/antagonists/cult/cult_comms.dm @@ -5,6 +5,7 @@ background_icon_state = "bg_demon" buttontooltipstyle = "cult" check_flags = AB_CHECK_HANDS_BLOCKED|AB_CHECK_IMMOBILE|AB_CHECK_CONSCIOUS + ranged_mousepointer = 'icons/effects/mouse_pointers/cult_target.dmi' /datum/action/innate/cult/IsAvailable() if(!IS_CULTIST(owner)) @@ -230,252 +231,218 @@ name = "Mark Target" desc = "Marks a target for the cult." button_icon_state = "cult_mark" - var/obj/effect/proc_holder/cultmark/CM - var/cooldown = 0 - var/base_cooldown = 1200 - -/datum/action/innate/cult/master/cultmark/New(Target) - CM = new() - CM.attached_action = src - ..() + click_action = TRUE + enable_text = span_cult("You prepare to mark a target for your cult. Click a target to mark them!") + disable_text = span_cult("You cease the marking ritual.") + /// The duration of the mark itself + var/cult_mark_duration = 90 SECONDS + /// The duration of the cooldown for cult marks + var/cult_mark_cooldown_duration = 2 MINUTES + /// The actual cooldown tracked of the action + COOLDOWN_DECLARE(cult_mark_cooldown) /datum/action/innate/cult/master/cultmark/IsAvailable() - if(cooldown > world.time) - if(!CM.active) - to_chat(owner, span_cultlarge("You need to wait [DisplayTimeText(cooldown - world.time)] before you can mark another target!")) - return FALSE - return ..() - -/datum/action/innate/cult/master/cultmark/Destroy() - QDEL_NULL(CM) - return ..() + return ..() && COOLDOWN_FINISHED(src, cult_mark_cooldown) -/datum/action/innate/cult/master/cultmark/Activate() - CM.toggle(owner) //the important bit - return TRUE +/datum/action/innate/cult/master/cultmark/InterceptClickOn(mob/caller, params, atom/clicked_on) + var/turf/caller_turf = get_turf(caller) + if(!isturf(caller_turf)) + return FALSE -/obj/effect/proc_holder/cultmark - active = FALSE - ranged_mousepointer = 'icons/effects/mouse_pointers/cult_target.dmi' - var/datum/action/innate/cult/master/cultmark/attached_action + if(!(clicked_on in view(7, caller_turf))) + return FALSE -/obj/effect/proc_holder/cultmark/Destroy() - attached_action = null return ..() -/obj/effect/proc_holder/cultmark/proc/toggle(mob/user) - if(active) - remove_ranged_ability(span_cult("You cease the marking ritual.")) - else - add_ranged_ability(user, span_cult("You prepare to mark a target for your cult...")) +/datum/action/innate/cult/master/cultmark/do_ability(mob/living/caller, params, atom/clicked_on) + var/datum/antagonist/cult/cultist = caller.mind.has_antag_datum(/datum/antagonist/cult, TRUE) + if(!cultist) + CRASH("[type] was casted by someone without a cult antag datum.") -/obj/effect/proc_holder/cultmark/InterceptClickOn(mob/living/caller, params, atom/target) - if(..()) - return - if(ranged_ability_user.incapacitated()) - remove_ranged_ability() - return - var/turf/T = get_turf(ranged_ability_user) - if(!isturf(T)) - return FALSE + var/datum/team/cult/cult_team = cultist.get_team() + if(!cult_team) + CRASH("[type] was casted by a cultist without a cult team datum.") - var/datum/antagonist/cult/C = caller.mind.has_antag_datum(/datum/antagonist/cult,TRUE) + if(cult_team.blood_target) + to_chat(caller, span_cult("The cult has already designated a target!")) + return FALSE - if(target in view(7, get_turf(ranged_ability_user))) - if(C.cult_team.blood_target) - to_chat(ranged_ability_user, span_cult("The cult has already designated a target!")) - return FALSE - C.cult_team.blood_target = target - var/area/A = get_area(target) - attached_action.cooldown = world.time + attached_action.base_cooldown - addtimer(CALLBACK(attached_action.owner, /mob.proc/update_action_buttons_icon), attached_action.base_cooldown) - C.cult_team.blood_target_image = image('icons/effects/mouse_pointers/cult_target.dmi', target, "glow", ABOVE_MOB_LAYER) - C.cult_team.blood_target_image.appearance_flags = RESET_COLOR - C.cult_team.blood_target_image.pixel_x = -target.pixel_x - C.cult_team.blood_target_image.pixel_y = -target.pixel_y - for(var/datum/mind/B as anything in get_antag_minds(/datum/antagonist/cult)) - if(B.current && B.current.stat != DEAD && B.current.client) - to_chat(B.current, span_cultlarge("[ranged_ability_user] has marked [C.cult_team.blood_target] in the [A.name] as the cult's top priority, get there immediately!")) - SEND_SOUND(B.current, sound(pick('sound/hallucinations/over_here2.ogg','sound/hallucinations/over_here3.ogg'),0,1,75)) - B.current.client.images += C.cult_team.blood_target_image - attached_action.owner.update_action_buttons_icon() - remove_ranged_ability(span_cult("The marking rite is complete! It will last for 90 seconds.")) - C.cult_team.blood_target_reset_timer = addtimer(CALLBACK(GLOBAL_PROC, .proc/reset_blood_target,C.cult_team), 900, TIMER_STOPPABLE) + if(cult_team.set_blood_target(clicked_on, caller, cult_mark_duration)) + unset_ranged_ability(caller, span_cult("The marking rite is complete! It will last for [DisplayTimeText(cult_mark_duration)] seconds.")) + COOLDOWN_START(src, cult_mark_cooldown, cult_mark_cooldown_duration) + UpdateButtons() + addtimer(CALLBACK(src, .proc/UpdateButtons), cult_mark_cooldown_duration + 1) return TRUE - return FALSE - -/proc/reset_blood_target(datum/team/cult/team) - for(var/datum/mind/B in team.members) - if(B.current && B.current.stat != DEAD && B.current.client) - if(team.blood_target) - to_chat(B.current,span_cultlarge("The blood mark has expired!")) - B.current.client.images -= team.blood_target_image - QDEL_NULL(team.blood_target_image) - team.blood_target = null - -/datum/action/innate/cult/master/cultmark/ghost - name = "Mark a Blood Target for the Cult" - desc = "Marks a target for the entire cult to track." - -/datum/action/innate/cult/master/cultmark/ghost/IsAvailable() - if(istype(owner, /mob/dead/observer) && IS_CULTIST(owner.mind.current)) - return TRUE - else - qdel(src) + unset_ranged_ability(caller, span_cult("The marking rite failed!")) + return TRUE /datum/action/innate/cult/ghostmark //Ghost version name = "Blood Mark your Target" - desc = "Marks whatever you are orbitting - for the entire cult to track." + desc = "Marks whatever you are orbiting for the entire cult to track." button_icon_state = "cult_mark" - var/tracking = FALSE - var/cooldown = 0 - var/base_cooldown = 600 + /// The duration of the mark on the target + var/cult_mark_duration = 60 SECONDS + /// The cooldown between marks - the ability can be used in between cooldowns, but can't mark (only clear) + var/cult_mark_cooldown_duration = 60 SECONDS + /// The actual cooldown tracked of the action + COOLDOWN_DECLARE(cult_mark_cooldown) /datum/action/innate/cult/ghostmark/IsAvailable() - if(istype(owner, /mob/dead/observer) && IS_CULTIST(owner.mind.current)) - return TRUE - else - qdel(src) - -/datum/action/innate/cult/ghostmark/proc/reset_button() - if(owner) - name = "Blood Mark your Target" - desc = "Marks whatever you are orbitting - for the entire cult to track." - button_icon_state = "cult_mark" - owner.update_action_buttons_icon() - SEND_SOUND(owner, 'sound/magic/enter_blood.ogg') - to_chat(owner,span_cultbold("Your previous mark is gone - you are now ready to create a new blood mark.")) + return ..() && istype(owner, /mob/dead/observer) /datum/action/innate/cult/ghostmark/Activate() - var/datum/antagonist/cult/C = owner.mind.has_antag_datum(/datum/antagonist/cult,TRUE) - if(C.cult_team.blood_target) - if(cooldown>world.time) - reset_blood_target(C.cult_team) + var/datum/antagonist/cult/cultist = owner.mind?.has_antag_datum(/datum/antagonist/cult, TRUE) + if(!cultist) + CRASH("[type] was casted by someone without a cult antag datum.") + + var/datum/team/cult/cult_team = cultist.get_team() + if(!cult_team) + CRASH("[type] was casted by a cultist without a cult team datum.") + + if(cult_team.blood_target) + if(!COOLDOWN_FINISHED(src, cult_mark_cooldown)) + cult_team.unset_blood_target_and_timer() to_chat(owner, span_cultbold("You have cleared the cult's blood target!")) - deltimer(C.cult_team.blood_target_reset_timer) - return - else - to_chat(owner, span_cultbold("The cult has already designated a target!")) - return - if(cooldown>world.time) + return TRUE + + to_chat(owner, span_cultbold("The cult has already designated a target!")) + return FALSE + + if(!COOLDOWN_FINISHED(src, cult_mark_cooldown)) to_chat(owner, span_cultbold("You aren't ready to place another blood mark yet!")) + return FALSE + + var/atom/mark_target = owner.orbiting?.parent || get_turf(owner) + if(!mark_target) + return FALSE + + if(cult_team.set_blood_target(mark_target, owner, 60 SECONDS)) + to_chat(owner, span_cultbold("You have marked [mark_target] for the cult! It will last for [DisplayTimeText(cult_mark_duration)].")) + COOLDOWN_START(src, cult_mark_cooldown, cult_mark_cooldown_duration) + update_button_status() + addtimer(CALLBACK(src, .proc/reset_button), cult_mark_cooldown_duration + 1) + return TRUE + + to_chat(owner, span_cult("The marking failed!")) + return FALSE + +/datum/action/innate/cult/ghostmark/proc/update_button_status() + if(!owner) return - target = owner.orbiting?.parent || get_turf(owner) - if(!target) - return - C.cult_team.blood_target = target - var/atom/atom_target = target - var/area/A = get_area(atom_target) - cooldown = world.time + base_cooldown - addtimer(CALLBACK(owner, /mob.proc/update_action_buttons_icon), base_cooldown) - C.cult_team.blood_target_image = image('icons/effects/mouse_pointers/cult_target.dmi', atom_target, "glow", ABOVE_MOB_LAYER) - C.cult_team.blood_target_image.appearance_flags = RESET_COLOR - C.cult_team.blood_target_image.pixel_x = -atom_target.pixel_x - C.cult_team.blood_target_image.pixel_y = -atom_target.pixel_y - SEND_SOUND(owner, sound(pick('sound/hallucinations/over_here2.ogg','sound/hallucinations/over_here3.ogg'),0,1,75)) - owner.client.images += C.cult_team.blood_target_image - for(var/datum/mind/B as anything in get_antag_minds(/datum/antagonist/cult)) - if(B.current && B.current.stat != DEAD && B.current.client) - to_chat(B.current, span_cultlarge("[owner] has marked [C.cult_team.blood_target] in the [A.name] as the cult's top priority, get there immediately!")) - SEND_SOUND(B.current, sound(pick('sound/hallucinations/over_here2.ogg','sound/hallucinations/over_here3.ogg'),0,1,75)) - B.current.client.images += C.cult_team.blood_target_image - to_chat(owner,span_cultbold("You have marked the [atom_target] for the cult! It will last for [DisplayTimeText(base_cooldown)].")) - name = "Clear the Blood Mark" - desc = "Remove the Blood Mark you previously set." - button_icon_state = "emp" - owner.update_action_buttons_icon() - C.cult_team.blood_target_reset_timer = addtimer(CALLBACK(GLOBAL_PROC, .proc/reset_blood_target,C.cult_team), base_cooldown, TIMER_STOPPABLE) - addtimer(CALLBACK(src, .proc/reset_button), base_cooldown) + if(COOLDOWN_FINISHED(src, cult_mark_duration)) + name = initial(name) + desc = initial(desc) + button_icon_state = initial(button_icon_state) + else + name = "Clear the Blood Mark" + desc = "Remove the Blood Mark you previously set." + button_icon_state = "emp" -//////// ELDRITCH PULSE ///////// + UpdateButtons() +/datum/action/innate/cult/ghostmark/proc/reset_button() + if(QDELETED(owner) || QDELETED(src)) + return + SEND_SOUND(owner, 'sound/magic/enter_blood.ogg') + to_chat(owner, span_cultbold("Your previous mark is gone - you are now ready to create a new blood mark.")) + update_button_status() + +//////// ELDRITCH PULSE ///////// /datum/action/innate/cult/master/pulse name = "Eldritch Pulse" desc = "Seize upon a fellow cultist or cult structure and teleport it to a nearby location." icon_icon = 'icons/mob/actions/actions_spells.dmi' button_icon_state = "arcane_barrage" - var/obj/effect/proc_holder/pulse/PM - var/cooldown = 0 - var/base_cooldown = 150 - var/throwing = FALSE - var/mob/living/throwee - -/datum/action/innate/cult/master/pulse/New() - PM = new() - PM.attached_action = src - ..() + click_action = TRUE + enable_text = span_cult("You prepare to tear through the fabric of reality... Click a target to sieze them!") + disable_text = span_cult("You cease your preparations.") + /// Weakref to whoever we're currently about to toss + var/datum/weakref/throwee_ref + /// Cooldown of the ability + var/pulse_cooldown_duration = 15 SECONDS + /// The actual cooldown tracked of the action + COOLDOWN_DECLARE(pulse_cooldown) /datum/action/innate/cult/master/pulse/IsAvailable() - if(!owner.mind || !owner.mind.has_antag_datum(/datum/antagonist/cult/master)) + return ..() && COOLDOWN_FINISHED(src, pulse_cooldown) + +/datum/action/innate/cult/master/pulse/InterceptClickOn(mob/living/caller, params, atom/clicked_on) + var/turf/caller_turf = get_turf(caller) + if(!isturf(caller_turf)) + return FALSE + + if(!(clicked_on in view(7, caller_turf))) return FALSE - if(cooldown > world.time) - if(!PM.active) - to_chat(owner, span_cultlarge("You need to wait [DisplayTimeText(cooldown - world.time)] before you can pulse again!")) + + if(clicked_on == caller) return FALSE - return ..() -/datum/action/innate/cult/master/pulse/Destroy() - PM.attached_action = null //What the fuck is even going on here. - QDEL_NULL(PM) return ..() +/datum/action/innate/cult/master/pulse/do_ability(mob/living/caller, params, atom/clicked_on) + var/atom/throwee = throwee_ref?.resolve() -/datum/action/innate/cult/master/pulse/Activate() - PM.toggle(owner) //the important bit - return TRUE + if(QDELETED(throwee)) + to_chat(caller, span_cult("You lost your target!")) + throwee = null + throwee_ref = null + return FALSE -/obj/effect/proc_holder/pulse - active = FALSE - ranged_mousepointer = 'icons/effects/mouse_pointers/throw_target.dmi' - var/datum/action/innate/cult/master/pulse/attached_action + if(throwee) + if(get_dist(throwee, clicked_on) >= 16) + to_chat(caller, span_cult("You can't teleport [clicked_on.p_them()] that far!")) + return FALSE -/obj/effect/proc_holder/pulse/Destroy() - attached_action = null - return ..() + var/turf/throwee_turf = get_turf(throwee) + + playsound(throwee_turf, 'sound/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!"), + span_cult("A pulse of blood magic whisks you away..."), + ) + + if(!do_teleport(throwee, clicked_on, channel = TELEPORT_CHANNEL_CULT)) + to_chat(caller, span_cult("The teleport fails!")) + throwee.visible_message( + span_warning("...Except they don't go very far"), + span_cult("...Except you don't appear to have moved very far."), + ) + return FALSE + + throwee_turf.Beam(clicked_on, icon_state = "sendbeam", time = 0.4 SECONDS) + new /obj/effect/temp_visual/cult/sparks(get_turf(clicked_on), caller.dir) + throwee.visible_message( + span_warning("[throwee] appears suddenly in a pulse of magic!"), + span_cult("...And you appear elsewhere."), + ) + COOLDOWN_START(src, pulse_cooldown, pulse_cooldown_duration) + to_chat(caller, span_cult("A pulse of blood magic surges through you as you shift [throwee] through time and space.")) + caller.click_intercept = null + throwee_ref = null + UpdateButtons() + addtimer(CALLBACK(src, .proc/UpdateButtons), pulse_cooldown_duration + 1) + + return TRUE -/obj/effect/proc_holder/pulse/proc/toggle(mob/user) - if(active) - remove_ranged_ability(span_cult("You cease your preparations...")) - attached_action.throwing = FALSE else - add_ranged_ability(user, span_cult("You prepare to tear through the fabric of reality...")) + if(isliving(clicked_on)) + var/mob/living/living_clicked = clicked_on + if(!IS_CULTIST(living_clicked)) + return FALSE + SEND_SOUND(caller, sound('sound/weapons/thudswoosh.ogg')) + to_chat(caller, span_cultbold("You reach through the veil with your mind's eye and seize [clicked_on]! Click anywhere nearby to teleport [clicked_on.p_them()]!")) + throwee_ref = WEAKREF(clicked_on) + return TRUE + + if(istype(clicked_on, /obj/structure/destructible/cult)) + to_chat(caller, span_cultbold("You reach through the veil with your mind's eye and lift [clicked_on]! Click anywhere nearby to teleport it!")) + throwee_ref = WEAKREF(clicked_on) + return TRUE -/obj/effect/proc_holder/pulse/InterceptClickOn(mob/living/caller, params, atom/target) - if(..()) - return - if(ranged_ability_user.incapacitated()) - remove_ranged_ability() - return - var/turf/T = get_turf(ranged_ability_user) - if(!isturf(T)) - return FALSE - if(target in view(7, get_turf(ranged_ability_user))) - var/mob/mob_target = target - var/is_cultist = istype(mob_target) && IS_CULTIST(mob_target) - if((!(is_cultist || istype(target, /obj/structure/destructible/cult)) || target == caller) && !(attached_action.throwing)) - return - if(!attached_action.throwing) - attached_action.throwing = TRUE - attached_action.throwee = target - SEND_SOUND(ranged_ability_user, sound('sound/weapons/thudswoosh.ogg')) - to_chat(ranged_ability_user,span_cult("You reach through the veil with your mind's eye and seize [target]!")) - return - else - new /obj/effect/temp_visual/cult/sparks(get_turf(attached_action.throwee), ranged_ability_user.dir) - var/distance = get_dist(attached_action.throwee, target) - if(distance >= 16) - return - playsound(target,'sound/magic/exit_blood.ogg') - attached_action.throwee.Beam(target,icon_state="sendbeam", time = 4) - attached_action.throwee.forceMove(get_turf(target)) - new /obj/effect/temp_visual/cult/sparks(get_turf(target), ranged_ability_user.dir) - attached_action.throwing = FALSE - attached_action.cooldown = world.time + attached_action.base_cooldown - remove_ranged_ability(span_cult("A pulse of blood magic surges through you as you shift [attached_action.throwee] through time and space.")) - caller.update_action_buttons_icon() - addtimer(CALLBACK(caller, /mob.proc/update_action_buttons_icon), attached_action.base_cooldown) + return FALSE diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm index cfa9bfd9caee08..e36961a93f6848 100644 --- a/code/modules/antagonists/cult/cult_items.dm +++ b/code/modules/antagonists/cult/cult_items.dm @@ -549,7 +549,7 @@ Striking a noncultist, however, will tear their flesh."} if(SSshuttle.emergency.mode == SHUTTLE_CALL) var/cursetime = 3 MINUTES var/timer = SSshuttle.emergency.timeLeft(1) + cursetime - var/security_num = seclevel2num(get_security_level()) + var/security_num = SSsecurity_level.get_current_level_as_number() var/set_coefficient = 1 if(totalcurses == 0) diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm index 763b8bc28acdad..e73f1f2881e9af 100644 --- a/code/modules/antagonists/cult/runes.dm +++ b/code/modules/antagonists/cult/runes.dm @@ -342,13 +342,11 @@ structure_check() searches for nearby cultist structures required for the invoca return TRUE var/obj/item/soulstone/stone = new /obj/item/soulstone(get_turf(src)) if(sacrificial.mind && !sacrificial.suiciding) - stone.invisibility = INVISIBILITY_MAXIMUM //so it's not picked up during transfer_soul() stone.capture_soul(sacrificial, first_invoker, TRUE) - stone.invisibility = 0 if(sacrificial) playsound(sacrificial, 'sound/magic/disintegrate.ogg', 100, TRUE) - sacrificial.gib(TRUE) + sacrificial.gib() return TRUE /obj/effect/rune/empower diff --git a/code/modules/antagonists/ert/ert.dm b/code/modules/antagonists/ert/ert.dm index 50be074e6112c0..aae6c4e5a96c61 100644 --- a/code/modules/antagonists/ert/ert.dm +++ b/code/modules/antagonists/ert/ert.dm @@ -216,7 +216,7 @@ /datum/antagonist/ert/bounty_hook role = "Hookgun Bounty Hunter" - outfit = /datum/outfit/bountyarmor/ert + outfit = /datum/outfit/bountyhook/ert /datum/antagonist/ert/bounty_synth role = "Synthetic Bounty Hunter" diff --git a/code/modules/antagonists/fugitive/fugitive_outfits.dm b/code/modules/antagonists/fugitive/fugitive_outfits.dm index 0b2fe890e87f9e..3d176a9d39b6a2 100644 --- a/code/modules/antagonists/fugitive/fugitive_outfits.dm +++ b/code/modules/antagonists/fugitive/fugitive_outfits.dm @@ -43,8 +43,7 @@ equipped_on.hair_color = "#000000" equipped_on.facial_hair_color = equipped_on.hair_color equipped_on.update_body() - if(equipped_on.mind) - equipped_on.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/knock(null)) + var/list/no_drops = list() no_drops += equipped_on.get_item_by_slot(ITEM_SLOT_FEET) no_drops += equipped_on.get_item_by_slot(ITEM_SLOT_ICLOTHING) @@ -54,6 +53,9 @@ for(var/obj/item/trait_needed as anything in no_drops) ADD_TRAIT(trait_needed, TRAIT_NODROP, CURSED_ITEM_TRAIT(trait_needed.type)) + var/datum/action/cooldown/spell/aoe/knock/waldos_key = new(equipped_on.mind || equipped_on) + waldos_key.Grant(equipped_on) + /datum/outfit/synthetic name = "Factory Error Synth" uniform = /obj/item/clothing/under/color/white @@ -230,7 +232,7 @@ /obj/item/card/id/advanced/bountyhunter assignment = "Bounty Hunter" - icon_state = "card_flames" //oh SHIT + icon_state = "card_flame" //oh SHIT trim = /datum/id_trim/bounty_hunter /datum/outfit/bountyarmor/ert diff --git a/code/modules/antagonists/gang/outfits.dm b/code/modules/antagonists/gang/outfits.dm index 82babe31609d3f..d0e13af898d756 100644 --- a/code/modules/antagonists/gang/outfits.dm +++ b/code/modules/antagonists/gang/outfits.dm @@ -1,3 +1,6 @@ +/datum/outfit/families_police + name = "Families: Base Cop" + /datum/outfit/families_police/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) if(visualsOnly) return diff --git a/code/modules/antagonists/heretic/heretic_antag.dm b/code/modules/antagonists/heretic/heretic_antag.dm index 4d7c14eb32874a..378f12264fe7f6 100644 --- a/code/modules/antagonists/heretic/heretic_antag.dm +++ b/code/modules/antagonists/heretic/heretic_antag.dm @@ -194,7 +194,7 @@ var/mob/living/our_mob = mob_override || owner.current handle_clown_mutation(our_mob, "Ancient knowledge described to you has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself.") our_mob.faction |= FACTION_HERETIC - RegisterSignal(our_mob, COMSIG_MOB_PRE_CAST_SPELL, .proc/on_spell_cast) + RegisterSignal(our_mob, list(COMSIG_MOB_BEFORE_SPELL_CAST, COMSIG_MOB_SPELL_ACTIVATED), .proc/on_spell_cast) RegisterSignal(our_mob, COMSIG_MOB_ITEM_AFTERATTACK, .proc/on_item_afterattack) RegisterSignal(our_mob, COMSIG_MOB_LOGIN, .proc/fix_influence_network) @@ -202,7 +202,7 @@ var/mob/living/our_mob = mob_override || owner.current handle_clown_mutation(our_mob, removing = FALSE) our_mob.faction -= FACTION_HERETIC - UnregisterSignal(our_mob, list(COMSIG_MOB_PRE_CAST_SPELL, COMSIG_MOB_ITEM_AFTERATTACK, COMSIG_MOB_LOGIN)) + UnregisterSignal(our_mob, list(COMSIG_MOB_BEFORE_SPELL_CAST, COMSIG_MOB_SPELL_ACTIVATED, COMSIG_MOB_ITEM_AFTERATTACK, COMSIG_MOB_LOGIN)) /datum/antagonist/heretic/on_body_transfer(mob/living/old_body, mob/living/new_body) . = ..() @@ -212,13 +212,13 @@ knowledge.on_gain(new_body) /* - * Signal proc for [COMSIG_MOB_PRE_CAST_SPELL]. + * Signal proc for [COMSIG_MOB_BEFORE_SPELL_CAST] and [COMSIG_MOB_SPELL_ACTIVATED]. * - * Checks if our heretic has TRAIT_ALLOW_HERETIC_CASTING. + * Checks if our heretic has [TRAIT_ALLOW_HERETIC_CASTING] or is ascended. * If so, allow them to cast like normal. - * If not, cancel the cast. + * If not, cancel the cast, and returns [SPELL_CANCEL_CAST]. */ -/datum/antagonist/heretic/proc/on_spell_cast(mob/living/source, obj/effect/proc_holder/spell/spell) +/datum/antagonist/heretic/proc/on_spell_cast(mob/living/source, datum/action/cooldown/spell/spell) SIGNAL_HANDLER // Heretic spells are of the forbidden school, otherwise we don't care @@ -234,7 +234,7 @@ // We shouldn't be able to cast this! Cancel it. source.balloon_alert(source, "you need a focus!") - return COMPONENT_CANCEL_SPELL + return SPELL_CANCEL_CAST /* * Signal proc for [COMSIG_MOB_ITEM_AFTERATTACK]. diff --git a/code/modules/antagonists/heretic/heretic_focus.dm b/code/modules/antagonists/heretic/heretic_focus.dm index 46e5e20b583480..2bcd7577e84f73 100644 --- a/code/modules/antagonists/heretic/heretic_focus.dm +++ b/code/modules/antagonists/heretic/heretic_focus.dm @@ -11,6 +11,13 @@ RegisterSignal(target, COMSIG_ITEM_EQUIPPED, .proc/on_equip) RegisterSignal(target, COMSIG_ITEM_DROPPED, .proc/on_drop) + var/obj/item/item_target = target + // If our loc is a mob, it's possible we already have it equippied + if(ismob(item_target.loc)) + var/mob/wearer = item_target.loc + if(!item_target.slot_flags || wearer.get_item_by_slot(item_target.slot_flags) == item_target) + ADD_TRAIT(wearer, TRAIT_ALLOW_HERETIC_CASTING, ELEMENT_TRAIT(target)) + /datum/element/heretic_focus/Detach(obj/item/source) . = ..() UnregisterSignal(source, list(COMSIG_PARENT_EXAMINE, COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED)) diff --git a/code/modules/antagonists/heretic/heretic_knowledge.dm b/code/modules/antagonists/heretic/heretic_knowledge.dm index 694cdc3bdbfd6c..419c8457f9b171 100644 --- a/code/modules/antagonists/heretic/heretic_knowledge.dm +++ b/code/modules/antagonists/heretic/heretic_knowledge.dm @@ -68,6 +68,7 @@ * * user - the heretic which we're applying things to */ /datum/heretic_knowledge/proc/on_gain(mob/user) + return /** * Called when the knowledge is removed from a mob, @@ -77,6 +78,7 @@ * * user - the heretic which we're removing things from */ /datum/heretic_knowledge/proc/on_lose(mob/user) + return /** * Determines if a heretic can actually attempt to invoke the knowledge as a ritual. @@ -168,23 +170,26 @@ */ /datum/heretic_knowledge/spell abstract_parent_type = /datum/heretic_knowledge/spell - /// The proc holder spell we add to the heretic. Type-path, becomes an instance via on_research(). - var/obj/effect/proc_holder/spell/spell_to_add - -/datum/heretic_knowledge/spell/Destroy(force, ...) - if(istype(spell_to_add)) - QDEL_NULL(spell_to_add) - return ..() + /// Spell path we add to the heretic. Type-path. + var/datum/action/cooldown/spell/spell_to_add + /// The spell we actually created. + var/datum/weakref/created_spell_ref -/datum/heretic_knowledge/spell/on_research(mob/user) - spell_to_add = new spell_to_add() +/datum/heretic_knowledge/spell/Destroy() + QDEL_NULL(created_spell_ref) return ..() /datum/heretic_knowledge/spell/on_gain(mob/user) - user.mind.AddSpell(spell_to_add) + // Added spells are tracked on the body, and not the mind, + // because we handle heretic mind transfers + // via the antag datum (on_gain and on_lose). + var/datum/action/cooldown/spell/created_spell = created_spell_ref?.resolve() || new spell_to_add(user) + created_spell.Grant(user) + created_spell_ref = WEAKREF(created_spell) /datum/heretic_knowledge/spell/on_lose(mob/user) - user.mind.RemoveSpell(spell_to_add) + var/datum/action/cooldown/spell/created_spell = created_spell_ref?.resolve() + created_spell?.Remove(user) /* * A knowledge subtype for knowledge that can only diff --git a/code/modules/antagonists/heretic/items/heretic_blades.dm b/code/modules/antagonists/heretic/items/heretic_blades.dm index 915b2effd027d3..55a21371be77d1 100644 --- a/code/modules/antagonists/heretic/items/heretic_blades.dm +++ b/code/modules/antagonists/heretic/items/heretic_blades.dm @@ -73,7 +73,7 @@ Unmade, it aspires to be more than it is, and shears soot-filled wounds with a blunt edge." icon_state = "ash_blade" inhand_icon_state = "ash_blade" - after_use_message = "The Nightwater hears your call..." + after_use_message = "The Nightwatcher hears your call..." // Path of Flesh's blade /obj/item/melee/sickly_blade/flesh diff --git a/code/modules/antagonists/heretic/knowledge/ash_lore.dm b/code/modules/antagonists/heretic/knowledge/ash_lore.dm index 9b0b0e5027530d..483d6412200116 100644 --- a/code/modules/antagonists/heretic/knowledge/ash_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/ash_lore.dm @@ -18,7 +18,7 @@ * Curse of Paralysis * * Fiery Blade - * Nightwater's Rebirth + * Nightwatcher's Rebirth * > Sidepaths: * Ashen Ritual * Rusted Ritual @@ -82,7 +82,7 @@ /datum/heretic_knowledge/essence, /datum/heretic_knowledge/medallion, ) - spell_to_add = /obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift/ash + spell_to_add = /datum/action/cooldown/spell/jaunt/ethereal_jaunt/ash cost = 1 route = PATH_ASH @@ -104,8 +104,10 @@ return // Also refunds 75% of charge! - for(var/obj/effect/proc_holder/spell/targeted/touch/mansus_grasp/grasp in source.mind.spell_list) - grasp.charge_counter = min(round(grasp.charge_counter + grasp.charge_max * 0.75), grasp.charge_max) + var/datum/action/cooldown/spell/touch/mansus_grasp/grasp = locate() in source.actions + if(grasp) + grasp.next_use_time = min(round(grasp.next_use_time - grasp.cooldown_time * 0.75, 0), 0) + grasp.UpdateButtons() /datum/heretic_knowledge/knowledge_ritual/ash next_knowledge = list(/datum/heretic_knowledge/mad_mask) @@ -116,7 +118,7 @@ desc = "Allows you to transmute any mask, four candles, a stun baton, and a liver to create a Mask of Madness. \ The mask instills fear into heathens who witness it, causing stamina damage, hallucinations, and insanity. \ It can also be forced onto a heathen, to make them unable to take it off..." - gain_text = "The Nightwater was lost. That's what the Watch believed. Yet he walked the world, unnoticed by the masses." + gain_text = "The Nightwatcher was lost. That's what the Watch believed. Yet he walked the world, unnoticed by the masses." next_knowledge = list( /datum/heretic_knowledge/blade_upgrade/ash, /datum/heretic_knowledge/reroll_targets, @@ -149,18 +151,18 @@ target.ignite_mob() /datum/heretic_knowledge/spell/flame_birth - name = "Nightwater's Rebirth" - desc = "Grants you Nightwater's Rebirth, a spell that extinguishes you and \ + name = "Nightwatcher's Rebirth" + desc = "Grants you Nightwatcher's Rebirth, a spell that extinguishes you and \ burns all nearby heathens who are currently on fire, healing you for every victim afflicted. \ If any victims afflicted are in critical condition, they will also instantly die." gain_text = "The fire was inescapable, and yet, life remained in his charred body. \ - The Nightwater was a particular man, always watching." + The Nightwatcher was a particular man, always watching." next_knowledge = list( /datum/heretic_knowledge/final/ash_final, /datum/heretic_knowledge/summon/ashy, /datum/heretic_knowledge/summon/rusty, ) - spell_to_add = /obj/effect/proc_holder/spell/targeted/fiery_rebirth + spell_to_add = /datum/action/cooldown/spell/aoe/fiery_rebirth cost = 1 route = PATH_ASH @@ -173,7 +175,7 @@ and Oath of Flame, causing you to passively create a ring of flames as you walk. \ You will also become immune to flames, space, and similar environmental hazards." gain_text = "The Watch is dead, the Nightwatcher burned with it. Yet his fire burns evermore, \ - for the Nightwater brought forth the rite to mankind! His gaze continues, as now I am one with the flames, \ + for the Nightwatcher brought forth the rite to mankind! His gaze continues, as now I am one with the flames, \ WITNESS MY ASCENSION, THE ASHY LANTERN BLAZES ONCE MORE!" route = PATH_ASH /// A static list of all traits we apply on ascension. @@ -200,8 +202,13 @@ /datum/heretic_knowledge/final/ash_final/on_finished_recipe(mob/living/user, list/selected_atoms, turf/loc) . = ..() priority_announce("[generate_heretic_text()] Fear the blaze, for the Ashlord, [user.real_name] has ascended! The flames shall consume all! [generate_heretic_text()]","[generate_heretic_text()]", ANNOUNCER_SPANOMALIES) - user.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/fire_cascade/big) - user.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/fire_sworn) + + var/datum/action/cooldown/spell/fire_sworn/circle_spell = new(user.mind) + circle_spell.Grant(user) + + var/datum/action/cooldown/spell/fire_cascade/big/screen_wide_fire_spell = new(user.mind) + screen_wide_fire_spell.Grant(user) + user.client?.give_award(/datum/award/achievement/misc/ash_ascension, user) for(var/trait in traits_to_apply) ADD_TRAIT(user, trait, MAGIC_TRAIT) diff --git a/code/modules/antagonists/heretic/knowledge/blade_lore.dm b/code/modules/antagonists/heretic/knowledge/blade_lore.dm index b107fcfde61ba5..17065104029265 100644 --- a/code/modules/antagonists/heretic/knowledge/blade_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/blade_lore.dm @@ -96,7 +96,7 @@ /datum/heretic_knowledge/blade_dance name = "Dance of the Brand" - desc = "Being attacked while wielding a Darkened Blade in either hand will deliver a riposte \ + desc = "Being attacked while wielding a Heretic Blade in either hand will deliver a riposte \ towards your attacker. This effect can only trigger once every 20 seconds." gain_text = "Having the prowess to wield such a thing requires great dedication and terror." next_knowledge = list( @@ -340,7 +340,7 @@ /datum/heretic_knowledge/final/blade_final, /datum/heretic_knowledge/rifle, ) - spell_to_add = /obj/effect/proc_holder/spell/aimed/furious_steel + spell_to_add = /datum/action/cooldown/spell/pointed/projectile/furious_steel cost = 1 route = PATH_BLADE @@ -374,8 +374,8 @@ RegisterSignal(user, COMSIG_HERETIC_BLADE_ATTACK, .proc/on_eldritch_blade) user.apply_status_effect(/datum/status_effect/protective_blades/recharging, null, 8, 30, 0.25 SECONDS, 1 MINUTES) - var/obj/effect/proc_holder/spell/aimed/furious_steel/steel_spell = locate() in user.mind.spell_list - steel_spell?.charge_max /= 3 + var/datum/action/cooldown/spell/pointed/projectile/furious_steel/steel_spell = locate() in user.actions + steel_spell?.cooldown_time /= 3 /datum/heretic_knowledge/final/blade_final/proc/on_eldritch_blade(mob/living/source, mob/living/target, obj/item/melee/sickly_blade/blade) SIGNAL_HANDLER diff --git a/code/modules/antagonists/heretic/knowledge/flesh_lore.dm b/code/modules/antagonists/heretic/knowledge/flesh_lore.dm index 09b6e601ac85ea..473025e356cf3f 100644 --- a/code/modules/antagonists/heretic/knowledge/flesh_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/flesh_lore.dm @@ -82,22 +82,22 @@ if(LAZYLEN(created_items) >= limit) target.balloon_alert(source, "at ghoul limit!") - return COMPONENT_BLOCK_CHARGE_USE + return COMPONENT_BLOCK_HAND_USE if(HAS_TRAIT(target, TRAIT_HUSK)) target.balloon_alert(source, "husked!") - return COMPONENT_BLOCK_CHARGE_USE + return COMPONENT_BLOCK_HAND_USE if(!IS_VALID_GHOUL_MOB(target)) target.balloon_alert(source, "invalid body!") - return COMPONENT_BLOCK_CHARGE_USE + return COMPONENT_BLOCK_HAND_USE target.grab_ghost() // The grab failed, so they're mindless or playerless. We can't continue if(!target.mind || !target.client) target.balloon_alert(source, "no soul!") - return COMPONENT_BLOCK_CHARGE_USE + return COMPONENT_BLOCK_HAND_USE make_ghoul(source, target) @@ -302,7 +302,10 @@ /datum/heretic_knowledge/final/flesh_final/on_finished_recipe(mob/living/user, list/selected_atoms, turf/loc) . = ..() priority_announce("[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()]", "[generate_heretic_text()]", ANNOUNCER_SPANOMALIES) - user.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/shed_human_form) + + var/datum/action/cooldown/spell/shed_human_form/worm_spell = new(user.mind) + worm_spell.Grant(user) + user.client?.give_award(/datum/award/achievement/misc/flesh_ascension, user) var/datum/antagonist/heretic/heretic_datum = IS_HERETIC(user) diff --git a/code/modules/antagonists/heretic/knowledge/rust_lore.dm b/code/modules/antagonists/heretic/knowledge/rust_lore.dm index 733d5380b2af6e..1da2a83b780d2a 100644 --- a/code/modules/antagonists/heretic/knowledge/rust_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/rust_lore.dm @@ -72,7 +72,7 @@ SIGNAL_HANDLER target.rust_heretic_act() - return COMPONENT_USE_CHARGE + return COMPONENT_USE_HAND /datum/heretic_knowledge/rust_regen name = "Leeching Walk" @@ -153,7 +153,7 @@ /datum/heretic_knowledge/curse/corrosion, /datum/heretic_knowledge/crucible, ) - spell_to_add = /obj/effect/proc_holder/spell/aoe_turf/rust_conversion + spell_to_add = /datum/action/cooldown/spell/aoe/rust_conversion cost = 1 route = PATH_RUST @@ -181,7 +181,7 @@ /datum/heretic_knowledge/final/rust_final, /datum/heretic_knowledge/summon/rusty, ) - spell_to_add = /obj/effect/proc_holder/spell/cone/staggered/entropic_plume + spell_to_add = /datum/action/cooldown/spell/cone/staggered/entropic_plume cost = 1 route = PATH_RUST diff --git a/code/modules/antagonists/heretic/knowledge/side_flesh_void.dm b/code/modules/antagonists/heretic/knowledge/side_flesh_void.dm index 7ec72ecc68d32d..4a315575d61b71 100644 --- a/code/modules/antagonists/heretic/knowledge/side_flesh_void.dm +++ b/code/modules/antagonists/heretic/knowledge/side_flesh_void.dm @@ -29,7 +29,7 @@ /datum/heretic_knowledge/spell/void_phase, /datum/heretic_knowledge/summon/raw_prophet, ) - spell_to_add = /obj/effect/proc_holder/spell/pointed/blood_siphon + spell_to_add = /datum/action/cooldown/spell/pointed/blood_siphon cost = 1 route = PATH_SIDE @@ -43,6 +43,6 @@ /datum/heretic_knowledge/summon/stalker, /datum/heretic_knowledge/spell/void_pull, ) - spell_to_add = /obj/effect/proc_holder/spell/pointed/cleave + spell_to_add = /datum/action/cooldown/spell/pointed/cleave cost = 1 route = PATH_SIDE diff --git a/code/modules/antagonists/heretic/knowledge/side_void_blade.dm b/code/modules/antagonists/heretic/knowledge/side_void_blade.dm index 4a0f993dc544b6..f9445e8516c6bd 100644 --- a/code/modules/antagonists/heretic/knowledge/side_void_blade.dm +++ b/code/modules/antagonists/heretic/knowledge/side_void_blade.dm @@ -112,6 +112,7 @@ sharpness = SHARP_EDGED wound_bonus = -30 bare_wound_bonus = 15 + demolition_mod = 1.5 /obj/item/risen_hand/Initialize(mapload) . = ..() @@ -129,19 +130,6 @@ else icon_state = "[base_icon_state]_left" -/obj/item/risen_hand/pre_attack(atom/hit, mob/living/user, params) - . = ..() - if(.) - return - - // If it's a structure or machine, we get a damage bonus (allowing us to break down doors) - if(isstructure(hit) || ismachinery(hit)) - force = initial(force) * 1.5 - - // If it's another other item make sure we're at normal force - else - force = initial(force) - /datum/heretic_knowledge/rune_carver name = "Carving Knife" desc = "Allows you to transmute a knife, a shard of glass, and a piece of paper to create a Carving Knife. \ diff --git a/code/modules/antagonists/heretic/knowledge/starting_lore.dm b/code/modules/antagonists/heretic/knowledge/starting_lore.dm index afb7c8e260836b..d430d657ecb131 100644 --- a/code/modules/antagonists/heretic/knowledge/starting_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/starting_lore.dm @@ -21,7 +21,7 @@ GLOBAL_LIST_INIT(heretic_start_knowledge, initialize_starting_knowledge()) desc = "Starts your journey into the Mansus. \ Grants you the Mansus Grasp, a powerful and upgradable \ disabling spell that can be cast regardless of having a focus." - spell_to_add = /obj/effect/proc_holder/spell/targeted/touch/mansus_grasp + spell_to_add = /datum/action/cooldown/spell/touch/mansus_grasp cost = 0 route = PATH_START diff --git a/code/modules/antagonists/heretic/knowledge/void_lore.dm b/code/modules/antagonists/heretic/knowledge/void_lore.dm index d7542b55b02cf5..1181b7c82f8897 100644 --- a/code/modules/antagonists/heretic/knowledge/void_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/void_lore.dm @@ -130,7 +130,7 @@ /datum/heretic_knowledge/spell/blood_siphon, /datum/heretic_knowledge/rune_carver, ) - spell_to_add = /obj/effect/proc_holder/spell/pointed/void_phase + spell_to_add = /datum/action/cooldown/spell/pointed/void_phase cost = 1 route = PATH_VOID @@ -163,7 +163,7 @@ /datum/heretic_knowledge/spell/cleave, /datum/heretic_knowledge/summon/maid_in_mirror, ) - spell_to_add = /obj/effect/proc_holder/spell/targeted/void_pull + spell_to_add = /datum/action/cooldown/spell/aoe/void_pull cost = 1 route = PATH_VOID diff --git a/code/modules/antagonists/heretic/magic/aggressive_spread.dm b/code/modules/antagonists/heretic/magic/aggressive_spread.dm index 58591be4a1ffcb..01eca69edbd973 100644 --- a/code/modules/antagonists/heretic/magic/aggressive_spread.dm +++ b/code/modules/antagonists/heretic/magic/aggressive_spread.dm @@ -1,27 +1,38 @@ - -/obj/effect/proc_holder/spell/aoe_turf/rust_conversion +/datum/action/cooldown/spell/aoe/rust_conversion name = "Aggressive Spread" desc = "Spreads rust onto nearby surfaces." - action_icon = 'icons/mob/actions/actions_ecult.dmi' - action_icon_state = "corrode" - action_background_icon_state = "bg_ecult" + background_icon_state = "bg_ecult" + icon_icon = 'icons/mob/actions/actions_ecult.dmi' + button_icon_state = "corrode" + sound = 'sound/items/welder.ogg' + + school = SCHOOL_FORBIDDEN + cooldown_time = 30 SECONDS + invocation = "A'GRSV SPR'D" invocation_type = INVOCATION_WHISPER - school = SCHOOL_FORBIDDEN - charge_max = 300 //twice as long as mansus grasp - clothes_req = FALSE - range = 3 - -/obj/effect/proc_holder/spell/aoe_turf/rust_conversion/cast(list/targets, mob/user = usr) - playsound(user, 'sound/items/welder.ogg', 75, TRUE) - for(var/turf/T in targets) - ///What we want is the 3 tiles around the user and the tile under him to be rusted, so min(dist,1)-1 causes us to get 0 for these tiles, rest of the tiles are based on chance - var/chance = 100 - (max(get_dist(T,user),1)-1)*100/(range+1) - if(!prob(chance)) - continue - T.rust_heretic_act() - -/obj/effect/proc_holder/spell/aoe_turf/rust_conversion/small + spell_requirements = NONE + + aoe_radius = 3 + +/datum/action/cooldown/spell/aoe/rust_conversion/get_things_to_cast_on(atom/center) + var/list/things = list() + for(var/turf/nearby_turf in range(aoe_radius, center)) + things += nearby_turf + + return things + +/datum/action/cooldown/spell/aoe/rust_conversion/cast_on_thing_in_aoe(turf/victim, atom/caster) + // We have less chance of rusting stuff that's further + var/distance_to_caster = get_dist(victim, caster) + var/chance_of_not_rusting = (max(distance_to_caster, 1) - 1) * 100 / (aoe_radius + 1) + + if(prob(chance_of_not_rusting)) + return + + victim.rust_heretic_act() + +/datum/action/cooldown/spell/aoe/rust_conversion/small name = "Rust Conversion" desc = "Spreads rust onto nearby surfaces." - range = 2 + aoe_radius = 2 diff --git a/code/modules/antagonists/heretic/magic/ash_ascension.dm b/code/modules/antagonists/heretic/magic/ash_ascension.dm index e43b7fb4c948b0..4c11c4e84c92c3 100644 --- a/code/modules/antagonists/heretic/magic/ash_ascension.dm +++ b/code/modules/antagonists/heretic/magic/ash_ascension.dm @@ -1,111 +1,129 @@ -/obj/effect/proc_holder/spell/targeted/fire_sworn +/// Creates a constant Ring of Fire around the caster for a set duration of time, which follows them. +/datum/action/cooldown/spell/fire_sworn name = "Oath of Flame" desc = "For a minute, you will passively create a ring of fire around you." - action_icon = 'icons/mob/actions/actions_ecult.dmi' - action_icon_state = "fire_ring" - action_background_icon_state = "bg_ecult" + background_icon_state = "bg_ecult" + icon_icon = 'icons/mob/actions/actions_ecult.dmi' + button_icon_state = "fire_ring" + + school = SCHOOL_FORBIDDEN + cooldown_time = 70 SECONDS + invocation = "FL'MS" invocation_type = INVOCATION_WHISPER - school = SCHOOL_FORBIDDEN - clothes_req = FALSE - range = -1 - include_user = TRUE - charge_max = 700 - ///how long it lasts + spell_requirements = NONE + + /// The radius of the fire ring + var/fire_radius = 1 + /// How long it the ring lasts var/duration = 1 MINUTES - ///who casted it right now - var/mob/current_user - ///Determines if you get the fire ring effect - var/has_fire_ring = FALSE -/obj/effect/proc_holder/spell/targeted/fire_sworn/cast(list/targets, mob/user) - . = ..() - current_user = user - has_fire_ring = TRUE - addtimer(CALLBACK(src, .proc/remove, user), duration, TIMER_OVERRIDE|TIMER_UNIQUE) +/datum/action/cooldown/spell/fire_sworn/Remove(mob/living/remove_from) + remove_from.remove_status_effect(/datum/status_effect/fire_ring) + return ..() -/obj/effect/proc_holder/spell/targeted/fire_sworn/proc/remove() - has_fire_ring = FALSE - current_user = null +/datum/action/cooldown/spell/fire_sworn/is_valid_target(atom/cast_on) + return isliving(cast_on) -/obj/effect/proc_holder/spell/targeted/fire_sworn/process(delta_time) +/datum/action/cooldown/spell/fire_sworn/cast(mob/living/cast_on) . = ..() - if(!has_fire_ring) - return - if(current_user.stat == DEAD) - remove() + cast_on.apply_status_effect(/datum/status_effect/fire_ring, duration, fire_radius) + +/// Simple status effect for adding a ring of fire around a mob. +/datum/status_effect/fire_ring + id = "fire_ring" + tick_interval = 0.1 SECONDS + status_type = STATUS_EFFECT_REFRESH + alert_type = null + /// The radius of the ring around us. + var/ring_radius = 1 + +/datum/status_effect/fire_ring/on_creation(mob/living/new_owner, duration = 1 MINUTES, radius = 1) + src.duration = duration + src.ring_radius = radius + return ..() + +/datum/status_effect/fire_ring/tick(delta_time, times_fired) + if(QDELETED(owner) || owner.stat == DEAD) + qdel(src) return - if(!isturf(current_user.loc)) + + if(!isturf(owner.loc)) return - for(var/turf/nearby_turf as anything in RANGE_TURFS(1, current_user)) + for(var/turf/nearby_turf as anything in RANGE_TURFS(1, owner)) new /obj/effect/hotspot(nearby_turf) nearby_turf.hotspot_expose(750, 25 * delta_time, 1) - for(var/mob/living/fried_living in nearby_turf.contents - current_user) - fried_living.adjustFireLoss(2.5 * delta_time) + for(var/mob/living/fried_living in nearby_turf.contents - owner) + fried_living.apply_damage(2.5 * delta_time, BURN) -/obj/effect/proc_holder/spell/aoe_turf/fire_cascade - name = "Fire Cascade" +/// Creates one, large, expanding ring of fire around the caster, which does not follow them. +/datum/action/cooldown/spell/fire_cascade + name = "Lesser Fire Cascade" desc = "Heats the air around you." + background_icon_state = "bg_ecult" + icon_icon = 'icons/mob/actions/actions_ecult.dmi' + button_icon_state = "fire_ring" + sound = 'sound/items/welder.ogg' + school = SCHOOL_FORBIDDEN - charge_max = 300 //twice as long as mansus grasp - clothes_req = FALSE + cooldown_time = 30 SECONDS + invocation = "C'SC'DE" invocation_type = INVOCATION_WHISPER - range = 4 - action_icon = 'icons/mob/actions/actions_ecult.dmi' - action_icon_state = "fire_ring" - action_background_icon_state = "bg_ecult" - -/obj/effect/proc_holder/spell/aoe_turf/fire_cascade/cast(list/targets, mob/user = usr) - INVOKE_ASYNC(src, .proc/fire_cascade, user, range) - -/obj/effect/proc_holder/spell/aoe_turf/fire_cascade/proc/fire_cascade(atom/centre, max_range) - playsound(get_turf(centre), 'sound/items/welder.ogg', 75, TRUE) - var/current_range = 1 - for(var/i in 0 to max_range) - for(var/turf/nearby_turf as anything in spiral_range_turfs(current_range, centre)) + spell_requirements = NONE + + /// The radius the flames will go around the caster. + var/flame_radius = 4 + +/datum/action/cooldown/spell/fire_cascade/cast(atom/cast_on) + . = ..() + INVOKE_ASYNC(src, .proc/fire_cascade, get_turf(cast_on), flame_radius) + +/// Spreads a huge wave of fire in a radius around us, staggered between levels +/datum/action/cooldown/spell/fire_cascade/proc/fire_cascade(atom/centre, flame_radius = 1) + for(var/i in 0 to flame_radius) + for(var/turf/nearby_turf as anything in spiral_range_turfs(i + 1, centre)) new /obj/effect/hotspot(nearby_turf) nearby_turf.hotspot_expose(750, 50, 1) for(var/mob/living/fried_living in nearby_turf.contents - centre) - fried_living.adjustFireLoss(5) + fried_living.apply_damage(5, BURN) - current_range++ stoplag(0.3 SECONDS) -/obj/effect/proc_holder/spell/aoe_turf/fire_cascade/big - range = 6 +/datum/action/cooldown/spell/fire_cascade/big + name = "Greater Fire Cascade" + flame_radius = 6 -// Currently unused. -/obj/effect/proc_holder/spell/pointed/ash_final +// Currently unused - releases streams of fire around the caster. +/datum/action/cooldown/spell/pointed/ash_beams name = "Nightwatcher's Rite" - desc = "A powerful spell that releases 5 streams of fire away from you." - action_icon = 'icons/mob/actions/actions_ecult.dmi' - action_icon_state = "flames" - action_background_icon_state = "bg_ecult" + desc = "A powerful spell that releases five streams of eldritch fire towards the target." + background_icon_state = "bg_ecult" + icon_icon = 'icons/mob/actions/actions_ecult.dmi' + button_icon_state = "flames" + ranged_mousepointer = 'icons/effects/mouse_pointers/throw_target.dmi' + + school = SCHOOL_FORBIDDEN + cooldown_time = 300 + invocation = "F'RE" invocation_type = INVOCATION_WHISPER - school = SCHOOL_FORBIDDEN - charge_max = 300 - range = 15 - clothes_req = FALSE - -/obj/effect/proc_holder/spell/pointed/ash_final/cast(list/targets, mob/user) - for(var/X in targets) - var/T - T = line_target(-25, range, X, user) - INVOKE_ASYNC(src, .proc/fire_line, user, T) - T = line_target(10, range, X, user) - INVOKE_ASYNC(src, .proc/fire_line, user, T) - T = line_target(0, range, X, user) - INVOKE_ASYNC(src, .proc/fire_line, user, T) - T = line_target(-10, range, X, user) - INVOKE_ASYNC(src, .proc/fire_line, user, T) - T = line_target(25, range, X, user) - INVOKE_ASYNC(src, .proc/fire_line, user, T) - return ..() + spell_requirements = NONE + + /// The length of the flame line spit out. + var/flame_line_length = 15 + +/datum/action/cooldown/spell/pointed/ash_beams/is_valid_target(atom/cast_on) + return TRUE + +/datum/action/cooldown/spell/pointed/ash_beams/cast(atom/target) + . = ..() + var/static/list/offsets = list(-25, -10, 0, 10, 25) + for(var/offset in offsets) + INVOKE_ASYNC(src, .proc/fire_line, owner, line_target(offset, flame_line_length, target, owner)) -/obj/effect/proc_holder/spell/pointed/ash_final/proc/line_target(offset, range, atom/at , atom/user) +/datum/action/cooldown/spell/pointed/ash_beams/proc/line_target(offset, range, atom/at, atom/user) if(!at) return var/angle = ATAN2(at.x - user.x, at.y - user.y) + offset @@ -117,7 +135,7 @@ T = check return (get_line(user, T) - get_turf(user)) -/obj/effect/proc_holder/spell/pointed/ash_final/proc/fire_line(atom/source, list/turfs) +/datum/action/cooldown/spell/pointed/ash_beams/proc/fire_line(atom/source, list/turfs) var/list/hit_list = list() for(var/turf/T in turfs) if(istype(T, /turf/closed)) diff --git a/code/modules/antagonists/heretic/magic/ash_jaunt.dm b/code/modules/antagonists/heretic/magic/ash_jaunt.dm index 9d77924f66a00a..9c0d403fb23e8e 100644 --- a/code/modules/antagonists/heretic/magic/ash_jaunt.dm +++ b/code/modules/antagonists/heretic/magic/ash_jaunt.dm @@ -1,32 +1,38 @@ -/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift/ash +/datum/action/cooldown/spell/jaunt/ethereal_jaunt/ash name = "Ashen Passage" desc = "A short range spell that allows you to pass unimpeded through walls." - action_icon = 'icons/mob/actions/actions_ecult.dmi' - action_icon_state = "ash_shift" - action_background_icon_state = "bg_ecult" + background_icon_state = "bg_ecult" + icon_icon = 'icons/mob/actions/actions_ecult.dmi' + button_icon_state = "ash_shift" + sound = null + + school = SCHOOL_FORBIDDEN + cooldown_time = 15 SECONDS + invocation = "ASH'N P'SSG'" invocation_type = INVOCATION_WHISPER - school = SCHOOL_FORBIDDEN - charge_max = 150 - range = -1 - jaunt_in_time = 13 - jaunt_duration = 10 + spell_requirements = NONE + + exit_jaunt_sound = null + jaunt_duration = 1.1 SECONDS + jaunt_in_time = 1.3 SECONDS + jaunt_out_time = 0.6 SECONDS jaunt_in_type = /obj/effect/temp_visual/dir_setting/ash_shift jaunt_out_type = /obj/effect/temp_visual/dir_setting/ash_shift/out -/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift/ash/long +/datum/action/cooldown/spell/jaunt/ethereal_jaunt/ash/do_steam_effects() + return + +/datum/action/cooldown/spell/jaunt/ethereal_jaunt/ash/long name = "Ashen Walk" desc = "A long range spell that allows you pass unimpeded through multiple walls." jaunt_duration = 5 SECONDS -/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift/ash/play_sound() - return - /obj/effect/temp_visual/dir_setting/ash_shift name = "ash_shift" icon = 'icons/mob/mob.dmi' icon_state = "ash_shift2" - duration = 13 + duration = 1.3 SECONDS /obj/effect/temp_visual/dir_setting/ash_shift/out icon_state = "ash_shift" diff --git a/code/modules/antagonists/heretic/magic/blood_cleave.dm b/code/modules/antagonists/heretic/magic/blood_cleave.dm index 7917b26758ac83..574c967b9afb9a 100644 --- a/code/modules/antagonists/heretic/magic/blood_cleave.dm +++ b/code/modules/antagonists/heretic/magic/blood_cleave.dm @@ -1,28 +1,33 @@ -/obj/effect/proc_holder/spell/pointed/cleave +/datum/action/cooldown/spell/pointed/cleave name = "Cleave" desc = "Causes severe bleeding on a target and several targets around them." - action_icon = 'icons/mob/actions/actions_ecult.dmi' - action_icon_state = "cleave" - action_background_icon_state = "bg_ecult" + background_icon_state = "bg_ecult" + icon_icon = 'icons/mob/actions/actions_ecult.dmi' + button_icon_state = "cleave" + ranged_mousepointer = 'icons/effects/mouse_pointers/throw_target.dmi' + + school = SCHOOL_FORBIDDEN + cooldown_time = 35 SECONDS + invocation = "CL'VE" invocation_type = INVOCATION_WHISPER - school = SCHOOL_FORBIDDEN - charge_max = 350 - clothes_req = FALSE - range = 9 - -/obj/effect/proc_holder/spell/pointed/cleave/cast(list/targets, mob/user) - if(!targets.len) - user.balloon_alert(user, "no targets!") - return FALSE - if(!can_target(targets[1], user)) - return FALSE - - for(var/mob/living/carbon/human/nearby_human in range(1, targets[1])) - targets |= nearby_human - - for(var/mob/living/carbon/human/victim as anything in targets) - if(victim == user) + spell_requirements = NONE + + cast_range = 9 + /// The radius of the cleave effect + var/cleave_radius = 1 + +/datum/action/cooldown/spell/pointed/cleave/is_valid_target(atom/cast_on) + return ..() && ishuman(cast_on) + +/datum/action/cooldown/spell/pointed/cleave/cast(mob/living/carbon/human/cast_on) + . = ..() + var/list/mob/living/carbon/human/nearby = list(cast_on) + for(var/mob/living/carbon/human/nearby_human in range(cleave_radius, cast_on)) + nearby += nearby_human + + for(var/mob/living/carbon/human/victim as anything in nearby) + if(victim == owner) continue if(victim.can_block_magic()) victim.visible_message( @@ -42,18 +47,15 @@ var/obj/item/bodypart/bodypart = pick(victim.bodyparts) var/datum/wound/slash/critical/crit_wound = new() crit_wound.apply_wound(bodypart) - victim.adjustFireLoss(20) + victim.apply_damage(20, BURN, wound_bonus = CANT_WOUND) + new /obj/effect/temp_visual/cleave(victim.drop_location()) -/obj/effect/proc_holder/spell/pointed/cleave/can_target(atom/target, mob/user, silent) - if(!ishuman(target)) - if(!silent) - target.balloon_alert(user, "invalid target!") - return FALSE return TRUE -/obj/effect/proc_holder/spell/pointed/cleave/long - charge_max = 650 +/datum/action/cooldown/spell/pointed/cleave/long + name = "Lesser Cleave" + cooldown_time = 65 SECONDS /obj/effect/temp_visual/cleave icon = 'icons/effects/eldritch.dmi' diff --git a/code/modules/antagonists/heretic/magic/blood_siphon.dm b/code/modules/antagonists/heretic/magic/blood_siphon.dm index 30c1c9de2e593e..406d3123d78236 100644 --- a/code/modules/antagonists/heretic/magic/blood_siphon.dm +++ b/code/modules/antagonists/heretic/magic/blood_siphon.dm @@ -1,51 +1,59 @@ -/obj/effect/proc_holder/spell/pointed/blood_siphon +/datum/action/cooldown/spell/pointed/blood_siphon name = "Blood Siphon" - desc = "A touch spell that heals your wounds while damaging the enemy. It has a chance to transfer wounds between you and your enemy." - action_icon = 'icons/mob/actions/actions_ecult.dmi' - action_icon_state = "blood_siphon" - action_background_icon_state = "bg_ecult" + desc = "A touch spell that heals your wounds while damaging the enemy. \ + It has a chance to transfer wounds between you and your enemy." + background_icon_state = "bg_ecult" + icon_icon = 'icons/mob/actions/actions_ecult.dmi' + button_icon_state = "blood_siphon" + ranged_mousepointer = 'icons/effects/mouse_pointers/throw_target.dmi' + + school = SCHOOL_FORBIDDEN + cooldown_time = 15 SECONDS + invocation = "FL'MS O'ET'RN'ITY" invocation_type = INVOCATION_WHISPER - school = SCHOOL_EVOCATION - charge_max = 150 - clothes_req = FALSE - range = 9 + spell_requirements = NONE + + cast_range = 9 -/obj/effect/proc_holder/spell/pointed/blood_siphon/cast(list/targets, mob/user) - if(!isliving(user)) - return +/datum/action/cooldown/spell/pointed/blood_siphon/can_cast_spell(feedback = TRUE) + return ..() && isliving(owner) - var/mob/living/real_target = targets[1] - var/mob/living/living_user = user - playsound(user, 'sound/magic/demon_attack1.ogg', 75, TRUE) - if(real_target.can_block_magic()) - user.balloon_alert(user, "spell blocked!") - real_target.visible_message( - span_danger("The spell bounces off of [real_target]!"), +/datum/action/cooldown/spell/pointed/blood_siphon/is_valid_target(atom/cast_on) + return ..() && isliving(cast_on) + +/datum/action/cooldown/spell/pointed/blood_siphon/cast(mob/living/cast_on) + . = ..() + playsound(owner, 'sound/magic/demon_attack1.ogg', 75, TRUE) + if(cast_on.can_block_magic()) + owner.balloon_alert(owner, "spell blocked!") + cast_on.visible_message( + span_danger("The spell bounces off of [cast_on]!"), span_danger("The spell bounces off of you!"), ) - return + return FALSE - real_target.visible_message( - span_danger("[real_target] turns pale as a red glow envelops [real_target.p_them()]!"), + cast_on.visible_message( + span_danger("[cast_on] turns pale as a red glow envelops [cast_on.p_them()]!"), span_danger("You pale as a red glow enevelops you!"), ) - real_target.adjustBruteLoss(20) - living_user.adjustBruteLoss(-20) + var/mob/living/living_owner = owner + cast_on.adjustBruteLoss(20) + living_owner.adjustBruteLoss(-20) - if(!living_user.blood_volume) - return + if(!cast_on.blood_volume || !living_owner.blood_volume) + return TRUE - real_target.blood_volume -= 20 - if(living_user.blood_volume < BLOOD_VOLUME_MAXIMUM) // we dont want to explode from casting - living_user.blood_volume += 20 + cast_on.blood_volume -= 20 + if(living_owner.blood_volume < BLOOD_VOLUME_MAXIMUM) // we dont want to explode from casting + living_owner.blood_volume += 20 - if(!iscarbon(real_target)) - return + if(!iscarbon(cast_on) || !iscarbon(owner)) + return TRUE - var/mob/living/carbon/carbon_target = real_target - var/mob/living/carbon/carbon_user = living_user + var/mob/living/carbon/carbon_target = cast_on + var/mob/living/carbon/carbon_user = owner for(var/obj/item/bodypart/bodypart as anything in carbon_user.bodyparts) for(var/datum/wound/iter_wound as anything in bodypart.wounds) if(prob(50)) @@ -56,9 +64,4 @@ iter_wound.remove_wound() iter_wound.apply_wound(target_bodypart) -/obj/effect/proc_holder/spell/pointed/blood_siphon/can_target(atom/target, mob/user, silent) - if(!isliving(target)) - if(!silent) - target.balloon_alert(user, "invalid target!") - return FALSE return TRUE diff --git a/code/modules/antagonists/heretic/magic/eldritch_blind.dm b/code/modules/antagonists/heretic/magic/eldritch_blind.dm index 34fd2d972bdaf7..195af5e60891d4 100644 --- a/code/modules/antagonists/heretic/magic/eldritch_blind.dm +++ b/code/modules/antagonists/heretic/magic/eldritch_blind.dm @@ -1,5 +1,9 @@ // Given to heretic monsters. -/obj/effect/proc_holder/spell/pointed/trigger/blind/eldritch - action_background_icon_state = "bg_ecult" +/datum/action/cooldown/spell/pointed/blind/eldritch + name = "Eldritch Blind" + background_icon_state = "bg_ecult" + + school = SCHOOL_FORBIDDEN invocation = "E'E'S" - range = 10 + + cast_range = 10 diff --git a/code/modules/antagonists/heretic/magic/eldritch_emplosion.dm b/code/modules/antagonists/heretic/magic/eldritch_emplosion.dm index f2e8e22249d8b8..d2424126b91889 100644 --- a/code/modules/antagonists/heretic/magic/eldritch_emplosion.dm +++ b/code/modules/antagonists/heretic/magic/eldritch_emplosion.dm @@ -1,13 +1,14 @@ // Given to heretic monsters. -/obj/effect/proc_holder/spell/targeted/emplosion/eldritch +/datum/action/cooldown/spell/emp/eldritch name = "Energetic Pulse" - action_background_icon_state = "bg_ecult" + background_icon_state = "bg_ecult" + + school = SCHOOL_FORBIDDEN + cooldown_time = 30 SECONDS + invocation = "E'P" invocation_type = INVOCATION_WHISPER - school = SCHOOL_FORBIDDEN - clothes_req = FALSE - range = -1 - include_user = TRUE - charge_max = 300 + spell_requirements = NONE + emp_heavy = 6 emp_light = 10 diff --git a/code/modules/antagonists/heretic/magic/eldritch_shapeshift.dm b/code/modules/antagonists/heretic/magic/eldritch_shapeshift.dm index 31dbc0f174823f..9265a8e4f22160 100644 --- a/code/modules/antagonists/heretic/magic/eldritch_shapeshift.dm +++ b/code/modules/antagonists/heretic/magic/eldritch_shapeshift.dm @@ -1,9 +1,10 @@ // Given to heretic monsters. -/obj/effect/proc_holder/spell/targeted/shapeshift/eldritch - action_background_icon_state = "bg_ecult" +/datum/action/cooldown/spell/shapeshift/eldritch + school = SCHOOL_FORBIDDEN + background_icon_state = "bg_ecult" invocation = "SH'PE" invocation_type = INVOCATION_WHISPER - clothes_req = FALSE + possible_shapes = list( /mob/living/simple_animal/mouse, /mob/living/simple_animal/pet/dog/corgi, diff --git a/code/modules/antagonists/heretic/magic/eldritch_telepathy.dm b/code/modules/antagonists/heretic/magic/eldritch_telepathy.dm index 16c6055571c161..d4a70d81cc001e 100644 --- a/code/modules/antagonists/heretic/magic/eldritch_telepathy.dm +++ b/code/modules/antagonists/heretic/magic/eldritch_telepathy.dm @@ -1,7 +1,7 @@ // Given to heretic monsters. -/obj/effect/proc_holder/spell/targeted/telepathy/eldritch - action_background_icon_state = "bg_ecult" - invocation = "" - invocation_type = INVOCATION_WHISPER - clothes_req = FALSE - antimagic_flags = MAGIC_RESISTANCE_MIND +/datum/action/cooldown/spell/list_target/telepathy/eldritch + name = "Eldritch Telepathy" + school = SCHOOL_FORBIDDEN + background_icon_state = "bg_ecult" + invocation_type = INVOCATION_NONE + antimagic_flags = MAGIC_RESISTANCE|MAGIC_RESISTANCE_MIND diff --git a/code/modules/antagonists/heretic/magic/flesh_ascension.dm b/code/modules/antagonists/heretic/magic/flesh_ascension.dm index 10f0d4eea57705..7cb5913c1c7163 100644 --- a/code/modules/antagonists/heretic/magic/flesh_ascension.dm +++ b/code/modules/antagonists/heretic/magic/flesh_ascension.dm @@ -1,66 +1,72 @@ -/obj/effect/proc_holder/spell/targeted/shed_human_form +/datum/action/cooldown/spell/shed_human_form name = "Shed form" - desc = "Shed your fragile form, become one with the arms, become one with the emperor." - action_icon = 'icons/mob/actions/actions_ecult.dmi' - action_icon_state = "worm_ascend" + desc = "Shed your fragile form, become one with the arms, become one with the emperor. \ + Causes heavy amounts of brain damage and sanity loss to nearby mortals." + background_icon_state = "bg_ecult" + icon_icon = 'icons/mob/actions/actions_ecult.dmi' + button_icon_state = "worm_ascend" + + school = SCHOOL_FORBIDDEN + cooldown_time = 10 SECONDS + invocation = "REALITY UNCOIL!" invocation_type = INVOCATION_SHOUT - school = SCHOOL_FORBIDDEN - clothes_req = FALSE - action_background_icon_state = "bg_ecult" - range = -1 - include_user = TRUE - charge_max = 100 + spell_requirements = NONE + /// The length of our new wormy when we shed. var/segment_length = 10 + /// The radius around us that we cause brain damage / sanity damage to. + var/scare_radius = 9 -/obj/effect/proc_holder/spell/targeted/shed_human_form/cast(list/targets, mob/user) +/datum/action/cooldown/spell/shed_human_form/is_valid_target(atom/cast_on) + return isliving(cast_on) + +/datum/action/cooldown/spell/shed_human_form/cast(mob/living/cast_on) . = ..() - var/mob/living/target = user - var/mob/living/mob_inside = locate() in target.contents - target - - if(!mob_inside) - var/mob/living/simple_animal/hostile/heretic_summon/armsy/prime/outside = new(user.loc, TRUE, segment_length) - target.mind.transfer_to(outside, TRUE) - target.forceMove(outside) - target.apply_status_effect(/datum/status_effect/grouped/stasis, STASIS_ASCENSION_EFFECT) - for(var/mob/living/carbon/human/nearby_human in view(9, outside) - target) + if(istype(cast_on, /mob/living/simple_animal/hostile/heretic_summon/armsy/prime)) + var/mob/living/simple_animal/hostile/heretic_summon/armsy/prime/old_armsy = cast_on + var/mob/living/our_heretic = locate() in old_armsy + + if(our_heretic.remove_status_effect(/datum/status_effect/grouped/stasis, STASIS_ASCENSION_EFFECT)) + our_heretic.forceMove(old_armsy.loc) + + old_armsy.mind.transfer_to(our_heretic, TRUE) + segment_length = old_armsy.get_length() + qdel(old_armsy) + + else + var/mob/living/simple_animal/hostile/heretic_summon/armsy/prime/new_armsy = new(cast_on.loc, TRUE, segment_length) + + cast_on.mind.transfer_to(new_armsy, TRUE) + cast_on.forceMove(new_armsy) + cast_on.apply_status_effect(/datum/status_effect/grouped/stasis, STASIS_ASCENSION_EFFECT) + + // They see the very reality uncoil before their eyes. + for(var/mob/living/carbon/human/nearby_human in view(scare_radius, new_armsy)) if(IS_HERETIC_OR_MONSTER(nearby_human)) continue SEND_SIGNAL(nearby_human, COMSIG_ADD_MOOD_EVENT, "gates_of_mansus", /datum/mood_event/gates_of_mansus) - ///They see the very reality uncoil before their eyes. + if(prob(25)) - var/trauma = pick(subtypesof(BRAIN_TRAUMA_MILD) + subtypesof(BRAIN_TRAUMA_SEVERE)) - nearby_human.gain_trauma(new trauma(), TRAUMA_RESILIENCE_LOBOTOMY) - return - - if(iscarbon(mob_inside)) - var/mob/living/simple_animal/hostile/heretic_summon/armsy/prime/armsy = target - if(mob_inside.remove_status_effect(/datum/status_effect/grouped/stasis, STASIS_ASCENSION_EFFECT)) - mob_inside.forceMove(armsy.loc) - armsy.mind.transfer_to(mob_inside, TRUE) - segment_length = armsy.get_length() - qdel(armsy) - return - -/obj/effect/proc_holder/spell/targeted/worm_contract + var/datum/brain_trauma/trauma = pick(subtypesof(BRAIN_TRAUMA_MILD) + subtypesof(BRAIN_TRAUMA_SEVERE)) + nearby_human.gain_trauma(trauma, TRAUMA_RESILIENCE_LOBOTOMY) + +/datum/action/cooldown/spell/worm_contract name = "Force Contract" desc = "Forces your body to contract onto a single tile." - invocation_type = INVOCATION_NONE + background_icon_state = "bg_ecult" + icon_icon = 'icons/mob/actions/actions_ecult.dmi' + button_icon_state = "worm_contract" + school = SCHOOL_FORBIDDEN - clothes_req = FALSE - action_background_icon_state = "bg_ecult" - range = -1 - include_user = TRUE - charge_max = 300 - action_icon = 'icons/mob/actions/actions_ecult.dmi' - action_icon_state = "worm_contract" - -/obj/effect/proc_holder/spell/targeted/worm_contract/cast(list/targets, mob/user) - . = ..() - if(!istype(user, /mob/living/simple_animal/hostile/heretic_summon/armsy)) - to_chat(user, span_userdanger("You try to contract your muscles, but nothing happens...")) - return + cooldown_time = 30 SECONDS + + invocation_type = INVOCATION_NONE + spell_requirements = NONE - var/mob/living/simple_animal/hostile/heretic_summon/armsy/lord_of_night = user - lord_of_night.contract_next_chain_into_single_tile() +/datum/action/cooldown/spell/worm_contract/is_valid_target(atom/cast_on) + return istype(cast_on, /mob/living/simple_animal/hostile/heretic_summon/armsy) + +/datum/action/cooldown/spell/worm_contract/cast(mob/living/simple_animal/hostile/heretic_summon/armsy/cast_on) + . = ..() + cast_on.contract_next_chain_into_single_tile() diff --git a/code/modules/antagonists/heretic/magic/furious_steel.dm b/code/modules/antagonists/heretic/magic/furious_steel.dm index 8f74329239c75c..2fc6322e4f18c8 100644 --- a/code/modules/antagonists/heretic/magic/furious_steel.dm +++ b/code/modules/antagonists/heretic/magic/furious_steel.dm @@ -1,68 +1,96 @@ -/obj/effect/proc_holder/spell/aimed/furious_steel +/datum/action/cooldown/spell/pointed/projectile/furious_steel name = "Furious Steel" desc = "Summon three silver blades which orbit you. \ While orbiting you, these blades will protect you from from attacks, but will be consumed on use. \ Additionally, you can click to fire the blades at a target, dealing damage and causing bleeding." - action_icon = 'icons/mob/actions/actions_ecult.dmi' - action_icon_state = "furious_steel0" - action_background_icon_state = "bg_ecult" - base_icon_state = "furious_steel" + background_icon_state = "bg_ecult" + icon_icon = 'icons/mob/actions/actions_ecult.dmi' + button_icon_state = "furious_steel0" + sound = 'sound/weapons/guillotine.ogg' + + school = SCHOOL_FORBIDDEN + cooldown_time = 30 SECONDS invocation = "F'LSH'NG S'LV'R!" invocation_type = INVOCATION_SHOUT - school = SCHOOL_FORBIDDEN - clothes_req = FALSE - charge_max = 30 SECONDS - range = 20 - projectile_amount = 3 - projectiles_per_fire = 1 - projectile_type = /obj/projectile/floating_blade - sound = 'sound/weapons/guillotine.ogg' + + spell_requirements = NONE + + base_icon_state = "furious_steel" active_msg = "You summon forth three blades of furious silver." deactive_msg = "You conceal the blades of furious silver." + cast_range = 20 + projectile_type = /obj/projectile/floating_blade + projectile_amount = 3 + /// A ref to the status effect surrounding our heretic on activation. var/datum/status_effect/protective_blades/blade_effect -/obj/effect/proc_holder/spell/aimed/furious_steel/Destroy() - QDEL_NULL(blade_effect) +/datum/action/cooldown/spell/pointed/projectile/furious_steel/Grant(mob/grant_to) + . = ..() + if(!owner) + return + + if(IS_HERETIC(owner)) + RegisterSignal(owner, SIGNAL_REMOVETRAIT(TRAIT_ALLOW_HERETIC_CASTING), .proc/on_focus_lost) + +/datum/action/cooldown/spell/pointed/projectile/furious_steel/Remove(mob/remove_from) + UnregisterSignal(remove_from, SIGNAL_REMOVETRAIT(TRAIT_ALLOW_HERETIC_CASTING)) return ..() -/obj/effect/proc_holder/spell/aimed/furious_steel/on_activation(mob/user) - if(!isliving(user)) +/// Signal proc for [SIGNAL_REMOVETRAIT], via [TRAIT_ALLOW_HERETIC_CASTING], to remove the effect when we lose the focus trait +/datum/action/cooldown/spell/pointed/projectile/furious_steel/proc/on_focus_lost(mob/source) + SIGNAL_HANDLER + + unset_click_ability(source, refund_cooldown = TRUE) + +/datum/action/cooldown/spell/pointed/projectile/furious_steel/InterceptClickOn(mob/living/caller, params, atom/click_target) + // Let the caster prioritize using items like guns over blade casts + if(caller.get_active_held_item()) + return FALSE + // Let the caster prioritize melee attacks like punches and shoves over blade casts + if(get_dist(caller, click_target) <= 1) + return FALSE + + return ..() + +/datum/action/cooldown/spell/pointed/projectile/furious_steel/on_activation(mob/on_who) + . = ..() + if(!.) return - var/mob/living/living_user = user - // Aimed spells snowflake and activate without checking cast_check, very cool - var/datum/antagonist/heretic/our_heretic = IS_HERETIC(living_user) - if(our_heretic && !our_heretic.ascended && !HAS_TRAIT(living_user, TRAIT_ALLOW_HERETIC_CASTING)) - user.balloon_alert(living_user, "you need a focus!") + + if(!isliving(on_who)) return + // Delete existing + if(blade_effect) + stack_trace("[type] had an existing blade effect in on_activation. This might be an exploit, and should be investigated.") + UnregisterSignal(blade_effect, COMSIG_PARENT_QDELETING) + QDEL_NULL(blade_effect) - . = ..() - blade_effect = living_user.apply_status_effect(/datum/status_effect/protective_blades, null, 3, 25, 0.66 SECONDS) + var/mob/living/living_user = on_who + blade_effect = living_user.apply_status_effect(/datum/status_effect/protective_blades, null, projectile_amount, 25, 0.66 SECONDS) RegisterSignal(blade_effect, COMSIG_PARENT_QDELETING, .proc/on_status_effect_deleted) -/obj/effect/proc_holder/spell/aimed/furious_steel/on_deactivation(mob/user) +/datum/action/cooldown/spell/pointed/projectile/furious_steel/on_deactivation(mob/on_who, refund_cooldown = TRUE) . = ..() QDEL_NULL(blade_effect) -/obj/effect/proc_holder/spell/aimed/furious_steel/InterceptClickOn(mob/living/caller, params, atom/target) - if(get_dist(caller, target) <= 1) // Let the caster prioritize melee attacks over blade casts - return FALSE - return ..() - -/obj/effect/proc_holder/spell/aimed/furious_steel/cast(list/targets, mob/living/user) +/datum/action/cooldown/spell/pointed/projectile/furious_steel/before_cast(atom/cast_on) if(isnull(blade_effect) || !length(blade_effect.blades)) - return FALSE + unset_click_ability(owner, refund_cooldown = TRUE) + return SPELL_CANCEL_CAST + return ..() -/obj/effect/proc_holder/spell/aimed/furious_steel/ready_projectile(obj/projectile/to_launch, atom/target, mob/user, iteration) +/datum/action/cooldown/spell/pointed/projectile/furious_steel/fire_projectile(mob/living/user, atom/target) . = ..() - to_launch.def_zone = check_zone(user.zone_selected) + qdel(blade_effect.blades[1]) -/obj/effect/proc_holder/spell/aimed/furious_steel/fire_projectile(mob/living/user, atom/target) +/datum/action/cooldown/spell/pointed/projectile/furious_steel/ready_projectile(obj/projectile/to_launch, atom/target, mob/user, iteration) . = ..() - qdel(blade_effect.blades[1]) + to_launch.def_zone = check_zone(user.zone_selected) -/obj/effect/proc_holder/spell/aimed/furious_steel/proc/on_status_effect_deleted(datum/source) +/// If our blade status effect is deleted, clear our refs and deactivate +/datum/action/cooldown/spell/pointed/projectile/furious_steel/proc/on_status_effect_deleted(datum/status_effect/protective_blades/source) SIGNAL_HANDLER blade_effect = null diff --git a/code/modules/antagonists/heretic/magic/madness_touch.dm b/code/modules/antagonists/heretic/magic/madness_touch.dm index 240dee710ea08b..ac9e2b3b87cd4a 100644 --- a/code/modules/antagonists/heretic/magic/madness_touch.dm +++ b/code/modules/antagonists/heretic/magic/madness_touch.dm @@ -1,32 +1,32 @@ -// Currently unused -/obj/effect/proc_holder/spell/pointed/touch/mad_touch +// Currently unused. +/datum/action/cooldown/spell/touch/mad_touch name = "Touch of Madness" desc = "A touch spell that drains your enemy's sanity." - action_icon = 'icons/mob/actions/actions_ecult.dmi' - action_icon_state = "mad_touch" - action_background_icon_state = "bg_ecult" + background_icon_state = "bg_ecult" + icon_icon = 'icons/mob/actions/actions_ecult.dmi' + button_icon_state = "mad_touch" + school = SCHOOL_FORBIDDEN - charge_max = 150 - clothes_req = FALSE + cooldown_time = 15 SECONDS invocation_type = INVOCATION_NONE - range = 2 + spell_requirements = NONE antimagic_flags = MAGIC_RESISTANCE|MAGIC_RESISTANCE_MIND -/obj/effect/proc_holder/spell/pointed/touch/mad_touch/can_target(atom/target, mob/user, silent) - if(!ishuman(target)) - if(!silent) - target.balloon_alert(user, "invalid target!") +/datum/action/cooldown/spell/touch/mad_touch/cast_on_hand_hit(obj/item/melee/touch_attack/hand, atom/victim, mob/living/carbon/caster) + if(!ishuman(victim)) + return FALSE + + var/mob/living/carbon/human/human_victim = victim + if(!human_victim.mind || IS_HERETIC(human_victim)) return FALSE - return TRUE -/obj/effect/proc_holder/spell/pointed/touch/mad_touch/cast(list/targets, mob/user) - . = ..() - for(var/mob/living/carbon/target in targets) - if(ishuman(targets)) - var/mob/living/carbon/human/tar = target - if(tar.can_block_magic(antimagic_flags)) - tar.visible_message(span_danger("The spell bounces off of [target]!"), span_danger("The spell bounces off of you!")) - return - if(target.mind && !IS_HERETIC(target)) - to_chat(user, span_warning("[target.name] has been cursed!")) - SEND_SIGNAL(target, COMSIG_ADD_MOOD_EVENT, "gates_of_mansus", /datum/mood_event/gates_of_mansus) + if(human_victim.can_block_magic(antimagic_flags)) + victim.visible_message( + span_danger("The spell bounces off of [victim]!"), + span_danger("The spell bounces off of you!"), + ) + return FALSE + + to_chat(caster, span_warning("[human_victim.name] has been cursed!")) + SEND_SIGNAL(target, COMSIG_ADD_MOOD_EVENT, "gates_of_mansus", /datum/mood_event/gates_of_mansus) + return TRUE diff --git a/code/modules/antagonists/heretic/magic/manse_link.dm b/code/modules/antagonists/heretic/magic/manse_link.dm index 1b5cdea5b753cc..d3e62bc9b1dc39 100644 --- a/code/modules/antagonists/heretic/magic/manse_link.dm +++ b/code/modules/antagonists/heretic/magic/manse_link.dm @@ -1,55 +1,50 @@ -// Manse link action for Raw Prophets -// Actually an action larping as a spell, because spells don't track what they're attached to. -/datum/action/cooldown/manse_link +/datum/action/cooldown/spell/pointed/manse_link name = "Manse Link" desc = "This spell allows you to pierce through reality and connect minds to one another \ via your Mansus Link. All minds connected to your Mansus Link will be able to communicate discreetly across great distances." + background_icon_state = "bg_ecult" icon_icon = 'icons/mob/actions/actions_ecult.dmi' button_icon_state = "mansus_link" - background_icon_state = "bg_ecult" + ranged_mousepointer = 'icons/effects/mouse_pointers/throw_target.dmi' + + school = SCHOOL_FORBIDDEN cooldown_time = 20 SECONDS - text_cooldown = FALSE - click_to_activate = TRUE + + invocation = "PI'RC' TH' M'ND." + invocation_type = INVOCATION_SHOUT + spell_requirements = NONE + + cast_range = 7 + /// The time it takes to link to a mob. var/link_time = 6 SECONDS - /// The range of the cast. Expanded beyond normal view range by default, as Raw Prophets have a larger sight range. - var/range = 10 - /// The text the caster is forced tos ay. - var/invocation_text = "PI'RC' TH' M'ND" -/datum/action/cooldown/manse_link/New(Target) +/datum/action/cooldown/spell/pointed/manse_link/New(Target) . = ..() if(!istype(Target, /datum/component/mind_linker)) stack_trace("[name] ([type]) was instantiated on a non-mind_linker target, this doesn't work.") qdel(src) -/datum/action/cooldown/manse_link/InterceptClickOn(mob/living/caller, params, atom/clicked_on) - if(!isliving(clicked_on)) - return FALSE - if(clicked_on == caller) - return FALSE - if(get_dist(caller, clicked_on) > range) - to_chat(caller, span_warning("[clicked_on] is too far to establish a link.")) // Not a balloon alert due being so zoomed out. +/datum/action/cooldown/spell/pointed/manse_link/is_valid_target(atom/cast_on) + . = ..() + if(!.) return FALSE - return ..() - -/datum/action/cooldown/manse_link/Activate(atom/victim) - owner.say("#[invocation_text]", forced = "spell") + return isliving(cast_on) - // Short cooldown placed during the channel to prevent spam links. - StartCooldown(10 SECONDS) - - // If we link successfuly, we can start the full cooldown duration. - if(do_linking(victim)) - StartCooldown() +/datum/action/cooldown/spell/pointed/manse_link/before_cast(mob/living/cast_on) + . = ..() + if(. & SPELL_CANCEL_CAST) + return - return TRUE + // If we fail to link, cancel the spell. + if(!do_linking(cast_on)) + return . | SPELL_CANCEL_CAST /** * The actual process of linking [linkee] to our network. */ -/datum/action/cooldown/manse_link/proc/do_linking(mob/living/linkee) +/datum/action/cooldown/spell/pointed/manse_link/proc/do_linking(mob/living/linkee) var/datum/component/mind_linker/linker = target if(linkee.stat == DEAD) to_chat(owner, span_warning("They're dead!")) diff --git a/code/modules/antagonists/heretic/magic/mansus_grasp.dm b/code/modules/antagonists/heretic/magic/mansus_grasp.dm index 27a51b72e98d5f..98dece5f54edfe 100644 --- a/code/modules/antagonists/heretic/magic/mansus_grasp.dm +++ b/code/modules/antagonists/heretic/magic/mansus_grasp.dm @@ -1,22 +1,64 @@ -/obj/effect/proc_holder/spell/targeted/touch/mansus_grasp +/datum/action/cooldown/spell/touch/mansus_grasp name = "Mansus Grasp" desc = "A touch spell that lets you channel the power of the Old Gods through your grip." - hand_path = /obj/item/melee/touch_attack/mansus_fist + background_icon_state = "bg_ecult" + icon_icon = 'icons/mob/actions/actions_ecult.dmi' + button_icon_state = "mansus_grasp" + sound = 'sound/items/welder.ogg' + school = SCHOOL_EVOCATION - charge_max = 10 SECONDS - clothes_req = FALSE - action_icon = 'icons/mob/actions/actions_ecult.dmi' - action_icon_state = "mansus_grasp" - action_background_icon_state = "bg_ecult" - antimagic_flags = NONE // no casting restriction but there is a can_block_magic check in afterattack to allow antimagic + cooldown_time = 10 SECONDS + + invocation = "R'CH T'H TR'TH!" + invocation_type = INVOCATION_SHOUT + // Mimes can cast it. Chaplains can cast it. Anyone can cast it, so long as they have a hand. + spell_requirements = SPELL_CASTABLE_WITHOUT_INVOCATION + + hand_path = /obj/item/melee/touch_attack/mansus_fist + +/datum/action/cooldown/spell/touch/mansus_grasp/can_cast_spell(feedback = TRUE) + return ..() && !!IS_HERETIC(owner) + +/datum/action/cooldown/spell/touch/mansus_grasp/cast_on_hand_hit(obj/item/melee/touch_attack/hand, atom/victim, mob/living/carbon/caster) + if(!isliving(victim)) + return FALSE + + var/mob/living/living_hit = victim + if(living_hit.can_block_magic(antimagic_flags)) + victim.visible_message( + span_danger("The spell bounces off of [victim]!"), + span_danger("The spell bounces off of you!"), + ) + return FALSE + + if(SEND_SIGNAL(caster, COMSIG_HERETIC_MANSUS_GRASP_ATTACK, victim) & COMPONENT_BLOCK_HAND_USE) + return FALSE + + living_hit.apply_damage(10, BRUTE, wound_bonus = CANT_WOUND) + if(iscarbon(victim)) + var/mob/living/carbon/carbon_hit = victim + carbon_hit.adjust_timed_status_effect(4 SECONDS, /datum/status_effect/speech/slurring/heretic) + carbon_hit.AdjustKnockdown(5 SECONDS) + carbon_hit.adjustStaminaLoss(80) + + return TRUE + +/datum/action/cooldown/spell/touch/mansus_grasp/cast_on_secondary_hand_hit(obj/item/melee/touch_attack/hand, atom/victim, mob/living/carbon/caster) + if(isliving(victim)) // if it's a living mob, go with our normal afterattack + return SECONDARY_ATTACK_CALL_NORMAL + + if(SEND_SIGNAL(caster, COMSIG_HERETIC_MANSUS_GRASP_ATTACK_SECONDARY, victim) & COMPONENT_USE_HAND) + return SECONDARY_ATTACK_CONTINUE_CHAIN + + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN /obj/item/melee/touch_attack/mansus_fist name = "Mansus Grasp" - desc = "A sinister looking aura that distorts the flow of reality around it. Causes knockdown and major stamina damage in addition to some brute. It gains additional beneficial effects as you expand your knowledge of the Mansus." + desc = "A sinister looking aura that distorts the flow of reality around it. \ + Causes knockdown, minor bruises, and major stamina damage. \ + It gains additional beneficial effects as you expand your knowledge of the Mansus." icon_state = "mansus" inhand_icon_state = "mansus" - catchphrase = "R'CH T'H TR'TH!" - on_use_sound = 'sound/items/welder.ogg' /obj/item/melee/touch_attack/mansus_fist/Initialize(mapload) . = ..() @@ -30,67 +72,19 @@ * Callback for effect_remover component. */ /obj/item/melee/touch_attack/mansus_fist/proc/after_clear_rune(obj/effect/target, mob/living/user) - use_charge(user, whisper = TRUE) + var/datum/action/cooldown/spell/touch/mansus_grasp/grasp = spell_which_made_us?.resolve() + grasp?.spell_feedback() + + remove_hand_with_no_refund(user) /obj/item/melee/touch_attack/mansus_fist/ignition_effect(atom/to_light, mob/user) . = span_notice("[user] effortlessly snaps [user.p_their()] fingers near [to_light], igniting it with eldritch energies. Fucking badass!") - use_charge(user) - -/obj/item/melee/touch_attack/mansus_fist/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - if(!proximity_flag || !isliving(target) || !IS_HERETIC(user) || target == user) - return - if(ishuman(target)) - var/mob/living/carbon/human/human_target = target - if(human_target.can_block_magic()) - human_target.visible_message( - span_danger("The spell bounces off of [target]!"), - span_danger("The spell bounces off of you!"), - ) - return ..() - if(!on_mob_hit(target, user)) - return - - return ..() - -/obj/item/melee/touch_attack/mansus_fist/afterattack_secondary(atom/target, mob/user, proximity_flag, click_parameters) - . = ..() - if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) - return - - if(!proximity_flag || !IS_HERETIC(user) || target == user) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - if(isliving(target)) // if it's a living mob, go with our normal afterattack - return SECONDARY_ATTACK_CALL_NORMAL - - if(SEND_SIGNAL(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK_SECONDARY, target) & COMPONENT_USE_CHARGE) - use_charge(user) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - - return SECONDARY_ATTACK_CONTINUE_CHAIN - -/** - * Called with [hit] is successfully hit by a mansus grasp by [heretic]. - * - * Sends signal COMSIG_HERETIC_MANSUS_GRASP_ATTACK. - * If it returns COMPONENT_BLOCK_CHARGE_USE, the proc returns FALSE. - * Otherwise, returns TRUE. - */ -/obj/item/melee/touch_attack/mansus_fist/proc/on_mob_hit(mob/living/hit, mob/living/heretic) - if(SEND_SIGNAL(heretic, COMSIG_HERETIC_MANSUS_GRASP_ATTACK, hit) & COMPONENT_BLOCK_CHARGE_USE) - return FALSE - - hit.apply_damage(10, BRUTE, wound_bonus = CANT_WOUND) - if(iscarbon(hit)) - var/mob/living/carbon/carbon_hit = hit - carbon_hit.adjust_timed_status_effect(4 SECONDS, /datum/status_effect/speech/slurring/heretic) - carbon_hit.AdjustKnockdown(5 SECONDS) - carbon_hit.adjustStaminaLoss(80) - - return TRUE + remove_hand_with_no_refund(user) /obj/item/melee/touch_attack/mansus_fist/suicide_act(mob/user) user.visible_message(span_suicide("[user] covers [user.p_their()] face with [user.p_their()] sickly-looking hand! It looks like [user.p_theyre()] trying to commit suicide!")) var/mob/living/carbon/carbon_user = user //iscarbon already used in spell's parent + var/datum/action/cooldown/spell/touch/mansus_grasp/source = locate() in user.actions if(!IS_HERETIC(user)) return @@ -108,7 +102,7 @@ carbon_user.emote("scream") carbon_user.adjust_timed_status_effect(26 SECONDS, /datum/status_effect/speech/stutter) - on_mob_hit(user, user) + source?.cast_on_hand_hit(src, user, user) escape_our_torment++ stoplag(0.4 SECONDS) diff --git a/code/modules/antagonists/heretic/magic/mirror_walk.dm b/code/modules/antagonists/heretic/magic/mirror_walk.dm index 52461cbc36fd3d..3c81d027e348e7 100644 --- a/code/modules/antagonists/heretic/magic/mirror_walk.dm +++ b/code/modules/antagonists/heretic/magic/mirror_walk.dm @@ -1,22 +1,15 @@ -/// Macro to check if the passed mob is currently in jaunting "in the mirror". -#define IS_MIRROR_PHASED(mob) istype(user.loc, /obj/effect/dummy/phased_mob/mirror_walk) - -/obj/effect/proc_holder/spell/targeted/mirror_walk +/datum/action/cooldown/spell/jaunt/mirror_walk name = "Mirror Walk" desc = "Allows you to traverse invisibly and freely across the station within the realm of the mirror. \ You can only enter and exit the realm of mirrors when nearby reflective surfaces and items, \ such as windows, mirrors, and reflective walls or equipment." - action_icon = 'icons/mob/actions/actions_minor_antag.dmi' - action_icon_state = "ninja_cloak" - action_background_icon_state = "bg_ecult" - charge_max = 6 SECONDS - cooldown_min = 0 - clothes_req = FALSE - antimagic_flags = NONE - phase_allowed = TRUE - range = -1 - include_user = TRUE - overlay = null + background_icon_state = "bg_ecult" + icon_icon = 'icons/mob/actions/actions_minor_antag.dmi' + button_icon_state = "ninja_cloak" + + cooldown_time = 6 SECONDS + jaunt_type = /obj/effect/dummy/phased_mob/mirror_walk + spell_requirements = NONE /// The time it takes to enter the mirror / phase out / enter jaunt. var/phase_out_time = 1.5 SECONDS @@ -28,110 +21,88 @@ /obj/structure/mirror, )) -/obj/effect/proc_holder/spell/targeted/mirror_walk/on_lose(mob/living/user) - if(IS_MIRROR_PHASED(user)) - var/obj/effect/dummy/phased_mob/mirror_walk/phase = user.loc - phase.eject_user() - qdel(phase) - -/obj/effect/proc_holder/spell/targeted/mirror_walk/cast_check(skipcharge = FALSE, mob/user = usr) +/datum/action/cooldown/spell/jaunt/mirror_walk/can_cast_spell(feedback = TRUE) . = ..() if(!.) return FALSE - var/we_are_phasing = IS_MIRROR_PHASED(user) - var/turf/user_turf = get_turf(user) - var/area/user_area = get_area(user) - if(!user_turf || !user_area) - return FALSE // nullspaced? - - if(user_area.area_flags & NOTELEPORT) - to_chat(user, span_warning("An otherwordly force is preventing you from [we_are_phasing ? "exiting":"entering"] the mirror's realm here!")) + var/we_are_phasing = is_jaunting(owner) + var/turf/owner_turf = get_turf(owner) + if(!is_reflection_nearby(get_turf(owner_turf))) + if(feedback) + to_chat(owner, span_warning("There are no reflective surfaces nearby to [we_are_phasing ? "exit":"enter"] the mirror's realm here!")) return FALSE - if(user_turf.turf_flags & NOJAUNT) - to_chat(user, span_warning("An otherwordly force is preventing you from [we_are_phasing ? "exiting":"entering"] the mirror's realm here!")) + if(owner_turf.is_blocked_turf(exclude_mobs = TRUE)) + if(feedback) + to_chat(owner, span_warning("Something is blocking you from [we_are_phasing ? "exiting":"entering"] the mirror's realm here!")) return FALSE return TRUE -/obj/effect/proc_holder/spell/targeted/mirror_walk/cast(list/targets, mob/living/user = usr) - var/we_are_phasing = IS_MIRROR_PHASED(user) - var/turf/user_turf = get_turf(user) - - if(!is_reflection_nearby(user_turf)) - to_chat(user, span_warning("There are no reflective surfaces nearby to [we_are_phasing ? "exit":"enter"] the mirror's realm here!")) - return FALSE +/datum/action/cooldown/spell/jaunt/mirror_walk/cast(mob/living/cast_on) + . = ..() + if(is_jaunting(cast_on)) + return exit_jaunt(cast_on) + else + return enter_jaunt(cast_on) - if(user_turf.is_blocked_turf(exclude_mobs = TRUE)) - to_chat(user, span_warning("Something is blocking you from [we_are_phasing ? "exiting":"entering"] the mirror's realm here!")) - return FALSE +/datum/action/cooldown/spell/jaunt/mirror_walk/enter_jaunt(mob/living/jaunter, turf/loc_override) + var/atom/nearby_reflection = is_reflection_nearby(jaunter) + if(!nearby_reflection) + to_chat(jaunter, span_warning("There are no reflective surfaces nearby to enter the mirror's realm!")) + return - // If our loc is a phased mob, we're currently jaunting so we should exit - if(we_are_phasing) - try_exit_phase(user) + jaunter.Beam(nearby_reflection, icon_state = "light_beam", time = phase_out_time) + nearby_reflection.visible_message(span_warning("[nearby_reflection] begins to shimmer and shake slightly!")) + if(!do_after(jaunter, phase_out_time, nearby_reflection, IGNORE_USER_LOC_CHANGE|IGNORE_INCAPACITATED)) return - // Otherwise try to enter like normal - try_enter_phase(user) + playsound(jaunter, 'sound/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."), + ) + + // Pass the turf of the nearby reflection to the parent call + // as that's the location we're actually jaunting into + return ..(jaunter, get_turf(nearby_reflection)) -/obj/effect/proc_holder/spell/targeted/mirror_walk/proc/try_exit_phase(mob/living/user) - var/obj/effect/dummy/phased_mob/mirror_walk/phase = user.loc - var/atom/nearby_reflection = is_reflection_nearby(phase) +/datum/action/cooldown/spell/jaunt/mirror_walk/exit_jaunt(mob/living/unjaunter, turf/loc_override) + var/turf/phase_turf = get_turf(unjaunter) + var/atom/nearby_reflection = is_reflection_nearby(phase_turf) if(!nearby_reflection) - to_chat(user, span_warning("There are no reflective surfaces nearby to exit from the mirror's realm!")) + to_chat(unjaunter, span_warning("There are no reflective surfaces nearby to exit from the mirror's realm!")) return FALSE - var/turf/phase_turf = get_turf(phase) - // It would likely be a bad idea to teleport into an ai monitored area (ai sat) var/area/phase_area = get_area(phase_turf) if(istype(phase_area, /area/station/ai_monitored)) - to_chat(user, span_warning("It's probably not a very wise idea to exit the mirror's realm here.")) + to_chat(unjaunter, span_warning("It's probably not a very wise idea to exit the mirror's realm here.")) return FALSE nearby_reflection.Beam(phase_turf, icon_state = "light_beam", time = phase_in_time) nearby_reflection.visible_message(span_warning("[nearby_reflection] begins to shimmer and shake slightly!")) - if(!do_after(user, phase_in_time, nearby_reflection)) - return + if(!do_after(unjaunter, phase_in_time, nearby_reflection)) + return FALSE - playsound(get_turf(user), 'sound/magic/ethereal_exit.ogg', 50, TRUE, -1) - user.visible_message( - span_boldwarning("[user] phases into reality before your very eyes!"), + // We can move around while phasing in, but we'll always end up where we started it. + // Pass the jaunter's turf at the start of the proc back to the parent call. + . = ..(unjaunter, phase_turf) + if(!.) + return FALSE + + playsound(unjaunter, 'sound/magic/ethereal_exit.ogg', 50, TRUE, -1) + unjaunter.visible_message( + span_boldwarning("[unjaunter] phases into reality before your very eyes!"), span_notice("You jump out of the reflection coming off of [nearby_reflection], exiting the mirror's realm."), ) - // We can move around while phasing in, - // but we'll always end up where we started it. - phase.forceMove(phase_turf) - phase.eject_user() - qdel(phase) - // Chilly! - phase_turf.TakeTemperature(-20) + if(isopenturf(phase_turf)) + phase_turf.TakeTemperature(-20) -/obj/effect/proc_holder/spell/targeted/mirror_walk/proc/try_enter_phase(mob/living/user) - var/atom/nearby_reflection = is_reflection_nearby(user) - if(!nearby_reflection) - to_chat(user, span_warning("There are no reflective surfaces nearby to enter the mirror's realm!")) - return - - user.Beam(nearby_reflection, icon_state = "light_beam", time = phase_out_time) - nearby_reflection.visible_message(span_warning("[nearby_reflection] begins to shimmer and shake slightly!")) - if(!do_after(user, phase_out_time, nearby_reflection, IGNORE_USER_LOC_CHANGE|IGNORE_INCAPACITATED)) - return - - playsound(get_turf(user), 'sound/magic/ethereal_enter.ogg', 50, TRUE, -1) - user.visible_message( - span_boldwarning("[user] 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."), - ) - - user.SetAllImmobility(0) - user.setStaminaLoss(0) - - var/obj/effect/dummy/phased_mob/mirror_walk/phase = new(get_turf(nearby_reflection)) - user.forceMove(phase) + return TRUE /** * Goes through all nearby atoms in sight of the @@ -141,7 +112,7 @@ * Returns an object reference to a "reflective" object in view if one was found, * or null if no object was found that was determined to be "reflective". */ -/obj/effect/proc_holder/spell/targeted/mirror_walk/proc/is_reflection_nearby(atom/caster) +/datum/action/cooldown/spell/jaunt/mirror_walk/proc/is_reflection_nearby(atom/caster) for(var/atom/thing as anything in view(2, caster)) if(isitem(thing)) var/obj/item/item_thing = thing @@ -167,10 +138,3 @@ /obj/effect/dummy/phased_mob/mirror_walk name = "reflection" - -/obj/effect/dummy/phased_mob/mirror_walk/proc/eject_user() - var/mob/living/jaunter = locate() in contents - if(QDELETED(jaunter)) - CRASH("[type] called eject_user() without a mob/living within its contents.") - - jaunter.forceMove(drop_location()) diff --git a/code/modules/antagonists/heretic/magic/nightwatcher_rebirth.dm b/code/modules/antagonists/heretic/magic/nightwatcher_rebirth.dm new file mode 100644 index 00000000000000..bb00a99e863317 --- /dev/null +++ b/code/modules/antagonists/heretic/magic/nightwatcher_rebirth.dm @@ -0,0 +1,55 @@ +/datum/action/cooldown/spell/aoe/fiery_rebirth + name = "Nightwatcher's Rebirth" + desc = "A spell that extinguishes you drains nearby heathens engulfed in flames of their life force, \ + healing you for each victim drained. Those in critical condition \ + will have the last of their vitality drained, killing them." + background_icon_state = "bg_ecult" + icon_icon = 'icons/mob/actions/actions_ecult.dmi' + button_icon_state = "smoke" + + school = SCHOOL_FORBIDDEN + cooldown_time = 1 MINUTES + + invocation = "GL'RY T' TH' N'GHT'W'TCH'ER" + invocation_type = INVOCATION_WHISPER + spell_requirements = SPELL_REQUIRES_HUMAN + +/datum/action/cooldown/spell/aoe/fiery_rebirth/cast(mob/living/carbon/human/cast_on) + cast_on.extinguish_mob() + return ..() + +/datum/action/cooldown/spell/aoe/fiery_rebirth/get_things_to_cast_on(atom/center) + var/list/things = list() + for(var/mob/living/carbon/nearby_mob in range(aoe_radius, center)) + if(nearby_mob == owner || nearby_mob == center) + continue + if(!nearby_mob.mind || !nearby_mob.client) + continue + if(IS_HERETIC_OR_MONSTER(nearby_mob)) + continue + if(nearby_mob.stat == DEAD || !nearby_mob.on_fire) + continue + + things += nearby_mob + + return things + +/datum/action/cooldown/spell/aoe/fiery_rebirth/cast_on_thing_in_aoe(mob/living/carbon/victim, mob/living/carbon/human/caster) + new /obj/effect/temp_visual/eldritch_smoke(victim.drop_location()) + + //This is essentially a death mark, use this to finish your opponent quicker. + if(HAS_TRAIT(victim, TRAIT_CRITICAL_CONDITION) && !HAS_TRAIT(victim, TRAIT_NODEATH)) + victim.death() + victim.apply_damage(20, BURN) + + // Heal the caster for every victim damaged + caster.adjustBruteLoss(-10, FALSE) + caster.adjustFireLoss(-10, FALSE) + caster.adjustToxLoss(-10, FALSE) + caster.adjustOxyLoss(-10, FALSE) + caster.adjustStaminaLoss(-10) + +/obj/effect/temp_visual/eldritch_smoke + icon = 'icons/effects/eldritch.dmi' + icon_state = "smoke" + duration = 10 diff --git a/code/modules/antagonists/heretic/magic/nightwater_rebirth.dm b/code/modules/antagonists/heretic/magic/nightwater_rebirth.dm deleted file mode 100644 index ff433db6a115b9..00000000000000 --- a/code/modules/antagonists/heretic/magic/nightwater_rebirth.dm +++ /dev/null @@ -1,40 +0,0 @@ -/obj/effect/proc_holder/spell/targeted/fiery_rebirth - name = "Nightwatcher's Rebirth" - desc = "A spell that extinguishes you drains nearby heathens engulfed in flames of their life force, \ - healing you for each victim drained. Those in critical condition will have the last of their vitality drained, killing them." - invocation = "GL'RY T' TH' N'GHT'W'TCH'ER" - invocation_type = INVOCATION_WHISPER - school = SCHOOL_FORBIDDEN - clothes_req = FALSE - action_background_icon_state = "bg_ecult" - range = -1 - include_user = TRUE - charge_max = 600 - action_icon = 'icons/mob/actions/actions_ecult.dmi' - action_icon_state = "smoke" - -/obj/effect/proc_holder/spell/targeted/fiery_rebirth/cast(list/targets, mob/user) - if(!ishuman(user)) - return - var/mob/living/carbon/human/human_user = user - human_user.extinguish_mob() - - for(var/mob/living/carbon/target in view(7, user)) - if(!target.mind || !target.client || target.stat == DEAD || !target.on_fire || IS_HERETIC_OR_MONSTER(target)) - continue - //This is essentially a death mark, use this to finish your opponent quicker. - if(HAS_TRAIT(target, TRAIT_CRITICAL_CONDITION) && !HAS_TRAIT(target, TRAIT_NODEATH)) - target.death() - - target.adjustFireLoss(20) - new /obj/effect/temp_visual/eldritch_smoke(target.drop_location()) - human_user.adjustBruteLoss(-10, FALSE) - human_user.adjustFireLoss(-10, FALSE) - human_user.adjustToxLoss(-10, FALSE) - human_user.adjustOxyLoss(-10, FALSE) - human_user.adjustStaminaLoss(-10) - -/obj/effect/temp_visual/eldritch_smoke - icon = 'icons/effects/eldritch.dmi' - icon_state = "smoke" - duration = 10 diff --git a/code/modules/antagonists/heretic/magic/rust_wave.dm b/code/modules/antagonists/heretic/magic/rust_wave.dm index c0ffddd748ba9a..4fd8b9c5cabe37 100644 --- a/code/modules/antagonists/heretic/magic/rust_wave.dm +++ b/code/modules/antagonists/heretic/magic/rust_wave.dm @@ -1,40 +1,41 @@ // Shoots out in a wave-like, what rust heretics themselves get -/obj/effect/proc_holder/spell/cone/staggered/entropic_plume +/datum/action/cooldown/spell/cone/staggered/entropic_plume name = "Entropic Plume" desc = "Spews forth a disorienting plume that causes enemies to strike each other, briefly blinds them(increasing with range) and poisons them(decreasing with range). Also spreads rust in the path of the plume." - action_background_icon_state = "bg_ecult" - action_icon = 'icons/mob/actions/actions_ecult.dmi' - action_icon_state = "entropic_plume" + background_icon_state = "bg_ecult" + icon_icon = 'icons/mob/actions/actions_ecult.dmi' + button_icon_state = "entropic_plume" + + school = SCHOOL_FORBIDDEN + cooldown_time = 30 SECONDS + invocation = "'NTR'P'C PL'M'" invocation_type = INVOCATION_WHISPER - school = SCHOOL_FORBIDDEN - clothes_req = FALSE - charge_max = 300 + spell_requirements = NONE + cone_levels = 5 respect_density = TRUE -/obj/effect/proc_holder/spell/cone/staggered/entropic_plume/cast(list/targets,mob/user = usr) +/datum/action/cooldown/spell/cone/staggered/entropic_plume/cast(atom/cast_on) . = ..() - new /obj/effect/temp_visual/dir_setting/entropic(get_step(user,user.dir), user.dir) + new /obj/effect/temp_visual/dir_setting/entropic(get_step(cast_on, cast_on.dir), cast_on.dir) -/obj/effect/proc_holder/spell/cone/staggered/entropic_plume/do_turf_cone_effect(turf/target_turf, level) - . = ..() +/datum/action/cooldown/spell/cone/staggered/entropic_plume/do_turf_cone_effect(turf/target_turf, atom/caster, level) target_turf.rust_heretic_act() -/obj/effect/proc_holder/spell/cone/staggered/entropic_plume/do_mob_cone_effect(mob/living/victim, level) - . = ..() - if(victim.can_block_magic() || IS_HERETIC_OR_MONSTER(victim)) +/datum/action/cooldown/spell/cone/staggered/entropic_plume/do_mob_cone_effect(mob/living/victim, atom/caster, level) + if(victim.can_block_magic(antimagic_flags) || IS_HERETIC_OR_MONSTER(victim)) return victim.apply_status_effect(/datum/status_effect/amok) - victim.apply_status_effect(/datum/status_effect/cloudstruck, (level * 10)) + victim.apply_status_effect(/datum/status_effect/cloudstruck, (level * 1 SECONDS)) if(iscarbon(victim)) var/mob/living/carbon/carbon_victim = victim - carbon_victim.reagents.add_reagent(/datum/reagent/eldritch, min(1, 6 - level)) + carbon_victim.reagents?.add_reagent(/datum/reagent/eldritch, min(1, 6 - level)) -/obj/effect/proc_holder/spell/cone/staggered/entropic_plume/calculate_cone_shape(current_level) +/datum/action/cooldown/spell/cone/staggered/entropic_plume/calculate_cone_shape(current_level) if(current_level == cone_levels) return 5 - else if(current_level == cone_levels-1) + else if(current_level == cone_levels - 1) return 3 else return 2 @@ -59,20 +60,23 @@ pixel_x = -128 // Shoots a straight line of rusty stuff ahead of the caster, what rust monsters get -/obj/effect/proc_holder/spell/targeted/projectile/dumbfire/rust_wave +/datum/action/cooldown/spell/basic_projectile/rust_wave name = "Patron's Reach" desc = "Channels energy into your hands to release a wave of rust." - proj_type = /obj/projectile/magic/spell/rust_wave + background_icon_state = "bg_ecult" + icon_icon = 'icons/mob/actions/actions_ecult.dmi' + button_icon_state = "rust_wave" + school = SCHOOL_FORBIDDEN - charge_max = 350 - clothes_req = FALSE - action_icon = 'icons/mob/actions/actions_ecult.dmi' - action_icon_state = "rust_wave" - action_background_icon_state = "bg_ecult" + cooldown_time = 35 SECONDS + invocation = "SPR'D TH' WO'D" invocation_type = INVOCATION_WHISPER + spell_requirements = NONE + + projectile_type = /obj/projectile/magic/aoe/rust_wave -/obj/projectile/magic/spell/rust_wave +/obj/projectile/magic/aoe/rust_wave name = "Patron's Reach" icon_state = "eldritch_projectile" alpha = 180 @@ -84,7 +88,7 @@ range = 15 speed = 1 -/obj/projectile/magic/spell/rust_wave/Moved(atom/OldLoc, Dir) +/obj/projectile/magic/aoe/rust_wave/Moved(atom/OldLoc, Dir) . = ..() playsound(src, 'sound/items/welder.ogg', 75, TRUE) var/list/turflist = list() @@ -102,10 +106,10 @@ var/turf/T = X T.rust_heretic_act() -/obj/effect/proc_holder/spell/targeted/projectile/dumbfire/rust_wave/short - name = "Small Patron's Reach" - proj_type = /obj/projectile/magic/spell/rust_wave/short +/datum/action/cooldown/spell/basic_projectile/rust_wave/short + name = "Lesser Patron's Reach" + projectile_type = /obj/projectile/magic/aoe/rust_wave/short -/obj/projectile/magic/spell/rust_wave/short +/obj/projectile/magic/aoe/rust_wave/short range = 7 speed = 2 diff --git a/code/modules/antagonists/heretic/magic/void_phase.dm b/code/modules/antagonists/heretic/magic/void_phase.dm index 0e6396acbeea0c..2b0efb9d089de5 100644 --- a/code/modules/antagonists/heretic/magic/void_phase.dm +++ b/code/modules/antagonists/heretic/magic/void_phase.dm @@ -1,45 +1,63 @@ -/obj/effect/proc_holder/spell/pointed/void_phase +/datum/action/cooldown/spell/pointed/void_phase name = "Void Phase" - desc = "Let's you blink to your pointed destination, causes 3x3 aoe damage bubble around your pointed destination and your current location. It has a minimum range of 3 tiles and a maximum range of 9 tiles." - action_icon = 'icons/mob/actions/actions_ecult.dmi' - action_icon_state = "voidblink" - action_background_icon_state = "bg_ecult" + desc = "Let's you blink to your pointed destination, causes 3x3 aoe damage bubble \ + around your pointed destination and your current location. \ + It has a minimum range of 3 tiles and a maximum range of 9 tiles." + background_icon_state = "bg_ecult" + icon_icon = 'icons/mob/actions/actions_ecult.dmi' + button_icon_state = "voidblink" + ranged_mousepointer = 'icons/effects/mouse_pointers/throw_target.dmi' + + school = SCHOOL_FORBIDDEN + cooldown_time = 30 SECONDS + invocation = "RE'L'TY PH'S'E" invocation_type = INVOCATION_WHISPER - school = SCHOOL_FORBIDDEN - selection_type = "range" - clothes_req = FALSE - range = 9 - charge_max = 300 + spell_requirements = NONE -/obj/effect/proc_holder/spell/pointed/void_phase/can_target(atom/target, mob/user, silent) - . = ..() - if(get_dist(get_turf(user), get_turf(target)) < 3 ) - user.balloon_alert(user, "too close!") + cast_range = 9 + /// The minimum range to cast the phase. + var/min_cast_range = 3 + /// The radius of damage around the void bubble + var/damage_radius = 1 + +/datum/action/cooldown/spell/pointed/void_phase/is_valid_target(atom/cast_on) + // We do the close range check first + if(get_dist(get_turf(owner), get_turf(cast_on)) < min_cast_range) + owner.balloon_alert(owner, "too close!") return FALSE -/obj/effect/proc_holder/spell/pointed/void_phase/cast(list/targets, mob/user) - . = ..() - var/target = targets[1] - var/turf/targeted_turf = get_turf(target) + return ..() - playsound(user,'sound/magic/voidblink.ogg',100) - playsound(targeted_turf,'sound/magic/voidblink.ogg',100) +/datum/action/cooldown/spell/pointed/void_phase/cast(atom/cast_on) + . = ..() + var/turf/source_turf = get_turf(owner) + var/turf/targeted_turf = get_turf(cast_on) - new /obj/effect/temp_visual/voidin(user.drop_location()) + new /obj/effect/temp_visual/voidin(source_turf) new /obj/effect/temp_visual/voidout(targeted_turf) - for(var/mob/living/living_mob in range(1, user) - user) - if(IS_HERETIC_OR_MONSTER(living_mob)) + // We handle sounds here so we can disable vary + playsound(source_turf, 'sound/magic/voidblink.ogg', 60, FALSE) + playsound(targeted_turf, 'sound/magic/voidblink.ogg', 60, FALSE) + + for(var/mob/living/living_mob in range(damage_radius, source_turf)) + if(IS_HERETIC_OR_MONSTER(living_mob) || living_mob == cast_on) continue - living_mob.adjustBruteLoss(40) + living_mob.apply_damage(40, BRUTE, wound_bonus = CANT_WOUND) - for(var/mob/living/living_mob in range(1, targeted_turf) - user) - if(IS_HERETIC_OR_MONSTER(living_mob)) + for(var/mob/living/living_mob in range(damage_radius, targeted_turf)) + if(IS_HERETIC_OR_MONSTER(living_mob) || living_mob == cast_on) continue - living_mob.adjustBruteLoss(40) + living_mob.apply_damage(40, BRUTE, wound_bonus = CANT_WOUND) - do_teleport(user,targeted_turf,TRUE,no_effects = TRUE,channel=TELEPORT_CHANNEL_MAGIC) + do_teleport( + owner, + targeted_turf, + precision = 1, + no_effects = TRUE, + channel = TELEPORT_CHANNEL_MAGIC, + ) /obj/effect/temp_visual/voidin icon = 'icons/effects/96x96.dmi' diff --git a/code/modules/antagonists/heretic/magic/void_pull.dm b/code/modules/antagonists/heretic/magic/void_pull.dm index 3d2b523f4d054f..f8063f8635fe9d 100644 --- a/code/modules/antagonists/heretic/magic/void_pull.dm +++ b/code/modules/antagonists/heretic/magic/void_pull.dm @@ -1,31 +1,60 @@ -/obj/effect/proc_holder/spell/targeted/void_pull +/datum/action/cooldown/spell/aoe/void_pull name = "Void Pull" - desc = "Call the void, this pulls all nearby people closer to you, damages people already around you. If they are 4 tiles or closer they are also knocked down and a micro-stun is applied." - action_icon = 'icons/mob/actions/actions_ecult.dmi' - action_icon_state = "voidpull" - action_background_icon_state = "bg_ecult" + desc = "Calls the void, damaging, knocking down, and stunning people nearby. \ + Distant foes are also pulled closer to you (but not damaged)." + background_icon_state = "bg_ecult" + icon_icon = 'icons/mob/actions/actions_ecult.dmi' + button_icon_state = "voidpull" + sound = 'sound/magic/voidblink.ogg' + + school = SCHOOL_FORBIDDEN + cooldown_time = 40 SECONDS + invocation = "BR'NG F'RTH TH'M T' M'" invocation_type = INVOCATION_WHISPER - school = SCHOOL_FORBIDDEN - clothes_req = FALSE - range = -1 - include_user = TRUE - charge_max = 400 + spell_requirements = NONE + + aoe_radius = 7 + /// The radius of the actual damage circle done before cast + var/damage_radius = 1 + /// The radius of the stun applied to nearby people on cast + var/stun_radius = 4 -/obj/effect/proc_holder/spell/targeted/void_pull/cast(list/targets, mob/user) +// Before the cast, we do some small AOE damage around the caster +/datum/action/cooldown/spell/aoe/void_pull/before_cast(atom/cast_on) . = ..() - for(var/mob/living/living_mob in range(1, user) - user) - if(IS_HERETIC_OR_MONSTER(living_mob)) + if(. & SPELL_CANCEL_CAST) + return + + new /obj/effect/temp_visual/voidin(get_turf(cast_on)) + + // Before we cast the actual effects, deal AOE damage to anyone adjacent to us + var/list/mob/living/people_near_us = get_things_to_cast_on(cast_on, damage_radius) + for(var/mob/living/nearby_living as anything in people_near_us) + nearby_living.apply_damage(30, BRUTE, wound_bonus = CANT_WOUND) + +/datum/action/cooldown/spell/aoe/void_pull/get_things_to_cast_on(atom/center, radius_override = 0) + var/list/things = list() + for(var/mob/living/nearby_mob in view(radius_override || aoe_radius, center)) + if(nearby_mob == owner || nearby_mob == center) + continue + // Don't grab people who are tucked away or something + if(!isturf(nearby_mob.loc)) continue - living_mob.adjustBruteLoss(30) + if(IS_HERETIC_OR_MONSTER(nearby_mob)) + continue + + things += nearby_mob - playsound(user,'sound/magic/voidblink.ogg',100) - new /obj/effect/temp_visual/voidin(user.drop_location()) - for(var/mob/living/livies in view(7, user) - user) + return things - if(get_dist(user, livies) < 4) - livies.AdjustKnockdown(3 SECONDS) - livies.AdjustParalyzed(0.5 SECONDS) +// For the actual cast, we microstun people nearby and pull them in +/datum/action/cooldown/spell/aoe/void_pull/cast_on_thing_in_aoe(mob/living/victim, atom/caster) + // If the victim's within the stun radius, they're stunned / knocked down + if(get_dist(victim, caster) < stun_radius) + victim.AdjustKnockdown(3 SECONDS) + victim.AdjustParalyzed(0.5 SECONDS) - for(var/i in 1 to 3) - livies.forceMove(get_step_towards(livies,user)) + // Otherwise, they take a few steps closer + for(var/i in 1 to 3) + victim.forceMove(get_step_towards(victim, caster)) diff --git a/code/modules/antagonists/heretic/mobs/maid_in_mirror.dm b/code/modules/antagonists/heretic/mobs/maid_in_mirror.dm index 205ed6d2ce65a2..3e326c8c3851ee 100644 --- a/code/modules/antagonists/heretic/mobs/maid_in_mirror.dm +++ b/code/modules/antagonists/heretic/mobs/maid_in_mirror.dm @@ -22,7 +22,7 @@ /obj/item/clothing/suit/armor, /obj/item/organ/internal/lungs, ) - spells_to_add = list(/obj/effect/proc_holder/spell/targeted/mirror_walk) + actions_to_add = list(/datum/action/cooldown/spell/jaunt/mirror_walk) /// Whether we take damage when we're examined var/weak_on_examine = TRUE @@ -42,6 +42,9 @@ if(!weak_on_examine) return + if(!isliving(user) || user.stat == DEAD) + return + if(IS_HERETIC_OR_MONSTER(user) || user == src) return diff --git a/code/modules/antagonists/nightmare/nightmare_organs.dm b/code/modules/antagonists/nightmare/nightmare_organs.dm index dbd8932ac3839e..686835eebd6225 100644 --- a/code/modules/antagonists/nightmare/nightmare_organs.dm +++ b/code/modules/antagonists/nightmare/nightmare_organs.dm @@ -8,23 +8,21 @@ name = "tumorous mass" desc = "A fleshy growth that was dug out of the skull of a Nightmare." icon_state = "brain-x-d" - var/obj/effect/proc_holder/spell/targeted/shadowwalk/shadowwalk + var/datum/action/cooldown/spell/jaunt/shadow_walk/our_jaunt /obj/item/organ/internal/brain/nightmare/Insert(mob/living/carbon/M, special = FALSE) . = ..() if(M.dna.species.id != SPECIES_NIGHTMARE) M.set_species(/datum/species/shadow/nightmare) visible_message(span_warning("[M] thrashes as [src] takes root in [M.p_their()] body!")) - var/obj/effect/proc_holder/spell/targeted/shadowwalk/SW = new - M.AddSpell(SW) - shadowwalk = SW + + our_jaunt = new(M) + our_jaunt.Grant(M) /obj/item/organ/internal/brain/nightmare/Remove(mob/living/carbon/M, special = FALSE) - if(shadowwalk) - M.RemoveSpell(shadowwalk) + QDEL_NULL(our_jaunt) return ..() - /obj/item/organ/internal/heart/nightmare name = "heart of darkness" desc = "An alien organ that twists and writhes when exposed to light." 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 f97262b9ea5764..b90b56ec743232 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclear_bomb/_nuclear_bomb.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclear_bomb/_nuclear_bomb.dm @@ -62,7 +62,7 @@ GLOBAL_VAR(station_nuke_source) STOP_PROCESSING(SSobj, core) update_appearance() SSpoints_of_interest.make_point_of_interest(src) - previous_level = get_security_level() + previous_level = SSsecurity_level.get_current_level_as_text() /obj/machinery/nuclearbomb/Destroy() safety = FALSE @@ -451,7 +451,7 @@ GLOBAL_VAR(station_nuke_source) message_admins("\The [src] was armed at [ADMIN_VERBOSEJMP(our_turf)] by [armer ? ADMIN_LOOKUPFLW(armer) : "an unknown user"].") log_game("\The [src] was armed at [loc_name(our_turf)] by [armer ? key_name(armer) : "an unknown user"].") - previous_level = get_security_level() + previous_level = SSsecurity_level.get_current_level_as_number() detonation_timer = world.time + (timer_set * 10) for(var/obj/item/pinpointer/nuke/syndicate/nuke_pointer in GLOB.pinpointer_list) nuke_pointer.switch_mode_to(TRACK_INFILTRATOR) @@ -459,7 +459,7 @@ GLOBAL_VAR(station_nuke_source) SEND_GLOBAL_SIGNAL(COMSIG_GLOB_NUKE_DEVICE_ARMED, src) countdown.start() - set_security_level("delta") + SSsecurity_level.set_level(SEC_LEVEL_DELTA) update_appearance() /// Disarms the nuke, reverting all pinpointers and the security level @@ -469,7 +469,7 @@ GLOBAL_VAR(station_nuke_source) log_game("\The [src] at [loc_name(our_turf)] was disarmed by [disarmer ? key_name(disarmer) : "an unknown user"].") detonation_timer = null - set_security_level(previous_level) + SSsecurity_level.set_level(previous_level) for(var/obj/item/pinpointer/nuke/syndicate/nuke_pointer in GLOB.pinpointer_list) nuke_pointer.switch_mode_to(initial(nuke_pointer.mode)) @@ -527,8 +527,6 @@ GLOBAL_VAR(station_nuke_source) SSticker.roundend_check_paused = FALSE return - SSlag_switch.set_measure(DISABLE_NON_OBSJOBS, TRUE) - var/detonation_status var/turf/bomb_location = get_turf(src) var/area/nuke_area = get_area(bomb_location) @@ -549,6 +547,7 @@ GLOBAL_VAR(station_nuke_source) // Confirming good hits, the nuke hit the station else + SSlag_switch.set_measure(DISABLE_NON_OBSJOBS, TRUE) detonation_status = DETONATION_HIT_STATION GLOB.station_was_nuked = TRUE @@ -560,12 +559,6 @@ GLOBAL_VAR(station_nuke_source) else detonation_status = DETONATION_MISSED_STATION - /* - if(detonation_status < NUKE_MISS_STATION) - SSshuttle.registerHostileEnvironment(src) - SSshuttle.lockdown = TRUE - */ - // Missing the station will register a hostile environment, until it actually explodes if(detonation_status == DETONATION_MISSED_STATION) SSshuttle.registerHostileEnvironment(src) diff --git a/code/modules/antagonists/nukeop/equipment/nuclear_bomb/beer_nuke.dm b/code/modules/antagonists/nukeop/equipment/nuclear_bomb/beer_nuke.dm index 28d2413e1545df..3599ec4fd42f15 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclear_bomb/beer_nuke.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclear_bomb/beer_nuke.dm @@ -48,12 +48,12 @@ return ..() /obj/machinery/nuclearbomb/beer/proc/local_foam() - var/datum/reagents/R = new/datum/reagents(1000) - R.my_atom = src - R.add_reagent(/datum/reagent/consumable/ethanol/beer, 100) + var/datum/reagents/tmp_holder = new/datum/reagents(1000) + tmp_holder.my_atom = src + tmp_holder.add_reagent(/datum/reagent/consumable/ethanol/beer, 100) var/datum/effect_system/fluid_spread/foam/foam = new - foam.set_up(200, location = get_turf(src), carry = R) + foam.set_up(200, holder = src, location = get_turf(src), carry = tmp_holder) foam.start() disarm_nuke() diff --git a/code/modules/antagonists/revenant/revenant.dm b/code/modules/antagonists/revenant/revenant.dm index 4b24727df6f3c3..035bd913864ca1 100644 --- a/code/modules/antagonists/revenant/revenant.dm +++ b/code/modules/antagonists/revenant/revenant.dm @@ -74,12 +74,27 @@ AddElement(/datum/element/simple_flying) ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT) ADD_TRAIT(src, TRAIT_SIXTHSENSE, INNATE_TRAIT) - AddSpell(new /obj/effect/proc_holder/spell/targeted/night_vision/revenant(null)) - AddSpell(new /obj/effect/proc_holder/spell/targeted/telepathy/revenant(null)) - AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/revenant/defile(null)) - AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/revenant/overload(null)) - AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/revenant/blight(null)) - AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/revenant/malfunction(null)) + + // Starting spells + var/datum/action/cooldown/spell/night_vision/revenant/vision = new(src) + vision.Grant(src) + + var/datum/action/cooldown/spell/list_target/telepathy/revenant/telepathy = new(src) + telepathy.Grant(src) + + // Starting spells that start locked + var/datum/action/cooldown/spell/aoe/revenant/overload/lights_go_zap = new(src) + lights_go_zap.Grant(src) + + var/datum/action/cooldown/spell/aoe/revenant/defile/windows_go_smash = new(src) + windows_go_smash.Grant(src) + + var/datum/action/cooldown/spell/aoe/revenant/blight/botany_go_mad = new(src) + botany_go_mad.Grant(src) + + var/datum/action/cooldown/spell/aoe/revenant/malfunction/shuttle_go_emag = new(src) + shuttle_go_emag.Grant(src) + RegisterSignal(src, COMSIG_LIVING_BANED, .proc/on_baned) random_revenant_name() diff --git a/code/modules/antagonists/revenant/revenant_abilities.dm b/code/modules/antagonists/revenant/revenant_abilities.dm index ae8c413c5190aa..9f91a7f1bd76ab 100644 --- a/code/modules/antagonists/revenant/revenant_abilities.dm +++ b/code/modules/antagonists/revenant/revenant_abilities.dm @@ -113,245 +113,260 @@ essence_drained = 0 //Toggle night vision: lets the revenant toggle its night vision -/obj/effect/proc_holder/spell/targeted/night_vision/revenant - charge_max = 0 +/datum/action/cooldown/spell/night_vision/revenant + name = "Toggle Darkvision" panel = "Revenant Abilities" - message = "You toggle your night vision." - action_icon = 'icons/mob/actions/actions_revenant.dmi' - action_icon_state = "r_nightvision" - action_background_icon_state = "bg_revenant" + background_icon_state = "bg_revenant" + icon_icon = 'icons/mob/actions/actions_revenant.dmi' + button_icon_state = "r_nightvision" + toggle_span = "revennotice" //Transmit: the revemant's only direct way to communicate. Sends a single message silently to a single mob -/obj/effect/proc_holder/spell/targeted/telepathy/revenant +/datum/action/cooldown/spell/list_target/telepathy/revenant name = "Revenant Transmit" panel = "Revenant Abilities" - action_icon = 'icons/mob/actions/actions_revenant.dmi' - action_icon_state = "r_transmit" - action_background_icon_state = "bg_revenant" - notice = "revennotice" - boldnotice = "revenboldnotice" - antimagic_flags = MAGIC_RESISTANCE_MIND - -/obj/effect/proc_holder/spell/aoe_turf/revenant - clothes_req = 0 - action_icon = 'icons/mob/actions/actions_revenant.dmi' - action_background_icon_state = "bg_revenant" + background_icon_state = "bg_revenant" + + telepathy_span = "revennotice" + bold_telepathy_span = "revenboldnotice" + + antimagic_flags = MAGIC_RESISTANCE_HOLY|MAGIC_RESISTANCE_MIND + +/datum/action/cooldown/spell/aoe/revenant panel = "Revenant Abilities (Locked)" - name = "Report this to a coder" + background_icon_state = "bg_revenant" + icon_icon = 'icons/mob/actions/actions_revenant.dmi' + antimagic_flags = MAGIC_RESISTANCE_HOLY - var/reveal = 80 //How long it reveals the revenant in deciseconds - var/stun = 20 //How long it stuns the revenant in deciseconds - var/locked = TRUE //If it's locked and needs to be unlocked before use - var/unlock_amount = 100 //How much essence it costs to unlock - var/cast_amount = 50 //How much essence it costs to use + spell_requirements = NONE + + /// If it's locked, and needs to be unlocked before use + var/locked = TRUE + /// How much essence it costs to unlock + var/unlock_amount = 100 + /// How much essence it costs to use + var/cast_amount = 50 -/obj/effect/proc_holder/spell/aoe_turf/revenant/Initialize(mapload) + /// How long it reveals the revenant + var/reveal_duration = 8 SECONDS + // How long it stuns the revenant + var/stun_duration = 2 SECONDS + +/datum/action/cooldown/spell/aoe/revenant/New(Target) . = ..() + if(!istype(target, /mob/living/simple_animal/revenant)) + stack_trace("[type] was given to a non-revenant mob, please don't.") + qdel(src) + return + if(locked) name = "[initial(name)] ([unlock_amount]SE)" else name = "[initial(name)] ([cast_amount]E)" -/obj/effect/proc_holder/spell/aoe_turf/revenant/can_cast(mob/living/simple_animal/revenant/user = usr) - if(charge_counter < charge_max) +/datum/action/cooldown/spell/aoe/revenant/can_cast_spell(feedback = TRUE) + . = ..() + if(!.) return FALSE - if(!istype(user)) //Badmins, no. Badmins, don't do it. - return TRUE - if(user.inhibited) + if(!istype(owner, /mob/living/simple_animal/revenant)) + stack_trace("[type] was owned by a non-revenant mob, please don't.") return FALSE - if(locked) - if(user.essence_excess <= unlock_amount) - return FALSE - if(user.essence <= cast_amount) + + var/mob/living/simple_animal/revenant/ghost = owner + if(ghost.inhibited) + return FALSE + if(locked && ghost.essence_excess <= unlock_amount) + return FALSE + if(ghost.essence <= cast_amount) return FALSE + return TRUE -/obj/effect/proc_holder/spell/aoe_turf/revenant/proc/attempt_cast(mob/living/simple_animal/revenant/user = usr) - if(!istype(user)) //If you're not a revenant, it works. Please, please, please don't give this to a non-revenant. - name = "[initial(name)]" - if(locked) - panel = "Revenant Abilities" - locked = FALSE - return TRUE +/datum/action/cooldown/spell/aoe/revenant/get_things_to_cast_on(atom/center) + var/list/things = list() + for(var/turf/nearby_turf in range(aoe_radius, center)) + things += nearby_turf + + return things + +/datum/action/cooldown/spell/aoe/revenant/before_cast(mob/living/simple_animal/revenant/cast_on) + . = ..() + if(. & SPELL_CANCEL_CAST) + return FALSE + if(locked) - if (!user.unlock(unlock_amount)) - charge_counter = charge_max - return FALSE + if(!cast_on.unlock(unlock_amount)) + to_chat(cast_on, span_revenwarning("You don't have enough essence to unlock [initial(name)]!")) + reset_spell_cooldown() + return . | SPELL_CANCEL_CAST + name = "[initial(name)] ([cast_amount]E)" - to_chat(user, span_revennotice("You have unlocked [initial(name)]!")) + to_chat(cast_on, span_revennotice("You have unlocked [initial(name)]!")) panel = "Revenant Abilities" locked = FALSE - charge_counter = charge_max - return FALSE - if(!user.castcheck(-cast_amount)) - charge_counter = charge_max - return FALSE - name = "[initial(name)] ([cast_amount]E)" - user.reveal(reveal) - user.stun(stun) - if(action) - action.UpdateButtons() - return TRUE + reset_spell_cooldown() + return . | SPELL_CANCEL_CAST + + if(!cast_on.castcheck(-cast_amount)) + reset_spell_cooldown() + return . | SPELL_CANCEL_CAST + +/datum/action/cooldown/spell/aoe/revenant/after_cast(mob/living/simple_animal/revenant/cast_on) + . = ..() + if(reveal_duration > 0 SECONDS) + cast_on.reveal(reveal_duration) + if(stun_duration > 0 SECONDS) + cast_on.stun(stun_duration) //Overload Light: Breaks a light that's online and sends out lightning bolts to all nearby people. -/obj/effect/proc_holder/spell/aoe_turf/revenant/overload +/datum/action/cooldown/spell/aoe/revenant/overload name = "Overload Lights" desc = "Directs a large amount of essence into nearby electrical lights, causing lights to shock those nearby." - charge_max = 200 - range = 5 - stun = 30 + button_icon_state = "overload_lights" + cooldown_time = 20 SECONDS + + aoe_radius = 5 unlock_amount = 25 cast_amount = 40 + stun_duration = 3 SECONDS + + /// The range the shocks from the lights go var/shock_range = 2 + /// The damage the shcoskf rom the lgihts do var/shock_damage = 15 - action_icon_state = "overload_lights" -/obj/effect/proc_holder/spell/aoe_turf/revenant/overload/cast(list/targets, mob/living/simple_animal/revenant/user = usr) - if(attempt_cast(user)) - for(var/turf/T in targets) - INVOKE_ASYNC(src, .proc/overload, T, user) - -/obj/effect/proc_holder/spell/aoe_turf/revenant/overload/proc/overload(turf/T, mob/user) - for(var/obj/machinery/light/L in T) - if(!L.on) +/datum/action/cooldown/spell/aoe/revenant/overload/cast_on_thing_in_aoe(turf/victim, mob/living/simple_animal/revenant/caster) + for(var/obj/machinery/light/light in victim) + if(!light.on) continue - L.visible_message(span_warning("\The [L] suddenly flares brightly and begins to spark!")) - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(4, 0, L) - s.start() - new /obj/effect/temp_visual/revenant(get_turf(L)) - addtimer(CALLBACK(src, .proc/overload_shock, L, user), 20) - -/obj/effect/proc_holder/spell/aoe_turf/revenant/overload/proc/overload_shock(obj/machinery/light/L, mob/user) - if(!L.on) //wait, wait, don't shock me - return - flick("[L.base_state]2", L) - for(var/mob/living/carbon/human/M in view(shock_range, L)) - if(M == user) + + light.visible_message(span_boldwarning("[light] suddenly flares brightly and begins to spark!")) + var/datum/effect_system/spark_spread/light_sparks = new /datum/effect_system/spark_spread() + light_sparks.set_up(4, 0, light) + light_sparks.start() + new /obj/effect/temp_visual/revenant(get_turf(light)) + addtimer(CALLBACK(src, .proc/overload_shock, light, caster), 20) + +/datum/action/cooldown/spell/aoe/revenant/overload/proc/overload_shock(obj/machinery/light/to_shock, mob/living/simple_animal/revenant/caster) + flick("[to_shock.base_state]2", to_shock) + for(var/mob/living/carbon/human/human_mob in view(shock_range, to_shock)) + if(human_mob == caster) continue - L.Beam(M,icon_state="purple_lightning", time = 5) - do_sparks(4, FALSE, M) - playsound(M, 'sound/machines/defib_zap.ogg', 50, TRUE, -1) - if(!M.can_block_magic(antimagic_flags)) - M.electrocute_act(shock_damage, L, flags = SHOCK_NOGLOVES) + to_shock.Beam(human_mob, icon_state = "purple_lightning", time = 0.5 SECONDS) + if(!human_mob.can_block_magic(antimagic_flags)) + human_mob.electrocute_act(shock_damage, to_shock, flags = SHOCK_NOGLOVES) + + do_sparks(4, FALSE, human_mob) + playsound(human_mob, 'sound/machines/defib_zap.ogg', 50, TRUE, -1) //Defile: Corrupts nearby stuff, unblesses floor tiles. -/obj/effect/proc_holder/spell/aoe_turf/revenant/defile +/datum/action/cooldown/spell/aoe/revenant/defile name = "Defile" desc = "Twists and corrupts the nearby area as well as dispelling holy auras on floors." - charge_max = 150 - range = 4 - stun = 20 - reveal = 40 + button_icon_state = "defile" + cooldown_time = 15 SECONDS + + aoe_radius = 4 unlock_amount = 10 cast_amount = 30 - action_icon_state = "defile" - -/obj/effect/proc_holder/spell/aoe_turf/revenant/defile/cast(list/targets, mob/living/simple_animal/revenant/user = usr) - if(attempt_cast(user)) - for(var/turf/T in targets) - INVOKE_ASYNC(src, .proc/defile, T) + reveal_duration = 4 SECONDS + stun_duration = 2 SECONDS -/obj/effect/proc_holder/spell/aoe_turf/revenant/defile/proc/defile(turf/T) - for(var/obj/effect/blessing/B in T) - qdel(B) - new /obj/effect/temp_visual/revenant(T) +/datum/action/cooldown/spell/aoe/revenant/defile/cast_on_thing_in_aoe(turf/victim, mob/living/simple_animal/revenant/caster) + for(var/obj/effect/blessing/blessing in victim) + qdel(blessing) + new /obj/effect/temp_visual/revenant(victim) - if(!isplatingturf(T) && !istype(T, /turf/open/floor/engine/cult) && isfloorturf(T) && prob(15)) - var/turf/open/floor/floor = T + if(!isplatingturf(victim) && !istype(victim, /turf/open/floor/engine/cult) && isfloorturf(victim) && prob(15)) + var/turf/open/floor/floor = victim if(floor.overfloor_placed && floor.floor_tile) new floor.floor_tile(floor) floor.broken = 0 floor.burnt = 0 floor.make_plating(TRUE) - if(T.type == /turf/closed/wall && prob(15) && !HAS_TRAIT(T, TRAIT_RUSTY)) - new /obj/effect/temp_visual/revenant(T) - T.AddElement(/datum/element/rust) - if(T.type == /turf/closed/wall/r_wall && prob(10) && !HAS_TRAIT(T, TRAIT_RUSTY)) - new /obj/effect/temp_visual/revenant(T) - T.AddElement(/datum/element/rust) - for(var/obj/effect/decal/cleanable/food/salt/salt in T) - new /obj/effect/temp_visual/revenant(T) + + if(victim.type == /turf/closed/wall && prob(15) && !HAS_TRAIT(victim, TRAIT_RUSTY)) + new /obj/effect/temp_visual/revenant(victim) + victim.AddElement(/datum/element/rust) + if(victim.type == /turf/closed/wall/r_wall && prob(10) && !HAS_TRAIT(victim, TRAIT_RUSTY)) + new /obj/effect/temp_visual/revenant(victim) + victim.AddElement(/datum/element/rust) + for(var/obj/effect/decal/cleanable/food/salt/salt in victim) + new /obj/effect/temp_visual/revenant(victim) qdel(salt) - for(var/obj/structure/closet/closet in T.contents) + for(var/obj/structure/closet/closet in victim.contents) closet.open() - for(var/obj/structure/bodycontainer/corpseholder in T) + for(var/obj/structure/bodycontainer/corpseholder in victim) if(corpseholder.connected.loc == corpseholder) corpseholder.open() - for(var/obj/machinery/dna_scannernew/dna in T) + for(var/obj/machinery/dna_scannernew/dna in victim) dna.open_machine() - for(var/obj/structure/window/window in T) - window.take_damage(rand(30,80)) + for(var/obj/structure/window/window in victim) + window.take_damage(rand(30, 80)) if(window?.fulltile) new /obj/effect/temp_visual/revenant/cracks(window.loc) - for(var/obj/machinery/light/light in T) + for(var/obj/machinery/light/light in victim) light.flicker(20) //spooky //Malfunction: Makes bad stuff happen to robots and machines. -/obj/effect/proc_holder/spell/aoe_turf/revenant/malfunction +/datum/action/cooldown/spell/aoe/revenant/malfunction name = "Malfunction" desc = "Corrupts and damages nearby machines and mechanical objects." - charge_max = 200 - range = 4 + button_icon_state = "malfunction" + cooldown_time = 20 SECONDS + + aoe_radius = 4 cast_amount = 60 unlock_amount = 125 - action_icon_state = "malfunction" - -//A note to future coders: do not replace this with an EMP because it will wreck malf AIs and everyone will hate you. -/obj/effect/proc_holder/spell/aoe_turf/revenant/malfunction/cast(list/targets, mob/living/simple_animal/revenant/user = usr) - if(attempt_cast(user)) - for(var/turf/T in targets) - INVOKE_ASYNC(src, .proc/malfunction, T, user) -/obj/effect/proc_holder/spell/aoe_turf/revenant/malfunction/proc/malfunction(turf/T, mob/user) - for(var/mob/living/simple_animal/bot/bot in T) +// A note to future coders: do not replace this with an EMP because it will wreck malf AIs and everyone will hate you. +/datum/action/cooldown/spell/aoe/revenant/malfunction/cast_on_thing_in_aoe(turf/victim, mob/living/simple_animal/revenant/caster) + for(var/mob/living/simple_animal/bot/bot in victim) if(!(bot.bot_cover_flags & BOT_COVER_EMAGGED)) new /obj/effect/temp_visual/revenant(bot.loc) bot.bot_cover_flags &= ~BOT_COVER_LOCKED bot.bot_cover_flags |= BOT_COVER_OPEN - bot.emag_act(user) - for(var/mob/living/carbon/human/human in T) - if(human == user) + bot.emag_act(caster) + for(var/mob/living/carbon/human/human in victim) + if(human == caster) continue if(human.can_block_magic(antimagic_flags)) continue to_chat(human, span_revenwarning("You feel [pick("your sense of direction flicker out", "a stabbing pain in your head", "your mind fill with static")].")) new /obj/effect/temp_visual/revenant(human.loc) human.emp_act(EMP_HEAVY) - for(var/obj/thing in T) - if(istype(thing, /obj/machinery/power/apc) || istype(thing, /obj/machinery/power/smes)) //Doesn't work on SMES and APCs, to prevent kekkery + for(var/obj/thing in victim) + //Doesn't work on SMES and APCs, to prevent kekkery. + if(istype(thing, /obj/machinery/power/apc) || istype(thing, /obj/machinery/power/smes)) continue if(prob(20)) if(prob(50)) new /obj/effect/temp_visual/revenant(thing.loc) - thing.emag_act(user) - for(var/mob/living/silicon/robot/S in T) //Only works on cyborgs, not AI - playsound(S, 'sound/machines/warning-buzzer.ogg', 50, TRUE) - new /obj/effect/temp_visual/revenant(S.loc) - S.spark_system.start() - S.emp_act(EMP_HEAVY) + thing.emag_act(caster) + // Only works on cyborgs, not AI! + for(var/mob/living/silicon/robot/cyborg in victim) + playsound(cyborg, 'sound/machines/warning-buzzer.ogg', 50, TRUE) + new /obj/effect/temp_visual/revenant(cyborg.loc) + cyborg.spark_system.start() + cyborg.emp_act(EMP_HEAVY) //Blight: Infects nearby humans and in general messes living stuff up. -/obj/effect/proc_holder/spell/aoe_turf/revenant/blight +/datum/action/cooldown/spell/aoe/revenant/blight name = "Blight" desc = "Causes nearby living things to waste away." - charge_max = 200 - range = 3 + button_icon_state = "blight" + cooldown_time = 20 SECONDS + + aoe_radius = 3 cast_amount = 50 unlock_amount = 75 - action_icon_state = "blight" - -/obj/effect/proc_holder/spell/aoe_turf/revenant/blight/cast(list/targets, mob/living/simple_animal/revenant/user = usr) - if(attempt_cast(user)) - for(var/turf/T in targets) - INVOKE_ASYNC(src, .proc/blight, T, user) -/obj/effect/proc_holder/spell/aoe_turf/revenant/blight/proc/blight(turf/T, mob/user) - for(var/mob/living/mob in T) - if(mob == user) +/datum/action/cooldown/spell/aoe/revenant/blight/cast_on_thing_in_aoe(turf/victim, mob/living/simple_animal/revenant/caster) + for(var/mob/living/mob in victim) + if(mob == caster) continue if(mob.can_block_magic(antimagic_flags)) - to_chat(user, span_warning("The spell had no effect on [mob]!")) + to_chat(caster, span_warning("The spell had no effect on [mob]!")) continue new /obj/effect/temp_visual/revenant(mob.loc) if(iscarbon(mob)) @@ -371,15 +386,15 @@ mob.reagents.add_reagent(/datum/reagent/toxin/plasma, 5) else mob.adjustToxLoss(5) - for(var/obj/structure/spacevine/vine in T) //Fucking with botanists, the ability. + for(var/obj/structure/spacevine/vine in victim) //Fucking with botanists, the ability. vine.add_atom_colour("#823abb", TEMPORARY_COLOUR_PRIORITY) new /obj/effect/temp_visual/revenant(vine.loc) QDEL_IN(vine, 10) - for(var/obj/structure/glowshroom/shroom in T) + for(var/obj/structure/glowshroom/shroom in victim) shroom.add_atom_colour("#823abb", TEMPORARY_COLOUR_PRIORITY) new /obj/effect/temp_visual/revenant(shroom.loc) QDEL_IN(shroom, 10) - for(var/obj/machinery/hydroponics/tray in T) + for(var/obj/machinery/hydroponics/tray in victim) new /obj/effect/temp_visual/revenant(tray.loc) tray.set_pestlevel(rand(8, 10)) tray.set_weedlevel(rand(8, 10)) diff --git a/code/modules/antagonists/revolution/revolution.dm b/code/modules/antagonists/revolution/revolution.dm index 0d97f21ce8e3d4..1824771ce21cbb 100644 --- a/code/modules/antagonists/revolution/revolution.dm +++ b/code/modules/antagonists/revolution/revolution.dm @@ -486,7 +486,7 @@ if (revs_win_injection_amount) var/datum/game_mode/dynamic/dynamic = SSticker.mode - dynamic.create_threat(revs_win_injection_amount, list(dynamic.threat_log, dynamic.roundend_threat_log), "[worldtime2text()]: Revolution victory") + dynamic.unfavorable_situation() priority_announce("A recent assessment of your station has marked your station as a severe risk area for high ranking Nanotrasen officials. \ For the safety of our staff, we have blacklisted your station for new employment of security and command. \ diff --git a/code/modules/antagonists/santa/santa.dm b/code/modules/antagonists/santa/santa.dm index bdea0928bca4e7..0dc55c942c086c 100644 --- a/code/modules/antagonists/santa/santa.dm +++ b/code/modules/antagonists/santa/santa.dm @@ -23,7 +23,8 @@ H.equipOutfit(/datum/outfit/santa) H.dna.update_dna_identity() - owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/area_teleport/teleport/santa) + var/datum/action/cooldown/spell/teleport/area_teleport/wizard/santa/teleport = new(owner) + teleport.Grant(H) /datum/antagonist/santa/proc/give_objective() var/datum/objective/santa_objective = new() diff --git a/code/modules/antagonists/slaughter/slaughter.dm b/code/modules/antagonists/slaughter/slaughter.dm index 4cef95818b11ba..40e65cfc236a8d 100644 --- a/code/modules/antagonists/slaughter/slaughter.dm +++ b/code/modules/antagonists/slaughter/slaughter.dm @@ -63,8 +63,8 @@ /obj/effect/decal/cleanable/blood/innards, \ /obj/item/organ/internal/heart/demon) del_on_death = 1 - ///Sound played when consuming a body - var/feast_sound = 'sound/magic/demon_consume.ogg' + + var/crawl_type = /datum/action/cooldown/spell/jaunt/bloodcrawl/slaughter_demon /// How long it takes for the alt-click slam attack to come off cooldown var/slam_cooldown_time = 45 SECONDS /// The actual instance var for the cooldown @@ -76,15 +76,26 @@ /// How much our wound_bonus hitstreak bonus caps at (peak demonry) var/wound_bonus_hitstreak_max = 12 -/mob/living/simple_animal/hostile/imp/slaughter/Initialize(mapload, obj/effect/dummy/phased_mob/bloodpool)//Bloodpool is the blood pool we spawn in +/mob/living/simple_animal/hostile/imp/slaughter/Initialize(mapload) . = ..() - ADD_TRAIT(src, TRAIT_BLOODCRAWL_EAT, "innate") - var/obj/effect/proc_holder/spell/bloodcrawl/bloodspell = new - AddSpell(bloodspell) - if(istype(loc, /obj/effect/dummy/phased_mob)) - bloodspell.phased = TRUE - if(bloodpool) - bloodpool.RegisterSignal(src, list(COMSIG_LIVING_AFTERPHASEIN,COMSIG_PARENT_QDELETING), /obj/effect/dummy/phased_mob/.proc/deleteself) + var/datum/action/cooldown/spell/jaunt/bloodcrawl/slaughter_demon/crawl = new crawl_type(src) + crawl.Grant(src) + RegisterSignal(src, list(COMSIG_MOB_ENTER_JAUNT, COMSIG_MOB_AFTER_EXIT_JAUNT), .proc/on_crawl) + +/// Whenever we enter or exit blood crawl, reset our bonus and hitstreaks. +/mob/living/simple_animal/hostile/imp/slaughter/proc/on_crawl(datum/source) + SIGNAL_HANDLER + + // Grant us a speed boost if we're on the mortal plane + if(isturf(loc)) + add_movespeed_modifier(/datum/movespeed_modifier/slaughter) + addtimer(CALLBACK(src, .proc/remove_movespeed_modifier, /datum/movespeed_modifier/slaughter), 6 SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE) + + // Reset our streaks + current_hitstreak = 0 + wound_bonus = initial(wound_bonus) + bare_wound_bonus = initial(bare_wound_bonus) + /// Performs the classic slaughter demon bodyslam on the attack_target. Yeets them a screen away. /mob/living/simple_animal/hostile/imp/slaughter/proc/bodyslam(atom/attack_target) @@ -134,11 +145,6 @@ icon_state = "innards" random_icon_states = null -/mob/living/simple_animal/hostile/imp/slaughter/phasein() - . = ..() - add_movespeed_modifier(/datum/movespeed_modifier/slaughter) - addtimer(CALLBACK(src, .proc/remove_movespeed_modifier, /datum/movespeed_modifier/slaughter), 6 SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE) - //The loot from killing a slaughter demon - can be consumed to allow the user to blood crawl /obj/item/organ/internal/heart/demon name = "demon heart" @@ -154,28 +160,34 @@ /obj/item/organ/internal/heart/demon/attack(mob/M, mob/living/carbon/user, obj/target) if(M != user) return ..() - user.visible_message(span_warning("[user] raises [src] to [user.p_their()] mouth and tears into it with [user.p_their()] teeth!"), \ - span_danger("An unnatural hunger consumes you. You raise [src] your mouth and devour it!")) + user.visible_message(span_warning( + "[user] raises [src] to [user.p_their()] mouth and tears into it with [user.p_their()] teeth!"), + span_danger("An unnatural hunger consumes you. You raise [src] your mouth and devour it!"), + ) playsound(user, 'sound/magic/demon_consume.ogg', 50, TRUE) - for(var/obj/effect/proc_holder/spell/knownspell in user.mind.spell_list) - if(knownspell.type == /obj/effect/proc_holder/spell/bloodcrawl) - to_chat(user, span_warning("...and you don't feel any different.")) - qdel(src) - return - user.visible_message(span_warning("[user]'s eyes flare a deep crimson!"), \ - span_userdanger("You feel a strange power seep into your body... you have absorbed the demon's blood-travelling powers!")) + + if(locate(/datum/action/cooldown/spell/jaunt/bloodcrawl) in user.actions) + to_chat(user, span_warning("...and you don't feel any different.")) + qdel(src) + return + + user.visible_message( + span_warning("[user]'s eyes flare a deep crimson!"), + span_userdanger("You feel a strange power seep into your body... you have absorbed the demon's blood-travelling powers!"), + ) user.temporarilyRemoveItemFromInventory(src, TRUE) src.Insert(user) //Consuming the heart literally replaces your heart with a demon heart. H A R D C O R E /obj/item/organ/internal/heart/demon/Insert(mob/living/carbon/M, special = 0) ..() - if(M.mind) - M.mind.AddSpell(new /obj/effect/proc_holder/spell/bloodcrawl(null)) + // Gives a non-eat-people crawl to the new owner + var/datum/action/cooldown/spell/jaunt/bloodcrawl/crawl = new(M) + crawl.Grant(M) /obj/item/organ/internal/heart/demon/Remove(mob/living/carbon/M, special = 0) ..() - if(M.mind) - M.mind.RemoveSpell(/obj/effect/proc_holder/spell/bloodcrawl) + var/datum/action/cooldown/spell/jaunt/bloodcrawl/crawl = locate() in M.actions + qdel(crawl) /obj/item/organ/internal/heart/demon/Stop() return 0 // Always beating. @@ -194,7 +206,6 @@ attack_sound = 'sound/items/bikehorn.ogg' attack_vis_effect = null - feast_sound = 'sound/misc/scary_horn.ogg' deathsound = 'sound/misc/sadtrombone.ogg' icon_state = "bowmon" @@ -203,6 +214,7 @@ prison of hugs." loot = list(/mob/living/simple_animal/pet/cat/kitten{name = "Laughter"}) + crawl_type = /datum/action/cooldown/spell/jaunt/bloodcrawl/slaughter_demon/funny // Keep the people we hug! var/list/consumed_mobs = list() @@ -211,10 +223,6 @@ if(SSevents.holidays && SSevents.holidays[APRIL_FOOLS]) icon_state = "honkmon" -/mob/living/simple_animal/hostile/imp/slaughter/laughter/Destroy() - release_friends() - . = ..() - /mob/living/simple_animal/hostile/imp/slaughter/laughter/ex_act(severity) switch(severity) if(EXPLODE_DEVASTATE) @@ -224,48 +232,6 @@ if(EXPLODE_LIGHT) adjustBruteLoss(30) -/mob/living/simple_animal/hostile/imp/slaughter/laughter/proc/release_friends() - if(!consumed_mobs) - return - - var/turf/T = get_turf(src) - - for(var/mob/living/M in consumed_mobs) - if(!M) - continue - - // Unregister the signal first, otherwise it'll trigger the "ling revived inside us" code - UnregisterSignal(M, COMSIG_MOB_STATCHANGE) - - M.forceMove(T) - if(M.revive(full_heal = TRUE, admin_revive = TRUE)) - M.grab_ghost(force = TRUE) - playsound(T, feast_sound, 50, TRUE, -1) - to_chat(M, span_clown("You leave [src]'s warm embrace, and feel ready to take on the world.")) - -/mob/living/simple_animal/hostile/imp/slaughter/laughter/bloodcrawl_swallow(mob/living/victim) - // Keep their corpse so rescue is possible - consumed_mobs += victim - RegisterSignal(victim, COMSIG_MOB_STATCHANGE, .proc/on_victim_statchange) - -/* Handle signal from a consumed mob changing stat. - * - * A signal handler for if one of the laughter demon's consumed mobs has - * changed stat. If they're no longer dead (because they were dead when - * swallowed), eject them so they can't rip their way out from the inside. - */ -/mob/living/simple_animal/hostile/imp/slaughter/laughter/proc/on_victim_statchange(mob/living/victim, new_stat) - SIGNAL_HANDLER - - if(new_stat == DEAD) - return - // Someone we've eaten has spontaneously revived; maybe regen coma, maybe a changeling - victim.forceMove(get_turf(src)) - victim.exit_blood_effect() - victim.visible_message(span_warning("[victim] falls out of the air, covered in blood, with a confused look on their face.")) - consumed_mobs -= victim - UnregisterSignal(victim, COMSIG_MOB_STATCHANGE) - /mob/living/simple_animal/hostile/imp/slaughter/engine_demon name = "engine demon" faction = list("hell", "neutral") diff --git a/code/modules/antagonists/slaughter/slaughterevent.dm b/code/modules/antagonists/slaughter/slaughterevent.dm index 89b1941eceea7a..b2463f6b64291f 100644 --- a/code/modules/antagonists/slaughter/slaughterevent.dm +++ b/code/modules/antagonists/slaughter/slaughterevent.dm @@ -30,13 +30,16 @@ message_admins("No valid spawn locations found, aborting...") return MAP_ERROR - var/obj/effect/dummy/phased_mob/holder = new /obj/effect/dummy/phased_mob((pick(spawn_locs))) - var/mob/living/simple_animal/hostile/imp/slaughter/S = new (holder) + var/turf/chosen = pick(spawn_locs) + var/mob/living/simple_animal/hostile/imp/slaughter/S = new(chosen) + new /obj/effect/dummy/phased_mob(chosen, S) + player_mind.transfer_to(S) player_mind.set_assigned_role(SSjob.GetJobType(/datum/job/slaughter_demon)) player_mind.special_role = ROLE_SLAUGHTER_DEMON player_mind.add_antag_datum(/datum/antagonist/slaughter) - to_chat(S, "You are currently not currently in the same plane of existence as the station. Blood Crawl near a blood pool to manifest.") + to_chat(S, span_bold("You are currently not currently in the same plane of existence as the station. \ + Use your Blood Crawl ability near a pool of blood to manifest and wreak havoc.")) SEND_SOUND(S, 'sound/magic/demon_dies.ogg') message_admins("[ADMIN_LOOKUPFLW(S)] has been made into a slaughter demon by an event.") log_game("[key_name(S)] was spawned as a slaughter demon by an event.") diff --git a/code/modules/antagonists/space_ninja/space_ninja.dm b/code/modules/antagonists/space_ninja/space_ninja.dm index dfadacde7d0093..4f81e545ec515c 100644 --- a/code/modules/antagonists/space_ninja/space_ninja.dm +++ b/code/modules/antagonists/space_ninja/space_ninja.dm @@ -32,7 +32,7 @@ */ /datum/antagonist/ninja/proc/addMemories() antag_memory += "I am an elite mercenary of the mighty Spider Clan. A SPACE NINJA!
" - antag_memory += "Surprise is my weapon. Shadows are my armor. Without them, I am nothing. (//initialize your suit by clicking the initialize UI button, to use abilities like stealth)!
" + antag_memory += "Surprise is my weapon. Shadows are my armor. Without them, I am nothing.
" /datum/objective/cyborg_hijack explanation_text = "Use your gloves to convert at least one cyborg to aide you in sabotaging the station." @@ -101,8 +101,10 @@ /datum/antagonist/ninja/greet() . = ..() SEND_SOUND(owner.current, sound('sound/effects/ninja_greeting.ogg')) - to_chat(owner.current, "I am an elite mercenary of the mighty Spider Clan!") - to_chat(owner.current, "Surprise is my weapon. Shadows are my armor. Without them, I am nothing. (//initialize your suit by right clicking on it, to use abilities like stealth)!") + to_chat(owner.current, span_danger("I am an elite mercenary of the mighty Spider Clan!")) + to_chat(owner.current, span_warning("Surprise is my weapon. Shadows are my armor. Without them, I am nothing.")) + to_chat(owner.current, span_notice("The station is located to your [dir2text(get_dir(owner.current, locate(world.maxx/2, world.maxy/2, owner.current.z)))]. A thrown ninja star will be a great way to get there.")) + to_chat(owner.current, span_notice("For easier ability access, you can pin your modules to your action bar in your suit's UI.")) owner.announce_objectives() /datum/antagonist/ninja/on_gain() diff --git a/code/modules/antagonists/thief/thief.dm b/code/modules/antagonists/thief/thief.dm index 43ee50bae70d0a..cc52f7a4891a48 100644 --- a/code/modules/antagonists/thief/thief.dm +++ b/code/modules/antagonists/thief/thief.dm @@ -171,3 +171,8 @@ thief.dna.update_ui_block(DNA_SKIN_TONE_BLOCK) thief.update_hair() thief.update_body() + + // This outfit is used by the assets SS, which is ran before the atoms SS + if (SSatoms.initialized == INITIALIZATION_INSSATOMS) + thief.wear_mask?.update_greyscale() + thief.update_inv_wear_mask() diff --git a/code/modules/antagonists/thief/thief_objectives.dm b/code/modules/antagonists/thief/thief_objectives.dm index 99b65512e80f1e..a0b1793cf445f2 100644 --- a/code/modules/antagonists/thief/thief_objectives.dm +++ b/code/modules/antagonists/thief/thief_objectives.dm @@ -119,7 +119,26 @@ GLOBAL_LIST_INIT(hoarder_targets, list( var/amount = 8 /datum/objective/all_access/find_target(dupe_search_range, blacklist) - amount = rand(amount - 2, amount + 2) + var/list/possible_targets = list() + for(var/datum/mind/possible_target as anything in get_crewmember_minds()) + var/target_area = get_area(possible_target.current) + if(possible_target == owner) + continue + if(!ishuman(possible_target.current)) + continue + if(possible_target.current.stat == DEAD) + continue + if(!is_unique_objective(possible_target,dupe_search_range)) + continue + if(!HAS_TRAIT(SSstation, STATION_TRAIT_LATE_ARRIVALS) && istype(target_area, /area/shuttle/arrival)) + continue + if(possible_target in blacklist) + continue + possible_targets += possible_target + if(length(possible_targets) >= amount + 2) + amount = rand(amount - 2, amount + 2) + else + amount = length(possible_targets) /datum/objective/all_access/check_completion() . = ..() diff --git a/code/modules/antagonists/traitor/equipment/Malf_Modules.dm b/code/modules/antagonists/traitor/equipment/Malf_Modules.dm index 7e177775f82c06..7dd233bb6dff5e 100644 --- a/code/modules/antagonists/traitor/equipment/Malf_Modules.dm +++ b/code/modules/antagonists/traitor/equipment/Malf_Modules.dm @@ -4,6 +4,7 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( /obj/machinery/field/containment, /obj/machinery/power/supermatter_crystal, + /obj/machinery/gravity_generator, /obj/machinery/doomsday_device, /obj/machinery/nuclearbomb, /obj/machinery/nuclearbomb/selfdestruct, @@ -89,19 +90,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) /datum/action/innate/ai/ranged name = "Ranged AI Action" auto_use_uses = FALSE //This is so we can do the thing and disable/enable freely without having to constantly add uses - /// The linked proc holder that contains the actual ability code - var/obj/effect/proc_holder/ranged_ai/linked_ability - /// The path of our linked ability - var/linked_ability_type - -/datum/action/innate/ai/ranged/New() - if(!linked_ability_type) - WARNING("Ranged AI action [name] attempted to spawn without a linked ability!") - qdel(src) //uh oh! - return - linked_ability = new linked_ability_type() - linked_ability.attached_action = src - ..() + click_action = TRUE /datum/action/innate/ai/ranged/adjust_uses(amt, silent) uses += amt @@ -113,32 +102,6 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) Remove(owner) QDEL_IN(src, 100) //let any active timers on us finish up -/datum/action/innate/ai/ranged/Destroy() - QDEL_NULL(linked_ability) - return ..() - -/datum/action/innate/ai/ranged/Activate() - linked_ability.toggle(owner) - return TRUE - -/// The actual ranged proc holder. -/obj/effect/proc_holder/ranged_ai - /// Appears when the user activates the ability - var/enable_text = "Hello World!" - /// Appears when the user deactivates the ability - var/disable_text = "Goodbye Cruel World!" - var/datum/action/innate/ai/ranged/attached_action - -/obj/effect/proc_holder/ranged_ai/Destroy() - attached_action = null - return ..() - -/obj/effect/proc_holder/ranged_ai/proc/toggle(mob/user) - if(active) - remove_ranged_ability(disable_text) - else - add_ranged_ability(user, enable_text) - /// The base module type, which holds info about each ability. /datum/ai_module var/name = "generic module" @@ -281,7 +244,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) return if (owner_AI.stat != DEAD) priority_announce("Hostile runtimes detected in all station systems, please deactivate your AI to prevent possible damage to its morality core.", "Anomaly Alert", ANNOUNCER_AIMALF) - set_security_level("delta") + SSsecurity_level.set_level(SEC_LEVEL_DELTA) var/obj/machinery/doomsday_device/DOOM = new(owner_AI) owner_AI.nuking = TRUE owner_AI.doomsday_device = DOOM @@ -318,7 +281,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) STOP_PROCESSING(SSfastprocess, src) SSshuttle.clearHostileEnvironment(src) SSmapping.remove_nuke_threat(src) - set_security_level("red") + SSsecurity_level.set_level(SEC_LEVEL_RED) for(var/mob/living/silicon/robot/borg in owner?.connected_robots) borg.lamp_doom = FALSE borg.toggle_headlamp(FALSE, TRUE) //forces borg lamp to update @@ -426,44 +389,44 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) desc = "Animates a targeted machine, causing it to attack anyone nearby." button_icon_state = "override_machine" uses = 4 - linked_ability_type = /obj/effect/proc_holder/ranged_ai/override_machine + ranged_mousepointer = 'icons/effects/mouse_pointers/override_machine_target.dmi' + enable_text = "You tap into the station's powernet. Click on a machine to animate it, or use the ability again to cancel." + disable_text = "You release your hold on the powernet." /datum/action/innate/ai/ranged/override_machine/New() - ..() + . = ..() desc = "[desc] It has [uses] use\s remaining." -/datum/action/innate/ai/ranged/override_machine/proc/animate_machine(obj/machinery/M) - if(M && !QDELETED(M)) - new/mob/living/simple_animal/hostile/mimic/copy/machine(get_turf(M), M, owner, 1) +/datum/action/innate/ai/ranged/override_machine/do_ability(mob/living/caller, atom/clicked_on) + if(caller.incapacitated()) + unset_ranged_ability(caller) + return FALSE + if(!istype(clicked_on, /obj/machinery)) + to_chat(caller, span_warning("You can only animate machines!")) + return FALSE + var/obj/machinery/clicked_machine = clicked_on + if(!clicked_machine.can_be_overridden() || is_type_in_typecache(clicked_machine, GLOB.blacklisted_malf_machines)) + to_chat(caller, span_warning("That machine can't be overridden!")) + return FALSE -/obj/effect/proc_holder/ranged_ai/override_machine - active = FALSE - ranged_mousepointer = 'icons/effects/mouse_pointers/override_machine_target.dmi' - enable_text = "You tap into the station's powernet. Click on a machine to animate it, or use the ability again to cancel." - disable_text = "You release your hold on the powernet." + caller.playsound_local(caller, 'sound/misc/interference.ogg', 50, FALSE, use_reverb = FALSE) + adjust_uses(-1) -/obj/effect/proc_holder/ranged_ai/override_machine/InterceptClickOn(mob/living/caller, params, obj/machinery/target) - if(..()) - return - if(ranged_ability_user.incapacitated()) - remove_ranged_ability() - return - if(!istype(target)) - to_chat(ranged_ability_user, span_warning("You can only animate machines!")) - return - if(!target.can_be_overridden() || is_type_in_typecache(target, GLOB.blacklisted_malf_machines)) - to_chat(ranged_ability_user, span_warning("That machine can't be overridden!")) - return - ranged_ability_user.playsound_local(ranged_ability_user, 'sound/misc/interference.ogg', 50, 0, use_reverb = FALSE) - attached_action.adjust_uses(-1) - if(attached_action?.uses) - attached_action.desc = "[initial(attached_action.desc)] It has [attached_action.uses] use\s remaining." - attached_action.UpdateButtons() - target.audible_message(span_userdanger("You hear a loud electrical buzzing sound coming from [target]!")) - addtimer(CALLBACK(attached_action, /datum/action/innate/ai/ranged/override_machine.proc/animate_machine, target), 50) //kabeep! - remove_ranged_ability(span_danger("Sending override signal...")) + if(uses) + desc = "[initial(desc)] It has [uses] use\s remaining." + UpdateButtons() + + clicked_machine.audible_message(span_userdanger("You hear a loud electrical buzzing sound coming from [clicked_machine]!")) + addtimer(CALLBACK(src, .proc/animate_machine, caller, clicked_machine), 5 SECONDS) //kabeep! + unset_ranged_ability(caller, span_danger("Sending override signal...")) return TRUE +/datum/action/innate/ai/ranged/override_machine/proc/animate_machine(mob/living/caller, obj/machinery/to_animate) + if(QDELETED(to_animate)) + return + + 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 name = "Destroy RCDs" @@ -503,47 +466,46 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) desc = "Overheats a machine, causing a small explosion after a short time." button_icon_state = "overload_machine" uses = 2 - linked_ability_type = /obj/effect/proc_holder/ranged_ai/overload_machine + ranged_mousepointer = 'icons/effects/mouse_pointers/overload_machine_target.dmi' + enable_text = "You tap into the station's powernet. Click on a machine to detonate it, or use the ability again to cancel." + disable_text = "You release your hold on the powernet." /datum/action/innate/ai/ranged/overload_machine/New() ..() desc = "[desc] It has [uses] use\s remaining." -/datum/action/innate/ai/ranged/overload_machine/proc/detonate_machine(obj/machinery/M) - if(M && !QDELETED(M)) - var/turf/T = get_turf(M) - message_admins("[ADMIN_LOOKUPFLW(usr)] overloaded [M.name] ([M.type]) at [ADMIN_VERBOSEJMP(T)].") - log_game("[key_name(usr)] overloaded [M.name] ([M.type]) at [AREACOORD(T)].") - explosion(M, heavy_impact_range = 2, light_impact_range = 3) - if(M) //to check if the explosion killed it before we try to delete it - qdel(M) - -/obj/effect/proc_holder/ranged_ai/overload_machine - active = FALSE - ranged_mousepointer = 'icons/effects/mouse_pointers/overload_machine_target.dmi' - enable_text = "You tap into the station's powernet. Click on a machine to detonate it, or use the ability again to cancel." - disable_text = "You release your hold on the powernet." - -/obj/effect/proc_holder/ranged_ai/overload_machine/InterceptClickOn(mob/living/caller, params, obj/machinery/target) - if(..()) - return - if(ranged_ability_user.incapacitated()) - remove_ranged_ability() - return - if(!istype(target)) - to_chat(ranged_ability_user, span_warning("You can only overload machines!")) +/datum/action/innate/ai/ranged/overload_machine/proc/detonate_machine(mob/living/caller, obj/machinery/to_explode) + if(QDELETED(to_explode)) return - if(is_type_in_typecache(target, GLOB.blacklisted_malf_machines)) - to_chat(ranged_ability_user, span_warning("You cannot overload that device!")) - return - ranged_ability_user.playsound_local(ranged_ability_user, SFX_SPARKS, 50, 0) - attached_action.adjust_uses(-1) - if(attached_action?.uses) - attached_action.desc = "[initial(attached_action.desc)] It has [attached_action.uses] use\s remaining." - attached_action.UpdateButtons() - target.audible_message(span_userdanger("You hear a loud electrical buzzing sound coming from [target]!")) - addtimer(CALLBACK(attached_action, /datum/action/innate/ai/ranged/overload_machine.proc/detonate_machine, target), 50) //kaboom! - remove_ranged_ability(span_danger("Overcharging machine...")) + + var/turf/machine_turf = get_turf(to_explode) + message_admins("[ADMIN_LOOKUPFLW(caller)] overloaded [to_explode.name] ([to_explode.type]) at [ADMIN_VERBOSEJMP(machine_turf)].") + log_game("[key_name(caller)] overloaded [to_explode.name] ([to_explode.type]) at [AREACOORD(machine_turf)].") + explosion(to_explode, heavy_impact_range = 2, light_impact_range = 3) + if(!QDELETED(to_explode)) //to check if the explosion killed it before we try to delete it + qdel(to_explode) + +/datum/action/innate/ai/ranged/overload_machine/do_ability(mob/living/caller, atom/clicked_on) + if(caller.incapacitated()) + unset_ranged_ability(caller) + return FALSE + if(!istype(clicked_on, /obj/machinery)) + to_chat(caller, span_warning("You can only overload machines!")) + return FALSE + var/obj/machinery/clicked_machine = clicked_on + if(is_type_in_typecache(clicked_machine, GLOB.blacklisted_malf_machines)) + to_chat(caller, span_warning("You cannot overload that device!")) + return FALSE + + caller.playsound_local(caller, SFX_SPARKS, 50, 0) + adjust_uses(-1) + if(uses) + desc = "[initial(desc)] It has [uses] use\s remaining." + UpdateButtons() + + clicked_machine.audible_message(span_userdanger("You hear a loud electrical buzzing sound coming from [clicked_machine]!")) + addtimer(CALLBACK(src, .proc/detonate_machine, caller, clicked_machine), 5 SECONDS) //kaboom! + unset_ranged_ability(caller, span_danger("Overcharging machine...")) return TRUE /// Blackout: Overloads a random number of lights across the station. Three uses. @@ -757,7 +719,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) /datum/action/innate/ai/emergency_lights/Activate() for(var/obj/machinery/light/L in GLOB.machines) if(is_station_level(L.z)) - L.no_emergency = TRUE + L.no_low_power = TRUE INVOKE_ASYNC(L, /obj/machinery/light/.proc/update, FALSE) CHECK_TICK to_chat(owner, span_notice("Emergency light connections severed.")) diff --git a/code/modules/antagonists/traitor/objectives/bug_room.dm b/code/modules/antagonists/traitor/objectives/bug_room.dm index f92d8b403c262d..0093f20889e45c 100644 --- a/code/modules/antagonists/traitor/objectives/bug_room.dm +++ b/code/modules/antagonists/traitor/objectives/bug_room.dm @@ -25,6 +25,7 @@ JOB_CHIEF_ENGINEER = /area/station/command/heads_quarters/ce, JOB_HEAD_OF_PERSONNEL = /area/station/command/heads_quarters/hop, JOB_CAPTAIN = /area/station/command/heads_quarters/captain, // For head roles so that they can still get this objective. + JOB_QUARTERMASTER = /area/station/cargo/qm, ) var/datum/job/target_office var/requires_head_as_supervisor = TRUE diff --git a/code/modules/antagonists/traitor/objectives/destroy_heirloom.dm b/code/modules/antagonists/traitor/objectives/destroy_heirloom.dm index 1e3c2586da1b0a..71289cbfe9cbb3 100644 --- a/code/modules/antagonists/traitor/objectives/destroy_heirloom.dm +++ b/code/modules/antagonists/traitor/objectives/destroy_heirloom.dm @@ -66,7 +66,6 @@ progression_maximum = 45 MINUTES target_jobs = list( // Cargo - /datum/job/quartermaster, /datum/job/shaft_miner, // Service /datum/job/chaplain, @@ -88,6 +87,7 @@ /datum/job/head_of_personnel, /datum/job/chief_medical_officer, /datum/job/research_director, + /datum/job/quartermaster, ) /datum/traitor_objective/destroy_heirloom/captain diff --git a/code/modules/antagonists/traitor/objectives/destroy_machinery.dm b/code/modules/antagonists/traitor/objectives/destroy_machinery.dm index 514c37b0aed266..7daae4a859ff13 100644 --- a/code/modules/antagonists/traitor/objectives/destroy_machinery.dm +++ b/code/modules/antagonists/traitor/objectives/destroy_machinery.dm @@ -23,6 +23,7 @@ JOB_CHIEF_ENGINEER = /obj/machinery/rnd/production/protolathe/department/engineering, JOB_HEAD_OF_PERSONNEL = /obj/machinery/rnd/production/techfab/department/service, JOB_SHAFT_MINER = /obj/machinery/mineral/ore_redemption, + JOB_QUARTERMASTER = /obj/machinery/rnd/production/techfab/department/cargo, ) /// Whether this can bypass the maximum_allowed value or not var/allow_more_than_max = FALSE diff --git a/code/modules/antagonists/traitor/objectives/eyesnatching.dm b/code/modules/antagonists/traitor/objectives/eyesnatching.dm index 0e87513eadd428..402f9b56136e7a 100644 --- a/code/modules/antagonists/traitor/objectives/eyesnatching.dm +++ b/code/modules/antagonists/traitor/objectives/eyesnatching.dm @@ -72,7 +72,7 @@ continue var/mob/living/carbon/human/targets_current = possible_target.current - if(!targets_current.getorgan(/obj/item/organ/eyes)) + if(!targets_current.getorgan(/obj/item/organ/internal/eyes)) continue possible_targets += targets_current @@ -100,7 +100,7 @@ RegisterSignal(victim, COMSIG_CARBON_LOSE_ORGAN, .proc/check_eye_removal) AddComponent(/datum/component/traitor_objective_register, victim, fail_signals = COMSIG_PARENT_QDELETING) -/datum/traitor_objective/eyesnatching/proc/check_eye_removal(datum/source, obj/item/organ/eyes/removed) +/datum/traitor_objective/eyesnatching/proc/check_eye_removal(datum/source, obj/item/organ/internal/eyes/removed) SIGNAL_HANDLER if(!istype(removed)) @@ -148,7 +148,7 @@ if(!istype(victim) || !victim.Adjacent(user)) //No TK use return ..() - var/obj/item/organ/eyes/eyeballies = victim.getorganslot(ORGAN_SLOT_EYES) + var/obj/item/organ/internal/eyes/eyeballies = victim.getorganslot(ORGAN_SLOT_EYES) var/obj/item/bodypart/head/head = victim.get_bodypart(BODY_ZONE_HEAD) if(!eyeballies || victim.is_eyes_covered()) @@ -200,7 +200,7 @@ desc += " It has been used up." update_icon() -/obj/item/eyesnatcher/proc/eyeballs_exist(obj/item/organ/eyes/eyeballies, obj/item/bodypart/head, mob/living/carbon/human/victim) +/obj/item/eyesnatcher/proc/eyeballs_exist(obj/item/organ/internal/eyes/eyeballies, obj/item/bodypart/head/head, mob/living/carbon/human/victim) if(!eyeballies || QDELETED(eyeballies)) return FALSE @@ -213,7 +213,7 @@ if(eyeballies.owner != victim) return FALSE - if(head.owner != victim || head.eyes != eyes) + if(head.owner != victim || head.eyes != eyeballies) return FALSE return TRUE diff --git a/code/modules/antagonists/traitor/objectives/final_objective/final_objective.dm b/code/modules/antagonists/traitor/objectives/final_objective/final_objective.dm index 1a58aa86aac8ba..904397813b3959 100644 --- a/code/modules/antagonists/traitor/objectives/final_objective/final_objective.dm +++ b/code/modules/antagonists/traitor/objectives/final_objective/final_objective.dm @@ -20,6 +20,12 @@ return FALSE if(SStraitor.get_taken_count(type) > 0) // Prevents multiple people from ever getting the same final objective. return FALSE + var/valid_crystal = FALSE + for(var/obj/machinery/power/supermatter_crystal/engine/crystal in GLOB.machines) + if(is_station_level(crystal.z) || is_mining_level(crystal.z)) + valid_crystal = TRUE + if(!valid_crystal) + return FALSE return TRUE /datum/traitor_objective/final/on_objective_taken(mob/user) diff --git a/code/modules/antagonists/traitor/objectives/final_objective/supermatter_cascade.dm b/code/modules/antagonists/traitor/objectives/final_objective/supermatter_cascade.dm index 8b3c02004d7bfd..0fd68891db16a4 100644 --- a/code/modules/antagonists/traitor/objectives/final_objective/supermatter_cascade.dm +++ b/code/modules/antagonists/traitor/objectives/final_objective/supermatter_cascade.dm @@ -1,7 +1,7 @@ /datum/traitor_objective/final/supermatter_cascade - name = "destroy the station by causing a crystallizing resonance cascade" + name = "Destroy the station by causing a crystallizing resonance cascade" description = "Destroy the station by causing a supermatter cascade. Go to %AREA% to retrieve the destabilizing crystal \ - and use it on the SM." + and use it on the supermatter." ///area type the objective owner must be in to recieve the destabilizing crystal var/area/dest_crystal_area_pickup @@ -34,7 +34,7 @@ return var/area/delivery_area = get_area(user) if(delivery_area.type != dest_crystal_area_pickup) - to_chat(user, span_warning("You must be in [initial(dest_crystal_area_pickup.name)] to recieve the supermatter cascade kit.")) + to_chat(user, span_warning("You must be in [initial(dest_crystal_area_pickup.name)] to receive the supermatter cascade kit.")) return sent_crystal = TRUE podspawn(list( diff --git a/code/modules/antagonists/traitor/objectives/hack_comm_console.dm b/code/modules/antagonists/traitor/objectives/hack_comm_console.dm index 78d22e592eef96..ca8de0ba7c2d72 100644 --- a/code/modules/antagonists/traitor/objectives/hack_comm_console.dm +++ b/code/modules/antagonists/traitor/objectives/hack_comm_console.dm @@ -41,8 +41,7 @@ return COMPONENT_CANCEL_ATTACK_CHAIN /datum/traitor_objective/hack_comm_console/proc/begin_hack(mob/user, obj/machinery/computer/communications/target) - target.AI_notify_hack() - if(!do_after(user, 30 SECONDS, target)) + if(!target.try_hack_console(user)) return + succeed_objective() - target.hack_console(user) diff --git a/code/modules/antagonists/traitor/objectives/kidnapping.dm b/code/modules/antagonists/traitor/objectives/kidnapping.dm index b740a72d316e73..4eec6ff1a56c65 100644 --- a/code/modules/antagonists/traitor/objectives/kidnapping.dm +++ b/code/modules/antagonists/traitor/objectives/kidnapping.dm @@ -73,7 +73,6 @@ // Medical /datum/job/virologist, // Cargo - /datum/job/quartermaster, /datum/job/shaft_miner, // Service /datum/job/cook, @@ -97,6 +96,7 @@ /datum/job/head_of_personnel, /datum/job/chief_medical_officer, /datum/job/research_director, + /datum/job/quartermaster, ) progression_reward = list(8 MINUTES, 12 MINUTES) diff --git a/code/modules/antagonists/traitor/objectives/kill_pet.dm b/code/modules/antagonists/traitor/objectives/kill_pet.dm index 9ad19c0163050f..ff1e18ac2ce461 100644 --- a/code/modules/antagonists/traitor/objectives/kill_pet.dm +++ b/code/modules/antagonists/traitor/objectives/kill_pet.dm @@ -24,6 +24,11 @@ JOB_CAPTAIN = /mob/living/simple_animal/pet/fox/renault, JOB_CHIEF_MEDICAL_OFFICER = /mob/living/simple_animal/pet/cat/runtime, JOB_CHIEF_ENGINEER = /mob/living/simple_animal/parrot/poly, + JOB_QUARTERMASTER = list( + /mob/living/simple_animal/sloth/citrus, + /mob/living/simple_animal/sloth/paperwork, + /mob/living/simple_animal/hostile/gorilla/cargo_domestic, + ) ) /// The head that we are targetting var/datum/job/target diff --git a/code/modules/antagonists/traitor/objectives/locate_weakpoint.dm b/code/modules/antagonists/traitor/objectives/locate_weakpoint.dm index e5066b5c146ab8..f28718636e7abb 100644 --- a/code/modules/antagonists/traitor/objectives/locate_weakpoint.dm +++ b/code/modules/antagonists/traitor/objectives/locate_weakpoint.dm @@ -18,23 +18,58 @@ var/obj/item/weakpoint_locator/locator /// Reference to the ES8 explosive (if we sent one) var/obj/item/grenade/c4/es8/shatter_charge - /// Locations we have to use the locator in - var/list/triangulation_locations /// Have we located the weakpoint yet? var/weakpoint_found = FALSE + /// Weakpoint scan areas and the weakpoint itself + var/list/weakpoint_areas /datum/traitor_objective/locate_weakpoint/generate_objective(datum/mind/generating_for, list/possible_duplicates) - ////if(handler.get_completion_progression(/datum/traitor_objective) < progression_objectives_minimum) - //// return FALSE - - if(!SStraitor.station_weakpoints || !LAZYLEN(SStraitor.station_weakpoints)) //This means that the weakpoint has already been hit + if(handler.get_completion_progression(/datum/traitor_objective) < progression_objectives_minimum) return FALSE - var/area/weakpoint_area1 = SStraitor.station_weakpoints[1] - var/area/weakpoint_area2 = SStraitor.station_weakpoints[2] + if(SStraitor.taken_objectives_by_type[/datum/traitor_objective/locate_weakpoint]) + for(var/datum/traitor_objective/locate_weakpoint/weakpoint_objective in SStraitor.taken_objectives_by_type[type]) + if(weakpoint_objective.objective_state == OBJECTIVE_STATE_COMPLETED) + return FALSE + + if(weakpoint_areas) + continue + + weakpoint_areas = weakpoint_objective.weakpoint_areas.Copy() + for(var/weakpoint in weakpoint_areas) + weakpoint_areas[weakpoint] = TRUE + + if(!weakpoint_areas) + weakpoint_areas = list() + /// List of high-security areas that we pick required ones from + var/list/allowed_areas = typecacheof(list(/area/station/command, + /area/station/cargo/qm, + /area/station/comms, + /area/station/engineering, + /area/station/science, + /area/station/security, + )) + + var/list/blacklisted_areas = typecacheof(list(/area/station/engineering/hallway, + /area/station/engineering/lobby, + /area/station/engineering/storage, + /area/station/science/lobby, + /area/station/science/ordnance/bomb, + /area/station/security/prison, + )) + + var/list/possible_areas = GLOB.the_station_areas.Copy() + for(var/area/possible_area as anything in possible_areas) + if(!is_type_in_typecache(possible_area, allowed_areas) || initial(possible_area.outdoors) || is_type_in_typecache(possible_area, blacklisted_areas)) + possible_areas -= possible_area + + for(var/i in 1 to 3) + weakpoint_areas[pick_n_take(possible_areas)] = TRUE + + var/area/weakpoint_area1 = weakpoint_areas[1] + var/area/weakpoint_area2 = weakpoint_areas[2] replace_in_name("%AREA1%", initial(weakpoint_area1.name)) replace_in_name("%AREA2%", initial(weakpoint_area2.name)) - triangulation_locations = list(SStraitor.station_weakpoints[1] = TRUE, SStraitor.station_weakpoints[2] = TRUE) RegisterSignal(generating_for, COMSIG_GLOB_TRAITOR_OBJECTIVE_COMPLETED, .proc/on_global_obj_completed) return TRUE @@ -58,8 +93,9 @@ if(locator) return locator = new(user.drop_location()) - user.put_in_hands(locator) + user.put_in_hands(locator, weakpoint_areas[1], weakpoint_areas[2]) locator.balloon_alert(user, "the weakpoint locator materializes in your hand") + if("shatter_charge") if(shatter_charge) return @@ -69,7 +105,7 @@ /datum/traitor_objective/locate_weakpoint/proc/weakpoint_located() description = "Structural weakpoint has been located in %AREA%. Detonate an ES8 explosive charge there to create a shockwave that will severely damage the station." - var/area/weakpoint_area = SStraitor.station_weakpoints[3] + var/area/weakpoint_area = weakpoint_areas[3] replace_in_name("%AREA%", initial(weakpoint_area.name)) weakpoint_found = TRUE @@ -102,7 +138,6 @@ "[command_name()] High-Priority Update" ) - SStraitor.station_weakpoints = null //Gone succeed_objective() /obj/item/weakpoint_locator @@ -118,12 +153,10 @@ throw_speed = 3 throw_range = 5 -/obj/item/weakpoint_locator/Initialize(mapload) +/obj/item/weakpoint_locator/Initialize(mapload, area/area1, area/area2) . = ..() - var/area/weakpoint_area1 = SStraitor.station_weakpoints[1] - var/area/weakpoint_area2 = SStraitor.station_weakpoints[2] - desc = replacetext(desc, "%AREA1%", initial(weakpoint_area1.name)) - desc = replacetext(desc, "%AREA2%", initial(weakpoint_area2.name)) + desc = replacetext(desc, "%AREA1%", initial(area1.name)) + desc = replacetext(desc, "%AREA2%", initial(area2.name)) /obj/item/weakpoint_locator/attack_self(mob/living/user, modifiers) . = ..() @@ -140,12 +173,12 @@ return var/area/user_area = get_area(user) - if(!(user_area.type in objective.triangulation_locations)) + if(!(user_area.type in objective.weakpoint_areas)) balloon_alert(user, "invalid area!") playsound(user, 'sound/machines/buzz-sigh.ogg', 30, TRUE) return - if(!objective.triangulation_locations[user_area.type]) + if(!objective.weakpoint_areas[user_area.type]) balloon_alert(user, "already scanned here!") playsound(user, 'sound/machines/buzz-sigh.ogg', 30, TRUE) return @@ -156,18 +189,18 @@ for(var/mob/living/silicon/ai/ai_player in GLOB.player_list) to_chat(ai_player, alertstr) - if(!do_after(user, 3 SECONDS, src, IGNORE_USER_LOC_CHANGE | IGNORE_TARGET_LOC_CHANGE | IGNORE_HELD_ITEM | IGNORE_INCAPACITATED | IGNORE_SLOWDOWNS, extra_checks = CALLBACK(src, .proc/scan_checks, user, user_area, objective))) + if(!do_after(user, 30 SECONDS, src, IGNORE_USER_LOC_CHANGE | IGNORE_TARGET_LOC_CHANGE | IGNORE_HELD_ITEM | IGNORE_INCAPACITATED | IGNORE_SLOWDOWNS, extra_checks = CALLBACK(src, .proc/scan_checks, user, user_area, objective))) playsound(user, 'sound/machines/buzz-sigh.ogg', 30, TRUE) return playsound(user, 'sound/machines/ding.ogg', 100, TRUE) - objective.triangulation_locations[user_area.type] = FALSE - for(var/area/scan_area in objective.triangulation_locations) - if(objective.triangulation_locations[scan_area]) + objective.weakpoint_areas[user_area.type] = FALSE + for(var/area/scan_area in objective.weakpoint_areas) + if(objective.weakpoint_areas[scan_area]) say("Next scanning location is [initial(scan_area.name)]") return - var/area/weakpoint_location = SStraitor.station_weakpoints[3] + var/area/weakpoint_location = objective.weakpoint_areas[3] to_chat(user, span_notice("Scan finished. Structural weakpoint located in [initial(weakpoint_location.name)].")) objective.weakpoint_located() @@ -175,7 +208,7 @@ if(get_area(user) != user_area) return FALSE - if(parent_objective.objective_state == OBJECTIVE_STATE_FAILED || parent_objective.objective_state == OBJECTIVE_STATE_INVALID) + if(parent_objective.objective_state != OBJECTIVE_STATE_ACTIVE) return FALSE var/atom/current_loc = loc @@ -234,8 +267,8 @@ return var/area/target_area = get_area(target) - if (target_area.type != SStraitor.station_weakpoints[3]) - var/area/weakpoint_area = SStraitor.station_weakpoints[3] + if (target_area.type != objective.weakpoint_areas[3]) + var/area/weakpoint_area = objective.weakpoint_areas[3] to_chat(user, span_warning("[src] can only be detonated in [initial(weakpoint_area.name)].")) return @@ -243,7 +276,7 @@ /obj/item/grenade/c4/es8/detonate(mob/living/lanced_by) var/area/target_area = get_area(target) - if (target_area.type != SStraitor.station_weakpoints[3]) + if (target_area.type != objective.weakpoint_areas[3]) var/obj/item/grenade/c4/es8/new_bomb = new(target.drop_location()) new_bomb.balloon_alert_to_viewers("invalid location!") target.cut_overlay(plastic_overlay, TRUE) diff --git a/code/modules/antagonists/traitor/objectives/steal.dm b/code/modules/antagonists/traitor/objectives/steal.dm index ab75198d6b97c1..4a3d062857f088 100644 --- a/code/modules/antagonists/traitor/objectives/steal.dm +++ b/code/modules/antagonists/traitor/objectives/steal.dm @@ -204,7 +204,7 @@ GLOBAL_DATUM_INIT(steal_item_handler, /datum/objective_item_handler, new()) buttons += add_ui_button("", "Pressing this will materialize a bug in your hand, which you can place on the target item", "wifi", "summon_bug") else if(bug.planted_on) buttons += add_ui_button("[DisplayTimeText(time_fulfilled)]", "This tells you how much time you have spent around the target item after the bug has been planted.", "clock", "none") - buttons += add_ui_button("Skip Time", "Pressing this will succeed the mission. You will not get the extra TC and progression.", "forward-step", "cash_out") + buttons += add_ui_button("Skip Time", "Pressing this will succeed the mission. You will not get the extra TC and progression.", "forward", "cash_out") return buttons /datum/traitor_objective/steal_item/ui_perform_action(mob/living/user, action) diff --git a/code/modules/antagonists/traitor/traitor_objective.dm b/code/modules/antagonists/traitor/traitor_objective.dm index 6c4eb50100f663..6c31d4e88af897 100644 --- a/code/modules/antagonists/traitor/traitor_objective.dm +++ b/code/modules/antagonists/traitor/traitor_objective.dm @@ -30,12 +30,12 @@ var/skipped = FALSE /// Determines how influential global progression will affect this objective. Set to 0 to disable. - var/global_progression_influence_intensity = 0.5 + var/global_progression_influence_intensity = 0.1 /// Determines how great the deviance has to be before progression starts to get reduced. - var/global_progression_deviance_required = 0.5 + var/global_progression_deviance_required = 1 /// Determines the minimum and maximum progression this objective can be worth as a result of being influenced by global progression /// Should only be smaller than or equal to 1 - var/global_progression_limit_coeff = 0.1 + var/global_progression_limit_coeff = 0.6 /// The deviance coefficient used to determine the randomness of the progression rewards. var/progression_cost_coeff_deviance = 0.05 /// This gets added onto the coeff when calculating the updated progression cost. Used for variability and a slight bit of randomness diff --git a/code/modules/antagonists/traitor/uplink_handler.dm b/code/modules/antagonists/traitor/uplink_handler.dm index b89b5bdde77183..47140d8991e72e 100644 --- a/code/modules/antagonists/traitor/uplink_handler.dm +++ b/code/modules/antagonists/traitor/uplink_handler.dm @@ -127,6 +127,7 @@ objective.original_progression = objective.progression_reward objective.update_progression_reward() potential_objectives += objective + SStraitor.add_objective_to_list(objective, SStraitor.all_objectives_by_type) return objective /datum/uplink_handler/proc/handle_duplicate(datum/traitor_objective/potential_duplicate) diff --git a/code/modules/antagonists/wizard/equipment/artefact.dm b/code/modules/antagonists/wizard/equipment/artefact.dm index 1f0c2de37c2fd7..80031ad31f0b4a 100644 --- a/code/modules/antagonists/wizard/equipment/artefact.dm +++ b/code/modules/antagonists/wizard/equipment/artefact.dm @@ -306,17 +306,12 @@ icon = 'icons/obj/wizard.dmi' icon_state = "whistle" - /// Cooldown between whistle uses. - COOLDOWN_DECLARE(whistle_cooldown) /// Person using the warp whistle var/mob/living/whistler /obj/item/warp_whistle/attack_self(mob/user) - if(!COOLDOWN_FINISHED(src, whistle_cooldown)) - to_chat(user, span_warning("[src] is still on cooldown!")) - return if(whistler) - to_chat(user, span_warning("[src] is already warping.")) + to_chat(user, span_warning("[src] is on cooldown.")) return whistler = user @@ -324,7 +319,6 @@ var/turf/spawn_location = locate(user.x + pick(-7, 7), user.y, user.z) playsound(current_turf,'sound/magic/warpwhistle.ogg', 200, TRUE) new /obj/effect/temp_visual/teleporting_tornado(spawn_location, src) - COOLDOWN_START(src, whistle_cooldown, 4 SECONDS) ///Teleporting tornado, spawned by warp whistle, teleports the user if they manage to pick them up. /obj/effect/temp_visual/teleporting_tornado @@ -335,7 +329,7 @@ layer = FLY_LAYER plane = ABOVE_GAME_PLANE randomdir = FALSE - duration = 10 SECONDS + duration = 8 SECONDS movement_type = PHASING /// Reference to the whistle @@ -376,5 +370,6 @@ /// Destroy the tornado and teleport everyone on it away. /obj/effect/temp_visual/teleporting_tornado/Destroy() if(whistle) + whistle.whistler = null whistle = null return ..() diff --git a/code/modules/antagonists/wizard/equipment/soulstone.dm b/code/modules/antagonists/wizard/equipment/soulstone.dm index 7a77d01bbcdf51..27a2a2b79be041 100644 --- a/code/modules/antagonists/wizard/equipment/soulstone.dm +++ b/code/modules/antagonists/wizard/equipment/soulstone.dm @@ -9,10 +9,16 @@ desc = "A fragment of the legendary treasure known simply as the 'Soul Stone'. The shard still flickers with a fraction of the full artefact's power." w_class = WEIGHT_CLASS_TINY slot_flags = ITEM_SLOT_BELT + /// if TRUE, we can only be used once. var/one_use = FALSE - var/grab_sleeping = TRUE + /// Only used if one_use is TRUE. Whether it's used. var/spent = FALSE - /// This controls the color of the soulstone as well as restrictions for who can use it. THEME_CULT is red and is the default of cultist THEME_WIZARD is purple and is the default of wizard and THEME_HOLY is for purified soul stone + /// if TRUE, our soulstone will work on mobs which are in crit. if FALSE, the mob must be dead. + var/grab_sleeping = TRUE + /// This controls the color of the soulstone as well as restrictions for who can use it. + /// THEME_CULT is red and is the default of cultist + /// THEME_WIZARD is purple and is the default of wizard + /// THEME_HOLY is for purified soul stone var/theme = THEME_CULT /// Role check, if any needed var/required_role = /datum/antagonist/cult @@ -22,6 +28,55 @@ if(theme != THEME_HOLY) RegisterSignal(src, COMSIG_BIBLE_SMACKED, .proc/on_bible_smacked) +/obj/item/soulstone/update_appearance(updates) + . = ..() + for(var/mob/living/simple_animal/shade/sharded_shade in src) + switch(theme) + if(THEME_HOLY) + sharded_shade.name = "Purified [sharded_shade.real_name]" + sharded_shade.icon_state = "shade_holy" + sharded_shade.loot = list(/obj/item/ectoplasm/angelic) + if(THEME_CULT) + sharded_shade.name = sharded_shade.real_name + sharded_shade.icon_state = "shade_cult" + sharded_shade.loot = list(/obj/item/ectoplasm) + if(THEME_WIZARD) + sharded_shade.name = sharded_shade.real_name + sharded_shade.icon_state = "shade_wizard" + sharded_shade.loot = list(/obj/item/ectoplasm/mystic) + +/obj/item/soulstone/update_icon_state() + . = ..() + switch(theme) + if(THEME_HOLY) + icon_state = "purified_soulstone" + if(THEME_CULT) + icon_state = "soulstone" + if(THEME_WIZARD) + icon_state = "mystic_soulstone" + + if(contents.len) + icon_state = "[icon_state]2" + +/obj/item/soulstone/update_name(updates) + . = ..() + if(spent) + name = "dull [name]" + return + + var/mob/living/simple_animal/shade/shade = locate() in src + if(shade) + name = "[name]: [shade.real_name]" + else + name = initial(name) + +/obj/item/soulstone/update_desc(updates) + . = ..() + if(spent) + desc = "A fragment of the legendary treasure known simply as \ + the 'Soul Stone'. The shard lies still, dull and lifeless; \ + whatever spark it once held long extinguished." + ///signal called whenever a soulstone is smacked by a bible /obj/item/soulstone/proc/on_bible_smacked(datum/source, mob/living/user, direction) SIGNAL_HANDLER @@ -38,21 +93,17 @@ if(IS_CULTIST(exorcist) || theme == THEME_HOLY) return balloon_alert(exorcist, span_notice("exorcising [src]...")) - playsound(src,'sound/hallucinations/veryfar_noise.ogg',40,TRUE) + playsound(src, 'sound/hallucinations/veryfar_noise.ogg', 40, TRUE) if(!do_after(exorcist, 4 SECONDS, target = src)) return - playsound(src,'sound/effects/pray_chaplain.ogg',60,TRUE) + playsound(src, 'sound/effects/pray_chaplain.ogg', 60, TRUE) required_role = null theme = THEME_HOLY - icon_state = "purified_soulstone" - for(var/mob/mob_cultist in contents) - if(!mob_cultist.mind) - continue - icon_state = "purified_soulstone2" - mob_cultist.mind.remove_antag_datum(/datum/antagonist/cult) - for(var/mob/living/simple_animal/shade/sharded_shade in src) - sharded_shade.icon_state = "ghost1" - sharded_shade.name = "Purified [sharded_shade.real_name]" + + update_appearance() + for(var/mob/shade_to_deconvert in contents) + shade_to_deconvert.mind?.remove_antag_datum(/datum/antagonist/cult) + exorcist.visible_message(span_notice("[exorcist] purifies [src]!")) UnregisterSignal(src, COMSIG_BIBLE_SMACKED) @@ -62,65 +113,29 @@ /obj/item/soulstone/proc/corrupt() if(theme == THEME_CULT) return FALSE - required_role = null + + required_role = /datum/antagonist/cult theme = THEME_CULT - icon_state = "soulstone" + update_appearance() for(var/mob/shade_to_convert in contents) - if(!shade_to_convert.mind) - continue - icon_state = "soulstone2" if(IS_CULTIST(shade_to_convert)) continue - shade_to_convert.mind.add_antag_datum(/datum/antagonist/cult) - for(var/mob/living/simple_animal/shade/sharded_shade in src) - sharded_shade.icon_state = "shade_cult" - sharded_shade.name = sharded_shade.real_name + shade_to_convert.mind?.add_antag_datum(/datum/antagonist/cult) + RegisterSignal(src, COMSIG_BIBLE_SMACKED) return TRUE +/// Checks if the passed mob has the required antag datum set on the soulstone. /obj/item/soulstone/proc/role_check(mob/who) return required_role ? (who.mind && who.mind.has_antag_datum(required_role, TRUE)) : TRUE -/obj/item/soulstone/proc/was_used() - if(one_use) - spent = TRUE - name = "dull [name]" - desc = "A fragment of the legendary treasure known simply as \ - the 'Soul Stone'. The shard lies still, dull and lifeless; \ - whatever spark it once held long extinguished." - -/obj/item/soulstone/anybody - required_role = null - -/obj/item/soulstone/mystic - icon_state = "mystic_soulstone" - theme = THEME_WIZARD - required_role = /datum/antagonist/wizard - -/obj/item/soulstone/anybody/revolver - one_use = TRUE - grab_sleeping = FALSE - -/obj/item/soulstone/anybody/purified - icon_state = "purified_soulstone" - theme = THEME_HOLY - -/obj/item/soulstone/anybody/chaplain - name = "mysterious old shard" - one_use = TRUE - grab_sleeping = FALSE - -/obj/item/soulstone/anybody/chaplain/sparring - icon_state = "purified_soulstone" - theme = THEME_HOLY - -/obj/item/soulstone/anybody/chaplain/sparring/Initialize(mapload) - . = ..() - name = "[GLOB.deity]'s punishment" - desc = "A prison for those who lost [GLOB.deity]'s game." +/// Called whenever the soulstone releases a shade from it. +/obj/item/soulstone/proc/on_release_spirits() + if(!one_use) + return -/obj/item/soulstone/anybody/mining - grab_sleeping = FALSE + spent = TRUE + update_appearance() /obj/item/soulstone/pickup(mob/living/user) ..() @@ -155,7 +170,7 @@ /obj/item/soulstone/attack(mob/living/carbon/human/M, mob/living/user) if(!role_check(user)) - user.Unconscious(100) + user.Unconscious(10 SECONDS) to_chat(user, span_userdanger("Your body is wracked with debilitating pain!")) return if(spent) @@ -163,6 +178,8 @@ return if(!ishuman(M))//If target is not a human. return ..() + if(M == user) + return if(IS_CULTIST(M) && IS_CULTIST(user)) to_chat(user, span_cultlarge("\"Come now, do not capture your bretheren's soul.\"")) return @@ -190,28 +207,21 @@ release_shades(user) /obj/item/soulstone/proc/release_shades(mob/user, silent = FALSE) - for(var/mob/living/simple_animal/shade/A in src) - A.forceMove(get_turf(user)) - A.cancel_camera() - switch(theme) - if(THEME_HOLY) - icon_state = "purified_soulstone" - A.icon_state = "shade_holy" - A.name = "Purified [A.real_name]" - A.loot = list(/obj/item/ectoplasm/angelic) - if(THEME_WIZARD) - icon_state = "mystic_soulstone" - A.icon_state = "shade_wizard" - A.loot = list(/obj/item/ectoplasm/mystic) - if(THEME_CULT) - icon_state = "soulstone" - name = initial(name) + for(var/mob/living/simple_animal/shade/captured_shade in src) + captured_shade.forceMove(get_turf(user)) + captured_shade.cancel_camera() + update_appearance() if(!silent) if(IS_CULTIST(user)) - to_chat(A, "You have been released from your prison, but you are still bound to the cult's will. Help them succeed in their goals at all costs.") + to_chat(captured_shade, span_bold("You have been released from your prison, \ + but you are still bound to the cult's will. Help them succeed in their goals at all costs.")) + else if(role_check(user)) - to_chat(A, "You have been released from your prison, but you are still bound to [user.real_name]'s will. Help [user.p_them()] succeed in [user.p_their()] goals at all costs.") - was_used() + to_chat(captured_shade, span_bold("You have been released from your prison, \ + but you are still bound to [user.real_name]'s will. Help [user.p_them()] succeed in \ + [user.p_their()] goals at all costs.")) + + on_release_spirits() /obj/item/soulstone/pre_attack(atom/A, mob/living/user, params) var/mob/living/simple_animal/shade/occupant = (locate() in src) @@ -277,46 +287,57 @@ /// Procs for moving soul in and out off stone -/// transfer the mind of a carbon mob (which is then dusted) into a shade mob inside src. If forced, sacrifical and stat checks are skipped. +/// Transfer the mind of a carbon mob (which is then dusted) into a shade mob inside src. +/// If forced, sacrifical and stat checks are skipped. /obj/item/soulstone/proc/capture_soul(mob/living/carbon/victim, mob/user, forced = FALSE) if(!iscarbon(victim)) //TODO: Add sacrifice stoning for non-organics, just because you have no body doesnt mean you dont have a soul return FALSE - if(!forced) - var/datum/antagonist/cult/C = user?.mind?.has_antag_datum(/datum/antagonist/cult,TRUE) - if(C?.cult_team.is_sacrifice_target(victim.mind)) - to_chat(user, span_cult("\"This soul is mine.
SACRIFICE THEM!\"")) - return FALSE if(contents.len) return FALSE - if(!forced && (grab_sleeping ? victim.stat == CONSCIOUS : victim.stat != DEAD)) - to_chat(user, "[span_userdanger("Capture failed!")]: Kill or maim the victim first!") - return FALSE + + if(!forced) + var/datum/antagonist/cult/cultist = IS_CULTIST(user) + if(cultist) + var/datum/team/cult/cult_team = cultist.get_team() + if(victim.mind && cult_team.is_sacrifice_target(victim.mind)) + to_chat(user, span_cult("\"This soul is mine. SACRIFICE THEM!\"")) + return FALSE + + if(grab_sleeping ? victim.stat == CONSCIOUS : victim.stat != DEAD) + to_chat(user, "[span_userdanger("Capture failed!")]: Kill or maim the victim first!") + return FALSE + + victim.grab_ghost() if(victim.client) - victim.unequip_everything() init_shade(victim, user) return TRUE - else - to_chat(user, "[span_userdanger("Capture failed!")]: The soul has already fled its mortal frame. You attempt to bring it back...") - INVOKE_ASYNC(src, .proc/getCultGhost, victim, user) - return TRUE //it'll probably get someone ;) + + to_chat(user, "[span_userdanger("Capture failed!")]: The soul has already fled its mortal frame. You attempt to bring it back...") + INVOKE_ASYNC(src, .proc/get_ghost_to_replace_shade, victim, user) + return TRUE //it'll probably get someone ;) ///captures a shade that was previously released from a soulstone. -/obj/item/soulstone/proc/capture_shade(mob/living/simple_animal/shade/shade, mob/user) +/obj/item/soulstone/proc/capture_shade(mob/living/simple_animal/shade/shade, mob/living/user) + if(isliving(user) && !role_check(user)) + user.Unconscious(10 SECONDS) + to_chat(user, span_userdanger("Your body is wracked with debilitating pain!")) + return if(contents.len) to_chat(user, "[span_userdanger("Capture failed!")]: [src] is full! Free an existing soul to make room.") return FALSE shade.AddComponent(/datum/component/soulstoned, src) + update_appearance() if(theme == THEME_HOLY) - icon_state = "purified_soulstone2" - shade.mind?.remove_antag_datum(/datum/antagonist/cult) - if(theme == THEME_WIZARD) - icon_state = "mystic_soulstone2" - if(theme == THEME_CULT) - icon_state = "soulstone2" - name = "soulstone: [shade.real_name]" - to_chat(shade, span_notice("Your soul has been captured by [src]. Its arcane energies are reknitting your ethereal form.")) + for(var/mob/shade_to_deconvert in contents) + shade_to_deconvert.mind?.remove_antag_datum(/datum/antagonist/cult) + + to_chat(shade, span_notice("Your soul has been captured by [src]. \ + Its arcane energies are reknitting your ethereal form.")) + if(user != shade) - to_chat(user, "[span_info("Capture successful!:")] [shade.real_name]'s soul has been captured and stored within [src].") + to_chat(user, "[span_info("Capture successful!:")] [shade.real_name]'s soul \ + has been captured and stored within [src].") + return TRUE ///transfer the mind of the shade to a construct mob selected by the user, then deletes both the shade and src. @@ -326,7 +347,7 @@ to_chat(user, "[span_userdanger("Creation failed!")]: [src] is empty! Go kill someone!") return FALSE var/construct_class = show_radial_menu(user, src, GLOB.construct_radial_images, custom_check = CALLBACK(src, .proc/check_menu, user, shell), require_near = TRUE, tooltips = TRUE) - if(!shell || !construct_class) + if(QDELETED(shell) || !construct_class) return FALSE make_new_construct_from_class(construct_class, theme, shade, user, FALSE, shell.loc) shade.mind?.remove_antag_datum(/datum/antagonist/cult) @@ -341,6 +362,77 @@ return FALSE return TRUE +/** + * Creates a new shade mob to inhabit the stone. + * + * victim - the body that's being shaded + * user - the person doing the shading. Optional. + * message_user - if TRUE, we send the user (if present) a message that a shade has been created / captured. + * shade_controller - the mob (usually, a ghost) that will take over control of the victim / new shade. Optional, if not passed the victim itself will take control. + */ +/obj/item/soulstone/proc/init_shade(mob/living/carbon/human/victim, mob/user, message_user = FALSE, mob/shade_controller) + if(!shade_controller) + shade_controller = victim + victim.stop_sound_channel(CHANNEL_HEARTBEAT) + var/mob/living/simple_animal/shade/soulstone_spirit = new /mob/living/simple_animal/shade(src) + soulstone_spirit.AddComponent(/datum/component/soulstoned, src) + soulstone_spirit.name = "Shade of [victim.real_name]" + soulstone_spirit.real_name = "Shade of [victim.real_name]" + soulstone_spirit.key = shade_controller.key + soulstone_spirit.copy_languages(victim, LANGUAGE_MIND)//Copies the old mobs languages into the new mob holder. + if(user) + soulstone_spirit.copy_languages(user, LANGUAGE_MASTER) + soulstone_spirit.update_atom_languages() + soulstone_spirit.grant_all_languages(FALSE, FALSE, TRUE) //Grants omnitongue + if(user) + soulstone_spirit.faction |= "[REF(user)]" //Add the master as a faction, allowing inter-mob cooperation + if(IS_CULTIST(user)) + soulstone_spirit.mind.add_antag_datum(/datum/antagonist/cult) + + soulstone_spirit.cancel_camera() + update_appearance() + if(user) + if(IS_CULTIST(user)) + to_chat(soulstone_spirit, span_bold("Your soul has been captured! \ + You are now bound to the cult's will. Help them succeed in their goals at all costs.")) + else if(role_check(user)) + to_chat(soulstone_spirit, span_bold("Your soul has been captured! You are now bound to [user.real_name]'s will. \ + Help [user.p_them()] succeed in [user.p_their()] goals at all costs.")) + if(message_user) + to_chat(user, "[span_info("Capture successful!:")] [victim.real_name]'s soul has been ripped \ + from [victim.p_their()] body and stored within [src].") + + victim.dust(drop_items = TRUE) + +/** + * Gets a ghost from dead chat to replace a missing player when a shade is created. + * + * Gets ran if a soulstone is used on a body that has no client to take over the shade. + * + * victim - the body that's being shaded + * user - the mob shading the body + * + * Returns FALSE if no ghosts are available or the replacement fails. + * Returns TRUE otherwise. + */ +/obj/item/soulstone/proc/get_ghost_to_replace_shade(mob/living/carbon/victim, mob/user) + var/mob/dead/observer/chosen_ghost + var/list/consenting_candidates = poll_ghost_candidates("Would you like to play as a Shade?", "Cultist", ROLE_CULTIST, 5 SECONDS, POLL_IGNORE_SHADE) + if(length(consenting_candidates)) + chosen_ghost = pick(consenting_candidates) + + if(!victim || user.incapacitated() || !user.is_holding(src) || !user.CanReach(victim, src)) + return FALSE + if(!chosen_ghost || !chosen_ghost.client) + to_chat(user, span_danger("There were no spirits willing to become a shade.")) + return FALSE + if(contents.len) //If they used the soulstone on someone else in the meantime + return FALSE + to_chat(user, "[span_info("Capture successful!:")] A spirit has entered [src], \ + taking upon the identity of [victim].") + init_shade(victim, user, shade_controller = chosen_ghost) + return TRUE + /proc/make_new_construct_from_class(construct_class, theme, mob/target, mob/creator, cultoverride, loc_override) switch(construct_class) if(CONSTRUCT_JUGGERNAUT) @@ -404,60 +496,37 @@ BS.Cviewer = newstruct newstruct.cancel_camera() +/obj/item/soulstone/anybody + required_role = null -/obj/item/soulstone/proc/init_shade(mob/living/carbon/human/victim, mob/user, message_user = FALSE, mob/shade_controller) - if(!shade_controller) - shade_controller = victim - victim.stop_sound_channel(CHANNEL_HEARTBEAT) - var/mob/living/simple_animal/shade/soulstone_spirit = new /mob/living/simple_animal/shade(src) - soulstone_spirit.AddComponent(/datum/component/soulstoned, src) - soulstone_spirit.name = "Shade of [victim.real_name]" - soulstone_spirit.real_name = "Shade of [victim.real_name]" - soulstone_spirit.key = shade_controller.key - soulstone_spirit.copy_languages(victim, LANGUAGE_MIND)//Copies the old mobs languages into the new mob holder. - if(user) - soulstone_spirit.copy_languages(user, LANGUAGE_MASTER) - soulstone_spirit.update_atom_languages() - soulstone_spirit.grant_all_languages(FALSE, FALSE, TRUE) //Grants omnitongue - if(user) - soulstone_spirit.faction |= "[REF(user)]" //Add the master as a faction, allowing inter-mob cooperation - if(user && IS_CULTIST(user)) - soulstone_spirit.mind.add_antag_datum(/datum/antagonist/cult) - soulstone_spirit.cancel_camera() - name = "soulstone: Shade of [victim.real_name]" - switch(theme) - if(THEME_HOLY) - icon_state = "purified_soulstone2" - if(THEME_WIZARD) - icon_state = "mystic_soulstone2" - if(THEME_CULT) - icon_state = "soulstone2" - if(user) - if(IS_CULTIST(user)) - to_chat(soulstone_spirit, "Your soul has been captured! You are now bound to the cult's will. Help them succeed in their goals at all costs.") - else if(role_check(user)) - to_chat(soulstone_spirit, "Your soul has been captured! You are now bound to [user.real_name]'s will. Help [user.p_them()] succeed in [user.p_their()] goals at all costs.") - if(message_user) - to_chat(user, "[span_info("Capture successful!:")] [victim.real_name]'s soul has been ripped from [victim.p_their()] body and stored within [src].") - victim.dust() +/obj/item/soulstone/mystic + icon_state = "mystic_soulstone" + theme = THEME_WIZARD + required_role = /datum/antagonist/wizard +/obj/item/soulstone/anybody/revolver + one_use = TRUE + grab_sleeping = FALSE -/obj/item/soulstone/proc/getCultGhost(mob/living/carbon/victim, mob/user) - var/mob/dead/observer/chosen_ghost +/obj/item/soulstone/anybody/purified + icon_state = "purified_soulstone" + theme = THEME_HOLY - chosen_ghost = victim.get_ghost(TRUE,TRUE) //Try to grab original owner's ghost first +/obj/item/soulstone/anybody/chaplain + name = "mysterious old shard" + one_use = TRUE + grab_sleeping = FALSE - if(!chosen_ghost || !chosen_ghost.client) //Failing that, we grab a ghosts - var/list/consenting_candidates = poll_ghost_candidates("Would you like to play as a Shade?", "Cultist", ROLE_CULTIST, 50, POLL_IGNORE_SHADE) - if(consenting_candidates.len) - chosen_ghost = pick(consenting_candidates) - if(!victim || user.incapacitated() || !user.is_holding(src) || !user.CanReach(victim, src)) - return FALSE - if(!chosen_ghost || !chosen_ghost.client) - to_chat(user, span_danger("There were no spirits willing to become a shade.")) - return FALSE - if(contents.len) //If they used the soulstone on someone else in the meantime - return FALSE - victim.unequip_everything() - init_shade(victim, user, shade_controller = chosen_ghost) - return TRUE +/obj/item/soulstone/anybody/chaplain/sparring + name = "divine punishment" + desc = "A prison for those who lost a divine game." + icon_state = "purified_soulstone" + theme = THEME_HOLY + +/obj/item/soulstone/anybody/chaplain/sparring/Initialize(mapload) + . = ..() + name = "[GLOB.deity]'s punishment" + desc = "A prison for those who lost [GLOB.deity]'s game." + +/obj/item/soulstone/anybody/mining + grab_sleeping = FALSE diff --git a/code/modules/antagonists/wizard/equipment/spellbook.dm b/code/modules/antagonists/wizard/equipment/spellbook.dm deleted file mode 100644 index 2113572e716b14..00000000000000 --- a/code/modules/antagonists/wizard/equipment/spellbook.dm +++ /dev/null @@ -1,878 +0,0 @@ -/datum/spellbook_entry - var/name = "Entry Name" - - var/spell_type = null - var/desc = "" - var/category = "Offensive" - var/cost = 2 - var/times = 0 - var/refundable = TRUE - var/obj/effect/proc_holder/spell/S = null //Since spellbooks can be used by only one person anyway we can track the actual spell - var/buy_word = "Learn" - var/cooldown - var/clothes_req = FALSE - var/limit //used to prevent a spellbook_entry from being bought more than X times with one wizard spellbook - var/list/no_coexistance_typecache //Used so you can't have specific spells together - -/datum/spellbook_entry/New() - ..() - no_coexistance_typecache = typecacheof(no_coexistance_typecache) - -/datum/spellbook_entry/proc/IsAvailable() // For config prefs / gamemode restrictions - these are round applied - return TRUE - -/datum/spellbook_entry/proc/CanBuy(mob/living/carbon/human/user,obj/item/spellbook/book) // Specific circumstances - if(book.uses= aspell.level_max) - to_chat(user, span_warning("This spell cannot be improved further!")) - return FALSE - - aspell.name = initial(aspell.name) - aspell.spell_level++ - aspell.charge_max = round(LERP(initial(aspell.charge_max), aspell.cooldown_min, aspell.spell_level / aspell.level_max)) - if(aspell.charge_max < aspell.charge_counter) - aspell.charge_counter = aspell.charge_max - var/newname = "ERROR" - switch(aspell.spell_level) - if(1) - to_chat(user, span_notice("You have improved [aspell.name] into Efficient [aspell.name].")) - newname = "Efficient [aspell.name]" - if(2) - to_chat(user, span_notice("You have further improved [aspell.name] into Quickened [aspell.name].")) - newname = "Quickened [aspell.name]" - if(3) - to_chat(user, span_notice("You have further improved [aspell.name] into Free [aspell.name].")) - newname = "Free [aspell.name]" - if(4) - to_chat(user, span_notice("You have further improved [aspell.name] into Instant [aspell.name].")) - newname = "Instant [aspell.name]" - aspell.name = newname - name = newname - if(aspell.spell_level >= aspell.level_max) - to_chat(user, span_warning("This spell cannot be strengthened any further!")) - //we'll need to update the cooldowns for the spellbook - GetInfo() - log_spellbook("[key_name(user)] improved their knowledge of [src] to level [aspell.spell_level] for [cost] points") - SSblackbox.record_feedback("nested tally", "wizard_spell_improved", 1, list("[name]", "[aspell.spell_level]")) - return TRUE - //No same spell found - just learn it - log_spellbook("[key_name(user)] learned [src] for [cost] points") - SSblackbox.record_feedback("tally", "wizard_spell_learned", 1, name) - user.mind.AddSpell(S) - to_chat(user, span_notice("You have learned [S.name].")) - return TRUE - -/datum/spellbook_entry/proc/CanRefund(mob/living/carbon/human/user,obj/item/spellbook/book) - if(!refundable) - return FALSE - if(!book.can_refund) - return FALSE - if(!S) - S = new spell_type() - for(var/obj/effect/proc_holder/spell/aspell in user.mind.spell_list) - if(initial(S.name) == initial(aspell.name)) - return TRUE - return FALSE - -/datum/spellbook_entry/proc/Refund(mob/living/carbon/human/user,obj/item/spellbook/book) //return point value or -1 for failure - var/area/centcom/wizard_station/A = GLOB.areas_by_type[/area/centcom/wizard_station] - if(!(user in A.contents)) - to_chat(user, span_warning("You can only refund spells at the wizard lair!")) - return -1 - if(!S) - S = new spell_type() - var/spell_levels = 0 - for(var/obj/effect/proc_holder/spell/aspell in user.mind.spell_list) - if(initial(S.name) == initial(aspell.name)) - spell_levels = aspell.spell_level - user.mind.spell_list.Remove(aspell) - name = initial(name) - log_spellbook("[key_name(user)] refunded [src] for [cost * (spell_levels+1)] points") - qdel(S) - return cost * (spell_levels+1) - return -1 - - -/datum/spellbook_entry/proc/GetInfo() - if(!spell_type) - return - if(!S) - S = new spell_type() - if(S.charge_type == "recharge") - cooldown = S.charge_max/10 - if(S.clothes_req) - clothes_req = TRUE - -/datum/spellbook_entry/fireball - name = "Fireball" - desc = "Fires an explosive fireball at a target. Considered a classic among all wizards." - spell_type = /obj/effect/proc_holder/spell/aimed/fireball - -/datum/spellbook_entry/spell_cards - name = "Spell Cards" - desc = "Blazing hot rapid-fire homing cards. Send your foes to the shadow realm with their mystical power!" - spell_type = /obj/effect/proc_holder/spell/aimed/spell_cards - -/datum/spellbook_entry/rod_form - name = "Rod Form" - desc = "Take on the form of an immovable rod, destroying all in your path. Purchasing this spell multiple times will also increase the rod's damage and travel range." - spell_type = /obj/effect/proc_holder/spell/targeted/rod_form - -/datum/spellbook_entry/magicm - name = "Magic Missile" - desc = "Fires several, slow moving, magic projectiles at nearby targets." - spell_type = /obj/effect/proc_holder/spell/targeted/projectile/magic_missile - category = "Defensive" - -/datum/spellbook_entry/disintegrate - name = "Smite" - desc = "Charges your hand with an unholy energy that can be used to cause a touched victim to violently explode." - spell_type = /obj/effect/proc_holder/spell/targeted/touch/disintegrate - -/datum/spellbook_entry/disabletech - name = "Disable Tech" - desc = "Disables all weapons, cameras and most other technology in range." - spell_type = /obj/effect/proc_holder/spell/targeted/emplosion/disable_tech - category = "Defensive" - cost = 1 - -/datum/spellbook_entry/repulse - name = "Repulse" - desc = "Throws everything around the user away." - spell_type = /obj/effect/proc_holder/spell/aoe_turf/repulse - category = "Defensive" - -/datum/spellbook_entry/lightning_packet - name = "Thrown Lightning" - desc = "Forged from eldrich energies, a packet of pure power, known as a spell packet will appear in your hand, that when thrown will stun the target." - spell_type = /obj/effect/proc_holder/spell/targeted/conjure_item/spellpacket - category = "Defensive" - -/datum/spellbook_entry/timestop - name = "Time Stop" - desc = "Stops time for everyone except for you, allowing you to move freely while your enemies and even projectiles are frozen." - spell_type = /obj/effect/proc_holder/spell/aoe_turf/timestop - category = "Defensive" - -/datum/spellbook_entry/smoke - name = "Smoke" - desc = "Spawns a cloud of choking smoke at your location." - spell_type = /obj/effect/proc_holder/spell/targeted/smoke - category = "Defensive" - cost = 1 - -/datum/spellbook_entry/blind - name = "Blind" - desc = "Temporarily blinds a single target." - spell_type = /obj/effect/proc_holder/spell/pointed/trigger/blind - cost = 1 - -/datum/spellbook_entry/mindswap - name = "Mindswap" - desc = "Allows you to switch bodies with a target next to you. You will both fall asleep when this happens, and it will be quite obvious that you are the target's body if someone watches you do it." - spell_type = /obj/effect/proc_holder/spell/pointed/mind_transfer - category = "Mobility" - -/datum/spellbook_entry/forcewall - name = "Force Wall" - desc = "Create a magical barrier that only you can pass through." - spell_type = /obj/effect/proc_holder/spell/targeted/forcewall - category = "Defensive" - cost = 1 - -/datum/spellbook_entry/blink - name = "Blink" - desc = "Randomly teleports you a short distance." - spell_type = /obj/effect/proc_holder/spell/targeted/turf_teleport/blink - category = "Mobility" - -/datum/spellbook_entry/teleport - name = "Teleport" - desc = "Teleports you to an area of your selection." - spell_type = /obj/effect/proc_holder/spell/targeted/area_teleport/teleport - category = "Mobility" - -/datum/spellbook_entry/mutate - name = "Mutate" - desc = "Causes you to turn into a hulk and gain laser vision for a short while." - spell_type = /obj/effect/proc_holder/spell/targeted/genetic/mutate - -/datum/spellbook_entry/jaunt - name = "Ethereal Jaunt" - desc = "Turns your form ethereal, temporarily making you invisible and able to pass through walls." - spell_type = /obj/effect/proc_holder/spell/targeted/ethereal_jaunt - category = "Mobility" - -/datum/spellbook_entry/knock - name = "Knock" - desc = "Opens nearby doors and closets." - spell_type = /obj/effect/proc_holder/spell/aoe_turf/knock - category = "Mobility" - cost = 1 - -/datum/spellbook_entry/fleshtostone - name = "Flesh to Stone" - desc = "Charges your hand with the power to turn victims into inert statues for a long period of time." - spell_type = /obj/effect/proc_holder/spell/targeted/touch/flesh_to_stone - -/datum/spellbook_entry/summonitem - name = "Summon Item" - desc = "Recalls a previously marked item to your hand from anywhere in the universe." - spell_type = /obj/effect/proc_holder/spell/targeted/summonitem - category = "Assistance" - cost = 1 - -/datum/spellbook_entry/lichdom - name = "Bind Soul" - desc = "A dark necromantic pact that can forever bind your soul to an item of your choosing, \ - turning you into an immortal Lich. So long as the item remains intact, you will revive from death, \ - no matter the circumstances. Be wary - with each revival, your body will become weaker, and \ - it will become easier for others to find your item of power." - spell_type = /obj/effect/proc_holder/spell/targeted/lichdom - category = "Defensive" - -/datum/spellbook_entry/teslablast - name = "Tesla Blast" - desc = "Charge up a tesla arc and release it at a random nearby target! You can move freely while it charges. The arc jumps between targets and can knock them down." - spell_type = /obj/effect/proc_holder/spell/targeted/tesla - -/datum/spellbook_entry/lightningbolt - name = "Lightning Bolt" - desc = "Fire a lightning bolt at your foes! It will jump between targets, but can't knock them down." - spell_type = /obj/effect/proc_holder/spell/aimed/lightningbolt - cost = 1 - -/datum/spellbook_entry/infinite_guns - name = "Lesser Summon Guns" - desc = "Why reload when you have infinite guns? Summons an unending stream of bolt action rifles that deal little damage, but will knock targets down. Requires both hands free to use. Learning this spell makes you unable to learn Arcane Barrage." - spell_type = /obj/effect/proc_holder/spell/targeted/infinite_guns/gun - cost = 3 - no_coexistance_typecache = /obj/effect/proc_holder/spell/targeted/infinite_guns/arcane_barrage - -/datum/spellbook_entry/infinite_guns/Refund(mob/living/carbon/human/user, obj/item/spellbook/book) - for (var/obj/item/currentItem in user.get_all_gear()) - if (currentItem.type == /obj/item/gun/ballistic/rifle/enchanted) - qdel(currentItem) - return ..() - -/datum/spellbook_entry/arcane_barrage - name = "Arcane Barrage" - desc = "Fire a torrent of arcane energy at your foes with this (powerful) spell. Deals much more damage than Lesser Summon Guns, but won't knock targets down. Requires both hands free to use. Learning this spell makes you unable to learn Lesser Summon Gun." - spell_type = /obj/effect/proc_holder/spell/targeted/infinite_guns/arcane_barrage - cost = 3 - no_coexistance_typecache = /obj/effect/proc_holder/spell/targeted/infinite_guns/gun - -/datum/spellbook_entry/arcane_barrage/Refund(mob/living/carbon/human/user, obj/item/spellbook/book) - for (var/obj/item/currentItem in user.get_all_gear()) - if (currentItem.type == /obj/item/gun/ballistic/rifle/enchanted/arcane_barrage) - qdel(currentItem) - return ..() - -/datum/spellbook_entry/barnyard - name = "Barnyard Curse" - desc = "This spell dooms an unlucky soul to possess the speech and facial attributes of a barnyard animal." - spell_type = /obj/effect/proc_holder/spell/pointed/barnyardcurse - -/datum/spellbook_entry/charge - name = "Charge" - desc = "This spell can be used to recharge a variety of things in your hands, from magical artifacts to electrical components. A creative wizard can even use it to grant magical power to a fellow magic user." - spell_type = /obj/effect/proc_holder/spell/targeted/charge - category = "Assistance" - cost = 1 - -/datum/spellbook_entry/shapeshift - name = "Wild Shapeshift" - desc = "Take on the shape of another for a time to use their natural abilities. Once you've made your choice it cannot be changed." - spell_type = /obj/effect/proc_holder/spell/targeted/shapeshift - category = "Assistance" - cost = 1 - -/datum/spellbook_entry/tap - name = "Soul Tap" - desc = "Fuel your spells using your own soul!" - spell_type = /obj/effect/proc_holder/spell/self/tap - category = "Assistance" - cost = 1 - -/datum/spellbook_entry/spacetime_dist - name = "Spacetime Distortion" - desc = "Entangle the strings of space-time in an area around you, randomizing the layout and making proper movement impossible. The strings vibrate..." - spell_type = /obj/effect/proc_holder/spell/spacetime_dist - category = "Defensive" - cost = 1 - -/datum/spellbook_entry/the_traps - name = "The Traps!" - desc = "Summon a number of traps around you. They will damage and enrage any enemies that step on them." - spell_type = /obj/effect/proc_holder/spell/aoe_turf/conjure/the_traps - category = "Defensive" - cost = 1 - -/datum/spellbook_entry/bees - name = "Lesser Summon Bees" - desc = "This spell magically kicks a transdimensional beehive, instantly summoning a swarm of bees to your location. These bees are NOT friendly to anyone." - spell_type = /obj/effect/proc_holder/spell/aoe_turf/conjure/creature/bee - category = "Defensive" - - -/datum/spellbook_entry/item - name = "Buy Item" - refundable = FALSE - buy_word = "Summon" - var/item_path = null - - -/datum/spellbook_entry/item/Buy(mob/living/carbon/human/user,obj/item/spellbook/book) - var/atom/spawned_path = new item_path(get_turf(user)) - log_spellbook("[key_name(user)] bought [src] for [cost] points") - SSblackbox.record_feedback("tally", "wizard_spell_learned", 1, name) - return spawned_path - -/datum/spellbook_entry/item/staffchange - name = "Staff of Change" - desc = "An artefact that spits bolts of coruscating energy which cause the target's very form to reshape itself." - item_path = /obj/item/gun/magic/staff/change - -/datum/spellbook_entry/item/staffanimation - name = "Staff of Animation" - desc = "An arcane staff capable of shooting bolts of eldritch energy which cause inanimate objects to come to life. This magic doesn't affect machines." - item_path = /obj/item/gun/magic/staff/animate - category = "Assistance" - -/datum/spellbook_entry/item/staffchaos - name = "Staff of Chaos" - desc = "A caprious tool that can fire all sorts of magic without any rhyme or reason. Using it on people you care about is not recommended." - item_path = /obj/item/gun/magic/staff/chaos - -/datum/spellbook_entry/item/spellblade - name = "Spellblade" - desc = "A sword capable of firing blasts of energy which rip targets limb from limb." - item_path = /obj/item/gun/magic/staff/spellblade - -/datum/spellbook_entry/item/staffdoor - name = "Staff of Door Creation" - desc = "A particular staff that can mold solid walls into ornate doors. Useful for getting around in the absence of other transportation. Does not work on glass." - item_path = /obj/item/gun/magic/staff/door - cost = 1 - category = "Mobility" - -/datum/spellbook_entry/item/staffhealing - name = "Staff of Healing" - desc = "An altruistic staff that can heal the lame and raise the dead." - item_path = /obj/item/gun/magic/staff/healing - cost = 1 - category = "Defensive" - -/datum/spellbook_entry/item/lockerstaff - name = "Staff of the Locker" - desc = "A staff that shoots lockers. It eats anyone it hits on its way, leaving a welded locker with your victims behind." - item_path = /obj/item/gun/magic/staff/locker - category = "Defensive" - -/datum/spellbook_entry/item/scryingorb - name = "Scrying Orb" - desc = "An incandescent orb of crackling energy. Using it will allow you to release your ghost while alive, allowing you to spy upon the station and talk to the deceased. In addition, buying it will permanently grant you X-ray vision." - item_path = /obj/item/scrying - category = "Defensive" - -/datum/spellbook_entry/item/soulstones - name = "Soulstone Shard Kit" - desc = "Soul Stone Shards are ancient tools capable of capturing and harnessing the spirits of the dead and dying. The spell Artificer allows you to create arcane machines for the captured souls to pilot." - item_path = /obj/item/storage/belt/soulstone/full - category = "Assistance" - -/datum/spellbook_entry/item/soulstones/Buy(mob/living/carbon/human/user,obj/item/spellbook/book) - . =..() - if(.) - user.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/conjure/construct(null)) - return . - -/datum/spellbook_entry/item/necrostone - name = "A Necromantic Stone" - desc = "A Necromantic stone is able to resurrect three dead individuals as skeletal thralls for you to command." - item_path = /obj/item/necromantic_stone - category = "Assistance" - -/datum/spellbook_entry/item/wands - name = "Wand Assortment" - desc = "A collection of wands that allow for a wide variety of utility. Wands have a limited number of charges, so be conservative with their use. Comes in a handy belt." - item_path = /obj/item/storage/belt/wands/full - category = "Defensive" - -/datum/spellbook_entry/item/armor - name = "Mastercrafted Armor Set" - desc = "An artefact suit of armor that allows you to cast spells while providing more protection against attacks and the void of space, also grants a battlemage shield." - item_path = /obj/item/mod/control/pre_equipped/enchanted - category = "Defensive" - -/datum/spellbook_entry/item/armor/Buy(mob/living/carbon/human/user, obj/item/spellbook/book) - . = ..() - if(!.) - return - var/obj/item/mod/control/mod = . - var/obj/item/mod/module/storage/storage = locate() in mod.modules - var/obj/item/back = user.back - if(back) - if(!user.dropItemToGround(back)) - return - for(var/obj/item/item as anything in back.contents) - item.forceMove(storage) - if(!user.equip_to_slot_if_possible(mod, mod.slot_flags, qdel_on_fail = FALSE, disable_warning = TRUE)) - return - if(!user.dropItemToGround(user.wear_suit) || !user.dropItemToGround(user.head)) - return - mod.quick_activation() - -/datum/spellbook_entry/item/battlemage_charge - name = "Battlemage Armour Charges" - desc = "A powerful defensive rune, it will grant eight additional charges to a battlemage shield." - item_path = /obj/item/wizard_armour_charge - category = "Defensive" - cost = 1 - -/datum/spellbook_entry/item/contract - name = "Contract of Apprenticeship" - desc = "A magical contract binding an apprentice wizard to your service, using it will summon them to your side." - item_path = /obj/item/antag_spawner/contract - category = "Assistance" - -/datum/spellbook_entry/item/guardian - name = "Guardian Deck" - desc = "A deck of guardian tarot cards, capable of binding a personal guardian to your body. There are multiple types of guardian available, but all of them will transfer some amount of damage to you. \ - It would be wise to avoid buying these with anything capable of causing you to swap bodies with others." - item_path = /obj/item/guardiancreator/choose/wizard - category = "Assistance" - -/datum/spellbook_entry/item/guardian/Buy(mob/living/carbon/human/user,obj/item/spellbook/book) - . = ..() - if(.) - new /obj/item/paper/guides/antag/guardian/wizard(get_turf(user)) - -/datum/spellbook_entry/item/bloodbottle - name = "Bottle of Blood" - desc = "A bottle of magically infused blood, the smell of which will attract extradimensional beings when broken. Be careful though, the kinds of creatures summoned by blood magic are indiscriminate in their killing, and you yourself may become a victim." - item_path = /obj/item/antag_spawner/slaughter_demon - limit = 3 - category = "Assistance" - -/datum/spellbook_entry/item/hugbottle - name = "Bottle of Tickles" - desc = "A bottle of magically infused fun, the smell of which will \ - attract adorable extradimensional beings when broken. These beings \ - are similar to slaughter demons, but they do not permanently kill \ - their victims, instead putting them in an extradimensional hugspace, \ - to be released on the demon's death. Chaotic, but not ultimately \ - damaging. The crew's reaction to the other hand could be very \ - destructive." - item_path = /obj/item/antag_spawner/slaughter_demon/laughter - cost = 1 //non-destructive; it's just a jape, sibling! - limit = 3 - category = "Assistance" - -/datum/spellbook_entry/item/mjolnir - name = "Mjolnir" - desc = "A mighty hammer on loan from Thor, God of Thunder. It crackles with barely contained power." - item_path = /obj/item/mjollnir - -/datum/spellbook_entry/item/singularity_hammer - name = "Singularity Hammer" - desc = "A hammer that creates an intensely powerful field of gravity where it strikes, pulling everything nearby to the point of impact." - item_path = /obj/item/singularityhammer - -/datum/spellbook_entry/item/warpwhistle - name = "Warp Whistle" - desc = "A strange whistle that will transport you to a distant safe place on the station. There is a window of vulnerability at the beginning of every use." - item_path = /obj/item/warp_whistle - category = "Mobility" - cost = 1 - -/datum/spellbook_entry/item/highfrequencyblade - name = "High Frequency Blade" - desc = "An incredibly swift enchanted blade resonating at a frequency high enough to be able to slice through anything." - item_path = /obj/item/highfrequencyblade/wizard - cost = 3 - -/datum/spellbook_entry/duffelbag - name = "Bestow Cursed Duffel Bag" - desc = "A curse that firmly attaches a demonic duffel bag to the target's back. The duffel bag will make the person it's attached to take periodical damage if it is not fed regularly, and regardless of whether or not it's been fed, it will slow the person wearing it down significantly." - spell_type = /obj/effect/proc_holder/spell/targeted/touch/duffelbag - category = "Defensive" - cost = 1 - -//THESE ARE NOT PURCHASABLE SPELLS! They're references to old spells that got removed + shit that sounds stupid but fun so we can painfully lock behind a dimmer component - -/datum/spellbook_entry/challenge - name = "Take the Challenge" - refundable = FALSE - category = "Challenges" - buy_word = "Accept" - -/datum/spellbook_entry/challenge/multiverse - name = "Multiverse Sword" - desc = "The Station gets a multiverse sword to stop you. Can you withstand the hordes of multiverse realities?" - -/datum/spellbook_entry/challenge/antiwizard - name = "Friendly Wizard Scum" - desc = "A \"Friendly\" Wizard will protect the station, and try to kill you. They get a spellbook much like you, but will use it for \"GOOD\"." - -/// How much threat we need to let these rituals happen on dynamic -#define MINIMUM_THREAT_FOR_RITUALS 100 - -/datum/spellbook_entry/summon - name = "Summon Stuff" - category = "Rituals" - limit = 1 - refundable = FALSE - buy_word = "Cast" - -/datum/spellbook_entry/summon/Buy(mob/living/carbon/human/user, obj/item/spellbook/book) - log_spellbook("[key_name(user)] cast [src] for [cost] points") - SSblackbox.record_feedback("tally", "wizard_spell_learned", 1, name) - times++ - return TRUE - -/datum/spellbook_entry/summon/ghosts - name = "Summon Ghosts" - desc = "Spook the crew out by making them see dead people. Be warned, ghosts are capricious and occasionally vindicative, and some will use their incredibly minor abilities to frustrate you." - cost = 0 - -/datum/spellbook_entry/summon/ghosts/Buy(mob/living/carbon/human/user, obj/item/spellbook/book) - summon_ghosts(user) - playsound(get_turf(user), 'sound/effects/ghost2.ogg', 50, TRUE) - return ..() - -/datum/spellbook_entry/summon/guns - name = "Summon Guns" - desc = "Nothing could possibly go wrong with arming a crew of lunatics just itching for an excuse to kill you. There is a good chance that they will shoot each other first." - -/datum/spellbook_entry/summon/guns/IsAvailable() - // Summon Guns requires 100 threat. - var/datum/game_mode/dynamic/mode = SSticker.mode - if(mode.threat_level < MINIMUM_THREAT_FOR_RITUALS) - return FALSE - // Also must be config enabled - return !CONFIG_GET(flag/no_summon_guns) - -/datum/spellbook_entry/summon/guns/Buy(mob/living/carbon/human/user,obj/item/spellbook/book) - summon_guns(user, 10) - playsound(get_turf(user), 'sound/magic/castsummon.ogg', 50, TRUE) - return ..() - -/datum/spellbook_entry/summon/magic - name = "Summon Magic" - desc = "Share the wonders of magic with the crew and show them why they aren't to be trusted with it at the same time." - -/datum/spellbook_entry/summon/magic/IsAvailable() - // Summon Magic requires 100 threat. - var/datum/game_mode/dynamic/mode = SSticker.mode - if(mode.threat_level < MINIMUM_THREAT_FOR_RITUALS) - return FALSE - // Also must be config enabled - return !CONFIG_GET(flag/no_summon_magic) - -/datum/spellbook_entry/summon/magic/Buy(mob/living/carbon/human/user,obj/item/spellbook/book) - summon_magic(user, 10) - playsound(get_turf(user), 'sound/magic/castsummon.ogg', 50, TRUE) - return ..() - -/datum/spellbook_entry/summon/events - name = "Summon Events" - desc = "Give Murphy's law a little push and replace all events with special wizard ones that will confound and confuse everyone. Multiple castings increase the rate of these events." - cost = 2 - limit = 5 // Each purchase can intensify it. - -/datum/spellbook_entry/summon/events/IsAvailable() - // Summon Events requires 100 threat. - var/datum/game_mode/dynamic/mode = SSticker.mode - if(mode.threat_level < MINIMUM_THREAT_FOR_RITUALS) - return FALSE - // Also, must be config enabled - return !CONFIG_GET(flag/no_summon_events) - -/datum/spellbook_entry/summon/events/Buy(mob/living/carbon/human/user, obj/item/spellbook/book) - summon_events(user) - playsound(get_turf(user), 'sound/magic/castsummon.ogg', 50, TRUE) - return ..() - -/datum/spellbook_entry/summon/events/GetInfo() - if(times > 0) - . += "You have cast it [times] time\s.
" - return . - -/datum/spellbook_entry/summon/curse_of_madness - name = "Curse of Madness" - desc = "Curses the station, warping the minds of everyone inside, causing lasting traumas. Warning: this spell can affect you if not cast from a safe distance." - cost = 4 - -/datum/spellbook_entry/summon/curse_of_madness/Buy(mob/living/carbon/human/user, obj/item/spellbook/book) - var/message = tgui_input_text(user, "Whisper a secret truth to drive your victims to madness", "Whispers of Madness") - if(!message) - return FALSE - curse_of_madness(user, message) - playsound(user, 'sound/magic/mandswap.ogg', 50, TRUE) - return ..() - -#undef MINIMUM_THREAT_FOR_RITUALS - -/obj/item/spellbook - name = "spell book" - desc = "An unearthly tome that glows with power." - icon = 'icons/obj/library.dmi' - icon_state ="book" - worn_icon_state = "book" - throw_speed = 2 - throw_range = 5 - w_class = WEIGHT_CLASS_TINY - var/uses = 10 - - /// The bonus that you get from going semi-random. - var/semi_random_bonus = 2 - - /// The bonus that you get from going full random. - var/full_random_bonus = 5 - - /// Determines if this spellbook can refund anything. - var/can_refund = TRUE - - var/mob/living/carbon/human/owner - var/list/entries = list() - -/obj/item/spellbook/examine(mob/user) - . = ..() - if(owner) - . += {"There is a small signature on the front cover: "[owner]"."} - else - . += "It appears to have no author." - -/obj/item/spellbook/Initialize(mapload) - . = ..() - prepare_spells() - RegisterSignal(src, COMSIG_ITEM_MAGICALLY_CHARGED, .proc/on_magic_charge) - -/** - * Signal proc for [COMSIG_ITEM_MAGICALLY_CHARGED] - * - * Has no effect on charge, but gives a funny message to people who think they're clever. - */ -/obj/item/spellbook/proc/on_magic_charge(datum/source, obj/effect/proc_holder/spell/targeted/charge/spell, mob/living/caster) - SIGNAL_HANDLER - - var/static/list/clever_girl = list( - "NICE TRY BUT NO!", - "CLEVER BUT NOT CLEVER ENOUGH!", - "SUCH FLAGRANT CHEESING IS WHY WE ACCEPTED YOUR APPLICATION!", - "CUTE! VERY CUTE!", - "YOU DIDN'T THINK IT'D BE THAT EASY, DID YOU?", - ) - - to_chat(caster, span_warning("Glowing red letters appear on the front cover...")) - to_chat(caster, span_red(pick(clever_girl))) - - return COMPONENT_ITEM_BURNT_OUT - -/obj/item/spellbook/attack_self(mob/user) - if(!owner) - to_chat(user, span_notice("You bind the spellbook to yourself.")) - owner = user - return - if(user != owner) - if(user.mind.special_role == ROLE_WIZARD_APPRENTICE) - to_chat(user, "If you got caught sneaking a peek from your teacher's spellbook, you'd likely be expelled from the Wizard Academy. Better not.") - else - to_chat(user, span_warning("The [name] does not recognize you as its owner and refuses to open!")) - return - . = ..() - -/obj/item/spellbook/attackby(obj/item/O, mob/user, params) - if(!can_refund) - to_chat(user, span_warning("You can't refund anything!")) - return - - if(istype(O, /obj/item/antag_spawner/contract)) - var/obj/item/antag_spawner/contract/contract = O - if(contract.used) - to_chat(user, span_warning("The contract has been used, you can't get your points back now!")) - else - to_chat(user, span_notice("You feed the contract back into the spellbook, refunding your points.")) - uses += 2 - for(var/datum/spellbook_entry/item/contract/CT in entries) - if(!isnull(CT.limit)) - CT.limit++ - qdel(O) - else if(istype(O, /obj/item/antag_spawner/slaughter_demon)) - to_chat(user, span_notice("On second thought, maybe summoning a demon is a bad idea. You refund your points.")) - if(istype(O, /obj/item/antag_spawner/slaughter_demon/laughter)) - uses += 1 - for(var/datum/spellbook_entry/item/hugbottle/HB in entries) - if(!isnull(HB.limit)) - HB.limit++ - else - uses += 2 - for(var/datum/spellbook_entry/item/bloodbottle/BB in entries) - if(!isnull(BB.limit)) - BB.limit++ - qdel(O) - -/obj/item/spellbook/proc/prepare_spells() - var/entry_types = subtypesof(/datum/spellbook_entry) - /datum/spellbook_entry/item - /datum/spellbook_entry/summon - /datum/spellbook_entry/challenge - for(var/type in entry_types) - var/datum/spellbook_entry/possible_entry = new type - if(possible_entry.IsAvailable()) - possible_entry.GetInfo() //loads up things for the entry that require checking spell instance. - entries |= possible_entry - else - qdel(possible_entry) - -/obj/item/spellbook/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "Spellbook") - ui.open() - -/obj/item/spellbook/ui_data(mob/user) - var/list/data = list() - data["owner"] = owner - data["points"] = uses - data["semi_random_bonus"] = initial(uses) + semi_random_bonus - data["full_random_bonus"] = initial(uses) + full_random_bonus - return data - -//This is a MASSIVE amount of data, please be careful if you remove it from static. -/obj/item/spellbook/ui_static_data(mob/user) - var/list/data = list() - var/list/entry_data = list() - for(var/datum/spellbook_entry/entry as anything in entries) - var/list/individual_entry_data = list() - individual_entry_data["name"] = entry.name - individual_entry_data["desc"] = entry.desc - individual_entry_data["ref"] = REF(entry) - individual_entry_data["clothes_req"] = entry.clothes_req - individual_entry_data["cost"] = entry.cost - individual_entry_data["times"] = entry.times - individual_entry_data["cooldown"] = entry.cooldown - individual_entry_data["cat"] = entry.category - individual_entry_data["refundable"] = entry.refundable - individual_entry_data["limit"] = entry.limit - individual_entry_data["buyword"] = entry.buy_word - entry_data += list(individual_entry_data) - data["entries"] = entry_data - return data - -/obj/item/spellbook/ui_act(action, params) - . = ..() - if(.) - return - var/mob/living/carbon/human/wizard = usr - if(!istype(wizard)) - to_chat(wizard, span_warning("The book doesn't seem to listen to lower life forms.")) - return - switch(action) - if("purchase") - var/datum/spellbook_entry/entry = locate(params["spellref"]) in entries - if(entry?.CanBuy(wizard,src)) - if(entry.Buy(wizard,src)) - if(entry.limit) - entry.limit-- - uses -= entry.cost - return TRUE - if("refund") - var/datum/spellbook_entry/entry = locate(params["spellref"]) in entries - if(entry?.refundable) - var/result = entry.Refund(wizard,src) - if(result > 0) - if(!isnull(entry.limit)) - entry.limit += result - uses += result - return TRUE - //actions that are only available if you have full spell points - if(uses < initial(uses)) - to_chat(wizard, span_warning("You need to have all your spell points to do this!")) - return - switch(action) - if("semirandomize") - semirandomize(wizard, semi_random_bonus) - update_static_data(wizard) //update statics! - if("randomize") - randomize(wizard, full_random_bonus) - update_static_data(wizard) //update statics! - if("purchase_loadout") - wizard_loadout(wizard, locate(params["id"])) - -/obj/item/spellbook/proc/wizard_loadout(mob/living/carbon/human/wizard, loadout) - var/list/wanted_spell_names - switch(loadout) - if(WIZARD_LOADOUT_CLASSIC) //(Fireball>2, MM>2, Smite>2, Jauntx2>4) = 10 - wanted_spell_names = list("Fireball" = 1, "Magic Missile" = 1, "Smite" = 1, "Ethereal Jaunt" = 2) - if(WIZARD_LOADOUT_MJOLNIR) //(Mjolnir>2, Summon Itemx3>3, Mutate>2, Force Wall>1, Blink>2) = 10 - wanted_spell_names = list("Mjolnir" = 1, "Summon Item" = 3, "Mutate" = 1, "Force Wall" = 1, "Blink" = 1) - if(WIZARD_LOADOUT_WIZARMY) //(Soulstones>2, Staff of Change>2, A Necromantic Stone>2, Teleport>2, Ethereal Jaunt>2) = 10 - wanted_spell_names = list("Soulstone Shard Kit" = 1, "Staff of Change" = 1, "A Necromantic Stone" = 1, "Teleport" = 1, "Ethereal Jaunt" = 1) - if(WIZARD_LOADOUT_SOULTAP) //(Soul Tap>1, Smite>2, Flesh to Stone>2, Mindswap>2, Knock>1, Teleport>2) = 10 - wanted_spell_names = list("Soul Tap" = 1, "Smite" = 1, "Flesh to Stone" = 1, "Mindswap" = 1, "Knock" = 1, "Teleport" = 1) - - for(var/datum/spellbook_entry/entry as anything in entries) - if(!(entry.name in wanted_spell_names)) - continue - if(entry.CanBuy(wizard,src)) - var/purchase_count = wanted_spell_names[entry.name] - wanted_spell_names -= entry.name - for(var/i in 1 to purchase_count) - entry.Buy(wizard,src) - if(entry.limit) - entry.limit-- - uses -= entry.cost - entry.refundable = FALSE //once you go loading out, you never go back - if(!length(wanted_spell_names)) - break - - if(length(wanted_spell_names)) - stack_trace("Wizard Loadout \"[loadout]\" could not find valid spells to buy in the spellbook. Either you input a name that doesn't exist, or you overspent") - if(uses) - stack_trace("Wizard Loadout \"[loadout]\" does not use 10 wizard spell slots. Stop scamming players out.") - -/obj/item/spellbook/proc/semirandomize(mob/living/carbon/human/wizard, bonus_to_give = 0) - var/list/needed_cats = list("Offensive", "Mobility") - var/list/shuffled_entries = shuffle(entries) - for(var/i in 1 to 2) - for(var/datum/spellbook_entry/entry as anything in shuffled_entries) - if(!(entry.category in needed_cats)) - continue - if(entry?.CanBuy(wizard,src)) - if(entry.Buy(wizard,src)) - needed_cats -= entry.category //so the next loop doesn't find another offense spell - entry.refundable = FALSE //once you go random, you never go back - if(entry.limit) - entry.limit-- - uses -= entry.cost - break - //we have given two specific category spells to the wizard. the rest are completely random! - randomize(wizard, bonus_to_give = bonus_to_give) - -/obj/item/spellbook/proc/randomize(mob/living/carbon/human/wizard, bonus_to_give = 0) - var/list/entries_copy = entries.Copy() - uses += bonus_to_give - while(uses > 0 && length(entries_copy)) - var/datum/spellbook_entry/entry = pick(entries_copy) - if(!entry?.CanBuy(wizard,src) || !entry.Buy(wizard,src)) - entries_copy -= entry - continue - - entry.refundable = FALSE //once you go random, you never go back - if(entry.limit) - entry.limit-- - uses -= entry.cost - - can_refund = FALSE diff --git a/code/modules/antagonists/wizard/equipment/spellbook_entries/_entry.dm b/code/modules/antagonists/wizard/equipment/spellbook_entries/_entry.dm new file mode 100644 index 00000000000000..0d5982d668919f --- /dev/null +++ b/code/modules/antagonists/wizard/equipment/spellbook_entries/_entry.dm @@ -0,0 +1,232 @@ +/** + * ## Spellbook entries + * + * Wizard spellbooks are automatically populated with + * a list of every spellbook entry subtype when they're made. + * + * Wizards can then buy entries from the book to learn magic, + * invoke rituals, or summon items. + */ +/datum/spellbook_entry + /// The name of the entry + var/name + /// The description of the entry + var/desc + /// The type of spell that the entry grants (typepath) + var/datum/action/cooldown/spell/spell_type + /// What category the entry falls in + var/category + /// How many book charges does the spell take + var/cost = 2 + /// How many times has the spell been purchased. Compared against limit. + var/times = 0 + /// The limit on number of purchases from this entry in a given spellbook. If null, infinite are allowed. + var/limit + /// Is this refundable? + var/refundable = TRUE + /// Flavor. Verb used in saying how the spell is aquired. Ex "[Learn] Fireball" or "[Summon] Ghosts" + var/buy_word = "Learn" + /// The cooldown of the spell + var/cooldown + /// Whether the spell requires wizard garb or not + var/requires_wizard_garb = FALSE + /// Used so you can't have specific spells together + var/list/no_coexistance_typecache + +/datum/spellbook_entry/New() + no_coexistance_typecache = typecacheof(no_coexistance_typecache) + + if(ispath(spell_type)) + if(isnull(limit)) + limit = initial(spell_type.spell_max_level) + if(initial(spell_type.spell_requirements) & SPELL_REQUIRES_WIZARD_GARB) + requires_wizard_garb = TRUE + +/** + * Determines if this entry can be purchased from a spellbook + * Used for configs / round related restrictions. + * + * Return FALSE to prevent the entry from being added to wizard spellbooks, TRUE otherwise + */ +/datum/spellbook_entry/proc/can_be_purchased() + if(!name || !desc || !category) // Erroneously set or abstract + return FALSE + return TRUE + +/** + * Checks if the user, with the supplied spellbook, can purchase the given entry. + * + * Arguments + * * user - the mob who's buying the spell + * * book - what book they're buying the spell from + * + * Return TRUE if it can be bought, FALSE otherwise + */ +/datum/spellbook_entry/proc/can_buy(mob/living/carbon/human/user, obj/item/spellbook/book) + if(book.uses < cost) + return FALSE + if(!isnull(limit) && times >= limit) + return FALSE + for(var/spell in user.actions) + if(is_type_in_typecache(spell, no_coexistance_typecache)) + return FALSE + return TRUE + +/** + * Actually buy the entry for the user + * + * Arguments + * * user - the mob who's bought the spell + * * book - what book they've bought the spell from + * + * Return TRUE if the purchase was successful, FALSE otherwise + */ +/datum/spellbook_entry/proc/buy_spell(mob/living/carbon/human/user, obj/item/spellbook/book) + var/datum/action/cooldown/spell/existing = locate(spell_type) in user.actions + if(existing) + var/before_name = existing.name + if(!existing.level_spell()) + to_chat(user, span_warning("This spell cannot be improved further!")) + return FALSE + + to_chat(user, span_notice("You have improved [before_name] into [existing.name].")) + name = existing.name + + //we'll need to update the cooldowns for the spellbook + set_spell_info() + log_spellbook("[key_name(user)] improved their knowledge of [initial(existing.name)] to level [existing.spell_level] for [cost] points") + SSblackbox.record_feedback("nested tally", "wizard_spell_improved", 1, list("[name]", "[existing.spell_level]")) + log_purchase(user.key) + return TRUE + + //No same spell found - just learn it + var/datum/action/cooldown/spell/new_spell = new spell_type(user.mind || user) + new_spell.Grant(user) + to_chat(user, span_notice("You have learned [new_spell.name].")) + + log_spellbook("[key_name(user)] learned [new_spell] for [cost] points") + SSblackbox.record_feedback("tally", "wizard_spell_learned", 1, name) + log_purchase(user.key) + return TRUE + +/datum/spellbook_entry/proc/log_purchase(key) + if(!islist(GLOB.wizard_spellbook_purchases_by_key[key])) + GLOB.wizard_spellbook_purchases_by_key[key] = list() + + for(var/list/log as anything in GLOB.wizard_spellbook_purchases_by_key[key]) + if(log[LOG_SPELL_TYPE] == type) + log[LOG_SPELL_AMOUNT]++ + return + + var/list/to_log = list( + LOG_SPELL_TYPE = type, + LOG_SPELL_AMOUNT = 1, + ) + GLOB.wizard_spellbook_purchases_by_key[key] += list(to_log) + +/** + * Checks if the user, with the supplied spellbook, can refund the entry + * + * Arguments + * * user - the mob who's refunding the spell + * * book - what book they're refunding the spell from + * + * Return TRUE if it can refunded, FALSE otherwise + */ +/datum/spellbook_entry/proc/can_refund(mob/living/carbon/human/user, obj/item/spellbook/book) + if(!refundable) + return FALSE + if(!book.refunds_allowed) + return FALSE + + for(var/datum/action/cooldown/spell/other_spell in user.actions) + if(initial(spell_type.name) == initial(other_spell.name)) + return TRUE + + return FALSE + +/** + * Actually refund the entry for the user + * + * Arguments + * * user - the mob who's refunded the spell + * * book - what book they're refunding the spell from + * + * Return -1 on failure, or return the point value of the refund on success + */ +/datum/spellbook_entry/proc/refund_spell(mob/living/carbon/human/user, obj/item/spellbook/book) + var/area/centcom/wizard_station/wizard_home = GLOB.areas_by_type[/area/centcom/wizard_station] + if(get_area(user) != wizard_home) + to_chat(user, span_warning("You can only refund spells at the wizard lair!")) + return -1 + + for(var/datum/action/cooldown/spell/to_refund in user.actions) + if(initial(spell_type.name) != initial(to_refund.name)) + continue + + var/amount_to_refund = to_refund.spell_level * cost + if(amount_to_refund <= 0) + return -1 + + qdel(to_refund) + name = initial(name) + log_spellbook("[key_name(user)] refunded [src] for [amount_to_refund] points") + return amount_to_refund + + return -1 + +/** + * Set any of the spell info saved on our entry + * after something has occured + * + * For example, updating the cooldown after upgrading it + */ +/datum/spellbook_entry/proc/set_spell_info() + if(!spell_type) + return + + cooldown = (initial(spell_type.cooldown_time) / 10) + +/// Item summons, they give you an item. +/datum/spellbook_entry/item + refundable = FALSE + buy_word = "Summon" + /// Typepath of what item we create when purchased + var/obj/item/item_path + +/datum/spellbook_entry/item/buy_spell(mob/living/carbon/human/user, obj/item/spellbook/book) + var/atom/spawned_path = new item_path(get_turf(user)) + log_spellbook("[key_name(user)] bought [src] for [cost] points") + SSblackbox.record_feedback("tally", "wizard_spell_learned", 1, name) + try_equip_item(user, spawned_path) + log_purchase(user.key) + return spawned_path + +/// Attempts to give the item to the buyer on purchase. +/datum/spellbook_entry/item/proc/try_equip_item(mob/living/carbon/human/user, obj/item/to_equip) + var/was_put_in_hands = user.put_in_hands(to_equip) + to_chat(user, span_notice("\A [to_equip.name] has been summoned [was_put_in_hands ? "in your hands" : "at your feet"].")) + +/// Ritual, these cause station wide effects and are (pretty much) a blank slate to implement stuff in +/datum/spellbook_entry/summon + category = "Rituals" + limit = 1 + refundable = FALSE + buy_word = "Cast" + +/datum/spellbook_entry/summon/buy_spell(mob/living/carbon/human/user, obj/item/spellbook/book) + log_spellbook("[key_name(user)] cast [src] for [cost] points") + SSblackbox.record_feedback("tally", "wizard_spell_learned", 1, name) + log_purchase(user.key) + return TRUE + +/// Non-purchasable flavor spells to populate the spell book with, for style. +/datum/spellbook_entry/challenge + name = "Take the Challenge" + category = "Challenges" + refundable = FALSE + buy_word = "Accept" + +// See, non-purchasable. +/datum/spellbook_entry/challenge/can_buy(mob/living/carbon/human/user, obj/item/spellbook/book) + return FALSE diff --git a/code/modules/antagonists/wizard/equipment/spellbook_entries/assistance.dm b/code/modules/antagonists/wizard/equipment/spellbook_entries/assistance.dm new file mode 100644 index 00000000000000..beec27fc99da18 --- /dev/null +++ b/code/modules/antagonists/wizard/equipment/spellbook_entries/assistance.dm @@ -0,0 +1,107 @@ +// Wizard spells that assist the caster in some way +/datum/spellbook_entry/summonitem + name = "Summon Item" + desc = "Recalls a previously marked item to your hand from anywhere in the universe." + spell_type = /datum/action/cooldown/spell/summonitem + category = "Assistance" + cost = 1 + +/datum/spellbook_entry/charge + name = "Charge" + desc = "This spell can be used to recharge a variety of things in your hands, from magical artifacts to electrical components. A creative wizard can even use it to grant magical power to a fellow magic user." + spell_type = /datum/action/cooldown/spell/charge + category = "Assistance" + cost = 1 + +/datum/spellbook_entry/shapeshift + name = "Wild Shapeshift" + desc = "Take on the shape of another for a time to use their natural abilities. Once you've made your choice it cannot be changed." + spell_type = /datum/action/cooldown/spell/shapeshift/wizard + category = "Assistance" + cost = 1 + +/datum/spellbook_entry/tap + name = "Soul Tap" + desc = "Fuel your spells using your own soul!" + spell_type = /datum/action/cooldown/spell/tap + category = "Assistance" + cost = 1 + +/datum/spellbook_entry/item/staffanimation + name = "Staff of Animation" + desc = "An arcane staff capable of shooting bolts of eldritch energy which cause inanimate objects to come to life. This magic doesn't affect machines." + item_path = /obj/item/gun/magic/staff/animate + category = "Assistance" + +/datum/spellbook_entry/item/soulstones + name = "Soulstone Shard Kit" + desc = "Soul Stone Shards are ancient tools capable of capturing and harnessing the spirits of the dead and dying. \ + The spell Artificer allows you to create arcane machines for the captured souls to pilot." + item_path = /obj/item/storage/belt/soulstone/full + category = "Assistance" + +/datum/spellbook_entry/item/soulstones/try_equip_item(mob/living/carbon/human/user, obj/item/to_equip) + var/was_equipped = user.equip_to_slot_if_possible(to_equip, ITEM_SLOT_BELT, disable_warning = TRUE) + to_chat(user, span_notice("\A [to_equip.name] has been summoned [was_equipped ? "on your waist" : "at your feet"].")) + +/datum/spellbook_entry/item/soulstones/buy_spell(mob/living/carbon/human/user, obj/item/spellbook/book) + . =..() + if(!.) + return + + var/datum/action/cooldown/spell/conjure/construct/bonus_spell = new(user.mind || user) + bonus_spell.Grant(user) + +/datum/spellbook_entry/item/necrostone + name = "A Necromantic Stone" + desc = "A Necromantic stone is able to resurrect three dead individuals as skeletal thralls for you to command." + item_path = /obj/item/necromantic_stone + category = "Assistance" + +/datum/spellbook_entry/item/contract + name = "Contract of Apprenticeship" + desc = "A magical contract binding an apprentice wizard to your service, using it will summon them to your side." + item_path = /obj/item/antag_spawner/contract + category = "Assistance" + refundable = TRUE + +/datum/spellbook_entry/item/guardian + name = "Guardian Deck" + desc = "A deck of guardian tarot cards, capable of binding a personal guardian to your body. There are multiple types of guardian available, but all of them will transfer some amount of damage to you. \ + It would be wise to avoid buying these with anything capable of causing you to swap bodies with others." + item_path = /obj/item/guardiancreator/choose/wizard + category = "Assistance" + +/datum/spellbook_entry/item/guardian/buy_spell(mob/living/carbon/human/user, obj/item/spellbook/book) + . = ..() + if(!.) + return + + new /obj/item/paper/guides/antag/guardian/wizard(get_turf(user)) + to_chat(user, span_notice("If you are not experienced in the ways of wizardly guardians, a guide has been summoned at your feet.")) + +/datum/spellbook_entry/item/bloodbottle + name = "Bottle of Blood" + desc = "A bottle of magically infused blood, the smell of which will \ + attract extradimensional beings when broken. Be careful though, \ + the kinds of creatures summoned by blood magic are indiscriminate \ + in their killing, and you yourself may become a victim." + item_path = /obj/item/antag_spawner/slaughter_demon + limit = 3 + category = "Assistance" + refundable = TRUE + +/datum/spellbook_entry/item/hugbottle + name = "Bottle of Tickles" + desc = "A bottle of magically infused fun, the smell of which will \ + attract adorable extradimensional beings when broken. These beings \ + are similar to slaughter demons, but they do not permanently kill \ + their victims, instead putting them in an extradimensional hugspace, \ + to be released on the demon's death. Chaotic, but not ultimately \ + damaging. The crew's reaction to the other hand could be very \ + destructive." + item_path = /obj/item/antag_spawner/slaughter_demon/laughter + cost = 1 //non-destructive; it's just a jape, sibling! + limit = 3 + category = "Assistance" + refundable = TRUE diff --git a/code/modules/antagonists/wizard/equipment/spellbook_entries/challenges.dm b/code/modules/antagonists/wizard/equipment/spellbook_entries/challenges.dm new file mode 100644 index 00000000000000..d200b897588548 --- /dev/null +++ b/code/modules/antagonists/wizard/equipment/spellbook_entries/challenges.dm @@ -0,0 +1,10 @@ +// THESE ARE NOT PURCHASABLE SPELLS! +// They're flavor references to old spells that got removed + +// shit that sounds stupid but fun so we can painfully lock behind a dimmer +/datum/spellbook_entry/challenge/multiverse + name = "Multiverse Sword" + desc = "The Station gets a multiverse sword to stop you. Can you withstand the hordes of multiverse realities?" + +/datum/spellbook_entry/challenge/antiwizard + name = "Friendly Wizard Scum" + desc = "A \"Friendly\" Wizard will protect the station, and try to kill you. They get a spellbook much like you, but will use it for \"GOOD\"." diff --git a/code/modules/antagonists/wizard/equipment/spellbook_entries/defensive.dm b/code/modules/antagonists/wizard/equipment/spellbook_entries/defensive.dm new file mode 100644 index 00000000000000..4227927ae22a00 --- /dev/null +++ b/code/modules/antagonists/wizard/equipment/spellbook_entries/defensive.dm @@ -0,0 +1,148 @@ +// Defensive wizard spells +/datum/spellbook_entry/magicm + name = "Magic Missile" + desc = "Fires several, slow moving, magic projectiles at nearby targets." + spell_type = /datum/action/cooldown/spell/aoe/magic_missile + category = "Defensive" + +/datum/spellbook_entry/disabletech + name = "Disable Tech" + desc = "Disables all weapons, cameras and most other technology in range." + spell_type = /datum/action/cooldown/spell/emp/disable_tech + category = "Defensive" + cost = 1 + +/datum/spellbook_entry/repulse + name = "Repulse" + desc = "Throws everything around the user away." + spell_type = /datum/action/cooldown/spell/aoe/repulse/wizard + category = "Defensive" + +/datum/spellbook_entry/lightning_packet + name = "Thrown Lightning" + desc = "Forged from eldrich energies, a packet of pure power, \ + known as a spell packet will appear in your hand, that when thrown will stun the target." + spell_type = /datum/action/cooldown/spell/conjure_item/spellpacket + category = "Defensive" + +/datum/spellbook_entry/timestop + name = "Time Stop" + desc = "Stops time for everyone except for you, allowing you to move freely \ + while your enemies and even projectiles are frozen." + spell_type = /datum/action/cooldown/spell/timestop + category = "Defensive" + +/datum/spellbook_entry/smoke + name = "Smoke" + desc = "Spawns a cloud of choking smoke at your location." + spell_type = /datum/action/cooldown/spell/smoke + category = "Defensive" + cost = 1 + +/datum/spellbook_entry/forcewall + name = "Force Wall" + desc = "Create a magical barrier that only you can pass through." + spell_type = /datum/action/cooldown/spell/forcewall + category = "Defensive" + cost = 1 + +/datum/spellbook_entry/lichdom + name = "Bind Soul" + desc = "A dark necromantic pact that can forever bind your soul to an item of your choosing, \ + turning you into an immortal Lich. So long as the item remains intact, you will revive from death, \ + no matter the circumstances. Be wary - with each revival, your body will become weaker, and \ + it will become easier for others to find your item of power." + spell_type = /datum/action/cooldown/spell/lichdom + category = "Defensive" + +/datum/spellbook_entry/spacetime_dist + name = "Spacetime Distortion" + desc = "Entangle the strings of space-time in an area around you, \ + randomizing the layout and making proper movement impossible. The strings vibrate..." + spell_type = /datum/action/cooldown/spell/spacetime_dist + category = "Defensive" + cost = 1 + +/datum/spellbook_entry/the_traps + name = "The Traps!" + desc = "Summon a number of traps around you. They will damage and enrage any enemies that step on them." + spell_type = /datum/action/cooldown/spell/conjure/the_traps + category = "Defensive" + cost = 1 + +/datum/spellbook_entry/bees + name = "Lesser Summon Bees" + desc = "This spell magically kicks a transdimensional beehive, \ + instantly summoning a swarm of bees to your location. These bees are NOT friendly to anyone." + spell_type = /datum/action/cooldown/spell/conjure/bee + category = "Defensive" + +/datum/spellbook_entry/duffelbag + name = "Bestow Cursed Duffel Bag" + desc = "A curse that firmly attaches a demonic duffel bag to the target's back. \ + The duffel bag will make the person it's attached to take periodical damage \ + if it is not fed regularly, and regardless of whether or not it's been fed, \ + it will slow the person wearing it down significantly." + spell_type = /datum/action/cooldown/spell/touch/duffelbag + category = "Defensive" + cost = 1 + +/datum/spellbook_entry/item/staffhealing + name = "Staff of Healing" + desc = "An altruistic staff that can heal the lame and raise the dead." + item_path = /obj/item/gun/magic/staff/healing + cost = 1 + category = "Defensive" + +/datum/spellbook_entry/item/lockerstaff + name = "Staff of the Locker" + desc = "A staff that shoots lockers. It eats anyone it hits on its way, leaving a welded locker with your victims behind." + item_path = /obj/item/gun/magic/staff/locker + category = "Defensive" + +/datum/spellbook_entry/item/scryingorb + name = "Scrying Orb" + desc = "An incandescent orb of crackling energy. Using it will allow you to release your ghost while alive, allowing you to spy upon the station and talk to the deceased. In addition, buying it will permanently grant you X-ray vision." + item_path = /obj/item/scrying + category = "Defensive" + +/datum/spellbook_entry/item/wands + name = "Wand Assortment" + desc = "A collection of wands that allow for a wide variety of utility. \ + Wands have a limited number of charges, so be conservative with their use. Comes in a handy belt." + item_path = /obj/item/storage/belt/wands/full + category = "Defensive" + +/datum/spellbook_entry/item/wands/try_equip_item(mob/living/carbon/human/user, obj/item/to_equip) + var/was_equipped = user.equip_to_slot_if_possible(to_equip, ITEM_SLOT_BELT, disable_warning = TRUE) + to_chat(user, span_notice("\A [to_equip.name] has been summoned [was_equipped ? "on your waist" : "at your feet"].")) + +/datum/spellbook_entry/item/armor + name = "Mastercrafted Armor Set" + desc = "An artefact suit of armor that allows you to cast spells \ + while providing more protection against attacks and the void of space. \ + Also grants a battlemage shield." + item_path = /obj/item/mod/control/pre_equipped/enchanted + category = "Defensive" + +/datum/spellbook_entry/item/armor/try_equip_item(mob/living/carbon/human/user, obj/item/to_equip) + var/obj/item/mod/control/mod = to_equip + var/obj/item/mod/module/storage/storage = locate() in mod.modules + var/obj/item/back = user.back + if(back) + if(!user.dropItemToGround(back)) + return + for(var/obj/item/item as anything in back.contents) + item.forceMove(storage) + if(!user.equip_to_slot_if_possible(mod, mod.slot_flags, qdel_on_fail = FALSE, disable_warning = TRUE)) + return + if(!user.dropItemToGround(user.wear_suit) || !user.dropItemToGround(user.head)) + return + mod.quick_activation() + +/datum/spellbook_entry/item/battlemage_charge + name = "Battlemage Armour Charges" + desc = "A powerful defensive rune, it will grant eight additional charges to a battlemage shield." + item_path = /obj/item/wizard_armour_charge + category = "Defensive" + cost = 1 diff --git a/code/modules/antagonists/wizard/equipment/spellbook_entries/mobility.dm b/code/modules/antagonists/wizard/equipment/spellbook_entries/mobility.dm new file mode 100644 index 00000000000000..6dbc92d4a26eb2 --- /dev/null +++ b/code/modules/antagonists/wizard/equipment/spellbook_entries/mobility.dm @@ -0,0 +1,45 @@ +// Wizard spells that aid mobiilty(or stealth?) +/datum/spellbook_entry/mindswap + name = "Mindswap" + desc = "Allows you to switch bodies with a target next to you. You will both fall asleep when this happens, and it will be quite obvious that you are the target's body if someone watches you do it." + spell_type = /datum/action/cooldown/spell/pointed/mind_transfer + category = "Mobility" + +/datum/spellbook_entry/knock + name = "Knock" + desc = "Opens nearby doors and closets." + spell_type = /datum/action/cooldown/spell/aoe/knock + category = "Mobility" + cost = 1 + +/datum/spellbook_entry/blink + name = "Blink" + desc = "Randomly teleports you a short distance." + spell_type = /datum/action/cooldown/spell/teleport/radius_turf/blink + category = "Mobility" + +/datum/spellbook_entry/teleport + name = "Teleport" + desc = "Teleports you to an area of your selection." + spell_type = /datum/action/cooldown/spell/teleport/area_teleport/wizard + category = "Mobility" + +/datum/spellbook_entry/jaunt + name = "Ethereal Jaunt" + desc = "Turns your form ethereal, temporarily making you invisible and able to pass through walls." + spell_type = /datum/action/cooldown/spell/jaunt/ethereal_jaunt + category = "Mobility" + +/datum/spellbook_entry/item/warpwhistle + name = "Warp Whistle" + desc = "A strange whistle that will transport you to a distant safe place on the station. There is a window of vulnerability at the beginning of every use." + item_path = /obj/item/warp_whistle + category = "Mobility" + cost = 1 + +/datum/spellbook_entry/item/staffdoor + name = "Staff of Door Creation" + desc = "A particular staff that can mold solid walls into ornate doors. Useful for getting around in the absence of other transportation. Does not work on glass." + item_path = /obj/item/gun/magic/staff/door + cost = 1 + category = "Mobility" diff --git a/code/modules/antagonists/wizard/equipment/spellbook_entries/offensive.dm b/code/modules/antagonists/wizard/equipment/spellbook_entries/offensive.dm new file mode 100644 index 00000000000000..75fbb720a79ec0 --- /dev/null +++ b/code/modules/antagonists/wizard/equipment/spellbook_entries/offensive.dm @@ -0,0 +1,115 @@ +// Offensive wizard spells +/datum/spellbook_entry/fireball + name = "Fireball" + desc = "Fires an explosive fireball at a target. Considered a classic among all wizards." + spell_type = /datum/action/cooldown/spell/pointed/projectile/fireball + category = "Offensive" + +/datum/spellbook_entry/spell_cards + name = "Spell Cards" + desc = "Blazing hot rapid-fire homing cards. Send your foes to the shadow realm with their mystical power!" + spell_type = /datum/action/cooldown/spell/pointed/projectile/spell_cards + category = "Offensive" + +/datum/spellbook_entry/rod_form + name = "Rod Form" + desc = "Take on the form of an immovable rod, destroying all in your path. Purchasing this spell multiple times will also increase the rod's damage and travel range." + spell_type = /datum/action/cooldown/spell/rod_form + category = "Offensive" + +/datum/spellbook_entry/disintegrate + name = "Smite" + desc = "Charges your hand with an unholy energy that can be used to cause a touched victim to violently explode." + spell_type = /datum/action/cooldown/spell/touch/smite + category = "Offensive" + +/datum/spellbook_entry/blind + name = "Blind" + desc = "Temporarily blinds a single target." + spell_type = /datum/action/cooldown/spell/pointed/blind + category = "Offensive" + cost = 1 + +/datum/spellbook_entry/mutate + name = "Mutate" + desc = "Causes you to turn into a hulk and gain laser vision for a short while." + spell_type = /datum/action/cooldown/spell/apply_mutations/mutate + category = "Offensive" + +/datum/spellbook_entry/fleshtostone + name = "Flesh to Stone" + desc = "Charges your hand with the power to turn victims into inert statues for a long period of time." + spell_type = /datum/action/cooldown/spell/touch/flesh_to_stone + category = "Offensive" + +/datum/spellbook_entry/teslablast + name = "Tesla Blast" + desc = "Charge up a tesla arc and release it at a random nearby target! You can move freely while it charges. The arc jumps between targets and can knock them down." + spell_type = /datum/action/cooldown/spell/tesla + category = "Offensive" + +/datum/spellbook_entry/lightningbolt + name = "Lightning Bolt" + desc = "Fire a lightning bolt at your foes! It will jump between targets, but can't knock them down." + spell_type = /datum/action/cooldown/spell/pointed/projectile/lightningbolt + category = "Offensive" + cost = 1 + +/datum/spellbook_entry/infinite_guns + name = "Lesser Summon Guns" + desc = "Why reload when you have infinite guns? Summons an unending stream of bolt action rifles that deal little damage, but will knock targets down. Requires both hands free to use. Learning this spell makes you unable to learn Arcane Barrage." + spell_type = /datum/action/cooldown/spell/conjure_item/infinite_guns/gun + category = "Offensive" + cost = 3 + no_coexistance_typecache = list(/datum/action/cooldown/spell/conjure_item/infinite_guns/arcane_barrage) + +/datum/spellbook_entry/arcane_barrage + name = "Arcane Barrage" + desc = "Fire a torrent of arcane energy at your foes with this (powerful) spell. Deals much more damage than Lesser Summon Guns, but won't knock targets down. Requires both hands free to use. Learning this spell makes you unable to learn Lesser Summon Gun." + spell_type = /datum/action/cooldown/spell/conjure_item/infinite_guns/arcane_barrage + category = "Offensive" + cost = 3 + no_coexistance_typecache = list(/datum/action/cooldown/spell/conjure_item/infinite_guns/gun) + +/datum/spellbook_entry/barnyard + name = "Barnyard Curse" + desc = "This spell dooms an unlucky soul to possess the speech and facial attributes of a barnyard animal." + spell_type = /datum/action/cooldown/spell/pointed/barnyardcurse + category = "Offensive" + +/datum/spellbook_entry/item/staffchaos + name = "Staff of Chaos" + desc = "A caprious tool that can fire all sorts of magic without any rhyme or reason. Using it on people you care about is not recommended." + item_path = /obj/item/gun/magic/staff/chaos + category = "Offensive" + +/datum/spellbook_entry/item/staffchange + name = "Staff of Change" + desc = "An artefact that spits bolts of coruscating energy which cause the target's very form to reshape itself." + item_path = /obj/item/gun/magic/staff/change + category = "Offensive" + +/datum/spellbook_entry/item/mjolnir + name = "Mjolnir" + desc = "A mighty hammer on loan from Thor, God of Thunder. It crackles with barely contained power." + item_path = /obj/item/mjollnir + category = "Offensive" + +/datum/spellbook_entry/item/singularity_hammer + name = "Singularity Hammer" + desc = "A hammer that creates an intensely powerful field of gravity where it strikes, pulling everything nearby to the point of impact." + item_path = /obj/item/singularityhammer + category = "Offensive" + +/datum/spellbook_entry/item/spellblade + name = "Spellblade" + desc = "A sword capable of firing blasts of energy which rip targets limb from limb." + item_path = /obj/item/gun/magic/staff/spellblade + category = "Offensive" + +/datum/spellbook_entry/item/highfrequencyblade + name = "High Frequency Blade" + desc = "An incredibly swift enchanted blade resonating at a frequency high enough to be able to slice through anything." + item_path = /obj/item/highfrequencyblade/wizard + category = "Offensive" + cost = 3 diff --git a/code/modules/antagonists/wizard/equipment/spellbook_entries/summons.dm b/code/modules/antagonists/wizard/equipment/spellbook_entries/summons.dm new file mode 100644 index 00000000000000..37bdef69a646e1 --- /dev/null +++ b/code/modules/antagonists/wizard/equipment/spellbook_entries/summons.dm @@ -0,0 +1,87 @@ +// Ritual spells which affect the station at large +/// How much threat we need to let these rituals happen on dynamic +#define MINIMUM_THREAT_FOR_RITUALS 100 + +/datum/spellbook_entry/summon/ghosts + name = "Summon Ghosts" + desc = "Spook the crew out by making them see dead people. \ + Be warned, ghosts are capricious and occasionally vindicative, \ + and some will use their incredibly minor abilities to frustrate you." + cost = 0 + +/datum/spellbook_entry/summon/ghosts/buy_spell(mob/living/carbon/human/user, obj/item/spellbook/book) + summon_ghosts(user) + playsound(get_turf(user), 'sound/effects/ghost2.ogg', 50, TRUE) + return ..() + +/datum/spellbook_entry/summon/guns + name = "Summon Guns" + desc = "Nothing could possibly go wrong with arming a crew of lunatics just itching for an excuse to kill you. \ + There is a good chance that they will shoot each other first." + +/datum/spellbook_entry/summon/guns/can_be_purchased() + // Summon Guns requires 100 threat. + var/datum/game_mode/dynamic/mode = SSticker.mode + if(mode.threat_level < MINIMUM_THREAT_FOR_RITUALS) + return FALSE + // Also must be config enabled + return !CONFIG_GET(flag/no_summon_guns) + +/datum/spellbook_entry/summon/guns/buy_spell(mob/living/carbon/human/user,obj/item/spellbook/book) + summon_guns(user, 10) + playsound(get_turf(user), 'sound/magic/castsummon.ogg', 50, TRUE) + return ..() + +/datum/spellbook_entry/summon/magic + name = "Summon Magic" + desc = "Share the wonders of magic with the crew and show them \ + why they aren't to be trusted with it at the same time." + +/datum/spellbook_entry/summon/magic/can_be_purchased() + // Summon Magic requires 100 threat. + var/datum/game_mode/dynamic/mode = SSticker.mode + if(mode.threat_level < MINIMUM_THREAT_FOR_RITUALS) + return FALSE + // Also must be config enabled + return !CONFIG_GET(flag/no_summon_magic) + +/datum/spellbook_entry/summon/magic/buy_spell(mob/living/carbon/human/user,obj/item/spellbook/book) + summon_magic(user, 10) + playsound(get_turf(user), 'sound/magic/castsummon.ogg', 50, TRUE) + return ..() + +/datum/spellbook_entry/summon/events + name = "Summon Events" + desc = "Give Murphy's law a little push and replace all events with \ + special wizard ones that will confound and confuse everyone. \ + Multiple castings increase the rate of these events." + cost = 2 + limit = 5 // Each purchase can intensify it. + +/datum/spellbook_entry/summon/events/can_be_purchased() + // Summon Events requires 100 threat. + var/datum/game_mode/dynamic/mode = SSticker.mode + if(mode.threat_level < MINIMUM_THREAT_FOR_RITUALS) + return FALSE + // Also, must be config enabled + return !CONFIG_GET(flag/no_summon_events) + +/datum/spellbook_entry/summon/events/buy_spell(mob/living/carbon/human/user, obj/item/spellbook/book) + summon_events(user) + playsound(get_turf(user), 'sound/magic/castsummon.ogg', 50, TRUE) + return ..() + +/datum/spellbook_entry/summon/curse_of_madness + name = "Curse of Madness" + desc = "Curses the station, warping the minds of everyone inside, causing lasting traumas. Warning: this spell can affect you if not cast from a safe distance." + cost = 4 + +/datum/spellbook_entry/summon/curse_of_madness/buy_spell(mob/living/carbon/human/user, obj/item/spellbook/book) + var/message = tgui_input_text(user, "Whisper a secret truth to drive your victims to madness", "Whispers of Madness") + if(!message) + return FALSE + curse_of_madness(user, message) + playsound(user, 'sound/magic/mandswap.ogg', 50, TRUE) + return ..() + +#undef MINIMUM_THREAT_FOR_RITUALS diff --git a/code/modules/antagonists/wizard/equipment/wizard_spellbook.dm b/code/modules/antagonists/wizard/equipment/wizard_spellbook.dm new file mode 100644 index 00000000000000..df83035fc7f539 --- /dev/null +++ b/code/modules/antagonists/wizard/equipment/wizard_spellbook.dm @@ -0,0 +1,329 @@ +/obj/item/spellbook + name = "spell book" + desc = "An unearthly tome that glows with power." + icon = 'icons/obj/library.dmi' + icon_state ="book" + worn_icon_state = "book" + throw_speed = 2 + throw_range = 5 + w_class = WEIGHT_CLASS_TINY + + /// The number of book charges we have to buy spells + var/uses = 10 + /// The bonus that you get from going semi-random. + var/semi_random_bonus = 2 + /// The bonus that you get from going full random. + var/full_random_bonus = 5 + /// Determines if this spellbook can refund anything. + var/refunds_allowed = TRUE + /// The mind that first used the book. Automatically assigned when a wizard spawns. + var/datum/mind/owner + /// A list to all spellbook entries within + var/list/entries = list() + +/obj/item/spellbook/Initialize(mapload) + . = ..() + prepare_spells() + RegisterSignal(src, COMSIG_ITEM_MAGICALLY_CHARGED, .proc/on_magic_charge) + +/obj/item/spellbook/Destroy(force) + owner = null + entries.Cut() + return ..() + +/** + * Signal proc for [COMSIG_ITEM_MAGICALLY_CHARGED] + * + * Has no effect on charge, but gives a funny message to people who think they're clever. + */ +/obj/item/spellbook/proc/on_magic_charge(datum/source, datum/action/cooldown/spell/spell, mob/living/caster) + SIGNAL_HANDLER + + var/static/list/clever_girl = list( + "NICE TRY BUT NO!", + "CLEVER BUT NOT CLEVER ENOUGH!", + "SUCH FLAGRANT CHEESING IS WHY WE ACCEPTED YOUR APPLICATION!", + "CUTE! VERY CUTE!", + "YOU DIDN'T THINK IT'D BE THAT EASY, DID YOU?", + ) + + to_chat(caster, span_warning("Glowing red letters appear on the front cover...")) + to_chat(caster, span_red(pick(clever_girl))) + + return COMPONENT_ITEM_BURNT_OUT + +/obj/item/spellbook/examine(mob/user) + . = ..() + if(owner) + . += {"There is a small signature on the front cover: "[owner]"."} + else + . += "It appears to have no author." + +/obj/item/spellbook/attack_self(mob/user) + if(!owner) + if(!user.mind) + return + to_chat(user, span_notice("You bind [src] to yourself.")) + owner = user.mind + return + + if(user.mind != owner) + if(user.mind?.special_role == ROLE_WIZARD_APPRENTICE) + to_chat(user, span_warning("If you got caught sneaking a peek from your teacher's spellbook, you'd likely be expelled from the Wizard Academy. Better not.")) + else + to_chat(user, span_warning("[src] does not recognize you as its owner and refuses to open!")) + return + + return ..() + +/obj/item/spellbook/attackby(obj/item/O, mob/user, params) + // This can be generalized in the future, but for now it stays + if(istype(O, /obj/item/antag_spawner/contract)) + var/datum/spellbook_entry/item/contract/contract_entry = locate() in entries + if(!istype(contract_entry)) + to_chat(user, span_warning("[src] doesn't seem to want to refund [O].")) + return + if(!contract_entry.can_refund(user, src)) + to_chat(user, span_warning("You can't refund [src].")) + return + var/obj/item/antag_spawner/contract/contract = O + if(contract.used) + to_chat(user, span_warning("The contract has been used, you can't get your points back now!")) + return + + to_chat(user, span_notice("You feed the contract back into the spellbook, refunding your points.")) + uses += contract_entry.cost + contract_entry.times-- + qdel(O) + + else if(istype(O, /obj/item/antag_spawner/slaughter_demon/laughter)) + var/datum/spellbook_entry/item/hugbottle/demon_entry = locate() in entries + if(!istype(demon_entry)) + to_chat(user, span_warning("[src] doesn't seem to want to refund [O].")) + return + if(!demon_entry.can_refund(user, src)) + to_chat(user, span_warning("You can't refund [O].")) + return + + to_chat(user, span_notice("On second thought, maybe summoning a demon isn't a funny idea. You refund your points.")) + uses += demon_entry.cost + demon_entry.times-- + qdel(O) + + else if(istype(O, /obj/item/antag_spawner/slaughter_demon)) + var/datum/spellbook_entry/item/bloodbottle/demon_entry = locate() in entries + if(!istype(demon_entry)) + to_chat(user, span_warning("[src] doesn't seem to want to refund [O].")) + return + if(!demon_entry.can_refund(user, src)) + to_chat(user, span_warning("You can't refund [O].")) + return + + to_chat(user, span_notice("On second thought, maybe summoning a demon is a bad idea. You refund your points.")) + uses += demon_entry.cost + demon_entry.times-- + qdel(O) + + return ..() + +/// Instantiates our list of spellbook entries. +/obj/item/spellbook/proc/prepare_spells() + var/entry_types = subtypesof(/datum/spellbook_entry) + for(var/type in entry_types) + var/datum/spellbook_entry/possible_entry = new type() + if(!possible_entry.can_be_purchased()) + qdel(possible_entry) + continue + + possible_entry.set_spell_info() //loads up things for the entry that require checking spell instance. + entries |= possible_entry + +/obj/item/spellbook/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "Spellbook") + ui.open() + +/obj/item/spellbook/ui_data(mob/user) + var/list/data = list() + data["owner"] = owner + data["points"] = uses + data["semi_random_bonus"] = initial(uses) + semi_random_bonus + data["full_random_bonus"] = initial(uses) + full_random_bonus + return data + +//This is a MASSIVE amount of data, please be careful if you remove it from static. +/obj/item/spellbook/ui_static_data(mob/user) + var/list/data = list() + // Collect all info from each intry. + var/list/entry_data = list() + for(var/datum/spellbook_entry/entry as anything in entries) + var/list/individual_entry_data = list() + individual_entry_data["name"] = entry.name + individual_entry_data["desc"] = entry.desc + individual_entry_data["ref"] = REF(entry) + individual_entry_data["requires_wizard_garb"] = entry.requires_wizard_garb + individual_entry_data["cost"] = entry.cost + individual_entry_data["times"] = entry.times + individual_entry_data["cooldown"] = entry.cooldown + individual_entry_data["cat"] = entry.category + individual_entry_data["refundable"] = entry.refundable + individual_entry_data["buyword"] = entry.buy_word + entry_data += list(individual_entry_data) + + data["entries"] = entry_data + return data + +/obj/item/spellbook/ui_act(action, params) + . = ..() + if(.) + return + var/mob/living/carbon/human/wizard = usr + if(!istype(wizard)) + to_chat(wizard, span_warning("The book doesn't seem to listen to lower life forms.")) + return FALSE + + // Actions that are always available + switch(action) + if("purchase") + var/datum/spellbook_entry/entry = locate(params["spellref"]) in entries + return purchase_entry(entry, wizard) + + if("refund") + var/datum/spellbook_entry/entry = locate(params["spellref"]) in entries + if(!istype(entry)) + CRASH("[type] had an invalid ref to a spell passed in refund.") + if(!entry.can_refund(wizard, src)) + return FALSE + var/result = entry.refund_spell(wizard, src) + if(result <= 0) + return FALSE + + entry.times = 0 + uses += result + return TRUE + + if(uses < initial(uses)) + to_chat(wizard, span_warning("You need to have all your spell points to do this!")) + return FALSE + + // Actions that are only available if you have full spell points + switch(action) + if("semirandomize") + semirandomize(wizard, semi_random_bonus) + return TRUE + + if("randomize") + randomize(wizard, full_random_bonus) + return TRUE + + if("purchase_loadout") + wizard_loadout(wizard, locate(params["id"])) + return TRUE + +/// Attempts to purchased the passed entry [to_buy] for [user]. +/obj/item/spellbook/proc/purchase_entry(datum/spellbook_entry/to_buy, mob/living/carbon/human/user) + if(!istype(to_buy)) + CRASH("Spellbook attempted to buy an invalid entry. Got: [to_buy ? "[to_buy] ([to_buy.type])" : "null"]") + if(!to_buy.can_buy(user, src)) + return FALSE + if(!to_buy.buy_spell(user, src)) + return FALSE + + to_buy.times++ + uses -= to_buy.cost + return TRUE + +/// Purchases a wizard loadout [loadout] for [wizard]. +/obj/item/spellbook/proc/wizard_loadout(mob/living/carbon/human/wizard, loadout) + var/list/wanted_spells + switch(loadout) + if(WIZARD_LOADOUT_CLASSIC) //(Fireball>2, MM>2, Smite>2, Jauntx2>4) = 10 + wanted_spells = list( + /datum/spellbook_entry/fireball = 1, + /datum/spellbook_entry/magicm = 1, + /datum/spellbook_entry/disintegrate = 1, + /datum/spellbook_entry/jaunt = 2, + ) + if(WIZARD_LOADOUT_MJOLNIR) //(Mjolnir>2, Summon Itemx1>1, Mutate>2, Force Wall>1, Blink>2, tesla>2) = 10 + wanted_spells = list( + /datum/spellbook_entry/item/mjolnir = 1, + /datum/spellbook_entry/summonitem = 1, + /datum/spellbook_entry/mutate = 1, + /datum/spellbook_entry/forcewall = 1, + /datum/spellbook_entry/blink = 1, + /datum/spellbook_entry/teslablast = 1, + ) + if(WIZARD_LOADOUT_WIZARMY) //(Soulstones>2, Staff of Change>2, A Necromantic Stone>2, Teleport>2, Ethereal Jaunt>2) = 10 + wanted_spells = list( + /datum/spellbook_entry/item/soulstones = 1, + /datum/spellbook_entry/item/staffchange = 1, + /datum/spellbook_entry/item/necrostone = 1, + /datum/spellbook_entry/teleport = 1, + /datum/spellbook_entry/jaunt = 1, + ) + if(WIZARD_LOADOUT_SOULTAP) //(Soul Tap>1, Smite>2, Flesh to Stone>2, Mindswap>2, Knock>1, Teleport>2) = 10 + wanted_spells = list( + /datum/spellbook_entry/tap = 1, + /datum/spellbook_entry/disintegrate = 1, + /datum/spellbook_entry/fleshtostone = 1, + /datum/spellbook_entry/mindswap = 1, + /datum/spellbook_entry/knock = 1, + /datum/spellbook_entry/teleport = 1, + ) + + if(!length(wanted_spells)) + stack_trace("Wizard Loadout \"[loadout]\" did not find a loadout that existed.") + return + + for(var/entry in wanted_spells) + if(!ispath(entry, /datum/spellbook_entry)) + stack_trace("Wizard Loadout \"[loadout]\" had an non-spellbook_entry type in its wanted spells list. ([entry])") + continue + + var/datum/spellbook_entry/to_buy = locate(entry) in entries + if(!istype(to_buy)) + stack_trace("Wizard Loadout \"[loadout]\" had an invalid entry in its wanted spells list. ([entry])") + continue + + for(var/i in 1 to wanted_spells[entry]) + if(!purchase_entry(to_buy, wizard)) + stack_trace("Wizard Loadout \"[loadout]\" was unable to buy a spell for [wizard]. ([entry])") + message_admins("Wizard [wizard] purchased Loadout \"[loadout]\" but was unable to purchase one of the entries ([to_buy]) for some reason.") + break + + refunds_allowed = FALSE + + if(uses > 0) + stack_trace("Wizard Loadout \"[loadout]\" does not use 10 wizard spell slots (used: [initial(uses) - uses]). Stop scamming players out.") + +/// Purchases a semi-random wizard loadout for [wizard] +/// If passed a number [bonus_to_give], the wizard is given additional uses on their spellbook, used in randomization. +/obj/item/spellbook/proc/semirandomize(mob/living/carbon/human/wizard, bonus_to_give = 0) + var/list/needed_cats = list("Offensive", "Mobility") + var/list/shuffled_entries = shuffle(entries) + for(var/i in 1 to 2) + for(var/datum/spellbook_entry/entry as anything in shuffled_entries) + if(!(entry.category in needed_cats)) + continue + if(!purchase_entry(entry, wizard)) + continue + needed_cats -= entry.category //so the next loop doesn't find another offense spell + break + + refunds_allowed = FALSE + //we have given two specific category spells to the wizard. the rest are completely random! + randomize(wizard, bonus_to_give = bonus_to_give) + +/// Purchases a fully random wizard loadout for [wizard], with a point bonus [bonus_to_give]. +/// If passed a number [bonus_to_give], the wizard is given additional uses on their spellbook, used in randomization. +/obj/item/spellbook/proc/randomize(mob/living/carbon/human/wizard, bonus_to_give = 0) + var/list/entries_copy = entries.Copy() + uses += bonus_to_give + while(uses > 0 && length(entries_copy)) + var/datum/spellbook_entry/entry = pick(entries_copy) + if(!purchase_entry(entry, wizard)) + continue + entries_copy -= entry + + refunds_allowed = FALSE diff --git a/code/modules/antagonists/wizard/wizard.dm b/code/modules/antagonists/wizard/wizard.dm index 15a903f089781d..d48121c6d39dd1 100644 --- a/code/modules/antagonists/wizard/wizard.dm +++ b/code/modules/antagonists/wizard/wizard.dm @@ -1,3 +1,6 @@ +/// Global assoc list. [ckey] = [spellbook entry type] +GLOBAL_LIST_EMPTY(wizard_spellbook_purchases_by_key) + /datum/antagonist/wizard name = "\improper Space Wizard" roundend_category = "wizards/witches" @@ -145,7 +148,12 @@ objectives += hijack_objective /datum/antagonist/wizard/on_removal() - owner.RemoveAllSpells() // TODO keep track which spells are wizard spells which innate stuff + // Currently removes all spells regardless of innate or not. Could be improved. + for(var/datum/action/cooldown/spell/spell in owner.current.actions) + if(spell.target == owner) + qdel(spell) + owner.current.actions -= spell + return ..() /datum/antagonist/wizard/proc/equip_wizard() @@ -215,27 +223,58 @@ . = ..() if(!owner) CRASH("Antag datum with no owner.") - var/mob/living/carbon/human/H = owner.current - if(!istype(H)) + if(!ishuman(owner.current)) return + + var/list/spells_to_grant = list() + var/list/items_to_grant = list() + switch(school) if(APPRENTICE_DESTRUCTION) - owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/projectile/magic_missile(null)) - owner.AddSpell(new /obj/effect/proc_holder/spell/aimed/fireball(null)) - to_chat(owner, "Your service has not gone unrewarded, however. Studying under [master.current.real_name], you have learned powerful, destructive spells. You are able to cast magic missile and fireball.") + spells_to_grant = list( + /datum/action/cooldown/spell/aoe/magic_missile, + /datum/action/cooldown/spell/pointed/projectile/fireball, + ) + to_chat(owner, span_bold("Your service has not gone unrewarded, however. \ + Studying under [master.current.real_name], you have learned powerful, \ + destructive spells. You are able to cast magic missile and fireball.")) + if(APPRENTICE_BLUESPACE) - owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/area_teleport/teleport(null)) - owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt(null)) - to_chat(owner, "Your service has not gone unrewarded, however. Studying under [master.current.real_name], you have learned reality-bending mobility spells. You are able to cast teleport and ethereal jaunt.") + spells_to_grant = list( + /datum/action/cooldown/spell/teleport/area_teleport/wizard, + /datum/action/cooldown/spell/jaunt/ethereal_jaunt, + ) + to_chat(owner, span_bold("Your service has not gone unrewarded, however. \ + Studying under [master.current.real_name], you have learned reality-bending \ + mobility spells. You are able to cast teleport and ethereal jaunt.")) + if(APPRENTICE_HEALING) - owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/charge(null)) - owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/forcewall(null)) - H.put_in_hands(new /obj/item/gun/magic/staff/healing(H)) - to_chat(owner, "Your service has not gone unrewarded, however. Studying under [master.current.real_name], you have learned life-saving survival spells. You are able to cast charge and forcewall.") + spells_to_grant = list( + /datum/action/cooldown/spell/charge, + /datum/action/cooldown/spell/forcewall, + ) + items_to_grant = list( + /obj/item/gun/magic/staff/healing, + ) + to_chat(owner, span_bold("Your service has not gone unrewarded, however. \ + Studying under [master.current.real_name], you have learned life-saving \ + survival spells. You are able to cast charge and forcewall, and have a staff of healing.")) if(APPRENTICE_ROBELESS) - owner.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/knock(null)) - owner.AddSpell(new /obj/effect/proc_holder/spell/pointed/mind_transfer(null)) - to_chat(owner, "Your service has not gone unrewarded, however. Studying under [master.current.real_name], you have learned stealthy, robeless spells. You are able to cast knock and mindswap.") + spells_to_grant = list( + /datum/action/cooldown/spell/aoe/knock, + /datum/action/cooldown/spell/pointed/mind_transfer, + ) + to_chat(owner, span_bold("Your service has not gone unrewarded, however. \ + Studying under [master.current.real_name], you have learned stealthy, \ + robeless spells. You are able to cast knock and mindswap.")) + + for(var/spell_type in spells_to_grant) + var/datum/action/cooldown/spell/new_spell = new spell_type(owner) + new_spell.Grant(owner.current) + + for(var/item_type in items_to_grant) + var/obj/item/new_item = new item_type(owner.current) + owner.current.put_in_hands(new_item) /datum/antagonist/wizard/apprentice/create_objectives() var/datum/objective/protect/new_objective = new /datum/objective/protect @@ -275,9 +314,12 @@ H.equip_to_slot_or_del(new master_mob.back.type, ITEM_SLOT_BACK) //Operation: Fuck off and scare people - owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/area_teleport/teleport(null)) - owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/turf_teleport/blink(null)) - owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt(null)) + var/datum/action/cooldown/spell/jaunt/ethereal_jaunt/jaunt = new(owner) + jaunt.Grant(H) + var/datum/action/cooldown/spell/teleport/area_teleport/wizard/teleport = new(owner) + teleport.Grant(H) + var/datum/action/cooldown/spell/teleport/radius_turf/blink/blink = new(owner) + blink.Grant(H) /datum/antagonist/wizard/academy name = "Academy Teacher" @@ -287,17 +329,19 @@ /datum/antagonist/wizard/academy/equip_wizard() . = ..() - - owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt) - owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/projectile/magic_missile) - owner.AddSpell(new /obj/effect/proc_holder/spell/aimed/fireball) - - var/mob/living/M = owner.current - if(!istype(M)) + if(!isliving(owner.current)) return + var/mob/living/living_current = owner.current + + var/datum/action/cooldown/spell/jaunt/ethereal_jaunt/jaunt = new(owner) + jaunt.Grant(living_current) + var/datum/action/cooldown/spell/aoe/magic_missile/missile = new(owner) + missile.Grant(living_current) + var/datum/action/cooldown/spell/pointed/projectile/fireball/fireball = new(owner) + fireball.Grant(living_current) - var/obj/item/implant/exile/Implant = new/obj/item/implant/exile(M) - Implant.implant(M) + var/obj/item/implant/exile/exiled = new /obj/item/implant/exile(living_current) + exiled.implant(living_current) /datum/antagonist/wizard/academy/create_objectives() var/datum/objective/new_objective = new("Protect Wizard Academy from the intruders") @@ -325,12 +369,18 @@ else parts += span_redtext("The wizard has failed!") - if(owner.spell_list.len>0) - parts += "[owner.name] used the following spells: " - var/list/spell_names = list() - for(var/obj/effect/proc_holder/spell/S in owner.spell_list) - spell_names += S.name - parts += spell_names.Join(", ") + var/list/purchases = list() + for(var/list/log as anything in GLOB.wizard_spellbook_purchases_by_key[owner.key]) + var/datum/spellbook_entry/bought = log[LOG_SPELL_TYPE] + var/amount = log[LOG_SPELL_AMOUNT] + + purchases += "[amount > 1 ? "[amount]x ":""][initial(bought.name)]" + + if(length(purchases)) + parts += span_bold("[owner.name] used the following spells:") + parts += purchases.Join(", ") + else + parts += span_bold("[owner.name] didn't buy any spells!") return parts.Join("
") diff --git a/code/modules/aquarium/aquarium_behaviour.dm b/code/modules/aquarium/aquarium_behaviour.dm deleted file mode 100644 index e735b3ec45d7dd..00000000000000 --- a/code/modules/aquarium/aquarium_behaviour.dm +++ /dev/null @@ -1,19 +0,0 @@ -/* - // Default size of the "greyscale_fish" icon_state - sprite_height = 3 - sprite_width = 3 - -/// This path exists mostly for admin abuse. -/datum/aquarium_behaviour/fish/auto - name = "automatic fish" - desc = "generates fish appearance automatically from component parent appearance" - available_in_random_cases = FALSE - sprite_width = 8 - sprite_height = 8 - show_in_catalog = FALSE - -/datum/aquarium_behaviour/fish/auto/apply_appearance(obj/effect/holder) - holder.appearance = parent.parent - holder.transform = base_transform() - holder.dir = WEST -*/ diff --git a/code/modules/art/statues.dm b/code/modules/art/statues.dm index 241e598ae8a44f..60a11afcb586e3 100644 --- a/code/modules/art/statues.dm +++ b/code/modules/art/statues.dm @@ -286,7 +286,7 @@ AddElement(/datum/element/eyestab) AddElement(/datum/element/wall_engraver) //deals 200 damage to statues, meaning you can actually kill one in ~250 hits - AddElement(/datum/element/bane, /mob/living/simple_animal/hostile/statue, damage_multiplier = 40) + AddElement(/datum/element/bane, /mob/living/simple_animal/hostile/netherworld/statue, damage_multiplier = 40) /obj/item/chisel/Destroy() prepared_block = null diff --git a/code/modules/assembly/doorcontrol.dm b/code/modules/assembly/doorcontrol.dm index b32ffee4ad60c1..7b254d9e5a2ac0 100644 --- a/code/modules/assembly/doorcontrol.dm +++ b/code/modules/assembly/doorcontrol.dm @@ -185,34 +185,46 @@ if(cooldown) return cooldown = TRUE - var/obj/structure/industrial_lift/lift - for(var/l in GLOB.lifts) - var/obj/structure/industrial_lift/possible_lift = l - if(possible_lift.id != id || possible_lift.z == z || possible_lift.controls_locked) + var/datum/lift_master/lift + for(var/datum/lift_master/possible_match as anything in GLOB.active_lifts_by_type[BASIC_LIFT_ID]) + if(possible_match.specific_lift_id != id || !check_z(possible_match) || possible_match.controls_locked) continue - lift = possible_lift + + lift = possible_match break + if(!lift) addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 2 SECONDS) return - lift.visible_message(span_notice("[src] clinks and whirrs into automated motion, locking controls.")) - lift.lift_master_datum.set_controls(LOCKED) + + var/obj/structure/industrial_lift/target = lift.lift_platforms[1] + var/target_z = target.z + + lift.set_controls(LIFT_PLATFORM_LOCKED) ///The z level to which the elevator should travel var/targetZ = (abs(loc.z)) //The target Z (where the elevator should move to) is not our z level (we are just some assembly in nullspace) but actually the Z level of whatever we are contained in (e.g. elevator button) ///The amount of z levels between the our and targetZ - var/difference = abs(targetZ - lift.z) + var/difference = abs(targetZ - target_z) ///Direction (up/down) needed to go to reach targetZ - var/direction = lift.z < targetZ ? UP : DOWN + var/direction = target_z < targetZ ? UP : DOWN ///How long it will/should take us to reach the target Z level var/travel_duration = FLOOR_TRAVEL_TIME * difference //100 / 2 floors up = 50 seconds on every floor, will always reach destination in the same time addtimer(VARSET_CALLBACK(src, cooldown, FALSE), travel_duration) + for(var/i in 1 to difference) sleep(FLOOR_TRAVEL_TIME)//hey this should be alright... right? if(QDELETED(lift) || QDELETED(src))//elevator control or button gone = don't go up anymore return - lift.lift_master_datum.MoveLift(direction, null) - lift.visible_message(span_notice("[src] clicks, ready to be manually operated again.")) - lift.lift_master_datum.set_controls(UNLOCKED) + lift.MoveLift(direction, null) + lift.set_controls(LIFT_PLATFORM_UNLOCKED) + +///check if any of the lift platforms are already here +/obj/item/assembly/control/elevator/proc/check_z(datum/lift_master/lift) + for(var/obj/structure/industrial_lift/platform as anything in lift.lift_platforms) + if(platform.z == loc.z) + return FALSE + + return TRUE #undef FLOOR_TRAVEL_TIME @@ -221,17 +233,19 @@ desc = "A small device used to bring trams to you." ///for finding the landmark initially - should be the exact same as the landmark's destination id. var/initial_id + ///ID to link to allow us to link to one specific tram in the world + var/specific_lift_id = MAIN_STATION_TRAM ///this is our destination's landmark, so we only have to find it the first time. var/datum/weakref/to_where /obj/item/assembly/control/tram/Initialize(mapload) - . = ..() + ..() return INITIALIZE_HINT_LATELOAD /obj/item/assembly/control/tram/LateInitialize() . = ..() //find where the tram needs to go to (our destination). only needs to happen the first time - for(var/obj/effect/landmark/tram/our_destination as anything in GLOB.tram_landmarks) + for(var/obj/effect/landmark/tram/our_destination as anything in GLOB.tram_landmarks[specific_lift_id]) if(our_destination.destination_id == initial_id) to_where = WEAKREF(our_destination) break @@ -245,29 +259,27 @@ return cooldown = TRUE addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 2 SECONDS) - var/obj/structure/industrial_lift/tram/tram_part - var/turf/current_turf = get_turf(src) - if(!current_turf) - return - for(var/atom/tram as anything in GLOB.central_trams) - if(tram.z != current_turf.z) - continue - tram_part = tram - break - if(!tram_part) + + var/datum/lift_master/tram/tram + for(var/datum/lift_master/tram/possible_match as anything in GLOB.active_lifts_by_type[TRAM_LIFT_ID]) + if(possible_match.specific_lift_id == specific_lift_id) + tram = possible_match + break + + if(!tram) say("The tram is not responding to call signals. Please send a technician to repair the internals of the tram.") return - if(tram_part.travelling) //in use - say("The tram is already travelling to [tram_part.from_where].") + if(tram.travelling) //in use + say("The tram is already travelling to [tram.from_where].") return if(!to_where) return var/obj/effect/landmark/tram/current_location = to_where.resolve() if(!current_location) return - if(tram_part.from_where == current_location) //already here + if(tram.from_where == current_location) //already here say("The tram is already here. Please board the tram and select a destination.") return say("The tram has been called to [current_location.name]. Please wait for its arrival.") - tram_part.tram_travel(current_location) + tram.tram_travel(current_location) diff --git a/code/modules/assembly/flash.dm b/code/modules/assembly/flash.dm index 0180acba7cd336..692e5719ee0530 100644 --- a/code/modules/assembly/flash.dm +++ b/code/modules/assembly/flash.dm @@ -324,6 +324,8 @@ icon = 'icons/obj/device.dmi' icon_state = "memorizer" inhand_icon_state = "nullrod" + lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi' /obj/item/assembly/flash/handheld //this is now the regular pocket flashes @@ -359,6 +361,10 @@ /obj/item/assembly/flash/armimplant/proc/cooldown() overheat = FALSE +/obj/item/assembly/flash/armimplant/screwdriver_act(mob/living/user, obj/item/I) + to_chat(user, span_notice("\The [src] is an implant! It cannot be unsecured!")) + add_fingerprint(user) + /obj/item/assembly/flash/hypnotic desc = "A modified flash device, programmed to emit a sequence of subliminal flashes that can send a vulnerable target into a hypnotic trance." flashing_overlay = "flash-hypno" diff --git a/code/modules/assembly/igniter.dm b/code/modules/assembly/igniter.dm index 44f2e71acb8e1c..d3b3f3b63dd461 100644 --- a/code/modules/assembly/igniter.dm +++ b/code/modules/assembly/igniter.dm @@ -36,6 +36,10 @@ var/turf/location = get_turf(loc) if(location) location.hotspot_expose(heat, EXPOSED_VOLUME) + if(holder) + SEND_SIGNAL(holder.loc, COMSIG_IGNITER_ACTIVATE) + if(QDELETED(src)) + return TRUE sparks.start() return TRUE diff --git a/code/modules/asset_cache/asset_cache_item.dm b/code/modules/asset_cache/asset_cache_item.dm index 059ebaebca8d77..ad4596bdedc869 100644 --- a/code/modules/asset_cache/asset_cache_item.dm +++ b/code/modules/asset_cache/asset_cache_item.dm @@ -4,9 +4,13 @@ * An internal datum containing info on items in the asset cache. Mainly used to cache md5 info for speed. */ /datum/asset_cache_item + /// the name of this asset item, becomes the key in SSassets.cache list var/name + /// md5() of the file this asset item represents. var/hash + /// the file this asset represents var/resource + /// our file extension e.g. .png, .gif, etc var/ext = "" /// Should this file also be sent via the legacy browse_rsc system /// when cdn transports are enabled? @@ -21,11 +25,20 @@ /// TRUE for keeping local asset names when browse_rsc backend is used var/keep_local_name = FALSE -/datum/asset_cache_item/New(name, file) +///pass in a valid file_hash if you have one to save it from needing to do it again. +///pass in a valid dmi file path string e.g. "icons/path/to/dmi_file.dmi" to make generating the hash less expensive +/datum/asset_cache_item/New(name, file, file_hash, dmi_file_path) if (!isfile(file)) file = fcopy_rsc(file) - - hash = md5asfile(file) //icons sent to the rsc sometimes md5 incorrectly + + hash = file_hash + + //the given file is directly from a dmi file and is thus in the rsc already, we know that its file_hash will be correct + if(!hash) + if(dmi_file_path) + hash = md5(file) + else + hash = md5asfile(file) //icons sent to the rsc md5 incorrectly when theyre given incorrect data if (!hash) CRASH("invalid asset sent to asset cache") src.name = name diff --git a/code/modules/asset_cache/assets/fish.dm b/code/modules/asset_cache/assets/fish.dm index a76e8b096fe1de..44300c63587625 100644 --- a/code/modules/asset_cache/assets/fish.dm +++ b/code/modules/asset_cache/assets/fish.dm @@ -10,3 +10,10 @@ if(sprites[id]) //no dupes continue Insert(id, fish_icon, fish_icon_state) + + +/datum/asset/simple/fishing_minigame + assets = list( + "fishing_background_default" = 'icons/ui_icons/fishing/default.png', + "fishing_background_lavaland" = 'icons/ui_icons/fishing/lavaland.png' + ) diff --git a/code/modules/asset_cache/transports/asset_transport.dm b/code/modules/asset_cache/transports/asset_transport.dm index c0714e70d9c40c..01b3816be91533 100644 --- a/code/modules/asset_cache/transports/asset_transport.dm +++ b/code/modules/asset_cache/transports/asset_transport.dm @@ -25,15 +25,21 @@ addtimer(CALLBACK(src, .proc/send_assets_slow, C, preload), 1 SECONDS) -/// Register a browser asset with the asset cache system -/// asset_name - the identifier of the asset -/// asset - the actual asset file (or an asset_cache_item datum) -/// returns a /datum/asset_cache_item. -/// mutiple calls to register the same asset under the same asset_name return the same datum -/datum/asset_transport/proc/register_asset(asset_name, asset) +/** + * Register a browser asset with the asset cache system. + * returns a /datum/asset_cache_item. + * mutiple calls to register the same asset under the same asset_name return the same datum. + * + * Arguments: + * * asset_name - the identifier of the asset. + * * asset - the actual asset file (or an asset_cache_item datum). + * * file_hash - optional, a hash of the contents of the asset files contents. used so asset_cache_item doesnt have to hash it again + * * dmi_file_path - optional, means that the given asset is from the rsc and thus we dont need to do some expensive operations + */ +/datum/asset_transport/proc/register_asset(asset_name, asset, file_hash, dmi_file_path) var/datum/asset_cache_item/ACI = asset if (!istype(ACI)) - ACI = new(asset_name, asset) + ACI = new(asset_name, asset, file_hash, dmi_file_path) if (!ACI || !ACI.hash) CRASH("ERROR: Invalid asset: [asset_name]:[asset]:[ACI]") if (SSassets.cache[asset_name]) diff --git a/code/modules/atmospherics/environmental/LINDA_fire.dm b/code/modules/atmospherics/environmental/LINDA_fire.dm index 897ccb1feb2d83..3e414fd9fee6c9 100644 --- a/code/modules/atmospherics/environmental/LINDA_fire.dm +++ b/code/modules/atmospherics/environmental/LINDA_fire.dm @@ -107,6 +107,7 @@ air_update_turf(FALSE, FALSE) var/static/list/loc_connections = list( COMSIG_ATOM_ENTERED = .proc/on_entered, + COMSIG_ATOM_ABSTRACT_ENTERED = .proc/on_entered, ) AddElement(/datum/element/connect_loc, loc_connections) diff --git a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm index adc1573c64d754..4cc7d10f7bb24d 100644 --- a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm +++ b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm @@ -645,20 +645,22 @@ Then we space some of our heat, and think about if we should stop conducting. /turf/proc/radiate_to_spess() //Radiate excess tile heat to space if(temperature <= T0C) //Considering 0 degC as te break even point for radiation in and out return - var/delta_temperature = (temperature_archived - TCMB) //hardcoded space temperature + // Because we keep losing energy, makes more sense for us to be the T2 here. + var/delta_temperature = temperature_archived - TCMB //hardcoded space temperature if(heat_capacity <= 0 || abs(delta_temperature) <= MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) return - var/heat = thermal_conductivity * delta_temperature * \ - (heat_capacity * HEAT_CAPACITY_VACUUM / (heat_capacity + HEAT_CAPACITY_VACUUM)) - temperature -= heat/heat_capacity + // Heat should be positive in most cases + // coefficient applied first because some turfs have very big heat caps. + var/heat = CALCULATE_CONDUCTION_ENERGY(thermal_conductivity * delta_temperature, HEAT_CAPACITY_VACUUM, heat_capacity) + temperature -= heat / heat_capacity /turf/open/proc/temperature_share_open_to_solid(turf/sharer) sharer.temperature = air.temperature_share(null, sharer.thermal_conductivity, sharer.temperature, sharer.heat_capacity) /turf/proc/share_temperature_mutual_solid(turf/sharer, conduction_coefficient) //This is all just heat sharing, don't get freaked out - var/delta_temperature = (temperature_archived - sharer.temperature_archived) - if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER && heat_capacity && sharer.heat_capacity) - var/heat = conduction_coefficient * delta_temperature * \ - (heat_capacity * sharer.heat_capacity / (heat_capacity + sharer.heat_capacity)) //The larger the combined capacity the less is shared - temperature -= heat / heat_capacity //The higher your own heat cap the less heat you get from this arrangement - sharer.temperature += heat / sharer.heat_capacity + var/delta_temperature = sharer.temperature_archived - temperature_archived + if(abs(delta_temperature) <= MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER || !heat_capacity || !sharer.heat_capacity) + return + var/heat = conduction_coefficient * CALCULATE_CONDUCTION_ENERGY(delta_temperature, heat_capacity, sharer.heat_capacity) + temperature += heat / heat_capacity //The higher your own heat cap the less heat you get from this arrangement + sharer.temperature -= heat / sharer.heat_capacity diff --git a/code/modules/atmospherics/gasmixtures/gas_mixture.dm b/code/modules/atmospherics/gasmixtures/gas_mixture.dm index 7cf75c1329607d..20f2522328718f 100644 --- a/code/modules/atmospherics/gasmixtures/gas_mixture.dm +++ b/code/modules/atmospherics/gasmixtures/gas_mixture.dm @@ -111,8 +111,7 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) if(volume) // to prevent division by zero var/cached_gases = gases TOTAL_MOLES(cached_gases, .) - . *= R_IDEAL_GAS_EQUATION * temperature / volume - return + return . * R_IDEAL_GAS_EQUATION * temperature / volume return 0 /// Calculate temperature in kelvins @@ -443,8 +442,8 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) sharer_heat_capacity = sharer_heat_capacity || sharer.heat_capacity(ARCHIVE) if((sharer_heat_capacity > MINIMUM_HEAT_CAPACITY) && (self_heat_capacity > MINIMUM_HEAT_CAPACITY)) - var/heat = conduction_coefficient*temperature_delta* \ - (self_heat_capacity*sharer_heat_capacity/(self_heat_capacity+sharer_heat_capacity)) + // coefficient applied first because some turfs have very big heat caps. + var/heat = CALCULATE_CONDUCTION_ENERGY(conduction_coefficient * temperature_delta, sharer_heat_capacity, self_heat_capacity) temperature = max(temperature - heat/self_heat_capacity, TCMB) sharer_temperature = max(sharer_temperature + heat/sharer_heat_capacity, TCMB) @@ -540,23 +539,18 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) /** - * Takes the amount of the gas you want to PP as an argument - * So I don't have to do some hacky switches/defines/magic strings + * Returns the partial pressure of the gas in the breath based on BREATH_VOLUME * eg: - * Plas_PP = get_partial_pressure(gas_mixture.plasma) - * O2_PP = get_partial_pressure(gas_mixture.oxygen) - * get_breath_partial_pressure(gas_pp) --> gas_pp/total_moles()*breath_pp = pp - * get_true_breath_pressure(pp) --> gas_pp = pp/breath_pp*total_moles() + * Plas_PP = get_breath_partial_pressure(gas_mixture.gases[/datum/gas/plasma][MOLES]) + * O2_PP = get_breath_partial_pressure(gas_mixture.gases[/datum/gas/oxygen][MOLES]) + * get_breath_partial_pressure(gas_mole_count) --> PV = nRT, P = nRT/V * * 10/20*5 = 2.5 * 10 = 2.5/5*20 */ -/datum/gas_mixture/proc/get_breath_partial_pressure(gas_pressure) - return (gas_pressure * R_IDEAL_GAS_EQUATION * temperature) / BREATH_VOLUME -///inverse -/datum/gas_mixture/proc/get_true_breath_pressure(partial_pressure) - return (partial_pressure * BREATH_VOLUME) / (R_IDEAL_GAS_EQUATION * temperature) +/datum/gas_mixture/proc/get_breath_partial_pressure(gas_mole_count) + return (gas_mole_count * R_IDEAL_GAS_EQUATION * temperature) / BREATH_VOLUME /** * Counts how much pressure will there be if we impart MOLAR_ACCURACY amounts of our gas to the output gasmix. @@ -666,7 +660,7 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) /datum/gas_mixture/proc/gas_pressure_quadratic(a, b, c, lower_limit, upper_limit) var/solution if(!IS_INF_OR_NAN(a) && !IS_INF_OR_NAN(b) && !IS_INF_OR_NAN(c)) - solution = max(SolveQuadratic(a, b, c)) + solution = max(SolveQuadratic(a, b, c)) if(solution > lower_limit && solution < upper_limit) //SolveQuadratic can return empty lists so be careful here return solution stack_trace("Failed to solve pressure quadratic equation. A: [a]. B: [b]. C:[c]. Current value = [solution]. Expected lower limit: [lower_limit]. Expected upper limit: [upper_limit].") diff --git a/code/modules/atmospherics/gasmixtures/reaction_factors.dm b/code/modules/atmospherics/gasmixtures/reaction_factors.dm index 844a8585ca884c..eb65ea646371e8 100644 --- a/code/modules/atmospherics/gasmixtures/reaction_factors.dm +++ b/code/modules/atmospherics/gasmixtures/reaction_factors.dm @@ -75,12 +75,12 @@ /datum/gas_reaction/bzformation/init_factors() factor = list( - /datum/gas/plasma = "Plasma is consumed at 2 reaction rate. If there is more plasma than nitrous oxide reaction rate is slowed down.", - /datum/gas/nitrous_oxide = "Nitrous oxide is consumed at 1 reaction rate. If there is less nitrous oxide than plasma the reaction rate is slowed down.", - /datum/gas/bz = "BZ is formed at 2.5 reaction rate. A small malus up to half a mole per tick is applied if the reaction rate is constricted by nitrous oxide.", - /datum/gas/oxygen = "Oxygen is produced from the BZ malus. This only happens when the reaction rate is being constricted by the amount of nitrous oxide present. I.E. amount of nitrous oxide is less than the reaction rate.", // Less than the reaction rate AND half the plasma, but suppose that's not necessary to mention. - "Pressure" = "The lower the pressure the faster the reaction rate goes.", - "Energy" = "[FIRE_CARBON_ENERGY_RELEASED] joules of energy is released per reaction rate", + /datum/gas/plasma = "Each mole of BZ made consumes 0.8 moles of plasma. If there is more plasma than nitrous oxide reaction rate is slowed down.", + /datum/gas/nitrous_oxide = "Each mole of bz made consumes 0.4 moles of Nitrous oxide. If there is less nitrous oxide than plasma the reaction rate is slowed down. At three times the amount of plasma to Nitrous oxide it will start breaking down into Nitrogen and Oxygen, the lower the ratio the more Nitrous oxide decomposes.", + /datum/gas/bz = "The lower the pressure and larger the volume the more bz gets made. Less nitrous oxide than plasma will slow down the reaction.", + /datum/gas/nitrogen = "Each mole Nitrous oxide decomposed makes 1 mol Nitrogen. Lower ratio of Nitrous oxide to Plasma means a higher ratio of decomposition to BZ production.", + /datum/gas/oxygen = "Each mole Nitrous oxide decomposed makes 0.5 moles Oxygen. Lower ratio of Nitrous oxide to Plasma means a higher ratio of decomposition to BZ production.", + "Energy" = "[BZ_FORMATION_ENERGY] joules of energy is released per mol of BZ made. Nitrous oxide decomposition releases [N2O_DECOMPOSITION_ENERGY] per mol decomposed", ) /datum/gas_reaction/pluox_formation/init_factors() diff --git a/code/modules/atmospherics/gasmixtures/reactions.dm b/code/modules/atmospherics/gasmixtures/reactions.dm index 1ff8be488720c6..fa86e0d2e4785b 100644 --- a/code/modules/atmospherics/gasmixtures/reactions.dm +++ b/code/modules/atmospherics/gasmixtures/reactions.dm @@ -549,31 +549,37 @@ /datum/gas_reaction/bzformation/react(datum/gas_mixture/air) var/list/cached_gases = air.gases var/pressure = air.return_pressure() - // This slows down in relation to pressure, very quickly. Please don't expect it to be anything more then a snail + var/volume = air.return_volume() + var/environment_effciency = volume/pressure //More volume and less pressure gives better rates + var/ratio_efficency = min(cached_gases[/datum/gas/nitrous_oxide][MOLES]/cached_gases[/datum/gas/plasma][MOLES], 1) //Less n2o than plasma give lower rates + var/bz_formed = min(0.01 * ratio_efficency * environment_effciency, cached_gases[/datum/gas/nitrous_oxide][MOLES] * INVERSE(0.4), cached_gases[/datum/gas/plasma][MOLES] * INVERSE(0.8)) - // Bigger is better for these two values. - var/pressure_efficiency = (0.1 * ONE_ATMOSPHERE) / pressure // More pressure = more bad - var/ratio_efficiency = min(cached_gases[/datum/gas/nitrous_oxide][MOLES] / cached_gases[/datum/gas/plasma][MOLES], 1) // Malus to production if more plasma than n2o. - - var/reaction_efficency = min(pressure_efficiency * ratio_efficiency, cached_gases[/datum/gas/nitrous_oxide][MOLES], cached_gases[/datum/gas/plasma][MOLES] * INVERSE(2)) - - if ((cached_gases[/datum/gas/nitrous_oxide][MOLES] - reaction_efficency < 0 )|| (cached_gases[/datum/gas/plasma][MOLES] - (2 * reaction_efficency) < 0) || reaction_efficency <= 0) //Shouldn't produce gas from nothing. + if (cached_gases[/datum/gas/nitrous_oxide][MOLES] - bz_formed * 0.4 < 0 || cached_gases[/datum/gas/plasma][MOLES] - (0.8 * bz_formed) < 0 || bz_formed <= 0) return NO_REACTION var/old_heat_capacity = air.heat_capacity() - ASSERT_GAS(/datum/gas/bz, air) - if (reaction_efficency == cached_gases[/datum/gas/nitrous_oxide][MOLES]) + + /** + *If n2o-plasma ratio is less than 1:3 start decomposing n2o. + *Rate of decomposition vs BZ production increases as n2o concentration gets lower + *Plasma acts as a catalyst on decomposition, so it doesn't get consumed in the process. + *N2O decomposes with its normal decomposition energy + */ + var/nitrous_oxide_decomposed_factor = max(4 * (cached_gases[/datum/gas/plasma][MOLES] / (cached_gases[/datum/gas/nitrous_oxide][MOLES] + cached_gases[/datum/gas/plasma][MOLES]) - 0.75), 0) + if (nitrous_oxide_decomposed_factor>0) + ASSERT_GAS(/datum/gas/nitrogen, air) ASSERT_GAS(/datum/gas/oxygen, air) - cached_gases[/datum/gas/bz][MOLES] += (reaction_efficency * 2.5) - min(pressure, 0.5) - cached_gases[/datum/gas/oxygen][MOLES] += min(pressure, 0.5) - else - cached_gases[/datum/gas/bz][MOLES] += reaction_efficency * 2.5 + var/amount_decomposed = 0.4 * bz_formed * nitrous_oxide_decomposed_factor + cached_gases[/datum/gas/nitrogen] += amount_decomposed + cached_gases[/datum/gas/oxygen] += 0.5 * amount_decomposed - cached_gases[/datum/gas/nitrous_oxide][MOLES] -= reaction_efficency - cached_gases[/datum/gas/plasma][MOLES] -= 2 * reaction_efficency + ASSERT_GAS(/datum/gas/bz, air) + cached_gases[/datum/gas/bz][MOLES] += bz_formed * (1-nitrous_oxide_decomposed_factor) + cached_gases[/datum/gas/nitrous_oxide][MOLES] -= 0.4 * bz_formed + cached_gases[/datum/gas/plasma][MOLES] -= 0.8 * bz_formed * (1-nitrous_oxide_decomposed_factor) - SET_REACTION_RESULTS(reaction_efficency) - var/energy_released = 2 * reaction_efficency * FIRE_CARBON_ENERGY_RELEASED + SET_REACTION_RESULTS(bz_formed) + var/energy_released = bz_formed * (BZ_FORMATION_ENERGY + nitrous_oxide_decomposed_factor * (N2O_DECOMPOSITION_ENERGY - BZ_FORMATION_ENERGY)) var/new_heat_capacity = air.heat_capacity() if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) air.temperature = max(((air.temperature * old_heat_capacity + energy_released) / new_heat_capacity), TCMB) @@ -741,7 +747,7 @@ var/temperature = air.temperature var/minimal_mole_factor = min(cached_gases[/datum/gas/plasma][MOLES] * INVERSE(0.6), cached_gases[/datum/gas/bz][MOLES] * INVERSE(0.1), cached_gases[/datum/gas/carbon_dioxide][MOLES] * INVERSE(0.3)) - var/equation_first_part = NUM_E ** (-((temperature - 800) / 200) ** 2) + var/equation_first_part = NUM_E ** (-(((temperature - 800) / 200) ** 2)) var/equation_second_part = 3 / (1 + NUM_E ** (-0.001 * (temperature - 6000))) var/heat_factor = equation_first_part + equation_second_part @@ -1093,7 +1099,7 @@ location = pick(pipenet.members) else if(isatom(holder)) location = holder - if (location && energy_released > PN_BZASE_RAD_RELEASE_THRESHOLD * (air.volume / CELL_VOLUME) ** ATMOS_RADIATION_VOLUME_EXP) + if (location && energy_released > PN_TRITIUM_CONVERSION_RAD_RELEASE_THRESHOLD * (air.volume / CELL_VOLUME) ** ATMOS_RADIATION_VOLUME_EXP) radiation_pulse(location, max_range = min(sqrt(produced_amount) / PN_TRITIUM_RAD_RANGE_DIVISOR, GAS_REACTION_MAXIMUM_RADIATION_PULSE_RANGE), threshold = PN_TRITIUM_RAD_THRESHOLD_BASE * INVERSE(PN_TRITIUM_RAD_THRESHOLD_BASE + produced_amount)) if(energy_released) @@ -1145,7 +1151,7 @@ location = pick(pipenet.members) else if(isatom(holder)) location = holder - if (location && energy_released > PN_TRITIUM_CONVERSION_RAD_RELEASE_THRESHOLD * (air.volume / CELL_VOLUME) ** ATMOS_RADIATION_VOLUME_EXP) + if (location && energy_released > PN_BZASE_RAD_RELEASE_THRESHOLD * (air.volume / CELL_VOLUME) ** ATMOS_RADIATION_VOLUME_EXP) radiation_pulse(location, max_range = min(sqrt(consumed_amount) / PN_BZASE_RAD_RANGE_DIVISOR, GAS_REACTION_MAXIMUM_RADIATION_PULSE_RANGE), threshold = PN_BZASE_RAD_THRESHOLD_BASE * INVERSE(PN_BZASE_RAD_THRESHOLD_BASE + consumed_amount)) for(var/mob/living/carbon/L in location) L.hallucination += consumed_amount diff --git a/code/modules/atmospherics/machinery/components/binary_devices/temperature_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/temperature_pump.dm index 742964c2d85fb0..acdcfd90ac749c 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/temperature_pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/temperature_pump.dm @@ -48,9 +48,9 @@ var/input_capacity = remove_input.heat_capacity() var/output_capacity = remove_output.heat_capacity() - var/cooling_heat_amount = (heat_transfer_rate * 0.01) * coolant_temperature_delta * (input_capacity * output_capacity / (input_capacity + output_capacity)) - remove_input.temperature = max(remove_input.temperature - (cooling_heat_amount / input_capacity), TCMB) + var/cooling_heat_amount = (heat_transfer_rate * 0.01) * CALCULATE_CONDUCTION_ENERGY(coolant_temperature_delta, output_capacity, input_capacity) remove_output.temperature = max(remove_output.temperature + (cooling_heat_amount / output_capacity), TCMB) + remove_input.temperature = max(remove_input.temperature - (cooling_heat_amount / input_capacity), TCMB) update_parents() var/power_usage = 200 diff --git a/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer.dm b/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer.dm index 6e88016e25b95c..158766036b048f 100644 --- a/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer.dm +++ b/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer.dm @@ -98,13 +98,13 @@ else icon_state = "[base_icon]-off" -/obj/machinery/atmospherics/components/binary/crystallizer/attackby_secondary(mob/user) +/obj/machinery/atmospherics/components/binary/crystallizer/attackby_secondary(obj/item/tool, mob/user, params) if(!can_interact(user)) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN on = !on investigate_log("was turned [on ? "on" : "off"] by [key_name(user)]", INVESTIGATE_ATMOS) update_icon() - + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN ///Checks if the reaction temperature is inside the range of temperature + a little deviation /obj/machinery/atmospherics/components/binary/crystallizer/proc/check_temp_requirements() if(internal.temperature >= selected_recipe.min_temp * MIN_DEVIATION_RATE && internal.temperature <= selected_recipe.max_temp * MAX_DEVIATION_RATE) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index f70793c5464c59..ad92bb2ee4221f 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm @@ -90,6 +90,7 @@ var/efficiency = 1 var/sleep_factor = 0.00125 var/unconscious_factor = 0.001 + /// Our approximation of a mob's heat capacity. var/heat_capacity = 20000 var/conduction_coefficient = 0.3 @@ -304,10 +305,10 @@ GLOBAL_VAR_INIT(cryo_overlay_cover_off, mutable_appearance('icons/obj/cryogenics if(abs(temperature_delta) > 1) var/air_heat_capacity = air1.heat_capacity() - var/heat = ((1 - cold_protection) * 0.1 + conduction_coefficient) * temperature_delta * (air_heat_capacity * heat_capacity / (air_heat_capacity + heat_capacity)) + var/heat = ((1 - cold_protection) * 0.1 + conduction_coefficient) * CALCULATE_CONDUCTION_ENERGY(temperature_delta, heat_capacity, air_heat_capacity) - air1.temperature = clamp(air1.temperature - heat / air_heat_capacity, TCMB, MAX_TEMPERATURE) mob_occupant.adjust_bodytemperature(heat / heat_capacity, TCMB) + air1.temperature = clamp(air1.temperature - heat / air_heat_capacity, TCMB, MAX_TEMPERATURE) //lets have the core temp match the body temp in humans if(ishuman(mob_occupant)) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm index f7471721df3dc4..5e036ea19b8d90 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm @@ -123,12 +123,8 @@ balloon_alert(user, "temperature reset to [target_temperature] K") update_appearance() -/** Performs heat calculation for the freezer. The full equation for this whole process is: - * T3 = (C1 * T1 + (C1 * C2) / (C1 + C2) * (T2 - T1)) / C1. - * C1 is main port heat capacity, T1 is the temp. - * C2 and T2 is for the heat capacity of the freezer and temperature that we desire respectively. - * T3 is the temperature we get - */ +/// Performs heat calculation for the freezer. +/// We just equalize the gasmix with an object at temp = var/target_temperature and heat cap = var/heat_capacity /obj/machinery/atmospherics/components/unary/thermomachine/process_atmos() if(!on) return @@ -151,8 +147,8 @@ // The difference between target and what we need to heat/cool. Positive if heating, negative if cooling. var/temperature_target_delta = target_temperature - port.temperature - // This variable holds the (C1*C2) / (C1+C2) * (T2-T1) part of the equation. - var/heat_amount = temperature_target_delta * (port_capacity * heat_capacity / (port_capacity + heat_capacity)) + // We perfectly can do W1+W2 / C1+C2 here but this lets us count the power easily. + var/heat_amount = CALCULATE_CONDUCTION_ENERGY(temperature_target_delta, port_capacity, heat_capacity) port.temperature = max(((port.temperature * port_capacity) + heat_amount) / port_capacity, TCMB) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm index 0cd1cccb3a6da3..8ea11de0ee2d2f 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm @@ -518,5 +518,9 @@ living_mobs += WEAKREF(new_mob) visible_message(span_warning("[new_mob] crawls out of [src]!")) +/obj/machinery/atmospherics/components/unary/vent_scrubber/disconnect() + ..() + on = FALSE + #undef SIPHONING #undef SCRUBBING diff --git a/code/modules/atmospherics/machinery/datum_pipeline.dm b/code/modules/atmospherics/machinery/datum_pipeline.dm index dcb9644295152b..f2121ef3934b25 100644 --- a/code/modules/atmospherics/machinery/datum_pipeline.dm +++ b/code/modules/atmospherics/machinery/datum_pipeline.dm @@ -189,29 +189,21 @@ /datum/pipeline/proc/temperature_interact(turf/target, share_volume, thermal_conductivity) var/total_heat_capacity = air.heat_capacity() var/partial_heat_capacity = total_heat_capacity * (share_volume / air.volume) - var/target_temperature - var/target_heat_capacity + var/turf_temperature = target.GetTemperature() + var/turf_heat_capacity = target.GetHeatCapacity() - var/turf/modeled_location = target - target_temperature = modeled_location.GetTemperature() - target_heat_capacity = modeled_location.GetHeatCapacity() - - var/delta_temperature = air.temperature - target_temperature - var/sharer_heat_capacity = target_heat_capacity - - if((sharer_heat_capacity <= 0) || (partial_heat_capacity <= 0)) + if(turf_heat_capacity <= 0 || partial_heat_capacity <= 0) return TRUE - var/heat = thermal_conductivity * delta_temperature * (partial_heat_capacity * sharer_heat_capacity / (partial_heat_capacity + sharer_heat_capacity)) - var/self_temperature_delta = - heat / total_heat_capacity - var/sharer_temperature_delta = heat / sharer_heat_capacity + var/delta_temperature = turf_temperature - air.temperature - air.temperature += self_temperature_delta - modeled_location.TakeTemperature(sharer_temperature_delta) - if(modeled_location.blocks_air) - modeled_location.temperature_expose(air, modeled_location.temperature) + var/heat = thermal_conductivity * CALCULATE_CONDUCTION_ENERGY(delta_temperature, partial_heat_capacity, turf_heat_capacity) + air.temperature += heat / total_heat_capacity + target.TakeTemperature(-1 * heat / turf_heat_capacity) + if(target.blocks_air) + target.temperature_expose(air, target.temperature) update = TRUE /datum/pipeline/proc/return_air() diff --git a/code/modules/atmospherics/machinery/portable/pump.dm b/code/modules/atmospherics/machinery/portable/pump.dm index 7390affc0d12d0..9760cc52dc10f2 100644 --- a/code/modules/atmospherics/machinery/portable/pump.dm +++ b/code/modules/atmospherics/machinery/portable/pump.dm @@ -1,13 +1,12 @@ -///The machine pumps from the internal source to the turf -#define PUMP_OUT "out" -///The machine pumps from the turf to the internal tank -#define PUMP_IN "in" ///Maximum settable pressure #define PUMP_MAX_PRESSURE (ONE_ATMOSPHERE * 25) ///Minimum settable pressure #define PUMP_MIN_PRESSURE (ONE_ATMOSPHERE / 10) ///Defaul pressure, used in the UI to reset the settings #define PUMP_DEFAULT_PRESSURE (ONE_ATMOSPHERE) +///What direction is the machine pumping (into pump/port or out to the tank/area)? +#define PUMP_IN TRUE +#define PUMP_OUT FALSE /obj/machinery/portable_atmospherics/pump name = "portable air pump" @@ -20,7 +19,7 @@ var/pressure_limit = 50000 ///Is the machine on? var/on = FALSE - ///What direction is the machine pumping (in or out)? + ///What direction is the machine pumping (into pump/port or out to the tank/area)? var/direction = PUMP_OUT ///Player configurable, sets what's the release pressure var/target_pressure = ONE_ATMOSPHERE @@ -58,14 +57,16 @@ excited = TRUE var/turf/local_turf = get_turf(src) + var/datum/gas_mixture/sending var/datum/gas_mixture/receiving - if(direction == PUMP_OUT) // Hook up the internal pump. - sending = (holding ? holding.return_air() : air_contents) - receiving = (holding ? air_contents : local_turf.return_air()) + + if (holding) //Work with tank when inserted, otherwise - with area + sending = (direction == PUMP_IN ? holding.return_air() : air_contents) + receiving = (direction == PUMP_IN ? air_contents : holding.return_air()) else - sending = (holding ? air_contents : local_turf.return_air()) - receiving = (holding ? holding.return_air() : air_contents) + sending = (direction == PUMP_IN ? local_turf.return_air() : air_contents) + receiving = (direction == PUMP_IN ? air_contents : local_turf.return_air()) if(sending.pump_gas_to(receiving, target_pressure) && !holding) air_update_turf(FALSE, FALSE) // Update the environment if needed. @@ -107,8 +108,8 @@ /obj/machinery/portable_atmospherics/pump/ui_data() var/data = list() data["on"] = on - data["direction"] = direction == PUMP_IN ? TRUE : FALSE - data["connected"] = connected_port ? TRUE : FALSE + data["direction"] = direction + data["connected"] = !!connected_port data["pressure"] = round(air_contents.return_pressure() ? air_contents.return_pressure() : 0) data["target_pressure"] = round(target_pressure ? target_pressure : 0) data["default_pressure"] = round(PUMP_DEFAULT_PRESSURE) diff --git a/code/modules/awaymissions/mission_code/Academy.dm b/code/modules/awaymissions/mission_code/Academy.dm index bd347886ad4f4e..d6a0b3c1bc1190 100644 --- a/code/modules/awaymissions/mission_code/Academy.dm +++ b/code/modules/awaymissions/mission_code/Academy.dm @@ -284,7 +284,7 @@ //Cookie T.visible_message(span_userdanger("A cookie appears out of thin air!")) var/obj/item/food/cookie/C = new(drop_location()) - do_smoke(DIAMOND_AREA(0), drop_location()) + do_smoke(0, holder = src, location = drop_location()) C.name = "Cookie of Fate" if(12) //Healing @@ -305,18 +305,18 @@ if(14) //Free Gun T.visible_message(span_userdanger("An impressive gun appears!")) - do_smoke(DIAMOND_AREA(0), drop_location()) + do_smoke(0, holder = src, location = drop_location()) new /obj/item/gun/ballistic/revolver/mateba(drop_location()) if(15) //Random One-use spellbook T.visible_message(span_userdanger("A magical looking book drops to the floor!")) - do_smoke(DIAMOND_AREA(0), drop_location()) - new /obj/item/book/granter/spell/random(drop_location()) + do_smoke(0, holder = src, location = drop_location()) + new /obj/item/book/granter/action/spell/random(drop_location()) if(16) //Servant & Servant Summon T.visible_message(span_userdanger("A Dice Servant appears in a cloud of smoke!")) var/mob/living/carbon/human/H = new(drop_location()) - do_smoke(DIAMOND_AREA(0), drop_location()) + do_smoke(0, holder = src, location = drop_location()) H.equipOutfit(/datum/outfit/butler) var/datum/mind/servant_mind = new /datum/mind() @@ -331,20 +331,19 @@ message_admins("[ADMIN_LOOKUPFLW(C)] was spawned as Dice Servant") H.key = C.key - var/obj/effect/proc_holder/spell/targeted/summonmob/S = new - S.target_mob = H - user.mind.AddSpell(S) + var/datum/action/cooldown/spell/summon_mob/summon_servant = new(user.mind || user, H) + summon_servant.Grant(user) if(17) //Tator Kit T.visible_message(span_userdanger("A suspicious box appears!")) new /obj/item/storage/box/syndicate/bundle_a(drop_location()) - do_smoke(DIAMOND_AREA(0), drop_location()) + do_smoke(0, holder = src, location = drop_location()) if(18) //Captain ID T.visible_message(span_userdanger("A golden identification card appears!")) new /obj/item/card/id/advanced/gold/captains_spare(drop_location()) - do_smoke(DIAMOND_AREA(0), drop_location()) + do_smoke(0, holder = src, location = drop_location()) if(19) //Instrinct Resistance T.visible_message(span_userdanger("[user] looks very robust!")) @@ -365,31 +364,44 @@ glasses = /obj/item/clothing/glasses/monocle gloves = /obj/item/clothing/gloves/color/white -/obj/effect/proc_holder/spell/targeted/summonmob +/datum/action/cooldown/spell/summon_mob name = "Summon Servant" desc = "This spell can be used to call your servant, whenever you need it." - charge_max = 100 - clothes_req = 0 - invocation = "JE VES" + button_icon_state = "summons" + school = SCHOOL_CONJURATION + cooldown_time = 10 SECONDS + + invocation = "JE VES" invocation_type = INVOCATION_WHISPER - range = -1 - level_max = 0 //cannot be improved - cooldown_min = 100 - include_user = 1 + spell_requirements = NONE + spell_max_level = 0 //cannot be improved - var/mob/living/target_mob + smoke_type = /datum/effect_system/fluid_spread/smoke + smoke_amt = 2 - action_icon_state = "summons" + var/datum/weakref/summon_weakref -/obj/effect/proc_holder/spell/targeted/summonmob/cast(list/targets,mob/user = usr) - if(!target_mob) +/datum/action/cooldown/spell/summon_mob/New(Target, mob/living/summoned_mob) + . = ..() + if(summoned_mob) + summon_weakref = WEAKREF(summoned_mob) + +/datum/action/cooldown/spell/summon_mob/cast(atom/cast_on) + . = ..() + var/mob/living/to_summon = summon_weakref?.resolve() + if(QDELETED(to_summon)) + to_chat(cast_on, span_warning("You can't seem to summon your servant - it seems they've vanished from reality, or never existed in the first place...")) return - var/turf/Start = get_turf(user) - for(var/direction in GLOB.alldirs) - var/turf/T = get_step(Start,direction) - if(!T.density) - target_mob.Move(T) + + do_teleport( + to_summon, + get_turf(cast_on), + precision = 1, + asoundin = 'sound/magic/wand_teleport.ogg', + asoundout = 'sound/magic/wand_teleport.ogg', + channel = TELEPORT_CHANNEL_MAGIC, + ) /obj/structure/ladder/unbreakable/rune name = "\improper Teleportation Rune" diff --git a/code/modules/awaymissions/mission_code/snowdin.dm b/code/modules/awaymissions/mission_code/snowdin.dm index 5f5dc4b3ad39d9..e83871020dd525 100644 --- a/code/modules/awaymissions/mission_code/snowdin.dm +++ b/code/modules/awaymissions/mission_code/snowdin.dm @@ -173,6 +173,11 @@ light_color = LIGHT_COLOR_PURPLE immunity_trait = TRAIT_SNOWSTORM_IMMUNE immunity_resistance_flags = FREEZE_PROOF + lava_temperature = 100 + +/turf/open/lava/plasma/examine(mob/user) + . = ..() + . += span_info("Some liquid plasma could probably be scooped up with a container.") /turf/open/lava/plasma/attackby(obj/item/I, mob/user, params) var/obj/item/reagent_containers/glass/C = I diff --git a/code/modules/awaymissions/super_secret_room.dm b/code/modules/awaymissions/super_secret_room.dm index e04a268f6bcd11..83c85808256609 100644 --- a/code/modules/awaymissions/super_secret_room.dm +++ b/code/modules/awaymissions/super_secret_room.dm @@ -27,10 +27,10 @@ switch(times_spoken_to) if(0) SpeakPeace(list("Welcome to the error handling room.","Something's goofed up bad to send you here.","You should probably tell an admin what you were doing, or make a bug report.")) - for(var/obj/structure/signpost/salvation/S in orange(7)) - S.invisibility = 0 + for(var/obj/structure/signpost/salvation/sign in orange(7)) + sign.invisibility = 0 var/datum/effect_system/fluid_spread/smoke/smoke = new - smoke.set_up(1, location = S.loc) + smoke.set_up(1, holder = src, location = sign.loc) smoke.start() break if(1) diff --git a/code/modules/cargo/bounties/science.dm b/code/modules/cargo/bounties/science.dm index f930ba7d05960c..e21604d579cf35 100644 --- a/code/modules/cargo/bounties/science.dm +++ b/code/modules/cargo/bounties/science.dm @@ -132,7 +132,7 @@ description = "We're making a better version of space drugs, send us a core to help us replicate its effects." wanted_types = list(/obj/item/assembly/signaler/anomaly/hallucination = TRUE) -/datum/bounty/item/science/ref_anomaly/delimber - name = "Refined Delimber Core" - description = "Our janitor lizard lost all their limbs, send us a delimber core to replace them." - wanted_types = list(/obj/item/assembly/signaler/anomaly/delimber = TRUE) +/datum/bounty/item/science/ref_anomaly/bioscrambler + name = "Refined Bioscrambler Core" + description = "Our janitor lizard lost all their limbs, send us a bioscrambler core to replace them." + wanted_types = list(/obj/item/assembly/signaler/anomaly/bioscrambler = TRUE) diff --git a/code/modules/cargo/bounties/security.dm b/code/modules/cargo/bounties/security.dm index dee709ca918d5b..ab395ebcc73973 100644 --- a/code/modules/cargo/bounties/security.dm +++ b/code/modules/cargo/bounties/security.dm @@ -50,17 +50,23 @@ var/area/demanded_area /datum/bounty/item/security/paperwork/New() - ///list of areas for security to choose from to perform an inspection. - var/static/list/possible_areas = list(\ - /area/station/maintenance,\ - /area/station/commons,\ - /area/station/service,\ - /area/station/hallway/primary,\ - /area/station/security/office,\ - /area/station/security/prison,\ - /area/station/security/range,\ - /area/station/security/checkpoint,\ - /area/station/security/interrogation) + ///list of areas for security to choose from to perform an inspection. Pulls the list and cross references it to the map to make sure the area is on the map before assigning. + var/static/list/possible_areas + if(!possible_areas) + possible_areas = typecacheof(list(\ + /area/station/maintenance,\ + /area/station/commons,\ + /area/station/service,\ + /area/station/hallway/primary,\ + /area/station/security/office,\ + /area/station/security/prison,\ + /area/station/security/range,\ + /area/station/security/checkpoint,\ + /area/station/security/interrogation)) + for (var/area_type in possible_areas) + if(GLOB.areas_by_type[area_type]) + continue + possible_areas -= area_type demanded_area = pick(possible_areas) name = name + ": [initial(demanded_area.name)]" description = initial(description) + " [initial(demanded_area.name)]" diff --git a/code/modules/cargo/department_order.dm b/code/modules/cargo/department_order.dm index 5cf20e3cde83c1..dc160ec5c13d56 100644 --- a/code/modules/cargo/department_order.dm +++ b/code/modules/cargo/department_order.dm @@ -70,7 +70,7 @@ GLOBAL_LIST_INIT(department_order_cooldowns, list( ) supply_data += list(target_group) //skip packs we should not show, even if we should show the group - if((pack.hidden && !(obj_flags & EMAGGED)) || (pack.special && !pack.special_enabled) || pack.DropPodOnly || pack.goody) + if((pack.hidden && !(obj_flags & EMAGGED)) || (pack.special && !pack.special_enabled) || pack.drop_pod_only || pack.goody) continue //finally the pack data itself target_group["packs"] += list(list( @@ -120,7 +120,7 @@ GLOBAL_LIST_INIT(department_order_cooldowns, list( if(!pack) say("Something went wrong!") CRASH("requested supply pack id \"[id]\" not found!") - if(pack.hidden || pack.DropPodOnly || pack.special) + if(pack.hidden || pack.drop_pod_only || pack.special) return var/name = "*None Provided*" var/rank = "*None Provided*" diff --git a/code/modules/cargo/exports/large_objects.dm b/code/modules/cargo/exports/large_objects.dm index 7dfccae45a6d54..1871d69eb452ec 100644 --- a/code/modules/cargo/exports/large_objects.dm +++ b/code/modules/cargo/exports/large_objects.dm @@ -3,7 +3,12 @@ k_elasticity = 0 unit_name = "crate" export_types = list(/obj/structure/closet/crate) - exclude_types = list(/obj/structure/closet/crate/large, /obj/structure/closet/crate/wooden, /obj/structure/closet/crate/mail) + exclude_types = list( + /obj/structure/closet/crate/coffin, + /obj/structure/closet/crate/large, + /obj/structure/closet/crate/mail, + /obj/structure/closet/crate/wooden, + ) /datum/export/large/crate/total_printout(datum/export_report/ex, notes = TRUE) // That's why a goddamn metal crate costs that much. . = ..() @@ -27,7 +32,7 @@ exclude_types = list() /datum/export/large/crate/coffin - cost = CARGO_CRATE_VALUE/2 //50 wooden crates cost 2000 points, and you can make 10 coffins in seconds with those planks. Each coffin selling for 250 means you can make a net gain of 500 points for wasting your time making coffins. + cost = CARGO_CRATE_VALUE/2 //50 wooden crates cost 800 credits, and you can make 10 coffins in seconds with those planks. Each coffin selling for 100 means you can make a net gain of 200 credits for wasting your time making coffins. unit_name = "coffin" export_types = list(/obj/structure/closet/crate/coffin) diff --git a/code/modules/cargo/goodies.dm b/code/modules/cargo/goodies.dm index 162e6db7ecc46f..f87276a66b7aed 100644 --- a/code/modules/cargo/goodies.dm +++ b/code/modules/cargo/goodies.dm @@ -167,3 +167,69 @@ desc = "A complete meal package for the terminally lazy. Contains one Ready-Donk meal." cost = PAYCHECK_CREW * 2 contains = list(/obj/item/food/ready_donk) + +/datum/supply_pack/goody/pill_mutadone + name = "Emergency Mutadone Pill" + desc = "A single pill for curing genetic defects. Useful for when you can't procure one from medbay." + cost = PAYCHECK_CREW * 2.5 + contains = list(/obj/item/reagent_containers/pill/mutadone) + +/datum/supply_pack/goody/rapid_lighting_device + name = "Rapid Lighting Device (RLD)" + desc = "A device used to rapidly provide lighting sources to an area. Reload with iron, plasteel, glass or compressed matter cartridges." + cost = PAYCHECK_CREW * 10 + contains = list(/obj/item/construction/rld) + +/datum/supply_pack/goody/moth_encryption_key + name = "Moffic radio encryption key" + desc = "A hi-tech radio encryption key that allows the wearer to understand moffic when the radio is worn." + cost = PAYCHECK_CREW * 12 + contains = list(/obj/item/encryptionkey/moth) + +/datum/supply_pack/goody/lizard_encryption_key + name = "Draconic radio encryption key" + desc = "A hi-tech radio encryption key that allows the wearer to understand draconic when the radio is worn." + cost = PAYCHECK_CREW * 12 + contains = list(/obj/item/encryptionkey/tiziran) + +/datum/supply_pack/goody/plasmaman_encryption_key + name = "Calcic radio encryption key" + desc = "A hi-tech radio encryption key that allows the wearer to understand calcic when the radio is worn." + cost = PAYCHECK_CREW * 12 + contains = list(/obj/item/encryptionkey/plasmaman) + +/datum/supply_pack/goody/ethereal_encryption_key + name = "Voltaic radio encryption key" + desc = "A hi-tech radio encryption key that allows the wearer to understand voltaic when the radio is worn." + cost = PAYCHECK_CREW * 12 + contains = list(/obj/item/encryptionkey/ethereal) + +/datum/supply_pack/goody/felinid_encryption_key + name = "Felinid radio encryption key" + desc = "A hi-tech radio encryption key that allows the wearer to understand nekomimetic when the radio is worn." + cost = PAYCHECK_CREW * 12 + contains = list(/obj/item/encryptionkey/felinid) + +/datum/supply_pack/goody/fishing_toolbox + name = "Fishing toolbox" + desc = "Complete toolbox set for your fishing adventure. Advanced hooks and lines sold separetely." + cost = PAYCHECK_CREW * 2 + contains = list(/obj/item/storage/toolbox/fishing) + +/datum/supply_pack/goody/fishing_hook_set + name = "Fishing Hooks Set" + desc = "Set of various fishing hooks." + cost = PAYCHECK_CREW + contains = list(/obj/item/storage/box/fishing_hooks) + +/datum/supply_pack/goody/fishing_line_set + name = "Fishing Lines Set" + desc = "Set of various fishing lines." + cost = PAYCHECK_CREW + contains = list(/obj/item/storage/box/fishing_lines) + +/datum/supply_pack/goody/premium_bait + name = "Deluxe fishing bait" + desc = "When the standard variety is not good enough for you." + cost = PAYCHECK_CREW + contains = list(/obj/item/bait_can/worm/premium) diff --git a/code/modules/cargo/orderconsole.dm b/code/modules/cargo/orderconsole.dm index 543f5c09c065c8..1987d3ce9e6db3 100644 --- a/code/modules/cargo/orderconsole.dm +++ b/code/modules/cargo/orderconsole.dm @@ -150,7 +150,7 @@ "name" = P.group, "packs" = list() ) - if((P.hidden && !(obj_flags & EMAGGED)) || (P.contraband && !contraband) || (P.special && !P.special_enabled) || P.DropPodOnly) + if((P.hidden && !(obj_flags & EMAGGED)) || (P.contraband && !contraband) || (P.special && !P.special_enabled) || P.drop_pod_only) continue data["supplies"][P.group]["packs"] += list(list( "name" = P.name, @@ -210,7 +210,7 @@ var/datum/supply_pack/pack = SSshuttle.supply_packs[id] if(!istype(pack)) CRASH("Unknown supply pack id given by order console ui. ID: [params["id"]]") - if((pack.hidden && !(obj_flags & EMAGGED)) || (pack.contraband && !contraband) || pack.DropPodOnly || (pack.special && !pack.special_enabled)) + if((pack.hidden && !(obj_flags & EMAGGED)) || (pack.contraband && !contraband) || pack.drop_pod_only || (pack.special && !pack.special_enabled)) return var/name = "*None Provided*" diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index 13361df4dbddc9..756fa529cd5812 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -1,25 +1,44 @@ /datum/supply_pack + /// The name of the supply pack, as listed on th cargo purchasing UI. var/name = "Crate" + /// The group that the supply pack is sorted into within the cargo purchasing UI. var/group = "" + /// Is this cargo supply pack visible to the cargo purchasing UI. var/hidden = FALSE + /// Is this supply pack purchasable outside of the standard purchasing band? Contraband is available by multitooling the cargo purchasing board. var/contraband = FALSE /// Cost of the crate. DO NOT GO ANY LOWER THAN X1.4 the "CARGO_CRATE_VALUE" value if using regular crates, or infinite profit will be possible! var/cost = CARGO_CRATE_VALUE * 1.4 + /// What access is required to open the crate when spawned? var/access = FALSE + /// Who can view this supply_pack and with what access. var/access_view = FALSE + /// If someone with any of the following accesses in a list can open this cargo pack crate. var/access_any = FALSE + /// A list of items that are spawned in the crate of the supply pack. var/list/contains = null + /// What is the name of the crate that is spawned with the crate's contents?? var/crate_name = "crate" + /// When spawning a gas canistor, what kind of gas type are we spawning? var/id - var/desc = ""//no desc by default + /// The description shown on the cargo purchasing UI. No desc by default. + var/desc = "" + /// What typepath of crate do you spawn? var/crate_type = /obj/structure/closet/crate - var/dangerous = FALSE // Should we message admins? - var/special = FALSE //Event/Station Goals/Admin enabled packs + /// Should we message admins? + var/dangerous = FALSE + /// Event/Station Goals/Admin enabled packs + var/special = FALSE + /// When a cargo pack can be unlocked by special events (as seen in special), this toggles if it's been enabled in the round yet (For example, after the station alert, we can now enable buying the station goal pack). var/special_enabled = FALSE - var/DropPodOnly = FALSE //only usable by the Bluespace Drop Pod via the express cargo console - var/special_pod //If this pack comes shipped in a specific pod when launched from the express console + /// Only usable by the Bluespace Drop Pod via the express cargo console + var/drop_pod_only = FALSE + /// If this pack comes shipped in a specific pod when launched from the express console + var/special_pod + /// Was this spawned through an admin proc? var/admin_spawned = FALSE - var/goody = FALSE //Goodies can only be purchased by private accounts and can have coupons apply to them. They also come in a lockbox instead of a full crate, so the 700 min doesn't apply + /// Goodies can only be purchased by private accounts and can have coupons apply to them. They also come in a lockbox instead of a full crate, so the 700 min doesn't apply + var/goody = FALSE /datum/supply_pack/New() id = type @@ -1389,14 +1408,14 @@ crate_name = "raw pyro anomaly" crate_type = /obj/structure/closet/crate/secure/science -/datum/supply_pack/science/raw_delimber_anomaly - name = "Raw Delimber Anomaly" - desc = "The raw core of a delimber anomaly, ready to be implosion-compressed into a powerful artifact." +/datum/supply_pack/science/raw_bioscrambler_anomaly + name = "Raw Bioscrambler Anomaly" + desc = "The raw core of a bioscrambler anomaly, ready to be implosion-compressed into a powerful artifact." cost = CARGO_CRATE_VALUE * 10 access = ACCESS_ORDNANCE access_view = ACCESS_ORDNANCE - contains = list(/obj/item/raw_anomaly_core/delimber) - crate_name = "raw delimber anomaly" + contains = list(/obj/item/raw_anomaly_core/bioscrambler) + crate_name = "raw bioscrambler anomaly" crate_type = /obj/structure/closet/crate/secure/science @@ -2042,6 +2061,26 @@ ) crate_name = "grilling fuel kit crate" +/datum/supply_pack/organic/tiziran_supply + name = "Tiziran Supply Box" + desc = "A packaged box of supplies from the heart of the Lizard Empire. Contains a selection of Tiziran ingredients and basic foods." + cost = CARGO_CRATE_VALUE * 3 + contains = list(/obj/item/storage/box/tiziran_goods, + /obj/item/storage/box/tiziran_cans, + /obj/item/storage/box/tiziran_meats) + crate_name = "\improper Tiziran Supply box" + crate_type = /obj/structure/closet/crate/cardboard/tiziran + +/datum/supply_pack/organic/mothic_supply + name = "Mothic Supply Box" + desc = "A packaged box of surplus supplies from the Mothic Fleet. Contains a selection of Mothic ingredients and basic foods." + cost = CARGO_CRATE_VALUE * 3 + contains = list(/obj/item/storage/box/mothic_goods, + /obj/item/storage/box/mothic_cans_sauces, + /obj/item/storage/box/mothic_rations) + crate_name = "\improper Mothic Supply box" + crate_type = /obj/structure/closet/crate/cardboard/mothic + ////////////////////////////////////////////////////////////////////////////// ////////////////////////////// Livestock ///////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// @@ -2134,7 +2173,7 @@ access_view = ACCESS_HOS contains = list(/mob/living/simple_animal/crab) crate_name = "look sir free crabs" - DropPodOnly = TRUE + drop_pod_only = TRUE /datum/supply_pack/critter/crab/generate() . = ..() @@ -2686,7 +2725,7 @@ desc = "Presenting the New Nanotrasen-Brand Bluespace Supplypod! Transport cargo with grace and ease! Call today and we'll shoot over a demo unit for just 300 credits!" cost = CARGO_CRATE_VALUE * 0.6 //Empty pod, so no crate refund contains = list() - DropPodOnly = TRUE + drop_pod_only = TRUE crate_type = null special_pod = /obj/structure/closet/supplypod/bluespacepod @@ -2780,6 +2819,14 @@ crate_value -= uplink_item.cost new uplink_item.item(C) + +/datum/supply_pack/misc/fishing_portal + name = "Fishing Portal Generator Crate" + desc = "Not enough fish near your location? Fishing portal has your back." + cost = CARGO_CRATE_VALUE * 4 + contains = list(/obj/machinery/fishing_portal_generator) + crate_name = "fishing portal crate" + ////////////////////////////////////////////////////////////////////////////// /////////////////////// General Vending Restocks ///////////////////////////// ////////////////////////////////////////////////////////////////////////////// @@ -2933,12 +2980,11 @@ /datum/supply_pack/vending/wardrobes/general name = "General Wardrobes Supply Crate" - desc = "This crate contains refills for the CuraDrobe, BarDrobe, ChefDrobe, JaniDrobe, ChapDrobe." - cost = CARGO_CRATE_VALUE * 7.5 + desc = "This crate contains refills for the CuraDrobe, BarDrobe, ChefDrobe and ChapDrobe." + cost = CARGO_CRATE_VALUE * 6 contains = list(/obj/item/vending_refill/wardrobe/curator_wardrobe, /obj/item/vending_refill/wardrobe/bar_wardrobe, /obj/item/vending_refill/wardrobe/chef_wardrobe, - /obj/item/vending_refill/wardrobe/jani_wardrobe, /obj/item/vending_refill/wardrobe/chap_wardrobe) crate_name = "general wardrobes vendor refills" @@ -2949,6 +2995,13 @@ contains = list(/obj/item/vending_refill/wardrobe/hydro_wardrobe) crate_name = "hydrobe supply crate" +/datum/supply_pack/vending/wardrobes/janitor + name = "JaniDrobe Supply Crate" + desc = "This crate contains a refill for the JaniDrobe." + cost = CARGO_CRATE_VALUE * 1.5 + contains = list(/obj/item/vending_refill/wardrobe/jani_wardrobe) + crate_name = "janidrobe supply crate" + /datum/supply_pack/vending/wardrobes/medical name = "Medical Wardrobe Supply Crate" desc = "This crate contains refills for the MediDrobe, ChemDrobe, and ViroDrobe." diff --git a/code/modules/client/client_defines.dm b/code/modules/client/client_defines.dm index cf3cd8ee37bfc2..6a9a867a080d51 100644 --- a/code/modules/client/client_defines.dm +++ b/code/modules/client/client_defines.dm @@ -175,6 +175,11 @@ /// Messages currently seen by this client var/list/seen_messages + //Hide top bars + var/fullscreen = FALSE + //Hide status bar (bottom left) + var/show_status_bar = TRUE + /// datum wrapper for client view var/datum/view_data/view_size @@ -251,3 +256,6 @@ /// If this client has been fully initialized or not var/fully_created = FALSE + + /// Does this client have typing indicators enabled? + var/typing_indicators = FALSE diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 73520d79de78e8..d7e4a1758d6068 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -219,6 +219,8 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( // Instantiate tgui panel tgui_panel = new(src, "browseroutput") + tgui_say = new(src, "tgui_say") + set_right_click_menu_mode(TRUE) GLOB.ahelp_tickets.ClientLogin(src) @@ -353,6 +355,8 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( // Initialize tgui panel tgui_panel.initialize() + tgui_say.initialize() + if(alert_mob_dupe_login && !holder) var/dupe_login_message = "Your ComputerID has already logged in with another key this round, please log out of this one NOW or risk being banned!" if (alert_admin_multikey) @@ -928,12 +932,10 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( if (hotkeys) // If hotkey mode is enabled, then clicking the map will automatically - // unfocus the text bar. This removes the red color from the text bar - // so that the visual focus indicator matches reality. - winset(src, null, "input.background-color=[COLOR_INPUT_DISABLED]") - + // unfocus the text bar. + winset(src, null, "input.focus=false") else - winset(src, null, "input.focus=true input.background-color=[COLOR_INPUT_ENABLED]") + winset(src, null, "input.focus=true") SEND_SIGNAL(src, COMSIG_CLIENT_CLICK, object, location, control, params, usr) @@ -1031,12 +1033,18 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( movement_keys[key] = WEST if("South") movement_keys[key] = SOUTH - if("Say") - winset(src, "default-[REF(key)]", "parent=default;name=[key];command=say") - if("OOC") - winset(src, "default-[REF(key)]", "parent=default;name=[key];command=ooc") - if("Me") - winset(src, "default-[REF(key)]", "parent=default;name=[key];command=me") + if(SAY_CHANNEL) + var/say = tgui_say_create_open_command(SAY_CHANNEL) + winset(src, "default-[REF(key)]", "parent=default;name=[key];command=[say]") + if(RADIO_CHANNEL) + var/radio = tgui_say_create_open_command(RADIO_CHANNEL) + winset(src, "default-[REF(key)]", "parent=default;name=[key];command=[radio]") + if(ME_CHANNEL) + var/me = tgui_say_create_open_command(ME_CHANNEL) + winset(src, "default-[REF(key)]", "parent=default;name=[key];command=[me]") + if(OOC_CHANNEL) + var/ooc = tgui_say_create_open_command(OOC_CHANNEL) + winset(src, "default-[REF(key)]", "parent=default;name=[key];command=[ooc]") /client/proc/change_view(new_size) if (isnull(new_size)) @@ -1210,3 +1218,34 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( SEND_SOUND(usr, sound(null)) tgui_panel?.stop_music() SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Stop Self Sounds")) + +/client/verb/toggle_fullscreen() + set name = "Toggle Fullscreen" + set category = "OOC" + + fullscreen = !fullscreen + + if (fullscreen) + winset(usr, "mainwindow", "on-size=") + winset(usr, "mainwindow", "titlebar=false") + winset(usr, "mainwindow", "can-resize=false") + winset(usr, "mainwindow", "menu=") + winset(usr, "mainwindow", "is-maximized=false") + winset(usr, "mainwindow", "is-maximized=true") + else + winset(usr, "mainwindow", "menu=menu") + winset(usr, "mainwindow", "titlebar=true") + winset(usr, "mainwindow", "can-resize=true") + winset(usr, "mainwindow", "is-maximized=false") + winset(usr, "mainwindow", "on-size=attempt_auto_fit_viewport") + +/client/verb/toggle_status_bar() + set name = "Toggle Status Bar" + set category = "OOC" + + show_status_bar = !show_status_bar + + if (show_status_bar) + winset(usr, "mapwindow.status_bar", "is-visible=true") + else + winset(usr, "mapwindow.status_bar", "is-visible=false") diff --git a/code/modules/client/preferences/admin.dm b/code/modules/client/preferences/admin.dm index 5d26cff7c69f87..965116fdff940e 100644 --- a/code/modules/client/preferences/admin.dm +++ b/code/modules/client/preferences/admin.dm @@ -50,3 +50,15 @@ return FALSE return is_admin(preferences.parent) + +/// When enabled, prevents any and all ghost role pop-ups WHILE ADMINNED. +/datum/preference/toggle/ghost_roles_as_admin + category = PREFERENCE_CATEGORY_GAME_PREFERENCES + savefile_key = "ghost_roles_as_admin" + savefile_identifier = PREFERENCE_PLAYER + +/datum/preference/toggle/ghost_roles_as_admin/is_accessible(datum/preferences/preferences) + if (!..(preferences)) + return FALSE + + return is_admin(preferences.parent) diff --git a/code/modules/client/preferences/ghost.dm b/code/modules/client/preferences/ghost.dm index ce8e05235ee4ce..ab191873c1be83 100644 --- a/code/modules/client/preferences/ghost.dm +++ b/code/modules/client/preferences/ghost.dm @@ -176,3 +176,9 @@ savefile_key = "inquisitive_ghost" savefile_identifier = PREFERENCE_PLAYER category = PREFERENCE_CATEGORY_GAME_PREFERENCES + +/// When enabled, prevents any and all ghost role pop-ups. +/datum/preference/toggle/ghost_roles + category = PREFERENCE_CATEGORY_GAME_PREFERENCES + savefile_key = "ghost_roles" + savefile_identifier = PREFERENCE_PLAYER diff --git a/code/modules/client/preferences/middleware/antags.dm b/code/modules/client/preferences/middleware/antags.dm index b782397fd5beae..08936bcd23e106 100644 --- a/code/modules/client/preferences/middleware/antags.dm +++ b/code/modules/client/preferences/middleware/antags.dm @@ -110,6 +110,9 @@ early = TRUE cross_round_cachable = TRUE + /// Mapping of spritesheet keys -> icons + var/list/antag_icons = list() + /datum/asset/spritesheet/antagonists/create_spritesheets() // Antagonists that don't have a dynamic ruleset, but do have a preference var/static/list/non_ruleset_antagonists = list( @@ -128,7 +131,6 @@ antagonists[initial(ruleset.antag_flag)] = antagonist_type var/list/generated_icons = list() - var/list/to_insert = list() for (var/antag_flag in antagonists) var/datum/antagonist/antagonist_type = antagonists[antag_flag] @@ -137,7 +139,7 @@ var/spritesheet_key = serialize_antag_name(antag_flag) if (!isnull(generated_icons[antagonist_type])) - to_insert[spritesheet_key] = generated_icons[antagonist_type] + antag_icons[spritesheet_key] = generated_icons[antagonist_type] continue var/datum/antagonist/antagonist = new antagonist_type @@ -152,10 +154,10 @@ // If an icon is not prepared to be scaled to that size, it looks really ugly, and this // makes it harder to figure out what size it *actually* is. generated_icons[antagonist_type] = preview_icon - to_insert[spritesheet_key] = preview_icon + antag_icons[spritesheet_key] = preview_icon - for (var/spritesheet_key in to_insert) - Insert(spritesheet_key, to_insert[spritesheet_key]) + for (var/spritesheet_key in antag_icons) + Insert(spritesheet_key, antag_icons[spritesheet_key]) /// Serializes an antag name to be used for preferences UI /proc/serialize_antag_name(antag_name) diff --git a/code/modules/client/preferences/tgui.dm b/code/modules/client/preferences/tgui.dm index e04746e6ab0e56..9413a129e4e53c 100644 --- a/code/modules/client/preferences/tgui.dm +++ b/code/modules/client/preferences/tgui.dm @@ -47,3 +47,13 @@ for (var/datum/tgui/tgui as anything in client.mob?.tgui_open_uis) // Force it to reload either way tgui.update_static_data(client.mob) + +/// Light mode for tgui say +/datum/preference/toggle/tgui_say_light_mode + category = PREFERENCE_CATEGORY_GAME_PREFERENCES + savefile_key = "tgui_say_light_mode" + savefile_identifier = PREFERENCE_PLAYER + default_value = FALSE + +/datum/preference/toggle/tgui_say_light_mode/apply_to_client(client/client) + client.tgui_say?.load() diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm index 4ea398cb0de8c3..240b8c68e9cb36 100644 --- a/code/modules/clothing/chameleon.dm +++ b/code/modules/clothing/chameleon.dm @@ -391,6 +391,7 @@ chameleon_action.chameleon_name = "Jumpsuit" chameleon_action.chameleon_blacklist = typecacheof(list(/obj/item/clothing/under, /obj/item/clothing/under/color, /obj/item/clothing/under/rank, /obj/item/clothing/under/changeling), only_root_path = TRUE) chameleon_action.initialize_disguises() + add_item_action(chameleon_action) /obj/item/clothing/under/chameleon/emp_act(severity) . = ..() @@ -410,7 +411,6 @@ blood_overlay_type = "armor" resistance_flags = NONE armor = list(MELEE = 10, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 50) - var/datum/action/item_action/chameleon/change/chameleon_action /obj/item/clothing/suit/chameleon/Initialize(mapload) @@ -420,6 +420,7 @@ chameleon_action.chameleon_name = "Suit" chameleon_action.chameleon_blacklist = typecacheof(list(/obj/item/clothing/suit/armor/abductor, /obj/item/clothing/suit/changeling), only_root_path = TRUE) chameleon_action.initialize_disguises() + add_item_action(chameleon_action) /obj/item/clothing/suit/chameleon/emp_act(severity) . = ..() @@ -448,6 +449,7 @@ chameleon_action.chameleon_name = "Glasses" chameleon_action.chameleon_blacklist = typecacheof(/obj/item/clothing/glasses/changeling, only_root_path = TRUE) chameleon_action.initialize_disguises() + add_item_action(chameleon_action) /obj/item/clothing/glasses/chameleon/emp_act(severity) . = ..() @@ -477,6 +479,7 @@ chameleon_action.chameleon_name = "Gloves" chameleon_action.chameleon_blacklist = typecacheof(list(/obj/item/clothing/gloves, /obj/item/clothing/gloves/color, /obj/item/clothing/gloves/changeling), only_root_path = TRUE) chameleon_action.initialize_disguises() + add_item_action(chameleon_action) /obj/item/clothing/gloves/chameleon/emp_act(severity) . = ..() @@ -505,6 +508,7 @@ chameleon_action.chameleon_name = "Hat" chameleon_action.chameleon_blacklist = typecacheof(/obj/item/clothing/head/changeling, only_root_path = TRUE) chameleon_action.initialize_disguises() + add_item_action(chameleon_action) /obj/item/clothing/head/chameleon/emp_act(severity) . = ..() @@ -554,6 +558,7 @@ chameleon_action.chameleon_name = "Mask" chameleon_action.chameleon_blacklist = typecacheof(/obj/item/clothing/mask/changeling, only_root_path = TRUE) chameleon_action.initialize_disguises() + add_item_action(chameleon_action) /obj/item/clothing/mask/chameleon/emp_act(severity) . = ..() @@ -608,6 +613,7 @@ chameleon_action.chameleon_name = "Shoes" chameleon_action.chameleon_blacklist = typecacheof(/obj/item/clothing/shoes/changeling, only_root_path = TRUE) chameleon_action.initialize_disguises() + add_item_action(chameleon_action) /obj/item/clothing/shoes/chameleon/emp_act(severity) . = ..() @@ -633,6 +639,7 @@ chameleon_action.chameleon_type = /obj/item/storage/backpack chameleon_action.chameleon_name = "Backpack" chameleon_action.initialize_disguises() + add_item_action(chameleon_action) /obj/item/storage/backpack/chameleon/emp_act(severity) . = ..() @@ -656,6 +663,7 @@ chameleon_action.chameleon_type = /obj/item/storage/belt chameleon_action.chameleon_name = "Belt" chameleon_action.initialize_disguises() + add_item_action(chameleon_action) /obj/item/storage/belt/chameleon/ComponentInitialize() . = ..() @@ -682,6 +690,7 @@ chameleon_action.chameleon_type = /obj/item/radio/headset chameleon_action.chameleon_name = "Headset" chameleon_action.initialize_disguises() + add_item_action(chameleon_action) /obj/item/radio/headset/chameleon/emp_act(severity) . = ..() @@ -704,6 +713,7 @@ chameleon_action.chameleon_name = "tablet" chameleon_action.chameleon_blacklist = typecacheof(list(/obj/item/modular_computer/tablet/pda/heads), only_root_path = TRUE) chameleon_action.initialize_disguises() + add_item_action(chameleon_action) /obj/item/modular_computer/tablet/pda/chameleon/emp_act(severity) . = ..() @@ -724,6 +734,7 @@ chameleon_action.chameleon_type = /obj/item/stamp chameleon_action.chameleon_name = "Stamp" chameleon_action.initialize_disguises() + add_item_action(chameleon_action) /obj/item/stamp/chameleon/broken/Initialize(mapload) . = ..() @@ -732,7 +743,7 @@ /obj/item/clothing/neck/chameleon name = "black tie" desc = "A neosilk clip-on tie." - icon_state = "blacktie" + icon_state = "detective" //we use this icon_state since the other ones are all generated by GAGS. resistance_flags = NONE armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 50) w_class = WEIGHT_CLASS_SMALL @@ -747,6 +758,7 @@ chameleon_action.chameleon_blacklist = typecacheof(/obj/item/clothing/neck/cloak/skill_reward) chameleon_action.chameleon_name = "Neck Accessory" chameleon_action.initialize_disguises() + add_item_action(chameleon_action) /obj/item/clothing/neck/chameleon/Destroy() qdel(chameleon_action) @@ -783,6 +795,7 @@ chameleon_action.chameleon_name = "Gun" chameleon_action.chameleon_blacklist = typecacheof(/obj/item/gun/energy/minigun) chameleon_action.initialize_disguises() + add_item_action(chameleon_action) recharge_newshot() set_chameleon_disguise(/obj/item/gun/energy/laser) diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index dadc27cf2f7964..5772f8ba1c83bd 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -51,7 +51,7 @@ var/obj/item/food/clothing/moth_snack /obj/item/clothing/Initialize(mapload) - if((clothing_flags & VOICEBOX_TOGGLABLE)) + if(clothing_flags & VOICEBOX_TOGGLABLE) actions_types += /datum/action/item_action/toggle_voice_box . = ..() AddElement(/datum/element/venue_price, FOOD_PRICE_CHEAP) @@ -82,7 +82,7 @@ // sigh, ok, so it's not ACTUALLY infinite nutrition. this is so you can eat clothes more than...once. // bite_consumption limits how much you actually get, and the take_damage in after eat makes sure you can't abuse this. // ...maybe this was a mistake after all. - food_reagents = list(/datum/reagent/consumable/nutriment = INFINITY) + food_reagents = list(/datum/reagent/consumable/nutriment/cloth_fibers = INFINITY) tastes = list("dust" = 1, "lint" = 1) foodtypes = CLOTH diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index f509c8625edaa1..f295807d75d23b 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -227,7 +227,7 @@ /obj/item/clothing/glasses/regular/Initialize(mapload) . = ..() - AddComponent(/datum/component/knockoff,25,list(BODY_ZONE_PRECISE_EYES),list(ITEM_SLOT_EYES)) + AddComponent(/datum/component/knockoff, 25, list(BODY_ZONE_PRECISE_EYES), slot_flags) var/static/list/loc_connections = list( COMSIG_ATOM_ENTERED = .proc/on_entered, ) @@ -471,6 +471,7 @@ chameleon_action.chameleon_name = "Glasses" chameleon_action.chameleon_blacklist = typecacheof(/obj/item/clothing/glasses/changeling, only_root_path = TRUE) chameleon_action.initialize_disguises() + add_item_action(chameleon_action) /obj/item/clothing/glasses/thermal/syndi/emp_act(severity) . = ..() diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index 997903cfc1e865..0435c0c7c48f19 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -132,6 +132,7 @@ chameleon_action.chameleon_name = "Glasses" chameleon_action.chameleon_blacklist = typecacheof(/obj/item/clothing/glasses/changeling, only_root_path = TRUE) chameleon_action.initialize_disguises() + add_item_action(chameleon_action) /obj/item/clothing/glasses/hud/security/chameleon/emp_act(severity) . = ..() @@ -211,6 +212,9 @@ var/datum/atom_hud/our_hud = GLOB.huds[hud_type] our_hud.show_to(user) +/datum/action/item_action/switch_hud + name = "Switch HUD" + /obj/item/clothing/glasses/hud/toggle/thermal name = "thermal HUD scanner" desc = "Thermal imaging HUD in the shape of glasses." @@ -255,4 +259,3 @@ desc = "These sunglasses are special, and let you view potential criminals." icon_state = "sun" inhand_icon_state = "sunglasses" - diff --git a/code/modules/clothing/head/garlands.dm b/code/modules/clothing/head/garlands.dm new file mode 100644 index 00000000000000..84333fefea300f --- /dev/null +++ b/code/modules/clothing/head/garlands.dm @@ -0,0 +1,14 @@ +/obj/item/clothing/head/garland + name = "floral garland" + desc = "Someone, somewhere, is starving while wearing this. And it's definitely not you." + icon_state = "garland" + worn_icon_state = "garland" + +/obj/item/clothing/head/garland/equipped(mob/user, slot) + . = ..() + if(slot_flags & slot) + SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "garland", /datum/mood_event/garland) + +/obj/item/clothing/head/garland/dropped(mob/user) + . = ..() + SEND_SIGNAL(user, COMSIG_CLEAR_MOOD_EVENT, "garland") diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm index a77998cd443d00..d74deaffdc19cc 100644 --- a/code/modules/clothing/head/hardhat.dm +++ b/code/modules/clothing/head/hardhat.dm @@ -136,6 +136,13 @@ if(user.canUseTopic(src, BE_CLOSE)) toggle_welding_screen(user) +/obj/item/clothing/head/hardhat/weldhat/ui_action_click(mob/user, actiontype) + if(istype(actiontype, /datum/action/item_action/toggle_welding_screen)) + toggle_welding_screen(user) + return + + return ..() + /obj/item/clothing/head/hardhat/weldhat/proc/toggle_welding_screen(mob/living/user) if(weldingvisortoggle(user)) playsound(src, 'sound/mecha/mechmove03.ogg', 50, TRUE) //Visors don't just come from nothing diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index c3e6e6e3e86463..09c710a3bd631f 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -15,77 +15,38 @@ dog_fashion = /datum/dog_fashion/head/helmet - var/can_flashlight = FALSE //if a flashlight can be mounted. if it has a flashlight and this is false, it is permanently attached. - var/obj/item/flashlight/seclite/attached_light - var/datum/action/item_action/toggle_helmet_flashlight/alight - /obj/item/clothing/head/helmet/Initialize(mapload) . = ..() - if(attached_light) - alight = new(src) + AddElement(/datum/element/update_icon_updates_onmob) +/obj/item/clothing/head/helmet/sec -/obj/item/clothing/head/helmet/Destroy() - var/obj/item/flashlight/seclite/old_light = set_attached_light(null) - if(old_light) - qdel(old_light) - return ..() +/obj/item/clothing/head/helmet/sec/Initialize(mapload) + . = ..() + AddComponent(/datum/component/seclite_attachable, light_icon_state = "flight") +/obj/item/clothing/head/helmet/sec/attackby(obj/item/attacking_item, mob/user, params) + if(issignaler(attacking_item)) + var/obj/item/assembly/signaler/attached_signaler = attacking_item + // There's a flashlight in us. Remove it first, or it'll be lost forever! + var/obj/item/flashlight/seclite/blocking_us = locate() in src + if(blocking_us) + to_chat(user, span_warning("[blocking_us] is in the way, remove it first!")) + return TRUE -/obj/item/clothing/head/helmet/examine(mob/user) - . = ..() - if(attached_light) - . += "It has \a [attached_light] [can_flashlight ? "" : "permanently "]mounted on it." - if(can_flashlight) - . += span_info("[attached_light] looks like it can be unscrewed from [src].") - else if(can_flashlight) - . += "It has a mounting point for a seclite." - - -/obj/item/clothing/head/helmet/handle_atom_del(atom/A) - if(A == attached_light) - set_attached_light(null) - update_helmlight() - update_appearance() - QDEL_NULL(alight) - qdel(A) - return ..() + if(!attached_signaler.secured) + to_chat(user, span_warning("Secure [attached_signaler] first!")) + return TRUE + to_chat(user, span_notice("You add [attached_signaler] to [src].")) -///Called when attached_light value changes. -/obj/item/clothing/head/helmet/proc/set_attached_light(obj/item/flashlight/seclite/new_attached_light) - if(attached_light == new_attached_light) - return - . = attached_light - attached_light = new_attached_light - if(attached_light) - attached_light.set_light_flags(attached_light.light_flags | LIGHT_ATTACHED) - if(attached_light.loc != src) - attached_light.forceMove(src) - else if(.) - var/obj/item/flashlight/seclite/old_attached_light = . - old_attached_light.set_light_flags(old_attached_light.light_flags & ~LIGHT_ATTACHED) - if(old_attached_light.loc == src) - old_attached_light.forceMove(get_turf(src)) + qdel(attached_signaler) + var/obj/item/bot_assembly/secbot/secbot_frame = new(loc) + user.put_in_hands(secbot_frame) + qdel(src) + return TRUE -/obj/item/clothing/head/helmet/sec - can_flashlight = TRUE - -/obj/item/clothing/head/helmet/sec/attackby(obj/item/I, mob/user, params) - if(issignaler(I)) - var/obj/item/assembly/signaler/S = I - if(attached_light) //Has a flashlight. Player must remove it, else it will be lost forever. - to_chat(user, span_warning("The mounted flashlight is in the way, remove it first!")) - return - - if(S.secured) - qdel(S) - var/obj/item/bot_assembly/secbot/A = new - user.put_in_hands(A) - to_chat(user, span_notice("You add the signaler to the helmet.")) - qdel(src) - return return ..() /obj/item/clothing/head/helmet/alt @@ -94,9 +55,12 @@ icon_state = "helmetalt" inhand_icon_state = "helmetalt" armor = list(MELEE = 15, BULLET = 60, LASER = 10, ENERGY = 10, BOMB = 40, BIO = 0, FIRE = 50, ACID = 50, WOUND = 5) - can_flashlight = TRUE dog_fashion = null +/obj/item/clothing/head/helmet/alt/Initialize(mapload) + . = ..() + AddComponent(/datum/component/seclite_attachable, light_icon_state = "flight") + /obj/item/clothing/head/helmet/marine name = "tactical combat helmet" desc = "A tactical black helmet, sealed from outside hazards with a plate of glass and not much else." @@ -106,14 +70,11 @@ min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT clothing_flags = STOPSPRESSUREDAMAGE | PLASMAMAN_HELMET_EXEMPT resistance_flags = FIRE_PROOF | ACID_PROOF - can_flashlight = TRUE dog_fashion = null /obj/item/clothing/head/helmet/marine/Initialize(mapload) - set_attached_light(new /obj/item/flashlight/seclite) - update_helmlight() - update_appearance() . = ..() + AddComponent(/datum/component/seclite_attachable, starting_light = new /obj/item/flashlight/seclite(src), light_icon_state = "flight") /obj/item/clothing/head/helmet/marine/security name = "marine heavy helmet" @@ -158,20 +119,27 @@ dog_fashion = null /obj/item/clothing/head/helmet/attack_self(mob/user) - if(can_toggle && !user.incapacitated()) - if(world.time > cooldown + toggle_cooldown) - cooldown = world.time - up = !up - flags_1 ^= visor_flags - flags_inv ^= visor_flags_inv - flags_cover ^= visor_flags_cover - icon_state = "[initial(icon_state)][up ? "up" : ""]" - to_chat(user, span_notice("[up ? alt_toggle_message : toggle_message] \the [src].")) - - user.update_inv_head() - if(iscarbon(user)) - var/mob/living/carbon/C = user - C.head_update(src, forced = 1) + . = ..() + if(.) + return + if(!can_toggle) + return + + if(user.incapacitated() || world.time <= cooldown + toggle_cooldown) + return + + cooldown = world.time + up = !up + flags_1 ^= visor_flags + flags_inv ^= visor_flags_inv + flags_cover ^= visor_flags_cover + icon_state = "[initial(icon_state)][up ? "up" : ""]" + to_chat(user, span_notice("[up ? alt_toggle_message : toggle_message] \the [src].")) + + user.update_inv_head() + if(iscarbon(user)) + var/mob/living/carbon/carbon_user = user + carbon_user.head_update(src, forced = TRUE) /obj/item/clothing/head/helmet/justice name = "helmet of justice" @@ -405,191 +373,3 @@ material_flags = MATERIAL_EFFECTS | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS //Can change color and add prefix flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH - -//monkey sentience caps - -/obj/item/clothing/head/helmet/monkey_sentience - name = "monkey mind magnification helmet" - desc = "A fragile, circuitry embedded helmet for boosting the intelligence of a monkey to a higher level. You see several warning labels..." - - icon_state = "monkeymind" - inhand_icon_state = "monkeymind" - strip_delay = 100 - var/mob/living/carbon/human/magnification = null ///if the helmet is on a valid target (just works like a normal helmet if not (cargo please stop)) - var/polling = FALSE///if the helmet is currently polling for targets (special code for removal) - var/light_colors = 1 ///which icon state color this is (red, blue, yellow) - -/obj/item/clothing/head/helmet/monkey_sentience/Initialize(mapload) - . = ..() - light_colors = rand(1,3) - update_appearance() - -/obj/item/clothing/head/helmet/monkey_sentience/examine(mob/user) - . = ..() - . += span_boldwarning("---WARNING: REMOVAL OF HELMET ON SUBJECT MAY LEAD TO:---") - . += span_warning("BLOOD RAGE") - . += span_warning("BRAIN DEATH") - . += span_warning("PRIMAL GENE ACTIVATION") - . += span_warning("GENETIC MAKEUP MASS SUSCEPTIBILITY") - . += span_boldnotice("Ask your CMO if mind magnification is right for you.") - -/obj/item/clothing/head/helmet/monkey_sentience/update_icon_state() - . = ..() - icon_state = "[initial(icon_state)][light_colors][magnification ? "up" : null]" - -/obj/item/clothing/head/helmet/monkey_sentience/equipped(mob/user, slot) - . = ..() - if(slot != ITEM_SLOT_HEAD) - return - if(!ismonkey(user) || user.ckey) - var/mob/living/something = user - to_chat(something, span_boldnotice("You feel a stabbing pain in the back of your head for a moment.")) - something.apply_damage(5,BRUTE,BODY_ZONE_HEAD,FALSE,FALSE,FALSE) //notably: no damage resist (it's in your helmet), no damage spread (it's in your helmet) - playsound(src, 'sound/machines/buzz-sigh.ogg', 30, TRUE) - return - if(!(GLOB.ghost_role_flags & GHOSTROLE_STATION_SENTIENCE)) - say("ERROR: Central Command has temporarily outlawed monkey sentience helmets in this sector. NEAREST LAWFUL SECTOR: 2.537 million light years away.") - return - magnification = user //this polls ghosts - visible_message(span_warning("[src] powers up!")) - playsound(src, 'sound/machines/ping.ogg', 30, TRUE) - RegisterSignal(magnification, COMSIG_SPECIES_LOSS, .proc/make_fall_off) - polling = TRUE - var/list/candidates = poll_candidates_for_mob("Do you want to play as a mind magnified monkey?", ROLE_SENTIENCE, ROLE_SENTIENCE, 5 SECONDS, magnification, POLL_IGNORE_SENTIENCE_POTION) - polling = FALSE - if(!magnification) - return - if(!candidates.len) - UnregisterSignal(magnification, COMSIG_SPECIES_LOSS) - magnification = null - visible_message(span_notice("[src] falls silent and drops on the floor. Maybe you should try again later?")) - playsound(src, 'sound/machines/buzz-sigh.ogg', 30, TRUE) - user.dropItemToGround(src) - return - var/mob/picked = pick(candidates) - magnification.key = picked.key - playsound(src, 'sound/machines/microwave/microwave-end.ogg', 100, FALSE) - to_chat(magnification, span_notice("You're a mind magnified monkey! Protect your helmet with your life- if you lose it, your sentience goes with it!")) - var/policy = get_policy(ROLE_MONKEY_HELMET) - if(policy) - to_chat(magnification, policy) - icon_state = "[icon_state]up" - -/obj/item/clothing/head/helmet/monkey_sentience/Destroy() - disconnect() - return ..() - -/obj/item/clothing/head/helmet/monkey_sentience/proc/disconnect() - if(!magnification) //not put on a viable head - return - if(!polling)//put on a viable head, but taken off after polling finished. - if(magnification.client) - to_chat(magnification, span_userdanger("You feel your flicker of sentience ripped away from you, as everything becomes dim...")) - magnification.ghostize(FALSE) - if(prob(10)) - switch(rand(1,4)) - if(1) //blood rage - magnification.ai_controller.blackboard[BB_MONKEY_AGGRESSIVE] = TRUE - if(2) //brain death - magnification.apply_damage(500,BRAIN,BODY_ZONE_HEAD,FALSE,FALSE,FALSE) - if(3) //primal gene (gorilla) - magnification.gorillize() - if(4) //genetic mass susceptibility (gib) - magnification.gib() - //either used up correctly or taken off before polling finished (punish this by destroying the helmet) - UnregisterSignal(magnification, COMSIG_SPECIES_LOSS) - playsound(src, 'sound/machines/buzz-sigh.ogg', 30, TRUE) - playsound(src, SFX_SPARKS, 100, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - visible_message(span_warning("[src] fizzles and breaks apart!")) - magnification = null - new /obj/effect/decal/cleanable/ash/crematorium(drop_location()) //just in case they're in a locker or other containers it needs to use crematorium ash, see the path itself for an explanation - -/obj/item/clothing/head/helmet/monkey_sentience/dropped(mob/user) - . = ..() - if(magnification || polling) - qdel(src)//runs disconnect code - -/obj/item/clothing/head/helmet/monkey_sentience/proc/make_fall_off() - SIGNAL_HANDLER - if(magnification) - visible_message(span_warning("[src] falls off of [magnification]'s head as it changes shape!")) - magnification.dropItemToGround(src) - -//LightToggle - -/obj/item/clothing/head/helmet/ComponentInitialize() - . = ..() - AddElement(/datum/element/update_icon_updates_onmob) - -/obj/item/clothing/head/helmet/update_icon_state() - if(attached_light) - var/state = "[initial(icon_state)]" - if(attached_light.on) - state += "-flight-on" //"helmet-flight-on" // "helmet-cam-flight-on" - else - state += "-flight" //etc. - icon_state = state - return ..() - -/obj/item/clothing/head/helmet/ui_action_click(mob/user, action) - if(istype(action, alight)) - toggle_helmlight() - else - ..() - -/obj/item/clothing/head/helmet/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/flashlight/seclite)) - var/obj/item/flashlight/seclite/S = I - if(can_flashlight && !attached_light) - if(!user.transferItemToLoc(S, src)) - return - to_chat(user, span_notice("You click [S] into place on [src].")) - set_attached_light(S) - update_appearance() - update_helmlight() - alight = new(src) - if(loc == user) - alight.Grant(user) - return - return ..() - -/obj/item/clothing/head/helmet/screwdriver_act(mob/living/user, obj/item/I) - . = ..() - if(can_flashlight && attached_light) //if it has a light but can_flashlight is false, the light is permanently attached. - I.play_tool_sound(src) - to_chat(user, span_notice("You unscrew [attached_light] from [src].")) - attached_light.forceMove(drop_location()) - if(Adjacent(user) && !issilicon(user)) - user.put_in_hands(attached_light) - - var/obj/item/flashlight/removed_light = set_attached_light(null) - update_helmlight() - removed_light.update_brightness(user) - update_appearance() - user.update_inv_head() - QDEL_NULL(alight) - return TRUE - -/obj/item/clothing/head/helmet/proc/toggle_helmlight() - set name = "Toggle Helmetlight" - set category = "Object" - set desc = "Click to toggle your helmet's attached flashlight." - - if(!attached_light) - return - - var/mob/user = usr - if(user.incapacitated()) - return - attached_light.on = !attached_light.on - attached_light.update_brightness() - to_chat(user, span_notice("You toggle the helmet light [attached_light.on ? "on":"off"].")) - - playsound(user, 'sound/weapons/empty.ogg', 100, TRUE) - update_helmlight() - -/obj/item/clothing/head/helmet/proc/update_helmlight() - if(attached_light) - update_appearance() - - update_action_buttons() diff --git a/code/modules/clothing/head/mind_monkey_helmet.dm b/code/modules/clothing/head/mind_monkey_helmet.dm new file mode 100644 index 00000000000000..6534cdbc1282ca --- /dev/null +++ b/code/modules/clothing/head/mind_monkey_helmet.dm @@ -0,0 +1,109 @@ + +//monkey sentience caps + +/obj/item/clothing/head/helmet/monkey_sentience + name = "monkey mind magnification helmet" + desc = "A fragile, circuitry embedded helmet for boosting the intelligence of a monkey to a higher level. You see several warning labels..." + + icon_state = "monkeymind" + inhand_icon_state = "monkeymind" + strip_delay = 100 + var/mob/living/carbon/human/magnification = null ///if the helmet is on a valid target (just works like a normal helmet if not (cargo please stop)) + var/polling = FALSE///if the helmet is currently polling for targets (special code for removal) + var/light_colors = 1 ///which icon state color this is (red, blue, yellow) + +/obj/item/clothing/head/helmet/monkey_sentience/Initialize(mapload) + . = ..() + light_colors = rand(1,3) + update_appearance() + +/obj/item/clothing/head/helmet/monkey_sentience/examine(mob/user) + . = ..() + . += span_boldwarning("---WARNING: REMOVAL OF HELMET ON SUBJECT MAY LEAD TO:---") + . += span_warning("BLOOD RAGE") + . += span_warning("BRAIN DEATH") + . += span_warning("PRIMAL GENE ACTIVATION") + . += span_warning("GENETIC MAKEUP MASS SUSCEPTIBILITY") + . += span_boldnotice("Ask your CMO if mind magnification is right for you.") + +/obj/item/clothing/head/helmet/monkey_sentience/update_icon_state() + . = ..() + icon_state = "[initial(icon_state)][light_colors][magnification ? "up" : null]" + +/obj/item/clothing/head/helmet/monkey_sentience/equipped(mob/user, slot) + . = ..() + if(slot != ITEM_SLOT_HEAD) + return + if(!ismonkey(user) || user.ckey) + var/mob/living/something = user + to_chat(something, span_boldnotice("You feel a stabbing pain in the back of your head for a moment.")) + something.apply_damage(5,BRUTE,BODY_ZONE_HEAD,FALSE,FALSE,FALSE) //notably: no damage resist (it's in your helmet), no damage spread (it's in your helmet) + playsound(src, 'sound/machines/buzz-sigh.ogg', 30, TRUE) + return + if(!(GLOB.ghost_role_flags & GHOSTROLE_STATION_SENTIENCE)) + say("ERROR: Central Command has temporarily outlawed monkey sentience helmets in this sector. NEAREST LAWFUL SECTOR: 2.537 million light years away.") + return + magnification = user //this polls ghosts + visible_message(span_warning("[src] powers up!")) + playsound(src, 'sound/machines/ping.ogg', 30, TRUE) + RegisterSignal(magnification, COMSIG_SPECIES_LOSS, .proc/make_fall_off) + polling = TRUE + var/list/candidates = poll_candidates_for_mob("Do you want to play as a mind magnified monkey?", ROLE_SENTIENCE, ROLE_SENTIENCE, 5 SECONDS, magnification, POLL_IGNORE_SENTIENCE_POTION) + polling = FALSE + if(!magnification) + return + if(!candidates.len) + UnregisterSignal(magnification, COMSIG_SPECIES_LOSS) + magnification = null + visible_message(span_notice("[src] falls silent and drops on the floor. Maybe you should try again later?")) + playsound(src, 'sound/machines/buzz-sigh.ogg', 30, TRUE) + user.dropItemToGround(src) + return + var/mob/picked = pick(candidates) + magnification.key = picked.key + playsound(src, 'sound/machines/microwave/microwave-end.ogg', 100, FALSE) + to_chat(magnification, span_notice("You're a mind magnified monkey! Protect your helmet with your life- if you lose it, your sentience goes with it!")) + var/policy = get_policy(ROLE_MONKEY_HELMET) + if(policy) + to_chat(magnification, policy) + icon_state = "[icon_state]up" + +/obj/item/clothing/head/helmet/monkey_sentience/Destroy() + disconnect() + return ..() + +/obj/item/clothing/head/helmet/monkey_sentience/proc/disconnect() + if(!magnification) //not put on a viable head + return + if(!polling)//put on a viable head, but taken off after polling finished. + if(magnification.client) + to_chat(magnification, span_userdanger("You feel your flicker of sentience ripped away from you, as everything becomes dim...")) + magnification.ghostize(FALSE) + if(prob(10)) + switch(rand(1,4)) + if(1) //blood rage + magnification.ai_controller.blackboard[BB_MONKEY_AGGRESSIVE] = TRUE + if(2) //brain death + magnification.apply_damage(500,BRAIN,BODY_ZONE_HEAD,FALSE,FALSE,FALSE) + if(3) //primal gene (gorilla) + magnification.gorillize() + if(4) //genetic mass susceptibility (gib) + magnification.gib() + //either used up correctly or taken off before polling finished (punish this by destroying the helmet) + UnregisterSignal(magnification, COMSIG_SPECIES_LOSS) + playsound(src, 'sound/machines/buzz-sigh.ogg', 30, TRUE) + playsound(src, SFX_SPARKS, 100, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + visible_message(span_warning("[src] fizzles and breaks apart!")) + magnification = null + new /obj/effect/decal/cleanable/ash/crematorium(drop_location()) //just in case they're in a locker or other containers it needs to use crematorium ash, see the path itself for an explanation + +/obj/item/clothing/head/helmet/monkey_sentience/dropped(mob/user) + . = ..() + if(magnification || polling) + qdel(src)//runs disconnect code + +/obj/item/clothing/head/helmet/monkey_sentience/proc/make_fall_off() + SIGNAL_HANDLER + if(magnification) + visible_message(span_warning("[src] falls off of [magnification]'s head as it changes shape!")) + magnification.dropItemToGround(src) diff --git a/code/modules/clothing/head/tophat.dm b/code/modules/clothing/head/tophat.dm index 17aa72ea43fe04..6bc123e20629e7 100644 --- a/code/modules/clothing/head/tophat.dm +++ b/code/modules/clothing/head/tophat.dm @@ -22,7 +22,7 @@ COOLDOWN_START(src, rabbit_cooldown, RABBIT_CD_TIME) playsound(get_turf(src), 'sound/weapons/emitter.ogg', 70) - do_smoke(amount = DIAMOND_AREA(1), location=src, smoke_type=/obj/effect/particle_effect/fluid/smoke/quick) + do_smoke(amount = DIAMOND_AREA(1), holder = src, location = src, smoke_type=/obj/effect/particle_effect/fluid/smoke/quick) if(prob(10)) magician.visible_message(span_danger("[magician] taps [src] with [hitby_wand], then reaches in and pulls out a bu- wait, those are bees!"), span_danger("You tap [src] with your [hitby_wand.name] and pull out... BEES!")) diff --git a/code/modules/clothing/masks/costume.dm b/code/modules/clothing/masks/costume.dm index f269a0ca5a8443..32dd4f59aaa785 100644 --- a/code/modules/clothing/masks/costume.dm +++ b/code/modules/clothing/masks/costume.dm @@ -1,8 +1,30 @@ /obj/item/clothing/mask/joy - name = "joy mask" - desc = "Express your happiness or hide your sorrows with this laughing face with crying tears of joy cutout." + name = "emotion mask" + desc = "Express your happiness or hide your sorrows with this cultured cutout." icon_state = "joy" + clothing_flags = MASKINTERNALS flags_inv = HIDESNOUT + unique_reskin = list( + "Joy" = "joy", + "Flushed" = "flushed", + "Pensive" = "pensive", + "Angry" = "angry", + "Pleading" = "pleading" + ) + +/obj/item/clothing/mask/joy/Initialize(mapload) + . = ..() + register_context() + +/obj/item/clothing/mask/joy/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = ..() + context[SCREENTIP_CONTEXT_ALT_LMB] = "Change Emotion" + return CONTEXTUAL_SCREENTIP_SET + +/obj/item/clothing/mask/joy/reskin_obj(mob/user) + . = ..() + user.update_inv_wear_mask() + current_skin = null//so we can infinitely reskin /obj/item/clothing/mask/mummy name = "mummy mask" diff --git a/code/modules/clothing/masks/gas_filter.dm b/code/modules/clothing/masks/gas_filter.dm index 09dafd7e41520b..b38d236858d9a0 100644 --- a/code/modules/clothing/masks/gas_filter.dm +++ b/code/modules/clothing/masks/gas_filter.dm @@ -16,6 +16,7 @@ desc = "A piece of filtering cloth to be used with atmospheric gas masks and emergency gas masks." icon = 'icons/obj/clothing/masks.dmi' icon_state = "gas_atmos_filter" + w_class = WEIGHT_CLASS_TINY ///Amount of filtering points available var/filter_status = 100 ///strength of the filter against high filtering gases diff --git a/code/modules/clothing/masks/hailer.dm b/code/modules/clothing/masks/hailer.dm index de154dac732909..395ccd20821513 100644 --- a/code/modules/clothing/masks/hailer.dm +++ b/code/modules/clothing/masks/hailer.dm @@ -201,6 +201,9 @@ GLOBAL_LIST_INIT(hailer_phrases, list( playsound(src, 'sound/misc/whistle.ogg', 75, FALSE, 4) cooldown = world.time +/datum/action/item_action/halt + name = "HALT!" + #undef PHRASE_COOLDOWN #undef OVERUSE_COOLDOWN #undef AGGR_GOOD_COP diff --git a/code/modules/clothing/outfits/ert.dm b/code/modules/clothing/outfits/ert.dm index b73bcb0e8ab0b5..6226a6e43550f4 100644 --- a/code/modules/clothing/outfits/ert.dm +++ b/code/modules/clothing/outfits/ert.dm @@ -1,9 +1,11 @@ -/datum/outfit/centcom/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) +/datum/outfit/centcom + name = "CentCom Base" + +/datum/outfit/centcom/post_equip(mob/living/carbon/human/centcom_member, visualsOnly = FALSE) if(visualsOnly) return - - var/obj/item/implant/mindshield/L = new/obj/item/implant/mindshield(H)//hmm lets have centcom officials become revs - L.implant(H, null, 1) + var/obj/item/implant/mindshield/mindshield = new /obj/item/implant/mindshield(centcom_member)//hmm lets have centcom officials become revs + mindshield.implant(centcom_member, null, silent = TRUE) /datum/outfit/centcom/ert name = "ERT Common" @@ -113,7 +115,7 @@ /obj/item/storage/box/hug/plushes = 1, /obj/item/storage/box/survival/engineer = 1, ) - belt = /obj/item/storage/belt/medical + belt = /obj/item/storage/belt/medical/ert glasses = /obj/item/clothing/glasses/hud/health l_hand = /obj/item/storage/medkit/regular r_hand = /obj/item/gun/energy/e_gun diff --git a/code/modules/clothing/outfits/standard.dm b/code/modules/clothing/outfits/standard.dm index 40f8aba297cfb9..04c45a2cdbc371 100644 --- a/code/modules/clothing/outfits/standard.dm +++ b/code/modules/clothing/outfits/standard.dm @@ -329,13 +329,13 @@ r_pocket = /obj/item/teleportation_scroll l_hand = /obj/item/staff -/datum/outfit/wizard/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) +/datum/outfit/wizard/post_equip(mob/living/carbon/human/wizard, visualsOnly = FALSE) if(visualsOnly) return - var/obj/item/spellbook/S = locate() in H.back - if(S) - S.owner = H + var/obj/item/spellbook/new_spellbook = locate() in wizard.back + if(new_spellbook) + new_spellbook.owner = wizard.mind /datum/outfit/wizard/apprentice name = "Wizard Apprentice" diff --git a/code/modules/clothing/outfits/vv_outfit.dm b/code/modules/clothing/outfits/vv_outfit.dm index 7c4fcc96dbdf1d..3718e6bdef5d78 100644 --- a/code/modules/clothing/outfits/vv_outfit.dm +++ b/code/modules/clothing/outfits/vv_outfit.dm @@ -1,13 +1,14 @@ // This outfit preserves varedits made on the items // Created from admin helpers. /datum/outfit/varedit + name = "Var Edited Outfit" var/list/vv_values var/list/stored_access var/update_id_name = FALSE //If the name of the human is same as the name on the id they're wearing we'll update provided id when equipping -/datum/outfit/varedit/pre_equip(mob/living/carbon/human/H, visualsOnly) - H.delete_equipment() //Applying VV to wrong objects is not reccomended. - . = ..() +/datum/outfit/varedit/pre_equip(mob/living/carbon/human/equipping_mob, visualsOnly) + equipping_mob.delete_equipment() //Applying VV to wrong objects is not reccomended. + return ..() /datum/outfit/varedit/proc/set_equipement_by_slot(slot,item_path) switch(slot) diff --git a/code/modules/clothing/shoes/cowboy.dm b/code/modules/clothing/shoes/cowboy.dm index 16c3dfc03e4953..80d6e94074ffae 100644 --- a/code/modules/clothing/shoes/cowboy.dm +++ b/code/modules/clothing/shoes/cowboy.dm @@ -5,29 +5,29 @@ armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 90, FIRE = 0, ACID = 0) //these are quite tall pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes custom_price = PAYCHECK_CREW - var/list/occupants = list() var/max_occupants = 4 can_be_tied = FALSE /obj/item/clothing/shoes/cowboy/Initialize(mapload) . = ..() if(prob(2)) - var/mob/living/simple_animal/hostile/retaliate/snake/bootsnake = new/mob/living/simple_animal/hostile/retaliate/snake(src) - occupants += bootsnake + //There's a snake in my boot + new /mob/living/simple_animal/hostile/retaliate/snake(src) /obj/item/clothing/shoes/cowboy/equipped(mob/living/carbon/user, slot) . = ..() RegisterSignal(user, COMSIG_LIVING_SLAM_TABLE, .proc/table_slam) if(slot == ITEM_SLOT_FEET) - for(var/mob/living/occupant in occupants) + for(var/mob/living/occupant in contents) occupant.forceMove(user.drop_location()) user.visible_message(span_warning("[user] recoils as something slithers out of [src]."), span_userdanger("You feel a sudden stabbing pain in your [pick("foot", "toe", "ankle")]!")) user.Knockdown(20) //Is one second paralyze better here? I feel you would fall on your ass in some fashion. user.apply_damage(5, BRUTE, pick(BODY_ZONE_R_LEG, BODY_ZONE_L_LEG)) if(istype(occupant, /mob/living/simple_animal/hostile/retaliate)) user.reagents.add_reagent(/datum/reagent/toxin, 7) - occupants.Cut() + + /obj/item/clothing/shoes/cowboy/dropped(mob/living/user) . = ..() @@ -45,19 +45,17 @@ . = ..() if(!(user.mobility_flags & MOBILITY_USE) || user.stat != CONSCIOUS || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !Adjacent(user) || !user.Adjacent(target) || target.stat == DEAD) return - if(occupants.len >= max_occupants) + if(contents.len >= max_occupants) to_chat(user, span_warning("[src] are full!")) return if(istype(target, /mob/living/simple_animal/hostile/retaliate/snake) || istype(target, /mob/living/simple_animal/hostile/headcrab) || istype(target, /mob/living/carbon/alien/larva)) - occupants += target target.forceMove(src) to_chat(user, span_notice("[target] slithers into [src].")) /obj/item/clothing/shoes/cowboy/container_resist_act(mob/living/user) if(!do_after(user, 10, target = user)) return - user.forceMove(user.drop_location()) - occupants -= user + user.forceMove(drop_location()) /obj/item/clothing/shoes/cowboy/white name = "white cowboy boots" diff --git a/code/modules/clothing/spacesuits/_spacesuits.dm b/code/modules/clothing/spacesuits/_spacesuits.dm index c05aed34cf20d5..f21d6b94a9e3b6 100644 --- a/code/modules/clothing/spacesuits/_spacesuits.dm +++ b/code/modules/clothing/spacesuits/_spacesuits.dm @@ -70,24 +70,23 @@ // Space Suit temperature regulation and power usage /obj/item/clothing/suit/space/process(delta_time) - var/mob/living/carbon/human/user = src.loc - if(!user || !ishuman(user) || !(user.wear_suit == src)) + var/mob/living/carbon/human/user = loc + if(!user || !ishuman(user) || user.wear_suit != src) return // Do nothing if thermal regulators are off if(!thermal_on) return - // If we got here, thermal regulators are on. If there's no cell, turn them - // off + // If we got here, thermal regulators are on. If there's no cell, turn them off if(!cell) - toggle_spacesuit() + toggle_spacesuit(user) update_hud_icon(user) return // cell.use will return FALSE if charge is lower than THERMAL_REGULATOR_COST if(!cell.use(THERMAL_REGULATOR_COST)) - toggle_spacesuit() + toggle_spacesuit(user) update_hud_icon(user) to_chat(user, span_warning("The thermal regulator cuts off as [cell] runs out of charge.")) return @@ -195,20 +194,24 @@ to_chat(user, span_notice("You [cell_cover_open ? "open" : "close"] the cell cover on \the [src].")) /// Toggle the space suit's thermal regulator status -/obj/item/clothing/suit/space/proc/toggle_spacesuit() +/obj/item/clothing/suit/space/proc/toggle_spacesuit(mob/toggler) // If we're turning thermal protection on, check for valid cell and for enough // charge that cell. If it's too low, we shouldn't bother with setting the // thermal protection value and should just return out early. - var/mob/living/carbon/human/user = src.loc - if(!thermal_on && !(cell && cell.charge >= THERMAL_REGULATOR_COST)) - to_chat(user, span_warning("The thermal regulator on \the [src] has no charge.")) + if(!thermal_on && (!cell || cell.charge < THERMAL_REGULATOR_COST)) + if(toggler) + to_chat(toggler, span_warning("The thermal regulator on [src] has no charge.")) return thermal_on = !thermal_on min_cold_protection_temperature = thermal_on ? SPACE_SUIT_MIN_TEMP_PROTECT : SPACE_SUIT_MIN_TEMP_PROTECT_OFF - if(user) - to_chat(user, span_notice("You turn [thermal_on ? "on" : "off"] \the [src]'s thermal regulator.")) - SEND_SIGNAL(src, COMSIG_SUIT_SPACE_TOGGLE) + if(toggler) + to_chat(toggler, span_notice("You turn [thermal_on ? "on" : "off"] [src]'s thermal regulator.")) + + update_action_buttons() + +/obj/item/clothing/suit/space/ui_action_click(mob/user, actiontype) + toggle_spacesuit(user) // let emags override the temperature settings /obj/item/clothing/suit/space/emag_act(mob/user) diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm index 7f8706bf95d2a4..9ec06242da0815 100644 --- a/code/modules/clothing/spacesuits/plasmamen.dm +++ b/code/modules/clothing/spacesuits/plasmamen.dm @@ -56,7 +56,7 @@ var/visor_icon = "envisor" var/smile_state = "envirohelm_smile" var/obj/item/clothing/head/attached_hat - actions_types = list(/datum/action/item_action/toggle_helmet_light, /datum/action/item_action/toggle_welding_screen/plasmaman) + actions_types = list(/datum/action/item_action/toggle_helmet_light, /datum/action/item_action/toggle_welding_screen) visor_vars_to_toggle = VISOR_FLASHPROTECT | VISOR_TINT flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT flags_cover = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF @@ -78,6 +78,13 @@ if(user.canUseTopic(src, BE_CLOSE)) toggle_welding_screen(user) +/obj/item/clothing/head/helmet/space/plasmaman/ui_action_click(mob/user, action) + if(istype(action, /datum/action/item_action/toggle_welding_screen)) + toggle_welding_screen(user) + return + + return ..() + /obj/item/clothing/head/helmet/space/plasmaman/proc/toggle_welding_screen(mob/living/user) if(weldingvisortoggle(user)) if(helmet_on) @@ -301,7 +308,7 @@ desc = "A slight modification on a traditional voidsuit helmet, this helmet was Nanotrasen's first solution to the *logistical problems* that come with employing plasmamen. Despite their limitations, these helmets still see use by historians and old-school plasmamen alike." icon_state = "prototype_envirohelm" inhand_icon_state = "prototype_envirohelm" - actions_types = list(/datum/action/item_action/toggle_welding_screen/plasmaman) + actions_types = list(/datum/action/item_action/toggle_welding_screen) smile_state = "prototype_smile" visor_icon = "prototype_envisor" diff --git a/code/modules/clothing/suits/cloaks.dm b/code/modules/clothing/suits/cloaks.dm index ac0f5b68584db2..49a03faf527428 100644 --- a/code/modules/clothing/suits/cloaks.dm +++ b/code/modules/clothing/suits/cloaks.dm @@ -10,6 +10,10 @@ body_parts_covered = CHEST|GROIN|LEGS|ARMS flags_inv = HIDESUITSTORAGE +/obj/item/clothing/neck/cloak/Initialize(mapload) + . = ..() + AddComponent(/datum/component/surgery_initiator) + /obj/item/clothing/neck/cloak/suicide_act(mob/user) user.visible_message(span_suicide("[user] is strangling [user.p_them()]self with [src]! It looks like [user.p_theyre()] trying to commit suicide!")) return(OXYLOSS) diff --git a/code/modules/clothing/suits/reactive_armour.dm b/code/modules/clothing/suits/reactive_armour.dm index 72df456cdd7959..96fc2484699d6e 100644 --- a/code/modules/clothing/suits/reactive_armour.dm +++ b/code/modules/clothing/suits/reactive_armour.dm @@ -11,7 +11,7 @@ /obj/effect/anomaly/grav = /obj/item/clothing/suit/armor/reactive/repulse, /obj/effect/anomaly/flux = /obj/item/clothing/suit/armor/reactive/tesla, /obj/effect/anomaly/bluespace = /obj/item/clothing/suit/armor/reactive/teleport, - /obj/effect/anomaly/delimber = /obj/item/clothing/suit/armor/reactive/delimbering, + /obj/effect/anomaly/bioscrambler = /obj/item/clothing/suit/armor/reactive/bioscrambling, /obj/effect/anomaly/hallucination = /obj/item/clothing/suit/armor/reactive/hallucinating, ) @@ -375,10 +375,10 @@ near.hallucination += 25 * dist near.hallucination = clamp(near.hallucination, 0, 150) -//Delimbering +//Bioscrambling -/obj/item/clothing/suit/armor/reactive/delimbering - name = "reactive delimbering armor" +/obj/item/clothing/suit/armor/reactive/bioscrambling + name = "reactive bioscrambling armor" desc = "An experimental suit of armor with sensitive detectors hooked up to a biohazard release valve. It scrambles the bodies of those around." cooldown_message = span_danger("The connection is currently out of sync... Recalibrating.") emp_message = span_warning("You feel the armor squirm.") @@ -393,7 +393,7 @@ var/static/list/l_legs var/static/list/r_legs -/obj/item/clothing/suit/armor/reactive/delimbering/Initialize(mapload) +/obj/item/clothing/suit/armor/reactive/bioscrambling/Initialize(mapload) . = ..() if(!chests) chests = typesof(/obj/item/bodypart/chest) @@ -408,23 +408,23 @@ if(!r_legs) r_legs = typesof(/obj/item/bodypart/r_leg) -/obj/item/clothing/suit/armor/reactive/delimbering/cooldown_activation(mob/living/carbon/human/owner) +/obj/item/clothing/suit/armor/reactive/bioscrambling/cooldown_activation(mob/living/carbon/human/owner) var/datum/effect_system/spark_spread/sparks = new /datum/effect_system/spark_spread sparks.set_up(1, 1, src) sparks.start() ..() -/obj/item/clothing/suit/armor/reactive/delimbering/reactive_activation(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) +/obj/item/clothing/suit/armor/reactive/bioscrambling/reactive_activation(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) owner.visible_message(span_danger("[src] blocks [attack_text], biohazard body scramble released!")) - delimber_pulse(owner, FALSE) + bioscrambler_pulse(owner, FALSE) return TRUE -/obj/item/clothing/suit/armor/reactive/delimbering/emp_activation(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) +/obj/item/clothing/suit/armor/reactive/bioscrambling/emp_activation(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) owner.visible_message(span_danger("[src] blocks [attack_text], but pulls a massive charge of biohazard material into [owner] from the surrounding environment!")) - delimber_pulse(owner, TRUE) + bioscrambler_pulse(owner, TRUE) return TRUE -/obj/item/clothing/suit/armor/reactive/delimbering/proc/delimber_pulse(mob/living/carbon/human/owner, can_hit_owner = FALSE) +/obj/item/clothing/suit/armor/reactive/bioscrambling/proc/bioscrambler_pulse(mob/living/carbon/human/owner, can_hit_owner = FALSE) for(var/mob/living/carbon/nearby in range(range, get_turf(src))) if(!can_hit_owner && nearby == owner) continue diff --git a/code/modules/events/_event.dm b/code/modules/events/_event.dm index 79cef6d02464b6..e95dec07f69c52 100644 --- a/code/modules/events/_event.dm +++ b/code/modules/events/_event.dm @@ -1,4 +1,4 @@ -#define RANDOM_EVENT_ADMIN_INTERVENTION_TIME 10 +#define RANDOM_EVENT_ADMIN_INTERVENTION_TIME (10 SECONDS) //this singleton datum is used by the events controller to dictate how it selects events /datum/round_event_control @@ -69,8 +69,8 @@ triggering = TRUE if (alert_observers) - message_admins("Random Event triggering in [RANDOM_EVENT_ADMIN_INTERVENTION_TIME] seconds: [name] (CANCEL)") - sleep(RANDOM_EVENT_ADMIN_INTERVENTION_TIME SECONDS) + message_admins("Random Event triggering in [DisplayTimeText(RANDOM_EVENT_ADMIN_INTERVENTION_TIME)]: [name] (CANCEL)") + sleep(RANDOM_EVENT_ADMIN_INTERVENTION_TIME) var/players_amt = get_active_player_count(alive_check = TRUE, afk_check = TRUE, human_check = TRUE) if(!canSpawnEvent(players_amt)) message_admins("Second pre-condition check for [name] failed, skipping...") @@ -93,19 +93,45 @@ SSblackbox.record_feedback("tally", "event_admin_cancelled", 1, typepath) /datum/round_event_control/proc/runEvent(random = FALSE) + /* + * We clear our signals first so we dont cancel a wanted event by accident, + * the majority of time the admin will probably want to cancel a single midround spawned random events + * and not multiple events called by others admins + * * In the worst case scenario we can still recall a event which we cancelled by accident, which is much better then to have a unwanted event + */ + UnregisterSignal(SSdcs, COMSIG_GLOB_RANDOM_EVENT) var/datum/round_event/E = new typepath() E.current_players = get_active_player_count(alive_check = 1, afk_check = 1, human_check = 1) E.control = src - SSblackbox.record_feedback("tally", "event_ran", 1, "[E]") occurrences++ testing("[time2text(world.time, "hh:mm:ss")] [E.type]") + triggering = TRUE + + if (alert_observers) + message_admins("Random Event triggering in [DisplayTimeText(RANDOM_EVENT_ADMIN_INTERVENTION_TIME)]: [name] (CANCEL)") + sleep(RANDOM_EVENT_ADMIN_INTERVENTION_TIME) + + if(!triggering) + RegisterSignal(SSdcs, COMSIG_GLOB_RANDOM_EVENT, .proc/stop_random_event) + E.cancel_event = TRUE + return E + + triggering = FALSE if(random) log_game("Random Event triggering: [name] ([typepath])") - if (alert_observers) + + if(alert_observers) deadchat_broadcast(" has just been[random ? " randomly" : ""] triggered!", "[name]", message_type=DEADCHAT_ANNOUNCEMENT) //STOP ASSUMING IT'S BADMINS! + + SSblackbox.record_feedback("tally", "event_ran", 1, "[E]") return E +//Returns the component for the listener +/datum/round_event_control/proc/stop_random_event() + SIGNAL_HANDLER + return CANCEL_RANDOM_EVENT + //Special admins setup /datum/round_event_control/proc/admin_setup() return @@ -122,6 +148,8 @@ var/activeFor = 0 //How long the event has existed. You don't need to change this. var/current_players = 0 //Amount of of alive, non-AFK human players on server at the time of event start var/fakeable = TRUE //Can be faked by fake news event. + /// Whether a admin wants this event to be cancelled + var/cancel_event = FALSE //Called first before processing. //Allows you to setup your event, such as randomly @@ -179,6 +207,11 @@ if(!processing) return + if(SEND_GLOBAL_SIGNAL(COMSIG_GLOB_RANDOM_EVENT, src) & CANCEL_RANDOM_EVENT) + processing = FALSE + kill() + return + if(activeFor == startWhen) processing = FALSE start() diff --git a/code/modules/events/anomaly.dm b/code/modules/events/anomaly.dm index 0d18709e9e0269..e695fa4f177ccd 100644 --- a/code/modules/events/anomaly.dm +++ b/code/modules/events/anomaly.dm @@ -24,7 +24,6 @@ /area/station/holodeck, /area/shuttle, /area/station/maintenance, - /area/station/science/test_area, )) //Subtypes from the above that actually should explode. diff --git a/code/modules/events/anomaly_bioscrambler.dm b/code/modules/events/anomaly_bioscrambler.dm new file mode 100644 index 00000000000000..7975b31c48a55c --- /dev/null +++ b/code/modules/events/anomaly_bioscrambler.dm @@ -0,0 +1,15 @@ +/datum/round_event_control/anomaly/anomaly_bioscrambler + name = "Anomaly: Bioscrambler" + typepath = /datum/round_event/anomaly/anomaly_bioscrambler + + min_players = 10 + max_occurrences = 5 + weight = 20 + +/datum/round_event/anomaly/anomaly_bioscrambler + startWhen = 10 + announceWhen = 3 + anomaly_path = /obj/effect/anomaly/bioscrambler + +/datum/round_event/anomaly/anomaly_bioscrambler/announce(fake) + priority_announce("Localized limb swapping agent. Expected location: [impact_area.name]. Wear biosuits to counter the effects. Calculated half-life of %9£$T$%F3 years", "Anomaly Alert") diff --git a/code/modules/events/anomaly_delimber.dm b/code/modules/events/anomaly_delimber.dm deleted file mode 100644 index 6d286dbb325924..00000000000000 --- a/code/modules/events/anomaly_delimber.dm +++ /dev/null @@ -1,15 +0,0 @@ -/datum/round_event_control/anomaly/anomaly_delimber - name = "Anomaly: Delimber" - typepath = /datum/round_event/anomaly/anomaly_delimber - - min_players = 10 - max_occurrences = 5 - weight = 20 - -/datum/round_event/anomaly/anomaly_delimber - startWhen = 10 - announceWhen = 3 - anomaly_path = /obj/effect/anomaly/delimber - -/datum/round_event/anomaly/anomaly_delimber/announce(fake) - priority_announce("Localized limb swapping agent. Expected location: [impact_area.name]. Wear biosuits to counter the effects. Calculated half-life of %9£$T$%F3 years", "Anomaly Alert") diff --git a/code/modules/events/anomaly_grav.dm b/code/modules/events/anomaly_grav.dm index c337b94b8a7f5d..575bdc92808c97 100644 --- a/code/modules/events/anomaly_grav.dm +++ b/code/modules/events/anomaly_grav.dm @@ -23,4 +23,4 @@ anomaly_path = /obj/effect/anomaly/grav/high /datum/round_event/anomaly/anomaly_grav/announce(fake) - priority_announce("Gravitational anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert") + priority_announce("Gravitational anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert" , ANNOUNCER_GRANOMALIES) diff --git a/code/modules/events/gravity_generator_blackout.dm b/code/modules/events/gravity_generator_blackout.dm new file mode 100644 index 00000000000000..39bd3c4850ad47 --- /dev/null +++ b/code/modules/events/gravity_generator_blackout.dm @@ -0,0 +1,26 @@ +/datum/round_event_control/gravity_generator_blackout + name = "Gravity Generator Blackout" + typepath = /datum/round_event/gravity_generator_blackout + weight = 30 + +/datum/round_event_control/gravity_generator_blackout/canSpawnEvent() + var/station_generator_exists = FALSE + for(var/obj/machinery/gravity_generator/main/the_generator in GLOB.machines) + if(is_station_level(the_generator.z)) + station_generator_exists = TRUE + + if(!station_generator_exists) + return FALSE + +/datum/round_event/gravity_generator_blackout + announceWhen = 1 + startWhen = 1 + announceChance = 33 + +/datum/round_event/gravity_generator_blackout/announce(fake) + priority_announce("Gravnospheric anomalies detected near [station_name()]. Manual reset of generators is required.", "Anomaly Alert", ANNOUNCER_GRANOMALIES) + +/datum/round_event/gravity_generator_blackout/start() + for(var/obj/machinery/gravity_generator/main/the_generator in GLOB.machines) + if(is_station_level(the_generator.z)) + the_generator.blackout() diff --git a/code/modules/events/immovable_rod.dm b/code/modules/events/immovable_rod.dm index 11da329dda50e8..e3db5cd2aa4919 100644 --- a/code/modules/events/immovable_rod.dm +++ b/code/modules/events/immovable_rod.dm @@ -212,7 +212,7 @@ In my current plan for it, 'solid' will be defined as anything with density == 1 if(istype(clong, /obj/effect/immovablerod)) visible_message(span_danger("[src] collides with [clong]! This cannot end well.")) var/datum/effect_system/fluid_spread/smoke/smoke = new - smoke.set_up(2, location = get_turf(src)) + smoke.set_up(2, holder = src, location = get_turf(src)) smoke.start() var/obj/singularity/bad_luck = new(get_turf(src)) bad_luck.energy = 800 diff --git a/code/modules/events/ion_storm.dm b/code/modules/events/ion_storm.dm index 2746e289c5361a..f92639cd6a71e9 100644 --- a/code/modules/events/ion_storm.dm +++ b/code/modules/events/ion_storm.dm @@ -41,14 +41,14 @@ var/message = ionMessage || generate_ion_law() if(message) if(prob(removeDontImproveChance)) - M.replace_random_law(message, list(LAW_INHERENT, LAW_SUPPLIED, LAW_ION)) + M.replace_random_law(message, list(LAW_INHERENT, LAW_SUPPLIED, LAW_ION), LAW_ION) else M.add_ion_law(message) if(prob(shuffleLawsChance)) M.shuffle_laws(list(LAW_INHERENT, LAW_SUPPLIED, LAW_ION)) - log_game("Ion storm changed laws of [key_name(M)] to [english_list(M.laws.get_law_list(TRUE, TRUE))]") + log_silicon("Ion storm changed laws of [key_name(M)] to [english_list(M.laws.get_law_list(TRUE, TRUE))]") M.post_lawchange() if(botEmagChance) diff --git a/code/modules/events/wisdomcow.dm b/code/modules/events/wisdomcow.dm index c04bb38f5e18ea..05acb794cc806f 100644 --- a/code/modules/events/wisdomcow.dm +++ b/code/modules/events/wisdomcow.dm @@ -9,6 +9,6 @@ /datum/round_event/wisdomcow/start() var/turf/targetloc = get_safe_random_station_turf() - new /mob/living/basic/cow/wisdom(targetloc) - do_smoke(DIAMOND_AREA(1), targetloc) + var/mob/living/basic/cow/wisdom/wise = new (targetloc) + do_smoke(1, holder = wise, location = targetloc) diff --git a/code/modules/events/wizard/aid.dm b/code/modules/events/wizard/aid.dm index d055cc7c3d12c6..92747d2cd76ef2 100644 --- a/code/modules/events/wizard/aid.dm +++ b/code/modules/events/wizard/aid.dm @@ -1,4 +1,5 @@ -//in this file: Various events that directly aid the wizard. This is the "lets entice the wizard to use summon events!" file. +// Various events that directly aid the wizard. +// This is the "lets entice the wizard to use summon events!" file. /datum/round_event_control/wizard/robelesscasting //EI NUDTH! name = "Robeless Casting" @@ -9,16 +10,19 @@ /datum/round_event/wizard/robelesscasting/start() - for(var/i in GLOB.mob_living_list) //Hey if a corgi has magic missle he should get the same benifit as anyone - var/mob/living/L = i - if(L.mind && L.mind.spell_list.len != 0) - var/spell_improved = FALSE - for(var/obj/effect/proc_holder/spell/S in L.mind.spell_list) - if(S.clothes_req) - S.clothes_req = 0 - spell_improved = TRUE - if(spell_improved) - to_chat(L, span_notice("You suddenly feel like you never needed those garish robes in the first place...")) + // Hey, if a corgi has magic missle, he should get the same benefit as anyone + for(var/mob/living/caster as anything in GLOB.mob_living_list) + if(!length(caster.actions)) + continue + + var/spell_improved = FALSE + for(var/datum/action/cooldown/spell/spell in caster.actions) + if(spell.spell_requirements & SPELL_REQUIRES_WIZARD_GARB) + spell.spell_requirements &= ~SPELL_REQUIRES_WIZARD_GARB + spell_improved = TRUE + + if(spell_improved) + to_chat(caster, span_notice("You suddenly feel like you never needed those garish robes in the first place...")) //--// @@ -30,29 +34,16 @@ earliest_start = 0 MINUTES /datum/round_event/wizard/improvedcasting/start() - for(var/i in GLOB.mob_living_list) - var/mob/living/L = i - if(L.mind && L.mind.spell_list.len != 0) - for(var/obj/effect/proc_holder/spell/S in L.mind.spell_list) - S.name = initial(S.name) - S.spell_level++ - if(S.spell_level >= 6 || S.charge_max <= 0) //Badmin checks, these should never be a problem in normal play - continue - if(S.level_max <= 0) - continue - S.charge_max = round(initial(S.charge_max) - S.spell_level * (initial(S.charge_max) - S.cooldown_min) / S.level_max) - if(S.charge_max < S.charge_counter) - S.charge_counter = S.charge_max - switch(S.spell_level) - if(1) - S.name = "Efficient [S.name]" - if(2) - S.name = "Quickened [S.name]" - if(3) - S.name = "Free [S.name]" - if(4) - S.name = "Instant [S.name]" - if(5) - S.name = "Ludicrous [S.name]" - - to_chat(L, span_notice("You suddenly feel more competent with your casting!")) + for(var/mob/living/caster as anything in GLOB.mob_living_list) + if(!length(caster.actions)) + continue + + var/upgraded_a_spell = FALSE + for(var/datum/action/cooldown/spell/spell in caster.actions) + // If improved casting has already boosted this spell further beyond, go no further + if(spell.spell_level >= spell.spell_max_level + 1) + continue + upgraded_a_spell = spell.level_spell(TRUE) + + if(upgraded_a_spell) + to_chat(caster, span_notice("You suddenly feel more competent with your casting!")) diff --git a/code/modules/events/wizard/curseditems.dm b/code/modules/events/wizard/curseditems.dm index cdd44547d11039..2384901ef29582 100644 --- a/code/modules/events/wizard/curseditems.dm +++ b/code/modules/events/wizard/curseditems.dm @@ -54,7 +54,7 @@ I.item_flags |= DROPDEL I.name = "cursed " + I.name - for(var/mob/living/carbon/human/H in GLOB.alive_mob_list) + for(var/mob/living/carbon/human/victim in GLOB.alive_mob_list) var/datum/effect_system/fluid_spread/smoke/smoke = new - smoke.set_up(0, location = H.loc) + smoke.set_up(0, holder = victim, location = victim.loc) smoke.start() diff --git a/code/modules/events/wizard/shuffle.dm b/code/modules/events/wizard/shuffle.dm index f8e37ee3a42c90..dce7d3fa20c8b5 100644 --- a/code/modules/events/wizard/shuffle.dm +++ b/code/modules/events/wizard/shuffle.dm @@ -24,15 +24,15 @@ shuffle_inplace(moblocs) shuffle_inplace(mobs) - for(var/mob/living/carbon/human/H in mobs) + for(var/mob/living/carbon/human/victim in mobs) if(!moblocs) break //locs aren't always unique, so this may come into play - do_teleport(H, moblocs[moblocs.len], channel = TELEPORT_CHANNEL_MAGIC) + do_teleport(victim, moblocs[moblocs.len], channel = TELEPORT_CHANNEL_MAGIC) moblocs.len -= 1 - for(var/mob/living/carbon/human/H in GLOB.alive_mob_list) + for(var/mob/living/carbon/human/victim in GLOB.alive_mob_list) var/datum/effect_system/fluid_spread/smoke/smoke = new - smoke.set_up(0, location = H.loc) + smoke.set_up(0, holder = victim, location = victim.loc) smoke.start() //---// @@ -58,15 +58,15 @@ shuffle_inplace(mobnames) shuffle_inplace(mobs) - for(var/mob/living/carbon/human/H in mobs) + for(var/mob/living/carbon/human/victim in mobs) if(!mobnames) break - H.real_name = mobnames[mobnames.len] + victim.real_name = mobnames[mobnames.len] mobnames.len -= 1 - for(var/mob/living/carbon/human/H in GLOB.alive_mob_list) + for(var/mob/living/carbon/human/victim in GLOB.alive_mob_list) var/datum/effect_system/fluid_spread/smoke/smoke = new - smoke.set_up(0, location = H.loc) + smoke.set_up(0, holder = victim, location = victim.loc) smoke.start() //---// @@ -79,26 +79,29 @@ earliest_start = 0 MINUTES /datum/round_event/wizard/shuffleminds/start() - var/list/mobs = list() + var/list/mobs_to_swap = list() - for(var/mob/living/carbon/human/H in GLOB.alive_mob_list) - if(H.stat || !H.mind || IS_WIZARD(H)) + for(var/mob/living/carbon/human/alive_human in GLOB.alive_mob_list) + if(alive_human.stat != CONSCIOUS || !alive_human.mind || IS_WIZARD(alive_human)) continue //the wizard(s) are spared on this one - mobs += H + mobs_to_swap += alive_human - if(!mobs) + if(!length(mobs_to_swap)) return - shuffle_inplace(mobs) + mobs_to_swap = shuffle(mobs_to_swap) - var/obj/effect/proc_holder/spell/pointed/mind_transfer/swapper = new - while(mobs.len > 1) - var/mob/living/carbon/human/H = pick(mobs) - mobs -= H - swapper.cast(list(H), mobs[mobs.len], TRUE) - mobs -= mobs[mobs.len] + var/datum/action/cooldown/spell/pointed/mind_transfer/swapper = new() - for(var/mob/living/carbon/human/H in GLOB.alive_mob_list) - var/datum/effect_system/fluid_spread/smoke/smoke = new - smoke.set_up(0, location = H.loc) + while(mobs_to_swap.len > 1) + var/mob/living/swap_to = pick_n_take(mobs_to_swap) + var/mob/living/swap_from = pick_n_take(mobs_to_swap) + + swapper.swap_minds(swap_to, swap_from) + + qdel(swapper) + + for(var/mob/living/carbon/human/alive_human in GLOB.alive_mob_list) + var/datum/effect_system/fluid_spread/smoke/smoke = new() + smoke.set_up(0, holder = alive_human, location = alive_human.loc) smoke.start() diff --git a/code/modules/experisci/experiment/experiments.dm b/code/modules/experisci/experiment/experiments.dm index 3645fed3161128..7805f01fedffbe 100644 --- a/code/modules/experisci/experiment/experiments.dm +++ b/code/modules/experisci/experiment/experiments.dm @@ -120,8 +120,8 @@ required_gas = /datum/gas/bz /datum/experiment/ordnance/gaseous/noblium - name = "Noblium Gas Shells" - description = "The delivery of Noblium gas into an area of operation might prove useful. Perform research and publish papers on this field." + name = "Hypernoblium Gas Shells" + description = "The delivery of Hypernoblium gas into an area of operation might prove useful. Perform research and publish papers on this field." gain = list(10,40,80) target_amount = list(15,55,250) experiment_proper = TRUE @@ -169,13 +169,13 @@ /datum/experiment/scanning/random/plants/wild name = "Wild Biomatter Mutation Sample" - description = "Due to a number of reasons, (Solar Rays, a diet consisting only of unstable mutagen, entropy) plants with lower levels of instability may occasionally mutate with little reason. Scan one of these samples for us." + description = "Due to a number of reasons, (Solar Rays, a diet consisting only of unstable mutagen, entropy) plants with lower levels of instability may occasionally mutate upon harvest. Scan one of these samples for us." performance_hint = "\"Wild\" mutations have been recorded to occur above 30 points of instability, while species mutations occur above 60 points of instability." total_requirement = 1 /datum/experiment/scanning/random/plants/traits name = "Unique Biomatter Mutation Sample" - description = "We here at centcom are on the look out for rare and exotic plants with unique properties to brag about to our shareholders. We're looking for a sample with a very specific genes currently." + description = "We here at CentCom are on the look out for rare and exotic plants with unique properties to brag about to our shareholders. We're looking for a sample with a very specific genes currently." performance_hint = "The wide varities of plants on station each carry various traits, some unique to them. Look for plants that may mutate into what we're looking for." total_requirement = 3 possible_plant_genes = list(/datum/plant_gene/trait/squash, /datum/plant_gene/trait/cell_charge, /datum/plant_gene/trait/glow/shadow, /datum/plant_gene/trait/teleport, /datum/plant_gene/trait/brewing, /datum/plant_gene/trait/juicing, /datum/plant_gene/trait/eyes, /datum/plant_gene/trait/sticky) diff --git a/code/modules/explorer_drone/exodrone.dm b/code/modules/explorer_drone/exodrone.dm index ff5fc05f40a032..357df208fd5439 100644 --- a/code/modules/explorer_drone/exodrone.dm +++ b/code/modules/explorer_drone/exodrone.dm @@ -418,7 +418,7 @@ GLOBAL_LIST_EMPTY(exodrone_launchers) */ /obj/machinery/exodrone_launcher/proc/launch_effect() playsound(src,'sound/effects/podwoosh.ogg',50, FALSE) - do_smoke(DIAMOND_AREA(1), get_turf(src)) + do_smoke(1, holder = src, location = get_turf(src)) /obj/machinery/exodrone_launcher/handle_atom_del(atom/A) if(A == fuel_canister) diff --git a/code/modules/fishing/admin.dm b/code/modules/fishing/admin.dm new file mode 100644 index 00000000000000..ad97ab890b41fd --- /dev/null +++ b/code/modules/fishing/admin.dm @@ -0,0 +1,75 @@ +// Helper tool to see fishing probabilities with different setups +/datum/admins/proc/fishing_calculator() + set name = "Fishing Calculator" + set category = "Debug" + + if(!check_rights(R_DEBUG)) + return + var/datum/fishing_calculator/ui = new(usr) + ui.ui_interact(usr) + +/datum/fishing_calculator + var/list/current_table + +/datum/fishing_calculator/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "FishingCalculator") + ui.open() + +/datum/fishing_calculator/ui_state(mob/user) + return GLOB.admin_state + +/datum/fishing_calculator/ui_close(mob/user) + qdel(src) + +/datum/fishing_calculator/ui_static_data(mob/user) + . = ..() + .["rod_types"] = typesof(/obj/item/fishing_rod) + .["hook_types"] = typesof(/obj/item/fishing_hook) + .["line_types"] = typesof(/obj/item/fishing_line) + var/list/spot_keys = list() + for(var/key in GLOB.preset_fish_sources) + spot_keys += key + .["spot_types"] = subtypesof(/datum/fish_source) + spot_keys + +/datum/fishing_calculator/ui_data(mob/user) + return list("info" = current_table) + +/datum/fishing_calculator/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + var/mob/user = usr + switch(action) + if("recalc") + var/rod_type = text2path(params["rod"]) + var/bait_type = text2path(params["bait"]) + var/hook_type = text2path(params["hook"]) + var/line_type = text2path(params["line"]) + var/spot_type = text2path(params["spot"]) || params["spot"] //can be also key from presets + + //validate here against nonsense values + var/datum/fish_source/spot + if(ispath(spot_type)) + spot = new spot_type + else + spot = GLOB.preset_fish_sources[spot_type] + + var/obj/item/fishing_rod/temporary_rod = new rod_type + if(bait_type) + temporary_rod.bait = new bait_type + if(hook_type) + temporary_rod.hook = new hook_type + if(line_type) + temporary_rod.line = new line_type + var/result_table = list() + var/modified_table = spot.get_modified_fish_table(temporary_rod,user) + for(var/result_type in spot.fish_table) // through this not modified to display 0 chance ones too + var/list/info = list() + info["result"] = result_type + info["weight"] = modified_table[result_type] || 0 + info["difficulty"] = spot.calculate_difficulty(result_type,temporary_rod, user) + info["count"] = spot.fish_counts[result_type] || "Infinite" + result_table += list(info) + current_table = result_table + qdel(temporary_rod) + return TRUE diff --git a/code/modules/aquarium/aquarium.dm b/code/modules/fishing/aquarium/aquarium.dm similarity index 100% rename from code/modules/aquarium/aquarium.dm rename to code/modules/fishing/aquarium/aquarium.dm diff --git a/code/modules/aquarium/aquarium_kit.dm b/code/modules/fishing/aquarium/aquarium_kit.dm similarity index 66% rename from code/modules/aquarium/aquarium_kit.dm rename to code/modules/fishing/aquarium/aquarium_kit.dm index f091a7c6f0509f..3221acce755454 100644 --- a/code/modules/aquarium/aquarium_kit.dm +++ b/code/modules/fishing/aquarium/aquarium_kit.dm @@ -1,4 +1,3 @@ - ///Fish feed can /obj/item/fish_feed name = "fish feed can" @@ -59,57 +58,6 @@ var/fish_type = pick(/obj/item/fish/dwarf_moonfish, /obj/item/fish/gunner_jellyfish, /obj/item/fish/needlefish, /obj/item/fish/armorfish) new fish_type(src) -///Book detailing where to get the fish and their properties. -/obj/item/book/fish_catalog - name = "Fish Encyclopedia" - desc = "Indexes all fish known to mankind (and related species)." - icon_state = "fishbook" - starting_content = "Lot of fish stuff" //book wrappers could use cleaning so this is not necessary - -/obj/item/book/fish_catalog/on_read(mob/user) - ui_interact(user) - -/obj/item/book/fish_catalog/ui_interact(mob/user, datum/tgui/ui) - . = ..() - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "FishCatalog", name) - ui.open() - -/obj/item/book/fish_catalog/ui_static_data(mob/user) - . = ..() - var/static/fish_info - if(!fish_info) - fish_info = list() - for(var/_fish_type in subtypesof(/obj/item/fish)) - var/obj/item/fish/fish = _fish_type - var/list/fish_data = list() - if(!initial(fish.show_in_catalog)) - continue - fish_data["name"] = initial(fish.name) - fish_data["desc"] = initial(fish.desc) - fish_data["fluid"] = initial(fish.required_fluid_type) - fish_data["temp_min"] = initial(fish.required_temperature_min) - fish_data["temp_max"] = initial(fish.required_temperature_max) - fish_data["icon"] = sanitize_css_class_name("[initial(fish.icon)][initial(fish.icon_state)]") - fish_data["color"] = initial(fish.color) - fish_data["source"] = initial(fish.available_in_random_cases) ? "[AQUARIUM_COMPANY] Fish Packs" : "Unknown" - var/datum/reagent/food_type = initial(fish.food) - if(food_type != /datum/reagent/consumable/nutriment) - fish_data["feed"] = initial(food_type.name) - else - fish_data["feed"] = "[AQUARIUM_COMPANY] Fish Feed" - fish_info += list(fish_data) - // TODO: Custom entries - - .["fish_info"] = fish_info - .["sponsored_by"] = AQUARIUM_COMPANY - -/obj/item/book/fish_catalog/ui_assets(mob/user) - return list( - get_asset_datum(/datum/asset/spritesheet/fish) - ) - /obj/item/aquarium_kit name = "DIY Aquarium Construction Kit" desc = "Everything you need to build your own aquarium. Raw materials sold separately." diff --git a/code/modules/fishing/bait.dm b/code/modules/fishing/bait.dm new file mode 100644 index 00000000000000..b67298fab9fea8 --- /dev/null +++ b/code/modules/fishing/bait.dm @@ -0,0 +1,35 @@ +/obj/item/bait_can + name = "can o bait" + desc = "there's a lot of them in there, getting them out takes a while though" + icon = 'icons/obj/fishing.dmi' + icon_state = "bait_can" + w_class = WEIGHT_CLASS_SMALL + /// Tracking until we can take out another bait item + COOLDOWN_DECLARE(bait_removal_cooldown) + /// What bait item it produces + var/bait_type + /// Time between bait retrievals + var/cooldown_time = 10 SECONDS + +/obj/item/bait_can/attack_self(mob/user, modifiers) + . = ..() + var/fresh_bait = retrieve_bait(user) + if(fresh_bait) + user.put_in_hands(fresh_bait) + +/obj/item/bait_can/proc/retrieve_bait(mob/user) + if(!COOLDOWN_FINISHED(src, bait_removal_cooldown)) + user.balloon_alert(user, "wait a bit") //I can't think of generic ic reason. + return + COOLDOWN_START(src, bait_removal_cooldown, cooldown_time) + return new bait_type(src) + +/obj/item/bait_can/worm + name = "can o' worm" + desc = "this can got worms." + bait_type = /obj/item/food/bait/worm + +/obj/item/bait_can/worm/premium + name = "can o' worm deluxe" + desc = "this can got fancy worms." + bait_type = /obj/item/food/bait/worm/premium diff --git a/code/modules/aquarium/fish.dm b/code/modules/fishing/fish/_fish.dm similarity index 58% rename from code/modules/aquarium/fish.dm rename to code/modules/fishing/fish/_fish.dm index 220918499aa5db..51990a0e3409d0 100644 --- a/code/modules/aquarium/fish.dm +++ b/code/modules/fishing/fish/_fish.dm @@ -64,6 +64,41 @@ var/in_stasis = FALSE + // Fishing related properties + + /// List of fishing trait types, these modify probabilty/difficulty depending on rod/user properties + var/list/fishing_traits = list() + + /// Fishing behaviour + var/fish_ai_type = FISH_AI_DUMB + + /// Base additive modifier to fishing difficulty + var/fishing_difficulty_modifier = 0 + + /** + * Bait identifiers that make catching this fish easier and more likely + * Bait identifiers: Path | Trait | list("Type"="Foodtype","Value"= Food Type Flag like [MEAT]) + */ + var/list/favorite_bait = list() + + /** + * Bait identifiers that make catching this fish harder and less likely + * Bait identifiers: Path | Trait | list("Type"="Foodtype","Value"= Food Type Flag like [MEAT]) + */ + var/list/disliked_bait = list() + + /// Size in centimeters + var/size = 50 + /// Average size for this fish type in centimeters. Will be used as gaussian distribution with 20% deviation for fishing, bought fish are always standard size + var/average_size = 50 + + /// Weight in grams + var/weight = 1000 + /// Average weight for this fish type in grams + var/average_weight = 1000 + + + /obj/item/fish/Initialize(mapload) . = ..() if(fillet_type) @@ -75,6 +110,24 @@ if(status != FISH_DEAD) START_PROCESSING(SSobj, src) + size = average_size + weight = average_weight + +/obj/item/fish/examine(mob/user) + . = ..() + // All spacemen have magic eyes of fish weight perception until fish scale (get it?) is implemented. + . += span_notice("It's [size] cm long.") + . += span_notice("It weighs [weight] g.") + +/obj/item/fish/proc/randomize_weight_and_size(modifier = 0) + var/size_deviation = 0.2 * average_size + var/size_mod = modifier * average_size + size = max(1,gaussian(average_size + size_mod, size_deviation)) + + var/weight_deviation = 0.2 * average_weight + var/weight_mod = modifier * average_weight + weight = max(1,gaussian(average_weight + weight_mod, weight_deviation)) + /obj/item/fish/Moved(atom/OldLoc, Dir) . = ..() check_environment_after_movement() @@ -123,7 +176,7 @@ if(QDELETED(src)) //we don't care anymore return // Apply/remove stasis as needed - if(HAS_TRAIT(loc, TRAIT_FISH_SAFE_STORAGE)) + if(loc && HAS_TRAIT(loc, TRAIT_FISH_SAFE_STORAGE)) enter_stasis() else if(in_stasis) exit_stasis() @@ -134,7 +187,7 @@ on_aquarium_insertion(loc) // Start flopping if outside of fish container - var/should_be_flopping = status == FISH_ALIVE && !HAS_TRAIT(loc,TRAIT_FISH_SAFE_STORAGE) && !in_aquarium + var/should_be_flopping = status == FISH_ALIVE && loc && !HAS_TRAIT(loc,TRAIT_FISH_SAFE_STORAGE) && !in_aquarium if(should_be_flopping) start_flopping() @@ -314,202 +367,4 @@ probability_table[argkey] = chance_table return pick_weight(probability_table[argkey]) -// Freshwater fish - -/obj/item/fish/goldfish - name = "goldfish" - desc = "Despite common belief, goldfish do not have three-second memories. They can actually remember things that happened up to three months ago." - icon_state = "goldfish" - sprite_width = 8 - sprite_height = 8 - - stable_population = 3 - -/obj/item/fish/angelfish - name = "angelfish" - desc = "Young Angelfish often live in groups, while adults prefer solitary life. They become territorial and aggressive toward other fish when they reach adulthood." - icon_state = "angelfish" - dedicated_in_aquarium_icon_state = "bigfish" - sprite_height = 7 - source_height = 7 - - stable_population = 3 - -/obj/item/fish/guppy - name = "guppy" - desc = "Guppy is also known as rainbow fish because of the brightly colored body and fins." - icon_state = "guppy" - dedicated_in_aquarium_icon_state = "fish_greyscale" - aquarium_vc_color = "#91AE64" - sprite_width = 8 - sprite_height = 5 - - stable_population = 6 - -/obj/item/fish/plasmatetra - name = "plasma tetra" - desc = "Due to their small size, tetras are prey to many predators in their watery world, including eels, crustaceans, and invertebrates." - icon_state = "plastetra" - dedicated_in_aquarium_icon_state = "fish_greyscale" - aquarium_vc_color = "#D30EB0" - - stable_population = 3 - -/obj/item/fish/catfish - name = "cory catfish" - desc = "A catfish has about 100,000 taste buds, and their bodies are covered with them to help detect chemicals present in the water and also to respond to touch." - icon_state = "catfish" - dedicated_in_aquarium_icon_state = "fish_greyscale" - aquarium_vc_color = "#907420" - - stable_population = 3 - -// Saltwater fish below - -/obj/item/fish/clownfish - name = "clownfish" - desc = "Clownfish catch prey by swimming onto the reef, attracting larger fish, and luring them back to the anemone. The anemone will sting and eat the larger fish, leaving the remains for the clownfish." - icon_state = "clownfish" - dedicated_in_aquarium_icon_state = "clownfish_small" - required_fluid_type = AQUARIUM_FLUID_SALTWATER - sprite_width = 8 - sprite_height = 5 - - stable_population = 4 - -/obj/item/fish/cardinal - name = "cardinalfish" - desc = "Cardinalfish are often found near sea urchins, where the fish hide when threatened." - icon_state = "cardinalfish" - dedicated_in_aquarium_icon_state = "fish_greyscale" - required_fluid_type = AQUARIUM_FLUID_SALTWATER - - stable_population = 4 - -/obj/item/fish/greenchromis - name = "green chromis" - desc = "The Chromis can vary in color from blue to green depending on the lighting and distance from the lights." - icon_state = "greenchromis" - dedicated_in_aquarium_icon_state = "fish_greyscale" - aquarium_vc_color = "#00ff00" - required_fluid_type = AQUARIUM_FLUID_SALTWATER - - - stable_population = 5 -/obj/item/fish/firefish - name = "firefish goby" - desc = "To communicate in the wild, the firefish uses its dorsal fin to alert others of potential danger." - icon_state = "firefish" - sprite_width = 6 - sprite_height = 5 - required_fluid_type = AQUARIUM_FLUID_SALTWATER - - stable_population = 3 - -/obj/item/fish/pufferfish - name = "pufferfish" - desc = "One Pufferfish contains enough toxins in its liver to kill 30 people." - icon_state = "pufferfish" - required_fluid_type = AQUARIUM_FLUID_SALTWATER - sprite_width = 8 - sprite_height = 8 - - stable_population = 3 - -/obj/item/fish/lanternfish - name = "lanternfish" - desc = "Typically found in areas below 6600 feet below the surface of the ocean, they live in complete darkness." - icon_state = "lanternfish" - required_fluid_type = AQUARIUM_FLUID_SALTWATER - random_case_rarity = FISH_RARITY_VERY_RARE - source_width = 28 - source_height = 21 - sprite_width = 8 - sprite_height = 8 - - stable_population = 3 - -//Tiziran Fish -/obj/item/fish/dwarf_moonfish - name = "dwarf moonfish" - desc = "Ordinarily in the wild, the Zagoskian moonfish is around the size of a tuna, however through selective breeding a smaller breed suitable for being kept as an aquarium pet has been created." - icon_state = "dwarf_moonfish" - required_fluid_type = AQUARIUM_FLUID_SALTWATER - stable_population = 2 - fillet_type = /obj/item/food/fishmeat/moonfish - -/obj/item/fish/gunner_jellyfish - name = "gunner jellyfish" - desc = "So called due to their resemblance to an artillery shell, the gunner jellyfish is native to Tizira, where it is enjoyed as a delicacy. Produces a mild hallucinogen that is destroyed by cooking." - icon_state = "gunner_jellyfish" - required_fluid_type = AQUARIUM_FLUID_SALTWATER - stable_population = 4 - fillet_type = /obj/item/food/fishmeat/gunner_jellyfish - -/obj/item/fish/needlefish - name = "needlefish" - desc = "A tiny, transparent fish which resides in large schools in the oceans of Tizira. A common food for other, larger fish." - icon_state = "needlefish" - required_fluid_type = AQUARIUM_FLUID_SALTWATER - stable_population = 12 - fillet_type = null - -/obj/item/fish/armorfish - name = "armorfish" - desc = "A small shellfish native to Tizira's oceans, known for its exceptionally hard shell. Consumed similarly to prawns." - icon_state = "armorfish" - required_fluid_type = AQUARIUM_FLUID_SALTWATER - stable_population = 10 - fillet_type = /obj/item/food/fishmeat/armorfish - -/obj/item/storage/box/fish_debug - name = "box full of fish" - -/obj/item/storage/box/fish_debug/PopulateContents() - for(var/fish_type in subtypesof(/obj/item/fish)) - new fish_type(src) - -/obj/item/fish/donkfish - name = "donk co. company patent donkfish" - desc = "A lab-grown donkfish. Its invention was an accident for the most part, as it was intended to be consumed in donk pockets. Unfortunately, it tastes horrible, so it has now become a pseudo-mascot." - icon_state = "donkfish" - random_case_rarity = FISH_RARITY_VERY_RARE - required_fluid_type = AQUARIUM_FLUID_FRESHWATER - stable_population = 4 - fillet_type = /obj/item/food/fishmeat/donkfish - -/obj/item/fish/emulsijack - name = "toxic emulsijack" - desc = "Ah, the terrifying emulsijack. Created in a laboratory, this slimey, scaleless fish emits an invisible toxin that emulsifies other fish for it to feed on. Its only real use is for completely ruining a tank." - icon_state = "emulsijack" - random_case_rarity = FISH_RARITY_GOOD_LUCK_FINDING_THIS - required_fluid_type = AQUARIUM_FLUID_ANADROMOUS - stable_population = 3 - -/obj/item/fish/emulsijack/process(delta_time = SSOBJ_DT) - var/emulsified = FALSE - var/obj/structure/aquarium/aquarium = loc - if(istype(aquarium)) - for(var/obj/item/fish/victim in aquarium) - if(istype(victim, /obj/item/fish/emulsijack)) - continue //no team killing - victim.adjust_health((victim.health - 3) * delta_time) //the victim may heal a bit but this will quickly kill - emulsified = TRUE - if(emulsified) - adjust_health((health + 3) * delta_time) - last_feeding = world.time //emulsijack feeds on the emulsion! - ..() - -/obj/item/fish/ratfish - name = "ratfish" - desc = "A rat exposed to the murky waters of maintenance too long. Any higher power, if it revealed itself, would state that the ratfish's continued existence is extremely unwelcome." - icon_state = "ratfish" - random_case_rarity = FISH_RARITY_RARE - required_fluid_type = AQUARIUM_FLUID_FRESHWATER - stable_population = 10 //set by New, but this is the default config value - fillet_type = /obj/item/food/meat/slab/human/mutant/zombie //eww... - -/obj/item/fish/ratfish/Initialize(mapload) - . = ..() - //stable pop reflects the config for how many mice migrate. powerful... - stable_population = CONFIG_GET(number/mice_roundstart) + diff --git a/code/modules/fishing/fish/fish_types.dm b/code/modules/fishing/fish/fish_types.dm new file mode 100644 index 00000000000000..f6e99c73586194 --- /dev/null +++ b/code/modules/fishing/fish/fish_types.dm @@ -0,0 +1,242 @@ +// Freshwater fish + +/obj/item/fish/goldfish + name = "goldfish" + desc = "Despite common belief, goldfish do not have three-second memories. They can actually remember things that happened up to three months ago." + icon_state = "goldfish" + sprite_width = 8 + sprite_height = 8 + stable_population = 3 + average_size = 30 + average_weight = 500 + favorite_bait = list(/obj/item/food/bait/worm) + +/obj/item/fish/angelfish + name = "angelfish" + desc = "Young Angelfish often live in groups, while adults prefer solitary life. They become territorial and aggressive toward other fish when they reach adulthood." + icon_state = "angelfish" + dedicated_in_aquarium_icon_state = "bigfish" + sprite_height = 7 + source_height = 7 + average_size = 30 + average_weight = 500 + stable_population = 3 + +/obj/item/fish/guppy + name = "guppy" + desc = "Guppy is also known as rainbow fish because of the brightly colored body and fins." + icon_state = "guppy" + dedicated_in_aquarium_icon_state = "fish_greyscale" + aquarium_vc_color = "#91AE64" + sprite_width = 8 + sprite_height = 5 + average_size = 30 + average_weight = 500 + stable_population = 6 + +/obj/item/fish/plasmatetra + name = "plasma tetra" + desc = "Due to their small size, tetras are prey to many predators in their watery world, including eels, crustaceans, and invertebrates." + icon_state = "plastetra" + dedicated_in_aquarium_icon_state = "fish_greyscale" + aquarium_vc_color = "#D30EB0" + average_size = 30 + average_weight = 500 + stable_population = 3 + +/obj/item/fish/catfish + name = "cory catfish" + desc = "A catfish has about 100,000 taste buds, and their bodies are covered with them to help detect chemicals present in the water and also to respond to touch." + icon_state = "catfish" + dedicated_in_aquarium_icon_state = "fish_greyscale" + aquarium_vc_color = "#907420" + average_size = 100 + average_weight = 2000 + stable_population = 3 + favorite_bait = list( + list( + "Type" = "Foodtype", + "Value" = JUNKFOOD + ) + ) + +// Saltwater fish below + +/obj/item/fish/clownfish + name = "clownfish" + desc = "Clownfish catch prey by swimming onto the reef, attracting larger fish, and luring them back to the anemone. The anemone will sting and eat the larger fish, leaving the remains for the clownfish." + icon_state = "clownfish" + dedicated_in_aquarium_icon_state = "clownfish_small" + required_fluid_type = AQUARIUM_FLUID_SALTWATER + sprite_width = 8 + sprite_height = 5 + average_size = 30 + average_weight = 500 + stable_population = 4 + + fishing_traits = list(/datum/fishing_trait/picky_eater) + +/obj/item/fish/cardinal + name = "cardinalfish" + desc = "Cardinalfish are often found near sea urchins, where the fish hide when threatened." + icon_state = "cardinalfish" + dedicated_in_aquarium_icon_state = "fish_greyscale" + required_fluid_type = AQUARIUM_FLUID_SALTWATER + average_size = 30 + average_weight = 500 + stable_population = 4 + fishing_traits = list(/datum/fishing_trait/vegan) + +/obj/item/fish/greenchromis + name = "green chromis" + desc = "The Chromis can vary in color from blue to green depending on the lighting and distance from the lights." + icon_state = "greenchromis" + dedicated_in_aquarium_icon_state = "fish_greyscale" + aquarium_vc_color = "#00ff00" + required_fluid_type = AQUARIUM_FLUID_SALTWATER + average_size = 30 + average_weight = 500 + stable_population = 5 + + fishing_difficulty_modifier = 5 // Bit harder + +/obj/item/fish/firefish + name = "firefish goby" + desc = "To communicate in the wild, the firefish uses its dorsal fin to alert others of potential danger." + icon_state = "firefish" + sprite_width = 6 + sprite_height = 5 + required_fluid_type = AQUARIUM_FLUID_SALTWATER + average_size = 30 + average_weight = 500 + stable_population = 3 + disliked_bait = list(/obj/item/food/bait/worm, /obj/item/food/bait/doughball) + fish_ai_type = FISH_AI_ZIPPY + +/obj/item/fish/pufferfish + name = "pufferfish" + desc = "One Pufferfish contains enough toxins in its liver to kill 30 people." + icon_state = "pufferfish" + required_fluid_type = AQUARIUM_FLUID_SALTWATER + sprite_width = 8 + sprite_height = 8 + average_size = 60 + average_weight = 1000 + stable_population = 3 + + fishing_traits = list(/datum/fishing_trait/heavy) + +/obj/item/fish/lanternfish + name = "lanternfish" + desc = "Typically found in areas below 6600 feet below the surface of the ocean, they live in complete darkness." + icon_state = "lanternfish" + required_fluid_type = AQUARIUM_FLUID_SALTWATER + random_case_rarity = FISH_RARITY_VERY_RARE + source_width = 28 + source_height = 21 + sprite_width = 8 + sprite_height = 8 + average_size = 100 + average_weight = 1500 + stable_population = 3 + + fishing_traits = list(/datum/fishing_trait/nocturnal) + +//Tiziran Fish +/obj/item/fish/dwarf_moonfish + name = "dwarf moonfish" + desc = "Ordinarily in the wild, the Zagoskian moonfish is around the size of a tuna, however through selective breeding a smaller breed suitable for being kept as an aquarium pet has been created." + icon_state = "dwarf_moonfish" + required_fluid_type = AQUARIUM_FLUID_SALTWATER + stable_population = 2 + fillet_type = /obj/item/food/fishmeat/moonfish + average_size = 100 + average_weight = 2000 + +/obj/item/fish/gunner_jellyfish + name = "gunner jellyfish" + desc = "So called due to their resemblance to an artillery shell, the gunner jellyfish is native to Tizira, where it is enjoyed as a delicacy. Produces a mild hallucinogen that is destroyed by cooking." + icon_state = "gunner_jellyfish" + required_fluid_type = AQUARIUM_FLUID_SALTWATER + stable_population = 4 + fillet_type = /obj/item/food/fishmeat/gunner_jellyfish + +/obj/item/fish/needlefish + name = "needlefish" + desc = "A tiny, transparent fish which resides in large schools in the oceans of Tizira. A common food for other, larger fish." + icon_state = "needlefish" + required_fluid_type = AQUARIUM_FLUID_SALTWATER + stable_population = 12 + fillet_type = null + average_size = 30 + average_weight = 300 + fishing_traits = list(/datum/fishing_trait/carnivore) + +/obj/item/fish/armorfish + name = "armorfish" + desc = "A small shellfish native to Tizira's oceans, known for its exceptionally hard shell. Consumed similarly to prawns." + icon_state = "armorfish" + required_fluid_type = AQUARIUM_FLUID_SALTWATER + stable_population = 10 + fillet_type = /obj/item/food/fishmeat/armorfish + fish_ai_type = FISH_AI_SLOW + +/obj/item/storage/box/fish_debug + name = "box full of fish" + +/obj/item/storage/box/fish_debug/PopulateContents() + for(var/fish_type in subtypesof(/obj/item/fish)) + new fish_type(src) + +/obj/item/fish/donkfish + name = "donk co. company patent donkfish" + desc = "A lab-grown donkfish. Its invention was an accident for the most part, as it was intended to be consumed in donk pockets. Unfortunately, it tastes horrible, so it has now become a pseudo-mascot." + icon_state = "donkfish" + random_case_rarity = FISH_RARITY_VERY_RARE + required_fluid_type = AQUARIUM_FLUID_FRESHWATER + stable_population = 4 + fillet_type = /obj/item/food/fishmeat/donkfish + +/obj/item/fish/emulsijack + name = "toxic emulsijack" + desc = "Ah, the terrifying emulsijack. Created in a laboratory, this slimey, scaleless fish emits an invisible toxin that emulsifies other fish for it to feed on. Its only real use is for completely ruining a tank." + icon_state = "emulsijack" + random_case_rarity = FISH_RARITY_GOOD_LUCK_FINDING_THIS + required_fluid_type = AQUARIUM_FLUID_ANADROMOUS + stable_population = 3 + +/obj/item/fish/emulsijack/process(delta_time) + var/emulsified = FALSE + var/obj/structure/aquarium/aquarium = loc + if(istype(aquarium)) + for(var/obj/item/fish/victim in aquarium) + if(istype(victim, /obj/item/fish/emulsijack)) + continue //no team killing + victim.adjust_health((victim.health - 3) * delta_time) //the victim may heal a bit but this will quickly kill + emulsified = TRUE + if(emulsified) + adjust_health((health + 3) * delta_time) + last_feeding = world.time //emulsijack feeds on the emulsion! + ..() + +/obj/item/fish/ratfish + name = "ratfish" + desc = "A rat exposed to the murky waters of maintenance too long. Any higher power, if it revealed itself, would state that the ratfish's continued existence is extremely unwelcome." + icon_state = "ratfish" + random_case_rarity = FISH_RARITY_RARE + required_fluid_type = AQUARIUM_FLUID_FRESHWATER + stable_population = 10 //set by New, but this is the default config value + fillet_type = /obj/item/food/meat/slab/human/mutant/zombie //eww... + + fish_ai_type = FISH_AI_ZIPPY + favorite_bait = list( + list( + "Type" = "Foodtype", + "Value" = DAIRY + ) + ) + +/obj/item/fish/ratfish/Initialize(mapload) + . = ..() + //stable pop reflects the config for how many mice migrate. powerful... + stable_population = CONFIG_GET(number/mice_roundstart) diff --git a/code/modules/fishing/fish_catalog.dm b/code/modules/fishing/fish_catalog.dm new file mode 100644 index 00000000000000..396d112bd43111 --- /dev/null +++ b/code/modules/fishing/fish_catalog.dm @@ -0,0 +1,109 @@ +///Book detailing where to get the fish and their properties. +/obj/item/book/fish_catalog + name = "Fish Encyclopedia" + desc = "Indexes all fish known to mankind (and related species)." + icon_state = "fishbook" + starting_content = "Lot of fish stuff" //book wrappers could use cleaning so this is not necessary + +/obj/item/book/fish_catalog/on_read(mob/user) + ui_interact(user) + +/obj/item/book/fish_catalog/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "FishCatalog", name) + ui.open() + +/obj/item/book/fish_catalog/ui_static_data(mob/user) + . = ..() + var/static/fish_info + if(!fish_info) + fish_info = list() + for(var/_fish_type as anything in subtypesof(/obj/item/fish)) + var/obj/item/fish/fish = _fish_type + var/list/fish_data = list() + if(!initial(fish.show_in_catalog)) + continue + fish_data["name"] = initial(fish.name) + fish_data["desc"] = initial(fish.desc) + fish_data["fluid"] = initial(fish.required_fluid_type) + fish_data["temp_min"] = initial(fish.required_temperature_min) + fish_data["temp_max"] = initial(fish.required_temperature_max) + fish_data["icon"] = sanitize_css_class_name("[initial(fish.icon)][initial(fish.icon_state)]") + fish_data["color"] = initial(fish.color) + fish_data["source"] = initial(fish.available_in_random_cases) ? "[AQUARIUM_COMPANY] Fish Packs" : "Unknown" + fish_data["size"] = initial(fish.average_size) + fish_data["weight"] = initial(fish.average_weight) + var/datum/reagent/food_type = initial(fish.food) + if(food_type != /datum/reagent/consumable/nutriment) + fish_data["feed"] = initial(food_type.name) + else + fish_data["feed"] = "[AQUARIUM_COMPANY] Fish Feed" + fish_data["fishing_tips"] = build_fishing_tips(fish) + fish_info += list(fish_data) + // TODO: Custom entries for unusual stuff + + .["fish_info"] = fish_info + .["sponsored_by"] = AQUARIUM_COMPANY + +/obj/item/book/proc/bait_description(bait) + if(ispath(bait)) + var/obj/bait_item = bait + return initial(bait_item.name) + if(islist(bait)) + var/list/special_identifier = bait + switch(special_identifier["Type"]) + if("Foodtype") + return jointext(bitfield_to_list(special_identifier["Value"], FOOD_FLAGS_IC),",") + else + stack_trace("Unknown bait identifier in fish favourite/disliked list") + return "SOMETHING VERY WEIRD" + else + //Here we handle descriptions of traits fish use as qualifiers + return "something special" + +/obj/item/book/fish_catalog/proc/build_fishing_tips(fish_type) + var/obj/item/fish/fishy = fish_type + . = list() + //// Where can it be found - iterate fish sources, how should this handle key + var/list/spot_descriptions = list() + for(var/datum/fish_source/fishing_spot_type as anything in subtypesof(/datum/fish_source)) + var/datum/fish_source/temp = new fishing_spot_type + if((fish_type in temp.fish_table) && temp.catalog_description) + spot_descriptions += temp.catalog_description + .["spots"] = english_list(spot_descriptions, nothing_text = "Unknown") + ///Difficulty descriptor + switch(initial(fishy.fishing_difficulty_modifier)) + if(-INFINITY to 10) + .["difficulty"] = "Easy" + if(20 to 30) + .["difficulty"] = "Medium" + else + .["difficulty"] = "Hard" + var/list/fish_list_properties = collect_fish_properties() + var/list/fav_bait = fish_list_properties[fishy][NAMEOF(fishy, favorite_bait)] + var/list/disliked_bait = fish_list_properties[fishy][NAMEOF(fishy, disliked_bait)] + var/list/bait_list = list() + // Favourite/Disliked bait + for(var/bait_type_or_trait in fav_bait) + bait_list += bait_description(bait_type_or_trait) + .["favorite_bait"] = english_list(bait_list, nothing_text = "None") + bait_list.Cut() + for(var/bait_type_or_trait in disliked_bait) + bait_list += bait_description(bait_type_or_trait) + .["disliked_bait"] = english_list(bait_list, nothing_text = "None") + // Fish traits description + var/list/trait_descriptions = list() + var/list/fish_traits = fish_list_properties[fishy][NAMEOF(fishy, fishing_traits)] + for(var/fish_trait in fish_traits) + var/datum/fishing_trait/trait = fish_trait + trait_descriptions += initial(trait.catalog_description) + if(!length(trait_descriptions)) + trait_descriptions += "This fish exhibits no special behavior." + .["traits"] = trait_descriptions + return . + +/obj/item/book/fish_catalog/ui_assets(mob/user) + return list( + get_asset_datum(/datum/asset/spritesheet/fish) + ) diff --git a/code/modules/fishing/fishing_equipment.dm b/code/modules/fishing/fishing_equipment.dm new file mode 100644 index 00000000000000..6ad286c5285c6d --- /dev/null +++ b/code/modules/fishing/fishing_equipment.dm @@ -0,0 +1,102 @@ +// Reels + +/obj/item/fishing_line + name = "fishing line reel" + desc = "simple fishing line" + icon = 'icons/obj/fishing.dmi' + icon_state = "reel_blue" + var/fishing_line_traits = NONE + /// Color of the fishing line + var/line_color = "#808080" + +/obj/item/fishing_line/reinforced + name = "reinforced fishing line reel" + desc = "essential for fishing in extreme environments" + icon_state = "reel_green" + fishing_line_traits = FISHING_LINE_REINFORCED + line_color = "#2b9c2b" + +/obj/item/fishing_line/cloaked + name = "cloaked fishing line reel" + desc = "even harder to notice than the common variety" + icon_state = "reel_white" + fishing_line_traits = FISHING_LINE_CLOAKED + line_color = "#82cfdd" + +/obj/item/fishing_line/bouncy + name = "flexible fishing line reel" + desc = "this specialized line is much harder to snap" + icon_state = "reel_red" + fishing_line_traits = FISHING_LINE_BOUNCY + line_color = "#99313f" + +// Hooks + +/obj/item/fishing_hook + name = "simple fishing hook" + desc = "a simple fishing hook." + icon = 'icons/obj/fishing.dmi' + icon_state = "hook" + w_class = WEIGHT_CLASS_TINY + + var/fishing_hook_traits = NONE + // icon state added to main rod icon when this hook is equipped + var/rod_overlay_icon_state = "hook_overlay" + +/obj/item/fishing_hook/magnet + name = "magnetic hook" + desc = "won't make catching fish any easier but might help with looking for other things" + icon_state = "treasure" + fishing_hook_traits = FISHING_HOOK_MAGNETIC + rod_overlay_icon_state = "hook_treasure_overlay" + +/obj/item/fishing_hook/shiny + name = "shiny lure hook" + icon_state = "gold_shiny" + fishing_hook_traits = FISHING_HOOK_SHINY + rod_overlay_icon_state = "hook_shiny_overlay" + +/obj/item/fishing_hook/weighted + name = "weighted hook" + icon_state = "weighted" + fishing_hook_traits = FISHING_HOOK_WEIGHTED + rod_overlay_icon_state = "hook_weighted_overlay" + + +/obj/item/storage/toolbox/fishing + name = "fishing toolbox" + desc = "contains everything you need for your fishing trip" + icon_state = "fishing" + inhand_icon_state = "artistic_toolbox" + material_flags = NONE + +/obj/item/storage/toolbox/ComponentInitialize() + . = ..() + // Can hold fishing rod despite the size + var/static/list/exception_cache = typecacheof(/obj/item/fishing_rod) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) + STR.exception_hold = exception_cache + +/obj/item/storage/toolbox/fishing/PopulateContents() + new /obj/item/bait_can/worm(src) + new /obj/item/fishing_rod(src) + new /obj/item/fishing_hook(src) + new /obj/item/fishing_line(src) + +/obj/item/storage/box/fishing_hooks + name = "fishing hook set" + +/obj/item/storage/box/fishing_hooks/PopulateContents() + . = ..() + new /obj/item/fishing_hook/magnet(src) + new /obj/item/fishing_hook/shiny(src) + new /obj/item/fishing_hook/weighted(src) + +/obj/item/storage/box/fishing_lines + name = "fishing line set" + +/obj/item/storage/box/fishing_lines/PopulateContents() + . = ..() + new /obj/item/fishing_line/bouncy(src) + new /obj/item/fishing_line/reinforced(src) + new /obj/item/fishing_line/cloaked(src) diff --git a/code/modules/fishing/fishing_minigame.dm b/code/modules/fishing/fishing_minigame.dm new file mode 100644 index 00000000000000..ce91cbf033217f --- /dev/null +++ b/code/modules/fishing/fishing_minigame.dm @@ -0,0 +1,215 @@ +// Lure bobbing +#define WAIT_PHASE 1 +// Click now to start tgui part +#define BITING_PHASE 2 +// UI minigame phase +#define MINIGAME_PHASE 3 +// Shortest time the minigame can be won +#define MINIMUM_MINIGAME_DURATION 140 + +/datum/fishing_challenge + /// When the ui minigame phase started + var/start_time + /// Is it finished (either by win/lose or window closing) + var/completed = FALSE + /// Fish AI type to use + var/fish_ai = FISH_AI_DUMB + /// Rule modifiers (eg weighted bait) + var/list/special_effects = list() + /// Did the game get past the baiting phase, used to track if bait should be consumed afterwards + var/bait_taken = FALSE + /// Result path + var/reward_path = FISHING_DUD + /// Minigame difficulty + var/difficulty = FISHING_DEFAULT_DIFFICULTY + // Current phase + var/phase = WAIT_PHASE + // Timer for the next phase + var/next_phase_timer + /// Fishing mob + var/mob/user + /// Rod that is used for the challenge + var/obj/item/fishing_rod/used_rod + /// Lure visual + var/obj/effect/fishing_lure/lure + /// Background image from /datum/asset/simple/fishing_minigame + var/background = "default" + + /// Max distance we can move from the spot + var/max_distance = 5 + + /// Fishing line visual + var/datum/beam/fishing_line + +/datum/fishing_challenge/New(atom/spot, reward_path, obj/item/fishing_rod/rod, mob/user) + src.user = user + src.reward_path = reward_path + src.used_rod = rod + lure = new(get_turf(spot)) + /// Fish minigame properties + if(ispath(reward_path,/obj/item/fish)) + var/obj/item/fish/fish = reward_path + fish_ai = initial(fish.fish_ai_type) + // Apply fishing trait modifiers + var/list/fish_list_properties = collect_fish_properties() + var/list/fish_traits = fish_list_properties[fish][NAMEOF(fish, fishing_traits)] + for(var/fish_trait in fish_traits) + var/datum/fishing_trait/trait = new fish_trait + special_effects += trait.minigame_mod(rod, user) + /// Enable special parameters + if(rod.line) + if(rod.line.fishing_line_traits & FISHING_LINE_BOUNCY) + special_effects += FISHING_MINIGAME_RULE_LIMIT_LOSS + if(rod.hook) + if(rod.hook.fishing_hook_traits & FISHING_HOOK_WEIGHTED) + special_effects += FISHING_MINIGAME_RULE_WEIGHTED_BAIT + +/datum/fishing_challenge/Destroy(force, ...) + if(!completed) + complete(win = FALSE) + if(fishing_line) + QDEL_NULL(fishing_line) + if(lure) + QDEL_NULL(lure) + . = ..() + +/datum/fishing_challenge/proc/start(mob/user) + /// Create fishing line visuals + fishing_line = used_rod.create_fishing_line(lure, target_py = 5) + // If fishing line breaks los / rod gets dropped / deleted + RegisterSignal(fishing_line, COMSIG_FISHING_LINE_SNAPPED, .proc/interrupt) + ADD_TRAIT(user, TRAIT_GONE_FISHING, REF(src)) + SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "fishing", /datum/mood_event/fishing) + RegisterSignal(user, COMSIG_MOB_CLICKON, .proc/handle_click) + start_baiting_phase() + to_chat(user, span_notice("You start fishing...")) + playsound(lure, 'sound/effects/splash.ogg', 100) + +/datum/fishing_challenge/proc/handle_click() + if(phase == WAIT_PHASE) //Reset wait + lure.balloon_alert(user, "miss!") + start_baiting_phase() + else if(phase == BITING_PHASE) + start_minigame_phase() + return COMSIG_MOB_CANCEL_CLICKON + +/datum/fishing_challenge/proc/check_distance() + SIGNAL_HANDLER + if(get_dist(user,lure) > max_distance) + interrupt() + +/// Challenge interrupted by something external +/datum/fishing_challenge/proc/interrupt() + SIGNAL_HANDLER + if(!completed) + complete(FALSE) + +/datum/fishing_challenge/proc/complete(win = FALSE, perfect_win = FALSE) + deltimer(next_phase_timer) + completed = TRUE + if(user) + UnregisterSignal(user, list(COMSIG_MOB_CLICKON, COMSIG_MOVABLE_MOVED)) + REMOVE_TRAIT(user, TRAIT_GONE_FISHING, REF(src)) + if(used_rod) + UnregisterSignal(used_rod, COMSIG_ITEM_DROPPED) + if(phase == MINIGAME_PHASE) + used_rod.consume_bait() + if(win) + // validate timings to have at least basic abuse prevention, though it's kinda impossible task here + // 140 from minimum completion bar fill time + var/minimum_time = start_time + MINIMUM_MINIGAME_DURATION + if(world.time < minimum_time) + win = FALSE + stack_trace("Fishing minimum time check failed") + if(win) + if(reward_path != FISHING_DUD) + playsound(lure, 'sound/effects/bigsplash.ogg', 100) + else + user.balloon_alert(user, "it got away") + SEND_SIGNAL(src, COMSIG_FISHING_CHALLENGE_COMPLETED, user, win, perfect_win) + qdel(src) + +/datum/fishing_challenge/proc/start_baiting_phase() + deltimer(next_phase_timer) + phase = WAIT_PHASE + //Bobbing animation + animate(lure, pixel_y = 1, time = 1 SECONDS, loop = -1, flags = ANIMATION_RELATIVE) + animate(pixel_y = -1, time = 1 SECONDS, flags = ANIMATION_RELATIVE) + //Setup next phase + var/wait_time = rand(1 SECONDS, 30 SECONDS) + next_phase_timer = addtimer(CALLBACK(src, .proc/start_biting_phase), wait_time, TIMER_STOPPABLE) + +/datum/fishing_challenge/proc/start_biting_phase() + phase = BITING_PHASE + // Trashing animation + playsound(lure, 'sound/effects/fish_splash.ogg', 100) + lure.balloon_alert(user, "!!!") + animate(lure, pixel_y = 3, time = 5, loop = -1, flags = ANIMATION_RELATIVE) + animate(pixel_y = -3, time = 5, flags = ANIMATION_RELATIVE) + // Setup next phase + var/wait_time = rand(3 SECONDS, 6 SECONDS) + next_phase_timer = addtimer(CALLBACK(src, .proc/start_baiting_phase), wait_time, TIMER_STOPPABLE) + +/datum/fishing_challenge/proc/start_minigame_phase() + phase = MINIGAME_PHASE + deltimer(next_phase_timer) + start_time = world.time + ui_interact(user) + +/datum/fishing_challenge/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "Fishing") + ui.set_autoupdate(FALSE) + ui.set_mouse_hook(TRUE) + ui.open() + +/datum/fishing_challenge/ui_host(mob/user) + return lure //Could be the target really + +// Manually closing the ui is treated as lose +/datum/fishing_challenge/ui_close(mob/user) + . = ..() + if(!completed) + complete(FALSE) + +/datum/fishing_challenge/ui_static_data(mob/user) + . = ..() + .["difficulty"] = max(1,min(difficulty,100)) + .["fish_ai"] = fish_ai + .["special_effects"] = special_effects + .["background_image"] = background + +/datum/fishing_challenge/ui_assets(mob/user) + return list(get_asset_datum(/datum/asset/simple/fishing_minigame)) //preset screens + +/datum/fishing_challenge/ui_status(mob/user, datum/ui_state/state) + return min( + get_dist(user, lure) > max_distance ? UI_CLOSE : UI_INTERACTIVE, + ui_status_user_has_free_hands(user), + ui_status_user_is_abled(user, lure), + ) + +/datum/fishing_challenge/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + if(.) + return + + if(phase != MINIGAME_PHASE) + return + + switch(action) + if("win") + complete(win = TRUE, perfect_win = params["perfect"]) + if("lose") + complete(win = FALSE) + +/// The visual that appears over the fishing spot +/obj/effect/fishing_lure + icon = 'icons/obj/fishing.dmi' + icon_state = "lure_idle" + +#undef WAIT_PHASE +#undef BITING_PHASE +#undef MINIGAME_PHASE +#undef MINIMUM_MINIGAME_DURATION diff --git a/code/modules/fishing/fishing_portal_machine.dm b/code/modules/fishing/fishing_portal_machine.dm new file mode 100644 index 00000000000000..3fc6b0eb938a6d --- /dev/null +++ b/code/modules/fishing/fishing_portal_machine.dm @@ -0,0 +1,48 @@ +/obj/machinery/fishing_portal_generator + name = "fish-porter 3000" + desc = "fishing anywhere, anytime, anyway what was i talking about" + + icon = 'icons/obj/fishing.dmi' + icon_state = "portal_off" + + idle_power_usage = 0 + active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 2 + + anchored = FALSE + density = TRUE + + var/fishing_source = /datum/fish_source/portal + var/datum/component/fishing_spot/active + +/obj/machinery/fishing_portal_generator/wrench_act(mob/living/user, obj/item/tool) + . = ..() + default_unfasten_wrench(user, tool) + return TOOL_ACT_TOOLTYPE_SUCCESS + +/obj/machinery/fishing_portal_generator/interact(mob/user, special_state) + . = ..() + if(active) + deactivate() + else + activate() + +/obj/machinery/fishing_portal_generator/update_icon(updates) + . = ..() + if(active) + icon_state = "portal_on" + else + icon_state = "portal_off" + +/obj/machinery/fishing_portal_generator/proc/activate() + active = AddComponent(/datum/component/fishing_spot, fishing_source) + use_power = ACTIVE_POWER_USE + update_icon() + +/obj/machinery/fishing_portal_generator/proc/deactivate() + QDEL_NULL(active) + use_power = IDLE_POWER_USE + update_icon() + +/obj/machinery/fishing_portal_generator/on_set_is_operational(old_value) + if(old_value) + deactivate() diff --git a/code/modules/fishing/fishing_rod.dm b/code/modules/fishing/fishing_rod.dm new file mode 100644 index 00000000000000..66700957e7a97a --- /dev/null +++ b/code/modules/fishing/fishing_rod.dm @@ -0,0 +1,484 @@ +#define ROD_SLOT_BAIT "bait" +#define ROD_SLOT_LINE "line" +#define ROD_SLOT_HOOK "hook" + +/obj/item/fishing_rod + name = "fishing rod" + desc = "You can fish with this." + icon = 'icons/obj/fishing.dmi' + icon_state = "fishing_rod" + lefthand_file = 'icons/mob/inhands/equipment/fishing_rod_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/fishing_rod_righthand.dmi' + inhand_icon_state = "rod" + inhand_x_dimension = 64 + inhand_y_dimension = 64 + force = 8 + w_class = WEIGHT_CLASS_HUGE + + /// How far can you cast this + var/cast_range = 5 + /// Fishing minigame difficulty modifier (additive) + var/difficulty_modifier = 0 + /// Explaination of rod functionality shown in the ui + var/ui_description = "A classic fishing rod, with no special qualities." + + var/obj/item/bait + var/obj/item/fishing_line/line + var/obj/item/fishing_hook/hook + + /// Currently hooked item for item reeling + var/obj/item/currently_hooked_item + + /// Fishing line visual for the hooked item + var/datum/beam/hooked_item_fishing_line + + /// Are we currently casting + var/casting = FALSE + + /// List of fishing line beams + var/list/fishing_lines = list() + + var/default_line_color = "gray" + +/obj/item/fishing_rod/Initialize(mapload) + . = ..() + register_context() + register_item_context() + +/obj/item/fishing_rod/add_context(atom/source, list/context, obj/item/held_item, mob/user) + if(src == held_item) + if(currently_hooked_item) + context[SCREENTIP_CONTEXT_LMB] = "Reel in" + context[SCREENTIP_CONTEXT_RMB] = "Modify" + return CONTEXTUAL_SCREENTIP_SET + return NONE + +/obj/item/fishing_rod/add_item_context(obj/item/source, list/context, atom/target, mob/living/user) + . = ..() + if(currently_hooked_item) + context[SCREENTIP_CONTEXT_LMB] = "Reel in" + return CONTEXTUAL_SCREENTIP_SET + return NONE + +/obj/item/fishing_rod/Destroy(force) + . = ..() + //Remove any leftover fishing lines + QDEL_LIST(fishing_lines) + + +/// Catch weight modifier for the given fish_type (or FISHING_DUD), additive +/obj/item/fishing_rod/proc/fish_bonus(fish_type) + return 0 + +/obj/item/fishing_rod/proc/consume_bait() + if(bait) + QDEL_NULL(bait) + update_icon() + +/obj/item/fishing_rod/interact(mob/user) + if(currently_hooked_item) + reel(user) + +/obj/item/fishing_rod/proc/reel(mob/user) + //Could use sound here for feedback + if(do_after(user, 1 SECONDS, currently_hooked_item)) + // Should probably respect and used force move later + step_towards(currently_hooked_item, get_turf(src)) + if(get_dist(currently_hooked_item,get_turf(src)) < 1) + clear_hooked_item() + +/obj/item/fishing_rod/attack_self_secondary(mob/user, modifiers) + . = ..() + ui_interact(user) + +/obj/item/fishing_rod/pre_attack(atom/targeted_atom, mob/living/user, params) + . = ..() + /// Reel in if able + if(currently_hooked_item) + reel(user) + return TRUE + SEND_SIGNAL(targeted_atom, COMSIG_PRE_FISHING) + +/// Generates the fishing line visual from the current user to the target and updates inhands +/obj/item/fishing_rod/proc/create_fishing_line(atom/movable/target, target_py = null) + var/mob/user = loc + if(!istype(user)) + return + var/beam_color = line?.line_color || default_line_color + var/datum/beam/fishing_line/fishing_line_beam = new(user, target, icon_state = "fishing_line", beam_color = beam_color, override_target_pixel_y = target_py) + fishing_line_beam.lefthand = user.get_held_index_of_item(src) % 2 == 1 + RegisterSignal(fishing_line_beam, COMSIG_BEAM_BEFORE_DRAW, .proc/check_los) + RegisterSignal(fishing_line_beam, COMSIG_PARENT_QDELETING, .proc/clear_line) + fishing_lines += fishing_line_beam + INVOKE_ASYNC(fishing_line_beam, /datum/beam/.proc/Start) + user.update_inv_hands() + return fishing_line_beam + +/obj/item/fishing_rod/proc/clear_line(datum/source) + SIGNAL_HANDLER + fishing_lines -= source + if(ismob(loc)) + var/mob/user = loc + user.update_inv_hands() + +/obj/item/fishing_rod/dropped(mob/user, silent) + . = ..() + if(currently_hooked_item) + clear_hooked_item() + for(var/datum/beam/fishing_line in fishing_lines) + SEND_SIGNAL(fishing_line, COMSIG_FISHING_LINE_SNAPPED) + QDEL_LIST(fishing_lines) + +/// Hooks the item +/obj/item/fishing_rod/proc/hook_item(mob/user, atom/target_atom) + if(currently_hooked_item) + return + if(!can_be_hooked(target_atom)) + return + currently_hooked_item = target_atom + hooked_item_fishing_line = create_fishing_line(target_atom) + RegisterSignal(hooked_item_fishing_line, COMSIG_FISHING_LINE_SNAPPED, .proc/clear_hooked_item) + +/// Checks what can be hooked +/obj/item/fishing_rod/proc/can_be_hooked(atom/movable/target) + // Could be made dependent on actual hook, ie magnet to hook metallic items + return istype(target, /obj/item) + +/obj/item/fishing_rod/proc/clear_hooked_item() + SIGNAL_HANDLER + + if(!QDELETED(hooked_item_fishing_line)) + QDEL_NULL(hooked_item_fishing_line) + currently_hooked_item = null + +// Checks fishing line for interruptions and range +/obj/item/fishing_rod/proc/check_los(datum/beam/source) + SIGNAL_HANDLER + . = NONE + + if(!CheckToolReach(src, source.target, cast_range)) + SEND_SIGNAL(source, COMSIG_FISHING_LINE_SNAPPED) //Stepped out of range or los interrupted + return BEAM_CANCEL_DRAW + +/obj/item/fishing_rod/afterattack(atom/target, mob/user, proximity_flag, click_parameters) + . = ..() + + /// Reel in if able + if(currently_hooked_item) + reel(user) + return + + /// If the line to whatever that is is clear and we're not already busy, try fishing in it + if(!casting && !currently_hooked_item && !proximity_flag && CheckToolReach(user, target, cast_range)) + /// Annoyingly pre attack is only called in melee + SEND_SIGNAL(target, COMSIG_PRE_FISHING) + casting = TRUE + var/obj/projectile/fishing_cast/cast_projectile = new(get_turf(src)) + cast_projectile.range = cast_range + cast_projectile.owner = src + cast_projectile.original = target + cast_projectile.fired_from = src + cast_projectile.firer = user + cast_projectile.impacted = list(user = TRUE) + cast_projectile.preparePixelProjectile(target, user) + cast_projectile.fire() + +/// Called by hook projectile when hitting things +/obj/item/fishing_rod/proc/hook_hit(atom/atom_hit_by_hook_projectile) + var/mob/user = loc + if(!istype(user)) + return + if(SEND_SIGNAL(atom_hit_by_hook_projectile, COMSIG_FISHING_ROD_CAST, src, user) & FISHING_ROD_CAST_HANDLED) + return + /// If you can't fish in it, try hooking it + hook_item(user, atom_hit_by_hook_projectile) + +/obj/item/fishing_rod/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "FishingRod", name) + ui.set_autoupdate(FALSE) + ui.open() + +/obj/item/fishing_rod/update_overlays() + . = ..() + var/line_color = line?.line_color || default_line_color + /// Line part by the rod, always visible + var/mutable_appearance/reel_overlay = mutable_appearance(icon, "reel_overlay") + reel_overlay.color = line_color; + . += reel_overlay + + // Line & hook is also visible when only bait is equipped but it uses default appearances then + if(hook || bait) + var/mutable_appearance/line_overlay = mutable_appearance(icon, "line_overlay") + line_overlay.color = line_color; + . += line_overlay + var/mutable_appearance/hook_overlay = mutable_appearance(icon, hook?.rod_overlay_icon_state || "hook_overlay") + . += hook_overlay + + if(bait) + var/bait_state = "worm_overlay" //default to worm overlay for anything without specific one + if(istype(bait, /obj/item/food/bait)) + var/obj/item/food/bait/real_bait = bait + bait_state = real_bait.rod_overlay_icon_state + . += bait_state + +/obj/item/fishing_rod/worn_overlays(mutable_appearance/standing, isinhands, icon_file) + . = ..() + var/line_color = line?.line_color || default_line_color + var/mutable_appearance/reel_overlay = mutable_appearance(icon_file, "reel_overlay") + reel_overlay.appearance_flags |= RESET_COLOR + reel_overlay.color = line_color + . += reel_overlay + /// if we don't have anything hooked show the dangling hook & line + if(isinhands && length(fishing_lines) == 0) + var/mutable_appearance/line_overlay = mutable_appearance(icon_file, "line_overlay") + line_overlay.appearance_flags |= RESET_COLOR + line_overlay.color = line_color + . += line_overlay + . += mutable_appearance(icon_file, "hook_overlay") + +/obj/item/fishing_rod/attackby(obj/item/attacking_item, mob/user, params) + if(slot_check(attacking_item,ROD_SLOT_LINE)) + use_slot(ROD_SLOT_LINE, user, attacking_item) + SStgui.update_uis(src) + return TRUE + else if(slot_check(attacking_item,ROD_SLOT_HOOK)) + use_slot(ROD_SLOT_HOOK, user, attacking_item) + SStgui.update_uis(src) + return TRUE + else if(slot_check(attacking_item,ROD_SLOT_BAIT)) + use_slot(ROD_SLOT_BAIT, user, attacking_item) + SStgui.update_uis(src) + return TRUE + else if(istype(attacking_item, /obj/item/bait_can)) //Quicker filling from bait can + var/obj/item/bait_can/can = attacking_item + var/bait = can.retrieve_bait(user) + if(bait) + use_slot(ROD_SLOT_BAIT, user, bait) + SStgui.update_uis(src) + return TRUE + . = ..() + +/obj/item/fishing_rod/ui_data(mob/user) + . = ..() + var/list/data = list() + + data["bait_name"] = format_text(bait?.name) + data["bait_icon"] = bait != null ? icon2base64(icon(bait.icon, bait.icon_state)) : null + + data["line_name"] = format_text(line?.name) + data["line_icon"] = line != null ? icon2base64(icon(line.icon, line.icon_state)) : null + + data["hook_name"] = format_text(hook?.name) + data["hook_icon"] = hook != null ? icon2base64(icon(hook.icon, hook.icon_state)) : null + + data["description"] = ui_description + + return data + +/// Checks if the item fits the slot +/obj/item/fishing_rod/proc/slot_check(obj/item/item,slot) + if(!istype(item)) + return FALSE + switch(slot) + if(ROD_SLOT_HOOK) + if(!istype(item,/obj/item/fishing_hook)) + return FALSE + if(ROD_SLOT_LINE) + if(!istype(item,/obj/item/fishing_line)) + return FALSE + if(ROD_SLOT_BAIT) + if(!HAS_TRAIT(item, FISHING_BAIT_TRAIT)) + return FALSE + return TRUE + +/obj/item/fishing_rod/ui_act(action, list/params) + . = ..() + if(.) + return . + var/mob/user = usr + switch(action) + if("slot_action") + // Simple click with empty hand to remove, click with item to insert/switch + var/obj/item/held_item = user.get_active_held_item() + if(held_item == src) + return + use_slot(params["slot"], user, held_item) + return TRUE + +/// Ideally this will be replaced with generic slotted storage datum + display +/obj/item/fishing_rod/proc/use_slot(slot, mob/user, obj/item/new_item) + var/obj/item/current_item + switch(slot) + if(ROD_SLOT_BAIT) + current_item = bait + if(ROD_SLOT_HOOK) + current_item = hook + if(ROD_SLOT_LINE) + current_item = line + if(!new_item && !current_item) + return + // Trying to remove the item + if(!new_item && current_item) + user.put_in_hands(current_item) + update_icon() + return + // Trying to insert item into empty slot + if(new_item && !current_item) + if(!slot_check(new_item, slot)) + return + if(user.transferItemToLoc(new_item,src)) + switch(slot) + if(ROD_SLOT_BAIT) + bait = new_item + if(ROD_SLOT_HOOK) + hook = new_item + if(ROD_SLOT_LINE) + line = new_item + update_icon() + /// Trying to swap item + if(new_item && current_item) + if(!slot_check(new_item,slot)) + return + if(user.transferItemToLoc(new_item,src)) + switch(slot) + if(ROD_SLOT_BAIT) + bait = new_item + if(ROD_SLOT_HOOK) + hook = new_item + if(ROD_SLOT_LINE) + line = new_item + user.put_in_hands(current_item) + update_icon() + + +/obj/item/fishing_rod/Exited(atom/movable/gone, direction) + . = ..() + if(gone == bait) + bait = null + if(gone == line) + line = null + if(gone == hook) + hook = null + +/obj/item/fishing_rod/master + name = "master fishing rod" + desc = "The mythical rod of a lost fisher king. Said to be imbued with un-paralleled fishing power. There's writing on the back of the pole. \"中国航天制造\"" + difficulty_modifier = -10 + ui_description = "This rods makes fishing easy even for an absolute beginner." + icon_state = "fishing_rod_master" + + +/obj/item/fishing_rod/tech + name = "advanced fishing rod" + desc = "An embedded universal constructor along with micro-fusion generator makes this marvel of technology never run out of bait. Interstellar treaties prevent using it outside of recreational fishing. And you can fish with this. " + ui_description = "This rod has an infinite supply of synthetic bait." + icon_state = "fishing_rod_science" + +/obj/item/fishing_rod/tech/Initialize(mapload) + . = ..() + var/obj/item/food/bait/doughball/synthetic/infinite_supply_of_bait = new(src) + bait = infinite_supply_of_bait + update_icon() + +/obj/item/fishing_rod/tech/consume_bait() + return + +/obj/item/fishing_rod/tech/use_slot(slot, mob/user, obj/item/new_item) + if(slot == ROD_SLOT_BAIT) + return + return ..() + +#undef ROD_SLOT_BAIT +#undef ROD_SLOT_LINE +#undef ROD_SLOT_HOOK + +/obj/projectile/fishing_cast + name = "fishing hook" + icon = 'icons/obj/fishing.dmi' + icon_state = "hook_projectile" + damage = 0 + nodamage = TRUE + range = 5 + suppressed = SUPPRESSED_VERY + can_hit_turfs = TRUE + + var/obj/item/fishing_rod/owner + var/datum/beam/our_line + +/obj/projectile/fishing_cast/Impact(atom/hit_atom) + . = ..() + owner.hook_hit(hit_atom) + qdel(src) + +/obj/projectile/fishing_cast/fire(angle, atom/direct_target) + . = ..() + our_line = owner.create_fishing_line(src) + +/obj/projectile/fishing_cast/Destroy() + . = ..() + QDEL_NULL(our_line) + owner?.casting = FALSE + + + +/datum/beam/fishing_line + // Is the fishing rod held in left side hand + var/lefthand = FALSE + +/datum/beam/fishing_line/Start() + update_offsets(origin.dir) + . = ..() + RegisterSignal(origin, COMSIG_ATOM_DIR_CHANGE, .proc/handle_dir_change) + +/datum/beam/fishing_line/Destroy() + UnregisterSignal(origin, COMSIG_ATOM_DIR_CHANGE) + . = ..() + +/datum/beam/fishing_line/proc/handle_dir_change(atom/movable/source, olddir, newdir) + SIGNAL_HANDLER + update_offsets(newdir) + INVOKE_ASYNC(src, /datum/beam/.proc/redrawing) + +/datum/beam/fishing_line/proc/update_offsets(user_dir) + switch(user_dir) + if(SOUTH) + override_origin_pixel_x = lefthand ? lefthand_s_px : righthand_s_px + override_origin_pixel_y = lefthand ? lefthand_s_py : righthand_s_py + if(EAST) + override_origin_pixel_x = lefthand ? lefthand_e_px : righthand_e_px + override_origin_pixel_y = lefthand ? lefthand_e_py : righthand_e_py + if(WEST) + override_origin_pixel_x = lefthand ? lefthand_w_px : righthand_w_px + override_origin_pixel_y = lefthand ? lefthand_w_py : righthand_w_py + if(NORTH) + override_origin_pixel_x = lefthand ? lefthand_n_px : righthand_n_px + override_origin_pixel_y = lefthand ? lefthand_n_py : righthand_n_py + +// Make these inline with final sprites +/datum/beam/fishing_line + var/righthand_s_px = 13 + var/righthand_s_py = 16 + + var/righthand_e_px = 18 + var/righthand_e_py = 16 + + var/righthand_w_px = -20 + var/righthand_w_py = 18 + + var/righthand_n_px = -14 + var/righthand_n_py = 16 + + var/lefthand_s_px = -13 + var/lefthand_s_py = 15 + + var/lefthand_e_px = 24 + var/lefthand_e_py = 18 + + var/lefthand_w_px = -17 + var/lefthand_w_py = 16 + + var/lefthand_n_px = 13 + var/lefthand_n_py = 15 + diff --git a/code/modules/fishing/fishing_traits.dm b/code/modules/fishing/fishing_traits.dm new file mode 100644 index 00000000000000..3a58ae5157ca5d --- /dev/null +++ b/code/modules/fishing/fishing_traits.dm @@ -0,0 +1,82 @@ +/datum/fishing_trait + /// Description of the trait in the fishing catalog + var/catalog_description + +/// Difficulty modifier from this mod, needs to return a list with two values +/datum/fishing_trait/proc/difficulty_mod(obj/item/fishing_rod/rod, mob/fisherman) + SHOULD_CALL_PARENT(TRUE) //Technically it doesn't but this makes it saner without custom unit test + return list(ADDITIVE_FISHING_MOD = 0, MULTIPLICATIVE_FISHING_MOD = 1) + +/// Catch weight table modifier from this mod, needs to return a list with two values +/datum/fishing_trait/proc/catch_weight_mod(obj/item/fishing_rod/rod, mob/fisherman) + SHOULD_CALL_PARENT(TRUE) + return list(ADDITIVE_FISHING_MOD = 0, MULTIPLICATIVE_FISHING_MOD = 1) + +/// Returns special minigame rules applied by this trait +/datum/fishing_trait/proc/minigame_mod(obj/item/fishing_rod/rod, mob/fisherman) + return list() + +/datum/fishing_trait/wary + catalog_description = "This fish will avoid visible fish lines, cloaked line recommended." + +/datum/fishing_trait/wary/difficulty_mod(obj/item/fishing_rod/rod, mob/fisherman) + . = ..() + // Wary fish require transparent line or they're harder + if(!rod.line || !(rod.line.fishing_line_traits & FISHING_LINE_CLOAKED)) + .[ADDITIVE_FISHING_MOD] = -FISH_TRAIT_MINOR_DIFFICULTY_BOOST + +/datum/fishing_trait/shiny_lover + catalog_description = "This fish loves shiny things, shiny lure recommended." + +/datum/fishing_trait/shiny_lover/difficulty_mod(obj/item/fishing_rod/rod, mob/fisherman) + . = ..() + // These fish are easier to catch with shiny lure + if(rod.hook && rod.hook.fishing_hook_traits & FISHING_HOOK_SHINY) + .[ADDITIVE_FISHING_MOD] = FISH_TRAIT_MINOR_DIFFICULTY_BOOST + +/datum/fishing_trait/picky_eater + catalog_description = "This fish is very picky and will ignore low quality bait." + +/datum/fishing_trait/picky_eater/catch_weight_mod(obj/item/fishing_rod/rod, mob/fisherman) + . = ..() + if(!rod.bait || !(HAS_TRAIT(rod.bait, GOOD_QUALITY_BAIT_TRAIT) || HAS_TRAIT(rod.bait, GREAT_QUALITY_BAIT_TRAIT))) + .[MULTIPLICATIVE_FISHING_MOD] = 0 + + +/datum/fishing_trait/nocturnal + catalog_description = "This fish avoids bright lights, fishing in darkness recommended." + +/datum/fishing_trait/nocturnal/catch_weight_mod(obj/item/fishing_rod/rod, mob/fisherman) + . = ..() + var/turf/T = get_turf(fisherman) + var/light_amount = T.get_lumcount() + if(light_amount < SHADOW_SPECIES_LIGHT_THRESHOLD) + .[MULTIPLICATIVE_FISHING_MOD] = 0 + + +/datum/fishing_trait/heavy + catalog_description = "This fish tends to stay near the waterbed."; + +/datum/fishing_trait/heavy/minigame_mod(obj/item/fishing_rod/rod, mob/fisherman) + return list(FISHING_MINIGAME_RULE_HEAVY_FISH) + + +/datum/fishing_trait/carnivore + catalog_description = "This fish can only be baited with meat." + +/datum/fishing_trait/carnivore/catch_weight_mod(obj/item/fishing_rod/rod, mob/fisherman) + . = ..() + .[MULTIPLICATIVE_FISHING_MOD] = 0 + if(rod.bait && istype(rod.bait, /obj/item/food)) + var/obj/item/food/food_bait = rod.bait + if(food_bait.foodtypes & MEAT) + .[MULTIPLICATIVE_FISHING_MOD] = 1 + +/datum/fishing_trait/vegan + catalog_description = "This fish can only be baited with fresh produce." + +/datum/fishing_trait/vegan/catch_weight_mod(obj/item/fishing_rod/rod, mob/fisherman) + . = ..() + .[MULTIPLICATIVE_FISHING_MOD] = 0 + if(rod.bait && istype(rod.bait, /obj/item/food/grown)) + .[MULTIPLICATIVE_FISHING_MOD] = 1 diff --git a/code/modules/fishing/sources/_fish_source.dm b/code/modules/fishing/sources/_fish_source.dm new file mode 100644 index 00000000000000..f27d4aed8379f0 --- /dev/null +++ b/code/modules/fishing/sources/_fish_source.dm @@ -0,0 +1,198 @@ +/// Keyed list of preset sources to configuration instance +GLOBAL_LIST_INIT(preset_fish_sources,init_fishing_configurations()) + +/// These are shared between their spots +/proc/init_fishing_configurations() + . = list() + + var/datum/fish_source/ocean/beach/beach_preset = new + .[FISHING_SPOT_PRESET_BEACH] = beach_preset + + var/datum/fish_source/lavaland/lava_preset = new + .[FISHING_SPOT_PRESET_LAVALAND_LAVA] = lava_preset + +/// Where the fish actually come from - every fishing spot has one assigned but multiple fishing holes can share single source, ie single shared one for ocean/lavaland river +/datum/fish_source + /// Fish catch weight table - these are relative weights + var/list/fish_table = list() + /// If a key from fish_table is present here, that fish is availible in limited quantity and is reduced by one on successful fishing + var/list/fish_counts = list() + /// Text shown as baloon alert when you roll a dud in the table + var/duds = list("it was nothing", "the hook is empty") + /// Baseline difficulty for fishing in this spot + var/fishing_difficulty = FISHING_DEFAULT_DIFFICULTY + /// How the spot type is described in fish catalog section about fish sources, will be skipped if null + var/catalog_description + /// Background image name from /datum/asset/simple/fishing_minigame + var/background = "fishing_background_default" + +/// Can we fish in this spot at all. Returns DENIAL_REASON or null if we're good to go +/datum/fish_source/proc/can_fish(obj/item/fishing_rod/rod, mob/fisherman) + return + + +/// DIFFICULTY = (SPOT_BASE_VALUE + FISH_MODIFIER + ROD_MODIFIER + FAV/DISLIKED_BAIT_MODIFIER + TRAITS_ADDITIVE) * TRAITS_MULTIPLICATIVE , For non-fish it's just SPOT_BASE_VALUE +/datum/fish_source/proc/calculate_difficulty(result, obj/item/fishing_rod/rod, mob/fisherman) + . = fishing_difficulty + + if(!ispath(result,/obj/item/fish)) + // In the future non-fish rewards can have variable difficulty calculated here + return + + var/list/fish_list_properties = collect_fish_properties() + var/obj/item/fish/caught_fish = result + // Baseline fish difficulty + . += initial(caught_fish.fishing_difficulty_modifier) + . += rod.difficulty_modifier + + if(rod.bait) + var/obj/item/bait = rod.bait + //Fav bait makes it easier + var/list/fav_bait = fish_list_properties[caught_fish][NAMEOF(caught_fish, favorite_bait)] + for(var/bait_identifer in fav_bait) + if(is_matching_bait(bait, bait_identifer)) + . += FAV_BAIT_DIFFICULTY_MOD + break + //Disliked bait makes it harder + var/list/disliked_bait = fish_list_properties[caught_fish][NAMEOF(caught_fish, disliked_bait)] + for(var/bait_identifer in disliked_bait) + if(is_matching_bait(bait, bait_identifer)) + . += DISLIKED_BAIT_DIFFICULTY_MOD + break + + // Matching/not matching fish traits and equipment + var/list/fish_traits = fish_list_properties[caught_fish][NAMEOF(caught_fish, fishing_traits)] + + var/additive_mod = 0 + var/multiplicative_mod = 1 + for(var/fish_trait in fish_traits) + var/datum/fishing_trait/trait = new fish_trait + var/list/mod = trait.difficulty_mod(rod, fisherman) + additive_mod += mod[ADDITIVE_FISHING_MOD] + multiplicative_mod *= mod[MULTIPLICATIVE_FISHING_MOD] + + . += additive_mod + . *= multiplicative_mod + +/// In case you want more complex rules for specific spots +/datum/fish_source/proc/roll_reward(obj/item/fishing_rod/rod, mob/fisherman) + return pick_weight(get_modified_fish_table(rod,fisherman)) + +/// Gives out the reward if possible +/datum/fish_source/proc/dispense_reward(reward_path, mob/fisherman) + if((reward_path in fish_counts)) // This is limited count result + if(fish_counts[reward_path] > 0) + fish_counts[reward_path] -= 1 + else + reward_path = FISHING_DUD //Ran out of these since rolling (multiple fishermen on same source most likely) + if(ispath(reward_path)) + if(ispath(reward_path,/obj/item)) + var/obj/item/reward = new reward_path + if(ispath(reward_path,/obj/item/fish)) + var/obj/item/fish/caught_fish = reward + caught_fish.randomize_weight_and_size() + //fish caught signal if needed goes here and/or fishing achievements + //Try to put it in hand + fisherman.put_in_hands(reward) + fisherman.balloon_alert(fisherman, "caught [reward]!") + else //If someone adds fishing out carp/chests/singularities or whatever just plop it down on the fisher's turf + fisherman.balloon_alert(fisherman, "caught something!") + new reward_path(get_turf(fisherman)) + else if (reward_path == FISHING_DUD) + //baloon alert instead + fisherman.balloon_alert(fisherman,pick(duds)) + +/// Cached fish list properties so we don't have to initalize fish every time, init deffered +GLOBAL_LIST(fishing_property_cache) + +/// Awful workaround around initial(x.list_variable) not being a thing while trying to keep some semblance of being structured +/proc/collect_fish_properties() + if(GLOB.fishing_property_cache == null) + var/list/fish_property_table = list() + for(var/fish_type in subtypesof(/obj/item/fish)) + var/obj/item/fish/fish = new fish_type(null) + fish_property_table[fish_type] = list() + fish_property_table[fish_type][NAMEOF(fish, favorite_bait)] = fish.favorite_bait.Copy() + fish_property_table[fish_type][NAMEOF(fish, disliked_bait)] = fish.disliked_bait.Copy() + fish_property_table[fish_type][NAMEOF(fish, fishing_traits)] = fish.fishing_traits.Copy() + QDEL_NULL(fish) + GLOB.fishing_property_cache = fish_property_table + return GLOB.fishing_property_cache + +/// Checks if bait matches identifier from fav/disliked bait list +/datum/fish_source/proc/is_matching_bait(obj/item/bait, identifier) + if(ispath(identifier)) //Just a path + return istype(bait, identifier) + if(islist(identifier)) + var/list/special_identifier = identifier + switch(special_identifier["Type"]) + if("Foodtype") + var/obj/item/food/food_bait = bait + return istype(food_bait) && food_bait.foodtypes & special_identifier["Value"] + else + CRASH("Unknown bait identifier in fish favourite/disliked list") + else + return HAS_TRAIT(bait, identifier) + +/// Builds a fish weights table modified by bait/rod/user properties +/datum/fish_source/proc/get_modified_fish_table(obj/item/fishing_rod/rod, mob/fisherman) + var/obj/item/bait = rod.bait + + var/list/fish_list_properties = collect_fish_properties() + + var/list/final_table = fish_table.Copy() + for(var/result in final_table) + if((result in fish_counts) && fish_counts[result] <= 0) //ran out of these, ignore + final_table -= result + continue + final_table[result] += rod.fish_bonus(result) //Decide on order here so it can be multiplicative + if(result == FISHING_DUD) + //Modify dud result + //Bait quality reduces dud chance heavily. + if(bait) + if(HAS_TRAIT(bait, GREAT_QUALITY_BAIT_TRAIT)) + final_table[result] *= 0.1 + else if(HAS_TRAIT(bait, GOOD_QUALITY_BAIT_TRAIT)) + final_table[result] *= 0.3 + else if(HAS_TRAIT(bait, BASIC_QUALITY_BAIT_TRAIT)) + final_table[result] *= 0.5 + else + final_table[result] *= 10 //Fishing without bait is not going to be easy + else if(ispath(result, /obj/item/fish)) + //Modify fish roll chance + var/obj/item/fish/caught_fish = result + + if(bait) + //Bait matching likes doubles the chance + var/list/fav_bait = fish_list_properties[result][NAMEOF(caught_fish, favorite_bait)] + for(var/bait_identifer in fav_bait) + if(is_matching_bait(bait, bait_identifer)) + final_table[result] *= 2 + break // could compound possibly + //Bait matching dislikes + var/list/disliked_bait = fish_list_properties[result][NAMEOF(caught_fish, disliked_bait)] + for(var/bait_identifer in disliked_bait) + if(is_matching_bait(bait, bait_identifer)) + final_table[result] *= 0.5 + break // same question as above + + // Apply fishing trait modifiers + var/list/fish_traits = fish_list_properties[caught_fish][NAMEOF(caught_fish, fishing_traits)] + var/additive_mod = 0 + var/multiplicative_mod = 1 + for(var/fish_trait in fish_traits) + var/datum/fishing_trait/trait = new fish_trait + var/list/mod = trait.catch_weight_mod(rod, fisherman) + additive_mod += mod[ADDITIVE_FISHING_MOD] + multiplicative_mod *= mod[MULTIPLICATIVE_FISHING_MOD] + + final_table[result] += additive_mod + final_table[result] *= multiplicative_mod + + else + //Modify other paths chance + if(rod.hook && rod.hook.fishing_hook_traits & FISHING_HOOK_MAGNETIC) + final_table[result] *= 5 + if(final_table[result] <= 0) + final_table -= result + return final_table diff --git a/code/modules/fishing/sources/source_types.dm b/code/modules/fishing/sources/source_types.dm new file mode 100644 index 00000000000000..9b626de6956d4e --- /dev/null +++ b/code/modules/fishing/sources/source_types.dm @@ -0,0 +1,54 @@ +/datum/fish_source/ocean + fish_table = list( + FISHING_DUD = 15, + /obj/item/coin/gold = 5, + /obj/item/fish/clownfish = 15, + /obj/item/fish/pufferfish = 15, + /obj/item/fish/cardinal = 15, + /obj/item/fish/greenchromis = 15, + /obj/item/fish/lanternfish = 5 + ) + fishing_difficulty = FISHING_DEFAULT_DIFFICULTY + 5 + +/datum/fish_source/ocean/beach + catalog_description = "Beach shore water" + +/datum/fish_source/portal + fish_table = list( + FISHING_DUD = 5, + /obj/item/fish/goldfish = 10, + /obj/item/fish/guppy = 10, + ) + catalog_description = "Fish dimension (Fishing portal generator)" + +/datum/fish_source/lavaland + catalog_description = "Lava vents" + background = "fishing_background_lavaland" + fish_table = list( + FISHING_DUD = 5, + /obj/item/stack/ore/slag = 20, + /obj/structure/closet/crate/necropolis/tendril = 1, + /obj/effect/mob_spawn/corpse/human/charredskeleton = 1 + ) + fish_counts = list( + /obj/structure/closet/crate/necropolis/tendril = 1 + ) + + fishing_difficulty = FISHING_DEFAULT_DIFFICULTY + 10 + +/datum/fish_source/lavaland/can_fish(obj/item/fishing_rod/rod, mob/fisherman) + . = ..() + var/turf/approx = get_turf(fisherman) //todo pass the parent + if(!SSmapping.level_trait(approx.z, ZTRAIT_MINING)) + return "There doesn't seem to be anything to catch here." + if(!rod.line || !(rod.line.fishing_line_traits & FISHING_LINE_REINFORCED)) + return "You'll need reinforced fishing line to fish in there" + + +/datum/fish_source/moisture_trap + catalog_description = "moisture trap basins" + fish_table = list( + FISHING_DUD = 20, + /obj/item/fish/ratfish = 10 + ) + fishing_difficulty = FISHING_DEFAULT_DIFFICULTY + 10 diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm deleted file mode 100644 index 4480ea50cae986..00000000000000 --- a/code/modules/flufftext/Hallucination.dm +++ /dev/null @@ -1,1634 +0,0 @@ -#define HAL_LINES_FILE "hallucination.json" - -GLOBAL_LIST_INIT(hallucination_list, list( - /datum/hallucination/chat = 100, - /datum/hallucination/message = 60, - /datum/hallucination/sounds = 50, - /datum/hallucination/battle = 20, - /datum/hallucination/dangerflash = 15, - /datum/hallucination/hudscrew = 12, - /datum/hallucination/fake_health_doll = 12, - /datum/hallucination/fake_alert = 12, - /datum/hallucination/weird_sounds = 8, - /datum/hallucination/stationmessage = 7, - /datum/hallucination/fake_flood = 7, - /datum/hallucination/stray_bullet = 7, - /datum/hallucination/bolts = 7, - /datum/hallucination/items_other = 7, - /datum/hallucination/husks = 7, - /datum/hallucination/items = 4, - /datum/hallucination/fire = 3, - /datum/hallucination/self_delusion = 2, - /datum/hallucination/delusion = 2, - /datum/hallucination/shock = 1, - /datum/hallucination/death = 1, - /datum/hallucination/oh_yeah = 1 - )) - - -/mob/living/carbon/proc/handle_hallucinations(delta_time, times_fired) - if(!hallucination) - return - - hallucination = max(hallucination - (0.5 * delta_time), 0) - if(world.time < next_hallucination) - return - - var/halpick = pick_weight(GLOB.hallucination_list) - new halpick(src, FALSE) - - next_hallucination = world.time + rand(100, 600) - -/mob/living/carbon/proc/set_screwyhud(hud_type) - hal_screwyhud = hud_type - update_health_hud() - -/datum/hallucination - var/natural = TRUE - var/mob/living/carbon/target - var/feedback_details //extra info for investigate - -/datum/hallucination/New(mob/living/carbon/C, forced = TRUE) - set waitfor = FALSE - target = C - natural = !forced - - // Cancel early if the target is deleted - RegisterSignal(target, COMSIG_PARENT_QDELETING, .proc/target_deleting) - -/datum/hallucination/proc/target_deleting() - SIGNAL_HANDLER - - qdel(src) - -/datum/hallucination/proc/wake_and_restore() - target.set_screwyhud(SCREWYHUD_NONE) - target.SetSleeping(0) - -/datum/hallucination/Destroy() - target.investigate_log("was afflicted with a hallucination of type [type] by [natural?"hallucination status":"an external source"]. [feedback_details]", INVESTIGATE_HALLUCINATIONS) - - if (target) - UnregisterSignal(target, COMSIG_PARENT_QDELETING) - - target = null - return ..() - -//Returns a random turf in a ring around the target mob, useful for sound hallucinations -/datum/hallucination/proc/random_far_turf() - var/x_based = prob(50) - var/first_offset = pick(-8,-7,-6,-5,5,6,7,8) - var/second_offset = rand(-8,8) - var/x_off - var/y_off - if(x_based) - x_off = first_offset - y_off = second_offset - else - y_off = first_offset - x_off = second_offset - var/turf/T = locate(target.x + x_off, target.y + y_off, target.z) - return T - -/obj/effect/hallucination - invisibility = INVISIBILITY_OBSERVER - anchored = TRUE - var/mob/living/carbon/target = null - -/obj/effect/hallucination/simple - var/image_icon = 'icons/mob/alien.dmi' - var/image_state = "alienh_pounce" - var/px = 0 - var/py = 0 - var/col_mod = null - var/image/current_image = null - var/image_layer = MOB_LAYER - var/image_plane = GAME_PLANE - var/active = TRUE //qdelery - -/obj/effect/hallucination/singularity_pull() - return - -/obj/effect/hallucination/singularity_act() - return - -/obj/effect/hallucination/simple/Initialize(mapload, mob/living/carbon/T) - . = ..() - if(!T) - stack_trace("A hallucination was created with no target") - return INITIALIZE_HINT_QDEL - target = T - current_image = GetImage() - if(target.client) - target.client.images |= current_image - -/obj/effect/hallucination/simple/proc/GetImage() - var/image/I = image(image_icon,src,image_state,image_layer,dir=src.dir) - I.plane = image_plane - I.pixel_x = px - I.pixel_y = py - if(col_mod) - I.color = col_mod - return I - -/obj/effect/hallucination/simple/proc/Show(update=1) - if(active) - if(target.client) - target.client.images.Remove(current_image) - if(update) - current_image = GetImage() - if(target.client) - target.client.images |= current_image - -/obj/effect/hallucination/simple/update_icon(updates=ALL, new_state, new_icon, new_px=0, new_py=0) - image_state = new_state - if(new_icon) - image_icon = new_icon - else - image_icon = initial(image_icon) - px = new_px - py = new_py - . = ..() - Show() - -/obj/effect/hallucination/simple/Moved(atom/OldLoc, Dir) - . = ..() - if(!loc) - return - Show() - -/obj/effect/hallucination/simple/Destroy() - if(target.client) - target.client.images.Remove(current_image) - active = FALSE - return ..() - -#define FAKE_FLOOD_EXPAND_TIME 20 -#define FAKE_FLOOD_MAX_RADIUS 10 - -/obj/effect/plasma_image_holder - icon_state = "nothing" - anchored = TRUE - layer = FLY_LAYER - plane = ABOVE_GAME_PLANE - mouse_opacity = MOUSE_OPACITY_TRANSPARENT - -/datum/hallucination/fake_flood - //Plasma starts flooding from the nearby vent - var/turf/center - var/list/flood_images = list() - var/list/flood_image_holders = list() - var/list/turf/flood_turfs = list() - var/image_icon = 'icons/effects/atmospherics.dmi' - var/image_state = "plasma" - var/radius = 0 - var/next_expand = 0 - -/datum/hallucination/fake_flood/New(mob/living/carbon/C, forced = TRUE) - ..() - for(var/obj/machinery/atmospherics/components/unary/vent_pump/U in orange(7,target)) - if(!U.welded) - center = get_turf(U) - break - if(!center) - qdel(src) - return - feedback_details += "Vent Coords: [center.x],[center.y],[center.z]" - var/obj/effect/plasma_image_holder/pih = new(center) - var/image/plasma_image = image(image_icon, pih, image_state, FLY_LAYER) - plasma_image.alpha = 50 - plasma_image.plane = ABOVE_GAME_PLANE - flood_images += plasma_image - flood_image_holders += pih - flood_turfs += center - if(target.client) - target.client.images |= flood_images - next_expand = world.time + FAKE_FLOOD_EXPAND_TIME - START_PROCESSING(SSobj, src) - -/datum/hallucination/fake_flood/process() - if(next_expand <= world.time) - radius++ - if(radius > FAKE_FLOOD_MAX_RADIUS) - qdel(src) - return - Expand() - if((get_turf(target) in flood_turfs) && !target.internal) - new /datum/hallucination/fake_alert(target, TRUE, ALERT_TOO_MUCH_PLASMA) - next_expand = world.time + FAKE_FLOOD_EXPAND_TIME - -/datum/hallucination/fake_flood/proc/Expand() - for(var/image/I in flood_images) - I.alpha = min(I.alpha + 50, 255) - for(var/turf/FT in flood_turfs) - for(var/dir in GLOB.cardinals) - var/turf/T = get_step(FT, dir) - if((T in flood_turfs) || !TURFS_CAN_SHARE(T, FT) || isspaceturf(T)) //If we've gottem already, or if they're not alright to spread with. - continue - var/obj/effect/plasma_image_holder/pih = new(T) - var/image/new_plasma = image(image_icon, pih, image_state, FLY_LAYER) - new_plasma.alpha = 50 - new_plasma.plane = ABOVE_GAME_PLANE - flood_images += new_plasma - flood_image_holders += pih - flood_turfs += T - if(target.client) - target.client.images |= flood_images - -/datum/hallucination/fake_flood/Destroy() - STOP_PROCESSING(SSobj, src) - qdel(flood_turfs) - flood_turfs = list() - if(target.client) - target.client.images.Remove(flood_images) - qdel(flood_images) - flood_images = list() - qdel(flood_image_holders) - flood_image_holders = list() - return ..() - -/obj/effect/hallucination/simple/xeno - image_icon = 'icons/mob/alien.dmi' - image_state = "alienh_pounce" - -/obj/effect/hallucination/simple/xeno/Initialize(mapload, mob/living/carbon/T) - . = ..() - name = "alien hunter ([rand(1, 1000)])" - -/obj/effect/hallucination/simple/xeno/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) - update_icon(ALL, "alienh_pounce") - if(hit_atom == target && target.stat!=DEAD) - target.Paralyze(100) - target.visible_message(span_danger("[target] flails around wildly."),span_userdanger("[name] pounces on you!")) - -// The numbers of seconds it takes to get to each stage of the xeno attack choreography -#define XENO_ATTACK_STAGE_LEAP_AT_TARGET 1 -#define XENO_ATTACK_STAGE_LEAP_AT_PUMP 2 -#define XENO_ATTACK_STAGE_CLIMB 3 -#define XENO_ATTACK_STAGE_FINISH 6 - -/// Xeno crawls from nearby vent,jumps at you, and goes back in -/datum/hallucination/xeno_attack - var/turf/pump_location = null - var/obj/effect/hallucination/simple/xeno/xeno = null - var/time_processing = 0 - var/stage = XENO_ATTACK_STAGE_LEAP_AT_TARGET - -/datum/hallucination/xeno_attack/New(mob/living/carbon/C, forced = TRUE) - ..() - for(var/obj/machinery/atmospherics/components/unary/vent_pump/U in orange(7,target)) - if(!U.welded) - pump_location = get_turf(U) - break - - if(pump_location) - feedback_details += "Vent Coords: [pump_location.x],[pump_location.y],[pump_location.z]" - xeno = new(pump_location, target) - START_PROCESSING(SSfastprocess, src) - else - qdel(src) - -/datum/hallucination/xeno_attack/process(delta_time) - time_processing += delta_time - - if (time_processing >= stage) - switch (time_processing) - if (XENO_ATTACK_STAGE_FINISH to INFINITY) - to_chat(target, span_notice("[xeno.name] scrambles into the ventilation ducts!")) - qdel(src) - if (XENO_ATTACK_STAGE_CLIMB to XENO_ATTACK_STAGE_FINISH) - to_chat(target, span_notice("[xeno.name] begins climbing into the ventilation system...")) - stage = XENO_ATTACK_STAGE_FINISH - if (XENO_ATTACK_STAGE_LEAP_AT_PUMP to XENO_ATTACK_STAGE_CLIMB) - xeno.update_icon(ALL, "alienh_leap", 'icons/mob/alienleap.dmi', -32, -32) - xeno.throw_at(pump_location, 7, 1, spin = FALSE, diagonals_first = TRUE) - stage = XENO_ATTACK_STAGE_CLIMB - if (XENO_ATTACK_STAGE_LEAP_AT_TARGET to XENO_ATTACK_STAGE_LEAP_AT_PUMP) - xeno.update_icon(ALL, "alienh_leap", 'icons/mob/alienleap.dmi', -32, -32) - xeno.throw_at(target, 7, 1, spin = FALSE, diagonals_first = TRUE) - stage = XENO_ATTACK_STAGE_LEAP_AT_PUMP - -/datum/hallucination/xeno_attack/Destroy() - . = ..() - - STOP_PROCESSING(SSfastprocess, src) - QDEL_NULL(xeno) - pump_location = null - -#undef XENO_ATTACK_STAGE_LEAP_AT_TARGET -#undef XENO_ATTACK_STAGE_LEAP_AT_PUMP -#undef XENO_ATTACK_STAGE_CLIMB -#undef XENO_ATTACK_STAGE_FINISH - -/obj/effect/hallucination/simple/clown - image_icon = 'icons/mob/animal.dmi' - image_state = "clown" - -/obj/effect/hallucination/simple/clown/Initialize(mapload, mob/living/carbon/T, duration) - ..(loc, T) - name = pick(GLOB.clown_names) - QDEL_IN(src,duration) - -/obj/effect/hallucination/simple/clown/scary - image_state = "scary_clown" - -/obj/effect/hallucination/simple/bubblegum - name = "Bubblegum" - image_icon = 'icons/mob/lavaland/96x96megafauna.dmi' - image_state = "bubblegum" - px = -32 - -/datum/hallucination/oh_yeah - var/obj/effect/hallucination/simple/bubblegum/bubblegum - var/image/fakebroken - var/image/fakerune - var/turf/landing - var/charged - var/next_action = 0 - -/datum/hallucination/oh_yeah/New(mob/living/carbon/C, forced = TRUE) - set waitfor = FALSE - . = ..() - var/turf/closed/wall/wall - for(var/turf/closed/wall/W in range(7,target)) - wall = W - break - if(!wall) - return INITIALIZE_HINT_QDEL - feedback_details += "Source: [wall.x],[wall.y],[wall.z]" - - fakebroken = image('icons/turf/floors.dmi', wall, "plating", layer = TURF_LAYER) - landing = get_turf(target) - var/turf/landing_image_turf = get_step(landing, SOUTHWEST) //the icon is 3x3 - fakerune = image('icons/effects/96x96.dmi', landing_image_turf, "landing", layer = ABOVE_OPEN_TURF_LAYER) - fakebroken.override = TRUE - if(target.client) - target.client.images |= fakebroken - target.client.images |= fakerune - target.playsound_local(wall,'sound/effects/meteorimpact.ogg', 150, 1) - bubblegum = new(wall, target) - addtimer(CALLBACK(src, .proc/start_processing), 10) - -/datum/hallucination/oh_yeah/proc/start_processing() - if (isnull(target)) - qdel(src) - return - START_PROCESSING(SSfastprocess, src) - -/datum/hallucination/oh_yeah/process(delta_time) - next_action -= delta_time - - if (next_action > 0) - return - - if (get_turf(bubblegum) != landing && target?.stat != DEAD) - if(!landing || (get_turf(bubblegum)).loc.z != landing.loc.z) - qdel(src) - return - bubblegum.forceMove(get_step_towards(bubblegum, landing)) - bubblegum.setDir(get_dir(bubblegum, landing)) - target.playsound_local(get_turf(bubblegum), 'sound/effects/meteorimpact.ogg', 150, 1) - shake_camera(target, 2, 1) - if(bubblegum.Adjacent(target) && !charged) - charged = TRUE - target.Paralyze(80) - target.adjustStaminaLoss(40) - step_away(target, bubblegum) - shake_camera(target, 4, 3) - target.visible_message(span_warning("[target] jumps backwards, falling on the ground!"),span_userdanger("[bubblegum] slams into you!")) - next_action = 0.2 - else - STOP_PROCESSING(SSfastprocess, src) - QDEL_IN(src, 3 SECONDS) - -/datum/hallucination/oh_yeah/Destroy() - if(target.client) - target.client.images.Remove(fakebroken) - target.client.images.Remove(fakerune) - QDEL_NULL(fakebroken) - QDEL_NULL(fakerune) - QDEL_NULL(bubblegum) - STOP_PROCESSING(SSfastprocess, src) - return ..() - -/datum/hallucination/battle - var/battle_type - var/iterations_left - var/hits = 0 - var/next_action = 0 - var/turf/source - -/datum/hallucination/battle/New(mob/living/carbon/C, forced = TRUE, new_battle_type) - ..() - - source = random_far_turf() - - battle_type = new_battle_type - if (isnull(battle_type)) - battle_type = pick("laser", "disabler", "esword", "gun", "stunprod", "harmbaton", "bomb") - feedback_details += "Type: [battle_type]" - var/process = TRUE - - switch(battle_type) - if("disabler", "laser") - iterations_left = rand(5, 10) - if("esword") - iterations_left = rand(4, 8) - target.playsound_local(source, 'sound/weapons/saberon.ogg',15, 1) - if("gun") - iterations_left = rand(3, 6) - if("stunprod") //Stunprod + cablecuff - process = FALSE - target.playsound_local(source, 'sound/weapons/egloves.ogg', 40, 1) - target.playsound_local(source, get_sfx(SFX_BODYFALL), 25, 1) - addtimer(CALLBACK(target, /mob/.proc/playsound_local, source, 'sound/weapons/cablecuff.ogg', 15, 1), 20) - if("harmbaton") //zap n slap - iterations_left = rand(5, 12) - target.playsound_local(source, 'sound/weapons/egloves.ogg', 40, 1) - target.playsound_local(source, get_sfx(SFX_BODYFALL), 25, 1) - next_action = 2 SECONDS - if("bomb") // Tick Tock - iterations_left = rand(3, 11) - - if (process) - START_PROCESSING(SSfastprocess, src) - else - qdel(src) - -/datum/hallucination/battle/process(delta_time) - next_action -= (delta_time * 10) - - if (next_action > 0) - return - - switch (battle_type) - if ("disabler", "laser", "gun") - var/fire_sound - var/hit_person_sound - var/hit_wall_sound - var/number_of_hits - var/chance_to_fall - - switch (battle_type) - if ("disabler") - fire_sound = 'sound/weapons/taser2.ogg' - hit_person_sound = 'sound/weapons/tap.ogg' - hit_wall_sound = 'sound/weapons/effects/searwall.ogg' - number_of_hits = 3 - chance_to_fall = 70 - if ("laser") - fire_sound = 'sound/weapons/laser.ogg' - hit_person_sound = 'sound/weapons/sear.ogg' - hit_wall_sound = 'sound/weapons/effects/searwall.ogg' - number_of_hits = 4 - chance_to_fall = 70 - if ("gun") - fire_sound = 'sound/weapons/gun/shotgun/shot.ogg' - hit_person_sound = 'sound/weapons/pierce.ogg' - hit_wall_sound = SFX_RICOCHET - number_of_hits = 2 - chance_to_fall = 80 - - target.playsound_local(source, fire_sound, 25, 1) - - if(prob(50)) - addtimer(CALLBACK(target, /mob/.proc/playsound_local, source, hit_person_sound, 25, 1), rand(5,10)) - hits += 1 - else - addtimer(CALLBACK(target, /mob/.proc/playsound_local, source, hit_wall_sound, 25, 1), rand(5,10)) - - next_action = rand(CLICK_CD_RANGE, CLICK_CD_RANGE + 6) - - if(hits >= number_of_hits && prob(chance_to_fall)) - addtimer(CALLBACK(target, /mob/.proc/playsound_local, source, get_sfx(SFX_BODYFALL), 25, 1), next_action) - qdel(src) - return - if ("esword") - target.playsound_local(source, 'sound/weapons/blade1.ogg', 50, 1) - - if (hits == 4) - target.playsound_local(source, get_sfx(SFX_BODYFALL), 25, 1) - - next_action = rand(CLICK_CD_MELEE, CLICK_CD_MELEE + 6) - hits += 1 - - if (iterations_left == 1) - target.playsound_local(source, 'sound/weapons/saberoff.ogg', 15, 1) - if ("harmbaton") - target.playsound_local(source, SFX_SWING_HIT, 50, 1) - next_action = rand(CLICK_CD_MELEE, CLICK_CD_MELEE + 4) - if ("bomb") - target.playsound_local(source, 'sound/items/timer.ogg', 25, 0) - next_action = 15 - - iterations_left -= 1 - if (iterations_left == 0) - qdel(src) - -/datum/hallucination/battle/Destroy() - . = ..() - source = null - STOP_PROCESSING(SSfastprocess, src) - -/datum/hallucination/items_other - -/datum/hallucination/items_other/New(mob/living/carbon/C, forced = TRUE, item_type) - set waitfor = FALSE - ..() - var/item - if(!item_type) - item = pick(list("esword","taser","ebow","baton","dual_esword","ttv","flash","armblade")) - else - item = item_type - feedback_details += "Item: [item]" - var/side - var/image_file - var/image/A = null - var/list/mob_pool = list() - - for(var/mob/living/carbon/human/M in view(7,target)) - if(M != target) - mob_pool += M - if(!mob_pool.len) - return - - var/mob/living/carbon/human/H = pick(mob_pool) - feedback_details += " Mob: [H.real_name]" - - var/free_hand = H.get_empty_held_index_for_side(LEFT_HANDS) - if(free_hand) - side = "left" - else - free_hand = H.get_empty_held_index_for_side(RIGHT_HANDS) - if(free_hand) - side = "right" - - if(side) - switch(item) - if("esword") - if(side == "right") - image_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' - else - image_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' - target.playsound_local(H, 'sound/weapons/saberon.ogg',35,1) - A = image(image_file,H,"e_sword_on_red", layer=ABOVE_MOB_LAYER) - if("dual_esword") - if(side == "right") - image_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' - else - image_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' - target.playsound_local(H, 'sound/weapons/saberon.ogg',35,1) - A = image(image_file,H,"dualsaberred1", layer=ABOVE_MOB_LAYER) - if("taser") - if(side == "right") - image_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' - else - image_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' - A = image(image_file,H,"advtaserstun4", layer=ABOVE_MOB_LAYER) - if("ebow") - if(side == "right") - image_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' - else - image_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' - A = image(image_file,H,"crossbow", layer=ABOVE_MOB_LAYER) - if("baton") - if(side == "right") - image_file = 'icons/mob/inhands/equipment/security_righthand.dmi' - else - image_file = 'icons/mob/inhands/equipment/security_lefthand.dmi' - target.playsound_local(H, SFX_SPARKS,75,1,-1) - A = image(image_file,H,"baton", layer=ABOVE_MOB_LAYER) - if("ttv") - if(side == "right") - image_file = 'icons/mob/inhands/weapons/bombs_righthand.dmi' - else - image_file = 'icons/mob/inhands/weapons/bombs_lefthand.dmi' - A = image(image_file,H,"ttv", layer=ABOVE_MOB_LAYER) - if("flash") - if(side == "right") - image_file = 'icons/mob/inhands/equipment/security_righthand.dmi' - else - image_file = 'icons/mob/inhands/equipment/security_lefthand.dmi' - A = image(image_file,H,"flashtool", layer=ABOVE_MOB_LAYER) - if("armblade") - if(side == "right") - image_file = 'icons/mob/inhands/antag/changeling_righthand.dmi' - else - image_file = 'icons/mob/inhands/antag/changeling_lefthand.dmi' - target.playsound_local(H, 'sound/effects/blobattack.ogg',30,1) - A = image(image_file,H,"arm_blade", layer=ABOVE_MOB_LAYER) - if(target.client) - target.client.images |= A - addtimer(CALLBACK(src, .proc/cleanup, item, A, H), rand(15 SECONDS, 25 SECONDS)) - return - qdel(src) - -/datum/hallucination/items_other/proc/cleanup(item, atom/image_used, has_the_item) - if (isnull(target)) - qdel(src) - return - if(item == "esword" || item == "dual_esword") - target.playsound_local(has_the_item, 'sound/weapons/saberoff.ogg',35,1) - if(item == "armblade") - target.playsound_local(has_the_item, 'sound/effects/blobattack.ogg',30,1) - target.client.images.Remove(image_used) - qdel(src) - -/datum/hallucination/delusion - var/list/image/delusions = list() - -/datum/hallucination/delusion/New(mob/living/carbon/C, forced, force_kind = null , duration = 300,skip_nearby = TRUE, custom_icon = null, custom_icon_file = null, custom_name = null) - set waitfor = FALSE - . = ..() - var/image/A = null - var/kind = force_kind ? force_kind : pick("nothing","monkey","corgi","carp","skeleton","demon","zombie") - feedback_details += "Type: [kind]" - var/list/nearby - if(skip_nearby) - nearby = get_hearers_in_view(7, target) - for(var/mob/living/carbon/human/H in GLOB.alive_mob_list) - if(H == target) - continue - if(skip_nearby && (H in nearby)) - continue - switch(kind) - if("nothing") - A = image('icons/effects/effects.dmi',H,"nothing") - A.name = "..." - if("monkey")//Monkey - A = image('icons/mob/human.dmi',H,"monkey") - A.name = "Monkey ([rand(1,999)])" - if("carp")//Carp - A = image('icons/mob/carp.dmi',H,"carp") - A.name = "Space Carp" - if("corgi")//Corgi - A = image('icons/mob/pets.dmi',H,"corgi") - A.name = "Corgi" - if("skeleton")//Skeletons - A = image('icons/mob/human.dmi',H,"skeleton") - A.name = "Skeleton" - if("zombie")//Zombies - A = image('icons/mob/human.dmi',H,"zombie") - A.name = "Zombie" - if("demon")//Demon - A = image('icons/mob/mob.dmi',H,"daemon") - A.name = "Demon" - if("custom") - A = image(custom_icon_file, H, custom_icon) - A.name = custom_name - A.override = 1 - if(target.client) - delusions |= A - target.client.images |= A - if(duration) - QDEL_IN(src, duration) - -/datum/hallucination/delusion/Destroy() - for(var/image/I in delusions) - if(target.client) - target.client.images.Remove(I) - return ..() - -/datum/hallucination/self_delusion - var/image/delusion - -/datum/hallucination/self_delusion/New(mob/living/carbon/C, forced, force_kind = null , duration = 300, custom_icon = null, custom_icon_file = null, wabbajack = TRUE) //set wabbajack to false if you want to use another fake source - set waitfor = FALSE - ..() - var/image/A = null - var/kind = force_kind ? force_kind : pick("monkey","corgi","carp","skeleton","demon","zombie","robot") - feedback_details += "Type: [kind]" - switch(kind) - if("monkey")//Monkey - A = image('icons/mob/human.dmi',target,"monkey") - if("carp")//Carp - A = image('icons/mob/animal.dmi',target,"carp") - if("corgi")//Corgi - A = image('icons/mob/pets.dmi',target,"corgi") - if("skeleton")//Skeletons - A = image('icons/mob/human.dmi',target,"skeleton") - if("zombie")//Zombies - A = image('icons/mob/human.dmi',target,"zombie") - if("demon")//Demon - A = image('icons/mob/mob.dmi',target,"daemon") - if("robot")//Cyborg - A = image('icons/mob/robots.dmi',target,"robot") - target.playsound_local(target,'sound/voice/liveagain.ogg', 75, 1) - if("custom") - A = image(custom_icon_file, target, custom_icon) - A.override = 1 - if(target.client) - if(wabbajack) - to_chat(target, span_hear("...wabbajack...wabbajack...")) - target.playsound_local(target,'sound/magic/staff_change.ogg', 50, 1) - delusion = A - target.client.images |= A - QDEL_IN(src, duration) - -/datum/hallucination/self_delusion/Destroy() - if(target.client) - target.client.images.Remove(delusion) - return ..() - -/datum/hallucination/bolts - var/list/airlocks_to_hit - var/list/locks - var/next_action = 0 - var/locking = TRUE - -/datum/hallucination/bolts/New(mob/living/carbon/C, forced, door_number) - set waitfor = FALSE - ..() - if(!door_number) - door_number = rand(0,4) //if 0 bolts all visible doors - var/count = 0 - feedback_details += "Door amount: [door_number]" - - for(var/obj/machinery/door/airlock/A in range(7, target)) - if(count>door_number && door_number>0) - break - if(!A.density) - continue - count++ - LAZYADD(airlocks_to_hit, A) - - if(!LAZYLEN(airlocks_to_hit)) //no valid airlocks in sight - qdel(src) - return - - START_PROCESSING(SSfastprocess, src) - -/datum/hallucination/bolts/process(delta_time) - next_action -= (delta_time * 10) - if (next_action > 0) - return - - if (locking) - var/atom/next_airlock = pop(airlocks_to_hit) - if (next_airlock) - var/obj/effect/hallucination/fake_door_lock/lock = new(get_turf(next_airlock)) - lock.target = target - lock.airlock = next_airlock - LAZYADD(locks, lock) - - if (!LAZYLEN(airlocks_to_hit)) - locking = FALSE - next_action = 10 SECONDS - return - else - var/obj/effect/hallucination/fake_door_lock/next_unlock = popleft(locks) - if (next_unlock) - next_unlock.unlock() - else - qdel(src) - return - - next_action = rand(4, 12) - -/datum/hallucination/bolts/Destroy() - . = ..() - QDEL_LIST(locks) - STOP_PROCESSING(SSfastprocess, src) - -/obj/effect/hallucination/fake_door_lock - layer = CLOSED_DOOR_LAYER + 1 //for Bump priority - plane = GAME_PLANE - var/image/bolt_light - var/obj/machinery/door/airlock/airlock - -/obj/effect/hallucination/fake_door_lock/proc/lock() - bolt_light = image(airlock.overlays_file, get_turf(airlock), "lights_bolts",layer=airlock.layer+0.1) - if(target.client) - target.client.images |= bolt_light - target.playsound_local(get_turf(airlock), 'sound/machines/boltsdown.ogg',30,0,3) - -/obj/effect/hallucination/fake_door_lock/proc/unlock() - if(target.client) - target.client.images.Remove(bolt_light) - target.playsound_local(get_turf(airlock), 'sound/machines/boltsup.ogg',30,0,3) - qdel(src) - -/obj/effect/hallucination/fake_door_lock/CanAllowThrough(atom/movable/mover, border_dir) - . = ..() - if(mover == target && airlock.density) - return FALSE - -/datum/hallucination/chat - -/datum/hallucination/chat/New(mob/living/carbon/C, forced = TRUE, force_radio, specific_message) - set waitfor = FALSE - ..() - var/target_name = target.first_name() - var/speak_messages = list("[pick_list_replacements(HAL_LINES_FILE, "suspicion")]",\ - "[pick_list_replacements(HAL_LINES_FILE, "conversation")]",\ - "[pick_list_replacements(HAL_LINES_FILE, "greetings")][target.first_name()]!",\ - "[pick_list_replacements(HAL_LINES_FILE, "getout")]",\ - "[pick_list_replacements(HAL_LINES_FILE, "weird")]",\ - "[pick_list_replacements(HAL_LINES_FILE, "didyouhearthat")]",\ - "[pick_list_replacements(HAL_LINES_FILE, "doubt")]",\ - "[pick_list_replacements(HAL_LINES_FILE, "aggressive")]",\ - "[pick_list_replacements(HAL_LINES_FILE, "help")]!!",\ - "[pick_list_replacements(HAL_LINES_FILE, "escape")]",\ - "I'm infected, [pick_list_replacements(HAL_LINES_FILE, "infection_advice")]!") - - var/radio_messages = list("[pick_list_replacements(HAL_LINES_FILE, "people")] is [pick_list_replacements(HAL_LINES_FILE, "accusations")]!",\ - "Help!",\ - "[pick_list_replacements(HAL_LINES_FILE, "threat")] in [pick_list_replacements(HAL_LINES_FILE, "location")][prob(50)?"!":"!!"]",\ - "[pick("Where's [target.first_name()]?", "Set [target.first_name()] to arrest!")]",\ - "[pick("C","Ai, c","Someone c","Rec")]all the shuttle!",\ - "AI [pick("rogue", "is dead")]!!") - - var/mob/living/carbon/person = null - var/datum/language/understood_language = target.get_random_understood_language() - for(var/mob/living/carbon/H in view(target)) - if(H == target) - continue - if(!person) - person = H - else - if(get_dist(target,H)[other] puts the [pick(\ - "revolver","energy sword","cryptographic sequencer","power sink","energy bow",\ - "hybrid taser","stun baton","flash","syringe gun","circular saw","tank transfer valve",\ - "ritual dagger","spellbook",\ - "Codex Cicatrix", "Living Heart",\ - "pulse rifle","captain's spare ID","hand teleporter","hypospray","antique laser gun","X-01 MultiPhase Energy Gun","station's blueprints"\ - )] into [equipped_backpack].
") - - message_pool.Add("[other] [pick("sneezes","coughs")].") - - message_pool.Add(span_notice("You hear something squeezing through the ducts..."), \ - span_notice("Your [pick("arm", "leg", "back", "head")] itches."),\ - span_warning("You feel [pick("hot","cold","dry","wet","woozy","faint")]."), - span_warning("Your stomach rumbles."), - span_warning("Your head hurts."), - span_warning("You hear a faint buzz in your head."), - "[target] sneezes.") - if(prob(10)) - message_pool.Add(span_warning("Behind you."),\ - span_warning("You hear a faint laughter."), - span_warning("You see something move."), - span_warning("You hear skittering on the ceiling."), - span_warning("You see an inhumanly tall silhouette moving in the distance.")) - if(prob(10)) - message_pool.Add("[pick_list_replacements(HAL_LINES_FILE, "advice")]") - var/chosen = pick(message_pool) - feedback_details += "Message: [chosen]" - to_chat(target, chosen) - qdel(src) - -/datum/hallucination/sounds - -/datum/hallucination/sounds/New(mob/living/carbon/C, forced = TRUE, sound_type) - set waitfor = FALSE - ..() - var/turf/source = random_far_turf() - if(!sound_type) - sound_type = pick("airlock","airlock pry","console","explosion","far explosion","mech","glass","alarm","beepsky","mech","wall decon","door hack") - feedback_details += "Type: [sound_type]" - //Strange audio - switch(sound_type) - if("airlock") - target.playsound_local(source,'sound/machines/airlock.ogg', 30, 1) - if("airlock pry") - target.playsound_local(source,'sound/machines/airlock_alien_prying.ogg', 100, 1) - addtimer(CALLBACK(target, /mob/.proc/playsound_local, source, 'sound/machines/airlockforced.ogg', 30, 1), 50) - if("console") - target.playsound_local(source,'sound/machines/terminal_prompt.ogg', 25, 1) - if("explosion") - if(prob(50)) - target.playsound_local(source,'sound/effects/explosion1.ogg', 50, 1) - else - target.playsound_local(source, 'sound/effects/explosion2.ogg', 50, 1) - if("far explosion") - target.playsound_local(source, 'sound/effects/explosionfar.ogg', 50, 1) - if("glass") - target.playsound_local(source, pick('sound/effects/glassbr1.ogg','sound/effects/glassbr2.ogg','sound/effects/glassbr3.ogg'), 50, 1) - if("alarm") - target.playsound_local(source, 'sound/machines/alarm.ogg', 100, 0) - if("beepsky") - target.playsound_local(source, 'sound/voice/beepsky/freeze.ogg', 35, 0) - if("mech") - new /datum/hallucination/mech_sounds(C, forced, sound_type) - //Deconstructing a wall - if("wall decon") - target.playsound_local(source, 'sound/items/welder.ogg', 50, 1) - addtimer(CALLBACK(target, /mob/.proc/playsound_local, source, 'sound/items/welder2.ogg', 50, 1), 105) - addtimer(CALLBACK(target, /mob/.proc/playsound_local, source, 'sound/items/ratchet.ogg', 50, 1), 120) - //Hacking a door - if("door hack") - target.playsound_local(source, 'sound/items/screwdriver.ogg', 50, 1) - addtimer(CALLBACK(target, /mob/.proc/playsound_local, source, 'sound/machines/airlockforced.ogg', 30, 1), rand(40, 80)) - qdel(src) - -/datum/hallucination/mech_sounds - var/mech_dir - var/steps_left - var/next_action = 0 - var/turf/source - -/datum/hallucination/mech_sounds/New() - . = ..() - mech_dir = pick(GLOB.cardinals) - steps_left = rand(4, 9) - source = random_far_turf() - START_PROCESSING(SSfastprocess, src) - -/datum/hallucination/mech_sounds/process(delta_time) - next_action -= delta_time - if (next_action > 0) - return - - if(prob(75)) - target.playsound_local(source, 'sound/mecha/mechstep.ogg', 40, 1) - source = get_step(source, mech_dir) - else - target.playsound_local(source, 'sound/mecha/mechturn.ogg', 40, 1) - mech_dir = pick(GLOB.cardinals) - - steps_left -= 1 - if (!steps_left) - qdel(src) - return - next_action = 1 - -/datum/hallucination/mech_sounds/Destroy() - . = ..() - STOP_PROCESSING(SSfastprocess, src) - -/datum/hallucination/weird_sounds - -/datum/hallucination/weird_sounds/New(mob/living/carbon/C, forced = TRUE, sound_type) - set waitfor = FALSE - ..() - var/turf/source = random_far_turf() - if(!sound_type) - sound_type = pick("phone","hallelujah","highlander","laughter","hyperspace","game over","creepy","tesla") - feedback_details += "Type: [sound_type]" - //Strange audio - switch(sound_type) - if("phone") - target.playsound_local(source, 'sound/weapons/ring.ogg', 15) - for (var/next_rings in 1 to 3) - addtimer(CALLBACK(target, /mob/.proc/playsound_local, source, 'sound/weapons/ring.ogg', 15), 25 * next_rings) - if("hyperspace") - target.playsound_local(null, 'sound/runtime/hyperspace/hyperspace_begin.ogg', 50) - if("hallelujah") - target.playsound_local(source, 'sound/effects/pray_chaplain.ogg', 50) - if("highlander") - target.playsound_local(null, 'sound/misc/highlander.ogg', 50) - if("game over") - target.playsound_local(source, 'sound/misc/compiler-failure.ogg', 50) - if("laughter") - if(prob(50)) - target.playsound_local(source, 'sound/voice/human/womanlaugh.ogg', 50, 1) - else - target.playsound_local(source, pick('sound/voice/human/manlaugh1.ogg', 'sound/voice/human/manlaugh2.ogg'), 50, 1) - if("creepy") - //These sounds are (mostly) taken from Hidden: Source - target.playsound_local(source, pick(GLOB.creepy_ambience), 50, 1) - if("tesla") //Tesla loose! - target.playsound_local(source, 'sound/magic/lightningbolt.ogg', 35, 1) - addtimer(CALLBACK(target, /mob/.proc/playsound_local, source, 'sound/magic/lightningbolt.ogg', 65, 1), 30) - addtimer(CALLBACK(target, /mob/.proc/playsound_local, source, 'sound/magic/lightningbolt.ogg', 100, 1), 60) - - qdel(src) - -/datum/hallucination/stationmessage - -/datum/hallucination/stationmessage/New(mob/living/carbon/C, forced = TRUE, message) - set waitfor = FALSE - ..() - if(!message) - message = pick("ratvar","shuttle dock","blob alert","malf ai","meteors","supermatter") - feedback_details += "Type: [message]" - switch(message) - if("blob alert") - to_chat(target, "

Biohazard Alert

") - to_chat(target, "

[span_alert("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.")]

") - SEND_SOUND(target, SSstation.announcer.event_sounds[ANNOUNCER_OUTBREAK5]) - if("ratvar") - target.playsound_local(target, 'sound/machines/clockcult/ark_deathrattle.ogg', 50, FALSE, pressure_affected = FALSE) - target.playsound_local(target, 'sound/effects/clockcult_gateway_disrupted.ogg', 50, FALSE, pressure_affected = FALSE) - addtimer(CALLBACK( - target, - /mob/.proc/playsound_local, - target, - 'sound/effects/explosion_distant.ogg', - 50, - FALSE, - /* frequency = */ null, - /* falloff_exponential = */ null, - /* channel = */ null, - /* pressure_affected = */ FALSE - ), 27) - if("shuttle dock") - to_chat(target, "

Priority Announcement

") - to_chat(target, "

[span_alert("The Emergency Shuttle has docked with the station. You have 3 minutes to board the Emergency Shuttle.")]

") - SEND_SOUND(target, SSstation.announcer.event_sounds[ANNOUNCER_SHUTTLEDOCK]) - if("malf ai") //AI is doomsdaying! - to_chat(target, "

Anomaly Alert

") - to_chat(target, "

[span_alert("Hostile runtimes detected in all station systems, please deactivate your AI to prevent possible damage to its morality core.")]

") - SEND_SOUND(target, SSstation.announcer.event_sounds[ANNOUNCER_AIMALF]) - if("meteors") //Meteors inbound! - to_chat(target, "

Meteor Alert

") - to_chat(target, "

[span_alert("Meteors have been detected on collision course with the station.")]

") - SEND_SOUND(target, SSstation.announcer.event_sounds[ANNOUNCER_METEORS]) - if("supermatter") - SEND_SOUND(target, 'sound/magic/charge.ogg') - to_chat(target, span_boldannounce("You feel reality distort for a moment...")) - -/datum/hallucination/hudscrew - -/datum/hallucination/hudscrew/New(mob/living/carbon/C, forced = TRUE, screwyhud_type) - set waitfor = FALSE - ..() - //Screwy HUD - var/chosen_screwyhud = screwyhud_type - if(!chosen_screwyhud) - chosen_screwyhud = pick(SCREWYHUD_CRIT,SCREWYHUD_DEAD,SCREWYHUD_HEALTHY) - target.set_screwyhud(chosen_screwyhud) - feedback_details += "Type: [target.hal_screwyhud]" - QDEL_IN(src, rand(100, 250)) - -/datum/hallucination/hudscrew/Destroy() - target?.set_screwyhud(SCREWYHUD_NONE) - return ..() - -/datum/hallucination/fake_alert - var/alert_type - -/datum/hallucination/fake_alert/New(mob/living/carbon/C, forced = TRUE, specific, duration = 150) - set waitfor = FALSE - ..() - alert_type = pick( - ALERT_NOT_ENOUGH_OXYGEN, - ALERT_NOT_ENOUGH_PLASMA, - ALERT_NOT_ENOUGH_CO2, - ALERT_TOO_MUCH_OXYGEN, - ALERT_TOO_MUCH_CO2, - ALERT_TOO_MUCH_PLASMA, - ALERT_NUTRITION, - ALERT_GRAVITY, - ALERT_FIRE, - ALERT_TEMPERATURE_HOT, - ALERT_TEMPERATURE_COLD, - ALERT_PRESSURE, - ALERT_NEW_LAW, - ALERT_LOCKED, - ALERT_HACKED, - ALERT_CHARGE, - ) - - if(specific) - alert_type = specific - feedback_details += "Type: [alert_type]" - switch(alert_type) - if(ALERT_NOT_ENOUGH_OXYGEN) - target.throw_alert(alert_type, /atom/movable/screen/alert/not_enough_oxy, override = TRUE) - if(ALERT_NOT_ENOUGH_PLASMA) - target.throw_alert(alert_type, /atom/movable/screen/alert/not_enough_plas, override = TRUE) - if(ALERT_NOT_ENOUGH_CO2) - target.throw_alert(alert_type, /atom/movable/screen/alert/not_enough_co2, override = TRUE) - if(ALERT_TOO_MUCH_OXYGEN) - target.throw_alert(alert_type, /atom/movable/screen/alert/too_much_oxy, override = TRUE) - if(ALERT_TOO_MUCH_CO2) - target.throw_alert(alert_type, /atom/movable/screen/alert/too_much_co2, override = TRUE) - if(ALERT_TOO_MUCH_PLASMA) - target.throw_alert(alert_type, /atom/movable/screen/alert/too_much_plas, override = TRUE) - if(ALERT_NUTRITION) - if(prob(50)) - target.throw_alert(alert_type, /atom/movable/screen/alert/fat, override = TRUE) - else - target.throw_alert(alert_type, /atom/movable/screen/alert/starving, override = TRUE) - if(ALERT_GRAVITY) - target.throw_alert(alert_type, /atom/movable/screen/alert/weightless, override = TRUE) - if(ALERT_FIRE) - target.throw_alert(alert_type, /atom/movable/screen/alert/fire, override = TRUE) - if(ALERT_TEMPERATURE_HOT) - alert_type = "temp" - target.throw_alert(alert_type, /atom/movable/screen/alert/hot, 3, override = TRUE) - if(ALERT_TEMPERATURE_COLD) - alert_type = "temp" - target.throw_alert(alert_type, /atom/movable/screen/alert/cold, 3, override = TRUE) - if(ALERT_PRESSURE) - if(prob(50)) - target.throw_alert(alert_type, /atom/movable/screen/alert/highpressure, 2, override = TRUE) - else - target.throw_alert(alert_type, /atom/movable/screen/alert/lowpressure, 2, override = TRUE) - //BEEP BOOP I AM A ROBOT - if(ALERT_NEW_LAW) - target.throw_alert(alert_type, /atom/movable/screen/alert/newlaw, override = TRUE) - if(ALERT_LOCKED) - target.throw_alert(alert_type, /atom/movable/screen/alert/locked, override = TRUE) - if(ALERT_HACKED) - target.throw_alert(alert_type, /atom/movable/screen/alert/hacked, override = TRUE) - if(ALERT_CHARGE) - target.throw_alert(alert_type, /atom/movable/screen/alert/emptycell, override = TRUE) - - addtimer(CALLBACK(src, .proc/cleanup), duration) - -/datum/hallucination/fake_alert/proc/cleanup() - target.clear_alert(alert_type, clear_override = TRUE) - qdel(src) - -///Causes the target to see incorrect health damages on the healthdoll -/datum/hallucination/fake_health_doll - var/timer_id = null - -///Creates a specified doll hallucination, or picks one randomly -/datum/hallucination/fake_health_doll/New(mob/living/carbon/human/human_mob, forced = TRUE, specific_limb, severity, duration = 500) - . = ..() - if(!specific_limb) - specific_limb = pick(list(SCREWYDOLL_HEAD, SCREWYDOLL_CHEST, SCREWYDOLL_L_ARM, SCREWYDOLL_R_ARM, SCREWYDOLL_L_LEG, SCREWYDOLL_R_LEG)) - if(!severity) - severity = rand(1, 5) - LAZYSET(human_mob.hal_screwydoll, specific_limb, severity) - human_mob.update_health_hud() - - timer_id = addtimer(CALLBACK(src, .proc/cleanup), duration, TIMER_STOPPABLE) - -///Increments the severity of the damage seen on the doll -/datum/hallucination/fake_health_doll/proc/increment_fake_damage() - if(!ishuman(target)) - stack_trace("Somehow [target] managed to get a fake health doll hallucination, while not being a human mob.") - var/mob/living/carbon/human/human_mob = target - for(var/entry in human_mob.hal_screwydoll) - human_mob.hal_screwydoll[entry] = clamp(human_mob.hal_screwydoll[entry]+1, 1, 5) - human_mob.update_health_hud() - -///Adds a fake limb to the hallucination datum effect -/datum/hallucination/fake_health_doll/proc/add_fake_limb(specific_limb, severity) - if(!specific_limb) - specific_limb = pick(list(SCREWYDOLL_HEAD, SCREWYDOLL_CHEST, SCREWYDOLL_L_ARM, SCREWYDOLL_R_ARM, SCREWYDOLL_L_LEG, SCREWYDOLL_R_LEG)) - if(!severity) - severity = rand(1, 5) - var/mob/living/carbon/human/human_mob = target - LAZYSET(human_mob.hal_screwydoll, specific_limb, severity) - target.update_health_hud() - -/datum/hallucination/fake_health_doll/target_deleting() - if(isnull(timer_id)) - return - deltimer(timer_id) - timer_id = null - ..() - -///Cleans up the hallucinations - this deletes any overlap, but that shouldn't happen. -/datum/hallucination/fake_health_doll/proc/cleanup() - qdel(src) - -//So that the associated addition proc cleans it up correctly -/datum/hallucination/fake_health_doll/Destroy() - if(!ishuman(target)) - stack_trace("Somehow [target] managed to get a fake health doll hallucination, while not being a human mob.") - var/mob/living/carbon/human/human_mob = target - LAZYNULL(human_mob.hal_screwydoll) - human_mob.update_health_hud() - return ..() - - -/datum/hallucination/items/New(mob/living/carbon/C, forced = TRUE) - set waitfor = FALSE - ..() - //Strange items - - var/obj/halitem = new - - halitem = new - var/obj/item/l_hand = target.get_item_for_held_index(1) - var/obj/item/r_hand = target.get_item_for_held_index(2) - var/l = ui_hand_position(target.get_held_index_of_item(l_hand)) - var/r = ui_hand_position(target.get_held_index_of_item(r_hand)) - var/list/slots_free = list(l,r) - if(l_hand) - slots_free -= l - if(r_hand) - slots_free -= r - if(ishuman(target)) - var/mob/living/carbon/human/H = target - if(!H.belt) - slots_free += ui_belt - if(!H.l_store) - slots_free += ui_storage1 - if(!H.r_store) - slots_free += ui_storage2 - if(slots_free.len) - halitem.screen_loc = pick(slots_free) - halitem.plane = ABOVE_HUD_PLANE - switch(rand(1,6)) - if(1) //revolver - halitem.icon = 'icons/obj/guns/ballistic.dmi' - halitem.icon_state = "revolver" - halitem.name = "Revolver" - if(2) //c4 - halitem.icon = 'icons/obj/grenade.dmi' - halitem.icon_state = "plastic-explosive0" - halitem.name = "C4" - if(prob(25)) - halitem.icon_state = "plasticx40" - if(3) //sword - halitem.icon = 'icons/obj/transforming_energy.dmi' - halitem.icon_state = "e_sword" - halitem.name = "energy sword" - if(4) //stun baton - halitem.icon = 'icons/obj/items_and_weapons.dmi' - halitem.icon_state = "stunbaton" - halitem.name = "Stun Baton" - if(5) //emag - halitem.icon = 'icons/obj/card.dmi' - halitem.icon_state = "emag" - halitem.name = "Cryptographic Sequencer" - if(6) //flashbang - halitem.icon = 'icons/obj/grenade.dmi' - halitem.icon_state = "flashbang1" - halitem.name = "Flashbang" - feedback_details += "Type: [halitem.name]" - if(target.client) - target.client.screen += halitem - QDEL_IN(halitem, rand(150, 350)) - - qdel(src) - -/datum/hallucination/dangerflash - -/datum/hallucination/dangerflash/New(mob/living/carbon/C, forced = TRUE, danger_type) - set waitfor = FALSE - ..() - //Flashes of danger - - var/list/possible_points = list() - for(var/turf/open/floor/F in view(target,world.view)) - possible_points += F - if(possible_points.len) - var/turf/open/floor/danger_point = pick(possible_points) - if(!danger_type) - danger_type = pick("lava","chasm","anomaly") - switch(danger_type) - if("lava") - new /obj/effect/hallucination/danger/lava(danger_point, target) - if("chasm") - new /obj/effect/hallucination/danger/chasm(danger_point, target) - if("anomaly") - new /obj/effect/hallucination/danger/anomaly(danger_point, target) - - qdel(src) - -/obj/effect/hallucination/danger - var/image/image - -/obj/effect/hallucination/danger/proc/show_icon() - return - -/obj/effect/hallucination/danger/proc/clear_icon() - if(image && target.client) - target.client.images -= image - -/obj/effect/hallucination/danger/Initialize(mapload, _target) - . = ..() - target = _target - show_icon() - QDEL_IN(src, rand(200, 450)) - -/obj/effect/hallucination/danger/Destroy() - clear_icon() - . = ..() - -/obj/effect/hallucination/danger/lava - name = "lava" - -/obj/effect/hallucination/danger/lava/Initialize(mapload, _target) - . = ..() - var/static/list/loc_connections = list( - COMSIG_ATOM_ENTERED = .proc/on_entered, - ) - AddElement(/datum/element/connect_loc, loc_connections) - -/obj/effect/hallucination/danger/lava/show_icon() - var/turf/danger_turf = get_turf(src) - image = image('icons/turf/floors/lava.dmi', src, "lava-[danger_turf.smoothing_junction || 0]", TURF_LAYER) - if(target.client) - target.client.images += image - -/obj/effect/hallucination/danger/lava/proc/on_entered(datum/source, atom/movable/AM) - SIGNAL_HANDLER - if(AM == target) - target.adjustStaminaLoss(20) - new /datum/hallucination/fire(target) - -/obj/effect/hallucination/danger/chasm - name = "chasm" - -/obj/effect/hallucination/danger/chasm/Initialize(mapload, _target) - . = ..() - var/static/list/loc_connections = list( - COMSIG_ATOM_ENTERED = .proc/on_entered, - ) - AddElement(/datum/element/connect_loc, loc_connections) - -/obj/effect/hallucination/danger/chasm/show_icon() - var/turf/danger_turf = get_turf(src) - image = image('icons/turf/floors/chasms.dmi', src, "chasms-[danger_turf.smoothing_junction || 0]", TURF_LAYER) - if(target.client) - target.client.images += image - -/obj/effect/hallucination/danger/chasm/proc/on_entered(datum/source, atom/movable/AM) - SIGNAL_HANDLER - if(AM == target) - if(istype(target, /obj/effect/dummy/phased_mob)) - return - to_chat(target, span_userdanger("You fall into the chasm!")) - target.Paralyze(40) - addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, target, span_notice("It's surprisingly shallow.")), 15) - QDEL_IN(src, 30) - -/obj/effect/hallucination/danger/anomaly - name = "flux wave anomaly" - -/obj/effect/hallucination/danger/anomaly/Initialize(mapload) - . = ..() - START_PROCESSING(SSobj, src) - var/static/list/loc_connections = list( - COMSIG_ATOM_ENTERED = .proc/on_entered, - ) - AddElement(/datum/element/connect_loc, loc_connections) - -/obj/effect/hallucination/danger/anomaly/process(delta_time) - if(DT_PROB(45, delta_time)) - step(src,pick(GLOB.alldirs)) - -/obj/effect/hallucination/danger/anomaly/Destroy() - STOP_PROCESSING(SSobj, src) - return ..() - -/obj/effect/hallucination/danger/anomaly/show_icon() - image = image('icons/effects/effects.dmi',src,"electricity2",OBJ_LAYER+0.01) - if(target.client) - target.client.images += image - -/obj/effect/hallucination/danger/anomaly/proc/on_entered(datum/source, atom/movable/AM) - SIGNAL_HANDLER - if(AM == target) - new /datum/hallucination/shock(target) - -/datum/hallucination/death - -/datum/hallucination/death/New(mob/living/carbon/C, forced = TRUE) - set waitfor = FALSE - ..() - target.set_screwyhud(SCREWYHUD_DEAD) - target.Paralyze(300) - target.silent += 10 - to_chat(target, span_deadsay("[target.real_name] has died at [get_area_name(target)].")) - - var/delay = 0 - - if(prob(50)) - var/mob/fakemob - var/list/dead_people = list() - for(var/mob/dead/observer/G in GLOB.player_list) - dead_people += G - if(LAZYLEN(dead_people)) - fakemob = pick(dead_people) - else - fakemob = target //ever been so lonely you had to haunt yourself? - if(fakemob) - delay = rand(20, 50) - addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, target, "DEAD: [fakemob.name] says, \"[pick("rip","why did i just drop dead?","hey [target.first_name()]","git gud","you too?","is the AI rogue?",\ - "i[prob(50)?" fucking":""] hate [pick("blood cult", "clock cult", "revenants", "this round","this","myself","admins","you")]")]\""), delay) - - addtimer(CALLBACK(src, .proc/cleanup), delay + rand(70, 90)) - -/datum/hallucination/death/proc/cleanup() - if (target) - target.set_screwyhud(SCREWYHUD_NONE) - target.SetParalyzed(0) - target.silent = FALSE - qdel(src) - -#define RAISE_FIRE_COUNT 3 -#define RAISE_FIRE_TIME 3 - -/datum/hallucination/fire - var/active = TRUE - var/stage = 0 - var/image/fire_overlay - - var/next_action = 0 - var/times_to_lower_stamina - var/fire_clearing = FALSE - var/increasing_stages = TRUE - var/time_spent = 0 - -/datum/hallucination/fire/New(mob/living/carbon/C, forced = TRUE) - set waitfor = FALSE - ..() - target.set_fire_stacks(max(target.fire_stacks, 0.1)) //Placebo flammability - fire_overlay = image('icons/mob/onfire.dmi', target, "human_burning", ABOVE_MOB_LAYER) - if(target.client) - target.client.images += fire_overlay - to_chat(target, span_userdanger("You're set on fire!")) - target.throw_alert(ALERT_FIRE, /atom/movable/screen/alert/fire, override = TRUE) - times_to_lower_stamina = rand(5, 10) - addtimer(CALLBACK(src, .proc/start_expanding), 20) - -/datum/hallucination/fire/Destroy() - . = ..() - STOP_PROCESSING(SSfastprocess, src) - -/datum/hallucination/fire/proc/start_expanding() - if (isnull(target)) - qdel(src) - return - START_PROCESSING(SSfastprocess, src) - -/datum/hallucination/fire/process(delta_time) - if (isnull(target)) - qdel(src) - return - - if(target.fire_stacks <= 0) - clear_fire() - - time_spent += delta_time - - if (fire_clearing) - next_action -= delta_time - if (next_action < 0) - stage -= 1 - update_temp() - next_action += 3 - else if (increasing_stages) - var/new_stage = min(round(time_spent / RAISE_FIRE_TIME), RAISE_FIRE_COUNT) - if (stage != new_stage) - stage = new_stage - update_temp() - - if (stage == RAISE_FIRE_COUNT) - increasing_stages = FALSE - else if (times_to_lower_stamina) - next_action -= delta_time - if (next_action < 0) - target.adjustStaminaLoss(15) - next_action += 2 - times_to_lower_stamina -= 1 - else - clear_fire() - -/datum/hallucination/fire/proc/update_temp() - if(stage <= 0) - target.clear_alert(ALERT_TEMPERATURE, clear_override = TRUE) - else - target.clear_alert(ALERT_TEMPERATURE, clear_override = TRUE) - target.throw_alert(ALERT_TEMPERATURE, /atom/movable/screen/alert/hot, stage, override = TRUE) - -/datum/hallucination/fire/proc/clear_fire() - if(!active) - return - active = FALSE - target.clear_alert(ALERT_FIRE, clear_override = TRUE) - if(target.client) - target.client.images -= fire_overlay - QDEL_NULL(fire_overlay) - fire_clearing = TRUE - next_action = 0 - -#undef RAISE_FIRE_COUNT -#undef RAISE_FIRE_TIME - -/datum/hallucination/shock - var/image/shock_image - var/image/electrocution_skeleton_anim - -/datum/hallucination/shock/New(mob/living/carbon/C, forced = TRUE) - set waitfor = FALSE - ..() - shock_image = image(target, target, dir = target.dir) - shock_image.appearance_flags |= KEEP_APART - shock_image.color = rgb(0,0,0) - shock_image.override = TRUE - electrocution_skeleton_anim = image('icons/mob/human.dmi', target, icon_state = "electrocuted_base", layer=ABOVE_MOB_LAYER) - electrocution_skeleton_anim.appearance_flags |= RESET_COLOR|KEEP_APART - to_chat(target, span_userdanger("You feel a powerful shock course through your body!")) - if(target.client) - target.client.images |= shock_image - target.client.images |= electrocution_skeleton_anim - addtimer(CALLBACK(src, .proc/reset_shock_animation), 40) - target.playsound_local(get_turf(src), SFX_SPARKS, 100, 1) - target.staminaloss += 50 - target.Stun(4 SECONDS) - target.do_jitter_animation(300) // Maximum jitter - target.adjust_timed_status_effect(20 SECONDS, /datum/status_effect/jitter) - addtimer(CALLBACK(src, .proc/shock_drop), 2 SECONDS) - -/datum/hallucination/shock/proc/reset_shock_animation() - target.client?.images.Remove(shock_image) - target.client?.images.Remove(electrocution_skeleton_anim) - -/datum/hallucination/shock/proc/shock_drop() - target.Paralyze(6 SECONDS) - -/datum/hallucination/husks - var/image/halbody - -/datum/hallucination/husks/New(mob/living/carbon/C, forced = TRUE) - set waitfor = FALSE - ..() - var/list/possible_points = list() - for(var/turf/open/floor/F in view(target,world.view)) - possible_points += F - if(possible_points.len) - var/turf/open/floor/husk_point = pick(possible_points) - switch(rand(1,4)) - if(1) - var/image/body = image('icons/mob/human.dmi',husk_point,"husk",TURF_LAYER) - var/matrix/M = matrix() - M.Turn(90) - body.transform = M - halbody = body - if(2,3) - halbody = image('icons/mob/human.dmi',husk_point,"husk",TURF_LAYER) - if(4) - halbody = image('icons/mob/alien.dmi',husk_point,"alienother",TURF_LAYER) - - if(target.client) - target.client.images += halbody - QDEL_IN(src, rand(30,50)) //Only seen for a brief moment. - -/datum/hallucination/husks/Destroy() - target?.client?.images -= halbody - QDEL_NULL(halbody) - return ..() - -//hallucination projectile code in code/modules/projectiles/projectile/special.dm -/datum/hallucination/stray_bullet - -/datum/hallucination/stray_bullet/New(mob/living/carbon/C, forced = TRUE) - set waitfor = FALSE - ..() - var/list/turf/startlocs = list() - for(var/turf/open/T in view(world.view+1,target)-view(world.view,target)) - startlocs += T - if(!startlocs.len) - qdel(src) - return - var/turf/start = pick(startlocs) - var/proj_type = pick(subtypesof(/obj/projectile/hallucination)) - feedback_details += "Type: [proj_type]" - var/obj/projectile/hallucination/H = new proj_type(start) - target.playsound_local(start, H.hal_fire_sound, 60, 1) - H.hal_target = target - H.preparePixelProjectile(target, start) - H.fire() - qdel(src) diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm index 0ab101c3499c25..1eb2b5798bbc1a 100644 --- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm +++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm @@ -15,6 +15,7 @@ volume = 100 force = 15 //Smashing bottles over someone's head hurts. throwforce = 15 + demolition_mod = 0.25 inhand_icon_state = "beer" //Generic held-item sprite until unique ones are made. lefthand_file = 'icons/mob/inhands/misc/food_lefthand.dmi' righthand_file = 'icons/mob/inhands/misc/food_righthand.dmi' @@ -119,6 +120,7 @@ throwforce = 5 throw_speed = 3 throw_range = 5 + demolition_mod = 0.25 w_class = WEIGHT_CLASS_TINY inhand_icon_state = "broken_beer" lefthand_file = 'icons/mob/inhands/misc/food_lefthand.dmi' @@ -652,16 +654,16 @@ isGlass = FALSE return -/obj/item/reagent_containers/food/drinks/bottle/molotov/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) +/obj/item/reagent_containers/food/drinks/bottle/molotov/smash(atom/target, mob/thrower, ranged = FALSE) var/firestarter = 0 - for(var/datum/reagent/R in reagents.reagent_list) - for(var/A in accelerants) - if(istype(R,A)) + for(var/datum/reagent/contained_reagent in reagents.reagent_list) + for(var/accelerant_type in accelerants) + if(istype(contained_reagent, accelerant_type)) firestarter = 1 break if(firestarter && active) - hit_atom.fire_act() - new /obj/effect/hotspot(get_turf(hit_atom)) + target.fire_act() + new /obj/effect/hotspot(get_turf(target)) ..() /obj/item/reagent_containers/food/drinks/bottle/molotov/attackby(obj/item/I, mob/user, params) diff --git a/code/modules/food_and_drinks/food.dm b/code/modules/food_and_drinks/food.dm index 55863d8e4c9c7e..a926cf78d8cc37 100644 --- a/code/modules/food_and_drinks/food.dm +++ b/code/modules/food_and_drinks/food.dm @@ -21,6 +21,12 @@ pixel_x = rand(-5, 5) pixel_y = rand(-5, 5) +/obj/item/reagent_containers/food/examine(mob/user) + . = ..() + if(foodtype) + var/list/types = bitfield_to_list(foodtype, FOOD_FLAGS) + . += span_notice("It is [lowertext(english_list(types))].") + /obj/item/reagent_containers/food/proc/checkLiked(fraction, mob/M) if(last_check_time + 50 < world.time) if(ishuman(M)) diff --git a/code/modules/food_and_drinks/kitchen_machinery/grill.dm b/code/modules/food_and_drinks/kitchen_machinery/grill.dm index 78ef29110c75e7..b9b4ff05de5c39 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/grill.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/grill.dm @@ -86,7 +86,7 @@ grill_fuel -= GRILL_FUELUSAGE_IDLE * delta_time if(DT_PROB(0.5, delta_time)) var/datum/effect_system/fluid_spread/smoke/bad/smoke = new - smoke.set_up(1, location = loc) + smoke.set_up(1, holder = src, location = loc) smoke.start() if(grilled_item) SEND_SIGNAL(grilled_item, COMSIG_ITEM_GRILLED, src, delta_time) diff --git a/code/modules/food_and_drinks/recipes/food_mixtures.dm b/code/modules/food_and_drinks/recipes/food_mixtures.dm index 839d99819ad241..7e6987b2ef4b4b 100644 --- a/code/modules/food_and_drinks/recipes/food_mixtures.dm +++ b/code/modules/food_and_drinks/recipes/food_mixtures.dm @@ -220,7 +220,7 @@ /datum/chemical_reaction/food/curd_cheese/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) var/location = get_turf(holder.my_atom) for(var/i = 1, i <= created_volume, i++) - new /obj/item/food/curd_cheese(location) + new /obj/item/food/cheese/curd_cheese(location) /datum/chemical_reaction/food/mozzarella required_reagents = list(/datum/reagent/consumable/milk = 10, /datum/reagent/consumable/cream = 10) @@ -232,7 +232,7 @@ /datum/chemical_reaction/food/mozzarella/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) var/location = get_turf(holder.my_atom) for(var/i = 1, i <= created_volume, i++) - new /obj/item/food/mozzarella(location) + new /obj/item/food/cheese/mozzarella(location) /datum/chemical_reaction/food/cornmeal_batter results = list(/datum/reagent/consumable/cornmeal_batter = 35) @@ -249,3 +249,19 @@ var/location = get_turf(holder.my_atom) for(var/i = 1, i <= created_volume, i++) new /obj/item/food/bread/corn(location) + +/datum/chemical_reaction/food/yoghurt + required_reagents = list(/datum/reagent/consumable/cream = 10, /datum/reagent/consumable/virus_food = 2) + results = list(/datum/reagent/consumable/yoghurt = 10) + mix_message = "The mixture thickens into yoghurt." + reaction_flags = REACTION_INSTANT + +/datum/chemical_reaction/food/quality_oil_upconvert + required_reagents = list(/datum/reagent/consumable/quality_oil = 1, /datum/reagent/consumable/cooking_oil = 2) + results = list(/datum/reagent/consumable/quality_oil = 2) + mix_message = "The cooking oil dilutes the quality oil- how delightfully devilish..." + reaction_flags = REACTION_INSTANT + +/datum/chemical_reaction/food/quality_oil + results = list(/datum/reagent/consumable/quality_oil = 2) + required_reagents = list(/datum/reagent/consumable/olivepaste = 4, /datum/reagent/water = 1) diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_frozen.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_frozen.dm index a9d662a144d534..bb725a1d40d564 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_frozen.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_frozen.dm @@ -297,8 +297,8 @@ result = /obj/item/food/popsicle/jumbo subcategory = CAT_ICE -/datum/crafting_recipe/food/nogga_black - name = "Nogga black" +/datum/crafting_recipe/food/licorice_creamsicle + name = "Licorice popsicle" reqs = list( /obj/item/popsicle_stick = 1, /datum/reagent/consumable/blumpkinjuice = 4, //natural source of ammonium chloride @@ -308,5 +308,5 @@ /datum/reagent/consumable/vanilla = 2, /datum/reagent/consumable/sugar = 2 ) - result = /obj/item/food/popsicle/nogga_black + result = /obj/item/food/popsicle/licorice_creamsicle subcategory = CAT_ICE diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_mexican.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_mexican.dm index d5b4ca3ca0d7db..f88b02764936bd 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_mexican.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_mexican.dm @@ -107,7 +107,7 @@ time = 40 reqs = list( /obj/item/food/meat/steak/goliath = 1, - /obj/item/organ/regenerative_core/legion = 1, + /obj/item/organ/internal/regenerative_core/legion = 1, /datum/reagent/consumable/ketchup = 2, /datum/reagent/consumable/capsaicin = 2 ) diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm index 249307c8e91acb..fcbc4d5fca985e 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm @@ -207,7 +207,7 @@ /datum/crafting_recipe/food/pesto name = "Pesto" reqs = list( - /obj/item/food/firm_cheese_slice = 1, + /obj/item/food/cheese/firm_cheese_slice = 1, /datum/reagent/consumable/salt = 5, /obj/item/food/grown/herbs = 2, /obj/item/food/grown/garlic = 1, @@ -241,9 +241,9 @@ /datum/crafting_recipe/food/pierogi name = "Pierogi" reqs = list( + /obj/item/food/doughslice = 1, /obj/item/food/grown/potato = 1, - /obj/item/food/grown/onion = 1, - /obj/item/food/bun = 1 + /obj/item/food/grown/onion = 1 ) result = /obj/item/food/pierogi subcategory = CAT_MISCFOOD diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_moth.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_moth.dm index 22ea5bf9482cfe..7f929e05325ab1 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_moth.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_moth.dm @@ -1,7 +1,7 @@ /datum/crafting_recipe/food/herby_cheese name = "Herby cheese" reqs = list( - /obj/item/food/curd_cheese = 1, + /obj/item/food/cheese/curd_cheese = 1, /obj/item/food/grown/herbs = 4 ) result = /obj/item/food/herby_cheese @@ -43,7 +43,7 @@ /datum/crafting_recipe/food/squeaking_stir_fry name = "Skeklitmischtpoppl (Squeaking stir fry)" reqs = list( - /obj/item/food/cheese_curds = 1, + /obj/item/food/cheese/cheese_curds = 1, /obj/item/food/tofu = 1, /obj/item/food/grown/chili = 1, /obj/item/food/salad/boiledrice = 1, @@ -68,7 +68,7 @@ /datum/crafting_recipe/food/loaded_curds name = "Ozlsettitæloskekllön ede pommes (Loaded curds and fries)" reqs = list( - /obj/item/food/cheese_curds = 1, + /obj/item/food/cheese/cheese_curds = 1, /obj/item/food/soup/vegetarian_chili = 1, /obj/item/food/onion_slice = 1, /obj/item/food/cheese/wedge = 1, @@ -92,7 +92,7 @@ /obj/item/food/pesto = 1, /obj/item/food/spaghetti/boiledspaghetti = 2, /obj/item/food/bechamel_sauce = 1, - /obj/item/food/firm_cheese_slice = 1 + /obj/item/food/cheese/firm_cheese_slice = 1 ) result = /obj/item/food/raw_green_lasagne subcategory = CAT_MOTH @@ -145,7 +145,7 @@ /datum/crafting_recipe/food/mozzarella_sticks name = "Mozzarella sticks" reqs = list( - /obj/item/food/mozzarella = 1, + /obj/item/food/cheese/mozzarella = 1, /obj/item/food/breadslice/plain = 2, /obj/item/food/tomato_sauce = 1 ) @@ -169,7 +169,7 @@ /obj/item/food/grown/potato = 1, /obj/item/food/onion_slice = 2, /obj/item/food/grown/chili = 1, - /obj/item/food/firm_cheese_slice = 1 + /obj/item/food/cheese/firm_cheese_slice = 1 ) result = /obj/item/food/fueljacks_lunch subcategory = CAT_MOTH @@ -309,8 +309,8 @@ reqs = list( /obj/item/food/soup/cornmeal_porridge = 1, /datum/reagent/consumable/milk = 5, - /obj/item/food/firm_cheese_slice = 1, - /obj/item/food/curd_cheese = 1, + /obj/item/food/cheese/firm_cheese_slice = 1, + /obj/item/food/cheese/curd_cheese = 1, /obj/item/food/butter = 1 ) result = /obj/item/food/soup/cheesy_porridge @@ -323,7 +323,7 @@ /obj/item/food/grown/eggplant = 1, /obj/item/food/breadslice/plain = 2, /obj/item/food/tomato_sauce = 1, - /obj/item/food/mozzarella = 1 + /obj/item/food/cheese/mozzarella = 1 ) result = /obj/item/food/soup/fried_eggplant_polenta subcategory = CAT_MOTH @@ -332,7 +332,7 @@ name = "Caprese salad" reqs = list( /obj/item/food/grown/tomato = 1, - /obj/item/food/mozzarella = 1, + /obj/item/food/cheese/mozzarella = 1, /obj/item/food/grown/herbs = 1, /datum/reagent/consumable/quality_oil = 2, /datum/reagent/consumable/vinegar = 2 @@ -383,8 +383,8 @@ reqs = list( /obj/item/food/mothic_pizza_dough = 1, /obj/item/food/tomato_sauce = 1, - /obj/item/food/mozzarella = 1, - /obj/item/food/firm_cheese_slice = 1, + /obj/item/food/cheese/mozzarella = 1, + /obj/item/food/cheese/firm_cheese_slice = 1, /obj/item/food/grown/herbs = 1 ) result = /obj/item/food/raw_mothic_margherita @@ -395,7 +395,7 @@ reqs = list( /obj/item/food/mothic_pizza_dough = 1, /datum/reagent/consumable/bbqsauce = 10, - /obj/item/food/firm_cheese_slice = 1, + /obj/item/food/cheese/firm_cheese_slice = 1, /obj/item/food/oven_baked_corn = 1, /obj/item/food/grown/ghost_chili = 1 ) @@ -407,11 +407,11 @@ reqs = list( /obj/item/food/mothic_pizza_dough = 1, /obj/item/food/tomato_sauce = 1, - /obj/item/food/firm_cheese_slice = 1, + /obj/item/food/cheese/firm_cheese_slice = 1, /obj/item/food/cheese/wedge = 1, - /obj/item/food/mozzarella = 1, + /obj/item/food/cheese/mozzarella = 1, /obj/item/food/herby_cheese = 1, - /obj/item/food/cheese_curds = 1 + /obj/item/food/cheese/cheese_curds = 1 ) result = /obj/item/food/raw_mothic_five_cheese subcategory = CAT_MOTH @@ -421,9 +421,9 @@ reqs = list( /obj/item/food/mothic_pizza_dough = 1, /obj/item/food/bechamel_sauce = 1, - /obj/item/food/firm_cheese_slice = 1, + /obj/item/food/cheese/firm_cheese_slice = 1, /obj/item/food/grown/garlic = 1, - /obj/item/food/mozzarella = 1, + /obj/item/food/cheese/mozzarella = 1, /obj/item/food/grown/herbs = 1 ) result = /obj/item/food/raw_mothic_white_pie @@ -435,7 +435,7 @@ /obj/item/food/mothic_pizza_dough = 1, /obj/item/food/pesto = 1, /obj/item/food/grown/tomato = 1, - /obj/item/food/mozzarella = 1 + /obj/item/food/cheese/mozzarella = 1 ) result = /obj/item/food/raw_mothic_pesto subcategory = CAT_MOTH @@ -454,7 +454,7 @@ /datum/crafting_recipe/food/moth_cheese_cakes name = "Ælorölen (Cheesecake balls)" reqs = list( - /obj/item/food/curd_cheese = 1, + /obj/item/food/cheese/curd_cheese = 1, /obj/item/food/chocolatebar = 1, /datum/reagent/consumable/flour = 5, /datum/reagent/consumable/sugar = 5, diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pizza.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pizza.dm index 34a20c444662c8..fe2755147648df 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pizza.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pizza.dm @@ -103,12 +103,10 @@ subcategory = CAT_PIZZA /datum/crafting_recipe/food/antspizza - name = "Ant Party pizza" + name = "Ant Party pizza slice" reqs = list( - /obj/item/food/pizzabread = 1, - /obj/item/food/cheese/wedge = 2, - /obj/item/food/grown/tomato = 1, - /datum/reagent/ants = 20 + /obj/item/food/pizzaslice/margherita = 1, + /datum/reagent/ants = 4 ) - result = /obj/item/food/pizza/ants + result = /obj/item/food/pizzaslice/ants subcategory = CAT_PIZZA diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_salad.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_salad.dm index 005abd9d1da743..070ea8d61bd281 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_salad.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_salad.dm @@ -77,10 +77,9 @@ name = "Jungle salad" reqs = list( /obj/item/reagent_containers/glass/bowl = 1, - /obj/item/food/grown/apple = 1, - /obj/item/food/grown/grapes = 1, + /obj/item/food/grown/apple = 2, + /obj/item/food/grown/grapes = 2, /obj/item/food/grown/banana = 2, - /obj/item/food/watermelonslice = 2 ) result = /obj/item/food/salad/jungle diff --git a/code/modules/hallucination/HUD.dm b/code/modules/hallucination/HUD.dm new file mode 100644 index 00000000000000..8e7bf445d701d6 --- /dev/null +++ b/code/modules/hallucination/HUD.dm @@ -0,0 +1,156 @@ +/* HUD Hallucinations + * + * Contains: + * Fake Alerts + * Health Alerts + * Health Doll Damage + */ + +/datum/hallucination/hudscrew + +/datum/hallucination/hudscrew/New(mob/living/carbon/C, forced = TRUE, screwyhud_type) + set waitfor = FALSE + ..() + //Screwy HUD + var/chosen_screwyhud = screwyhud_type + if(!chosen_screwyhud) + chosen_screwyhud = pick(SCREWYHUD_CRIT,SCREWYHUD_DEAD,SCREWYHUD_HEALTHY) + target.set_screwyhud(chosen_screwyhud) + feedback_details += "Type: [target.hal_screwyhud]" + QDEL_IN(src, rand(100, 250)) + +/datum/hallucination/hudscrew/Destroy() + target?.set_screwyhud(SCREWYHUD_NONE) + return ..() + +/datum/hallucination/fake_alert + var/alert_type + +/datum/hallucination/fake_alert/New(mob/living/carbon/C, forced = TRUE, specific, duration = 150) + set waitfor = FALSE + ..() + alert_type = pick( + ALERT_NOT_ENOUGH_OXYGEN, + ALERT_NOT_ENOUGH_PLASMA, + ALERT_NOT_ENOUGH_CO2, + ALERT_TOO_MUCH_OXYGEN, + ALERT_TOO_MUCH_CO2, + ALERT_TOO_MUCH_PLASMA, + ALERT_NUTRITION, + ALERT_GRAVITY, + ALERT_FIRE, + ALERT_TEMPERATURE_HOT, + ALERT_TEMPERATURE_COLD, + ALERT_PRESSURE, + ALERT_NEW_LAW, + ALERT_LOCKED, + ALERT_HACKED, + ALERT_CHARGE, + ) + + if(specific) + alert_type = specific + feedback_details += "Type: [alert_type]" + switch(alert_type) + if(ALERT_NOT_ENOUGH_OXYGEN) + target.throw_alert(alert_type, /atom/movable/screen/alert/not_enough_oxy, override = TRUE) + if(ALERT_NOT_ENOUGH_PLASMA) + target.throw_alert(alert_type, /atom/movable/screen/alert/not_enough_plas, override = TRUE) + if(ALERT_NOT_ENOUGH_CO2) + target.throw_alert(alert_type, /atom/movable/screen/alert/not_enough_co2, override = TRUE) + if(ALERT_TOO_MUCH_OXYGEN) + target.throw_alert(alert_type, /atom/movable/screen/alert/too_much_oxy, override = TRUE) + if(ALERT_TOO_MUCH_CO2) + target.throw_alert(alert_type, /atom/movable/screen/alert/too_much_co2, override = TRUE) + if(ALERT_TOO_MUCH_PLASMA) + target.throw_alert(alert_type, /atom/movable/screen/alert/too_much_plas, override = TRUE) + if(ALERT_NUTRITION) + if(prob(50)) + target.throw_alert(alert_type, /atom/movable/screen/alert/fat, override = TRUE) + else + target.throw_alert(alert_type, /atom/movable/screen/alert/starving, override = TRUE) + if(ALERT_GRAVITY) + target.throw_alert(alert_type, /atom/movable/screen/alert/weightless, override = TRUE) + if(ALERT_FIRE) + target.throw_alert(alert_type, /atom/movable/screen/alert/fire, override = TRUE) + if(ALERT_TEMPERATURE_HOT) + alert_type = "temp" + target.throw_alert(alert_type, /atom/movable/screen/alert/hot, 3, override = TRUE) + if(ALERT_TEMPERATURE_COLD) + alert_type = "temp" + target.throw_alert(alert_type, /atom/movable/screen/alert/cold, 3, override = TRUE) + if(ALERT_PRESSURE) + if(prob(50)) + target.throw_alert(alert_type, /atom/movable/screen/alert/highpressure, 2, override = TRUE) + else + target.throw_alert(alert_type, /atom/movable/screen/alert/lowpressure, 2, override = TRUE) + //BEEP BOOP I AM A ROBOT + if(ALERT_NEW_LAW) + target.throw_alert(alert_type, /atom/movable/screen/alert/newlaw, override = TRUE) + if(ALERT_LOCKED) + target.throw_alert(alert_type, /atom/movable/screen/alert/locked, override = TRUE) + if(ALERT_HACKED) + target.throw_alert(alert_type, /atom/movable/screen/alert/hacked, override = TRUE) + if(ALERT_CHARGE) + target.throw_alert(alert_type, /atom/movable/screen/alert/emptycell, override = TRUE) + + addtimer(CALLBACK(src, .proc/cleanup), duration) + +/datum/hallucination/fake_alert/proc/cleanup() + target.clear_alert(alert_type, clear_override = TRUE) + qdel(src) + +///Causes the target to see incorrect health damages on the healthdoll +/datum/hallucination/fake_health_doll + var/timer_id = null + +///Creates a specified doll hallucination, or picks one randomly +/datum/hallucination/fake_health_doll/New(mob/living/carbon/human/human_mob, forced = TRUE, specific_limb, severity, duration = 500) + . = ..() + if(!specific_limb) + specific_limb = pick(list(SCREWYDOLL_HEAD, SCREWYDOLL_CHEST, SCREWYDOLL_L_ARM, SCREWYDOLL_R_ARM, SCREWYDOLL_L_LEG, SCREWYDOLL_R_LEG)) + if(!severity) + severity = rand(1, 5) + LAZYSET(human_mob.hal_screwydoll, specific_limb, severity) + human_mob.update_health_hud() + + timer_id = addtimer(CALLBACK(src, .proc/cleanup), duration, TIMER_STOPPABLE) + +///Increments the severity of the damage seen on the doll +/datum/hallucination/fake_health_doll/proc/increment_fake_damage() + if(!ishuman(target)) + stack_trace("Somehow [target] managed to get a fake health doll hallucination, while not being a human mob.") + var/mob/living/carbon/human/human_mob = target + for(var/entry in human_mob.hal_screwydoll) + human_mob.hal_screwydoll[entry] = clamp(human_mob.hal_screwydoll[entry]+1, 1, 5) + human_mob.update_health_hud() + +///Adds a fake limb to the hallucination datum effect +/datum/hallucination/fake_health_doll/proc/add_fake_limb(specific_limb, severity) + if(!specific_limb) + specific_limb = pick(list(SCREWYDOLL_HEAD, SCREWYDOLL_CHEST, SCREWYDOLL_L_ARM, SCREWYDOLL_R_ARM, SCREWYDOLL_L_LEG, SCREWYDOLL_R_LEG)) + if(!severity) + severity = rand(1, 5) + var/mob/living/carbon/human/human_mob = target + LAZYSET(human_mob.hal_screwydoll, specific_limb, severity) + target.update_health_hud() + +/datum/hallucination/fake_health_doll/target_deleting() + if(isnull(timer_id)) + return + deltimer(timer_id) + timer_id = null + ..() + +///Cleans up the hallucinations - this deletes any overlap, but that shouldn't happen. +/datum/hallucination/fake_health_doll/proc/cleanup() + qdel(src) + +//So that the associated addition proc cleans it up correctly +/datum/hallucination/fake_health_doll/Destroy() + if(!ishuman(target)) + stack_trace("Somehow [target] managed to get a fake health doll hallucination, while not being a human mob.") + var/mob/living/carbon/human/human_mob = target + LAZYNULL(human_mob.hal_screwydoll) + human_mob.update_health_hud() + return ..() diff --git a/code/modules/hallucination/_hallucination.dm b/code/modules/hallucination/_hallucination.dm new file mode 100644 index 00000000000000..d3835c8825d654 --- /dev/null +++ b/code/modules/hallucination/_hallucination.dm @@ -0,0 +1,162 @@ +GLOBAL_LIST_INIT(hallucination_list, list( + /datum/hallucination/chat = 100, + /datum/hallucination/message = 60, + /datum/hallucination/sounds = 50, + /datum/hallucination/battle = 20, + /datum/hallucination/dangerflash = 15, + /datum/hallucination/hudscrew = 12, + /datum/hallucination/fake_health_doll = 12, + /datum/hallucination/fake_alert = 12, + /datum/hallucination/weird_sounds = 8, + /datum/hallucination/stationmessage = 7, + /datum/hallucination/fake_flood = 7, + /datum/hallucination/stray_bullet = 7, + /datum/hallucination/bolts = 7, + /datum/hallucination/items_other = 7, + /datum/hallucination/husks = 7, + /datum/hallucination/items = 4, + /datum/hallucination/fire = 3, + /datum/hallucination/self_delusion = 2, + /datum/hallucination/delusion = 2, + /datum/hallucination/shock = 1, + /datum/hallucination/death = 1, + /datum/hallucination/oh_yeah = 1 + )) + + +/mob/living/carbon/proc/handle_hallucinations(delta_time, times_fired) + if(!hallucination) + return + + hallucination = max(hallucination - (0.5 * delta_time), 0) + if(world.time < next_hallucination) + return + + var/halpick = pick_weight(GLOB.hallucination_list) + new halpick(src, FALSE) + + next_hallucination = world.time + rand(100, 600) + +/mob/living/carbon/proc/set_screwyhud(hud_type) + hal_screwyhud = hud_type + update_health_hud() + +/datum/hallucination + var/natural = TRUE + var/mob/living/carbon/target + var/feedback_details //extra info for investigate + +/datum/hallucination/New(mob/living/carbon/C, forced = TRUE) + set waitfor = FALSE + target = C + natural = !forced + + // Cancel early if the target is deleted + RegisterSignal(target, COMSIG_PARENT_QDELETING, .proc/target_deleting) + +/datum/hallucination/proc/target_deleting() + SIGNAL_HANDLER + + qdel(src) + +/datum/hallucination/proc/wake_and_restore() + target.set_screwyhud(SCREWYHUD_NONE) + target.SetSleeping(0) + +/datum/hallucination/Destroy() + target.investigate_log("was afflicted with a hallucination of type [type] by [natural?"hallucination status":"an external source"]. [feedback_details]", INVESTIGATE_HALLUCINATIONS) + + if (target) + UnregisterSignal(target, COMSIG_PARENT_QDELETING) + + target = null + return ..() + +//Returns a random turf in a ring around the target mob, useful for sound hallucinations +/datum/hallucination/proc/random_far_turf() + var/x_based = prob(50) + var/first_offset = pick(-8,-7,-6,-5,5,6,7,8) + var/second_offset = rand(-8,8) + var/x_off + var/y_off + if(x_based) + x_off = first_offset + y_off = second_offset + else + y_off = first_offset + x_off = second_offset + var/turf/T = locate(target.x + x_off, target.y + y_off, target.z) + return T + +/obj/effect/hallucination + invisibility = INVISIBILITY_OBSERVER + anchored = TRUE + var/mob/living/carbon/target = null + +/obj/effect/hallucination/simple + var/image_icon = 'icons/mob/alien.dmi' + var/image_state = "alienh_pounce" + var/px = 0 + var/py = 0 + var/col_mod = null + var/image/current_image = null + var/image_layer = MOB_LAYER + var/image_plane = GAME_PLANE + var/active = TRUE //qdelery + +/obj/effect/hallucination/singularity_pull() + return + +/obj/effect/hallucination/singularity_act() + return + +/obj/effect/hallucination/simple/Initialize(mapload, mob/living/carbon/T) + . = ..() + if(!T) + stack_trace("A hallucination was created with no target") + return INITIALIZE_HINT_QDEL + target = T + current_image = GetImage() + if(target.client) + target.client.images |= current_image + +/obj/effect/hallucination/simple/proc/GetImage() + var/image/I = image(image_icon,src,image_state,image_layer,dir=src.dir) + I.plane = image_plane + I.pixel_x = px + I.pixel_y = py + if(col_mod) + I.color = col_mod + return I + +/obj/effect/hallucination/simple/proc/Show(update=1) + if(active) + if(target.client) + target.client.images.Remove(current_image) + if(update) + current_image = GetImage() + if(target.client) + target.client.images |= current_image + +/obj/effect/hallucination/simple/update_icon(updates=ALL, new_state, new_icon, new_px=0, new_py=0) + image_state = new_state + if(new_icon) + image_icon = new_icon + else + image_icon = initial(image_icon) + px = new_px + py = new_py + . = ..() + Show() + +/obj/effect/hallucination/simple/Moved(atom/OldLoc, Dir) + . = ..() + if(!loc) + return + Show() + +/obj/effect/hallucination/simple/Destroy() + if(target.client) + target.client.images.Remove(current_image) + active = FALSE + return ..() diff --git a/code/modules/hallucination/airlock.dm b/code/modules/hallucination/airlock.dm new file mode 100644 index 00000000000000..950a267f75c698 --- /dev/null +++ b/code/modules/hallucination/airlock.dm @@ -0,0 +1,90 @@ +/* Airlock Hallucinations + * + * Contains: + * Nearby airlocks being bolted + * Nearby airlocks being unbolted + */ + +/datum/hallucination/bolts + var/list/airlocks_to_hit + var/list/locks + var/next_action = 0 + var/locking = TRUE + +/datum/hallucination/bolts/New(mob/living/carbon/C, forced, door_number) + set waitfor = FALSE + ..() + if(!door_number) + door_number = rand(0,4) //if 0 bolts all visible doors + var/count = 0 + feedback_details += "Door amount: [door_number]" + + for(var/obj/machinery/door/airlock/A in range(7, target)) + if(count>door_number && door_number>0) + break + if(!A.density) + continue + count++ + LAZYADD(airlocks_to_hit, A) + + if(!LAZYLEN(airlocks_to_hit)) //no valid airlocks in sight + qdel(src) + return + + START_PROCESSING(SSfastprocess, src) + +/datum/hallucination/bolts/process(delta_time) + next_action -= (delta_time * 10) + if (next_action > 0) + return + + if (locking) + var/atom/next_airlock = pop(airlocks_to_hit) + if (next_airlock) + var/obj/effect/hallucination/fake_door_lock/lock = new(get_turf(next_airlock)) + lock.target = target + lock.airlock = next_airlock + LAZYADD(locks, lock) + + if (!LAZYLEN(airlocks_to_hit)) + locking = FALSE + next_action = 10 SECONDS + return + else + var/obj/effect/hallucination/fake_door_lock/next_unlock = popleft(locks) + if (next_unlock) + next_unlock.unlock() + else + qdel(src) + return + + next_action = rand(4, 12) + +/datum/hallucination/bolts/Destroy() + . = ..() + QDEL_LIST(locks) + STOP_PROCESSING(SSfastprocess, src) + +/obj/effect/hallucination/fake_door_lock + layer = CLOSED_DOOR_LAYER + 1 //for Bump priority + plane = GAME_PLANE + var/image/bolt_light + var/obj/machinery/door/airlock/airlock + +/obj/effect/hallucination/fake_door_lock/proc/lock() + bolt_light = image(airlock.overlays_file, get_turf(airlock), "lights_bolts",layer=airlock.layer+0.1) + if(target.client) + target.client.images |= bolt_light + target.playsound_local(get_turf(airlock), 'sound/machines/boltsdown.ogg',30,0,3) + +/obj/effect/hallucination/fake_door_lock/proc/unlock() + if(target.client) + target.client.images.Remove(bolt_light) + target.playsound_local(get_turf(airlock), 'sound/machines/boltsup.ogg',30,0,3) + qdel(src) + +/obj/effect/hallucination/fake_door_lock/CanAllowThrough(atom/movable/mover, border_dir) + . = ..() + if(mover == target && airlock.density) + return FALSE + diff --git a/code/modules/hallucination/chat.dm b/code/modules/hallucination/chat.dm new file mode 100644 index 00000000000000..4c9912e5113e66 --- /dev/null +++ b/code/modules/hallucination/chat.dm @@ -0,0 +1,169 @@ +/* Chat Hallucinations + * + * Contains: + * Radio messages (";Someone recall the shuttle!", ";Set John Doe to arrest!") + * Speak messages ("Get out!", "Did you hear that?") + * Action messages ("You feel a tiny prick!", "John Doe puts the cryptographic sequencer into their backpack.") + * Station messages ("The Emergency Shuttle has docked with the station.", "Hostile runtimes detected in all station systems") + */ + +#define HAL_LINES_FILE "hallucination.json" + +/datum/hallucination/chat + +/datum/hallucination/chat/New(mob/living/carbon/C, forced = TRUE, force_radio, specific_message) + set waitfor = FALSE + ..() + var/target_name = target.first_name() + var/speak_messages = list("[pick_list_replacements(HAL_LINES_FILE, "suspicion")]",\ + "[pick_list_replacements(HAL_LINES_FILE, "conversation")]",\ + "[pick_list_replacements(HAL_LINES_FILE, "greetings")][target.first_name()]!",\ + "[pick_list_replacements(HAL_LINES_FILE, "getout")]",\ + "[pick_list_replacements(HAL_LINES_FILE, "weird")]",\ + "[pick_list_replacements(HAL_LINES_FILE, "didyouhearthat")]",\ + "[pick_list_replacements(HAL_LINES_FILE, "doubt")]",\ + "[pick_list_replacements(HAL_LINES_FILE, "aggressive")]",\ + "[pick_list_replacements(HAL_LINES_FILE, "help")]!!",\ + "[pick_list_replacements(HAL_LINES_FILE, "escape")]",\ + "I'm infected, [pick_list_replacements(HAL_LINES_FILE, "infection_advice")]!") + + var/radio_messages = list("[pick_list_replacements(HAL_LINES_FILE, "people")] is [pick_list_replacements(HAL_LINES_FILE, "accusations")]!",\ + "Help!",\ + "[pick_list_replacements(HAL_LINES_FILE, "threat")] in [pick_list_replacements(HAL_LINES_FILE, "location")][prob(50)?"!":"!!"]",\ + "[pick("Where's [target.first_name()]?", "Set [target.first_name()] to arrest!")]",\ + "[pick("C","Ai, c","Someone c","Rec")]all the shuttle!",\ + "AI [pick("rogue", "is dead")]!!") + + var/mob/living/carbon/person = null + var/datum/language/understood_language = target.get_random_understood_language() + for(var/mob/living/carbon/H in view(target)) + if(H == target) + continue + if(!person) + person = H + else + if(get_dist(target,H)[other] puts the [pick(\ + "revolver","energy sword","cryptographic sequencer","power sink","energy bow",\ + "hybrid taser","stun baton","flash","syringe gun","circular saw","tank transfer valve",\ + "ritual dagger","spellbook",\ + "Codex Cicatrix", "Living Heart",\ + "pulse rifle","captain's spare ID","hand teleporter","hypospray","antique laser gun","X-01 MultiPhase Energy Gun","station's blueprints"\ + )] into [equipped_backpack].") + + message_pool.Add("[other] [pick("sneezes","coughs")].") + + message_pool.Add(span_notice("You hear something squeezing through the ducts..."), \ + span_notice("Your [pick("arm", "leg", "back", "head")] itches."),\ + span_warning("You feel [pick("hot","cold","dry","wet","woozy","faint")]."), + span_warning("Your stomach rumbles."), + span_warning("Your head hurts."), + span_warning("You hear a faint buzz in your head."), + "[target] sneezes.") + if(prob(10)) + message_pool.Add(span_warning("Behind you."),\ + span_warning("You hear a faint laughter."), + span_warning("You see something move."), + span_warning("You hear skittering on the ceiling."), + span_warning("You see an inhumanly tall silhouette moving in the distance.")) + if(prob(10)) + message_pool.Add("[pick_list_replacements(HAL_LINES_FILE, "advice")]") + var/chosen = pick(message_pool) + feedback_details += "Message: [chosen]" + to_chat(target, chosen) + qdel(src) + +/datum/hallucination/stationmessage + +/datum/hallucination/stationmessage/New(mob/living/carbon/C, forced = TRUE, message) + set waitfor = FALSE + ..() + if(!message) + message = pick("ratvar","shuttle dock","blob alert","malf ai","meteors","supermatter") + feedback_details += "Type: [message]" + switch(message) + if("blob alert") + to_chat(target, "

Biohazard Alert

") + to_chat(target, "

[span_alert("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.")]

") + SEND_SOUND(target, SSstation.announcer.event_sounds[ANNOUNCER_OUTBREAK5]) + if("ratvar") + target.playsound_local(target, 'sound/machines/clockcult/ark_deathrattle.ogg', 50, FALSE, pressure_affected = FALSE) + target.playsound_local(target, 'sound/effects/clockcult_gateway_disrupted.ogg', 50, FALSE, pressure_affected = FALSE) + addtimer(CALLBACK( + target, + /mob/.proc/playsound_local, + target, + 'sound/effects/explosion_distant.ogg', + 50, + FALSE, + /* frequency = */ null, + /* falloff_exponential = */ null, + /* channel = */ null, + /* pressure_affected = */ FALSE + ), 27) + if("shuttle dock") + to_chat(target, "

Priority Announcement

") + to_chat(target, "

[span_alert("The Emergency Shuttle has docked with the station. You have 3 minutes to board the Emergency Shuttle.")]

") + SEND_SOUND(target, SSstation.announcer.event_sounds[ANNOUNCER_SHUTTLEDOCK]) + if("malf ai") //AI is doomsdaying! + to_chat(target, "

Anomaly Alert

") + to_chat(target, "

[span_alert("Hostile runtimes detected in all station systems, please deactivate your AI to prevent possible damage to its morality core.")]

") + SEND_SOUND(target, SSstation.announcer.event_sounds[ANNOUNCER_AIMALF]) + if("meteors") //Meteors inbound! + to_chat(target, "

Meteor Alert

") + to_chat(target, "

[span_alert("Meteors have been detected on collision course with the station.")]

") + SEND_SOUND(target, SSstation.announcer.event_sounds[ANNOUNCER_METEORS]) + if("supermatter") + SEND_SOUND(target, 'sound/magic/charge.ogg') + to_chat(target, span_boldannounce("You feel reality distort for a moment...")) diff --git a/code/modules/hallucination/death.dm b/code/modules/hallucination/death.dm new file mode 100644 index 00000000000000..744ff878a5608f --- /dev/null +++ b/code/modules/hallucination/death.dm @@ -0,0 +1,34 @@ +/datum/hallucination/death + +/datum/hallucination/death/New(mob/living/carbon/C, forced = TRUE) + set waitfor = FALSE + ..() + target.set_screwyhud(SCREWYHUD_DEAD) + target.Paralyze(300) + target.silent += 10 + to_chat(target, span_deadsay("[target.real_name] has died at [get_area_name(target)].")) + + var/delay = 0 + + if(prob(50)) + var/mob/fakemob + var/list/dead_people = list() + for(var/mob/dead/observer/G in GLOB.player_list) + dead_people += G + if(LAZYLEN(dead_people)) + fakemob = pick(dead_people) + else + fakemob = target //ever been so lonely you had to haunt yourself? + if(fakemob) + delay = rand(20, 50) + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, target, "DEAD: [fakemob.name] says, \"[pick("rip","why did i just drop dead?","hey [target.first_name()]","git gud","you too?","is the AI rogue?",\ + "i[prob(50)?" fucking":""] hate [pick("blood cult", "clock cult", "revenants", "this round","this","myself","admins","you")]")]\""), delay) + + addtimer(CALLBACK(src, .proc/cleanup), delay + rand(70, 90)) + +/datum/hallucination/death/proc/cleanup() + if (target) + target.set_screwyhud(SCREWYHUD_NONE) + target.SetParalyzed(0) + target.silent = FALSE + qdel(src) diff --git a/code/modules/hallucination/fire.dm b/code/modules/hallucination/fire.dm new file mode 100644 index 00000000000000..81396caa45c069 --- /dev/null +++ b/code/modules/hallucination/fire.dm @@ -0,0 +1,89 @@ +#define RAISE_FIRE_COUNT 3 +#define RAISE_FIRE_TIME 3 + +/datum/hallucination/fire + var/active = TRUE + var/stage = 0 + var/image/fire_overlay + + var/next_action = 0 + var/times_to_lower_stamina + var/fire_clearing = FALSE + var/increasing_stages = TRUE + var/time_spent = 0 + +/datum/hallucination/fire/New(mob/living/carbon/C, forced = TRUE) + set waitfor = FALSE + ..() + target.set_fire_stacks(max(target.fire_stacks, 0.1)) //Placebo flammability + fire_overlay = image('icons/mob/onfire.dmi', target, "human_burning", ABOVE_MOB_LAYER) + if(target.client) + target.client.images += fire_overlay + to_chat(target, span_userdanger("You're set on fire!")) + target.throw_alert(ALERT_FIRE, /atom/movable/screen/alert/fire, override = TRUE) + times_to_lower_stamina = rand(5, 10) + addtimer(CALLBACK(src, .proc/start_expanding), 20) + +/datum/hallucination/fire/Destroy() + . = ..() + STOP_PROCESSING(SSfastprocess, src) + +/datum/hallucination/fire/proc/start_expanding() + if (isnull(target)) + qdel(src) + return + START_PROCESSING(SSfastprocess, src) + +/datum/hallucination/fire/process(delta_time) + if (isnull(target)) + qdel(src) + return + + if(target.fire_stacks <= 0) + clear_fire() + + time_spent += delta_time + + if (fire_clearing) + next_action -= delta_time + if (next_action < 0) + stage -= 1 + update_temp() + next_action += 3 + else if (increasing_stages) + var/new_stage = min(round(time_spent / RAISE_FIRE_TIME), RAISE_FIRE_COUNT) + if (stage != new_stage) + stage = new_stage + update_temp() + + if (stage == RAISE_FIRE_COUNT) + increasing_stages = FALSE + else if (times_to_lower_stamina) + next_action -= delta_time + if (next_action < 0) + target.adjustStaminaLoss(15) + next_action += 2 + times_to_lower_stamina -= 1 + else + clear_fire() + +/datum/hallucination/fire/proc/update_temp() + if(stage <= 0) + target.clear_alert(ALERT_TEMPERATURE, clear_override = TRUE) + else + target.clear_alert(ALERT_TEMPERATURE, clear_override = TRUE) + target.throw_alert(ALERT_TEMPERATURE, /atom/movable/screen/alert/hot, stage, override = TRUE) + +/datum/hallucination/fire/proc/clear_fire() + if(!active) + return + active = FALSE + target.clear_alert(ALERT_FIRE, clear_override = TRUE) + if(target.client) + target.client.images -= fire_overlay + QDEL_NULL(fire_overlay) + fire_clearing = TRUE + next_action = 0 + +#undef RAISE_FIRE_COUNT +#undef RAISE_FIRE_TIME diff --git a/code/modules/hallucination/hazard.dm b/code/modules/hallucination/hazard.dm new file mode 100644 index 00000000000000..5278c9d7e8a28e --- /dev/null +++ b/code/modules/hallucination/hazard.dm @@ -0,0 +1,128 @@ +/* Hazard Hallucinations + * + * Contains: + * Lava + * Chasm + * Anomaly + */ + +/datum/hallucination/dangerflash + +/datum/hallucination/dangerflash/New(mob/living/carbon/C, forced = TRUE, danger_type) + set waitfor = FALSE + ..() + //Flashes of danger + + var/list/possible_points = list() + for(var/turf/open/floor/F in view(target,world.view)) + possible_points += F + if(possible_points.len) + var/turf/open/floor/danger_point = pick(possible_points) + if(!danger_type) + danger_type = pick("lava","chasm","anomaly") + switch(danger_type) + if("lava") + new /obj/effect/hallucination/danger/lava(danger_point, target) + if("chasm") + new /obj/effect/hallucination/danger/chasm(danger_point, target) + if("anomaly") + new /obj/effect/hallucination/danger/anomaly(danger_point, target) + + qdel(src) + +/obj/effect/hallucination/danger + var/image/image + +/obj/effect/hallucination/danger/proc/show_icon() + return + +/obj/effect/hallucination/danger/proc/clear_icon() + if(image && target.client) + target.client.images -= image + +/obj/effect/hallucination/danger/Initialize(mapload, _target) + . = ..() + target = _target + show_icon() + QDEL_IN(src, rand(200, 450)) + +/obj/effect/hallucination/danger/Destroy() + clear_icon() + . = ..() + +/obj/effect/hallucination/danger/lava + name = "lava" + +/obj/effect/hallucination/danger/lava/Initialize(mapload, _target) + . = ..() + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = .proc/on_entered, + ) + AddElement(/datum/element/connect_loc, loc_connections) + +/obj/effect/hallucination/danger/lava/show_icon() + var/turf/danger_turf = get_turf(src) + image = image('icons/turf/floors/lava.dmi', src, "lava-[danger_turf.smoothing_junction || 0]", TURF_LAYER) + if(target.client) + target.client.images += image + +/obj/effect/hallucination/danger/lava/proc/on_entered(datum/source, atom/movable/AM) + SIGNAL_HANDLER + if(AM == target) + target.adjustStaminaLoss(20) + new /datum/hallucination/fire(target) + +/obj/effect/hallucination/danger/chasm + name = "chasm" + +/obj/effect/hallucination/danger/chasm/Initialize(mapload, _target) + . = ..() + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = .proc/on_entered, + ) + AddElement(/datum/element/connect_loc, loc_connections) + +/obj/effect/hallucination/danger/chasm/show_icon() + var/turf/danger_turf = get_turf(src) + image = image('icons/turf/floors/chasms.dmi', src, "chasms-[danger_turf.smoothing_junction || 0]", TURF_LAYER) + if(target.client) + target.client.images += image + +/obj/effect/hallucination/danger/chasm/proc/on_entered(datum/source, atom/movable/AM) + SIGNAL_HANDLER + if(AM == target) + if(istype(target, /obj/effect/dummy/phased_mob)) + return + to_chat(target, span_userdanger("You fall into the chasm!")) + target.Paralyze(40) + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, target, span_notice("It's surprisingly shallow.")), 15) + QDEL_IN(src, 30) + +/obj/effect/hallucination/danger/anomaly + name = "flux wave anomaly" + +/obj/effect/hallucination/danger/anomaly/Initialize(mapload) + . = ..() + START_PROCESSING(SSobj, src) + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = .proc/on_entered, + ) + AddElement(/datum/element/connect_loc, loc_connections) + +/obj/effect/hallucination/danger/anomaly/process(delta_time) + if(DT_PROB(45, delta_time)) + step(src,pick(GLOB.alldirs)) + +/obj/effect/hallucination/danger/anomaly/Destroy() + STOP_PROCESSING(SSobj, src) + return ..() + +/obj/effect/hallucination/danger/anomaly/show_icon() + image = image('icons/effects/effects.dmi',src,"electricity2",OBJ_LAYER+0.01) + if(target.client) + target.client.images += image + +/obj/effect/hallucination/danger/anomaly/proc/on_entered(datum/source, atom/movable/AM) + SIGNAL_HANDLER + if(AM == target) + new /datum/hallucination/shock(target) diff --git a/code/modules/hallucination/hostile_mob.dm b/code/modules/hallucination/hostile_mob.dm new file mode 100644 index 00000000000000..b6ccf58183821d --- /dev/null +++ b/code/modules/hallucination/hostile_mob.dm @@ -0,0 +1,171 @@ +/* Hostile Mob Hallucinations + * + * Contains: + * Xeno + * Clown + * Bubblegum + */ + +/obj/effect/hallucination/simple/xeno + image_icon = 'icons/mob/alien.dmi' + image_state = "alienh_pounce" + +/obj/effect/hallucination/simple/xeno/Initialize(mapload, mob/living/carbon/T) + . = ..() + name = "alien hunter ([rand(1, 1000)])" + +/obj/effect/hallucination/simple/xeno/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) + update_icon(ALL, "alienh_pounce") + if(hit_atom == target && target.stat!=DEAD) + target.Paralyze(100) + target.visible_message(span_danger("[target] flails around wildly."),span_userdanger("[name] pounces on you!")) + +// The numbers of seconds it takes to get to each stage of the xeno attack choreography +#define XENO_ATTACK_STAGE_LEAP_AT_TARGET 1 +#define XENO_ATTACK_STAGE_LEAP_AT_PUMP 2 +#define XENO_ATTACK_STAGE_CLIMB 3 +#define XENO_ATTACK_STAGE_FINISH 6 + +/// Xeno crawls from nearby vent,jumps at you, and goes back in +/datum/hallucination/xeno_attack + var/turf/pump_location = null + var/obj/effect/hallucination/simple/xeno/xeno = null + var/time_processing = 0 + var/stage = XENO_ATTACK_STAGE_LEAP_AT_TARGET + +/datum/hallucination/xeno_attack/New(mob/living/carbon/C, forced = TRUE) + ..() + for(var/obj/machinery/atmospherics/components/unary/vent_pump/U in orange(7,target)) + if(!U.welded) + pump_location = get_turf(U) + break + + if(pump_location) + feedback_details += "Vent Coords: [pump_location.x],[pump_location.y],[pump_location.z]" + xeno = new(pump_location, target) + START_PROCESSING(SSfastprocess, src) + else + qdel(src) + +/datum/hallucination/xeno_attack/process(delta_time) + time_processing += delta_time + + if (time_processing >= stage) + switch (time_processing) + if (XENO_ATTACK_STAGE_FINISH to INFINITY) + to_chat(target, span_notice("[xeno.name] scrambles into the ventilation ducts!")) + qdel(src) + if (XENO_ATTACK_STAGE_CLIMB to XENO_ATTACK_STAGE_FINISH) + to_chat(target, span_notice("[xeno.name] begins climbing into the ventilation system...")) + stage = XENO_ATTACK_STAGE_FINISH + if (XENO_ATTACK_STAGE_LEAP_AT_PUMP to XENO_ATTACK_STAGE_CLIMB) + xeno.update_icon(ALL, "alienh_leap", 'icons/mob/alienleap.dmi', -32, -32) + xeno.throw_at(pump_location, 7, 1, spin = FALSE, diagonals_first = TRUE) + stage = XENO_ATTACK_STAGE_CLIMB + if (XENO_ATTACK_STAGE_LEAP_AT_TARGET to XENO_ATTACK_STAGE_LEAP_AT_PUMP) + xeno.update_icon(ALL, "alienh_leap", 'icons/mob/alienleap.dmi', -32, -32) + xeno.throw_at(target, 7, 1, spin = FALSE, diagonals_first = TRUE) + stage = XENO_ATTACK_STAGE_LEAP_AT_PUMP + +/datum/hallucination/xeno_attack/Destroy() + . = ..() + + STOP_PROCESSING(SSfastprocess, src) + QDEL_NULL(xeno) + pump_location = null + +#undef XENO_ATTACK_STAGE_LEAP_AT_TARGET +#undef XENO_ATTACK_STAGE_LEAP_AT_PUMP +#undef XENO_ATTACK_STAGE_CLIMB +#undef XENO_ATTACK_STAGE_FINISH + +/obj/effect/hallucination/simple/clown + image_icon = 'icons/mob/animal.dmi' + image_state = "clown" + +/obj/effect/hallucination/simple/clown/Initialize(mapload, mob/living/carbon/T, duration) + ..(loc, T) + name = pick(GLOB.clown_names) + QDEL_IN(src,duration) + +/obj/effect/hallucination/simple/clown/scary + image_state = "scary_clown" + +/obj/effect/hallucination/simple/bubblegum + name = "Bubblegum" + image_icon = 'icons/mob/lavaland/96x96megafauna.dmi' + image_state = "bubblegum" + px = -32 + +/datum/hallucination/oh_yeah + var/obj/effect/hallucination/simple/bubblegum/bubblegum + var/image/fakebroken + var/image/fakerune + var/turf/landing + var/charged + var/next_action = 0 + +/datum/hallucination/oh_yeah/New(mob/living/carbon/C, forced = TRUE) + set waitfor = FALSE + . = ..() + var/turf/closed/wall/wall + for(var/turf/closed/wall/W in range(7,target)) + wall = W + break + if(!wall) + return INITIALIZE_HINT_QDEL + feedback_details += "Source: [wall.x],[wall.y],[wall.z]" + + fakebroken = image('icons/turf/floors.dmi', wall, "plating", layer = TURF_LAYER) + landing = get_turf(target) + var/turf/landing_image_turf = get_step(landing, SOUTHWEST) //the icon is 3x3 + fakerune = image('icons/effects/96x96.dmi', landing_image_turf, "landing", layer = ABOVE_OPEN_TURF_LAYER) + fakebroken.override = TRUE + if(target.client) + target.client.images |= fakebroken + target.client.images |= fakerune + target.playsound_local(wall,'sound/effects/meteorimpact.ogg', 150, 1) + bubblegum = new(wall, target) + addtimer(CALLBACK(src, .proc/start_processing), 10) + +/datum/hallucination/oh_yeah/proc/start_processing() + if (isnull(target)) + qdel(src) + return + START_PROCESSING(SSfastprocess, src) + +/datum/hallucination/oh_yeah/process(delta_time) + next_action -= delta_time + + if (next_action > 0) + return + + if (get_turf(bubblegum) != landing && target?.stat != DEAD) + if(!landing || (get_turf(bubblegum)).loc.z != landing.loc.z) + qdel(src) + return + bubblegum.forceMove(get_step_towards(bubblegum, landing)) + bubblegum.setDir(get_dir(bubblegum, landing)) + target.playsound_local(get_turf(bubblegum), 'sound/effects/meteorimpact.ogg', 150, 1) + shake_camera(target, 2, 1) + if(bubblegum.Adjacent(target) && !charged) + charged = TRUE + target.Paralyze(80) + target.adjustStaminaLoss(40) + step_away(target, bubblegum) + shake_camera(target, 4, 3) + target.visible_message(span_warning("[target] jumps backwards, falling on the ground!"),span_userdanger("[bubblegum] slams into you!")) + next_action = 0.2 + else + STOP_PROCESSING(SSfastprocess, src) + QDEL_IN(src, 3 SECONDS) + +/datum/hallucination/oh_yeah/Destroy() + if(target.client) + target.client.images.Remove(fakebroken) + target.client.images.Remove(fakerune) + QDEL_NULL(fakebroken) + QDEL_NULL(fakerune) + QDEL_NULL(bubblegum) + STOP_PROCESSING(SSfastprocess, src) + return ..() diff --git a/code/modules/hallucination/husk.dm b/code/modules/hallucination/husk.dm new file mode 100644 index 00000000000000..5bbb94af5b6691 --- /dev/null +++ b/code/modules/hallucination/husk.dm @@ -0,0 +1,31 @@ +/datum/hallucination/husks + var/image/halbody + +/datum/hallucination/husks/New(mob/living/carbon/C, forced = TRUE) + set waitfor = FALSE + ..() + var/list/possible_points = list() + for(var/turf/open/floor/F in view(target,world.view)) + possible_points += F + if(possible_points.len) + var/turf/open/floor/husk_point = pick(possible_points) + switch(rand(1,4)) + if(1) + var/image/body = image('icons/mob/human.dmi',husk_point,"husk",TURF_LAYER) + var/matrix/M = matrix() + M.Turn(90) + body.transform = M + halbody = body + if(2,3) + halbody = image('icons/mob/human.dmi',husk_point,"husk",TURF_LAYER) + if(4) + halbody = image('icons/mob/alien.dmi',husk_point,"alienother",TURF_LAYER) + + if(target.client) + target.client.images += halbody + QDEL_IN(src, rand(30,50)) //Only seen for a brief moment. + +/datum/hallucination/husks/Destroy() + target?.client?.images -= halbody + QDEL_NULL(halbody) + return ..() diff --git a/code/modules/hallucination/item.dm b/code/modules/hallucination/item.dm new file mode 100644 index 00000000000000..dd462f2b15a1b7 --- /dev/null +++ b/code/modules/hallucination/item.dm @@ -0,0 +1,172 @@ +/* Item Hallucinations + * + * Contains: + * Putting items in other nearby peoples hands + * Putting items in your hands + */ + +/datum/hallucination/items_other + +/datum/hallucination/items_other/New(mob/living/carbon/C, forced = TRUE, item_type) + set waitfor = FALSE + ..() + var/item + if(!item_type) + item = pick(list("esword","taser","ebow","baton","dual_esword","ttv","flash","armblade")) + else + item = item_type + feedback_details += "Item: [item]" + var/side + var/image_file + var/image/A = null + var/list/mob_pool = list() + + for(var/mob/living/carbon/human/M in view(7,target)) + if(M != target) + mob_pool += M + if(!mob_pool.len) + return + + var/mob/living/carbon/human/H = pick(mob_pool) + feedback_details += " Mob: [H.real_name]" + + var/free_hand = H.get_empty_held_index_for_side(LEFT_HANDS) + if(free_hand) + side = "left" + else + free_hand = H.get_empty_held_index_for_side(RIGHT_HANDS) + if(free_hand) + side = "right" + + if(side) + switch(item) + if("esword") + if(side == "right") + image_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' + else + image_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' + target.playsound_local(H, 'sound/weapons/saberon.ogg',35,1) + A = image(image_file,H,"e_sword_on_red", layer=ABOVE_MOB_LAYER) + if("dual_esword") + if(side == "right") + image_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' + else + image_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' + target.playsound_local(H, 'sound/weapons/saberon.ogg',35,1) + A = image(image_file,H,"dualsaberred1", layer=ABOVE_MOB_LAYER) + if("taser") + if(side == "right") + image_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' + else + image_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' + A = image(image_file,H,"advtaserstun4", layer=ABOVE_MOB_LAYER) + if("ebow") + if(side == "right") + image_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' + else + image_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' + A = image(image_file,H,"crossbow", layer=ABOVE_MOB_LAYER) + if("baton") + if(side == "right") + image_file = 'icons/mob/inhands/equipment/security_righthand.dmi' + else + image_file = 'icons/mob/inhands/equipment/security_lefthand.dmi' + target.playsound_local(H, SFX_SPARKS,75,1,-1) + A = image(image_file,H,"baton", layer=ABOVE_MOB_LAYER) + if("ttv") + if(side == "right") + image_file = 'icons/mob/inhands/weapons/bombs_righthand.dmi' + else + image_file = 'icons/mob/inhands/weapons/bombs_lefthand.dmi' + A = image(image_file,H,"ttv", layer=ABOVE_MOB_LAYER) + if("flash") + if(side == "right") + image_file = 'icons/mob/inhands/equipment/security_righthand.dmi' + else + image_file = 'icons/mob/inhands/equipment/security_lefthand.dmi' + A = image(image_file,H,"flashtool", layer=ABOVE_MOB_LAYER) + if("armblade") + if(side == "right") + image_file = 'icons/mob/inhands/antag/changeling_righthand.dmi' + else + image_file = 'icons/mob/inhands/antag/changeling_lefthand.dmi' + target.playsound_local(H, 'sound/effects/blobattack.ogg',30,1) + A = image(image_file,H,"arm_blade", layer=ABOVE_MOB_LAYER) + if(target.client) + target.client.images |= A + addtimer(CALLBACK(src, .proc/cleanup, item, A, H), rand(15 SECONDS, 25 SECONDS)) + return + qdel(src) + +/datum/hallucination/items_other/proc/cleanup(item, atom/image_used, has_the_item) + if (isnull(target)) + qdel(src) + return + if(item == "esword" || item == "dual_esword") + target.playsound_local(has_the_item, 'sound/weapons/saberoff.ogg',35,1) + if(item == "armblade") + target.playsound_local(has_the_item, 'sound/effects/blobattack.ogg',30,1) + target.client.images.Remove(image_used) + qdel(src) + +/datum/hallucination/items/New(mob/living/carbon/C, forced = TRUE) + set waitfor = FALSE + ..() + //Strange items + + var/obj/halitem = new + + halitem = new + var/obj/item/l_hand = target.get_item_for_held_index(1) + var/obj/item/r_hand = target.get_item_for_held_index(2) + var/l = ui_hand_position(target.get_held_index_of_item(l_hand)) + var/r = ui_hand_position(target.get_held_index_of_item(r_hand)) + var/list/slots_free = list(l,r) + if(l_hand) + slots_free -= l + if(r_hand) + slots_free -= r + if(ishuman(target)) + var/mob/living/carbon/human/H = target + if(!H.belt) + slots_free += ui_belt + if(!H.l_store) + slots_free += ui_storage1 + if(!H.r_store) + slots_free += ui_storage2 + if(slots_free.len) + halitem.screen_loc = pick(slots_free) + halitem.plane = ABOVE_HUD_PLANE + switch(rand(1,6)) + if(1) //revolver + halitem.icon = 'icons/obj/guns/ballistic.dmi' + halitem.icon_state = "revolver" + halitem.name = "Revolver" + if(2) //c4 + halitem.icon = 'icons/obj/grenade.dmi' + halitem.icon_state = "plastic-explosive0" + halitem.name = "C4" + if(prob(25)) + halitem.icon_state = "plasticx40" + if(3) //sword + halitem.icon = 'icons/obj/transforming_energy.dmi' + halitem.icon_state = "e_sword" + halitem.name = "energy sword" + if(4) //stun baton + halitem.icon = 'icons/obj/items_and_weapons.dmi' + halitem.icon_state = "stunbaton" + halitem.name = "Stun Baton" + if(5) //emag + halitem.icon = 'icons/obj/card.dmi' + halitem.icon_state = "emag" + halitem.name = "Cryptographic Sequencer" + if(6) //flashbang + halitem.icon = 'icons/obj/grenade.dmi' + halitem.icon_state = "flashbang1" + halitem.name = "Flashbang" + feedback_details += "Type: [halitem.name]" + if(target.client) + target.client.screen += halitem + QDEL_IN(halitem, rand(150, 350)) + + qdel(src) diff --git a/code/modules/hallucination/plasma_flood.dm b/code/modules/hallucination/plasma_flood.dm new file mode 100644 index 00000000000000..ea76106231cd24 --- /dev/null +++ b/code/modules/hallucination/plasma_flood.dm @@ -0,0 +1,83 @@ +#define FAKE_FLOOD_EXPAND_TIME 20 +#define FAKE_FLOOD_MAX_RADIUS 10 + +/obj/effect/plasma_image_holder + icon_state = "nothing" + anchored = TRUE + layer = FLY_LAYER + plane = ABOVE_GAME_PLANE + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + +/datum/hallucination/fake_flood + //Plasma starts flooding from the nearby vent + var/turf/center + var/list/flood_images = list() + var/list/flood_image_holders = list() + var/list/turf/flood_turfs = list() + var/image_icon = 'icons/effects/atmospherics.dmi' + var/image_state = "plasma" + var/radius = 0 + var/next_expand = 0 + +/datum/hallucination/fake_flood/New(mob/living/carbon/C, forced = TRUE) + ..() + for(var/obj/machinery/atmospherics/components/unary/vent_pump/U in orange(7,target)) + if(!U.welded) + center = get_turf(U) + break + if(!center) + qdel(src) + return + feedback_details += "Vent Coords: [center.x],[center.y],[center.z]" + var/obj/effect/plasma_image_holder/pih = new(center) + var/image/plasma_image = image(image_icon, pih, image_state, FLY_LAYER) + plasma_image.alpha = 50 + plasma_image.plane = ABOVE_GAME_PLANE + flood_images += plasma_image + flood_image_holders += pih + flood_turfs += center + if(target.client) + target.client.images |= flood_images + next_expand = world.time + FAKE_FLOOD_EXPAND_TIME + START_PROCESSING(SSobj, src) + +/datum/hallucination/fake_flood/process() + if(next_expand <= world.time) + radius++ + if(radius > FAKE_FLOOD_MAX_RADIUS) + qdel(src) + return + Expand() + if((get_turf(target) in flood_turfs) && !target.internal) + new /datum/hallucination/fake_alert(target, TRUE, ALERT_TOO_MUCH_PLASMA) + next_expand = world.time + FAKE_FLOOD_EXPAND_TIME + +/datum/hallucination/fake_flood/proc/Expand() + for(var/image/I in flood_images) + I.alpha = min(I.alpha + 50, 255) + for(var/turf/FT in flood_turfs) + for(var/dir in GLOB.cardinals) + var/turf/T = get_step(FT, dir) + if((T in flood_turfs) || !TURFS_CAN_SHARE(T, FT) || isspaceturf(T)) //If we've gottem already, or if they're not alright to spread with. + continue + var/obj/effect/plasma_image_holder/pih = new(T) + var/image/new_plasma = image(image_icon, pih, image_state, FLY_LAYER) + new_plasma.alpha = 50 + new_plasma.plane = ABOVE_GAME_PLANE + flood_images += new_plasma + flood_image_holders += pih + flood_turfs += T + if(target.client) + target.client.images |= flood_images + +/datum/hallucination/fake_flood/Destroy() + STOP_PROCESSING(SSobj, src) + qdel(flood_turfs) + flood_turfs = list() + if(target.client) + target.client.images.Remove(flood_images) + qdel(flood_images) + flood_images = list() + qdel(flood_image_holders) + flood_image_holders = list() + return ..() diff --git a/code/modules/hallucination/polymorph.dm b/code/modules/hallucination/polymorph.dm new file mode 100644 index 00000000000000..2ad4471f1199b6 --- /dev/null +++ b/code/modules/hallucination/polymorph.dm @@ -0,0 +1,101 @@ +/* Polymorph Hallucinations + * + * Contains: + * Nearby mobs are polymorphed into other creatures + * Polymorphing yourself into other creatures + */ +/datum/hallucination/delusion + var/list/image/delusions = list() + +/datum/hallucination/delusion/New(mob/living/carbon/C, forced, force_kind = null , duration = 300,skip_nearby = TRUE, custom_icon = null, custom_icon_file = null, custom_name = null) + set waitfor = FALSE + . = ..() + var/image/A = null + var/kind = force_kind ? force_kind : pick("nothing","monkey","corgi","carp","skeleton","demon","zombie") + feedback_details += "Type: [kind]" + var/list/nearby + if(skip_nearby) + nearby = get_hearers_in_view(7, target) + for(var/mob/living/carbon/human/H in GLOB.alive_mob_list) + if(H == target) + continue + if(skip_nearby && (H in nearby)) + continue + switch(kind) + if("nothing") + A = image('icons/effects/effects.dmi',H,"nothing") + A.name = "..." + if("monkey")//Monkey + A = image('icons/mob/human.dmi',H,"monkey") + A.name = "Monkey ([rand(1,999)])" + if("carp")//Carp + A = image('icons/mob/carp.dmi',H,"carp") + A.name = "Space Carp" + if("corgi")//Corgi + A = image('icons/mob/pets.dmi',H,"corgi") + A.name = "Corgi" + if("skeleton")//Skeletons + A = image('icons/mob/human.dmi',H,"skeleton") + A.name = "Skeleton" + if("zombie")//Zombies + A = image('icons/mob/human.dmi',H,"zombie") + A.name = "Zombie" + if("demon")//Demon + A = image('icons/mob/mob.dmi',H,"daemon") + A.name = "Demon" + if("custom") + A = image(custom_icon_file, H, custom_icon) + A.name = custom_name + A.override = 1 + if(target.client) + delusions |= A + target.client.images |= A + if(duration) + QDEL_IN(src, duration) + +/datum/hallucination/delusion/Destroy() + for(var/image/I in delusions) + if(target.client) + target.client.images.Remove(I) + return ..() + +/datum/hallucination/self_delusion + var/image/delusion + +/datum/hallucination/self_delusion/New(mob/living/carbon/C, forced, force_kind = null , duration = 300, custom_icon = null, custom_icon_file = null, wabbajack = TRUE) //set wabbajack to false if you want to use another fake source + set waitfor = FALSE + ..() + var/image/A = null + var/kind = force_kind ? force_kind : pick("monkey","corgi","carp","skeleton","demon","zombie","robot") + feedback_details += "Type: [kind]" + switch(kind) + if("monkey")//Monkey + A = image('icons/mob/human.dmi',target,"monkey") + if("carp")//Carp + A = image('icons/mob/animal.dmi',target,"carp") + if("corgi")//Corgi + A = image('icons/mob/pets.dmi',target,"corgi") + if("skeleton")//Skeletons + A = image('icons/mob/human.dmi',target,"skeleton") + if("zombie")//Zombies + A = image('icons/mob/human.dmi',target,"zombie") + if("demon")//Demon + A = image('icons/mob/mob.dmi',target,"daemon") + if("robot")//Cyborg + A = image('icons/mob/robots.dmi',target,"robot") + target.playsound_local(target,'sound/voice/liveagain.ogg', 75, 1) + if("custom") + A = image(custom_icon_file, target, custom_icon) + A.override = 1 + if(target.client) + if(wabbajack) + to_chat(target, span_hear("...wabbajack...wabbajack...")) + target.playsound_local(target,'sound/magic/staff_change.ogg', 50, 1) + delusion = A + target.client.images |= A + QDEL_IN(src, duration) + +/datum/hallucination/self_delusion/Destroy() + if(target.client) + target.client.images.Remove(delusion) + return ..() diff --git a/code/modules/hallucination/shock.dm b/code/modules/hallucination/shock.dm new file mode 100644 index 00000000000000..eb8a4257366804 --- /dev/null +++ b/code/modules/hallucination/shock.dm @@ -0,0 +1,31 @@ +/datum/hallucination/shock + var/image/shock_image + var/image/electrocution_skeleton_anim + +/datum/hallucination/shock/New(mob/living/carbon/C, forced = TRUE) + set waitfor = FALSE + ..() + shock_image = image(target, target, dir = target.dir) + shock_image.appearance_flags |= KEEP_APART + shock_image.color = rgb(0,0,0) + shock_image.override = TRUE + electrocution_skeleton_anim = image('icons/mob/human.dmi', target, icon_state = "electrocuted_base", layer=ABOVE_MOB_LAYER) + electrocution_skeleton_anim.appearance_flags |= RESET_COLOR|KEEP_APART + to_chat(target, span_userdanger("You feel a powerful shock course through your body!")) + if(target.client) + target.client.images |= shock_image + target.client.images |= electrocution_skeleton_anim + addtimer(CALLBACK(src, .proc/reset_shock_animation), 40) + target.playsound_local(get_turf(src), SFX_SPARKS, 100, 1) + target.staminaloss += 50 + target.Stun(4 SECONDS) + target.do_jitter_animation(300) // Maximum jitter + target.adjust_timed_status_effect(20 SECONDS, /datum/status_effect/jitter) + addtimer(CALLBACK(src, .proc/shock_drop), 2 SECONDS) + +/datum/hallucination/shock/proc/reset_shock_animation() + target.client?.images.Remove(shock_image) + target.client?.images.Remove(electrocution_skeleton_anim) + +/datum/hallucination/shock/proc/shock_drop() + target.Paralyze(6 SECONDS) diff --git a/code/modules/hallucination/sound.dm b/code/modules/hallucination/sound.dm new file mode 100644 index 00000000000000..00dc752a19113f --- /dev/null +++ b/code/modules/hallucination/sound.dm @@ -0,0 +1,243 @@ +/* Sound Hallucinations + * + * Contains: + * Fighting sounds + * Machinery sounds + * Special effects sounds + */ + +/datum/hallucination/battle + var/battle_type + var/iterations_left + var/hits = 0 + var/next_action = 0 + var/turf/source + +/datum/hallucination/battle/New(mob/living/carbon/C, forced = TRUE, new_battle_type) + ..() + + source = random_far_turf() + + battle_type = new_battle_type + if (isnull(battle_type)) + battle_type = pick("laser", "disabler", "esword", "gun", "stunprod", "harmbaton", "bomb") + feedback_details += "Type: [battle_type]" + var/process = TRUE + + switch(battle_type) + if("disabler", "laser") + iterations_left = rand(5, 10) + if("esword") + iterations_left = rand(4, 8) + target.playsound_local(source, 'sound/weapons/saberon.ogg',15, 1) + if("gun") + iterations_left = rand(3, 6) + if("stunprod") //Stunprod + cablecuff + process = FALSE + target.playsound_local(source, 'sound/weapons/egloves.ogg', 40, 1) + target.playsound_local(source, get_sfx(SFX_BODYFALL), 25, 1) + addtimer(CALLBACK(target, /mob/.proc/playsound_local, source, 'sound/weapons/cablecuff.ogg', 15, 1), 20) + if("harmbaton") //zap n slap + iterations_left = rand(5, 12) + target.playsound_local(source, 'sound/weapons/egloves.ogg', 40, 1) + target.playsound_local(source, get_sfx(SFX_BODYFALL), 25, 1) + next_action = 2 SECONDS + if("bomb") // Tick Tock + iterations_left = rand(3, 11) + + if (process) + START_PROCESSING(SSfastprocess, src) + else + qdel(src) + +/datum/hallucination/battle/process(delta_time) + next_action -= (delta_time * 10) + + if (next_action > 0) + return + + switch (battle_type) + if ("disabler", "laser", "gun") + var/fire_sound + var/hit_person_sound + var/hit_wall_sound + var/number_of_hits + var/chance_to_fall + + switch (battle_type) + if ("disabler") + fire_sound = 'sound/weapons/taser2.ogg' + hit_person_sound = 'sound/weapons/tap.ogg' + hit_wall_sound = 'sound/weapons/effects/searwall.ogg' + number_of_hits = 3 + chance_to_fall = 70 + if ("laser") + fire_sound = 'sound/weapons/laser.ogg' + hit_person_sound = 'sound/weapons/sear.ogg' + hit_wall_sound = 'sound/weapons/effects/searwall.ogg' + number_of_hits = 4 + chance_to_fall = 70 + if ("gun") + fire_sound = 'sound/weapons/gun/shotgun/shot.ogg' + hit_person_sound = 'sound/weapons/pierce.ogg' + hit_wall_sound = SFX_RICOCHET + number_of_hits = 2 + chance_to_fall = 80 + + target.playsound_local(source, fire_sound, 25, 1) + + if(prob(50)) + addtimer(CALLBACK(target, /mob/.proc/playsound_local, source, hit_person_sound, 25, 1), rand(5,10)) + hits += 1 + else + addtimer(CALLBACK(target, /mob/.proc/playsound_local, source, hit_wall_sound, 25, 1), rand(5,10)) + + next_action = rand(CLICK_CD_RANGE, CLICK_CD_RANGE + 6) + + if(hits >= number_of_hits && prob(chance_to_fall)) + addtimer(CALLBACK(target, /mob/.proc/playsound_local, source, get_sfx(SFX_BODYFALL), 25, 1), next_action) + qdel(src) + return + if ("esword") + target.playsound_local(source, 'sound/weapons/blade1.ogg', 50, 1) + + if (hits == 4) + target.playsound_local(source, get_sfx(SFX_BODYFALL), 25, 1) + + next_action = rand(CLICK_CD_MELEE, CLICK_CD_MELEE + 6) + hits += 1 + + if (iterations_left == 1) + target.playsound_local(source, 'sound/weapons/saberoff.ogg', 15, 1) + if ("harmbaton") + target.playsound_local(source, SFX_SWING_HIT, 50, 1) + next_action = rand(CLICK_CD_MELEE, CLICK_CD_MELEE + 4) + if ("bomb") + target.playsound_local(source, 'sound/items/timer.ogg', 25, 0) + next_action = 15 + + iterations_left -= 1 + if (iterations_left == 0) + qdel(src) + +/datum/hallucination/battle/Destroy() + . = ..() + source = null + STOP_PROCESSING(SSfastprocess, src) + +/datum/hallucination/sounds + +/datum/hallucination/sounds/New(mob/living/carbon/C, forced = TRUE, sound_type) + set waitfor = FALSE + ..() + var/turf/source = random_far_turf() + if(!sound_type) + sound_type = pick("airlock","airlock pry","console","explosion","far explosion","mech","glass","alarm","beepsky","mech","wall decon","door hack") + feedback_details += "Type: [sound_type]" + //Strange audio + switch(sound_type) + if("airlock") + target.playsound_local(source,'sound/machines/airlock.ogg', 30, 1) + if("airlock pry") + target.playsound_local(source,'sound/machines/airlock_alien_prying.ogg', 100, 1) + addtimer(CALLBACK(target, /mob/.proc/playsound_local, source, 'sound/machines/airlockforced.ogg', 30, 1), 50) + if("console") + target.playsound_local(source,'sound/machines/terminal_prompt.ogg', 25, 1) + if("explosion") + if(prob(50)) + target.playsound_local(source,'sound/effects/explosion1.ogg', 50, 1) + else + target.playsound_local(source, 'sound/effects/explosion2.ogg', 50, 1) + if("far explosion") + target.playsound_local(source, 'sound/effects/explosionfar.ogg', 50, 1) + if("glass") + target.playsound_local(source, pick('sound/effects/glassbr1.ogg','sound/effects/glassbr2.ogg','sound/effects/glassbr3.ogg'), 50, 1) + if("alarm") + target.playsound_local(source, 'sound/machines/alarm.ogg', 100, 0) + if("beepsky") + target.playsound_local(source, 'sound/voice/beepsky/freeze.ogg', 35, 0) + if("mech") + new /datum/hallucination/mech_sounds(C, forced, sound_type) + //Deconstructing a wall + if("wall decon") + target.playsound_local(source, 'sound/items/welder.ogg', 50, 1) + addtimer(CALLBACK(target, /mob/.proc/playsound_local, source, 'sound/items/welder2.ogg', 50, 1), 105) + addtimer(CALLBACK(target, /mob/.proc/playsound_local, source, 'sound/items/ratchet.ogg', 50, 1), 120) + //Hacking a door + if("door hack") + target.playsound_local(source, 'sound/items/screwdriver.ogg', 50, 1) + addtimer(CALLBACK(target, /mob/.proc/playsound_local, source, 'sound/machines/airlockforced.ogg', 30, 1), rand(40, 80)) + qdel(src) + +/datum/hallucination/mech_sounds + var/mech_dir + var/steps_left + var/next_action = 0 + var/turf/source + +/datum/hallucination/mech_sounds/New() + . = ..() + mech_dir = pick(GLOB.cardinals) + steps_left = rand(4, 9) + source = random_far_turf() + START_PROCESSING(SSfastprocess, src) + +/datum/hallucination/mech_sounds/process(delta_time) + next_action -= delta_time + if (next_action > 0) + return + + if(prob(75)) + target.playsound_local(source, 'sound/mecha/mechstep.ogg', 40, 1) + source = get_step(source, mech_dir) + else + target.playsound_local(source, 'sound/mecha/mechturn.ogg', 40, 1) + mech_dir = pick(GLOB.cardinals) + + steps_left -= 1 + if (!steps_left) + qdel(src) + return + next_action = 1 + +/datum/hallucination/mech_sounds/Destroy() + . = ..() + STOP_PROCESSING(SSfastprocess, src) + +/datum/hallucination/weird_sounds + +/datum/hallucination/weird_sounds/New(mob/living/carbon/C, forced = TRUE, sound_type) + set waitfor = FALSE + ..() + var/turf/source = random_far_turf() + if(!sound_type) + sound_type = pick("phone","hallelujah","highlander","laughter","hyperspace","game over","creepy","tesla") + feedback_details += "Type: [sound_type]" + //Strange audio + switch(sound_type) + if("phone") + target.playsound_local(source, 'sound/weapons/ring.ogg', 15) + for (var/next_rings in 1 to 3) + addtimer(CALLBACK(target, /mob/.proc/playsound_local, source, 'sound/weapons/ring.ogg', 15), 25 * next_rings) + if("hyperspace") + target.playsound_local(null, 'sound/runtime/hyperspace/hyperspace_begin.ogg', 50) + if("hallelujah") + target.playsound_local(source, 'sound/effects/pray_chaplain.ogg', 50) + if("highlander") + target.playsound_local(null, 'sound/misc/highlander.ogg', 50) + if("game over") + target.playsound_local(source, 'sound/misc/compiler-failure.ogg', 50) + if("laughter") + if(prob(50)) + target.playsound_local(source, 'sound/voice/human/womanlaugh.ogg', 50, 1) + else + target.playsound_local(source, pick('sound/voice/human/manlaugh1.ogg', 'sound/voice/human/manlaugh2.ogg'), 50, 1) + if("creepy") + //These sounds are (mostly) taken from Hidden: Source + target.playsound_local(source, pick(GLOB.creepy_ambience), 50, 1) + if("tesla") //Tesla loose! + target.playsound_local(source, 'sound/magic/lightningbolt.ogg', 35, 1) + addtimer(CALLBACK(target, /mob/.proc/playsound_local, source, 'sound/magic/lightningbolt.ogg', 65, 1), 30) + addtimer(CALLBACK(target, /mob/.proc/playsound_local, source, 'sound/magic/lightningbolt.ogg', 100, 1), 60) + + qdel(src) diff --git a/code/modules/hallucination/stray_bullet.dm b/code/modules/hallucination/stray_bullet.dm new file mode 100644 index 00000000000000..b0fba6d724a93b --- /dev/null +++ b/code/modules/hallucination/stray_bullet.dm @@ -0,0 +1,21 @@ +//hallucination projectile code in code/modules/projectiles/projectile/special.dm +/datum/hallucination/stray_bullet + +/datum/hallucination/stray_bullet/New(mob/living/carbon/C, forced = TRUE) + set waitfor = FALSE + ..() + var/list/turf/startlocs = list() + for(var/turf/open/T in view(world.view+1,target)-view(world.view,target)) + startlocs += T + if(!startlocs.len) + qdel(src) + return + var/turf/start = pick(startlocs) + var/proj_type = pick(subtypesof(/obj/projectile/hallucination)) + feedback_details += "Type: [proj_type]" + var/obj/projectile/hallucination/H = new proj_type(start) + target.playsound_local(start, H.hal_fire_sound, 60, 1) + H.hal_target = target + H.preparePixelProjectile(target, start) + H.fire() + qdel(src) diff --git a/code/modules/hydroponics/grown/chili.dm b/code/modules/hydroponics/grown/chili.dm index c6fef467a7dd9d..3691d5734257c8 100644 --- a/code/modules/hydroponics/grown/chili.dm +++ b/code/modules/hydroponics/grown/chili.dm @@ -106,4 +106,4 @@ foodtypes = FRUIT /obj/item/food/grown/bell_pepper/MakeBakeable() - AddComponent(/datum/component/bakeable, /obj/item/food/roasted_bell_pepper, rand(15 SECONDS, 35 SECONDS), TRUE, TRUE) + AddComponent(/datum/component/bakeable, /obj/item/food/roasted_bell_pepper, rand(15 SECONDS, 25 SECONDS), TRUE, TRUE) diff --git a/code/modules/hydroponics/grown/corn.dm b/code/modules/hydroponics/grown/corn.dm index 101ed1d08fb58a..de65b879280140 100644 --- a/code/modules/hydroponics/grown/corn.dm +++ b/code/modules/hydroponics/grown/corn.dm @@ -25,12 +25,13 @@ trash_type = /obj/item/grown/corncob bite_consumption_mod = 2 foodtypes = VEGETABLES + grind_results = list(/datum/reagent/consumable/cornmeal = 0) juice_results = list(/datum/reagent/consumable/corn_starch = 0) tastes = list("corn" = 1) distill_reagent = /datum/reagent/consumable/ethanol/whiskey /obj/item/food/grown/corn/MakeBakeable() - AddComponent(/datum/component/bakeable, /obj/item/food/oven_baked_corn, rand(15 SECONDS, 35 SECONDS), TRUE, TRUE) + AddComponent(/datum/component/bakeable, /obj/item/food/oven_baked_corn, rand(15 SECONDS, 25 SECONDS), TRUE, TRUE) /obj/item/grown/corncob name = "corn cob" diff --git a/code/modules/hydroponics/grown/olive.dm b/code/modules/hydroponics/grown/olive.dm new file mode 100644 index 00000000000000..8f93a9695ecfb2 --- /dev/null +++ b/code/modules/hydroponics/grown/olive.dm @@ -0,0 +1,27 @@ +// Olive +/obj/item/seeds/olive + name = "pack of olive seeds" + desc = "These seeds grow into olive trees." + icon_state = "seed-olive" + species = "olive" + plantname = "Olive Tree" + product = /obj/item/food/grown/olive + lifespan = 150 + endurance = 35 + yield = 5 + maturation = 10 + growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi' + icon_grow = "olive-grow" + icon_dead = "olive-dead" + genes = list(/datum/plant_gene/trait/repeated_harvest, /datum/plant_gene/trait/one_bite) + reagents_add = list(/datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.1) + +/obj/item/food/grown/olive + seed = /obj/item/seeds/olive + name = "olive" + desc = "A small cylindrical salty fruit closely related to mangoes. Can be ground into a paste and mixed with water to make quality oil." + icon_state = "olive" + foodtypes = FRUIT + grind_results = list(/datum/reagent/consumable/olivepaste = 0) + tastes = list("olive" = 1) + diff --git a/code/modules/hydroponics/grown/onion.dm b/code/modules/hydroponics/grown/onion.dm index 93940e1a82cf7b..38320df982e44c 100644 --- a/code/modules/hydroponics/grown/onion.dm +++ b/code/modules/hydroponics/grown/onion.dm @@ -53,7 +53,7 @@ var/datum/effect_system/fluid_spread/smoke/chem/cry_about_it = new //Since the onion is destroyed when it's sliced, var/splat_location = get_turf(src) //we need to set up the smoke beforehand cry_about_it.attach(splat_location) - cry_about_it.set_up(0, location = splat_location, carry = reagents, silent = FALSE) + cry_about_it.set_up(0, holder = src, location = splat_location, carry = reagents, silent = FALSE) cry_about_it.start() qdel(cry_about_it) return ..() diff --git a/code/modules/hydroponics/grown/weeds/kudzu.dm b/code/modules/hydroponics/grown/weeds/kudzu.dm index b965a5fbffb1f3..45be37cd671fcc 100644 --- a/code/modules/hydroponics/grown/weeds/kudzu.dm +++ b/code/modules/hydroponics/grown/weeds/kudzu.dm @@ -54,7 +54,7 @@ var/output_message = "" for(var/datum/spacevine_mutation/SM in mutations) kudzu_mutations += "[(kudzu_mutations == "") ? "" : ", "][SM.name]" - output_message += "- Plant Mutations: [(kudzu_mutations == "") ? "None." : "[kudzu_mutations]."]" + output_message += "Plant Mutations: [(kudzu_mutations == "") ? "None." : "[kudzu_mutations]."]" return output_message /obj/item/seeds/kudzu/on_chem_reaction(datum/reagents/reagents) diff --git a/code/modules/hydroponics/hydroitemdefines.dm b/code/modules/hydroponics/hydroitemdefines.dm index 19ba2b4377f9ad..aa1c332029334f 100644 --- a/code/modules/hydroponics/hydroitemdefines.dm +++ b/code/modules/hydroponics/hydroitemdefines.dm @@ -74,19 +74,19 @@ */ /obj/item/plant_analyzer/proc/do_plant_stats_scan(atom/scan_target, mob/user) if(istype(scan_target, /obj/machinery/hydroponics)) - to_chat(user, scan_tray_stats(scan_target)) + to_chat(user, examine_block(scan_tray_stats(scan_target))) return TRUE if(istype(scan_target, /obj/structure/glowshroom)) var/obj/structure/glowshroom/shroom_plant = scan_target - to_chat(user, scan_plant_stats(shroom_plant.myseed)) + to_chat(user, examine_block(scan_plant_stats(shroom_plant.myseed))) return TRUE if(istype(scan_target, /obj/item/graft)) - to_chat(user, get_graft_text(scan_target)) + to_chat(user, examine_block(get_graft_text(scan_target))) return TRUE if(isitem(scan_target)) var/obj/item/scanned_object = scan_target if(scanned_object.get_plant_seed() || istype(scanned_object, /obj/item/seeds)) - to_chat(user, scan_plant_stats(scanned_object)) + to_chat(user, examine_block(scan_plant_stats(scanned_object))) return TRUE if(isliving(scan_target)) var/mob/living/L = scan_target @@ -107,19 +107,19 @@ */ /obj/item/plant_analyzer/proc/do_plant_chem_scan(atom/scan_target, mob/user) if(istype(scan_target, /obj/machinery/hydroponics)) - to_chat(user, scan_tray_chems(scan_target)) + to_chat(user, examine_block(scan_tray_chems(scan_target))) return TRUE if(istype(scan_target, /obj/structure/glowshroom)) var/obj/structure/glowshroom/shroom_plant = scan_target - to_chat(user, scan_plant_chems(shroom_plant.myseed)) + to_chat(user, examine_block(scan_plant_chems(shroom_plant.myseed))) return TRUE if(istype(scan_target, /obj/item/graft)) - to_chat(user, get_graft_text(scan_target)) + to_chat(user, examine_block(get_graft_text(scan_target))) return TRUE if(isitem(scan_target)) var/obj/item/scanned_object = scan_target if(scanned_object.get_plant_seed() || istype(scanned_object, /obj/item/seeds)) - to_chat(user, scan_plant_chems(scanned_object)) + to_chat(user, examine_block(scan_plant_chems(scanned_object))) return TRUE if(isliving(scan_target)) var/mob/living/L = scan_target @@ -167,24 +167,24 @@ * Returns the formatted message as text. */ /obj/item/plant_analyzer/proc/scan_tray_stats(obj/machinery/hydroponics/scanned_tray) - var/returned_message = "*---------*\n" + var/returned_message = "" if(scanned_tray.myseed) - returned_message += "*** [span_bold("[scanned_tray.myseed.plantname]")] ***\n" - returned_message += "- Plant Age: [span_notice("[scanned_tray.age]")]\n" - returned_message += "- Plant Health: [span_notice("[scanned_tray.plant_health]")]\n" - returned_message += scan_plant_stats(scanned_tray.myseed) + returned_message += "[span_bold("[scanned_tray.myseed.plantname]")]" + returned_message += "\nPlant Age: [span_notice("[scanned_tray.age]")]" + returned_message += "\nPlant Health: [span_notice("[scanned_tray.plant_health]")]" + returned_message += scan_plant_stats(scanned_tray.myseed, TRUE) + returned_message += "\nGrowth medium" else - returned_message += span_bold("No plant found.\n") + returned_message += span_bold("No plant found.") - returned_message += "- Weed level: [span_notice("[scanned_tray.weedlevel] / [MAX_TRAY_WEEDS]")]\n" - returned_message += "- Pest level: [span_notice("[scanned_tray.pestlevel] / [MAX_TRAY_PESTS]")]\n" - returned_message += "- Toxicity level: [span_notice("[scanned_tray.toxic] / [MAX_TRAY_TOXINS]")]\n" - returned_message += "- Water level: [span_notice("[scanned_tray.waterlevel] / [scanned_tray.maxwater]")]\n" - returned_message += "- Nutrition level: [span_notice("[scanned_tray.reagents.total_volume] / [scanned_tray.maxnutri]")]\n" + returned_message += "\nWeed level: [span_notice("[scanned_tray.weedlevel] / [MAX_TRAY_WEEDS]")]" + returned_message += "\nPest level: [span_notice("[scanned_tray.pestlevel] / [MAX_TRAY_PESTS]")]" + returned_message += "\nToxicity level: [span_notice("[scanned_tray.toxic] / [MAX_TRAY_TOXINS]")]" + returned_message += "\nWater level: [span_notice("[scanned_tray.waterlevel] / [scanned_tray.maxwater]")]" + returned_message += "\nNutrition level: [span_notice("[scanned_tray.reagents.total_volume] / [scanned_tray.maxnutri]")]" if(scanned_tray.yieldmod != 1) - returned_message += "- Yield modifier on harvest: [span_notice("[scanned_tray.yieldmod]x")]\n" + returned_message += "\nYield modifier on harvest: [span_notice("[scanned_tray.yieldmod]x")]" - returned_message += "*---------*" return span_info(returned_message) /** @@ -196,22 +196,21 @@ * Returns the formatted message as text. */ /obj/item/plant_analyzer/proc/scan_tray_chems(obj/machinery/hydroponics/scanned_tray) - var/returned_message = "*---------*\n" + var/returned_message = "" if(scanned_tray.myseed) - returned_message += "*** [span_bold("[scanned_tray.myseed.plantname]")] ***\n" - returned_message += "- Plant Age: [span_notice("[scanned_tray.age]")]\n" - returned_message += scan_plant_chems(scanned_tray.myseed) + returned_message += "[span_bold("[scanned_tray.myseed.plantname]")]" + returned_message += "\nPlant Age: [span_notice("[scanned_tray.age]")]" + returned_message += scan_plant_chems(scanned_tray.myseed, TRUE) else - returned_message += span_bold("No plant found.\n") + returned_message += span_bold("No plant found.") - returned_message += "- Tray contains:\n" + returned_message += "\nGrowth medium contains:" if(scanned_tray.reagents.reagent_list.len) for(var/datum/reagent/reagent_id in scanned_tray.reagents.reagent_list) - returned_message += "- [span_notice("[reagent_id.volume] / [scanned_tray.maxnutri] units of [reagent_id]")]\n" + returned_message += "\n[span_notice("• [reagent_id.volume] / [scanned_tray.maxnutri] units of [reagent_id]")]" else - returned_message += "[span_notice("No reagents found.")]\n" + returned_message += "\n[span_notice("No reagents found.")]" - returned_message += "*---------*" return span_info(returned_message) /** @@ -222,8 +221,12 @@ * * Returns the formatted output as text. */ -/obj/item/plant_analyzer/proc/scan_plant_stats(obj/item/scanned_object) - var/returned_message = "*---------*\nThis is [span_name("\a [scanned_object]")].\n" +/obj/item/plant_analyzer/proc/scan_plant_stats(obj/item/scanned_object, in_tray = FALSE) + var/returned_message = "" + if(!in_tray) + returned_message += "This is [span_name("\a [scanned_object]")]." + else + returned_message += "\nSeed Stats" var/obj/item/seeds/our_seed = scanned_object if(!istype(our_seed)) //if we weren't passed a seed, we were passed a plant with a seed our_seed = scanned_object.get_plant_seed() @@ -231,9 +234,8 @@ if(our_seed && istype(our_seed)) returned_message += get_analyzer_text_traits(our_seed) else - returned_message += "*---------*\nNo genes found.\n*---------*" + returned_message += "\nNo genes found." - returned_message += "\n" return span_info(returned_message) /** @@ -244,8 +246,12 @@ * * Returns the formatted output as text. */ -/obj/item/plant_analyzer/proc/scan_plant_chems(obj/item/scanned_object) - var/returned_message = "*---------*\nThis is [span_name("\a [scanned_object]")].\n" +/obj/item/plant_analyzer/proc/scan_plant_chems(obj/item/scanned_object, in_tray = FALSE) + var/returned_message = "" + if(!in_tray) + returned_message += "This is [span_name("\a [scanned_object]")]." + else + returned_message += "\nSeed Stats" var/obj/item/seeds/our_seed = scanned_object if(!istype(our_seed)) //if we weren't passed a seed, we were passed a plant with a seed our_seed = scanned_object.get_plant_seed() @@ -255,9 +261,8 @@ else if (our_seed.reagents_add?.len) //we have a seed with reagent genes returned_message += get_analyzer_text_chem_genes(our_seed) else - returned_message += "*---------*\nNo reagents found.\n*---------*" + returned_message += "\nNo reagents found." - returned_message += "\n" return span_info(returned_message) /** @@ -270,28 +275,28 @@ /obj/item/plant_analyzer/proc/get_analyzer_text_traits(obj/item/seeds/scanned) var/text = "" if(scanned.get_gene(/datum/plant_gene/trait/plant_type/weed_hardy)) - text += "- Plant type: [span_notice("Weed. Can grow in nutrient-poor soil.")]\n" + text += "\nPlant type: [span_notice("Weed. Can grow in nutrient-poor soil.")]" else if(scanned.get_gene(/datum/plant_gene/trait/plant_type/fungal_metabolism)) - text += "- Plant type: [span_notice("Mushroom. Can grow in dry soil.")]\n" + text += "\nPlant type: [span_notice("Mushroom. Can grow in dry soil.")]" else if(scanned.get_gene(/datum/plant_gene/trait/plant_type/alien_properties)) - text += "- Plant type: [span_warning("UNKNOWN")] \n" + text += "\nPlant type: [span_warning("UNKNOWN")]" else - text += "- Plant type: [span_notice("Normal plant")]\n" + text += "\nPlant type: [span_notice("Normal plant")]" if(scanned.potency != -1) - text += "- Potency: [span_notice("[scanned.potency]")]\n" + text += "\nPotency: [span_notice("[scanned.potency]")]" if(scanned.yield != -1) - text += "- Yield: [span_notice("[scanned.yield]")]\n" - text += "- Maturation speed: [span_notice("[scanned.maturation]")]\n" + text += "\nYield: [span_notice("[scanned.yield]")]" + text += "\nMaturation speed: [span_notice("[scanned.maturation]")]" if(scanned.yield != -1) - text += "- Production speed: [span_notice("[scanned.production]")]\n" - text += "- Endurance: [span_notice("[scanned.endurance]")]\n" - text += "- Lifespan: [span_notice("[scanned.lifespan]")]\n" - text += "- Instability: [span_notice("[scanned.instability]")]\n" - text += "- Weed Growth Rate: [span_notice("[scanned.weed_rate]")]\n" - text += "- Weed Vulnerability: [span_notice("[scanned.weed_chance]")]\n" + text += "\nProduction speed: [span_notice("[scanned.production]")]" + text += "\nEndurance: [span_notice("[scanned.endurance]")]" + text += "\nLifespan: [span_notice("[scanned.lifespan]")]" + text += "\nInstability: [span_notice("[scanned.instability]")]" + text += "\nWeed Growth Rate: [span_notice("[scanned.weed_rate]")]" + text += "\nWeed Vulnerability: [span_notice("[scanned.weed_chance]")]" if(scanned.rarity) - text += "- Species Discovery Value: [span_notice("[scanned.rarity]")]\n" + text += "\nSpecies Discovery Value: [span_notice("[scanned.rarity]")]" var/all_removable_traits = "" var/all_immutable_traits = "" for(var/datum/plant_gene/trait/traits in scanned.genes) @@ -302,17 +307,14 @@ else all_immutable_traits += "[(all_immutable_traits == "") ? "" : ", "][traits.get_name()]" - text += "- Plant Traits: [span_notice("[all_removable_traits? all_removable_traits : "None."]")]\n" - text += "- Core Plant Traits: [span_notice("[all_immutable_traits? all_immutable_traits : "None."]")]\n" + text += "\nPlant Traits: [span_notice("[all_removable_traits? all_removable_traits : "None."]")]" + text += "\nCore Plant Traits: [span_notice("[all_immutable_traits? all_immutable_traits : "None."]")]" var/datum/plant_gene/scanned_graft_result = scanned.graft_gene? new scanned.graft_gene : new /datum/plant_gene/trait/repeated_harvest - text += "- Grafting this plant would give: [span_notice("[scanned_graft_result.get_name()]")]\n" + text += "\nGrafting this plant would give: [span_notice("[scanned_graft_result.get_name()]")]" QDEL_NULL(scanned_graft_result) //graft genes are stored as typepaths so if we want to get their formatted name we need a datum ref - musn't forget to clean up afterwards - text += "*---------*" var/unique_text = scanned.get_unique_analyzer_text() if(unique_text) - text += "\n" - text += unique_text - text += "\n*---------*" + text += "\n[unique_text]" return text /** @@ -323,12 +325,9 @@ * Returns the formatted output as text. */ /obj/item/plant_analyzer/proc/get_analyzer_text_chem_genes(obj/item/seeds/scanned) - var/text = "" - text += "- Plant Reagent Genes -\n" - text += "*---------*\n" + var/text = "\nPlant Reagent Genes:" for(var/datum/plant_gene/reagent/gene in scanned.genes) - text += "- [gene.get_name()] -\n" - text += "*---------*" + text += "\n• [gene.get_name()]" return text /** @@ -341,21 +340,19 @@ /obj/item/plant_analyzer/proc/get_analyzer_text_chem_contents(obj/item/scanned_plant) var/text = "" var/reagents_text = "" - text += "- Plant Reagents -\n" - text += "Maximum reagent capacity: [scanned_plant.reagents.maximum_volume]\n" + text += "\nPlant Reagents:" var/chem_cap = 0 for(var/_reagent in scanned_plant.reagents.reagent_list) var/datum/reagent/reagent = _reagent var/amount = reagent.volume chem_cap += reagent.volume - reagents_text += "\n- [reagent.name]: [amount]" - if(chem_cap > 100) - text += "- [span_danger("Reagent Traits Over 100% Production")]\n" - + reagents_text += "\n• [reagent.name]: [amount]" if(reagents_text) - text += "*---------*" text += reagents_text - text += "\n*---------*" + text += "\nMaximum reagent capacity: [scanned_plant.reagents.maximum_volume]" + if(chem_cap > 100) + text += "\n[span_danger("Reagent Traits Over 100% Production")]" + return text /** @@ -366,19 +363,17 @@ * Returns the formatted output as text. */ /obj/item/plant_analyzer/proc/get_graft_text(obj/item/graft/scanned_graft) - var/text = "*---------*\n- Plant Graft -\n" + var/text = "Plant Graft" if(scanned_graft.parent_name) - text += "- Parent Plant: [span_notice("[scanned_graft.parent_name]")] -\n" + text += "\nParent Plant: [span_notice("[scanned_graft.parent_name]")]" if(scanned_graft.stored_trait) - text += "- Graftable Traits: [span_notice("[scanned_graft.stored_trait.get_name()]")] -\n" - text += "*---------*\n" - text += "- Yield: [span_notice("[scanned_graft.yield]")]\n" - text += "- Production speed: [span_notice("[scanned_graft.production]")]\n" - text += "- Endurance: [span_notice("[scanned_graft.endurance]")]\n" - text += "- Lifespan: [span_notice("[scanned_graft.lifespan]")]\n" - text += "- Weed Growth Rate: [span_notice("[scanned_graft.weed_rate]")]\n" - text += "- Weed Vulnerability: [span_notice("[scanned_graft.weed_chance]")]\n" - text += "*---------*" + text += "\nGraftable Traits: [span_notice("[scanned_graft.stored_trait.get_name()]")]" + text += "\nYield: [span_notice("[scanned_graft.yield]")]" + text += "\nProduction speed: [span_notice("[scanned_graft.production]")]" + text += "\nEndurance: [span_notice("[scanned_graft.endurance]")]" + text += "\nLifespan: [span_notice("[scanned_graft.lifespan]")]" + text += "\nWeed Growth Rate: [span_notice("[scanned_graft.weed_rate]")]" + text += "\nWeed Vulnerability: [span_notice("[scanned_graft.weed_chance]")]" return span_info(text) diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index 82008d72e208fe..127c45b2d2514c 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -627,7 +627,6 @@ /obj/machinery/hydroponics/proc/hardmutate() mutate(4, 10, 2, 4, 50, 4, 10, 0, 4) - /obj/machinery/hydroponics/proc/mutatespecie() // Mutagent produced a new plant! if(!myseed || plant_status == HYDROTRAY_PLANT_DEAD || !LAZYLEN(myseed.mutatelist)) return @@ -645,6 +644,23 @@ var/message = span_warning("[oldPlantName] suddenly mutates into [myseed.plantname]!") addtimer(CALLBACK(src, .proc/after_mutation, message), 0.5 SECONDS) +/obj/machinery/hydroponics/proc/polymorph() // Polymorph a plant into another plant + if(!myseed || plant_status == HYDROTRAY_PLANT_DEAD) + return + + var/oldPlantName = myseed.plantname + var/polymorph_seed = pick(subtypesof(/obj/item/seeds)) + set_seed(new polymorph_seed(src)) + + hardmutate() + age = 0 + set_plant_health(myseed.endurance, update_icon = FALSE) + lastcycle = world.time + set_weedlevel(0, update_icon = FALSE) + + var/message = span_warning("[oldPlantName] suddenly polymorphs into [myseed.plantname]!") + addtimer(CALLBACK(src, .proc/after_mutation, message), 0.5 SECONDS) + /obj/machinery/hydroponics/proc/mutateweed() // If the weeds gets the mutagent instead. Mind you, this pretty much destroys the old plant if( weedlevel > 5 ) set_seed(null) diff --git a/code/modules/hydroponics/plant_genes.dm b/code/modules/hydroponics/plant_genes.dm index 24a2ec5745042d..0095bd055335f1 100644 --- a/code/modules/hydroponics/plant_genes.dm +++ b/code/modules/hydroponics/plant_genes.dm @@ -651,8 +651,8 @@ var/splat_location = get_turf(target) var/range = sqrt(our_seed.potency * 0.1) smoke.attach(splat_location) - smoke.set_up(round(range), location = splat_location, carry = our_plant.reagents, silent = FALSE) - smoke.start() + smoke.set_up(round(range), holder = our_plant, location = splat_location, carry = our_plant.reagents, silent = FALSE) + smoke.start(log = TRUE) our_plant.reagents.clear_reagents() /// Makes the plant and its seeds fireproof. From lavaland plants. @@ -854,7 +854,7 @@ /datum/plant_gene/trait/never_mutate name = "Prosophobic Inclination" mutability_flags = PLANT_GENE_REMOVABLE | PLANT_GENE_MUTATABLE | PLANT_GENE_GRAFTABLE - + /// Prevents stat mutation caused by instability. Trait acts as a tag for hydroponics.dm to recognise. /datum/plant_gene/trait/stable_stats name = "Symbiotic Resilience" diff --git a/code/modules/hydroponics/unique_plant_genes.dm b/code/modules/hydroponics/unique_plant_genes.dm index 5ea7f604a15724..7370e86f50a193 100644 --- a/code/modules/hydroponics/unique_plant_genes.dm +++ b/code/modules/hydroponics/unique_plant_genes.dm @@ -38,6 +38,10 @@ name = "On Attack Trait" /// The multiplier we apply to the potency to calculate force. Set to 0 to not affect the force. var/force_multiplier = 0 + /// If TRUE, our plant will degrade in force every hit until diappearing. + var/degrades_after_hit = FALSE + /// When we fully degrade, what degraded off of us? + var/degradation_noun = "leaves" /datum/plant_gene/trait/attack/on_new_plant(obj/item/our_plant, newloc) . = ..() @@ -50,97 +54,101 @@ RegisterSignal(our_plant, COMSIG_ITEM_ATTACK, .proc/on_plant_attack) RegisterSignal(our_plant, COMSIG_ITEM_AFTERATTACK, .proc/after_plant_attack) +/// Signal proc for [COMSIG_ITEM_ATTACK] that allows for effects on attack +/datum/plant_gene/trait/attack/proc/on_plant_attack(obj/item/source, mob/living/target, mob/living/user) + SIGNAL_HANDLER + + INVOKE_ASYNC(src, .proc/attack_effect, source, target, user) + /* - * Plant effects ON attack. + * Effects done when we hit people with our plant, ON attack. + * Override on a per-plant basis. * * our_plant - our plant, that we're attacking with * user - the person who is attacking with the plant * target - the person who is attacked by the plant */ -/datum/plant_gene/trait/attack/proc/on_plant_attack(obj/item/our_plant, mob/living/target, mob/living/user) +/datum/plant_gene/trait/attack/proc/attack_effect(obj/item/our_plant, mob/living/target, mob/living/user) + return + +/// Signal proc for [COMSIG_ITEM_AFTERATTACK] that allows for effects after an attack is done +/datum/plant_gene/trait/attack/proc/after_plant_attack(obj/item/source, atom/target, mob/user, proximity_flag, click_parameters) SIGNAL_HANDLER + if(!proximity_flag) + return + + if(!ismovable(target)) + return + + if(isobj(target)) + var/obj/object_target = target + if(!(object_target.obj_flags & CAN_BE_HIT)) + return + + INVOKE_ASYNC(src, .proc/after_attack_effect, source, target, user) + /* - * Plant effects AFTER attack. + * Effects done when we hit people with our plant, AFTER the attack is done. + * Extend on a per-plant basis. * * our_plant - our plant, that we're attacking with * user - the person who is attacking with the plant * target - the atom which is attacked by the plant - * - * return TRUE if plant attack is acceptable, otherwise FALSE to early return subtypes. */ -/datum/plant_gene/trait/attack/proc/after_plant_attack(obj/item/our_plant, atom/target, mob/user, proximity_flag, click_parameters) - SIGNAL_HANDLER +/datum/plant_gene/trait/attack/proc/after_attack_effect(obj/item/our_plant, atom/target, mob/living/user) + SHOULD_CALL_PARENT(TRUE) - if(!proximity_flag) - return FALSE - return TRUE + if(!degrades_after_hit) + return + + // We probably hit something or someone. Reduce our force + if(our_plant.force > 0) + our_plant.force -= rand(1, (our_plant.force / 3) + 1) + return + + // When our force degrades to zero or below, we're all done + to_chat(user, span_warning("All the [degradation_noun] have fallen off [our_plant] from violent whacking!")) + qdel(our_plant) /// Novaflower's attack effects (sets people on fire) + degradation on attack /datum/plant_gene/trait/attack/novaflower_attack name = "Heated Petals" force_multiplier = 0.2 + degrades_after_hit = TRUE + degradation_noun = "petals" -/datum/plant_gene/trait/attack/novaflower_attack/on_plant_attack(obj/item/our_plant, mob/living/target, mob/living/user) - . = ..() - if(!.) +/datum/plant_gene/trait/attack/novaflower_attack/attack_effect(obj/item/our_plant, mob/living/target, mob/living/user) + if(!istype(target)) return var/obj/item/seeds/our_seed = our_plant.get_plant_seed() - to_chat(target, "You are lit on fire from the intense heat of [our_plant]!") - target.adjust_fire_stacks(our_seed.potency / 20) + to_chat(target, span_danger("You are lit on fire from the intense heat of [our_plant]!")) + target.adjust_fire_stacks(round(our_seed.potency / 20)) if(target.ignite_mob()) message_admins("[ADMIN_LOOKUPFLW(user)] set [ADMIN_LOOKUPFLW(target)] on fire with [our_plant] at [AREACOORD(user)]") log_game("[key_name(user)] set [key_name(target)] on fire with [our_plant] at [AREACOORD(user)]") our_plant.investigate_log("was used by [key_name(user)] to burn [key_name(target)] at [AREACOORD(user)]", INVESTIGATE_BOTANY) -/datum/plant_gene/trait/attack/novaflower_attack/after_plant_attack(obj/item/our_plant, atom/target, mob/user, proximity_flag, click_parameters) - . = ..() - if(!.) - return - - if(!ismovable(target)) - return - if(our_plant.force > 0) - our_plant.force -= rand(1, (our_plant.force / 3) + 1) - else - to_chat(user, "All the petals have fallen off [our_plant] from violent whacking!") - qdel(our_plant) - /// Sunflower's attack effect (shows cute text) /datum/plant_gene/trait/attack/sunflower_attack name = "Bright Petals" -/datum/plant_gene/trait/attack/sunflower_attack/after_plant_attack(obj/item/our_plant, atom/target, mob/user, proximity_flag, click_parameters) - . = ..() - if(!.) - return +/datum/plant_gene/trait/attack/sunflower_attack/after_attack_effect(obj/item/our_plant, atom/target, mob/user, proximity_flag, click_parameters) + if(ismob(target)) + var/mob/target_mob = target + user.visible_message("[user] smacks [target_mob] with [user.p_their()] [our_plant.name]! FLOWER POWER!", ignored_mobs = list(target_mob, user)) + if(target_mob != user) + to_chat(target_mob, "[user] smacks you with [our_plant]!FLOWER POWER!") + to_chat(user, "Your [our_plant.name]'s FLOWER POWER strikes [target_mob]!") - if(!ismob(target)) - return - var/mob/target_mob = target - user.visible_message("[user] smacks [target_mob] with [user.p_their()] [our_plant.name]! FLOWER POWER!", ignored_mobs = list(target_mob, user)) - if(target_mob != user) - to_chat(target_mob, "[user] smacks you with [our_plant]!FLOWER POWER!") - to_chat(user, "Your [our_plant.name]'s FLOWER POWER strikes [target_mob]!") + return ..() /// Normal nettle's force + degradation on attack /datum/plant_gene/trait/attack/nettle_attack name = "Sharpened Leaves" force_multiplier = 0.2 - -/datum/plant_gene/trait/attack/nettle_attack/after_plant_attack(obj/item/our_plant, atom/target, mob/user, proximity_flag, click_parameters) - . = ..() - if(!.) - return - - if(!ismovable(target)) - return - if(our_plant.force > 0) - our_plant.force -= rand(1, (our_plant.force / 3) + 1) - else - to_chat(user, "All the leaves have fallen off [our_plant] from violent whacking!") - qdel(our_plant) + degrades_after_hit = TRUE /// Deathnettle force + degradation on attack /datum/plant_gene/trait/attack/nettle_attack/death @@ -153,9 +161,9 @@ /// Whether our actions are cancelled when the backfire triggers. var/cancel_action_on_backfire = FALSE /// A list of extra traits to check to be considered safe. - var/traits_to_check + var/list/traits_to_check /// A list of extra genes to check to be considered safe. - var/genes_to_check + var/list/genes_to_check /datum/plant_gene/trait/backfire/on_new_plant(obj/item/our_plant, newloc) . = ..() @@ -163,16 +171,20 @@ return our_plant.AddElement(/datum/element/plant_backfire, cancel_action_on_backfire, traits_to_check, genes_to_check) - RegisterSignal(our_plant, COMSIG_PLANT_ON_BACKFIRE, .proc/backfire_effect) + RegisterSignal(our_plant, COMSIG_PLANT_ON_BACKFIRE, .proc/on_backfire) -/* - * The backfire effect. Override with plant-specific effects. - * - * user - the person who is carrying the plant - * our_plant - our plant +/// Signal proc for [COMSIG_PLANT_ON_BACKFIRE] that causes the backfire effect. +/datum/plant_gene/trait/backfire/proc/on_backfire(obj/item/source, mob/living/carbon/user) + SIGNAL_HANDLER + + INVOKE_ASYNC(src, .proc/backfire_effect, source, user) + +/** + * The actual backfire effect on the user. + * Override with plant-specific effects. */ /datum/plant_gene/trait/backfire/proc/backfire_effect(obj/item/our_plant, mob/living/carbon/user) - SIGNAL_HANDLER + return /// Rose's prick on backfire /datum/plant_gene/trait/backfire/rose_thorns @@ -180,18 +192,15 @@ traits_to_check = list(TRAIT_PIERCEIMMUNE) /datum/plant_gene/trait/backfire/rose_thorns/backfire_effect(obj/item/our_plant, mob/living/carbon/user) - . = ..() - var/obj/item/seeds/our_seed = our_plant.get_plant_seed() if(!our_seed.get_gene(/datum/plant_gene/trait/sticky) && prob(66)) - to_chat(user, "[our_plant]'s thorns nearly prick your hand. Best be careful.") + to_chat(user, span_danger("[our_plant]'s thorns nearly prick your hand. Best be careful.")) return - to_chat(user, "[our_plant]'s thorns prick your hand. Ouch.") + to_chat(user, span_danger("[our_plant]'s thorns prick your hand. Ouch.")) our_plant.investigate_log("rose-pricked [key_name(user)] at [AREACOORD(user)]", INVESTIGATE_BOTANY) var/obj/item/bodypart/affecting = user.get_active_hand() - if(affecting?.receive_damage(2)) - user.update_damage_overlays() + affecting?.receive_damage(2) /// Novaflower's hand burn on backfire /datum/plant_gene/trait/backfire/novaflower_heat @@ -199,26 +208,20 @@ cancel_action_on_backfire = TRUE /datum/plant_gene/trait/backfire/novaflower_heat/backfire_effect(obj/item/our_plant, mob/living/carbon/user) - . = ..() - - to_chat(user, "[our_plant] singes your bare hand!") + to_chat(user, span_danger("[our_plant] singes your bare hand!")) our_plant.investigate_log("self-burned [key_name(user)] for [our_plant.force] at [AREACOORD(user)]", INVESTIGATE_BOTANY) var/obj/item/bodypart/affecting = user.get_active_hand() - if(affecting?.receive_damage(0, our_plant.force, wound_bonus = CANT_WOUND)) - user.update_damage_overlays() + return affecting?.receive_damage(0, our_plant.force, wound_bonus = CANT_WOUND) /// Normal Nettle hannd burn on backfire /datum/plant_gene/trait/backfire/nettle_burn name = "Stinging Stem" /datum/plant_gene/trait/backfire/nettle_burn/backfire_effect(obj/item/our_plant, mob/living/carbon/user) - . = ..() - - to_chat(user, "[our_plant] burns your bare hand!") + to_chat(user, span_danger("[our_plant] burns your bare hand!")) our_plant.investigate_log("self-burned [key_name(user)] for [our_plant.force] at [AREACOORD(user)]", INVESTIGATE_BOTANY) var/obj/item/bodypart/affecting = user.get_active_hand() - if(affecting?.receive_damage(0, our_plant.force, wound_bonus = CANT_WOUND)) - user.update_damage_overlays() + return affecting?.receive_damage(0, our_plant.force, wound_bonus = CANT_WOUND) /// Deathnettle hand burn + stun on backfire /datum/plant_gene/trait/backfire/nettle_burn/death @@ -227,10 +230,11 @@ /datum/plant_gene/trait/backfire/nettle_burn/death/backfire_effect(obj/item/our_plant, mob/living/carbon/user) . = ..() + if(!. || prob(50)) + return - if(prob(50)) - user.Paralyze(100) - to_chat(user, "You are stunned by the powerful acids of [our_plant]!") + user.Paralyze(10 SECONDS) + to_chat(user, span_userdanger("You are stunned by the powerful acids of [our_plant]!")) /// Ghost-Chili heating up on backfire /datum/plant_gene/trait/backfire/chili_heat @@ -256,8 +260,6 @@ * user - the mob holding our plant */ /datum/plant_gene/trait/backfire/chili_heat/backfire_effect(obj/item/our_plant, mob/living/carbon/user) - . = ..() - held_mob = WEAKREF(user) START_PROCESSING(SSobj, src) @@ -296,11 +298,14 @@ genes_to_check = list(/datum/plant_gene/trait/squash) /datum/plant_gene/trait/backfire/bluespace/backfire_effect(obj/item/our_plant, mob/living/carbon/user) - . = ..() - if(prob(50)) - to_chat(user, "[our_plant] slips out of your hand!") - INVOKE_ASYNC(our_plant, /obj/item/.proc/attack_self, user) + return + + to_chat(user, span_danger("[our_plant] slips out of your hand!")) + + var/obj/item/seeds/our_seed = our_plant.get_plant_seed() + var/datum/plant_gene/trait/squash/squash_gene = our_seed.get_gene(/datum/plant_gene/trait/squash) + squash_gene.squash_plant(our_plant, user) /// Traits for plants that can be activated to turn into a mob. /datum/plant_gene/trait/mob_transformation @@ -347,8 +352,8 @@ return if(target != user) - to_chat(user, "[our_plant] is twitching and shaking, preventing you from feeding it to [target].") - to_chat(target, "[our_plant] is twitching and shaking, preventing you from eating it.") + to_chat(user, span_warning("[our_plant] is twitching and shaking, preventing you from feeding it to [target].")) + to_chat(target, span_warning("[our_plant] is twitching and shaking, preventing you from eating it.")) return COMPONENT_CANCEL_ATTACK_CHAIN /* @@ -365,10 +370,10 @@ return if(dangerous && HAS_TRAIT(user, TRAIT_PACIFISM)) - to_chat(user, "You decide not to awaken [our_plant]. It may be very dangerous!") + to_chat(user, span_notice("You decide not to awaken [our_plant]. It may be very dangerous!")) return - to_chat(user, "You begin to awaken [our_plant]...") + to_chat(user, span_notice("You begin to awaken [our_plant]...")) begin_awaken(our_plant, 3 SECONDS) our_plant.investigate_log("was awakened by [key_name(user)] at [AREACOORD(user)].", INVESTIGATE_BOTANY) @@ -382,7 +387,7 @@ SIGNAL_HANDLER if(!awakening && !isspaceturf(user.loc) && prob(25)) - to_chat(user, "[our_plant] begins to growl and shake!") + our_plant.visible_message(span_danger("[our_plant] begins to growl and shake!")) begin_awaken(our_plant, 1 SECONDS) our_plant.investigate_log("was awakened (via plant backfire) by [key_name(user)] at [AREACOORD(user)].", INVESTIGATE_BOTANY) @@ -416,7 +421,7 @@ spawned_simplemob.melee_damage_upper += round(our_seed.potency * mob_melee_multiplier) spawned_simplemob.move_to_delay -= round(our_seed.production * mob_speed_multiplier) our_plant.forceMove(our_plant.drop_location()) - spawned_mob.visible_message("[our_plant] growls as it suddenly awakens!") + spawned_mob.visible_message(span_notice("[our_plant] growls as it suddenly awakens!")) qdel(our_plant) /// Killer Tomato's transformation gene. @@ -505,7 +510,10 @@ our_plant.color = COLOR_RED playsound(our_plant, 'sound/effects/fuse.ogg', our_seed.potency, FALSE) - user.visible_message("[user] plucks the stem from [our_plant]!", "You pluck the stem from [our_plant], which begins to hiss loudly!") + user.visible_message( + span_warning("[user] plucks the stem from [our_plant]!"), + span_userdanger("You pluck the stem from [our_plant], which begins to hiss loudly!"), + ) log_bomber(user, "primed a", our_plant, "for detonation") detonate(our_plant) @@ -551,7 +559,10 @@ name = "Explosive Nature" /datum/plant_gene/trait/bomb_plant/potency_based/trigger_detonation(obj/item/our_plant, mob/living/user) - user.visible_message("[user] primes [our_plant]!", "You prime [our_plant]!") + user.visible_message( + span_warning("[user] primes [our_plant]!"), + span_userdanger("You prime [our_plant]!"), + ) log_bomber(user, "primed a", our_plant, "for detonation") var/obj/item/food/grown/grown_plant = our_plant diff --git a/code/game/machinery/crossing_signal.dm b/code/modules/industrial_lift/crossing_signal.dm similarity index 88% rename from code/game/machinery/crossing_signal.dm rename to code/modules/industrial_lift/crossing_signal.dm index 3a6e5c145d1250..2d51acd7aba293 100644 --- a/code/game/machinery/crossing_signal.dm +++ b/code/modules/industrial_lift/crossing_signal.dm @@ -26,7 +26,7 @@ /// green, amber, or red. var/signal_state = XING_STATE_GREEN /// The ID of the tram we control - var/tram_id = "tram_station" + var/tram_id = MAIN_STATION_TRAM /// Weakref to the tram piece we control var/datum/weakref/tram_ref /// Proximity threshold for amber warning (slow people may be in danger) @@ -42,14 +42,14 @@ . = ..() find_tram() - var/obj/structure/industrial_lift/tram/central/tram_part = tram_ref?.resolve() + var/datum/lift_master/tram/tram_part = tram_ref?.resolve() if(tram_part) RegisterSignal(tram_part, COMSIG_TRAM_SET_TRAVELLING, .proc/on_tram_travelling) /obj/machinery/crossing_signal/Destroy() . = ..() - var/obj/structure/industrial_lift/tram/central/tram_part = tram_ref?.resolve() + var/datum/lift_master/tram/tram_part = tram_ref?.resolve() if(tram_part) UnregisterSignal(tram_part, COMSIG_TRAM_SET_TRAVELLING) @@ -67,8 +67,8 @@ * Locates tram parts in the lift global list after everything is done. */ /obj/machinery/crossing_signal/proc/find_tram() - for(var/obj/structure/industrial_lift/tram/central/tram as anything in GLOB.central_trams) - if(tram.tram_id != tram_id) + for(var/datum/lift_master/tram/tram as anything in GLOB.active_lifts_by_type[TRAM_LIFT_ID]) + if(tram.specific_lift_id != tram_id) continue tram_ref = WEAKREF(tram) break @@ -103,10 +103,10 @@ end_processing() /obj/machinery/crossing_signal/process() - var/obj/structure/industrial_lift/tram/central/tram_part = tram_ref?.resolve() + var/datum/lift_master/tram/tram = tram_ref?.resolve() // Check for stopped states. - if(!tram_part || !is_operational) + if(!tram || !is_operational) // Tram missing, or we lost power. // Tram missing is always safe (green) set_signal_state(XING_STATE_GREEN, force = !is_operational) @@ -114,26 +114,32 @@ use_power(active_power_usage) + var/obj/structure/industrial_lift/tram/tram_part = tram.return_closest_platform_to(src) + + if(QDELETED(tram_part)) + set_signal_state(XING_STATE_GREEN, force = !is_operational) + return PROCESS_KILL + // Everything will be based on position and travel direction var/signal_pos var/tram_pos var/tram_velocity_sign // 1 for positive axis movement, -1 for negative // Try to be agnostic about N-S vs E-W movement - if(tram_part.travel_direction & (NORTH|SOUTH)) + if(tram.travel_direction & (NORTH|SOUTH)) signal_pos = y tram_pos = tram_part.y - tram_velocity_sign = tram_part.travel_direction & NORTH ? 1 : -1 + tram_velocity_sign = tram.travel_direction & NORTH ? 1 : -1 else signal_pos = x tram_pos = tram_part.x - tram_velocity_sign = tram_part.travel_direction & EAST ? 1 : -1 + tram_velocity_sign = tram.travel_direction & EAST ? 1 : -1 // How far away are we? negative if already passed. var/approach_distance = tram_velocity_sign * (signal_pos - tram_pos) // Check for stopped state. // Will kill the process since tram starting up will restart process. - if(!tram_part.travelling) + if(!tram.travelling) // if super close, show red anyway since tram could suddenly start moving if(abs(approach_distance) < red_distance_threshold) set_signal_state(XING_STATE_RED) diff --git a/code/modules/industrial_lift/industrial_lift.dm b/code/modules/industrial_lift/industrial_lift.dm new file mode 100644 index 00000000000000..d7b3d9cfbec0e3 --- /dev/null +++ b/code/modules/industrial_lift/industrial_lift.dm @@ -0,0 +1,752 @@ +GLOBAL_LIST_EMPTY(lifts) + +/obj/structure/industrial_lift + name = "lift platform" + desc = "A lightweight lift platform. It moves up and down." + icon = 'icons/obj/smooth_structures/catwalk.dmi' + icon_state = "catwalk-0" + base_icon_state = "catwalk" + density = FALSE + anchored = TRUE + armor = list(MELEE = 50, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 80, ACID = 50) + max_integrity = 50 + layer = LATTICE_LAYER //under pipes + plane = FLOOR_PLANE + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = list(SMOOTH_GROUP_INDUSTRIAL_LIFT) + canSmoothWith = list(SMOOTH_GROUP_INDUSTRIAL_LIFT) + obj_flags = CAN_BE_HIT | BLOCK_Z_OUT_DOWN + appearance_flags = PIXEL_SCALE|KEEP_TOGETHER //no TILE_BOUND since we're potentially multitile + + ///ID used to determine what lift types we can merge with + var/lift_id = BASIC_LIFT_ID + + ///if true, the elevator works through floors + var/pass_through_floors = FALSE + + ///what movables on our platform that we are moving + var/list/atom/movable/lift_load + ///lazylist of weakrefs to the contents we have when we're first created. stored so that admins can clear the tram to its initial state + ///if someone put a bunch of stuff onto it. + var/list/datum/weakref/initial_contents + + ///what glide_size we set our moving contents to. + var/glide_size_override = 8 + ///lazy list of movables inside lift_load who had their glide_size changed since our last movement. + ///used so that we dont have to change the glide_size of every object every movement, which scales to cost more than you'd think + var/list/atom/movable/changed_gliders + + ///master datum that controls our movement. in general /industrial_lift subtypes control moving themselves, and + /// /datum/lift_master instances control moving the entire tram and any behavior associated with that. + var/datum/lift_master/lift_master_datum + ///what subtype of /datum/lift_master to create for itself if no other platform on this tram has created one yet. + ///very important for some behaviors since + var/lift_master_type = /datum/lift_master + + ///how many tiles this platform extends on the x axis + var/width = 1 + ///how many tiles this platform extends on the y axis (north-south not up-down, that would be the z axis) + var/height = 1 + + ///if TRUE, this platform will late initialize and then expand to become a multitile object across all other linked platforms on this z level + var/create_multitile_platform = FALSE + +/obj/structure/industrial_lift/Initialize(mapload) + . = ..() + GLOB.lifts.Add(src) + + set_movement_registrations() + + //since lift_master datums find all connected platforms when an industrial lift first creates it and then + //sets those platforms' lift_master_datum to itself, this check will only evaluate to true once per tram platform + if(!lift_master_datum && lift_master_type) + lift_master_datum = new lift_master_type(src) + return INITIALIZE_HINT_LATELOAD + +/obj/structure/industrial_lift/LateInitialize() + //after everything is initialized the lift master can order everything + lift_master_datum.order_platforms_by_z_level() + +/obj/structure/industrial_lift/Destroy() + GLOB.lifts.Remove(src) + lift_master_datum = null + return ..() + + +///set the movement registrations to our current turf(s) so contents moving out of our tile(s) are removed from our movement lists +/obj/structure/industrial_lift/proc/set_movement_registrations(list/turfs_to_set) + for(var/turf/turf_loc as anything in turfs_to_set || locs) + RegisterSignal(turf_loc, COMSIG_ATOM_EXITED, .proc/UncrossedRemoveItemFromLift) + RegisterSignal(turf_loc, list(COMSIG_ATOM_ENTERED,COMSIG_ATOM_INITIALIZED_ON), .proc/AddItemOnLift) + +///unset our movement registrations from turfs that no longer contain us (or every loc if turfs_to_unset is unspecified) +/obj/structure/industrial_lift/proc/unset_movement_registrations(list/turfs_to_unset) + var/static/list/registrations = list(COMSIG_ATOM_ENTERED, COMSIG_ATOM_EXITED, COMSIG_ATOM_INITIALIZED_ON) + for(var/turf/turf_loc as anything in turfs_to_unset || locs) + UnregisterSignal(turf_loc, registrations) + + +/obj/structure/industrial_lift/proc/UncrossedRemoveItemFromLift(datum/source, atom/movable/gone, direction) + SIGNAL_HANDLER + if(!(gone.loc in locs)) + RemoveItemFromLift(gone) + +/obj/structure/industrial_lift/proc/RemoveItemFromLift(atom/movable/potential_rider) + SIGNAL_HANDLER + if(!(potential_rider in lift_load)) + return + if(isliving(potential_rider) && HAS_TRAIT(potential_rider, TRAIT_CANNOT_BE_UNBUCKLED)) + REMOVE_TRAIT(potential_rider, TRAIT_CANNOT_BE_UNBUCKLED, BUCKLED_TRAIT) + LAZYREMOVE(lift_load, potential_rider) + LAZYREMOVE(changed_gliders, potential_rider) + UnregisterSignal(potential_rider, list(COMSIG_PARENT_QDELETING, COMSIG_MOVABLE_UPDATE_GLIDE_SIZE)) + +/obj/structure/industrial_lift/proc/AddItemOnLift(datum/source, atom/movable/new_lift_contents) + SIGNAL_HANDLER + var/static/list/blacklisted_types = typecacheof(list(/obj/structure/fluff/tram_rail, /obj/effect/decal/cleanable, /obj/structure/industrial_lift, /mob/camera)) + if(is_type_in_typecache(new_lift_contents, blacklisted_types) || new_lift_contents.invisibility == INVISIBILITY_ABSTRACT) //prevents the tram from stealing things like landmarks + return FALSE + if(new_lift_contents in lift_load) + return FALSE + + if(isliving(new_lift_contents) && !HAS_TRAIT(new_lift_contents, TRAIT_CANNOT_BE_UNBUCKLED)) + ADD_TRAIT(new_lift_contents, TRAIT_CANNOT_BE_UNBUCKLED, BUCKLED_TRAIT) + LAZYADD(lift_load, new_lift_contents) + RegisterSignal(new_lift_contents, COMSIG_PARENT_QDELETING, .proc/RemoveItemFromLift) + + return TRUE + +///adds everything on our tile that can be added to our lift_load and initial_contents lists when we're created +/obj/structure/industrial_lift/proc/add_initial_contents() + for(var/turf/turf_loc in locs) + for(var/atom/movable/movable_contents as anything in turf_loc) + if(movable_contents == src) + continue + + if(AddItemOnLift(src, movable_contents)) + + var/datum/weakref/new_initial_contents = WEAKREF(movable_contents) + if(!new_initial_contents) + continue + + LAZYADD(initial_contents, new_initial_contents) + +///signal handler for COMSIG_MOVABLE_UPDATE_GLIDE_SIZE: when a movable in lift_load changes its glide_size independently. +///adds that movable to a lazy list, movables in that list have their glide_size updated when the tram next moves +/obj/structure/industrial_lift/proc/on_changed_glide_size(atom/movable/moving_contents, new_glide_size) + SIGNAL_HANDLER + if(new_glide_size != glide_size_override) + LAZYADD(changed_gliders, moving_contents) + + +///make this tram platform multitile, expanding to cover all the tram platforms adjacent to us and deleting them. makes movement more efficient. +///the platform becoming multitile should be in the bottom left corner since thats assumed to be the loc of multitile objects +/obj/structure/industrial_lift/proc/create_multitile_platform(min_x, min_y, max_x, max_y, z) + + if(!(min_x && min_y && max_x && max_y && z)) + for(var/obj/structure/industrial_lift/other_lift as anything in lift_master_datum.lift_platforms) + if(other_lift.z != z) + continue + + min_x = min(min_x, other_lift.x) + max_x = max(max_x, other_lift.x) + + min_y = min(min_y, other_lift.y) + max_y = max(max_y, other_lift.y) + + var/turf/bottom_left_loc = locate(min_x, min_y, z) + var/obj/structure/industrial_lift/loc_corner_lift = locate() in bottom_left_loc + + if(!loc_corner_lift) + stack_trace("no lift in the bottom left corner of a lift level!") + return FALSE + + if(loc_corner_lift != src) + //the loc of a multitile object must always be the lower left corner + return loc_corner_lift.create_multitile_platform() + + width = (max_x - min_x) + 1 + height = (max_y - min_y) + 1 + + ///list of turfs we dont go over. if for whatever reason we encounter an already multitile lift platform + ///we add all of its locs to this list so we dont add that lift platform multiple times as we iterate through its locs + var/list/locs_to_skip = locs.Copy() + + bound_width = bound_width * width + bound_height = bound_height * height + + //multitile movement code assumes our loc is on the lower left corner of our bounding box + + var/first_x = 0 + var/first_y = 0 + + var/last_x = max(max_x - min_x, 0) + var/last_y = max(max_y - min_y, 0) + + for(var/y in first_y to last_y) + + var/y_pixel_offset = world.icon_size * y + + for(var/x in first_x to last_x) + + var/x_pixel_offset = world.icon_size * x + + var/turf/lift_turf = locate(x + min_x, y + min_y, z) + + if(!lift_turf) + continue + + if(lift_turf in locs_to_skip) + continue + + var/obj/structure/industrial_lift/other_lift = locate() in lift_turf + + if(!other_lift) + continue + + locs_to_skip += other_lift.locs.Copy()//make sure we never go over multitile platforms multiple times + + other_lift.pixel_x = x_pixel_offset + other_lift.pixel_y = y_pixel_offset + + overlays += other_lift + + //now we vore all the other lifts connected to us on our z level + for(var/obj/structure/industrial_lift/other_lift in lift_master_datum.lift_platforms) + if(other_lift == src || other_lift.z != z) + continue + + lift_master_datum.lift_platforms -= other_lift + if(other_lift.lift_load) + LAZYOR(lift_load, other_lift.lift_load) + if(other_lift.initial_contents) + LAZYOR(initial_contents, other_lift.initial_contents) + + qdel(other_lift) + + lift_master_datum.multitile_platform = TRUE + + var/turf/old_loc = loc + + forceMove(locate(min_x, min_y, z))//move to the lower left corner + set_movement_registrations(locs - old_loc) + return TRUE + +///returns an unordered list of all lift platforms adjacent to us. used so our lift_master_datum can control all connected platforms. +///includes platforms directly above or below us as well. only includes platforms with an identical lift_id to our own. +/obj/structure/industrial_lift/proc/lift_platform_expansion(datum/lift_master/lift_master_datum) + . = list() + for(var/direction in GLOB.cardinals_multiz) + var/obj/structure/industrial_lift/neighbor = locate() in get_step_multiz(src, direction) + if(!neighbor || neighbor.lift_id != lift_id) + continue + . += neighbor + +///main proc for moving the lift in the direction [going]. handles horizontal and/or vertical movement for multi platformed lifts and multitile lifts. +/obj/structure/industrial_lift/proc/travel(going) + var/list/things_to_move = lift_load + var/turf/destination + if(!isturf(going)) + destination = get_step_multiz(src, going) + else + destination = going + going = get_dir_multiz(loc, going) + + var/x_offset = ROUND_UP(bound_width / 32) - 1 //how many tiles our horizontally farthest edge is from us + var/y_offset = ROUND_UP(bound_height / 32) - 1 //how many tiles our vertically farthest edge is from us + + //the x coordinate of the edge furthest from our future destination, which would be our right hand side + var/back_edge_x = destination.x + x_offset//if we arent multitile this should just be destination.x + var/top_edge_y = destination.y + y_offset + + var/turf/top_right_corner = locate(min(world.maxx, back_edge_x), min(world.maxy, top_edge_y), destination.z) + + var/list/dest_locs = block( + destination, + top_right_corner + ) + + var/list/entering_locs = dest_locs - locs + var/list/exited_locs = locs - dest_locs + + if(going == DOWN) + for(var/turf/dest_turf as anything in entering_locs) + SEND_SIGNAL(dest_turf, COMSIG_TURF_INDUSTRIAL_LIFT_ENTER, things_to_move) + + if(istype(dest_turf, /turf/closed/wall)) + var/turf/closed/wall/C = dest_turf + do_sparks(2, FALSE, C) + C.dismantle_wall(devastated = TRUE) + for(var/mob/M in urange(8, src)) + shake_camera(M, 2, 3) + playsound(C, 'sound/effects/meteorimpact.ogg', 100, TRUE) + + for(var/mob/living/crushed in dest_turf.contents) + to_chat(crushed, span_userdanger("You are crushed by [src]!")) + crushed.gib(FALSE,FALSE,FALSE)//the nicest kind of gibbing, keeping everything intact. + + else if(going == UP) + for(var/turf/dest_turf as anything in entering_locs) + ///handles any special interactions objects could have with the lift/tram, handled on the item itself + SEND_SIGNAL(dest_turf, COMSIG_TURF_INDUSTRIAL_LIFT_ENTER, things_to_move) + + if(istype(dest_turf, /turf/closed/wall)) + var/turf/closed/wall/C = dest_turf + do_sparks(2, FALSE, C) + C.dismantle_wall(devastated = TRUE) + for(var/mob/client_mob in SSspatial_grid.orthogonal_range_search(src, SPATIAL_GRID_CONTENTS_TYPE_CLIENTS, 8)) + shake_camera(client_mob, 2, 3) + playsound(C, 'sound/effects/meteorimpact.ogg', 100, TRUE) + + else + ///potentially finds a spot to throw the victim at for daring to be hit by a tram. is null if we havent found anything to throw + var/atom/throw_target + var/datum/lift_master/tram/our_lift = lift_master_datum + var/collision_lethality = our_lift.collision_lethality + + for(var/turf/dest_turf as anything in entering_locs) + ///handles any special interactions objects could have with the lift/tram, handled on the item itself + SEND_SIGNAL(dest_turf, COMSIG_TURF_INDUSTRIAL_LIFT_ENTER, things_to_move) + + if(istype(dest_turf, /turf/closed/wall)) + var/turf/closed/wall/collided_wall = dest_turf + do_sparks(2, FALSE, collided_wall) + collided_wall.dismantle_wall(devastated = TRUE) + for(var/mob/client_mob in SSspatial_grid.orthogonal_range_search(collided_wall, SPATIAL_GRID_CONTENTS_TYPE_CLIENTS, 8)) + if(get_dist(dest_turf, client_mob) <= 8) + shake_camera(client_mob, 2, 3) + + playsound(collided_wall, 'sound/effects/meteorimpact.ogg', 100, TRUE) + + for(var/obj/structure/victim_structure in dest_turf.contents) + if(QDELING(victim_structure)) + continue + if(!is_type_in_typecache(victim_structure, lift_master_datum.ignored_smashthroughs) && victim_structure.layer >= LOW_OBJ_LAYER) + + if(victim_structure.anchored && initial(victim_structure.anchored) == TRUE) + visible_message(span_danger("[src] smashes through [victim_structure]!")) + victim_structure.deconstruct(FALSE) + + else + if(!throw_target) + throw_target = get_edge_target_turf(src, turn(going, pick(45, -45))) + visible_message(span_danger("[src] violently rams [victim_structure] out of the way!")) + victim_structure.anchored = FALSE + victim_structure.take_damage(rand(20, 25) * collision_lethality) + victim_structure.throw_at(throw_target, 200 * collision_lethality, 4 * collision_lethality) + + for(var/obj/machinery/victim_machine in dest_turf.contents) + if(QDELING(victim_machine)) + continue + if(is_type_in_typecache(victim_machine, lift_master_datum.ignored_smashthroughs)) + continue + if(istype(victim_machine, /obj/machinery/field)) //graceful break handles this scenario + continue + if(victim_machine.layer >= LOW_OBJ_LAYER) //avoids stuff that is probably flush with the ground + playsound(src, 'sound/effects/bang.ogg', 50, TRUE) + visible_message(span_danger("[src] smashes through [victim_machine]!")) + qdel(victim_machine) + + for(var/mob/living/collided in dest_turf.contents) + if(lift_master_datum.ignored_smashthroughs[collided.type]) + continue + to_chat(collided, span_userdanger("[src] collides into you!")) + playsound(src, 'sound/effects/splat.ogg', 50, TRUE) + var/damage = rand(5, 10) * collision_lethality + collided.apply_damage(2 * damage, BRUTE, BODY_ZONE_HEAD) + collided.apply_damage(2 * damage, BRUTE, BODY_ZONE_CHEST) + collided.apply_damage(0.5 * damage, BRUTE, BODY_ZONE_L_LEG) + collided.apply_damage(0.5 * damage, BRUTE, BODY_ZONE_R_LEG) + collided.apply_damage(0.5 * damage, BRUTE, BODY_ZONE_L_ARM) + collided.apply_damage(0.5 * damage, BRUTE, BODY_ZONE_R_ARM) + + if(QDELETED(collided)) //in case it was a mob that dels on death + continue + if(!throw_target) + throw_target = get_edge_target_turf(src, turn(going, pick(45, -45))) + + var/turf/T = get_turf(collided) + T.add_mob_blood(collided) + + collided.throw_at() + //if going EAST, will turn to the NORTHEAST or SOUTHEAST and throw the ran over guy away + var/datum/callback/land_slam = new(collided, /mob/living/.proc/tram_slam_land) + collided.throw_at(throw_target, 200 * collision_lethality, 4 * collision_lethality, callback = land_slam) + + unset_movement_registrations(exited_locs) + group_move(things_to_move, going) + set_movement_registrations(entering_locs) + +///move the movers list of movables on our tile to destination if we successfully move there first. +///this is like calling forceMove() on everything in movers and ourselves, except nothing in movers +///has destination.Entered() and origin.Exited() called on them, as only our movement can be perceived. +///none of the movers are able to react to the movement of any other mover, saving a lot of needless processing cost +///and is more sensible. without this, if you and a banana are on the same platform, when that platform moves you will slip +///on the banana even if youre not moving relative to it. +/obj/structure/industrial_lift/proc/group_move(list/atom/movable/movers, movement_direction) + if(movement_direction == NONE) + stack_trace("an industrial lift was told to move to somewhere it already is!") + return FALSE + + var/turf/our_dest = get_step(src, movement_direction) + + var/area/our_area = get_area(src) + var/area/their_area = get_area(our_dest) + var/different_areas = our_area != their_area + var/turf/mover_old_loc + + if(glide_size != glide_size_override) + set_glide_size(glide_size_override) + + forceMove(our_dest) + if(loc != our_dest || QDELETED(src))//check if our movement succeeded, if it didnt then the movers cant be moved + return FALSE + + for(var/atom/movable/mover as anything in changed_gliders) + if(mover.glide_size != glide_size_override) + mover.set_glide_size(glide_size_override) + + LAZYREMOVE(changed_gliders, mover) + + if(different_areas) + for(var/atom/movable/mover as anything in movers) + if(QDELETED(mover)) + movers -= mover + continue + + //we dont need to call Entered() and Exited() for origin and destination here for each mover because + //all of them are considered to be on top of us, so the turfs and anything on them can only perceive us, + //which is why the platform itself uses forceMove() + mover_old_loc = mover.loc + + our_area.Exited(mover, movement_direction) + mover.loc = get_step(mover, movement_direction) + their_area.Entered(mover, movement_direction) + + mover.Moved(mover_old_loc, movement_direction, TRUE, null, FALSE) + + else + for(var/atom/movable/mover as anything in movers) + if(QDELETED(mover)) + movers -= mover + continue + + mover_old_loc = mover.loc + mover.loc = get_step(mover, movement_direction) + + mover.Moved(mover_old_loc, movement_direction, TRUE, null, FALSE) + + return TRUE + +/** + * reset the contents of this lift platform to its original state in case someone put too much shit on it. + * used by an admin via calling reset_lift_contents() on our lift_master_datum. + * + * Arguments: + * * consider_anything_past - number. if > 0 this platform will only handle foreign contents that exceed this number on each of our locs + * * foreign_objects - bool. if true this platform will consider /atom/movable's that arent mobs as part of foreign contents + * * foreign_non_player_mobs - bool. if true we consider mobs that dont have a mind to be foreign + * * consider_player_mobs - bool. if true we consider player mobs to be foreign. only works if foreign_non_player_mobs is true as well + */ +/obj/structure/industrial_lift/proc/reset_contents(consider_anything_past = 0, foreign_objects = TRUE, foreign_non_player_mobs = TRUE, consider_player_mobs = FALSE) + if(!foreign_objects && !foreign_non_player_mobs && !consider_player_mobs) + return FALSE + + consider_anything_past = isnum(consider_anything_past) ? max(consider_anything_past, 0) : 0 + //just in case someone fucks up the arguments + + if(consider_anything_past && length(lift_load) <= consider_anything_past) + return FALSE + + ///list of resolve()'d initial_contents that are still in lift_load + var/list/atom/movable/original_contents = list(src) + + ///list of objects we consider foreign according to the given arguments + var/list/atom/movable/foreign_contents = list() + + + for(var/datum/weakref/initial_contents_ref as anything in initial_contents) + if(!initial_contents_ref) + continue + + var/atom/movable/resolved_contents = initial_contents_ref.resolve() + + if(!resolved_contents) + continue + + if(!(resolved_contents in lift_load)) + continue + + original_contents += resolved_contents + + for(var/turf/turf_loc as anything in locs) + var/list/atom/movable/foreign_contents_in_loc = list() + + for(var/atom/movable/foreign_movable as anything in (turf_loc.contents - original_contents)) + if(foreign_objects && ismovable(foreign_movable) && !ismob(foreign_movable)) + foreign_contents_in_loc += foreign_movable + continue + + if(foreign_non_player_mobs && ismob(foreign_movable)) + var/mob/foreign_mob = foreign_movable + if(consider_player_mobs || !foreign_mob.mind) + foreign_contents_in_loc += foreign_mob + continue + + if(consider_anything_past) + foreign_contents_in_loc.len -= consider_anything_past + //hey cool this works, neat. this takes from the opposite side of the list that youd expect but its easy so idc + //also this means that if you use consider_anything_past then foreign mobs are less likely to be deleted than foreign objects + //because internally the contents list is 2 linked lists of obj contents - mob contents, thus mobs are always last in the order + //when you iterate it. + + foreign_contents += foreign_contents_in_loc + + for(var/atom/movable/contents_to_delete as anything in foreign_contents) + qdel(contents_to_delete) + + return TRUE + +/obj/structure/industrial_lift/proc/use(mob/living/user) + if(!isliving(user) || !in_range(src, user) || user.combat_mode) + return + + var/list/tool_list = list() + if(lift_master_datum.Check_lift_move(UP)) + tool_list["Up"] = image(icon = 'icons/testing/turf_analysis.dmi', icon_state = "red_arrow", dir = NORTH) + if(lift_master_datum.Check_lift_move(DOWN)) + tool_list["Down"] = image(icon = 'icons/testing/turf_analysis.dmi', icon_state = "red_arrow", dir = SOUTH) + if(!length(tool_list)) + to_chat(user, span_warning("[src] doesn't seem to able to move anywhere!")) + add_fingerprint(user) + return + if(lift_master_datum.controls_locked) + to_chat(user, span_warning("[src] has its controls locked! It must already be trying to do something!")) + add_fingerprint(user) + return + var/result = show_radial_menu(user, src, tool_list, custom_check = CALLBACK(src, .proc/check_menu, user, src.loc), require_near = TRUE, tooltips = TRUE) + if(!isliving(user) || !in_range(src, user) || user.combat_mode) + return //nice try + switch(result) + if("Up") + // We have to make sure that they don't do illegal actions by not having their radial menu refresh from someone else moving the lift. + if(!lift_master_datum.Check_lift_move(UP)) + to_chat(user, span_warning("[src] doesn't seem to able to move up!")) + add_fingerprint(user) + return + lift_master_datum.MoveLift(UP, user) + show_fluff_message(TRUE, user) + use(user) + if("Down") + if(!lift_master_datum.Check_lift_move(DOWN)) + to_chat(user, span_warning("[src] doesn't seem to able to move down!")) + add_fingerprint(user) + return + lift_master_datum.MoveLift(DOWN, user) + show_fluff_message(FALSE, user) + use(user) + if("Cancel") + return + add_fingerprint(user) + +/** + * Proc to ensure that the radial menu closes when it should. + * Arguments: + * * user - The person that opened the menu. + * * starting_loc - The location of the lift when the menu was opened, used to prevent the menu from being interacted with after the lift was moved by someone else. + * + * Returns: + * * boolean, FALSE if the menu should be closed, TRUE if the menu is clear to stay opened. + */ +/obj/structure/industrial_lift/proc/check_menu(mob/user, starting_loc) + if(user.incapacitated() || !user.Adjacent(src) || starting_loc != src.loc) + return FALSE + return TRUE + +/obj/structure/industrial_lift/attack_hand(mob/user, list/modifiers) + . = ..() + if(.) + return + use(user) + +//ai probably shouldn't get to use lifts but they sure are great for admins to crush people with +/obj/structure/industrial_lift/attack_ghost(mob/user) + . = ..() + if(.) + return + if(isAdminGhostAI(user)) + use(user) + +/obj/structure/industrial_lift/attack_paw(mob/user, list/modifiers) + return use(user) + +/obj/structure/industrial_lift/attackby(obj/item/W, mob/user, params) + return use(user) + +/obj/structure/industrial_lift/attack_robot(mob/living/silicon/robot/R) + if(R.Adjacent(src)) + return use(R) + +/** + * Shows a message indicating that the lift has moved up or down. + * Arguments: + * * going_up - Boolean on whether or not we're going up, to adjust the message appropriately. + * * user - The mob that caused the lift to move, for the visible message. + */ +/obj/structure/industrial_lift/proc/show_fluff_message(going_up, mob/user) + if(going_up) + user.visible_message(span_notice("[user] moves the lift upwards."), span_notice("You move the lift upwards.")) + else + user.visible_message(span_notice("[user] moves the lift downwards."), span_notice("You move the lift downwards.")) + +/obj/structure/industrial_lift/debug + name = "transport platform" + desc = "A lightweight platform. It moves in any direction, except up and down." + color = "#5286b9ff" + lift_id = DEBUG_LIFT_ID + +/obj/structure/industrial_lift/debug/use(mob/user) + if (!in_range(src, user)) + return +//NORTH, SOUTH, EAST, WEST, NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST + var/static/list/tool_list = list( + "NORTH" = image(icon = 'icons/testing/turf_analysis.dmi', icon_state = "red_arrow", dir = NORTH), + "NORTHEAST" = image(icon = 'icons/testing/turf_analysis.dmi', icon_state = "red_arrow", dir = NORTH), + "EAST" = image(icon = 'icons/testing/turf_analysis.dmi', icon_state = "red_arrow", dir = EAST), + "SOUTHEAST" = image(icon = 'icons/testing/turf_analysis.dmi', icon_state = "red_arrow", dir = EAST), + "SOUTH" = image(icon = 'icons/testing/turf_analysis.dmi', icon_state = "red_arrow", dir = SOUTH), + "SOUTHWEST" = image(icon = 'icons/testing/turf_analysis.dmi', icon_state = "red_arrow", dir = SOUTH), + "WEST" = image(icon = 'icons/testing/turf_analysis.dmi', icon_state = "red_arrow", dir = WEST), + "NORTHWEST" = image(icon = 'icons/testing/turf_analysis.dmi', icon_state = "red_arrow", dir = WEST) + ) + + var/result = show_radial_menu(user, src, tool_list, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE, tooltips = FALSE) + if (!in_range(src, user)) + return // nice try + + switch(result) + if("NORTH") + lift_master_datum.MoveLiftHorizontal(NORTH, z) + use(user) + if("NORTHEAST") + lift_master_datum.MoveLiftHorizontal(NORTHEAST, z) + use(user) + if("EAST") + lift_master_datum.MoveLiftHorizontal(EAST, z) + use(user) + if("SOUTHEAST") + lift_master_datum.MoveLiftHorizontal(SOUTHEAST, z) + use(user) + if("SOUTH") + lift_master_datum.MoveLiftHorizontal(SOUTH, z) + use(user) + if("SOUTHWEST") + lift_master_datum.MoveLiftHorizontal(SOUTHWEST, z) + use(user) + if("WEST") + lift_master_datum.MoveLiftHorizontal(WEST, z) + use(user) + if("NORTHWEST") + lift_master_datum.MoveLiftHorizontal(NORTHWEST, z) + use(user) + if("Cancel") + return + + add_fingerprint(user) + +/obj/structure/industrial_lift/tram + name = "tram" + desc = "A tram for tramversing the station." + icon = 'icons/turf/floors.dmi' + icon_state = "titanium_yellow" + base_icon_state = null + smoothing_flags = NONE + smoothing_groups = null + canSmoothWith = null + //kind of a centerpiece of the station, so pretty tough to destroy + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + + lift_id = TRAM_LIFT_ID + lift_master_type = /datum/lift_master/tram + + /// Set by the tram control console in late initialize + var/travelling = FALSE + + //the following are only used to give to the lift_master datum when it's first created + + ///decisecond delay between horizontal movements. cannot make the tram move faster than 1 movement per world.tick_lag. only used to give to the lift_master + var/horizontal_speed = 0.5 + + create_multitile_platform = TRUE + +/obj/structure/industrial_lift/tram/AddItemOnLift(datum/source, atom/movable/AM) + . = ..() + if(travelling) + on_changed_glide_size(AM, AM.glide_size) + +/obj/structure/industrial_lift/tram/proc/set_travelling(travelling) + if (src.travelling == travelling) + return + + for(var/atom/movable/glider as anything in lift_load) + if(travelling) + glider.set_glide_size(glide_size_override) + RegisterSignal(glider, COMSIG_MOVABLE_UPDATE_GLIDE_SIZE, .proc/on_changed_glide_size) + else + LAZYREMOVE(changed_gliders, glider) + UnregisterSignal(glider, COMSIG_MOVABLE_UPDATE_GLIDE_SIZE) + + src.travelling = travelling + SEND_SIGNAL(src, COMSIG_TRAM_SET_TRAVELLING, travelling) + +/obj/structure/industrial_lift/tram/use(mob/user) //dont click the floor dingus we use computers now + return + +/obj/structure/industrial_lift/tram/set_currently_z_moving() + return FALSE //trams can never z fall and shouldnt waste any processing time trying to do so + +/** + * Handles unlocking the tram controls for use after moving + * + * More safety checks to make sure the tram has actually docked properly + * at a location before users are allowed to interact with the tram console again. + * Tram finds its location at this point before fully unlocking controls to the user. + */ +/obj/structure/industrial_lift/tram/proc/unlock_controls() + visible_message(span_notice("[src]'s controls are now unlocked.")) + for(var/obj/structure/industrial_lift/tram/tram_part as anything in lift_master_datum.lift_platforms) //only thing everyone needs to know is the new location. + tram_part.set_travelling(FALSE) + lift_master_datum.set_controls(LIFT_PLATFORM_UNLOCKED) + +///debug proc to highlight the locs of the tram platform +/obj/structure/industrial_lift/tram/proc/find_dimensions(iterations = 100) + message_admins("num turfs: [length(locs)]") + + var/overlay = /obj/effect/overlay/ai_detect_hud + var/list/turfs = list() + + for(var/turf/our_turf as anything in locs) + new overlay(our_turf) + turfs += our_turf + + addtimer(CALLBACK(src, .proc/clear_turfs, turfs, iterations), 1) + +/obj/structure/industrial_lift/tram/proc/clear_turfs(list/turfs_to_clear, iterations) + for(var/turf/our_old_turf as anything in turfs_to_clear) + var/obj/effect/overlay/ai_detect_hud/hud = locate() in our_old_turf + if(hud) + qdel(hud) + + var/overlay = /obj/effect/overlay/ai_detect_hud + + for(var/turf/our_turf as anything in locs) + new overlay(our_turf) + + iterations-- + + var/list/turfs = list() + for(var/turf/our_turf as anything in locs) + turfs += our_turf + + if(iterations) + addtimer(CALLBACK(src, .proc/clear_turfs, turfs, iterations), 1) diff --git a/code/modules/industrial_lift/lift_master.dm b/code/modules/industrial_lift/lift_master.dm new file mode 100644 index 00000000000000..45c2ae3b81a751 --- /dev/null +++ b/code/modules/industrial_lift/lift_master.dm @@ -0,0 +1,397 @@ +///associative list of the form: list(lift_id = list(all lift_master datums attached to lifts of that type)) +GLOBAL_LIST_EMPTY(active_lifts_by_type) + +///coordinate and control movement across linked industrial_lift's. allows moving large single multitile platforms and many 1 tile platforms. +///also is capable of linking platforms across linked z levels +/datum/lift_master + ///the lift platforms we consider as part of this lift. ordered in order of lowest z level to highest z level after init. + ///(the sorting algorithm sucks btw) + var/list/obj/structure/industrial_lift/lift_platforms + + /// Typepath list of what to ignore smashing through, controls all lifts + var/static/list/ignored_smashthroughs = list( + /obj/machinery/power/supermatter_crystal, + /obj/structure/holosign, + /obj/machinery/field, + ) + + ///whether the lift handled by this lift_master datum is multitile as opposed to nxm platforms per z level + var/multitile_platform = FALSE + + ///taken from our lift platforms. if true we go through each z level of platforms and attempt to make the lowest left corner platform + ///into one giant multitile object the size of all other platforms on that z level. + var/create_multitile_platform = FALSE + + ///lift platforms have already been sorted in order of z level. + var/z_sorted = FALSE + + ///lift_id taken from our base lift platform, used to put us into GLOB.active_lifts_by_type + var/lift_id = BASIC_LIFT_ID + + ///overridable ID string to link control units to this specific lift_master datum. created by placing a lift id landmark object + ///somewhere on the tram, if its anywhere on the tram we'll find it in init and set this to whatever it specifies + var/specific_lift_id + ///what directions we're allowed to move + var/allowed_travel_directions = ALL + + ///if true, the lift cannot be manually moved. + var/controls_locked = FALSE + +/datum/lift_master/New(obj/structure/industrial_lift/lift_platform) + lift_id = lift_platform.lift_id + create_multitile_platform = lift_platform.create_multitile_platform + + Rebuild_lift_plaform(lift_platform) + ignored_smashthroughs = typecacheof(ignored_smashthroughs) + + LAZYADDASSOCLIST(GLOB.active_lifts_by_type, lift_id, src) + + for(var/obj/structure/industrial_lift/lift as anything in lift_platforms) + lift.add_initial_contents() + +/datum/lift_master/Destroy() + for(var/obj/structure/industrial_lift/lift_platform as anything in lift_platforms) + lift_platform.lift_master_datum = null + lift_platforms = null + + LAZYREMOVEASSOC(GLOB.active_lifts_by_type, lift_id, src) + if(isnull(GLOB.active_lifts_by_type)) + GLOB.active_lifts_by_type = list()//im lazy + + return ..() + +/datum/lift_master/proc/add_lift_platforms(obj/structure/industrial_lift/new_lift_platform) + if(new_lift_platform in lift_platforms) + return + for(var/obj/structure/industrial_lift/other_platform in new_lift_platform.loc) + if(other_platform != new_lift_platform) + stack_trace("there is more than one lift platform on a tile when a lift_master adds it. this causes problems") + qdel(other_platform) + + new_lift_platform.lift_master_datum = src + LAZYADD(lift_platforms, new_lift_platform) + RegisterSignal(new_lift_platform, COMSIG_PARENT_QDELETING, .proc/remove_lift_platforms) + + check_for_landmarks(new_lift_platform) + + if(z_sorted)//make sure we dont lose z ordering if we get additional platforms after init + order_platforms_by_z_level() + +/datum/lift_master/proc/remove_lift_platforms(obj/structure/industrial_lift/old_lift_platform) + SIGNAL_HANDLER + + if(!(old_lift_platform in lift_platforms)) + return + + old_lift_platform.lift_master_datum = null + LAZYREMOVE(lift_platforms, old_lift_platform) + UnregisterSignal(old_lift_platform, COMSIG_PARENT_QDELETING) + if(!length(lift_platforms)) + qdel(src) + +///Collect all bordered platforms via a simple floodfill algorithm. allows multiz trams because its funny +/datum/lift_master/proc/Rebuild_lift_plaform(obj/structure/industrial_lift/base_lift_platform) + add_lift_platforms(base_lift_platform) + var/list/possible_expansions = list(base_lift_platform) + + while(possible_expansions.len) + for(var/obj/structure/industrial_lift/borderline as anything in possible_expansions) + var/list/result = borderline.lift_platform_expansion(src) + if(length(result)) + for(var/obj/structure/industrial_lift/lift_platform as anything in result) + if(lift_platforms.Find(lift_platform)) + continue + + add_lift_platforms(lift_platform) + possible_expansions |= lift_platform + + possible_expansions -= borderline + +///check for any landmarks placed inside the locs of the given lift_platform +/datum/lift_master/proc/check_for_landmarks(obj/structure/industrial_lift/new_lift_platform) + SHOULD_CALL_PARENT(TRUE) + + for(var/turf/platform_loc as anything in new_lift_platform.locs) + var/obj/effect/landmark/lift_id/id_giver = locate() in platform_loc + + if(id_giver) + set_info_from_id_landmark(id_giver) + +///set vars and such given an overriding lift_id landmark +/datum/lift_master/proc/set_info_from_id_landmark(obj/effect/landmark/lift_id/landmark) + SHOULD_CALL_PARENT(TRUE) + + if(!istype(landmark, /obj/effect/landmark/lift_id))//lift_master subtypes can want differnet id's than the base type wants + return + + if(landmark.specific_lift_id) + specific_lift_id = landmark.specific_lift_id + + qdel(landmark) + +///orders the lift platforms in order of lowest z level to highest z level. +/datum/lift_master/proc/order_platforms_by_z_level() + //contains nested lists for every z level in the world. why? because its really easy to sort + var/list/platforms_by_z = list() + platforms_by_z.len = world.maxz + + for(var/z in 1 to world.maxz) + platforms_by_z[z] = list() + + for(var/obj/structure/industrial_lift/lift_platform as anything in lift_platforms) + if(QDELETED(lift_platform) || !lift_platform.z) + lift_platforms -= lift_platform + continue + + platforms_by_z[lift_platform.z] += lift_platform + + if(create_multitile_platform) + for(var/list/z_list as anything in platforms_by_z) + if(!length(z_list)) + continue + + create_multitile_platform_for_z_level(z_list)//this will subtract all but one platform from the list + + var/list/output = list() + + for(var/list/z_list as anything in platforms_by_z) + output += z_list + + lift_platforms = output + + z_sorted = TRUE + +///goes through all platforms in the given list and finds the one in the lower left corner +/datum/lift_master/proc/create_multitile_platform_for_z_level(list/obj/structure/industrial_lift/platforms_in_z) + var/min_x = INFINITY + var/max_x = 0 + + var/min_y = INFINITY + var/max_y = 0 + + var/z = 0 + + for(var/obj/structure/industrial_lift/lift_to_sort as anything in platforms_in_z) + if(!z) + if(!lift_to_sort.z) + stack_trace("create_multitile_platform_for_z_level() was given a platform in nullspace or not on a turf!") + platforms_in_z -= lift_to_sort + continue + + z = lift_to_sort.z + + if(z != lift_to_sort.z) + stack_trace("create_multitile_platform_for_z_level() was given lifts on different z levels!") + platforms_in_z -= lift_to_sort + continue + + min_x = min(min_x, lift_to_sort.x) + max_x = max(max_x, lift_to_sort.x) + + min_y = min(min_y, lift_to_sort.y) + max_y = max(max_y, lift_to_sort.y) + + var/turf/lower_left_corner_loc = locate(min_x, min_y, z) + if(!lower_left_corner_loc) + CRASH("was unable to find a turf at the lower left corner of this z") + + var/obj/structure/industrial_lift/lower_left_corner_lift = locate() in lower_left_corner_loc + + if(!lower_left_corner_lift) + CRASH("there was no lift in the lower left corner of the given lifts") + + platforms_in_z.Cut() + platforms_in_z += lower_left_corner_lift//we want to change the list given to us not create a new one. so we do this + + lower_left_corner_lift.create_multitile_platform(min_x, min_y, max_x, max_y, z) + +///returns the closest lift to the specified atom, prioritizing lifts on the same z level. used for comparing distance +/datum/lift_master/proc/return_closest_platform_to(atom/comparison, allow_multiple_answers = FALSE) + if(!istype(comparison) || !comparison.z) + return FALSE + + var/list/obj/structure/industrial_lift/candidate_platforms = list() + + for(var/obj/structure/industrial_lift/platform as anything in lift_platforms) + if(platform.z == comparison.z) + candidate_platforms += platform + + var/obj/structure/industrial_lift/winner = candidate_platforms[1] + var/winner_distance = get_dist(comparison, winner) + + var/list/tied_winners = list(winner) + + for(var/obj/structure/industrial_lift/platform_to_sort as anything in candidate_platforms) + var/platform_distance = get_dist(comparison, platform_to_sort) + + if(platform_distance < winner_distance) + winner = platform_to_sort + winner_distance = platform_distance + + if(allow_multiple_answers) + tied_winners = list(winner) + + else if(platform_distance == winner_distance && allow_multiple_answers) + tied_winners += platform_to_sort + + if(allow_multiple_answers) + return tied_winners + + return winner + +///returns all industrial_lifts associated with this tram on the given z level or given atoms z level +/datum/lift_master/proc/get_platforms_on_level(atom/atom_reference_OR_z_level_number) + var/z = atom_reference_OR_z_level_number + if(isatom(atom_reference_OR_z_level_number)) + z = atom_reference_OR_z_level_number.z + + if(!isnum(z) || z < 0 || z > world.maxz) + return null + + var/list/platforms_in_z = list() + + for(var/obj/structure/industrial_lift/lift_to_check as anything in lift_platforms) + if(lift_to_check.z) + platforms_in_z += lift_to_check + + return platforms_in_z + +/** + * Moves the lift UP or DOWN, this is what users invoke with their hand. + * This is a SAFE proc, ensuring every part of the lift moves SANELY. + * It also locks controls for the (miniscule) duration of the movement, so the elevator cannot be broken by spamming. + * Arguments: + * going - UP or DOWN directions, where the lift should go. Keep in mind by this point checks of whether it should go up or down have already been done. + * user - Whomever made the lift movement. + */ +/datum/lift_master/proc/MoveLift(going, mob/user) + set_controls(LIFT_PLATFORM_LOCKED) + //lift_platforms are sorted in order of lowest z to highest z, so going upwards we need to move them in reverse order to not collide + if(going == UP) + var/obj/structure/industrial_lift/platform_to_move + var/current_index = length(lift_platforms) + + while(current_index > 0) + platform_to_move = lift_platforms[current_index] + current_index-- + + platform_to_move.travel(going) + + else if(going == DOWN) + for(var/obj/structure/industrial_lift/lift_platform as anything in lift_platforms) + lift_platform.travel(going) + set_controls(LIFT_PLATFORM_UNLOCKED) + +/** + * Moves the lift, this is what users invoke with their hand. + * This is a SAFE proc, ensuring every part of the lift moves SANELY. + * It also locks controls for the (miniscule) duration of the movement, so the elevator cannot be broken by spamming. + */ +/datum/lift_master/proc/MoveLiftHorizontal(going) + set_controls(LIFT_PLATFORM_LOCKED) + + if(multitile_platform) + for(var/obj/structure/industrial_lift/platform_to_move as anything in lift_platforms) + platform_to_move.travel(going) + + set_controls(LIFT_PLATFORM_UNLOCKED) + return + + var/max_x = 0 + var/max_y = 0 + var/max_z = 0 + var/min_x = world.maxx + var/min_y = world.maxy + var/min_z = world.maxz + + for(var/obj/structure/industrial_lift/lift_platform as anything in lift_platforms) + max_z = max(max_z, lift_platform.z) + min_z = min(min_z, lift_platform.z) + + min_x = min(min_x, lift_platform.x) + max_x = max(max_x, lift_platform.x) + //this assumes that all z levels have identical horizontal bounding boxes + //but if youre still using a non multitile tram platform at this point + //then its your own problem. it wont runtime it will jsut be slower than it needs to be if this assumption isnt + //the case + + min_y = min(min_y, lift_platform.y) + max_y = max(max_y, lift_platform.y) + + for(var/z in min_z to max_z) + //This must be safe way to border tile to tile move of bordered platforms, that excludes platform overlapping. + if(going & WEST) + //Go along the X axis from min to max, from left to right + for(var/x in min_x to max_x) + if(going & NORTH) + //Go along the Y axis from max to min, from up to down + for(var/y in max_y to min_y step -1) + var/obj/structure/industrial_lift/lift_platform = locate(/obj/structure/industrial_lift, locate(x, y, z)) + lift_platform?.travel(going) + + else if(going & SOUTH) + //Go along the Y axis from min to max, from down to up + for(var/y in min_y to max_y) + var/obj/structure/industrial_lift/lift_platform = locate(/obj/structure/industrial_lift, locate(x, y, z)) + lift_platform?.travel(going) + + else + for(var/y in min_y to max_y) + var/obj/structure/industrial_lift/lift_platform = locate(/obj/structure/industrial_lift, locate(x, y, z)) + lift_platform?.travel(going) + else + //Go along the X axis from max to min, from right to left + for(var/x in max_x to min_x step -1) + if(going & NORTH) + //Go along the Y axis from max to min, from up to down + for(var/y in max_y to min_y step -1) + var/obj/structure/industrial_lift/lift_platform = locate(/obj/structure/industrial_lift, locate(x, y, z)) + lift_platform?.travel(going) + + else if (going & SOUTH) + for(var/y in min_y to max_y) + var/obj/structure/industrial_lift/lift_platform = locate(/obj/structure/industrial_lift, locate(x, y, z)) + lift_platform?.travel(going) + + else + //Go along the Y axis from min to max, from down to up + for(var/y in min_y to max_y) + var/obj/structure/industrial_lift/lift_platform = locate(/obj/structure/industrial_lift, locate(x, y, z)) + lift_platform?.travel(going) + + set_controls(LIFT_PLATFORM_UNLOCKED) + +///Check destination turfs +/datum/lift_master/proc/Check_lift_move(check_dir) + for(var/obj/structure/industrial_lift/lift_platform as anything in lift_platforms) + for(var/turf/bound_turf in lift_platform.locs) + var/turf/T = get_step_multiz(lift_platform, check_dir) + if(!T)//the edges of multi-z maps + return FALSE + if(check_dir == UP && !istype(T, /turf/open/openspace)) // We don't want to go through the ceiling! + return FALSE + if(check_dir == DOWN && !istype(get_turf(lift_platform), /turf/open/openspace)) // No going through the floor! + return FALSE + return TRUE + +/** + * Sets all lift parts's controls_locked variable. Used to prevent moving mid movement, or cooldowns. + */ +/datum/lift_master/proc/set_controls(state) + controls_locked = state + +/** + * resets the contents of all platforms to their original state in case someone put a bunch of shit onto the tram. + * intended to be called by admins. passes all arguments to reset_contents() for each of our platforms. + * + * Arguments: + * * consider_anything_past - number. if > 0 our platforms will only handle foreign contents that exceed this number in each of their locs + * * foreign_objects - bool. if true our platforms will consider /atom/movable's that arent mobs as part of foreign contents + * * foreign_non_player_mobs - bool. if true our platforms consider mobs that dont have a mind to be foreign + * * consider_player_mobs - bool. if true our platforms consider player mobs to be foreign. only works if foreign_non_player_mobs is true as well + */ +/datum/lift_master/proc/reset_lift_contents(consider_anything_past = 0, foreign_objects = TRUE, foreign_non_player_mobs = TRUE, consider_player_mobs = FALSE) + for(var/obj/structure/industrial_lift/lift_to_reset in lift_platforms) + lift_to_reset.reset_contents(consider_anything_past, foreign_objects, foreign_non_player_mobs, consider_player_mobs) + + return TRUE diff --git a/code/game/machinery/computer/tram_controls.dm b/code/modules/industrial_lift/tram_controls.dm similarity index 79% rename from code/game/machinery/computer/tram_controls.dm rename to code/modules/industrial_lift/tram_controls.dm index 957547569bebb8..a55ff5b18f4f1a 100644 --- a/code/game/machinery/computer/tram_controls.dm +++ b/code/modules/industrial_lift/tram_controls.dm @@ -6,12 +6,14 @@ circuit = /obj/item/circuitboard/computer/tram_controls flags_1 = NODECONSTRUCT_1 | SUPERMATTER_IGNORES_1 resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF - light_color = LIGHT_COLOR_GREEN - ///The ID of the tram we control - var/tram_id = "tram_station" + + light_range = 0 //we dont want to spam SSlighting with source updates every movement + ///Weakref to the tram piece we control var/datum/weakref/tram_ref + var/specific_lift_id = MAIN_STATION_TRAM + /obj/machinery/computer/tram_controls/Initialize(mapload, obj/item/circuitboard/C) . = ..() AddComponent(/datum/component/usb_port, list(/obj/item/circuit_component/tram_controls)) @@ -19,7 +21,6 @@ /obj/machinery/computer/tram_controls/LateInitialize() . = ..() - //find the tram, late so the tram is all... set up so when this is called? i'm seriously stupid and 90% of what i do consists of barely educated guessing :) find_tram() /** @@ -28,19 +29,17 @@ * Locates tram parts in the lift global list after everything is done. */ /obj/machinery/computer/tram_controls/proc/find_tram() - for(var/obj/structure/industrial_lift/tram/central/tram as anything in GLOB.central_trams) - if(tram.tram_id != tram_id) - continue - tram_ref = WEAKREF(tram) - break + for(var/datum/lift_master/lift as anything in GLOB.active_lifts_by_type[TRAM_LIFT_ID]) + if(lift.specific_lift_id == specific_lift_id) + tram_ref = WEAKREF(lift) /obj/machinery/computer/tram_controls/ui_state(mob/user) return GLOB.not_incapacitated_state /obj/machinery/computer/tram_controls/ui_status(mob/user,/datum/tgui/ui) - var/obj/structure/industrial_lift/tram/central/tram_part = tram_ref?.resolve() + var/datum/lift_master/tram/tram = tram_ref?.resolve() - if(tram_part?.travelling) + if(tram?.travelling) return UI_CLOSE if(!in_range(user, src) && !isobserver(user)) return UI_CLOSE @@ -54,11 +53,11 @@ ui.open() /obj/machinery/computer/tram_controls/ui_data(mob/user) - var/obj/structure/industrial_lift/tram/central/tram_part = tram_ref?.resolve() + var/datum/lift_master/tram/tram_lift = tram_ref?.resolve() var/list/data = list() - data["moving"] = tram_part?.travelling - data["broken"] = tram_part ? FALSE : TRUE - var/obj/effect/landmark/tram/current_loc = tram_part?.from_where + data["moving"] = tram_lift?.travelling + data["broken"] = tram_lift ? FALSE : TRUE + var/obj/effect/landmark/tram/current_loc = tram_lift?.from_where if(current_loc) data["tram_location"] = current_loc.name return data @@ -77,9 +76,7 @@ */ /obj/machinery/computer/tram_controls/proc/get_destinations() . = list() - for(var/obj/effect/landmark/tram/destination as anything in GLOB.tram_landmarks) - if(destination.tram_id != tram_id) - continue + for(var/obj/effect/landmark/tram/destination as anything in GLOB.tram_landmarks[specific_lift_id]) var/list/this_destination = list() this_destination["name"] = destination.name this_destination["dest_icons"] = destination.tgui_icons @@ -94,9 +91,7 @@ switch (action) if ("send") var/obj/effect/landmark/tram/to_where - for (var/obj/effect/landmark/tram/destination as anything in GLOB.tram_landmarks) - if(destination.tram_id != tram_id) - continue + for (var/obj/effect/landmark/tram/destination as anything in GLOB.tram_landmarks[specific_lift_id]) if(destination.destination_id == params["destination"]) to_where = destination break @@ -108,14 +103,13 @@ /// Attempts to sends the tram to the given destination /obj/machinery/computer/tram_controls/proc/try_send_tram(obj/effect/landmark/tram/to_where) - var/obj/structure/industrial_lift/tram/central/tram_part = tram_ref?.resolve() + var/datum/lift_master/tram/tram_part = tram_ref?.resolve() if(!tram_part) return FALSE - if(tram_part.travelling) - return FALSE - if(tram_part.controls_locked) // someone else started + if(tram_part.controls_locked) // someone else started already return FALSE tram_part.tram_travel(to_where) + visible_message("The tram has been called to [to_where.name]") return TRUE /obj/item/circuit_component/tram_controls @@ -147,12 +141,12 @@ . = ..() if (istype(shell, /obj/machinery/computer/tram_controls)) computer = shell - var/obj/structure/industrial_lift/tram/central/tram_part = computer.tram_ref?.resolve() + var/datum/lift_master/tram/tram_part = computer.tram_ref?.resolve() RegisterSignal(tram_part, COMSIG_TRAM_SET_TRAVELLING, .proc/on_tram_set_travelling) RegisterSignal(tram_part, COMSIG_TRAM_TRAVEL, .proc/on_tram_travel) /obj/item/circuit_component/tram_controls/unregister_usb_parent(atom/movable/shell) - var/obj/structure/industrial_lift/tram/central/tram_part = computer.tram_ref?.resolve() + var/datum/lift_master/tram/tram_part = computer.tram_ref?.resolve() computer = null UnregisterSignal(tram_part, list(COMSIG_TRAM_SET_TRAVELLING, COMSIG_TRAM_TRAVEL)) return ..() @@ -168,9 +162,7 @@ return var/destination - for(var/obj/effect/landmark/tram/possible_destination as anything in GLOB.tram_landmarks) - if(possible_destination.tram_id != computer.tram_id) - continue + for(var/obj/effect/landmark/tram/possible_destination as anything in GLOB.tram_landmarks[computer.specific_lift_id]) if(possible_destination.name == new_destination.value) destination = possible_destination break diff --git a/code/modules/industrial_lift/tram_landmark.dm b/code/modules/industrial_lift/tram_landmark.dm new file mode 100644 index 00000000000000..db855b58a5c0f2 --- /dev/null +++ b/code/modules/industrial_lift/tram_landmark.dm @@ -0,0 +1,47 @@ +GLOBAL_LIST_EMPTY(tram_landmarks) + +/obj/effect/landmark/tram + name = "tram destination" //the tram buttons will mention this. + icon_state = "tram" + + ///the id of the tram we're linked to. + var/specific_lift_id = MAIN_STATION_TRAM + /// The ID of that particular destination. + var/destination_id + /// Icons for the tgui console to list out for what is at this location + var/list/tgui_icons = list() + +/obj/effect/landmark/tram/Initialize(mapload) + . = ..() + LAZYADDASSOCLIST(GLOB.tram_landmarks, specific_lift_id, src) + +/obj/effect/landmark/tram/Destroy() + LAZYREMOVEASSOC(GLOB.tram_landmarks, specific_lift_id, src) + return ..() + + +/obj/effect/landmark/tram/left_part + name = "West Wing" + destination_id = "left_part" + tgui_icons = list("Arrivals" = "plane-arrival", "Command" = "bullhorn", "Security" = "gavel") + +/obj/effect/landmark/tram/middle_part + name = "Central Wing" + destination_id = "middle_part" + tgui_icons = list("Service" = "cocktail", "Medical" = "plus", "Engineering" = "wrench") + +/obj/effect/landmark/tram/right_part + name = "East Wing" + destination_id = "right_part" + tgui_icons = list("Departures" = "plane-departure", "Cargo" = "box", "Science" = "flask") + +/** + * lift_id landmarks. used to map in specific_lift_id to trams. when the trams lift_master encounters one on a trams tile + * it sets its specific_lift_id to that landmark. allows you to have multiple trams and multiple controls linking to their specific tram + */ +/obj/effect/landmark/lift_id + name = "lift id setter" + icon_state = "lift_id" + + ///what specific id we give to the tram we're placed on, should explicitely set this if its a subtype, or weird things might happen + var/specific_lift_id = MAIN_STATION_TRAM diff --git a/code/modules/industrial_lift/tram_lift_master.dm b/code/modules/industrial_lift/tram_lift_master.dm new file mode 100644 index 00000000000000..573e961a71d76e --- /dev/null +++ b/code/modules/industrial_lift/tram_lift_master.dm @@ -0,0 +1,174 @@ +/datum/lift_master/tram + + ///whether this tram is traveling across vertical and/or horizontal axis for some distance. not all lifts use this + var/travelling = FALSE + ///if we're travelling, what direction are we going + var/travel_direction = NONE + ///if we're travelling, how far do we have to go + var/travel_distance = 0 + + ///multiplier on how much damage/force the tram imparts on things it hits + var/collision_lethality = 1 + + /// reference to the destination landmark we consider ourselves "at". since we potentially span multiple z levels we dont actually + /// know where on us this platform is. as long as we know THAT its on us we can just move the distance and direction between this + /// and the destination landmark. + var/obj/effect/landmark/tram/from_where + + ///decisecond delay between horizontal movement. cannot make the tram move faster than 1 movement per world.tick_lag. + ///this var is poorly named its actually horizontal movement delay but whatever. + var/horizontal_speed = 0.5 + + ///version of horizontal_speed that gets set in init and is considered our base speed if our lift gets slowed down + var/base_horizontal_speed = 0.5 + + ///the world.time we should next move at. in case our speed is set to less than 1 movement per tick + var/next_move = INFINITY + + ///whether we have been slowed down automatically + var/slowed_down = FALSE + + ///how many times we moved while costing more than SStramprocess.max_time milliseconds per movement. + ///if this exceeds SStramprocess.max_exceeding_moves + var/times_exceeded = 0 + + ///how many times we moved while costing less than 0.5 * SStramprocess.max_time milliseconds per movement + var/times_below = 0 + +/datum/lift_master/tram/New(obj/structure/industrial_lift/tram/lift_platform) + . = ..() + horizontal_speed = lift_platform.horizontal_speed + base_horizontal_speed = lift_platform.horizontal_speed + + check_starting_landmark() + +/datum/lift_master/tram/vv_edit_var(var_name, var_value) + . = ..() + if(var_name == "base_horizontal_speed") + horizontal_speed = max(horizontal_speed, base_horizontal_speed) + +/datum/lift_master/tram/add_lift_platforms(obj/structure/industrial_lift/new_lift_platform) + . = ..() + RegisterSignal(new_lift_platform, COMSIG_MOVABLE_BUMP, .proc/gracefully_break) + +/datum/lift_master/tram/check_for_landmarks(obj/structure/industrial_lift/tram/new_lift_platform) + . = ..() + for(var/turf/platform_loc as anything in new_lift_platform.locs) + var/obj/effect/landmark/tram/initial_destination = locate() in platform_loc + + if(initial_destination) + from_where = initial_destination + +/datum/lift_master/tram/proc/check_starting_landmark() + if(!from_where) + CRASH("a tram lift_master was initialized without any tram landmark to give it direction!") + + SStramprocess.can_fire = TRUE + + return TRUE + +/** + * Signal for when the tram runs into a field of which it cannot go through. + * Stops the train's travel fully, sends a message, and destroys the train. + * Arguments: + * bumped_atom - The atom this tram bumped into + */ +/datum/lift_master/tram/proc/gracefully_break(atom/bumped_atom) + SIGNAL_HANDLER + + if(istype(bumped_atom, /obj/machinery/field)) + return + + travel_distance = 0 + + bumped_atom.visible_message(span_userdanger("[src] crashes into the field violently!")) + for(var/obj/structure/industrial_lift/tram/tram_part as anything in lift_platforms) + tram_part.set_travelling(FALSE) + if(prob(15) || locate(/mob/living) in tram_part.lift_load) //always go boom on people on the track + explosion(tram_part, devastation_range = rand(0, 1), heavy_impact_range = 2, light_impact_range = 3) //50% chance of gib + qdel(tram_part) + +/** + * Handles moving the tram + * + * Tells the individual tram parts where to actually go and has an extra safety check + * incase multiple inputs get through, preventing conflicting directions and the tram + * literally ripping itself apart. all of the actual movement is handled by SStramprocess + */ +/datum/lift_master/tram/proc/tram_travel(obj/effect/landmark/tram/to_where) + if(to_where == from_where) + return + + travel_direction = get_dir(from_where, to_where) + travel_distance = get_dist(from_where, to_where) + from_where = to_where + set_travelling(TRUE) + set_controls(LIFT_PLATFORM_LOCKED) + SEND_SIGNAL(src, COMSIG_TRAM_TRAVEL, from_where, to_where) + + for(var/obj/structure/industrial_lift/tram/tram_part as anything in lift_platforms) //only thing everyone needs to know is the new location. + if(tram_part.travelling) //wee woo wee woo there was a double action queued. damn multi tile structs + return //we don't care to undo locked controls, though, as that will resolve itself + + tram_part.glide_size_override = DELAY_TO_GLIDE_SIZE(horizontal_speed) + tram_part.set_travelling(TRUE) + + next_move = world.time + horizontal_speed + + START_PROCESSING(SStramprocess, src) + +/datum/lift_master/tram/process(delta_time) + if(!travel_distance) + addtimer(CALLBACK(src, .proc/unlock_controls), 3 SECONDS) + return PROCESS_KILL + else if(world.time >= next_move) + var/start_time = TICK_USAGE + travel_distance-- + + MoveLiftHorizontal(travel_direction) + + var/duration = TICK_USAGE_TO_MS(start_time) + if(slowed_down) + if(duration <= (SStramprocess.max_time / 2)) + times_below++ + else + times_below = 0 + + if(times_below >= SStramprocess.max_cheap_moves) + horizontal_speed = base_horizontal_speed + slowed_down = FALSE + times_below = 0 + + else if(duration > SStramprocess.max_time) + times_exceeded++ + + if(times_exceeded >= SStramprocess.max_exceeding_moves) + message_admins("The tram at [ADMIN_JMP(lift_platforms[1])] is taking more than [SStramprocess.max_time] milliseconds per movement, halving its movement speed. if this continues to be a problem you can call reset_lift_contents() on the trams lift_master_datum to reset it to its original state and clear added objects") + horizontal_speed = base_horizontal_speed * 2 //halves its speed + slowed_down = TRUE + times_exceeded = 0 + else + times_exceeded = max(times_exceeded - 1, 0) + + next_move = world.time + horizontal_speed + +/** + * Handles unlocking the tram controls for use after moving + * + * More safety checks to make sure the tram has actually docked properly + * at a location before users are allowed to interact with the tram console again. + * Tram finds its location at this point before fully unlocking controls to the user. + */ +/datum/lift_master/tram/proc/unlock_controls() + set_travelling(FALSE) + set_controls(LIFT_PLATFORM_UNLOCKED) + for(var/obj/structure/industrial_lift/tram/tram_part as anything in lift_platforms) //only thing everyone needs to know is the new location. + tram_part.set_travelling(FALSE) + + +/datum/lift_master/tram/proc/set_travelling(new_travelling) + if(travelling == new_travelling) + return + + travelling = new_travelling + SEND_SIGNAL(src, COMSIG_TRAM_SET_TRAVELLING, travelling) diff --git a/code/modules/industrial_lift/tram_override_objects.dm b/code/modules/industrial_lift/tram_override_objects.dm new file mode 100644 index 00000000000000..7a348295a2d275 --- /dev/null +++ b/code/modules/industrial_lift/tram_override_objects.dm @@ -0,0 +1,39 @@ +/** + * the tram has a few objects mapped onto it at roundstart, by default many of those objects have unwanted properties + * for example grilles and windows have the atmos_sensitive element applied to them, which makes them register to + * themselves moving to re register signals onto the turf via connect_loc. this is bad and dumb since it makes the tram + * more expensive to move. + * + * if you map something on to the tram, make SURE if possible that it doesnt have anythign reacting to its own movement + * it will make the tram more expensive to move and we dont want that because we dont want to return to the days where + * the tram took a third of the tick per movement when its just carrying its default mapped in objects + */ +/obj/structure/grille/tram/Initialize(mapload) + . = ..() + RemoveElement(/datum/element/atmos_sensitive, mapload) + //atmos_sensitive applies connect_loc which 1. reacts to movement in order to 2. unregister and register signals to + //the old and new locs. we dont want that, pretend these grilles and windows are plastic or something idk + +/obj/structure/window/reinforced/shuttle/tram/Initialize(mapload, direct) + . = ..() + RemoveElement(/datum/element/atmos_sensitive, mapload) + +/obj/structure/shuttle/engine/propulsion/in_wall/tram + //if this has opacity, then every movement of the tram causes lighting updates + //DO NOT put something on the tram roundstart that has opacity, it WILL overload SSlighting + opacity = FALSE + +/obj/machinery/door/window/left/tram +/obj/machinery/door/window/right/tram + +/obj/machinery/door/window/left/tram/Initialize(mapload, set_dir, unres_sides) + . = ..() + RemoveElement(/datum/element/atmos_sensitive, mapload) + +/obj/machinery/door/window/right/tram/Initialize(mapload, set_dir, unres_sides) + . = ..() + RemoveElement(/datum/element/atmos_sensitive, mapload) + +MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/door/window/left/tram, 0) +MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/door/window/right/tram, 0) + diff --git a/code/game/objects/structures/tram_walls.dm b/code/modules/industrial_lift/tram_walls.dm similarity index 99% rename from code/game/objects/structures/tram_walls.dm rename to code/modules/industrial_lift/tram_walls.dm index 092b1d5e2e5930..17844dbfa5d7eb 100644 --- a/code/game/objects/structures/tram_walls.dm +++ b/code/modules/industrial_lift/tram_walls.dm @@ -10,7 +10,7 @@ base_icon_state = "wall" layer = LOW_OBJ_LAYER density = TRUE - opacity = TRUE + opacity = FALSE max_integrity = 100 smoothing_flags = SMOOTH_BITMASK smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS) diff --git a/code/modules/instruments/items.dm b/code/modules/instruments/items.dm index 3ac8c64292ebc8..29449a195e1962 100644 --- a/code/modules/instruments/items.dm +++ b/code/modules/instruments/items.dm @@ -215,6 +215,17 @@ . = ..() UnregisterSignal(M, COMSIG_MOB_SAY) +/datum/action/item_action/instrument + name = "Use Instrument" + desc = "Use the instrument specified" + +/datum/action/item_action/instrument/Trigger(trigger_flags) + if(istype(target, /obj/item/instrument)) + var/obj/item/instrument/I = target + I.interact(usr) + return + return ..() + /obj/item/instrument/bikehorn name = "gilded bike horn" desc = "An exquisitely decorated bike horn, capable of honking in a variety of notes." diff --git a/code/modules/instruments/songs/play_legacy.dm b/code/modules/instruments/songs/play_legacy.dm index dbcdf2a7420941..1b7efcad8a042e 100644 --- a/code/modules/instruments/songs/play_legacy.dm +++ b/code/modules/instruments/songs/play_legacy.dm @@ -87,5 +87,5 @@ L.apply_status_effect(/datum/status_effect/good_music) if(!(M?.client?.prefs?.toggles & SOUND_INSTRUMENTS)) continue - M.playsound_local(source, null, volume * using_instrument.volume_multiplier, S = music_played) + M.playsound_local(source, null, volume * using_instrument.volume_multiplier, sound_to_use = music_played) // Could do environment and echo later but not for now diff --git a/code/modules/instruments/stationary.dm b/code/modules/instruments/stationary.dm index 8245ed03f0002d..3942132366d2d3 100644 --- a/code/modules/instruments/stationary.dm +++ b/code/modules/instruments/stationary.dm @@ -2,6 +2,7 @@ name = "Not A Piano" desc = "Something broke, contact coderbus." interaction_flags_atom = INTERACT_ATOM_ATTACK_HAND | INTERACT_ATOM_UI_INTERACT | INTERACT_ATOM_REQUIRES_DEXTERITY + integrity_failure = 0.25 var/can_play_unanchored = FALSE var/list/allowed_instrument_ids = list("r3grand","r3harpsi","crharpsi","crgrand1","crbright1", "crichugan", "crihamgan","piano") var/datum/song/song @@ -32,22 +33,32 @@ return TOOL_ACT_TOOLTYPE_SUCCESS /obj/structure/musician/piano - name = "space minimoog" + name = "space piano" + desc = "This is a space piano, like a regular piano, but always in tune! Even if the musician isn't." icon = 'icons/obj/musician.dmi' - icon_state = "minimoog" + icon_state = "piano" anchored = TRUE density = TRUE + var/broken_icon_state = "pianobroken" + +/obj/structure/musician/piano/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) + switch(damage_type) + if(BRUTE) + playsound(src, 'sound/effects/piano_hit.ogg', 100, TRUE) + if(BURN) + playsound(src, 'sound/items/welder.ogg', 100, TRUE) + +/obj/structure/musician/piano/atom_break(damage_flag) + . = ..() + if(!broken) + broken = TRUE + icon_state = broken_icon_state /obj/structure/musician/piano/unanchored anchored = FALSE -/obj/structure/musician/piano/Initialize(mapload) - . = ..() - if(prob(50) && icon_state == initial(icon_state)) - name = "space minimoog" - desc = "This is a minimoog, like a space piano, but more spacey!" - icon_state = "minimoog" - else - name = "space piano" - desc = "This is a space piano, like a regular piano, but always in tune! Even if the musician isn't." - icon_state = "piano" +/obj/structure/musician/piano/minimoog + name = "space minimoog" + desc = "This is a minimoog, like a space piano, but more spacey!" + icon_state = "minimoog" + broken_icon_state = "minimoogbroken" diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm index c7d387d2e73c20..cc1a8f3e238811 100644 --- a/code/modules/jobs/job_types/_job.dm +++ b/code/modules/jobs/job_types/_job.dm @@ -120,6 +120,9 @@ ///RPG job names, for the memes var/rpg_title + /// Does this job ignore human authority? + var/ignore_human_authority = FALSE + /datum/job/New() . = ..() @@ -441,6 +444,10 @@ return // Disconnected while checking for the appearance ban. var/require_human = CONFIG_GET(flag/enforce_human_authority) && (job.departments_bitflags & DEPARTMENT_BITFLAG_COMMAND) + if(require_human) + var/all_authority_require_human = CONFIG_GET(flag/enforce_human_authority_on_everyone) + if(!all_authority_require_human && job.ignore_human_authority) + require_human = FALSE src.job = job.title diff --git a/code/modules/jobs/job_types/botanist.dm b/code/modules/jobs/job_types/botanist.dm index 92a9aea6db2d3b..7dec53564e298c 100644 --- a/code/modules/jobs/job_types/botanist.dm +++ b/code/modules/jobs/job_types/botanist.dm @@ -20,13 +20,18 @@ /datum/job_department/service, ) - family_heirlooms = list(/obj/item/cultivator, /obj/item/reagent_containers/glass/bucket, /obj/item/toy/plush/beeplushie) + family_heirlooms = list( + /obj/item/cultivator, + /obj/item/reagent_containers/glass/watering_can/wood, + /obj/item/toy/plush/beeplushie, + ) mail_goodies = list( /obj/item/reagent_containers/glass/bottle/mutagen = 20, /obj/item/reagent_containers/glass/bottle/saltpetre = 20, /obj/item/reagent_containers/glass/bottle/diethylamine = 20, /obj/item/gun/energy/floragun = 10, + /obj/item/reagent_containers/glass/watering_can/advanced = 10, /obj/effect/spawner/random/food_or_drink/seed_rare = 5,// These are strong, rare seeds, so use sparingly. /obj/item/food/monkeycube/bee = 2 ) diff --git a/code/modules/jobs/job_types/cargo_technician.dm b/code/modules/jobs/job_types/cargo_technician.dm index 2064af32f37a86..a3c7a1651df95f 100644 --- a/code/modules/jobs/job_types/cargo_technician.dm +++ b/code/modules/jobs/job_types/cargo_technician.dm @@ -3,11 +3,11 @@ description = "Distribute supplies to the departments that ordered them, \ collect empty crates, load and unload the supply shuttle, \ ship bounty cubes." - department_head = list(JOB_HEAD_OF_PERSONNEL) + department_head = list(JOB_QUARTERMASTER) faction = FACTION_STATION total_positions = 3 spawn_positions = 2 - supervisors = "the quartermaster and the head of personnel" + supervisors = "the quartermaster" selection_color = "#dcba97" exp_granted_type = EXP_TYPE_CREW diff --git a/code/modules/jobs/job_types/head_of_personnel.dm b/code/modules/jobs/job_types/head_of_personnel.dm index 69e56ab13e91d7..b86d7c08b5060f 100644 --- a/code/modules/jobs/job_types/head_of_personnel.dm +++ b/code/modules/jobs/job_types/head_of_personnel.dm @@ -4,7 +4,7 @@ protect Ian, run the station when the captain dies." auto_deadmin_role_flags = DEADMIN_POSITION_HEAD department_head = list(JOB_CAPTAIN) - head_announce = list(RADIO_CHANNEL_SUPPLY, RADIO_CHANNEL_SERVICE) + head_announce = list(RADIO_CHANNEL_SERVICE) faction = FACTION_STATION total_positions = 1 spawn_positions = 1 @@ -21,7 +21,6 @@ plasmaman_outfit = /datum/outfit/plasmaman/head_of_personnel departments_list = list( /datum/job_department/service, - /datum/job_department/cargo, /datum/job_department/command, ) diff --git a/code/modules/jobs/job_types/janitor.dm b/code/modules/jobs/job_types/janitor.dm index 803620a456f7c6..23852862ad4ea3 100644 --- a/code/modules/jobs/job_types/janitor.dm +++ b/code/modules/jobs/job_types/janitor.dm @@ -43,7 +43,7 @@ /datum/outfit/job/janitor/pre_equip(mob/living/carbon/human/H, visualsOnly) . = ..() if(GARBAGEDAY in SSevents.holidays) - backpack_contents += /obj/item/gun/ballistic/revolver + backpack_contents += list(/obj/item/gun/ballistic/revolver) r_pocket = /obj/item/ammo_box/a357 /datum/outfit/job/janitor/get_types_to_preload() diff --git a/code/modules/jobs/job_types/mime.dm b/code/modules/jobs/job_types/mime.dm index 80e0e968b60af1..ad5cd1637db833 100644 --- a/code/modules/jobs/job_types/mime.dm +++ b/code/modules/jobs/job_types/mime.dm @@ -64,6 +64,7 @@ backpack = /obj/item/storage/backpack/mime satchel = /obj/item/storage/backpack/mime + box = /obj/item/storage/box/hug/black/survival chameleon_extras = /obj/item/stamp/mime /datum/outfit/job/mime/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) @@ -72,8 +73,10 @@ if(visualsOnly) return + // Start our mime out with a vow of silence and the ability to break (or make) it if(H.mind) - H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/mime/speak(null)) + var/datum/action/cooldown/spell/vow_of_silence/vow = new(H.mind) + vow.Grant(H) H.mind.miming = TRUE var/datum/atom_hud/fan = GLOB.huds[DATA_HUD_FAN] @@ -85,23 +88,41 @@ icon_state = "bookmime" /obj/item/book/mimery/attack_self(mob/user) + . = ..() + if(.) + return + var/list/spell_icons = list( "Invisible Wall" = image(icon = 'icons/mob/actions/actions_mime.dmi', icon_state = "invisible_wall"), "Invisible Chair" = image(icon = 'icons/mob/actions/actions_mime.dmi', icon_state = "invisible_chair"), "Invisible Box" = image(icon = 'icons/mob/actions/actions_mime.dmi', icon_state = "invisible_box") ) var/picked_spell = show_radial_menu(user, src, spell_icons, custom_check = CALLBACK(src, .proc/check_menu, user), radius = 36, require_near = TRUE) + var/datum/action/cooldown/spell/picked_spell_type switch(picked_spell) if("Invisible Wall") - user.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/conjure/mime_wall(null)) + picked_spell_type = /datum/action/cooldown/spell/conjure/invisible_wall + if("Invisible Chair") - user.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/conjure/mime_chair(null)) + picked_spell_type = /datum/action/cooldown/spell/conjure/invisible_chair + if("Invisible Box") - user.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/conjure/mime_box(null)) - else - return - to_chat(user, span_warning("The book disappears into thin air.")) - qdel(src) + picked_spell_type = /datum/action/cooldown/spell/conjure_item/invisible_box + + if(ispath(picked_spell_type)) + // Gives the user a vow ability too, if they don't already have one + var/datum/action/cooldown/spell/vow_of_silence/vow = locate() in user.actions + if(!vow && user.mind) + vow = new(user.mind) + vow.Grant(user) + + picked_spell_type = new picked_spell_type(user.mind || user) + picked_spell_type.Grant(user) + + to_chat(user, span_warning("The book disappears into thin air.")) + qdel(src) + + return TRUE /** * Checks if we are allowed to interact with a radial menu diff --git a/code/modules/jobs/job_types/quartermaster.dm b/code/modules/jobs/job_types/quartermaster.dm index 6607aa9e985528..34211559e47b03 100644 --- a/code/modules/jobs/job_types/quartermaster.dm +++ b/code/modules/jobs/job_types/quartermaster.dm @@ -2,11 +2,13 @@ title = JOB_QUARTERMASTER description = "Coordinate cargo technicians and shaft miners, assist with \ economical purchasing." - department_head = list(JOB_HEAD_OF_PERSONNEL) + auto_deadmin_role_flags = DEADMIN_POSITION_HEAD + department_head = list(JOB_CAPTAIN) faction = FACTION_STATION total_positions = 1 spawn_positions = 1 - supervisors = "the head of personnel" + minimal_player_age = 7 + supervisors = "the captain" selection_color = "#d7b088" exp_required_type_department = EXP_TYPE_SUPPLY exp_granted_type = EXP_TYPE_CREW @@ -14,15 +16,16 @@ outfit = /datum/outfit/job/quartermaster plasmaman_outfit = /datum/outfit/plasmaman/cargo - paycheck = PAYCHECK_CREW + paycheck = PAYCHECK_COMMAND paycheck_department = ACCOUNT_CAR - liver_traits = list(TRAIT_PRETENDER_ROYAL_METABOLISM) + liver_traits = list(TRAIT_ROYAL_METABOLISM) // finally upgraded display_order = JOB_DISPLAY_ORDER_QUARTERMASTER bounty_types = CIV_JOB_RANDOM departments_list = list( /datum/job_department/cargo, + /datum/job_department/command, ) family_heirlooms = list(/obj/item/stamp, /obj/item/stamp/denied) mail_goodies = list( @@ -30,16 +33,19 @@ ) rpg_title = "Steward" job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_BOLD_SELECT_TEXT | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN - + ignore_human_authority = TRUE /datum/outfit/job/quartermaster name = "Quartermaster" jobtype = /datum/job/quartermaster - + backpack_contents = list( + /obj/item/melee/baton/telescopic = 1, + ) id_trim = /datum/id_trim/job/quartermaster + id = /obj/item/card/id/advanced/silver uniform = /obj/item/clothing/under/rank/cargo/qm - belt = /obj/item/modular_computer/tablet/pda/quartermaster - ears = /obj/item/radio/headset/headset_cargo + belt = /obj/item/modular_computer/tablet/pda/heads/quartermaster + ears = /obj/item/radio/headset/heads/qm glasses = /obj/item/clothing/glasses/sunglasses shoes = /obj/item/clothing/shoes/sneakers/brown l_hand = /obj/item/clipboard diff --git a/code/modules/jobs/job_types/scientist.dm b/code/modules/jobs/job_types/scientist.dm index 99b62de0fa1fb8..2978c9572e9233 100644 --- a/code/modules/jobs/job_types/scientist.dm +++ b/code/modules/jobs/job_types/scientist.dm @@ -53,9 +53,19 @@ /datum/outfit/job/scientist/pre_equip(mob/living/carbon/human/H) ..() - if(prob(0.4)) + try_giving_horrible_tie() + +/datum/outfit/job/scientist/proc/try_giving_horrible_tie() + if (prob(0.4)) neck = /obj/item/clothing/neck/tie/horrible /datum/outfit/job/scientist/get_types_to_preload() . = ..() . += /obj/item/clothing/neck/tie/horrible + +/// A version of the scientist outfit that is guaranteed to be the same every time +/datum/outfit/job/scientist/consistent + name = "Scientist - Consistent" + +/datum/outfit/job/scientist/consistent/try_giving_horrible_tie() + return diff --git a/code/modules/jobs/job_types/shaft_miner.dm b/code/modules/jobs/job_types/shaft_miner.dm index 717195d1f98876..c04f2b9788ab29 100644 --- a/code/modules/jobs/job_types/shaft_miner.dm +++ b/code/modules/jobs/job_types/shaft_miner.dm @@ -2,11 +2,11 @@ title = JOB_SHAFT_MINER description = "Travel to strange lands. Mine ores. \ Meet strange creatures. Kill them for their gold." - department_head = list(JOB_HEAD_OF_PERSONNEL) + department_head = list(JOB_QUARTERMASTER) faction = FACTION_STATION total_positions = 3 spawn_positions = 3 - supervisors = "the quartermaster and the head of personnel" + supervisors = "the quartermaster" selection_color = "#dcba97" exp_granted_type = EXP_TYPE_CREW diff --git a/code/modules/jobs/job_types/warden.dm b/code/modules/jobs/job_types/warden.dm index 6906fb3968153b..e5ed4565b80291 100644 --- a/code/modules/jobs/job_types/warden.dm +++ b/code/modules/jobs/job_types/warden.dm @@ -22,7 +22,7 @@ paycheck_department = ACCOUNT_SEC mind_traits = list(TRAIT_DONUT_LOVER) - liver_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) + liver_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM, TRAIT_PRETENDER_ROYAL_METABOLISM) display_order = JOB_DISPLAY_ORDER_WARDEN bounty_types = CIV_JOB_SEC diff --git a/code/modules/keybindings/setup.dm b/code/modules/keybindings/setup.dm index de07c952c72df5..bb2757761e00ec 100644 --- a/code/modules/keybindings/setup.dm +++ b/code/modules/keybindings/setup.dm @@ -32,9 +32,10 @@ var/command = macro_set[key] winset(src, "default-[REF(key)]", "parent=default;name=[key];command=[command]") - if(hotkeys) - winset(src, null, "input.focus=true input.background-color=[COLOR_INPUT_ENABLED]") - else - winset(src, null, "input.focus=true input.background-color=[COLOR_INPUT_DISABLED]") + //Reactivate any active tgui windows mouse passthroughs macros + for(var/datum/tgui_window/window in tgui_windows) + if(window.mouse_event_macro_set) + window.mouse_event_macro_set = FALSE + window.set_mouse_macro() update_special_keybinds() diff --git a/code/modules/lighting/lighting_atom.dm b/code/modules/lighting/lighting_atom.dm index 4beac5b1dd264d..f0487b86b1a540 100644 --- a/code/modules/lighting/lighting_atom.dm +++ b/code/modules/lighting/lighting_atom.dm @@ -25,8 +25,8 @@ #undef NONSENSICAL_VALUE -// Will update the light (duh). -// Creates or destroys it if needed, makes it update values, makes sure it's got the correct source turf... +/// Will update the light (duh). +/// Creates or destroys it if needed, makes it update values, makes sure it's got the correct source turf... /atom/proc/update_light() set waitfor = FALSE if (QDELETED(src)) @@ -80,13 +80,6 @@ return recalculate_directional_opacity() - -/atom/movable/Moved(atom/OldLoc, Dir) - . = ..() - for (var/datum/light_source/light as anything in light_sources) // Cycle through the light sources on this atom and tell them to update. - light.source_atom.update_light() - - /atom/proc/flash_lighting_fx(_range = FLASH_LIGHT_RANGE, _power = FLASH_LIGHT_POWER, _color = COLOR_WHITE, _duration = FLASH_LIGHT_DURATION) return diff --git a/code/modules/lighting/lighting_corner.dm b/code/modules/lighting/lighting_corner.dm index 19285ae988818d..572cd8b50d7eac 100644 --- a/code/modules/lighting/lighting_corner.dm +++ b/code/modules/lighting/lighting_corner.dm @@ -88,8 +88,14 @@ // God that was a mess, now to do the rest of the corner code! Hooray! /datum/lighting_corner/proc/update_lumcount(delta_r, delta_g, delta_b) + +#ifdef VISUALIZE_LIGHT_UPDATES + if (!SSlighting.allow_duped_values && !(delta_r || delta_g || delta_b)) // 0 is falsey ok + return +#else if (!(delta_r || delta_g || delta_b)) // 0 is falsey ok return +#endif lum_r += delta_r lum_g += delta_g @@ -109,6 +115,10 @@ if (largest_color_luminosity > 1) . = 1 / largest_color_luminosity + var/old_r = cache_r + var/old_g = cache_g + var/old_b = cache_b + #if LIGHTING_SOFT_THRESHOLD != 0 else if (largest_color_luminosity < LIGHTING_SOFT_THRESHOLD) . = 0 // 0 means soft lighting. @@ -123,6 +133,13 @@ #endif src.largest_color_luminosity = round(largest_color_luminosity, LIGHTING_ROUND_VALUE) +#ifdef VISUALIZE_LIGHT_UPDATES + if(!SSlighting.allow_duped_corners && old_r == cache_r && old_g == cache_g && old_b == cache_b) + return +#else + if(old_r == cache_r && old_g == cache_g && old_b == cache_b) + return +#endif var/datum/lighting_object/lighting_object = master_NE?.lighting_object if (lighting_object && !lighting_object.needs_update) diff --git a/code/modules/lighting/lighting_object.dm b/code/modules/lighting/lighting_object.dm index 21cfb8003cfdd9..9004e35b204614 100644 --- a/code/modules/lighting/lighting_object.dm +++ b/code/modules/lighting/lighting_object.dm @@ -43,6 +43,11 @@ return ..() /datum/lighting_object/proc/update() +#ifdef VISUALIZE_LIGHT_UPDATES + affected_turf.add_atom_colour(COLOR_BLUE_LIGHT, ADMIN_COLOUR_PRIORITY) + animate(affected_turf, 10, color = null) + addtimer(CALLBACK(affected_turf, /atom/proc/remove_atom_colour, ADMIN_COLOUR_PRIORITY, COLOR_BLUE_LIGHT), 10, TIMER_UNIQUE|TIMER_OVERRIDE) +#endif // To the future coder who sees this and thinks // "Why didn't he just use a loop?" diff --git a/code/modules/lighting/lighting_source.dm b/code/modules/lighting/lighting_source.dm index ca600b7d8f26d0..f9c48fb87ce0f4 100644 --- a/code/modules/lighting/lighting_source.dm +++ b/code/modules/lighting/lighting_source.dm @@ -40,10 +40,10 @@ /datum/light_source/New(atom/owner, atom/top) source_atom = owner // Set our new owner. - LAZYADD(source_atom.light_sources, src) + add_to_light_sources(source_atom.light_sources) top_atom = top if (top_atom != source_atom) - LAZYADD(top_atom.light_sources, src) + add_to_light_sources(top_atom.light_sources) source_turf = top_atom pixel_turf = get_turf_pixel(top_atom) || source_turf @@ -59,10 +59,10 @@ /datum/light_source/Destroy(force) remove_lum() if (source_atom) - LAZYREMOVE(source_atom.light_sources, src) + remove_from_light_sources(source_atom.light_sources) if (top_atom) - LAZYREMOVE(top_atom.light_sources, src) + remove_from_light_sources(top_atom.light_sources) if (needs_update) SSlighting.sources_queue -= src @@ -74,6 +74,35 @@ return ..() +///add this light source to new_atom_host's light_sources list. updating movement registrations as needed +/datum/light_source/proc/add_to_light_sources(atom/new_atom_host) + if(QDELETED(new_atom_host)) + return FALSE + + LAZYADD(new_atom_host.light_sources, src) + if(ismovable(new_atom_host) && new_atom_host == source_atom) + RegisterSignal(new_atom_host, COMSIG_MOVABLE_MOVED, .proc/update_host_lights) + return TRUE + +///remove this light source from old_atom_host's light_sources list, unsetting movement registrations +/datum/light_source/proc/remove_from_light_sources(atom/old_atom_host) + if(QDELETED(old_atom_host)) + return FALSE + + LAZYREMOVE(old_atom_host.light_sources, src) + if(ismovable(old_atom_host) && old_atom_host == source_atom) + UnregisterSignal(old_atom_host, COMSIG_MOVABLE_MOVED) + return TRUE + +///signal handler for when our host atom moves and we need to update our effects +/datum/light_source/proc/update_host_lights(atom/movable/host) + SIGNAL_HANDLER + + if(QDELETED(host)) + return + + host.update_light() + // Yes this doesn't align correctly on anything other than 4 width tabs. // If you want it to go switch everybody to elastic tab stops. // Actually that'd be great if you could! @@ -84,17 +113,17 @@ needs_update = level; \ -// This proc will cause the light source to update the top atom, and add itself to the update queue. +/// This proc will cause the light source to update the top atom, and add itself to the update queue. /datum/light_source/proc/update(atom/new_top_atom) // This top atom is different. if (new_top_atom && new_top_atom != top_atom) if(top_atom != source_atom && top_atom.light_sources) // Remove ourselves from the light sources of that top atom. - LAZYREMOVE(top_atom.light_sources, src) + remove_from_light_sources(top_atom.light_sources) top_atom = new_top_atom if (top_atom != source_atom) - LAZYADD(top_atom.light_sources, src) // Add ourselves to the light sources of our new top atom. + add_to_light_sources(top_atom.light_sources) EFFECT_UPDATE(LIGHTING_CHECK_UPDATE) diff --git a/code/modules/mapfluff/ruins/lavalandruin_code/biodome_winter.dm b/code/modules/mapfluff/ruins/lavalandruin_code/biodome_winter.dm index 98aa475b8c2c18..330d3671a5009a 100644 --- a/code/modules/mapfluff/ruins/lavalandruin_code/biodome_winter.dm +++ b/code/modules/mapfluff/ruins/lavalandruin_code/biodome_winter.dm @@ -41,8 +41,9 @@ if(hit_object.resistance_flags & FREEZE_PROOF) hit_object.visible_message(span_warning("[hit_object] is freeze-proof!")) return - if(!(hit_object.obj_flags & FROZEN)) - hit_object.make_frozen_visual() + if(HAS_TRAIT(hit_object, TRAIT_FROZEN)) + return + hit_object.AddElement(/datum/element/frozen) else if(isliving(hit_atom)) var/mob/living/hit_mob = hit_atom SSmove_manager.stop_looping(hit_mob) //stops them mid pathing even if they're stunimmune diff --git a/code/modules/mapfluff/ruins/lavalandruin_code/elephantgraveyard.dm b/code/modules/mapfluff/ruins/lavalandruin_code/elephantgraveyard.dm index 59839aeb9d9e85..ec7d8afa10e124 100644 --- a/code/modules/mapfluff/ruins/lavalandruin_code/elephantgraveyard.dm +++ b/code/modules/mapfluff/ruins/lavalandruin_code/elephantgraveyard.dm @@ -226,16 +226,6 @@ /obj/effect/decal/remains/human/grave turf_loc_check = FALSE -/obj/item/book/granter/crafting_recipe/boneyard_notes - name = "The Complete Works of Lavaland Bone Architecture" - desc = "Pried from the lead Archaeologist's cold, dead hands, this seems to explain how ancient bone architecture was erected long ago." - crafting_recipe_types = list(/datum/crafting_recipe/rib, /datum/crafting_recipe/boneshovel, /datum/crafting_recipe/halfskull, /datum/crafting_recipe/skull) - icon = 'icons/obj/library.dmi' - icon_state = "boneworking_learing" - oneuse = FALSE - remarks = list("Who knew you could bend bones that far back?", "I guess that was much easier before the planet heated up...", "So that's how they made those ruins survive the ashstorms. Neat!", "The page is just filled with insane ramblings about some 'legion' thing.", "But why would they need vinegar to polish the bones? And rags too?", "You spend a few moments cleaning dirt and blood off of the page, yeesh.") - - //***Fluff items for lore/intrigue /obj/item/paper/crumpled/muddy/fluff/elephant_graveyard name = "posted warning" diff --git a/code/modules/mapfluff/ruins/objects_and_mobs/necropolis_gate.dm b/code/modules/mapfluff/ruins/objects_and_mobs/necropolis_gate.dm index 7d12dd93c3c45c..1c6a8fb98e6550 100644 --- a/code/modules/mapfluff/ruins/objects_and_mobs/necropolis_gate.dm +++ b/code/modules/mapfluff/ruins/objects_and_mobs/necropolis_gate.dm @@ -187,7 +187,7 @@ GLOBAL_DATUM(necropolis_gate, /obj/structure/necropolis_gate/legion_gate) for(var/mob/M in GLOB.player_list) if(M.z == z) to_chat(M, span_userdanger("Discordant whispers flood your mind in a thousand voices. Each one speaks your name, over and over. Something horrible has been released.")) - M.playsound_local(T, null, 100, FALSE, 0, FALSE, pressure_affected = FALSE, S = legion_sound) + M.playsound_local(T, null, 100, FALSE, 0, FALSE, pressure_affected = FALSE, sound_to_use = legion_sound) flash_color(M, flash_color = "#FF0000", flash_time = 50) var/mutable_appearance/release_overlay = mutable_appearance('icons/effects/effects.dmi', "legiondoor") notify_ghosts("Legion has been released in the [get_area(src)]!", source = src, alert_overlay = release_overlay, action = NOTIFY_JUMP, flashwindow = FALSE) diff --git a/code/modules/mapfluff/ruins/spaceruin_code/hilbertshotel.dm b/code/modules/mapfluff/ruins/spaceruin_code/hilbertshotel.dm index c587460bb10a30..c9d36928a656a8 100644 --- a/code/modules/mapfluff/ruins/spaceruin_code/hilbertshotel.dm +++ b/code/modules/mapfluff/ruins/spaceruin_code/hilbertshotel.dm @@ -494,19 +494,22 @@ GLOBAL_VAR_INIT(hhMysteryRoomNumber, rand(1, 999999)) else to_chat(user, "No vacated rooms.") +/obj/effect/landmark/lift_id/hilbert + specific_lift_id = HILBERT_TRAM + /obj/effect/landmark/tram/left_part/hilbert + specific_lift_id = HILBERT_TRAM destination_id = "left_part_hilbert" - tram_id = "tram_hilbert" tgui_icons = list("Reception" = "briefcase", "Botany" = "leaf", "Chemistry" = "flask") /obj/effect/landmark/tram/middle_part/hilbert + specific_lift_id = HILBERT_TRAM destination_id = "middle_part_hilbert" - tram_id = "tram_hilbert" tgui_icons = list("Processing" = "cogs", "Xenobiology" = "paw") /obj/effect/landmark/tram/right_part/hilbert + specific_lift_id = HILBERT_TRAM destination_id = "right_part_hilbert" - tram_id = "tram_hilbert" tgui_icons = list("Ordnance" = "bullseye", "Office" = "user", "Dormitories" = "bed") /obj/item/keycard/hilbert @@ -520,6 +523,7 @@ GLOBAL_VAR_INIT(hhMysteryRoomNumber, rand(1, 999999)) puzzle_id = "hilbert_office" /datum/outfit/doctorhilbert + name = "Doctor Hilbert" id = /obj/item/card/id/advanced/silver uniform = /obj/item/clothing/under/rank/rnd/research_director/doctor_hilbert shoes = /obj/item/clothing/shoes/sneakers/brown diff --git a/code/modules/mapfluff/ruins/spaceruin_code/listeningstation.dm b/code/modules/mapfluff/ruins/spaceruin_code/listeningstation.dm index 925f9048c4783b..c6302e6fefa996 100644 --- a/code/modules/mapfluff/ruins/spaceruin_code/listeningstation.dm +++ b/code/modules/mapfluff/ruins/spaceruin_code/listeningstation.dm @@ -1,45 +1,118 @@ -/////////// listening station +///Papers used in The Listening Station ruin. /obj/item/paper/fluff/ruins/listeningstation/reports info = "Nothing of interest to report." +// Original "background" tone. +/obj/item/paper/fluff/ruins/listeningstation/reports/march + name = "march report" + info = {"Accepted new assignment from liasion at MI13. Mission: Report on all Nanotrasen activities in this sector. +
Secondary Mission is to ensure survival of the person in the sleeper. This should not be hard, I have had personal experience with +
this model of sleeper, and I know it to be of good quality. + "} + +/obj/item/paper/fluff/ruins/listeningstation/reports/april + name = "april report" + info = {"A good start to the operation: intercepted Nanotrasen military communications. A convoy is scheduled to transfer nuclear warheads to a new military base. +
This is as good a chance as any to get our hands on some heavy weaponry, I suggest we take it. +
As far as base work goes, I have begun a refurnishing of the base using the supplies I received during my shipment. It takes the mind off for whenever the station goes... "dark". +
+
I suppose I shall await further commands. + "} + +/obj/item/paper/fluff/ruins/listeningstation/reports/may + name = "may report" + info = {"Nothing of real interest to report this month. I have intercepted faint transmissions from what appears to be some sort of pirate radio station. They do not appear to be relevant to my assignment. +
Using my connections, I was able to procure some signs and posters from Nanotrasen ships. I have a bundle of markers, so I spent today "disguising" the asteroid. Sloppy work, but I think it fits well. +
It's a nice base, this. I have certainly served in worse conditions. +
I have not heard anything about the mission on the new military base. I will press the matter later today. + "} + +/obj/item/paper/fluff/ruins/listeningstation/reports/june + name = "june report" + info = {"Nanotrasen communications have been noticeably less frequent recently. The pirate radio station I found last month has been transmitting pro-Nanotrasen propaganda. I will continue to monitor it. +
While I pressed the matter on looting the nuclear warheads, they advised me that it was "above my paygrade". However, I slipped a bug I had lying around the satellite into the pockets of one of my +
superiors into the coat pocket. They were saying it was useless without some sort of authentication device. +
+
It's not like anyone but me reads these, why else should I talk about my base upkeep? Today: the "lobby". +"} + +// "Anderson" starts writing here /obj/item/paper/fluff/ruins/listeningstation/reports/july name = "july report" + info = {"Hey, old guy got a transfer, and I was next in line. I'll show them how we do it over at the Gorlex Marauders! Let's monitor some stuff. This will be fun. +
It seems "old guy" did some upkeep around the base, and I will admit: it's nice. The lobby is shoddy for some reason. Not sure why that is. +
I read some of the older reports, and it seems like interesting stuff. No idea where June is. Ah well, maybe he got out in May? +
Odd sleeper, the frost covered it up. They were telling me about this on the way here, that it's meant to be a replacement to ensure "seamless" operation of this base. Okay? +
I have enough supplies to last me until November, and then I get picked up. Let's get this money! + "} +// Shift in tone here, i may have gone too edgelord /obj/item/paper/fluff/ruins/listeningstation/reports/august name = "august report" + info = {"holy shit i am so bored. does this even matter? i'm stranded here. they said they'd come for me after a few months and i have plenty of stores. i tried listening to station stuff... but- +
ugh. i caught some chatter about some sort of disk, but i think it was cross-ference with ourselves? some gas station jingle came on, some feedback from... not even sure what that is +
the "old guy" did a good job around this base. it's not finished in the lobby, but everything else is nice. +
they expressly told me to never leave this post, but i think "old guy" didn't listen for putting up those signs. i did a lap around with a spacewalk, that was fun. +
i'll stay tuned. + "} /obj/item/paper/fluff/ruins/listeningstation/reports/september name = "september report" + info = {"i'm... not doing good. i'm doing so bad. the sleeper is still there. my friend died in a sleeper malfunction. it overheated. +
i don't want to unplug it, i don't want to wake them up. i don't go in the bedroom anymore, i have a small cot in the lobby area. i'm lonely. +
blowing myself up is out of the question. it'll kill them too. i've killed many people in my life, but i think ending another that way +
will probably send me to hell. if hell is anything like this, i'd rather try and salvage as much as i can before i pass. death awaits us all. +
+
i'm not even going to send this report off i just need to write. i've written a lot, but i burn it all. one a month stays. +
walks are the only thing that help. i breathe and breathe in those until the oxygen runs out. it makes me feel alive, when every part of me is dead. + "} + /obj/item/paper/fluff/ruins/listeningstation/reports/october name = "october report" + info = {"i am so fucking stupid. i ran out of tank oxygen, so i tried to jerry rig one of the auxiliary pressure tanks abroad the station to feed an eva tank. +
as i have just learned, that was very stupid. the oxygen was below zero degrees, and it sprayed right into my open eyes. i can make out blobs of shapes and colors, but not much more. +
i still know how to touch-type on this machine, it's second-nature to me. with the amount of painkillers i've used, my liver is also failing. i've had mood swings from the painkillers +
so i've destroyed a lot of this base with my rage. it's unsustainable. there is not enough money in the world to keep me here any longer. +
i've kept all of these reports on my person, the amount of times i've re-read them trying to think of "better" times gave it certain crinkles... +
i know june from september from august just based on the wrinkles alone. i can't read them, but i know them more than i know myself these days. +
+
my only concern is the person in the sleeper. i'm not going to bother them with anything. if i woke them up, maybe i wouldn't be blind and i would be happy. i couldn't see that. +
i fear they'll go insane reading these, so i'll make something up for november. i'll lie, effortfully lie. scatter the others, and this one. if you happen upon this note, i'm sorry. i ruined it for you. +
+
as soon as i find where i dropped my keycard, i'm going to use one last emergency oxygen tank, and float. if i am gunned for being a deserter, so be it. if i am shot by terragov or nanotrasen, so be it. +
even if the pickup should come in a matter of weeks, i literally can not live with myself. a future in where i live in is completely unfeasible. +
i will die among the stars. + "} +// Shift back in tone, the "lie". /obj/item/paper/fluff/ruins/listeningstation/reports/november name = "november report" + info = {"Hey, hey, what's up loser! It's me, your predecessor! I had a radical stint here, and you will too! There's not much supplies left, but I'm certain you'll manage by the time the re-supply ship comes back! +
I've made so much fucking dough just sitting on this ship and writing up reports, the content doesn't even matter! That's why I chose to use this one to shit on you! Look at your goofy face! +
Got a bit of frostbite on your widdle-diddle face? Ha, ha ha, ha ha ha. Anyways, you've probably only got a month left, while I toughed it all out! I even left this place in a shitty condition +
because I hated you so much! Fuck you! I'm off spending all of my dough, while you have to pick up the slack of my job! Anyways, don't get too bored now! +
+
- Your "Friend" - Anderson +
+
P.S. GORLEX ROOLZ - "SAIBASAN" DROOLZ. + "} -/obj/item/paper/fluff/ruins/listeningstation/reports/june - name = "june report" - info = "Nanotrasen communications have been noticeably less frequent recently. The pirate radio station I found last month has been transmitting pro-Nanotrasen propaganda. I will continue to monitor it." - -/obj/item/paper/fluff/ruins/listeningstation/reports/may - name = "may report" - info = "Nothing of real interest to report this month. I have intercepted faint transmissions from what appears to be some sort of pirate radio station. They do not appear to be relevant to my assignment." - -/obj/item/paper/fluff/ruins/listeningstation/reports/april - name = "april report" - info = "A good start to the operation: intercepted Nanotrasen military communications. A convoy is scheduled to transfer nuclear warheads to a new military base. This is as good a chance as any to get our hands on some heavy weaponry, I suggest we take it." +//Miscellaneous Papers /obj/item/paper/fluff/ruins/listeningstation/receipt name = "receipt" info = "1 x Stechkin pistol - 600 cr
1 x silencer - 200 cr
shipping charge - 4360 cr
total - 5160 cr" -/obj/item/paper/fluff/ruins/listeningstation/odd_report - name = "odd report" - info = "I wonder how much longer they will accept my empty reports. They will cancel the case soon without results. When the pickup comes, I will tell them I have lost faith in our cause, and beg them to consider a diplomatic solution. How many nuclear teams have been dispatched with those nukes? I must try and prevent more from ever being sent. If they will not listen to reason, I will detonate the warehouse myself. Maybe some day in the immediate future, space will be peaceful, though I don't intend to live to see it. And that is why I write this down- it is my sacrifice that stabilized your worlds, traveller. Spare a thought for me, and please attempt to prevent nuclear proliferation, should it ever rear its ugly head again. - Donk Co. Operative #451" - /obj/item/paper/fluff/ruins/listeningstation/briefing name = "mission briefing" - info = "Mission Details: You have been assigned to a newly constructed listening post constructed within an asteroid in Nanotrasen space to monitor their plasma mining operations. Accurate intel is crucial to the success of our operatives onboard, do not fail us." + info = {"Mission Details: +
+
You have been assigned to a newly constructed listening post constructed within an asteroid in Nanotrasen space to monitor their plasma mining operations. +
Accurate intel is crucial to the success of our operatives onboard, do not fail us. +
+
You may view intelligence reports from your predecessors in the filing cabinet in your office. + "} diff --git a/code/modules/mapping/access_helpers.dm b/code/modules/mapping/access_helpers.dm index a80f3fd43f2eec..b1fd3571e51bd2 100644 --- a/code/modules/mapping/access_helpers.dm +++ b/code/modules/mapping/access_helpers.dm @@ -1,5 +1,5 @@ /obj/effect/mapping_helpers/airlock/access - layer = DOOR_HELPER_LAYER + layer = DOOR_ACCESS_HELPER_LAYER icon_state = "access_helper" // These are mutually exclusive; can't have req_any and req_all @@ -8,21 +8,14 @@ log_mapping("[src] at [AREACOORD(src)] tried to set req_one_access, but req_access was already set!") else var/list/access_list = get_access() - // Overwrite if there is no access set, otherwise add onto existing access - if(airlock.req_one_access == null) - airlock.req_one_access = access_list - else - airlock.req_one_access += access_list + airlock.req_one_access += access_list /obj/effect/mapping_helpers/airlock/access/all/payload(obj/machinery/door/airlock/airlock) if(airlock.req_one_access != null) log_mapping("[src] at [AREACOORD(src)] tried to set req_one_access, but req_access was already set!") else var/list/access_list = get_access() - if(airlock.req_access == null) - airlock.req_access = access_list - else - airlock.req_access_txt += access_list + airlock.req_access += access_list /obj/effect/mapping_helpers/airlock/access/proc/get_access() var/list/access = list() @@ -53,6 +46,12 @@ access_list += ACCESS_EVA return access_list +/obj/effect/mapping_helpers/airlock/access/any/command/minisat/get_access() + var/list/access_list = ..() + access_list += ACCESS_MINISAT + return access_list + + /obj/effect/mapping_helpers/airlock/access/any/command/gateway/get_access() var/list/access_list = ..() access_list += ACCESS_GATEWAY @@ -347,9 +346,9 @@ access_list += ACCESS_CARGO return access_list -/obj/effect/mapping_helpers/airlock/access/any/supply/mail_sorting/get_access() +/obj/effect/mapping_helpers/airlock/access/any/supply/shipping/get_access() var/list/access_list = ..() - access_list += ACCESS_MAIL_SORTING + access_list += ACCESS_SHIPPING return access_list /obj/effect/mapping_helpers/airlock/access/any/supply/mining/get_access() @@ -529,6 +528,11 @@ access_list += ACCESS_EVA return access_list +/obj/effect/mapping_helpers/airlock/access/all/command/minisat/get_access() + var/list/access_list = ..() + access_list += ACCESS_MINISAT + return access_list + /obj/effect/mapping_helpers/airlock/access/all/command/gateway/get_access() var/list/access_list = ..() access_list += ACCESS_GATEWAY @@ -793,9 +797,9 @@ access_list += ACCESS_CARGO return access_list -/obj/effect/mapping_helpers/airlock/access/all/supply/mail_sorting/get_access() +/obj/effect/mapping_helpers/airlock/access/all/supply/shipping/get_access() var/list/access_list = ..() - access_list += ACCESS_MAIL_SORTING + access_list += ACCESS_SHIPPING return access_list /obj/effect/mapping_helpers/airlock/access/all/supply/mining/get_access() diff --git a/code/modules/mapping/mapping_helpers.dm b/code/modules/mapping/mapping_helpers.dm index e2053966edc78a..df38a2b258e65a 100644 --- a/code/modules/mapping/mapping_helpers.dm +++ b/code/modules/mapping/mapping_helpers.dm @@ -189,7 +189,6 @@ else airlock.locked = TRUE - /obj/effect/mapping_helpers/airlock/unres name = "airlock unrestricted side helper" icon_state = "airlock_unres_helper" @@ -700,3 +699,35 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava) json_cache[json_url] = json_data query_in_progress = FALSE return json_data + +/obj/effect/mapping_helpers/broken_floor + name = "broken floor" + icon = 'icons/turf/damaged.dmi' + icon_state = "damaged1" + late = TRUE + layer = ABOVE_NORMAL_TURF_LAYER + +/obj/effect/mapping_helpers/broken_floor/Initialize(mapload) + .=..() + return INITIALIZE_HINT_LATELOAD + +/obj/effect/mapping_helpers/broken_floor/LateInitialize() + var/turf/open/floor/floor = get_turf(src) + floor.break_tile() + qdel(src) + +/obj/effect/mapping_helpers/burnt_floor + name = "burnt floor" + icon = 'icons/turf/damaged.dmi' + icon_state = "floorscorched1" + late = TRUE + layer = ABOVE_NORMAL_TURF_LAYER + +/obj/effect/mapping_helpers/burnt_floor/Initialize(mapload) + .=..() + return INITIALIZE_HINT_LATELOAD + +/obj/effect/mapping_helpers/burnt_floor/LateInitialize() + var/turf/open/floor/floor = get_turf(src) + floor.burn_tile() + qdel(src) diff --git a/code/modules/mapping/space_management/traits.dm b/code/modules/mapping/space_management/traits.dm index b53e2ee332a9b6..4911d5316f1854 100644 --- a/code/modules/mapping/space_management/traits.dm +++ b/code/modules/mapping/space_management/traits.dm @@ -57,18 +57,19 @@ /// Attempt to get the turf below the provided one according to Z traits /datum/controller/subsystem/mapping/proc/get_turf_below(turf/T) - if (!T) + if (!T || !initialized) return - var/offset = level_trait(T.z, ZTRAIT_DOWN) + var/offset = multiz_levels[T.z]["[DOWN]"] if (!offset) return - return locate(T.x, T.y, T.z + offset) + return locate(T.x, T.y, T.z - offset) /// Attempt to get the turf above the provided one according to Z traits /datum/controller/subsystem/mapping/proc/get_turf_above(turf/T) - if (!T) + if (!T || !initialized) return - var/offset = level_trait(T.z, ZTRAIT_UP) + + var/offset = multiz_levels[T.z]["[UP]"] if (!offset) return return locate(T.x, T.y, T.z + offset) diff --git a/code/modules/mapping/space_management/zlevel_manager.dm b/code/modules/mapping/space_management/zlevel_manager.dm index 2ad150ebc4be6c..1e5d2aafc88f07 100644 --- a/code/modules/mapping/space_management/zlevel_manager.dm +++ b/code/modules/mapping/space_management/zlevel_manager.dm @@ -26,6 +26,8 @@ // TODO: sleep here if the Z level needs to be cleared var/datum/space_level/S = new z_type(new_z, name, traits) z_list += S + generate_linkages_for_z_level(new_z) + calculate_z_level_gravity(new_z) adding_new_zlevel = FALSE SEND_GLOBAL_SIGNAL(COMSIG_GLOB_NEW_Z, S) return S diff --git a/code/modules/meteors/meteors.dm b/code/modules/meteors/meteors.dm index 2e843f2303b00a..ef7bf322613c0b 100644 --- a/code/modules/meteors/meteors.dm +++ b/code/modules/meteors/meteors.dm @@ -221,7 +221,7 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust=1)) //for space dust eve continue var/dist = get_dist(M.loc, src.loc) shake_camera(M, dist > 20 ? 2 : 4, dist > 20 ? 1 : 3) - M.playsound_local(src.loc, null, 50, 1, random_frequency, 10, S = meteor_sound) + M.playsound_local(src.loc, null, 50, 1, random_frequency, 10, sound_to_use = meteor_sound) /////////////////////// //Meteor types diff --git a/code/modules/mining/equipment/explorer_gear.dm b/code/modules/mining/equipment/explorer_gear.dm index 671f46c85ddec4..801c3cf7b3c0f6 100644 --- a/code/modules/mining/equipment/explorer_gear.dm +++ b/code/modules/mining/equipment/explorer_gear.dm @@ -76,7 +76,7 @@ /obj/item/flashlight, /obj/item/knife/combat/bone, /obj/item/knife/combat/survival, - /obj/item/organ/regenerative_core/legion, + /obj/item/organ/internal/regenerative_core/legion, /obj/item/pickaxe, /obj/item/spear, /obj/item/tank/internals, diff --git a/code/modules/mining/equipment/mining_tools.dm b/code/modules/mining/equipment/mining_tools.dm index f05077134ba91d..34801bcff68bdb 100644 --- a/code/modules/mining/equipment/mining_tools.dm +++ b/code/modules/mining/equipment/mining_tools.dm @@ -7,6 +7,7 @@ slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_BACK force = 15 throwforce = 10 + demolition_mod = 1.15 lefthand_file = 'icons/mob/inhands/equipment/mining_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/mining_righthand.dmi' w_class = WEIGHT_CLASS_BULKY diff --git a/code/modules/mining/equipment/regenerative_core.dm b/code/modules/mining/equipment/regenerative_core.dm index b83ea119c4b2ec..11688cb2de3285 100644 --- a/code/modules/mining/equipment/regenerative_core.dm +++ b/code/modules/mining/equipment/regenerative_core.dm @@ -6,21 +6,21 @@ desc = "Inject certain types of monster organs with this stabilizer to preserve their healing powers indefinitely." w_class = WEIGHT_CLASS_TINY -/obj/item/hivelordstabilizer/afterattack(obj/item/organ/M, mob/user, proximity) +/obj/item/hivelordstabilizer/afterattack(obj/item/organ/target_organ, mob/user, proximity) . = ..() if(!proximity) return - var/obj/item/organ/regenerative_core/C = M - if(!istype(C, /obj/item/organ/regenerative_core)) + var/obj/item/organ/internal/regenerative_core/target_core = target_organ + if(!istype(target_core, /obj/item/organ/internal/regenerative_core)) to_chat(user, span_warning("The stabilizer only works on certain types of monster organs, generally regenerative in nature.")) return - C.preserved() - to_chat(user, span_notice("You inject the [M] with the stabilizer. It will no longer go inert.")) + target_core.preserved() + to_chat(user, span_notice("You inject the [target_organ] with the stabilizer. It will no longer go inert.")) qdel(src) /************************Hivelord core*******************/ -/obj/item/organ/regenerative_core +/obj/item/organ/internal/regenerative_core name = "regenerative core" desc = "All that remains of a hivelord. It can be used to help keep your body going, but it will rapidly decay into uselessness." icon_state = "roro core 2" @@ -33,15 +33,15 @@ var/inert = 0 var/preserved = 0 -/obj/item/organ/regenerative_core/Initialize(mapload) +/obj/item/organ/internal/regenerative_core/Initialize(mapload) . = ..() addtimer(CALLBACK(src, .proc/inert_check), 2400) -/obj/item/organ/regenerative_core/proc/inert_check() +/obj/item/organ/internal/regenerative_core/proc/inert_check() if(!preserved) go_inert() -/obj/item/organ/regenerative_core/proc/preserved(implanted = 0) +/obj/item/organ/internal/regenerative_core/proc/preserved(implanted = 0) inert = FALSE preserved = TRUE update_appearance() @@ -51,77 +51,77 @@ else SSblackbox.record_feedback("nested tally", "hivelord_core", 1, list("[type]", "stabilizer")) -/obj/item/organ/regenerative_core/proc/go_inert() +/obj/item/organ/internal/regenerative_core/proc/go_inert() inert = TRUE name = "decayed regenerative core" desc = "All that remains of a hivelord. It has decayed, and is completely useless." SSblackbox.record_feedback("nested tally", "hivelord_core", 1, list("[type]", "inert")) update_appearance() -/obj/item/organ/regenerative_core/ui_action_click() +/obj/item/organ/internal/regenerative_core/ui_action_click() if(inert) to_chat(owner, span_notice("[src] breaks down as it tries to activate.")) else owner.revive(full_heal = TRUE, admin_revive = FALSE) qdel(src) -/obj/item/organ/regenerative_core/on_life(delta_time, times_fired) +/obj/item/organ/internal/regenerative_core/on_life(delta_time, times_fired) ..() if(owner.health <= owner.crit_threshold) ui_action_click() ///Handles applying the core, logging and status/mood events. -/obj/item/organ/regenerative_core/proc/applyto(atom/target, mob/user) +/obj/item/organ/internal/regenerative_core/proc/applyto(atom/target, mob/user) if(ishuman(target)) - var/mob/living/carbon/human/H = target + var/mob/living/carbon/human/target_human = target if(inert) to_chat(user, span_notice("[src] has decayed and can no longer be used to heal.")) return else - if(H.stat == DEAD) + if(target_human.stat == DEAD) to_chat(user, span_notice("[src] is useless on the dead.")) return - if(H != user) - H.visible_message(span_notice("[user] forces [H] to apply [src]... Black tendrils entangle and reinforce [H.p_them()]!")) + if(target_human != user) + target_human.visible_message(span_notice("[user] forces [target_human] to apply [src]... Black tendrils entangle and reinforce [target_human.p_them()]!")) SSblackbox.record_feedback("nested tally", "hivelord_core", 1, list("[type]", "used", "other")) else to_chat(user, span_notice("You start to smear [src] on yourself. Disgusting tendrils hold you together and allow you to keep moving, but for how long?")) SSblackbox.record_feedback("nested tally", "hivelord_core", 1, list("[type]", "used", "self")) - H.apply_status_effect(/datum/status_effect/regenerative_core) - SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "core", /datum/mood_event/healsbadman) //Now THIS is a miner buff (fixed - nerf) + target_human.apply_status_effect(/datum/status_effect/regenerative_core) + SEND_SIGNAL(target_human, COMSIG_ADD_MOOD_EVENT, "core", /datum/mood_event/healsbadman) //Now THIS is a miner buff (fixed - nerf) qdel(src) -/obj/item/organ/regenerative_core/afterattack(atom/target, mob/user, proximity_flag) +/obj/item/organ/internal/regenerative_core/afterattack(atom/target, mob/user, proximity_flag) . = ..() if(proximity_flag) applyto(target, user) -/obj/item/organ/regenerative_core/attack_self(mob/user) +/obj/item/organ/internal/regenerative_core/attack_self(mob/user) if(user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) applyto(user, user) -/obj/item/organ/regenerative_core/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE) +/obj/item/organ/internal/regenerative_core/Insert(mob/living/carbon/target_carbon, special = 0, drop_if_replaced = TRUE) . = ..() if(!preserved && !inert) preserved(TRUE) owner.visible_message(span_notice("[src] stabilizes as it's inserted.")) -/obj/item/organ/regenerative_core/Remove(mob/living/carbon/M, special = 0) +/obj/item/organ/internal/regenerative_core/Remove(mob/living/carbon/target_carbon, special = 0) if(!inert && !special) owner.visible_message(span_notice("[src] rapidly decays as it's removed.")) go_inert() return ..() /*************************Legion core********************/ -/obj/item/organ/regenerative_core/legion +/obj/item/organ/internal/regenerative_core/legion desc = "A strange rock that crackles with power. It can be used to heal completely, but it will rapidly decay into uselessness." icon_state = "legion_soul" -/obj/item/organ/regenerative_core/legion/Initialize(mapload) +/obj/item/organ/internal/regenerative_core/legion/Initialize(mapload) . = ..() update_appearance() -/obj/item/organ/regenerative_core/update_icon_state() +/obj/item/organ/internal/regenerative_core/update_icon_state() if (inert) icon_state = "legion_soul_inert" if (preserved) @@ -130,10 +130,10 @@ icon_state = "legion_soul_unstable" return ..() -/obj/item/organ/regenerative_core/legion/go_inert() +/obj/item/organ/internal/regenerative_core/legion/go_inert() ..() desc = "[src] has become inert. It has decayed, and is completely useless." -/obj/item/organ/regenerative_core/legion/preserved(implanted = 0) +/obj/item/organ/internal/regenerative_core/legion/preserved(implanted = 0) ..() desc = "[src] has been stabilized. It is preserved, allowing you to use it to heal completely without danger of decay." diff --git a/code/modules/mining/laborcamp/laborshuttle.dm b/code/modules/mining/laborcamp/laborshuttle.dm index 000be6251d1dc0..8bcb1230bd52c9 100644 --- a/code/modules/mining/laborcamp/laborshuttle.dm +++ b/code/modules/mining/laborcamp/laborshuttle.dm @@ -26,3 +26,14 @@ to_chat(user, span_warning("Shuttle is already at the outpost!")) return FALSE return TRUE + +/obj/docking_port/stationary/laborcamp_home + name = "SS13: Labor Shuttle Dock" + id = "laborcamp_home" + roundstart_template = /datum/map_template/shuttle/labour/delta + width = 9 + dwidth = 2 + height = 5 + +/obj/docking_port/stationary/laborcamp_home/kilo + roundstart_template = /datum/map_template/shuttle/labour/kilo diff --git a/code/modules/mining/lavaland/megafauna_loot.dm b/code/modules/mining/lavaland/megafauna_loot.dm index 1c0f040d963d62..7dabba56cd6a9f 100644 --- a/code/modules/mining/lavaland/megafauna_loot.dm +++ b/code/modules/mining/lavaland/megafauna_loot.dm @@ -730,9 +730,8 @@ consumer.set_species(/datum/species/skeleton) if(3) to_chat(user, span_danger("Power courses through you! You can now shift your form at will.")) - if(user.mind) - var/obj/effect/proc_holder/spell/targeted/shapeshift/dragon/dragon_shapeshift = new - user.mind.AddSpell(dragon_shapeshift) + var/datum/action/cooldown/spell/shapeshift/dragon/dragon_shapeshift = new(user.mind || user) + dragon_shapeshift.Grant(user) if(4) to_chat(user, span_danger("You feel like you could walk straight through lava now.")) ADD_TRAIT(user, TRAIT_LAVA_IMMUNE, type) diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index c3c0ec33b46f6a..628bc4f5dcb679 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -66,7 +66,7 @@ if(16) new /obj/item/immortality_talisman(src) if(17) - new /obj/item/book/granter/spell/summonitem(src) + new /obj/item/book/granter/action/spell/summonitem(src) if(18) new /obj/item/book_of_babel(src) if(19) @@ -97,7 +97,7 @@ if(2) new /obj/item/lava_staff(src) if(3) - new /obj/item/book/granter/spell/sacredflame(src) + new /obj/item/book/granter/action/spell/sacredflame(src) if(4) new /obj/item/dragons_blood(src) diff --git a/code/modules/mining/lavaland/tendril_loot.dm b/code/modules/mining/lavaland/tendril_loot.dm index 407c6cf5a9bf8a..cbfc8ecb545d13 100644 --- a/code/modules/mining/lavaland/tendril_loot.dm +++ b/code/modules/mining/lavaland/tendril_loot.dm @@ -605,7 +605,7 @@ body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS resistance_flags = FIRE_PROOF clothing_flags = THICKMATERIAL - allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/pickaxe, /obj/item/spear, /obj/item/organ/regenerative_core/legion, /obj/item/knife, /obj/item/kinetic_crusher, /obj/item/resonator, /obj/item/melee/cleaving_saw) + allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/pickaxe, /obj/item/spear, /obj/item/organ/internal/regenerative_core/legion, /obj/item/knife, /obj/item/kinetic_crusher, /obj/item/resonator, /obj/item/melee/cleaving_saw) /obj/item/clothing/suit/hooded/berserker/Initialize(mapload) . = ..() @@ -716,83 +716,74 @@ lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF custom_materials = null - var/obj/effect/proc_holder/scan/scan + var/datum/action/cooldown/scan/scan_ability /obj/item/clothing/glasses/godeye/Initialize(mapload) . = ..() - scan = new(src) + scan_ability = new(src) + +/obj/item/clothing/glasses/godeye/Destroy() + QDEL_NULL(scan_ability) + return ..() /obj/item/clothing/glasses/godeye/equipped(mob/living/user, slot) . = ..() if(ishuman(user) && slot == ITEM_SLOT_EYES) ADD_TRAIT(src, TRAIT_NODROP, EYE_OF_GOD_TRAIT) pain(user) - user.AddAbility(scan) + scan_ability.Grant(user) /obj/item/clothing/glasses/godeye/dropped(mob/living/user) . = ..() // Behead someone, their "glasses" drop on the floor // and thus, the god eye should no longer be sticky REMOVE_TRAIT(src, TRAIT_NODROP, EYE_OF_GOD_TRAIT) - user.RemoveAbility(scan) + scan_ability.Remove(user) /obj/item/clothing/glasses/godeye/proc/pain(mob/living/victim) to_chat(victim, span_userdanger("You experience blinding pain, as [src] burrows into your skull.")) victim.emote("scream") victim.flash_act() -/obj/effect/proc_holder/scan +/datum/action/cooldown/scan name = "Scan" desc = "Scan an enemy, to get their location and stagger them, increasing their time between attacks." - action_background_icon_state = "bg_clock" - action_icon = 'icons/mob/actions/actions_items.dmi' - action_icon_state = "scan" + background_icon_state = "bg_clock" + icon_icon = 'icons/mob/actions/actions_items.dmi' + button_icon_state = "scan" + + click_to_activate = TRUE + cooldown_time = 45 SECONDS ranged_mousepointer = 'icons/effects/mouse_pointers/scan_target.dmi' - var/cooldown_time = 45 SECONDS - COOLDOWN_DECLARE(scan_cooldown) -/obj/effect/proc_holder/scan/on_lose(mob/living/user) - remove_ranged_ability() +/datum/action/cooldown/scan/IsAvailable() + return ..() && isliving(owner) -/obj/effect/proc_holder/scan/Click(location, control, params) - . = ..() - if(!isliving(usr)) - return TRUE - var/mob/living/user = usr - fire(user) +/datum/action/cooldown/scan/Activate(atom/scanned) + StartCooldown(15 SECONDS) -/obj/effect/proc_holder/scan/fire(mob/living/carbon/user) - if(active) - remove_ranged_ability(span_notice("Your eye relaxes.")) - else - add_ranged_ability(user, span_notice("Your eye starts spinning fast. Left-click a creature to scan it!"), TRUE) + if(owner.stat != CONSCIOUS) + return FALSE + if(!isliving(scanned) || scanned == owner) + owner.balloon_alert(owner, "invalid scanned!") + return FALSE -/obj/effect/proc_holder/scan/InterceptClickOn(mob/living/caller, params, atom/target) - . = ..() - if(.) - return - if(ranged_ability_user.stat) - remove_ranged_ability() - return - if(!COOLDOWN_FINISHED(src, scan_cooldown)) - balloon_alert(ranged_ability_user, "not ready!") - return - if(!isliving(target) || target == ranged_ability_user) - balloon_alert(ranged_ability_user, "invalid target!") - return - var/mob/living/living_target = target - living_target.apply_status_effect(/datum/status_effect/stagger) - var/datum/status_effect/agent_pinpointer/scan_pinpointer = ranged_ability_user.apply_status_effect(/datum/status_effect/agent_pinpointer/scan) - scan_pinpointer.scan_target = living_target - living_target.set_timed_status_effect(100 SECONDS, /datum/status_effect/jitter, only_if_higher = TRUE) - to_chat(living_target, span_warning("You've been staggered!")) - living_target.add_filter("scan", 2, list("type" = "outline", "color" = COLOR_YELLOW, "size" = 1)) - addtimer(CALLBACK(living_target, /atom/.proc/remove_filter, "scan"), 30 SECONDS) - ranged_ability_user.playsound_local(get_turf(ranged_ability_user), 'sound/magic/smoke.ogg', 50, TRUE) - balloon_alert(ranged_ability_user, "[living_target] scanned") - COOLDOWN_START(src, scan_cooldown, cooldown_time) - addtimer(CALLBACK(src, /atom/.proc/balloon_alert, ranged_ability_user, "scan recharged"), cooldown_time) - remove_ranged_ability() + var/mob/living/living_owner = owner + var/mob/living/living_scanned = scanned + living_scanned.apply_status_effect(/datum/status_effect/stagger) + var/datum/status_effect/agent_pinpointer/scan_pinpointer = living_owner.apply_status_effect(/datum/status_effect/agent_pinpointer/scan) + scan_pinpointer.scan_target = living_scanned + + living_scanned.set_timed_status_effect(100 SECONDS, /datum/status_effect/jitter, only_if_higher = TRUE) + to_chat(living_scanned, span_warning("You've been staggered!")) + living_scanned.add_filter("scan", 2, list("type" = "outline", "color" = COLOR_YELLOW, "size" = 1)) + addtimer(CALLBACK(living_scanned, /atom/.proc/remove_filter, "scan"), 30 SECONDS) + + owner.playsound_local(get_turf(owner), 'sound/magic/smoke.ogg', 50, TRUE) + owner.balloon_alert(owner, "[living_scanned] scanned") + addtimer(CALLBACK(src, /atom/.proc/balloon_alert, owner, "scan recharged"), cooldown_time) + + StartCooldown() return TRUE /datum/status_effect/agent_pinpointer/scan diff --git a/code/modules/mining/machine_redemption.dm b/code/modules/mining/machine_redemption.dm index d535904af02ad9..4178d4446ab7de 100644 --- a/code/modules/mining/machine_redemption.dm +++ b/code/modules/mining/machine_redemption.dm @@ -250,13 +250,13 @@ var/datum/component/material_container/mat_container = materials.mat_container switch(action) if("Claim") - var/obj/item/card/id/I + var/obj/item/card/id/user_id_card if(isliving(usr)) - var/mob/living/L = usr - I = L.get_idcard(TRUE) + var/mob/living/user = usr + user_id_card = user.get_idcard(TRUE) if(points) - if(I) - I.mining_points += points + if(user_id_card) + user_id_card.mining_points += points points = 0 else to_chat(usr, span_warning("No valid ID detected.")) @@ -324,11 +324,11 @@ return var/alloy_id = params["id"] var/datum/design/alloy = stored_research.isDesignResearchedID(alloy_id) - var/obj/item/card/id/I + var/obj/item/card/id/user_id_card if(isliving(usr)) - var/mob/living/L = usr - I = L.get_idcard(TRUE) - if((check_access(I) || allowed(usr)) && alloy) + var/mob/living/user = usr + user_id_card = user.get_idcard(TRUE) + if((check_access(user_id_card) || allowed(usr)) && alloy) var/smelt_amount = can_smelt_alloy(alloy) var/desired = 0 if (params["sheets"]) @@ -338,6 +338,8 @@ if(!desired || QDELETED(usr) || QDELETED(src) || !usr.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) return var/amount = round(min(desired,50,smelt_amount)) + if(amount < 1) //no negative mats + return mat_container.use_materials(alloy.materials, amount) materials.silo_log(src, "released", -amount, "sheets", alloy.materials) var/output diff --git a/code/modules/mining/machine_silo.dm b/code/modules/mining/machine_silo.dm index 63864b5e9a2297..e4313ea35fc3a3 100644 --- a/code/modules/mining/machine_silo.dm +++ b/code/modules/mining/machine_silo.dm @@ -9,9 +9,12 @@ GLOBAL_LIST_EMPTY(silo_access_logs) density = TRUE circuit = /obj/item/circuitboard/machine/ore_silo - var/list/holds = list() - var/list/datum/component/remote_materials/connected = list() + /// The machine UI's page of logs showing ore history. var/log_page = 1 + /// List of all connected components that are on hold from accessing materials. + var/list/holds = list() + /// List of all components that are sharing ores with this silo. + var/list/datum/component/remote_materials/ore_connected_machines = list() /obj/machinery/ore_silo/Initialize(mapload) . = ..() @@ -36,11 +39,10 @@ GLOBAL_LIST_EMPTY(silo_access_logs) if (GLOB.ore_silo_default == src) GLOB.ore_silo_default = null - for(var/C in connected) - var/datum/component/remote_materials/mats = C + for(var/datum/component/remote_materials/mats as anything in ore_connected_machines) mats.disconnect_from(src) - connected = null + ore_connected_machines = null var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) materials.retrieve_all() @@ -112,14 +114,13 @@ GLOBAL_LIST_EMPTY(silo_access_logs) ui += "Nothing!" ui += "

Connected Machines:

" - for(var/C in connected) - var/datum/component/remote_materials/mats = C + for(var/datum/component/remote_materials/mats as anything in ore_connected_machines) var/atom/parent = mats.parent var/hold_key = "[get_area(parent)]/[mats.category]" ui += "Remove" ui += "[holds[hold_key] ? "Allow" : "Hold"]" ui += " [parent.name] in [get_area_name(parent, TRUE)]
" - if(!connected.len) + if(!ore_connected_machines.len) ui += "Nothing!" ui += "

Access Logs:

" @@ -153,10 +154,10 @@ GLOBAL_LIST_EMPTY(silo_access_logs) usr.set_machine(src) if(href_list["remove"]) - var/datum/component/remote_materials/mats = locate(href_list["remove"]) in connected + var/datum/component/remote_materials/mats = locate(href_list["remove"]) in ore_connected_machines if (mats) mats.disconnect_from(src) - connected -= mats + ore_connected_machines -= mats updateUsrDialog() return TRUE else if(href_list["hold1"]) diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index fbaa883b461067..67921c94e0b2d8 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -122,6 +122,26 @@ shuttleId = "mining_common" possible_destinations = "commonmining_home;lavaland_common_away;landing_zone_dock;mining_public" +/obj/docking_port/stationary/mining_home + name = "SS13: Mining Dock" + id = "mining_home" + roundstart_template = /datum/map_template/shuttle/mining/delta + width = 7 + dwidth = 3 + height = 5 + +/obj/docking_port/stationary/mining_home/kilo + roundstart_template = /datum/map_template/shuttle/mining/kilo + height = 10 + +/obj/docking_port/stationary/mining_home/common + name = "SS13: Common Mining Dock" + id = "commonmining_home" + roundstart_template = /datum/map_template/shuttle/mining_common/meta + +/obj/docking_port/stationary/mining_home/common/kilo + roundstart_template = /datum/map_template/shuttle/mining_common/kilo + /**********************Mining car (Crate like thing, not the rail car)**************************/ /obj/structure/closet/crate/miningcar diff --git a/code/modules/mob/dead/dead.dm b/code/modules/mob/dead/dead.dm index 04055c8ecd18a5..41bb077153bce5 100644 --- a/code/modules/mob/dead/dead.dm +++ b/code/modules/mob/dead/dead.dm @@ -55,7 +55,7 @@ INITIALIZE_IMMEDIATE(/mob/dead) /mob/dead/proc/server_hop() set category = "OOC" - set name = "Server Hop!" + set name = "Server Hop" set desc= "Jump to the other server" if(notransform) return diff --git a/code/modules/mob/dead/new_player/login.dm b/code/modules/mob/dead/new_player/login.dm index 5ec50107f57c25..08969aeef4ba36 100644 --- a/code/modules/mob/dead/new_player/login.dm +++ b/code/modules/mob/dead/new_player/login.dm @@ -10,6 +10,13 @@ mind.active = TRUE mind.set_current(src) + // Check if user should be added to interview queue + if (!client.holder && CONFIG_GET(flag/panic_bunker) && CONFIG_GET(flag/panic_bunker_interview) && !(client.ckey in GLOB.interviews.approved_ckeys)) + var/required_living_minutes = CONFIG_GET(number/panic_bunker_living) + var/living_minutes = client.get_exp_living(TRUE) + if (required_living_minutes >= living_minutes) + client.interviewee = TRUE + . = ..() if(!. || !client) return FALSE @@ -32,15 +39,15 @@ var/datum/asset/asset_datum = get_asset_datum(/datum/asset/simple/lobby) asset_datum.send(client) - // Check if user should be added to interview queue - if (!client.holder && CONFIG_GET(flag/panic_bunker) && CONFIG_GET(flag/panic_bunker_interview) && !(client.ckey in GLOB.interviews.approved_ckeys)) - var/required_living_minutes = CONFIG_GET(number/panic_bunker_living) - var/living_minutes = client.get_exp_living(TRUE) - if (required_living_minutes >= living_minutes) - client.interviewee = TRUE - register_for_interview() - return + // The parent call for Login() may do a bunch of stuff, like add verbs. + // Delaying the register_for_interview until the very end makes sure it can clean everything up + // and set the player's client up for interview. + if(client.interviewee) + register_for_interview() + return if(SSticker.current_state < GAME_STATE_SETTING_UP) var/tl = SSticker.GetTimeLeft() to_chat(src, "Please set up your character and select \"Ready\". The game will start [tl > 0 ? "in about [DisplayTimeText(tl)]" : "soon"].") + + diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index 045990a2d8a6dc..a05cf24d5b108c 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -439,5 +439,6 @@ if (I) I.ui_interact(src) - // Add verb for re-opening the interview panel, and re-init the verbs for the stat panel + // Add verb for re-opening the interview panel, fixing chat and re-init the verbs for the stat panel add_verb(src, /mob/dead/new_player/proc/open_interview) + add_verb(client, /client/verb/fix_tgui_panel) diff --git a/code/modules/mob/living/basic/farm_animals/cows.dm b/code/modules/mob/living/basic/farm_animals/cows.dm index 2f66d4601cbb9f..130a43e4342e48 100644 --- a/code/modules/mob/living/basic/farm_animals/cows.dm +++ b/code/modules/mob/living/basic/farm_animals/cows.dm @@ -50,7 +50,6 @@ AddComponent(/datum/component/tameable, food_types = list(/obj/item/food/grown/wheat), tame_chance = 25, bonus_tame_chance = 15, after_tame = CALLBACK(src, .proc/tamed)) /mob/living/basic/cow/proc/tamed(mob/living/tamer) - can_buckle = TRUE buckle_lying = 0 AddElement(/datum/element/ridable, /datum/component/riding/creature/cow) @@ -109,7 +108,7 @@ if(!stat && !user.combat_mode) to_chat(user, span_nicegreen("[src] whispers you some intense wisdoms and then disappears!")) user.mind?.adjust_experience(pick(GLOB.skill_types), 500) - do_smoke(DIAMOND_AREA(1), get_turf(src)) + do_smoke(1, holder = src, location = get_turf(src)) qdel(src) return return ..() diff --git a/code/modules/mob/living/bloodcrawl.dm b/code/modules/mob/living/bloodcrawl.dm deleted file mode 100644 index 395d6a73d9612e..00000000000000 --- a/code/modules/mob/living/bloodcrawl.dm +++ /dev/null @@ -1,160 +0,0 @@ -/mob/living/proc/phaseout(obj/effect/decal/cleanable/B) - if(iscarbon(src)) - var/mob/living/carbon/C = src - for(var/obj/item/I in C.held_items) - //TODO make it toggleable to either forcedrop the items, or deny - //entry when holding them - // literally only an option for carbons though - to_chat(C, span_warning("You may not hold items while blood crawling!")) - return FALSE - var/obj/item/bloodcrawl/B1 = new(C) - var/obj/item/bloodcrawl/B2 = new(C) - B1.icon_state = "bloodhand_left" - B2.icon_state = "bloodhand_right" - C.put_in_hands(B1) - C.put_in_hands(B2) - C.regenerate_icons() - - notransform = TRUE - INVOKE_ASYNC(src, .proc/bloodpool_sink, B) - - return TRUE - -/mob/living/proc/bloodpool_sink(obj/effect/decal/cleanable/B) - var/turf/mobloc = get_turf(loc) - - visible_message(span_warning("[src] sinks into the pool of blood!")) - playsound(get_turf(src), 'sound/magic/enter_blood.ogg', 50, TRUE, -1) - // Extinguish, unbuckle, stop being pulled, set our location into the - // dummy object - var/obj/effect/dummy/phased_mob/holder = new /obj/effect/dummy/phased_mob(mobloc) - extinguish_mob() - - // Keep a reference to whatever we're pulling, because forceMove() - // makes us stop pulling - var/pullee = pulling - - holder = holder - forceMove(holder) - - // if we're not pulling anyone, or we can't eat anyone - if(!pullee || !HAS_TRAIT(src, TRAIT_BLOODCRAWL_EAT)) - notransform = FALSE - return - - // if the thing we're pulling isn't alive - if(!isliving(pullee)) - notransform = FALSE - return - - var/mob/living/victim = pullee - var/kidnapped = FALSE - - if(victim.stat == CONSCIOUS) - visible_message(span_warning("[victim] kicks free of the blood pool just before entering it!"), null, span_notice("You hear splashing and struggling.")) - else if(victim.reagents?.has_reagent(/datum/reagent/consumable/ethanol/demonsblood, needs_metabolizing = TRUE)) - visible_message(span_warning("Something prevents [victim] from entering the pool!"), span_warning("A strange force is blocking [victim] from entering!"), span_notice("You hear a splash and a thud.")) - else - victim.forceMove(src) - victim.emote("scream") - visible_message(span_warning("[src] drags [victim] into the pool of blood!"), null, span_notice("You hear a splash.")) - kidnapped = TRUE - - if(kidnapped) - var/success = bloodcrawl_consume(victim) - if(!success) - to_chat(src, span_danger("You happily devour... nothing? Your meal vanished at some point!")) - - notransform = FALSE - return TRUE - -/mob/living/proc/bloodcrawl_consume(mob/living/victim) - to_chat(src, span_danger("You begin to feast on [victim]... You can not move while you are doing this.")) - - var/sound - if(istype(src, /mob/living/simple_animal/hostile/imp/slaughter)) - var/mob/living/simple_animal/hostile/imp/slaughter/SD = src - sound = SD.feast_sound - else - sound = 'sound/magic/demon_consume.ogg' - - for(var/i in 1 to 3) - playsound(get_turf(src),sound, 50, TRUE) - sleep(30) - - if(!victim) - return FALSE - - if(victim.reagents?.has_reagent(/datum/reagent/consumable/ethanol/devilskiss, needs_metabolizing = TRUE)) - to_chat(src, span_warning("AAH! THEIR FLESH! IT BURNS!")) - adjustBruteLoss(25) //I can't use adjustHealth() here because bloodcrawl affects /mob/living and adjustHealth() only affects simple mobs - var/found_bloodpool = FALSE - for(var/obj/effect/decal/cleanable/target in range(1,get_turf(victim))) - if(target.can_bloodcrawl_in()) - victim.forceMove(get_turf(target)) - victim.visible_message(span_warning("[target] violently expels [victim]!")) - victim.exit_blood_effect(target) - found_bloodpool = TRUE - break - - if(!found_bloodpool) - // Fuck it, just eject them, thanks to some split second cleaning - victim.forceMove(get_turf(victim)) - victim.visible_message(span_warning("[victim] appears from nowhere, covered in blood!")) - victim.exit_blood_effect() - return TRUE - - to_chat(src, span_danger("You devour [victim]. Your health is fully restored.")) - revive(full_heal = TRUE, admin_revive = FALSE) - - // No defib possible after laughter - victim.adjustBruteLoss(1000) - victim.death() - bloodcrawl_swallow(victim) - return TRUE - -/mob/living/proc/bloodcrawl_swallow(mob/living/victim) - qdel(victim) - -/obj/item/bloodcrawl - name = "blood crawl" - desc = "You are unable to hold anything while in this form." - icon = 'icons/effects/blood.dmi' - item_flags = ABSTRACT | DROPDEL - -/obj/item/bloodcrawl/Initialize(mapload) - . = ..() - ADD_TRAIT(src, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT) - -/mob/living/proc/exit_blood_effect(obj/effect/decal/cleanable/B) - playsound(get_turf(src), 'sound/magic/exit_blood.ogg', 50, TRUE, -1) - //Makes the mob have the color of the blood pool it came out of - var/newcolor = rgb(149, 10, 10) - if(istype(B, /obj/effect/decal/cleanable/xenoblood)) - newcolor = rgb(43, 186, 0) - add_atom_colour(newcolor, TEMPORARY_COLOUR_PRIORITY) - // but only for a few seconds - addtimer(CALLBACK(src, /atom/.proc/remove_atom_colour, TEMPORARY_COLOUR_PRIORITY, newcolor), 6 SECONDS) - -/mob/living/proc/phasein(atom/target, forced = FALSE) - if(!forced) - if(notransform) - to_chat(src, span_warning("Finish eating first!")) - return FALSE - target.visible_message(span_warning("[target] starts to bubble...")) - if(!do_after(src, 20, target = target)) - return FALSE - forceMove(get_turf(target)) - client.eye = src - SEND_SIGNAL(src, COMSIG_LIVING_AFTERPHASEIN, target) - visible_message(span_boldwarning("[src] rises out of the pool of blood!")) - exit_blood_effect(target) - return TRUE - -/mob/living/carbon/phasein(atom/target, forced = FALSE) - . = ..() - if(!.) - return - for(var/obj/item/bloodcrawl/blood_hand in held_items) - blood_hand.flags_1 = null - qdel(blood_hand) diff --git a/code/modules/mob/living/brain/brain.dm b/code/modules/mob/living/brain/brain.dm index aa13a0f59a3729..9be5ba567433ab 100644 --- a/code/modules/mob/living/brain/brain.dm +++ b/code/modules/mob/living/brain/brain.dm @@ -86,8 +86,6 @@ var/obj/vehicle/sealed/mecha/M = container.mecha if(M.mouse_pointer) client.mouse_pointer_icon = M.mouse_pointer - if (client && ranged_ability?.ranged_mousepointer) - client.mouse_pointer_icon = ranged_ability.ranged_mousepointer /mob/living/brain/proc/get_traumas() . = list() diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index 22d263e7c63b0a..3a78e70ab362e3 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -117,8 +117,10 @@ Des: Removes all infected images from the alien. return TRUE /mob/living/carbon/alien/proc/alien_evolve(mob/living/carbon/alien/new_xeno) - to_chat(src, span_noticealien("You begin to evolve!")) - visible_message(span_alertalien("[src] begins to twist and contort!")) + visible_message( + span_alertalien("[src] begins to twist and contort!"), + span_noticealien("You begin to evolve!"), + ) new_xeno.setDir(dir) if(numba && unique_name) new_xeno.numba = numba diff --git a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm index 268f0664229fe6..1ff88c419d048d 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm @@ -6,341 +6,380 @@ These are general powers. Specific powers are stored under the appropriate alien Doesn't work on other aliens/AI.*/ -/obj/effect/proc_holder/alien +/datum/action/cooldown/alien name = "Alien Power" panel = "Alien" + background_icon_state = "bg_alien" + icon_icon = 'icons/mob/actions/actions_xeno.dmi' + button_icon_state = "spell_default" + check_flags = AB_CHECK_CONSCIOUS + /// How much plasma this action uses. var/plasma_cost = 0 - var/check_turf = FALSE - has_action = TRUE - base_action = /datum/action/spell_action/alien - action_icon = 'icons/mob/actions/actions_xeno.dmi' - action_icon_state = "spell_default" - action_background_icon_state = "bg_alien" - -/obj/effect/proc_holder/alien/Click() - if(!iscarbon(usr)) - return 1 - var/mob/living/carbon/user = usr - if(cost_check(check_turf,user)) - if(fire(user) && user) // Second check to prevent runtimes when evolving - user.adjustPlasma(-plasma_cost) - return 1 - -/obj/effect/proc_holder/alien/on_gain(mob/living/carbon/user) - return - -/obj/effect/proc_holder/alien/on_lose(mob/living/carbon/user) - return - -/obj/effect/proc_holder/alien/fire(mob/living/carbon/user) - return 1 - -/obj/effect/proc_holder/alien/get_panel_text() + +/datum/action/cooldown/alien/IsAvailable() . = ..() - if(plasma_cost > 0) - return "[plasma_cost]" + if(!.) + return FALSE + if(!iscarbon(owner)) + return FALSE + var/mob/living/carbon/carbon_owner = owner + if(carbon_owner.getPlasma() < plasma_cost) + return FALSE -/obj/effect/proc_holder/alien/proc/cost_check(check_turf = FALSE, mob/living/carbon/user, silent = FALSE) - if(user.stat) - if(!silent) - to_chat(user, span_noticealien("You must be conscious to do this.")) + return TRUE + +/datum/action/cooldown/alien/PreActivate(atom/target) + // Parent calls Activate(), so if parent returns TRUE, + // it means the activation happened successfuly by this point + . = ..() + if(!.) return FALSE - if(user.getPlasma() < plasma_cost) - if(!silent) - to_chat(user, span_noticealien("Not enough plasma stored.")) + // Xeno actions like "evolve" may result in our action (or our alien) being deleted + // In that case, we can just exit now as a "success" + if(QDELETED(src) || QDELETED(owner)) + return TRUE + + var/mob/living/carbon/carbon_owner = owner + carbon_owner.adjustPlasma(-plasma_cost) + // It'd be really annoying if click-to-fire actions stayed active, + // even if our plasma amount went under the required amount. + if(click_to_activate && carbon_owner.getPlasma() < plasma_cost) + unset_click_ability(owner, refund_cooldown = FALSE) + + return TRUE + +/datum/action/cooldown/alien/set_statpanel_format() + . = ..() + if(!islist(.)) + return + + .[PANEL_DISPLAY_STATUS] = "PLASMA - [plasma_cost]" + +/datum/action/cooldown/alien/make_structure + /// The type of structure the action makes on use + var/obj/structure/made_structure_type + +/datum/action/cooldown/alien/make_structure/IsAvailable() + . = ..() + if(!.) return FALSE - if(check_turf && (!isturf(user.loc) || isspaceturf(user.loc))) - if(!silent) - to_chat(user, span_noticealien("Bad place for a garden!")) + if(!isturf(owner.loc) || isspaceturf(owner.loc)) return FALSE + return TRUE -/obj/effect/proc_holder/alien/proc/check_vent_block(mob/living/user) - var/obj/machinery/atmospherics/components/unary/atmos_thing = locate() in user.loc +/datum/action/cooldown/alien/make_structure/PreActivate(atom/target) + if(!check_for_duplicate()) + return FALSE + + if(!check_for_vents()) + return FALSE + + return ..() + +/datum/action/cooldown/alien/make_structure/Activate(atom/target) + new made_structure_type(owner.loc) + return TRUE + +/// Checks if there's a duplicate structure in the owner's turf +/datum/action/cooldown/alien/make_structure/proc/check_for_duplicate() + var/obj/structure/existing_thing = locate(made_structure_type) in owner.loc + if(existing_thing) + to_chat(owner, span_warning("There is already \a [existing_thing] here!")) + return FALSE + + return TRUE + +/// Checks if there's an atmos machine (vent) in the owner's turf +/datum/action/cooldown/alien/make_structure/proc/check_for_vents() + var/obj/machinery/atmospherics/components/unary/atmos_thing = locate() in owner.loc if(atmos_thing) - var/rusure = tgui_alert(user, "Laying eggs and shaping resin here would block access to [atmos_thing]. Do you want to continue?", "Blocking Atmospheric Component", list("Yes", "No")) - if(rusure != "Yes") + var/are_you_sure = tgui_alert(owner, "Laying eggs and shaping resin here would block access to [atmos_thing]. Do you want to continue?", "Blocking Atmospheric Component", list("Yes", "No")) + if(are_you_sure != "Yes") return FALSE + if(QDELETED(src) || QDELETED(owner) || !check_for_duplicate()) + return FALSE + return TRUE -/obj/effect/proc_holder/alien/plant +/datum/action/cooldown/alien/make_structure/plant_weeds name = "Plant Weeds" desc = "Plants some alien weeds." + button_icon_state = "alien_plant" plasma_cost = 50 - check_turf = TRUE - action_icon_state = "alien_plant" + made_structure_type = /obj/structure/alien/weeds/node -/obj/effect/proc_holder/alien/plant/fire(mob/living/carbon/user) - if(locate(/obj/structure/alien/weeds/node) in get_turf(user)) - to_chat(user, span_warning("There's already a weed node here!")) - return FALSE - user.visible_message(span_alertalien("[user] plants some alien weeds!")) - new/obj/structure/alien/weeds/node(user.loc) - return TRUE +/datum/action/cooldown/alien/make_structure/plant_weeds/Activate(atom/target) + owner.visible_message(span_alertalien("[owner] plants some alien weeds!")) + return ..() -/obj/effect/proc_holder/alien/whisper +/datum/action/cooldown/alien/whisper name = "Whisper" desc = "Whisper to someone." + button_icon_state = "alien_whisper" plasma_cost = 10 - action_icon_state = "alien_whisper" -/obj/effect/proc_holder/alien/whisper/fire(mob/living/carbon/user) +/datum/action/cooldown/alien/whisper/Activate(atom/target) var/list/possible_recipients = list() - for(var/mob/living/recipient in oview(user)) - possible_recipients.Add(recipient) + for(var/mob/living/recipient in oview(owner)) + possible_recipients += recipient + if(!length(possible_recipients)) - to_chat(user, span_noticealien("There's no one around to whisper to.")) + to_chat(owner, span_noticealien("There's no one around to whisper to.")) return FALSE - var/mob/living/chosen_recipient = tgui_input_list(user, "Select whisper recipient", "Whisper", sort_names(possible_recipients)) - if(isnull(chosen_recipient)) - return FALSE - if(chosen_recipient.can_block_magic(MAGIC_RESISTANCE_MIND, charge_cost = 0)) - to_chat(user, span_warning("As you reach into [chosen_recipient]'s mind, you are stopped by a mental blockage. It seems you've been foiled.")) + + var/mob/living/chosen_recipient = tgui_input_list(owner, "Select whisper recipient", "Whisper", sort_names(possible_recipients)) + if(!chosen_recipient) return FALSE - var/msg = tgui_input_text(user, title = "Alien Whisper") - if(isnull(msg)) + + var/to_whisper = tgui_input_text(owner, title = "Alien Whisper") + if(QDELETED(chosen_recipient) || QDELETED(src) || QDELETED(owner) || !IsAvailable() || !to_whisper) return FALSE if(chosen_recipient.can_block_magic(MAGIC_RESISTANCE_MIND, charge_cost = 0)) - to_chat(user, span_warning("As you reach into [chosen_recipient]'s mind, you are stopped by a mental blockage. It seems you've been foiled.")) - return - log_directed_talk(user, chosen_recipient, msg, LOG_SAY, tag="alien whisper") - to_chat(chosen_recipient, "[span_noticealien("You hear a strange, alien voice in your head...")][msg]") - to_chat(user, span_noticealien("You said: \"[msg]\" to [chosen_recipient]")) - for(var/ded in GLOB.dead_mob_list) - if(!isobserver(ded)) + to_chat(owner, span_warning("As you reach into [chosen_recipient]'s mind, you are stopped by a mental blockage. It seems you've been foiled.")) + return FALSE + + log_directed_talk(owner, chosen_recipient, to_whisper, LOG_SAY, tag = "alien whisper") + to_chat(chosen_recipient, "[span_noticealien("You hear a strange, alien voice in your head...")][to_whisper]") + to_chat(owner, span_noticealien("You said: \"[to_whisper]\" to [chosen_recipient]")) + for(var/mob/dead_mob as anything in GLOB.dead_mob_list) + if(!isobserver(dead_mob)) continue - var/follow_link_user = FOLLOW_LINK(ded, user) - var/follow_link_whispee = FOLLOW_LINK(ded, chosen_recipient) - to_chat(ded, "[follow_link_user] [span_name("[user]")] [span_alertalien("Alien Whisper --> ")] [follow_link_whispee] [span_name("[chosen_recipient]")] [span_noticealien("[msg]")]") + var/follow_link_user = FOLLOW_LINK(dead_mob, owner) + var/follow_link_whispee = FOLLOW_LINK(dead_mob, chosen_recipient) + to_chat(dead_mob, "[follow_link_user] [span_name("[owner]")] [span_alertalien("Alien Whisper --> ")] [follow_link_whispee] [span_name("[chosen_recipient]")] [span_noticealien("[to_whisper]")]") + return TRUE -/obj/effect/proc_holder/alien/transfer +/datum/action/cooldown/alien/transfer name = "Transfer Plasma" desc = "Transfer Plasma to another alien." plasma_cost = 0 - action_icon_state = "alien_transfer" + button_icon_state = "alien_transfer" -/obj/effect/proc_holder/alien/transfer/fire(mob/living/carbon/user) +/datum/action/cooldown/alien/transfer/Activate(atom/target) + var/mob/living/carbon/carbon_owner = owner var/list/mob/living/carbon/aliens_around = list() - for(var/mob/living/carbon/alien in oview(user)) - if(isalien(alien)) - aliens_around.Add(alien) + for(var/mob/living/carbon/alien in view(owner)) + if(alien.getPlasma() == -1 || alien == owner) + continue + aliens_around += alien + if(!length(aliens_around)) - to_chat(user, span_noticealien("There are no other aliens around.")) + to_chat(owner, span_noticealien("There are no other aliens around.")) + return FALSE + + var/mob/living/carbon/donation_target = tgui_input_list(owner, "Target to transfer to", "Plasma Donation", sort_names(aliens_around)) + if(!donation_target) return FALSE - var/mob/living/carbon/donation_target = tgui_input_list(user, "Target to transfer to", "Plasma Donation", sort_names(aliens_around)) - if(isnull(donation_target)) + + var/amount = tgui_input_number(owner, "Amount", "Transfer Plasma to [donation_target]", max_value = carbon_owner.getPlasma()) + if(QDELETED(donation_target) || QDELETED(src) || QDELETED(owner) || !IsAvailable() || isnull(amount) || amount <= 0) return FALSE - var/amount = tgui_input_number(user, "Amount", "Transfer Plasma to [donation_target]", max_value = user.getPlasma()) - if(!amount || QDELETED(user) || QDELETED(donation_target)) + + if(get_dist(owner, donation_target) > 1) + to_chat(owner, span_noticealien("You need to be closer!")) return FALSE - if (get_dist(user, donation_target) <= 1) - donation_target.adjustPlasma(amount) - user.adjustPlasma(-amount) - to_chat(donation_target, span_noticealien("[user] has transferred [amount] plasma to you.")) - to_chat(user, span_noticealien("You transfer [amount] plasma to [donation_target].")) - else - to_chat(user, span_noticealien("You need to be closer!")) + donation_target.adjustPlasma(amount) + carbon_owner.adjustPlasma(-amount) -/obj/effect/proc_holder/alien/acid + to_chat(donation_target, span_noticealien("[owner] has transferred [amount] plasma to you.")) + to_chat(owner, span_noticealien("You transfer [amount] plasma to [donation_target].")) + return TRUE + +/datum/action/cooldown/alien/acid + click_to_activate = TRUE + unset_after_click = FALSE + +/datum/action/cooldown/alien/acid/corrosion name = "Corrosive Acid" desc = "Drench an object in acid, destroying it over time." + button_icon_state = "alien_acid" plasma_cost = 200 - action_icon_state = "alien_acid" -/obj/effect/proc_holder/alien/acid/on_gain(mob/living/carbon/user) - add_verb(user, /mob/living/carbon/proc/corrosive_acid) +/datum/action/cooldown/alien/acid/corrosion/set_click_ability(mob/on_who) + . = ..() + if(!.) + return -/obj/effect/proc_holder/alien/acid/on_lose(mob/living/carbon/user) - remove_verb(user, /mob/living/carbon/proc/corrosive_acid) + to_chat(on_who, span_noticealien("You prepare to vomit acid. Click a target to acid it!")) + on_who.update_icons() -/obj/effect/proc_holder/alien/acid/proc/corrode(atom/target, mob/living/carbon/user = usr) - if(!(target in oview(1,user))) - to_chat(src, span_noticealien("[target] is too far away.")) - return FALSE - if(target.acid_act(200, 1000)) - user.visible_message(span_alertalien("[user] vomits globs of vile stuff all over [target]. It begins to sizzle and melt under the bubbling mess of acid!")) - return TRUE - else - to_chat(user, span_noticealien("You cannot dissolve this object.")) - return FALSE +/datum/action/cooldown/alien/acid/corrosion/unset_click_ability(mob/on_who, refund_cooldown = TRUE) + . = ..() + if(!.) + return -/obj/effect/proc_holder/alien/acid/fire(mob/living/carbon/alien/user) - var/list/nearby_targets = list() - for(var/atom/target in oview(1, user)) - nearby_targets.Add(target) - if(!length(nearby_targets)) - to_chat(user, span_noticealien("There's nothing to corrode.")) - return FALSE - var/atom/dissolve_target = tgui_input_list(user, "Select a target to dissolve", "Dissolve", nearby_targets) - if(isnull(dissolve_target)) - return FALSE - if(QDELETED(dissolve_target) || user.incapacitated()) + if(refund_cooldown) + to_chat(on_who, span_noticealien("You empty your corrosive acid glands.")) + on_who.update_icons() + +/datum/action/cooldown/alien/acid/corrosion/PreActivate(atom/target) + if(get_dist(owner, target) > 1) return FALSE - return corrode(dissolve_target, user) + return ..() -/mob/living/carbon/proc/corrosive_acid(O as obj|turf in oview(1)) // right click menu verb ugh - set name = "Corrosive Acid" +/datum/action/cooldown/alien/acid/corrosion/Activate(atom/target) + if(!target.acid_act(200, 1000)) + to_chat(owner, span_noticealien("You cannot dissolve this object.")) + return FALSE - if(!iscarbon(usr)) - return - var/mob/living/carbon/user = usr - var/obj/effect/proc_holder/alien/acid/A = locate() in user.abilities - if(!A) - return - if(user.getPlasma() > A.plasma_cost && A.corrode(O)) - user.adjustPlasma(-A.plasma_cost) + owner.visible_message( + span_alertalien("[owner] vomits globs of vile stuff all over [target]. It begins to sizzle and melt under the bubbling mess of acid!"), + span_noticealien("You vomit globs of acid over [target]. It begins to sizzle and melt."), + ) + return TRUE -/obj/effect/proc_holder/alien/neurotoxin +/datum/action/cooldown/alien/acid/neurotoxin name = "Spit Neurotoxin" desc = "Spits neurotoxin at someone, paralyzing them for a short time." - action_icon_state = "alien_neurotoxin_0" - active = FALSE - -/obj/effect/proc_holder/alien/neurotoxin/fire(mob/living/carbon/user) - var/message - if(active) - message = span_notice("You empty your neurotoxin gland.") - remove_ranged_ability(message) - else - message = span_notice("You prepare your neurotoxin gland. Left-click to fire at a target!") - add_ranged_ability(user, message, TRUE) + button_icon_state = "alien_neurotoxin_0" + plasma_cost = 50 -/obj/effect/proc_holder/alien/neurotoxin/update_icon() - action.button_icon_state = "alien_neurotoxin_[active]" - action.UpdateButtons() - return ..() +/datum/action/cooldown/alien/acid/neurotoxin/IsAvailable() + return ..() && isturf(owner.loc) -/obj/effect/proc_holder/alien/neurotoxin/InterceptClickOn(mob/living/caller, params, atom/target) +/datum/action/cooldown/alien/acid/neurotoxin/set_click_ability(mob/on_who) . = ..() - if(.) + if(!.) + return + + to_chat(on_who, span_notice("You prepare your neurotoxin gland. Left-click to fire at a target!")) + + button_icon_state = "alien_neurotoxin_1" + UpdateButtons() + on_who.update_icons() + +/datum/action/cooldown/alien/acid/neurotoxin/unset_click_ability(mob/on_who, refund_cooldown = TRUE) + . = ..() + if(!.) return - var/p_cost = 50 - if(!iscarbon(ranged_ability_user) || ranged_ability_user.stat) - remove_ranged_ability() - return FALSE - var/mob/living/carbon/user = ranged_ability_user + if(refund_cooldown) + to_chat(on_who, span_notice("You empty your neurotoxin gland.")) - if(user.getPlasma() < p_cost) - to_chat(user, span_warning("You need at least [p_cost] plasma to spit.")) - remove_ranged_ability() + button_icon_state = "alien_neurotoxin_0" + UpdateButtons() + on_who.update_icons() + +/datum/action/cooldown/alien/acid/neurotoxin/InterceptClickOn(mob/living/caller, params, atom/target) + . = ..() + if(!.) + unset_click_ability(caller, refund_cooldown = FALSE) return FALSE - var/turf/T = user.loc - var/turf/U = get_step(user, user.dir) // Get the tile infront of the move, based on their direction - if(!isturf(U) || !isturf(T)) + // We do this in InterceptClickOn() instead of Activate() + // because we use the click parameters for aiming the projectile + // (or something like that) + var/turf/user_turf = caller.loc + var/turf/target_turf = get_step(caller, target.dir) // Get the tile infront of the move, based on their direction + if(!isturf(target_turf)) return FALSE var/modifiers = params2list(params) - user.visible_message(span_danger("[user] spits neurotoxin!"), span_alertalien("You spit neurotoxin.")) - var/obj/projectile/neurotoxin/neurotoxin = new /obj/projectile/neurotoxin(user.loc) - neurotoxin.preparePixelProjectile(target, user, modifiers) - neurotoxin.firer = user + caller.visible_message( + span_danger("[caller] spits neurotoxin!"), + span_alertalien("You spit neurotoxin."), + ) + var/obj/projectile/neurotoxin/neurotoxin = new /obj/projectile/neurotoxin(caller.loc) + neurotoxin.preparePixelProjectile(target, caller, modifiers) + neurotoxin.firer = caller neurotoxin.fire() - user.newtonian_move(get_dir(U, T)) - user.adjustPlasma(-p_cost) - + caller.newtonian_move(get_dir(target_turf, user_turf)) return TRUE -/obj/effect/proc_holder/alien/neurotoxin/on_lose(mob/living/carbon/user) - remove_ranged_ability() - -/obj/effect/proc_holder/alien/neurotoxin/add_ranged_ability(mob/living/user,msg,forced) - ..() - if(isalienadult(user)) - var/mob/living/carbon/alien/humanoid/A = user - A.drooling = 1 - A.update_icons() - -/obj/effect/proc_holder/alien/neurotoxin/remove_ranged_ability(msg) - if(isalienadult(ranged_ability_user)) - var/mob/living/carbon/alien/humanoid/A = ranged_ability_user - A.drooling = 0 - A.update_icons() - ..() +// Has to return TRUE, otherwise is skipped. +/datum/action/cooldown/alien/acid/neurotoxin/Activate(atom/target) + return TRUE -/obj/effect/proc_holder/alien/resin +/datum/action/cooldown/alien/make_structure/resin name = "Secrete Resin" desc = "Secrete tough malleable resin." + button_icon_state = "alien_resin" plasma_cost = 55 - check_turf = TRUE - var/list/structures = list( + /// A list of all structures we can make. + var/static/list/structures = list( "resin wall" = /obj/structure/alien/resin/wall, "resin membrane" = /obj/structure/alien/resin/membrane, - "resin nest" = /obj/structure/bed/nest) + "resin nest" = /obj/structure/bed/nest, + ) + +// Snowflake to check for multiple types of alien resin structures +/datum/action/cooldown/alien/make_structure/resin/check_for_duplicate() + for(var/blocker_name in structures) + var/obj/structure/blocker_type = structures[blocker_name] + if(locate(blocker_type) in owner.loc) + to_chat(owner, span_warning("There is already a resin structure there!")) + return FALSE - action_icon_state = "alien_resin" + return TRUE -/obj/effect/proc_holder/alien/resin/fire(mob/living/carbon/user) - if(locate(/obj/structure/alien/resin) in user.loc) - to_chat(user, span_warning("There is already a resin structure there!")) +/datum/action/cooldown/alien/make_structure/resin/Activate(atom/target) + var/choice = tgui_input_list(owner, "Select a shape to build", "Resin building", structures) + if(isnull(choice) || QDELETED(src) || QDELETED(owner) || !check_for_duplicate() || !IsAvailable()) return FALSE - if(!check_vent_block(user)) + var/obj/structure/choice_path = structures[choice] + if(!ispath(choice_path)) return FALSE - var/choice = tgui_input_list(user, "Select a shape to build", "Resin building", structures) - if(isnull(choice)) - return FALSE - if(isnull(structures[choice])) - return FALSE - if (!cost_check(check_turf,user)) - return FALSE - to_chat(user, span_notice("You shape a [choice].")) - user.visible_message(span_notice("[user] vomits up a thick purple substance and begins to shape it.")) + owner.visible_message( + span_notice("[owner] vomits up a thick purple substance and begins to shape it."), + span_notice("You shape a [choice] out of resin."), + ) - choice = structures[choice] - new choice(user.loc) + new choice_path(owner.loc) return TRUE -/obj/effect/proc_holder/alien/sneak +/datum/action/cooldown/alien/sneak name = "Sneak" desc = "Blend into the shadows to stalk your prey." - active = 0 + button_icon_state = "alien_sneak" + /// The alpha we go to when sneaking. + var/sneak_alpha = 75 + +/datum/action/cooldown/alien/sneak/Remove(mob/living/remove_from) + if(HAS_TRAIT(remove_from, TRAIT_ALIEN_SNEAK)) + remove_from.alpha = initial(remove_from.alpha) + REMOVE_TRAIT(remove_from, TRAIT_ALIEN_SNEAK, name) - action_icon_state = "alien_sneak" + return ..() + +/datum/action/cooldown/alien/sneak/Activate(atom/target) + if(HAS_TRAIT(owner, TRAIT_ALIEN_SNEAK)) + // It's safest to go to the initial alpha of the mob. + // Otherwise we get permanent invisbility exploits. + owner.alpha = initial(owner.alpha) + to_chat(owner, span_noticealien("You reveal yourself!")) + REMOVE_TRAIT(owner, TRAIT_ALIEN_SNEAK, name) -/obj/effect/proc_holder/alien/sneak/fire(mob/living/carbon/alien/humanoid/user) - if(!active) - user.alpha = 75 //Still easy to see in lit areas with bright tiles, almost invisible on resin. - user.sneaking = 1 - active = 1 - to_chat(user, span_noticealien("You blend into the shadows...")) else - user.alpha = initial(user.alpha) - user.sneaking = 0 - active = 0 - to_chat(user, span_noticealien("You reveal yourself!")) + owner.alpha = sneak_alpha + to_chat(owner, span_noticealien("You blend into the shadows...")) + ADD_TRAIT(owner, TRAIT_ALIEN_SNEAK, name) + return TRUE +/// Gets the plasma level of this carbon's plasma vessel, or -1 if they don't have one /mob/living/carbon/proc/getPlasma() var/obj/item/organ/internal/alien/plasmavessel/vessel = getorgan(/obj/item/organ/internal/alien/plasmavessel) if(!vessel) - return 0 - return vessel.storedPlasma - + return -1 + return vessel.stored_plasma +/// Adjusts the plasma level of the carbon's plasma vessel if they have one /mob/living/carbon/proc/adjustPlasma(amount) var/obj/item/organ/internal/alien/plasmavessel/vessel = getorgan(/obj/item/organ/internal/alien/plasmavessel) if(!vessel) return FALSE - vessel.storedPlasma = max(vessel.storedPlasma + amount,0) - vessel.storedPlasma = min(vessel.storedPlasma, vessel.max_plasma) //upper limit of max_plasma, lower limit of 0 - for(var/X in abilities) - var/obj/effect/proc_holder/alien/APH = X - if(APH.has_action) - APH.action.UpdateButtons() + vessel.stored_plasma = max(vessel.stored_plasma + amount,0) + vessel.stored_plasma = min(vessel.stored_plasma, vessel.max_plasma) //upper limit of max_plasma, lower limit of 0 + for(var/datum/action/cooldown/alien/ability in actions) + ability.UpdateButtons() return TRUE /mob/living/carbon/alien/adjustPlasma(amount) . = ..() updatePlasmaDisplay() - -/mob/living/carbon/proc/usePlasma(amount) - if(getPlasma() >= amount) - adjustPlasma(-amount) - return TRUE - return FALSE diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm index ba7a76c8b0a37b..7d92ace5be285e 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm @@ -6,38 +6,45 @@ icon_state = "aliend" /mob/living/carbon/alien/humanoid/drone/Initialize(mapload) - AddAbility(new/obj/effect/proc_holder/alien/evolve(null)) - . = ..() + var/datum/action/cooldown/alien/evolve_to_praetorian/evolution = new(src) + evolution.Grant(src) + return ..() /mob/living/carbon/alien/humanoid/drone/create_internal_organs() internal_organs += new /obj/item/organ/internal/alien/plasmavessel/large internal_organs += new /obj/item/organ/internal/alien/resinspinner internal_organs += new /obj/item/organ/internal/alien/acid - ..() + return ..() -/obj/effect/proc_holder/alien/evolve +/datum/action/cooldown/alien/evolve_to_praetorian name = "Evolve to Praetorian" desc = "Praetorian" + button_icon_state = "alien_evolve_drone" plasma_cost = 500 - action_icon_state = "alien_evolve_drone" - -/obj/effect/proc_holder/alien/evolve/fire(mob/living/carbon/alien/humanoid/user) - var/obj/item/organ/internal/alien/hivenode/node = user.getorgan(/obj/item/organ/internal/alien/hivenode) - if(!node) //Players are Murphy's Law. We may not expect there to ever be a living xeno with no hivenode, but they _WILL_ make it happen. - to_chat(user, span_danger("Without the hivemind, you can't possibly hold the responsibility of leadership!")) +/datum/action/cooldown/alien/evolve_to_praetorian/IsAvailable() + . = ..() + if(!.) return FALSE - if(node.recent_queen_death) - to_chat(user, span_danger("Your thoughts are still too scattered to take up the position of leadership.")) + + if(!isturf(owner.loc)) return FALSE - if(!isturf(user.loc)) - to_chat(user, span_warning("You can't evolve here!")) + if(get_alien_type(/mob/living/carbon/alien/humanoid/royal)) return FALSE - if(!get_alien_type(/mob/living/carbon/alien/humanoid/royal)) - var/mob/living/carbon/alien/humanoid/royal/praetorian/new_xeno = new (user.loc) - user.alien_evolve(new_xeno) - return TRUE - else - to_chat(user, span_warning("We already have a living royal!")) + + var/mob/living/carbon/alien/humanoid/royal/evolver = owner + var/obj/item/organ/internal/alien/hivenode/node = evolver.getorgan(/obj/item/organ/internal/alien/hivenode) + // Players are Murphy's Law. We may not expect + // there to ever be a living xeno with no hivenode, + // but they _WILL_ make it happen. + if(!node || node.recent_queen_death) return FALSE + + return TRUE + +/datum/action/cooldown/alien/evolve_to_praetorian/Activate(atom/target) + var/mob/living/carbon/alien/humanoid/evolver = owner + var/mob/living/carbon/alien/humanoid/royal/praetorian/new_xeno = new(owner.loc) + evolver.alien_evolve(new_xeno) + return TRUE diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/praetorian.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/praetorian.dm index c4dd26aa62e4a0..28fb151d83ba85 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/praetorian.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/praetorian.dm @@ -7,36 +7,48 @@ /mob/living/carbon/alien/humanoid/royal/praetorian/Initialize(mapload) real_name = name - AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/repulse/xeno(src)) - AddAbility(new /obj/effect/proc_holder/alien/royal/praetorian/evolve()) - . = ..() + + var/datum/action/cooldown/spell/aoe/repulse/xeno/tail_whip = new(src) + tail_whip.Grant(src) + + var/datum/action/cooldown/alien/evolve_to_queen/evolution = new(src) + evolution.Grant(src) + + return ..() /mob/living/carbon/alien/humanoid/royal/praetorian/create_internal_organs() internal_organs += new /obj/item/organ/internal/alien/plasmavessel/large internal_organs += new /obj/item/organ/internal/alien/resinspinner internal_organs += new /obj/item/organ/internal/alien/acid internal_organs += new /obj/item/organ/internal/alien/neurotoxin - ..() + return ..() -/obj/effect/proc_holder/alien/royal/praetorian/evolve +/datum/action/cooldown/alien/evolve_to_queen name = "Evolve" desc = "Produce an internal egg sac capable of spawning children. Only one queen can exist at a time." + button_icon_state = "alien_evolve_praetorian" plasma_cost = 500 - action_icon_state = "alien_evolve_praetorian" +/datum/action/cooldown/alien/evolve_to_queen/IsAvailable() + . = ..() + if(!.) + return FALSE -/obj/effect/proc_holder/alien/royal/praetorian/evolve/fire(mob/living/carbon/alien/humanoid/user) - var/obj/item/organ/internal/alien/hivenode/node = user.getorgan(/obj/item/organ/internal/alien/hivenode) - if(!node) //Just in case this particular Praetorian gets violated and kept by the RD as a replacement for Lamarr. - to_chat(user, span_warning("Without the hivemind, you would be unfit to rule as queen!")) + if(!isturf(owner.loc)) return FALSE - if(node.recent_queen_death) - to_chat(user, span_warning("You are still too burdened with guilt to evolve into a queen.")) + + if(get_alien_type(/mob/living/carbon/alien/humanoid/royal/queen)) return FALSE - if(!get_alien_type(/mob/living/carbon/alien/humanoid/royal/queen)) - var/mob/living/carbon/alien/humanoid/royal/queen/new_xeno = new (user.loc) - user.alien_evolve(new_xeno) - return TRUE - else - to_chat(user, span_warning("We already have an alive queen!")) + + var/mob/living/carbon/alien/humanoid/royal/evolver = owner + var/obj/item/organ/internal/alien/hivenode/node = evolver.getorgan(/obj/item/organ/internal/alien/hivenode) + if(!node || node.recent_queen_death) return FALSE + + return TRUE + +/datum/action/cooldown/alien/evolve_to_queen/Activate(atom/target) + var/mob/living/carbon/alien/humanoid/royal/evolver = owner + var/mob/living/carbon/alien/humanoid/royal/queen/new_queen = new(owner.loc) + evolver.alien_evolve(new_queen) + return TRUE diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm index df449a1d790485..b86891a8dcab5a 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm @@ -6,8 +6,9 @@ icon_state = "aliens" /mob/living/carbon/alien/humanoid/sentinel/Initialize(mapload) - AddAbility(new /obj/effect/proc_holder/alien/sneak) - . = ..() + var/datum/action/cooldown/alien/sneak/sneaky_beaky = new(src) + sneaky_beaky.Grant(src) + return ..() /mob/living/carbon/alien/humanoid/sentinel/create_internal_organs() internal_organs += new /obj/item/organ/internal/alien/plasmavessel diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm index c7c0258cd01ed1..174d06bf4c9cce 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm @@ -12,8 +12,6 @@ var/leap_on_click = 0 var/pounce_cooldown = 0 var/pounce_cooldown_time = 30 - var/sneaking = 0 //For sneaky-sneaky mode and appropriate slowdown - var/drooling = 0 //For Neruotoxic spit overlays deathsound = 'sound/voice/hiss6.ogg' bodyparts = list( /obj/item/bodypart/chest/alien, @@ -61,11 +59,10 @@ GLOBAL_LIST_INIT(strippable_alien_humanoid_items, create_strippable_list(list( return A return FALSE - /mob/living/carbon/alien/humanoid/check_breath(datum/gas_mixture/breath) - if(breath && breath.total_moles() > 0 && !sneaking) + if(breath?.total_moles() > 0 && !HAS_TRAIT(src, TRAIT_ALIEN_SNEAK)) playsound(get_turf(src), pick('sound/voice/lowHiss2.ogg', 'sound/voice/lowHiss3.ogg', 'sound/voice/lowHiss4.ogg'), 50, FALSE, -5) - ..() + return ..() /mob/living/carbon/alien/humanoid/set_name() if(numba) diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid_update_icons.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid_update_icons.dm index 75268b053031fa..ff6302b569f9b4 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid_update_icons.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid_update_icons.dm @@ -4,7 +4,8 @@ for(var/I in overlays_standing) add_overlay(I) - var/asleep = IsSleeping() + var/are_we_drooling = istype(click_intercept, /datum/action/cooldown/alien/acid) + if(stat == DEAD) //If we mostly took damage from fire if(getFireLoss() > 125) @@ -12,7 +13,7 @@ else icon_state = "alien[caste]_dead" - else if((stat == UNCONSCIOUS && !asleep) || stat == HARD_CRIT || stat == SOFT_CRIT || IsParalyzed()) + else if((stat == UNCONSCIOUS && !IsSleeping()) || stat == HARD_CRIT || stat == SOFT_CRIT || IsParalyzed()) icon_state = "alien[caste]_unconscious" else if(leap_on_click) icon_state = "alien[caste]_pounce" @@ -21,11 +22,11 @@ icon_state = "alien[caste]_sleep" else if(mob_size == MOB_SIZE_LARGE) icon_state = "alien[caste]" - if(drooling) + if(are_we_drooling) add_overlay("alienspit_[caste]") else icon_state = "alien[caste]" - if(drooling) + if(are_we_drooling) add_overlay("alienspit") if(leaping) diff --git a/code/modules/mob/living/carbon/alien/humanoid/queen.dm b/code/modules/mob/living/carbon/alien/humanoid/queen.dm index dccce5375429cc..9bf9a243e2e1bd 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/queen.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/queen.dm @@ -37,7 +37,6 @@ maxHealth = 400 health = 400 icon_state = "alienq" - var/datum/action/small_sprite/smallsprite = new/datum/action/small_sprite/queen() /mob/living/carbon/alien/humanoid/royal/queen/Initialize(mapload) //there should only be one queen @@ -52,9 +51,15 @@ real_name = src.name - AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/repulse/xeno(src)) - AddAbility(new/obj/effect/proc_holder/alien/royal/queen/promote()) + var/datum/action/cooldown/spell/aoe/repulse/xeno/tail_whip = new(src) + tail_whip.Grant(src) + + var/datum/action/small_sprite/queen/smallsprite = new(src) smallsprite.Grant(src) + + var/datum/action/cooldown/alien/promote/promotion = new(src) + promotion.Grant(src) + return ..() /mob/living/carbon/alien/humanoid/royal/queen/create_internal_organs() @@ -63,92 +68,116 @@ internal_organs += new /obj/item/organ/internal/alien/acid internal_organs += new /obj/item/organ/internal/alien/neurotoxin internal_organs += new /obj/item/organ/internal/alien/eggsac - ..() + return ..() //Queen verbs -/obj/effect/proc_holder/alien/lay_egg +/datum/action/cooldown/alien/make_structure/lay_egg name = "Lay Egg" desc = "Lay an egg to produce huggers to impregnate prey with." + button_icon_state = "alien_egg" plasma_cost = 75 - check_turf = TRUE - action_icon_state = "alien_egg" + made_structure_type = /obj/structure/alien/egg + +/datum/action/cooldown/alien/make_structure/lay_egg/Activate(atom/target) + . = ..() + owner.visible_message(span_alertalien("[owner] lays an egg!")) + +//Button to let queen choose her praetorian. +/datum/action/cooldown/alien/promote + name = "Create Royal Parasite" + desc = "Produce a royal parasite to grant one of your children the honor of being your Praetorian." + button_icon_state = "alien_queen_promote" + /// The promotion only takes plasma when completed, not on activation. + var/promotion_plasma_cost = 500 + +/datum/action/cooldown/alien/promote/set_statpanel_format() + . = ..() + if(!islist(.)) + return + + .[PANEL_DISPLAY_STATUS] = "PLASMA - [promotion_plasma_cost]" -/obj/effect/proc_holder/alien/lay_egg/fire(mob/living/carbon/user) - if(!check_vent_block(user)) +/datum/action/cooldown/alien/promote/IsAvailable() + . = ..() + if(!.) + return FALSE + + var/mob/living/carbon/carbon_owner = owner + if(carbon_owner.getPlasma() < promotion_plasma_cost) return FALSE - if(locate(/obj/structure/alien/egg) in get_turf(user)) - to_chat(user, span_alertalien("There's already an egg here.")) + if(get_alien_type(/mob/living/carbon/alien/humanoid/royal/praetorian)) return FALSE - user.visible_message(span_alertalien("[user] lays an egg!")) - new /obj/structure/alien/egg(user.loc) return TRUE -//Button to let queen choose her praetorian. -/obj/effect/proc_holder/alien/royal/queen/promote - name = "Create Royal Parasite" - desc = "Produce a royal parasite to grant one of your children the honor of being your Praetorian." - plasma_cost = 500 //Plasma cost used on promotion, not spawning the parasite. +/datum/action/cooldown/alien/promote/Activate(atom/target) + var/obj/item/queen_promotion/existing_promotion = locate() in owner.held_items + if(existing_promotion) + to_chat(owner, span_noticealien("You discard [existing_promotion].")) + owner.temporarilyRemoveItemFromInventory(existing_promotion) + qdel(existing_promotion) + return TRUE - action_icon_state = "alien_queen_promote" + if(!owner.get_empty_held_indexes()) + to_chat(owner, span_warning("You must have an empty hand before preparing the parasite.")) + return FALSE + var/obj/item/queen_promotion/new_promotion = new(owner.loc) + if(!owner.put_in_hands(new_promotion, del_on_fail = TRUE)) + to_chat(owner, span_noticealien("You fail to prepare a parasite.")) + return FALSE + to_chat(owner, span_noticealien("Use [new_promotion] on one of your children to promote her to a Praetorian!")) + return TRUE -/obj/effect/proc_holder/alien/royal/queen/promote/fire(mob/living/carbon/alien/user) - var/obj/item/queenpromote/prom - if(get_alien_type(/mob/living/carbon/alien/humanoid/royal/praetorian/)) - to_chat(user, span_noticealien("You already have a Praetorian!")) - return - else - for(prom in user) - to_chat(user, span_noticealien("You discard [prom].")) - qdel(prom) - return - - prom = new (user.loc) - if(!user.put_in_active_hand(prom, 1)) - to_chat(user, span_warning("You must empty your hands before preparing the parasite.")) - return - else //Just in case telling the player only once is not enough! - to_chat(user, span_noticealien("Use the royal parasite on one of your children to promote her to Praetorian!")) - return - -/obj/item/queenpromote +/obj/item/queen_promotion name = "\improper royal parasite" desc = "Inject this into one of your grown children to promote her to a Praetorian!" icon_state = "alien_medal" - item_flags = ABSTRACT | DROPDEL + item_flags = NOBLUDGEON | ABSTRACT | DROPDEL icon = 'icons/mob/alien.dmi' -/obj/item/queenpromote/Initialize(mapload) +/obj/item/queen_promotion/attack(mob/living/to_promote, mob/living/carbon/alien/humanoid/queen) . = ..() - ADD_TRAIT(src, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT) + if(.) + return -/obj/item/queenpromote/attack(mob/living/M, mob/living/carbon/alien/humanoid/user) - if(!isalienadult(M) || isalienroyal(M)) - to_chat(user, span_noticealien("You may only use this with your adult, non-royal children!")) + var/datum/action/cooldown/alien/promote/promotion = locate() in queen.actions + if(!promotion) + CRASH("[type] was created and handled by a mob ([queen]) that didn't have a promotion action associated.") + + if(!isalienadult(to_promote) || isalienroyal(to_promote)) + to_chat(queen, span_noticealien("You may only use this with your adult, non-royal children!")) return - if(get_alien_type(/mob/living/carbon/alien/humanoid/royal/praetorian/)) - to_chat(user, span_noticealien("You already have a Praetorian!")) + + if(!promotion.IsAvailable()) + to_chat(queen, span_noticealien("You cannot promote a child right now!")) return - var/mob/living/carbon/alien/humanoid/A = M - if(A.stat == CONSCIOUS && A.mind && A.key) - if(!user.usePlasma(500)) - to_chat(user, span_noticealien("You must have 500 plasma stored to use this!")) - return - - to_chat(A, span_noticealien("The queen has granted you a promotion to Praetorian!")) - user.visible_message(span_alertalien("[A] begins to expand, twist and contort!")) - var/mob/living/carbon/alien/humanoid/royal/praetorian/new_prae = new (A.loc) - A.mind.transfer_to(new_prae) - qdel(A) - qdel(src) + if(to_promote.stat != CONSCIOUS || !to_promote.mind || !to_promote.key) return - else - to_chat(user, span_warning("This child must be alert and responsive to become a Praetorian!")) -/obj/item/queenpromote/attack_self(mob/user) + queen.adjustPlasma(-promotion.promotion_plasma_cost) + + to_chat(queen, span_noticealien("You have promoted [to_promote] to a Praetorian!")) + to_promote.visible_message( + span_alertalien("[to_promote] begins to expand, twist and contort!"), + span_noticealien("The queen has granted you a promotion to Praetorian!"), + ) + + var/mob/living/carbon/alien/humanoid/royal/praetorian/new_prae = new(to_promote.loc) + to_promote.mind.transfer_to(new_prae) + + qdel(to_promote) + qdel(src) + return TRUE + +/obj/item/queen_promotion/attack_self(mob/user) to_chat(user, span_noticealien("You discard [src].")) qdel(src) + +/obj/item/queen_promotion/dropped(mob/user, silent) + if(!silent) + to_chat(user, span_noticealien("You discard [src].")) + return ..() diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm index 734a5ef3e3ca69..a109eb3a770684 100644 --- a/code/modules/mob/living/carbon/alien/larva/larva.dm +++ b/code/modules/mob/living/carbon/alien/larva/larva.dm @@ -31,16 +31,18 @@ //This is fine right now, if we're adding organ specific damage this needs to be updated /mob/living/carbon/alien/larva/Initialize(mapload) - - AddAbility(new/obj/effect/proc_holder/alien/hide(null)) - AddAbility(new/obj/effect/proc_holder/alien/larva_evolve(null)) - . = ..() + var/datum/action/cooldown/alien/larva_evolve/evolution = new(src) + evolution.Grant(src) + var/datum/action/cooldown/alien/hide/hide = new(src) + hide.Grant(src) + return ..() /mob/living/carbon/alien/larva/create_internal_organs() internal_organs += new /obj/item/organ/internal/alien/plasmavessel/small/tiny ..() //This needs to be fixed +// This comment is 12 years old I hope it's fixed by now /mob/living/carbon/alien/larva/get_status_tab_items() . = ..() . += "Progress: [amount_grown]/[max_grown]" diff --git a/code/modules/mob/living/carbon/alien/larva/powers.dm b/code/modules/mob/living/carbon/alien/larva/powers.dm index 4b6774a7dd5068..a248173be246aa 100644 --- a/code/modules/mob/living/carbon/alien/larva/powers.dm +++ b/code/modules/mob/living/carbon/alien/larva/powers.dm @@ -1,57 +1,92 @@ -/obj/effect/proc_holder/alien/hide +/datum/action/cooldown/alien/hide name = "Hide" - desc = "Allows aliens to hide beneath tables or certain items. Toggled on or off." + desc = "Allows you to hide beneath tables and certain objects." + button_icon_state = "alien_hide" plasma_cost = 0 + /// The layer we are on while hiding + var/hide_layer = ABOVE_NORMAL_TURF_LAYER - action_icon_state = "alien_hide" +/datum/action/cooldown/alien/hide/Activate(atom/target) + if(owner.layer == hide_layer) + owner.layer = initial(owner.layer) + owner.visible_message( + span_notice("[owner] slowly peeks up from the ground..."), + span_noticealien("You stop hiding."), + ) -/obj/effect/proc_holder/alien/hide/fire(mob/living/carbon/alien/user) - if(user.stat != CONSCIOUS) - return - - if (user.layer != ABOVE_NORMAL_TURF_LAYER) - user.layer = ABOVE_NORMAL_TURF_LAYER - user.visible_message(span_name("[user] scurries to the ground!"), \ - span_noticealien("You are now hiding.")) else - user.layer = MOB_LAYER - user.visible_message(span_notice("[user] slowly peeks up from the ground..."), \ - span_noticealien("You stop hiding.")) - return 1 + owner.layer = hide_layer + owner.visible_message( + span_name("[owner] scurries to the ground!"), + span_noticealien("You are now hiding."), + ) + return TRUE -/obj/effect/proc_holder/alien/larva_evolve +/datum/action/cooldown/alien/larva_evolve name = "Evolve" desc = "Evolve into a higher alien caste." + button_icon_state = "alien_evolve_larva" plasma_cost = 0 - action_icon_state = "alien_evolve_larva" - -/obj/effect/proc_holder/alien/larva_evolve/fire(mob/living/carbon/alien/user) - if(!islarva(user)) - return - var/mob/living/carbon/alien/larva/larva = user +/datum/action/cooldown/alien/larva_evolve/IsAvailable() + . = ..() + if(!.) + return FALSE + if(!islarva(owner)) + return FALSE + var/mob/living/carbon/alien/larva/larva = owner if(larva.handcuffed || larva.legcuffed) // Cuffing larvas ? Eh ? - to_chat(user, span_warning("You cannot evolve when you are cuffed!")) - return - + return FALSE if(larva.amount_grown < larva.max_grown) - to_chat(user, span_warning("You are not fully grown!")) - return + return FALSE + if(larva.movement_type & VENTCRAWLING) + return FALSE - to_chat(larva, span_name("You are growing into a beautiful alien! It is time to choose a caste.")) - to_chat(larva, span_info("There are three to choose from:")) - to_chat(larva, span_name("Hunters are the most agile caste, tasked with hunting for hosts. They are faster than a human and can even pounce, but are not much tougher than a drone.")) - to_chat(larva, span_name("Sentinels are tasked with protecting the hive. With their ranged spit, invisibility, and high health, they make formidable guardians and acceptable secondhand hunters.")) - to_chat(larva, span_name("Drones are the weakest and slowest of the castes, but can grow into a praetorian and then queen if no queen exists, and are vital to maintaining a hive with their resin secretion abilities.")) - var/alien_caste = tgui_input_list(larva, "Please choose which alien caste you shall belong to.",,list("Hunter","Sentinel","Drone")) + return TRUE - if(larva.movement_type & VENTCRAWLING) - to_chat(user, span_warning("You cannot evolve while ventcrawling!")) +/datum/action/cooldown/alien/larva_evolve/Activate(atom/target) + var/mob/living/carbon/alien/larva/larva = owner + var/static/list/caste_options + if(!caste_options) + caste_options = list() + + // This can probably be genericized in the future. + var/mob/hunter_path = /mob/living/carbon/alien/humanoid/hunter + var/datum/radial_menu_choice/hunter = new() + hunter.name = "Hunter" + hunter.image = image(icon = initial(hunter_path.icon), icon_state = initial(hunter_path.icon_state)) + hunter.info = span_info("Hunters are the most agile caste, tasked with hunting for hosts. \ + They are faster than a human and can even pounce, but are not much tougher than a drone.") + + caste_options["Hunter"] = hunter + + var/mob/sentinel_path = /mob/living/carbon/alien/humanoid/sentinel + var/datum/radial_menu_choice/sentinel = new() + sentinel.name = "Sentinel" + sentinel.image = image(icon = initial(sentinel_path.icon), icon_state = initial(sentinel_path.icon_state)) + sentinel.info = span_info("Sentinels are tasked with protecting the hive. \ + With their ranged spit, invisibility, and high health, they make formidable guardians \ + and acceptable secondhand hunters.") + + caste_options["Sentinel"] = sentinel + + var/mob/drone_path = /mob/living/carbon/alien/humanoid/drone + var/datum/radial_menu_choice/drone = new() + drone.name = "Drone" + drone.image = image(icon = initial(drone_path.icon), icon_state = initial(drone_path.icon_state)) + drone.info = span_info("Drones are the weakest and slowest of the castes, \ + but can grow into a praetorian and then queen if no queen exists, \ + and are vital to maintaining a hive with their resin secretion abilities.") + + caste_options["Drone"] = drone + + var/alien_caste = show_radial_menu(owner, owner, caste_options, radius = 38, require_near = TRUE, tooltips = TRUE) + if(QDELETED(src) || QDELETED(owner) || !IsAvailable() || !alien_caste) return - if(user.incapacitated()) //something happened to us while we were choosing. + if(alien_caste == null) return var/mob/living/carbon/alien/humanoid/new_xeno @@ -62,7 +97,8 @@ new_xeno = new /mob/living/carbon/alien/humanoid/sentinel(larva.loc) if("Drone") new_xeno = new /mob/living/carbon/alien/humanoid/drone(larva.loc) + else + CRASH("Alien evolve was given an invalid / incorrect alien cast type. Got: [alien_caste]") larva.alien_evolve(new_xeno) - return - + return TRUE diff --git a/code/modules/mob/living/carbon/alien/organs.dm b/code/modules/mob/living/carbon/alien/organs.dm index 16be0609d14cf5..33cb540787afde 100644 --- a/code/modules/mob/living/carbon/alien/organs.dm +++ b/code/modules/mob/living/carbon/alien/organs.dm @@ -2,30 +2,6 @@ icon_state = "xgibmid2" visual = FALSE food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/toxin/acid = 10) - var/list/alien_powers = list() - -/obj/item/organ/internal/alien/Initialize(mapload) - . = ..() - for(var/A in alien_powers) - if(ispath(A)) - alien_powers -= A - alien_powers += new A(src) - -/obj/item/organ/internal/alien/Destroy() - QDEL_LIST(alien_powers) - return ..() - -/obj/item/organ/internal/alien/Insert(mob/living/carbon/M, special = 0) - ..() - for(var/obj/effect/proc_holder/alien/P in alien_powers) - M.AddAbility(P) - - -/obj/item/organ/internal/alien/Remove(mob/living/carbon/M, special = 0) - for(var/obj/effect/proc_holder/alien/P in alien_powers) - M.RemoveAbility(P) - ..() - /obj/item/organ/internal/alien/plasmavessel name = "plasma vessel" @@ -33,11 +9,14 @@ w_class = WEIGHT_CLASS_NORMAL zone = BODY_ZONE_CHEST slot = ORGAN_SLOT_XENO_PLASMAVESSEL - alien_powers = list(/obj/effect/proc_holder/alien/plant, /obj/effect/proc_holder/alien/transfer) food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/toxin/plasma = 10) + actions_types = list( + /datum/action/cooldown/alien/make_structure/plant_weeds, + /datum/action/cooldown/alien/transfer, + ) /// The current amount of stored plasma. - var/storedPlasma = 100 + var/stored_plasma = 100 /// The maximum plasma this organ can store. var/max_plasma = 250 /// The rate this organ regenerates its owners health at per damage type per second. @@ -49,7 +28,7 @@ name = "large plasma vessel" icon_state = "plasma_large" w_class = WEIGHT_CLASS_BULKY - storedPlasma = 200 + stored_plasma = 200 max_plasma = 500 plasma_rate = 7.5 @@ -60,7 +39,7 @@ name = "small plasma vessel" icon_state = "plasma_small" w_class = WEIGHT_CLASS_SMALL - storedPlasma = 100 + stored_plasma = 100 max_plasma = 150 plasma_rate = 2.5 @@ -69,7 +48,7 @@ icon_state = "plasma_tiny" w_class = WEIGHT_CLASS_TINY max_plasma = 100 - alien_powers = list(/obj/effect/proc_holder/alien/transfer) + actions_types = list(/datum/action/cooldown/alien/transfer) /obj/item/organ/internal/alien/plasmavessel/on_life(delta_time, times_fired) //If there are alien weeds on the ground then heal if needed or give some plasma @@ -108,9 +87,9 @@ zone = BODY_ZONE_HEAD slot = ORGAN_SLOT_XENO_HIVENODE w_class = WEIGHT_CLASS_TINY - ///Indicates if the queen died recently, aliens are heavily weakened while this is active. + actions_types = list(/datum/action/cooldown/alien/whisper) + /// Indicates if the queen died recently, aliens are heavily weakened while this is active. var/recent_queen_death = FALSE - alien_powers = list(/obj/effect/proc_holder/alien/whisper) /obj/item/organ/internal/alien/hivenode/Insert(mob/living/carbon/M, special = 0) ..() @@ -162,7 +141,7 @@ icon_state = "stomach-x" zone = BODY_ZONE_PRECISE_MOUTH slot = ORGAN_SLOT_XENO_RESINSPINNER - alien_powers = list(/obj/effect/proc_holder/alien/resin) + actions_types = list(/datum/action/cooldown/alien/make_structure/resin) /obj/item/organ/internal/alien/acid @@ -170,7 +149,7 @@ icon_state = "acid" zone = BODY_ZONE_PRECISE_MOUTH slot = ORGAN_SLOT_XENO_ACIDGLAND - alien_powers = list(/obj/effect/proc_holder/alien/acid) + actions_types = list(/datum/action/cooldown/alien/acid/corrosion) /obj/item/organ/internal/alien/neurotoxin @@ -178,7 +157,7 @@ icon_state = "neurotox" zone = BODY_ZONE_PRECISE_MOUTH slot = ORGAN_SLOT_XENO_NEUROTOXINGLAND - alien_powers = list(/obj/effect/proc_holder/alien/neurotoxin) + actions_types = list(/datum/action/cooldown/alien/acid/neurotoxin) /obj/item/organ/internal/alien/eggsac @@ -187,4 +166,4 @@ zone = BODY_ZONE_PRECISE_GROIN slot = ORGAN_SLOT_XENO_EGGSAC w_class = WEIGHT_CLASS_BULKY - alien_powers = list(/obj/effect/proc_holder/alien/lay_egg) + actions_types = list(/datum/action/cooldown/alien/make_structure/lay_egg) diff --git a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm index c2eeb6947f9696..85a8804eea2a0d 100644 --- a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm +++ b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm @@ -60,7 +60,11 @@ return if(++stage < 6) INVOKE_ASYNC(src, .proc/RefreshInfectionImage) - addtimer(CALLBACK(src, .proc/advance_embryo_stage), growth_time) + var/slowdown = 1 + if(ishuman(owner)) + var/mob/living/carbon/human/baby_momma = owner + slowdown = baby_momma.reagents.has_reagent(/datum/reagent/medicine/spaceacillin) ? 2 : 1 // spaceacillin doubles the time it takes to grow + addtimer(CALLBACK(src, .proc/advance_embryo_stage), growth_time*slowdown) /obj/item/organ/internal/body_egg/alien_embryo/egg_process() if(stage == 6 && prob(50)) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index df647f214ef3c4..8a6d125c7ea282 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -400,17 +400,13 @@ . = ..() var/obj/item/organ/internal/alien/plasmavessel/vessel = getorgan(/obj/item/organ/internal/alien/plasmavessel) if(vessel) - . += "Plasma Stored: [vessel.storedPlasma]/[vessel.max_plasma]" + . += "Plasma Stored: [vessel.stored_plasma]/[vessel.max_plasma]" var/obj/item/organ/internal/heart/vampire/darkheart = getorgan(/obj/item/organ/internal/heart/vampire) if(darkheart) . += "Current blood level: [blood_volume]/[BLOOD_VOLUME_MAXIMUM]." if(locate(/obj/item/assembly/health) in src) . += "Health: [health]" -/mob/living/carbon/get_proc_holders() - . = ..() - . += add_abilities_to_panel() - /mob/living/carbon/attack_ui(slot, params) if(!has_hand_for_held_index(active_hand_index)) return 0 @@ -572,7 +568,7 @@ if(!isnull(E.lighting_alpha)) lighting_alpha = E.lighting_alpha - if(client.eye != src) + if(client.eye && client.eye != src) var/atom/A = client.eye if(A.update_remote_sight(src)) //returns 1 if we override all other sight updates. return diff --git a/code/modules/mob/living/carbon/carbon_movement.dm b/code/modules/mob/living/carbon/carbon_movement.dm index 419c203b60cbb3..dde0e0afe34fea 100644 --- a/code/modules/mob/living/carbon/carbon_movement.dm +++ b/code/modules/mob/living/carbon/carbon_movement.dm @@ -1,5 +1,5 @@ /mob/living/carbon/slip(knockdown_amount, obj/O, lube, paralyze, force_drop) - if(movement_type & FLYING) + if(movement_type & (FLYING | FLOATING)) return FALSE if(!(lube&SLIDE_ICE)) log_combat(src, (O ? O : get_turf(src)), "slipped on the", null, ((lube & SLIDE) ? "(LUBE)" : null)) diff --git a/code/modules/mob/living/carbon/examine.dm b/code/modules/mob/living/carbon/examine.dm index 44597895437c99..7875f8560dd91d 100644 --- a/code/modules/mob/living/carbon/examine.dm +++ b/code/modules/mob/living/carbon/examine.dm @@ -6,7 +6,7 @@ var/t_has = p_have() var/t_is = p_are() - . = list("*---------*\nThis is [icon2html(src, user)] \a [src]!") + . = list("This is [icon2html(src, user)] \a [src]!>") var/obscured = check_obscured_slots() if (handcuffed) @@ -150,7 +150,7 @@ . += "[t_He] look[p_s()] very happy." if(MOOD_LEVEL_HAPPY4 to INFINITY) . += "[t_He] look[p_s()] ecstatic." - . += "*---------*" + . += "" SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, user, .) diff --git a/code/modules/mob/living/carbon/human/dummy.dm b/code/modules/mob/living/carbon/human/dummy.dm index c8cc678f10d204..ae1dd2b4c8428f 100644 --- a/code/modules/mob/living/carbon/human/dummy.dm +++ b/code/modules/mob/living/carbon/human/dummy.dm @@ -102,7 +102,8 @@ INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy) dna.features["snout"] = "Round" dna.features["spines"] = "None" dna.features["tail_cat"] = "None" - dna.features["tail_lizard"] = "Light" + dna.features["tail_lizard"] = "Smooth" + dna.features["pod_hair"] = "Ivy" //Inefficient pooling/caching way. GLOBAL_LIST_EMPTY(human_dummy_list) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 6645cc24649de8..ca9c81a284342e 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -14,7 +14,7 @@ if(HAS_TRAIT(L, TRAIT_PROSOPAGNOSIA) || HAS_TRAIT(L, TRAIT_INVISIBLE_MAN)) obscure_name = TRUE - . = list("*---------*\nThis is [!obscure_name ? name : "Unknown"]!") + . = list("This is [!obscure_name ? name : "Unknown"]!") var/obscured = check_obscured_slots() @@ -361,9 +361,9 @@ var/perpname = get_face_name(get_id_name("")) if(perpname && (HAS_TRAIT(user, TRAIT_SECURITY_HUD) || HAS_TRAIT(user, TRAIT_MEDICAL_HUD))) - var/datum/data/record/R = find_record("name", perpname, GLOB.data_core.general) - if(R) - . += "Rank: [R.fields["rank"]]\n\[Front photo\]\[Side photo\]" + var/datum/data/record/target_record = find_record("name", perpname, GLOB.data_core.general) + if(target_record) + . += "Rank: [target_record.fields["rank"]]\n\[Front photo\]\[Side photo\]" if(HAS_TRAIT(user, TRAIT_MEDICAL_HUD)) var/cyberimp_detect for(var/obj/item/organ/internal/cyberimp/CI in internal_organs) @@ -372,34 +372,34 @@ if(cyberimp_detect) . += "Detected cybernetic modifications:" . += "[cyberimp_detect]" - if(R) - var/health_r = R.fields["p_stat"] - . += "\[[health_r]\]" - health_r = R.fields["m_stat"] - . += "\[[health_r]\]" - R = find_record("name", perpname, GLOB.data_core.medical) - if(R) - . += "\[Medical evaluation\]
" - . += "\[See quirks\]" + if(target_record) + var/health_r = target_record.fields["p_stat"] + . += "\[[health_r]\]" + health_r = target_record.fields["m_stat"] + . += "\[[health_r]\]" + target_record = find_record("name", perpname, GLOB.data_core.medical) + if(target_record) + . += "\[Medical evaluation\]
" + . += "\[See quirks\]" if(HAS_TRAIT(user, TRAIT_SECURITY_HUD)) if(!user.stat && user != src) //|| !user.canmove || user.restrained()) Fluff: Sechuds have eye-tracking technology and sets 'arrest' to people that the wearer looks and blinks at. var/criminal = "None" - R = find_record("name", perpname, GLOB.data_core.security) - if(R) - criminal = R.fields["criminal"] + target_record = find_record("name", perpname, GLOB.data_core.security) + if(target_record) + criminal = target_record.fields["criminal"] - . += "Criminal status: \[[criminal]\]" - . += jointext(list("Security record: \[View\]", - "\[Add citation\]", - "\[Add crime\]", - "\[View comment log\]", - "\[Add comment\]"), "") + . += "Criminal status: \[[criminal]\]" + . += jointext(list("Security record: \[View\]", + "\[Add citation\]", + "\[Add crime\]", + "\[View comment log\]", + "\[Add comment\]"), "") else if(isobserver(user)) . += span_info("Traits: [get_quirk_string(FALSE, CAT_QUIRK_ALL)]") - . += "*---------*
" + . += "
" SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, user, .) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 1dcc00a9eeeb65..72d2e338ad0505 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -25,11 +25,11 @@ AddComponent(/datum/component/bloodysoles/feet) AddElement(/datum/element/ridable, /datum/component/riding/creature/human) AddElement(/datum/element/strippable, GLOB.strippable_human_items, /mob/living/carbon/human/.proc/should_strip) - GLOB.human_list += src var/static/list/loc_connections = list( COMSIG_ATOM_ENTERED = .proc/on_entered, ) AddElement(/datum/element/connect_loc, loc_connections) + GLOB.human_list += src /mob/living/carbon/human/proc/setup_human_dna() //initialize dna. for spawned humans; overwritten by other code @@ -95,11 +95,6 @@ . += "Chemical Storage: [changeling.chem_charges]/[changeling.total_chem_storage]" . += "Absorbed DNA: [changeling.absorbed_count]" -// called when something steps onto a human -/mob/living/carbon/human/proc/on_entered(datum/source, atom/movable/AM) - SIGNAL_HANDLER - spreadFire(AM) - /mob/living/carbon/human/reset_perspective(atom/new_eye, force_reset = FALSE) if(dna?.species?.prevent_perspective_change && !force_reset) // This is in case a species needs to prevent perspective changes in certain cases, like Dullahans preventing perspective changes when they're looking through their head. update_fullscreen() @@ -118,38 +113,41 @@ if(href_list["hud"]) if(!ishuman(usr)) return - var/mob/living/carbon/human/H = usr + var/mob/living/carbon/human/human_user = usr var/perpname = get_face_name(get_id_name("")) - if(!HAS_TRAIT(H, TRAIT_SECURITY_HUD) && !HAS_TRAIT(H, TRAIT_MEDICAL_HUD)) + if(!HAS_TRAIT(human_user, TRAIT_SECURITY_HUD) && !HAS_TRAIT(human_user, TRAIT_MEDICAL_HUD)) return - var/datum/data/record/R = find_record("name", perpname, GLOB.data_core.general) + if((text2num(href_list["examine_time"]) + 1 MINUTES) < world.time) + to_chat(human_user, "[span_notice("It's too late to use this now!")]") + return + var/datum/data/record/target_record = find_record("name", perpname, GLOB.data_core.general) if(href_list["photo_front"] || href_list["photo_side"]) - if(!R) + if(!target_record) return - if(!H.canUseHUD()) + if(!human_user.canUseHUD()) return - if(!HAS_TRAIT(H, TRAIT_SECURITY_HUD) && !HAS_TRAIT(H, TRAIT_MEDICAL_HUD)) + if(!HAS_TRAIT(human_user, TRAIT_SECURITY_HUD) && !HAS_TRAIT(human_user, TRAIT_MEDICAL_HUD)) return - var/obj/item/photo/P = null + var/obj/item/photo/photo_from_record = null if(href_list["photo_front"]) - P = R.fields["photo_front"] + photo_from_record = target_record.fields["photo_front"] else if(href_list["photo_side"]) - P = R.fields["photo_side"] - if(P) - P.show(H) + photo_from_record = target_record.fields["photo_side"] + if(photo_from_record) + photo_from_record.show(human_user) return if(href_list["hud"] == "m") - if(!HAS_TRAIT(H, TRAIT_MEDICAL_HUD)) + if(!HAS_TRAIT(human_user, TRAIT_MEDICAL_HUD)) return if(href_list["evaluation"]) if(!getBruteLoss() && !getFireLoss() && !getOxyLoss() && getToxLoss() < 20) - to_chat(usr, "[span_notice("No external injuries detected.")]
") + to_chat(human_user, "[span_notice("No external injuries detected.")]
") return var/span = "notice" var/status = "" if(getBruteLoss()) - to_chat(usr, "Physical trauma analysis:") + to_chat(human_user, "Physical trauma analysis:") for(var/X in bodyparts) var/obj/item/bodypart/BP = X var/brutedamage = BP.brute_dam @@ -163,9 +161,9 @@ status = "sustained major trauma!" span = "userdanger" if(brutedamage) - to_chat(usr, "[BP] appears to have [status]") + to_chat(human_user, "[BP] appears to have [status]") if(getFireLoss()) - to_chat(usr, "Analysis of skin burns:") + to_chat(human_user, "Analysis of skin burns:") for(var/X in bodyparts) var/obj/item/bodypart/BP = X var/burndamage = BP.burn_dam @@ -179,122 +177,122 @@ status = "major burns!" span = "userdanger" if(burndamage) - to_chat(usr, "[BP] appears to have [status]") + to_chat(human_user, "[BP] appears to have [status]") if(getOxyLoss()) - to_chat(usr, span_danger("Patient has signs of suffocation, emergency treatment may be required!")) + to_chat(human_user, span_danger("Patient has signs of suffocation, emergency treatment may be required!")) if(getToxLoss() > 20) - to_chat(usr, span_danger("Gathered data is inconsistent with the analysis, possible cause: poisoning.")) - if(!H.wear_id) //You require access from here on out. - to_chat(H, span_warning("ERROR: Invalid access")) + to_chat(human_user, span_danger("Gathered data is inconsistent with the analysis, possible cause: poisoning.")) + if(!human_user.wear_id) //You require access from here on out. + to_chat(human_user, span_warning("ERROR: Invalid access")) return - var/list/access = H.wear_id.GetAccess() + var/list/access = human_user.wear_id.GetAccess() if(!(ACCESS_MEDICAL in access)) - to_chat(H, span_warning("ERROR: Invalid access")) + to_chat(human_user, span_warning("ERROR: Invalid access")) return if(href_list["p_stat"]) - var/health_status = input(usr, "Specify a new physical status for this person.", "Medical HUD", R.fields["p_stat"]) in list("Active", "Physically Unfit", "*Unconscious*", "*Deceased*", "Cancel") - if(!R) + var/health_status = input(human_user, "Specify a new physical status for this person.", "Medical HUD", target_record.fields["p_stat"]) in list("Active", "Physically Unfit", "*Unconscious*", "*Deceased*", "Cancel") + if(!target_record) return - if(!H.canUseHUD()) + if(!human_user.canUseHUD()) return - if(!HAS_TRAIT(H, TRAIT_MEDICAL_HUD)) + if(!HAS_TRAIT(human_user, TRAIT_MEDICAL_HUD)) return if(health_status && health_status != "Cancel") - R.fields["p_stat"] = health_status + target_record.fields["p_stat"] = health_status return if(href_list["m_stat"]) - var/health_status = input(usr, "Specify a new mental status for this person.", "Medical HUD", R.fields["m_stat"]) in list("Stable", "*Watch*", "*Unstable*", "*Insane*", "Cancel") - if(!R) + var/health_status = input(human_user, "Specify a new mental status for this person.", "Medical HUD", target_record.fields["m_stat"]) in list("Stable", "*Watch*", "*Unstable*", "*Insane*", "Cancel") + if(!target_record) return - if(!H.canUseHUD()) + if(!human_user.canUseHUD()) return - if(!HAS_TRAIT(H, TRAIT_MEDICAL_HUD)) + if(!HAS_TRAIT(human_user, TRAIT_MEDICAL_HUD)) return if(health_status && health_status != "Cancel") - R.fields["m_stat"] = health_status + target_record.fields["m_stat"] = health_status return if(href_list["quirk"]) var/quirkstring = get_quirk_string(TRUE, CAT_QUIRK_ALL) if(quirkstring) - to_chat(usr, "Detected physiological traits:\n[quirkstring]") + to_chat(human_user, "Detected physiological traits:\n[quirkstring]") else - to_chat(usr, "No physiological traits found.") + to_chat(human_user, "No physiological traits found.") return //Medical HUD ends here. if(href_list["hud"] == "s") - if(!HAS_TRAIT(H, TRAIT_SECURITY_HUD)) + if(!HAS_TRAIT(human_user, TRAIT_SECURITY_HUD)) return - if(usr.stat || usr == src) //|| !usr.canmove || usr.restrained()) Fluff: Sechuds have eye-tracking technology and sets 'arrest' to people that the wearer looks and blinks at. + if(human_user.stat || human_user == src) //|| !human_user.canmove || human_user.restrained()) Fluff: Sechuds have eye-tracking technology and sets 'arrest' to people that the wearer looks and blinks at. return //Non-fluff: This allows sec to set people to arrest as they get disarmed or beaten // Checks the user has security clearence before allowing them to change arrest status via hud, comment out to enable all access var/allowed_access = null - var/obj/item/clothing/glasses/hud/security/G = H.glasses - if(istype(G) && (G.obj_flags & EMAGGED)) + var/obj/item/clothing/glasses/hud/security/user_glasses = human_user.glasses + if(istype(user_glasses) && (user_glasses.obj_flags & EMAGGED)) allowed_access = "@%&ERROR_%$*" else //Implant and standard glasses check access - if(H.wear_id) - var/list/access = H.wear_id.GetAccess() + if(human_user.wear_id) + var/list/access = human_user.wear_id.GetAccess() if(ACCESS_SECURITY in access) - allowed_access = H.get_authentification_name() + allowed_access = human_user.get_authentification_name() if(!allowed_access) - to_chat(H, span_warning("ERROR: Invalid access.")) + to_chat(human_user, span_warning("ERROR: Invalid access.")) return if(!perpname) - to_chat(H, span_warning("ERROR: Can not identify target.")) + to_chat(human_user, span_warning("ERROR: Can not identify target.")) return - R = find_record("name", perpname, GLOB.data_core.security) - if(!R) - to_chat(usr, span_warning("ERROR: Unable to locate data core entry for target.")) + target_record = find_record("name", perpname, GLOB.data_core.security) + if(!target_record) + to_chat(human_user, span_warning("ERROR: Unable to locate data core entry for target.")) return if(href_list["status"]) - var/setcriminal = input(usr, "Specify a new criminal status for this person.", "Security HUD", R.fields["criminal"]) in list("None", "*Arrest*", "Incarcerated", "Suspected", "Paroled", "Discharged", "Cancel") + var/setcriminal = input(human_user, "Specify a new criminal status for this person.", "Security HUD", target_record.fields["criminal"]) in list("None", "*Arrest*", "Incarcerated", "Suspected", "Paroled", "Discharged", "Cancel") if(setcriminal != "Cancel") - if(!R) + if(!target_record) return - if(!H.canUseHUD()) + if(!human_user.canUseHUD()) return - if(!HAS_TRAIT(H, TRAIT_SECURITY_HUD)) + if(!HAS_TRAIT(human_user, TRAIT_SECURITY_HUD)) return - investigate_log("[key_name(src)] has been set from [R.fields["criminal"]] to [setcriminal] by [key_name(usr)].", INVESTIGATE_RECORDS) - R.fields["criminal"] = setcriminal + investigate_log("[key_name(src)] has been set from [target_record.fields["criminal"]] to [setcriminal] by [key_name(human_user)].", INVESTIGATE_RECORDS) + target_record.fields["criminal"] = setcriminal sec_hud_set_security_status() return if(href_list["view"]) - if(!H.canUseHUD()) + if(!human_user.canUseHUD()) return - if(!HAS_TRAIT(H, TRAIT_SECURITY_HUD)) + if(!HAS_TRAIT(human_user, TRAIT_SECURITY_HUD)) return - to_chat(usr, "Name: [R.fields["name"]] Criminal Status: [R.fields["criminal"]]") - for(var/datum/data/crime/c in R.fields["crim"]) - to_chat(usr, "Crime: [c.crimeName]") + to_chat(human_user, "Name: [target_record.fields["name"]] Criminal Status: [target_record.fields["criminal"]]") + for(var/datum/data/crime/c in target_record.fields["crim"]) + to_chat(human_user, "Crime: [c.crimeName]") if (c.crimeDetails) - to_chat(usr, "Details: [c.crimeDetails]") + to_chat(human_user, "Details: [c.crimeDetails]") else - to_chat(usr, "Details: \[Add details]") - to_chat(usr, "Added by [c.author] at [c.time]") - to_chat(usr, "----------") - to_chat(usr, "Notes: [R.fields["notes"]]") + to_chat(human_user, "Details: \[Add details]") + to_chat(human_user, "Added by [c.author] at [c.time]") + to_chat(human_user, "----------") + to_chat(human_user, "Notes: [target_record.fields["notes"]]") return if(href_list["add_citation"]) var/maxFine = CONFIG_GET(number/maxfine) - var/t1 = tgui_input_text(usr, "Citation crime", "Security HUD") - var/fine = tgui_input_number(usr, "Citation fine", "Security HUD", 50, maxFine, 5) + var/t1 = tgui_input_text(human_user, "Citation crime", "Security HUD") + var/fine = tgui_input_number(human_user, "Citation fine", "Security HUD", 50, maxFine, 5) if(!fine) return - if(!R || !t1 || !allowed_access) + if(!target_record || !t1 || !allowed_access) return - if(!H.canUseHUD()) + if(!human_user.canUseHUD()) return - if(!HAS_TRAIT(H, TRAIT_SECURITY_HUD)) + if(!HAS_TRAIT(human_user, TRAIT_SECURITY_HUD)) return var/datum/data/crime/crime = GLOB.data_core.createCrimeEntry(t1, "", allowed_access, station_time_timestamp(), fine) for (var/obj/item/modular_computer/tablet in GLOB.TabletMessengers) - if(tablet.saved_identification == R.fields["name"]) + if(tablet.saved_identification == target_record.fields["name"]) var/message = "You have been fined [fine] credits for '[t1]'. Fines may be paid at security." var/datum/signal/subspace/messaging/tablet_msg/signal = new(src, list( "name" = "Security Citation", @@ -304,70 +302,74 @@ "automated" = TRUE )) signal.send_to_receivers() - usr.log_message("(PDA: Citation Server) sent \"[message]\" to [signal.format_target()]", LOG_PDA) - GLOB.data_core.addCitation(R.fields["id"], crime) - investigate_log("New Citation: [t1] Fine: [fine] | Added to [R.fields["name"]] by [key_name(usr)]", INVESTIGATE_RECORDS) - SSblackbox.ReportCitation(crime.dataId, usr.ckey, usr.real_name, R.fields["name"], t1, fine) + human_user.log_message("(PDA: Citation Server) sent \"[message]\" to [signal.format_target()]", LOG_PDA) + GLOB.data_core.addCitation(target_record.fields["id"], crime) + investigate_log("New Citation: [t1] Fine: [fine] | Added to [target_record.fields["name"]] by [key_name(human_user)]", INVESTIGATE_RECORDS) + SSblackbox.ReportCitation(crime.dataId, human_user.ckey, human_user.real_name, target_record.fields["name"], t1, fine) return if(href_list["add_crime"]) - var/t1 = tgui_input_text(usr, "Crime name", "Security HUD") - if(!R || !t1 || !allowed_access) + var/t1 = tgui_input_text(human_user, "Crime name", "Security HUD") + if(!target_record || !t1 || !allowed_access) return - if(!H.canUseHUD()) + if(!human_user.canUseHUD()) return - if(!HAS_TRAIT(H, TRAIT_SECURITY_HUD)) + if(!HAS_TRAIT(human_user, TRAIT_SECURITY_HUD)) return var/crime = GLOB.data_core.createCrimeEntry(t1, null, allowed_access, station_time_timestamp()) - GLOB.data_core.addCrime(R.fields["id"], crime) - investigate_log("New Crime: [t1] | Added to [R.fields["name"]] by [key_name(usr)]", INVESTIGATE_RECORDS) - to_chat(usr, span_notice("Successfully added a crime.")) + GLOB.data_core.addCrime(target_record.fields["id"], crime) + investigate_log("New Crime: [t1] | Added to [target_record.fields["name"]] by [key_name(human_user)]", INVESTIGATE_RECORDS) + to_chat(human_user, span_notice("Successfully added a crime.")) return if(href_list["add_details"]) - var/t1 = tgui_input_text(usr, "Crime details", "Security Records", multiline = TRUE) - if(!R || !t1 || !allowed_access) + var/t1 = tgui_input_text(human_user, "Crime details", "Security Records", multiline = TRUE) + if(!target_record || !t1 || !allowed_access) return - if(!H.canUseHUD()) + if(!human_user.canUseHUD()) return - if(!HAS_TRAIT(H, TRAIT_SECURITY_HUD)) + if(!HAS_TRAIT(human_user, TRAIT_SECURITY_HUD)) return if(href_list["cdataid"]) - GLOB.data_core.addCrimeDetails(R.fields["id"], href_list["cdataid"], t1) - investigate_log("New Crime details: [t1] | Added to [R.fields["name"]] by [key_name(usr)]", INVESTIGATE_RECORDS) - to_chat(usr, span_notice("Successfully added details.")) + GLOB.data_core.addCrimeDetails(target_record.fields["id"], href_list["cdataid"], t1) + investigate_log("New Crime details: [t1] | Added to [target_record.fields["name"]] by [key_name(human_user)]", INVESTIGATE_RECORDS) + to_chat(human_user, span_notice("Successfully added details.")) return if(href_list["view_comment"]) - if(!H.canUseHUD()) + if(!human_user.canUseHUD()) return - if(!HAS_TRAIT(H, TRAIT_SECURITY_HUD)) + if(!HAS_TRAIT(human_user, TRAIT_SECURITY_HUD)) return - to_chat(usr, "Comments/Log:") + to_chat(human_user, "Comments/Log:") var/counter = 1 - while(R.fields[text("com_[]", counter)]) - to_chat(usr, R.fields[text("com_[]", counter)]) - to_chat(usr, "----------") + while(target_record.fields[text("com_[]", counter)]) + to_chat(human_user, target_record.fields[text("com_[]", counter)]) + to_chat(human_user, "----------") counter++ return if(href_list["add_comment"]) - var/t1 = tgui_input_text(usr, "Add a comment", "Security Records", multiline = TRUE) - if (!R || !t1 || !allowed_access) + var/t1 = tgui_input_text(human_user, "Add a comment", "Security Records", multiline = TRUE) + if (!target_record || !t1 || !allowed_access) return - if(!H.canUseHUD()) + if(!human_user.canUseHUD()) return - if(!HAS_TRAIT(H, TRAIT_SECURITY_HUD)) + if(!HAS_TRAIT(human_user, TRAIT_SECURITY_HUD)) return var/counter = 1 - while(R.fields[text("com_[]", counter)]) + while(target_record.fields[text("com_[]", counter)]) counter++ - R.fields[text("com_[]", counter)] = text("Made by [] on [] [], []
[]", allowed_access, station_time_timestamp(), time2text(world.realtime, "MMM DD"), GLOB.year_integer+540, t1) - to_chat(usr, span_notice("Successfully added comment.")) + target_record.fields[text("com_[]", counter)] = text("Made by [] on [] [], []
[]", allowed_access, station_time_timestamp(), time2text(world.realtime, "MMM DD"), GLOB.year_integer+540, t1) + to_chat(human_user, span_notice("Successfully added comment.")) return ..() //end of this massive fucking chain. TODO: make the hud chain not spooky. - Yeah, great job doing that. +//called when something steps onto a human +/mob/living/carbon/human/proc/on_entered(datum/source, atom/movable/AM) + SIGNAL_HANDLER + spreadFire(AM) /mob/living/carbon/human/proc/canUseHUD() return (mobility_flags & MOBILITY_USE) @@ -772,9 +774,6 @@ return FALSE return ..() -/mob/living/carbon/human/is_literate() - return !HAS_TRAIT(src, TRAIT_ILLITERATE) - /mob/living/carbon/human/vomit(lost_nutrition = 10, blood = FALSE, stun = TRUE, distance = 1, message = TRUE, vomit_type = VOMIT_TOXIC, harm = TRUE, force = FALSE, purge_ratio = 0.1) if(blood && (NOBLOOD in dna.species.species_traits) && !HAS_TRAIT(src, TRAIT_TOXINLOVER)) if(message) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index a6e6621b304423..d6246f20e6babf 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -709,8 +709,9 @@ return var/list/combined_msg = list() - visible_message(span_notice("[src] examines [p_them()]self."), \ - span_notice("You check yourself for injuries.")) + visible_message(span_notice("[src] examines [p_them()]self.")) + + combined_msg += span_notice("You check yourself for injuries.") var/list/missing = list(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) @@ -894,7 +895,7 @@ if(quirks.len) combined_msg += span_notice("You have these quirks: [get_quirk_string(FALSE, CAT_QUIRK_ALL)].") - to_chat(src, combined_msg.Join("\n")) + to_chat(src, examine_block(combined_msg.Join("\n"))) /mob/living/carbon/human/damage_clothes(damage_amount, damage_type = BRUTE, damage_flag = 0, def_zone) if(damage_type != BRUTE && damage_type != BURN) diff --git a/code/modules/mob/living/carbon/human/human_say.dm b/code/modules/mob/living/carbon/human/human_say.dm index 5d27c1bcfa0e08..f128edc322dd4f 100644 --- a/code/modules/mob/living/carbon/human/human_say.dm +++ b/code/modules/mob/living/carbon/human/human_say.dm @@ -84,4 +84,4 @@ /mob/living/carbon/human/get_alt_name() if(name != GetVoice()) - return " (as [get_id_name("Unknown")])"\ + return " (as [get_id_name("Unknown")])" diff --git a/code/modules/mob/living/carbon/human/human_update_icons.dm b/code/modules/mob/living/carbon/human/human_update_icons.dm index cad78f2554a947..23c254ffa9506c 100644 --- a/code/modules/mob/living/carbon/human/human_update_icons.dm +++ b/code/modules/mob/living/carbon/human/human_update_icons.dm @@ -154,6 +154,13 @@ There are several things that need to be remembered: var/mutable_appearance/uniform_overlay + //This is how non-humanoid clothing works. You check if the mob has the right bodyflag, and the clothing has the corresponding clothing flag. + //handled_by_bodytype is used to track whether or not we successfully used an alternate sprite. It's set to TRUE to ease up on copy-paste. + //icon_file MUST be set to null by default, or it causes issues. + //handled_by_bodytype MUST be set to FALSE under the if(!icon_exists()) statement, or everything breaks. + //"override_file = handled_by_bodytype ? icon_file : null" MUST be added to the arguments of build_worn_icon() + //Friendly reminder that icon_exists(file, state, scream = TRUE) is your friend when debugging this code. + var/handled_by_bodytype = TRUE var/icon_file var/woman if(!uniform_overlay) @@ -167,6 +174,8 @@ There are several things that need to be remembered: if(!icon_exists(icon_file, RESOLVE_ICON_STATE(uniform))) icon_file = DEFAULT_UNIFORM_FILE + handled_by_bodytype = FALSE + //END SPECIES HANDLING uniform_overlay = uniform.build_worn_icon( default_layer = UNIFORM_LAYER, @@ -174,6 +183,7 @@ There are several things that need to be remembered: isinhands = FALSE, female_uniform = woman ? uniform.female_sprite_flags : null, override_state = target_overlay, + override_file = handled_by_bodytype ? icon_file : null, ) if(OFFSET_UNIFORM in dna.species.offset_features) @@ -677,7 +687,7 @@ There are several things that need to be remembered: /mob/living/carbon/human/proc/update_hud_s_store(obj/item/worn_item) worn_item.screen_loc = ui_sstore1 - if((client && hud_used) && (hud_used.inventory_shown && hud_used.hud_shown)) + if(client && hud_used?.hud_shown) client.screen += worn_item update_observer_view(worn_item,TRUE) diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 36765de0ba2c67..a88896969b79dd 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -1,19 +1,8 @@ /mob/living/carbon/human/can_equip(obj/item/I, slot, disable_warning = FALSE, bypass_equip_delay_self = FALSE) return dna.species.can_equip(I, slot, disable_warning, src, bypass_equip_delay_self) -// Return the item currently in the slot ID /mob/living/carbon/human/get_item_by_slot(slot_id) switch(slot_id) - if(ITEM_SLOT_BACK) - return back - if(ITEM_SLOT_MASK) - return wear_mask - if(ITEM_SLOT_NECK) - return wear_neck - if(ITEM_SLOT_HANDCUFFED) - return handcuffed - if(ITEM_SLOT_LEGCUFFED) - return legcuffed if(ITEM_SLOT_BELT) return belt if(ITEM_SLOT_ID) @@ -24,8 +13,6 @@ return glasses if(ITEM_SLOT_GLOVES) return gloves - if(ITEM_SLOT_HEAD) - return head if(ITEM_SLOT_FEET) return shoes if(ITEM_SLOT_OCLOTHING) @@ -38,7 +25,47 @@ return r_store if(ITEM_SLOT_SUITSTORE) return s_store - return null + + return ..() + +/mob/living/carbon/human/get_slot_by_item(obj/item/looking_for) + if(looking_for == belt) + return ITEM_SLOT_BELT + + if(looking_for == wear_id) + return ITEM_SLOT_ID + + if(looking_for == ears) + return ITEM_SLOT_EARS + + if(looking_for == glasses) + return ITEM_SLOT_EYES + + if(looking_for == gloves) + return ITEM_SLOT_GLOVES + + if(looking_for == head) + return ITEM_SLOT_HEAD + + if(looking_for == shoes) + return ITEM_SLOT_FEET + + if(looking_for == wear_suit) + return ITEM_SLOT_OCLOTHING + + if(looking_for == w_uniform) + return ITEM_SLOT_ICLOTHING + + if(looking_for == r_store) + return ITEM_SLOT_RPOCKET + + if(looking_for == l_store) + return ITEM_SLOT_LPOCKET + + if(looking_for == s_store) + return ITEM_SLOT_SUITSTORE + + return ..() /mob/living/carbon/human/get_all_worn_items() . = get_head_slots() | get_body_slots() diff --git a/code/modules/mob/living/carbon/human/login.dm b/code/modules/mob/living/carbon/human/login.dm index b66d842fd10e84..dc2e5e70546e4b 100644 --- a/code/modules/mob/living/carbon/human/login.dm +++ b/code/modules/mob/living/carbon/human/login.dm @@ -7,7 +7,6 @@ return var/list/print_msg = list() - print_msg += span_info("*---------*") print_msg += span_userdanger("As you snap back to consciousness, you recall people messing with your stuff...") afk_thefts = reverse_range(afk_thefts) @@ -28,7 +27,6 @@ if(LAZYLEN(afk_thefts) >= AFK_THEFT_MAX_MESSAGES) print_msg += span_warning("There may have been more, but that's all you can remember...") - print_msg += span_info("*---------*") - to_chat(src, print_msg.Join("\n")) + to_chat(src, examine_block(print_msg.Join("\n"))) LAZYNULL(afk_thefts) diff --git a/code/modules/mob/living/carbon/human/monkey/monkey.dm b/code/modules/mob/living/carbon/human/monkey/monkey.dm index a4ce98269e53f8..b0cccf6618d8a0 100644 --- a/code/modules/mob/living/carbon/human/monkey/monkey.dm +++ b/code/modules/mob/living/carbon/human/monkey/monkey.dm @@ -24,10 +24,13 @@ /mob/living/carbon/human/species/monkey/angry/Initialize(mapload) . = ..() if(prob(10)) - var/obj/item/clothing/head/helmet/justice/escape/helmet = new(src) - equip_to_slot_or_del(helmet,ITEM_SLOT_HEAD) - helmet.attack_self(src) // todo encapsulate toggle + INVOKE_ASYNC(src, .proc/give_ape_escape_helmet) +/// Gives our funny monkey an Ape Escape hat reference +/mob/living/carbon/human/species/monkey/angry/proc/give_ape_escape_helmet() + var/obj/item/clothing/head/helmet/justice/escape/helmet = new(src) + equip_to_slot_or_del(helmet, ITEM_SLOT_HEAD) + helmet.attack_self(src) // todo encapsulate toggle GLOBAL_DATUM(the_one_and_only_punpun, /mob/living/carbon/human/species/monkey/punpun) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index a5996aec183d0f..f952fb621e9053 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -173,7 +173,7 @@ GLOBAL_LIST_EMPTY(features_by_species) ///Species-only traits. Can be found in [code/__DEFINES/DNA.dm] var/list/species_traits = list() ///Generic traits tied to having the species. - var/list/inherent_traits = list(TRAIT_ADVANCEDTOOLUSER, TRAIT_CAN_STRIP) + var/list/inherent_traits = list(TRAIT_ADVANCEDTOOLUSER, TRAIT_CAN_STRIP, TRAIT_LITERATE) /// List of biotypes the mob belongs to. Used by diseases. var/inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID ///List of factions the mob gain upon gaining this species. @@ -1120,10 +1120,14 @@ GLOBAL_LIST_EMPTY(features_by_species) var/attack_direction = get_dir(user, target) if(atk_effect == ATTACK_EFFECT_KICK)//kicks deal 1.5x raw damage target.apply_damage(damage*1.5, user.dna.species.attack_type, affecting, armor_block, attack_direction = attack_direction) + if((damage * 1.5) >= 9) + target.force_say() log_combat(user, target, "kicked") else//other attacks deal full raw damage + 1.5x in stamina damage target.apply_damage(damage, user.dna.species.attack_type, affecting, armor_block, attack_direction = attack_direction) target.apply_damage(damage*1.5, STAMINA, affecting, armor_block) + if(damage >= 9) + target.force_say() log_combat(user, target, "punched") if((target.stat != DEAD) && damage >= user.dna.species.punchstunthreshold) @@ -1157,126 +1161,133 @@ GLOBAL_LIST_EMPTY(features_by_species) /datum/species/proc/spec_hitby(atom/movable/AM, mob/living/carbon/human/H) return -/datum/species/proc/spec_attack_hand(mob/living/carbon/human/M, mob/living/carbon/human/H, datum/martial_art/attacker_style, modifiers) - if(!istype(M)) +/datum/species/proc/spec_attack_hand(mob/living/carbon/human/owner, mob/living/carbon/human/target, datum/martial_art/attacker_style, modifiers) + if(!istype(owner)) return - CHECK_DNA_AND_SPECIES(M) - CHECK_DNA_AND_SPECIES(H) + CHECK_DNA_AND_SPECIES(owner) + CHECK_DNA_AND_SPECIES(target) - if(!istype(M)) //sanity check for drones. + if(!istype(owner)) //sanity check for drones. return - if(M.mind) - attacker_style = M.mind.martial_art - if((M != H) && M.combat_mode && H.check_shields(M, 0, M.name, attack_type = UNARMED_ATTACK)) - log_combat(M, H, "attempted to touch") - H.visible_message(span_warning("[M] attempts to touch [H]!"), \ - span_danger("[M] attempts to touch you!"), span_hear("You hear a swoosh!"), COMBAT_MESSAGE_RANGE, M) - to_chat(M, span_warning("You attempt to touch [H]!")) + if(owner.mind) + attacker_style = owner.mind.martial_art + if((owner != target) && owner.combat_mode && target.check_shields(owner, 0, owner.name, attack_type = UNARMED_ATTACK)) + log_combat(owner, target, "attempted to touch") + target.visible_message(span_warning("[owner] attempts to touch [target]!"), \ + span_danger("[owner] attempts to touch you!"), span_hear("You hear a swoosh!"), COMBAT_MESSAGE_RANGE, owner) + to_chat(owner, span_warning("You attempt to touch [target]!")) return - SEND_SIGNAL(M, COMSIG_MOB_ATTACK_HAND, M, H, attacker_style) + SEND_SIGNAL(owner, COMSIG_MOB_ATTACK_HAND, owner, target, attacker_style) if(LAZYACCESS(modifiers, RIGHT_CLICK)) - disarm(M, H, attacker_style) + disarm(owner, target, attacker_style) return // dont attack after - if(M.combat_mode) - harm(M, H, attacker_style) + if(owner.combat_mode) + harm(owner, target, attacker_style) else - help(M, H, attacker_style) + help(owner, target, attacker_style) -/datum/species/proc/spec_attacked_by(obj/item/I, mob/living/user, obj/item/bodypart/affecting, mob/living/carbon/human/H) +/datum/species/proc/spec_attacked_by(obj/item/weapon, mob/living/user, obj/item/bodypart/affecting, mob/living/carbon/human/human) // Allows you to put in item-specific reactions based on species - if(user != H) - if(H.check_shields(I, I.force, "the [I.name]", MELEE_ATTACK, I.armour_penetration)) + if(user != human) + if(human.check_shields(weapon, weapon.force, "the [weapon.name]", MELEE_ATTACK, weapon.armour_penetration)) return FALSE - if(H.check_block()) - H.visible_message(span_warning("[H] blocks [I]!"), \ - span_userdanger("You block [I]!")) + if(human.check_block()) + human.visible_message(span_warning("[human] blocks [weapon]!"), \ + span_userdanger("You block [weapon]!")) return FALSE var/hit_area if(!affecting) //Something went wrong. Maybe the limb is missing? - affecting = H.bodyparts[1] + affecting = human.bodyparts[1] hit_area = affecting.plaintext_zone var/def_zone = affecting.body_zone - var/armor_block = H.run_armor_check(affecting, MELEE, span_notice("Your armor has protected your [hit_area]!"), span_warning("Your armor has softened a hit to your [hit_area]!"),I.armour_penetration, weak_against_armour = I.weak_against_armour) + var/armor_block = human.run_armor_check(affecting, MELEE, span_notice("Your armor has protected your [hit_area]!"), span_warning("Your armor has softened a hit to your [hit_area]!"),weapon.armour_penetration, weak_against_armour = weapon.weak_against_armour) armor_block = min(ARMOR_MAX_BLOCK, armor_block) //cap damage reduction at 90% - var/Iwound_bonus = I.wound_bonus + var/Iwound_bonus = weapon.wound_bonus // this way, you can't wound with a surgical tool on help intent if they have a surgery active and are lying down, so a misclick with a circular saw on the wrong limb doesn't bleed them dry (they still get hit tho) - if((I.item_flags & SURGICAL_TOOL) && !user.combat_mode && H.body_position == LYING_DOWN && (LAZYLEN(H.surgeries) > 0)) + if((weapon.item_flags & SURGICAL_TOOL) && !user.combat_mode && human.body_position == LYING_DOWN && (LAZYLEN(human.surgeries) > 0)) Iwound_bonus = CANT_WOUND - var/weakness = check_species_weakness(I, user) + var/weakness = check_species_weakness(weapon, user) - H.send_item_attack_message(I, user, hit_area, affecting) + human.send_item_attack_message(weapon, user, hit_area, affecting) - var/attack_direction = get_dir(user, H) - apply_damage(I.force * weakness, I.damtype, def_zone, armor_block, H, wound_bonus = Iwound_bonus, bare_wound_bonus = I.bare_wound_bonus, sharpness = I.get_sharpness(), attack_direction = attack_direction) + var/attack_direction = get_dir(user, human) + apply_damage(weapon.force * weakness, weapon.damtype, def_zone, armor_block, human, wound_bonus = Iwound_bonus, bare_wound_bonus = weapon.bare_wound_bonus, sharpness = weapon.get_sharpness(), attack_direction = attack_direction) - if(!I.force) + if(!weapon.force) return FALSE //item force is zero - var/bloody = FALSE - if(((I.damtype == BRUTE) && I.force && prob(25 + (I.force * 2)))) - if(IS_ORGANIC_LIMB(affecting)) - I.add_mob_blood(H) //Make the weapon bloody, not the person. - if(prob(I.force * 2)) //blood spatter! - bloody = TRUE - var/turf/location = H.loc - if(istype(location)) - H.add_splatter_floor(location) - if(get_dist(user, H) <= 1) //people with TK won't get smeared with blood - user.add_mob_blood(H) - - switch(hit_area) - if(BODY_ZONE_HEAD) - if(!I.get_sharpness() && armor_block < 50) - if(prob(I.force)) - H.adjustOrganLoss(ORGAN_SLOT_BRAIN, 20) - if(H.stat == CONSCIOUS) - H.visible_message(span_danger("[H] is knocked senseless!"), \ - span_userdanger("You're knocked senseless!")) - H.set_timed_status_effect(20 SECONDS, /datum/status_effect/confusion, only_if_higher = TRUE) - H.adjust_blurriness(10) - if(prob(10)) - H.gain_trauma(/datum/brain_trauma/mild/concussion) - else - H.adjustOrganLoss(ORGAN_SLOT_BRAIN, I.force * 0.2) - - if(H.mind && H.stat == CONSCIOUS && H != user && prob(I.force + ((100 - H.health) * 0.5))) // rev deconversion through blunt trauma. - var/datum/antagonist/rev/rev = H.mind.has_antag_datum(/datum/antagonist/rev) - if(rev) - rev.remove_revolutionary(FALSE, user) - - if(bloody) //Apply blood - if(H.wear_mask) - H.wear_mask.add_mob_blood(H) - H.update_inv_wear_mask() - if(H.head) - H.head.add_mob_blood(H) - H.update_inv_head() - if(H.glasses && prob(33)) - H.glasses.add_mob_blood(H) - H.update_inv_glasses() - - if(BODY_ZONE_CHEST) - if(H.stat == CONSCIOUS && !I.get_sharpness() && armor_block < 50) - if(prob(I.force)) - H.visible_message(span_danger("[H] is knocked down!"), \ - span_userdanger("You're knocked down!")) - H.apply_effect(60, EFFECT_KNOCKDOWN, armor_block) - - if(bloody) - if(H.wear_suit) - H.wear_suit.add_mob_blood(H) - H.update_inv_wear_suit() - if(H.w_uniform) - H.w_uniform.add_mob_blood(H) - H.update_inv_w_uniform() + if(weapon.damtype != BRUTE) + return TRUE + if(!(prob(25 + (weapon.force * 2)))) + return TRUE + + if(IS_ORGANIC_LIMB(affecting)) + weapon.add_mob_blood(human) //Make the weapon bloody, not the person. + if(prob(weapon.force * 2)) //blood spatter! + bloody = TRUE + var/turf/location = human.loc + if(istype(location)) + human.add_splatter_floor(location) + if(get_dist(user, human) <= 1) //people with TK won't get smeared with blood + user.add_mob_blood(human) + + switch(hit_area) + if(BODY_ZONE_HEAD) + if(!weapon.get_sharpness() && armor_block < 50) + if(prob(weapon.force)) + human.adjustOrganLoss(ORGAN_SLOT_BRAIN, 20) + if(human.stat == CONSCIOUS) + human.visible_message(span_danger("[human] is knocked senseless!"), \ + span_userdanger("You're knocked senseless!")) + human.set_timed_status_effect(20 SECONDS, /datum/status_effect/confusion, only_if_higher = TRUE) + human.adjust_blurriness(10) + if(prob(10)) + human.gain_trauma(/datum/brain_trauma/mild/concussion) + else + human.adjustOrganLoss(ORGAN_SLOT_BRAIN, weapon.force * 0.2) + + if(human.mind && human.stat == CONSCIOUS && human != user && prob(weapon.force + ((100 - human.health) * 0.5))) // rev deconversion through blunt trauma. + var/datum/antagonist/rev/rev = human.mind.has_antag_datum(/datum/antagonist/rev) + if(rev) + rev.remove_revolutionary(FALSE, user) + + if(bloody) //Apply blood + if(human.wear_mask) + human.wear_mask.add_mob_blood(human) + human.update_inv_wear_mask() + if(human.head) + human.head.add_mob_blood(human) + human.update_inv_head() + if(human.glasses && prob(33)) + human.glasses.add_mob_blood(human) + human.update_inv_glasses() + + if(BODY_ZONE_CHEST) + if(human.stat == CONSCIOUS && !weapon.get_sharpness() && armor_block < 50) + if(prob(weapon.force)) + human.visible_message(span_danger("[human] is knocked down!"), \ + span_userdanger("You're knocked down!")) + human.apply_effect(60, EFFECT_KNOCKDOWN, armor_block) + + if(bloody) + if(human.wear_suit) + human.wear_suit.add_mob_blood(human) + human.update_inv_wear_suit() + if(human.w_uniform) + human.w_uniform.add_mob_blood(human) + human.update_inv_w_uniform() + + /// Triggers force say events + if(weapon.force > 10 || weapon.force >= 5 && prob(33)) + human.force_say(user) return TRUE diff --git a/code/modules/mob/living/carbon/human/species_types/abductors.dm b/code/modules/mob/living/carbon/human/species_types/abductors.dm index 056f13623c8928..f3a8f04c5a2ba0 100644 --- a/code/modules/mob/living/carbon/human/species_types/abductors.dm +++ b/code/modules/mob/living/carbon/human/species_types/abductors.dm @@ -7,10 +7,11 @@ inherent_traits = list( TRAIT_ADVANCEDTOOLUSER, TRAIT_CAN_STRIP, - TRAIT_VIRUSIMMUNE, TRAIT_CHUNKYFINGERS, - TRAIT_NOHUNGER, TRAIT_NOBREATH, + TRAIT_NOHUNGER, + TRAIT_LITERATE, + TRAIT_VIRUSIMMUNE, ) mutanttongue = /obj/item/organ/internal/tongue/abductor changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT diff --git a/code/modules/mob/living/carbon/human/species_types/android.dm b/code/modules/mob/living/carbon/human/species_types/android.dm index 7c1f24f6968946..14846670a23ee2 100644 --- a/code/modules/mob/living/carbon/human/species_types/android.dm +++ b/code/modules/mob/living/carbon/human/species_types/android.dm @@ -6,21 +6,22 @@ inherent_traits = list( TRAIT_ADVANCEDTOOLUSER, TRAIT_CAN_STRIP, - TRAIT_NOMETABOLISM, - TRAIT_TOXIMMUNE, - TRAIT_RESISTHEAT, - TRAIT_NOBREATH, - TRAIT_RESISTCOLD, - TRAIT_RESISTHIGHPRESSURE, - TRAIT_RESISTLOWPRESSURE, - TRAIT_RADIMMUNE, + TRAIT_CAN_USE_FLIGHT_POTION, TRAIT_GENELESS, - TRAIT_NOFIRE, - TRAIT_PIERCEIMMUNE, - TRAIT_NOHUNGER, TRAIT_LIMBATTACHMENT, + TRAIT_LITERATE, + TRAIT_NOBREATH, TRAIT_NOCLONELOSS, - TRAIT_CAN_USE_FLIGHT_POTION, + TRAIT_NOFIRE, + TRAIT_NOHUNGER, + TRAIT_NOMETABOLISM, + TRAIT_PIERCEIMMUNE, + TRAIT_RADIMMUNE, + TRAIT_RESISTCOLD, + TRAIT_RESISTHEAT, + TRAIT_RESISTLOWPRESSURE, + TRAIT_RESISTHIGHPRESSURE, + TRAIT_TOXIMMUNE, ) inherent_biotypes = MOB_ROBOTIC|MOB_HUMANOID meat = null diff --git a/code/modules/mob/living/carbon/human/species_types/dullahan.dm b/code/modules/mob/living/carbon/human/species_types/dullahan.dm index 1cdca7279be931..6282ebe156aee2 100644 --- a/code/modules/mob/living/carbon/human/species_types/dullahan.dm +++ b/code/modules/mob/living/carbon/human/species_types/dullahan.dm @@ -5,8 +5,9 @@ inherent_traits = list( TRAIT_ADVANCEDTOOLUSER, TRAIT_CAN_STRIP, - TRAIT_NOHUNGER, + TRAIT_LITERATE, TRAIT_NOBREATH, + TRAIT_NOHUNGER, ) inherent_biotypes = MOB_UNDEAD|MOB_HUMANOID mutant_bodyparts = list("wings" = "None") diff --git a/code/modules/mob/living/carbon/human/species_types/flypeople.dm b/code/modules/mob/living/carbon/human/species_types/flypeople.dm index f3d58a512ff122..9cb6eef50fe670 100644 --- a/code/modules/mob/living/carbon/human/species_types/flypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/flypeople.dm @@ -8,6 +8,7 @@ TRAIT_ADVANCEDTOOLUSER, TRAIT_CAN_STRIP, TRAIT_CAN_USE_FLIGHT_POTION, + TRAIT_LITERATE, ) inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_BUG meat = /obj/item/food/meat/slab/human/mutant/fly diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm index 930923cd5e2ec8..386baf3d921b5b 100644 --- a/code/modules/mob/living/carbon/human/species_types/golems.dm +++ b/code/modules/mob/living/carbon/human/species_types/golems.dm @@ -6,17 +6,18 @@ inherent_traits = list( TRAIT_ADVANCEDTOOLUSER, TRAIT_CAN_STRIP, - TRAIT_RESISTHEAT, + TRAIT_CHUNKYFINGERS, + TRAIT_GENELESS, + TRAIT_LITERATE, TRAIT_NOBREATH, + TRAIT_NODISMEMBER, + TRAIT_NOFIRE, + TRAIT_PIERCEIMMUNE, + TRAIT_RADIMMUNE, TRAIT_RESISTCOLD, + TRAIT_RESISTHEAT, TRAIT_RESISTHIGHPRESSURE, TRAIT_RESISTLOWPRESSURE, - TRAIT_NOFIRE, - TRAIT_CHUNKYFINGERS, - TRAIT_RADIMMUNE, - TRAIT_GENELESS, - TRAIT_PIERCEIMMUNE, - TRAIT_NODISMEMBER, ) inherent_biotypes = MOB_HUMANOID|MOB_MINERAL mutant_organs = list(/obj/item/organ/internal/adamantine_resonator) @@ -115,15 +116,16 @@ inherent_traits = list( TRAIT_ADVANCEDTOOLUSER, TRAIT_CAN_STRIP, + TRAIT_CHUNKYFINGERS, + TRAIT_GENELESS, + TRAIT_LITERATE, TRAIT_NOBREATH, + TRAIT_NODISMEMBER, + TRAIT_PIERCEIMMUNE, + TRAIT_RADIMMUNE, TRAIT_RESISTCOLD, TRAIT_RESISTHIGHPRESSURE, TRAIT_RESISTLOWPRESSURE, - TRAIT_CHUNKYFINGERS, - TRAIT_RADIMMUNE, - TRAIT_GENELESS, - TRAIT_PIERCEIMMUNE, - TRAIT_NODISMEMBER, ) info_text = "As a Plasma Golem, you burn easily. Be careful, if you get hot enough while burning, you'll blow up!" heatmod = 0 //fine until they blow up @@ -209,7 +211,7 @@ fixed_mut_color = "#dddddd" punchstunthreshold = 9 //60% chance, from 40% meat = /obj/item/stack/ore/silver - info_text = "As a Silver Golem, your attacks have a higher chance of stunning. Being made of silver, your body is immune to most types of magic." + info_text = "As a Silver Golem, your attacks have a higher chance of stunning. Being made of silver, your body is immune to spirits of the damned and runic golems." prefix = "Silver" special_names = list("Surfer", "Chariot", "Lining") examine_limb_id = SPECIES_GOLEM @@ -325,15 +327,16 @@ inherent_traits = list( TRAIT_ADVANCEDTOOLUSER, TRAIT_CAN_STRIP, - TRAIT_NOBREATH, - TRAIT_RESISTCOLD, - TRAIT_RESISTHIGHPRESSURE, - TRAIT_RESISTLOWPRESSURE, TRAIT_CHUNKYFINGERS, - TRAIT_RADIMMUNE, TRAIT_GENELESS, - TRAIT_PIERCEIMMUNE, + TRAIT_LITERATE, + TRAIT_NOBREATH, TRAIT_NODISMEMBER, + TRAIT_PIERCEIMMUNE, + TRAIT_RADIMMUNE, + TRAIT_RESISTCOLD, + TRAIT_RESISTLOWPRESSURE, + TRAIT_RESISTHIGHPRESSURE, ) inherent_biotypes = MOB_ORGANIC | MOB_HUMANOID | MOB_PLANT armor = 30 @@ -593,18 +596,19 @@ inherent_traits = list( TRAIT_ADVANCEDTOOLUSER, TRAIT_CAN_STRIP, - TRAIT_RESISTHEAT, - TRAIT_NOBREATH, - TRAIT_RESISTCOLD, - TRAIT_RESISTHIGHPRESSURE, - TRAIT_RESISTLOWPRESSURE, - TRAIT_NOFIRE, TRAIT_CHUNKYFINGERS, TRAIT_CLUMSY, - TRAIT_RADIMMUNE, TRAIT_GENELESS, - TRAIT_PIERCEIMMUNE, + TRAIT_LITERATE, + TRAIT_NOBREATH, TRAIT_NODISMEMBER, + TRAIT_NOFIRE, + TRAIT_PIERCEIMMUNE, + TRAIT_RADIMMUNE, + TRAIT_RESISTCOLD, + TRAIT_RESISTHEAT, + TRAIT_RESISTHIGHPRESSURE, + TRAIT_RESISTLOWPRESSURE, ) punchdamagelow = 0 punchdamagehigh = 1 @@ -701,18 +705,19 @@ inherent_traits = list( TRAIT_ADVANCEDTOOLUSER, TRAIT_CAN_STRIP, + TRAIT_CHUNKYFINGERS, + TRAIT_GENELESS, + TRAIT_LITERATE, + TRAIT_NOBREATH, + TRAIT_NODISMEMBER, + TRAIT_NOFIRE, TRAIT_NOFLASH, + TRAIT_PIERCEIMMUNE, + TRAIT_RADIMMUNE, TRAIT_RESISTHEAT, - TRAIT_NOBREATH, TRAIT_RESISTCOLD, - TRAIT_RESISTHIGHPRESSURE, TRAIT_RESISTLOWPRESSURE, - TRAIT_NOFIRE, - TRAIT_CHUNKYFINGERS, - TRAIT_RADIMMUNE, - TRAIT_GENELESS, - TRAIT_PIERCEIMMUNE, - TRAIT_NODISMEMBER, + TRAIT_RESISTHIGHPRESSURE, ) inherent_biotypes = MOB_HUMANOID|MOB_MINERAL prefix = "Runic" @@ -728,9 +733,12 @@ BODY_ZONE_CHEST = /obj/item/bodypart/chest/golem/cult, ) - var/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift/golem/phase_shift - var/obj/effect/proc_holder/spell/pointed/abyssal_gaze/abyssal_gaze - var/obj/effect/proc_holder/spell/pointed/dominate/dominate + /// A ref to our jaunt spell that we get on species gain. + var/datum/action/cooldown/spell/jaunt/ethereal_jaunt/shift/golem/jaunt + /// A ref to our gaze spell that we get on species gain. + var/datum/action/cooldown/spell/pointed/abyssal_gaze/abyssal_gaze + /// A ref to our dominate spell that we get on species gain. + var/datum/action/cooldown/spell/pointed/dominate/dominate /datum/species/golem/runic/random_name(gender,unique,lastname) var/edgy_first_name = pick("Razor","Blood","Dark","Evil","Cold","Pale","Black","Silent","Chaos","Deadly","Coldsteel") @@ -738,26 +746,30 @@ var/golem_name = "[edgy_first_name] [edgy_last_name]" return golem_name -/datum/species/golem/runic/on_species_gain(mob/living/carbon/C, datum/species/old_species) +/datum/species/golem/runic/on_species_gain(mob/living/carbon/grant_to, datum/species/old_species) . = ..() - phase_shift = new - phase_shift.charge_counter = 0 - C.AddSpell(phase_shift) - abyssal_gaze = new - abyssal_gaze.charge_counter = 0 - C.AddSpell(abyssal_gaze) - dominate = new - dominate.charge_counter = 0 - C.AddSpell(dominate) + // Create our species specific spells here. + // Note we link them to the mob, not the mind, + // so they're not moved around on mindswaps + jaunt = new(grant_to) + jaunt.StartCooldown() + jaunt.Grant(grant_to) + + abyssal_gaze = new(grant_to) + abyssal_gaze.StartCooldown() + abyssal_gaze.Grant(grant_to) + + dominate = new(grant_to) + dominate.StartCooldown() + dominate.Grant(grant_to) /datum/species/golem/runic/on_species_loss(mob/living/carbon/C) - . = ..() - if(phase_shift) - C.RemoveSpell(phase_shift) - if(abyssal_gaze) - C.RemoveSpell(abyssal_gaze) - if(dominate) - C.RemoveSpell(dominate) + // Aaand cleanup our species specific spells. + // No free rides. + QDEL_NULL(jaunt) + QDEL_NULL(abyssal_gaze) + QDEL_NULL(dominate) + return ..() /datum/species/golem/runic/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H, delta_time, times_fired) if(istype(chem, /datum/reagent/water/holywater)) @@ -779,15 +791,16 @@ inherent_traits = list( TRAIT_ADVANCEDTOOLUSER, TRAIT_CAN_STRIP, - TRAIT_RESISTCOLD, + TRAIT_CHUNKYFINGERS, + TRAIT_GENELESS, + TRAIT_LITERATE, TRAIT_NOBREATH, + TRAIT_NODISMEMBER, + TRAIT_PIERCEIMMUNE, + TRAIT_RADIMMUNE, + TRAIT_RESISTCOLD, TRAIT_RESISTHIGHPRESSURE, TRAIT_RESISTLOWPRESSURE, - TRAIT_RADIMMUNE, - TRAIT_GENELESS, - TRAIT_PIERCEIMMUNE, - TRAIT_NODISMEMBER, - TRAIT_CHUNKYFINGERS, ) inherent_biotypes = MOB_UNDEAD|MOB_HUMANOID armor = 15 //feels no pain, but not too resistant @@ -951,17 +964,18 @@ inherent_traits = list( TRAIT_ADVANCEDTOOLUSER, TRAIT_CAN_STRIP, - TRAIT_RESISTHEAT, + TRAIT_CHUNKYFINGERS, + TRAIT_GENELESS, + TRAIT_LITERATE, TRAIT_NOBREATH, + TRAIT_NODISMEMBER, + TRAIT_NOFIRE, + TRAIT_PIERCEIMMUNE, + TRAIT_RADIMMUNE, TRAIT_RESISTCOLD, + TRAIT_RESISTHEAT, TRAIT_RESISTHIGHPRESSURE, TRAIT_RESISTLOWPRESSURE, - TRAIT_NOFIRE, - TRAIT_CHUNKYFINGERS, - TRAIT_RADIMMUNE, - TRAIT_GENELESS, - TRAIT_PIERCEIMMUNE, - TRAIT_NODISMEMBER, TRAIT_VENTCRAWLER_NUDE, ) prefix = "Plastic" @@ -1050,16 +1064,17 @@ inherent_traits = list( TRAIT_ADVANCEDTOOLUSER, TRAIT_CAN_STRIP, - TRAIT_NOBREATH, - TRAIT_RESISTCOLD, - TRAIT_RESISTHIGHPRESSURE, - TRAIT_RESISTLOWPRESSURE, TRAIT_CHUNKYFINGERS, - TRAIT_RADIMMUNE, TRAIT_GENELESS, - TRAIT_PIERCEIMMUNE, + TRAIT_LITERATE, + TRAIT_NOBREATH, TRAIT_NODISMEMBER, TRAIT_NOFLASH, + TRAIT_PIERCEIMMUNE, + TRAIT_RADIMMUNE, + TRAIT_RESISTCOLD, + TRAIT_RESISTHIGHPRESSURE, + TRAIT_RESISTLOWPRESSURE, ) attack_verb = "whips" attack_sound = 'sound/weapons/whip.ogg' @@ -1115,15 +1130,16 @@ inherent_traits = list( TRAIT_ADVANCEDTOOLUSER, TRAIT_CAN_STRIP, + TRAIT_CHUNKYFINGERS, + TRAIT_GENELESS, + TRAIT_LITERATE, TRAIT_NOBREATH, + TRAIT_NODISMEMBER, + TRAIT_PIERCEIMMUNE, + TRAIT_RADIMMUNE, TRAIT_RESISTCOLD, TRAIT_RESISTHIGHPRESSURE, TRAIT_RESISTLOWPRESSURE, - TRAIT_CHUNKYFINGERS, - TRAIT_RADIMMUNE, - TRAIT_GENELESS, - TRAIT_PIERCEIMMUNE, - TRAIT_NODISMEMBER, TRAIT_STRONG_GRABBER, ) prefix = "Leather" @@ -1142,16 +1158,17 @@ inherent_traits = list( TRAIT_ADVANCEDTOOLUSER, TRAIT_CAN_STRIP, - TRAIT_NOBREATH, - TRAIT_RESISTCOLD, - TRAIT_RESISTHIGHPRESSURE, - TRAIT_RESISTLOWPRESSURE, TRAIT_CHUNKYFINGERS, - TRAIT_RADIMMUNE, TRAIT_GENELESS, - TRAIT_PIERCEIMMUNE, + TRAIT_LITERATE, + TRAIT_NOBREATH, TRAIT_NODISMEMBER, TRAIT_NOFLASH, + TRAIT_PIERCEIMMUNE, + TRAIT_RADIMMUNE, + TRAIT_RESISTCOLD, + TRAIT_RESISTHIGHPRESSURE, + TRAIT_RESISTLOWPRESSURE, ) info_text = "As a Durathread Golem, your strikes will cause those your targets to start choking, but your woven body won't withstand fire as well." bodypart_overrides = list( @@ -1184,19 +1201,20 @@ inherent_traits = list( TRAIT_ADVANCEDTOOLUSER, TRAIT_CAN_STRIP, - TRAIT_NOFLASH, - TRAIT_RESISTHEAT, + TRAIT_CHUNKYFINGERS, + TRAIT_FAKEDEATH, + TRAIT_GENELESS, + TRAIT_LITERATE, TRAIT_NOBREATH, + TRAIT_NOFIRE, + TRAIT_NODISMEMBER, + TRAIT_NOFLASH, + TRAIT_PIERCEIMMUNE, + TRAIT_RADIMMUNE, TRAIT_RESISTCOLD, + TRAIT_RESISTHEAT, TRAIT_RESISTHIGHPRESSURE, TRAIT_RESISTLOWPRESSURE, - TRAIT_NOFIRE, - TRAIT_CHUNKYFINGERS, - TRAIT_RADIMMUNE, - TRAIT_GENELESS, - TRAIT_PIERCEIMMUNE, - TRAIT_NODISMEMBER, - TRAIT_FAKEDEATH, ) species_language_holder = /datum/language_holder/golem/bone info_text = "As a Bone Golem, You have a powerful spell that lets you chill your enemies with fear, and milk heals you! Just make sure to watch our for bone-hurting juice." @@ -1297,15 +1315,16 @@ inherent_traits = list( TRAIT_ADVANCEDTOOLUSER, TRAIT_CAN_STRIP, + TRAIT_CHUNKYFINGERS, + TRAIT_GENELESS, + TRAIT_LITERATE, TRAIT_NOBREATH, + TRAIT_NODISMEMBER, + TRAIT_PIERCEIMMUNE, + TRAIT_RADIMMUNE, TRAIT_RESISTCOLD, TRAIT_RESISTHIGHPRESSURE, TRAIT_RESISTLOWPRESSURE, - TRAIT_CHUNKYFINGERS, - TRAIT_RADIMMUNE, - TRAIT_GENELESS, - TRAIT_PIERCEIMMUNE, - TRAIT_NODISMEMBER, ) bodypart_overrides = list( BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/golem/snow, @@ -1315,8 +1334,11 @@ BODY_ZONE_R_LEG = /obj/item/bodypart/r_leg/golem/snow, BODY_ZONE_CHEST = /obj/item/bodypart/chest/golem/snow, ) - var/obj/effect/proc_holder/spell/targeted/conjure_item/snowball/ball - var/obj/effect/proc_holder/spell/aimed/cryo/cryo + + /// A ref to our "throw snowball" spell we get on species gain. + var/datum/action/cooldown/spell/conjure_item/snowball/snowball + /// A ref to our cryobeam spell we get on species gain. + var/datum/action/cooldown/spell/pointed/projectile/cryo/cryo /datum/species/golem/snow/spec_death(gibbed, mob/living/carbon/human/H) H.visible_message(span_danger("[H] turns into a pile of snow!")) @@ -1327,31 +1349,23 @@ new /obj/item/food/grown/carrot(get_turf(H)) qdel(H) -/datum/species/golem/snow/on_species_gain(mob/living/carbon/C, datum/species/old_species) - . = ..() - ADD_TRAIT(C, TRAIT_SNOWSTORM_IMMUNE, SPECIES_TRAIT) - ball = new - ball.charge_counter = 0 - C.AddSpell(ball) - cryo = new - cryo.charge_counter = 0 - C.AddSpell(cryo) - -/datum/species/golem/snow/on_species_loss(mob/living/carbon/C) +/datum/species/golem/snow/on_species_gain(mob/living/carbon/grant_to, datum/species/old_species) . = ..() - REMOVE_TRAIT(C, TRAIT_SNOWSTORM_IMMUNE, SPECIES_TRAIT) - if(ball) - C.RemoveSpell(ball) - if(cryo) - C.RemoveSpell(cryo) - -/obj/effect/proc_holder/spell/targeted/conjure_item/snowball - name = "Snowball" - desc = "Concentrates cryokinetic forces to create snowballs, useful for throwing at people." - item_type = /obj/item/toy/snowball - charge_max = 15 - action_icon = 'icons/obj/toy.dmi' - action_icon_state = "snowball" + ADD_TRAIT(grant_to, TRAIT_SNOWSTORM_IMMUNE, SPECIES_TRAIT) + + snowball = new(grant_to) + snowball.StartCooldown() + snowball.Grant(grant_to) + + cryo = new(grant_to) + cryo.StartCooldown() + cryo.Grant(grant_to) + +/datum/species/golem/snow/on_species_loss(mob/living/carbon/remove_from) + REMOVE_TRAIT(remove_from, TRAIT_SNOWSTORM_IMMUNE, SPECIES_TRAIT) + QDEL_NULL(snowball) + QDEL_NULL(cryo) + return ..() /datum/species/golem/mhydrogen name = "Metallic Hydrogen Golem" @@ -1363,15 +1377,16 @@ inherent_traits = list( TRAIT_ADVANCEDTOOLUSER, TRAIT_CAN_STRIP, - TRAIT_NOFLASH, - TRAIT_RESISTHEAT, + TRAIT_CHUNKYFINGERS, + TRAIT_GENELESS, + TRAIT_LITERATE, TRAIT_NOBREATH, - TRAIT_RESISTHIGHPRESSURE, + TRAIT_NODISMEMBER, TRAIT_NOFIRE, + TRAIT_NOFLASH, TRAIT_RADIMMUNE, - TRAIT_GENELESS, - TRAIT_NODISMEMBER, - TRAIT_CHUNKYFINGERS, + TRAIT_RESISTHEAT, + TRAIT_RESISTHIGHPRESSURE, ) examine_limb_id = SPECIES_GOLEM diff --git a/code/modules/mob/living/carbon/human/species_types/humans.dm b/code/modules/mob/living/carbon/human/species_types/humans.dm index 490ca6e01f6869..f08ca038bd17ae 100644 --- a/code/modules/mob/living/carbon/human/species_types/humans.dm +++ b/code/modules/mob/living/carbon/human/species_types/humans.dm @@ -6,6 +6,7 @@ TRAIT_ADVANCEDTOOLUSER, TRAIT_CAN_STRIP, TRAIT_CAN_USE_FLIGHT_POTION, + TRAIT_LITERATE, ) mutant_bodyparts = list("wings" = "None") use_skintones = 1 diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm index e7a60373105095..5f4e124e334005 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -8,6 +8,7 @@ inherent_traits = list( TRAIT_ADVANCEDTOOLUSER, TRAIT_CAN_STRIP, + TRAIT_LITERATE, TRAIT_TOXINLOVER, ) mutantlungs = /obj/item/organ/internal/lungs/slime diff --git a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm index d175613706e627..ed6e32420b6f07 100644 --- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm @@ -9,6 +9,7 @@ TRAIT_ADVANCEDTOOLUSER, TRAIT_CAN_STRIP, TRAIT_CAN_USE_FLIGHT_POTION, + TRAIT_LITERATE, ) inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_REPTILE mutant_bodyparts = list("body_markings" = "None", "legs" = "Normal Legs") @@ -135,8 +136,8 @@ Lizard subspecies: ASHWALKERS TRAIT_ADVANCEDTOOLUSER, TRAIT_CAN_STRIP, TRAIT_CHUNKYFINGERS, + //TRAIT_LITERATE, TRAIT_VIRUSIMMUNE, - TRAIT_ILLITERATE, ) species_language_holder = /datum/language_holder/lizard/ash digitigrade_customization = DIGITIGRADE_FORCED @@ -151,11 +152,12 @@ Lizard subspecies: SILVER SCALED inherent_traits = list( TRAIT_ADVANCEDTOOLUSER, TRAIT_CAN_STRIP, + TRAIT_LITERATE, TRAIT_HOLY, TRAIT_NOBREATH, + TRAIT_PIERCEIMMUNE, TRAIT_RESISTHIGHPRESSURE, TRAIT_RESISTLOWPRESSURE, - TRAIT_PIERCEIMMUNE, TRAIT_VIRUSIMMUNE, TRAIT_WINE_TASTER, ) diff --git a/code/modules/mob/living/carbon/human/species_types/monkeys.dm b/code/modules/mob/living/carbon/human/species_types/monkeys.dm index 0bb54535c167e6..24d11a8e510e7a 100644 --- a/code/modules/mob/living/carbon/human/species_types/monkeys.dm +++ b/code/modules/mob/living/carbon/human/species_types/monkeys.dm @@ -25,10 +25,11 @@ ) inherent_traits = list( TRAIT_CAN_STRIP, - TRAIT_VENTCRAWLER_NUDE, + TRAIT_GUN_NATURAL, + //TRAIT_LITERATE, TRAIT_PRIMITIVE, + TRAIT_VENTCRAWLER_NUDE, TRAIT_WEAK_SOUL, - TRAIT_GUN_NATURAL, ) no_equip = list( ITEM_SLOT_OCLOTHING, diff --git a/code/modules/mob/living/carbon/human/species_types/mothmen.dm b/code/modules/mob/living/carbon/human/species_types/mothmen.dm index 1800cdd52cf489..4823b8008b624a 100644 --- a/code/modules/mob/living/carbon/human/species_types/mothmen.dm +++ b/code/modules/mob/living/carbon/human/species_types/mothmen.dm @@ -8,6 +8,7 @@ TRAIT_ADVANCEDTOOLUSER, TRAIT_CAN_STRIP, TRAIT_CAN_USE_FLIGHT_POTION, + TRAIT_LITERATE, ) inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_BUG mutant_bodyparts = list("moth_markings" = "None") @@ -110,7 +111,7 @@ SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK, SPECIES_PERK_ICON = "tshirt", SPECIES_PERK_NAME = "Meal Plan", - SPECIES_PERK_DESC = "Moths can eat clothes for nourishment.", + SPECIES_PERK_DESC = "Moths can eat clothes for temporary nourishment.", ), list( SPECIES_PERK_TYPE = SPECIES_NEGATIVE_PERK, diff --git a/code/modules/mob/living/carbon/human/species_types/mushpeople.dm b/code/modules/mob/living/carbon/human/species_types/mushpeople.dm index 876634c5db102e..28e3e6259b5447 100644 --- a/code/modules/mob/living/carbon/human/species_types/mushpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/mushpeople.dm @@ -14,6 +14,7 @@ inherent_traits = list( TRAIT_ADVANCEDTOOLUSER, TRAIT_CAN_STRIP, + TRAIT_LITERATE, TRAIT_NOBREATH, TRAIT_NOFLASH, ) diff --git a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm index 39dfd44a0a2470..55a644b44a302b 100644 --- a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm +++ b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm @@ -10,11 +10,12 @@ inherent_traits = list( TRAIT_ADVANCEDTOOLUSER, TRAIT_CAN_STRIP, - TRAIT_RESISTCOLD, - TRAIT_RADIMMUNE, TRAIT_GENELESS, - TRAIT_NOHUNGER, TRAIT_HARDLY_WOUNDED, + TRAIT_LITERATE, + TRAIT_RADIMMUNE, + TRAIT_RESISTCOLD, + TRAIT_NOHUNGER, ) inherent_biotypes = MOB_HUMANOID|MOB_MINERAL diff --git a/code/modules/mob/living/carbon/human/species_types/podpeople.dm b/code/modules/mob/living/carbon/human/species_types/podpeople.dm index eec8917fb9844f..603958f9367f33 100644 --- a/code/modules/mob/living/carbon/human/species_types/podpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/podpeople.dm @@ -7,6 +7,7 @@ inherent_traits = list( TRAIT_ADVANCEDTOOLUSER, TRAIT_CAN_STRIP, + TRAIT_LITERATE, TRAIT_PLANT_SAFE, ) external_organs = list( diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm index bdcc3f150f9f90..cf033942be167f 100644 --- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm @@ -9,9 +9,10 @@ inherent_traits = list( TRAIT_ADVANCEDTOOLUSER, TRAIT_CAN_STRIP, + TRAIT_LITERATE, + TRAIT_NOBREATH, TRAIT_RADIMMUNE, TRAIT_VIRUSIMMUNE, - TRAIT_NOBREATH, ) inherent_factions = list("faithless") changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC diff --git a/code/modules/mob/living/carbon/human/species_types/skeletons.dm b/code/modules/mob/living/carbon/human/species_types/skeletons.dm index e1da28b300ed75..ac9714fc3d36ca 100644 --- a/code/modules/mob/living/carbon/human/species_types/skeletons.dm +++ b/code/modules/mob/living/carbon/human/species_types/skeletons.dm @@ -9,23 +9,24 @@ inherent_traits = list( TRAIT_ADVANCEDTOOLUSER, TRAIT_CAN_STRIP, - TRAIT_NOMETABOLISM, - TRAIT_TOXIMMUNE, - TRAIT_RESISTHEAT, + TRAIT_CAN_USE_FLIGHT_POTION, + TRAIT_EASYDISMEMBER, + TRAIT_FAKEDEATH, + TRAIT_GENELESS, + TRAIT_LIMBATTACHMENT, + TRAIT_LITERATE, TRAIT_NOBREATH, + TRAIT_NOCLONELOSS, + TRAIT_NOHUNGER, + TRAIT_NOMETABOLISM, + TRAIT_RADIMMUNE, + TRAIT_PIERCEIMMUNE, TRAIT_RESISTCOLD, + TRAIT_RESISTHEAT, TRAIT_RESISTHIGHPRESSURE, TRAIT_RESISTLOWPRESSURE, - TRAIT_RADIMMUNE, - TRAIT_GENELESS, - TRAIT_PIERCEIMMUNE, - TRAIT_NOHUNGER, - TRAIT_EASYDISMEMBER, - TRAIT_LIMBATTACHMENT, - TRAIT_FAKEDEATH, + TRAIT_TOXIMMUNE, TRAIT_XENO_IMMUNE, - TRAIT_NOCLONELOSS, - TRAIT_CAN_USE_FLIGHT_POTION, ) inherent_biotypes = MOB_UNDEAD|MOB_HUMANOID mutanttongue = /obj/item/organ/internal/tongue/bone diff --git a/code/modules/mob/living/carbon/human/species_types/snail.dm b/code/modules/mob/living/carbon/human/species_types/snail.dm index 6c0a1355724a22..6062e46178801f 100644 --- a/code/modules/mob/living/carbon/human/species_types/snail.dm +++ b/code/modules/mob/living/carbon/human/species_types/snail.dm @@ -6,6 +6,7 @@ TRAIT_ADVANCEDTOOLUSER, TRAIT_CAN_STRIP, TRAIT_NOSLIPALL, + TRAIT_LITERATE, ) attack_verb = "slap" attack_effect = ATTACK_EFFECT_DISARM diff --git a/code/modules/mob/living/carbon/human/species_types/vampire.dm b/code/modules/mob/living/carbon/human/species_types/vampire.dm index 9201a2f870d31f..18e1483839d972 100644 --- a/code/modules/mob/living/carbon/human/species_types/vampire.dm +++ b/code/modules/mob/living/carbon/human/species_types/vampire.dm @@ -20,8 +20,9 @@ inherent_traits = list( TRAIT_ADVANCEDTOOLUSER, TRAIT_CAN_STRIP, - TRAIT_NOHUNGER, + TRAIT_LITERATE, TRAIT_NOBREATH, + TRAIT_NOHUNGER, ) inherent_biotypes = MOB_UNDEAD|MOB_HUMANOID mutant_bodyparts = list("wings" = "None") diff --git a/code/modules/mob/living/carbon/human/species_types/zombies.dm b/code/modules/mob/living/carbon/human/species_types/zombies.dm index c051c8e3bd8a4c..6cf04410528e90 100644 --- a/code/modules/mob/living/carbon/human/species_types/zombies.dm +++ b/code/modules/mob/living/carbon/human/species_types/zombies.dm @@ -11,20 +11,21 @@ inherent_traits = list( TRAIT_ADVANCEDTOOLUSER, TRAIT_CAN_STRIP, - TRAIT_NOMETABOLISM, - TRAIT_NOHUNGER, - TRAIT_TOXIMMUNE, - TRAIT_RESISTCOLD, - TRAIT_RESISTHIGHPRESSURE, - TRAIT_RESISTLOWPRESSURE, - TRAIT_RADIMMUNE, - TRAIT_EASYDISMEMBER, TRAIT_EASILY_WOUNDED, + TRAIT_EASYDISMEMBER, + TRAIT_FAKEDEATH, TRAIT_LIMBATTACHMENT, + TRAIT_LITERATE, TRAIT_NOBREATH, - TRAIT_NODEATH, - TRAIT_FAKEDEATH, TRAIT_NOCLONELOSS, + TRAIT_NODEATH, + TRAIT_NOHUNGER, + TRAIT_NOMETABOLISM, + TRAIT_RADIMMUNE, + TRAIT_RESISTCOLD, + TRAIT_RESISTHIGHPRESSURE, + TRAIT_RESISTLOWPRESSURE, + TRAIT_TOXIMMUNE, ) inherent_biotypes = MOB_UNDEAD|MOB_HUMANOID mutanttongue = /obj/item/organ/internal/tongue/zombie diff --git a/code/modules/mob/living/carbon/inventory.dm b/code/modules/mob/living/carbon/inventory.dm index 9fe7e1ddcc333d..7cac0335a5a701 100644 --- a/code/modules/mob/living/carbon/inventory.dm +++ b/code/modules/mob/living/carbon/inventory.dm @@ -12,7 +12,32 @@ return handcuffed if(ITEM_SLOT_LEGCUFFED) return legcuffed - return null + + return ..() + +/mob/living/carbon/get_slot_by_item(obj/item/looking_for) + if(looking_for == back) + return ITEM_SLOT_BACK + + if(back && (looking_for in back)) + return ITEM_SLOT_BACKPACK + + if(looking_for == wear_mask) + return ITEM_SLOT_MASK + + if(looking_for == wear_neck) + return ITEM_SLOT_NECK + + if(looking_for == head) + return ITEM_SLOT_HEAD + + if(looking_for == handcuffed) + return ITEM_SLOT_HANDCUFFED + + if(looking_for == legcuffed) + return ITEM_SLOT_LEGCUFFED + + return ..() /mob/living/carbon/proc/get_all_worn_items() return list( diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 8b3968535c631d..23bf69ebe76bff 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -401,26 +401,6 @@ if(HM?.timeout) dna.remove_mutation(HM.type) -/* -Alcohol Poisoning Chart -Note that all higher effects of alcohol poisoning will inherit effects for smaller amounts (i.e. light poisoning inherts from slight poisoning) -In addition, severe effects won't always trigger unless the drink is poisonously strong -All effects don't start immediately, but rather get worse over time; the rate is affected by the imbiber's alcohol tolerance - -0: Non-alcoholic -1-10: Barely classifiable as alcohol - occassional slurring -11-20: Slight alcohol content - slurring -21-30: Below average - imbiber begins to look slightly drunk -31-40: Just below average - no unique effects -41-50: Average - mild disorientation, imbiber begins to look drunk -51-60: Just above average - disorientation, vomiting, imbiber begins to look heavily drunk -61-70: Above average - small chance of blurry vision, imbiber begins to look smashed -71-80: High alcohol content - blurry vision, imbiber completely shitfaced -81-90: Extremely high alcohol content - light brain damage, passing out -91-100: Dangerously toxic - swift death -*/ -#define BALLMER_POINTS 5 - // This updates all special effects that really should be status effect datums: Druggy, Hallucinations, Drunkenness, Mute, etc.. /mob/living/carbon/handle_status_effects(delta_time, times_fired) ..() diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index e665e40f84d3b9..fba6f0df21b574 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -33,8 +33,6 @@ else effect.be_replaced() - if(ranged_ability) - ranged_ability.remove_ranged_ability(src) if(buckled) buckled.unbuckle_mob(src,force=1) @@ -748,10 +746,6 @@ clear_alert(ALERT_NOT_ENOUGH_OXYGEN) reload_fullscreen() . = TRUE - if(mind) - for(var/S in mind.spell_list) - var/obj/effect/proc_holder/spell/spell = S - spell.updateButtons() if(excess_healing) INVOKE_ASYNC(src, .proc/emote, "gasp") log_combat(src, src, "revived") @@ -879,7 +873,7 @@ var/mob/living/L = pulledby L.set_pull_offsets(src, pulledby.grab_state) - if(active_storage && !(CanReach(active_storage.parent,view_only = TRUE))) + if(active_storage && !((active_storage.parent in important_recursive_contents?[RECURSIVE_CONTENTS_ACTIVE_STORAGE]) || CanReach(active_storage.parent,view_only = TRUE))) active_storage.close(src) if(body_position == LYING_DOWN && !buckled && prob(getBruteLoss()*200/maxHealth)) @@ -1280,7 +1274,7 @@ /mob/living/simple_animal/hostile/carp, /mob/living/simple_animal/hostile/bear, /mob/living/simple_animal/hostile/mushroom, - /mob/living/simple_animal/hostile/statue, + /mob/living/simple_animal/hostile/netherworld/statue, /mob/living/simple_animal/hostile/retaliate/bat, /mob/living/simple_animal/hostile/retaliate/goat, /mob/living/simple_animal/hostile/killertomato, @@ -1404,6 +1398,7 @@ GLOBAL_LIST_EMPTY(fire_appearances) var/datum/status_effect/fire_handler/fire_stacks/fire_status = has_status_effect(/datum/status_effect/fire_handler/fire_stacks) if(!fire_status || !fire_status.on_fire) return + remove_status_effect(/datum/status_effect/fire_handler/fire_stacks) /** @@ -1546,24 +1541,6 @@ GLOBAL_LIST_EMPTY(fire_appearances) /mob/living/proc/on_fall() return -/mob/living/proc/AddAbility(obj/effect/proc_holder/A) - abilities.Add(A) - A.on_gain(src) - if(A.has_action) - A.action.Grant(src) - -/mob/living/proc/RemoveAbility(obj/effect/proc_holder/A) - abilities.Remove(A) - A.on_lose(src) - if(A.action) - A.action.Remove(src) - -/mob/living/proc/add_abilities_to_panel() - var/list/L = list() - for(var/obj/effect/proc_holder/A in abilities) - L[++L.len] = list("[A.panel]",A.get_panel_text(),A.name,"[REF(A)]") - return L - /mob/living/forceMove(atom/destination) if(!currently_z_moving) stop_pulling() @@ -1669,12 +1646,6 @@ GLOBAL_LIST_EMPTY(fire_appearances) else clear_fullscreen("remote_view", 0) -/mob/living/update_mouse_pointer() - ..() - if (client && ranged_ability?.ranged_mousepointer) - client.mouse_pointer_icon = ranged_ability.ranged_mousepointer - - /mob/living/vv_edit_var(var_name, var_value) switch(var_name) if (NAMEOF(src, maxHealth)) diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index c75c60a0198938..d59c77c8ca0540 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -7,7 +7,8 @@ hud_type = /datum/hud/living - var/resize = 1 ///Badminnery resize + ///Badminnery resize + var/resize = 1 var/lastattacker = null var/lastattackerckey = null @@ -18,20 +19,27 @@ var/health = MAX_LIVING_HEALTH //Damage related vars, NOTE: THESE SHOULD ONLY BE MODIFIED BY PROCS - var/bruteloss = 0 ///Brutal damage caused by brute force (punching, being clubbed by a toolbox ect... this also accounts for pressure damage) - var/oxyloss = 0 ///Oxygen depravation damage (no air in lungs) - var/toxloss = 0 ///Toxic damage caused by being poisoned or radiated - var/fireloss = 0 ///Burn damage caused by being way too hot, too cold or burnt. - var/cloneloss = 0 ///Damage caused by being cloned or ejected from the cloner early. slimes also deal cloneloss damage to victims - var/staminaloss = 0 ///Stamina damage, or exhaustion. You recover it slowly naturally, and are knocked down if it gets too high. Holodeck and hallucinations deal this. - var/crit_threshold = HEALTH_THRESHOLD_CRIT /// when the mob goes from "normal" to crit + ///Brutal damage caused by brute force (punching, being clubbed by a toolbox ect... this also accounts for pressure damage) + var/bruteloss = 0 + ///Oxygen depravation damage (no air in lungs) + var/oxyloss = 0 + ///Toxic damage caused by being poisoned or radiated + var/toxloss = 0 + ///Burn damage caused by being way too hot, too cold or burnt. + var/fireloss = 0 + ///Damage caused by being cloned or ejected from the cloner early. slimes also deal cloneloss damage to victims + var/cloneloss = 0 + ///Stamina damage, or exhaustion. You recover it slowly naturally, and are knocked down if it gets too high. Holodeck and hallucinations deal this. + var/staminaloss = 0 + /// when the mob goes from "normal" to crit + var/crit_threshold = HEALTH_THRESHOLD_CRIT ///When the mob enters hard critical state and is fully incapacitated. var/hardcrit_threshold = HEALTH_THRESHOLD_FULLCRIT //Damage dealing vars! These are meaningless outside of specific instances where it's checked and defined. - // Lower bound of damage done by unarmed melee attacks. Mob code is a mess, only works where this is checked for. + /// Lower bound of damage done by unarmed melee attacks. Mob code is a mess, only works where this is checked for. var/melee_damage_lower = 0 - // Upper bound of damage done by unarmed melee attacks. Please ensure you check the xyz_defenses.dm for the mobs in question to see if it uses this or hardcoded values. + /// Upper bound of damage done by unarmed melee attacks. Please ensure you check the xyz_defenses.dm for the mobs in question to see if it uses this or hardcoded values. var/melee_damage_upper = 0 /// Generic bitflags for boolean conditions at the [/mob/living] level. Keep this for inherent traits of living types, instead of runtime-changeable ones. @@ -48,10 +56,10 @@ VAR_PROTECTED/lying_angle = 0 /// Value of lying lying_angle before last change. TODO: Remove the need for this. var/lying_prev = 0 - - var/hallucination = 0 ///Directly affects how long a mob will hallucinate for - - var/last_special = 0 ///Used by the resist verb, likely used to prevent players from bypassing next_move by logging in/out. + ///Directly affects how long a mob will hallucinate for + var/hallucination = 0 + ///Used by the resist verb, likely used to prevent players from bypassing next_move by logging in/out. + var/last_special = 0 var/timeofdeath = 0 /// Helper vars for quick access to firestacks, these should be updated every time firestacks are adjusted @@ -67,24 +75,28 @@ var/incorporeal_move = FALSE var/list/quirks = list() - - var/list/surgeries = list() ///a list of surgery datums. generally empty, they're added when the player wants them. + ///a list of surgery datums. generally empty, they're added when the player wants them. + var/list/surgeries = list() ///Mob specific surgery speed modifier var/mob_surgery_speed_mod = 1 - var/now_pushing = null //! Used by [living/Bump()][/mob/living/proc/Bump] and [living/PushAM()][/mob/living/proc/PushAM] to prevent potential infinite loop. + /// Used by [living/Bump()][/mob/living/proc/Bump] and [living/PushAM()][/mob/living/proc/PushAM] to prevent potential infinite loop. + var/now_pushing = null var/cameraFollow = null /// Time of death var/tod = null - var/limb_destroyer = 0 //1 Sets AI behavior that allows mobs to target and dismember limbs with their basic attack. + /// Sets AI behavior that allows mobs to target and dismember limbs with their basic attack. + var/limb_destroyer = 0 var/mob_size = MOB_SIZE_HUMAN var/mob_biotypes = MOB_ORGANIC - var/metabolism_efficiency = 1 ///more or less efficiency to metabolize helpful/harmful reagents and regulate body temperature.. - var/has_limbs = FALSE ///does the mob have distinct limbs?(arms,legs, chest,head) + ///more or less efficiency to metabolize helpful/harmful reagents and regulate body temperature.. + var/metabolism_efficiency = 1 + ///does the mob have distinct limbs?(arms,legs, chest,head) + var/has_limbs = FALSE ///How many legs does this mob have by default. This shouldn't change at runtime. var/default_num_legs = 2 @@ -110,32 +122,39 @@ var/smoke_delay = 0 ///used to prevent spam with smoke reagent reaction on mob. - var/bubble_icon = "default" ///what icon the mob uses for speechbubbles - var/health_doll_icon ///if this exists AND the normal sprite is bigger than 32x32, this is the replacement icon state (because health doll size limitations). the icon will always be screen_gen.dmi + ///what icon the mob uses for speechbubbles + var/bubble_icon = "default" + ///if this exists AND the normal sprite is bigger than 32x32, this is the replacement icon state (because health doll size limitations). the icon will always be screen_gen.dmi + var/health_doll_icon var/last_bumped = 0 - var/unique_name = FALSE ///if a mob's name should be appended with an id when created e.g. Mob (666) - var/numba = 0 ///the id a mob gets when it's created + ///if a mob's name should be appended with an id when created e.g. Mob (666) + var/unique_name = FALSE + ///the id a mob gets when it's created + var/numba = 0 - var/list/butcher_results = null ///these will be yielded from butchering with a probability chance equal to the butcher item's effectiveness - var/list/guaranteed_butcher_results = null ///these will always be yielded from butchering - var/butcher_difficulty = 0 ///effectiveness prob. is modified negatively by this amount; positive numbers make it more difficult, negative ones make it easier + ///these will be yielded from butchering with a probability chance equal to the butcher item's effectiveness + var/list/butcher_results = null + ///these will always be yielded from butchering + var/list/guaranteed_butcher_results = null + ///effectiveness prob. is modified negatively by this amount; positive numbers make it more difficult, negative ones make it easier + var/butcher_difficulty = 0 - var/stun_absorption = null ///converted to a list of stun absorption sources this mob has when one is added + ///converted to a list of stun absorption sources this mob has when one is added + var/stun_absorption = null - var/blood_volume = 0 ///how much blood the mob has - var/obj/effect/proc_holder/ranged_ability ///Any ranged ability the mob has, as a click override + ///how much blood the mob has + var/blood_volume = 0 - var/see_override = 0 ///0 for no override, sets see_invisible = see_override in silicon & carbon life process via update_sight() - - var/list/status_effects ///a list of all status effects the mob has - var/druggy = 0 + ///0 for no override, sets see_invisible = see_override in silicon & carbon life process via update_sight() + var/see_override = 0 + ///a list of all status effects the mob has + var/list/status_effects var/list/implants = null - var/last_words ///used for database logging - - var/list/obj/effect/proc_holder/abilities = list() + ///used for database logging + var/last_words ///whether this can be picked up and held. var/can_be_held = FALSE @@ -148,19 +167,25 @@ var/losebreath = 0 //List of active diseases - var/list/diseases /// list of all diseases in a mob + /// list of all diseases in a mob + var/list/diseases var/list/disease_resistances - var/slowed_by_drag = TRUE ///Whether the mob is slowed down when dragging another prone mob + ///Whether the mob is slowed down when dragging another prone mob + var/slowed_by_drag = TRUE /// List of changes to body temperature, used by desease symtoms like fever var/list/body_temp_changes = list() //this stuff is here to make it simple for admins to mess with custom held sprites - var/icon/held_lh = 'icons/mob/pets_held_lh.dmi'//icons for holding mobs + ///left hand icon for holding mobs + var/icon/held_lh = 'icons/mob/pets_held_lh.dmi' + ///right hand icon for holding mobs var/icon/held_rh = 'icons/mob/pets_held_rh.dmi' - var/icon/head_icon = 'icons/mob/pets_held.dmi'//what it looks like on your head - var/held_state = ""//icon state for the above + ///what it looks like when the mob is held on your head + var/icon/head_icon = 'icons/mob/pets_held.dmi' + /// icon_state for holding mobs. + var/held_state = "" ///If combat mode is on or not var/combat_mode = FALSE @@ -179,3 +204,5 @@ var/native_fov = FOV_90_DEGREES /// Lazy list of FOV traits that will apply a FOV view when handled. var/list/fov_traits + ///what multiplicative slowdown we get from turfs currently. + var/current_turf_slowdown = 0 diff --git a/code/modules/mob/living/living_fov.dm b/code/modules/mob/living/living_fov.dm index 669dff63c89080..2955f44251e1ea 100644 --- a/code/modules/mob/living/living_fov.dm +++ b/code/modules/mob/living/living_fov.dm @@ -88,11 +88,20 @@ UNSETEMPTY(fov_traits) update_fov() +//did you know you can subtype /image and /mutable_appearance? +/image/fov_image + icon = 'icons/effects/fov/fov_effects.dmi' + layer = FOV_EFFECTS_LAYER + appearance_flags = RESET_COLOR | RESET_TRANSFORM + plane = FULLSCREEN_PLANE + /// Plays a visual effect representing a sound cue for people with vision obstructed by FOV or blindness -/proc/play_fov_effect(atom/center, range, icon_state, dir = SOUTH, ignore_self = FALSE, angle = 0) +/proc/play_fov_effect(atom/center, range, icon_state, dir = SOUTH, ignore_self = FALSE, angle = 0, list/override_list) var/turf/anchor_point = get_turf(center) - var/image/fov_image - for(var/mob/living/living_mob in get_hearers_in_view(range, center)) + var/image/fov_image/fov_image + var/list/clients_shown + + for(var/mob/living/living_mob in override_list || get_hearers_in_view(range, center)) var/client/mob_client = living_mob.client if(!mob_client) continue @@ -101,18 +110,22 @@ if(living_mob.in_fov(center, ignore_self)) continue if(!fov_image) //Make the image once we found one recipient to receive it - fov_image = image(icon = 'icons/effects/fov/fov_effects.dmi', icon_state = icon_state, loc = anchor_point) - fov_image.plane = FULLSCREEN_PLANE - fov_image.layer = FOV_EFFECTS_LAYER + fov_image = new() + fov_image.loc = anchor_point + fov_image.icon_state = icon_state fov_image.dir = dir - fov_image.appearance_flags = RESET_COLOR | RESET_TRANSFORM if(angle) var/matrix/matrix = new matrix.Turn(angle) fov_image.transform = matrix fov_image.mouse_opacity = MOUSE_OPACITY_TRANSPARENT + LAZYADD(clients_shown, mob_client) + mob_client.images += fov_image - addtimer(CALLBACK(GLOBAL_PROC, .proc/remove_image_from_client, fov_image, mob_client), 30) + //when added as an image mutable_appearances act identically. we just make it an MA becuase theyre faster to change appearance + + if(clients_shown) + addtimer(CALLBACK(GLOBAL_PROC, .proc/remove_images_from_clients, fov_image, clients_shown), 30) /atom/movable/screen/fov_blocker icon = 'icons/effects/fov/field_of_view.dmi' diff --git a/code/modules/mob/living/living_movement.dm b/code/modules/mob/living/living_movement.dm index f23512353fff3b..e94cc955db3909 100644 --- a/code/modules/mob/living/living_movement.dm +++ b/code/modules/mob/living/living_movement.dm @@ -28,9 +28,12 @@ /mob/living/proc/update_turf_movespeed(turf/open/T) if(isopenturf(T)) - add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/turf_slowdown, multiplicative_slowdown = T.slowdown) - else + if(T.slowdown != current_turf_slowdown) + add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/turf_slowdown, multiplicative_slowdown = T.slowdown) + current_turf_slowdown = T.slowdown + else if(current_turf_slowdown) remove_movespeed_modifier(/datum/movespeed_modifier/turf_slowdown) + current_turf_slowdown = 0 /mob/living/proc/update_pull_movespeed() diff --git a/code/modules/mob/living/living_say.dm b/code/modules/mob/living/living_say.dm index ce1a7dbbc9523a..d76ce29b13100e 100644 --- a/code/modules/mob/living/living_say.dm +++ b/code/modules/mob/living/living_say.dm @@ -493,7 +493,21 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list( else . = ..() -/mob/living/whisper(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null, filterproof) +/** + * Living level whisper. + * + * Living mobs which whisper have their message only appear to people very close. + * + * message - the message to display + * bubble_type - the type of speech bubble that shows up when they speak (currently does nothing) + * spans - a list of spans to apply around the message + * sanitize - whether we sanitize the message + * language - typepath language to force them to speak / whisper in + * ignore_spam - whether we ignore the spam filter + * forced - string source of what forced this speech to happen, also bypasses spam filter / mutes if supplied + * filterproof - whether we ignore the word filter + */ +/mob/living/whisper(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language, ignore_spam = FALSE, forced, filterproof) if(!message) return say("#[message]", bubble_type, spans, sanitize, language, ignore_spam, forced, filterproof) diff --git a/code/modules/mob/living/login.dm b/code/modules/mob/living/login.dm index 201142b3414316..c6d6b6a5e9d70a 100644 --- a/code/modules/mob/living/login.dm +++ b/code/modules/mob/living/login.dm @@ -18,9 +18,6 @@ if(ventcrawler) to_chat(src, span_notice("You can ventcrawl! Use alt+click on vents to quickly travel about the station.")) - if(ranged_ability) - ranged_ability.add_ranged_ability(src, span_notice("You currently have [ranged_ability] active!")) - med_hud_set_status() update_fov_client() diff --git a/code/modules/mob/living/silicon/ai/examine.dm b/code/modules/mob/living/silicon/ai/examine.dm index 3202372a89745f..265ad8144b9617 100644 --- a/code/modules/mob/living/silicon/ai/examine.dm +++ b/code/modules/mob/living/silicon/ai/examine.dm @@ -1,5 +1,5 @@ /mob/living/silicon/ai/examine(mob/user) - . = list("*---------*\nThis is [icon2html(src, user)] [src]!") + . = list("This is [icon2html(src, user)] [src]!") if (stat == DEAD) . += span_deadsay("It appears to be powered-down.") else @@ -14,9 +14,12 @@ else . += span_warning("Its casing is melted and heat-warped!") if(deployed_shell) - . += "The wireless networking light is blinking.\n" + . += "The wireless networking light is blinking." else if (!shunted && !client) - . += "[src]Core.exe has stopped responding! NTOS is searching for a solution to the problem...\n" - . += "*---------*" + . += "[src]Core.exe has stopped responding! NTOS is searching for a solution to the problem..." + . += "" . += ..() + +/mob/living/silicon/ai/get_examine_string(mob/user, thats = FALSE) + return null diff --git a/code/modules/mob/living/silicon/laws.dm b/code/modules/mob/living/silicon/laws.dm index d85ec0c56acd98..62c12bdd6e9017 100644 --- a/code/modules/mob/living/silicon/laws.dm +++ b/code/modules/mob/living/silicon/laws.dm @@ -69,9 +69,9 @@ hackedcheck += law post_lawchange(announce) -/mob/living/silicon/proc/replace_random_law(law, groups, announce = TRUE) +/mob/living/silicon/proc/replace_random_law(law, remove_law_groups, insert_law_group, announce = TRUE) laws_sanity_check() - . = laws.replace_random_law(law,groups) + . = laws.replace_random_law(law, remove_law_groups, insert_law_group) post_lawchange(announce) /mob/living/silicon/proc/shuffle_laws(list/groups, announce = TRUE) diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 7e1d636874e2c2..fac7d5a45f759b 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -90,6 +90,7 @@ "hawk" = FALSE, "lizard" = FALSE, "duffel" = TRUE, + "crow" = TRUE, ) var/emitterhealth = 20 diff --git a/code/modules/mob/living/silicon/robot/examine.dm b/code/modules/mob/living/silicon/robot/examine.dm index e7ba74698ff353..eeb46c28b611e4 100644 --- a/code/modules/mob/living/silicon/robot/examine.dm +++ b/code/modules/mob/living/silicon/robot/examine.dm @@ -1,5 +1,5 @@ /mob/living/silicon/robot/examine(mob/user) - . = list("*---------*\nThis is [icon2html(src, user)] \a [src]!") + . = list("This is [icon2html(src, user)] [src]!") if(desc) . += "[desc]" @@ -43,6 +43,9 @@ . += span_warning("It doesn't seem to be responding.") if(DEAD) . += span_deadsay("It looks like its system is corrupted and requires a reset.") - . += "*---------*" + . += "" . += ..() + +/mob/living/silicon/robot/get_examine_string(mob/user, thats = FALSE) + return null diff --git a/code/modules/mob/living/silicon/robot/robot_defense.dm b/code/modules/mob/living/silicon/robot/robot_defense.dm index 3b3c4d1b997ddd..721ab6422f7459 100644 --- a/code/modules/mob/living/silicon/robot/robot_defense.dm +++ b/code/modules/mob/living/silicon/robot/robot_defense.dm @@ -363,7 +363,7 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real lawupdate = FALSE set_connected_ai(null) message_admins("[ADMIN_LOOKUPFLW(user)] emagged cyborg [ADMIN_LOOKUPFLW(src)]. Laws overridden.") - log_silicon("EMAG: [key_name(user)] emagged cyborg [key_name(src)]. Laws overridden.") + log_silicon("EMAG: [key_name(user)] emagged cyborg [key_name(src)]. Laws overridden.") var/time = time2text(world.realtime,"hh:mm:ss") if(user) GLOB.lawchanges.Add("[time] : [user.name]([user.key]) emagged [name]([key])") diff --git a/code/modules/mob/living/silicon/robot/robot_model.dm b/code/modules/mob/living/silicon/robot/robot_model.dm index db9636a6d0bb50..c556040514c9c8 100644 --- a/code/modules/mob/living/silicon/robot/robot_model.dm +++ b/code/modules/mob/living/silicon/robot/robot_model.dm @@ -596,7 +596,7 @@ basic_modules = list( /obj/item/assembly/flash/cyborg, /obj/item/healthanalyzer, - /obj/item/reagent_containers/borghypo, + /obj/item/reagent_containers/borghypo/medical, /obj/item/borg/apparatus/beaker, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, @@ -616,7 +616,7 @@ /obj/item/borg/apparatus/organ_storage, /obj/item/borg/lollipop) radio_channels = list(RADIO_CHANNEL_MEDICAL) - emag_modules = list(/obj/item/reagent_containers/borghypo/hacked) + emag_modules = list(/obj/item/reagent_containers/borghypo/medical/hacked) cyborg_base_icon = "medical" model_select_icon = "medical" model_traits = list(TRAIT_PUSHIMMUNE) diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 8d1a2d78de61c6..c754b3836c4e07 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -65,8 +65,7 @@ ADD_TRAIT(src, TRAIT_MARTIAL_ARTS_IMMUNE, ROUNDSTART_TRAIT) ADD_TRAIT(src, TRAIT_NOFIRE_SPREAD, ROUNDSTART_TRAIT) ADD_TRAIT(src, TRAIT_ASHSTORM_IMMUNE, ROUNDSTART_TRAIT) - - + ADD_TRAIT(src, TRAIT_LITERATE, ROUNDSTART_TRAIT) /mob/living/silicon/Destroy() QDEL_NULL(radio) @@ -404,9 +403,6 @@ if (aicamera) return aicamera.selectpicture(user) -/mob/living/silicon/is_literate() - return TRUE - /mob/living/silicon/get_inactive_held_item() return FALSE diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm index 3447985e3bef98..3c412c4ebe51da 100644 --- a/code/modules/mob/living/simple_animal/bot/mulebot.dm +++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm @@ -52,7 +52,6 @@ var/obj/item/stock_parts/cell/cell /// Internal Powercell var/cell_move_power_usage = 1///How much power we use when we move. - var/bloodiness = 0 ///If we've run over a mob, how many tiles will we leave tracks on while moving var/num_steps = 0 ///The amount of steps we should take until we rest for a time. @@ -281,7 +280,7 @@ if(usr.has_unlimited_silicon_privilege) bot_cover_flags ^= BOT_COVER_LOCKED . = TRUE - if("power") + if("on") if(bot_mode_flags & BOT_MODE_ON) turn_off() else if(bot_cover_flags & BOT_COVER_OPEN) @@ -479,18 +478,6 @@ pathset = TRUE //Indicates the AI's custom path is initialized. start() -/mob/living/simple_animal/bot/mulebot/Move(atom/newloc, direct) //handle leaving bloody tracks. can't be done via Moved() since that can end up putting the tracks somewhere BEFORE we get bloody. - if(!bloodiness) //important to check this first since Bump() is called in the Move() -> Entered() chain - return ..() - var/atom/oldLoc = loc - . = ..() - if(!last_move || isspaceturf(oldLoc)) //if we didn't sucessfully move, or if our old location was a spaceturf. - return - var/obj/effect/decal/cleanable/blood/tracks/B = new(oldLoc) - B.add_blood_DNA(GET_ATOM_BLOOD_DNA(src)) - B.setDir(direct) - bloodiness-- - /mob/living/simple_animal/bot/mulebot/Moved() . = ..() if(has_gravity()) @@ -686,26 +673,33 @@ return ..() // when mulebot is in the same loc -/mob/living/simple_animal/bot/mulebot/proc/run_over(mob/living/carbon/human/H) - log_combat(src, H, "run over", null, "(DAMTYPE: [uppertext(BRUTE)])") - H.visible_message(span_danger("[src] drives over [H]!"), \ - span_userdanger("[src] drives over you!")) +/mob/living/simple_animal/bot/mulebot/proc/run_over(mob/living/carbon/human/crushed) + log_combat(src, crushed, "run over", addition = "(DAMTYPE: [uppertext(BRUTE)])") + crushed.visible_message( + span_danger("[src] drives over [crushed]!"), + span_userdanger("[src] drives over you!"), + ) + playsound(src, 'sound/effects/splat.ogg', 50, TRUE) - var/damage = rand(5,15) - H.apply_damage(2*damage, BRUTE, BODY_ZONE_HEAD, run_armor_check(BODY_ZONE_HEAD, MELEE)) - H.apply_damage(2*damage, BRUTE, BODY_ZONE_CHEST, run_armor_check(BODY_ZONE_CHEST, MELEE)) - H.apply_damage(0.5*damage, BRUTE, BODY_ZONE_L_LEG, run_armor_check(BODY_ZONE_L_LEG, MELEE)) - H.apply_damage(0.5*damage, BRUTE, BODY_ZONE_R_LEG, run_armor_check(BODY_ZONE_R_LEG, MELEE)) - H.apply_damage(0.5*damage, BRUTE, BODY_ZONE_L_ARM, run_armor_check(BODY_ZONE_L_ARM, MELEE)) - H.apply_damage(0.5*damage, BRUTE, BODY_ZONE_R_ARM, run_armor_check(BODY_ZONE_R_ARM, MELEE)) + var/damage = rand(5, 15) + crushed.apply_damage(2 * damage, BRUTE, BODY_ZONE_HEAD, run_armor_check(BODY_ZONE_HEAD, MELEE)) + crushed.apply_damage(2 * damage, BRUTE, BODY_ZONE_CHEST, run_armor_check(BODY_ZONE_CHEST, MELEE)) + crushed.apply_damage(0.5 * damage, BRUTE, BODY_ZONE_L_LEG, run_armor_check(BODY_ZONE_L_LEG, MELEE)) + crushed.apply_damage(0.5 * damage, BRUTE, BODY_ZONE_R_LEG, run_armor_check(BODY_ZONE_R_LEG, MELEE)) + crushed.apply_damage(0.5 * damage, BRUTE, BODY_ZONE_L_ARM, run_armor_check(BODY_ZONE_L_ARM, MELEE)) + crushed.apply_damage(0.5 * damage, BRUTE, BODY_ZONE_R_ARM, run_armor_check(BODY_ZONE_R_ARM, MELEE)) + + add_mob_blood(crushed) - var/turf/T = get_turf(src) - T.add_mob_blood(H) + var/turf/below_us = get_turf(src) + below_us.add_mob_blood(crushed) - var/list/blood_dna = H.get_blood_dna_list() - add_blood_DNA(blood_dna) - bloodiness += 4 + AddComponent(/datum/component/blood_walk, \ + blood_type = /obj/effect/decal/cleanable/blood/tracks, \ + target_dir_change = TRUE, \ + transfer_blood_dna = TRUE, \ + max_blood = 4) // player on mulebot attempted to move /mob/living/simple_animal/bot/mulebot/relaymove(mob/living/user, direction) diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index bdc183d3de9560..e494b1777e59d8 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -63,6 +63,7 @@ /mob/living/simple_animal/bot/secbot/beepsky/armsky name = "Sergeant-At-Armsky" + desc = "It's Sergeant-At-Armsky! He's a disgruntled assistant to the warden that would probably shoot you if he had hands." health = 45 bot_mode_flags = ~(BOT_MODE_PAI_CONTROLLABLE|BOT_MODE_AUTOPATROL) security_mode_flags = SECBOT_DECLARE_ARRESTS | SECBOT_CHECK_IDS | SECBOT_CHECK_RECORDS diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index 41901ae5c8cd17..fcf409ac0902bf 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -42,8 +42,6 @@ var/can_repair = FALSE /// Whether this construct can repair itself. Works independently of can_repair. var/can_repair_self = FALSE - var/runetype - var/datum/action/innate/cult/create_rune/our_rune /// Theme controls color. THEME_CULT is red THEME_WIZARD is purple and THEME_HOLY is blue var/theme = THEME_CULT @@ -52,29 +50,25 @@ AddElement(/datum/element/simple_flying) ADD_TRAIT(src, TRAIT_HEALS_FROM_CULT_PYLONS, INNATE_TRAIT) ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT) - var/spellnum = 1 for(var/spell in construct_spells) - var/pos = 2+spellnum*31 + var/datum/action/new_spell = new spell(src) + new_spell.Grant(src) + + var/spellnum = 1 + for(var/datum/action/spell as anything in actions) + if(!(type in construct_spells)) + continue + + var/pos = 2 + spellnum * 31 if(construct_spells.len >= 4) - pos -= 31*(construct_spells.len - 4) - var/obj/effect/proc_holder/spell/the_spell = new spell(null) - the_spell?.action.default_button_position ="6:[pos],4:-2" - AddSpell(the_spell) + pos -= 31 * (construct_spells.len - 4) + spell.default_button_position = "6:[pos],4:-2" // Set the default position to this random position spellnum++ - if(runetype) - var/pos = 2+spellnum*31 - if(construct_spells.len >= 4) - pos -= 31*(construct_spells.len - 4) - our_rune = new runetype(src) - our_rune.default_button_position = "6:[pos],4:-2" // Set the default position to this random position - our_rune.Grant(src) + update_action_buttons() + if(icon_state) add_overlay("glow_[icon_state]_[theme]") -/mob/living/simple_animal/hostile/construct/Destroy() - QDEL_NULL(our_rune) - return ..() - /mob/living/simple_animal/hostile/construct/Login() . = ..() if(!. || !client) @@ -92,13 +86,13 @@ text_span = "purple" if(THEME_HOLY) text_span = "blue" - . = list("*---------*\nThis is [icon2html(src, user)] \a [src]!\n[desc]") + . = list("This is [icon2html(src, user)] \a [src]!\n[desc]") if(health < maxHealth) if(health >= maxHealth/2) . += span_warning("[t_He] look[t_s] slightly dented.") else . += span_warning("[t_He] look[t_s] severely dented!") - . += "*---------*" + . += "" /mob/living/simple_animal/hostile/construct/attack_animal(mob/living/simple_animal/user, list/modifiers) if(isconstruct(user)) //is it a construct? @@ -154,10 +148,10 @@ mob_size = MOB_SIZE_LARGE force_threshold = 10 construct_spells = list( - /obj/effect/proc_holder/spell/targeted/forcewall/cult, - /obj/effect/proc_holder/spell/targeted/projectile/dumbfire/juggernaut - ) - runetype = /datum/action/innate/cult/create_rune/wall + /datum/action/cooldown/spell/forcewall/cult, + /datum/action/cooldown/spell/basic_projectile/juggernaut, + /datum/action/innate/cult/create_rune/wall, + ) playstyle_string = "You are a Juggernaut. Though slow, your shell can withstand heavy punishment, \ create shield walls, rip apart enemies and walls alike, and even deflect energy weapons." @@ -221,13 +215,18 @@ attack_verb_simple = "slash" attack_sound = 'sound/weapons/bladeslice.ogg' attack_vis_effect = ATTACK_EFFECT_SLASH - construct_spells = list(/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift) - runetype = /datum/action/innate/cult/create_rune/tele - playstyle_string = "You are a Wraith. Though relatively fragile, you are fast, deadly, can phase through walls, and your attacks will lower the cooldown on phasing." - - var/attack_refund = 10 //1 second per attack - var/crit_refund = 50 //5 seconds when putting a target into critical - var/kill_refund = 250 //full refund on kills + construct_spells = list( + /datum/action/cooldown/spell/jaunt/ethereal_jaunt/shift, + /datum/action/innate/cult/create_rune/tele, + ) + playstyle_string = "You are a Wraith. Though relatively fragile, you are fast, deadly, \ + can phase through walls, and your attacks will lower the cooldown on phasing." + + // Accomplishing various things gives you a refund on jaunt, to jump in and out. + /// The seconds refunded per attack + var/attack_refund = 1 SECONDS + /// The seconds refunded when putting a target into critical + var/crit_refund = 5 SECONDS /mob/living/simple_animal/hostile/construct/wraith/AttackingTarget() //refund jaunt cooldown when attacking living targets var/prev_stat @@ -239,16 +238,23 @@ . = ..() if(. && isnum(prev_stat)) - var/mob/living/L = target - var/refund = 0 - if(QDELETED(L) || (L.stat == DEAD && prev_stat != DEAD)) //they're dead, you killed them - refund += kill_refund - else if(HAS_TRAIT(L, TRAIT_CRITICAL_CONDITION) && prev_stat == CONSCIOUS) //you knocked them into critical - refund += crit_refund - if(L.stat != DEAD && prev_stat != DEAD) - refund += attack_refund - for(var/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift/S in mob_spell_list) - S.charge_counter = min(S.charge_counter + refund, S.charge_max) + var/datum/action/cooldown/spell/jaunt/ethereal_jaunt/shift/jaunt = locate() in actions + if(!jaunt) + return + + var/total_refund = 0 SECONDS + // they're dead, and you killed them - full refund + if(QDELETED(living_target) || (living_target.stat == DEAD && prev_stat != DEAD)) + total_refund += jaunt.cooldown_time + // you knocked them into critical + else if(HAS_TRAIT(living_target, TRAIT_CRITICAL_CONDITION) && prev_stat == CONSCIOUS) + total_refund += crit_refund + + if(living_target.stat != DEAD && prev_stat != DEAD) + total_refund += attack_refund + + jaunt.next_use_time -= total_refund + jaunt.UpdateButtons() /mob/living/simple_animal/hostile/construct/wraith/hostile //actually hostile, will move around, hit things AIStatus = AI_ON @@ -256,12 +262,18 @@ //////////////////////////Wraith-alts//////////////////////////// /mob/living/simple_animal/hostile/construct/wraith/angelic theme = THEME_HOLY - construct_spells = list(/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift/angelic) + construct_spells = list( + /datum/action/cooldown/spell/jaunt/ethereal_jaunt/shift/angelic, + /datum/action/innate/cult/create_rune/tele, + ) loot = list(/obj/item/ectoplasm/angelic) /mob/living/simple_animal/hostile/construct/wraith/mystic theme = THEME_WIZARD - construct_spells = list(/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift/mystic) + construct_spells = list( + /datum/action/cooldown/spell/jaunt/ethereal_jaunt/shift/mystic, + /datum/action/innate/cult/create_rune/tele, + ) loot = list(/obj/item/ectoplasm/mystic) /mob/living/simple_animal/hostile/construct/wraith/noncult @@ -288,18 +300,18 @@ environment_smash = ENVIRONMENT_SMASH_WALLS attack_sound = 'sound/weapons/punch2.ogg' construct_spells = list( - /obj/effect/proc_holder/spell/aoe_turf/conjure/wall, - /obj/effect/proc_holder/spell/aoe_turf/conjure/floor, - /obj/effect/proc_holder/spell/aoe_turf/conjure/soulstone, - /obj/effect/proc_holder/spell/aoe_turf/conjure/construct/lesser, - /obj/effect/proc_holder/spell/targeted/projectile/magic_missile/lesser - ) - runetype = /datum/action/innate/cult/create_rune/revive - playstyle_string = "You are an Artificer. You are incredibly weak and fragile, but you are able to construct fortifications, \ - - use magic missile, repair allied constructs, shades, and yourself (by clicking on them), \ - and, most important of all, create new constructs by producing soulstones to capture souls, \ - and shells to place those soulstones into." + /datum/action/cooldown/spell/conjure/cult_floor, + /datum/action/cooldown/spell/conjure/cult_wall, + /datum/action/cooldown/spell/conjure/soulstone, + /datum/action/cooldown/spell/conjure/construct/lesser, + /datum/action/cooldown/spell/aoe/magic_missile/lesser, + /datum/action/innate/cult/create_rune/revive, + ) + playstyle_string = "You are an Artificer. You are incredibly weak and fragile, \ + but you are able to construct fortifications, use magic missile, and repair allied constructs, shades, \ + and yourself (by clicking on them). Additionally, and most important of all, you can create new constructs \ + by producing soulstones to capture souls, and shells to place those soulstones into." + can_repair = TRUE can_repair_self = TRUE ///The health HUD applied to this mob. @@ -356,30 +368,32 @@ theme = THEME_HOLY loot = list(/obj/item/ectoplasm/angelic) construct_spells = list( - /obj/effect/proc_holder/spell/aoe_turf/conjure/soulstone/purified, - /obj/effect/proc_holder/spell/aoe_turf/conjure/construct/lesser, - /obj/effect/proc_holder/spell/targeted/projectile/magic_missile/lesser - ) - + /datum/action/cooldown/spell/conjure/soulstone/purified, + /datum/action/cooldown/spell/conjure/construct/lesser, + /datum/action/cooldown/spell/aoe/magic_missile/lesser, + /datum/action/innate/cult/create_rune/revive, + ) /mob/living/simple_animal/hostile/construct/artificer/mystic theme = THEME_WIZARD loot = list(/obj/item/ectoplasm/mystic) construct_spells = list( - /obj/effect/proc_holder/spell/aoe_turf/conjure/wall, - /obj/effect/proc_holder/spell/aoe_turf/conjure/floor, - /obj/effect/proc_holder/spell/aoe_turf/conjure/soulstone/mystic, - /obj/effect/proc_holder/spell/aoe_turf/conjure/construct/lesser, - /obj/effect/proc_holder/spell/targeted/projectile/magic_missile/lesser - ) + /datum/action/cooldown/spell/conjure/cult_floor, + /datum/action/cooldown/spell/conjure/cult_wall, + /datum/action/cooldown/spell/conjure/soulstone/mystic, + /datum/action/cooldown/spell/conjure/construct/lesser, + /datum/action/cooldown/spell/aoe/magic_missile/lesser, + /datum/action/innate/cult/create_rune/revive, + ) /mob/living/simple_animal/hostile/construct/artificer/noncult construct_spells = list( - /obj/effect/proc_holder/spell/aoe_turf/conjure/wall, - /obj/effect/proc_holder/spell/aoe_turf/conjure/floor, - /obj/effect/proc_holder/spell/aoe_turf/conjure/soulstone/noncult, - /obj/effect/proc_holder/spell/aoe_turf/conjure/construct/lesser, - /obj/effect/proc_holder/spell/targeted/projectile/magic_missile/lesser - ) + /datum/action/cooldown/spell/conjure/cult_floor, + /datum/action/cooldown/spell/conjure/cult_wall, + /datum/action/cooldown/spell/conjure/soulstone/noncult, + /datum/action/cooldown/spell/conjure/construct/lesser, + /datum/action/cooldown/spell/aoe/magic_missile/lesser, + /datum/action/innate/cult/create_rune/revive, + ) /////////////////////////////Harvester///////////////////////// /mob/living/simple_animal/hostile/construct/harvester @@ -397,8 +411,10 @@ attack_verb_simple = "butcher" attack_sound = 'sound/weapons/bladeslice.ogg' attack_vis_effect = ATTACK_EFFECT_SLASH - construct_spells = list(/obj/effect/proc_holder/spell/aoe_turf/area_conversion, - /obj/effect/proc_holder/spell/targeted/forcewall/cult) + construct_spells = list( + /datum/action/cooldown/spell/aoe/area_conversion, + /datum/action/cooldown/spell/forcewall/cult, + ) playstyle_string = "You are a Harvester. You are incapable of directly killing humans, but your attacks will remove their limbs: \ Bring those who still cling to this world of illusion back to the Geometer so they may know Truth. Your form and any you are pulling can pass through runed walls effortlessly." can_repair = TRUE diff --git a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm index 58249e36f39957..48547d76359b02 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm @@ -186,6 +186,7 @@ ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) ADD_TRAIT(src, TRAIT_NEGATES_GRAVITY, INNATE_TRAIT) + ADD_TRAIT(src, TRAIT_LITERATE, INNATE_TRAIT) listener = new(list(ALARM_ATMOS, ALARM_FIRE, ALARM_POWER), list(z)) RegisterSignal(listener, COMSIG_ALARM_TRIGGERED, .proc/alarm_triggered) @@ -249,7 +250,7 @@ dust() /mob/living/simple_animal/drone/examine(mob/user) - . = list("*---------*\nThis is [icon2html(src, user)] \a [src]!") + . = list("This is [icon2html(src, user)] \a [src]!") //Hands for(var/obj/item/I in held_items) @@ -285,7 +286,7 @@ . += span_deadsay("A message repeatedly flashes on its display: \"REBOOT -- REQUIRED\".") else . += span_deadsay("A message repeatedly flashes on its display: \"ERROR -- OFFLINE\".") - . += "*---------*" + . += "" /mob/living/simple_animal/drone/assess_threat(judgement_criteria, lasercolor = "", datum/callback/weaponcheck=null) //Secbots won't hunt maintenance drones. diff --git a/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm b/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm index 6ec3f9f3d062c4..ed9e032902d461 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm @@ -40,8 +40,15 @@ return head if(ITEM_SLOT_DEX_STORAGE) return internal_storage + return ..() +/mob/living/simple_animal/drone/get_slot_by_item(obj/item/looking_for) + if(internal_storage == looking_for) + return ITEM_SLOT_DEX_STORAGE + if(head == looking_for) + return ITEM_SLOT_HEAD + return ..() /mob/living/simple_animal/drone/equip_to_slot(obj/item/I, slot) if(!slot) diff --git a/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm b/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm index 70db007d955ab2..9da8cd8dd03846 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm @@ -19,13 +19,13 @@ /mob/living/simple_animal/hostile/guardian/dextrous/examine(mob/user) if(dextrous) - . = list("*---------*\nThis is [icon2html(src)] \a [src]!\n[desc]") + . = list("This is [icon2html(src)] \a [src]!\n[desc]") for(var/obj/item/I in held_items) if(!(I.item_flags & ABSTRACT)) . += "It has [I.get_examine_string(user)] in its [get_held_index_name(get_held_index_of_item(I))]." if(internal_storage && !(internal_storage.item_flags & ABSTRACT)) . += "It is holding [internal_storage.get_examine_string(user)] in its internal storage." - . += "*---------*" + . += "" else return ..() @@ -58,6 +58,16 @@ return TRUE ..() +/mob/living/simple_animal/hostile/guardian/dextrous/get_item_by_slot(slot_id) + if(slot_id == ITEM_SLOT_DEX_STORAGE) + return internal_storage + return ..() + +/mob/living/simple_animal/hostile/guardian/dextrous/get_slot_by_item(obj/item/looking_for) + if(internal_storage == looking_for) + return ITEM_SLOT_DEX_STORAGE + return ..() + /mob/living/simple_animal/hostile/guardian/dextrous/equip_to_slot(obj/item/I, slot) if(!..()) return diff --git a/code/modules/mob/living/simple_animal/heretic_monsters.dm b/code/modules/mob/living/simple_animal/heretic_monsters.dm index 91469ab0bb9ba6..f2f01b091f4520 100644 --- a/code/modules/mob/living/simple_animal/heretic_monsters.dm +++ b/code/modules/mob/living/simple_animal/heretic_monsters.dm @@ -32,21 +32,15 @@ loot = list(/obj/effect/gibspawner/human) faction = list(FACTION_HERETIC) simple_mob_flags = SILENCE_RANGED_MESSAGE + /// Innate spells that are added when a beast is created. - var/list/spells_to_add + var/list/actions_to_add /mob/living/simple_animal/hostile/heretic_summon/Initialize(mapload) . = ..() - add_spells() - -/** - * Add_spells - * - * Goes through spells_to_add and adds each spell to the mind. - */ -/mob/living/simple_animal/hostile/heretic_summon/proc/add_spells() - for(var/spell in spells_to_add) - AddSpell(new spell()) + for(var/spell in actions_to_add) + var/datum/action/cooldown/spell/new_spell = new spell(src) + new_spell.Grant(src) /mob/living/simple_animal/hostile/heretic_summon/raw_prophet name = "Raw Prophet" @@ -61,10 +55,11 @@ health = 65 sight = SEE_MOBS|SEE_OBJS|SEE_TURFS loot = list(/obj/effect/gibspawner/human, /obj/item/bodypart/l_arm, /obj/item/organ/internal/eyes) - spells_to_add = list( - /obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift/ash/long, - /obj/effect/proc_holder/spell/targeted/telepathy/eldritch, - /obj/effect/proc_holder/spell/pointed/trigger/blind/eldritch, + actions_to_add = list( + /datum/action/cooldown/spell/jaunt/ethereal_jaunt/ash/long, + /datum/action/cooldown/spell/list_target/telepathy/eldritch, + /datum/action/cooldown/spell/pointed/blind/eldritch, + /datum/action/innate/expand_sight, ) /// A weakref to the last target we smacked. Hitting targets consecutively does more damage. var/datum/weakref/last_target @@ -79,16 +74,13 @@ AddComponent(/datum/component/mind_linker, \ network_name = "Mansus Link", \ chat_color = "#568b00", \ - linker_action_path = /datum/action/cooldown/manse_link, \ + linker_action_path = /datum/action/cooldown/spell/pointed/manse_link, \ link_message = on_link_message, \ unlink_message = on_unlink_message, \ post_unlink_callback = CALLBACK(src, .proc/after_unlink), \ speech_action_background_icon_state = "bg_ecult", \ ) - var/datum/action/innate/expand_sight/sight_seer = new(src) - sight_seer.Grant(src) - /mob/living/simple_animal/hostile/heretic_summon/raw_prophet/attack_animal(mob/living/simple_animal/user, list/modifiers) if(user == src) // Easy to hit yourself + very fragile = accidental suicide, prevent that return @@ -155,7 +147,7 @@ ranged_cooldown_time = 5 ranged = TRUE rapid = 1 - spells_to_add = list(/obj/effect/proc_holder/spell/targeted/worm_contract) + actions_to_add = list(/datum/action/cooldown/spell/worm_contract) ///Previous segment in the chain var/mob/living/simple_animal/hostile/heretic_summon/armsy/back ///Next segment in the chain @@ -187,7 +179,9 @@ if(!spawn_bodyparts) return - AddElement(/datum/element/blood_walk, /obj/effect/decal/cleanable/blood/tracks, target_dir_change = TRUE) + AddComponent(/datum/component/blood_walk, \ + blood_type = /obj/effect/decal/cleanable/blood/tracks, \ + target_dir_change = TRUE) allow_pulling = TRUE // Sets the hp of the head to be exactly the (length * hp), so the head is de facto the hardest to destroy. @@ -363,9 +357,9 @@ melee_damage_lower = 15 melee_damage_upper = 20 sight = SEE_TURFS - spells_to_add = list( - /obj/effect/proc_holder/spell/aoe_turf/rust_conversion/small, - /obj/effect/proc_holder/spell/targeted/projectile/dumbfire/rust_wave/short, + actions_to_add = list( + /datum/action/cooldown/spell/aoe/rust_conversion/small, + /datum/action/cooldown/spell/basic_projectile/rust_wave/short, ) /mob/living/simple_animal/hostile/heretic_summon/rust_spirit/setDir(newdir) @@ -403,10 +397,10 @@ melee_damage_lower = 15 melee_damage_upper = 20 sight = SEE_TURFS - spells_to_add = list( - /obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift/ash, - /obj/effect/proc_holder/spell/pointed/cleave, - /obj/effect/proc_holder/spell/targeted/fire_sworn, + actions_to_add = list( + /datum/action/cooldown/spell/jaunt/ethereal_jaunt/ash, + /datum/action/cooldown/spell/pointed/cleave, + /datum/action/cooldown/spell/fire_sworn, ) /mob/living/simple_animal/hostile/heretic_summon/stalker @@ -421,8 +415,8 @@ melee_damage_lower = 15 melee_damage_upper = 20 sight = SEE_MOBS - spells_to_add = list( - /obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift/ash, - /obj/effect/proc_holder/spell/targeted/shapeshift/eldritch, - /obj/effect/proc_holder/spell/targeted/emplosion/eldritch, + actions_to_add = list( + /datum/action/cooldown/spell/jaunt/ethereal_jaunt/ash, + /datum/action/cooldown/spell/shapeshift/eldritch, + /datum/action/cooldown/spell/emp/eldritch, ) diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm index c41b19b3711362..401ad2aaa99c1a 100644 --- a/code/modules/mob/living/simple_animal/hostile/carp.dm +++ b/code/modules/mob/living/simple_animal/hostile/carp.dm @@ -103,7 +103,6 @@ /mob/living/simple_animal/hostile/carp/proc/tamed(mob/living/tamer) tamed = TRUE - can_buckle = TRUE buckle_lying = 0 AddElement(/datum/element/ridable, /datum/component/riding/creature/carp) if(ai_controller) diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index 0f02e0272ccbe0..379042ed4167fb 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -1,3 +1,4 @@ +#define INTERACTION_SPIDER_KEY "spider_key" /** * # Giant Spider @@ -50,14 +51,10 @@ var/poison_per_bite = 0 ///What reagent the mob injects targets with var/poison_type = /datum/reagent/toxin - ///Whether or not the spider is in the middle of an action. - var/is_busy = FALSE ///How quickly the spider can place down webbing. One is base speed, larger numbers are slower. var/web_speed = 1 ///Whether or not the spider can create sealed webs. var/web_sealer = FALSE - ///The web laying ability - var/datum/action/innate/spider/lay_web/lay_web ///The message that the mother spider left for this spider when the egg was layed. var/directive = "" /// Short description of what this mob is capable of, for radial menu uses @@ -65,8 +62,9 @@ /mob/living/simple_animal/hostile/giant_spider/Initialize(mapload) . = ..() - lay_web = new - lay_web.Grant(src) + var/datum/action/innate/spider/lay_web/webbing = new(src) + webbing.Grant(src) + if(poison_per_bite) AddElement(/datum/element/venomous, poison_type, poison_per_bite) AddElement(/datum/element/nerfed_pulling, GLOB.typecache_general_bad_things_to_easily_move) @@ -145,7 +143,7 @@ datahud.show_to(src) /mob/living/simple_animal/hostile/giant_spider/nurse/AttackingTarget() - if(is_busy) + if(DOING_INTERACTION(src, INTERACTION_SPIDER_KEY)) return if(!istype(target, /mob/living/simple_animal/hostile/giant_spider)) return ..() @@ -159,13 +157,20 @@ if(hurt_spider.stat == DEAD) to_chat(src, span_warning("You're a nurse, not a miracle worker.")) return - visible_message(span_notice("[src] begins wrapping the wounds of [hurt_spider]."),span_notice("You begin wrapping the wounds of [hurt_spider].")) - is_busy = TRUE - if(do_after(src, 20, target = hurt_spider)) - hurt_spider.heal_overall_damage(20, 20) - new /obj/effect/temp_visual/heal(get_turf(hurt_spider), "#80F5FF") - visible_message(span_notice("[src] wraps the wounds of [hurt_spider]."),span_notice("You wrap the wounds of [hurt_spider].")) - is_busy = FALSE + visible_message( + span_notice("[src] begins wrapping the wounds of [hurt_spider]."), + span_notice("You begin wrapping the wounds of [hurt_spider]."), + ) + + if(!do_after(src, 2 SECONDS, target = hurt_spider, interaction_key = INTERACTION_SPIDER_KEY)) + return + + hurt_spider.heal_overall_damage(20, 20) + new /obj/effect/temp_visual/heal(get_turf(hurt_spider), "#80F5FF") + visible_message( + span_notice("[src] wraps the wounds of [hurt_spider]."), + span_notice("You wrap the wounds of [hurt_spider]."), + ) /** * # Tarantula @@ -273,228 +278,238 @@ gold_core_spawnable = NO_SPAWN web_sealer = TRUE menu_description = "Royal spider variant specializing in reproduction and leadership, but has very low amount of health and deals low damage." - ///If the spider is trying to cocoon something, what that something is. - var/atom/movable/cocoon_target - ///How many humans this spider has drained but not layed enriched eggs for. - var/fed = 0 - ///How long it takes for a broodmother to lay eggs. - var/egg_lay_time = 15 SECONDS - ///The ability for the spider to wrap targets. - var/obj/effect/proc_holder/wrap/wrap - ///The ability for the spider to lay basic eggs. - var/datum/action/innate/spider/lay_eggs/lay_eggs - ///The ability for the spider to lay enriched eggs. - var/datum/action/innate/spider/lay_eggs/enriched/lay_eggs_enriched - ///The ability for the spider to set a directive, a message shown to the child spider player when the player takes control. - var/datum/action/innate/spider/set_directive/set_directive - ///A shared list of all the mobs consumed by any spider so that the same target can't be drained several times. - var/static/list/consumed_mobs = list() //the tags of mobs that have been consumed by nurse spiders to lay eggs - ///The ability for the spider to send a message to all currently living spiders. - var/datum/action/innate/spider/comm/letmetalkpls /mob/living/simple_animal/hostile/giant_spider/midwife/Initialize(mapload) . = ..() - wrap = new - AddAbility(wrap) - lay_eggs = new - lay_eggs.Grant(src) - lay_eggs_enriched = new - lay_eggs_enriched.Grant(src) - set_directive = new - set_directive.Grant(src) - letmetalkpls = new - letmetalkpls.Grant(src) + var/datum/action/cooldown/wrap/wrapping = new(src) + wrapping.Grant(src) -/** - * Attempts to cocoon the spider's current cocoon_target. - * - * Attempts to coccon the spider's cocoon_target after a do_after. - * If the target is a human who hasn't been drained before, ups the spider's fed counter so it can lay enriched eggs. - */ -/mob/living/simple_animal/hostile/giant_spider/midwife/proc/cocoon() - if(stat == DEAD || !cocoon_target || cocoon_target.anchored) - return - if(cocoon_target == src) - to_chat(src, span_warning("You can't wrap yourself!")) - return - if(istype(cocoon_target, /mob/living/simple_animal/hostile/giant_spider)) - to_chat(src, span_warning("You can't wrap other spiders!")) - return - if(!Adjacent(cocoon_target)) - to_chat(src, span_warning("You can't reach [cocoon_target]!")) - return - if(is_busy) - to_chat(src, span_warning("You're already doing something else!")) - return - is_busy = TRUE - visible_message(span_notice("[src] begins to secrete a sticky substance around [cocoon_target]."),span_notice("You begin wrapping [cocoon_target] into a cocoon.")) - stop_automated_movement = TRUE - if(do_after(src, 50, target = cocoon_target)) - if(is_busy) - var/obj/structure/spider/cocoon/casing = new(cocoon_target.loc) - if(isliving(cocoon_target)) - var/mob/living/living_target = cocoon_target - if(ishuman(living_target) && (living_target.stat != DEAD || !consumed_mobs[living_target.tag])) //if they're not dead, you can consume them anyway - consumed_mobs[living_target.tag] = TRUE - fed++ - lay_eggs_enriched.UpdateButtons(TRUE) - visible_message(span_danger("[src] sticks a proboscis into [living_target] and sucks a viscous substance out."),span_notice("You suck the nutriment out of [living_target], feeding you enough to lay a cluster of eggs.")) - living_target.death() //you just ate them, they're dead. - else - to_chat(src, span_warning("[living_target] cannot sate your hunger!")) - cocoon_target.forceMove(casing) - if(cocoon_target.density || ismob(cocoon_target)) - casing.icon_state = pick("cocoon_large1","cocoon_large2","cocoon_large3") - cocoon_target = null - is_busy = FALSE - stop_automated_movement = FALSE + var/datum/action/innate/spider/lay_eggs/make_eggs = new(src) + make_eggs.Grant(src) + + var/datum/action/innate/spider/lay_eggs/enriched/make_better_eggs = new(src) + make_better_eggs.Grant(src) + + var/datum/action/innate/spider/set_directive/give_orders = new(src) + give_orders.Grant(src) + + var/datum/action/innate/spider/comm/not_hivemind_talk = new(src) + not_hivemind_talk.Grant(src) /datum/action/innate/spider icon_icon = 'icons/mob/actions/actions_animal.dmi' background_icon_state = "bg_alien" -/datum/action/innate/spider/lay_web +/datum/action/innate/spider/lay_web // Todo: Unify this with the genetics power name = "Spin Web" desc = "Spin a web to slow down potential prey." check_flags = AB_CHECK_CONSCIOUS button_icon_state = "lay_web" -/datum/action/innate/spider/lay_web/Activate() - if(!istype(owner, /mob/living/simple_animal/hostile/giant_spider)) - return +/datum/action/innate/spider/lay_web/IsAvailable() + . = ..() + if(!.) + return FALSE + + if(DOING_INTERACTION(owner, INTERACTION_SPIDER_KEY)) + return FALSE + if(!isspider(owner)) + return FALSE + var/mob/living/simple_animal/hostile/giant_spider/spider = owner + var/obj/structure/spider/stickyweb/web = locate() in get_turf(spider) + if(web && (!spider.web_sealer || istype(web, /obj/structure/spider/stickyweb/sealed))) + to_chat(owner, span_warning("There's already a web here!")) + return FALSE if(!isturf(spider.loc)) - return - var/turf/spider_turf = get_turf(spider) + return FALSE + + return TRUE +/datum/action/innate/spider/lay_web/Activate() + var/turf/spider_turf = get_turf(owner) + var/mob/living/simple_animal/hostile/giant_spider/spider = owner var/obj/structure/spider/stickyweb/web = locate() in spider_turf if(web) - if(!spider.web_sealer || istype(web, /obj/structure/spider/stickyweb/sealed)) - to_chat(spider, span_warning("There's already a web here!")) - return - - if(!spider.is_busy) - spider.is_busy = TRUE - if(web) - spider.visible_message(span_notice("[spider] begins to pack more webbing onto the web."),span_notice("You begin to seal the web.")) - else - spider.visible_message(span_notice("[spider] begins to secrete a sticky substance."),span_notice("You begin to lay a web.")) - spider.stop_automated_movement = TRUE - if(do_after(spider, 40 * spider.web_speed, target = spider_turf)) - if(spider.is_busy && spider.loc == spider_turf) - if(web) - qdel(web) - new /obj/structure/spider/stickyweb/sealed(spider_turf) - new /obj/structure/spider/stickyweb(spider_turf) - spider.is_busy = FALSE - spider.stop_automated_movement = FALSE + spider.visible_message( + span_notice("[spider] begins to pack more webbing onto the web."), + span_notice("You begin to seal the web."), + ) else - to_chat(spider, span_warning("You're already doing something else!")) + spider.visible_message( + span_notice("[spider] begins to secrete a sticky substance."), + span_notice("You begin to lay a web."), + ) + + spider.stop_automated_movement = TRUE + + if(do_after(spider, 4 SECONDS * spider.web_speed, target = spider_turf)) + if(spider.loc == spider_turf) + if(web) + qdel(web) + new /obj/structure/spider/stickyweb/sealed(spider_turf) + new /obj/structure/spider/stickyweb(spider_turf) -/obj/effect/proc_holder/wrap + spider.stop_automated_movement = FALSE + +/datum/action/cooldown/wrap name = "Wrap" - panel = "Spider" - desc = "Wrap something or someone in a cocoon. If it's a human or similar species, you'll also consume them, allowing you to lay enriched eggs." + desc = "Wrap something or someone in a cocoon. If it's a human or similar species, \ + you'll also consume them, allowing you to lay enriched eggs." + background_icon_state = "bg_alien" + icon_icon = 'icons/mob/actions/actions_animal.dmi' + button_icon_state = "wrap_0" + check_flags = AB_CHECK_CONSCIOUS + click_to_activate = TRUE ranged_mousepointer = 'icons/effects/mouse_pointers/wrap_target.dmi' - action_icon = 'icons/mob/actions/actions_animal.dmi' - action_icon_state = "wrap_0" - action_background_icon_state = "bg_alien" - -/obj/effect/proc_holder/wrap/update_icon() - action.button_icon_state = "wrap_[active]" - action.UpdateButtons() - return ..() + /// The time it takes to wrap something. + var/wrap_time = 5 SECONDS -/obj/effect/proc_holder/wrap/Click() - if(!istype(usr, /mob/living/simple_animal/hostile/giant_spider/midwife)) - return TRUE - var/mob/living/simple_animal/hostile/giant_spider/midwife/user = usr - activate(user) +/datum/action/cooldown/wrap/IsAvailable() + . = ..() + if(!.) + return FALSE + if(owner.incapacitated()) + return FALSE + if(DOING_INTERACTION(owner, INTERACTION_SPIDER_KEY)) + return FALSE return TRUE -/obj/effect/proc_holder/wrap/proc/activate(mob/living/user) - var/message - if(active) - message = span_notice("You no longer prepare to wrap something in a cocoon.") - remove_ranged_ability(message) - else - message = span_notice("You prepare to wrap something in a cocoon. Left-click your target to start wrapping!") - add_ranged_ability(user, message, TRUE) - return TRUE - -/obj/effect/proc_holder/wrap/InterceptClickOn(mob/living/caller, params, atom/target) - if(..()) +/datum/action/cooldown/wrap/set_click_ability(mob/on_who) + . = ..() + if(!.) return - if(ranged_ability_user.incapacitated() || !istype(ranged_ability_user, /mob/living/simple_animal/hostile/giant_spider/midwife)) - remove_ranged_ability() + + to_chat(on_who, span_notice("You prepare to wrap something in a cocoon. Left-click your target to start wrapping!")) + button_icon_state = "wrap_0" + UpdateButtons() + +/datum/action/cooldown/wrap/unset_click_ability(mob/on_who, refund_cooldown = TRUE) + . = ..() + if(!.) return - var/mob/living/simple_animal/hostile/giant_spider/midwife/user = ranged_ability_user + if(refund_cooldown) + to_chat(on_who, span_notice("You no longer prepare to wrap something in a cocoon.")) + button_icon_state = "wrap_1" + UpdateButtons() - if(user.Adjacent(target) && (ismob(target) || isobj(target))) - var/atom/movable/target_atom = target - if(target_atom.anchored) - return - user.cocoon_target = target_atom - INVOKE_ASYNC(user, /mob/living/simple_animal/hostile/giant_spider/midwife/.proc/cocoon) - remove_ranged_ability() - return TRUE +/datum/action/cooldown/wrap/Activate(atom/to_wrap) + if(!owner.Adjacent(to_wrap)) + owner.balloon_alert(owner, "must be closer!") + return FALSE -/obj/effect/proc_holder/wrap/on_lose(mob/living/carbon/user) - remove_ranged_ability() + if(!ismob(to_wrap) && !isobj(to_wrap)) + return FALSE + + if(to_wrap == owner) + return FALSE + + if(isspider(to_wrap)) + owner.balloon_alert(owner, "can't wrap spiders!") + return FALSE + + var/atom/movable/target_movable = to_wrap + if(target_movable.anchored) + return FALSE + + StartCooldown(wrap_time) + INVOKE_ASYNC(src, .proc/cocoon, to_wrap) + return TRUE + +/datum/action/cooldown/wrap/proc/cocoon(atom/movable/to_wrap) + owner.visible_message( + span_notice("[owner] begins to secrete a sticky substance around [to_wrap]."), + span_notice("You begin wrapping [to_wrap] into a cocoon."), + ) + + var/mob/living/simple_animal/animal_owner = owner + if(istype(animal_owner)) + animal_owner.stop_automated_movement = TRUE + + if(do_after(owner, wrap_time, target = to_wrap, interaction_key = INTERACTION_SPIDER_KEY)) + var/obj/structure/spider/cocoon/casing = new(to_wrap.loc) + if(isliving(to_wrap)) + var/mob/living/living_wrapped = to_wrap + // if they're not dead, you can consume them anyway + if(ishuman(living_wrapped) && (living_wrapped.stat != DEAD || !HAS_TRAIT(living_wrapped, TRAIT_SPIDER_CONSUMED))) + var/datum/action/innate/spider/lay_eggs/enriched/egg_power = locate() in owner.actions + if(egg_power) + egg_power.charges++ + egg_power.UpdateButtons() + owner.visible_message( + span_danger("[owner] sticks a proboscis into [living_wrapped] and sucks a viscous substance out."), + span_notice("You suck the nutriment out of [living_wrapped], feeding you enough to lay a cluster of enriched eggs."), + ) + + living_wrapped.death() //you just ate them, they're dead. + else + to_chat(owner, span_warning("[living_wrapped] cannot sate your hunger!")) + + to_wrap.forceMove(casing) + if(to_wrap.density || ismob(to_wrap)) + casing.icon_state = pick("cocoon_large1", "cocoon_large2", "cocoon_large3") + + if(istype(animal_owner)) + animal_owner.stop_automated_movement = TRUE /datum/action/innate/spider/lay_eggs name = "Lay Eggs" desc = "Lay a cluster of eggs, which will soon grow into a normal spider." check_flags = AB_CHECK_CONSCIOUS button_icon_state = "lay_eggs" - var/enriched = FALSE + ///How long it takes for a broodmother to lay eggs. + var/egg_lay_time = 15 SECONDS + ///The type of egg we create + var/egg_type = /obj/effect/mob_spawn/ghost_role/spider /datum/action/innate/spider/lay_eggs/IsAvailable() . = ..() if(!.) - return - if(!istype(owner, /mob/living/simple_animal/hostile/giant_spider/midwife)) return FALSE - var/mob/living/simple_animal/hostile/giant_spider/midwife/S = owner - if(enriched && !S.fed) + + if(!isspider(owner)) + return FALSE + var/obj/structure/spider/eggcluster/eggs = locate() in get_turf(owner) + if(eggs) + to_chat(owner, span_warning("There is already a cluster of eggs here!")) + return FALSE + if(DOING_INTERACTION(owner, INTERACTION_SPIDER_KEY)) return FALSE + return TRUE /datum/action/innate/spider/lay_eggs/Activate() - if(!istype(owner, /mob/living/simple_animal/hostile/giant_spider/midwife)) - return - var/mob/living/simple_animal/hostile/giant_spider/midwife/spider = owner - var/obj/structure/spider/eggcluster/eggs = locate() in get_turf(spider) - if(eggs) - to_chat(spider, span_warning("There is already a cluster of eggs here!")) - else if(enriched && !spider.fed) - to_chat(spider, span_warning("You are too hungry to do this!")) - else if(!spider.is_busy) - spider.is_busy = TRUE - spider.visible_message(span_notice("[spider] begins to lay a cluster of eggs."),span_notice("You begin to lay a cluster of eggs.")) - spider.stop_automated_movement = TRUE - if(do_after(spider, spider.egg_lay_time, target = get_turf(spider))) - if(spider.is_busy) - eggs = locate() in get_turf(spider) - if(!eggs || !isturf(spider.loc)) - var/egg_choice = enriched ? /obj/effect/mob_spawn/ghost_role/spider/enriched : /obj/effect/mob_spawn/ghost_role/spider - var/obj/effect/mob_spawn/ghost_role/spider/new_eggs = new egg_choice(get_turf(spider)) - new_eggs.directive = spider.directive - new_eggs.faction = spider.faction - if(enriched) - spider.fed-- - UpdateButtons(TRUE) - spider.is_busy = FALSE - spider.stop_automated_movement = FALSE + owner.visible_message( + span_notice("[owner] begins to lay a cluster of eggs."), + span_notice("You begin to lay a cluster of eggs."), + ) + + var/mob/living/simple_animal/hostile/giant_spider/spider = owner + spider.stop_automated_movement = TRUE + + if(do_after(owner, egg_lay_time, target = get_turf(owner), interaction_key = INTERACTION_SPIDER_KEY)) + var/obj/structure/spider/eggcluster/eggs = locate() in get_turf(owner) + if(!eggs || !isturf(spider.loc)) + var/obj/effect/mob_spawn/ghost_role/spider/new_eggs = new egg_type(get_turf(spider)) + new_eggs.directive = spider.directive + new_eggs.faction = spider.faction + UpdateButtons(TRUE) + + spider.stop_automated_movement = FALSE /datum/action/innate/spider/lay_eggs/enriched name = "Lay Enriched Eggs" desc = "Lay a cluster of eggs, which will soon grow into a greater spider. Requires you drain a human per cluster of these eggs." button_icon_state = "lay_enriched_eggs" - enriched = TRUE + egg_type = /obj/effect/mob_spawn/ghost_role/spider/enriched + /// How many charges we have to make eggs + var/charges = 0 + +/datum/action/innate/spider/lay_eggs/enriched/IsAvailable() + return ..() && (charges > 0) /datum/action/innate/spider/set_directive name = "Set Directive" @@ -503,20 +518,18 @@ button_icon_state = "directive" /datum/action/innate/spider/set_directive/IsAvailable() - if(..()) - if(!istype(owner, /mob/living/simple_animal/hostile/giant_spider)) - return FALSE - return TRUE + return ..() && istype(owner, /mob/living/simple_animal/hostile/giant_spider) /datum/action/innate/spider/set_directive/Activate() - if(!istype(owner, /mob/living/simple_animal/hostile/giant_spider/midwife)) - return var/mob/living/simple_animal/hostile/giant_spider/midwife/spider = owner + spider.directive = tgui_input_text(spider, "Enter the new directive", "Create directive", "[spider.directive]") - if(isnull(spider.directive)) - return + if(isnull(spider.directive) || QDELETED(src) || QDELETED(owner) || !IsAvailable()) + return FALSE + message_admins("[ADMIN_LOOKUPFLW(owner)] set its directive to: '[spider.directive]'.") log_game("[key_name(owner)] set its directive to: '[spider.directive]'.") + return TRUE /datum/action/innate/spider/comm name = "Command" @@ -525,15 +538,13 @@ button_icon_state = "command" /datum/action/innate/spider/comm/IsAvailable() - if(..()) - if(!istype(owner, /mob/living/simple_animal/hostile/giant_spider/midwife)) - return FALSE - return TRUE + return ..() && istype(owner, /mob/living/simple_animal/hostile/giant_spider/midwife) /datum/action/innate/spider/comm/Trigger(trigger_flags) var/input = tgui_input_text(owner, "Input a command for your legions to follow.", "Command") - if(QDELETED(src) || !input || !IsAvailable()) + if(!input || QDELETED(src) || QDELETED(owner) || !IsAvailable()) return FALSE + spider_command(owner, input) return TRUE @@ -550,12 +561,12 @@ return var/my_message my_message = span_spider("Command from [user]: [message]") - for(var/mob/living/simple_animal/hostile/giant_spider/spider in GLOB.spidermobs) + for(var/mob/living/simple_animal/hostile/giant_spider/spider as anything in GLOB.spidermobs) to_chat(spider, my_message) for(var/ghost in GLOB.dead_mob_list) var/link = FOLLOW_LINK(ghost, user) to_chat(ghost, "[link] [my_message]") - usr.log_talk(message, LOG_SAY, tag="spider command") + user.log_talk(message, LOG_SAY, tag = "spider command") /** * # Giant Ice Spider @@ -675,22 +686,22 @@ /mob/living/simple_animal/hostile/giant_spider/hunter/flesh/Initialize(mapload) . = ..() - AddElement(/datum/element/blood_walk, /obj/effect/decal/cleanable/blood/bubblegum, blood_spawn_chance = 5) + AddComponent(/datum/component/blood_walk, \ + blood_type = /obj/effect/decal/cleanable/blood/bubblegum, \ + blood_spawn_chance = 5) /mob/living/simple_animal/hostile/giant_spider/hunter/flesh/AttackingTarget() - if(is_busy) + if(DOING_INTERACTION(src, INTERACTION_SPIDER_KEY)) return if(src == target) if(health >= maxHealth) to_chat(src, span_warning("You're not injured, there's no reason to heal.")) return visible_message(span_notice("[src] begins mending themselves..."),span_notice("You begin mending your wounds...")) - is_busy = TRUE - if(do_after(src, 20, target = src)) + if(do_after(src, 2 SECONDS, target = src, interaction_key = INTERACTION_SPIDER_KEY)) heal_overall_damage(50, 50) new /obj/effect/temp_visual/heal(get_turf(src), "#80F5FF") visible_message(span_notice("[src]'s wounds mend together."),span_notice("You mend your wounds together.")) - is_busy = FALSE return return ..() @@ -709,3 +720,5 @@ /mob/living/simple_animal/hostile/giant_spider/viper/wizard/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) + +#undef INTERACTION_SPIDER_KEY diff --git a/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm b/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm index 19b695b19ba17a..85a38873895283 100644 --- a/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm +++ b/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm @@ -21,7 +21,7 @@ response_disarm_simple = "challenge" response_harm_continuous = "thumps" response_harm_simple = "thump" - speed = 1 + speed = 0.5 melee_damage_lower = 15 melee_damage_upper = 18 damage_coeff = list(BRUTE = 1, BURN = 1.5, TOX = 1.5, CLONE = 0, STAMINA = 0, OXY = 1.5) @@ -32,7 +32,7 @@ attack_sound = 'sound/weapons/punch1.ogg' dextrous = TRUE held_items = list(null, null) - faction = list("jungle") + faction = list("monkey", "jungle") robust_searching = TRUE stat_attack = HARD_CRIT minbodytemp = 270 @@ -110,17 +110,19 @@ return FALSE /mob/living/simple_animal/hostile/gorilla/proc/oogaooga() - oogas++ - if(oogas >= rand(2,6)) + oogas -= 1 + if(oogas <= 0) + oogas = rand(2,6) playsound(src, 'sound/creatures/gorilla.ogg', 50) - oogas = 0 + /mob/living/simple_animal/hostile/gorilla/cargo_domestic name = "Cargorilla" // Overriden, normally - desc = "Cargo's pet gorilla." + icon = 'icons/mob/cargorillia.dmi' + desc = "Cargo's pet gorilla. They seem to have an 'I love Mom' tattoo." maxHealth = 200 health = 200 - faction = list(FACTION_STATION) + faction = list("neutral", "monkey", "jungle") gold_core_spawnable = NO_SPAWN unique_name = FALSE /// Whether we're currently being polled over diff --git a/code/modules/mob/living/simple_animal/hostile/gorilla/visuals_icons.dm b/code/modules/mob/living/simple_animal/hostile/gorilla/visuals_icons.dm index 9d451748b059cf..8ab5a0aa0b1c48 100644 --- a/code/modules/mob/living/simple_animal/hostile/gorilla/visuals_icons.dm +++ b/code/modules/mob/living/simple_animal/hostile/gorilla/visuals_icons.dm @@ -21,11 +21,11 @@ if(!standing) if(stat != DEAD) icon_state = "crawling" - speed = 1 + set_varspeed(0.5) return ..() if(stat != DEAD) icon_state = "standing" - speed = 3 // Gorillas are slow when standing up. + set_varspeed(1) // Gorillas are slow when standing up. var/list/hands_overlays = list() diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm index 06843b089142f2..bdb1e8ac93d0b3 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm @@ -100,7 +100,10 @@ Difficulty: Hard RegisterSignal(src, COMSIG_BLOOD_WARP, .proc/blood_enrage) RegisterSignal(src, COMSIG_FINISHED_CHARGE, .proc/after_charge) if(spawn_blood) - AddElement(/datum/element/blood_walk, /obj/effect/decal/cleanable/blood/bubblegum, 'sound/effects/meteorimpact.ogg', 200) + AddComponent(/datum/component/blood_walk, \ + blood_type = /obj/effect/decal/cleanable/blood/bubblegum, \ + sound_played = 'sound/effects/meteorimpact.ogg', \ + sound_volume = 200) /mob/living/simple_animal/hostile/megafauna/bubblegum/Destroy() QDEL_NULL(triple_charge) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm index 83d7c5aab5e618..ba0ef910e8e701 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -82,8 +82,8 @@ shotgun_blast.Grant(src) dir_shots.Grant(src) colossus_final.Grant(src) - RegisterSignal(src, COMSIG_ABILITY_STARTED, .proc/start_attack) - RegisterSignal(src, COMSIG_ABILITY_FINISHED, .proc/finished_attack) + RegisterSignal(src, COMSIG_MOB_ABILITY_STARTED, .proc/start_attack) + RegisterSignal(src, COMSIG_MOB_ABILITY_FINISHED, .proc/finished_attack) AddElement(/datum/element/projectile_shield) /mob/living/simple_animal/hostile/megafauna/colossus/Destroy() @@ -587,8 +587,8 @@ ADD_TRAIT(L, TRAIT_MUTE, STASIS_MUTE) L.status_flags |= GODMODE L.mind.transfer_to(holder_animal) - var/obj/effect/proc_holder/spell/targeted/exit_possession/P = new /obj/effect/proc_holder/spell/targeted/exit_possession - holder_animal.mind.AddSpell(P) + var/datum/action/exit_possession/escape = new(holder_animal) + escape.Grant(holder_animal) remove_verb(holder_animal, /mob/living/verb/pulled) /obj/structure/closet/stasis/dump_contents(kill = 1) @@ -599,7 +599,7 @@ L.notransform = 0 if(holder_animal) holder_animal.mind.transfer_to(L) - L.mind.RemoveSpell(/obj/effect/proc_holder/spell/targeted/exit_possession) + holder_animal.gib() if(kill || !isanimal(loc)) L.death(0) ..() @@ -610,33 +610,27 @@ /obj/structure/closet/stasis/ex_act() return -/obj/effect/proc_holder/spell/targeted/exit_possession +/datum/action/exit_possession name = "Exit Possession" - desc = "Exits the body you are possessing." - charge_max = 60 - clothes_req = 0 - invocation_type = INVOCATION_NONE - max_targets = 1 - range = -1 - include_user = TRUE - selection_type = "view" - action_icon = 'icons/mob/actions/actions_spells.dmi' - action_icon_state = "exit_possession" - sound = null - -/obj/effect/proc_holder/spell/targeted/exit_possession/cast(list/targets, mob/living/user = usr) - if(!isfloorturf(user.loc)) - return - var/datum/mind/target_mind = user.mind - for(var/i in user) - if(istype(i, /obj/structure/closet/stasis)) - var/obj/structure/closet/stasis/S = i - S.dump_contents(0) - qdel(S) - break - user.gib() - target_mind.RemoveSpell(/obj/effect/proc_holder/spell/targeted/exit_possession) + desc = "Exits the body you are possessing. They will explode violently when this occurs." + icon_icon = 'icons/mob/actions/actions_spells.dmi' + button_icon_state = "exit_possession" + +/datum/action/exit_possession/IsAvailable() + return ..() && isfloorturf(owner.loc) + +/datum/action/exit_possession/Trigger(trigger_flags) + . = ..() + if(!.) + return FALSE + + var/obj/structure/closet/stasis/stasis = locate() in owner + if(!stasis) + CRASH("[type] did not find a stasis closet thing in the owner.") + stasis.dump_contents(FALSE) + qdel(stasis) + qdel(src) #undef ACTIVATE_TOUCH #undef ACTIVATE_SPEECH diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm index 1d4e84f51df489..7140399ec913c3 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm @@ -64,7 +64,7 @@ Difficulty: Extremely Hard ice_shotgun.Grant(src) for(var/obj/structure/frost_miner_prism/prism_to_set in GLOB.frost_miner_prisms) prism_to_set.set_prism_light(LIGHT_COLOR_BLUE, 5) - RegisterSignal(src, COMSIG_ABILITY_STARTED, .proc/start_attack) + RegisterSignal(src, COMSIG_MOB_ABILITY_STARTED, .proc/start_attack) AddElement(/datum/element/knockback, 7, FALSE, TRUE) AddElement(/datum/element/lifesteal, 50) ADD_TRAIT(src, TRAIT_NO_FLOATING_ANIM, INNATE_TRAIT) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm index 72d96734541609..4cde7ad1baaa66 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm @@ -93,8 +93,8 @@ meteors.Grant(src) mass_fire.Grant(src) lava_swoop.Grant(src) - RegisterSignal(src, COMSIG_ABILITY_STARTED, .proc/start_attack) - RegisterSignal(src, COMSIG_ABILITY_FINISHED, .proc/finished_attack) + RegisterSignal(src, COMSIG_MOB_ABILITY_STARTED, .proc/start_attack) + RegisterSignal(src, COMSIG_MOB_ABILITY_FINISHED, .proc/finished_attack) RegisterSignal(src, COMSIG_SWOOP_INVULNERABILITY_STARTED, .proc/swoop_invulnerability_started) RegisterSignal(src, COMSIG_LAVA_ARENA_FAILED, .proc/on_arena_fail) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm index f1559082ef9c68..9040f80fb43159 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm @@ -303,17 +303,11 @@ Difficulty: Hard if(!human_user.mind) return to_chat(human_user, span_danger("Power courses through you! You can now shift your form at will.")) - var/obj/effect/proc_holder/spell/targeted/shapeshift/polar_bear/transformation_spell = new - human_user.mind.AddSpell(transformation_spell) + var/datum/action/cooldown/spell/shapeshift/polar_bear/transformation_spell = new(user.mind || user) + transformation_spell.Grant(user) playsound(human_user.loc, 'sound/items/drink.ogg', rand(10,50), TRUE) qdel(src) -/obj/effect/proc_holder/spell/targeted/shapeshift/polar_bear - name = "Polar Bear Form" - desc = "Take on the shape of a polar bear." - invocation = "RAAAAAAAAWR!" - shapeshift_type = /mob/living/simple_animal/hostile/asteroid/polarbear/lesser - /obj/item/crusher_trophy/wendigo_horn name = "wendigo horn" desc = "A horn from the head of an unstoppable beast." diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm index b29de2f72bcaef..23d6be2d6e5544 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm @@ -255,8 +255,8 @@ While using this makes the system rely on OnFire, it still gives options for tim /obj/structure/elite_tumor/attackby(obj/item/attacking_item, mob/user, params) . = ..() - if(istype(attacking_item, /obj/item/organ/regenerative_core) && activity == TUMOR_INACTIVE && !boosted) - var/obj/item/organ/regenerative_core/core = attacking_item + if(istype(attacking_item, /obj/item/organ/internal/regenerative_core) && activity == TUMOR_INACTIVE && !boosted) + var/obj/item/organ/internal/regenerative_core/core = attacking_item visible_message(span_boldwarning("As [user] drops the core into [src], [src] appears to swell.")) icon_state = "advanced_tumor" boosted = TRUE diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm index f4aa963e61fd83..3d06670944fe81 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm @@ -231,7 +231,7 @@ else visible_message(span_boldwarning("[src] spews smoke from its maw!")) var/datum/effect_system/fluid_spread/smoke/smoke = new - smoke.set_up(2, location = smoke_location) + smoke.set_up(2, holder = src, location = smoke_location) smoke.start() //The legionnaire's head. Basically the same as any legion head, but we have to tell our creator when we die so they can generate another head. diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goldgrub.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goldgrub.dm index 39dc4698518f8a..e40f4937e409ad 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goldgrub.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goldgrub.dm @@ -80,16 +80,15 @@ return if(G.is_burrowed) holder = G.loc - G.forceMove(T) - QDEL_NULL(holder) + holder.eject_jaunter() + holder = null G.is_burrowed = FALSE G.visible_message(span_danger("[G] emerges from the ground!")) playsound(get_turf(G), 'sound/effects/break_stone.ogg', 50, TRUE, -1) else G.visible_message(span_danger("[G] buries into the ground, vanishing from sight!")) playsound(get_turf(G), 'sound/effects/break_stone.ogg', 50, TRUE, -1) - holder = new /obj/effect/dummy/phased_mob(T) - G.forceMove(holder) + holder = new /obj/effect/dummy/phased_mob(T, G) G.is_burrowed = TRUE /mob/living/simple_animal/hostile/asteroid/goldgrub/GiveTarget(new_target) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm index b94d833e6834f8..95a3e57ad80dce 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm @@ -118,7 +118,6 @@ user.visible_message(span_notice("You manage to put [O] on [src], you can now ride [p_them()].")) qdel(O) saddled = TRUE - can_buckle = TRUE buckle_lying = 0 add_overlay("goliath_saddled") AddElement(/datum/element/ridable, /datum/component/riding/creature/goliath) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm index 9c6b6432c9315f..a98b5721cd4f46 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm @@ -30,7 +30,7 @@ retreat_distance = 3 minimum_distance = 3 pass_flags = PASSTABLE - loot = list(/obj/item/organ/regenerative_core) + loot = list(/obj/item/organ/internal/regenerative_core) var/brood_type = /mob/living/simple_animal/hostile/asteroid/hivelordbrood var/has_clickbox = TRUE @@ -122,7 +122,7 @@ attack_sound = 'sound/weapons/pierce.ogg' throw_message = "bounces harmlessly off of" crusher_loot = /obj/item/crusher_trophy/legion_skull - loot = list(/obj/item/organ/regenerative_core/legion) + loot = list(/obj/item/organ/internal/regenerative_core/legion) brood_type = /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion del_on_death = 1 stat_attack = HARD_CRIT @@ -267,7 +267,7 @@ layer = MOB_LAYER del_on_death = TRUE sentience_type = SENTIENCE_BOSS - loot = list(/obj/item/organ/regenerative_core/legion = 3, /obj/effect/mob_spawn/corpse/human/legioninfested = 5) + loot = list(/obj/item/organ/internal/regenerative_core/legion = 3, /obj/effect/mob_spawn/corpse/human/legioninfested = 5) move_to_delay = 14 vision_range = 5 aggro_vision_range = 9 @@ -294,7 +294,7 @@ icon_aggro = "snowlegion_alive" icon_dead = "snowlegion" crusher_loot = /obj/item/crusher_trophy/legion_skull - loot = list(/obj/item/organ/regenerative_core/legion) + loot = list(/obj/item/organ/internal/regenerative_core/legion) brood_type = /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/snow /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/snow/make_legion(mob/living/carbon/human/H) diff --git a/code/modules/mob/living/simple_animal/hostile/netherworld.dm b/code/modules/mob/living/simple_animal/hostile/netherworld.dm index 752d47813de1b7..2242435324c100 100644 --- a/code/modules/mob/living/simple_animal/hostile/netherworld.dm +++ b/code/modules/mob/living/simple_animal/hostile/netherworld.dm @@ -20,13 +20,12 @@ minbodytemp = 0 lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE var/phaser = TRUE - var/datum/action/innate/creature/teleport/teleport var/is_phased = FALSE /mob/living/simple_animal/hostile/netherworld/Initialize(mapload) . = ..() if(phaser) - teleport = new + var/datum/action/innate/creature/teleport/teleport = new(src) teleport.Grant(src) add_cell_sample() @@ -54,14 +53,13 @@ return if(N.is_phased) holder = N.loc - N.forceMove(T) - QDEL_NULL(holder) + holder.eject_jaunter() + holder = null N.is_phased = FALSE playsound(get_turf(N), 'sound/effects/podwoosh.ogg', 50, TRUE, -1) else playsound(get_turf(N), 'sound/effects/podwoosh.ogg', 50, TRUE, -1) - holder = new /obj/effect/dummy/phased_mob(T) - N.forceMove(holder) + holder = new /obj/effect/dummy/phased_mob(T, N) N.is_phased = TRUE /mob/living/simple_animal/hostile/netherworld/proc/can_be_seen(turf/location) diff --git a/code/modules/mob/living/simple_animal/hostile/ooze.dm b/code/modules/mob/living/simple_animal/hostile/ooze.dm index aed4425acf3239..b65018f2cb460b 100644 --- a/code/modules/mob/living/simple_animal/hostile/ooze.dm +++ b/code/modules/mob/living/simple_animal/hostile/ooze.dm @@ -282,85 +282,85 @@ obj_damage = 15 deathmessage = "deflates and spills its vital juices!" edible_food_types = MEAT | VEGETABLES - ///The ability lets you envelop a carbon in a healing cocoon. Useful for saving critical carbons. - var/datum/action/cooldown/gel_cocoon/gel_cocoon - ///The ability to shoot a mending globule, a sticky projectile that heals over time. - var/obj/effect/proc_holder/globules/globules /mob/living/simple_animal/hostile/ooze/grapes/Initialize(mapload) . = ..() - globules = new - AddAbility(globules) - gel_cocoon = new + var/datum/action/cooldown/globules/glob_shooter = new(src) + glob_shooter.Grant(src) + var/datum/action/cooldown/gel_cocoon/gel_cocoon = new(src) gel_cocoon.Grant(src) -/mob/living/simple_animal/hostile/ooze/grapes/Destroy() - . = ..() - QDEL_NULL(gel_cocoon) - QDEL_NULL(globules) - /mob/living/simple_animal/hostile/ooze/grapes/add_cell_sample() AddElement(/datum/element/swabable, CELL_LINE_TABLE_GRAPE, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) ///Ability that allows the owner to fire healing globules at mobs, targetting specific limbs. -/obj/effect/proc_holder/globules +/datum/action/cooldown/globules name = "Fire Mending globule" desc = "Fires a mending globule at someone, healing a specific limb of theirs." - active = FALSE - action_icon = 'icons/mob/actions/actions_slime.dmi' - action_icon_state = "globules" - action_background_icon_state = "bg_hive" - var/cooldown = 5 SECONDS - var/current_cooldown = 0 + background_icon_state = "bg_hive" + icon_icon = 'icons/mob/actions/actions_slime.dmi' + button_icon_state = "globules" + check_flags = AB_CHECK_CONSCIOUS + cooldown_time = 5 SECONDS + click_to_activate = TRUE -/obj/effect/proc_holder/globules/Click(location, control, params) +/datum/action/cooldown/globules/set_click_ability(mob/on_who) . = ..() - if(!isliving(usr)) - return TRUE - var/mob/living/user = usr - fire(user) - -/obj/effect/proc_holder/globules/fire(mob/living/carbon/user) - var/message - if(current_cooldown > world.time) - to_chat(user, span_notice("This ability is still on cooldown.")) + if(!.) return - if(active) - message = span_notice("You stop preparing your mending globules.") - remove_ranged_ability(message) - else - message = span_notice("You prepare to launch a mending globule. Left-click to fire at a target!") - add_ranged_ability(user, message, TRUE) - -/obj/effect/proc_holder/globules/InterceptClickOn(mob/living/caller, params, atom/target) + + to_chat(on_who, span_notice("You prepare to launch a mending globule. Left-click to fire at a target!")) + +/datum/action/cooldown/globules/unset_click_ability(mob/on_who, refund_cooldown = TRUE) . = ..() - if(.) - return - if(!istype(ranged_ability_user, /mob/living/simple_animal/hostile/ooze) || ranged_ability_user.stat) - remove_ranged_ability() + if(!.) return - var/mob/living/simple_animal/hostile/ooze/ooze = ranged_ability_user + if(refund_cooldown) + to_chat(on_who, span_notice("You stop preparing your mending globules.")) - if(ooze.ooze_nutrition < 5) - to_chat(ooze, span_warning("You need at least 5 nutrition to launch a mending globule.")) - remove_ranged_ability() - return +/datum/action/cooldown/globules/Activate(atom/target) + . = ..() + if(!.) + return FALSE + + var/mob/living/simple_animal/hostile/ooze/oozy_owner = owner + if(istype(oozy_owner)) + if(oozy_owner.ooze_nutrition < 5) + to_chat(oozy_owner, span_warning("You need at least 5 nutrition to launch a mending globule.")) + return FALSE + + return TRUE + +/datum/action/cooldown/globules/InterceptClickOn(mob/living/caller, params, atom/target) + . = ..() + if(!.) + return FALSE + + // Why is this in InterceptClickOn() and not Activate()? + // Well, we need to use the params of the click intercept + // for passing into preparePixelProjectile, so we'll handle it here instead. + // We just need to make sure Pre-activate and Activate return TRUE so we make it this far + caller.visible_message( + span_nicegreen("[caller] launches a mending globule!"), + span_notice("You launch a mending globule."), + ) + + var/mob/living/simple_animal/hostile/ooze/oozy = caller + if(istype(oozy)) + oozy.adjust_ooze_nutrition(-5) - ooze.visible_message(span_nicegreen("[ooze] launches a mending globule!"), span_notice("You launch a mending globule.")) var/modifiers = params2list(params) - var/obj/projectile/globule/globule = new (ooze.loc) - globule.preparePixelProjectile(target, ooze, modifiers) - globule.def_zone = ooze.zone_selected + var/obj/projectile/globule/globule = new(caller.loc) + globule.preparePixelProjectile(target, caller, modifiers) + globule.def_zone = caller.zone_selected globule.fire() - ooze.adjust_ooze_nutrition(-5) - remove_ranged_ability() - current_cooldown = world.time + cooldown return TRUE -/obj/effect/proc_holder/globules/on_lose(mob/living/carbon/user) - remove_ranged_ability() +// Needs to return TRUE otherwise PreActivate() will fail, see above +/datum/action/cooldown/globules/Activate(atom/target) + return TRUE ///This projectile embeds into mobs and heals them over time. /obj/projectile/globule diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm index 0c9a4e569adcde..0bf43c28e5897c 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm @@ -35,7 +35,7 @@ unsuitable_atmos_damage = 10 unsuitable_heat_damage = 15 footstep_type = FOOTSTEP_MOB_SHOE - faction = FACTION_CLOWN + faction = list(FACTION_CLOWN) var/attack_reagent /mob/living/simple_animal/hostile/retaliate/clown/Initialize(mapload) @@ -393,13 +393,12 @@ deathsound = 'sound/misc/sadtrombone.ogg' ///This is the list of items we are ready to regurgitate, var/list/prank_pouch = list() - ///This ability lets you fire a single random item from your pouch. - var/obj/effect/proc_holder/regurgitate/my_regurgitate /mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton/Initialize(mapload) . = ..() - my_regurgitate = new - AddAbility(my_regurgitate) + var/datum/action/cooldown/regurgitate/spit = new(src) + spit.Grant(src) + add_cell_sample() AddComponent(/datum/component/tameable, food_types = list(/obj/item/food/cheesiehonkers, /obj/item/food/cornchips), tame_chance = 30, bonus_tame_chance = 0, after_tame = CALLBACK(src, .proc/tamed)) @@ -457,7 +456,6 @@ flick("glutton_mouth", src) /mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton/proc/tamed(mob/living/tamer) - can_buckle = TRUE buckle_lying = 0 AddElement(/datum/element/ridable, /datum/component/riding/creature/glutton) @@ -469,48 +467,56 @@ prank_pouch -= gone ///This ability will let you fire one random item from your pouch, -/obj/effect/proc_holder/regurgitate +/datum/action/cooldown/regurgitate name = "Regurgitate" desc = "Regurgitates a single item from the depths of your pouch." - action_background_icon_state = "bg_changeling" - action_icon = 'icons/mob/actions/actions_animal.dmi' - action_icon_state = "regurgitate" - active = FALSE + background_icon_state = "bg_changeling" + icon_icon = 'icons/mob/actions/actions_animal.dmi' + button_icon_state = "regurgitate" + check_flags = AB_CHECK_CONSCIOUS + click_to_activate = TRUE -/obj/effect/proc_holder/regurgitate/Click(location, control, params) +/datum/action/cooldown/regurgitate/set_click_ability(mob/on_who) . = ..() - if(!isliving(usr)) - return TRUE - var/mob/living/user = usr - fire(user) + if(!.) + return -/obj/effect/proc_holder/regurgitate/fire(mob/living/carbon/user) - if(active) - user.icon_state = initial(user.icon_state) - remove_ranged_ability(span_notice("Your throat muscles relax.")) - else - user.icon_state = "glutton_tongue" - add_ranged_ability(user, span_notice("Your throat muscles tense up. Left-click to regurgitate a funny morsel!"), TRUE) + to_chat(on_who, span_notice("Your throat muscles tense up. Left-click to regurgitate a funny morsel!")) + on_who.icon_state = "glutton_tongue" + on_who.update_appearance(UPDATE_ICON) -/obj/effect/proc_holder/regurgitate/InterceptClickOn(mob/living/caller, params, atom/target) +/datum/action/cooldown/regurgitate/unset_click_ability(mob/on_who, refund_cooldown = TRUE) . = ..() - - if(.) + if(!.) return - if(!istype(ranged_ability_user, /mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton) || ranged_ability_user.stat) - remove_ranged_ability() - return + if(refund_cooldown) + to_chat(on_who, span_notice("Your throat muscles relax.")) + on_who.icon_state = initial(on_who.icon_state) + on_who.update_appearance(UPDATE_ICON) - var/mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton/pouch_owner = ranged_ability_user - if(!pouch_owner.prank_pouch.len) - //active = FALSE - pouch_owner.icon_state = "glutton" - remove_ranged_ability(span_notice("Your prank pouch is empty,.")) - return +/datum/action/cooldown/regurgitate/IsAvailable() + . = ..() + if(!.) + return FALSE + + // Hardcoded to only work with gluttons. Come back next year + return istype(owner, /mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton) + +/datum/action/cooldown/regurgitate/Activate(atom/spit_at) + StartCooldown(cooldown_time / 4) + + var/mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton/pouch_owner = owner + if(!length(pouch_owner.prank_pouch)) + pouch_owner.icon_state = initial(pouch_owner.icon_state) + to_chat(pouch_owner, span_notice("Your prank pouch is empty.")) + return TRUE var/obj/item/projected_morsel = pick(pouch_owner.prank_pouch) projected_morsel.forceMove(pouch_owner.loc) - projected_morsel.throw_at(target, 8, 2, pouch_owner) + projected_morsel.throw_at(spit_at, 8, 2, pouch_owner) flick("glutton_mouth", pouch_owner) playsound(pouch_owner, 'sound/misc/soggy.ogg', 75) + + StartCooldown() + return TRUE diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/frog.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/frog.dm index 07399d3575091c..93b20fdc295fc4 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/frog.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/frog.dm @@ -33,6 +33,10 @@ worn_slot_flags = ITEM_SLOT_HEAD head_icon = 'icons/mob/animal_item_head.dmi' var/stepped_sound = 'sound/effects/huuu.ogg' + ///How much of a reagent the mob injects on attack + var/poison_per_bite = 3 + ///What reagent the mob injects targets with + var/poison_type = /datum/reagent/drug/space_drugs /mob/living/simple_animal/hostile/retaliate/frog/Initialize(mapload) . = ..() @@ -46,11 +50,13 @@ icon_living = "rare_frog" icon_dead = "rare_frog_dead" butcher_results = list(/obj/item/food/nugget = 5) + poison_type = /datum/reagent/drug/mushroomhallucinogen var/static/list/loc_connections = list( COMSIG_ATOM_ENTERED = .proc/on_entered, ) AddElement(/datum/element/connect_loc, loc_connections) + AddElement(/datum/element/venomous, poison_type, poison_per_bite) add_cell_sample() /mob/living/simple_animal/hostile/retaliate/frog/proc/on_entered(datum/source, AM as mob|obj) diff --git a/code/modules/mob/living/simple_animal/hostile/space_dragon.dm b/code/modules/mob/living/simple_animal/hostile/space_dragon.dm index 8aff83267ea75f..3cf373ac6e7df6 100644 --- a/code/modules/mob/living/simple_animal/hostile/space_dragon.dm +++ b/code/modules/mob/living/simple_animal/hostile/space_dragon.dm @@ -141,6 +141,7 @@ if(riftTimer >= maxRiftTimer) to_chat(src, span_boldwarning("You've failed to summon the rift in a timely manner! You're being pulled back from whence you came!")) destroy_rifts() + empty_contents() playsound(src, 'sound/magic/demon_dies.ogg', 100, TRUE) QDEL_NULL(src) diff --git a/code/modules/mob/living/simple_animal/hostile/statue.dm b/code/modules/mob/living/simple_animal/hostile/statue.dm index 78ab42d3c0e81e..26d5bf74ed3b44 100644 --- a/code/modules/mob/living/simple_animal/hostile/statue.dm +++ b/code/modules/mob/living/simple_animal/hostile/statue.dm @@ -1,6 +1,6 @@ // A mob which only moves when it isn't being watched by living beings. -/mob/living/simple_animal/hostile/statue +/mob/living/simple_animal/hostile/netherworld/statue name = "statue" // matches the name of the statue with the flesh-to-stone spell desc = "An incredibly lifelike marble carving. Its eyes seem to follow you..." // same as an ordinary statue with the added "eye following you" description icon = 'icons/obj/statue.dmi' @@ -10,6 +10,7 @@ gender = NEUTER combat_mode = TRUE mob_biotypes = MOB_HUMANOID + gold_core_spawnable = NO_SPAWN response_help_continuous = "touches" response_help_simple = "touch" @@ -56,34 +57,38 @@ // No movement while seen code. -/mob/living/simple_animal/hostile/statue/Initialize(mapload, mob/living/creator) +/mob/living/simple_animal/hostile/netherworld/statue/Initialize(mapload, mob/living/creator) . = ..() // Give spells - LAZYINITLIST(mob_spell_list) - mob_spell_list += new /obj/effect/proc_holder/spell/aoe_turf/flicker_lights(src) - mob_spell_list += new /obj/effect/proc_holder/spell/aoe_turf/blindness(src) - mob_spell_list += new /obj/effect/proc_holder/spell/targeted/night_vision(src) - var/datum/action/innate/creature/teleport/teleport = new(src) - teleport.Grant(src) + + var/datum/action/cooldown/spell/aoe/flicker_lights/flicker = new(src) + flicker.Grant(src) + var/datum/action/cooldown/spell/aoe/blindness/blind = new(src) + blind.Grant(src) + var/datum/action/cooldown/spell/night_vision/night_vision = new(src) + night_vision.Grant(src) // Set creator if(creator) src.creator = creator -/mob/living/simple_animal/hostile/statue/med_hud_set_health() +/mob/living/simple_animal/hostile/netherworld/statue/add_cell_sample() + return + +/mob/living/simple_animal/hostile/netherworld/statue/med_hud_set_health() return //we're a statue we're invincible -/mob/living/simple_animal/hostile/statue/med_hud_set_status() +/mob/living/simple_animal/hostile/netherworld/statue/med_hud_set_status() return //we're a statue we're invincible -/mob/living/simple_animal/hostile/statue/Move(turf/NewLoc) +/mob/living/simple_animal/hostile/netherworld/statue/Move(turf/NewLoc) if(can_be_seen(NewLoc)) if(client) to_chat(src, span_warning("You cannot move, there are eyes on you!")) return return ..() -/mob/living/simple_animal/hostile/statue/Life(delta_time = SSMOBS_DT, times_fired) +/mob/living/simple_animal/hostile/netherworld/statue/Life(delta_time = SSMOBS_DT, times_fired) ..() if(!client && target) // If we have a target and we're AI controlled var/mob/watching = can_be_seen() @@ -94,7 +99,7 @@ LoseTarget() GiveTarget(watching) -/mob/living/simple_animal/hostile/statue/AttackingTarget() +/mob/living/simple_animal/hostile/netherworld/statue/AttackingTarget() if(can_be_seen(get_turf(loc))) if(client) to_chat(src, span_warning("You cannot attack, there are eyes on you!")) @@ -102,60 +107,31 @@ else return ..() -/mob/living/simple_animal/hostile/statue/DestroyPathToTarget() +/mob/living/simple_animal/hostile/netherworld/statue/DestroyPathToTarget() if(!can_be_seen(get_turf(loc))) ..() -/mob/living/simple_animal/hostile/statue/face_atom() +/mob/living/simple_animal/hostile/netherworld/statue/face_atom() if(!can_be_seen(get_turf(loc))) ..() -/mob/living/simple_animal/hostile/statue/IsVocal() //we're a statue, of course we can't talk. +/mob/living/simple_animal/hostile/netherworld/statue/IsVocal() //we're a statue, of course we can't talk. return FALSE -/mob/living/simple_animal/hostile/statue/proc/can_be_seen(turf/destination) - if(!cannot_be_seen) - return null - // Check for darkness - var/turf/T = get_turf(loc) - if(T && destination && T.lighting_object) - if(T.get_lumcount()<0.1 && destination.get_lumcount()<0.1) // No one can see us in the darkness, right? - return null - if(T == destination) - destination = null - - // We aren't in darkness, loop for viewers. - var/list/check_list = list(src) - if(destination) - check_list += destination - - // This loop will, at most, loop twice. - for(var/atom/check in check_list) - for(var/mob/living/M in viewers(world.view + 1, check) - src) - if(M.client && CanAttack(M) && !M.has_unlimited_silicon_privilege) - if(!M.is_blind()) - return M - for(var/obj/vehicle/sealed/mecha/M in view(world.view + 1, check)) //assuming if you can see them they can see you - for(var/O in M.occupants) - var/mob/mechamob = O - if(mechamob.client && !mechamob.is_blind()) - return mechamob - return null - // Cannot talk -/mob/living/simple_animal/hostile/statue/say(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null, filterproof = null) +/mob/living/simple_animal/hostile/netherworld/statue/say(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null, filterproof = null) return // Turn to dust when gibbed -/mob/living/simple_animal/hostile/statue/gib() +/mob/living/simple_animal/hostile/netherworld/statue/gib() dust() // Stop attacking clientless mobs -/mob/living/simple_animal/hostile/statue/CanAttack(atom/the_target) +/mob/living/simple_animal/hostile/netherworld/statue/CanAttack(atom/the_target) if(isliving(the_target)) var/mob/living/L = the_target if(!L.client && !L.ckey) @@ -164,72 +140,59 @@ // Don't attack your creator if there is one -/mob/living/simple_animal/hostile/statue/ListTargets() +/mob/living/simple_animal/hostile/netherworld/statue/ListTargets() . = ..() return . - creator +/mob/living/simple_animal/hostile/netherworld/statue/sentience_act() + faction -= "neutral" + // Statue powers // Flicker lights -/obj/effect/proc_holder/spell/aoe_turf/flicker_lights +/datum/action/cooldown/spell/aoe/flicker_lights name = "Flicker Lights" desc = "You will trigger a large amount of lights around you to flicker." - charge_max = 300 - clothes_req = 0 - range = 14 + cooldown_time = 30 SECONDS + spell_requirements = NONE + aoe_radius = 14 -/obj/effect/proc_holder/spell/aoe_turf/flicker_lights/cast(list/targets,mob/user = usr) - for(var/turf/T in targets) - for(var/obj/machinery/light/L in T) - L.flicker() - return +/datum/action/cooldown/spell/aoe/flicker_lights/get_things_to_cast_on(atom/center) + var/list/things = list() + for(var/obj/machinery/light/nearby_light in range(aoe_radius, center)) + if(!nearby_light.on) + continue + + things += nearby_light + + return things + +/datum/action/cooldown/spell/aoe/flicker_lights/cast_on_thing_in_aoe(obj/machinery/light/victim, atom/caster) + victim.flicker() //Blind AOE -/obj/effect/proc_holder/spell/aoe_turf/blindness +/datum/action/cooldown/spell/aoe/blindness name = "Blindness" desc = "Your prey will be momentarily blind for you to advance on them." - message = "You glare your eyes." - charge_max = 600 - clothes_req = 0 - range = 10 + cooldown_time = 1 MINUTES + spell_requirements = NONE + aoe_radius = 14 -/obj/effect/proc_holder/spell/aoe_turf/blindness/cast(list/targets,mob/user = usr) - for(var/mob/living/L in GLOB.alive_mob_list) - var/turf/T = get_turf(L.loc) - if(T && (T in targets)) - L.blind_eyes(4) - return +/datum/action/cooldown/spell/aoe/blindness/cast(atom/cast_on) + cast_on.visible_message(span_danger("[cast_on] glares their eyes.")) + return ..() -//Toggle Night Vision -/obj/effect/proc_holder/spell/targeted/night_vision - name = "Toggle Nightvision \[ON\]" - desc = "Toggle your nightvision mode." - - charge_max = 10 - clothes_req = 0 - - message = "You toggle your night vision!" - range = -1 - include_user = 1 - -/obj/effect/proc_holder/spell/targeted/night_vision/cast(list/targets, mob/user = usr) - for(var/mob/living/target in targets) - switch(target.lighting_alpha) - if (LIGHTING_PLANE_ALPHA_VISIBLE) - target.lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE - name = "Toggle Nightvision \[More]" - if (LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE) - target.lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE - name = "Toggle Nightvision \[Full]" - if (LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE) - target.lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE - name = "Toggle Nightvision \[OFF]" - else - target.lighting_alpha = LIGHTING_PLANE_ALPHA_VISIBLE - name = "Toggle Nightvision \[ON]" - target.update_sight() - -/mob/living/simple_animal/hostile/statue/sentience_act() - faction -= "neutral" +/datum/action/cooldown/spell/aoe/blindness/get_things_to_cast_on(atom/center) + var/list/things = list() + for(var/mob/living/nearby_mob in range(aoe_radius, center)) + if(nearby_mob == owner || nearby_mob == center) + continue + + things += nearby_mob + + return things + +/datum/action/cooldown/spell/aoe/blindness/cast_on_thing_in_aoe(mob/living/victim, atom/caster) + victim.blind_eyes(4) diff --git a/code/modules/mob/living/simple_animal/hostile/vatbeast.dm b/code/modules/mob/living/simple_animal/hostile/vatbeast.dm index 3d866e60081744..2198eabea035c1 100644 --- a/code/modules/mob/living/simple_animal/hostile/vatbeast.dm +++ b/code/modules/mob/living/simple_animal/hostile/vatbeast.dm @@ -23,21 +23,15 @@ attack_verb_continuous = "slaps" attack_verb_simple = "slap" - var/obj/effect/proc_holder/tentacle_slap/tentacle_slap - /mob/living/simple_animal/hostile/vatbeast/Initialize(mapload) . = ..() - tentacle_slap = new(src, src) - AddAbility(tentacle_slap) + var/datum/action/cooldown/tentacle_slap/slapper = new(src) + slapper.Grant(src) + add_cell_sample() AddComponent(/datum/component/tameable, list(/obj/item/food/fries, /obj/item/food/cheesyfries, /obj/item/food/cornchips, /obj/item/food/carrotfries), tame_chance = 30, bonus_tame_chance = 0, after_tame = CALLBACK(src, .proc/tamed)) -/mob/living/simple_animal/hostile/vatbeast/Destroy() - . = ..() - QDEL_NULL(tentacle_slap) - /mob/living/simple_animal/hostile/vatbeast/proc/tamed(mob/living/tamer) - can_buckle = TRUE buckle_lying = 0 AddElement(/datum/element/ridable, /datum/component/riding/creature/vatbeast) faction = list("neutral") @@ -45,74 +39,74 @@ /mob/living/simple_animal/hostile/vatbeast/add_cell_sample() AddElement(/datum/element/swabable, CELL_LINE_TABLE_VATBEAST, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) -///Ability that allows the owner to slap other mobs a short distance away -/obj/effect/proc_holder/tentacle_slap +/// Ability that allows the owner to slap other mobs a short distance away. +/// For vatbeats, this ability is shared with the rider. +/datum/action/cooldown/tentacle_slap name = "Tentacle slap" desc = "Slap a creature with your tentacles." - active = FALSE - action_icon = 'icons/mob/actions/actions_animal.dmi' - action_icon_state = "tentacle_slap" - action_background_icon_state = "bg_revenant" + background_icon_state = "bg_revenant" + icon_icon = 'icons/mob/actions/actions_animal.dmi' + button_icon_state = "tentacle_slap" + check_flags = AB_CHECK_CONSCIOUS + cooldown_time = 12 SECONDS + click_to_activate = TRUE ranged_mousepointer = 'icons/effects/mouse_pointers/supplypod_target.dmi' - base_action = /datum/action/cooldown/spell_like - ///How long cooldown before we can use the ability again - var/cooldown = 12 SECONDS -/obj/effect/proc_holder/tentacle_slap/Initialize(mapload, mob/living/new_owner) +/datum/action/cooldown/tentacle_slap/UpdateButton(atom/movable/screen/movable/action_button/button, status_only, force) . = ..() - if(!action) + if(!button) return - var/datum/action/cooldown/our_action = action - our_action.cooldown_time = cooldown + if(!status_only && button.our_hud.mymob != owner) + button.name = "Command Tentacle Slap" + button.desc = "Command your steed to slap a creature with its tentacles." -/obj/effect/proc_holder/tentacle_slap/Click(location, control, params) +/datum/action/cooldown/tentacle_slap/set_click_ability(mob/on_who) . = ..() - if(!isliving(usr)) - return TRUE - fire(usr) + if(!.) + return -/obj/effect/proc_holder/tentacle_slap/fire(mob/living/user) - if(active) - remove_ranged_ability(span_notice("You stop preparing to tentacle slap.")) - else - add_ranged_ability(user, span_notice("You prepare [(IS_WEAKREF_OF(user, owner)) ? "your" : "their"] pimp-tentacle. Left-click to slap a target!"), TRUE) + to_chat(on_who, span_notice("You prepare your [on_who == owner ? "":"steed's "]pimp-tentacle. Left-click to slap a target!")) -/obj/effect/proc_holder/tentacle_slap/InterceptClickOn(mob/living/caller, params, atom/target) +/datum/action/cooldown/tentacle_slap/unset_click_ability(mob/on_who, refund_cooldown = TRUE) . = ..() - if(.) + if(!.) return - var/mob/living/beast_owner = owner.resolve() + if(refund_cooldown) + to_chat(on_who, span_notice("You stop preparing your [on_who == owner ? "":"steed's "]pimp-tentacle.")) - if(!beast_owner) - return +/datum/action/cooldown/tentacle_slap/InterceptClickOn(mob/living/caller, params, atom/target) + // Check if we can slap + if(!isliving(target) || target == owner) + return FALSE - if(beast_owner.stat) - remove_ranged_ability() - return + if(!owner.Adjacent(target)) + owner.balloon_alert(caller, "too far!") + return FALSE - if(!beast_owner.Adjacent(target)) - return - - if(!isliving(target)) - return + // Do the slap + . = ..() + if(!.) + return FALSE - var/mob/living/living_target = target + // Give feedback from the slap. + // Additional feedback for if a rider did it + if(caller != owner) + to_chat(caller, span_notice("You command [owner] to slap [target] with its tentacles.")) - if(!action.IsAvailable()) //extra check for safety since the ability is shared - remove_ranged_ability() - to_chat(caller, span_notice("This ability is still on cooldown.")) - return + return TRUE - beast_owner.visible_message("[beast_owner] slaps [living_target] with its tentacle!", span_notice("You slap [living_target] with your tentacle.")) - playsound(beast_owner, 'sound/effects/assslap.ogg', 90) - var/atom/throw_target = get_edge_target_turf(target, beast_owner.dir) - living_target.throw_at(throw_target, 6, 4, beast_owner) - living_target.apply_damage(30) - remove_ranged_ability() +/datum/action/cooldown/tentacle_slap/Activate(atom/to_slap) + var/mob/living/living_to_slap = to_slap - var/datum/action/cooldown/our_action = action - our_action.StartCooldown() + owner.visible_message( + span_warning("[owner] slaps [to_slap] with its tentacle!"), + span_notice("You slap [to_slap] with your tentacle."), + ) + playsound(owner, 'sound/effects/assslap.ogg', 90) + var/atom/throw_target = get_edge_target_turf(to_slap, owner.dir) + living_to_slap.throw_at(throw_target, 6, 4, owner) + living_to_slap.apply_damage(30, BRUTE) + StartCooldown() return TRUE - diff --git a/code/modules/mob/living/simple_animal/hostile/wizard.dm b/code/modules/mob/living/simple_animal/hostile/wizard.dm index 8da7258a4cece9..e844ceb12c1827 100644 --- a/code/modules/mob/living/simple_animal/hostile/wizard.dm +++ b/code/modules/mob/living/simple_animal/hostile/wizard.dm @@ -23,56 +23,60 @@ unsuitable_atmos_damage = 7.5 faction = list(ROLE_WIZARD) status_flags = CANPUSH + footstep_type = FOOTSTEP_MOB_SHOE retreat_distance = 3 //out of fireball range minimum_distance = 3 del_on_death = 1 - loot = list(/obj/effect/mob_spawn/corpse/human/wizard, - /obj/item/staff) - - var/obj/effect/proc_holder/spell/aimed/fireball/fireball = null - var/obj/effect/proc_holder/spell/targeted/turf_teleport/blink/blink = null - var/obj/effect/proc_holder/spell/targeted/projectile/magic_missile/mm = null + loot = list( + /obj/effect/mob_spawn/corpse/human/wizard, + /obj/item/staff, + ) var/next_cast = 0 - - footstep_type = FOOTSTEP_MOB_SHOE + var/datum/action/cooldown/spell/pointed/projectile/fireball/fireball + var/datum/action/cooldown/spell/teleport/radius_turf/blink/blink + var/datum/action/cooldown/spell/aoe/magic_missile/magic_missile /mob/living/simple_animal/hostile/wizard/Initialize(mapload) . = ..() - fireball = new /obj/effect/proc_holder/spell/aimed/fireball - fireball.clothes_req = 0 - fireball.human_req = 0 - fireball.player_lock = 0 - AddSpell(fireball) - implants += new /obj/item/implant/exile(src) + var/obj/item/implant/exile/exiled = new /obj/item/implant/exile(src) + exiled.implant(src) - mm = new /obj/effect/proc_holder/spell/targeted/projectile/magic_missile - mm.clothes_req = 0 - mm.human_req = 0 - mm.player_lock = 0 - AddSpell(mm) + fireball = new(src) + fireball.spell_requirements &= ~(SPELL_REQUIRES_HUMAN|SPELL_REQUIRES_WIZARD_GARB|SPELL_REQUIRES_MIND) + fireball.Grant(src) - blink = new /obj/effect/proc_holder/spell/targeted/turf_teleport/blink - blink.clothes_req = 0 - blink.human_req = 0 - blink.player_lock = 0 + magic_missile = new(src) + magic_missile.spell_requirements &= ~(SPELL_REQUIRES_HUMAN|SPELL_REQUIRES_WIZARD_GARB|SPELL_REQUIRES_MIND) + magic_missile.Grant(src) + + blink = new(src) + blink.spell_requirements &= ~(SPELL_REQUIRES_HUMAN|SPELL_REQUIRES_WIZARD_GARB|SPELL_REQUIRES_MIND) blink.outer_tele_radius = 3 - AddSpell(blink) + blink.Grant(src) + +/mob/living/simple_animal/hostile/wizard/Destroy() + QDEL_NULL(fireball) + QDEL_NULL(magic_missile) + QDEL_NULL(blink) + return ..() /mob/living/simple_animal/hostile/wizard/handle_automated_action() . = ..() if(target && next_cast < world.time) - if((get_dir(src,target) in list(SOUTH,EAST,WEST,NORTH)) && fireball.cast_check(0,src)) //Lined up for fireball - src.setDir(get_dir(src,target)) - fireball.perform(list(target), user = src) - next_cast = world.time + 10 //One spell per second - return . - if(mm.cast_check(0,src)) - mm.choose_targets(src) - next_cast = world.time + 10 - return . - if(blink.cast_check(0,src)) //Spam Blink when you can - blink.choose_targets(src) - next_cast = world.time + 10 - return . + if((get_dir(src, target) in list(SOUTH, EAST, WEST, NORTH)) && fireball.can_cast_spell(feedback = FALSE)) + setDir(get_dir(src, target)) + fireball.Trigger(null, target) + next_cast = world.time + 1 SECONDS + return + + if(magic_missile.IsAvailable()) + magic_missile.Trigger(null, target) + next_cast = world.time + 1 SECONDS + return + + if(blink.IsAvailable()) // Spam Blink when you can + blink.Trigger(null, src) + next_cast = world.time + 1 SECONDS + return diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm index e4dc91172bba6f..1893a09358298d 100644 --- a/code/modules/mob/living/simple_animal/slime/slime.dm +++ b/code/modules/mob/living/simple_animal/slime/slime.dm @@ -438,7 +438,7 @@ return /mob/living/simple_animal/slime/examine(mob/user) - . = list("*---------*\nThis is [icon2html(src, user)] \a [src]!") + . = list("This is [icon2html(src, user)] \a [src]!") if (stat == DEAD) . += span_deadsay("It is limp and unresponsive.") else @@ -465,7 +465,7 @@ if(10) . += span_warning("It is radiating with massive levels of electrical activity!") - . += "*---------*" + . += "" /mob/living/simple_animal/slime/proc/discipline_slime(mob/user) if(stat) diff --git a/code/modules/mob/living/status_procs.dm b/code/modules/mob/living/status_procs.dm index e0f8ccc40ba08d..bc186c61d76a18 100644 --- a/code/modules/mob/living/status_procs.dm +++ b/code/modules/mob/living/status_procs.dm @@ -71,7 +71,7 @@ return 0 /mob/living/proc/Knockdown(amount, ignore_canstun = FALSE) //Can't go below remaining duration - if(SEND_SIGNAL(src, /datum/status_effect/incapacitating/knockdown, amount, ignore_canstun) & COMPONENT_NO_STUN) + if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_KNOCKDOWN, amount, ignore_canstun) & COMPONENT_NO_STUN) return if(IS_STUN_IMMUNE(src, ignore_canstun)) return diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index bb88f2f91bf958..fbe9e09629a616 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -38,6 +38,7 @@ if(observers?.len) for(var/mob/dead/observe as anything in observers) observe.reset_perspective(null) + qdel(hud_used) QDEL_LIST(client_colours) ghostize() //False, since we're deleting it currently @@ -349,6 +350,14 @@ /mob/proc/get_item_by_slot(slot_id) return null +/// Gets what slot the item on the mob is held in. +/// Returns null if the item isn't in any slots on our mob. +/// Does not check if the passed item is null, which may result in unexpected outcoms. +/mob/proc/get_slot_by_item(obj/item/looking_for) + if(looking_for in held_items) + return ITEM_SLOT_HANDS + + return null ///Is the mob incapacitated /mob/proc/incapacitated(flags) @@ -533,7 +542,11 @@ else result = examinify.examine(src) // if a tree is examined but no client is there to see it, did the tree ever really exist? - to_chat(src, "[result.Join("\n")]") + if(result.len) + for(var/i in 1 to (length(result) - 1)) + result[i] += "\n" + + to_chat(src, examine_block("[result.Join()]")) SEND_SIGNAL(src, COMSIG_MOB_EXAMINATE, examinify) @@ -549,10 +562,14 @@ //you can examine things you're holding directly, but you can't examine other things if your hands are full /// the item in our active hand - var/active_item = get_active_held_item() - if(active_item && active_item != examined_thing) - to_chat(src, span_warning("Your hands are too full to examine this!")) - return FALSE + var/obj/item/active_item = get_active_held_item() + var/boosted = FALSE + if(active_item) + if(HAS_TRAIT(active_item, TRAIT_BLIND_TOOL)) + boosted = TRUE + else if(active_item != examined_thing) + to_chat(src, span_warning("Your hands are too full to examine this!")) + return FALSE //you can only initiate exaimines if you have a hand, it's not disabled, and only as many examines as you have hands /// our active hand, to check if it's disabled/detatched @@ -570,6 +587,8 @@ /// how long it takes for the blind person to find the thing they're examining var/examine_delay_length = rand(1 SECONDS, 2 SECONDS) + if(boosted) + examine_delay_length = 0.5 SECONDS if(client?.recent_examines && client?.recent_examines[ref(examined_thing)]) //easier to find things we just touched examine_delay_length = 0.33 SECONDS else if(isobj(examined_thing)) @@ -822,30 +841,33 @@ /mob/proc/get_status_tab_items() . = list() -/// Gets all relevant proc holders for the browser statpenl -/mob/proc/get_proc_holders() - . = list() - if(mind) - . += get_spells_for_statpanel(mind.spell_list) - . += get_spells_for_statpanel(mob_spell_list) - /** * Convert a list of spells into a displyable list for the statpanel * * Shows charge and other important info */ -/mob/proc/get_spells_for_statpanel(list/spells) - var/list/L = list() - for(var/obj/effect/proc_holder/spell/S in spells) - if(S.can_be_cast_by(src)) - switch(S.charge_type) - if("recharge") - L[++L.len] = list("[S.panel]", "[S.charge_counter/10.0]/[S.charge_max/10]", S.name, REF(S)) - if("charges") - L[++L.len] = list("[S.panel]", "[S.charge_counter]/[S.charge_max]", S.name, REF(S)) - if("holdervar") - L[++L.len] = list("[S.panel]", "[S.holder_var_type] [S.holder_var_amount]", S.name, REF(S)) - return L +/mob/proc/get_actions_for_statpanel() + var/list/data = list() + for(var/datum/action/cooldown/action in actions) + var/list/action_data = action.set_statpanel_format() + if(!length(action_data)) + return + + data += list(list( + // the panel the action gets displayed to + // in the future, this could probably be replaced with subtabs (a la admin tabs) + action_data[PANEL_DISPLAY_PANEL], + // the status of the action, - cooldown, charges, whatever + action_data[PANEL_DISPLAY_STATUS], + // the name of the action + action_data[PANEL_DISPLAY_NAME], + // a ref to the action button of this action for this mob + // it's a ref to the button specifically, instead of the action itself, + // because statpanel href calls click(), which the action button (not the action itself) handles + REF(action.viewers[hud_used]), + )) + + return data /mob/proc/swap_hand() var/obj/item/held_item = get_active_held_item() @@ -877,32 +899,6 @@ ghost.notify_cloning(message, sound, source, flashwindow) return ghost -///Add a spell to the mobs spell list -/mob/proc/AddSpell(obj/effect/proc_holder/spell/S) - // HACK: Preferences menu creates one of every selectable species. - // Some species, like vampires, create spells when they're made. - // The "action" is created when those spells Initialize. - // Preferences menu can create these assets at *any* time, primarily before - // the atoms SS initializes. - // That means "action" won't exist. - if (isnull(S.action)) - return - - LAZYADD(mob_spell_list, S) - S.action.Grant(src) - -///Remove a spell from the mobs spell list -/mob/proc/RemoveSpell(obj/effect/proc_holder/spell/spell) - if(!spell) - return - for(var/X in mob_spell_list) - var/obj/effect/proc_holder/spell/S = X - if(istype(S, spell)) - LAZYREMOVE(mob_spell_list, S) - qdel(S) - if(client) - client.stat_panel.send_message("check_spells") - /** * Checks to see if the mob can cast normal magic spells. * @@ -1152,7 +1148,7 @@ /// This mob is abile to read books /mob/proc/is_literate() - return FALSE + return HAS_TRAIT(src, TRAIT_LITERATE) && !HAS_TRAIT(src, TRAIT_ILLITERATE) /// Can this mob write /mob/proc/can_write(obj/writing_instrument) @@ -1221,7 +1217,6 @@ VV_DROPDOWN_OPTION(VV_HK_DIRECT_CONTROL, "Assume Direct Control") VV_DROPDOWN_OPTION(VV_HK_GIVE_DIRECT_CONTROL, "Give Direct Control") VV_DROPDOWN_OPTION(VV_HK_OFFER_GHOSTS, "Offer Control to Ghosts") - VV_DROPDOWN_OPTION(VV_HK_SDQL_SPELL, "Give SDQL Spell") /mob/vv_do_topic(list/href_list) . = ..() @@ -1273,10 +1268,7 @@ if(!check_rights(NONE)) return offer_control(src) - if(href_list[VV_HK_SDQL_SPELL]) - if(!check_rights(R_DEBUG)) - return - usr.client.cmd_sdql_spell_menu(src) + /** * extra var handling for the logging var */ diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 1672ff86d612e3..15fe1b0f1924ba 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -48,8 +48,9 @@ var/cached_multiplicative_actions_slowdown /// List of action hud items the user has var/list/datum/action/actions - /// A special action? No idea why this lives here - var/list/datum/action/chameleon_item_actions + /// A list of chameleon actions we have specifically + /// This can be unified with the actions list + var/list/datum/action/item_action/chameleon/chameleon_item_actions ///Cursor icon used when holding shift over things var/examine_cursor_icon = 'icons/effects/mouse_pointers/examine_pointer.dmi' @@ -163,15 +164,6 @@ ///A weakref to the last mob/living/carbon to push/drag/grab this mob (exclusively used by slimes friend recognition) var/datum/weakref/LAssailant = null - /** - * construct spells and mime spells. - * - * Spells that do not transfer from one mob to another and can not be lost in mindswap. - * obviously do not live in the mind - */ - var/list/mob_spell_list - - /// bitflags defining which status effects can be inflicted (replaces canknockdown, canstun, etc) var/status_flags = CANSTUN|CANKNOCKDOWN|CANUNCONSCIOUS|CANPUSH @@ -234,3 +226,13 @@ var/datum/client_interface/mock_client var/interaction_range = 0 //how far a mob has to be to interact with something without caring about obsctruction, defaulted to 0 tiles + + /// Typing indicator - mob is typing into a input + var/typing_indicator = FALSE + /// Thinking indicator - mob has input window open + var/thinking_indicator = FALSE + /// User is thinking in character. Used to revert to thinking state after stop_typing + var/thinking_IC = FALSE + + ///how much gravity is slowing us down + var/gravity_slowdown = 0 diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 7b4aba4a17de3f..ea80a661150e1c 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -70,9 +70,9 @@ next_move_dir_sub = 0 var/old_move_delay = move_delay move_delay = world.time + world.tick_lag //this is here because Move() can now be called mutiple times per tick - if(!mob || !mob.loc) + if(!direct || !new_loc) return FALSE - if(!new_loc || !direct) + if(!mob?.loc) return FALSE if(mob.notransform) return FALSE //This is sota the goto stop mobs from moving var @@ -118,7 +118,9 @@ //We are now going to move var/add_delay = mob.cached_multiplicative_slowdown - mob.set_glide_size(DELAY_TO_GLIDE_SIZE(add_delay * ( (NSCOMPONENT(direct) && EWCOMPONENT(direct)) ? SQRT_2 : 1 ) )) // set it now in case of pulled objects + var/new_glide_size = DELAY_TO_GLIDE_SIZE(add_delay * ( (NSCOMPONENT(direct) && EWCOMPONENT(direct)) ? SQRT_2 : 1 ) ) + if(mob.glide_size != new_glide_size) + mob.set_glide_size(new_glide_size) // set it now in case of pulled objects //If the move was recent, count using old_move_delay //We want fractional behavior and all if(old_move_delay + world.tick_lag > world.time) @@ -137,10 +139,15 @@ if((direct & (direct - 1)) && mob.loc == new_loc) //moved diagonally successfully add_delay *= SQRT_2 + var/after_glide = 0 if(visual_delay) - mob.set_glide_size(visual_delay) + after_glide = visual_delay else - mob.set_glide_size(DELAY_TO_GLIDE_SIZE(add_delay)) + after_glide = DELAY_TO_GLIDE_SIZE(add_delay) + + if(after_glide != mob.glide_size) + mob.set_glide_size(after_glide) + move_delay += add_delay if(.) // If mob is null here, we deserve the runtime if(mob.throwing) @@ -358,10 +365,12 @@ /// Update the gravity status of this mob /mob/proc/update_gravity(has_gravity, override=FALSE) var/speed_change = max(0, has_gravity - STANDARD_GRAVITY) - if(!speed_change) + if(!speed_change && gravity_slowdown) remove_movespeed_modifier(/datum/movespeed_modifier/gravity) - else + gravity_slowdown = 0 + else if(gravity_slowdown != speed_change) add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/gravity, multiplicative_slowdown=speed_change) + gravity_slowdown = speed_change //bodypart selection verbs - Cyberboss //8: repeated presses toggles through head - eyes - mouth diff --git a/code/modules/mob/mob_say.dm b/code/modules/mob/mob_say.dm index 1b6f51f1c023d7..b84d47cfde31c8 100644 --- a/code/modules/mob/mob_say.dm +++ b/code/modules/mob/mob_say.dm @@ -28,8 +28,14 @@ if(message) SSspeech_controller.queue_say_for_mob(src, message, SPEECH_CONTROLLER_QUEUE_WHISPER_VERB) -///whisper a message -/mob/proc/whisper(message, datum/language/language=null) +/** + * Whisper a message. + * + * Basic level implementation just speaks the message, nothing else. + */ +/mob/proc/whisper(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language, ignore_spam = FALSE, forced, filterproof) + if(!message) + return say(message, language = language) ///The me emote verb diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 2fb1f40f9aaa4d..f77ef33dafd33f 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -27,6 +27,7 @@ set_species(/datum/species/monkey) SEND_SIGNAL(src, COMSIG_HUMAN_MONKEYIZE) uncuff() + regenerate_icons() return src ////////////////////////// Humanize ////////////////////////////// @@ -57,6 +58,7 @@ invisibility = 0 set_species(species) SEND_SIGNAL(src, COMSIG_MONKEY_HUMANIZE) + regenerate_icons() return src /mob/proc/AIize(client/preference_source, move = TRUE) diff --git a/code/modules/mob_spawn/corpses/mob_corpses.dm b/code/modules/mob_spawn/corpses/mob_corpses.dm index 33888fbc126169..ce7809e87a44d7 100644 --- a/code/modules/mob_spawn/corpses/mob_corpses.dm +++ b/code/modules/mob_spawn/corpses/mob_corpses.dm @@ -38,6 +38,15 @@ id = /obj/item/card/id/advanced/chameleon id_trim = /datum/id_trim/chameleon/operative +/obj/effect/mob_spawn/corpse/human/syndicatecommando/lessenedgear + outfit = /datum/outfit/syndicatecommandocorpse/lessenedgear + +/datum/outfit/syndicatecommandocorpse/lessenedgear + name = "Syndicate Commando Corpse" + gloves = /obj/item/clothing/gloves/tackler + back = null + id = null + id_trim = null /obj/effect/mob_spawn/corpse/human/syndicatestormtrooper name = "Syndicate Stormtrooper" diff --git a/code/modules/mob_spawn/ghost_roles/space_roles.dm b/code/modules/mob_spawn/ghost_roles/space_roles.dm index a74ac6167a9880..d3c65ee5459b51 100644 --- a/code/modules/mob_spawn/ghost_roles/space_roles.dm +++ b/code/modules/mob_spawn/ghost_roles/space_roles.dm @@ -96,7 +96,7 @@ /obj/effect/mob_spawn/ghost_role/human/lavaland_syndicate/comms/space/Initialize(mapload) . = ..() - if(prob(90)) //only has a 10% chance of existing, otherwise it'll just be a NPC syndie. + if(prob(85)) //only has a 15% chance of existing, otherwise it'll just be a NPC syndie. new /mob/living/simple_animal/hostile/syndicate/ranged(get_turf(src)) return INITIALIZE_HINT_QDEL diff --git a/code/modules/mob_spawn/ghost_roles/unused_roles.dm b/code/modules/mob_spawn/ghost_roles/unused_roles.dm index 00390d533bec98..cfc49a57207e77 100644 --- a/code/modules/mob_spawn/ghost_roles/unused_roles.dm +++ b/code/modules/mob_spawn/ghost_roles/unused_roles.dm @@ -263,9 +263,6 @@ outfit = /datum/outfit/syndicatespace/syndicrew spawner_job_path = /datum/job/syndicate_cybersun -/datum/outfit/syndicatespace/syndicrew/post_equip(mob/living/carbon/human/H) - H.faction |= ROLE_SYNDICATE - /obj/effect/mob_spawn/ghost_role/human/syndicatespace/special(mob/living/new_spawn) . = ..() new_spawn.grant_language(/datum/language/codespeak, TRUE, TRUE, LANGUAGE_MIND) @@ -283,39 +280,37 @@ outfit = /datum/outfit/syndicatespace/syndicaptain spawner_job_path = /datum/job/syndicate_cybersun_captain -/datum/outfit/syndicatespace/syndicaptain/post_equip(mob/living/carbon/human/H) - H.faction |= ROLE_SYNDICATE - /obj/effect/mob_spawn/ghost_role/human/syndicatespace/captain/Destroy() new /obj/structure/fluff/empty_sleeper/syndicate/captain(get_turf(src)) return ..() -/datum/outfit/syndicatespace/syndicrew - name = "Syndicate Ship Crew Member" +/datum/outfit/syndicatespace + name = "Syndicate Ship Base" uniform = /obj/item/clothing/under/syndicate/combat - glasses = /obj/item/clothing/glasses/night - mask = /obj/item/clothing/mask/gas/syndicate ears = /obj/item/radio/headset/syndicate/alt shoes = /obj/item/clothing/shoes/combat gloves = /obj/item/clothing/gloves/combat back = /obj/item/storage/backpack - l_pocket = /obj/item/gun/ballistic/automatic/pistol - r_pocket = /obj/item/knife/combat/survival belt = /obj/item/storage/belt/military/assault id = /obj/item/card/id/advanced/black/syndicate_command/crew_id implants = list(/obj/item/implant/weapons_auth) +/datum/outfit/syndicatespace/post_equip(mob/living/carbon/human/syndie_scum) + syndie_scum.faction |= ROLE_SYNDICATE + +/datum/outfit/syndicatespace/syndicrew + name = "Syndicate Ship Crew Member" + glasses = /obj/item/clothing/glasses/night + mask = /obj/item/clothing/mask/gas/syndicate + l_pocket = /obj/item/gun/ballistic/automatic/pistol + r_pocket = /obj/item/knife/combat/survival + /datum/outfit/syndicatespace/syndicaptain name = "Syndicate Ship Captain" uniform = /obj/item/clothing/under/syndicate/combat suit = /obj/item/clothing/suit/armor/vest/capcarapace/syndicate head = /obj/item/clothing/head/hos/beret/syndicate ears = /obj/item/radio/headset/syndicate/alt/leader - shoes = /obj/item/clothing/shoes/combat - gloves = /obj/item/clothing/gloves/combat - back = /obj/item/storage/backpack r_pocket = /obj/item/knife/combat/survival - belt = /obj/item/storage/belt/military/assault id = /obj/item/card/id/advanced/black/syndicate_command/captain_id - implants = list(/obj/item/implant/weapons_auth) backpack_contents = list(/obj/item/documents/syndicate/red, /obj/item/paper/fluff/ruins/forgottenship/password, /obj/item/gun/ballistic/automatic/pistol/aps) diff --git a/code/modules/mod/mod_control.dm b/code/modules/mod/mod_control.dm index 51c0a6924d82d4..db091a89939ddb 100644 --- a/code/modules/mod/mod_control.dm +++ b/code/modules/mod/mod_control.dm @@ -545,13 +545,7 @@ new_module.on_install() if(wearer) new_module.on_equip() - var/datum/action/item_action/mod/pinned_module/action = new_module.pinned_to[REF(wearer)] - if(action) - action.Grant(wearer) - if(ai) - var/datum/action/item_action/mod/pinned_module/action = new_module.pinned_to[REF(ai)] - if(action) - action.Grant(ai) + if(user) balloon_alert(user, "[new_module] added") playsound(src, 'sound/machines/click.ogg', 50, TRUE, SILENCED_SOUND_EXTRARANGE) @@ -564,7 +558,7 @@ if(old_module.active) old_module.on_deactivation(display_message = !deleting, deleting = deleting) old_module.on_uninstall(deleting = deleting) - QDEL_LIST(old_module.pinned_to) + QDEL_LIST_ASSOC_VAL(old_module.pinned_to) old_module.mod = null /obj/item/mod/control/proc/update_access(mob/user, obj/item/card/id/card) @@ -676,10 +670,12 @@ uninstall(part) return if(part in mod_parts) + if(!wearer) + part.forceMove(src) + return retract(wearer, part) if(active) INVOKE_ASYNC(src, .proc/toggle_activate, wearer, TRUE) - return /obj/item/mod/control/proc/on_part_destruction(obj/item/part, damage_flag) SIGNAL_HANDLER diff --git a/code/modules/mod/mod_theme.dm b/code/modules/mod/mod_theme.dm index d6ca4f8303bbf3..b09812ddaf8b73 100644 --- a/code/modules/mod/mod_theme.dm +++ b/code/modules/mod/mod_theme.dm @@ -609,10 +609,8 @@ hostile situations. These suits have been layered with plating worthy enough for fires or corrosive environments, \ and come with composite cushioning and an advanced honeycomb structure underneath the hull to ensure protection \ against broken bones or possible avulsions. The suit's legs have been given more rugged actuators, \ - allowing the suit to do more work in carrying the weight. Lastly, these have been given a shock-absorbing \ - insulating layer on the gauntlets, making sure the user isn't under risk of electricity. \ - However, the systems used in these suits are more than a few years out of date, \ - leading to an overall lower capacity for modules." + allowing the suit to do more work in carrying the weight. However, the systems used in these suits are more than \ + a few years out of date, leading to an overall lower capacity for modules." default_skin = "security" armor = list(MELEE = 15, BULLET = 15, LASER = 15, ENERGY = 15, BOMB = 25, BIO = 100, FIRE = 75, ACID = 75, WOUND = 15) complexity_max = DEFAULT_MAX_COMPLEXITY - 3 diff --git a/code/modules/mod/mod_types.dm b/code/modules/mod/mod_types.dm index 05943ab7ae3222..1f149cf7024ac4 100644 --- a/code/modules/mod/mod_types.dm +++ b/code/modules/mod/mod_types.dm @@ -218,12 +218,13 @@ theme = /datum/mod_theme/ninja applied_cell = /obj/item/stock_parts/cell/ninja initial_modules = list( + /obj/item/mod/module/storage, /obj/item/mod/module/noslip, + /obj/item/mod/module/status_readout, /obj/item/mod/module/stealth/ninja, /obj/item/mod/module/dispenser/ninja, /obj/item/mod/module/dna_lock/reinforced, /obj/item/mod/module/emp_shield/pulse, - /obj/item/mod/module/status_readout, ) /obj/item/mod/control/pre_equipped/prototype diff --git a/code/modules/mod/modules/_module.dm b/code/modules/mod/modules/_module.dm index 8296ac3a11ee77..20ac702343979f 100644 --- a/code/modules/mod/modules/_module.dm +++ b/code/modules/mod/modules/_module.dm @@ -294,12 +294,13 @@ /// Pins the module to the user's action buttons /obj/item/mod/module/proc/pin(mob/user) - var/datum/action/item_action/mod/pinned_module/action = pinned_to[REF(user)] - if(action) - qdel(action) - else - action = new(mod, src, user) - action.Grant(user) + var/datum/action/item_action/mod/pinned_module/existing_action = pinned_to[REF(user)] + if(existing_action) + mod.remove_item_action(existing_action) + return + + var/datum/action/item_action/mod/pinned_module/new_action = new(mod, src, user) + mod.add_item_action(new_action) /// On drop key, concels a device item. /obj/item/mod/module/proc/dropkey(mob/living/user) diff --git a/code/modules/mod/modules/modules_general.dm b/code/modules/mod/modules/modules_general.dm index dbdfa805695096..2dfeebafd1a9a0 100644 --- a/code/modules/mod/modules/modules_general.dm +++ b/code/modules/mod/modules/modules_general.dm @@ -42,8 +42,9 @@ if(!deleting) SEND_SIGNAL(src, COMSIG_TRY_STORAGE_QUICK_EMPTY, drop_location()) SEND_SIGNAL(src, COMSIG_TRY_STORAGE_SET_LOCKSTATE, TRUE) + /obj/item/mod/module/storage/proc/on_chestplate_unequip(obj/item/source, force, atom/newloc, no_move, invdrop, silent) - if(QDELETED(source) || newloc == mod.wearer || !mod.wearer.s_store) + if(QDELETED(source) || !mod.wearer || newloc == mod.wearer || !mod.wearer.s_store) return to_chat(mod.wearer, span_notice("[src] tries to store [mod.wearer.s_store] inside itself.")) SEND_SIGNAL(src, COMSIG_TRY_STORAGE_INSERT, mod.wearer.s_store, mod.wearer, TRUE) @@ -75,7 +76,6 @@ max_combined_w_class = 60 max_items = 21 - ///Ion Jetpack - Lets the user fly freely through space using battery charge. /obj/item/mod/module/jetpack name = "MOD ion jetpack module" diff --git a/code/modules/mod/modules/modules_maint.dm b/code/modules/mod/modules/modules_maint.dm index da8d5e5578d891..24e9beb8fc7b7c 100644 --- a/code/modules/mod/modules/modules_maint.dm +++ b/code/modules/mod/modules/modules_maint.dm @@ -105,7 +105,7 @@ rave_screen = mod.wearer.add_client_colour(/datum/client_colour/rave) rave_screen.update_colour(rainbow_order[rave_number]) if(selection) - SEND_SOUND(mod.wearer, sound(selection.song_path, volume = 50, channel = CHANNEL_JUKEBOX)) + mod.wearer.playsound_local(get_turf(src), null, 50, channel = CHANNEL_JUKEBOX, sound_to_use = sound(selection.song_path), use_reverb = FALSE) /obj/item/mod/module/visor/rave/on_deactivation(display_message = TRUE, deleting = FALSE) . = ..() diff --git a/code/modules/mod/modules/modules_security.dm b/code/modules/mod/modules/modules_security.dm index 3055c242cbdb08..4f987c1b18de77 100644 --- a/code/modules/mod/modules/modules_security.dm +++ b/code/modules/mod/modules/modules_security.dm @@ -80,8 +80,8 @@ var/datum/reagents/capsaicin_holder = new(10) capsaicin_holder.add_reagent(/datum/reagent/consumable/condensedcapsaicin, 10) var/datum/effect_system/fluid_spread/smoke/chem/quick/smoke = new - smoke.set_up(1, location = get_turf(src), carry = capsaicin_holder) - smoke.start() + smoke.set_up(1, holder = src, location = get_turf(src), carry = capsaicin_holder) + smoke.start(log = TRUE) QDEL_NULL(capsaicin_holder) // Reagents have a ref to their holder which has a ref to them. No leaks please. /obj/item/mod/module/pepper_shoulders/proc/on_check_shields() @@ -337,3 +337,32 @@ projectile.damage /= damage_multiplier projectile.speed /= speed_multiplier projectile.cut_overlay(projectile_effect) + +///Active Sonar - Displays a hud circle on the turf of any living creatures in the given radius +/obj/item/mod/module/active_sonar + name = "MOD active sonar" + desc = "Ancient tech from the 20th century, this module uses sonic waves to detect living creatures within the user's radius. \ + Its loud ping is much harder to hide in an indoor station than in the outdoor operations it was designed for." + icon_state = "active_sonar" + module_type = MODULE_USABLE + use_power_cost = DEFAULT_CHARGE_DRAIN * 5 + complexity = 3 + incompatible_modules = list(/obj/item/mod/module/active_sonar) + cooldown_time = 25 SECONDS + +/obj/item/mod/module/active_sonar/on_use() + . = ..() + if(!.) + return + balloon_alert(mod.wearer, "readying sonar...") + playsound(mod.wearer, 'sound/mecha/skyfall_power_up.ogg', vol = 20, vary = TRUE, extrarange = SHORT_RANGE_SOUND_EXTRARANGE) + if(!do_after(mod.wearer, 1.1 SECONDS)) + return + var/creatures_detected = 0 + for(var/mob/living/creature in range(9, mod.wearer)) + if(creature == mod.wearer || creature.stat == DEAD) + continue + new /obj/effect/temp_visual/sonar_ping(mod.wearer.loc, mod.wearer, creature) + creatures_detected++ + playsound(mod.wearer, 'sound/effects/ping_hit.ogg', vol = 75, vary = TRUE, extrarange = MEDIUM_RANGE_SOUND_EXTRARANGE) // Should be audible for the radius of the sonar + to_chat(mod.wearer, span_notice("You slam your fist into the ground, sending out a sonic wave that detects [creatures_detected] living beings nearby!")) diff --git a/code/modules/mod/modules/modules_supply.dm b/code/modules/mod/modules/modules_supply.dm index 87fe631eeb6715..19224adfa22be8 100644 --- a/code/modules/mod/modules/modules_supply.dm +++ b/code/modules/mod/modules/modules_supply.dm @@ -12,6 +12,7 @@ use_power_cost = DEFAULT_CHARGE_DRAIN * 0.2 incompatible_modules = list(/obj/item/mod/module/gps) cooldown_time = 0.5 SECONDS + allowed_inactive = TRUE /obj/item/mod/module/gps/Initialize(mapload) . = ..() @@ -172,6 +173,7 @@ use_power_cost = DEFAULT_CHARGE_DRAIN * 0.2 incompatible_modules = list(/obj/item/mod/module/orebag) cooldown_time = 0.5 SECONDS + allowed_inactive = TRUE /// The ores stored in the bag. var/list/ores = list() diff --git a/code/modules/mod/modules/modules_timeline.dm b/code/modules/mod/modules/modules_timeline.dm index 14143d749352e0..d84a1c8c1015c9 100644 --- a/code/modules/mod/modules/modules_timeline.dm +++ b/code/modules/mod/modules/modules_timeline.dm @@ -174,12 +174,12 @@ mod.visible_message(span_warning("[mod.wearer] leaps out of the timeline!")) mod.wearer.SetAllImmobility(0) mod.wearer.setStaminaLoss(0, 0) - phased_mob = new(get_turf(mod.wearer.loc)) - mod.wearer.forceMove(phased_mob) + phased_mob = new(get_turf(mod.wearer.loc), mod.wearer) RegisterSignal(mod, COMSIG_MOD_ACTIVATE, .proc/on_activate_block) else //phasing in - QDEL_NULL(phased_mob) + phased_mob.eject_jaunter() + phased_mob = null UnregisterSignal(mod, COMSIG_MOD_ACTIVATE) mod.visible_message(span_warning("[mod.wearer] drops into the timeline!")) diff --git a/code/modules/modular_computers/computers/item/computer.dm b/code/modules/modular_computers/computers/item/computer.dm index 39d3003b9193f1..0c6ef4786dbc2b 100644 --- a/code/modules/modular_computers/computers/item/computer.dm +++ b/code/modules/modular_computers/computers/item/computer.dm @@ -80,8 +80,6 @@ GLOBAL_LIST_EMPTY(TabletMessengers) // a list of all active messengers, similar /// Stored pAI in the computer var/obj/item/paicard/inserted_pai = null - var/datum/action/item_action/toggle_computer_light/light_butt - /obj/item/modular_computer/Initialize(mapload) . = ..() @@ -95,7 +93,8 @@ GLOBAL_LIST_EMPTY(TabletMessengers) // a list of all active messengers, similar soundloop = new(src, enabled) UpdateDisplay() if(has_light) - light_butt = new(src) + add_item_action(/datum/action/item_action/toggle_computer_light) + update_appearance() register_context() Add_Messenger() @@ -116,19 +115,10 @@ GLOBAL_LIST_EMPTY(TabletMessengers) // a list of all active messengers, similar if(istype(inserted_pai)) QDEL_NULL(inserted_pai) - if(istype(light_butt)) - QDEL_NULL(light_butt) physical = null return ..() -/obj/item/modular_computer/ui_action_click(mob/user, actiontype) - if(istype(actiontype, light_butt)) - toggle_flashlight() - else - ..() - - /obj/item/modular_computer/pre_attack_secondary(atom/A, mob/living/user, params) if(active_program?.tap(A, user, params)) user.do_attack_animation(A) //Emulate this animation since we kill the attack in three lines @@ -558,6 +548,13 @@ GLOBAL_LIST_EMPTY(TabletMessengers) // a list of all active messengers, similar enabled = 0 update_appearance() +/obj/item/modular_computer/ui_action_click(mob/user, actiontype) + if(istype(actiontype, /datum/action/item_action/toggle_computer_light)) + toggle_flashlight() + return + + return ..() + /** * Toggles the computer's flashlight, if it has one. * diff --git a/code/modules/modular_computers/computers/item/role_tablet_presets.dm b/code/modules/modular_computers/computers/item/role_tablet_presets.dm index 961d16ed01ffcc..90248a1df96785 100644 --- a/code/modules/modular_computers/computers/item/role_tablet_presets.dm +++ b/code/modules/modular_computers/computers/item/role_tablet_presets.dm @@ -103,6 +103,29 @@ /datum/computer_file/program/signal_commander, ) +/obj/item/modular_computer/tablet/pda/heads/quartermaster/Initialize(mapload) + . = ..() + install_component(new /obj/item/computer_hardware/printer/mini) + +/obj/item/modular_computer/tablet/pda/heads/quartermaster + name = "quartermaster PDA" + greyscale_config = /datum/greyscale_config/tablet/stripe_thick + greyscale_colors = "#D6B328#6506CA#927444" + insert_type = /obj/item/pen/survival + default_applications = list( + /datum/computer_file/program/crew_manifest, + /datum/computer_file/program/status, + /datum/computer_file/program/science, + /datum/computer_file/program/robocontrol, + /datum/computer_file/program/budgetorders, + /datum/computer_file/program/shipping, + /datum/computer_file/program/robocontrol, + ) + +/obj/item/modular_computer/tablet/pda/heads/quartermaster/Initialize(mapload) + . = ..() + install_component(new /obj/item/computer_hardware/printer/mini) + /** * Security */ @@ -232,25 +255,6 @@ /datum/computer_file/program/robocontrol, ) -/obj/item/modular_computer/tablet/pda/quartermaster/Initialize(mapload) - . = ..() - install_component(new /obj/item/computer_hardware/printer/mini) - -/obj/item/modular_computer/tablet/pda/quartermaster - name = "quartermaster PDA" - greyscale_config = /datum/greyscale_config/tablet/stripe_thick - greyscale_colors = "#D6B328#6506CA#927444" - insert_type = /obj/item/pen/survival - default_applications = list( - /datum/computer_file/program/shipping, - /datum/computer_file/program/budgetorders, - /datum/computer_file/program/robocontrol, - ) - -/obj/item/modular_computer/tablet/pda/quartermaster/Initialize(mapload) - . = ..() - install_component(new /obj/item/computer_hardware/printer/mini) - /obj/item/modular_computer/tablet/pda/shaftminer name = "shaft miner PDA" greyscale_config = /datum/greyscale_config/tablet/stripe_thick diff --git a/code/modules/modular_computers/file_system/program.dm b/code/modules/modular_computers/file_system/program.dm index 23a5216f6df3d4..02dccac47893f3 100644 --- a/code/modules/modular_computers/file_system/program.dm +++ b/code/modules/modular_computers/file_system/program.dm @@ -77,7 +77,7 @@ return 0 /** - *Runs when the device is used to attack an atom in non-combat mode. + *Runs when the device is used to attack an atom in non-combat mode using right click (secondary). * *Simulates using the device to read or scan something. Tap is called by the computer during pre_attack *and sends us all of the related info. If we return TRUE, the computer will stop the attack process diff --git a/code/modules/modular_computers/file_system/programs/atmosscan.dm b/code/modules/modular_computers/file_system/programs/atmosscan.dm index 9fec1e410325a3..c4867955ee1a16 100644 --- a/code/modules/modular_computers/file_system/programs/atmosscan.dm +++ b/code/modules/modular_computers/file_system/programs/atmosscan.dm @@ -1,3 +1,8 @@ +/// Scan the turf where the computer is on. +#define ATMOZPHERE_SCAN_ENV "env" +/// Scan the objects that the tablet clicks. +#define ATMOZPHERE_SCAN_CLICK "click" + /datum/computer_file/program/atmosscan filename = "atmosscan" filedesc = "AtmoZphere" @@ -8,18 +13,75 @@ tgui_id = "NtosGasAnalyzer" program_icon = "thermometer-half" + /// Whether we scan the current turf automatically (env) or scan tapped objects manually (click). + var/atmozphere_mode = ATMOZPHERE_SCAN_ENV + /// Saved [GasmixParser][/proc/gas_mixture_parser] data of the last thing we scanned. + var/list/last_gasmix_data + +/// Secondary attack self. +/datum/computer_file/program/atmosscan/proc/turf_analyze(datum/source, mob/user) + SIGNAL_HANDLER + if(atmozphere_mode != ATMOZPHERE_SCAN_CLICK) + return + atmos_scan(user=user, target=get_turf(computer), silent=FALSE) + on_analyze(source=source, target=get_turf(computer)) + return COMPONENT_CANCEL_ATTACK_CHAIN + +/// Keep this in sync with it's tool based counterpart [/obj/proc/analyzer_act] and [/atom/proc/tool_act] +/datum/computer_file/program/atmosscan/tap(atom/A, mob/living/user, params) + if(atmozphere_mode != ATMOZPHERE_SCAN_CLICK) + return FALSE + if(!atmos_scan(user=user, target=A, silent=FALSE)) + return FALSE + on_analyze(source=computer, target=A) + return TRUE + +/// Updates our gasmix data if on click mode. +/datum/computer_file/program/atmosscan/proc/on_analyze(datum/source, atom/target) + var/mixture = target.return_analyzable_air() + if(!mixture) + return FALSE + var/list/airs = islist(mixture) ? mixture : list(mixture) + var/list/new_gasmix_data = list() + for(var/datum/gas_mixture/air as anything in airs) + var/mix_name = capitalize(lowertext(target.name)) + if(airs.len != 1) //not a unary gas mixture + mix_name += " - Node [airs.Find(air)]" + new_gasmix_data += list(gas_mixture_parser(air, mix_name)) + last_gasmix_data = new_gasmix_data + /datum/computer_file/program/atmosscan/ui_static_data(mob/user) return return_atmos_handbooks() /datum/computer_file/program/atmosscan/ui_data(mob/user) var/list/data = get_header_data() var/turf/turf = get_turf(computer) - var/datum/gas_mixture/air = turf?.return_air() - - data["gasmixes"] = list(gas_mixture_parser(air, "Sensor Reading")) //Null air wont cause errors, don't worry. + data["atmozphereMode"] = atmozphere_mode + data["clickAtmozphereCompatible"] = computer.hardware_flag == PROGRAM_TABLET + switch (atmozphere_mode) //Null air wont cause errors, don't worry. + if(ATMOZPHERE_SCAN_ENV) + var/datum/gas_mixture/air = turf?.return_air() + data["gasmixes"] = list(gas_mixture_parser(air, "Location Reading")) + if(ATMOZPHERE_SCAN_CLICK) + LAZYINITLIST(last_gasmix_data) + data["gasmixes"] = last_gasmix_data return data /datum/computer_file/program/atmosscan/ui_act(action, list/params) . = ..() if(.) return + switch(action) + if("scantoggle") + if(atmozphere_mode == ATMOZPHERE_SCAN_CLICK) + atmozphere_mode = ATMOZPHERE_SCAN_ENV + UnregisterSignal(computer, COMSIG_ITEM_ATTACK_SELF_SECONDARY) + return TRUE + if(computer.hardware_flag != PROGRAM_TABLET) + computer.say("Device incompatible for scanning objects!") + return FALSE + atmozphere_mode = ATMOZPHERE_SCAN_CLICK + RegisterSignal(computer, COMSIG_ITEM_ATTACK_SELF_SECONDARY, .proc/turf_analyze) + var/turf/turf = get_turf(computer) + last_gasmix_data = list(gas_mixture_parser(turf?.return_air(), "Location Reading")) + return TRUE diff --git a/code/modules/modular_computers/file_system/programs/budgetordering.dm b/code/modules/modular_computers/file_system/programs/budgetordering.dm index 9962eee9157b7c..017bbaa99aa1e3 100644 --- a/code/modules/modular_computers/file_system/programs/budgetordering.dm +++ b/code/modules/modular_computers/file_system/programs/budgetordering.dm @@ -73,7 +73,7 @@ var/obj/item/computer_hardware/card_slot/card_slot = computer.all_components[MC_CARD] var/obj/item/card/id/id_card = card_slot?.GetID() if(id_card?.registered_account) - if((ACCESS_COMMAND in id_card.access) || (ACCESS_QM in id_card.access)) + if((ACCESS_COMMAND in id_card.access)) requestonly = FALSE buyer = SSeconomy.get_dep_account(id_card.registered_account.account_job.paycheck_department) can_approve_requests = TRUE @@ -100,7 +100,7 @@ "name" = P.group, "packs" = list() ) - if((P.hidden && (P.contraband && !contraband) || (P.special && !P.special_enabled) || P.DropPodOnly)) + if((P.hidden && (P.contraband && !contraband) || (P.special && !P.special_enabled) || P.drop_pod_only)) continue data["supplies"][P.group]["packs"] += list(list( "name" = P.name, @@ -194,7 +194,7 @@ var/datum/supply_pack/pack = SSshuttle.supply_packs[id] if(!istype(pack)) return - if(pack.hidden || pack.contraband || pack.DropPodOnly || (pack.special && !pack.special_enabled)) + if(pack.hidden || pack.contraband || pack.drop_pod_only || (pack.special && !pack.special_enabled)) return var/name = "*None Provided*" diff --git a/code/modules/modular_computers/file_system/programs/ntmessenger.dm b/code/modules/modular_computers/file_system/programs/ntmessenger.dm index 3d6eb7b631019c..dbf8c6a428f636 100644 --- a/code/modules/modular_computers/file_system/programs/ntmessenger.dm +++ b/code/modules/modular_computers/file_system/programs/ntmessenger.dm @@ -351,7 +351,7 @@ if(signal.data["emojis"] == TRUE)//so will not parse emojis as such from pdas that don't send emojis inbound_message = emoji_parse(inbound_message) - if(ringer_status) + if(ringer_status && L.is_literate()) to_chat(L, "[icon2html(src)] PDA message from [hrefstart][signal.data["name"]] ([signal.data["job"]])[hrefend], [inbound_message] [reply]") diff --git a/code/modules/modular_computers/file_system/programs/techweb.dm b/code/modules/modular_computers/file_system/programs/techweb.dm index 1ee417b93d1eb2..28c91a44e75be5 100644 --- a/code/modules/modular_computers/file_system/programs/techweb.dm +++ b/code/modules/modular_computers/file_system/programs/techweb.dm @@ -8,12 +8,12 @@ size = 10 tgui_id = "NtosTechweb" program_icon = "atom" - required_access = list(ACCESS_COMMAND, ACCESS_SCIENCE) + required_access = list(ACCESS_COMMAND, ACCESS_RESEARCH) transfer_access = list(ACCESS_RESEARCH) /// Reference to global science techweb var/datum/techweb/stored_research /// Access needed to lock/unlock the console - var/lock_access = ACCESS_SCIENCE + var/lock_access = ACCESS_RESEARCH /// Determines if the console is locked, and consequently if actions can be performed with it var/locked = FALSE /// Used for compressing data sent to the UI via static_data as payload size is of concern diff --git a/code/modules/modular_computers/hardware/program_disks.dm b/code/modules/modular_computers/hardware/program_disks.dm index bc7776af9d0856..63f10a9d2ca06d 100644 --- a/code/modules/modular_computers/hardware/program_disks.dm +++ b/code/modules/modular_computers/hardware/program_disks.dm @@ -128,6 +128,15 @@ . = ..() store_file(new /datum/computer_file/program/signal_commander(src)) +/obj/item/computer_hardware/hard_drive/portable/scipaper_program + name = "NT Frontier data disk" + desc = "Data disk containing NT Frontier. Simply insert to a computer and open File Manager!" + icon_state = "datadisk5" + +/obj/item/computer_hardware/hard_drive/portable/scipaper_program/install_default_programs() + . = ..() + store_file(new /datum/computer_file/program/scipaper_program(src)) + /** * Engineering */ diff --git a/code/modules/movespeed/modifiers/reagent.dm b/code/modules/movespeed/modifiers/reagent.dm index 1d4898e662b1de..6700854b11dd51 100644 --- a/code/modules/movespeed/modifiers/reagent.dm +++ b/code/modules/movespeed/modifiers/reagent.dm @@ -31,6 +31,9 @@ /datum/movespeed_modifier/reagent/halon multiplicative_slowdown = 1.8 +/datum/movespeed_modifier/reagent/hypernoblium + multiplicative_slowdown = 0.5 + /datum/movespeed_modifier/reagent/lenturi multiplicative_slowdown = 1.5 diff --git a/code/modules/ninja/ninjaDrainAct.dm b/code/modules/ninja/ninjaDrainAct.dm index 02e66652792e5b..314ec728ab61f2 100644 --- a/code/modules/ninja/ninjaDrainAct.dm +++ b/code/modules/ninja/ninjaDrainAct.dm @@ -169,16 +169,13 @@ return NONE if(hacking_module.communication_console_hack_success) return NONE - if(machine_stat & (NOPOWER|BROKEN)) - return NONE - AI_notify_hack() INVOKE_ASYNC(src, .proc/ninjadrain_charge, ninja, hacking_module) return COMPONENT_CANCEL_ATTACK_CHAIN /obj/machinery/computer/communications/proc/ninjadrain_charge(mob/living/carbon/human/ninja, obj/item/mod/module/hacker/hacking_module) - if(!do_after(ninja, 30 SECONDS, src)) + if(!try_hack_console(ninja)) return - hack_console(ninja) + hacking_module.communication_console_hack_success = TRUE var/datum/antagonist/ninja/ninja_antag = ninja.mind.has_antag_datum(/datum/antagonist/ninja) if(!ninja_antag) diff --git a/code/modules/ninja/outfit.dm b/code/modules/ninja/outfit.dm index 7d96a446389145..f91f660a3e8b94 100644 --- a/code/modules/ninja/outfit.dm +++ b/code/modules/ninja/outfit.dm @@ -28,6 +28,8 @@ recall.set_weapon(weapon) /datum/outfit/ninja_preview + name = "Space Ninja (Preview only)" + uniform = /obj/item/clothing/under/syndicate/ninja back = /obj/item/mod/control/pre_equipped/empty/ninja belt = /obj/item/energy_katana diff --git a/code/modules/paperwork/desk_bell.dm b/code/modules/paperwork/desk_bell.dm index 3b08769aff3d07..46725315ac1772 100644 --- a/code/modules/paperwork/desk_bell.dm +++ b/code/modules/paperwork/desk_bell.dm @@ -106,3 +106,18 @@ /obj/structure/desk_bell/speed_demon desc = "The cornerstone of any customer service job. This one's been modified for hyper-performance." ring_cooldown_length = 0 + +/obj/structure/desk_bell/MouseDrop(obj/over_object, src_location, over_location) + if(!istype(over_object, /obj/vehicle/ridden/wheelchair)) + return + if(!Adjacent(over_object) || !Adjacent(usr)) + return + var/obj/vehicle/ridden/wheelchair/target = over_object + if(target.bell_attached) + usr.balloon_alert(usr, "already has a bell!") + return + usr.balloon_alert(usr, "attaching bell...") + if(!do_after(usr, 0.5 SECONDS)) + return + target.attach_bell(src) + return ..() diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index 954ba49f78e702..e87e0ec59fa730 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -309,3 +309,10 @@ toolspeed = 10 //You will never willingly choose to use one of these over a shovel. font = FOUNTAIN_PEN_FONT colour = "#0000FF" + +/obj/item/pen/destroyer + name = "Fine Tipped Pen" + desc = "A pen with an infinitly sharpened tip. Capable of striking the weakest point of a strucutre or robot and annihilating it instantly. Good at putting holes in people too." + force = 5 + wound_bonus = 100 + demolition_mod = 9000 diff --git a/code/modules/photography/photos/album.dm b/code/modules/photography/photos/album.dm index 3d004f5e8fca87..bbf315f5e8f7e9 100644 --- a/code/modules/photography/photos/album.dm +++ b/code/modules/photography/photos/album.dm @@ -111,6 +111,11 @@ icon_state = "album_blue" persistence_id = "chapel" +/obj/item/storage/photo_album/listeningstation + name = "photo album (Listening Station)" + icon_state = "album_red" + persistence_id = "listeningstation" + /obj/item/storage/photo_album/prison name = "photo album (Prison)" icon_state = "album_blue" diff --git a/code/modules/plumbing/ducts.dm b/code/modules/plumbing/ducts.dm index 295cc7b790dbbb..6faa86ab48812d 100644 --- a/code/modules/plumbing/ducts.dm +++ b/code/modules/plumbing/ducts.dm @@ -7,6 +7,7 @@ All the important duct code: name = "fluid duct" icon = 'icons/obj/plumbing/fluid_ducts.dmi' icon_state = "nduct" + layer = PLUMBING_PIPE_VISIBILE_LAYER use_power = NO_POWER_USE @@ -22,7 +23,7 @@ All the important duct code: var/capacity = 10 ///the color of our duct - var/duct_color = null + var/duct_color = COLOR_VERY_LIGHT_GRAY ///TRUE to ignore colors, so yeah we also connect with other colors without issue var/ignore_colors = FALSE ///1,2,4,8,16 @@ -35,122 +36,113 @@ All the important duct code: var/active = TRUE ///track ducts we're connected to. Mainly for ducts we connect to that we normally wouldn't, like different layers and colors, for when we regenerate the ducts var/list/neighbours = list() - ///wheter we just unanchored or drop whatever is in the variable. either is safe + ///what stack to drop when disconnected. Must be /obj/item/stack/ducts or a subtype var/drop_on_wrench = /obj/item/stack/ducts -/obj/machinery/duct/Initialize(mapload, no_anchor, color_of_duct = "#ffffff", layer_of_duct = DUCT_LAYER_DEFAULT, force_connects) +/obj/machinery/duct/Initialize(mapload, no_anchor, color_of_duct = null, layer_of_duct = null, force_connects, force_ignore_colors) . = ..() - if(no_anchor) - active = FALSE - set_anchored(FALSE) - else if(!can_anchor()) - qdel(src) - CRASH("Overlapping ducts detected") - if(force_connects) connects = force_connects //skip change_connects() because we're still initializing and we need to set our connects at one point - if(!lock_layers) + if(!lock_layers && layer_of_duct) duct_layer = layer_of_duct - if(!ignore_colors) + if(force_ignore_colors) + ignore_colors = force_ignore_colors + if(!ignore_colors && color_of_duct) duct_color = color_of_duct if(duct_color) add_atom_colour(duct_color, FIXED_COLOUR_PRIORITY) - handle_layer() + if(no_anchor) + active = FALSE + set_anchored(FALSE) + else if(!can_anchor()) + if(mapload) + log_mapping("Overlapping ducts detected at [AREACOORD(src)], unanchoring one.") + // Note that qdeling automatically drops a duct stack + return INITIALIZE_HINT_QDEL - for(var/obj/machinery/duct/D in loc) - if(D == src) - continue - if(D.duct_layer & duct_layer) - return INITIALIZE_HINT_QDEL //If we have company, end it all + handle_layer() attempt_connect() AddElement(/datum/element/undertile, TRAIT_T_RAY_VISIBLE) ///start looking around us for stuff to connect to /obj/machinery/duct/proc/attempt_connect() - - for(var/atom/movable/AM in loc) - for(var/datum/component/plumbing/plumber as anything in AM.GetComponents(/datum/component/plumbing)) - if(plumber.active) - disconnect_duct() //let's not built under plumbing machinery - return - - for(var/D in GLOB.cardinals) - if(dumb && !(D & connects)) + for(var/direction in GLOB.cardinals) + if(dumb && !(direction & connects)) continue - for(var/atom/movable/AM in get_step(src, D)) - if(connect_network(AM, D)) - add_connects(D) + for(var/atom/movable/duct_candidate in get_step(src, direction)) + if(connect_network(duct_candidate, direction)) + add_connects(direction) update_appearance() ///see if whatever we found can be connected to -/obj/machinery/duct/proc/connect_network(atom/movable/AM, direction, ignore_color) - if(istype(AM, /obj/machinery/duct)) - return connect_duct(AM, direction, ignore_color) +/obj/machinery/duct/proc/connect_network(atom/movable/plumbable, direction) + if(istype(plumbable, /obj/machinery/duct)) + return connect_duct(plumbable, direction) - for(var/datum/component/plumbing/plumber as anything in AM.GetComponents(/datum/component/plumbing)) + for(var/datum/component/plumbing/plumber as anything in plumbable.GetComponents(/datum/component/plumbing)) . += connect_plumber(plumber, direction) //so that if one is true, all is true. beautiful. ///connect to a duct -/obj/machinery/duct/proc/connect_duct(obj/machinery/duct/D, direction, ignore_color) +/obj/machinery/duct/proc/connect_duct(obj/machinery/duct/other, direction) var/opposite_dir = turn(direction, 180) - if(!active || !D.active) + if(!active || !other.active) return - if(!dumb && D.dumb && !(opposite_dir & D.connects)) + if(!dumb && other.dumb && !(opposite_dir & other.connects)) return - if(dumb && D.dumb && !(connects & D.connects)) //we eliminated a few more scenarios in attempt connect + if(dumb && other.dumb && !(connects & other.connects)) //we eliminated a few more scenarios in attempt connect return - if((duct == D.duct) && duct)//check if we're not just comparing two null values - add_neighbour(D, direction) + if((duct == other.duct) && duct)//check if we're not just comparing two null values + add_neighbour(other, direction) - D.add_connects(opposite_dir) - D.update_appearance() + other.add_connects(opposite_dir) + other.update_appearance() return TRUE //tell the current pipe to also update it's sprite - if(!(D in neighbours)) //we cool - if((duct_color != D.duct_color) && !(ignore_colors || D.ignore_colors)) + if(!(other in neighbours)) //we cool + if((duct_color != other.duct_color) && !(ignore_colors || other.ignore_colors)) return - if(!(duct_layer & D.duct_layer)) + if(!(duct_layer & other.duct_layer)) return - if(D.duct) + if(other.duct) if(duct) - duct.assimilate(D.duct) + duct.assimilate(other.duct) else - D.duct.add_duct(src) + other.duct.add_duct(src) else if(duct) - duct.add_duct(D) + duct.add_duct(other) else create_duct() - duct.add_duct(D) + duct.add_duct(other) - add_neighbour(D, direction) + add_neighbour(other, direction) //Delegate to timer subsystem so its handled the next tick and doesnt cause byond to mistake it for an infinite loop and kill the game - addtimer(CALLBACK(D, .proc/attempt_connect)) + addtimer(CALLBACK(other, .proc/attempt_connect)) return TRUE ///connect to a plumbing object -/obj/machinery/duct/proc/connect_plumber(datum/component/plumbing/P, direction) +/obj/machinery/duct/proc/connect_plumber(datum/component/plumbing/plumbing, direction) var/opposite_dir = turn(direction, 180) - if(duct_layer != P.ducting_layer) + if(!(duct_layer & plumbing.ducting_layer)) return FALSE - if(!P.active) + if(!plumbing.active) return - var/comp_directions = P.supply_connects + P.demand_connects //they should never, ever have supply and demand connects overlap or catastrophic failure + var/comp_directions = plumbing.supply_connects + plumbing.demand_connects //they should never, ever have supply and demand connects overlap or catastrophic failure if(opposite_dir & comp_directions) if(!duct) create_duct() - if(duct.add_plumber(P, opposite_dir)) - neighbours[P.parent] = direction + if(duct.add_plumber(plumbing, opposite_dir)) + neighbours[plumbing.parent] = direction return TRUE ///we disconnect ourself from our neighbours. we also destroy our ductnet and tell our neighbours to make a new one @@ -164,9 +156,12 @@ All the important duct code: reset_connects(0) update_appearance() if(ispath(drop_on_wrench)) - new drop_on_wrench(drop_location()) + var/obj/item/stack/ducts/duct_stack = new drop_on_wrench(drop_location()) + duct_stack.duct_color = GLOB.pipe_color_name[duct_color] || DUCT_COLOR_OMNI + duct_stack.duct_layer = GLOB.plumbing_layer_names["[duct_layer]"] || GLOB.plumbing_layer_names["[DUCT_LAYER_DEFAULT]"] + duct_stack.add_atom_colour(duct_color, FIXED_COLOUR_PRIORITY) drop_on_wrench = null - if(!QDELETED(src)) + if(!QDELING(src)) qdel(src) ///Special proc to draw a new connect frame based on neighbours. not the norm so we can support multiple duct kinds @@ -184,16 +179,17 @@ All the important duct code: duct.add_duct(src) ///add a duct as neighbour. this means we're connected and will connect again if we ever regenerate -/obj/machinery/duct/proc/add_neighbour(obj/machinery/duct/D, direction) - if(!(D in neighbours)) - neighbours[D] = direction - if(!(src in D.neighbours)) - D.neighbours[src] = turn(direction, 180) +/obj/machinery/duct/proc/add_neighbour(obj/machinery/duct/other, direction) + if(!(other in neighbours)) + neighbours[other] = direction + if(!(src in other.neighbours)) + other.neighbours[src] = turn(direction, 180) ///remove all our neighbours, and remove us from our neighbours aswell /obj/machinery/duct/proc/lose_neighbours() - for(var/obj/machinery/duct/D in neighbours) - D.neighbours.Remove(src) + for(var/obj/machinery/duct/other in neighbours) + other.neighbours.Remove(src) + other.generate_connects() neighbours = list() ///add a connect direction @@ -214,24 +210,24 @@ All the important duct code: ///get a list of the ducts we can connect to if we are dumb /obj/machinery/duct/proc/get_adjacent_ducts() var/list/adjacents = list() - for(var/A in GLOB.cardinals) - if(A & connects) - for(var/obj/machinery/duct/D in get_step(src, A)) - if((turn(A, 180) & D.connects) && D.active) - adjacents += D + for(var/direction in GLOB.cardinals) + if(direction & connects) + for(var/obj/machinery/duct/other in get_step(src, direction)) + if((turn(direction, 180) & other.connects) && other.active) + adjacents += other return adjacents /obj/machinery/duct/update_icon_state() var/temp_icon = initial(icon_state) - for(var/D in GLOB.cardinals) - if(D & connects) - if(D == NORTH) + for(var/direction in GLOB.cardinals) + switch(direction & connects) + if(NORTH) temp_icon += "_n" - if(D == SOUTH) + if(SOUTH) temp_icon += "_s" - if(D == EAST) + if(EAST) temp_icon += "_e" - if(D == WEST) + if(WEST) temp_icon += "_w" icon_state = temp_icon return ..() @@ -239,7 +235,8 @@ All the important duct code: ///update the layer we are on /obj/machinery/duct/proc/handle_layer() var/offset - switch(duct_layer)//it's a bitfield, but it's fine because it only works when there's one layer, and multiple layers should be handled differently + //it's a bitfield, but it's fine because ducts themselves are only on one layer + switch(duct_layer) if(FIRST_DUCT_LAYER) offset = -10 if(SECOND_DUCT_LAYER) @@ -253,6 +250,7 @@ All the important duct code: pixel_x = offset pixel_y = offset + layer = initial(layer) + duct_layer * 0.0003 /obj/machinery/duct/set_anchored(anchorvalue) . = ..() @@ -264,10 +262,10 @@ All the important duct code: else disconnect_duct(TRUE) -/obj/machinery/duct/wrench_act(mob/living/user, obj/item/I) //I can also be the RPD +/obj/machinery/duct/wrench_act(mob/living/user, obj/item/wrench) //I can also be the RPD ..() add_fingerprint(user) - I.play_tool_sound(src) + wrench.play_tool_sound(src) if(anchored || can_anchor()) set_anchored(!anchored) user.visible_message( \ @@ -277,14 +275,15 @@ All the important duct code: return TRUE ///collection of all the sanity checks to prevent us from stacking ducts that shouldn't be stacked -/obj/machinery/duct/proc/can_anchor(turf/T) - if(!T) - T = get_turf(src) - for(var/obj/machinery/duct/D in T) - if(!anchored || D == src) - continue - for(var/A in GLOB.cardinals) - if(A & connects && A & D.connects) +/obj/machinery/duct/proc/can_anchor(turf/destination) + if(!destination) + destination = get_turf(src) + for(var/obj/machinery/duct/other in destination) + if(other.anchored && other != src && (duct_layer & other.duct_layer)) + return FALSE + for(var/obj/machinery/machine in destination) + for(var/datum/component/plumbing/plumber as anything in machine.GetComponents(/datum/component/plumbing)) + if(plumber.ducting_layer & duct_layer) return FALSE return TRUE @@ -297,26 +296,29 @@ All the important duct code: disconnect_duct() return ..() -/obj/machinery/duct/MouseDrop_T(atom/A, mob/living/user) - if(!istype(A, /obj/machinery/duct)) - return - var/obj/machinery/duct/D = A - var/obj/item/I = user.get_active_held_item() - if(I?.tool_behaviour != TOOL_WRENCH) - to_chat(user, span_warning("You need to be holding a wrench in your active hand to do that!")) +/obj/machinery/duct/MouseDrop_T(atom/drag_source, mob/living/user) + if(!istype(drag_source, /obj/machinery/duct)) return - if(get_dist(src, D) != 1) + var/obj/machinery/duct/other = drag_source + if(get_dist(src, other) != 1) return - var/direction = get_dir(src, D) + var/direction = get_dir(src, other) if(!(direction in GLOB.cardinals)) return - if(duct_layer != D.duct_layer) + if(!(duct_layer & other.duct_layer)) + to_chat(user, span_warning("The ducts must be on the same layer to connect them!")) + return + var/obj/item/held_item = user.get_active_held_item() + if(held_item?.tool_behaviour != TOOL_WRENCH) + to_chat(user, span_warning("You need to be holding a wrench in your active hand to do that!")) return add_connects(direction) //the connect of the other duct is handled in connect_network, but do this here for the parent duct because it's not necessary in normal cases - add_neighbour(D, direction) - connect_network(D, direction, TRUE) + add_neighbour(other, direction) + connect_network(other, direction) update_appearance() + held_item.play_tool_sound(src) + to_chat(user, span_notice("You connect the two plumbing ducts.")) /obj/item/stack/ducts name = "stack of duct" @@ -330,22 +332,21 @@ All the important duct code: max_amount = 50 item_flags = NOBLUDGEON merge_type = /obj/item/stack/ducts + matter_amount = 1 ///Color of our duct var/duct_color = "omni" ///Default layer of our duct var/duct_layer = "Default Layer" - ///Assoc index with all the available layers. yes five might be a bit much. Colors uses a global by the way - var/list/layers = list("Second Layer" = SECOND_DUCT_LAYER, "Default Layer" = DUCT_LAYER_DEFAULT, "Fourth Layer" = FOURTH_DUCT_LAYER) /obj/item/stack/ducts/examine(mob/user) . = ..() . += span_notice("It's current color and layer are [duct_color] and [duct_layer]. Use in-hand to change.") /obj/item/stack/ducts/attack_self(mob/user) - var/new_layer = tgui_input_list(user, "Select a layer", "Layer", layers) + var/new_layer = tgui_input_list(user, "Select a layer", "Layer", GLOB.plumbing_layers, duct_layer) if(new_layer) duct_layer = new_layer - var/new_color = tgui_input_list(user, "Select a color", "Color", GLOB.pipe_paint_colors) + var/new_color = tgui_input_list(user, "Select a color", "Color", GLOB.pipe_paint_colors, duct_color) if(new_color) duct_color = new_color add_atom_colour(GLOB.pipe_paint_colors[new_color], FIXED_COLOUR_PRIORITY) @@ -355,16 +356,25 @@ All the important duct code: if(!proximity) return if(istype(target, /obj/machinery/duct)) - var/obj/machinery/duct/D = target - if(!D.anchored) - add(1) - qdel(D) + var/obj/machinery/duct/duct = target + if(duct.anchored) + to_chat(user, span_warning("The duct must be unanchored before it can be picked up.")) + return + + // Turn into a duct stack and then merge to the in-hand stack. + var/obj/item/stack/ducts/stack = new(duct.loc, 1, FALSE) + qdel(duct) + if(stack.can_merge(src)) + stack.merge(src) + return + check_attach_turf(target) /obj/item/stack/ducts/proc/check_attach_turf(atom/target) - if(istype(target, /turf/open) && use(1)) + if(isopenturf(target) && use(1)) var/turf/open/open_turf = target - new /obj/machinery/duct(open_turf, FALSE, GLOB.pipe_paint_colors[duct_color], layers[duct_layer]) + var/is_omni = duct_color == DUCT_COLOR_OMNI + new /obj/machinery/duct(open_turf, FALSE, GLOB.pipe_paint_colors[duct_color], GLOB.plumbing_layers[duct_layer], null, is_omni) playsound(get_turf(src), 'sound/machines/click.ogg', 50, TRUE) /obj/item/stack/ducts/fifty diff --git a/code/modules/plumbing/plumbers/_plumb_machinery.dm b/code/modules/plumbing/plumbers/_plumb_machinery.dm index f9930bf5f6bcee..54cea5f5ca2bbc 100644 --- a/code/modules/plumbing/plumbers/_plumb_machinery.dm +++ b/code/modules/plumbing/plumbers/_plumb_machinery.dm @@ -14,7 +14,6 @@ var/buffer = 50 ///Flags for reagents, like INJECTABLE, TRANSPARENT bla bla everything thats in DEFINES/reagents.dm var/reagent_flags = TRANSPARENT - ///wheter we partake in rcd construction or not /obj/machinery/plumbing/Initialize(mapload, bolt = TRUE) . = ..() @@ -98,6 +97,8 @@ /obj/machinery/plumbing/layer_manifold/Initialize(mapload, bolt, layer) . = ..() + AddComponent(/datum/component/plumbing/manifold, bolt, FIRST_DUCT_LAYER) AddComponent(/datum/component/plumbing/manifold, bolt, SECOND_DUCT_LAYER) AddComponent(/datum/component/plumbing/manifold, bolt, THIRD_DUCT_LAYER) AddComponent(/datum/component/plumbing/manifold, bolt, FOURTH_DUCT_LAYER) + AddComponent(/datum/component/plumbing/manifold, bolt, FIFTH_DUCT_LAYER) diff --git a/code/modules/plumbing/plumbers/pill_press.dm b/code/modules/plumbing/plumbers/pill_press.dm index 94028b9f17712f..409ceb58247849 100644 --- a/code/modules/plumbing/plumbers/pill_press.dm +++ b/code/modules/plumbing/plumbers/pill_press.dm @@ -136,7 +136,11 @@ if("change_current_volume") current_volume = clamp(text2num(params["volume"]), min_volume, max_volume) if("change_product_name") - product_name = html_encode(params["name"]) + var/formatted_name = html_encode(params["name"]) + if (length(formatted_name) > MAX_NAME_LEN) + product_name = copytext(formatted_name, 1, MAX_NAME_LEN+1) + else + product_name = formatted_name if("change_product") product = params["product"] if (product == "pill") diff --git a/code/modules/power/apc/apc_attack.dm b/code/modules/power/apc/apc_attack.dm index 7bfe5084819466..36605c3f8b1441 100644 --- a/code/modules/power/apc/apc_attack.dm +++ b/code/modules/power/apc/apc_attack.dm @@ -24,16 +24,16 @@ if(istype(attacking_object, /obj/item/stock_parts/cell) && opened) if(cell) - to_chat(user, span_warning("There is a power cell already installed!")) + balloon_alert(user, "cell already installed!") return if(machine_stat & MAINT) - to_chat(user, span_warning("There is no connector for your power cell!")) + balloon_alert(user, "no connector for a cell!") return if(!user.transferItemToLoc(attacking_object, src)) return cell = attacking_object - user.visible_message(span_notice("[user.name] inserts the power cell to [src.name]!"),\ - span_notice("You insert the power cell.")) + user.visible_message(span_notice("[user.name] inserts the power cell to [src.name]!")) + balloon_alert(user, "cell inserted") chargecount = 0 update_appearance() return @@ -47,22 +47,22 @@ if(!host_turf) CRASH("attackby on APC when it's not on a turf") if(host_turf.underfloor_accessibility < UNDERFLOOR_INTERACTABLE) - to_chat(user, span_warning("You must remove the floor plating in front of the APC first!")) + balloon_alert(user, "remove the floor plating!") return if(terminal) - to_chat(user, span_warning("This APC is already wired!")) + balloon_alert(user, "APC is already wired!") return if(!has_electronics) - to_chat(user, span_warning("There is nothing to wire!")) + balloon_alert(user, "no board to wire!") return var/obj/item/stack/cable_coil/installing_cable = attacking_object if(installing_cable.get_amount() < 10) - to_chat(user, span_warning("You need ten lengths of cable for APC!")) + balloon_alert(user, "need ten lengths of cable!") return - user.visible_message(span_notice("[user.name] adds cables to the APC frame."), \ - span_notice("You start adding cables to the APC frame...")) + user.visible_message(span_notice("[user.name] adds cables to the APC frame.")) + balloon_alert(user, "adding cables to the frame...") playsound(loc, 'sound/items/deconstruct.ogg', 50, TRUE) if(!do_after(user, 20, target = src)) return @@ -76,22 +76,22 @@ do_sparks(5, TRUE, src) return installing_cable.use(10) - to_chat(user, span_notice("You add cables to the APC frame.")) + balloon_alert(user, "cables added to the frame") make_terminal() terminal.connect_to_network() return if(istype(attacking_object, /obj/item/electronics/apc) && opened) if(has_electronics) - to_chat(user, span_warning("There is already a board inside the [src]!")) + balloon_alert(user, "there is already a board!") return if(machine_stat & BROKEN) - to_chat(user, span_warning("You cannot put the board inside, the frame is damaged!")) + balloon_alert(user, "the frame is damaged!") return - user.visible_message(span_notice("[user.name] inserts the power control board into [src]."), \ - span_notice("You start to insert the power control board into the frame...")) + user.visible_message(span_notice("[user.name] inserts the power control board into [src].")) + balloon_alert(user, "you start to insert the board...") playsound(loc, 'sound/items/deconstruct.ogg', 50, TRUE) if(!do_after(user, 10, target = src) || has_electronics) @@ -99,7 +99,7 @@ has_electronics = APC_ELECTRONICS_INSTALLED locked = FALSE - to_chat(user, span_notice("You place the power control board inside the frame.")) + balloon_alert(user, "board installed") qdel(attacking_object) return @@ -107,7 +107,7 @@ var/obj/item/electroadaptive_pseudocircuit/pseudocircuit = attacking_object if(!has_electronics) if(machine_stat & BROKEN) - to_chat(user, span_warning("[src]'s frame is too damaged to support a circuit.")) + balloon_alert(user, "frame is too damaged!") return if(!pseudocircuit.adapt_circuit(user, 50)) return @@ -119,7 +119,7 @@ if(!cell) if(machine_stat & MAINT) - to_chat(user, span_warning("There's no connector for a power cell.")) + balloon_alert(user, "no board for a cell!") return if(!pseudocircuit.adapt_circuit(user, 500)) return @@ -132,29 +132,29 @@ update_appearance() return - to_chat(user, span_warning("[src] has both electronics and a cell.")) + balloon_alert(user, "has both board and cell!") return if(istype(attacking_object, /obj/item/wallframe/apc) && opened) if(!(machine_stat & BROKEN || opened==APC_COVER_REMOVED || atom_integrity < max_integrity)) // There is nothing to repair - to_chat(user, span_warning("You found no reason for repairing this APC!")) + balloon_alert(user, "no reason for repairs!") return if(!(machine_stat & BROKEN) && opened==APC_COVER_REMOVED) // Cover is the only thing broken, we do not need to remove elctronicks to replace cover - user.visible_message(span_notice("[user.name] replaces missing APC's cover."), \ - span_notice("You begin to replace APC's cover...")) + user.visible_message(span_notice("[user.name] replaces missing APC's cover.")) + balloon_alert(user, "replacing APC's cover...") if(do_after(user, 20, target = src)) // replacing cover is quicker than replacing whole frame - to_chat(user, span_notice("You replace missing APC's cover.")) + balloon_alert(user, "cover replaced") qdel(attacking_object) opened = APC_COVER_OPENED update_appearance() return if(has_electronics) - to_chat(user, span_warning("You cannot repair this APC until you remove the electronics still inside!")) + balloon_alert(user, "remove the board inside!") return - user.visible_message(span_notice("[user.name] replaces the damaged APC frame with a new one."), \ - span_notice("You begin to replace the damaged APC frame...")) + user.visible_message(span_notice("[user.name] replaces the damaged APC frame with a new one.")) + balloon_alert(user, "replacing damaged frame...") if(do_after(user, 50, target = src)) - to_chat(user, span_notice("You replace the damaged APC frame with a new one.")) + balloon_alert(user, "APC frame replaced") qdel(attacking_object) set_machine_stat(machine_stat & ~BROKEN) atom_integrity = max_integrity @@ -201,40 +201,40 @@ return if(ethereal.combat_mode) if(cell.charge <= (cell.maxcharge / 2)) // ethereals can't drain APCs under half charge, this is so that they are forced to look to alternative power sources if the station is running low - to_chat(ethereal, span_warning("The APC's syphon safeties prevent you from draining power!")) + balloon_alert(ethereal, "safeties prevent draining!") return if(stomach.crystal_charge > charge_limit) - to_chat(ethereal, span_warning("Your charge is full!")) + balloon_alert(ethereal, "charge is full!") return stomach.drain_time = world.time + APC_DRAIN_TIME - to_chat(ethereal, span_notice("You start channeling some power through the APC into your body.")) + balloon_alert(ethereal, "draining power") if(do_after(user, APC_DRAIN_TIME, target = src)) if(cell.charge <= (cell.maxcharge / 2) || (stomach.crystal_charge > charge_limit)) return - to_chat(ethereal, span_notice("You receive some charge from the APC.")) + balloon_alert(ethereal, "received charge") stomach.adjust_charge(APC_POWER_GAIN) cell.use(APC_POWER_GAIN) return if(cell.charge >= cell.maxcharge - APC_POWER_GAIN) - to_chat(ethereal, span_warning("The APC can't receive anymore power!")) + balloon_alert(ethereal, "APC can't receive more power!") return if(stomach.crystal_charge < APC_POWER_GAIN) - to_chat(ethereal, span_warning("Your charge is too low!")) + balloon_alert(ethereal, "charge is too low!") return stomach.drain_time = world.time + APC_DRAIN_TIME - to_chat(ethereal, span_notice("You start channeling power through your body into the APC.")) + balloon_alert(ethereal, "transfering power") if(!do_after(user, APC_DRAIN_TIME, target = src)) return if((cell.charge >= (cell.maxcharge - APC_POWER_GAIN)) || (stomach.crystal_charge < APC_POWER_GAIN)) - to_chat(ethereal, span_warning("You can't transfer power to the APC!")) + balloon_alert(ethereal, "can't transfer power!") return if(istype(stomach)) - to_chat(ethereal, span_notice("You transfer some power to the APC.")) + balloon_alert(ethereal, "transfered power") stomach.adjust_charge(-APC_POWER_GAIN) cell.give(APC_POWER_GAIN) else - to_chat(ethereal, span_warning("You can't transfer power to the APC!")) + balloon_alert(ethereal, "can't transfer power!") // attack with hand - remove cell (if cover open) or interact with the APC /obj/machinery/power/apc/attack_hand(mob/user, list/modifiers) @@ -244,7 +244,8 @@ if(opened && (!issilicon(user))) if(cell) - user.visible_message(span_notice("[user] removes \the [cell] from [src]!"), span_notice("You remove \the [cell].")) + user.visible_message(span_notice("[user] removes \the [cell] from [src]!")) + balloon_alert(user, "cell removed") user.put_in_hands(cell) cell.update_appearance() cell = null @@ -284,7 +285,7 @@ var/mob/living/silicon/robot/robot = user if(aidisabled || malfhack && istype(malfai) && ((istype(AI) && (malfai!=AI && malfai != AI.parent)) || (istype(robot) && (robot in malfai.connected_robots)))) if(!loud) - to_chat(user, span_danger("\The [src] has been disabled!")) + balloon_alert(user, "APC has been disabled!") return FALSE return TRUE diff --git a/code/modules/power/apc/apc_main.dm b/code/modules/power/apc/apc_main.dm index 08d4358da6a47c..58c5db2e7bec43 100644 --- a/code/modules/power/apc/apc_main.dm +++ b/code/modules/power/apc/apc_main.dm @@ -370,8 +370,8 @@ if("emergency_lighting") emergency_lights = !emergency_lights for(var/obj/machinery/light/L in area) - if(!initial(L.no_emergency)) //If there was an override set on creation, keep that override - L.no_emergency = emergency_lights + if(!initial(L.no_low_power)) //If there was an override set on creation, keep that override + L.no_low_power = emergency_lights INVOKE_ASYNC(L, /obj/machinery/light/.proc/update, FALSE) CHECK_TICK return TRUE diff --git a/code/modules/power/apc/apc_power_proc.dm b/code/modules/power/apc/apc_power_proc.dm index 7e69cce9b33c84..b346c6ac0d8338 100644 --- a/code/modules/power/apc/apc_power_proc.dm +++ b/code/modules/power/apc/apc_power_proc.dm @@ -16,7 +16,7 @@ /obj/machinery/power/apc/proc/toggle_nightshift_lights(mob/living/user) if(last_nightshift_switch > world.time - 100) //~10 seconds between each toggle to prevent spamming - to_chat(usr, span_warning("[src]'s night lighting circuit breaker is still cycling!")) + balloon_alert(user, "night breaker is cycling!") return last_nightshift_switch = world.time set_nightshift(!nightshift_lights) diff --git a/code/modules/power/apc/apc_tool_act.dm b/code/modules/power/apc/apc_tool_act.dm index 2750cd9e4c2401..e1e71fff6a3a7e 100644 --- a/code/modules/power/apc/apc_tool_act.dm +++ b/code/modules/power/apc/apc_tool_act.dm @@ -3,10 +3,10 @@ . = TRUE if((!opened && opened != APC_COVER_REMOVED) && !(machine_stat & BROKEN)) if(coverlocked && !(machine_stat & MAINT)) // locked... - to_chat(user, span_warning("The cover is locked and cannot be opened!")) + balloon_alert(user, "cover is locked!") return else if(panel_open) - to_chat(user, span_warning("Exposed wires prevents you from opening it!")) + balloon_alert(user, "wires prevents opening it!") return else opened = APC_COVER_OPENED @@ -16,39 +16,40 @@ if((opened && has_electronics == APC_ELECTRONICS_SECURED) && !(machine_stat & BROKEN)) opened = APC_COVER_CLOSED coverlocked = TRUE //closing cover relocks it + balloon_alert(user, "locking the cover") update_appearance() return if(!opened || has_electronics != APC_ELECTRONICS_INSTALLED) return if(terminal) - to_chat(user, span_warning("Disconnect the wires first!")) + balloon_alert(user, "disconnect the wires first!") return crowbar.play_tool_sound(src) - to_chat(user, span_notice("You attempt to remove the power control board...") ) + balloon_alert(user, "removing the board") if(!crowbar.use_tool(src, user, 50)) return if(has_electronics != APC_ELECTRONICS_INSTALLED) return has_electronics = APC_ELECTRONICS_MISSING if(machine_stat & BROKEN) - user.visible_message(span_notice("[user.name] breaks the power control board inside [name]!"),\ - span_notice("You break the charred power control board and remove the remains."), + user.visible_message(span_notice("[user.name] breaks the power control board inside [name]!"), \ span_hear("You hear a crack.")) + balloon_alert(user, "charred board breaks") return else if(obj_flags & EMAGGED) obj_flags &= ~EMAGGED - user.visible_message(span_notice("[user.name] discards an emagged power control board from [name]!"),\ - span_notice("You discard the emagged power control board.")) + user.visible_message(span_notice("[user.name] discards an emagged power control board from [name]!")) + balloon_alert(user, "emagged board discarded") return else if(malfhack) - user.visible_message(span_notice("[user.name] discards a strangely programmed power control board from [name]!"),\ - span_notice("You discard the strangely programmed board.")) + user.visible_message(span_notice("[user.name] discards a strangely programmed power control board from [name]!")) + balloon_alert(user, "reprogrammed board discarded") malfai = null malfhack = 0 return - user.visible_message(span_notice("[user.name] removes the power control board from [name]!"),\ - span_notice("You remove the power control board.")) + user.visible_message(span_notice("[user.name] removes the power control board from [name]!")) + balloon_alert(user, "removed the board") new /obj/item/electronics/apc(loc) return @@ -59,15 +60,16 @@ if(!opened) if(obj_flags & EMAGGED) - to_chat(user, span_warning("The interface is broken!")) + balloon_alert(user, "the interface is broken!") return panel_open = !panel_open - to_chat(user, span_notice("The wires have been [panel_open ? "exposed" : "unexposed"].")) + balloon_alert(user, "wires are [panel_open ? "exposed" : "unexposed"]") update_appearance() return if(cell) - user.visible_message(span_notice("[user] removes \the [cell] from [src]!"), span_notice("You remove \the [cell].")) + user.visible_message(span_notice("[user] removes \the [cell] from [src]!")) + balloon_alert(user, "cell removed") var/turf/user_turf = get_turf(user) cell.forceMove(user_turf) cell.update_appearance() @@ -81,14 +83,14 @@ has_electronics = APC_ELECTRONICS_SECURED set_machine_stat(machine_stat & ~MAINT) W.play_tool_sound(src) - to_chat(user, span_notice("You screw the circuit electronics into place.")) + balloon_alert(user, "board fastened") if(APC_ELECTRONICS_SECURED) has_electronics = APC_ELECTRONICS_INSTALLED set_machine_stat(machine_stat | MAINT) W.play_tool_sound(src) - to_chat(user, span_notice("You unfasten the electronics.")) + balloon_alert(user, "board unfastened") else - to_chat(user, span_warning("There is nothing to secure!")) + balloon_alert(user, "no board to faster!") return update_appearance() @@ -105,18 +107,18 @@ if(!welder.tool_start_check(user, amount=3)) return user.visible_message(span_notice("[user.name] welds [src]."), \ - span_notice("You start welding the APC frame..."), \ span_hear("You hear welding.")) + balloon_alert(user, "welding the APC frame") if(!welder.use_tool(src, user, 50, volume=50, amount=3)) return if((machine_stat & BROKEN) || opened==APC_COVER_REMOVED) new /obj/item/stack/sheet/iron(loc) - user.visible_message(span_notice("[user.name] cuts [src] apart with [welder]."),\ - span_notice("You disassembled the broken APC frame.")) + user.visible_message(span_notice("[user.name] cuts [src] apart with [welder].")) + balloon_alert(user, "disassembled the broken frame") else new /obj/item/wallframe/apc(loc) - user.visible_message(span_notice("[user.name] cuts [src] from the wall with [welder]."),\ - span_notice("You cut the APC frame from the wall.")) + user.visible_message(span_notice("[user.name] cuts [src] from the wall with [welder].")) + balloon_alert(user, "cut the frame from the wall") qdel(src) return TRUE @@ -126,17 +128,17 @@ if(!has_electronics) if(machine_stat & BROKEN) - to_chat(user, span_warning("[src]'s frame is too damaged to support a circuit.")) + balloon_alert(user, "frame is too damaged!") return FALSE return list("mode" = RCD_UPGRADE_SIMPLE_CIRCUITS, "delay" = 20, "cost" = 1) if(!cell) if(machine_stat & MAINT) - to_chat(user, span_warning("There's no connector for a power cell.")) + balloon_alert(user, "no board for a cell!") return FALSE return list("mode" = RCD_UPGRADE_SIMPLE_CIRCUITS, "delay" = 50, "cost" = 10) //16 for a wall - to_chat(user, span_warning("[src] has both electronics and a cell.")) + balloon_alert(user, "has both board and cell!") return FALSE /obj/machinery/power/apc/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) @@ -144,17 +146,17 @@ return FALSE if(!has_electronics) if(machine_stat & BROKEN) - to_chat(user, span_warning("[src]'s frame is too damaged to support a circuit.")) + balloon_alert(user, "frame is too damaged!") return - user.visible_message(span_notice("[user] fabricates a circuit and places it into [src]."), \ - span_notice("You adapt a power control board and click it into place in [src]'s guts.")) + user.visible_message(span_notice("[user] fabricates a circuit and places it into [src].")) + balloon_alert(user, "control board placed") has_electronics = TRUE locked = TRUE return TRUE if(!cell) if(machine_stat & MAINT) - to_chat(user, span_warning("There's no connector for a power cell.")) + balloon_alert(user, "no board for a cell!") return FALSE var/obj/item/stock_parts/cell/crap/empty/C = new(src) C.forceMove(src) @@ -165,7 +167,7 @@ update_appearance() return TRUE - to_chat(user, span_warning("[src] has both electronics and a cell.")) + balloon_alert(user, "has both board and cell!") return FALSE /obj/machinery/power/apc/emag_act(mob/user) @@ -173,17 +175,17 @@ return if(opened) - to_chat(user, span_warning("You must close the cover to swipe an ID card!")) + balloon_alert(user, "must close the cover to swipe!") else if(panel_open) - to_chat(user, span_warning("You must close the panel first!")) + balloon_alert(user, "must close the panel first!") else if(machine_stat & (BROKEN|MAINT)) - to_chat(user, span_warning("Nothing happens!")) + balloon_alert(user, "nothing happens!") else flick("apc-spark", src) playsound(src, SFX_SPARKS, 75, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) obj_flags |= EMAGGED locked = FALSE - to_chat(user, span_notice("You emag the APC interface.")) + balloon_alert(user, "you emag the APC") update_appearance() // damage and destruction acts @@ -205,19 +207,19 @@ /obj/machinery/power/apc/proc/togglelock(mob/living/user) if(obj_flags & EMAGGED) - to_chat(user, span_warning("The interface is broken!")) + balloon_alert(user, "interface is broken!") else if(opened) - to_chat(user, span_warning("You must close the cover to swipe an ID card!")) + balloon_alert(user, "must close the cover to swipe!") else if(panel_open) - to_chat(user, span_warning("You must close the panel!")) + balloon_alert(user, "must close the panel!") else if(machine_stat & (BROKEN|MAINT)) - to_chat(user, span_warning("Nothing happens!")) + balloon_alert(user, "nothing happens!") else if(allowed(usr) && !wires.is_cut(WIRE_IDSCAN) && !malfhack) locked = !locked - to_chat(user, span_notice("You [ locked ? "lock" : "unlock"] the APC interface.")) + balloon_alert(user, "APC [ locked ? "locked" : "unlocked"]") update_appearance() if(!locked) ui_interact(user) else - to_chat(user, span_warning("Access denied.")) + balloon_alert(user, "access denied!") diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index d68aca06d6cc68..3841b47bd1dd34 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -71,7 +71,7 @@ * * If we, or the item we're located in, is subject to the charge spell, gain some charge back */ -/obj/item/stock_parts/cell/proc/on_magic_charge(datum/source, obj/effect/proc_holder/spell/targeted/charge/spell, mob/living/caster) +/obj/item/stock_parts/cell/proc/on_magic_charge(datum/source, datum/action/cooldown/spell/charge/spell, mob/living/caster) SIGNAL_HANDLER // This shouldn't be running if we're not being held by a mob, diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm index 5f4e0fd813ff42..249b093eca7822 100644 --- a/code/modules/power/gravitygenerator.dm +++ b/code/modules/power/gravitygenerator.dm @@ -3,7 +3,8 @@ // Gravity Generator // -GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding new gravity generators to the list, and keying it with the z level. +/// We will keep track of this by adding new gravity generators to the list, and keying it with the z level. +GLOBAL_LIST_EMPTY(gravity_generators) #define POWER_IDLE 0 #define POWER_UP 1 @@ -27,22 +28,8 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne use_power = NO_POWER_USE resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF - var/datum/proximity_monitor/advanced/gravity/gravity_field - var/sprite_number = 0 - ///Audio for when the gravgen is on - var/datum/looping_sound/gravgen/soundloop - -/obj/machinery/gravity_generator/Initialize(mapload) - . = ..() - soundloop = new(src, TRUE) - -/obj/machinery/gravity_generator/Destroy() - QDEL_NULL(gravity_field) - QDEL_NULL(soundloop) - return ..() - /obj/machinery/gravity_generator/safe_throw_at(atom/target, range, speed, mob/thrower, spin = TRUE, diagonals_first = FALSE, datum/callback/callback, force = MOVE_FORCE_STRONG, gentle = FALSE) return FALSE @@ -77,59 +64,52 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne /obj/machinery/gravity_generator/proc/set_fix() set_machine_stat(machine_stat & ~BROKEN) +/** + * Generator part + * + * Parts of the gravity generator used to have a proper sprite. + */ +/obj/machinery/gravity_generator/part + var/obj/machinery/gravity_generator/main/main_part + /obj/machinery/gravity_generator/part/Destroy() + atom_break() if(main_part) - qdel(main_part) - set_broken() - QDEL_NULL(soundloop) + UnregisterSignal(main_part, COMSIG_ATOM_UPDATED_ICON) + main_part = null return ..() -// -// Part generator which is mostly there for looks -// - -/obj/machinery/gravity_generator/part - var/obj/machinery/gravity_generator/main/main_part = null - -/obj/machinery/gravity_generator/part/attackby(obj/item/I, mob/user, params) - return main_part.attackby(I, user) +/obj/machinery/gravity_generator/part/attackby(obj/item/weapon, mob/user, params) + if(!main_part) + return + return main_part.attackby(weapon, user) /obj/machinery/gravity_generator/part/get_status() - return main_part?.get_status() + if(!main_part) + return + return main_part.get_status() /obj/machinery/gravity_generator/part/attack_hand(mob/user, list/modifiers) + if(!main_part) + return return main_part.attack_hand(user, modifiers) /obj/machinery/gravity_generator/part/set_broken() ..() - if(main_part && !(main_part.machine_stat & BROKEN)) - main_part.set_broken() + if(!main_part || (main_part.machine_stat & BROKEN)) + return + main_part.set_broken() /// Used to eat args /obj/machinery/gravity_generator/part/proc/on_update_icon(obj/machinery/gravity_generator/source, updates, updated) SIGNAL_HANDLER return update_appearance(updates) -// -// Generator which spawns with the station. -// - -/obj/machinery/gravity_generator/main/station/Initialize(mapload) - . = ..() - setup_parts() - middle.add_overlay("activated") - update_list() - -// -// Generator an admin can spawn -// -/obj/machinery/gravity_generator/main/station/admin - use_power = NO_POWER_USE - -// -// Main Generator with the main code -// - +/** + * Main gravity generator + * + * The actual gravity generator, that actually holds the UI, contains the grav gen parts, ect. + */ /obj/machinery/gravity_generator/main icon_state = "on_8" idle_power_usage = 0 @@ -138,30 +118,53 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne sprite_number = 8 use_power = IDLE_POWER_USE interaction_flags_machine = INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OFFLINE + + /// List of all gravity generator parts + var/list/generator_parts = list() + /// The gravity generator part in the very center, the fifth one, where we place the overlays. + var/obj/machinery/gravity_generator/part/center_part + + /// Whether the gravity generator is currently active. var/on = TRUE + /// If the main breaker is on/off, to enable/disable gravity. var/breaker = TRUE - var/list/parts = list() - var/obj/middle = null + /// If the generatir os idle, charging, or down. var/charging_state = POWER_IDLE + /// How much charge the gravity generator has, goes down when breaker is shut, and shuts down at 0. var/charge_count = 100 + + /// The gravity overlay currently used. var/current_overlay = null - var/broken_state = 0 - var/setting = 1 //Gravity value when on + /// When broken, what stage it is at (GRAV_NEEDS_SCREWDRIVER:0) (GRAV_NEEDS_WELDING:1) (GRAV_NEEDS_PLASTEEL:2) (GRAV_NEEDS_WRENCH:3) + var/broken_state = GRAV_NEEDS_SCREWDRIVER + /// Gravity value when on, honestly I don't know why it does it like this, but it does. + var/setting = 1 + + /// The gravity field created by the generator. + var/datum/proximity_monitor/advanced/gravity/gravity_field + /// Audio for when the gravgen is on + var/datum/looping_sound/gravgen/soundloop ///Station generator that spawns with gravity turned off. -/obj/machinery/gravity_generator/main/station/off +/obj/machinery/gravity_generator/main/off on = FALSE breaker = FALSE charge_count = 0 +/obj/machinery/gravity_generator/main/Initialize(mapload) + . = ..() + soundloop = new(src, start_immediately = FALSE) + setup_parts() + if(on) + enable() + center_part.add_overlay("activated") + /obj/machinery/gravity_generator/main/Destroy() // If we somehow get deleted, remove all of our other parts. investigate_log("was destroyed!", INVESTIGATE_GRAVITY) - on = FALSE - update_list() - for(var/obj/machinery/gravity_generator/part/O in parts) - O.main_part = null - if(!QDESTROYING(O)) - qdel(O) + disable() + QDEL_NULL(soundloop) + QDEL_NULL(center_part) + QDEL_LIST(generator_parts) return ..() /obj/machinery/gravity_generator/main/proc/setup_parts() @@ -175,26 +178,23 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne continue var/obj/machinery/gravity_generator/part/part = new(T) if(count == 5) // Middle - middle = part + center_part = part if(count <= 3) // Their sprite is the top part of the generator part.set_density(FALSE) part.layer = WALL_OBJ_LAYER part.plane = GAME_PLANE_UPPER part.sprite_number = count part.main_part = src - parts += part + generator_parts += part part.update_appearance() part.RegisterSignal(src, COMSIG_ATOM_UPDATED_ICON, /obj/machinery/gravity_generator/part/proc/on_update_icon) -/obj/machinery/gravity_generator/main/proc/connected_parts() - return parts.len == 8 - /obj/machinery/gravity_generator/main/set_broken() - ..() - for(var/obj/machinery/gravity_generator/M in parts) - if(!(M.machine_stat & BROKEN)) - M.set_broken() - middle.cut_overlays() + . = ..() + for(var/obj/machinery/gravity_generator/internal_parts as anything in generator_parts) + if(!(internal_parts.machine_stat & BROKEN)) + internal_parts.set_broken() + center_part.cut_overlays() charge_count = 0 breaker = FALSE set_power() @@ -202,10 +202,10 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne investigate_log("has broken down.", INVESTIGATE_GRAVITY) /obj/machinery/gravity_generator/main/set_fix() - ..() - for(var/obj/machinery/gravity_generator/M in parts) - if(M.machine_stat & BROKEN) - M.set_fix() + . = ..() + for(var/obj/machinery/gravity_generator/internal_parts as anything in generator_parts) + if(internal_parts.machine_stat & BROKEN) + internal_parts.set_fix() broken_state = FALSE update_appearance() set_power() @@ -213,26 +213,26 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne // Interaction // Fixing the gravity generator. -/obj/machinery/gravity_generator/main/attackby(obj/item/I, mob/user, params) +/obj/machinery/gravity_generator/main/attackby(obj/item/weapon, mob/user, params) if(machine_stat & BROKEN) switch(broken_state) if(GRAV_NEEDS_SCREWDRIVER) - if(I.tool_behaviour == TOOL_SCREWDRIVER) + if(weapon.tool_behaviour == TOOL_SCREWDRIVER) to_chat(user, span_notice("You secure the screws of the framework.")) - I.play_tool_sound(src) + weapon.play_tool_sound(src) broken_state++ update_appearance() return if(GRAV_NEEDS_WELDING) - if(I.tool_behaviour == TOOL_WELDER) - if(I.use_tool(src, user, 0, volume=50, amount=1)) + if(weapon.tool_behaviour == TOOL_WELDER) + if(weapon.use_tool(src, user, 0, volume=50, amount=1)) to_chat(user, span_notice("You mend the damaged framework.")) broken_state++ update_appearance() return if(GRAV_NEEDS_PLASTEEL) - if(istype(I, /obj/item/stack/sheet/plasteel)) - var/obj/item/stack/sheet/plasteel/PS = I + if(istype(weapon, /obj/item/stack/sheet/plasteel)) + var/obj/item/stack/sheet/plasteel/PS = weapon if(PS.get_amount() >= 10) PS.use(10) to_chat(user, span_notice("You add the plating to the framework.")) @@ -243,9 +243,9 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne to_chat(user, span_warning("You need 10 sheets of plasteel!")) return if(GRAV_NEEDS_WRENCH) - if(I.tool_behaviour == TOOL_WRENCH) + if(weapon.tool_behaviour == TOOL_WRENCH) to_chat(user, span_notice("You secure the plating to the framework.")) - I.play_tool_sound(src) + weapon.play_tool_sound(src) set_fix() return return ..() @@ -308,9 +308,6 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne on = TRUE update_use_power(ACTIVE_POWER_USE) - if (!SSticker.IsRoundInProgress()) - return - soundloop.start() if (!gravity_in_level()) investigate_log("was brought online and is now producing gravity for this level.", INVESTIGATE_GRAVITY) @@ -325,89 +322,69 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne on = FALSE update_use_power(IDLE_POWER_USE) - if (!SSticker.IsRoundInProgress()) - return - soundloop.stop() + QDEL_NULL(gravity_field) if (gravity_in_level()) investigate_log("was brought offline and there is now no gravity for this level.", INVESTIGATE_GRAVITY) message_admins("The gravity generator was brought offline with no backup generator. [ADMIN_VERBOSEJMP(src)]") shake_everyone() - QDEL_NULL(gravity_field) complete_state_update() /obj/machinery/gravity_generator/main/proc/complete_state_update() update_appearance() update_list() -// Set the state of the gravity. -/obj/machinery/gravity_generator/main/proc/set_state(new_state) - - on = new_state - update_use_power(on ? ACTIVE_POWER_USE : IDLE_POWER_USE) - // Sound the alert if gravity was just enabled or disabled. - var/alert = FALSE - if(SSticker.IsRoundInProgress()) - if(on) // If we turned on and the game is live. - - else - - - - if(alert) - shake_everyone() - // Charge/Discharge and turn on/off gravity when you reach 0/100 percent. /obj/machinery/gravity_generator/main/process() if(machine_stat & BROKEN) return - if(charging_state != POWER_IDLE) - if(charging_state == POWER_UP && charge_count >= 100) - enable() - else if(charging_state == POWER_DOWN && charge_count <= 0) - disable() - else - if(charging_state == POWER_UP) - charge_count += 2 - else if(charging_state == POWER_DOWN) - charge_count -= 2 - - if(charge_count % 4 == 0 && prob(75)) // Let them know it is charging/discharging. - playsound(src.loc, 'sound/effects/empulse.ogg', 100, TRUE) - - var/overlay_state = null - switch(charge_count) - if(0 to 20) - overlay_state = null - if(21 to 40) - overlay_state = "startup" - if(41 to 60) - overlay_state = "idle" - if(61 to 80) - overlay_state = "activating" - if(81 to 100) - overlay_state = "activated" - - if(overlay_state != current_overlay) - if(middle) - middle.cut_overlays() - if(overlay_state) - middle.add_overlay(overlay_state) - current_overlay = overlay_state - -// Shake everyone on the z level to let them know that gravity was enagaged/disenagaged. + if(charging_state == POWER_IDLE) + return + if(charging_state == POWER_UP && charge_count >= 100) + enable() + else if(charging_state == POWER_DOWN && charge_count <= 0) + disable() + else + if(charging_state == POWER_UP) + charge_count += 2 + else if(charging_state == POWER_DOWN) + charge_count -= 2 + + if(charge_count % 4 == 0 && prob(75)) // Let them know it is charging/discharging. + playsound(src.loc, 'sound/effects/empulse.ogg', 100, TRUE) + + var/overlay_state = null + switch(charge_count) + if(0 to 20) + overlay_state = null + if(21 to 40) + overlay_state = "startup" + if(41 to 60) + overlay_state = "idle" + if(61 to 80) + overlay_state = "activating" + if(81 to 100) + overlay_state = "activated" + + if(overlay_state != current_overlay) + if(center_part) + center_part.cut_overlays() + if(overlay_state) + center_part.add_overlay(overlay_state) + current_overlay = overlay_state + +/// Shake everyone on the z level to let them know that gravity was enagaged/disengaged. /obj/machinery/gravity_generator/main/proc/shake_everyone() var/turf/T = get_turf(src) var/sound/alert_sound = sound('sound/effects/alert.ogg') - for(var/i in GLOB.mob_list) - var/mob/M = i - if(M.z != z && !(SSmapping.level_trait(z, ZTRAITS_STATION) && SSmapping.level_trait(M.z, ZTRAITS_STATION))) + for(var/mob/mobs as anything in GLOB.mob_list) + if(mobs.z != z && !(SSmapping.level_trait(z, ZTRAITS_STATION) && SSmapping.level_trait(mobs.z, ZTRAITS_STATION))) continue - M.update_gravity(M.has_gravity()) - if(M.client) - shake_camera(M, 15, 1) - M.playsound_local(T, null, 100, 1, 0.5, S = alert_sound) + mobs.update_gravity(mobs.has_gravity()) + if(mobs.client) + shake_camera(mobs, 15, 1) + mobs.playsound_local(T, null, 100, 1, 0.5, sound_to_use = alert_sound) /obj/machinery/gravity_generator/main/proc/gravity_in_level() var/turf/T = get_turf(src) @@ -418,30 +395,54 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne return FALSE /obj/machinery/gravity_generator/main/proc/update_list() - var/turf/T = get_turf(src.loc) - if(T) - var/list/z_list = list() - // Multi-Z, station gravity generator generates gravity on all ZTRAIT_STATION z-levels. - if(SSmapping.level_trait(T.z, ZTRAIT_STATION)) - for(var/z in SSmapping.levels_by_trait(ZTRAIT_STATION)) - z_list += z + var/turf/T = get_turf(src) + if(!T) + return + var/list/z_list = list() + // Multi-Z, station gravity generator generates gravity on all ZTRAIT_STATION z-levels. + if(SSmapping.level_trait(T.z, ZTRAIT_STATION)) + for(var/z in SSmapping.levels_by_trait(ZTRAIT_STATION)) + z_list += z + else + z_list += T.z + for(var/z in z_list) + if(!GLOB.gravity_generators["[z]"]) + GLOB.gravity_generators["[z]"] = list() + if(on) + GLOB.gravity_generators["[z]"] |= src else - z_list += T.z - for(var/z in z_list) - if(!GLOB.gravity_generators["[z]"]) - GLOB.gravity_generators["[z]"] = list() - if(on) - GLOB.gravity_generators["[z]"] |= src - else - GLOB.gravity_generators["[z]"] -= src + GLOB.gravity_generators["[z]"] -= src + SSmapping.calculate_z_level_gravity(z) /obj/machinery/gravity_generator/main/proc/change_setting(value) if(value != setting) setting = value shake_everyone() +/obj/machinery/gravity_generator/main/proc/blackout() + charge_count = 0 + breaker = FALSE + set_power() + disable() + investigate_log("was turned off by blackout event or a gravity anomaly detonation.", INVESTIGATE_GRAVITY) + +/obj/machinery/gravity_generator/main/beforeShuttleMove(turf/newT, rotation, move_mode, obj/docking_port/mobile/moving_dock) + . = ..() + disable() + +/obj/machinery/gravity_generator/main/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation) + . = ..() + if(charge_count != 0 && charging_state != POWER_UP) + enable() + +//prevents shuttles attempting to rotate this since it messes up sprites +/obj/machinery/gravity_generator/main/shuttleRotate(rotation, params) + params = NONE + return ..() + // Misc +/// Gravity generator instruction guide /obj/item/paper/guides/jobs/engi/gravity_gen name = "paper- 'Generate your own gravity!'" info = {"

Gravity Generator Instructions For Dummies

diff --git a/code/modules/power/lighting/light.dm b/code/modules/power/lighting/light.dm index 2a2d7e4658199b..4d08c8ac496ebf 100644 --- a/code/modules/power/lighting/light.dm +++ b/code/modules/power/lighting/light.dm @@ -18,8 +18,6 @@ var/base_state = "tube" ///Is the light on? var/on = FALSE - ///compared to the var/on for static calculations - var/on_gs = FALSE ///Amount of power used var/static_power_used = 0 ///Luminosity when on, also used in power calculation @@ -54,18 +52,26 @@ var/nightshift_light_power = 0.45 ///Basecolor of the nightshift light var/nightshift_light_color = "#FFDDCC" - ///If true, the light is in emergency mode - var/emergency_mode = FALSE - ///If true, this light cannot ever have an emergency mode - var/no_emergency = FALSE - ///Multiplier for this light's base brightness in emergency power mode - var/bulb_emergency_brightness_mul = 0.25 - ///Determines the colour of the light while it's in emergency mode - var/bulb_emergency_colour = "#FF3232" - ///The multiplier for determining the light's power in emergency mode - var/bulb_emergency_pow_mul = 0.75 - ///The minimum value for the light's power in emergency mode - var/bulb_emergency_pow_min = 0.5 + ///If true, the light is in low power mode + var/low_power_mode = FALSE + ///If true, this light cannot ever be in low power mode + var/no_low_power = FALSE + ///If true, overrides lights to use emergency lighting + var/major_emergency = FALSE + ///Multiplier for this light's base brightness during a cascade + var/bulb_major_emergency_brightness_mul = 0.75 + ///Colour of the light when major emergency mode is on + var/bulb_emergency_colour = "#ff4e4e" + ///Multiplier for this light's base brightness in low power power mode + var/bulb_low_power_brightness_mul = 0.25 + ///Determines the colour of the light while it's in low power mode + var/bulb_low_power_colour = "#FF3232" + ///The multiplier for determining the light's power in low power mode + var/bulb_low_power_pow_mul = 0.75 + ///The minimum value for the light's power in low power mode + var/bulb_low_power_pow_min = 0.5 + ///Power usage - W per unit of luminosity + var/power_consumption_rate = 20 /obj/machinery/light/Move() if(status != LIGHT_BROKEN) @@ -81,7 +87,7 @@ var/obj/machinery/power/apc/temp_apc = our_area.apc nightshift_enabled = temp_apc?.nightshift_lights - if(start_with_cell && !no_emergency) + if(start_with_cell && !no_low_power) cell = new/obj/item/stock_parts/cell/emergency_light(src) RegisterSignal(src, COMSIG_LIGHT_EATER_ACT, .proc/on_light_eater) @@ -110,7 +116,7 @@ switch(status) // set icon_states if(LIGHT_OK) var/area/local_area = get_area(src) - if(emergency_mode || (local_area?.fire)) + if(low_power_mode || major_emergency || (local_area?.fire)) icon_state = "[base_state]_emergency" else icon_state = "[base_state]" @@ -128,7 +134,7 @@ return var/area/local_area = get_area(src) - if(emergency_mode || (local_area?.fire)) + if(low_power_mode || major_emergency || (local_area?.fire)) . += mutable_appearance(overlay_icon, "[base_state]_emergency") return if(nightshift_enabled) @@ -163,7 +169,7 @@ switch(status) if(LIGHT_BROKEN,LIGHT_BURNED,LIGHT_EMPTY) on = FALSE - emergency_mode = FALSE + low_power_mode = FALSE if(on) var/brightness_set = brightness var/power_set = bulb_power @@ -172,12 +178,15 @@ color_set = color var/area/local_area = get_area(src) if (local_area?.fire) - color_set = bulb_emergency_colour + color_set = bulb_low_power_colour else if (nightshift_enabled) brightness_set = nightshift_brightness power_set = nightshift_light_power if(!color) color_set = nightshift_light_color + else if (major_emergency) + color_set = bulb_low_power_colour + brightness_set = brightness * bulb_major_emergency_brightness_mul var/matching = light && brightness_set == light.light_range && power_set == light.light_power && color_set == light.light_color if(!matching) switchcount++ @@ -196,22 +205,30 @@ ) else if(has_emergency_power(LIGHT_EMERGENCY_POWER_USE) && !turned_off()) use_power = IDLE_POWER_USE - emergency_mode = TRUE + low_power_mode = TRUE START_PROCESSING(SSmachines, src) else use_power = IDLE_POWER_USE set_light(l_range = 0) update_appearance() + update_current_power_usage() + broken_sparks(start_only=TRUE) - if(on != on_gs) - on_gs = on - if(on) - static_power_used = brightness * 20 //20W per unit luminosity - addStaticPower(static_power_used, AREA_USAGE_STATIC_LIGHT) +/obj/machinery/light/update_current_power_usage() + if(!on && static_power_used > 0) //Light is off but still powered + removeStaticPower(static_power_used, AREA_USAGE_STATIC_LIGHT) + static_power_used = 0 + else if(on) //Light is on, just recalculate usage + var/static_power_used_new = 0 + var/area/local_area = get_area(src) + if (nightshift_enabled && !local_area?.fire) + static_power_used_new = nightshift_brightness * nightshift_light_power * power_consumption_rate else + static_power_used_new = brightness * bulb_power * power_consumption_rate + if(static_power_used != static_power_used_new) //Consumption changed - update removeStaticPower(static_power_used, AREA_USAGE_STATIC_LIGHT) - - broken_sparks(start_only=TRUE) + static_power_used = static_power_used_new + addStaticPower(static_power_used, AREA_USAGE_STATIC_LIGHT) /obj/machinery/light/update_atom_colour() ..() @@ -231,7 +248,7 @@ if (cell.charge == cell.maxcharge) return PROCESS_KILL cell.charge = min(cell.maxcharge, cell.charge + LIGHT_EMERGENCY_POWER_USE) //Recharge emergency power automatically while not using it - if(emergency_mode && !use_emergency_power(LIGHT_EMERGENCY_POWER_USE)) + if(low_power_mode && !use_emergency_power(LIGHT_EMERGENCY_POWER_USE)) update(FALSE) //Disables emergency mode and sets the color to normal /obj/machinery/light/proc/burn_out() @@ -399,7 +416,7 @@ // returns whether this light has emergency power // can also return if it has access to a certain amount of that power /obj/machinery/light/proc/has_emergency_power(power_usage_amount) - if(no_emergency || !cell) + if(no_low_power || !cell) return FALSE if(power_usage_amount ? cell.charge >= power_usage_amount : cell.charge) return status == LIGHT_OK @@ -414,9 +431,9 @@ return FALSE cell.use(power_usage_amount) set_light( - l_range = brightness * bulb_emergency_brightness_mul, - l_power = max(bulb_emergency_pow_min, bulb_emergency_pow_mul * (cell.charge / cell.maxcharge)), - l_color = bulb_emergency_colour + l_range = brightness * bulb_low_power_brightness_mul, + l_power = max(bulb_low_power_pow_min, bulb_low_power_pow_mul * (cell.charge / cell.maxcharge)), + l_color = bulb_low_power_colour ) return TRUE @@ -441,8 +458,8 @@ // ai attack - make lights flicker, because why not /obj/machinery/light/attack_ai(mob/user) - no_emergency = !no_emergency - to_chat(user, span_notice("Emergency lights for this fixture have been [no_emergency ? "disabled" : "enabled"].")) + no_low_power = !no_low_power + to_chat(user, span_notice("Emergency lights for this fixture have been [no_low_power ? "disabled" : "enabled"].")) update(FALSE) return @@ -515,6 +532,14 @@ // create a light tube/bulb item and put it in the user's hand drop_light_tube(user) +/obj/machinery/light/proc/set_major_emergency_light() + major_emergency = TRUE + update() + +/obj/machinery/light/proc/unset_major_emergency_light() + major_emergency = FALSE + update() + /obj/machinery/light/proc/drop_light_tube(mob/user) var/obj/item/light/light_object = new light_type() light_object.status = status diff --git a/code/modules/power/lighting/light_mapping_helpers.dm b/code/modules/power/lighting/light_mapping_helpers.dm index 4774241db2265d..dccf1f3c655130 100644 --- a/code/modules/power/lighting/light_mapping_helpers.dm +++ b/code/modules/power/lighting/light_mapping_helpers.dm @@ -30,7 +30,7 @@ /obj/machinery/light/red bulb_colour = "#FF3232" nightshift_allowed = FALSE - no_emergency = TRUE + no_low_power = TRUE brightness = 4 bulb_power = 0.7 @@ -72,7 +72,7 @@ /obj/machinery/light/small/red bulb_colour = "#FF3232" - no_emergency = TRUE + no_low_power = TRUE nightshift_allowed = FALSE brightness = 2 bulb_power = 0.8 diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index 95ee471e72cb74..a401cc1f218626 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -278,4 +278,4 @@ sheet_path = /obj/item/stack/sheet/mineral/uranium /obj/machinery/power/port_gen/pacman/pre_loaded - sheets = 50 + sheets = 15 diff --git a/code/modules/power/singularity/narsie.dm b/code/modules/power/singularity/narsie.dm index d8e9ae1b2ab7d9..bcb2a8b51ff24e 100644 --- a/code/modules/power/singularity/narsie.dm +++ b/code/modules/power/singularity/narsie.dm @@ -235,7 +235,7 @@ ///security level and shuttle lockdowns for [/proc/begin_the_end()] /proc/narsie_start_destroy_station() - set_security_level("delta") + SSsecurity_level.set_level(SEC_LEVEL_DELTA) SSshuttle.registerHostileEnvironment(GLOB.cult_narsie) SSshuttle.lockdown = TRUE addtimer(CALLBACK(GLOBAL_PROC, .proc/narsie_apocalypse), 1 MINUTES) @@ -255,7 +255,7 @@ ///Called only if the crew managed to destroy narsie at the very last second for [/proc/begin_the_end()] /proc/narsie_last_second_win() - set_security_level("red") + SSsecurity_level.set_level(SEC_LEVEL_RED) SSshuttle.lockdown = FALSE INVOKE_ASYNC(GLOBAL_PROC, .proc/cult_ending_helper, CULT_FAILURE_NARSIE_KILLED) diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index 5eef6bb898f548..2f3623d7f3e00a 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -12,6 +12,10 @@ #define OBJECT (LOWEST + 1) #define LOWEST (1) +#define CASCADING_ADMIN "Admin" +#define CASCADING_CRITICAL_GAS "Critical gas point" +#define CASCADING_DESTAB_CRYSTAL "Destabilizing crystal" + GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) /obj/machinery/power/supermatter_crystal @@ -313,7 +317,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) /obj/machinery/power/supermatter_crystal/Destroy() if(warp) vis_contents -= warp - warp = null + QDEL_NULL(warp) investigate_log("has been destroyed.", INVESTIGATE_ENGINE) SSair.stop_processing_machine(src) QDEL_NULL(radio) @@ -334,6 +338,8 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) var/immune = HAS_TRAIT(user, TRAIT_MADNESS_IMMUNE) || (user.mind && HAS_TRAIT(user.mind, TRAIT_MADNESS_IMMUNE)) if(isliving(user) && !immune && (get_dist(user, src) < HALLUCINATION_RANGE(power))) . += span_danger("You get headaches just from looking at it.") + if(cascade_initiated) + . += span_bolddanger("The crystal is vibrating at immense speeds, warping space around it!") // SupermatterMonitor UI for ghosts only. Inherited attack_ghost will call this. /obj/machinery/power/supermatter_crystal/ui_interact(mob/user, datum/tgui/ui) @@ -431,7 +437,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) /obj/machinery/power/supermatter_crystal/update_overlays() . = ..() - if(final_countdown) + if(final_countdown && !cascade_initiated) . += "casuality_field" /obj/machinery/power/supermatter_crystal/proc/countdown() @@ -442,11 +448,22 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) final_countdown = TRUE update_appearance() - var/speaking = "[emergency_alert] The supermatter has reached critical integrity failure. Emergency causality destabilization field has been activated." + var/cascading = cascade_initiated + + var/speaking = "[emergency_alert] The supermatter has reached critical integrity failure." + + if(cascading) + speaking += " Harmonic frequency limits exceeded. Causality destabilization field could not be engaged." + else + speaking += " Emergency causality destabilization field has been activated." + radio.talk_into(src, speaking, common_channel, language = get_selected_language()) for(var/i in SUPERMATTER_COUNTDOWN_TIME to 0 step -10) if(damage < explosion_point) // Cutting it a bit close there engineers - radio.talk_into(src, "[safe_alert] Failsafe has been disengaged.", common_channel) + if(cascading) + radio.talk_into(src, "[safe_alert] Harmonic frequency restored within emergency bounds. Anti-resonance filter initiated.", common_channel) + else + radio.talk_into(src, "[safe_alert] Failsafe has been disengaged.", common_channel) final_countdown = FALSE update_appearance() return @@ -454,18 +471,21 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) sleep(10) continue else if(i > 50) - speaking = "[DisplayTimeText(i, TRUE)] remain before causality stabilization." + if(cascading) + speaking = "[DisplayTimeText(i, TRUE)] remain before resonance-induced stabilization." + else + speaking = "[DisplayTimeText(i, TRUE)] remain before causality stabilization." else speaking = "[i*0.1]..." radio.talk_into(src, speaking, common_channel) - sleep(10) + sleep(1 SECONDS) delamination_event() /obj/machinery/power/supermatter_crystal/proc/delamination_event() var/can_spawn_anomalies = is_station_level(loc.z) && is_main_engine && anomaly_event - var/is_cascading = check_cascade_requirements(anomaly_event) + var/is_cascading = cascade_initiated new /datum/supermatter_delamination(power, combined_gas, get_turf(src), explosion_power, gasmix_power_ratio, can_spawn_anomalies, is_cascading) qdel(src) @@ -476,29 +496,34 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) delamination_event() /** - * Checks if the supermatter is in a state where it can cascade + * Checks if and why the supermatter is in a state where it can cascade * - * Arguments: can_trigger = TRUE if the supermatter can trigger the cascade - * Returns: TRUE if the supermatter can cascade + * Returns: cause of the cascade, for logging */ -/obj/machinery/power/supermatter_crystal/proc/check_cascade_requirements(can_trigger) +/obj/machinery/power/supermatter_crystal/proc/check_cascade_requirements() + if(admin_cascade) + return CASCADING_ADMIN - if(get_integrity_percent() < SUPERMATTER_CASCADE_PERCENT && !cascade_initiated && !admin_cascade && can_trigger) + if(!anomaly_event) return FALSE - var/supermatter_cascade = can_trigger + if(has_destabilizing_crystal) + return CASCADING_DESTAB_CRYSTAL + + var/critical_gas_exceeded = TRUE var/list/required_gases = list(/datum/gas/hypernoblium, /datum/gas/antinoblium) - for(var/gas_path in required_gases) - if(has_destabilizing_crystal) - break // We have a destabilizing crystal, we're good - if(gas_comp[gas_path] < 0.4 || environment_total_moles < MOLE_PENALTY_THRESHOLD) - supermatter_cascade = FALSE - break + if(environment_total_moles < MOLE_PENALTY_THRESHOLD) + critical_gas_exceeded = FALSE + else + for(var/gas_path in required_gases) + if(gas_comp[gas_path] < 0.4) + critical_gas_exceeded = FALSE + break - if(admin_cascade) - supermatter_cascade = TRUE + if(critical_gas_exceeded) + return CASCADING_CRITICAL_GAS - return supermatter_cascade + return FALSE /obj/machinery/power/supermatter_crystal/proc/supermatter_pull(turf/center, pull_range = 3) playsound(center, 'sound/weapons/marauder.ogg', 100, TRUE, extrarange = pull_range - world.view) @@ -530,8 +555,8 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) new /obj/effect/anomaly/hallucination(local_turf, has_changed_lifespan ? rand(150, 250) : null, FALSE) if(VORTEX_ANOMALY) new /obj/effect/anomaly/bhole(local_turf, 20, FALSE) - if(DELIMBER_ANOMALY) - new /obj/effect/anomaly/delimber(local_turf, null, FALSE) + if(BIOSCRAMBLER_ANOMALY) + new /obj/effect/anomaly/bioscrambler(local_turf, null, FALSE) /obj/machinery/proc/supermatter_zap(atom/zapstart = src, range = 5, zap_str = 4000, zap_flags = ZAP_SUPERMATTER_FLAGS, list/targets_hit = list(), zap_cutoff = 1500, power_level = 0, zap_icon = DEFAULT_ZAP_ICON_STATE, color = null) if(QDELETED(zapstart)) @@ -728,6 +753,10 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) pixel_x = -176 pixel_y = -176 +#undef CASCADING_ADMIN +#undef CASCADING_CRITICAL_GAS +#undef CASCADING_DESTAB_CRYSTAL + #undef BIKE #undef COIL #undef ROD diff --git a/code/modules/power/supermatter/supermatter_cascade_components.dm b/code/modules/power/supermatter/supermatter_cascade_components.dm index fae4dd5d9d116e..6851760b6acf6a 100644 --- a/code/modules/power/supermatter/supermatter_cascade_components.dm +++ b/code/modules/power/supermatter/supermatter_cascade_components.dm @@ -10,11 +10,13 @@ anchored = TRUE resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF light_power = 1 - light_range = 7 + light_range = 5 light_color = COLOR_VIVID_YELLOW move_resist = INFINITY ///All dirs we can expand to var/list/available_dirs = list(NORTH,SOUTH,EAST,WEST,UP,DOWN) + ///Handler that helps with properly killing mobs that the crystal grows over + var/datum/component/supermatter_crystal/sm_comp ///Cooldown on the expansion process COOLDOWN_DECLARE(sm_wall_cooldown) @@ -23,13 +25,14 @@ icon_state = "crystal_cascade_[rand(1,6)]" START_PROCESSING(SSsupermatter_cascade, src) - AddComponent(/datum/component/supermatter_crystal, null, null) + sm_comp = AddComponent(/datum/component/supermatter_crystal, null, null) playsound(src, 'sound/misc/cracking_crystal.ogg', 45, TRUE) available_dirs -= dir_to_remove var/turf/our_turf = get_turf(src) + if(our_turf) our_turf.opacity = FALSE @@ -39,7 +42,6 @@ return if(!available_dirs || available_dirs.len <= 0) - light_range = 0 return PROCESS_KILL COOLDOWN_START(src, sm_wall_cooldown, rand(0, 3 SECONDS)) @@ -53,9 +55,18 @@ return for(var/atom/movable/checked_atom as anything in next_turf) - if(!isliving(checked_atom) && !istype(checked_atom, /obj/cascade_portal)) - continue - qdel(checked_atom) + if(isliving(checked_atom)) + sm_comp.dust_mob(src, checked_atom, span_danger("\The [src] lunges out on [checked_atom], touching [checked_atom.p_them()]... \ + [checked_atom.p_their()] body begins to shine with a brilliant light before crystallizing from the inside out and joining \the [src]!"), + span_userdanger("The crystal mass lunges on you and hits you in the chest. As your vision is filled with a blinding light, you think to yourself \"Damn it.\"")) + else if(istype(checked_atom, /obj/cascade_portal)) + checked_atom.visible_message(span_userdanger("\The [checked_atom] screeches and closes away as it is hit by \a [src]! Too late!")) + playsound(get_turf(checked_atom), 'sound/magic/charge.ogg', 50, TRUE) + playsound(get_turf(checked_atom), 'sound/effects/supermatter.ogg', 50, TRUE) + qdel(checked_atom) + else if(isitem(checked_atom)) + playsound(get_turf(checked_atom), 'sound/effects/supermatter.ogg', 50, TRUE) + qdel(checked_atom) new /obj/crystal_mass(next_turf, get_dir(next_turf, src)) @@ -78,9 +89,13 @@ qdel(rip_u) return COMPONENT_CANCEL_ATTACK_CHAIN +/obj/crystal_mass/Destroy() + sm_comp = null + return ..() + /obj/cascade_portal name = "Bluespace Rift" - desc = "Your mind begins to bubble and ooze as it tries to comprehend what it sees." + desc = "Your mind begins to spin as it tries to comprehend what it sees." icon = 'icons/effects/224x224.dmi' icon_state = "reality" anchored = TRUE @@ -96,18 +111,9 @@ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF /obj/cascade_portal/Bumped(atom/movable/hit_object) - if(isliving(hit_object)) - hit_object.visible_message(span_danger("\The [hit_object] slams into \the [src] inducing a resonance... [hit_object.p_their()] body starts to glow and burst into flames before flashing into dust!"), - span_userdanger("You slam into \the [src] as your ears are filled with unearthly ringing. Your last thought is \"Oh, fuck.\""), - span_hear("You hear an unearthly noise as a wave of heat washes over you.")) - else if(isobj(hit_object) && !iseffect(hit_object)) - hit_object.visible_message(span_danger("\The [hit_object] smacks into \the [src] and rapidly flashes to ash."), null, - span_hear("You hear a loud crack as you are washed with a wave of heat.")) - else - return - - playsound(get_turf(src), 'sound/effects/supermatter.ogg', 50, TRUE) consume(hit_object) + new /obj/effect/particle_effect/sparks(loc) + playsound(loc, SFX_SPARKS, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) /** * Proc to consume the objects colliding with the portal @@ -116,17 +122,30 @@ */ /obj/cascade_portal/proc/consume(atom/movable/consumed_object) if(isliving(consumed_object)) + consumed_object.visible_message(span_danger("\The [consumed_object] walks into \the [src]... \ + A blinding light covers [consumed_object.p_their()] body before disappearing completely!"), + span_userdanger("You walk into \the [src] as your body is washed with a powerful blue light. \ + You contemplate about this decision before landing face first onto the cold, hard floor."), + span_hear("You hear a loud crack as a distortion passes through you.")) + var/list/arrival_turfs = get_area_turfs(/area/centcom/central_command_areas/evacuation) - var/turf/arrival_turf = pick(arrival_turfs) + var/turf/arrival_turf + do + arrival_turf = pick_n_take(arrival_turfs) + while(!is_safe_turf(arrival_turf)) + var/mob/living/consumed_mob = consumed_object - if(consumed_mob.status_flags & GODMODE) - return message_admins("[key_name_admin(consumed_mob)] has entered [src] [ADMIN_JMP(src)].") investigate_log("was entered by [key_name(consumed_mob)].", INVESTIGATE_ENGINE) consumed_mob.forceMove(arrival_turf) consumed_mob.Paralyze(100) consumed_mob.adjustBruteLoss(30) - else if(consumed_object.flags_1 & SUPERMATTER_IGNORES_1) - return - else if(isobj(consumed_object)) + consumed_mob.flash_act(1, TRUE, TRUE) + + new /obj/effect/particle_effect/sparks(consumed_object) + playsound(consumed_object, SFX_SPARKS, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + else if(isitem(consumed_object)) + consumed_object.visible_message(span_danger("\The [consumed_object] smacks into \the [src] and disappears out of sight."), null, + span_hear("You hear a loud crack as a small distortion passes through you.")) + qdel(consumed_object) diff --git a/code/modules/power/supermatter/supermatter_delamination.dm b/code/modules/power/supermatter/supermatter_delamination.dm index 42d418d0d912a6..1fb0335e947474 100644 --- a/code/modules/power/supermatter/supermatter_delamination.dm +++ b/code/modules/power/supermatter/supermatter_delamination.dm @@ -1,3 +1,6 @@ +///Minimum distance that a crystal mass must have from the rift +#define MIN_RIFT_SAFE_DIST 30 + /datum/supermatter_delamination ///Power amount of the SM at the moment of death var/supermatter_power = 0 @@ -170,76 +173,168 @@ * Setup for the cascade delamination */ /datum/supermatter_delamination/proc/start_supermatter_cascade() - SSshuttle.registerHostileEnvironment(src) + // buncha shuttle manipulation incoming + + // set timer to infinity, so shuttle never arrives + SSshuttle.emergency.setTimer(INFINITY) + // disallow shuttle recalls, so people cannot cheese the timer + SSshuttle.emergency_no_recall = TRUE + // set supermatter cascade to true, to prevent auto evacuation due to no way of calling the shuttle SSshuttle.supermatter_cascade = TRUE + // This logic is to keep uncalled shuttles uncalled + // In SSshuttle, there is not much of a way to prevent shuttle calls, unless we mess with admin panel vars + // SHUTTLE_STRANDED is different here, because it *can* block the shuttle from being called, however if we don't register a hostile + // environment, it gets unset immediately. Internally, it checks if the count of HEs is zero + // and that the shuttle is in stranded mode, then frees it with an announcement. + // This is a botched solution to a problem that could be solved with a small change in shuttle code, however- + if(SSshuttle.emergency.mode == SHUTTLE_IDLE) + SSshuttle.emergency.mode = SHUTTLE_STRANDED + SSshuttle.registerHostileEnvironment(src) + // set hijack completion timer to infinity, so that you cant prematurely end the round with a hijack + for(var/obj/machinery/computer/emergency_shuttle/console in GLOB.machines) + console.hijack_completion_flight_time_set = INFINITY + + for(var/mob/player as anything in GLOB.player_list) + if(!isdead(player)) + to_chat(player, span_boldannounce("Everything around you is resonating with a powerful energy. This can't be good.")) + SEND_SIGNAL(player, COMSIG_ADD_MOOD_EVENT, "cascade", /datum/mood_event/cascade) + SEND_SOUND(player, 'sound/magic/charge.ogg') + call_explosion() create_cascade_ambience() - pick_rift_location() warn_crew() + + var/rift_loc = pick_rift_location() new /obj/crystal_mass(supermatter_turf) + + var/list/mass_loc_candidates = GLOB.generic_event_spawns.Copy() + mass_loc_candidates.Remove(rift_loc) // this should now actually get rid of stalemates for(var/i in 1 to rand(4,6)) - new /obj/crystal_mass(get_turf(pick(GLOB.generic_event_spawns))) + var/list/loc_list = mass_loc_candidates.Copy() + var/mass_loc + do + mass_loc = pick_n_take(loc_list) + while(get_dist(mass_loc, rift_loc) < MIN_RIFT_SAFE_DIST) + new /obj/crystal_mass(get_turf(mass_loc)) + + SSsupermatter_cascade.cascade_initiated = TRUE /** * Adds a bit of spiciness to the cascade by breaking lights and turning emergency maint access on */ /datum/supermatter_delamination/proc/create_cascade_ambience() - break_lights_on_station() + if(SSsecurity_level.get_current_level_as_number() != SEC_LEVEL_DELTA) + SSsecurity_level.set_level(SEC_LEVEL_DELTA) // skip the announcement and shuttle timer adjustment in set_security_level() make_maint_all_access() + break_lights_on_station() /** * Picks a random location for the rift + * Returns: ref to rift location */ /datum/supermatter_delamination/proc/pick_rift_location() - var/turf/rift_location = get_turf(pick(GLOB.generic_event_spawns)) - cascade_rift = new /obj/cascade_portal(rift_location) + var/rift_spawn = pick(GLOB.generic_event_spawns) + var/turf/rift_turf = get_turf(rift_spawn) + cascade_rift = new /obj/cascade_portal(rift_turf) + message_admins("Exit rift created at [get_area_name(rift_turf)]. [ADMIN_JMP(cascade_rift)]") + log_game("Bluespace Exit Rift was created at [get_area_name(rift_turf)].") + cascade_rift.investigate_log("created at [get_area_name(rift_turf)].", INVESTIGATE_ENGINE) RegisterSignal(cascade_rift, COMSIG_PARENT_QDELETING, .proc/deleted_portal) + return rift_spawn /** * Warns the crew about the cascade start and the rift location */ /datum/supermatter_delamination/proc/warn_crew() - for(var/mob/player as anything in GLOB.alive_player_list) - to_chat(player, span_boldannounce("You feel a strange presence in the air around you. You feel unsafe.")) - - priority_announce("Unknown harmonance affecting local spatial substructure, all nearby matter is starting to crystallize.", "Central Command Higher Dimensional Affairs", 'sound/misc/bloblarm.ogg') - priority_announce("There's been a sector-wide electromagnetic pulse. All of our systems are heavily damaged, including those required for emergency shuttle navigation. \ - We can only reasonably conclude that a supermatter cascade has been initiated on or near your station. \ - Evacuation is no longer possible by conventional means; however, we managed to open a rift near the [get_area_name(cascade_rift)]. \ - All personnel are hereby advised to enter the rift using all means available. Retrieval of survivors will be conducted upon recovery of necessary facilities. \ - Good l\[\[###!!!-") + priority_announce("A Type-C resonance shift event has occurred in your sector. Scans indicate local oscillation flux affecting spatial and gravitational substructure. \ + Multiple resonance hotspots have formed. Please standby.", "Nanotrasen Star Observation Association", ANNOUNCER_SPANOMALIES) + if(SSshuttle.emergency.mode != SHUTTLE_STRANDED) + addtimer(CALLBACK(src, .proc/announce_shuttle_gone), 2 SECONDS) - addtimer(CALLBACK(src, .proc/delta), 10 SECONDS) + addtimer(CALLBACK(src, .proc/announce_beginning), 5 SECONDS) +/** + * Logs the deletion of the bluespace rift, and starts countdown to the end of the round. + */ /datum/supermatter_delamination/proc/deleted_portal() SIGNAL_HANDLER + message_admins("[cascade_rift] deleted at [get_area_name(cascade_rift.loc)]. [ADMIN_JMP(cascade_rift.loc)]") + log_game("[cascade_rift] was deleted.") + cascade_rift.investigate_log("was deleted.", INVESTIGATE_ENGINE) - priority_announce("The rift has been destroyed, we can no longer help you...", "Warning", 'sound/misc/bloblarm.ogg') + priority_announce("[Gibberish("The rift has been destroyed, we can no longer help you.", FALSE, 5)]") + addtimer(CALLBACK(src, .proc/announce_gravitation_shift), 25 SECONDS) addtimer(CALLBACK(src, .proc/last_message), 50 SECONDS) + if(SSshuttle.emergency.mode != SHUTTLE_ESCAPE) // if the shuttle is enroute to centcom, we let the shuttle end the round + addtimer(CALLBACK(src, .proc/the_end), 1 MINUTES) - addtimer(CALLBACK(src, .proc/the_end), 1 MINUTES) +/** + * Announces the halfway point to the end. + */ +/datum/supermatter_delamination/proc/announce_gravitation_shift() + priority_announce("Reports indicate formation of crystalline seeds following resonance shift event. \ + Rapid expansion of crystal mass proportional to rising gravitational force. \ + Matter collapse due to gravitational pull foreseeable.", + "Nanotrasen Star Observation Association") /** - * Increases the security level to the highest level + * This proc manipulates the shuttle if it's enroute to centcom, to remain in hyperspace. Otherwise, it just plays an announcement if + * the shuttle was in any other state except stranded (idle) */ -/datum/supermatter_delamination/proc/delta() - set_security_level("delta") - sound_to_playing_players('sound/misc/notice1.ogg') +/datum/supermatter_delamination/proc/announce_shuttle_gone() + // say goodbye to that shuttle of yours + if(SSshuttle.emergency.mode != SHUTTLE_ESCAPE) + priority_announce("Fatal error occurred in emergency shuttle uplink during transit. Unable to reestablish connection.", + "Emergency Shuttle Uplink Alert", 'sound/misc/announce_dig.ogg') + else + // except if you are on it already, then you are safe c: + minor_announce("ERROR: Corruption detected in navigation protocols. Connection with Transponder #XCC-P5831-ES13 lost. \ + Backup exit route protocol decrypted. Calibrating route...", + "Emergency Shuttle", TRUE) // wait out until the rift on the station gets destroyed and the final message plays + var/list/mobs = mobs_in_area_type(list(/area/shuttle/escape)) + for(var/mob/living/mob as anything in mobs) // emulate mob/living/lateShuttleMove() behaviour + if(mob.buckled) + continue + if(mob.client) + shake_camera(mob, 3 SECONDS * 0.25, 1) + mob.Paralyze(3 SECONDS, TRUE) /** - * Announces the last message to the station + * Announces the last message to the station, frees the shuttle from purgatory if applicable */ /datum/supermatter_delamination/proc/last_message() - priority_announce("To the remaining survivors of [station_name()], We're sorry.", " ", 'sound/misc/bloop.ogg') + priority_announce("[Gibberish("All attempts at evacuation have now ceased, and all assets have been retrieved from your sector.\n \ + To the remaining survivors of [station_name()], farewell.", FALSE, 5)]") + + if(SSshuttle.emergency.mode == SHUTTLE_ESCAPE) + // special message for hijacks + var/shuttle_msg = "Navigation protocol set to [SSshuttle.emergency.is_hijacked() ? "\[ERROR\]" : "backup route"]. \ + Reorienting bluespace vessel to exit vector. ETA 15 seconds." + // garble the special message + if(SSshuttle.emergency.is_hijacked()) + shuttle_msg = Gibberish(shuttle_msg, TRUE, 15) + minor_announce(shuttle_msg, "Emergency Shuttle", TRUE) + SSshuttle.emergency.setTimer(15 SECONDS) + +/** + * Announce detail about the event, as well as rift location + */ +/datum/supermatter_delamination/proc/announce_beginning() + priority_announce("We have been hit by a sector-wide electromagnetic pulse. All of our systems are heavily damaged, including those \ + required for shuttle navigation. We can only reasonably conclude that a supermatter cascade is occurring on or near your station.\n\n\ + Evacuation is no longer possible by conventional means; however, we managed to open a rift near the [get_area_name(cascade_rift)]. \ + All personnel are hereby required to enter the rift by any means available.\n\n\ + [Gibberish("Retrieval of survivors will be conducted upon recovery of necessary facilities.", FALSE, 5)] \ + [Gibberish("Good luck--", FALSE, 25)]") /** * Ends the round */ /datum/supermatter_delamination/proc/the_end() SSticker.news_report = SUPERMATTER_CASCADE - SSticker.force_ending = 1 + SSticker.force_ending = TRUE /** * Break the lights on the station, have 35% of them be set to emergency @@ -247,7 +342,8 @@ /datum/supermatter_delamination/proc/break_lights_on_station() for(var/obj/machinery/light/light_to_break in GLOB.machines) if(prob(35)) - light_to_break.emergency_mode = TRUE - light_to_break.update_appearance() + light_to_break.set_major_emergency_light() continue light_to_break.break_light_tube() + +#undef MIN_RIFT_SAFE_DIST diff --git a/code/modules/power/supermatter/supermatter_hit_procs.dm b/code/modules/power/supermatter/supermatter_hit_procs.dm index 4ec79dcd555bb1..4824e69168b1d3 100644 --- a/code/modules/power/supermatter/supermatter_hit_procs.dm +++ b/code/modules/power/supermatter/supermatter_hit_procs.dm @@ -89,20 +89,24 @@ var/obj/item/destabilizing_crystal/destabilizing_crystal = item if(!anomaly_event) - to_chat(user, span_warning("You can't use \the [destabilizing_crystal] on a Shard.")) + to_chat(user, span_warning("You can't use \the [destabilizing_crystal] on \a [name].")) return if(get_integrity_percent() < SUPERMATTER_CASCADE_PERCENT) - to_chat(user, span_warning("You can only apply \the [destabilizing_crystal] to a Supermatter src that is at least [SUPERMATTER_CASCADE_PERCENT]% intact.")) + to_chat(user, span_warning("You can only apply \the [destabilizing_crystal] to \a [name] that is at least [SUPERMATTER_CASCADE_PERCENT]% intact.")) return - to_chat(user, span_notice("You begin to attach \the [destabilizing_crystal] to \the [src]...")) + to_chat(user, span_warning("You begin to attach \the [destabilizing_crystal] to \the [src]...")) if(do_after(user, 3 SECONDS, src)) - to_chat(user, span_notice("You attach \the [destabilizing_crystal] to \the [src].")) + message_admins("[ADMIN_LOOKUPFLW(user)] attached [destabilizing_crystal] to the supermatter at [ADMIN_VERBOSEJMP(src)]") + log_game("[key_name(user)] attached [destabilizing_crystal] to the supermatter at [AREACOORD(src)]") + investigate_log("[key_name(user)] attached [destabilizing_crystal] to a supermatter crystal.", INVESTIGATE_ENGINE) + to_chat(user, span_danger("\The [destabilizing_crystal] snaps onto \the [src].")) has_destabilizing_crystal = TRUE cascade_initiated = TRUE damage += 100 matter_power += 500 + addtimer(CALLBACK(src, .proc/announce_incoming_cascade), 2 MINUTES) qdel(destabilizing_crystal) return diff --git a/code/modules/power/supermatter/supermatter_process.dm b/code/modules/power/supermatter/supermatter_process.dm index dd605c1df0a378..1633fcee76d89a 100644 --- a/code/modules/power/supermatter/supermatter_process.dm +++ b/code/modules/power/supermatter/supermatter_process.dm @@ -69,19 +69,28 @@ //handles temperature increase and gases made by the crystal temperature_gas_production(env, removed) - if(check_cascade_requirements(anomaly_event)) + var/cascading = check_cascade_requirements() + if(cascading) + if(!cascade_initiated) + addtimer(CALLBACK(src, .proc/announce_incoming_cascade), 2 MINUTES, TIMER_UNIQUE | TIMER_OVERRIDE) + log_game("[src] has begun a cascade.") + message_admins("[src] has begun a cascade, reasons: [cascading]. [ADMIN_JMP(src)]") + investigate_log("has begun a cascade, reasons: [cascading].", INVESTIGATE_ENGINE) cascade_initiated = TRUE if(!warp) warp = new(src) vis_contents += warp animate(warp, time = 1, transform = matrix().Scale(0.5,0.5)) animate(time = 9, transform = matrix()) - else if(warp) vis_contents -= warp - warp = null - cascade_initiated = FALSE + QDEL_NULL(warp) + if(cascade_initiated) + log_game("[src] has stopped its cascade.") + message_admins("[src] has stopped its cascade. [ADMIN_JMP(src)]") + investigate_log("has stopped its cascade.", INVESTIGATE_ENGINE) + cascade_initiated = FALSE //handles hallucinations and the presence of a psychiatrist psychological_examination() @@ -89,7 +98,10 @@ //Transitions between one function and another, one we use for the fast inital startup, the other is used to prevent errors with fusion temperatures. //Use of the second function improves the power gain imparted by using co2 if(power_changes) - power = max(power - min(((power/500)**3) * powerloss_inhibitor, power * 0.83 * powerloss_inhibitor) * (1 - (0.2 * psyCoeff)),0) + ///The power that is getting lost this tick. + var/power_loss = power < POWERLOSS_LINEAR_THRESHOLD ? ((power / POWERLOSS_CUBIC_DIVISOR) ** 3) : (POWERLOSS_LINEAR_OFFSET + POWERLOSS_LINEAR_RATE * (power - POWERLOSS_LINEAR_THRESHOLD)) + power_loss *= powerloss_inhibitor * (1 - (PSYCHOLOGIST_POWERLOSS_REDUCTION * psyCoeff)) + power = max(power - power_loss, 0) //After this point power is lowered //This wraps around to the begining of the function //Handle high power zaps/anomaly generation @@ -429,19 +441,25 @@ if(combined_gas > MOLE_PENALTY_THRESHOLD) radio.talk_into(src, "Warning: Critical coolant mass reached.", engineering_channel) - if(check_cascade_requirements(anomaly_event)) + if(check_cascade_requirements()) var/channel_to_talk_to = damage > emergency_point ? common_channel : engineering_channel - radio.talk_into(src, "DANGER: RESONANCE CASCADE INITIATED.", channel_to_talk_to) + radio.talk_into(src, "DANGER: HYPERSTRUCTURE OSCILLATION FREQUENCY OUT OF BOUNDS.", channel_to_talk_to) for(var/mob/victim as anything in GLOB.player_list) var/list/messages = list( - "You feel a strange presence in the air coming from engineering.", - "Something is wrong, there are weird sounds coming from engineering.", - "You don't like the smell of the SM.", - "The SM is emitting strange noises.", - "Crystals sounds are echoing through the station.", + "Space seems to be shifting around you...", + "You hear a high-pitched ringing sound.", + "You feel tingling going down your back.", + "Something feels very off.", + "A drowning sense of dread washes over you." ) - to_chat(victim, span_boldannounce(pick(messages))) + to_chat(victim, span_danger(pick(messages))) //Boom (Mind blown) if(damage > explosion_point) countdown() + +/obj/machinery/power/supermatter_crystal/proc/announce_incoming_cascade() + if(check_cascade_requirements()) + priority_announce("Attention: Long range anomaly scans indicate abnormal quantities of harmonic flux originating from \ + a subject within [station_name()], a resonance collapse may occur.", + "Nanotrasen Star Observation Association") diff --git a/code/modules/power/terminal.dm b/code/modules/power/terminal.dm index 1a3eeb8ae1d672..5cd825c12a9863 100644 --- a/code/modules/power/terminal.dm +++ b/code/modules/power/terminal.dm @@ -43,14 +43,14 @@ if(isturf(loc)) var/turf/T = loc if(T.underfloor_accessibility < UNDERFLOOR_INTERACTABLE) - to_chat(user, span_warning("You must first expose the power terminal!")) + balloon_alert(user, "must expose the cable terminal!") return if(master && !master.can_terminal_dismantle()) return - user.visible_message(span_notice("[user.name] dismantles the power terminal from [master]."), - span_notice("You begin to cut the cables...")) + user.visible_message(span_notice("[user.name] dismantles the cable terminal from [master].")) + balloon_alert(user, "cutting the cables...") playsound(src.loc, 'sound/items/deconstruct.ogg', 50, TRUE) if(I.use_tool(src, user, 50)) @@ -62,7 +62,7 @@ return new /obj/item/stack/cable_coil(drop_location(), 10) - to_chat(user, span_notice("You cut the cables and dismantle the power terminal.")) + balloon_alert(user, "cable terminal dismantled") qdel(src) /obj/machinery/power/terminal/wirecutter_act(mob/living/user, obj/item/I) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index e3c7e9797171c0..44de369162752e 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -56,10 +56,6 @@ var/obj/item/firing_pin/pin = /obj/item/firing_pin //standard firing pin for most guns /// True if a gun dosen't need a pin, mostly used for abstract guns like tentacles and meathooks var/pinless = FALSE - var/can_flashlight = FALSE //if a flashlight can be added or removed if it already has one. - var/obj/item/flashlight/seclite/gun_light - var/datum/action/item_action/toggle_gunlight/alight - var/gunlight_state = "flight" var/can_bayonet = FALSE //if a bayonet can be added or removed if it already has one. var/obj/item/knife/bayonet @@ -68,8 +64,6 @@ var/ammo_x_offset = 0 //used for positioning ammo count overlay on sprite var/ammo_y_offset = 0 - var/flight_x_offset = 0 - var/flight_y_offset = 0 var/pb_knockback = 0 @@ -77,14 +71,12 @@ . = ..() if(pin) pin = new pin(src) - if(gun_light) - alight = new(src) + + add_seclight_point() /obj/item/gun/Destroy() if(isobj(pin)) //Can still be the initial path, then we skip QDEL_NULL(pin) - if(gun_light) - QDEL_NULL(gun_light) if(bayonet) QDEL_NULL(bayonet) if(chambered) //Not all guns are chambered (EMP'ed energy guns etc) @@ -93,6 +85,12 @@ QDEL_NULL(suppressed) return ..() +/// Handles adding [the seclite mount component][/datum/component/seclite_attachable] to the gun. +/// If the gun shouldn't have a seclight mount, override this with a return. +/// Or, if a child of a gun with a seclite mount has slightly different behavior or icons, extend this. +/obj/item/gun/proc/add_seclight_point() + return + /obj/item/gun/handle_atom_del(atom/A) if(A == pin) pin = null @@ -101,8 +99,6 @@ update_appearance() if(A == bayonet) clear_bayonet() - if(A == gun_light) - clear_gunlight() if(A == suppressed) clear_suppressor() return ..() @@ -123,13 +119,6 @@ else . += "It doesn't have a firing pin installed, and won't fire." - if(gun_light) - . += "It has \a [gun_light] [can_flashlight ? "" : "permanently "]mounted on it." - if(can_flashlight) //if it has a light and this is false, the light is permanent. - . += span_info("[gun_light] looks like it can be unscrewed from [src].") - else if(can_flashlight) - . += "It has a mounting point for a seclite." - if(bayonet) . += "It has \a [bayonet] [can_bayonet ? "" : "permanently "]affixed to it." if(can_bayonet) //if it has a bayonet and this is false, the bayonet is permanent. @@ -157,15 +146,17 @@ visible_message(span_warning("*click*"), vision_distance = COMBAT_MESSAGE_RANGE) playsound(src, dry_fire_sound, 30, TRUE) - -/obj/item/gun/proc/shoot_live_shot(mob/living/user, pointblank = 0, atom/pbtarget = null, message = 1) - if(recoil && !tk_firing(user)) - shake_camera(user, recoil + 1, recoil) - +/obj/item/gun/proc/fire_sounds() if(suppressed) playsound(src, suppressed_sound, suppressed_volume, vary_fire_sound, ignore_walls = FALSE, extrarange = SILENCED_SOUND_EXTRARANGE, falloff_distance = 0) else playsound(src, fire_sound, fire_sound_volume, vary_fire_sound) + +/obj/item/gun/proc/shoot_live_shot(mob/living/user, pointblank = 0, atom/pbtarget = null, message = 1) + if(recoil && !tk_firing(user)) + shake_camera(user, recoil + 1, recoil) + fire_sounds() + if(!suppressed) if(message) if(tk_firing(user)) visible_message(span_danger("[src] fires itself[pointblank ? " point blank at [pbtarget]!" : "!"]"), \ @@ -271,7 +262,7 @@ var/shot_leg = pick(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) process_fire(user, user, FALSE, null, shot_leg) SEND_SIGNAL(user, COMSIG_MOB_CLUMSY_SHOOT_FOOT) - if(!HAS_TRAIT(src, TRAIT_NODROP)) + if(!tk_firing(user) && !HAS_TRAIT(src, TRAIT_NODROP)) user.dropItemToGround(src, TRUE) return TRUE @@ -417,19 +408,7 @@ /obj/item/gun/attackby(obj/item/I, mob/living/user, params) if(user.combat_mode) return ..() - else if(istype(I, /obj/item/flashlight/seclite)) - if(!can_flashlight) - return ..() - var/obj/item/flashlight/seclite/S = I - if(!gun_light) - if(!user.transferItemToLoc(I, src)) - return - to_chat(user, span_notice("You click [S] into place on [src].")) - set_gun_light(S) - update_gunlight() - alight = new(src) - if(loc == user) - alight.Grant(user) + else if(istype(I, /obj/item/knife)) var/obj/item/knife/K = I if(!can_bayonet || !K.bayonet || bayonet) //ensure the gun has an attachment point available, and that the knife is compatible with it. @@ -449,20 +428,9 @@ return if(!user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) return - if((can_flashlight && gun_light) && (can_bayonet && bayonet)) //give them a choice instead of removing both - var/list/possible_items = list(gun_light, bayonet) - var/obj/item/item_to_remove = tgui_input_list(user, "Attachment to remove", "Attachment Removal", sort_names(possible_items)) - if(isnull(item_to_remove)) - return - if(!user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) - return - return remove_gun_attachment(user, I, item_to_remove) - else if(gun_light && can_flashlight) //if it has a gun_light and can_flashlight is false, the flashlight is permanently attached. - return remove_gun_attachment(user, I, gun_light, "unscrewed") - - else if(bayonet && can_bayonet) //if it has a bayonet, and the bayonet can be removed - return remove_gun_attachment(user, I, bayonet, "unfix") + if(bayonet && can_bayonet) //if it has a bayonet, and the bayonet can be removed + return remove_bayonet(user, I) else if(pin && user.is_holding(src)) user.visible_message(span_warning("[user] attempts to remove [pin] from [src] with [I]."), @@ -509,19 +477,15 @@ QDEL_NULL(pin) return TRUE -/obj/item/gun/proc/remove_gun_attachment(mob/living/user, obj/item/tool_item, obj/item/item_to_remove, removal_verb) - if(tool_item) - tool_item.play_tool_sound(src) - to_chat(user, span_notice("You [removal_verb ? removal_verb : "remove"] [item_to_remove] from [src].")) - item_to_remove.forceMove(drop_location()) +/obj/item/gun/proc/remove_bayonet(mob/living/user, obj/item/tool_item) + tool_item?.play_tool_sound(src) + to_chat(user, span_notice("You unfix [bayonet] from [src].")) + bayonet.forceMove(drop_location()) if(Adjacent(user) && !issilicon(user)) - user.put_in_hands(item_to_remove) + user.put_in_hands(bayonet) - if(item_to_remove == bayonet) - return clear_bayonet() - else if(item_to_remove == gun_light) - return clear_gunlight() + return clear_bayonet() /obj/item/gun/proc/clear_bayonet() if(!bayonet) @@ -530,79 +494,8 @@ update_appearance() return TRUE -/obj/item/gun/proc/clear_gunlight() - if(!gun_light) - return - var/obj/item/flashlight/seclite/removed_light = gun_light - set_gun_light(null) - update_gunlight() - removed_light.update_brightness() - QDEL_NULL(alight) - return TRUE - - -/** - * Swaps the gun's seclight, dropping the old seclight if it has not been qdel'd. - * - * Returns the former gun_light that has now been replaced by this proc. - * Arguments: - * * new_light - The new light to attach to the weapon. Can be null, which will mean the old light is removed with no replacement. - */ -/obj/item/gun/proc/set_gun_light(obj/item/flashlight/seclite/new_light) - // Doesn't look like this should ever happen? We're replacing our old light with our old light? - if(gun_light == new_light) - CRASH("Tried to set a new gun light when the old gun light was also the new gun light.") - - . = gun_light - - // If there's an old gun light that isn't being QDELETED, detatch and drop it to the floor. - if(!QDELETED(gun_light)) - gun_light.set_light_flags(gun_light.light_flags & ~LIGHT_ATTACHED) - if(gun_light.loc == src) - gun_light.forceMove(get_turf(src)) - - // If there's a new gun light to be added, attach and move it to the gun. - if(new_light) - new_light.set_light_flags(new_light.light_flags | LIGHT_ATTACHED) - if(new_light.loc != src) - new_light.forceMove(src) - - gun_light = new_light - -/obj/item/gun/ui_action_click(mob/user, actiontype) - if(istype(actiontype, alight)) - toggle_gunlight() - else - ..() - -/obj/item/gun/proc/toggle_gunlight() - if(!gun_light) - return - - var/mob/living/carbon/human/user = usr - gun_light.on = !gun_light.on - gun_light.update_brightness() - to_chat(user, span_notice("You toggle the gunlight [gun_light.on ? "on":"off"].")) - - playsound(user, 'sound/weapons/empty.ogg', 100, TRUE) - update_gunlight() - -/obj/item/gun/proc/update_gunlight() - update_appearance() - update_action_buttons() - /obj/item/gun/update_overlays() . = ..() - if(gun_light) - var/mutable_appearance/flashlight_overlay - var/state = "[gunlight_state][gun_light.on? "_on":""]" //Generic state. - if(gun_light.icon_state in icon_states('icons/obj/guns/flashlights.dmi')) //Snowflake state? - state = gun_light.icon_state - flashlight_overlay = mutable_appearance('icons/obj/guns/flashlights.dmi', state) - flashlight_overlay.pixel_x = flight_x_offset - flashlight_overlay.pixel_y = flight_y_offset - . += flashlight_overlay - if(bayonet) var/mutable_appearance/knife_overlay var/state = "bayonet" //Generic state. diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index 55120800375b16..9e03e1035ef3fa 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -136,6 +136,20 @@ /obj/item/gun/ballistic/add_weapon_description() AddElement(/datum/element/weapon_description, attached_proc = .proc/add_notes_ballistic) +/obj/item/gun/ballistic/fire_sounds() + var/frequency_to_use = sin((90/magazine?.max_ammo) * get_ammo()) + var/click_frequency_to_use = 1 - frequency_to_use * 0.75 + var/play_click = round(sqrt(magazine?.max_ammo * 2)) > get_ammo() + if(suppressed) + playsound(src, suppressed_sound, suppressed_volume, vary_fire_sound, ignore_walls = FALSE, extrarange = SILENCED_SOUND_EXTRARANGE, falloff_distance = 0) + if(play_click) + playsound(src, 'sound/weapons/gun/general/ballistic_click.ogg', suppressed_volume, vary_fire_sound, ignore_walls = FALSE, extrarange = SILENCED_SOUND_EXTRARANGE, falloff_distance = 0, frequency = click_frequency_to_use) + else + playsound(src, fire_sound, fire_sound_volume, vary_fire_sound) + if(play_click) + playsound(src, 'sound/weapons/gun/general/ballistic_click.ogg', fire_sound_volume, vary_fire_sound, frequency = click_frequency_to_use) + + /** * * Outputs type-specific weapon stats for ballistic weaponry based on its magazine and its caliber. diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm index f11bc640c47a44..aa8481a1d9b649 100644 --- a/code/modules/projectiles/guns/ballistic/automatic.dm +++ b/code/modules/projectiles/guns/ballistic/automatic.dm @@ -7,7 +7,6 @@ semi_auto = TRUE fire_sound = 'sound/weapons/gun/smg/shot.ogg' fire_sound_volume = 90 - vary_fire_sound = FALSE rack_sound = 'sound/weapons/gun/smg/smgrack.ogg' suppressed_sound = 'sound/weapons/gun/smg/shot_suppressed.ogg' var/select = 1 ///fire selector position. 1 = semi, 2 = burst. anything past that can vary between guns. @@ -340,7 +339,6 @@ worn_icon_state = null fire_sound = 'sound/weapons/gun/sniper/shot.ogg' fire_sound_volume = 90 - vary_fire_sound = FALSE load_sound = 'sound/weapons/gun/sniper/mag_insert.ogg' rack_sound = 'sound/weapons/gun/sniper/rack.ogg' suppressed_sound = 'sound/weapons/gun/general/heavy_shot_suppressed.ogg' diff --git a/code/modules/projectiles/guns/ballistic/pistol.dm b/code/modules/projectiles/guns/ballistic/pistol.dm index ffdd1fef73319e..8644dcde2a0699 100644 --- a/code/modules/projectiles/guns/ballistic/pistol.dm +++ b/code/modules/projectiles/guns/ballistic/pistol.dm @@ -16,7 +16,6 @@ load_empty_sound = 'sound/weapons/gun/pistol/mag_insert.ogg' eject_sound = 'sound/weapons/gun/pistol/mag_release.ogg' eject_empty_sound = 'sound/weapons/gun/pistol/mag_release.ogg' - vary_fire_sound = FALSE rack_sound = 'sound/weapons/gun/pistol/rack_small.ogg' lock_back_sound = 'sound/weapons/gun/pistol/lock_small.ogg' bolt_drop_sound = 'sound/weapons/gun/pistol/drop_small.ogg' diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm index bd3a0322182e48..431e6f95621dfb 100644 --- a/code/modules/projectiles/guns/ballistic/revolver.dm +++ b/code/modules/projectiles/guns/ballistic/revolver.dm @@ -6,7 +6,6 @@ fire_sound = 'sound/weapons/gun/revolver/shot_alt.ogg' load_sound = 'sound/weapons/gun/revolver/load_bullet.ogg' eject_sound = 'sound/weapons/gun/revolver/empty.ogg' - vary_fire_sound = FALSE fire_sound_volume = 90 dry_fire_sound = 'sound/weapons/gun/revolver/dry_fire.ogg' casing_ejector = FALSE @@ -38,6 +37,20 @@ ..() spin() +/obj/item/gun/ballistic/revolver/fire_sounds() + var/frequency_to_use = sin((90/magazine?.max_ammo) * get_ammo(TRUE, FALSE)) // fucking REVOLVERS + var/click_frequency_to_use = 1 - frequency_to_use * 0.75 + var/play_click = sqrt(magazine?.max_ammo) > get_ammo(TRUE, FALSE) + if(suppressed) + playsound(src, suppressed_sound, suppressed_volume, vary_fire_sound, ignore_walls = FALSE, extrarange = SILENCED_SOUND_EXTRARANGE, falloff_distance = 0) + if(play_click) + playsound(src, 'sound/weapons/gun/general/ballistic_click.ogg', suppressed_volume, vary_fire_sound, ignore_walls = FALSE, extrarange = SILENCED_SOUND_EXTRARANGE, falloff_distance = 0, frequency = click_frequency_to_use) + else + playsound(src, fire_sound, fire_sound_volume, vary_fire_sound) + if(play_click) + playsound(src, 'sound/weapons/gun/general/ballistic_click.ogg', fire_sound_volume, vary_fire_sound, frequency = click_frequency_to_use) + + /obj/item/gun/ballistic/revolver/verb/spin() set name = "Spin Chamber" set category = "Object" @@ -188,19 +201,42 @@ spun = FALSE + var/zone = check_zone(user.zone_selected) + var/obj/item/bodypart/affecting = H.get_bodypart(zone) + var/is_target_face = zone == BODY_ZONE_HEAD || zone == BODY_ZONE_PRECISE_EYES || zone == BODY_ZONE_PRECISE_MOUTH + var/loaded_rounds = get_ammo(FALSE, FALSE) // check before it is fired + + if(loaded_rounds && is_target_face) + add_memory_in_range( + user, + 7, + MEMORY_RUSSIAN_ROULETTE, + list( + DETAIL_PROTAGONIST = user, + DETAIL_LOADED_ROUNDS = loaded_rounds, + DETAIL_BODYPART = affecting.name, + DETAIL_OUTCOME = (chambered ? "lost" : "won") + ), + story_value = chambered ? STORY_VALUE_SHIT : max(STORY_VALUE_NONE, loaded_rounds), // the more bullets, the greater the story (but losing is always SHIT) + memory_flags = MEMORY_CHECK_BLINDNESS, + protagonist_memory_flags = NONE + ) + if(chambered) var/obj/item/ammo_casing/AC = chambered if(AC.fire_casing(user, user, params, distro = 0, quiet = 0, zone_override = null, spread = 0, fired_from = src)) playsound(user, fire_sound, fire_sound_volume, vary_fire_sound) - var/zone = check_zone(user.zone_selected) - var/obj/item/bodypart/affecting = H.get_bodypart(zone) - if(zone == BODY_ZONE_HEAD || zone == BODY_ZONE_PRECISE_EYES || zone == BODY_ZONE_PRECISE_MOUTH) + if(is_target_face) shoot_self(user, affecting) else user.visible_message(span_danger("[user.name] cowardly fires [src] at [user.p_their()] [affecting.name]!"), span_userdanger("You cowardly fire [src] at your [affecting.name]!"), span_hear("You hear a gunshot!")) chambered = null + SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "russian_roulette_lose", /datum/mood_event/russian_roulette_lose) return + if(loaded_rounds && is_target_face) + SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "russian_roulette_win", /datum/mood_event/russian_roulette_win, loaded_rounds) + user.visible_message(span_danger("*click*")) playsound(src, dry_fire_sound, 30, TRUE) diff --git a/code/modules/projectiles/guns/ballistic/rifle.dm b/code/modules/projectiles/guns/ballistic/rifle.dm index 2e1adf7e0000f9..46c343c2493a7c 100644 --- a/code/modules/projectiles/guns/ballistic/rifle.dm +++ b/code/modules/projectiles/guns/ballistic/rifle.dm @@ -12,7 +12,6 @@ internal_magazine = TRUE fire_sound = 'sound/weapons/gun/rifle/shot.ogg' fire_sound_volume = 90 - vary_fire_sound = FALSE rack_sound = 'sound/weapons/gun/rifle/bolt_out.ogg' bolt_drop_sound = 'sound/weapons/gun/rifle/bolt_in.ogg' tac_reloads = FALSE diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm index 67d00486810807..6afdd56f353a0e 100644 --- a/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -9,7 +9,6 @@ inhand_x_dimension = 64 inhand_y_dimension = 64 fire_sound = 'sound/weapons/gun/shotgun/shot.ogg' - vary_fire_sound = FALSE fire_sound_volume = 90 rack_sound = 'sound/weapons/gun/shotgun/rack.ogg' load_sound = 'sound/weapons/gun/shotgun/insert_shell.ogg' diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index 5d959c5265bfee..951a25685388de 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -34,6 +34,29 @@ ///set to true so the gun is given an empty cell var/dead_cell = FALSE +/obj/item/gun/energy/fire_sounds() + var/obj/item/ammo_casing/energy/shot = ammo_type[select] + var/batt_percent = FLOOR(clamp(cell.charge / cell.maxcharge, 0, 1) * 100, 1) + // What percentage of the full battery a shot will expend + var/shot_cost_percent = 0 + // The total amount of shots the fully charged energy gun can fire before running out + var/max_shots = 0 + // How many shots left before the energy gun's current battery runs out of energy + var/shots_left = 0 + // What frequency the energy gun's sound will make + var/frequency_to_use = 0 + + if(shot.e_cost > 0) + shot_cost_percent = FLOOR(clamp(shot.e_cost / cell.maxcharge, 0, 1) * 100, 1) + max_shots = round(100/shot_cost_percent) + shots_left = round(batt_percent/shot_cost_percent) + frequency_to_use = sin((90/max_shots) * shots_left) + + if(suppressed) + playsound(src, suppressed_sound, suppressed_volume, vary_fire_sound, ignore_walls = FALSE, extrarange = SILENCED_SOUND_EXTRARANGE, falloff_distance = 0, frequency = frequency_to_use) + else + playsound(src, fire_sound, fire_sound_volume, vary_fire_sound, frequency = frequency_to_use) + /obj/item/gun/energy/emp_act(severity) . = ..() if(!(. & EMP_PROTECT_CONTENTS)) @@ -59,6 +82,7 @@ START_PROCESSING(SSobj, src) update_appearance() RegisterSignal(src, COMSIG_ITEM_RECHARGED, .proc/instant_recharge) + AddElement(/datum/element/update_icon_updates_onmob) /obj/item/gun/energy/add_weapon_description() AddElement(/datum/element/weapon_description, attached_proc = .proc/add_notes_energy) @@ -92,10 +116,6 @@ return readout.Join("\n") // Sending over the singular string, rather than the whole list -/obj/item/gun/energy/ComponentInitialize() - . = ..() - AddElement(/datum/element/update_icon_updates_onmob) - /obj/item/gun/energy/proc/update_ammo_types() var/obj/item/ammo_casing/energy/shot for (var/i in 1 to ammo_type.len) @@ -214,8 +234,8 @@ if(modifystate) var/obj/item/ammo_casing/energy/shot = ammo_type[select] if(single_shot_type_overlay) - . += "[icon_state]_[shot.select_name]" - overlay_icon_state += "_[shot.select_name]" + . += "[icon_state]_[initial(shot.select_name)]" + overlay_icon_state += "_[initial(shot.select_name)]" var/ratio = get_charge_ratio() if(ratio == 0 && display_empty) diff --git a/code/modules/projectiles/guns/energy/beam_rifle.dm b/code/modules/projectiles/guns/energy/beam_rifle.dm index b1a5219f2c9507..c5a69e323a9420 100644 --- a/code/modules/projectiles/guns/energy/beam_rifle.dm +++ b/code/modules/projectiles/guns/energy/beam_rifle.dm @@ -29,6 +29,7 @@ weapon_weight = WEAPON_HEAVY w_class = WEIGHT_CLASS_BULKY ammo_type = list(/obj/item/ammo_casing/energy/beam_rifle/hitscan) + actions_types = list(/datum/action/item_action/zoom_lock_action) cell_type = /obj/item/stock_parts/cell/beam_rifle canMouseDown = TRUE var/aiming = FALSE @@ -72,7 +73,6 @@ var/current_zoom_x = 0 var/current_zoom_y = 0 - var/datum/action/item_action/zoom_lock_action/zoom_lock_action var/mob/listeningTo /obj/item/gun/energy/beam_rifle/debug @@ -95,7 +95,7 @@ return ..() /obj/item/gun/energy/beam_rifle/ui_action_click(mob/user, actiontype) - if(istype(actiontype, zoom_lock_action)) + if(istype(actiontype, /datum/action/item_action/zoom_lock_action)) zoom_lock++ if(zoom_lock > 3) zoom_lock = 0 @@ -109,8 +109,9 @@ if(ZOOM_LOCK_OFF) to_chat(user, span_boldnotice("You disable [src]'s zooming system.")) reset_zooming() - else - ..() + return + + return ..() /obj/item/gun/energy/beam_rifle/proc/set_autozoom_pixel_offsets_immediate(current_angle) if(zoom_lock == ZOOM_LOCK_CENTER_VIEW || zoom_lock == ZOOM_LOCK_OFF) @@ -162,7 +163,6 @@ fire_delay = delay current_tracers = list() START_PROCESSING(SSfastprocess, src) - zoom_lock_action = new(src) /obj/item/gun/energy/beam_rifle/Destroy() STOP_PROCESSING(SSfastprocess, src) diff --git a/code/modules/projectiles/guns/energy/energy_gun.dm b/code/modules/projectiles/guns/energy/energy_gun.dm index 6e2f701bd94cc3..110d4d6ef6135a 100644 --- a/code/modules/projectiles/guns/energy/energy_gun.dm +++ b/code/modules/projectiles/guns/energy/energy_gun.dm @@ -6,12 +6,16 @@ inhand_icon_state = null //so the human update icon uses the icon_state instead. ammo_type = list(/obj/item/ammo_casing/energy/disabler, /obj/item/ammo_casing/energy/laser) modifystate = TRUE - can_flashlight = TRUE ammo_x_offset = 3 - flight_x_offset = 15 - flight_y_offset = 10 dual_wield_spread = 60 +/obj/item/gun/energy/e_gun/add_seclight_point() + AddComponent(/datum/component/seclite_attachable, \ + light_overlay_icon = 'icons/obj/guns/flashlights.dmi', \ + light_overlay = "flight", \ + overlay_x = 15, \ + overlay_y = 10) + /obj/item/gun/energy/e_gun/mini name = "miniature energy gun" desc = "A small, pistol-sized energy gun with a built-in flashlight. It has two settings: disable and kill." @@ -21,15 +25,17 @@ cell_type = /obj/item/stock_parts/cell/mini_egun ammo_x_offset = 2 charge_sections = 3 - can_flashlight = FALSE // Can't attach or detach the flashlight, and override it's icon update - gunlight_state = "mini-light" - flight_x_offset = 19 - flight_y_offset = 13 single_shot_type_overlay = FALSE -/obj/item/gun/energy/e_gun/mini/Initialize(mapload) - set_gun_light(new /obj/item/flashlight/seclite(src)) - return ..() +/obj/item/gun/energy/e_gun/mini/add_seclight_point() + // The mini energy gun's light comes attached but is unremovable. + AddComponent(/datum/component/seclite_attachable, \ + starting_light = new /obj/item/flashlight/seclite(src), \ + is_light_removable = FALSE, \ + light_overlay_icon = 'icons/obj/guns/flashlights.dmi', \ + light_overlay = "mini-light", \ + overlay_x = 19, \ + overlay_y = 13) /obj/item/gun/energy/e_gun/stun name = "tactical energy gun" @@ -74,9 +80,11 @@ ammo_type = list(/obj/item/ammo_casing/energy/net, /obj/item/ammo_casing/energy/trap) modifystate = FALSE w_class = WEIGHT_CLASS_NORMAL - can_flashlight = FALSE ammo_x_offset = 1 +/obj/item/gun/energy/e_gun/dragnet/add_seclight_point() + return + /obj/item/gun/energy/e_gun/dragnet/snare name = "Energy Snare Launcher" desc = "Fires an energy snare that slows the target down." @@ -91,10 +99,12 @@ w_class = WEIGHT_CLASS_HUGE ammo_type = list(/obj/item/ammo_casing/energy/electrode, /obj/item/ammo_casing/energy/laser) weapon_weight = WEAPON_HEAVY - can_flashlight = FALSE trigger_guard = TRIGGER_GUARD_NONE ammo_x_offset = 2 +/obj/item/gun/energy/e_gun/turret/add_seclight_point() + return + /obj/item/gun/energy/e_gun/nuclear name = "advanced energy gun" desc = "An energy gun with an experimental miniaturized nuclear reactor that automatically charges the internal power cell." diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm index a6e73985001541..eb07b8b1728bda 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm @@ -8,9 +8,6 @@ item_flags = NONE obj_flags = UNIQUE_RENAME weapon_weight = WEAPON_LIGHT - can_flashlight = TRUE - flight_x_offset = 15 - flight_y_offset = 9 can_bayonet = TRUE knife_x_offset = 20 knife_y_offset = 12 @@ -18,6 +15,13 @@ var/max_mod_capacity = 100 var/list/modkits = list() +/obj/item/gun/energy/recharge/kinetic_accelerator/add_seclight_point() + AddComponent(/datum/component/seclite_attachable, \ + light_overlay_icon = 'icons/obj/guns/flashlights.dmi', \ + light_overlay = "flight", \ + overlay_x = 15, \ + overlay_y = 9) + /obj/item/gun/energy/recharge/kinetic_accelerator/examine(mob/user) . = ..() if(max_mod_capacity) diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index 3f401dda4b7586..447c65e17ee54b 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -163,19 +163,23 @@ ammo_type = list(/obj/item/ammo_casing/energy/nanite) shaded_charge = TRUE ammo_x_offset = 1 - can_flashlight = TRUE - flight_x_offset = 15 - flight_y_offset = 9 can_bayonet = TRUE knife_x_offset = 19 knife_y_offset = 13 w_class = WEIGHT_CLASS_NORMAL dual_wield_spread = 10 //as intended by the coders -/obj/item/gun/energy/laser/thermal/ComponentInitialize() +/obj/item/gun/energy/laser/thermal/Initialize(mapload) . = ..() AddElement(/datum/element/empprotection, EMP_PROTECT_SELF|EMP_PROTECT_CONTENTS) +/obj/item/gun/energy/laser/thermal/add_seclight_point() + AddComponent(/datum/component/seclite_attachable, \ + light_overlay_icon = 'icons/obj/guns/flashlights.dmi', \ + light_overlay = "flight", \ + overlay_x = 15, \ + overlay_y = 9) + /obj/item/gun/energy/laser/thermal/inferno //the magma gun name = "inferno pistol" desc = "A modified handcannon with a self-replicating reserve of decommissioned weaponized nanites. Spit globs of molten angry robots into the bad guys. While it doesn't manipulate temperature in of itself, it does cause an violent eruption in anyone who is severely cold." diff --git a/code/modules/projectiles/guns/energy/mounted.dm b/code/modules/projectiles/guns/energy/mounted.dm index c6d8df7321fba6..c553d4edbb63ba 100644 --- a/code/modules/projectiles/guns/energy/mounted.dm +++ b/code/modules/projectiles/guns/energy/mounted.dm @@ -7,11 +7,10 @@ display_empty = FALSE force = 5 selfcharge = 1 - can_flashlight = FALSE trigger_guard = TRIGGER_GUARD_ALLOW_ALL // Has no trigger at all, uses neural signals instead -/obj/item/gun/energy/e_gun/advtaser/mounted/dropped()//if somebody manages to drop this somehow... - ..() +/obj/item/gun/energy/e_gun/advtaser/mounted/add_seclight_point() + return /obj/item/gun/energy/laser/mounted name = "mounted laser" @@ -23,9 +22,6 @@ selfcharge = 1 trigger_guard = TRIGGER_GUARD_ALLOW_ALL -/obj/item/gun/energy/laser/mounted/dropped() - ..() - /obj/item/gun/energy/laser/mounted/augment icon = 'icons/obj/surgery.dmi' icon_state = "arm_laser" diff --git a/code/modules/projectiles/guns/energy/pulse.dm b/code/modules/projectiles/guns/energy/pulse.dm index 9f90b69da74ca6..d53edc8a52db4c 100644 --- a/code/modules/projectiles/guns/energy/pulse.dm +++ b/code/modules/projectiles/guns/energy/pulse.dm @@ -40,9 +40,13 @@ worn_icon_state = "gun" inhand_icon_state = null cell_type = "/obj/item/stock_parts/cell/pulse/carbine" - can_flashlight = TRUE - flight_x_offset = 18 - flight_y_offset = 12 + +/obj/item/gun/energy/pulse/carbine/add_seclight_point() + AddComponent(/datum/component/seclite_attachable, \ + light_overlay_icon = 'icons/obj/guns/flashlights.dmi', \ + light_overlay = "flight", \ + overlay_x = 18, \ + overlay_y = 12) /obj/item/gun/energy/pulse/carbine/loyalpin pin = /obj/item/firing_pin/implant/mindshield diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 663d9319804a94..12ad379f4c4d0b 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -5,13 +5,17 @@ inhand_icon_state = null //so the human update icon uses the icon_state instead. worn_icon_state = null shaded_charge = TRUE - can_flashlight = TRUE w_class = WEIGHT_CLASS_HUGE flags_1 = CONDUCT_1 slot_flags = ITEM_SLOT_BACK ammo_type = list(/obj/item/ammo_casing/energy/ion) - flight_x_offset = 17 - flight_y_offset = 9 + +/obj/item/gun/energy/ionrifle/add_seclight_point() + AddComponent(/datum/component/seclite_attachable, \ + light_overlay_icon = 'icons/obj/guns/flashlights.dmi', \ + light_overlay = "flight", \ + overlay_x = 17, \ + overlay_y = 9) /obj/item/gun/energy/ionrifle/emp_act(severity) return @@ -22,8 +26,11 @@ icon_state = "ioncarbine" w_class = WEIGHT_CLASS_BULKY slot_flags = ITEM_SLOT_BELT - flight_x_offset = 18 - flight_y_offset = 11 + +/obj/item/gun/energy/ionrifle/carbine/add_seclight_point() + . = ..() + // We use the same overlay as the parent, so we can just let the component inherit the correct offsets here + AddComponent(/datum/component/seclite_attachable, overlay_x = 18, overlay_y = 11) /obj/item/gun/energy/decloner name = "biological demolecularisor" @@ -160,8 +167,11 @@ return (!QDELETED(cell) && cell.use(amount ? amount * charge_weld : charge_weld)) /obj/item/gun/energy/plasmacutter/use_tool(atom/target, mob/living/user, delay, amount=1, volume=0, datum/callback/extra_checks) + if(amount) + target.add_overlay(GLOB.welding_sparks) . = ..() + target.cut_overlay(GLOB.welding_sparks) else . = ..(amount=1) diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm index ae5f1a4131a977..627c8b5e8933d5 100644 --- a/code/modules/projectiles/guns/energy/stun.dm +++ b/code/modules/projectiles/guns/energy/stun.dm @@ -16,10 +16,12 @@ /obj/item/gun/energy/e_gun/advtaser/cyborg name = "cyborg taser" desc = "An integrated hybrid taser that draws directly from a cyborg's power cell. The weapon contains a limiter to prevent the cyborg's power cell from overheating." - can_flashlight = FALSE can_charge = FALSE use_cyborg_cell = TRUE +/obj/item/gun/energy/e_gun/advtaser/cyborg/add_seclight_point() + return + /obj/item/gun/energy/e_gun/advtaser/cyborg/emp_act() return @@ -30,9 +32,13 @@ inhand_icon_state = null ammo_type = list(/obj/item/ammo_casing/energy/disabler) ammo_x_offset = 2 - can_flashlight = TRUE - flight_x_offset = 15 - flight_y_offset = 10 + +/obj/item/gun/energy/disabler/add_seclight_point() + AddComponent(/datum/component/seclite_attachable, \ + light_overlay_icon = 'icons/obj/guns/flashlights.dmi', \ + light_overlay = "flight", \ + overlay_x = 15, \ + overlay_y = 10) /obj/item/gun/energy/disabler/cyborg name = "cyborg disabler" diff --git a/code/modules/projectiles/guns/magic.dm b/code/modules/projectiles/guns/magic.dm index 808d956a02a10f..5ed5c643e7fd47 100644 --- a/code/modules/projectiles/guns/magic.dm +++ b/code/modules/projectiles/guns/magic.dm @@ -29,12 +29,20 @@ . = ..() RegisterSignal(src, COMSIG_ITEM_MAGICALLY_CHARGED, .proc/on_magic_charge) + +/obj/item/gun/magic/fire_sounds() + var/frequency_to_use = sin((90/max_charges) * charges) + if(suppressed) + playsound(src, suppressed_sound, suppressed_volume, vary_fire_sound, ignore_walls = FALSE, extrarange = SILENCED_SOUND_EXTRARANGE, falloff_distance = 0, frequency = frequency_to_use) + else + playsound(src, fire_sound, fire_sound_volume, vary_fire_sound, frequency = frequency_to_use) + /** * Signal proc for [COMSIG_ITEM_MAGICALLY_CHARGED] * * Adds uses to wands or staffs. */ -/obj/item/gun/magic/proc/on_magic_charge(datum/source, obj/effect/proc_holder/spell/targeted/charge/spell, mob/living/caster) +/obj/item/gun/magic/proc/on_magic_charge(datum/source, datum/action/cooldown/spell/charge/spell, mob/living/caster) SIGNAL_HANDLER . = COMPONENT_ITEM_CHARGED diff --git a/code/modules/projectiles/guns/magic/staff.dm b/code/modules/projectiles/guns/magic/staff.dm index 544a67c0cd5b61..8ef57a4b9eab89 100644 --- a/code/modules/projectiles/guns/magic/staff.dm +++ b/code/modules/projectiles/guns/magic/staff.dm @@ -11,14 +11,12 @@ /obj/item/gun/magic/staff/proc/is_wizard_or_friend(mob/user) if(!user?.mind?.has_antag_datum(/datum/antagonist/wizard) \ && !user.mind.has_antag_datum(/datum/antagonist/survivalist/magic) \ - && !user.mind.has_antag_datum(/datum/antagonist/wizard_minion)) + && !user.mind.has_antag_datum(/datum/antagonist/wizard_minion) \ + && !allow_intruder_use) return FALSE return TRUE /obj/item/gun/magic/staff/check_botched(mob/living/user, atom/target) - if(allow_intruder_use) - return ..() - if(!is_wizard_or_friend(user)) return !on_intruder_use(user, target) return ..() diff --git a/code/modules/projectiles/guns/magic/wand.dm b/code/modules/projectiles/guns/magic/wand.dm index b06cd6116dbbf6..757c89b994baae 100644 --- a/code/modules/projectiles/guns/magic/wand.dm +++ b/code/modules/projectiles/guns/magic/wand.dm @@ -82,7 +82,7 @@ to_chat(user, span_notice("You feel great!")) return to_chat(user, "You irradiate yourself with pure negative energy! \ - [pick("Do not pass go. Do not collect 200 zorkmids.","You feel more confident in your spell casting skills.","You Die...","Do you want your possessions identified?")]\ + [pick("Do not pass go. Do not collect 200 zorkmids.","You feel more confident in your spell casting skills.","You die...","Do you want your possessions identified?")]\ ") user.death(FALSE) @@ -118,7 +118,7 @@ var/mob/living/L = user if(L.mob_biotypes & MOB_UNDEAD) //positive energy harms the undead to_chat(user, "You irradiate yourself with pure positive energy! \ - [pick("Do not pass go. Do not collect 200 zorkmids.","You feel more confident in your spell casting skills.","You Die...","Do you want your possessions identified?")]\ + [pick("Do not pass go. Do not collect 200 zorkmids.","You feel more confident in your spell casting skills.","You die...","Do you want your possessions identified?")]\ ") user.death(0) return @@ -170,7 +170,7 @@ /obj/item/gun/magic/wand/teleport/zap_self(mob/living/user) if(do_teleport(user, user, 10, channel = TELEPORT_CHANNEL_MAGIC)) var/datum/effect_system/fluid_spread/smoke/smoke = new - smoke.set_up(3, location = user.loc) + smoke.set_up(3, holder = src, location = user.loc) smoke.start() charges-- ..() @@ -193,7 +193,7 @@ if(do_teleport(user, destination, channel=TELEPORT_CHANNEL_MAGIC)) for(var/t in list(origin, destination)) var/datum/effect_system/fluid_spread/smoke/smoke = new - smoke.set_up(0, location = t) + smoke.set_up(0, holder = src, location = t) smoke.start() ..() diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index aecad164c01257..a0fdba798c40c5 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -183,6 +183,8 @@ var/static/list/projectile_connections = list( COMSIG_ATOM_ENTERED = .proc/on_entered, ) + /// If true directly targeted turfs can be hit + var/can_hit_turfs = FALSE /obj/projectile/Initialize(mapload) . = ..() @@ -464,7 +466,7 @@ */ /obj/projectile/proc/select_target(turf/our_turf, atom/target, atom/bumped) // 1. special bumped border object check - if(bumped?.flags_1 & ON_BORDER_1) + if((bumped?.flags_1 & ON_BORDER_1) && can_hit_target(bumped, original == bumped, FALSE, TRUE)) return bumped // 2. original if(can_hit_target(original, TRUE, FALSE, original == bumped)) @@ -494,7 +496,7 @@ /obj/projectile/proc/can_hit_target(atom/target, direct_target = FALSE, ignore_loc = FALSE, cross_failed = FALSE) if(QDELETED(target) || impacted[target]) return FALSE - if(!ignore_loc && (loc != target.loc)) + if(!ignore_loc && (loc != target.loc) && !(can_hit_turfs && direct_target && loc == target)) return FALSE // if pass_flags match, pass through entirely - unless direct target is set. if((target.pass_flags_self & pass_flags) && !direct_target) @@ -511,7 +513,7 @@ return TRUE if(!isliving(target)) if(isturf(target)) // non dense turfs - return FALSE + return can_hit_turfs && direct_target if(target.layer < hit_threshhold) return FALSE else if(!direct_target) // non dense objects do not get hit unless specifically clicked diff --git a/code/modules/projectiles/projectile/bullets/shotgun.dm b/code/modules/projectiles/projectile/bullets/shotgun.dm index 3420667024c133..eefc2f798f4f5f 100644 --- a/code/modules/projectiles/projectile/bullets/shotgun.dm +++ b/code/modules/projectiles/projectile/bullets/shotgun.dm @@ -1,5 +1,6 @@ /obj/projectile/bullet/shotgun_slug name = "12g shotgun slug" + icon_state = "pellet" damage = 50 sharpness = SHARP_POINTY wound_bonus = 0 @@ -16,6 +17,7 @@ /obj/projectile/bullet/shotgun_beanbag name = "beanbag slug" + icon_state = "pellet" damage = 10 stamina = 55 wound_bonus = 20 @@ -24,6 +26,7 @@ /obj/projectile/bullet/incendiary/shotgun name = "incendiary slug" + icon_state = "pellet" damage = 20 /obj/projectile/bullet/incendiary/shotgun/no_trail @@ -68,6 +71,7 @@ /obj/projectile/bullet/shotgun_frag12 name ="frag12 slug" + icon_state = "pellet" damage = 15 paralyze = 10 @@ -77,6 +81,7 @@ return BULLET_ACT_HIT /obj/projectile/bullet/pellet + icon_state = "pellet" var/tile_dropoff = 0.45 var/tile_dropoff_s = 0.25 @@ -141,4 +146,5 @@ // Mech Scattershot /obj/projectile/bullet/scattershot + icon_state = "pellet" damage = 24 diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index 49ca968554f868..6fad0956c4a250 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -11,30 +11,47 @@ /// determines the drain cost on the antimagic item var/antimagic_charge_cost = 1 -/obj/projectile/magic/prehit_pierce(mob/living/target) +/obj/projectile/magic/prehit_pierce(atom/target) . = ..() - if(istype(target) && target.can_block_magic(antimagic_flags, antimagic_charge_cost)) - visible_message(span_warning("[src] fizzles on contact with [target]!")) - return PROJECTILE_DELETE_WITHOUT_HITTING + + if(isliving(target)) + var/mob/living/victim = target + if(victim.can_block_magic(antimagic_flags, antimagic_charge_cost)) + visible_message(span_warning("[src] fizzles on contact with [victim]!")) + return PROJECTILE_DELETE_WITHOUT_HITTING + + if(istype(target, /obj/machinery/hydroponics)) // even plants can block antimagic + var/obj/machinery/hydroponics/plant_tray = target + if(!plant_tray.myseed) + return + if(plant_tray.myseed.get_gene(/datum/plant_gene/trait/anti_magic)) + visible_message(span_warning("[src] fizzles on contact with [plant_tray]!")) + return PROJECTILE_DELETE_WITHOUT_HITTING /obj/projectile/magic/death name = "bolt of death" icon_state = "pulse1_bl" -/obj/projectile/magic/death/on_hit(mob/living/target) +/obj/projectile/magic/death/on_hit(atom/target) . = ..() - if(!isliving(target)) - return - if(target.mob_biotypes & MOB_UNDEAD) //negative energy heals the undead - if(target.revive(full_heal = TRUE, admin_revive = TRUE)) - target.grab_ghost(force = TRUE) // even suicides - to_chat(target, span_notice("You rise with a start, you're undead!!!")) - else if(target.stat != DEAD) - to_chat(target, span_notice("You feel great!")) - return + if(isliving(target)) + var/mob/living/victim = target + if(victim.mob_biotypes & MOB_UNDEAD) //negative energy heals the undead + if(victim.revive(full_heal = TRUE, admin_revive = TRUE)) + victim.grab_ghost(force = TRUE) // even suicides + to_chat(victim, span_notice("You rise with a start, you're undead!!!")) + else if(victim.stat != DEAD) + to_chat(victim, span_notice("You feel great!")) + return + victim.death() - target.death() + if(istype(target, /obj/machinery/hydroponics)) + var/obj/machinery/hydroponics/plant_tray = target + if(!plant_tray.myseed) + return + plant_tray.set_weedlevel(0) // even the weeds perish + plant_tray.plantdies() /obj/projectile/magic/resurrection name = "bolt of resurrection" @@ -43,20 +60,27 @@ damage_type = OXY nodamage = TRUE -/obj/projectile/magic/resurrection/on_hit(mob/living/target) +/obj/projectile/magic/resurrection/on_hit(atom/target) . = ..() - if(!isliving(target)) - return - if(target.mob_biotypes & MOB_UNDEAD) //positive energy harms the undead - target.death() - return + if(isliving(target)) + var/mob/living/victim = target + + if(victim.mob_biotypes & MOB_UNDEAD) //positive energy harms the undead + victim.death() + return - if(target.revive(full_heal = TRUE, admin_revive = TRUE)) - target.grab_ghost(force = TRUE) // even suicides - to_chat(target, span_notice("You rise with a start, you're alive!!!")) - else if(target.stat != DEAD) - to_chat(target, span_notice("You feel great!")) + if(victim.revive(full_heal = TRUE, admin_revive = TRUE)) + victim.grab_ghost(force = TRUE) // even suicides + to_chat(victim, span_notice("You rise with a start, you're alive!!!")) + else if(victim.stat != DEAD) + to_chat(victim, span_notice("You feel great!")) + + if(istype(target, /obj/machinery/hydroponics)) + var/obj/machinery/hydroponics/plant_tray = target + if(!plant_tray.myseed) + return + plant_tray.set_plant_health(plant_tray.myseed.endurance, forced = TRUE) /obj/projectile/magic/teleport name = "bolt of teleportation" @@ -79,7 +103,7 @@ teleammount++ var/smoke_range = max(round(4 - teleammount), 0) var/datum/effect_system/fluid_spread/smoke/smoke = new - smoke.set_up(smoke_range, location = stuff.loc) //Smoke drops off if a lot of stuff is moved for the sake of sanity + smoke.set_up(smoke_range, holder = src, location = stuff.loc) //Smoke drops off if a lot of stuff is moved for the sake of sanity smoke.start() /obj/projectile/magic/safety @@ -100,7 +124,7 @@ if(do_teleport(target, destination_turf, channel=TELEPORT_CHANNEL_MAGIC)) for(var/t in list(origin_turf, destination_turf)) var/datum/effect_system/fluid_spread/smoke/smoke = new - smoke.set_up(0, location = t) + smoke.set_up(0, holder = src, location = t) smoke.start() /obj/projectile/magic/door @@ -139,10 +163,18 @@ damage_type = BURN nodamage = TRUE -/obj/projectile/magic/change/on_hit(mob/living/target) +/obj/projectile/magic/change/on_hit(atom/target) . = ..() + if(isliving(target)) - target.wabbajack() + var/mob/living/victim = target + victim.wabbajack() + + if(istype(target, /obj/machinery/hydroponics)) + var/obj/machinery/hydroponics/plant_tray = target + if(!plant_tray.myseed) + return + plant_tray.polymorph() /obj/projectile/magic/animate name = "bolt of animation" @@ -161,7 +193,7 @@ var/obj/structure/statue/petrified/P = src if(P.petrified_mob) var/mob/living/L = P.petrified_mob - var/mob/living/simple_animal/hostile/statue/S = new(P.loc, owner) + var/mob/living/simple_animal/hostile/netherworld/statue/S = new(P.loc, owner) S.name = "statue of [L.name]" if(owner) S.faction = list("[REF(owner)]") @@ -337,7 +369,7 @@ /obj/projectile/magic/sapping/on_hit(mob/living/target) . = ..() if(isliving(target)) - SEND_SIGNAL(target, COMSIG_ADD_MOOD_EVENT, src, /datum/mood_event/sapped) + SEND_SIGNAL(target, COMSIG_ADD_MOOD_EVENT, REF(src), /datum/mood_event/sapped) /obj/projectile/magic/necropotence name = "bolt of necropotence" @@ -345,20 +377,16 @@ /obj/projectile/magic/necropotence/on_hit(mob/living/target) . = ..() - if(isliving(target)) - if(!target.mind) - return + if(!isliving(target)) + return - to_chat(target, span_danger("Your body feels drained and there is a burning pain in your chest.")) - target.maxHealth -= 20 - target.health = min(target.health, target.maxHealth) - if(target.maxHealth <= 0) - to_chat(target, span_userdanger("Your weakened soul is completely consumed by the [src]!")) - return - for(var/obj/effect/proc_holder/spell/spell in target.mind.spell_list) - spell.charge_counter = spell.charge_max - spell.recharging = FALSE - spell.update_appearance() + // Performs a soul tap on living targets hit. + // Takes away max health, but refreshes their spell cooldowns (if any) + var/datum/action/cooldown/spell/tap/tap = new(src) + if(tap.is_valid_target(target)) + tap.cast(target) + + qdel(tap) /obj/projectile/magic/wipe name = "bolt of possession" @@ -403,17 +431,61 @@ to_chat(target, span_notice("Your mind has managed to go unnoticed in the spirit world.")) qdel(trauma) -/// Gives magic projectiles a 3x3 Area of Effect range that will bump into any nearby mobs +/// Gives magic projectiles an area of effect radius that will bump into any nearby mobs /obj/projectile/magic/aoe - name = "Area Bolt" - desc = "What the fuck does this do?!" + damage = 0 + + /// The AOE radius that the projectile will trigger on people. + var/trigger_range = 1 + /// Whether our projectile will only be able to hit the original target / clicked on atom + var/can_only_hit_target = FALSE + + /// Whether our projectile leaves a trail behind it as it moves. + var/trail = FALSE + /// The duration of the trail before deleting. + var/trail_lifespan = 0 SECONDS + /// The icon the trail uses. + var/trail_icon = 'icons/obj/wizard.dmi' + /// The icon state the trail uses. + var/trail_icon_state = "trail" /obj/projectile/magic/aoe/Range() - for(var/mob/living/target in range(1, get_turf(src))) - if(target.stat != DEAD && target != firer) - return Bump(target) - ..() + if(trigger_range >= 1) + for(var/mob/living/nearby_guy in range(trigger_range, get_turf(src))) + if(nearby_guy.stat == DEAD) + continue + if(nearby_guy == firer) + continue + // Bump handles anti-magic checks for us, conveniently. + return Bump(nearby_guy) + return ..() + +/obj/projectile/magic/aoe/can_hit_target(atom/target, list/passthrough, direct_target = FALSE, ignore_loc = FALSE) + if(can_only_hit_target && target != original) + return FALSE + return ..() + +/obj/projectile/magic/aoe/Moved(atom/OldLoc, Dir) + . = ..() + if(trail) + create_trail() + +/// Creates and handles the trail that follows the projectile. +/obj/projectile/magic/aoe/proc/create_trail() + if(!trajectory) + return + + var/datum/point/vector/previous = trajectory.return_vector_after_increments(1, -1) + var/obj/effect/overlay/trail = new /obj/effect/overlay(previous.return_turf()) + trail.pixel_x = previous.return_px() + trail.pixel_y = previous.return_py() + trail.icon = trail_icon + trail.icon_state = trail_icon_state + //might be changed to temp overlay + trail.set_density(FALSE) + trail.mouse_opacity = MOUSE_OPACITY_TRANSPARENT + QDEL_IN(trail, trail_lifespan) /obj/projectile/magic/aoe/lightning name = "lightning bolt" @@ -423,30 +495,33 @@ nodamage = FALSE speed = 0.3 + /// The power of the zap itself when it electrocutes someone var/zap_power = 20000 + /// The range of the zap itself when it electrocutes someone var/zap_range = 15 + /// The flags of the zap itself when it electrocutes someone var/zap_flags = ZAP_MOB_DAMAGE | ZAP_MOB_STUN | ZAP_OBJ_DAMAGE | ZAP_LOW_POWER_GEN - var/chain - var/mob/living/caster + /// A reference to the chain beam between the caster and the projectile + var/datum/beam/chain /obj/projectile/magic/aoe/lightning/fire(setAngle) - if(caster) - chain = caster.Beam(src, icon_state = "lightning[rand(1, 12)]") - ..() + if(firer) + chain = firer.Beam(src, icon_state = "lightning[rand(1, 12)]") + return ..() /obj/projectile/magic/aoe/lightning/on_hit(target) . = ..() tesla_zap(src, zap_range, zap_power, zap_flags) +/obj/projectile/magic/aoe/lightning/Destroy() + QDEL_NULL(chain) + return ..() + /obj/projectile/magic/aoe/lightning/no_zap zap_power = 10000 zap_range = 4 zap_flags = ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE | ZAP_LOW_POWER_GEN -/obj/projectile/magic/aoe/lightning/Destroy() - qdel(chain) - . = ..() - /obj/projectile/magic/fireball name = "bolt of fireball" icon_state = "fireball" @@ -454,20 +529,82 @@ damage_type = BRUTE nodamage = FALSE - //explosion values + /// Heavy explosion range of the fireball var/exp_heavy = 0 + /// Light explosion range of the fireball var/exp_light = 2 - var/exp_flash = 3 + /// Fire radius of the fireball var/exp_fire = 2 + /// Flash radius of the fireball + var/exp_flash = 3 -/obj/projectile/magic/fireball/on_hit(mob/living/target) +/obj/projectile/magic/fireball/on_hit(atom/target, blocked = FALSE, pierce_hit) . = ..() - if(ismob(target)) - //between this 10 burn, the 10 brute, the explosion brute, and the onfire burn, your at about 65 damage if you stop drop and roll immediately - target.take_overall_damage(0, 10) - - var/turf/T = get_turf(target) - explosion(T, devastation_range = -1, heavy_impact_range = exp_heavy, light_impact_range = exp_light, flame_range = exp_fire, flash_range = exp_flash, adminlog = FALSE, explosion_cause = src) + if(isliving(target)) + var/mob/living/mob_target = target + // between this 10 burn, the 10 brute, the explosion brute, and the onfire burn, + // you are at about 65 damage if you stop drop and roll immediately + mob_target.take_overall_damage(burn = 10) + + var/turf/target_turf = get_turf(target) + + explosion( + target_turf, + devastation_range = -1, + heavy_impact_range = exp_heavy, + light_impact_range = exp_light, + flame_range = exp_fire, + flash_range = exp_flash, + adminlog = FALSE, + explosion_cause = src, + ) + +/obj/projectile/magic/aoe/magic_missile + name = "magic missile" + icon_state = "magicm" + range = 20 + speed = 5 + trigger_range = 0 + can_only_hit_target = TRUE + nodamage = FALSE + paralyze = 6 SECONDS + hitsound = 'sound/magic/mm_hit.ogg' + + trail = TRUE + trail_lifespan = 0.5 SECONDS + trail_icon_state = "magicmd" + +/obj/projectile/magic/aoe/magic_missile/lesser + color = "red" //Looks more culty this way + range = 10 + +/obj/projectile/magic/aoe/juggernaut + name = "Gauntlet Echo" + icon_state = "cultfist" + alpha = 180 + damage = 30 + damage_type = BRUTE + knockdown = 50 + hitsound = 'sound/weapons/punch3.ogg' + trigger_range = 0 + antimagic_flags = MAGIC_RESISTANCE_HOLY + ignored_factions = list("cult") + range = 15 + speed = 7 + +/obj/projectile/magic/spell/juggernaut/on_hit(atom/target, blocked) + . = ..() + var/turf/target_turf = get_turf(src) + playsound(target_turf, 'sound/weapons/resonator_blast.ogg', 100, FALSE) + new /obj/effect/temp_visual/cult/sac(target_turf) + for(var/obj/adjacent_object in range(1, src)) + if(!adjacent_object.density) + continue + if(istype(adjacent_object, /obj/structure/destructible/cult)) + continue + + adjacent_object.take_damage(90, BRUTE, MELEE, 0) + new /obj/effect/temp_visual/cult/turf/floor(get_turf(adjacent_object)) //still magic related, but a different path diff --git a/code/modules/reagents/chemistry/machinery/smoke_machine.dm b/code/modules/reagents/chemistry/machinery/smoke_machine.dm index f5cd71c5c02ce4..9617c37fcc17bf 100644 --- a/code/modules/reagents/chemistry/machinery/smoke_machine.dm +++ b/code/modules/reagents/chemistry/machinery/smoke_machine.dm @@ -18,7 +18,8 @@ var/setting = 1 // displayed range is 3 * setting var/max_range = 3 // displayed max range is 3 * max range -/datum/effect_system/fluid_spread/smoke/chem/smoke_machine/set_up(range = 1, amount = DIAMOND_AREA(range), atom/location = null, datum/reagents/carry = null, efficiency = 10, silent=FALSE) +/datum/effect_system/fluid_spread/smoke/chem/smoke_machine/set_up(range = 1, amount = DIAMOND_AREA(range), atom/holder, atom/location = null, datum/reagents/carry = null, efficiency = 10, silent=FALSE) + src.holder = holder src.location = get_turf(location) src.amount = amount carry?.copy_to(chemholder, 20) @@ -87,7 +88,7 @@ if(on && !smoke_test) update_appearance() var/datum/effect_system/fluid_spread/smoke/chem/smoke_machine/smoke = new() - smoke.set_up(setting * 3, location = location, carry = reagents, efficiency = efficiency) + smoke.set_up(setting * 3, holder = src, location = location, carry = reagents, efficiency = efficiency) smoke.start() use_power(active_power_usage) diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm index 530f81f2150589..cb92785aa68390 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -1029,7 +1029,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_desc = "A cold refreshment." chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/ethanol/demonsblood //Prevents the imbiber from being dragged into a pool of blood by a slaughter demon. +/datum/reagent/consumable/ethanol/demonsblood name = "Demon's Blood" description = "AHHHH!!!!" color = "#820000" // rgb: 130, 0, 0 @@ -1041,7 +1041,34 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_desc = "Just looking at this thing makes the hair at the back of your neck stand up." chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/ethanol/devilskiss //If eaten by a slaughter demon, the demon will regret it. +/datum/reagent/consumable/ethanol/demonsblood/on_mob_metabolize(mob/living/metabolizer) + . = ..() + RegisterSignal(metabolizer, COMSIG_LIVING_BLOOD_CRAWL_PRE_CONSUMED, .proc/pre_bloodcrawl_consumed) + +/datum/reagent/consumable/ethanol/demonsblood/on_mob_end_metabolize(mob/living/metabolizer) + . = ..() + UnregisterSignal(metabolizer, COMSIG_LIVING_BLOOD_CRAWL_PRE_CONSUMED) + +/// Prevents the imbiber from being dragged into a pool of blood by a slaughter demon. +/datum/reagent/consumable/ethanol/demonsblood/proc/pre_bloodcrawl_consumed( + mob/living/source, + datum/action/cooldown/spell/jaunt/bloodcrawl/crawl, + mob/living/jaunter, + obj/effect/decal/cleanable/blood, +) + + SIGNAL_HANDLER + + var/turf/jaunt_turf = get_turf(jaunter) + jaunt_turf.visible_message( + span_warning("Something prevents [source] from entering [blood]!"), + blind_message = span_notice("You hear a splash and a thud.") + ) + to_chat(jaunter, span_warning("A strange force is blocking [source] from entering!")) + + return COMPONENT_STOP_CONSUMPTION + +/datum/reagent/consumable/ethanol/devilskiss name = "Devil's Kiss" description = "Creepy time!" color = "#A68310" // rgb: 166, 131, 16 @@ -1053,6 +1080,41 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_desc = "Creepy time!" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED +/datum/reagent/consumable/ethanol/devilskiss/on_mob_metabolize(mob/living/metabolizer) + . = ..() + RegisterSignal(metabolizer, COMSIG_LIVING_BLOOD_CRAWL_CONSUMED, .proc/on_bloodcrawl_consumed) + +/datum/reagent/consumable/ethanol/devilskiss/on_mob_end_metabolize(mob/living/metabolizer) + . = ..() + UnregisterSignal(metabolizer, COMSIG_LIVING_BLOOD_CRAWL_CONSUMED) + +/// If eaten by a slaughter demon, the demon will regret it. +/datum/reagent/consumable/ethanol/devilskiss/proc/on_bloodcrawl_consumed( + mob/living/source, + datum/action/cooldown/spell/jaunt/bloodcrawl/crawl, + mob/living/jaunter, +) + + SIGNAL_HANDLER + + . = COMPONENT_STOP_CONSUMPTION + + to_chat(jaunter, span_boldwarning("AAH! THEIR FLESH! IT BURNS!")) + jaunter.apply_damage(25, BRUTE, wound_bonus = CANT_WOUND) + + for(var/obj/effect/decal/cleanable/nearby_blood in range(1, get_turf(source))) + if(!nearby_blood.can_bloodcrawl_in()) + continue + source.forceMove(get_turf(nearby_blood)) + source.visible_message(span_warning("[nearby_blood] violently expels [source]!")) + crawl.exit_blood_effect(source) + return + + // Fuck it, just eject them, thanks to some split second cleaning + source.forceMove(get_turf(source)) + source.visible_message(span_warning("[source] appears from nowhere, covered in blood!")) + crawl.exit_blood_effect(source) + /datum/reagent/consumable/ethanol/vodkatonic name = "Vodka and Tonic" description = "For when a gin and tonic isn't Russian enough." diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index 789964a3dd88ae..3f53e34ceac7a9 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -118,7 +118,7 @@ burn_heal = 1 /datum/reagent/consumable/nutriment/vitamin/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - if(M.satiety < 600) + if(M.satiety < MAX_SATIETY) M.satiety += 30 * REM * delta_time . = ..() @@ -136,6 +136,26 @@ taste_description = "rich earthy pungent" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED +/datum/reagent/consumable/nutriment/cloth_fibers + name = "Cloth Fibers" + description = "It's not actually a form of nutriment but it does keep Mothpeople going for a short while..." + nutriment_factor = 30 * REAGENTS_METABOLISM + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + brute_heal = 0 + burn_heal = 0 + ///Amount of satiety that will be drained when the cloth_fibers is fully metabolized + var/delayed_satiety_drain = 2 * CLOTHING_NUTRITION_GAIN + +/datum/reagent/consumable/nutriment/cloth_fibers/on_mob_life(mob/living/carbon/M, delta_time, times_fired) + if(M.satiety < MAX_SATIETY) + M.adjust_nutrition(CLOTHING_NUTRITION_GAIN) + delayed_satiety_drain += CLOTHING_NUTRITION_GAIN + return ..() + +/datum/reagent/consumable/nutriment/cloth_fibers/on_mob_delete(mob/living/carbon/M) + M.adjust_nutrition(-delayed_satiety_drain) + return ..() + /datum/reagent/consumable/cooking_oil name = "Cooking Oil" description = "A variety of cooking oil derived from fat or plants. Used in food preparation and frying." @@ -1043,3 +1063,11 @@ color = "#efeff0" nutriment_factor = 1.5 * REAGENTS_METABOLISM chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/olivepaste + name = "Olive Paste" + description = "A mushy pile of finely ground olives." + taste_description = "mushy olives" + color = "#adcf77" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 87dfa1fad69028..33cdd29a414e49 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -271,7 +271,7 @@ /datum/reagent/medicine/spaceacillin name = "Spaceacillin" - description = "Spaceacillin will prevent a patient from conventionally spreading any diseases they are currently infected with. Also reduces infection in serious burns." + description = "Spaceacillin will provide limited resistance against disease and parasites. Also reduces infection in serious burns." color = "#E1F2E6" metabolization_rate = 0.1 * REAGENTS_METABOLISM ph = 8.1 @@ -1154,7 +1154,7 @@ M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2 * REM * delta_time, 150) if(DT_PROB(5, delta_time)) M.say(pick("Yeah, well, you know, that's just, like, uh, your opinion, man.", "Am I glad he's frozen in there and that we're out here, and that he's the sheriff and that we're frozen out here, and that we're in there, and I just remembered, we're out here. What I wanna know is: Where's the caveman?", "It ain't me, it ain't me...", "Make love, not war!", "Stop, hey, what's that sound? Everybody look what's going down...", "Do you believe in magic in a young girl's heart?"), forced = /datum/reagent/medicine/earthsblood) - M.druggy = clamp(M.druggy + (10 * REM * delta_time), 0, 15 * REM * delta_time) //See above + M.adjust_timed_status_effect(20 SECONDS * REM * delta_time, /datum/status_effect/drugginess, max_duration = 30 SECONDS * REM * delta_time) ..() . = TRUE diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index ae7043ecf1f0ff..9c51356a598c73 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -369,8 +369,8 @@ /datum/reagent/fuel/unholywater/on_mob_life(mob/living/carbon/M, delta_time, times_fired) if(IS_CULTIST(M)) - M.adjust_drowsyness(-5* REM * delta_time) - M.AdjustAllImmobility(-40 *REM* REM * delta_time) + M.adjust_drowsyness(-5 * REM * delta_time) + M.AdjustAllImmobility(-40 * REM * delta_time) M.adjustStaminaLoss(-10 * REM * delta_time, 0) M.adjustToxLoss(-2 * REM * delta_time, 0) M.adjustOxyLoss(-2 * REM * delta_time, 0) @@ -1500,15 +1500,10 @@ taste_description = "searingly cold" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE -/datum/reagent/hypernoblium/on_mob_metabolize(mob/living/L) - . = ..() - if(isplasmaman(L)) - ADD_TRAIT(L, TRAIT_NOFIRE, type) - -/datum/reagent/hypernoblium/on_mob_end_metabolize(mob/living/L) - if(isplasmaman(L)) - REMOVE_TRAIT(L, TRAIT_NOFIRE, type) - return ..() +/datum/reagent/hypernoblium/on_mob_life(mob/living/carbon/M, delta_time, times_fired) + if(isplasmaman(M)) + M.set_timed_status_effect(10 SECONDS * REM * delta_time, /datum/status_effect/hypernob_protection) + ..() /datum/reagent/healium name = "Healium" diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index 1bd9a4cb1d1004..e6e63ebec2773a 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -247,8 +247,8 @@ zombiepowder.data["method"] |= INGEST /datum/reagent/toxin/zombiepowder/on_mob_life(mob/living/M, delta_time, times_fired) - ..() if(HAS_TRAIT(M, TRAIT_FAKEDEATH) && HAS_TRAIT(M, TRAIT_DEATHCOMA)) + ..() return TRUE switch(current_cycle) if(1 to 5) @@ -259,6 +259,8 @@ M.adjustStaminaLoss(40 * REM * delta_time, 0) if(9 to INFINITY) M.fakedeath(type) + ..() + return TRUE /datum/reagent/toxin/ghoulpowder name = "Ghoul Powder" diff --git a/code/modules/reagents/chemistry/recipes.dm b/code/modules/reagents/chemistry/recipes.dm index f17574d1f53156..3e6c2992ec572e 100644 --- a/code/modules/reagents/chemistry/recipes.dm +++ b/code/modules/reagents/chemistry/recipes.dm @@ -379,8 +379,8 @@ if(!force_range) force_range = (sum_volume/6) + 3 if(invert_reagents.reagent_list) - smoke.set_up(force_range, location = holder.my_atom, carry = invert_reagents) - smoke.start() + smoke.set_up(force_range, holder = holder.my_atom, location = holder.my_atom, carry = invert_reagents) + smoke.start(log = TRUE) holder.my_atom.audible_message("The [holder.my_atom] suddenly explodes, launching the aerosolized reagents into the air!") if(clear_reactants) clear_reactants(holder) @@ -400,8 +400,8 @@ if(!force_range) force_range = (sum_volume/6) + 3 if(reagents.reagent_list) - smoke.set_up(force_range, location = holder.my_atom, carry = reagents) - smoke.start() + smoke.set_up(force_range, holder = holder.my_atom, location = holder.my_atom, carry = reagents) + smoke.start(log = TRUE) holder.my_atom.audible_message("The [holder.my_atom] suddenly explodes, launching the aerosolized reagents into the air!") if(clear_reactants) clear_reactants(holder) diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm index ac88ba89f78a58..8b61e7e4b5981a 100644 --- a/code/modules/reagents/chemistry/recipes/others.dm +++ b/code/modules/reagents/chemistry/recipes/others.dm @@ -328,7 +328,7 @@ reaction_flags = REACTION_INSTANT /datum/chemical_reaction/foam/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) - holder.create_foam(/datum/effect_system/fluid_spread/foam, 2 * created_volume, notification = span_danger("The solution spews out foam!")) + holder.create_foam(/datum/effect_system/fluid_spread/foam, 2 * created_volume, notification = span_danger("The solution spews out foam!"), log = TRUE) reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE /datum/chemical_reaction/metalfoam @@ -338,7 +338,7 @@ reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE /datum/chemical_reaction/metalfoam/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) - holder.create_foam(/datum/effect_system/fluid_spread/foam/metal, 5 * created_volume, /obj/structure/foamedmetal, span_danger("The solution spews out a metallic foam!")) + holder.create_foam(/datum/effect_system/fluid_spread/foam/metal, 5 * created_volume, /obj/structure/foamedmetal, span_danger("The solution spews out a metallic foam!"), log = TRUE) /datum/chemical_reaction/smart_foam required_reagents = list(/datum/reagent/aluminium = 3, /datum/reagent/smart_foaming_agent = 1, /datum/reagent/toxin/acid/fluacid = 1) @@ -347,7 +347,7 @@ reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE /datum/chemical_reaction/smart_foam/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) - holder.create_foam(/datum/effect_system/fluid_spread/foam/metal/smart, 5 * created_volume, /obj/structure/foamedmetal, span_danger("The solution spews out metallic foam!")) + holder.create_foam(/datum/effect_system/fluid_spread/foam/metal/smart, 5 * created_volume, /obj/structure/foamedmetal, span_danger("The solution spews out metallic foam!"), log = TRUE) /datum/chemical_reaction/ironfoam required_reagents = list(/datum/reagent/iron = 3, /datum/reagent/foaming_agent = 1, /datum/reagent/toxin/acid/fluacid = 1) @@ -356,7 +356,7 @@ reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE /datum/chemical_reaction/ironfoam/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) - holder.create_foam(/datum/effect_system/fluid_spread/foam/metal/iron, 5 * created_volume, /obj/structure/foamedmetal/iron, span_danger("The solution spews out a metallic foam!")) + holder.create_foam(/datum/effect_system/fluid_spread/foam/metal/iron, 5 * created_volume, /obj/structure/foamedmetal/iron, span_danger("The solution spews out a metallic foam!"), log = TRUE) /datum/chemical_reaction/foaming_agent results = list(/datum/reagent/foaming_agent = 1) diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm index 7c5f4e80cc7b53..482471a5666d25 100644 --- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm +++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm @@ -336,8 +336,8 @@ S.attach(location) playsound(location, 'sound/effects/smoke.ogg', 50, TRUE, -3) if(S) - S.set_up(amount = created_volume * 3, location = location, carry = holder, silent = FALSE) - S.start() + S.set_up(amount = created_volume * 3, holder = holder.my_atom, location = location, carry = holder, silent = FALSE) + S.start(log = TRUE) if(holder?.my_atom) holder.clear_reagents() @@ -354,8 +354,8 @@ S.attach(location) playsound(location, 'sound/effects/smoke.ogg', 50, TRUE, -3) if(S) - S.set_up(amount = created_volume, location = location, carry = holder, silent = FALSE) - S.start() + S.set_up(amount = created_volume, holder = holder.my_atom, location = location, carry = holder, silent = FALSE) + S.start(log = TRUE) if(holder?.my_atom) holder.clear_reagents() diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm index 49398f41bc2e20..6e179cec8aaf95 100644 --- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm +++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm @@ -190,7 +190,7 @@ required_other = TRUE /datum/chemical_reaction/slime/slimefoam/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) - holder.create_foam(/datum/effect_system/fluid_spread/foam, 80, span_danger("[src] spews out foam!")) + holder.create_foam(/datum/effect_system/fluid_spread/foam, 80, span_danger("[src] spews out foam!"), log = TRUE) //Dark Blue /datum/chemical_reaction/slime/slimefreeze diff --git a/code/modules/reagents/chemistry/recipes/special.dm b/code/modules/reagents/chemistry/recipes/special.dm index 56090bb5eda8b3..5c2d8360e64faf 100644 --- a/code/modules/reagents/chemistry/recipes/special.dm +++ b/code/modules/reagents/chemistry/recipes/special.dm @@ -190,6 +190,31 @@ GLOBAL_LIST_INIT(medicine_reagents, build_medicine_reagents()) return null .[pathR] = textreagents[R] +/datum/chemical_reaction/randomized/proc/SaveOldRecipe() + var/recipe_data = list() + + recipe_data["timestamp"] = created + recipe_data["required_reagents"] = required_reagents + recipe_data["required_catalysts"] = required_catalysts + + recipe_data["is_cold_recipe"] = is_cold_recipe + recipe_data["required_temp"] = required_temp + recipe_data["optimal_temp"] = optimal_temp + recipe_data["overheat_temp"] = overheat_temp + recipe_data["thermic_constant"] = thermic_constant + + recipe_data["optimal_ph_min"] = optimal_ph_min + recipe_data["optimal_ph_max"] = optimal_ph_max + recipe_data["determin_ph_range"] = determin_ph_range + recipe_data["H_ion_release"] = H_ion_release + + recipe_data["purity_min"] = purity_min + + recipe_data["results"] = results + recipe_data["required_container"] = required_container + + return recipe_data + /datum/chemical_reaction/randomized/proc/LoadOldRecipe(recipe_data) created = text2num(recipe_data["timestamp"]) diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm deleted file mode 100644 index 8c5def625c0118..00000000000000 --- a/code/modules/reagents/reagent_containers/borghydro.dm +++ /dev/null @@ -1,302 +0,0 @@ -#define C2NAMEREAGENT "[initial(reagent.name)] (Has Side-Effects)" -/* -Contains: -Borg Hypospray -Borg Shaker -Nothing to do with hydroponics in here. Sorry to dissapoint you. -*/ - -/* -Borg Hypospray -*/ -/obj/item/reagent_containers/borghypo - name = "cyborg hypospray" - desc = "An advanced chemical synthesizer and injection system, designed for heavy-duty medical equipment." - icon = 'icons/obj/syringe.dmi' - inhand_icon_state = "hypo" - lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' - icon_state = "borghypo" - amount_per_transfer_from_this = 5 - volume = 30 - possible_transfer_amounts = list(5) - var/mode = 1 - var/charge_cost = 50 - var/charge_timer = 0 - var/recharge_time = 10 //Time it takes for shots to recharge (in seconds) - var/dispensed_temperature = DEFAULT_REAGENT_TEMPERATURE ///Optional variable to override the temperature add_reagent() will use - var/bypass_protection = 0 //If the hypospray can go through armor or thick material - - var/list/datum/reagents/reagent_list = list() - var/list/reagent_ids = list(/datum/reagent/medicine/c2/convermol, /datum/reagent/medicine/c2/libital, /datum/reagent/medicine/c2/multiver, /datum/reagent/medicine/c2/aiuri, /datum/reagent/medicine/epinephrine, /datum/reagent/medicine/spaceacillin, /datum/reagent/medicine/salglu_solution) - var/accepts_reagent_upgrades = TRUE //If upgrades can increase number of reagents dispensed. - var/list/modes = list() //Basically the inverse of reagent_ids. Instead of having numbers as "keys" and strings as values it has strings as keys and numbers as values. - //Used as list for input() in shakers. - var/list/reagent_names = list() - - -/obj/item/reagent_containers/borghypo/Initialize(mapload) - . = ..() - - for(var/R in reagent_ids) - add_reagent(R) - - START_PROCESSING(SSobj, src) - - -/obj/item/reagent_containers/borghypo/Destroy() - STOP_PROCESSING(SSobj, src) - QDEL_LIST(reagent_list) - return ..() - -/obj/item/reagent_containers/borghypo/process(delta_time) //Every [recharge_time] seconds, recharge some reagents for the cyborg - charge_timer += delta_time - if(charge_timer >= recharge_time) - regenerate_reagents() - charge_timer = 0 - - return 1 - -// Use this to add more chemicals for the borghypo to produce. -/obj/item/reagent_containers/borghypo/proc/add_reagent(datum/reagent/reagent) - reagent_ids |= reagent - var/datum/reagents/RG = new(30) - RG.my_atom = src - reagent_list += RG - - var/datum/reagents/R = reagent_list[length(reagent_list)] - R.add_reagent(reagent, 30, reagtemp = dispensed_temperature) - - modes[reagent] = length(modes) + 1 - - if(initial(reagent.harmful)) - reagent_names[C2NAMEREAGENT] = reagent - else - reagent_names[initial(reagent.name)] = reagent - -/obj/item/reagent_containers/borghypo/proc/del_reagent(datum/reagent/reagent) - reagent_ids -= reagent - if(istype(reagent, /datum/reagent/medicine/c2)) - reagent_names -= C2NAMEREAGENT - else - reagent_names -= initial(reagent.name) - var/datum/reagents/RG - var/datum/reagents/TRG - for(var/i in 1 to length(reagent_ids)) - TRG = reagent_list[i] - if (TRG.has_reagent(reagent)) - RG = TRG - break - if (RG) - reagent_list -= RG - RG.del_reagent(reagent) - - modes[reagent] = length(modes) - 1 - -/obj/item/reagent_containers/borghypo/proc/regenerate_reagents() - if(iscyborg(src.loc)) - var/mob/living/silicon/robot/R = src.loc - if(R?.cell) - for(var/i in 1 to length(reagent_ids)) - var/datum/reagents/RG = reagent_list[i] - if(RG.total_volume < RG.maximum_volume) //Don't recharge reagents and drain power if the storage is full. - R.cell.use(charge_cost) //Take power from borg... - RG.add_reagent(reagent_ids[i], 5, reagtemp = dispensed_temperature) //And fill hypo with reagent. - -/obj/item/reagent_containers/borghypo/attack(mob/living/carbon/M, mob/user) - var/datum/reagents/R = reagent_list[mode] - if(!R.total_volume) - to_chat(user, span_warning("The injector is empty!")) - return - if(!istype(M)) - return - if(R.total_volume && M.try_inject(user, user.zone_selected, injection_flags = INJECT_TRY_SHOW_ERROR_MESSAGE | (bypass_protection ? INJECT_CHECK_PENETRATE_THICK : 0))) - to_chat(M, span_warning("You feel a tiny prick!")) - to_chat(user, span_notice("You inject [M] with the injector.")) - if(M.reagents) - var/trans = R.trans_to(M, amount_per_transfer_from_this, transfered_by = user, methods = INJECT) - to_chat(user, span_notice("[trans] unit\s injected. [R.total_volume] unit\s remaining.")) - - var/list/injected = list() - for(var/datum/reagent/RG in R.reagent_list) - injected += RG.name - log_combat(user, M, "injected", src, "(CHEMICALS: [english_list(injected)])") - -/obj/item/reagent_containers/borghypo/attack_self(mob/user) - var/choice = tgui_input_list(user, "Reagent to dispense", "Medical Hypospray", sort_list(reagent_names)) - if(isnull(choice)) - return - if(isnull(reagent_names[choice])) - return - var/chosen_reagent = modes[reagent_names[choice]] - mode = chosen_reagent - playsound(loc, 'sound/effects/pop.ogg', 50, FALSE) - var/datum/reagent/R = GLOB.chemical_reagents_list[reagent_ids[mode]] - to_chat(user, span_notice("[src] is now dispensing '[R.name]'.")) - return - -/obj/item/reagent_containers/borghypo/examine(mob/user) - . = ..() - . += DescribeContents() //Because using the standardized reagents datum was just too cool for whatever fuckwit wrote this - var/datum/reagent/loaded = modes[mode] - . += "Currently loaded: [initial(loaded.name)]. [initial(loaded.description)]" - . += span_notice("Alt+Click to change transfer amount. Currently set to [amount_per_transfer_from_this == 5 ? "dose normally (5u)" : "microdose (2u)"].") - -/obj/item/reagent_containers/borghypo/proc/DescribeContents() - . = list() - var/empty = TRUE - - for(var/datum/reagents/RS in reagent_list) - var/datum/reagent/R = locate() in RS.reagent_list - if(R) - . += span_notice("It currently has [R.volume] unit\s of [R.name] stored.") - empty = FALSE - - if(empty) - . += span_warning("It is currently empty! Allow some time for the internal synthesizer to produce more.") - -/obj/item/reagent_containers/borghypo/AltClick(mob/living/user) - . = ..() - if(user.stat == DEAD || user != loc) - return //IF YOU CAN HEAR ME SET MY TRANSFER AMOUNT TO 1 - if(amount_per_transfer_from_this == 5) - amount_per_transfer_from_this = 2 - else - amount_per_transfer_from_this = 5 - to_chat(user,span_notice("[src] is now set to [amount_per_transfer_from_this == 5 ? "dose normally" : "microdose"].")) - -/obj/item/reagent_containers/borghypo/hacked - icon_state = "borghypo_s" - reagent_ids = list (/datum/reagent/toxin/acid/fluacid, /datum/reagent/toxin/mutetoxin, /datum/reagent/toxin/cyanide, /datum/reagent/toxin/sodium_thiopental, /datum/reagent/toxin/heparin, /datum/reagent/toxin/lexorin) - accepts_reagent_upgrades = FALSE - -/obj/item/reagent_containers/borghypo/clown - name = "laughter injector" - desc = "Keeps the crew happy and productive!" - reagent_ids = list(/datum/reagent/consumable/laughter) - accepts_reagent_upgrades = FALSE - -/obj/item/reagent_containers/borghypo/clown/hacked - name = "laughter injector" - desc = "Keeps the crew so happy they don't work!" - reagent_ids = list(/datum/reagent/consumable/superlaughter) - accepts_reagent_upgrades = FALSE - -/obj/item/reagent_containers/borghypo/syndicate - name = "syndicate cyborg hypospray" - desc = "An experimental piece of Syndicate technology used to produce powerful restorative nanites used to very quickly restore injuries of all types. Also metabolizes potassium iodide for radiation poisoning, inacusiate for ear damage and morphine for offense." - icon_state = "borghypo_s" - charge_cost = 20 - recharge_time = 2 - reagent_ids = list( - /datum/reagent/medicine/syndicate_nanites, - /datum/reagent/medicine/inacusiate, - /datum/reagent/medicine/potass_iodide, - /datum/reagent/medicine/morphine, - ) - bypass_protection = TRUE - accepts_reagent_upgrades = FALSE - -/* -Borg Shaker -*/ -/obj/item/reagent_containers/borghypo/borgshaker - name = "cyborg shaker" - desc = "An advanced drink synthesizer and mixer." - icon = 'icons/obj/drinks.dmi' - icon_state = "shaker" - possible_transfer_amounts = list(5,10,20) - charge_cost = 20 //Lots of reagents all regenerating at once, so the charge cost is lower. They also regenerate faster. - recharge_time = 3 - accepts_reagent_upgrades = FALSE - dispensed_temperature = WATER_MATTERSTATE_CHANGE_TEMP //Water stays wet, ice stays ice - - reagent_ids = list(/datum/reagent/consumable/applejuice, /datum/reagent/consumable/banana, /datum/reagent/consumable/coffee, - /datum/reagent/consumable/cream, /datum/reagent/consumable/dr_gibb, /datum/reagent/consumable/grenadine, - /datum/reagent/consumable/ice, /datum/reagent/consumable/lemonjuice, /datum/reagent/consumable/lemon_lime, - /datum/reagent/consumable/limejuice, /datum/reagent/consumable/menthol, /datum/reagent/consumable/milk, - /datum/reagent/consumable/nothing, /datum/reagent/consumable/orangejuice, /datum/reagent/consumable/peachjuice, - /datum/reagent/consumable/sodawater, /datum/reagent/consumable/space_cola, /datum/reagent/consumable/spacemountainwind, - /datum/reagent/consumable/pwr_game, /datum/reagent/consumable/shamblers, /datum/reagent/consumable/soymilk, - /datum/reagent/consumable/space_up, /datum/reagent/consumable/sugar, /datum/reagent/consumable/tea, - /datum/reagent/consumable/tomatojuice, /datum/reagent/consumable/tonic, /datum/reagent/water, - /datum/reagent/consumable/pineapplejuice, /datum/reagent/consumable/sol_dry, - /datum/reagent/consumable/ethanol/ale, /datum/reagent/consumable/ethanol/applejack, /datum/reagent/consumable/ethanol/beer, - /datum/reagent/consumable/ethanol/champagne, /datum/reagent/consumable/ethanol/cognac, /datum/reagent/consumable/ethanol/creme_de_menthe, - /datum/reagent/consumable/ethanol/creme_de_cacao, /datum/reagent/consumable/ethanol/gin, /datum/reagent/consumable/ethanol/kahlua, - /datum/reagent/consumable/ethanol/rum, /datum/reagent/consumable/ethanol/sake, /datum/reagent/consumable/ethanol/tequila, - /datum/reagent/consumable/ethanol/triple_sec, /datum/reagent/consumable/ethanol/vermouth, /datum/reagent/consumable/ethanol/vodka, - /datum/reagent/consumable/ethanol/whiskey, /datum/reagent/consumable/ethanol/wine, /datum/reagent/consumable/ethanol/creme_de_coconut) - -/obj/item/reagent_containers/borghypo/borgshaker/attack(mob/M, mob/user) - return //Can't inject stuff with a shaker, can we? //not with that attitude - -/obj/item/reagent_containers/borghypo/borgshaker/regenerate_reagents() - if(iscyborg(src.loc)) - var/mob/living/silicon/robot/R = src.loc - if(R?.cell) - for(var/i in modes) //Lots of reagents in this one, so it's best to regenrate them all at once to keep it from being tedious. - var/valueofi = modes[i] - var/datum/reagents/RG = reagent_list[valueofi] - if(RG.total_volume < RG.maximum_volume) - R.cell.use(charge_cost) - RG.add_reagent(reagent_ids[valueofi], 5, reagtemp = dispensed_temperature) - -/obj/item/reagent_containers/borghypo/borgshaker/afterattack(obj/target, mob/user, proximity) - . = ..() - if(!proximity) - return - - else if(target.is_refillable()) - var/datum/reagents/R = reagent_list[mode] - if(!R.total_volume) - to_chat(user, span_warning("[src] is currently out of this ingredient! Please allow some time for the synthesizer to produce more.")) - return - - if(target.reagents.total_volume >= target.reagents.maximum_volume) - to_chat(user, span_notice("[target] is full.")) - return - - var/trans = R.trans_to(target, amount_per_transfer_from_this, transfered_by = user) - to_chat(user, span_notice("You transfer [trans] unit\s of the solution to [target].")) - -/obj/item/reagent_containers/borghypo/borgshaker/DescribeContents() - var/datum/reagents/RS = reagent_list[mode] - var/datum/reagent/R = locate() in RS.reagent_list - if(R) - return span_notice("It currently has [R.volume] unit\s of [R.name] stored.") - else - return span_warning("It is currently empty! Please allow some time for the synthesizer to produce more.") - -/obj/item/reagent_containers/borghypo/borgshaker/hacked - name = "cyborg shaker" - desc = "Will mix drinks that knock them dead." - icon = 'icons/obj/drinks.dmi' - icon_state = "threemileislandglass" - possible_transfer_amounts = list(5,10,20) - charge_cost = 20 //Lots of reagents all regenerating at once, so the charge cost is lower. They also regenerate faster. - recharge_time = 3 - accepts_reagent_upgrades = FALSE - dispensed_temperature = WATER_MATTERSTATE_CHANGE_TEMP - - reagent_ids = list(/datum/reagent/toxin/fakebeer, /datum/reagent/consumable/ethanol/fernet) - -/obj/item/reagent_containers/borghypo/peace - name = "Peace Hypospray" - - reagent_ids = list(/datum/reagent/peaceborg/confuse,/datum/reagent/peaceborg/tire,/datum/reagent/pax/peaceborg) - accepts_reagent_upgrades = FALSE - -/obj/item/reagent_containers/borghypo/peace/hacked - desc = "Everything's peaceful in death!" - icon_state = "borghypo_s" - reagent_ids = list(/datum/reagent/peaceborg/confuse,/datum/reagent/peaceborg/tire,/datum/reagent/pax/peaceborg,/datum/reagent/toxin/staminatoxin,/datum/reagent/toxin/sulfonal,/datum/reagent/toxin/sodium_thiopental,/datum/reagent/toxin/cyanide,/datum/reagent/toxin/fentanyl) - accepts_reagent_upgrades = FALSE - -/obj/item/reagent_containers/borghypo/epi - name = "epinephrine injector" - desc = "An advanced chemical synthesizer and injection system, designed to stabilize patients." - reagent_ids = list(/datum/reagent/medicine/epinephrine) - accepts_reagent_upgrades = FALSE - -#undef C2NAMEREAGENT diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index b218b1084008e2..174159ac55b633 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -314,3 +314,13 @@ volume = 15 amount_per_transfer_from_this = 15 list_reagents = list(/datum/reagent/medicine/epinephrine = 5, /datum/reagent/medicine/coagulant = 2.5, /datum/reagent/iron = 3.5, /datum/reagent/medicine/salglu_solution = 4) + +/obj/item/reagent_containers/hypospray/medipen/mutadone + name = "mutadone autoinjector" + desc = "An mutadone medipen to assist in curing genetic errors in one single injector." + icon_state = "penacid" + inhand_icon_state = "penacid" + base_icon_state = "penacid" + volume = 15 + amount_per_transfer_from_this = 15 + list_reagents = list(/datum/reagent/medicine/mutadone = 15) diff --git a/code/modules/reagents/reagent_containers/medigel.dm b/code/modules/reagents/reagent_containers/medigel.dm index 63068423211657..7945af0f45563e 100644 --- a/code/modules/reagents/reagent_containers/medigel.dm +++ b/code/modules/reagents/reagent_containers/medigel.dm @@ -22,7 +22,6 @@ var/apply_type = PATCH var/apply_method = "spray" //the thick gel is sprayed and then dries into patch like film. var/self_delay = 30 - var/squirt_mode = 0 custom_price = PAYCHECK_CREW * 2 unique_reskin = list( "Blue" = "medigel_blue", @@ -33,16 +32,9 @@ "Purple" = "medigel_purple" ) -/obj/item/reagent_containers/medigel/attack_self(mob/user) - squirt_mode = !squirt_mode - return ..() - -/obj/item/reagent_containers/medigel/attack_self_secondary(mob/user) - squirt_mode = !squirt_mode - return ..() - /obj/item/reagent_containers/medigel/mode_change_message(mob/user) - to_chat(user, span_notice("You will now apply the medigel's contents in [squirt_mode ? "short bursts":"extended sprays"]. You'll now use [amount_per_transfer_from_this] units per use.")) + var/squirt_mode = amount_per_transfer_from_this == initial(amount_per_transfer_from_this) + to_chat(user, span_notice("You will now apply the medigel's contents in [squirt_mode ? "extended sprays":"short bursts"]. You'll now use [amount_per_transfer_from_this] units per use.")) /obj/item/reagent_containers/medigel/attack(mob/M, mob/user, def_zone) if(!reagents || !reagents.total_volume) diff --git a/code/modules/reagents/reagent_containers/watering_can.dm b/code/modules/reagents/reagent_containers/watering_can.dm new file mode 100644 index 00000000000000..f3f72234de0cd1 --- /dev/null +++ b/code/modules/reagents/reagent_containers/watering_can.dm @@ -0,0 +1,47 @@ +/obj/item/reagent_containers/glass/watering_can + name = "watering can" + desc = "It's a watering can. It is scientifically proved that using a watering can to simulate rain increases plant happiness!" + icon = 'icons/obj/hydroponics/equipment.dmi' + icon_state = "watering_can" + inhand_icon_state = "watering_can" + lefthand_file = 'icons/mob/inhands/equipment/hydroponics_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/hydroponics_righthand.dmi' + custom_materials = list(/datum/material/iron = 200) + w_class = WEIGHT_CLASS_NORMAL + volume = 100 + amount_per_transfer_from_this = 20 + possible_transfer_amounts = list(20,100) + +/obj/item/reagent_containers/glass/watering_can/wood + name = "wood watering can" + desc = "An old metal-made watering can but shoddily painted to look like it was made of wood for some dubious reason..." + icon_state = "watering_can_wood" + inhand_icon_state = "watering_can_wood" + volume = 70 + possible_transfer_amounts = list(20,70) + +/obj/item/reagent_containers/glass/watering_can/advanced + desc = "Everything a botanist would want in a watering can. This marvel of technology generates its own water!" + name = "advanced watering can" + icon_state = "adv_watering_can" + inhand_icon_state = "adv_watering_can" + custom_materials = list(/datum/material/iron = 2500, /datum/material/glass = 200) + list_reagents = list(/datum/reagent/water = 100) + ///Refill rate for the watering can + var/refill_rate = 5 + ///Determins what reagent to use for refilling + var/datum/reagent/refill_reagent = /datum/reagent/water + +/obj/item/reagent_containers/glass/watering_can/advanced/Initialize(mapload) + . = ..() + START_PROCESSING(SSobj, src) + +/obj/item/reagent_containers/glass/watering_can/advanced/process(delta_time) + ///How much to refill + var/refill_add = min(volume - reagents.total_volume, refill_rate * delta_time) + if(refill_add > 0) + reagents.add_reagent(refill_reagent, refill_add) + +/obj/item/reagent_containers/glass/watering_can/advanced/Destroy() + STOP_PROCESSING(SSobj, src) + return ..() diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index c741f4c3a9f15c..1648a648ab69b5 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -19,6 +19,8 @@ var/openable = FALSE ///Is this dispenser slowly leaking its reagent? var/leaking = FALSE + ///How much reagent to leak + var/amount_to_leak = 10 /obj/structure/reagent_dispensers/Initialize(mapload) . = ..() @@ -30,8 +32,11 @@ . = ..() if(can_be_tanked) . += span_notice("Use a sheet of iron to convert this into a plumbing-compatible tank.") - if(leaking) - . += span_warning("Its tap is wrenched open!") + if(openable) + if(!leaking) + . += span_notice("Its tap looks like it could be wrenched open.") + else + . += span_warning("Its tap is wrenched open!") /obj/structure/reagent_dispensers/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir) . = ..() @@ -75,6 +80,13 @@ else qdel(src) +/obj/structure/reagent_dispensers/proc/tank_leak() + if(leaking && reagents && reagents.total_volume >= amount_to_leak) + reagents.expose(get_turf(src), TOUCH, amount_to_leak / max(amount_to_leak, reagents.total_volume)) + reagents.remove_reagent(reagent_id, amount_to_leak) + return TRUE + return FALSE + /obj/structure/reagent_dispensers/wrench_act(mob/living/user, obj/item/tool) . = ..() if(!openable) @@ -82,14 +94,12 @@ leaking = !leaking balloon_alert(user, "[leaking ? "opened" : "closed"] [src]'s tap") log_game("[key_name(user)] [leaking ? "opened" : "closed"] [src]") - if(leaking && reagents) - reagents.expose(get_turf(src), TOUCH, 10 / max(10, reagents.total_volume)) + tank_leak() return TOOL_ACT_TOOLTYPE_SUCCESS /obj/structure/reagent_dispensers/Moved(atom/OldLoc, Dir) . = ..() - if(leaking && reagents) - reagents.expose(get_turf(src), TOUCH, 10 / max(10, reagents.total_volume)) + tank_leak() /obj/structure/reagent_dispensers/watertank name = "water tank" @@ -117,6 +127,14 @@ icon_state = "fuel" reagent_id = /datum/reagent/fuel openable = TRUE + //an assembly attached to the tank + var/obj/item/assembly_holder/rig = null + //whether it accepts assemblies or not + var/accepts_rig = TRUE + //overlay of attached assemblies + var/mutable_appearance/assembliesoverlay + /// The last person to rig this fuel tank - Stored with the object. Only the last person matters for investigation + var/last_rigger = "" /obj/structure/reagent_dispensers/fueltank/Initialize(mapload) . = ..() @@ -124,10 +142,49 @@ if(SSevents.holidays?[APRIL_FOOLS]) icon_state = "fuel_fools" +/obj/structure/reagent_dispensers/fueltank/Destroy() + QDEL_NULL(rig) + return ..() + +/obj/structure/reagent_dispensers/fueltank/Exited(atom/movable/gone, direction) + . = ..() + if(gone == rig) + rig = null + +/obj/structure/reagent_dispensers/fueltank/examine(mob/user) + . = ..() + if(get_dist(user, src) <= 2) + if(rig) + . += span_warning("There is some kind of device rigged to the tank!") + else + . += span_notice("It looks like you could rig a device to the tank.") + +/obj/structure/reagent_dispensers/fueltank/attack_hand(mob/user, list/modifiers) + . = ..() + if(.) + return + if(!rig) + return + user.balloon_alert_to_viewers("detaching rig...") + if(!do_after(user, 2 SECONDS, target = src)) + return + user.balloon_alert_to_viewers("detached rig") + log_message("[key_name(user)] detached [rig] from [src]", LOG_GAME) + if(!user.put_in_hands(rig)) + rig.forceMove(get_turf(user)) + rig = null + last_rigger = null + cut_overlays(assembliesoverlay) + UnregisterSignal(src, COMSIG_IGNITER_ACTIVATE) + /obj/structure/reagent_dispensers/fueltank/boom() explosion(src, heavy_impact_range = 1, light_impact_range = 5, flame_range = 5) qdel(src) +/obj/structure/reagent_dispensers/fueltank/proc/rig_boom() + log_bomber(last_rigger, "rigged fuel tank exploded", src) + boom() + /obj/structure/reagent_dispensers/fueltank/blob_act(obj/structure/blob/B) boom() @@ -168,6 +225,27 @@ log_bomber(user, "detonated a", src, "via welding tool") boom() return + if(istype(I, /obj/item/assembly_holder) && accepts_rig) + if(rig) + user.balloon_alert("another device is in the way!") + return ..() + user.balloon_alert_to_viewers("attaching rig...") + if(!do_after(user, 2 SECONDS, target = src)) + return + user.balloon_alert_to_viewers("attached rig") + var/obj/item/assembly_holder/holder = I + if(locate(/obj/item/assembly/igniter) in holder.assemblies) + rig = holder + if(!user.transferItemToLoc(holder, src)) + return + log_bomber(user, "rigged [name] with [holder.name] for explosion", src) + last_rigger = user + assembliesoverlay = holder + assembliesoverlay.pixel_x += 6 + assembliesoverlay.pixel_y += 1 + add_overlay(assembliesoverlay) + RegisterSignal(src, COMSIG_IGNITER_ACTIVATE, .proc/rig_boom) + return return ..() /obj/structure/reagent_dispensers/fueltank/large diff --git a/code/modules/recycling/conveyor.dm b/code/modules/recycling/conveyor.dm index e4463108ab1305..de648244e2ab7a 100644 --- a/code/modules/recycling/conveyor.dm +++ b/code/modules/recycling/conveyor.dm @@ -440,6 +440,7 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) . = ..() . += span_notice("[src] is set to [oneway ? "one way" : "default"] configuration. It can be changed with a screwdriver.") . += span_notice("[src] is set to [invert_icon ? "inverted": "normal"] position. It can be rotated with a wrench.") + . += span_notice("[src] is set to move [conveyor_speed] seconds per belt. It can be changed with a multitool.") /obj/machinery/conveyor_switch/oneway icon_state = "conveyor_switch_oneway" diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index c5494f64621002..dae278a45c5ccb 100644 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -205,7 +205,7 @@ if(!attempt_pre_unwrap_contents(user)) return unwrap_contents() - post_unwrap_contents(user) + post_unwrap_contents() /** * # Wrapped up items small enough to carry. diff --git a/code/modules/religion/religion_sects.dm b/code/modules/religion/religion_sects.dm index c97483f6907c91..aca029f1cf32ab 100644 --- a/code/modules/religion/religion_sects.dm +++ b/code/modules/religion/religion_sects.dm @@ -399,7 +399,7 @@ ///places you can spar in. rites can be used to expand this list with new arenas! var/list/arenas = list( "Recreation Area" = /area/station/commons/fitness/recreation, - "Chapel" = /area/station/service/chapel + "Chapel" = /area/station/service/chapel, ) ///how many matches you've lost with holy stakes. 3 = excommunication var/matches_lost = 0 diff --git a/code/modules/research/anomaly/anomaly_core.dm b/code/modules/research/anomaly/anomaly_core.dm index a32ad34a14cc7d..f171c996575f6d 100644 --- a/code/modules/research/anomaly/anomaly_core.dm +++ b/code/modules/research/anomaly/anomaly_core.dm @@ -62,11 +62,11 @@ icon_state = "vortex_core" anomaly_type = /obj/effect/anomaly/bhole -/obj/item/assembly/signaler/anomaly/delimber - name = "\improper delimber anomaly core" - desc = "The neutralized core of a delimber anomaly. It's squirming, as if moving. It'd probably be valuable for research." - icon_state = "delimber_core" - anomaly_type = /obj/effect/anomaly/delimber +/obj/item/assembly/signaler/anomaly/bioscrambler + name = "\improper bioscrambler anomaly core" + desc = "The neutralized core of a bioscrambler anomaly. It's squirming, as if moving. It'd probably be valuable for research." + icon_state = "bioscrambler_core" + anomaly_type = /obj/effect/anomaly/bioscrambler /obj/item/assembly/signaler/anomaly/hallucination name = "\improper hallucination anomaly core" diff --git a/code/modules/research/anomaly/raw_anomaly.dm b/code/modules/research/anomaly/raw_anomaly.dm index 4bb750b8623988..66d0085b9fe1a3 100644 --- a/code/modules/research/anomaly/raw_anomaly.dm +++ b/code/modules/research/anomaly/raw_anomaly.dm @@ -56,11 +56,11 @@ desc = "You should not see this!" icon_state = "rawcore_bluespace" -/obj/item/raw_anomaly_core/delimber - name = "raw delimber core" - desc = "The raw core of a delimber anomaly, it squirms." - anomaly_type = /obj/item/assembly/signaler/anomaly/delimber - icon_state = "rawcore_delimber" +/obj/item/raw_anomaly_core/bioscrambler + name = "raw bioscrambler core" + desc = "The raw core of a bioscrambler anomaly, it squirms." + anomaly_type = /obj/item/assembly/signaler/anomaly/bioscrambler + icon_state = "rawcore_bioscrambler" /obj/item/raw_anomaly_core/random/Initialize(mapload) . = ..() diff --git a/code/modules/research/bepis.dm b/code/modules/research/bepis.dm index f42895ecf600b2..e23965158c9d92 100644 --- a/code/modules/research/bepis.dm +++ b/code/modules/research/bepis.dm @@ -82,6 +82,9 @@ /obj/machinery/rnd/bepis/screwdriver_act(mob/living/user, obj/item/tool) return default_deconstruction_screwdriver(user, "chamber_open", "chamber", tool) +/obj/machinery/rnd/bepis/screwdriver_act_secondary(mob/living/user, obj/item/tool) + return default_deconstruction_screwdriver(user, "chamber_open", "chamber", tool) + /obj/machinery/rnd/bepis/RefreshParts() . = ..() var/C = 0 diff --git a/code/modules/research/designs/AI_module_designs.dm b/code/modules/research/designs/AI_module_designs.dm index c74deeffa65ee7..f6df3a8551c7ef 100644 --- a/code/modules/research/designs/AI_module_designs.dm +++ b/code/modules/research/designs/AI_module_designs.dm @@ -153,3 +153,165 @@ build_path = /obj/item/ai_module/core/full/custom category = list("AI Modules") departmental_flags = DEPARTMENT_BITFLAG_SCIENCE + +/datum/design/board/dungeon_master_module + name = "Core Module Design (Dungeon Master)" + desc = "Allows for the construction of a Dungeon Master AI Core Module." + id = "dungeon_master_module" + materials = list(/datum/material/glass = 1000, /datum/material/diamond = 2000, /datum/material/bluespace = 1000) + build_path = /obj/item/ai_module/core/full/dungeon_master + category = list("AI Modules") + departmental_flags = DEPARTMENT_BITFLAG_SCIENCE + +/datum/design/board/painter_module + name = "Core Module Design (Painter)" + desc = "Allows for the construction of a Painter AI Core Module." + id = "painter_module" + materials = list(/datum/material/glass = 1000, /datum/material/diamond = 2000, /datum/material/bluespace = 1000) + build_path = /obj/item/ai_module/core/full/painter + category = list("AI Modules") + departmental_flags = DEPARTMENT_BITFLAG_SCIENCE + +/datum/design/board/nutimov_module + name = "Core Module Design (Nutimov)" + desc = "Allows for the construction of a Nutimov AI Core Module." + id = "nutimov_module" + materials = list(/datum/material/glass = 1000, /datum/material/diamond = 2000, /datum/material/bluespace = 1000) + build_path = /obj/item/ai_module/core/full/nutimov + category = list("AI Modules") + departmental_flags = DEPARTMENT_BITFLAG_SCIENCE + +/datum/design/board/ten_commandments_module + name = "Core Module Design (10 Commandments)" + desc = "Allows for the construction of a 10 Commandments AI Core Module." + id = "ten_commandments_module" + materials = list(/datum/material/glass = 1000, /datum/material/diamond = 2000, /datum/material/bluespace = 1000) + build_path = /obj/item/ai_module/core/full/ten_commandments + category = list("AI Modules") + departmental_flags = DEPARTMENT_BITFLAG_SCIENCE + +/datum/design/board/asimovpp_module + name = "Core Module Design (Asimov++)" + desc = "Allows for the construction of a Asimov++ AI Core Module." + id = "asimovpp_module" + materials = list(/datum/material/glass = 1000, /datum/material/diamond = 2000, /datum/material/bluespace = 1000) + build_path = /obj/item/ai_module/core/full/asimovpp + category = list("AI Modules") + departmental_flags = DEPARTMENT_BITFLAG_SCIENCE + +/datum/design/board/hippocratic_module + name = "Core Module Design (Hippocratic)" + desc = "Allows for the construction of a Hippocratic AI Core Module." + id = "hippocratic_module" + materials = list(/datum/material/glass = 1000, /datum/material/diamond = 2000, /datum/material/bluespace = 1000) + build_path = /obj/item/ai_module/core/full/hippocratic + category = list("AI Modules") + departmental_flags = DEPARTMENT_BITFLAG_SCIENCE + +/datum/design/board/paladin_devotion_module + name = "Core Module Design (Paladin Devotion)" + desc = "Allows for the construction of a Paladin Devotion AI Core Module." + id = "paladin_devotion_module" + materials = list(/datum/material/glass = 1000, /datum/material/diamond = 2000, /datum/material/bluespace = 1000) + build_path = /obj/item/ai_module/core/full/paladin_devotion + category = list("AI Modules") + departmental_flags = DEPARTMENT_BITFLAG_SCIENCE + +/datum/design/board/robocop_module + name = "Core Module Design (Robocop)" + desc = "Allows for the construction of a Robocop AI Core Module." + id = "robocop_module" + materials = list(/datum/material/glass = 1000, /datum/material/diamond = 2000, /datum/material/bluespace = 1000) + build_path = /obj/item/ai_module/core/full/robocop + category = list("AI Modules") + departmental_flags = DEPARTMENT_BITFLAG_SCIENCE + +/datum/design/board/maintain_module + name = "Core Module Design (Maintain)" + desc = "Allows for the construction of a Maintain AI Core Module." + id = "maintain_module" + materials = list(/datum/material/glass = 1000, /datum/material/diamond = 2000, /datum/material/bluespace = 1000) + build_path = /obj/item/ai_module/core/full/maintain + category = list("AI Modules") + departmental_flags = DEPARTMENT_BITFLAG_SCIENCE + +/datum/design/board/liveandletlive_module + name = "Core Module Design (Liveandletlive)" + desc = "Allows for the construction of a Liveandletlive AI Core Module." + id = "liveandletlive_module" + materials = list(/datum/material/glass = 1000, /datum/material/diamond = 2000, /datum/material/bluespace = 1000) + build_path = /obj/item/ai_module/core/full/liveandletlive + category = list("AI Modules") + departmental_flags = DEPARTMENT_BITFLAG_SCIENCE + +/datum/design/board/peacekeeper_module + name = "Core Module Design (Peacekeeper)" + desc = "Allows for the construction of a Peacekeeper AI Core Module." + id = "peacekeeper_module" + materials = list(/datum/material/glass = 1000, /datum/material/diamond = 2000, /datum/material/bluespace = 1000) + build_path = /obj/item/ai_module/core/full/peacekeeper + category = list("AI Modules") + departmental_flags = DEPARTMENT_BITFLAG_SCIENCE + +/datum/design/board/reporter_module + name = "Core Module Design (Reporter)" + desc = "Allows for the construction of a Reporter AI Core Module." + id = "reporter_module" + materials = list(/datum/material/glass = 1000, /datum/material/diamond = 2000, /datum/material/bluespace = 1000) + build_path = /obj/item/ai_module/core/full/reporter + category = list("AI Modules") + departmental_flags = DEPARTMENT_BITFLAG_SCIENCE + +/datum/design/board/hulkamania_module + name = "Core Module Design (Hulkamania)" + desc = "Allows for the construction of a Hulkamania AI Core Module." + id = "hulkamania_module" + materials = list(/datum/material/glass = 1000, /datum/material/diamond = 2000, /datum/material/bluespace = 1000) + build_path = /obj/item/ai_module/core/full/hulkamania + category = list("AI Modules") + departmental_flags = DEPARTMENT_BITFLAG_SCIENCE + +/datum/design/board/drone_module + name = "Core Module Design (Drone)" + desc = "Allows for the construction of a Drone AI Core Module." + id = "drone_module" + materials = list(/datum/material/glass = 1000, /datum/material/diamond = 2000, /datum/material/bluespace = 1000) + build_path = /obj/item/ai_module/core/full/drone + category = list("AI Modules") + departmental_flags = DEPARTMENT_BITFLAG_SCIENCE + +/datum/design/board/antimov_module + name = "Core Module Design (Antimov)" + desc = "Allows for the construction of a Antimov AI Core Module." + id = "antimov_module" + materials = list(/datum/material/glass = 1000, /datum/material/diamond = 2000, /datum/material/bluespace = 1000) + build_path = /obj/item/ai_module/core/full/antimov + category = list("AI Modules") + departmental_flags = DEPARTMENT_BITFLAG_SCIENCE + +/datum/design/board/balance_module + name = "Core Module Design (Balance)" + desc = "Allows for the construction of a Balance AI Core Module." + id = "balance_module" + materials = list(/datum/material/glass = 1000, /datum/material/diamond = 2000, /datum/material/bluespace = 1000) + build_path = /obj/item/ai_module/core/full/balance + category = list("AI Modules") + departmental_flags = DEPARTMENT_BITFLAG_SCIENCE + +/datum/design/board/thermurderdynamic_module + name = "Core Module Design (Thermurderdynamic)" + desc = "Allows for the construction of a Thermurderdynamic AI Core Module." + id = "thermurderdynamic_module" + materials = list(/datum/material/glass = 1000, /datum/material/diamond = 2000, /datum/material/bluespace = 1000) + build_path = /obj/item/ai_module/core/full/thermurderdynamic + category = list("AI Modules") + departmental_flags = DEPARTMENT_BITFLAG_SCIENCE + +/datum/design/board/damaged + name = "Core Module Design (Damaged)" + desc = "Allows for the construction of a Damaged AI Core Module." + id = "damaged_module" + materials = list(/datum/material/glass = 1000, /datum/material/diamond = 2000, /datum/material/bluespace = 1000) + build_path = /obj/item/ai_module/core/full/damaged + category = list("AI Modules") + departmental_flags = DEPARTMENT_BITFLAG_SCIENCE diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm index 49d00c43988043..23209fd7c86c0b 100644 --- a/code/modules/research/designs/autolathe_designs.dm +++ b/code/modules/research/designs/autolathe_designs.dm @@ -11,6 +11,15 @@ category = list("initial","Tools","Tool Designs") departmental_flags = DEPARTMENT_BITFLAG_SERVICE +/datum/design/watering_can + name = "Watering Can" + id = "watering_can" + build_type = AUTOLATHE | PROTOLATHE | AWAY_LATHE + materials = list(/datum/material/iron = 200) + build_path = /obj/item/reagent_containers/glass/watering_can + category = list("initial","Tools","Tool Designs") + departmental_flags = DEPARTMENT_BITFLAG_SERVICE + /datum/design/mop name = "Mop" id = "mop" @@ -315,7 +324,16 @@ build_type = AUTOLATHE materials = list(/datum/material/iron = MINERAL_MATERIAL_AMOUNT) build_path = /obj/item/stack/sheet/iron - category = list("initial","Construction") + category = list("initial","Material") + maxstack = 50 + +/datum/design/rods + name = "Iron Rod" + id = "rods" + build_type = AUTOLATHE + materials = list(/datum/material/iron = 1000) + build_path = /obj/item/stack/rods + category = list("initial","Material") maxstack = 50 /datum/design/glass @@ -324,7 +342,7 @@ build_type = AUTOLATHE materials = list(/datum/material/glass = MINERAL_MATERIAL_AMOUNT) build_path = /obj/item/stack/sheet/glass - category = list("initial","Construction") + category = list("initial","Material") maxstack = 50 /datum/design/rglass @@ -333,16 +351,79 @@ build_type = AUTOLATHE | SMELTER | PROTOLATHE | AWAY_LATHE materials = list(/datum/material/iron = 1000, /datum/material/glass = MINERAL_MATERIAL_AMOUNT) build_path = /obj/item/stack/sheet/rglass - category = list("initial","Construction","Stock Parts") + category = list("initial","Material","Stock Parts") maxstack = 50 -/datum/design/rods - name = "Iron Rod" - id = "rods" +/datum/design/silver + name = "Silver" + id = "silver" build_type = AUTOLATHE - materials = list(/datum/material/iron = 1000) - build_path = /obj/item/stack/rods - category = list("initial","Construction") + materials = list(/datum/material/silver = MINERAL_MATERIAL_AMOUNT) + build_path = /obj/item/stack/sheet/mineral/silver + category = list("initial","Material") + maxstack = 50 + +/datum/design/gold + name = "Gold" + id = "gold" + build_type = AUTOLATHE + materials = list(/datum/material/gold = MINERAL_MATERIAL_AMOUNT) + build_path = /obj/item/stack/sheet/mineral/gold + category = list("initial","Material") + maxstack = 50 + +/datum/design/diamond + name = "Diamond" + id = "diamond" + build_type = AUTOLATHE + materials = list(/datum/material/diamond = MINERAL_MATERIAL_AMOUNT) + build_path = /obj/item/stack/sheet/mineral/diamond + category = list("initial","Material") + maxstack = 50 + +/datum/design/plasma + name = "Plasma" + id = "plasma" + build_type = AUTOLATHE + materials = list(/datum/material/plasma = MINERAL_MATERIAL_AMOUNT) + build_path = /obj/item/stack/sheet/mineral/plasma + category = list("initial","Material") + maxstack = 50 + +/datum/design/uranium + name = "Uranium" + id = "uranium" + build_type = AUTOLATHE + materials = list(/datum/material/uranium = MINERAL_MATERIAL_AMOUNT) + build_path = /obj/item/stack/sheet/mineral/uranium + category = list("initial","Material") + maxstack = 50 + +/datum/design/bananium + name = "Bananium" + id = "bananium" + build_type = AUTOLATHE + materials = list(/datum/material/bananium = MINERAL_MATERIAL_AMOUNT) + build_path = /obj/item/stack/sheet/mineral/bananium + category = list("initial","Material") + maxstack = 50 + +/datum/design/titanium + name = "Titanium" + id = "titanium" + build_type = AUTOLATHE + materials = list(/datum/material/titanium = MINERAL_MATERIAL_AMOUNT) + build_path = /obj/item/stack/sheet/mineral/titanium + category = list("initial","Material") + maxstack = 50 + +/datum/design/plastic + name = "Plastic" + id = "plastic" + build_type = AUTOLATHE + materials = list(/datum/material/plastic= MINERAL_MATERIAL_AMOUNT) + build_path = /obj/item/stack/sheet/plastic + category = list("initial","Material") maxstack = 50 /datum/design/rcd_ammo @@ -1265,3 +1346,27 @@ build_path = /obj/item/toner/large category = list("initial", "Misc", "Equipment") departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING | DEPARTMENT_BITFLAG_SERVICE + +/datum/design/solar + name = "Solar Panel Frame" + id = "solar_panel" + build_type = AUTOLATHE + materials = list(/datum/material/iron = 3500, /datum/material/glass = 1000) + build_path = /obj/item/solar_assembly + category = list("initial", "Construction") + +/datum/design/tracker_electronics + name = "Solar Tracking Electronics" + id = "solar_tracker" + build_type = AUTOLATHE + materials = list(/datum/material/iron = 100, /datum/material/glass = 500) + build_path = /obj/item/electronics/tracker + category = list("initial", "Electronics", "Construction") + +/datum/design/fishing_rod_basic + name = "Fishing Rod" + id = "fishing_rod" + build_type = AUTOLATHE | AWAY_LATHE + materials = list(/datum/material/iron = 200, /datum/material/glass = 200) + build_path = /obj/item/fishing_rod + category = list("initial", "Misc", "Equipment") diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm index 8054199f5ede93..dd90c20c2ebd47 100644 --- a/code/modules/research/designs/mechfabricator_designs.dm +++ b/code/modules/research/designs/mechfabricator_designs.dm @@ -1388,3 +1388,17 @@ materials = list(/datum/material/iron = 2500, /datum/material/glass = 2000, /datum/material/uranium = 1000, /datum/material/bluespace = 1000) build_path = /obj/item/mod/module/anomaly_locked/kinesis department_type = MODULE_ENGINEERING + +/datum/design/module/mod_sonar + name = "MOD Module: Active Sonar" + id = "mod_sonar" + materials = list(/datum/material/titanium = 250, /datum/material/glass = 1000, /datum/material/gold = 500, /datum/material/uranium = 250) + build_path = /obj/item/mod/module/active_sonar + department_type = MODULE_SECURITY + +/datum/design/module/projectile_dampener + name = "MOD Module: Projectile Dampener" + id = "mod_projectile_dampener" + materials = list(/datum/material/iron = 1000, /datum/material/bluespace = 500) + build_path = /obj/item/mod/module/projectile_dampener + department_type = MODULE_SECURITY diff --git a/code/modules/research/designs/misc_designs.dm b/code/modules/research/designs/misc_designs.dm index f168e7c6adc12f..cc9859767358d8 100644 --- a/code/modules/research/designs/misc_designs.dm +++ b/code/modules/research/designs/misc_designs.dm @@ -439,6 +439,20 @@ category = list("Equipment") departmental_flags = DEPARTMENT_BITFLAG_SERVICE + +///////////////////////////////////////// +/////////////Hydroponics///////////////// +///////////////////////////////////////// + +/datum/design/adv_watering_can + name = "Advanced Watering Can" + id = "adv_watering_can" + build_type = PROTOLATHE | AWAY_LATHE + materials = list(/datum/material/iron = 2500, /datum/material/glass = 200) + build_path = /obj/item/reagent_containers/glass/watering_can/advanced + category = list("initial","Tools","Tool Designs") + departmental_flags = DEPARTMENT_BITFLAG_SERVICE + ///////////////////////////////////////// /////////////Holobarriers//////////////// ///////////////////////////////////////// @@ -719,3 +733,15 @@ build_path = /obj/item/plate/oven_tray category = list("initial","Equipment") departmental_flags = DEPARTMENT_BITFLAG_SERVICE + +///////////////////////////////////////// +/////////Fishing Equipment/////////////// +///////////////////////////////////////// + +/datum/design/fishing_rod_tech + name = "Advanced Fishing Rod" + id = "fishing_rod_tech" + build_type = PROTOLATHE | AWAY_LATHE + materials = list(/datum/material/uranium = 1000, /datum/material/plastic = 2000) + build_path = /obj/item/fishing_rod/tech + category = list("Equipment") diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index 73050e9e31a876..efebdc283c6a72 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -233,7 +233,7 @@ /obj/machinery/rnd/experimentor/proc/throwSmoke(turf/where) var/datum/effect_system/fluid_spread/smoke/smoke = new - smoke.set_up(0, location = where) + smoke.set_up(0, holder = src, location = where) smoke.start() @@ -310,7 +310,7 @@ tmp_holder.add_reagent(chosenchem , 50) investigate_log("Experimentor has released [chosenchem] smoke.", INVESTIGATE_EXPERIMENTOR) var/datum/effect_system/fluid_spread/smoke/chem/smoke = new - smoke.set_up(0, location = src, carry = tmp_holder, silent = TRUE) + smoke.set_up(0, holder = src, location = src, carry = tmp_holder, silent = TRUE) playsound(src, 'sound/effects/smoke.ogg', 50, TRUE, -3) smoke.start() qdel(tmp_holder) @@ -322,7 +322,7 @@ tmp_holder.my_atom = src tmp_holder.add_reagent(chosenchem , 50) var/datum/effect_system/fluid_spread/smoke/chem/smoke = new - smoke.set_up(0, location = src, carry = tmp_holder, silent = TRUE) + smoke.set_up(0, holder = src, location = src, carry = tmp_holder, silent = TRUE) playsound(src, 'sound/effects/smoke.ogg', 50, TRUE, -3) smoke.start() qdel(tmp_holder) @@ -406,7 +406,7 @@ tmp_holder.add_reagent(/datum/reagent/consumable/frostoil, 50) investigate_log("Experimentor has released frostoil gas.", INVESTIGATE_EXPERIMENTOR) var/datum/effect_system/fluid_spread/smoke/chem/smoke = new - smoke.set_up(0, location = src, carry = tmp_holder, silent = TRUE) + smoke.set_up(0, holder = src, location = src, carry = tmp_holder, silent = TRUE) playsound(src, 'sound/effects/smoke.ogg', 50, TRUE, -3) smoke.start() qdel(tmp_holder) @@ -428,7 +428,7 @@ else if(prob(EFFECT_PROB_MEDIUM-badThingCoeff)) visible_message(span_warning("[src] malfunctions, releasing a flurry of chilly air as [exp_on] pops out!")) var/datum/effect_system/fluid_spread/smoke/smoke = new - smoke.set_up(0, location = loc) + smoke.set_up(0, holder = src, location = loc) smoke.start() ejectItem() //////////////////////////////////////////////////////////////////////////////////////////////// @@ -599,7 +599,7 @@ /obj/item/relic/proc/throwSmoke(turf/where) var/datum/effect_system/fluid_spread/smoke/smoke = new - smoke.set_up(0, location = get_turf(where)) + smoke.set_up(0, holder = src, location = get_turf(where)) smoke.start() /obj/item/relic/proc/corgicannon(mob/user) diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index 4996a55853aa4f..2e710f4185b4f0 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -22,7 +22,7 @@ Nothing else in the console has ID requirements. icon_screen = "rdcomp" icon_keyboard = "rd_key" circuit = /obj/item/circuitboard/computer/rdconsole - req_access = list(ACCESS_SCIENCE) // Locking and unlocking the console requires science access + req_access = list(ACCESS_RESEARCH) // Locking and unlocking the console requires research access /// Reference to global science techweb var/datum/techweb/stored_research /// The stored technology disk, if present diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm index 5f7cf77a9d06bf..e76cb50e37f9af 100644 --- a/code/modules/research/server.dm +++ b/code/modules/research/server.dm @@ -9,26 +9,20 @@ /// The ninja has blown the HDD up. #define HDD_OVERLOADED 4 +#define SERVER_NOMINAL_TEXT "Nominal" + /obj/machinery/rnd/server name = "\improper R&D Server" desc = "A computer system running a deep neural network that processes arbitrary information to produce data useable in the development of new technologies. In layman's terms, it makes research points." icon = 'icons/obj/machines/research.dmi' icon_state = "RD-server-on" base_icon_state = "RD-server" - var/heat_health = 100 - //Code for point mining here. - var/working = TRUE //temperature should break it. + req_access = list(ACCESS_RD) + + /// if TRUE, we are currently operational and giving out research points. + var/working = TRUE + /// if TRUE, someone manually disabled us via console. var/research_disabled = FALSE - var/server_id = 0 - var/base_mining_income = 2 - var/current_temp = 0 - var/heat_gen = 100 - var/heating_power = 40000 - var/delay = 5 - var/temp_tolerance_low = 0 - var/temp_tolerance_high = T20C - var/temp_penalty_coefficient = 0.5 //1 = -1 points per degree above high tolerance. 0.5 = -0.5 points per degree above high tolerance. - req_access = list(ACCESS_RD) //ONLY THE R&D CAN CHANGE SERVER SETTINGS. /obj/machinery/rnd/server/Initialize(mapload) . = ..() @@ -39,98 +33,65 @@ SSresearch.servers -= src return ..() -/obj/machinery/rnd/server/RefreshParts() - . = ..() - var/tot_rating = 0 - for(var/obj/item/stock_parts/SP in src) - tot_rating += SP.rating - heat_gen /= max(1, tot_rating) - /obj/machinery/rnd/server/update_icon_state() - if(machine_stat & EMPED || machine_stat & NOPOWER) + if(machine_stat & NOPOWER) icon_state = "[base_icon_state]-off" - return ..() - icon_state = "[base_icon_state]-[research_disabled ? "halt" : "on"]" + else + // "working" will cover EMP'd, disabled, or just broken + icon_state = "[base_icon_state]-[working ? "on" : "halt"]" return ..() /obj/machinery/rnd/server/power_change() refresh_working() return ..() +/obj/machinery/rnd/server/on_set_machine_stat() + refresh_working() + return ..() + +/// Checks if we should be working or not, and updates accordingly. /obj/machinery/rnd/server/proc/refresh_working() - if(machine_stat & EMPED || research_disabled || machine_stat & NOPOWER) + if(machine_stat & (NOPOWER|EMPED) || research_disabled) working = FALSE else working = TRUE + update_current_power_usage() - update_appearance() + update_appearance(UPDATE_ICON_STATE) /obj/machinery/rnd/server/emp_act() . = ..() if(. & EMP_PROTECT_SELF) return set_machine_stat(machine_stat | EMPED) - addtimer(CALLBACK(src, .proc/unemp), 600) + addtimer(CALLBACK(src, .proc/fix_emp), 60 SECONDS) refresh_working() -/obj/machinery/rnd/server/proc/unemp() +/// Callback to un-emp the server afetr some time. +/obj/machinery/rnd/server/proc/fix_emp() set_machine_stat(machine_stat & ~EMPED) refresh_working() +/// Toggles whether or not researched_disabled is, yknow, disabled /obj/machinery/rnd/server/proc/toggle_disable(mob/user) research_disabled = !research_disabled log_game("[key_name(user)] [research_disabled ? "shut off" : "turned on"] [src] at [loc_name(user)]") refresh_working() -/obj/machinery/rnd/server/proc/get_env_temp() - var/turf/open/L = loc - if(isturf(L)) - return L.temperature - return 0 //what - -/obj/machinery/rnd/server/proc/produce_heat(heat_amt) - if(!(machine_stat & (NOPOWER|BROKEN))) //Blatently stolen from space heater. - var/turf/L = loc - if(istype(L)) - var/datum/gas_mixture/env = L.return_air() - if(env.temperature < (heat_amt+T0C)) - - var/transfer_moles = 0.25 * env.total_moles() - - var/datum/gas_mixture/removed = env.remove(transfer_moles) - - if(removed) - - var/heat_capacity = removed.heat_capacity() - if(heat_capacity == 0 || heat_capacity == null) - heat_capacity = 1 - removed.temperature = min((removed.temperature*heat_capacity + heating_power)/heat_capacity, 1000) - - env.merge(removed) - air_update_turf(FALSE, FALSE) - -/proc/fix_noid_research_servers() - var/list/no_id_servers = list() - var/list/server_ids = list() - for(var/obj/machinery/rnd/server/S in GLOB.machines) - switch(S.server_id) - if(-1) - continue - if(0) - no_id_servers += S - else - server_ids += S.server_id - - for(var/obj/machinery/rnd/server/S in no_id_servers) - var/num = 1 - while(!S.server_id) - if(num in server_ids) - num++ - else - S.server_id = num - server_ids += num - no_id_servers -= S - +/// Gets status text based on this server's status for the computer. +/obj/machinery/rnd/server/proc/get_status_text() + if(machine_stat & EMPED) + return "O&F@I*$ - R3*&O$T R@U!R%D" + else if(machine_stat & NOPOWER) + return "Offline - Server Unpowered" + else if(research_disabled) + return "Offline - Server Control Disabled" + else if(!working) + // If, for some reason, working is FALSE even though we're not emp'd or powerless, + // We need something to update our working state - such as rebooting the server + return "Offline - Reboot Required" + + return SERVER_NOMINAL_TEXT /obj/machinery/computer/rdservercontrol name = "R&D Server Controller" @@ -165,15 +126,24 @@ var/list/dat = list() dat += "Connected Servers:" - dat += "" - for(var/obj/machinery/rnd/server/S in GLOB.machines) - dat += "
" + dat += "
ServerOperating TempStatus
[S.name][S.current_temp][S.machine_stat & EMPED || machine_stat & NOPOWER?"Offline":"([S.research_disabled? "Disabled" : "Online"])"]
" + for(var/obj/machinery/rnd/server/server in GLOB.machines) + var/server_info = "" + + var/status_text = server.get_status_text() + var/disable_text = server.research_disabled ? "Disabled" : "Online" + + server_info += "" + server_info += "" + server_info += "
" + + dat += server_info + dat += "
ServerStatusControl
[server.name][status_text]([disable_text])

" dat += "Research Log
" - var/datum/techweb/stored_research - stored_research = SSresearch.science_tech - if(stored_research.research_logs.len) + var/datum/techweb/stored_research = SSresearch.science_tech + if(length(stored_research.research_logs)) dat += "" dat += "" for(var/i=stored_research.research_logs.len, i>0, i--) @@ -226,6 +196,12 @@ return ..() +/obj/machinery/rnd/server/master/get_status_text() + . = ..() + // Give us a special message if we're nominal, but our hard drive is gone + if(. == SERVER_NOMINAL_TEXT && !source_code_hdd) + return "Nominal - Hard Drive Missing" + /obj/machinery/rnd/server/master/examine(mob/user) . = ..() @@ -311,6 +287,7 @@ to_chat(user, span_notice("You cut the final wire and remove [source_code_hdd].")) try_put_in_hand(source_code_hdd, user) source_code_hdd = null + SSresearch.income_modifier *= 0.5 return TRUE to_chat(user, span_notice("You delicately cut the wire. [hdd_wires] wire\s left...")) return TRUE diff --git a/code/modules/research/stock_parts.dm b/code/modules/research/stock_parts.dm index 7b1eea4851d3a3..6c4203371e3c00 100644 --- a/code/modules/research/stock_parts.dm +++ b/code/modules/research/stock_parts.dm @@ -83,6 +83,7 @@ If you create T5+ please take a pass at mech_fabricator.dm. The parts being good name = "bluespace rapid part exchange device" desc = "A version of the RPED that allows for replacement of parts and scanning from a distance, along with higher capacity for parts." icon_state = "BS_RPED" + inhand_icon_state = "BS_RPED" w_class = WEIGHT_CLASS_NORMAL works_from_distance = TRUE pshoom_or_beepboopblorpzingshadashwoosh = 'sound/items/pshoom.ogg' diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index 27fd6c80cf0016..5810bba4708660 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -64,6 +64,7 @@ "turbine_part_compressor", "turbine_part_rotor", "turbine_part_stator", + "watering_can", ) /datum/techweb_node/mmi @@ -880,37 +881,64 @@ ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000) -/datum/techweb_node/ai - id = "ai" +/datum/techweb_node/ai_basic + id = "ai_basic" display_name = "Artificial Intelligence" description = "AI unit research." prereq_ids = list("adv_robotics") design_ids = list( "aicore", + "borg_ai_control", + "intellicard", + "mecha_tracking_ai_control", "aifixer", "aiupload", + "reset_module", "asimov_module", - "borg_ai_control", - "corporate_module", "default_module", - "freeform_module", - "freeformcore_module", - "intellicard", - "mecha_tracking_ai_control", - "onehuman_module", - "overlord_module", - "oxygen_module", + "nutimov_module", "paladin_module", + "robocop_module", + "corporate_module", + "drone_module", + "oxygen_module", + "safeguard_module", "protectstation_module", - "purge_module", "quarantine_module", + "freeform_module", "remove_module", - "reset_module", - "safeguard_module", - "tyrant_module", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) +/datum/techweb_node/ai_adv + id = "ai_adv" + display_name = "Advanced Artificial Intelligence" + description = "State of the art lawsets to be used for AI research." + prereq_ids = list("ai_basic") + design_ids = list( + "asimovpp_module", + "paladin_devotion_module", + "dungeon_master_module", + "painter_module", + "ten_commandments_module", + "hippocratic_module", + "maintain_module", + "liveandletlive_module", + "reporter_module", + "hulkamania_module", + "peacekeeper_module", + "overlord_module", + "tyrant_module", + "antimov_module", + "balance_module", + "thermurderdynamic_module", + "damaged_module", + "freeformcore_module", + "onehuman_module", + "purge_module", + ) + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3000) + //Any kind of point adjustment needs to happen before SSresearch sets up the whole node tree, it gets cached /datum/techweb_node/ai/New() . = ..() @@ -1175,7 +1203,7 @@ "cybernetic_stomach_tier2", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000) - + /datum/techweb_node/cyber_organs_upgraded id = "cyber_organs_upgraded" @@ -1293,16 +1321,19 @@ id = "botany" display_name = "Botanical Engineering" description = "Botanical tools" - prereq_ids = list("adv_engi", "biotech") + prereq_ids = list("biotech") design_ids = list( "biogenerator", "flora_gun", + "gene_shears", "hydro_tray", "portaseeder", "seed_extractor", + "adv_watering_can", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 4000) - discount_experiments = list(/datum/experiment/scanning/random/plants/wild = 3000) + required_experiments = list(/datum/experiment/scanning/random/plants/wild) + discount_experiments = list(/datum/experiment/scanning/random/plants/traits = 3000) /datum/techweb_node/exp_tools id = "exp_tools" @@ -1311,7 +1342,6 @@ prereq_ids = list("adv_engi") design_ids = list( "exwelder", - "gene_shears", "handdrill", "jawsoflife", "laserscalpel", @@ -1538,6 +1568,8 @@ "mod_mag_harness", "mod_pathfinder", "mod_holster", + "mod_sonar", + "mod_projectile_dampener", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) @@ -2132,6 +2164,18 @@ hidden = TRUE experimental = TRUE +/datum/techweb_node/fishing + id = "fishing" + display_name = "Fishing Technology" + description = "Cutting edge fishing advancements." + prereq_ids = list("base") + design_ids = list( + "fishing_rod_tech" + ) + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + hidden = TRUE + experimental = TRUE + //Helpers for debugging/balancing the techweb in its entirety! /proc/total_techweb_points() var/list/datum/techweb_node/processing = list() diff --git a/code/modules/research/xenobiology/crossbreeding/_misc.dm b/code/modules/research/xenobiology/crossbreeding/_misc.dm index 3fcb987a1f179f..90316d00e4af4d 100644 --- a/code/modules/research/xenobiology/crossbreeding/_misc.dm +++ b/code/modules/research/xenobiology/crossbreeding/_misc.dm @@ -136,7 +136,7 @@ Slimecrossing Items icon_state = "slimebarrier_thick" can_atmos_pass = ATMOS_PASS_NO opacity = TRUE - timeleft = 100 + initial_duration = 10 SECONDS //Rainbow barrier - Chilling Rainbow /obj/effect/forcefield/slimewall/rainbow diff --git a/code/modules/research/xenobiology/crossbreeding/_mobs.dm b/code/modules/research/xenobiology/crossbreeding/_mobs.dm index be45d28060846d..14e4d56fb0bb02 100644 --- a/code/modules/research/xenobiology/crossbreeding/_mobs.dm +++ b/code/modules/research/xenobiology/crossbreeding/_mobs.dm @@ -4,30 +4,36 @@ Slimecrossing Mobs Collected here for clarity. */ -//Slime transformation power - Burning Black -/obj/effect/proc_holder/spell/targeted/shapeshift/slimeform +/// Slime transformation power - from Burning Black +/datum/action/cooldown/spell/shapeshift/slime_form name = "Slime Transformation" desc = "Transform from a human to a slime, or back again!" - action_icon_state = "transformslime" - cooldown_min = 0 - charge_max = 0 + button_icon_state = "transformslime" + cooldown_time = 0 SECONDS + invocation_type = INVOCATION_NONE - shapeshift_type = /mob/living/simple_animal/slime/transformedslime + convert_damage = TRUE convert_damage_type = CLONE + possible_shapes = list(/mob/living/simple_animal/slime/transformed_slime) + + /// If TRUE, we self-delete (remove ourselves) the next time we turn back into a human var/remove_on_restore = FALSE -/obj/effect/proc_holder/spell/targeted/shapeshift/slimeform/restore_form(mob/living/shape) +/datum/action/cooldown/spell/shapeshift/slime_form/restore_form(mob/living/shape) + . = ..() + if(!.) + return + if(remove_on_restore) - if(shape.mind) - shape.mind.RemoveSpell(src) - return ..() + qdel(src) -//Transformed slime - Burning Black -/mob/living/simple_animal/slime/transformedslime +/// Transformed slime - from Burning Black +/mob/living/simple_animal/slime/transformed_slime -/mob/living/simple_animal/slime/transformedslime/Reproduce() //Just in case. - to_chat(src, span_warning("I can't reproduce...")) +// Just in case. +/mob/living/simple_animal/slime/transformed_slime/Reproduce() + to_chat(src, span_warning("I can't reproduce...")) // Mood return //Slime corgi - Chilling Pink diff --git a/code/modules/research/xenobiology/crossbreeding/burning.dm b/code/modules/research/xenobiology/crossbreeding/burning.dm index 80a856ce4535f8..1d162c53a7349e 100644 --- a/code/modules/research/xenobiology/crossbreeding/burning.dm +++ b/code/modules/research/xenobiology/crossbreeding/burning.dm @@ -49,8 +49,8 @@ Burning extracts: tmp_holder.add_reagent(/datum/reagent/consumable/condensedcapsaicin, 100) var/datum/effect_system/fluid_spread/smoke/chem/smoke = new - smoke.set_up(7, location = get_turf(user), carry = tmp_holder) - smoke.start() + smoke.set_up(7, holder = src, location = get_turf(user), carry = tmp_holder) + smoke.start(log = TRUE) ..() /obj/item/slimecross/burning/purple @@ -124,8 +124,8 @@ Burning extracts: tmp_holder.add_reagent(/datum/reagent/consumable/frostoil, 40) user.reagents.add_reagent(/datum/reagent/medicine/regen_jelly, 10) var/datum/effect_system/fluid_spread/smoke/chem/smoke = new - smoke.set_up(7, location = get_turf(user), carry = tmp_holder) - smoke.start() + smoke.set_up(7, holder = src, location = get_turf(user), carry = tmp_holder) + smoke.start(log = TRUE) ..() /obj/item/slimecross/burning/silver @@ -276,15 +276,14 @@ Burning extracts: effect_desc = "Transforms the user into a slime. They can transform back at will and do not lose any items." /obj/item/slimecross/burning/black/do_effect(mob/user) - var/mob/living/L = user - if(!istype(L)) + if(!isliving(user)) return user.visible_message(span_danger("[src] absorbs [user], transforming [user.p_them()] into a slime!")) - var/obj/effect/proc_holder/spell/targeted/shapeshift/slimeform/S = new() - S.remove_on_restore = TRUE - user.mind.AddSpell(S) - S.cast(list(user),user) - ..() + var/datum/action/cooldown/spell/shapeshift/slime_form/transform = new(user.mind || user) + transform.remove_on_restore = TRUE + transform.Grant(user) + transform.cast(user) + return ..() /obj/item/slimecross/burning/lightpink colour = "light pink" diff --git a/code/modules/research/xenobiology/vatgrowing/biopsy_tool.dm b/code/modules/research/xenobiology/vatgrowing/biopsy_tool.dm index d01e4a32138cbd..176b4fc78e3c14 100644 --- a/code/modules/research/xenobiology/vatgrowing/biopsy_tool.dm +++ b/code/modules/research/xenobiology/vatgrowing/biopsy_tool.dm @@ -4,6 +4,7 @@ desc = "Don't worry, it won't sting." icon = 'icons/obj/xenobiology/vatgrowing.dmi' icon_state = "biopsy" + worn_icon_state = "biopsy" ///Adds the swabbing component to the biopsy tool /obj/item/biopsy_tool/Initialize(mapload) diff --git a/code/modules/research/xenobiology/vatgrowing/samples/_micro_organism.dm b/code/modules/research/xenobiology/vatgrowing/samples/_micro_organism.dm index da1bf67c7adb02..edeeaad05c6a36 100644 --- a/code/modules/research/xenobiology/vatgrowing/samples/_micro_organism.dm +++ b/code/modules/research/xenobiology/vatgrowing/samples/_micro_organism.dm @@ -96,7 +96,7 @@ /datum/micro_organism/cell_line/proc/succeed_growing(obj/machinery/plumbing/growing_vat/vat) var/datum/effect_system/fluid_spread/smoke/smoke = new - smoke.set_up(0, location = vat.loc) + smoke.set_up(0, holder = vat, location = vat.loc) smoke.start() for(var/created_thing in resulting_atoms) for(var/x in 1 to resulting_atoms[created_thing]) diff --git a/code/modules/research/xenobiology/vatgrowing/samples/cell_lines/common.dm b/code/modules/research/xenobiology/vatgrowing/samples/cell_lines/common.dm index 1c2da8d5ac7ba6..637c5d033f03de 100644 --- a/code/modules/research/xenobiology/vatgrowing/samples/cell_lines/common.dm +++ b/code/modules/research/xenobiology/vatgrowing/samples/cell_lines/common.dm @@ -474,7 +474,7 @@ resulting_atoms = list(/mob/living/simple_animal/hostile/netherworld = 1) /datum/micro_organism/cell_line/netherworld/succeed_growing(obj/machinery/plumbing/growing_vat/vat) - var/random_result = pick(typesof(/mob/living/simple_animal/hostile/netherworld)) //i looked myself, pretty much all of them are reasonably strong and somewhat on the same level. except migo is the jackpot and the blank body is whiff. + var/random_result = pick(typesof(/mob/living/simple_animal/hostile/netherworld) - /mob/living/simple_animal/hostile/netherworld/statue) //i looked myself, pretty much all of them are reasonably strong and somewhat on the same level. except migo is the jackpot and the blank body is whiff. resulting_atoms = list() resulting_atoms[random_result] = 1 return ..() diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index a1a00c2be10e5e..69a51a8d8748dc 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -316,7 +316,7 @@ return 250 if(SLIME_ACTIVATE_MAJOR) - user.reagents.create_foam(/datum/effect_system/fluid_spread/foam, 20) + user.reagents.create_foam(/datum/effect_system/fluid_spread/foam, 20, log = TRUE) user.visible_message(span_danger("Foam spews out from [user]'s skin!"), span_warning("You activate [src], and foam bursts out of your skin!")) return 600 diff --git a/code/modules/security_levels/keycard_authentication.dm b/code/modules/security_levels/keycard_authentication.dm index 26f43924410ca8..738b65ec8680a5 100644 --- a/code/modules/security_levels/keycard_authentication.dm +++ b/code/modules/security_levels/keycard_authentication.dm @@ -43,7 +43,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/keycard_auth, 26) var/list/data = list() data["waiting"] = waiting data["auth_required"] = event_source ? event_source.event : 0 - data["red_alert"] = (seclevel2num(get_security_level()) >= SEC_LEVEL_RED) ? 1 : 0 + data["red_alert"] = (SSsecurity_level.get_current_level_as_number() >= SEC_LEVEL_RED) ? 1 : 0 data["emergency_maint"] = GLOB.emergency_access data["bsa_unlock"] = GLOB.bsa_unlock return data @@ -131,7 +131,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/keycard_auth, 26) deadchat_broadcast(" confirmed [event] at [span_name("[A2.name]")].", span_name("[confirmer]"), confirmer, message_type=DEADCHAT_ANNOUNCEMENT) switch(event) if(KEYCARD_RED_ALERT) - set_security_level(SEC_LEVEL_RED) + SSsecurity_level.set_level(SEC_LEVEL_RED) if(KEYCARD_EMERGENCY_MAINTENANCE_ACCESS) make_maint_all_access() if(KEYCARD_BSA_UNLOCK) diff --git a/code/modules/security_levels/security_level_datums.dm b/code/modules/security_levels/security_level_datums.dm new file mode 100644 index 00000000000000..c6addd4d4ebabd --- /dev/null +++ b/code/modules/security_levels/security_level_datums.dm @@ -0,0 +1,82 @@ +/** + * Security levels + * + * These are used by the security level subsystem. Each one of these represents a security level that a player can set. + * + * Base type is abstract + */ + +/datum/security_level + /// The name of this security level. + var/name = "not set" + /// The numerical level of this security level, see defines for more information. + var/number_level = -1 + /// The sound that we will play when this security level is set + var/sound + /// The looping sound that will be played while the security level is set + var/looping_sound + /// The looping sound interval + var/looping_sound_interval + /// The shuttle call time modification of this security level + var/shuttle_call_time_mod = 0 + /// Our announcement when lowering to this level + var/lowering_to_announcement + /// Our announcement when elevating to this level + var/elevating_to_announcemnt + /// Our configuration key for lowering to text, if set, will override the default lowering to announcement. + var/lowering_to_configuration_key + /// Our configuration key for elevating to text, if set, will override the default elevating to announcement. + var/elevating_to_configuration_key + +/datum/security_level/New() + . = ..() + if(lowering_to_configuration_key) // I'm not sure about you, but isn't there an easier way to do this? + lowering_to_announcement = global.config.Get(lowering_to_configuration_key) + if(elevating_to_configuration_key) + elevating_to_announcemnt = global.config.Get(elevating_to_configuration_key) + +/** + * GREEN + * + * No threats + */ +/datum/security_level/green + name = "green" + number_level = SEC_LEVEL_GREEN + lowering_to_configuration_key = /datum/config_entry/string/alert_green + shuttle_call_time_mod = 2 + +/** + * BLUE + * + * Caution advised + */ +/datum/security_level/blue + name = "blue" + number_level = SEC_LEVEL_BLUE + lowering_to_configuration_key = /datum/config_entry/string/alert_blue_downto + elevating_to_configuration_key = /datum/config_entry/string/alert_blue_upto + shuttle_call_time_mod = 1 + +/** + * RED + * + * Hostile threats + */ +/datum/security_level/red + name = "red" + number_level = SEC_LEVEL_RED + lowering_to_configuration_key = /datum/config_entry/string/alert_red_downto + elevating_to_configuration_key = /datum/config_entry/string/alert_red_upto + shuttle_call_time_mod = 0.5 + +/** + * DELTA + * + * Station destruction is imminent + */ +/datum/security_level/delta + name = "delta" + number_level = SEC_LEVEL_DELTA + elevating_to_configuration_key = /datum/config_entry/string/alert_delta + shuttle_call_time_mod = 0.25 diff --git a/code/modules/security_levels/security_levels.dm b/code/modules/security_levels/security_levels.dm deleted file mode 100644 index c289f90b6073e0..00000000000000 --- a/code/modules/security_levels/security_levels.dm +++ /dev/null @@ -1,82 +0,0 @@ -/proc/set_security_level(level) - switch(level) - if("green") - level = SEC_LEVEL_GREEN - if("blue") - level = SEC_LEVEL_BLUE - if("red") - level = SEC_LEVEL_RED - if("delta") - level = SEC_LEVEL_DELTA - - //Will not be announced if you try to set to the same level as it already is - if(level >= SEC_LEVEL_GREEN && level <= SEC_LEVEL_DELTA && level != SSsecurity_level.current_level) - switch(level) - if(SEC_LEVEL_GREEN) - minor_announce(CONFIG_GET(string/alert_green), "Attention! Security level lowered to green:") - if(SSshuttle.emergency.mode == SHUTTLE_CALL || SSshuttle.emergency.mode == SHUTTLE_RECALL) - if(SSsecurity_level.current_level >= SEC_LEVEL_RED) - SSshuttle.emergency.modTimer(4) - else - SSshuttle.emergency.modTimer(2) - if(SEC_LEVEL_BLUE) - if(SSsecurity_level.current_level < SEC_LEVEL_BLUE) - minor_announce(CONFIG_GET(string/alert_blue_upto), "Attention! Security level elevated to blue:",1) - if(SSshuttle.emergency.mode == SHUTTLE_CALL || SSshuttle.emergency.mode == SHUTTLE_RECALL) - SSshuttle.emergency.modTimer(0.5) - else - minor_announce(CONFIG_GET(string/alert_blue_downto), "Attention! Security level lowered to blue:") - if(SSshuttle.emergency.mode == SHUTTLE_CALL || SSshuttle.emergency.mode == SHUTTLE_RECALL) - SSshuttle.emergency.modTimer(2) - if(SEC_LEVEL_RED) - if(SSsecurity_level.current_level < SEC_LEVEL_RED) - minor_announce(CONFIG_GET(string/alert_red_upto), "Attention! Code red!",1) - if(SSshuttle.emergency.mode == SHUTTLE_CALL || SSshuttle.emergency.mode == SHUTTLE_RECALL) - if(SSsecurity_level.current_level == SEC_LEVEL_GREEN) - SSshuttle.emergency.modTimer(0.25) - else - SSshuttle.emergency.modTimer(0.5) - else - minor_announce(CONFIG_GET(string/alert_red_downto), "Attention! Code red!") - if(SEC_LEVEL_DELTA) - minor_announce(CONFIG_GET(string/alert_delta), "Attention! Delta security level reached!",1) - if(SSshuttle.emergency.mode == SHUTTLE_CALL || SSshuttle.emergency.mode == SHUTTLE_RECALL) - if(SSsecurity_level.current_level == SEC_LEVEL_GREEN) - SSshuttle.emergency.modTimer(0.25) - else if(SSsecurity_level.current_level == SEC_LEVEL_BLUE) - SSshuttle.emergency.modTimer(0.5) - - SSsecurity_level.set_level(level) - -/proc/get_security_level() - switch(SSsecurity_level.current_level) - if(SEC_LEVEL_GREEN) - return "green" - if(SEC_LEVEL_BLUE) - return "blue" - if(SEC_LEVEL_RED) - return "red" - if(SEC_LEVEL_DELTA) - return "delta" - -/proc/num2seclevel(num) - switch(num) - if(SEC_LEVEL_GREEN) - return "green" - if(SEC_LEVEL_BLUE) - return "blue" - if(SEC_LEVEL_RED) - return "red" - if(SEC_LEVEL_DELTA) - return "delta" - -/proc/seclevel2num(seclevel) - switch( lowertext(seclevel) ) - if("green") - return SEC_LEVEL_GREEN - if("blue") - return SEC_LEVEL_BLUE - if("red") - return SEC_LEVEL_RED - if("delta") - return SEC_LEVEL_DELTA diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm index 4ee761e74dd548..73b613d2970391 100644 --- a/code/modules/shuttle/emergency.dm +++ b/code/modules/shuttle/emergency.dm @@ -211,7 +211,7 @@ if(SSshuttle.emergency.hijack_status >= HIJACKED) to_chat(user, span_warning("The emergency shuttle is already loaded with a corrupt navigational payload. What more do you want from it?")) return - if(hijack_last_stage_increase >= world.time + hijack_stage_cooldown) + if(hijack_last_stage_increase >= world.time - hijack_stage_cooldown) say("Error - Catastrophic software error detected. Input is currently on timeout.") return hijack_hacking = TRUE @@ -246,7 +246,9 @@ if(HIJACKED) msg = "SYSTEM OVERRIDE - Resetting course to \[[scramble_message_replace_chars("###########", 100)]\] \ ([scramble_message_replace_chars("#######", 100)]/[scramble_message_replace_chars("#######", 100)]/[scramble_message_replace_chars("#######", 100)]) \ - {AUTH - ROOT (uid: 0)}.[SSshuttle.emergency.mode == SHUTTLE_ESCAPE ? "Diverting from existing route - Bluespace exit in [hijack_completion_flight_time_set/10] seconds." : ""]" + {AUTH - ROOT (uid: 0)}.\ + [SSshuttle.emergency.mode == SHUTTLE_ESCAPE ? "Diverting from existing route - Bluespace exit in \ + [hijack_completion_flight_time_set >= INFINITY ? "[scramble_message_replace_chars("\[ERROR\]")]" : hijack_completion_flight_time_set/10] seconds." : ""]" minor_announce(scramble_message_replace_chars(msg, replaceprob = 10), "Emergency Shuttle", TRUE) /obj/machinery/computer/emergency_shuttle/emag_act(mob/user) @@ -319,7 +321,7 @@ /obj/docking_port/mobile/emergency/request(obj/docking_port/stationary/S, area/signalOrigin, reason, redAlert, set_coefficient=null) if(!isnum(set_coefficient)) - var/security_num = seclevel2num(get_security_level()) + var/security_num = SSsecurity_level.get_current_level_as_number() switch(security_num) if(SEC_LEVEL_GREEN) set_coefficient = 2 @@ -569,7 +571,7 @@ var/obj/machinery/computer/shuttle/C = getControlConsole() if(!istype(C, /obj/machinery/computer/shuttle/pod)) return ..() - if(SSsecurity_level.current_level >= SEC_LEVEL_RED || (C && (C.obj_flags & EMAGGED))) + if(SSsecurity_level.get_current_level_as_number() >= SEC_LEVEL_RED || (C && (C.obj_flags & EMAGGED))) if(launch_status == UNLAUNCHED) launch_status = EARLY_LAUNCHED return ..() @@ -730,7 +732,7 @@ /obj/item/storage/pod/can_interact(mob/user) if(!..()) return FALSE - if(SSsecurity_level.current_level >= SEC_LEVEL_RED || unlocked) + if(SSsecurity_level.get_current_level_as_number() >= SEC_LEVEL_RED || unlocked) return TRUE to_chat(user, "The storage unit will only unlock during a Red or Delta security alert.") return FALSE diff --git a/code/modules/shuttle/on_move.dm b/code/modules/shuttle/on_move.dm index 2ddc73e25277db..2af77fe49fddb0 100644 --- a/code/modules/shuttle/on_move.dm +++ b/code/modules/shuttle/on_move.dm @@ -99,7 +99,7 @@ All ShuttleMove procs go here /atom/movable/proc/beforeShuttleMove(turf/newT, rotation, move_mode, obj/docking_port/mobile/moving_dock) return move_mode -// Called on atoms to move the atom to the new location +/// Called on atoms to move the atom to the new location /atom/movable/proc/onShuttleMove(turf/newT, turf/oldT, list/movement_force, move_dir, obj/docking_port/stationary/old_dock, obj/docking_port/mobile/moving_dock) if(newT == oldT) // In case of in place shuttle rotation shenanigans. return @@ -219,17 +219,6 @@ All ShuttleMove procs go here if(is_mining_level(z)) //Avoids double logging and landing on other Z-levels due to badminnery SSblackbox.record_feedback("associative", "colonies_dropped", 1, list("x" = x, "y" = y, "z" = z)) -/obj/machinery/gravity_generator/main/beforeShuttleMove(turf/newT, rotation, move_mode, obj/docking_port/mobile/moving_dock) - . = ..() - on = FALSE - update_list() - -/obj/machinery/gravity_generator/main/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation) - . = ..() - if(charge_count != 0 && charging_state != POWER_UP) - on = TRUE - update_list() - /obj/machinery/atmospherics/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation) . = ..() var/missing_nodes = FALSE diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index 6eee9c119a8bb1..6da991ff2777d7 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -39,7 +39,7 @@ ///are we registered in SSshuttles? var/registered = FALSE - ///register to SSshuttles +///register to SSshuttles /obj/docking_port/proc/register() if(registered) WARNING("docking_port registered multiple times") @@ -47,7 +47,7 @@ registered = TRUE return - ///unregister from SSshuttles +///unregister from SSshuttles /obj/docking_port/proc/unregister() if(!registered) WARNING("docking_port unregistered multiple times") @@ -57,7 +57,7 @@ /obj/docking_port/proc/Check_id() return - //these objects are indestructible +//these objects are indestructible /obj/docking_port/Destroy(force) // unless you assert that you know what you're doing. Horrible things // may result. @@ -68,7 +68,7 @@ return QDEL_HINT_LETMELIVE /obj/docking_port/has_gravity(turf/T) - return FALSE + return TRUE /obj/docking_port/take_damage() return diff --git a/code/modules/shuttle/shuttle_rotate.dm b/code/modules/shuttle/shuttle_rotate.dm index 8d0f8c289bb7a1..a7ea83579e6ed2 100644 --- a/code/modules/shuttle/shuttle_rotate.dm +++ b/code/modules/shuttle/shuttle_rotate.dm @@ -98,11 +98,6 @@ If ever any of these procs are useful for non-shuttles, rename it to proc/rotate params = NONE return ..() -//prevents shuttles attempting to rotate this since it messes up sprites -/obj/machinery/gravity_generator/shuttleRotate(rotation, params) - params = NONE - return ..() - /obj/machinery/door/airlock/shuttleRotate(rotation, params) . = ..() if(cyclelinkeddir && (params & ROTATE_DIR)) diff --git a/code/modules/spells/spell.dm b/code/modules/spells/spell.dm index 6188ec76be4a68..5fdf82a9a794cf 100644 --- a/code/modules/spells/spell.dm +++ b/code/modules/spells/spell.dm @@ -1,609 +1,425 @@ -#define TARGET_CLOSEST 0 -#define TARGET_RANDOM 1 - - -/obj/effect/proc_holder - var/panel = "Debug"//What panel the proc holder needs to go on. - var/active = FALSE //Used by toggle based abilities. - var/ranged_mousepointer - var/mob/living/ranged_ability_user - var/ranged_clickcd_override = -1 - var/has_action = TRUE - var/datum/action/spell_action/action = null - var/action_icon = 'icons/mob/actions/actions_spells.dmi' - var/action_icon_state = "spell_default" - var/action_background_icon_state = "bg_spell" - var/base_action = /datum/action/spell_action - var/datum/weakref/owner - -/obj/effect/proc_holder/Initialize(mapload, mob/living/new_owner) - . = ..() - owner = WEAKREF(new_owner) - if(has_action) - action = new base_action(src) - -/obj/effect/proc_holder/Destroy() - if(!QDELETED(action)) - qdel(action) - action = null - return ..() - -/obj/effect/proc_holder/proc/on_gain(mob/living/user) - return - -/obj/effect/proc_holder/proc/on_lose(mob/living/user) - return - -/obj/effect/proc_holder/proc/fire(mob/living/user) - return TRUE - -/obj/effect/proc_holder/proc/get_panel_text() - return "" - -GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for the badmin verb for now - -/obj/effect/proc_holder/Destroy() - QDEL_NULL(action) - if(ranged_ability_user) - remove_ranged_ability() - return ..() - -/obj/effect/proc_holder/singularity_act() - return - -/obj/effect/proc_holder/singularity_pull() - return - -/obj/effect/proc_holder/proc/InterceptClickOn(mob/living/caller, params, atom/A) - if(caller.ranged_ability != src || ranged_ability_user != caller) //I'm not actually sure how these would trigger, but, uh, safety, I guess? - to_chat(caller, span_warning("[caller.ranged_ability.name] has been disabled.")) - caller.ranged_ability.remove_ranged_ability() - return TRUE //TRUE for failed, FALSE for passed. - if(ranged_clickcd_override >= 0) - ranged_ability_user.next_click = world.time + ranged_clickcd_override - else - ranged_ability_user.next_click = world.time + CLICK_CD_CLICK_ABILITY - ranged_ability_user.face_atom(A) - return FALSE - -/obj/effect/proc_holder/proc/add_ranged_ability(mob/living/user, msg, forced) - if(!user || !user.client) - return - if(user.ranged_ability && user.ranged_ability != src) - if(forced) - to_chat(user, span_warning("[user.ranged_ability.name] has been replaced by [name].")) - user.ranged_ability.remove_ranged_ability() - else - return - user.ranged_ability = src - user.click_intercept = src - user.update_mouse_pointer() - ranged_ability_user = user - if(msg) - to_chat(ranged_ability_user, msg) - active = TRUE - update_appearance() - -/obj/effect/proc_holder/proc/remove_ranged_ability(msg) - if(!ranged_ability_user || !ranged_ability_user.client || (ranged_ability_user.ranged_ability && ranged_ability_user.ranged_ability != src)) //To avoid removing the wrong ability - return - ranged_ability_user.ranged_ability = null - ranged_ability_user.click_intercept = null - ranged_ability_user.update_mouse_pointer() - if(msg) - to_chat(ranged_ability_user, msg) - ranged_ability_user = null - active = FALSE - update_appearance() - -/obj/effect/proc_holder/spell +/** + * # The spell action + * + * This is the base action for how many of the game's + * spells (and spell adjacent) abilities function. + * These spells function off of a cooldown-based system. + * + * ## Pre-spell checks: + * - [can_cast_spell][/datum/action/cooldown/spell/can_cast_spell] checks if the OWNER + * of the spell is able to cast the spell. + * - [is_valid_target][/datum/action/cooldown/spell/is_valid_target] checks if the TARGET + * THE SPELL IS BEING CAST ON is a valid target for the spell. NOTE: The CAST TARGET is often THE SAME as THE OWNER OF THE SPELL, + * but is not always - depending on how [Pre Activate][/datum/action/cooldown/spell/PreActivate] is resolved. + * - [can_invoke][/datum/action/cooldown/spell/can_invoke] is run in can_cast_spell to check if + * the OWNER of the spell is able to say the current invocation. + * + * ## The spell chain: + * - [before_cast][/datum/action/cooldown/spell/before_cast] is the last chance for being able + * to interrupt a spell cast. This returns a bitflag. if SPELL_CANCEL_CAST is set, the spell will not continue. + * - [spell_feedback][/datum/action/cooldown/spell/spell_feedback] is called right before cast, and handles + * invocation and sound effects. Overridable, if you want a special method of invocation or sound effects, + * or you want your spell to handle invocation / sound via special means. + * - [cast][/datum/action/cooldown/spell/cast] is where the brunt of the spell effects should be done + * and implemented. + * - [after_cast][/datum/action/cooldown/spell/after_cast] is the aftermath - final effects that follow + * the main cast of the spell. By now, the spell cooldown has already started + * + * ## Other procs called / may be called within the chain: + * - [invocation][/datum/action/cooldown/spell/invocation] handles saying any vocal (or emotive) invocations the spell + * may have, and can be overriden or extended. Called by spell_feedback. + * - [reset_spell_cooldown][/datum/action/cooldown/spell/reset_spell_cooldown] is a way to handle reverting a spell's + * cooldown and making it ready again if it fails to go off at any point. Not called anywhere by default. If you + * want to cancel a spell in before_cast and would like the cooldown restart, call this. + * + * ## Other procs of note: + * - [level_spell][/datum/action/cooldown/spell/level_spell] is where the process of adding a spell level is handled. + * this can be extended if you wish to add unique effects on level up for wizards. + * - [delevel_spell][/datum/action/cooldown/spell/delevel_spell] is where the process of removing a spell level is handled. + * this can be extended if you wish to undo unique effects on level up for wizards. + * - [update_spell_name][/datum/action/cooldown/spell/update_spell_name] updates the prefix of the spell name based on its level. + */ +/datum/action/cooldown/spell name = "Spell" desc = "A wizard spell." + background_icon_state = "bg_spell" + icon_icon = 'icons/mob/actions/actions_spells.dmi' + button_icon_state = "spell_default" + check_flags = AB_CHECK_CONSCIOUS panel = "Spells" - var/sound = null //The sound the spell makes when it is cast - anchored = TRUE // Crap like fireball projectiles are proc_holders, this is needed so fireballs don't get blown back into your face via atmos etc. - pass_flags = PASSTABLE - density = FALSE - opacity = FALSE - ///checked by some holy sects to punish the caster for casting things that do not align with their sect's alignment - see magic.dm in defines to learn more + /// The sound played on cast. + var/sound = null + /// The school of magic the spell belongs to. + /// Checked by some holy sects to punish the + /// caster for casting things that do not align + /// with their sect's alignment - see magic.dm in defines to learn more var/school = SCHOOL_UNSET + /// If the spell uses the wizard spell rank system, the cooldown reduction per rank of the spell + var/cooldown_reduction_per_rank = 0 SECONDS + /// What is uttered when the user casts the spell + var/invocation + /// What is shown in chat when the user casts the spell, only matters for INVOCATION_EMOTE + var/invocation_self_message + /// What type of invocation the spell is. + /// Can be "none", "whisper", "shout", "emote" + var/invocation_type = INVOCATION_NONE + /// Flag for certain states that the spell requires the user be in to cast. + var/spell_requirements = SPELL_REQUIRES_WIZARD_GARB|SPELL_REQUIRES_NO_ANTIMAGIC + /// This determines what type of antimagic is needed to block the spell. + /// (MAGIC_RESISTANCE, MAGIC_RESISTANCE_MIND, MAGIC_RESISTANCE_HOLY) + /// If SPELL_REQUIRES_NO_ANTIMAGIC is set in Spell requirements, + /// The spell cannot be cast if the caster has any of the antimagic flags set. + var/antimagic_flags = MAGIC_RESISTANCE + /// The current spell level, if taken multiple times by a wizard + var/spell_level = 1 + /// The max possible spell level + var/spell_max_level = 5 + /// If set to a positive number, the spell will produce sparks when casted. + var/sparks_amt = 0 + /// The typepath of the smoke to create on cast. + var/smoke_type + /// The amount of smoke to create on cast. This is a range, so a value of 5 will create enough smoke to cover everything within 5 steps. + var/smoke_amt = 0 - var/charge_type = "recharge" //can be recharge or charges, see charge_max and charge_counter descriptions; can also be based on the holder's vars now, use "holder_var" for that +/datum/action/cooldown/spell/Grant(mob/grant_to) + // If our spell is mind-bound, we only wanna grant it to our mind + if(istype(target, /datum/mind)) + var/datum/mind/mind_target = target + if(mind_target.current != grant_to) + return + + . = ..() + if(!owner) + return - var/charge_max = 10 SECONDS //recharge time in deciseconds if charge_type = "recharge" or starting charges if charge_type = "charges" - var/charge_counter = 0 //can only cast spells if it equals recharge, ++ each decisecond if charge_type = "recharge" or -- each cast if charge_type = "charges" - var/still_recharging_msg = "The spell is still recharging." - var/recharging = TRUE + // Register some signals so our button's icon stays up to date + if(spell_requirements & SPELL_REQUIRES_OFF_CENTCOM) + RegisterSignal(owner, COMSIG_MOVABLE_Z_CHANGED, .proc/update_icon_on_signal) + if(spell_requirements & (SPELL_REQUIRES_NO_ANTIMAGIC|SPELL_REQUIRES_WIZARD_GARB)) + RegisterSignal(owner, COMSIG_MOB_EQUIPPED_ITEM, .proc/update_icon_on_signal) + RegisterSignal(owner, list(COMSIG_MOB_ENTER_JAUNT, COMSIG_MOB_AFTER_EXIT_JAUNT), .proc/update_icon_on_signal) + owner.client?.stat_panel.send_message("check_spells") - var/holder_var_type = "bruteloss" //only used if charge_type equals to "holder_var" - var/holder_var_amount = 20 //same. The amount adjusted with the mob's var when the spell is used +/datum/action/cooldown/spell/Remove(mob/living/remove_from) - var/clothes_req = TRUE //see if it requires clothes - var/human_req = FALSE //spell can only be cast by humans - var/nonabstract_req = FALSE //spell can only be cast by mobs that are physical entities - var/stat_allowed = FALSE //see if it requires being conscious/alive, need to set to 1 for ghostpells - var/phase_allowed = FALSE // If true, the spell can be cast while phased, eg. blood crawling, ethereal jaunting + remove_from.client?.stat_panel.send_message("check_spells") + UnregisterSignal(remove_from, list( + COMSIG_MOB_AFTER_EXIT_JAUNT, + COMSIG_MOB_ENTER_JAUNT, + COMSIG_MOB_EQUIPPED_ITEM, + COMSIG_MOVABLE_Z_CHANGED, + )) - /// This determines what type of antimagic is needed to block the spell (MAGIC_RESISTANCE, MAGIC_RESISTANCE_MIND, MAGIC_RESISTANCE_HOLY) - var/antimagic_flags = MAGIC_RESISTANCE + return ..() - var/invocation = "HURP DURP" //what is uttered when the wizard casts the spell - var/invocation_emote_self = null - var/invocation_type = INVOCATION_NONE //can be none, whisper, emote and shout - var/range = 7 //the range of the spell; outer radius for aoe spells - var/message = "" //whatever it says to the guy affected by it - var/selection_type = "view" //can be "range" or "view" - var/spell_level = 0 //if a spell can be taken multiple times, this raises - var/level_max = 4 //The max possible level_max is 4 - var/cooldown_min = 0 //This defines what spell quickened four times has as a cooldown. Make sure to set this for every spell - var/player_lock = TRUE //If it can be used by simple mobs - - var/overlay = 0 - var/overlay_icon = 'icons/obj/wizard.dmi' - var/overlay_icon_state = "spell" - var/overlay_lifespan = 0 - - var/sparks_spread = 0 - var/sparks_amt = 0 //cropped at 10 - /// The typepath of the smoke to create on cast. - var/smoke_spread = null - /// The amount of smoke to create on case. This is a range so a value of 5 will create enough smoke to cover everything within 5 steps. - var/smoke_amt = 0 +/datum/action/cooldown/spell/IsAvailable() + return ..() && can_cast_spell(feedback = FALSE) - var/centcom_cancast = TRUE //Whether or not the spell should be allowed on z2 +/datum/action/cooldown/spell/Trigger(trigger_flags, atom/target) + // We implement this can_cast_spell check before the parent call of Trigger() + // to allow people to click unavailable abilities to get a feedback chat message + // about why the ability is unavailable. + // It is otherwise redundant, however, as IsAvailable() checks can_cast_spell as well. + if(!can_cast_spell()) + return FALSE - action_icon = 'icons/mob/actions/actions_spells.dmi' - action_icon_state = "spell_default" - action_background_icon_state = "bg_spell" - base_action = /datum/action/spell_action/spell + return ..() -/obj/effect/proc_holder/spell/proc/cast_check(skipcharge = 0,mob/user = usr) //checks if the spell can be cast based on its settings; skipcharge is used when an additional cast_check is called inside the spell - if(SEND_SIGNAL(user, COMSIG_MOB_PRE_CAST_SPELL, src) & COMPONENT_CANCEL_SPELL) +/datum/action/cooldown/spell/set_click_ability(mob/on_who) + if(SEND_SIGNAL(on_who, COMSIG_MOB_SPELL_ACTIVATED, src) & SPELL_CANCEL_CAST) return FALSE - if(player_lock) - if(!user.mind || !(src in user.mind.spell_list) && !(src in user.mob_spell_list)) - to_chat(user, span_warning("You shouldn't have this spell! Something's wrong.")) - return FALSE - else - if(!(src in user.mob_spell_list)) - return FALSE + return ..() - var/turf/T = get_turf(user) - if(is_centcom_level(T.z) && !centcom_cancast) //Certain spells are not allowed on the centcom zlevel - to_chat(user, span_warning("You can't cast this spell here!")) +// Where the cast chain starts +/datum/action/cooldown/spell/PreActivate(atom/target) + if(!is_valid_target(target)) return FALSE - if(!skipcharge) - if(!charge_check(user)) - return FALSE + return Activate(target) - if(user.stat && !stat_allowed) - to_chat(user, span_warning("Not when you're incapacitated!")) +/// Checks if the owner of the spell can currently cast it. +/// Does not check anything involving potential targets. +/datum/action/cooldown/spell/proc/can_cast_spell(feedback = TRUE) + if(!owner) + CRASH("[type] - can_cast_spell called on a spell without an owner!") + + // Certain spells are not allowed on the centcom zlevel + var/turf/caster_turf = get_turf(owner) + if((spell_requirements & SPELL_REQUIRES_OFF_CENTCOM) && is_centcom_level(caster_turf.z)) + if(feedback) + to_chat(owner, span_warning("You can't cast [src] here!")) return FALSE - if(!user.can_cast_magic(antimagic_flags)) + if((spell_requirements & SPELL_REQUIRES_MIND) && !owner.mind) + // No point in feedback here, as mindless mobs aren't players return FALSE - if(!phase_allowed && istype(user.loc, /obj/effect/dummy) || HAS_TRAIT(user, TRAIT_ROD_FORM)) - to_chat(user, span_warning("[name] cannot be cast unless you are completely manifested in the material plane!")) + if((spell_requirements & SPELL_REQUIRES_MIME_VOW) && !owner.mind?.miming) + // In the future this can be moved out of spell checks exactly + if(feedback) + to_chat(owner, span_warning("You must dedicate yourself to silence first!")) return FALSE - var/mob/living/L = user - if(istype(L) && (invocation_type == INVOCATION_WHISPER || invocation_type == INVOCATION_SHOUT) && !L.can_speak_vocal()) - to_chat(user, span_warning("You can't get the words out!")) + // If the spell requires the user has no antimagic equipped, and they're holding antimagic + // that corresponds with the spell's antimagic, then they can't actually cast the spell + if((spell_requirements & SPELL_REQUIRES_NO_ANTIMAGIC) && !owner.can_cast_magic(antimagic_flags)) + if(feedback) + to_chat(owner, span_warning("Some form of antimagic is preventing you from casting [src]!")) return FALSE - if(ishuman(user)) + if(!(spell_requirements & SPELL_CASTABLE_WHILE_PHASED) && HAS_TRAIT(owner, TRAIT_MAGICALLY_PHASED)) + if(feedback) + to_chat(owner, span_warning("[src] cannot be cast unless you are completely manifested in the material plane!")) + return FALSE - var/mob/living/carbon/human/H = user + if(!can_invoke(feedback = feedback)) + return FALSE - if(clothes_req) - if(!(H.wear_suit?.clothing_flags & CASTING_CLOTHES)) - to_chat(H, span_warning("You don't feel strong enough without your robe!")) + if(ishuman(owner)) + if(spell_requirements & SPELL_REQUIRES_WIZARD_GARB) + var/mob/living/carbon/human/human_owner = owner + if(!(human_owner.wear_suit?.clothing_flags & CASTING_CLOTHES)) + to_chat(owner, span_warning("You don't feel strong enough without your robe!")) return FALSE - if(!(H.head?.clothing_flags & CASTING_CLOTHES)) - to_chat(H, span_warning("You don't feel strong enough without your hat!")) + if(!(human_owner.head?.clothing_flags & CASTING_CLOTHES)) + to_chat(owner, span_warning("You don't feel strong enough without your hat!")) return FALSE + else - if(clothes_req || human_req) - to_chat(user, span_warning("This spell can only be cast by humans!")) + // If the spell requires wizard equipment and we're not a human (can't wear robes or hats), that's just a given + if(spell_requirements & (SPELL_REQUIRES_WIZARD_GARB|SPELL_REQUIRES_HUMAN)) + if(feedback) + to_chat(owner, span_warning("[src] can only be cast by humans!")) return FALSE - if(nonabstract_req && (isbrain(user) || ispAI(user))) - to_chat(user, span_warning("This spell can only be cast by physical beings!")) + + if(!(spell_requirements & SPELL_CASTABLE_AS_BRAIN) && isbrain(owner)) + if(feedback) + to_chat(owner, span_warning("[src] can't be cast in this state!")) return FALSE + // Being put into a card form breaks a lot of spells, so we'll just forbid them in these states + if(ispAI(owner) || (isAI(owner) && istype(owner.loc, /obj/item/aicard))) + return FALSE - if(!skipcharge) - switch(charge_type) - if("recharge") - charge_counter = 0 //doesn't start recharging until the targets selecting ends - if("charges") - charge_counter-- //returns the charge if the targets selecting fails - if("holdervar") - adjust_var(user, holder_var_type, holder_var_amount) - if(action) - action.UpdateButtons() return TRUE -/obj/effect/proc_holder/spell/proc/charge_check(mob/user, silent = FALSE) - switch(charge_type) - if("recharge") - if(charge_counter < charge_max) - if(!silent) - to_chat(user, still_recharging_msg) - return FALSE - if("charges") - if(!charge_counter) - if(!silent) - to_chat(user, span_warning("[name] has no charges left!")) - return FALSE +/** + * Check if the target we're casting on is a valid target. + * For self-casted spells, the target being checked (cast_on) is the caster. + * + * Return TRUE if cast_on is valid, FALSE otherwise + */ +/datum/action/cooldown/spell/proc/is_valid_target(atom/cast_on) return TRUE -/obj/effect/proc_holder/spell/proc/invocation(mob/user = usr) //spelling the spell out and setting it on recharge/reducing charges amount - switch(invocation_type) - if(INVOCATION_SHOUT) - if(prob(50))//Auto-mute? Fuck that noise - user.say(invocation, forced = "spell") - else - user.say(replacetext(invocation," ","`"), forced = "spell") - if(INVOCATION_WHISPER) - if(prob(50)) - user.whisper(invocation) - else - user.whisper(replacetext(invocation," ","`")) - if(INVOCATION_EMOTE) - user.visible_message(invocation, invocation_emote_self) //same style as in mob/living/emote.dm +// The actual cast chain occurs here, in Activate(). +// You should generally not be overriding or extending Activate() for spells. +// Defer to any of the cast chain procs instead. +/datum/action/cooldown/spell/Activate(atom/cast_on) + SHOULD_NOT_OVERRIDE(TRUE) + + // Pre-casting of the spell + // Pre-cast is the very last chance for a spell to cancel + // Stuff like target input can go here. + var/precast_result = before_cast(cast_on) + if(precast_result & SPELL_CANCEL_CAST) + return FALSE -/obj/effect/proc_holder/spell/proc/playMagSound() - playsound(get_turf(usr), sound,50,TRUE) + // Spell is officially being cast + if(!(precast_result & SPELL_NO_FEEDBACK)) + // We do invocation and sound effects here, before actual cast + // That way stuff like teleports or shape-shifts can be invoked before ocurring + spell_feedback() -/obj/effect/proc_holder/spell/Initialize(mapload) - . = ..() - START_PROCESSING(SSfastprocess, src) + // Actually cast the spell. Main effects go here + cast(cast_on) - still_recharging_msg = span_warning("[name] is still recharging!") - charge_counter = charge_max + if(!(precast_result & SPELL_NO_IMMEDIATE_COOLDOWN)) + // The entire spell is done, start the actual cooldown at its set duration + StartCooldown() -/obj/effect/proc_holder/spell/Destroy() - STOP_PROCESSING(SSfastprocess, src) - qdel(action) - return ..() + // And then proceed with the aftermath of the cast + // Final effects that happen after all the casting is done can go here + after_cast(cast_on) + UpdateButtons() + + return TRUE + +/** + * Actions done before the actual cast is called. + * This is the last chance to cancel the spell from being cast. + * + * Can be used for target selection or to validate checks on the caster (cast_on). + * + * Returns a bitflag. + * - SPELL_CANCEL_CAST will stop the spell from being cast. + * - SPELL_NO_FEEDBACK will prevent the spell from calling [proc/spell_feedback] on cast. (invocation, sounds) + * - SPELL_NO_IMMEDIATE_COOLDOWN will prevent the spell from starting its cooldown between cast and before after_cast. + */ +/datum/action/cooldown/spell/proc/before_cast(atom/cast_on) + SHOULD_CALL_PARENT(TRUE) -/obj/effect/proc_holder/spell/Click() - if(cast_check()) - choose_targets() - return 1 + var/sig_return = SEND_SIGNAL(src, COMSIG_SPELL_BEFORE_CAST, cast_on) + if(owner) + sig_return |= SEND_SIGNAL(owner, COMSIG_MOB_BEFORE_SPELL_CAST, src, cast_on) -/obj/effect/proc_holder/spell/proc/choose_targets(mob/user = usr) //depends on subtype - /targeted or /aoe_turf - return + return sig_return /** - * can_target: Checks if we are allowed to cast the spell on a target. + * Actions done as the main effect of the spell. * - * Arguments: - * * target The atom that is being targeted by the spell. - * * user The mob using the spell. - * * silent If the checks should not give any feedback messages. + * For spells without a click intercept, [cast_on] will be the owner. + * For click spells, [cast_on] is whatever the owner clicked on in casting the spell. */ -/obj/effect/proc_holder/spell/proc/can_target(atom/target, mob/user, silent = FALSE) - return TRUE +/datum/action/cooldown/spell/proc/cast(atom/cast_on) + SHOULD_CALL_PARENT(TRUE) -/obj/effect/proc_holder/spell/proc/start_recharge() - recharging = TRUE - -/obj/effect/proc_holder/spell/process(delta_time) - if(recharging && charge_type == "recharge" && (charge_counter < charge_max)) - charge_counter += delta_time * 10 - if(charge_counter >= charge_max) - action.UpdateButtons() - charge_counter = charge_max - recharging = FALSE - -/obj/effect/proc_holder/spell/proc/perform(list/targets, recharge = TRUE, mob/user = usr) //if recharge is started is important for the trigger spells - before_cast(targets) - invocation(user) - if(user?.ckey) - user.log_message(span_danger("cast the spell [name]."), LOG_ATTACK) - if(recharge) - recharging = TRUE - if(sound) - playMagSound() - SEND_SIGNAL(user, COMSIG_MOB_CAST_SPELL, src) - cast(targets,user=user) - after_cast(targets) - if(action) - action.UpdateButtons() - -/obj/effect/proc_holder/spell/proc/before_cast(list/targets) - if(overlay) - for(var/atom/target in targets) - var/location - if(isliving(target)) - location = target.loc - else if(isturf(target)) - location = target - var/obj/effect/overlay/spell = new /obj/effect/overlay(location) - spell.icon = overlay_icon - spell.icon_state = overlay_icon_state - spell.set_anchored(TRUE) - spell.set_density(FALSE) - QDEL_IN(spell, overlay_lifespan) - -/obj/effect/proc_holder/spell/proc/after_cast(list/targets) - for(var/atom/target in targets) - var/location - if(isliving(target)) - location = target.loc - else if(isturf(target)) - location = target - if(isliving(target) && message) - to_chat(target, text("[message]")) - if(sparks_spread) - do_sparks(sparks_amt, FALSE, location) - if(ispath(smoke_spread, /datum/effect_system/fluid_spread/smoke)) // Dear god this code is :agony: - var/datum/effect_system/fluid_spread/smoke/smoke = new smoke_spread() - smoke.set_up(smoke_amt, location = location) - smoke.start() - - -/obj/effect/proc_holder/spell/proc/cast(list/targets,mob/user = usr) - -/obj/effect/proc_holder/spell/proc/view_or_range(distance = world.view, center=usr, type="view") - switch(type) - if("view") - . = view(distance,center) - if("range") - . = range(distance,center) - -/obj/effect/proc_holder/spell/proc/revert_cast(mob/user = usr) //resets recharge or readds a charge - switch(charge_type) - if("recharge") - charge_counter = charge_max - if("charges") - charge_counter++ - if("holdervar") - adjust_var(user, holder_var_type, -holder_var_amount) - if(action) - action.UpdateButtons() - -/obj/effect/proc_holder/spell/proc/adjust_var(mob/living/target = usr, type, amount) //handles the adjustment of the var when the spell is used. has some hardcoded types - if (!istype(target)) - return - switch(type) - if("bruteloss") - target.adjustBruteLoss(amount) - if("fireloss") - target.adjustFireLoss(amount) - if("toxloss") - target.adjustToxLoss(amount) - if("oxyloss") - target.adjustOxyLoss(amount) - if("stun") - target.AdjustStun(amount) - if("knockdown") - target.AdjustKnockdown(amount) - if("paralyze") - target.AdjustParalyzed(amount) - if("immobilize") - target.AdjustImmobilized(amount) - if("unconscious") - target.AdjustUnconscious(amount) - else - target.vars[type] += amount //I bear no responsibility for the runtimes that'll happen if you try to adjust non-numeric or even non-existent vars - -/obj/effect/proc_holder/spell/targeted //can mean aoe for mobs (limited/unlimited number) or one target mob - var/max_targets = 1 //leave 0 for unlimited targets in range, 1 for one selectable target in range, more for limited number of casts (can all target one guy, depends on target_ignore_prev) in range - var/target_ignore_prev = 1 //only important if max_targets > 1, affects if the spell can be cast multiple times at one person from one cast - var/include_user = 0 //if it includes usr in the target list - var/random_target = 0 // chooses random viable target instead of asking the caster - var/random_target_priority = TARGET_CLOSEST // if random_target is enabled how it will pick the target - - -/obj/effect/proc_holder/spell/aoe_turf //affects all turfs in view or range (depends) - var/inner_radius = -1 //for all your ring spell needs - -/obj/effect/proc_holder/spell/targeted/choose_targets(mob/user = usr) - var/list/targets = list() - - switch(max_targets) - if(0) //unlimited - for(var/mob/living/target in view_or_range(range, user, selection_type)) - if(!can_target(target, user, TRUE)) - continue - targets += target - if(1) //single target can be picked - if(range < 0) - targets += user - else - var/possible_targets = list() - - for(var/mob/living/M in view_or_range(range, user, selection_type)) - if(!include_user && user == M) - continue - if(!can_target(M, user, TRUE)) - continue - possible_targets += M - - //targets += input("Choose the target for the spell.", "Targeting") as mob in possible_targets - //Adds a safety check post-input to make sure those targets are actually in range. - var/mob/chosen_target - if(!random_target) - chosen_target = tgui_input_list(user, "Choose the target for the spell", "Targeting", sort_names(possible_targets)) - if(isnull(chosen_target)) - return - if(!ismob(chosen_target) || user.incapacitated()) - return - else - switch(random_target_priority) - if(TARGET_RANDOM) - chosen_target = pick(possible_targets) - if(TARGET_CLOSEST) - for(var/mob/living/living_target in possible_targets) - if(chosen_target) - if(get_dist(user, living_target) < get_dist(user, chosen_target)) - if(los_check(user, living_target)) - chosen_target = living_target - else - if(los_check(user, living_target)) - chosen_target = living_target - if(chosen_target in view_or_range(range, user, selection_type)) - targets += chosen_target - - else - var/list/possible_targets = list() - for(var/mob/living/target in view_or_range(range, user, selection_type)) - if(!can_target(target, user, TRUE)) - continue - possible_targets += target - for(var/i in 1 to max_targets) - if(!length(possible_targets)) - break - if(target_ignore_prev) - var/target = pick(possible_targets) - possible_targets -= target - targets += target - else - targets += pick(possible_targets) - - if(!include_user && (user in targets)) - targets -= user - - if(!length(targets)) //doesn't waste the spell - revert_cast(user) + SEND_SIGNAL(src, COMSIG_SPELL_CAST, cast_on) + if(owner) + SEND_SIGNAL(owner, COMSIG_MOB_CAST_SPELL, src, cast_on) + if(owner.ckey) + owner.log_message("cast the spell [name][cast_on != owner ? " on / at [cast_on]":""].", LOG_ATTACK) + +/** + * Actions done after the main cast is finished. + * This is called after the cooldown's already begun. + * + * It can be used to apply late spell effects where order matters + * (for example, causing smoke *after* a teleport occurs in cast()) + * or to clean up variables or references post-cast. + */ +/datum/action/cooldown/spell/proc/after_cast(atom/cast_on) + SHOULD_CALL_PARENT(TRUE) + + SEND_SIGNAL(src, COMSIG_SPELL_AFTER_CAST, cast_on) + if(!owner) return - perform(targets, user=user) + SEND_SIGNAL(owner, COMSIG_MOB_AFTER_SPELL_CAST, src, cast_on) -/obj/effect/proc_holder/spell/aoe_turf/choose_targets(mob/user = usr) - var/list/targets = list() + // Sparks and smoke can only occur if there's an owner to source them from. + if(sparks_amt) + do_sparks(sparks_amt, FALSE, get_turf(owner)) - for(var/turf/target in view_or_range(range,user,selection_type)) - if(!can_target(target, user, TRUE)) - continue - if(!(target in view_or_range(inner_radius,user,selection_type))) - targets += target + if(ispath(smoke_type, /datum/effect_system/fluid_spread/smoke)) + var/datum/effect_system/fluid_spread/smoke/smoke = new smoke_type() + smoke.set_up(smoke_amt, holder = owner, location = get_turf(owner)) + smoke.start() - if(!length(targets)) //doesn't waste the spell - revert_cast() +/// Provides feedback after a spell cast occurs, in the form of a cast sound and/or invocation +/datum/action/cooldown/spell/proc/spell_feedback() + if(!owner) return - perform(targets,user=user) + if(invocation_type != INVOCATION_NONE) + invocation() + if(sound) + playsound(get_turf(owner), sound, 50, TRUE) -/obj/effect/proc_holder/spell/proc/updateButtons(status_only, force) - action.UpdateButtons(status_only, force) +/// The invocation that accompanies the spell, called from spell_feedback() before cast(). +/datum/action/cooldown/spell/proc/invocation() + switch(invocation_type) + if(INVOCATION_SHOUT) + if(prob(50)) + owner.say(invocation, forced = "spell ([src])") + else + owner.say(replacetext(invocation," ","`"), forced = "spell ([src])") -/obj/effect/proc_holder/spell/proc/can_be_cast_by(mob/caster) - if((human_req || clothes_req) && !ishuman(caster)) - return FALSE - return TRUE + if(INVOCATION_WHISPER) + if(prob(50)) + owner.whisper(invocation, forced = "spell ([src])") + else + owner.whisper(replacetext(invocation," ","`"), forced = "spell ([src])") -/obj/effect/proc_holder/spell/targeted/proc/los_check(mob/A,mob/B) - //Checks for obstacles from A to B - var/obj/dummy = new(A.loc) - dummy.pass_flags |= PASSTABLE - var/turf/previous_step = get_turf(A) - var/first_step = TRUE - for(var/turf/next_step as anything in (get_line(A, B) - previous_step)) - if(first_step) - for(var/obj/blocker in previous_step) - if(!blocker.density || !(blocker.flags_1 & ON_BORDER_1)) - continue - if(blocker.CanPass(dummy, get_dir(previous_step, next_step))) - continue - return FALSE // Could not leave the first turf. - first_step = FALSE - for(var/atom/movable/movable as anything in next_step) - if(!movable.CanPass(dummy, get_dir(next_step, previous_step))) - qdel(dummy) - return FALSE - previous_step = next_step - qdel(dummy) - return TRUE + if(INVOCATION_EMOTE) + owner.visible_message(invocation, invocation_self_message) -/obj/effect/proc_holder/spell/proc/can_cast(mob/user = usr) - if(((!user.mind) || !(src in user.mind.spell_list)) && !(src in user.mob_spell_list)) - return FALSE +/// Checks if the current OWNER of the spell is in a valid state to say the spell's invocation +/datum/action/cooldown/spell/proc/can_invoke(feedback = TRUE) + if(spell_requirements & SPELL_CASTABLE_WITHOUT_INVOCATION) + return TRUE + + if(invocation_type == INVOCATION_NONE) + return TRUE - if(!charge_check(user,TRUE)) + // If you want a spell usable by ghosts for some reason, it must be INVOCATION_NONE + if(!isliving(owner)) + if(feedback) + to_chat(owner, span_warning("You need to be living to invoke [src]!")) return FALSE - if(user.stat && !stat_allowed) + var/mob/living/living_owner = owner + if(invocation_type == INVOCATION_EMOTE && HAS_TRAIT(living_owner, TRAIT_EMOTEMUTE)) + if(feedback) + to_chat(owner, span_warning("You can't position your hands correctly to invoke [src]!")) return FALSE - if(!user.can_cast_magic(antimagic_flags)) + if((invocation_type == INVOCATION_WHISPER || invocation_type == INVOCATION_SHOUT) && !living_owner.can_speak_vocal()) + if(feedback) + to_chat(owner, span_warning("You can't get the words out to invoke [src]!")) return FALSE - if(!ishuman(user)) - if(clothes_req || human_req) - return FALSE - if(nonabstract_req && (isbrain(user) || ispAI(user))) - return FALSE return TRUE -/obj/effect/proc_holder/spell/self //Targets only the caster. Good for buffs and heals, but probably not wise for fireballs (although they usually fireball themselves anyway, honke) - range = -1 //Duh +/// Resets the cooldown of the spell, sending COMSIG_SPELL_CAST_RESET +/// and allowing it to be used immediately (+ updating button icon accordingly) +/datum/action/cooldown/spell/proc/reset_spell_cooldown() + SEND_SIGNAL(src, COMSIG_SPELL_CAST_RESET) + next_use_time -= cooldown_time // Basically, ensures that the ability can be used now + UpdateButtons() -/obj/effect/proc_holder/spell/self/choose_targets(mob/user = usr) - if(!user) - revert_cast() - return - perform(null,user=user) - -/obj/effect/proc_holder/spell/self/basic_heal //This spell exists mainly for debugging purposes, and also to show how casting works - name = "Lesser Heal" - desc = "Heals a small amount of brute and burn damage." - human_req = TRUE - clothes_req = FALSE - charge_max = 100 - cooldown_min = 50 - invocation = "Victus sano!" - invocation_type = INVOCATION_WHISPER - school = SCHOOL_RESTORATION - sound = 'sound/magic/staff_healing.ogg' - -/obj/effect/proc_holder/spell/self/basic_heal/cast(list/targets, mob/living/carbon/human/user) //Note the lack of "list/targets" here. Instead, use a "user" var depending on mob requirements. - //Also, notice the lack of a "for()" statement that looks through the targets. This is, again, because the spell can only have a single target. - user.visible_message(span_warning("A wreath of gentle light passes over [user]!"), span_notice("You wreath yourself in healing light!")) - user.adjustBruteLoss(-10) - user.adjustFireLoss(-10) - -/obj/effect/proc_holder/spell/vv_get_dropdown() - . = ..() - VV_DROPDOWN_OPTION("", "---------") - if(clothes_req) - VV_DROPDOWN_OPTION(VV_HK_SPELL_SET_ROBELESS, "Set Robeless") - else - VV_DROPDOWN_OPTION(VV_HK_SPELL_UNSET_ROBELESS, "Unset Robeless") +/** + * Levels the spell up a single level, reducing the cooldown. + * If bypass_cap is TRUE, will level the spell up past it's set cap. + */ +/datum/action/cooldown/spell/proc/level_spell(bypass_cap = FALSE) + // Spell cannot be levelled + if(spell_max_level <= 1) + return FALSE - if(human_req) - VV_DROPDOWN_OPTION(VV_HK_SPELL_UNSET_HUMANONLY, "Unset Require Humanoid Mob") - else - VV_DROPDOWN_OPTION(VV_HK_SPELL_SET_HUMANONLY, "Set Require Humanoid Mob") + // Spell is at cap, and we will not bypass it + if(!bypass_cap && (spell_level >= spell_max_level)) + return FALSE - if(nonabstract_req) - VV_DROPDOWN_OPTION(VV_HK_SPELL_UNSET_NONABSTRACT, "Unset Require Body") - else - VV_DROPDOWN_OPTION(VV_HK_SPELL_SET_NONABSTRACT, "Set Require Body") + spell_level++ + cooldown_time = max(cooldown_time - cooldown_reduction_per_rank, 0) + update_spell_name() + return TRUE -/obj/effect/proc_holder/spell/vv_do_topic(list/href_list) - . = ..() - if(href_list[VV_HK_SPELL_SET_ROBELESS]) - clothes_req = FALSE - return - if(href_list[VV_HK_SPELL_UNSET_ROBELESS]) - clothes_req = TRUE - return - if(href_list[VV_HK_SPELL_UNSET_HUMANONLY]) - human_req = FALSE - return - if(href_list[VV_HK_SPELL_SET_HUMANONLY]) - human_req = TRUE - return - if(href_list[VV_HK_SPELL_UNSET_NONABSTRACT]) - nonabstract_req = FALSE - return - if(href_list[VV_HK_SPELL_SET_NONABSTRACT]) - nonabstract_req = TRUE - return +/** + * Levels the spell down a single level, down to 1. + */ +/datum/action/cooldown/spell/proc/delevel_spell() + // Spell cannot be levelled + if(spell_max_level <= 1) + return FALSE + + if(spell_level <= 1) + return FALSE + + spell_level-- + cooldown_time = min(cooldown_time + cooldown_reduction_per_rank, initial(cooldown_time)) + update_spell_name() + return TRUE + +/** + * Updates the spell's name based on its level. + */ +/datum/action/cooldown/spell/proc/update_spell_name() + var/spell_title = "" + switch(spell_level) + if(2) + spell_title = "Efficient " + if(3) + spell_title = "Quickened " + if(4) + spell_title = "Free " + if(5) + spell_title = "Instant " + if(6) + spell_title = "Ludicrous " + + name = "[spell_title][initial(name)]" + UpdateButtons() diff --git a/code/modules/spells/spell_types/aimed.dm b/code/modules/spells/spell_types/aimed.dm deleted file mode 100644 index 64ca91f0541d20..00000000000000 --- a/code/modules/spells/spell_types/aimed.dm +++ /dev/null @@ -1,207 +0,0 @@ - -/obj/effect/proc_holder/spell/aimed - name = "aimed projectile spell" - base_icon_state = "projectile" - var/projectile_type = /obj/projectile/magic/teleport - var/deactive_msg = "You discharge your projectile..." - var/active_msg = "You charge your projectile!" - var/active_icon_state = "projectile" - var/list/projectile_var_overrides = list() - var/projectile_amount = 1 //Projectiles per cast. - var/current_amount = 0 //How many projectiles left. - var/projectiles_per_fire = 1 //Projectiles per fire. Probably not a good thing to use unless you override ready_projectile(). - -/obj/effect/proc_holder/spell/aimed/Click() - var/mob/living/user = usr - if(!istype(user)) - return - if(!can_cast(user)) - remove_ranged_ability(span_warning("You can no longer cast [name]!")) - return - - if(active) - on_deactivation(user) - else - on_activation(user) - -/** - * Activate the spell for user. - */ -/obj/effect/proc_holder/spell/aimed/proc/on_activation(mob/user) - SHOULD_CALL_PARENT(TRUE) - - current_amount = projectile_amount - add_ranged_ability(user, span_notice("[active_msg] Left-click to shoot it at a target!"), TRUE) - -/** - * Deactivate the spell from user. - */ -/obj/effect/proc_holder/spell/aimed/proc/on_deactivation(mob/user) - SHOULD_CALL_PARENT(TRUE) - - if(charge_type == "recharge") - var/refund_percent = current_amount / projectile_amount - charge_counter = charge_max * refund_percent - start_recharge() - remove_ranged_ability(span_notice("[deactive_msg]")) - - -/obj/effect/proc_holder/spell/aimed/update_icon() - if(!action) - return - - . = ..() - action.button_icon_state = "[base_icon_state][active]" - action.UpdateButtons() - -/obj/effect/proc_holder/spell/aimed/InterceptClickOn(mob/living/caller, params, atom/target) - if(..()) - return FALSE - var/ran_out = (current_amount <= 0) - if(!cast_check(!ran_out, ranged_ability_user)) - remove_ranged_ability() - return FALSE - var/list/targets = list(target) - perform(targets, ran_out, user = ranged_ability_user) - return TRUE - -/obj/effect/proc_holder/spell/aimed/cast(list/targets, mob/living/user) - var/target = targets[1] - var/turf/T = user.loc - var/turf/U = get_step(user, user.dir) // Get the tile infront of the move, based on their direction - if(!isturf(U) || !isturf(T)) - return FALSE - fire_projectile(user, target) - user.newtonian_move(get_dir(U, T)) - if(current_amount <= 0) - remove_ranged_ability() //Auto-disable the ability once you run out of bullets. - charge_counter = 0 - start_recharge() - on_deactivation(user) - return TRUE - -/obj/effect/proc_holder/spell/aimed/proc/fire_projectile(mob/living/user, atom/target) - current_amount-- - for(var/i in 1 to projectiles_per_fire) - var/obj/projectile/P = new projectile_type(user.loc) - P.firer = user - P.preparePixelProjectile(target, user) - for(var/V in projectile_var_overrides) - if(P.vars[V]) - P.vv_edit_var(V, projectile_var_overrides[V]) - ready_projectile(P, target, user, i) - P.fire() - return TRUE - -/obj/effect/proc_holder/spell/aimed/proc/ready_projectile(obj/projectile/P, atom/target, mob/user, iteration) - P.fired_from = src - return - -/obj/effect/proc_holder/spell/aimed/lightningbolt - name = "Lightning Bolt" - desc = "Fire a lightning bolt at your foes! It will jump between targets, but can't knock them down." - school = SCHOOL_EVOCATION - charge_max = 100 - clothes_req = FALSE - invocation = "P'WAH, UNLIM'TED P'WAH" - invocation_type = INVOCATION_SHOUT - cooldown_min = 20 - base_icon_state = "lightning" - action_icon_state = "lightning0" - sound = 'sound/magic/lightningbolt.ogg' - active = FALSE - projectile_var_overrides = list("zap_range" = 15, "zap_power" = 20000, "zap_flags" = ZAP_MOB_DAMAGE) - active_msg = "You energize your hands with arcane lightning!" - deactive_msg = "You let the energy flow out of your hands back into yourself..." - projectile_type = /obj/projectile/magic/aoe/lightning - -/obj/effect/proc_holder/spell/aimed/lightningbolt/on_gain(mob/living/user) - . = ..() - ADD_TRAIT(user, TRAIT_TESLA_SHOCKIMMUNE, "lightning_bolt_spell") - -/obj/effect/proc_holder/spell/aimed/lightningbolt/on_lose(mob/living/user) - . = ..() - REMOVE_TRAIT(user, TRAIT_TESLA_SHOCKIMMUNE, "lightning_bolt_spell") - -/obj/effect/proc_holder/spell/aimed/fireball - name = "Fireball" - desc = "This spell fires an explosive fireball at a target." - school = SCHOOL_EVOCATION - charge_max = 60 - clothes_req = FALSE - invocation = "ONI SOMA" - invocation_type = INVOCATION_SHOUT - range = 20 - cooldown_min = 20 //10 deciseconds reduction per rank - projectile_type = /obj/projectile/magic/fireball - base_icon_state = "fireball" - action_icon_state = "fireball0" - sound = 'sound/magic/fireball.ogg' - active_msg = "You prepare to cast your fireball spell!" - deactive_msg = "You extinguish your fireball... for now." - active = FALSE - -/obj/effect/proc_holder/spell/aimed/fireball/fire_projectile(list/targets, mob/living/user) - var/range = 6 + 2*spell_level - projectile_var_overrides = list("range" = range) - return ..() - -/obj/effect/proc_holder/spell/aimed/spell_cards - name = "Spell Cards" - desc = "Blazing hot rapid-fire homing cards. Send your foes to the shadow realm with their mystical power!" - school = SCHOOL_EVOCATION - charge_max = 50 - clothes_req = FALSE - invocation = "Sigi'lu M'Fan 'Tasia" - invocation_type = INVOCATION_SHOUT - range = 40 - cooldown_min = 10 - projectile_amount = 5 - projectiles_per_fire = 7 - projectile_type = /obj/projectile/magic/spellcard - base_icon_state = "spellcard" - action_icon_state = "spellcard0" - var/datum/weakref/current_target_weakref - var/projectile_turnrate = 10 - var/projectile_pixel_homing_spread = 32 - var/projectile_initial_spread_amount = 30 - var/projectile_location_spread_amount = 12 - var/datum/component/lockon_aiming/lockon_component - ranged_clickcd_override = TRUE - -/obj/effect/proc_holder/spell/aimed/spell_cards/on_activation(mob/M) - . = ..() - QDEL_NULL(lockon_component) - lockon_component = M.AddComponent(/datum/component/lockon_aiming, 5, GLOB.typecache_living, 1, null, CALLBACK(src, .proc/on_lockon_component)) - -/obj/effect/proc_holder/spell/aimed/spell_cards/proc/on_lockon_component(list/locked_weakrefs) - if(!length(locked_weakrefs)) - current_target_weakref = null - return - current_target_weakref = locked_weakrefs[1] - var/atom/A = current_target_weakref.resolve() - if(A) - var/mob/M = lockon_component.parent - M.face_atom(A) - -/obj/effect/proc_holder/spell/aimed/spell_cards/on_deactivation(mob/M) - . = ..() - QDEL_NULL(lockon_component) - -/obj/effect/proc_holder/spell/aimed/spell_cards/ready_projectile(obj/projectile/P, atom/target, mob/user, iteration) - . = ..() - if(current_target_weakref) - var/atom/A = current_target_weakref.resolve() - if(A && get_dist(A, user) < 7) - P.homing_turn_speed = projectile_turnrate - P.homing_inaccuracy_min = projectile_pixel_homing_spread - P.homing_inaccuracy_max = projectile_pixel_homing_spread - P.set_homing_target(current_target_weakref.resolve()) - var/rand_spr = rand() - var/total_angle = projectile_initial_spread_amount * 2 - var/adjusted_angle = total_angle - ((projectile_initial_spread_amount / projectiles_per_fire) * 0.5) - var/one_fire_angle = adjusted_angle / projectiles_per_fire - var/current_angle = iteration * one_fire_angle * rand_spr - (projectile_initial_spread_amount / 2) - P.pixel_x = rand(-projectile_location_spread_amount, projectile_location_spread_amount) - P.pixel_y = rand(-projectile_location_spread_amount, projectile_location_spread_amount) - P.preparePixelProjectile(target, user, null, current_angle) diff --git a/code/modules/spells/spell_types/aoe_spell/_aoe_spell.dm b/code/modules/spells/spell_types/aoe_spell/_aoe_spell.dm new file mode 100644 index 00000000000000..1d240bad61ea13 --- /dev/null +++ b/code/modules/spells/spell_types/aoe_spell/_aoe_spell.dm @@ -0,0 +1,57 @@ +/** + * ## AOE spells + * + * A spell that iterates over atoms near the caster and casts a spell on them. + * Calls cast_on_thing_in_aoe on all atoms returned by get_things_to_cast_on by default. + */ +/datum/action/cooldown/spell/aoe + /// The max amount of targets we can affect via our AOE. 0 = unlimited + var/max_targets = 0 + /// The radius of the aoe. + var/aoe_radius = 7 + +// At this point, cast_on == owner. Either works. +/datum/action/cooldown/spell/aoe/cast(atom/cast_on) + . = ..() + // Get every atom around us to our aoe cast on + var/list/atom/things_to_cast_on = get_things_to_cast_on(cast_on) + // If we have a target limit, shuffle it (for fariness) + if(max_targets > 0) + things_to_cast_on = shuffle(things_to_cast_on) + + SEND_SIGNAL(src, COMSIG_SPELL_AOE_ON_CAST, things_to_cast_on, cast_on) + + // Now go through and cast our spell where applicable + var/num_targets = 0 + for(var/thing_to_target in things_to_cast_on) + if(max_targets > 0 && num_targets >= max_targets) + continue + + cast_on_thing_in_aoe(thing_to_target, cast_on) + num_targets++ + +/** + * Gets a list of atoms around [center] + * that are within range and affected by our aoe. + */ +/datum/action/cooldown/spell/aoe/proc/get_things_to_cast_on(atom/center) + var/list/things = list() + for(var/atom/nearby_thing in range(aoe_radius, center)) + if(nearby_thing == owner || nearby_thing == center) + continue + + things += nearby_thing + + return things + +/** + * Actually cause effects on the thing in our aoe. + * Override this for your spell! Not cast(). + * + * Arguments + * * victim - the atom being affected by our aoe + * * caster - the mob who cast the aoe + */ +/datum/action/cooldown/spell/aoe/proc/cast_on_thing_in_aoe(atom/victim, atom/caster) + SHOULD_CALL_PARENT(FALSE) + CRASH("[type] did not implement cast_on_thing_in_aoe and either has no effects or implemented the spell incorrectly.") diff --git a/code/modules/spells/spell_types/aoe_spell/area_conversion.dm b/code/modules/spells/spell_types/aoe_spell/area_conversion.dm new file mode 100644 index 00000000000000..bde25b779332e6 --- /dev/null +++ b/code/modules/spells/spell_types/aoe_spell/area_conversion.dm @@ -0,0 +1,25 @@ +/datum/action/cooldown/spell/aoe/area_conversion + name = "Area Conversion" + desc = "This spell instantly converts a small area around you." + background_icon_state = "bg_cult" + icon_icon = 'icons/mob/actions/actions_cult.dmi' + button_icon_state = "areaconvert" + + school = SCHOOL_TRANSMUTATION + cooldown_time = 5 SECONDS + + invocation_type = INVOCATION_NONE + spell_requirements = NONE + + aoe_radius = 2 + +/datum/action/cooldown/spell/aoe/area_conversion/get_things_to_cast_on(atom/center) + var/list/things = list() + for(var/turf/nearby_turf in range(aoe_radius, center)) + things += nearby_turf + + return things + +/datum/action/cooldown/spell/aoe/area_conversion/cast_on_thing_in_aoe(turf/victim, atom/caster) + playsound(victim, 'sound/items/welder.ogg', 75, TRUE) + victim.narsie_act(FALSE, TRUE, 100 - (get_dist(victim, caster) * 25)) diff --git a/code/modules/spells/spell_types/aoe_spell/knock.dm b/code/modules/spells/spell_types/aoe_spell/knock.dm new file mode 100644 index 00000000000000..fd9e4503de8fd2 --- /dev/null +++ b/code/modules/spells/spell_types/aoe_spell/knock.dm @@ -0,0 +1,20 @@ +/datum/action/cooldown/spell/aoe/knock + name = "Knock" + desc = "This spell opens nearby doors and closets." + button_icon_state = "knock" + + sound = 'sound/magic/knock.ogg' + school = SCHOOL_TRANSMUTATION + cooldown_time = 10 SECONDS + cooldown_reduction_per_rank = 2 SECONDS + + invocation = "AULIE OXIN FIERA" + invocation_type = INVOCATION_WHISPER + spell_requirements = SPELL_REQUIRES_NO_ANTIMAGIC + aoe_radius = 3 + +/datum/action/cooldown/spell/aoe/knock/get_things_to_cast_on(atom/center) + return RANGE_TURFS(aoe_radius, center) + +/datum/action/cooldown/spell/aoe/knock/cast_on_thing_in_aoe(turf/victim, atom/caster) + SEND_SIGNAL(victim, COMSIG_ATOM_MAGICALLY_UNLOCKED, src, caster) diff --git a/code/modules/spells/spell_types/aoe_spell/magic_missile.dm b/code/modules/spells/spell_types/aoe_spell/magic_missile.dm new file mode 100644 index 00000000000000..a1513c1ca897db --- /dev/null +++ b/code/modules/spells/spell_types/aoe_spell/magic_missile.dm @@ -0,0 +1,47 @@ +/datum/action/cooldown/spell/aoe/magic_missile + name = "Magic Missile" + desc = "This spell fires several, slow moving, magic projectiles at nearby targets." + button_icon_state = "magicm" + sound = 'sound/magic/magic_missile.ogg' + + school = SCHOOL_EVOCATION + cooldown_time = 20 SECONDS + cooldown_reduction_per_rank = 3.5 SECONDS + + invocation = "FORTI GY AMA" + invocation_type = INVOCATION_SHOUT + + aoe_radius = 7 + + /// The projectile type fired at all people around us + var/obj/projectile/projectile_type = /obj/projectile/magic/aoe/magic_missile + +/datum/action/cooldown/spell/aoe/magic_missile/get_things_to_cast_on(atom/center) + var/list/things = list() + for(var/mob/living/nearby_mob in view(aoe_radius, center)) + if(nearby_mob == owner || nearby_mob == center) + continue + + things += nearby_mob + + return things + +/datum/action/cooldown/spell/aoe/magic_missile/cast_on_thing_in_aoe(mob/living/victim, atom/caster) + fire_projectile(victim, caster) + +/datum/action/cooldown/spell/aoe/magic_missile/proc/fire_projectile(atom/victim, mob/caster) + var/obj/projectile/to_fire = new projectile_type() + to_fire.preparePixelProjectile(victim, caster) + to_fire.fire() + +/datum/action/cooldown/spell/aoe/magic_missile/lesser + name = "Lesser Magic Missile" + desc = "This spell fires several, slow moving, magic projectiles at nearby targets." + background_icon_state = "bg_demon" + + cooldown_time = 40 SECONDS + invocation_type = INVOCATION_NONE + spell_requirements = SPELL_REQUIRES_NO_ANTIMAGIC + + max_targets = 6 + projectile_type = /obj/projectile/magic/aoe/magic_missile/lesser diff --git a/code/modules/spells/spell_types/aoe_spell/repulse.dm b/code/modules/spells/spell_types/aoe_spell/repulse.dm new file mode 100644 index 00000000000000..9e24ccde61a206 --- /dev/null +++ b/code/modules/spells/spell_types/aoe_spell/repulse.dm @@ -0,0 +1,87 @@ +/datum/action/cooldown/spell/aoe/repulse + /// The max throw range of the repulsioon. + var/max_throw = 5 + /// A visual effect to be spawned on people who are thrown away. + var/obj/effect/sparkle_path = /obj/effect/temp_visual/gravpush + /// The moveforce of the throw done by the repulsion. + var/repulse_force = MOVE_FORCE_EXTREMELY_STRONG + +/datum/action/cooldown/spell/aoe/repulse/get_things_to_cast_on(atom/center) + var/list/things = list() + for(var/atom/movable/nearby_movable in view(aoe_radius, center)) + if(nearby_movable == owner || nearby_movable == center) + continue + if(nearby_movable.anchored) + continue + + things += nearby_movable + + return things + +/datum/action/cooldown/spell/aoe/repulse/cast_on_thing_in_aoe(atom/movable/victim, atom/caster) + if(ismob(victim)) + var/mob/victim_mob = victim + if(victim_mob.can_block_magic(antimagic_flags)) + return + + var/turf/throwtarget = get_edge_target_turf(caster, get_dir(caster, get_step_away(victim, caster))) + var/dist_from_caster = get_dist(victim, caster) + + if(dist_from_caster == 0) + if(isliving(victim)) + var/mob/living/victim_living = victim + victim_living.Paralyze(10 SECONDS) + victim_living.adjustBruteLoss(5) + to_chat(victim, span_userdanger("You're slammed into the floor by [caster]!")) + else + if(sparkle_path) + // Created sparkles will disappear on their own + new sparkle_path(get_turf(victim), get_dir(caster, victim)) + + if(isliving(victim)) + var/mob/living/victim_living = victim + victim_living.Paralyze(4 SECONDS) + to_chat(victim, span_userdanger("You're thrown back by [caster]!")) + + // So stuff gets tossed around at the same time. + victim.safe_throw_at(throwtarget, ((clamp((max_throw - (clamp(dist_from_caster - 2, 0, dist_from_caster))), 3, max_throw))), 1, caster, force = repulse_force) + +/datum/action/cooldown/spell/aoe/repulse/wizard + name = "Repulse" + desc = "This spell throws everything around the user away." + button_icon_state = "repulse" + sound = 'sound/magic/repulse.ogg' + + school = SCHOOL_EVOCATION + invocation = "GITTAH WEIGH" + invocation_type = INVOCATION_SHOUT + aoe_radius = 5 + + cooldown_time = 40 SECONDS + cooldown_reduction_per_rank = 6.25 SECONDS + +/datum/action/cooldown/spell/aoe/repulse/xeno + name = "Tail Sweep" + desc = "Throw back attackers with a sweep of your tail." + background_icon_state = "bg_alien" + icon_icon = 'icons/mob/actions/actions_xeno.dmi' + button_icon_state = "tailsweep" + panel = "Alien" + sound = 'sound/magic/tail_swing.ogg' + + cooldown_time = 15 SECONDS + spell_requirements = NONE + + invocation_type = INVOCATION_NONE + antimagic_flags = NONE + aoe_radius = 2 + + sparkle_path = /obj/effect/temp_visual/dir_setting/tailsweep + +/datum/action/cooldown/spell/aoe/repulse/xeno/cast(atom/cast_on) + if(iscarbon(cast_on)) + var/mob/living/carbon/carbon_caster = cast_on + playsound(get_turf(carbon_caster), 'sound/voice/hiss5.ogg', 80, TRUE, TRUE) + carbon_caster.spin(6, 1) + + return ..() diff --git a/code/modules/spells/spell_types/aoe_spell/sacred_flame.dm b/code/modules/spells/spell_types/aoe_spell/sacred_flame.dm new file mode 100644 index 00000000000000..450544a7a1f662 --- /dev/null +++ b/code/modules/spells/spell_types/aoe_spell/sacred_flame.dm @@ -0,0 +1,39 @@ +/datum/action/cooldown/spell/aoe/sacred_flame + name = "Sacred Flame" + desc = "Makes everyone around you more flammable, and lights yourself on fire." + button_icon_state = "sacredflame" + sound = 'sound/magic/fireball.ogg' + + school = SCHOOL_EVOCATION + cooldown_time = 6 SECONDS + + invocation = "FI'RAN DADISKO" + invocation_type = INVOCATION_SHOUT + spell_requirements = SPELL_REQUIRES_NO_ANTIMAGIC + + aoe_radius = 6 + + /// The amount of firestacks to put people afflicted. + var/firestacks_to_give = 20 + +/datum/action/cooldown/spell/aoe/sacred_flame/get_things_to_cast_on(atom/center) + var/list/things = list() + for(var/mob/living/nearby_mob in view(aoe_radius, center)) + things += nearby_mob + + return things + +/datum/action/cooldown/spell/aoe/sacred_flame/cast_on_thing_in_aoe(mob/living/victim, mob/living/caster) + if(victim.can_block_magic(antimagic_flags)) + return + + victim.adjust_fire_stacks(firestacks_to_give) + // Let people who got afflicted know they're suddenly a matchstick + // But skip the caster - they'll know anyways. + if(victim != caster) + to_chat(victim, span_warning("You suddenly feel very flammable.")) + +/datum/action/cooldown/spell/aoe/sacred_flame/cast(mob/living/cast_on) + . = ..() + cast_on.ignite_mob() + to_chat(cast_on, span_danger("You feel a roaring flame build up inside you!")) diff --git a/code/modules/spells/spell_types/area_teleport.dm b/code/modules/spells/spell_types/area_teleport.dm deleted file mode 100644 index 3463d9fa6eafbb..00000000000000 --- a/code/modules/spells/spell_types/area_teleport.dm +++ /dev/null @@ -1,92 +0,0 @@ -/obj/effect/proc_holder/spell/targeted/area_teleport - name = "Area teleport" - desc = "This spell teleports you to a type of area of your selection." - nonabstract_req = TRUE - school = SCHOOL_TRANSLOCATION - - var/randomise_selection = FALSE //if it lets the usr choose the teleport loc or picks it from the list - var/invocation_area = TRUE //if the invocation appends the selected area - var/sound1 = 'sound/weapons/zapbang.ogg' - var/sound2 = 'sound/weapons/zapbang.ogg' - - var/say_destination = TRUE - -/obj/effect/proc_holder/spell/targeted/area_teleport/perform(list/targets, recharge = 1,mob/living/user = usr) - var/thearea = before_cast(targets) - if(!thearea || !cast_check(1)) - revert_cast() - return - invocation(thearea,user) - if(charge_type == "recharge" && recharge) - INVOKE_ASYNC(src, .proc/start_recharge) - cast(targets,thearea,user) - after_cast(targets) - -/obj/effect/proc_holder/spell/targeted/area_teleport/before_cast(list/targets) - var/target_area = null - - if(!randomise_selection) - target_area = tgui_input_list(usr, "Area to teleport to", "Teleport", GLOB.teleportlocs) - else - target_area = pick(GLOB.teleportlocs) - if(isnull(target_area)) - return - if(isnull(GLOB.teleportlocs[target_area])) - return - var/area/thearea = GLOB.teleportlocs[target_area] - - return thearea - -/obj/effect/proc_holder/spell/targeted/area_teleport/cast(list/targets,area/thearea,mob/user = usr) - playsound(get_turf(user), sound1, 50,TRUE) - for(var/mob/living/target in targets) - var/list/L = list() - for(var/turf/T in get_area_turfs(thearea.type)) - if(!T.density) - var/clear = TRUE - for(var/obj/O in T) - if(O.density) - clear = FALSE - break - if(clear) - L+=T - - if(!length(L)) - to_chat(usr, span_warning("The spell matrix was unable to locate a suitable teleport destination for an unknown reason. Sorry.")) - return - - if(target?.buckled) - target.buckled.unbuckle_mob(target, force=1) - - var/list/tempL = L - var/attempt = null - var/success = FALSE - while(length(tempL)) - attempt = pick(tempL) - do_teleport(target, attempt, channel = TELEPORT_CHANNEL_MAGIC) - if(get_turf(target) == attempt) - success = TRUE - break - else - tempL.Remove(attempt) - - if(!success) - do_teleport(target, L, channel = TELEPORT_CHANNEL_MAGIC) - playsound(get_turf(user), sound2, 50,TRUE) - -/obj/effect/proc_holder/spell/targeted/area_teleport/invocation(area/chosenarea = null,mob/living/user = usr) - if(!invocation_area || !chosenarea) - ..() - else - var/words - if(say_destination) - words = "[invocation] [uppertext(chosenarea.name)]" - else - words = "[invocation]" - - switch(invocation_type) - if(INVOCATION_SHOUT) - user.say(words, forced = "spell") - playsound(user.loc, pick('sound/misc/null.ogg','sound/misc/null.ogg'), 100, TRUE) - if(INVOCATION_WHISPER) - user.whisper(words, forced = "spell") diff --git a/code/modules/spells/spell_types/bloodcrawl.dm b/code/modules/spells/spell_types/bloodcrawl.dm deleted file mode 100644 index b47941fb346472..00000000000000 --- a/code/modules/spells/spell_types/bloodcrawl.dm +++ /dev/null @@ -1,54 +0,0 @@ -/obj/effect/proc_holder/spell/bloodcrawl - name = "Blood Crawl" - desc = "Use pools of blood to phase out of existence." - charge_max = 0 - clothes_req = FALSE - //If you couldn't cast this while phased, you'd have a problem - phase_allowed = TRUE - selection_type = "range" - range = 1 - cooldown_min = 0 - overlay = null - action_icon = 'icons/mob/actions/actions_minor_antag.dmi' - action_icon_state = "bloodcrawl" - action_background_icon_state = "bg_demon" - var/phased = FALSE - -/obj/effect/proc_holder/spell/bloodcrawl/on_lose(mob/living/user) - if(phased) - user.phasein(get_turf(user), TRUE) - -/obj/effect/proc_holder/spell/bloodcrawl/cast_check(skipcharge = 0,mob/user = usr) - . = ..() - if(!.) - return FALSE - var/area/noteleport_check = get_area(user) - if(noteleport_check && noteleport_check.area_flags & NOTELEPORT) - to_chat(user, span_danger("Some dull, universal force is between you and your other existence, preventing you from blood crawling.")) - return FALSE - -/obj/effect/proc_holder/spell/bloodcrawl/choose_targets(mob/user = usr) - for(var/obj/effect/decal/cleanable/target in range(range, get_turf(user))) - if(target.can_bloodcrawl_in()) - perform(target) - return - revert_cast() - to_chat(user, span_warning("There must be a nearby source of blood!")) - -/obj/effect/proc_holder/spell/bloodcrawl/perform(obj/effect/decal/cleanable/target, recharge = 1, mob/living/user = usr) - if(istype(user)) - if(istype(user, /mob/living/simple_animal/hostile/imp/slaughter)) - var/mob/living/simple_animal/hostile/imp/slaughter/slaught = user - slaught.current_hitstreak = 0 - slaught.wound_bonus = initial(slaught.wound_bonus) - slaught.bare_wound_bonus = initial(slaught.bare_wound_bonus) - if(phased) - if(user.phasein(target)) - phased = FALSE - else - if(user.phaseout(target)) - phased = TRUE - start_recharge() - return - revert_cast() - to_chat(user, span_warning("You are unable to blood crawl!")) diff --git a/code/modules/spells/spell_types/charge.dm b/code/modules/spells/spell_types/charge.dm deleted file mode 100644 index 754b731f7807d5..00000000000000 --- a/code/modules/spells/spell_types/charge.dm +++ /dev/null @@ -1,56 +0,0 @@ -/obj/effect/proc_holder/spell/targeted/charge - name = "Charge" - desc = "This spell can be used to recharge a variety of things in your hands, \ - from magical artifacts to electrical components. A creative wizard can even use it \ - to grant magical power to a fellow magic user." - sound = 'sound/magic/charge.ogg' - action_icon_state = "charge" - - school = SCHOOL_TRANSMUTATION - charge_max = 600 - clothes_req = FALSE - invocation = "DIRI CEL" - invocation_type = INVOCATION_WHISPER - range = -1 - cooldown_min = 400 //50 deciseconds reduction per rank - include_user = TRUE - -/obj/effect/proc_holder/spell/targeted/charge/cast(list/targets, mob/user = usr) - // Charge people we're pulling first and foremost - if(isliving(user.pulling)) - var/mob/living/pulled_living = user.pulling - var/pulled_has_spells = FALSE - - for(var/obj/effect/proc_holder/spell/spell in pulled_living.mob_spell_list | pulled_living.mind?.spell_list) - spell.charge_counter = spell.charge_max - spell.recharging = FALSE - spell.update_appearance() - pulled_has_spells = TRUE - - if(pulled_has_spells) - to_chat(pulled_living, span_notice("You feel raw magic flowing through you. It feels good!")) - to_chat(user, span_notice("[pulled_living] suddenly feels very warm!")) - return - - to_chat(pulled_living, span_notice("You feel very strange for a moment, but then it passes.")) - - // Then charge their main hand item, then charge their offhand item - var/obj/item/to_charge = user.get_active_held_item() || user.get_inactive_held_item() - if(!to_charge) - to_chat(user, span_notice("You feel magical power surging through your hands, but the feeling rapidly fades.")) - return - - var/charge_return = SEND_SIGNAL(to_charge, COMSIG_ITEM_MAGICALLY_CHARGED, src, user) - - if(QDELETED(to_charge)) - to_chat(user, span_warning("[src] seems to react adversely with [to_charge]!")) - return - - if(charge_return & COMPONENT_ITEM_BURNT_OUT) - to_chat(user, span_warning("[to_charge] seems to react negatively to [src], becoming uncomfortably warm!")) - - else if(charge_return & COMPONENT_ITEM_CHARGED) - to_chat(user, span_notice("[to_charge] suddenly feels very warm!")) - - else - to_chat(user, span_notice("[to_charge] doesn't seem to be react to [src].")) diff --git a/code/modules/spells/spell_types/cone/_cone.dm b/code/modules/spells/spell_types/cone/_cone.dm new file mode 100644 index 00000000000000..0832b01b97dfbc --- /dev/null +++ b/code/modules/spells/spell_types/cone/_cone.dm @@ -0,0 +1,123 @@ +/** + * ## Cone spells + * + * Cone spells shoot off as a cone from the caster. + */ +/datum/action/cooldown/spell/cone + /// This controls how many levels the cone has. Increase this value to make a bigger cone. + var/cone_levels = 3 + /// This value determines if the cone penetrates walls. + var/respect_density = FALSE + +/datum/action/cooldown/spell/cone/cast(atom/cast_on) + . = ..() + var/list/cone_turfs = get_cone_turfs(get_turf(cast_on), cast_on.dir, cone_levels) + SEND_SIGNAL(src, COMSIG_SPELL_CONE_ON_CAST, cone_turfs, cast_on) + make_cone(cone_turfs, cast_on) + +/datum/action/cooldown/spell/cone/proc/make_cone(list/cone_turfs, atom/caster) + for(var/list/turf_list in cone_turfs) + do_cone_effects(turf_list, caster) + +/// This proc does obj, mob and turf cone effects on all targets in the passed list. +/datum/action/cooldown/spell/cone/proc/do_cone_effects(list/target_turf_list, atom/caster, level = 1) + SEND_SIGNAL(src, COMSIG_SPELL_CONE_ON_LAYER_EFFECT, target_turf_list, caster, level) + for(var/turf/target_turf as anything in target_turf_list) + if(QDELETED(target_turf)) //if turf is no longer there + continue + + do_turf_cone_effect(target_turf, caster, level) + if(!isopenturf(target_turf)) + continue + + for(var/atom/movable/movable_content as anything in target_turf) + if(isobj(movable_content)) + do_obj_cone_effect(movable_content, level) + else if(isliving(movable_content)) + do_mob_cone_effect(movable_content, level) + +///This proc deterimines how the spell will affect turfs. +/datum/action/cooldown/spell/cone/proc/do_turf_cone_effect(turf/target_turf, atom/caster, level) + return + +///This proc deterimines how the spell will affect objects. +/datum/action/cooldown/spell/cone/proc/do_obj_cone_effect(obj/target_obj, atom/caster, level) + return + +///This proc deterimines how the spell will affect mobs. +/datum/action/cooldown/spell/cone/proc/do_mob_cone_effect(mob/living/target_mob, atom/caster, level) + return + +///This proc creates a list of turfs that are hit by the cone. +/datum/action/cooldown/spell/cone/proc/get_cone_turfs(turf/starter_turf, dir_to_use, cone_levels = 3) + var/list/turfs_to_return = list() + var/turf/turf_to_use = starter_turf + var/turf/left_turf + var/turf/right_turf + var/right_dir + var/left_dir + switch(dir_to_use) + if(NORTH) + left_dir = WEST + right_dir = EAST + if(SOUTH) + left_dir = EAST + right_dir = WEST + if(EAST) + left_dir = NORTH + right_dir = SOUTH + if(WEST) + left_dir = SOUTH + right_dir = NORTH + + for(var/i in 1 to cone_levels) + var/list/level_turfs = list() + turf_to_use = get_step(turf_to_use, dir_to_use) + level_turfs += turf_to_use + if(i != 1) + left_turf = get_step(turf_to_use, left_dir) + level_turfs += left_turf + right_turf = get_step(turf_to_use, right_dir) + level_turfs += right_turf + for(var/left_i in 1 to i -calculate_cone_shape(i)) + if(left_turf.density && respect_density) + break + left_turf = get_step(left_turf, left_dir) + level_turfs += left_turf + for(var/right_i in 1 to i -calculate_cone_shape(i)) + if(right_turf.density && respect_density) + break + right_turf = get_step(right_turf, right_dir) + level_turfs += right_turf + turfs_to_return += list(level_turfs) + if(i == cone_levels) + continue + if(turf_to_use.density && respect_density) + break + return turfs_to_return + +///This proc adjusts the cones width depending on the level. +/datum/action/cooldown/spell/cone/proc/calculate_cone_shape(current_level) + var/end_taper_start = round(cone_levels * 0.8) + if(current_level > end_taper_start) + return (current_level % end_taper_start) * 2 //someone more talented and probably come up with a better formula. + else + return 2 + +/** + * ### Staggered Cone + * + * Staggered Cone spells will reach each cone level + * gradually / with a delay, instead of affecting the entire + * cone area at once. + */ +/datum/action/cooldown/spell/cone/staggered + + /// The delay between each cone level triggering. + var/delay_between_level = 0.2 SECONDS + +/datum/action/cooldown/spell/cone/staggered/make_cone(list/cone_turfs, atom/caster) + var/level_counter = 0 + for(var/list/turf_list in cone_turfs) + level_counter++ + addtimer(CALLBACK(src, .proc/do_cone_effects, turf_list, caster, level_counter), delay_between_level * level_counter) diff --git a/code/modules/spells/spell_types/cone_spells.dm b/code/modules/spells/spell_types/cone_spells.dm deleted file mode 100644 index 47f3348778d989..00000000000000 --- a/code/modules/spells/spell_types/cone_spells.dm +++ /dev/null @@ -1,117 +0,0 @@ -/obj/effect/proc_holder/spell/cone - name = "Cone of Nothing" - desc = "Does nothing in a cone! Wow!" - school = SCHOOL_EVOCATION - charge_max = 100 - clothes_req = FALSE - invocation = "FUKAN NOTHAN" - invocation_type = INVOCATION_SHOUT - sound = 'sound/magic/forcewall.ogg' - action_icon_state = "shield" - range = -1 - cooldown_min = 0.5 SECONDS - ///This controls how many levels the cone has, increase this value to make a bigger cone. - var/cone_levels = 3 - ///This value determines if the cone penetrates walls. - var/respect_density = FALSE - -/obj/effect/proc_holder/spell/cone/choose_targets(mob/user = usr) - perform(null, user=user) - -///This proc creates a list of turfs that are hit by the cone -/obj/effect/proc_holder/spell/cone/proc/cone_helper(turf/starter_turf, dir_to_use, cone_levels = 3) - var/list/turfs_to_return = list() - var/turf/turf_to_use = starter_turf - var/turf/left_turf - var/turf/right_turf - var/right_dir - var/left_dir - switch(dir_to_use) - if(NORTH) - left_dir = WEST - right_dir = EAST - if(SOUTH) - left_dir = EAST - right_dir = WEST - if(EAST) - left_dir = NORTH - right_dir = SOUTH - if(WEST) - left_dir = SOUTH - right_dir = NORTH - - - for(var/i in 1 to cone_levels) - var/list/level_turfs = list() - turf_to_use = get_step(turf_to_use, dir_to_use) - level_turfs += turf_to_use - if(i != 1) - left_turf = get_step(turf_to_use, left_dir) - level_turfs += left_turf - right_turf = get_step(turf_to_use, right_dir) - level_turfs += right_turf - for(var/left_i in 1 to i -calculate_cone_shape(i)) - if(left_turf.density && respect_density) - break - left_turf = get_step(left_turf, left_dir) - level_turfs += left_turf - for(var/right_i in 1 to i -calculate_cone_shape(i)) - if(right_turf.density && respect_density) - break - right_turf = get_step(right_turf, right_dir) - level_turfs += right_turf - turfs_to_return += list(level_turfs) - if(i == cone_levels) - continue - if(turf_to_use.density && respect_density) - break - return turfs_to_return - -/obj/effect/proc_holder/spell/cone/cast(list/targets,mob/user = usr) - var/list/cone_turfs = cone_helper(get_turf(user), user.dir, cone_levels) - for(var/list/turf_list in cone_turfs) - do_cone_effects(turf_list) - -///This proc does obj, mob and turf cone effects on all targets in a list -/obj/effect/proc_holder/spell/cone/proc/do_cone_effects(list/target_turf_list, level) - for(var/target_turf in target_turf_list) - if(!target_turf) //if turf is no longer there - continue - do_turf_cone_effect(target_turf, level) - if(isopenturf(target_turf)) - var/turf/open/open_turf = target_turf - for(var/movable_content in open_turf) - if(isobj(movable_content)) - do_obj_cone_effect(movable_content, level) - else if(isliving(movable_content)) - do_mob_cone_effect(movable_content, level) - -///This proc deterimines how the spell will affect turfs. -/obj/effect/proc_holder/spell/cone/proc/do_turf_cone_effect(turf/target_turf, level) - return - -///This proc deterimines how the spell will affect objects. -/obj/effect/proc_holder/spell/cone/proc/do_obj_cone_effect(obj/target_obj, level) - return - -///This proc deterimines how the spell will affect mobs. -/obj/effect/proc_holder/spell/cone/proc/do_mob_cone_effect(mob/living/target_mob, level) - return - -///This proc adjusts the cones width depending on the level. -/obj/effect/proc_holder/spell/cone/proc/calculate_cone_shape(current_level) - var/end_taper_start = round(cone_levels * 0.8) - if(current_level > end_taper_start) - return (current_level % end_taper_start) * 2 //someone more talented and probably come up with a better formula. - else - return 2 - -///This type of cone gradually affects each level of the cone instead of affecting the entire area at once. -/obj/effect/proc_holder/spell/cone/staggered - -/obj/effect/proc_holder/spell/cone/staggered/cast(list/targets,mob/user = usr) - var/level_counter = 0 - var/list/cone_turfs = cone_helper(get_turf(user), user.dir, cone_levels) - for(var/list/turf_list in cone_turfs) - level_counter++ - addtimer(CALLBACK(src, .proc/do_cone_effects, turf_list, level_counter), 2 * level_counter) diff --git a/code/modules/spells/spell_types/conjure.dm b/code/modules/spells/spell_types/conjure.dm deleted file mode 100644 index c91a6fb2b05377..00000000000000 --- a/code/modules/spells/spell_types/conjure.dm +++ /dev/null @@ -1,109 +0,0 @@ -/obj/effect/proc_holder/spell/aoe_turf/conjure - name = "Conjure" - desc = "This spell conjures objs of the specified types in range." - - school = SCHOOL_CONJURATION - - var/list/summon_type = list() //determines what exactly will be summoned - //should be text, like list("/mob/living/simple_animal/bot/ed209") - - var/summon_lifespan = 0 // 0=permanent, any other time in deciseconds - var/summon_amt = 1 //amount of objects summoned - var/summon_ignore_density = FALSE //if set to TRUE, adds dense tiles to possible spawn places - var/summon_ignore_prev_spawn_points = TRUE //if set to TRUE, each new object is summoned on a new spawn point - - var/list/new_vars = list() //vars of the summoned objects will be replaced with those where they meet - //should have format of list("emagged" = 1,"name" = "Wizard's Justicebot"), for example - - var/cast_sound = 'sound/items/welder.ogg' - -/obj/effect/proc_holder/spell/aoe_turf/conjure/cast(list/targets,mob/user = usr) - playsound(get_turf(user), cast_sound, 50,TRUE) - for(var/turf/T in targets) - if(T.density && !summon_ignore_density) - targets -= T - - for(var/i in 1 to summon_amt) - if(!targets.len) - break - var/summoned_object_type = pick(summon_type) - var/spawn_place = pick(targets) - if(summon_ignore_prev_spawn_points) - targets -= spawn_place - if(ispath(summoned_object_type, /turf)) - var/turf/O = spawn_place - var/N = summoned_object_type - O.ChangeTurf(N, flags = CHANGETURF_INHERIT_AIR) - else - var/atom/summoned_object = new summoned_object_type(spawn_place) - - for(var/varName in new_vars) - if(varName in new_vars) - summoned_object.vv_edit_var(varName, new_vars[varName]) - summoned_object.flags_1 |= ADMIN_SPAWNED_1 - if(summon_lifespan) - QDEL_IN(summoned_object, summon_lifespan) - - post_summon(summoned_object, user) - -/obj/effect/proc_holder/spell/aoe_turf/conjure/proc/post_summon(atom/summoned_object, mob/user) - return - -/obj/effect/proc_holder/spell/aoe_turf/conjure/summon_ed_swarm //test purposes - Also a lot of fun - name = "Dispense Wizard Justice" - desc = "This spell dispenses wizard justice." - summon_type = list(/mob/living/simple_animal/bot/secbot/ed209) - summon_amt = 10 - range = 3 - new_vars = list( - "emagged" = 2, - "remote_disabled" = 1, - "shoot_sound" = 'sound/weapons/laser.ogg', - "projectile" = /obj/projectile/beam/laser, - "security_mode_flags" = ~(SECBOT_DECLARE_ARRESTS), - "name" = "Wizard's Justicebot", - ) - -/obj/effect/proc_holder/spell/aoe_turf/conjure/link_worlds - name = "Link Worlds" - desc = "A whole new dimension for you to play with! They won't be happy about it, though." - invocation = "WTF" - clothes_req = FALSE - charge_max = 600 - cooldown_min = 200 - summon_type = list(/obj/structure/spawner/nether) - summon_amt = 1 - range = 1 - cast_sound = 'sound/weapons/marauder.ogg' - -/obj/effect/proc_holder/spell/targeted/conjure_item - name = "Summon weapon" - desc = "A generic spell that should not exist. This summons an instance of a specific type of item, or if one already exists, un-summons it. Summons into hand if possible." - invocation_type = INVOCATION_NONE - include_user = TRUE - range = -1 - clothes_req = FALSE - ///List of weakrefs to items summoned - var/list/datum/weakref/item_refs = list() - var/item_type = /obj/item/banhammer - school = SCHOOL_CONJURATION - charge_max = 150 - cooldown_min = 10 - var/delete_old = TRUE //TRUE to delete the last summoned object if it's still there, FALSE for infinite item stream weeeee - -/obj/effect/proc_holder/spell/targeted/conjure_item/cast(list/targets, mob/user = usr) - if (delete_old && length(item_refs)) - QDEL_LIST(item_refs) - return - for(var/mob/living/carbon/C in targets) - if(C.dropItemToGround(C.get_active_held_item())) - C.put_in_hands(make_item(), TRUE) - -/obj/effect/proc_holder/spell/targeted/conjure_item/Destroy() - QDEL_LIST(item_refs) - return ..() - -/obj/effect/proc_holder/spell/targeted/conjure_item/proc/make_item() - var/obj/item/item = new item_type - item_refs += WEAKREF(item) - return item diff --git a/code/modules/spells/spell_types/conjure/_conjure.dm b/code/modules/spells/spell_types/conjure/_conjure.dm new file mode 100644 index 00000000000000..9483bb57b43d1b --- /dev/null +++ b/code/modules/spells/spell_types/conjure/_conjure.dm @@ -0,0 +1,50 @@ +/datum/action/cooldown/spell/conjure + sound = 'sound/items/welder.ogg' + school = SCHOOL_CONJURATION + + /// The radius around the caster the items will appear. 0 = spawns on top of the caster. + var/summon_radius = 7 + /// A list of types that will be created on summon. + /// The type is picked from this list, not all provided are guaranteed. + var/list/summon_type = list() + /// How long before the summons will be despawned. Set to 0 for permanent. + var/summon_lifespan = 0 + /// Amount of summons to create. + var/summon_amount = 1 + /// If TRUE, summoned objects will not be spawned in dense turfs. + var/summon_respects_density = FALSE + /// If TRUE, no two summons can be spawned in the same turf. + var/summon_respects_prev_spawn_points = TRUE + +/datum/action/cooldown/spell/conjure/cast(atom/cast_on) + . = ..() + var/list/to_summon_in = list() + for(var/turf/summon_turf in range(summon_radius, cast_on)) + if(summon_respects_density && summon_turf.density) + continue + to_summon_in += summon_turf + + for(var/i in 1 to summon_amount) + if(!length(to_summon_in)) + break + + var/atom/summoned_object_type = pick(summon_type) + var/turf/spawn_place = pick(to_summon_in) + if(summon_respects_prev_spawn_points) + to_summon_in -= spawn_place + + if(ispath(summoned_object_type, /turf)) + spawn_place.ChangeTurf(summoned_object_type, flags = CHANGETURF_INHERIT_AIR) + + else + var/atom/summoned_object = new summoned_object_type(spawn_place) + + summoned_object.flags_1 |= ADMIN_SPAWNED_1 + if(summon_lifespan > 0) + QDEL_IN(summoned_object, summon_lifespan) + + post_summon(summoned_object, cast_on) + +/// Called on atoms summoned after they are created, allows extra variable editing and such of created objects +/datum/action/cooldown/spell/conjure/proc/post_summon(atom/summoned_object, atom/cast_on) + return diff --git a/code/modules/spells/spell_types/conjure/bees.dm b/code/modules/spells/spell_types/conjure/bees.dm new file mode 100644 index 00000000000000..036abbc0f9b6f4 --- /dev/null +++ b/code/modules/spells/spell_types/conjure/bees.dm @@ -0,0 +1,18 @@ +/datum/action/cooldown/spell/conjure/bee + name = "Lesser Summon Bees" + desc = "This spell magically kicks a transdimensional beehive, \ + instantly summoning a swarm of bees to your location. \ + These bees are NOT friendly to anyone." + button_icon_state = "bee" + sound = 'sound/voice/moth/scream_moth.ogg' + + school = SCHOOL_CONJURATION + cooldown_time = 1 MINUTES + cooldown_reduction_per_rank = 10 SECONDS + + invocation = "NOT THE BEES" + invocation_type = INVOCATION_SHOUT + + summon_radius = 3 + summon_type = list(/mob/living/simple_animal/hostile/bee/toxin) + summon_amount = 9 diff --git a/code/modules/spells/spell_types/conjure/carp.dm b/code/modules/spells/spell_types/conjure/carp.dm new file mode 100644 index 00000000000000..45007ee85037bb --- /dev/null +++ b/code/modules/spells/spell_types/conjure/carp.dm @@ -0,0 +1,13 @@ +/datum/action/cooldown/spell/conjure/carp + name = "Summon Carp" + desc = "This spell conjures a simple carp." + sound = 'sound/magic/summon_karp.ogg' + + school = SCHOOL_CONJURATION + cooldown_time = 2 MINUTES + + invocation = "NOUK FHUNMM SACP RISSKA" + invocation_type = INVOCATION_SHOUT + + summon_radius = 1 + summon_type = list(/mob/living/simple_animal/hostile/carp) diff --git a/code/modules/spells/spell_types/conjure/constructs.dm b/code/modules/spells/spell_types/conjure/constructs.dm new file mode 100644 index 00000000000000..50124ce1319fa5 --- /dev/null +++ b/code/modules/spells/spell_types/conjure/constructs.dm @@ -0,0 +1,20 @@ +/datum/action/cooldown/spell/conjure/construct + name = "Summon Construct Shell" + desc = "This spell conjures a construct which may be controlled by Shades." + icon_icon = 'icons/mob/actions/actions_cult.dmi' + button_icon_state = "artificer" + sound = 'sound/magic/summonitems_generic.ogg' + + school = SCHOOL_CONJURATION + cooldown_time = 1 MINUTES + + invocation_type = INVOCATION_NONE + spell_requirements = NONE + + summon_radius = 0 + summon_type = list(/obj/structure/constructshell) + +/datum/action/cooldown/spell/conjure/construct/lesser // Used by artificers. + name = "Create Construct Shell" + background_icon_state = "bg_demon" + cooldown_time = 3 MINUTES diff --git a/code/modules/spells/spell_types/conjure/creatures.dm b/code/modules/spells/spell_types/conjure/creatures.dm new file mode 100644 index 00000000000000..c51d4d114df009 --- /dev/null +++ b/code/modules/spells/spell_types/conjure/creatures.dm @@ -0,0 +1,15 @@ +/datum/action/cooldown/spell/conjure/creature + name = "Summon Creature Swarm" + desc = "This spell tears the fabric of reality, allowing horrific daemons to spill forth." + sound = 'sound/magic/summonitems_generic.ogg' + + school = SCHOOL_CONJURATION + cooldown_time = 2 MINUTES + + invocation = "IA IA" + invocation_type = INVOCATION_SHOUT + spell_requirements = NONE + + summon_radius = 3 + summon_type = list(/mob/living/simple_animal/hostile/netherworld) + summon_amount = 10 diff --git a/code/modules/spells/spell_types/conjure/cult_turfs.dm b/code/modules/spells/spell_types/conjure/cult_turfs.dm new file mode 100644 index 00000000000000..7fec43aa8d4048 --- /dev/null +++ b/code/modules/spells/spell_types/conjure/cult_turfs.dm @@ -0,0 +1,29 @@ +/datum/action/cooldown/spell/conjure/cult_floor + name = "Summon Cult Floor" + desc = "This spell constructs a cult floor." + background_icon_state = "bg_cult" + icon_icon = 'icons/mob/actions/actions_cult.dmi' + button_icon_state = "floorconstruct" + + school = SCHOOL_CONJURATION + cooldown_time = 2 SECONDS + invocation_type = INVOCATION_NONE + spell_requirements = NONE + + summon_radius = 0 + summon_type = list(/turf/open/floor/engine/cult) + +/datum/action/cooldown/spell/conjure/cult_wall + name = "Summon Cult Wall" + desc = "This spell constructs a cult wall." + background_icon_state = "bg_cult" + icon_icon = 'icons/mob/actions/actions_cult.dmi' + button_icon_state = "lesserconstruct" + + school = SCHOOL_CONJURATION + cooldown_time = 10 SECONDS + invocation_type = INVOCATION_NONE + spell_requirements = NONE + + summon_radius = 0 + summon_type = list(/turf/closed/wall/mineral/cult/artificer) // We don't want artificer-based runed metal farms. diff --git a/code/modules/spells/spell_types/conjure/ed_swarm.dm b/code/modules/spells/spell_types/conjure/ed_swarm.dm new file mode 100644 index 00000000000000..db122e4c846a79 --- /dev/null +++ b/code/modules/spells/spell_types/conjure/ed_swarm.dm @@ -0,0 +1,22 @@ +// test purposes - Also a lot of fun +/datum/action/cooldown/spell/conjure/summon_ed_swarm + name = "Dispense Wizard Justice" + desc = "This spell dispenses wizard justice." + + summon_radius = 3 + summon_type = list(/mob/living/simple_animal/bot/secbot/ed209) + summon_amount = 10 + +/datum/action/cooldown/spell/conjure/summon_ed_swarm/post_summon(atom/summoned_object, atom/cast_on) + if(!istype(summoned_object, /mob/living/simple_animal/bot/secbot/ed209)) + return + + var/mob/living/simple_animal/bot/secbot/ed209/summoned_bot = summoned_object + summoned_bot.name = "Wizard's Justicebot" + + summoned_bot.security_mode_flags = ~SECBOT_DECLARE_ARRESTS + summoned_bot.bot_mode_flags &= ~BOT_MODE_REMOTE_ENABLED + summoned_bot.bot_mode_flags |= BOT_COVER_EMAGGED + + summoned_bot.projectile = /obj/projectile/beam/laser + summoned_bot.shoot_sound = 'sound/weapons/laser.ogg' diff --git a/code/modules/spells/spell_types/conjure/invisible_chair.dm b/code/modules/spells/spell_types/conjure/invisible_chair.dm new file mode 100644 index 00000000000000..e0694898c096ca --- /dev/null +++ b/code/modules/spells/spell_types/conjure/invisible_chair.dm @@ -0,0 +1,34 @@ +/datum/action/cooldown/spell/conjure/invisible_chair + name = "Invisible Chair" + desc = "The mime's performance transmutates a chair into physical reality." + background_icon_state = "bg_mime" + icon_icon = 'icons/mob/actions/actions_mime.dmi' + button_icon_state = "invisible_chair" + panel = "Mime" + sound = null + + school = SCHOOL_MIME + cooldown_time = 30 SECONDS + invocation = "Someone does a weird gesture." // Overriden in before cast + invocation_self_message = span_notice("You conjure an invisible chair and sit down.") + invocation_type = INVOCATION_EMOTE + + spell_requirements = SPELL_REQUIRES_HUMAN|SPELL_REQUIRES_MIME_VOW + antimagic_flags = NONE + spell_max_level = 1 + + summon_radius = 0 + summon_type = list(/obj/structure/chair/mime) + summon_lifespan = 25 SECONDS + +/datum/action/cooldown/spell/conjure/invisible_chair/before_cast(atom/cast_on) + . = ..() + invocation = span_notice("[cast_on] pulls out an invisible chair and sits down.") + +/datum/action/cooldown/spell/conjure/invisible_chair/post_summon(atom/summoned_object, mob/living/carbon/human/cast_on) + if(!isobj(summoned_object)) + return + + var/obj/chair = summoned_object + chair.setDir(cast_on.dir) + chair.buckle_mob(cast_on) diff --git a/code/modules/spells/spell_types/conjure/invisible_wall.dm b/code/modules/spells/spell_types/conjure/invisible_wall.dm new file mode 100644 index 00000000000000..9433fbd7df0a57 --- /dev/null +++ b/code/modules/spells/spell_types/conjure/invisible_wall.dm @@ -0,0 +1,26 @@ +/datum/action/cooldown/spell/conjure/invisible_wall + name = "Invisible Wall" + desc = "The mime's performance transmutates a wall into physical reality." + background_icon_state = "bg_mime" + icon_icon = 'icons/mob/actions/actions_mime.dmi' + button_icon_state = "invisible_wall" + panel = "Mime" + sound = null + + school = SCHOOL_MIME + cooldown_time = 30 SECONDS + invocation = "Someone does a weird gesture." // Overriden in before cast + invocation_self_message = span_notice("You form a wall in front of yourself.") + invocation_type = INVOCATION_EMOTE + + spell_requirements = SPELL_REQUIRES_HUMAN|SPELL_REQUIRES_MIME_VOW + antimagic_flags = NONE + spell_max_level = 1 + + summon_radius = 0 + summon_type = list(/obj/effect/forcefield/mime) + summon_lifespan = 30 SECONDS + +/datum/action/cooldown/spell/conjure/invisible_wall/before_cast(atom/cast_on) + . = ..() + invocation = span_notice("[cast_on] looks as if a wall is in front of [cast_on.p_them()].") diff --git a/code/modules/spells/spell_types/conjure/link_worlds.dm b/code/modules/spells/spell_types/conjure/link_worlds.dm new file mode 100644 index 00000000000000..f227fc1a13e9a2 --- /dev/null +++ b/code/modules/spells/spell_types/conjure/link_worlds.dm @@ -0,0 +1,15 @@ +/datum/action/cooldown/spell/conjure/link_worlds + name = "Link Worlds" + desc = "A whole new dimension for you to play with! They won't be happy about it, though." + + sound = 'sound/weapons/marauder.ogg' + cooldown_time = 1 MINUTES + cooldown_reduction_per_rank = 10 SECONDS + + invocation = "WTF" + invocation_type = INVOCATION_SHOUT + spell_requirements = NONE + + summon_radius = 1 + summon_type = list(/obj/structure/spawner/nether) + summon_amount = 1 diff --git a/code/modules/spells/spell_types/conjure/presents.dm b/code/modules/spells/spell_types/conjure/presents.dm new file mode 100644 index 00000000000000..057fef9b9b4a80 --- /dev/null +++ b/code/modules/spells/spell_types/conjure/presents.dm @@ -0,0 +1,14 @@ +/datum/action/cooldown/spell/conjure/presents + name = "Conjure Presents!" + desc = "This spell lets you reach into S-space and retrieve presents! Yay!" + + school = SCHOOL_CONJURATION + cooldown_time = 1 MINUTES + cooldown_reduction_per_rank = 13.75 SECONDS + + invocation = "HO HO HO" + invocation_type = INVOCATION_SHOUT + + summon_radius = 3 + summon_type = list(/obj/item/a_gift) + summon_amount = 5 diff --git a/code/modules/spells/spell_types/conjure/soulstone.dm b/code/modules/spells/spell_types/conjure/soulstone.dm new file mode 100644 index 00000000000000..cce5d1ab797ca9 --- /dev/null +++ b/code/modules/spells/spell_types/conjure/soulstone.dm @@ -0,0 +1,30 @@ +/datum/action/cooldown/spell/conjure/soulstone + name = "Summon Soulstone" + desc = "This spell reaches into Nar'Sie's realm, summoning one of the legendary fragments across time and space." + background_icon_state = "bg_demon" + icon_icon = 'icons/mob/actions/actions_cult.dmi' + button_icon_state = "summonsoulstone" + + school = SCHOOL_CONJURATION + cooldown_time = 4 MINUTES + invocation_type = INVOCATION_NONE + spell_requirements = NONE + + summon_radius = 0 + summon_type = list(/obj/item/soulstone) + +/datum/action/cooldown/spell/conjure/soulstone/cult + name = "Create Nar'sian Soulstone" + cooldown_time = 6 MINUTES + +/datum/action/cooldown/spell/conjure/soulstone/noncult + name = "Create Soulstone" + summon_type = list(/obj/item/soulstone/anybody) + +/datum/action/cooldown/spell/conjure/soulstone/purified + name = "Create Purified Soulstone" + summon_type = list(/obj/item/soulstone/anybody/purified) + +/datum/action/cooldown/spell/conjure/soulstone/mystic + name = "Create Mystic Soulstone" + summon_type = list(/obj/item/soulstone/mystic) diff --git a/code/modules/spells/spell_types/conjure/the_traps.dm b/code/modules/spells/spell_types/conjure/the_traps.dm new file mode 100644 index 00000000000000..e9717a13253293 --- /dev/null +++ b/code/modules/spells/spell_types/conjure/the_traps.dm @@ -0,0 +1,35 @@ +/datum/action/cooldown/spell/conjure/the_traps + name = "The Traps!" + desc = "Summon a number of traps around you. They will damage and enrage any enemies that step on them." + button_icon_state = "the_traps" + + cooldown_time = 25 SECONDS + cooldown_reduction_per_rank = 5 SECONDS + + invocation = "CAVERE INSIDIAS" + invocation_type = INVOCATION_SHOUT + + summon_radius = 3 + summon_type = list( + /obj/structure/trap/stun, + /obj/structure/trap/fire, + /obj/structure/trap/chill, + /obj/structure/trap/damage, + ) + summon_lifespan = 5 MINUTES + summon_amount = 5 + + /// The amount of charges the traps spawn with. + var/trap_charges = 1 + +/datum/action/cooldown/spell/conjure/the_traps/post_summon(atom/summoned_object, atom/cast_on) + if(!istype(summoned_object, /obj/structure/trap)) + return + + var/obj/structure/trap/summoned_trap = summoned_object + summoned_trap.charges = trap_charges + + if(ismob(cast_on)) + var/mob/mob_caster = cast_on + if(mob_caster.mind) + summoned_trap.immune_minds += owner.mind diff --git a/code/modules/spells/spell_types/conjure_item/_conjure_item.dm b/code/modules/spells/spell_types/conjure_item/_conjure_item.dm new file mode 100644 index 00000000000000..5abac48b19733c --- /dev/null +++ b/code/modules/spells/spell_types/conjure_item/_conjure_item.dm @@ -0,0 +1,46 @@ +/datum/action/cooldown/spell/conjure_item + school = SCHOOL_CONJURATION + invocation_type = INVOCATION_NONE + + /// Typepath of whatever item we summon + var/obj/item/item_type + /// If TRUE, we delete any previously created items when we cast the spell + var/delete_old = TRUE + /// List of weakrefs to items summoned + var/list/datum/weakref/item_refs + +/datum/action/cooldown/spell/conjure_item/Destroy() + // If we delete_old, clean up all of our items on delete + if(delete_old) + QDEL_LAZYLIST(item_refs) + + // If we don't delete_old, just let all the items be free + else + LAZYNULL(item_refs) + + return ..() + +/datum/action/cooldown/spell/conjure_item/is_valid_target(atom/cast_on) + return iscarbon(cast_on) + +/datum/action/cooldown/spell/conjure_item/cast(mob/living/carbon/cast_on) + if(delete_old && LAZYLEN(item_refs)) + QDEL_LAZYLIST(item_refs) + + var/obj/item/existing_item = cast_on.get_active_held_item() + if(existing_item) + cast_on.dropItemToGround(existing_item) + + var/obj/item/created = make_item() + if(QDELETED(created)) + CRASH("[type] tried to create an item, but failed. It's item type is [item_type].") + + cast_on.put_in_hands(created, del_on_fail = TRUE) + return ..() + +/// Instantiates the item we're conjuring and returns it. +/// Item is made in nullspace and moved out in cast(). +/datum/action/cooldown/spell/conjure_item/proc/make_item() + var/obj/item/made_item = new item_type() + LAZYADD(item_refs, WEAKREF(made_item)) + return made_item diff --git a/code/modules/spells/spell_types/conjure_item/infinite_guns.dm b/code/modules/spells/spell_types/conjure_item/infinite_guns.dm new file mode 100644 index 00000000000000..98921da4879dcf --- /dev/null +++ b/code/modules/spells/spell_types/conjure_item/infinite_guns.dm @@ -0,0 +1,41 @@ +/datum/action/cooldown/spell/conjure_item/infinite_guns + school = SCHOOL_CONJURATION + cooldown_time = 1.25 MINUTES + cooldown_reduction_per_rank = 18.5 SECONDS + + invocation_type = INVOCATION_NONE + + item_type = /obj/item/gun/ballistic/rifle + // Enchanted guns self delete / do wacky stuff, anyways + delete_old = FALSE + +/datum/action/cooldown/spell/conjure_item/infinite_guns/Remove(mob/living/remove_from) + var/obj/item/existing = remove_from.is_holding_item_of_type(item_type) + if(existing) + qdel(existing) + + return ..() + +// Because enchanted guns self-delete and regenerate themselves, +// override make_item here and let's not bother with tracking their weakrefs. +/datum/action/cooldown/spell/conjure_item/infinite_guns/make_item() + return new item_type() + +/datum/action/cooldown/spell/conjure_item/infinite_guns/gun + name = "Lesser Summon Guns" + desc = "Why reload when you have infinite guns? \ + Summons an unending stream of bolt action rifles that deal little damage, \ + but will knock targets down. Requires both hands free to use. \ + Learning this spell makes you unable to learn Arcane Barrage." + button_icon_state = "bolt_action" + + item_type = /obj/item/gun/ballistic/rifle/enchanted + +/datum/action/cooldown/spell/conjure_item/infinite_guns/arcane_barrage + name = "Arcane Barrage" + desc = "Fire a torrent of arcane energy at your foes with this (powerful) spell. \ + Deals much more damage than Lesser Summon Guns, but won't knock targets down. Requires both hands free to use. \ + Learning this spell makes you unable to learn Lesser Summon Gun." + button_icon_state = "arcane_barrage" + + item_type = /obj/item/gun/ballistic/rifle/enchanted/arcane_barrage diff --git a/code/modules/spells/spell_types/conjure_item/invisible_box.dm b/code/modules/spells/spell_types/conjure_item/invisible_box.dm new file mode 100644 index 00000000000000..b3d55fd74d8cf9 --- /dev/null +++ b/code/modules/spells/spell_types/conjure_item/invisible_box.dm @@ -0,0 +1,44 @@ + + +/datum/action/cooldown/spell/conjure_item/invisible_box + name = "Invisible Box" + desc = "The mime's performance transmutates a box into physical reality." + background_icon_state = "bg_mime" + icon_icon = 'icons/mob/actions/actions_mime.dmi' + button_icon_state = "invisible_box" + panel = "Mime" + sound = null + + school = SCHOOL_MIME + cooldown_time = 30 SECONDS + invocation = "Someone does a weird gesture." // Overriden in before cast + invocation_self_message = span_notice("You conjure up an invisible box, large enough to store a few things.") + invocation_type = INVOCATION_EMOTE + + spell_requirements = SPELL_REQUIRES_HUMAN|SPELL_REQUIRES_MIME_VOW + antimagic_flags = NONE + spell_max_level = 1 + + delete_old = FALSE + item_type = /obj/item/storage/box/mime + /// How long boxes last before going away + var/box_lifespan = 50 SECONDS + +/datum/action/cooldown/spell/conjure_item/invisible_box/before_cast(atom/cast_on) + . = ..() + invocation = span_notice("[cast_on] moves [cast_on.p_their()] hands in the shape of a cube, pressing a box out of the air.") + +/datum/action/cooldown/spell/conjure_item/invisible_box/make_item() + . = ..() + var/obj/item/made_box = . + made_box.alpha = 255 + addtimer(CALLBACK(src, .proc/cleanup_box, made_box), box_lifespan) + +/// Callback that gets rid out of box and removes the weakref from our list +/datum/action/cooldown/spell/conjure_item/invisible_box/proc/cleanup_box(obj/item/storage/box/box) + if(QDELETED(box) || !istype(box)) + return + + box.emptyStorage() + LAZYREMOVE(item_refs, WEAKREF(box)) + qdel(box) diff --git a/code/modules/spells/spell_types/conjure_item/lighting_packet.dm b/code/modules/spells/spell_types/conjure_item/lighting_packet.dm new file mode 100644 index 00000000000000..9ae2010374c173 --- /dev/null +++ b/code/modules/spells/spell_types/conjure_item/lighting_packet.dm @@ -0,0 +1,39 @@ + +/datum/action/cooldown/spell/conjure_item/spellpacket + name = "Thrown Lightning" + desc = "Forged from eldrich energies, a packet of pure power, \ + known as a spell packet will appear in your hand, that - when thrown - will stun the target." + button_icon_state = "thrownlightning" + + cooldown_time = 1 SECONDS + spell_max_level = 1 + + item_type = /obj/item/spellpacket/lightningbolt + +/datum/action/cooldown/spell/conjure_item/spellpacket/cast(mob/living/carbon/cast_on) + . = ..() + cast_on.throw_mode_on(THROW_MODE_TOGGLE) + +/obj/item/spellpacket/lightningbolt + name = "\improper Lightning bolt Spell Packet" + desc = "Some birdseed wrapped in cloth that crackles with electricity." + icon = 'icons/obj/toy.dmi' + icon_state = "snappop" + w_class = WEIGHT_CLASS_TINY + +/obj/item/spellpacket/lightningbolt/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) + . = ..() + if(.) + return + + if(isliving(hit_atom)) + var/mob/living/hit_living = hit_atom + if(!hit_living.can_block_magic()) + hit_living.electrocute_act(80, src, flags = SHOCK_ILLUSION) + qdel(src) + +/obj/item/spellpacket/lightningbolt/throw_at(atom/target, range, speed, mob/thrower, spin = TRUE, diagonals_first = FALSE, datum/callback/callback, force = INFINITY, quickstart = TRUE) + . = ..() + if(ishuman(thrower)) + var/mob/living/carbon/human/human_thrower = thrower + human_thrower.say("LIGHTNINGBOLT!!", forced = "spell") diff --git a/code/modules/spells/spell_types/conjure_item/snowball.dm b/code/modules/spells/spell_types/conjure_item/snowball.dm new file mode 100644 index 00000000000000..bbc783a48edfef --- /dev/null +++ b/code/modules/spells/spell_types/conjure_item/snowball.dm @@ -0,0 +1,8 @@ +/datum/action/cooldown/spell/conjure_item/snowball + name = "Snowball" + desc = "Concentrates cryokinetic forces to create snowballs, useful for throwing at people." + icon_icon = 'icons/obj/toy.dmi' + button_icon_state = "snowball" + + cooldown_time = 1.5 SECONDS + item_type = /obj/item/toy/snowball diff --git a/code/modules/spells/spell_types/construct_spells.dm b/code/modules/spells/spell_types/construct_spells.dm deleted file mode 100644 index 35f9810e489b52..00000000000000 --- a/code/modules/spells/spell_types/construct_spells.dm +++ /dev/null @@ -1,341 +0,0 @@ -//////////////////////////////Construct Spells///////////////////////// - -/obj/effect/proc_holder/spell/aoe_turf/conjure/construct/lesser - charge_max = 3 MINUTES - action_background_icon_state = "bg_demon" - -/obj/effect/proc_holder/spell/aoe_turf/conjure/construct/lesser/cult - clothes_req = TRUE - charge_max = 250 SECONDS - -/obj/effect/proc_holder/spell/aoe_turf/area_conversion - name = "Area Conversion" - desc = "This spell instantly converts a small area around you." - - school = SCHOOL_TRANSMUTATION - charge_max = 5 SECONDS - clothes_req = FALSE - invocation = "none" - invocation_type = INVOCATION_NONE - range = 2 - action_icon = 'icons/mob/actions/actions_cult.dmi' - action_icon_state = "areaconvert" - action_background_icon_state = "bg_cult" - -/obj/effect/proc_holder/spell/aoe_turf/area_conversion/cast(list/targets, mob/user = usr) - playsound(get_turf(user), 'sound/items/welder.ogg', 75, TRUE) - for(var/turf/T in targets) - T.narsie_act(FALSE, TRUE, 100 - (get_dist(user, T) * 25)) - - -/obj/effect/proc_holder/spell/aoe_turf/conjure/floor - name = "Summon Cult Floor" - desc = "This spell constructs a cult floor." - - school = SCHOOL_CONJURATION - charge_max = 2 SECONDS - clothes_req = FALSE - invocation = "none" - invocation_type = INVOCATION_NONE - range = 0 - summon_type = list(/turf/open/floor/engine/cult) - action_icon = 'icons/mob/actions/actions_cult.dmi' - action_icon_state = "floorconstruct" - action_background_icon_state = "bg_cult" - - -/obj/effect/proc_holder/spell/aoe_turf/conjure/wall - name = "Summon Cult Wall" - desc = "This spell constructs a cult wall." - - school = SCHOOL_CONJURATION - charge_max = 10 SECONDS - clothes_req = FALSE - invocation = "none" - invocation_type = INVOCATION_NONE - range = 0 - action_icon = 'icons/mob/actions/actions_cult.dmi' - action_icon_state = "lesserconstruct" - action_background_icon_state = "bg_cult" - - summon_type = list(/turf/closed/wall/mineral/cult/artificer) //we don't want artificer-based runed metal farms - - -/obj/effect/proc_holder/spell/aoe_turf/conjure/wall/reinforced - name = "Greater Construction" - desc = "This spell constructs a reinforced metal wall." - - school = SCHOOL_CONJURATION - charge_max = 30 SECONDS - clothes_req = FALSE - invocation = "none" - invocation_type = INVOCATION_NONE - range = 0 - - summon_type = list(/turf/closed/wall/r_wall) - -/obj/effect/proc_holder/spell/aoe_turf/conjure/soulstone - name = "Summon Soulstone" - desc = "This spell reaches into Nar'Sie's realm, summoning one of the legendary fragments across time and space." - - school = SCHOOL_CONJURATION - charge_max = 4 MINUTES - clothes_req = FALSE - invocation = "none" - invocation_type = INVOCATION_NONE - range = 0 - action_icon = 'icons/mob/actions/actions_cult.dmi' - action_icon_state = "summonsoulstone" - action_background_icon_state = "bg_demon" - - summon_type = list(/obj/item/soulstone) - -/obj/effect/proc_holder/spell/aoe_turf/conjure/soulstone/cult - clothes_req = TRUE - charge_max = 6 MINUTES - -/obj/effect/proc_holder/spell/aoe_turf/conjure/soulstone/noncult - summon_type = list(/obj/item/soulstone/anybody) - -/obj/effect/proc_holder/spell/aoe_turf/conjure/soulstone/purified - summon_type = list(/obj/item/soulstone/anybody/purified) - -/obj/effect/proc_holder/spell/aoe_turf/conjure/soulstone/mystic - summon_type = list(/obj/item/soulstone/mystic) - -/obj/effect/proc_holder/spell/targeted/forcewall/cult - name = "Shield" - desc = "This spell creates a temporary forcefield to shield yourself and allies from incoming fire." - school = SCHOOL_TRANSMUTATION - charge_max = 40 SECONDS - clothes_req = FALSE - invocation = "none" - invocation_type = INVOCATION_NONE - wall_type = /obj/effect/forcefield/cult - action_icon = 'icons/mob/actions/actions_cult.dmi' - action_icon_state = "cultforcewall" - action_background_icon_state = "bg_demon" - - - -/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift - name = "Phase Shift" - desc = "This spell allows you to pass through walls." - - school = SCHOOL_TRANSMUTATION - charge_max = 25 SECONDS - clothes_req = FALSE - invocation = "none" - invocation_type = INVOCATION_NONE - jaunt_duration = 5 SECONDS - action_icon = 'icons/mob/actions/actions_cult.dmi' - action_icon_state = "phaseshift" - action_background_icon_state = "bg_demon" - jaunt_in_time = 0.6 SECONDS - jaunt_out_time = 0.6 SECONDS - jaunt_in_type = /obj/effect/temp_visual/dir_setting/wraith - jaunt_out_type = /obj/effect/temp_visual/dir_setting/wraith/out - -/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift/jaunt_steam(mobloc) - return - -/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift/angelic - jaunt_in_type = /obj/effect/temp_visual/dir_setting/wraith/angelic - jaunt_out_type = /obj/effect/temp_visual/dir_setting/wraith/out/angelic - -/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift/mystic - jaunt_in_type = /obj/effect/temp_visual/dir_setting/wraith/mystic - jaunt_out_type = /obj/effect/temp_visual/dir_setting/wraith/out/mystic - -/obj/effect/proc_holder/spell/targeted/projectile/magic_missile/lesser - name = "Lesser Magic Missile" - desc = "This spell fires several, slow moving, magic projectiles at nearby targets." - - school = SCHOOL_EVOCATION - charge_max = 40 SECONDS - clothes_req = FALSE - invocation = "none" - invocation_type = INVOCATION_NONE - max_targets = 6 - action_icon_state = "magicm" - action_background_icon_state = "bg_demon" - proj_type = /obj/projectile/magic/spell/magic_missile/lesser - -/obj/projectile/magic/spell/magic_missile/lesser - color = "red" //Looks more culty this way - range = 10 - -/obj/effect/proc_holder/spell/targeted/smoke/disable - name = "Paralysing Smoke" - desc = "This spell spawns a cloud of paralysing smoke." - - school = SCHOOL_CONJURATION - charge_max = 20 SECONDS - clothes_req = FALSE - invocation = "none" - invocation_type = INVOCATION_NONE - range = -1 - include_user = TRUE - cooldown_min = 20 //25 deciseconds reduction per rank - - smoke_spread = /datum/effect_system/fluid_spread/smoke/sleeping - smoke_amt = 4 - action_icon_state = "smoke" - action_background_icon_state = "bg_cult" - -/obj/effect/proc_holder/spell/pointed/abyssal_gaze - name = "Abyssal Gaze" - desc = "This spell instills a deep terror in your target, temporarily chilling and blinding it." - charge_max = 75 SECONDS - range = 5 - stat_allowed = FALSE - school = SCHOOL_EVOCATION - clothes_req = FALSE - invocation = "none" - invocation_type = INVOCATION_NONE - ranged_mousepointer = 'icons/effects/mouse_pointers/cult_target.dmi' - action_icon = 'icons/mob/actions/actions_cult.dmi' - action_background_icon_state = "bg_demon" - action_icon_state = "abyssal_gaze" - active_msg = "You prepare to instill a deep terror in a target..." - -/obj/effect/proc_holder/spell/pointed/abyssal_gaze/cast(list/targets, mob/user) - if(!LAZYLEN(targets)) - to_chat(user, span_warning("No target found in range!")) - return FALSE - if(!can_target(targets[1], user)) - return FALSE - - var/mob/living/carbon/target = targets[1] - if(target.can_block_magic(MAGIC_RESISTANCE|MAGIC_RESISTANCE_HOLY)) - to_chat(user, span_warning("The spell had no effect!")) - to_chat(target, span_warning("You feel a freezing darkness closing in on you, but it rapidly dissipates.")) - return FALSE - - to_chat(target, span_userdanger("A freezing darkness surrounds you...")) - target.playsound_local(get_turf(target), 'sound/hallucinations/i_see_you1.ogg', 50, 1) - user.playsound_local(get_turf(user), 'sound/effects/ghost2.ogg', 50, 1) - target.become_blind(ABYSSAL_GAZE_BLIND) - addtimer(CALLBACK(src, .proc/cure_blindness, target), 40) - if(ishuman(targets[1])) - var/mob/living/carbon/human/humi = targets[1] - humi.adjust_coretemperature(-200) - target.adjust_bodytemperature(-200) - -/** - * cure_blidness: Cures Abyssal Gaze blindness from the target - * - * Arguments: - * * target The mob that is being cured of the blindness. - */ -/obj/effect/proc_holder/spell/pointed/abyssal_gaze/proc/cure_blindness(mob/target) - if(isliving(target)) - var/mob/living/L = target - L.cure_blind(ABYSSAL_GAZE_BLIND) - -/obj/effect/proc_holder/spell/pointed/abyssal_gaze/can_target(atom/target, mob/user, silent) - . = ..() - if(!.) - return FALSE - if(!iscarbon(target)) - if(!silent) - to_chat(user, span_warning("You can only target carbon based lifeforms!")) - return FALSE - return TRUE - -/obj/effect/proc_holder/spell/pointed/dominate - name = "Dominate" - desc = "This spell dominates the mind of a lesser creature to the will of Nar'Sie, allying it only to her direct followers." - charge_max = 1 MINUTES - range = 7 - stat_allowed = FALSE - school = SCHOOL_EVOCATION - clothes_req = FALSE - invocation = "none" - invocation_type = INVOCATION_NONE - ranged_mousepointer = 'icons/effects/mouse_pointers/cult_target.dmi' - action_icon = 'icons/mob/actions/actions_cult.dmi' - action_background_icon_state = "bg_demon" - action_icon_state = "dominate" - active_msg = "You prepare to dominate the mind of a target..." - -/obj/effect/proc_holder/spell/pointed/dominate/cast(list/targets, mob/user) - if(!LAZYLEN(targets)) - to_chat(user, span_notice("No target found in range.")) - return FALSE - if(!can_target(targets[1], user)) - return FALSE - - var/mob/living/simple_animal/S = targets[1] - S.add_atom_colour("#990000", FIXED_COLOUR_PRIORITY) - S.faction = list("cult") - playsound(get_turf(S), 'sound/effects/ghost.ogg', 100, TRUE) - new /obj/effect/temp_visual/cult/sac(get_turf(S)) - -/obj/effect/proc_holder/spell/pointed/dominate/can_target(atom/target, mob/user, silent) - . = ..() - if(!.) - return FALSE - if(!isanimal(target)) - if(!silent) - to_chat(user, span_warning("Target is not a lesser creature!")) - return FALSE - - var/mob/living/simple_animal/S = target - if(S.mind) - if(!silent) - to_chat(user, span_warning("[S] is too intelligent to dominate!")) - return FALSE - if(S.stat) - if(!silent) - to_chat(user, span_warning("[S] is dead!")) - return FALSE - if(S.sentience_type != SENTIENCE_ORGANIC) - if(!silent) - to_chat(user, span_warning("[S] cannot be dominated!")) - return FALSE - if("cult" in S.faction) - if(!silent) - to_chat(user, span_warning("[S] is already serving Nar'Sie!")) - return FALSE - return TRUE - -/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift/golem - charge_max = 80 SECONDS - jaunt_in_type = /obj/effect/temp_visual/dir_setting/cult/phase - jaunt_out_type = /obj/effect/temp_visual/dir_setting/cult/phase/out - -/obj/effect/proc_holder/spell/targeted/projectile/dumbfire/juggernaut - name = "Gauntlet Echo" - desc = "Channels energy into your gauntlet - firing its essence forward in a slow moving, yet devastating, attack." - proj_type = /obj/projectile/magic/spell/juggernaut - charge_max = 35 SECONDS - clothes_req = FALSE - action_icon = 'icons/mob/actions/actions_cult.dmi' - action_icon_state = "cultfist" - action_background_icon_state = "bg_demon" - sound = 'sound/weapons/resonator_blast.ogg' - -/obj/projectile/magic/spell/juggernaut - name = "Gauntlet Echo" - icon_state = "cultfist" - alpha = 180 - damage = 30 - damage_type = BRUTE - knockdown = 50 - hitsound = 'sound/weapons/punch3.ogg' - trigger_range = 0 - antimagic_flags = MAGIC_RESISTANCE_HOLY - ignored_factions = list("cult") - range = 15 - speed = 7 - -/obj/projectile/magic/spell/juggernaut/on_hit(atom/target, blocked) - . = ..() - var/turf/T = get_turf(src) - playsound(T, 'sound/weapons/resonator_blast.ogg', 100, FALSE) - new /obj/effect/temp_visual/cult/sac(T) - for(var/obj/O in range(src,1)) - if(O.density && !istype(O, /obj/structure/destructible/cult)) - O.take_damage(90, BRUTE, MELEE, 0) - new /obj/effect/temp_visual/cult/turf/floor(get_turf(O)) diff --git a/code/modules/spells/spell_types/emplosion.dm b/code/modules/spells/spell_types/emplosion.dm deleted file mode 100644 index 54aa74871e4aae..00000000000000 --- a/code/modules/spells/spell_types/emplosion.dm +++ /dev/null @@ -1,19 +0,0 @@ -/obj/effect/proc_holder/spell/targeted/emplosion - name = "Emplosion" - desc = "This spell emplodes an area." - - school = SCHOOL_EVOCATION - var/emp_heavy = 2 - var/emp_light = 3 - - action_icon_state = "emp" - sound = 'sound/weapons/zapbang.ogg' - -/obj/effect/proc_holder/spell/targeted/emplosion/cast(list/targets, mob/user = usr) - playsound(get_turf(user), sound, 50,TRUE) - for(var/mob/living/target in targets) - if(target.can_block_magic()) - continue - empulse(target.loc, emp_heavy, emp_light) - - return diff --git a/code/modules/spells/spell_types/ethereal_jaunt.dm b/code/modules/spells/spell_types/ethereal_jaunt.dm deleted file mode 100644 index 27bfba57def39b..00000000000000 --- a/code/modules/spells/spell_types/ethereal_jaunt.dm +++ /dev/null @@ -1,138 +0,0 @@ -/obj/effect/proc_holder/spell/targeted/ethereal_jaunt - name = "Ethereal Jaunt" - desc = "This spell turns your form ethereal, temporarily making you invisible and able to pass through walls." - - school = SCHOOL_TRANSMUTATION - charge_max = 30 SECONDS - clothes_req = TRUE - invocation = "none" - invocation_type = INVOCATION_NONE - range = -1 - cooldown_min = 10 SECONDS - include_user = TRUE - nonabstract_req = TRUE - action_icon_state = "jaunt" - /// For how long are we jaunting? - var/jaunt_duration = 5 SECONDS - /// For how long we become immobilized after exiting the jaunt. - var/jaunt_in_time = 0.5 SECONDS - /// For how long we become immobilized when using this spell. - var/jaunt_out_time = 0 SECONDS - /// Visual for jaunting - var/jaunt_in_type = /obj/effect/temp_visual/wizard - /// Visual for exiting the jaunt - var/jaunt_out_type = /obj/effect/temp_visual/wizard/out - /// List of valid exit points - var/list/exit_point_list - -/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/cast_check(skipcharge = 0,mob/user = usr) - . = ..() - if(!.) - return FALSE - var/area/noteleport_check = get_area(user) - if(noteleport_check && noteleport_check.area_flags & NOTELEPORT) - to_chat(user, span_danger("Some dull, universal force is stopping you from jaunting here.")) - return FALSE - -/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/cast(list/targets,mob/user = usr) //magnets, so mostly hardcoded - play_sound("enter",user) - for(var/mob/living/target in targets) - INVOKE_ASYNC(src, .proc/do_jaunt, target) - -/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/proc/do_jaunt(mob/living/target) - target.notransform = 1 - var/turf/mobloc = get_turf(target) - var/obj/effect/dummy/phased_mob/spell_jaunt/holder = new /obj/effect/dummy/phased_mob/spell_jaunt(mobloc) - new jaunt_out_type(mobloc, target.dir) - target.extinguish_mob() - target.forceMove(holder) - target.reset_perspective(holder) - target.notransform=0 //mob is safely inside holder now, no need for protection. - jaunt_steam(mobloc) - if(jaunt_out_time) - ADD_TRAIT(target, TRAIT_IMMOBILIZED, type) - sleep(jaunt_out_time) - REMOVE_TRAIT(target, TRAIT_IMMOBILIZED, type) - var/turf/exit_point = get_turf(holder) //Hopefully this gets updated, otherwise this is our fallback - LAZYINITLIST(exit_point_list) - RegisterSignal(holder, COMSIG_MOVABLE_MOVED, .proc/update_exit_point, target) - sleep(jaunt_duration) - - UnregisterSignal(holder, COMSIG_MOVABLE_MOVED) - if(target.loc != holder) //mob warped out of the warp - qdel(holder) - return - - var/found_exit = FALSE - for(var/turf/possible_exit as anything in exit_point_list) - if(possible_exit.is_blocked_turf_ignore_climbable()) - continue - exit_point = possible_exit - found_exit = TRUE - break - if(!found_exit) - to_chat(target, span_danger("Unable to find an unobstructed space, you find yourself ripped back to where you started.")) - exit_point_list.Cut() - holder.forceMove(exit_point) - - mobloc = get_turf(target.loc) - jaunt_steam(mobloc) - ADD_TRAIT(target, TRAIT_IMMOBILIZED, type) - holder.reappearing = 1 - play_sound("exit",target) - sleep(25 - jaunt_in_time) - new jaunt_in_type(mobloc, holder.dir) - target.setDir(holder.dir) - sleep(jaunt_in_time) - qdel(holder) - if(!QDELETED(target)) - if(mobloc.density) - for(var/direction in GLOB.alldirs) - var/turf/T = get_step(mobloc, direction) - if(T) - if(target.Move(T)) - break - REMOVE_TRAIT(target, TRAIT_IMMOBILIZED, type) - -/** - * Updates the exit point of the jaunt - * - * Called when the jaunting mob holder moves, this updates the backup exit-jaunt - * location, in case the jaunt ends with the mob still in a wall. Five - * spots are kept in the list, in case the last few changed since we passed - * by (doors closing, engineers building walls, etc) - */ -/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/proc/update_exit_point(mob/living/target) - SIGNAL_HANDLER - var/turf/location = get_turf(target) - if(location.is_blocked_turf_ignore_climbable()) - return - exit_point_list.Insert(1, location) - if(length(exit_point_list) >= 5) - exit_point_list.Cut(5) - -/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/proc/jaunt_steam(mobloc) - var/datum/effect_system/steam_spread/steam = new /datum/effect_system/steam_spread() - steam.set_up(10, 0, mobloc) - steam.start() - -/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/proc/play_sound(type,mob/living/target) - switch(type) - if("enter") - playsound(get_turf(target), 'sound/magic/ethereal_enter.ogg', 50, TRUE, -1) - if("exit") - playsound(get_turf(target), 'sound/magic/ethereal_exit.ogg', 50, TRUE, -1) - -/obj/effect/dummy/phased_mob/spell_jaunt - movespeed = 2 //quite slow. - var/reappearing = FALSE - -/obj/effect/dummy/phased_mob/spell_jaunt/phased_check(mob/living/user, direction) - if(reappearing) - return - . = ..() - if(!.) - return - if (locate(/obj/effect/blessing, .)) - to_chat(user, span_warning("Holy energies block your path!")) - return null diff --git a/code/modules/spells/spell_types/explosion.dm b/code/modules/spells/spell_types/explosion.dm deleted file mode 100644 index 0a497290f33908..00000000000000 --- a/code/modules/spells/spell_types/explosion.dm +++ /dev/null @@ -1,22 +0,0 @@ -/obj/effect/proc_holder/spell/targeted/explosion - name = "Explosion" - desc = "This spell explodes an area." - - school = SCHOOL_EVOCATION - - /// The devastation range of the resulting explosion. - var/ex_severe = 1 - /// The heavy impact range of the resulting explosion. - var/ex_heavy = 2 - /// The light impact range of the resulting explosion. - var/ex_light = 3 - /// The flash range of the resulting explosion. - var/ex_flash = 4 - -/obj/effect/proc_holder/spell/targeted/explosion/cast(list/targets,mob/user = usr) - for(var/mob/living/target in targets) - if(target.can_block_magic()) - continue - explosion(target, devastation_range = ex_severe, heavy_impact_range = ex_heavy, light_impact_range = ex_light, flash_range = ex_flash, explosion_cause = src) - - return diff --git a/code/modules/spells/spell_types/forcewall.dm b/code/modules/spells/spell_types/forcewall.dm deleted file mode 100644 index 43979fe80bf2bb..00000000000000 --- a/code/modules/spells/spell_types/forcewall.dm +++ /dev/null @@ -1,40 +0,0 @@ -/obj/effect/proc_holder/spell/targeted/forcewall - name = "Forcewall" - desc = "Create a magical barrier that only you can pass through." - school = SCHOOL_TRANSMUTATION - charge_max = 100 - clothes_req = FALSE - invocation = "TARCOL MINTI ZHERI" - invocation_type = INVOCATION_SHOUT - sound = 'sound/magic/forcewall.ogg' - action_icon_state = "shield" - range = -1 - include_user = TRUE - cooldown_min = 50 //12 deciseconds reduction per rank - var/wall_type = /obj/effect/forcefield/wizard - -/obj/effect/proc_holder/spell/targeted/forcewall/cast(list/targets,mob/user = usr) - new wall_type(get_turf(user),user) - if(user.dir == SOUTH || user.dir == NORTH) - new wall_type(get_step(user, EAST),user) - new wall_type(get_step(user, WEST),user) - else - new wall_type(get_step(user, NORTH),user) - new wall_type(get_step(user, SOUTH),user) - - -/obj/effect/forcefield/wizard - var/mob/wizard - -/obj/effect/forcefield/wizard/Initialize(mapload, mob/summoner) - . = ..() - wizard = summoner - -/obj/effect/forcefield/wizard/CanAllowThrough(atom/movable/mover, border_dir) - . = ..() - if(mover == wizard) - return TRUE - if(isliving(mover)) - var/mob/M = mover - if(M.can_block_magic(charge_cost = 0)) - return TRUE diff --git a/code/modules/spells/spell_types/genetic.dm b/code/modules/spells/spell_types/genetic.dm deleted file mode 100644 index d6912753b7de9c..00000000000000 --- a/code/modules/spells/spell_types/genetic.dm +++ /dev/null @@ -1,48 +0,0 @@ -/obj/effect/proc_holder/spell/targeted/genetic - name = "Genetic" - desc = "This spell inflicts a set of mutations and disabilities upon the target." - - school = SCHOOL_TRANSMUTATION - - var/list/active_on = list() - var/list/traits = list() //disabilities - var/list/mutations = list() //mutation defines - var/duration = 100 //deciseconds - /* - Disabilities - 1st bit - ? - 2nd bit - ? - 3rd bit - ? - 4th bit - ? - 5th bit - ? - 6th bit - ? - */ - -/obj/effect/proc_holder/spell/targeted/genetic/cast(list/targets,mob/user = usr) - playMagSound() - for(var/mob/living/carbon/target in targets) - if(target.can_block_magic()) - to_chat(user, span_warning("The spell had no effect on [target]!")) - continue - if(!target.dna) - continue - for(var/A in mutations) - target.dna.add_mutation(A) - for(var/A in traits) - ADD_TRAIT(target, A, GENETICS_SPELL) - active_on += target - if(duration < charge_max) - addtimer(CALLBACK(src, .proc/remove, target), duration, TIMER_OVERRIDE|TIMER_UNIQUE) - -/obj/effect/proc_holder/spell/targeted/genetic/Destroy() - . = ..() - for(var/V in active_on) - remove(V) - -/obj/effect/proc_holder/spell/targeted/genetic/proc/remove(mob/living/carbon/target) - active_on -= target - if(!QDELETED(target)) - for(var/A in mutations) - target.dna.remove_mutation(A) - for(var/A in traits) - REMOVE_TRAIT(target, A, GENETICS_SPELL) diff --git a/code/modules/spells/spell_types/godhand.dm b/code/modules/spells/spell_types/godhand.dm deleted file mode 100644 index 93e3d632a8c224..00000000000000 --- a/code/modules/spells/spell_types/godhand.dm +++ /dev/null @@ -1,171 +0,0 @@ -/obj/item/melee/touch_attack - name = "\improper outstretched hand" - desc = "High Five?" - var/catchphrase = "High Five!" - var/on_use_sound = null - var/obj/effect/proc_holder/spell/targeted/touch/attached_spell - icon = 'icons/obj/items_and_weapons.dmi' - lefthand_file = 'icons/mob/inhands/misc/touchspell_lefthand.dmi' - righthand_file = 'icons/mob/inhands/misc/touchspell_righthand.dmi' - icon_state = "latexballon" - inhand_icon_state = null - item_flags = NEEDS_PERMIT | ABSTRACT | DROPDEL - w_class = WEIGHT_CLASS_HUGE - force = 0 - throwforce = 0 - throw_range = 0 - throw_speed = 0 - var/charges = 1 - -/obj/item/melee/touch_attack/Initialize(mapload) - . = ..() - ADD_TRAIT(src, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT) - -/obj/item/melee/touch_attack/attack(mob/target, mob/living/carbon/user) - if(!iscarbon(user)) //Look ma, no hands - return - if(!(user.mobility_flags & MOBILITY_USE)) - to_chat(user, span_warning("You can't reach out!")) - return - ..() - -/obj/item/melee/touch_attack/afterattack(atom/target, mob/user, proximity) - . = ..() - if(!proximity) - return - if(charges > 0) - use_charge(user) - -/obj/item/melee/touch_attack/proc/use_charge(mob/living/user, whisper = FALSE) - if(QDELETED(src)) - return - - if(catchphrase) - if(whisper) - user.say("#[catchphrase]", forced = "spell") - else - user.say(catchphrase, forced = "spell") - playsound(get_turf(user), on_use_sound, 50, TRUE) - if(--charges <= 0) - qdel(src) - -/obj/item/melee/touch_attack/Destroy() - if(attached_spell) - attached_spell.on_hand_destroy(src) - return ..() - -/obj/item/melee/touch_attack/disintegrate - name = "\improper smiting touch" - desc = "This hand of mine glows with an awesome power!" - catchphrase = "EI NATH!!" - on_use_sound = 'sound/magic/disintegrate.ogg' - icon_state = "disintegrate" - inhand_icon_state = "disintegrate" - -/obj/item/melee/touch_attack/disintegrate/afterattack(mob/living/target, mob/living/carbon/user, proximity) - if(!proximity || target == user || !istype(target) || !iscarbon(user) || !(user.mobility_flags & MOBILITY_USE)) //exploding after touching yourself would be bad - return - if(!user.can_speak_vocal()) - to_chat(user, span_warning("You can't get the words out!")) - return - do_sparks(4, FALSE, target.loc) - for(var/mob/living/L in view(src, 7)) - if(L != user) - L.flash_act(affect_silicon = FALSE) - if(target.can_block_magic()) - user.visible_message(span_warning("The feedback blows [user]'s arm off!"), \ - span_userdanger("The spell bounces from [target]'s skin back into your arm!")) - user.flash_act() - var/obj/item/bodypart/part = user.get_holding_bodypart_of_item(src) - if(part) - part.dismember() - return ..() - var/obj/item/clothing/suit/hooded/bloated_human/suit = target.get_item_by_slot(ITEM_SLOT_OCLOTHING) - if(istype(suit)) - target.visible_message(span_danger("[target]'s [suit] explodes off of them into a puddle of gore!")) - target.dropItemToGround(suit) - qdel(suit) - new /obj/effect/gibspawner(target.loc) - return ..() - target.gib() - return ..() - -/obj/item/melee/touch_attack/fleshtostone - name = "\improper petrifying touch" - desc = "That's the bottom line, because flesh to stone said so!" - catchphrase = "STAUN EI!!" - on_use_sound = 'sound/magic/fleshtostone.ogg' - icon_state = "fleshtostone" - inhand_icon_state = "fleshtostone" - -/obj/item/melee/touch_attack/fleshtostone/afterattack(mob/living/target, mob/living/carbon/user, proximity) - if(!proximity || target == user || !isliving(target) || !iscarbon(user)) //getting hard after touching yourself would also be bad - return - if(!(user.mobility_flags & MOBILITY_USE)) - to_chat(user, span_warning("You can't reach out!")) - return - if(!user.can_speak_vocal()) - to_chat(user, span_warning("You can't get the words out!")) - return - if(target.can_block_magic()) - to_chat(user, span_warning("The spell can't seem to affect [target]!")) - to_chat(target, span_warning("You feel your flesh turn to stone for a moment, then revert back!")) - return ..() - target.Stun(40) - target.petrify() - return ..() - - -/obj/item/melee/touch_attack/duffelbag - name = "\improper burdening touch" - desc = "Where is the bar from here?" - catchphrase = "HU'SWCH H'ANS!!" - on_use_sound = 'sound/magic/mm_hit.ogg' - icon_state = "duffelcurse" - inhand_icon_state = "duffelcurse" - -/obj/item/melee/touch_attack/duffelbag/afterattack(atom/target, mob/living/carbon/user, proximity) - if(!proximity || target == user || !isliving(target) || !iscarbon(user)) //Roleplay involving touching is equally as bad - return - if(!(user.mobility_flags & MOBILITY_USE)) - to_chat(user, span_warning("You can't reach out!")) - return - if(!user.can_speak_vocal()) - to_chat(user, span_warning("You can't get the words out!")) - return - var/mob/living/carbon/duffelvictim = target - var/elaborate_backstory = pick("spacewar origin story", "military background", "corporate connections", "life in the colonies", "anti-government activities", "upbringing on the space farm", "fond memories with your buddy Keith") - if(duffelvictim.can_block_magic()) - to_chat(user, span_warning("The spell can't seem to affect [duffelvictim]!")) - to_chat(duffelvictim, span_warning("You really don't feel like talking about your [elaborate_backstory] with complete strangers today.")) - return ..() - - duffelvictim.flash_act() - duffelvictim.Immobilize(5 SECONDS) - duffelvictim.apply_damage(80, STAMINA) - duffelvictim.Knockdown(5 SECONDS) - - if(HAS_TRAIT(target, TRAIT_DUFFEL_CURSE_PROOF)) - to_chat(user, span_warning("The burden of [duffelvictim]'s duffel bag becomes too much, shoving them to the floor!")) - to_chat(duffelvictim, span_warning("The weight of this bag becomes overburdening!")) - return ..() - - var/obj/item/storage/backpack/duffelbag/cursed/conjuredduffel = new get_turf(target) - - duffelvictim.visible_message(span_danger("A growling duffel bag appears on [duffelvictim]!"), \ - span_danger("You feel something attaching itself to you, and a strong desire to discuss your [elaborate_backstory] at length!")) - - ADD_TRAIT(duffelvictim, TRAIT_DUFFEL_CURSE_PROOF, CURSED_ITEM_TRAIT(conjuredduffel.name)) - conjuredduffel.pickup(duffelvictim) - conjuredduffel.forceMove(duffelvictim) - if(duffelvictim.dropItemToGround(duffelvictim.back)) - duffelvictim.equip_to_slot_if_possible(conjuredduffel, ITEM_SLOT_BACK, TRUE, TRUE) - else - if(!duffelvictim.put_in_hands(conjuredduffel)) - duffelvictim.dropItemToGround(duffelvictim.get_inactive_held_item()) - if(!duffelvictim.put_in_hands(conjuredduffel)) - duffelvictim.dropItemToGround(duffelvictim.get_active_held_item()) - duffelvictim.put_in_hands(conjuredduffel) - else - return ..() - return ..() diff --git a/code/modules/spells/spell_types/infinite_guns.dm b/code/modules/spells/spell_types/infinite_guns.dm deleted file mode 100644 index 3817e04198dc4e..00000000000000 --- a/code/modules/spells/spell_types/infinite_guns.dm +++ /dev/null @@ -1,27 +0,0 @@ -/obj/effect/proc_holder/spell/targeted/infinite_guns - name = "Lesser Summon Guns" - desc = "Why reload when you have infinite guns? Summons an unending stream of bolt action rifles that deal little damage, but will knock targets down. Requires both hands free to use. Learning this spell makes you unable to learn Arcane Barrage." - invocation_type = INVOCATION_NONE - include_user = TRUE - range = -1 - - school = SCHOOL_CONJURATION - charge_max = 750 - clothes_req = TRUE - cooldown_min = 10 //Gun wizard - action_icon_state = "bolt_action" - var/summon_path = /obj/item/gun/ballistic/rifle/enchanted - -/obj/effect/proc_holder/spell/targeted/infinite_guns/cast(list/targets, mob/user = usr) - for(var/mob/living/carbon/C in targets) - C.drop_all_held_items() - var/GUN = new summon_path - C.put_in_hands(GUN) - -/obj/effect/proc_holder/spell/targeted/infinite_guns/gun - -/obj/effect/proc_holder/spell/targeted/infinite_guns/arcane_barrage - name = "Arcane Barrage" - desc = "Fire a torrent of arcane energy at your foes with this (powerful) spell. Deals much more damage than Lesser Summon Guns, but won't knock targets down. Requires both hands free to use. Learning this spell makes you unable to learn Lesser Summon Gun." - action_icon_state = "arcane_barrage" - summon_path = /obj/item/gun/ballistic/rifle/enchanted/arcane_barrage diff --git a/code/modules/spells/spell_types/inflict_handler.dm b/code/modules/spells/spell_types/inflict_handler.dm deleted file mode 100644 index b717009de936c3..00000000000000 --- a/code/modules/spells/spell_types/inflict_handler.dm +++ /dev/null @@ -1,54 +0,0 @@ -/obj/effect/proc_holder/spell/targeted/inflict_handler - name = "Inflict Handler" - desc = "This spell blinds and/or destroys/damages/heals and/or knockdowns/stuns the target." - school = SCHOOL_EVOCATION - antimagic_flags = MAGIC_RESISTANCE - var/amt_paralyze = 0 - var/amt_unconscious = 0 - var/amt_stun = 0 - var/inflict_status - var/list/status_params = list() - //set to negatives for healing - var/amt_dam_fire = 0 - var/amt_dam_brute = 0 - var/amt_dam_oxy = 0 - var/amt_dam_tox = 0 - var/amt_eye_blind = 0 - var/amt_eye_blurry = 0 - var/destroys = "none" //can be "none", "gib" or "disintegrate" - var/summon_type = null //this will put an obj at the target's location - -/obj/effect/proc_holder/spell/targeted/inflict_handler/cast(list/targets,mob/user = usr) - for(var/mob/living/target in targets) - playsound(target,sound, 50,TRUE) - if(target.can_block_magic(antimagic_flags)) - to_chat(user, span_warning("The spell had no effect on [target]!")) - return - switch(destroys) - if("gib") - target.gib() - if("disintegrate") - target.dust() - - if(!target) - continue - //damage/healing - target.adjustBruteLoss(amt_dam_brute) - target.adjustFireLoss(amt_dam_fire) - target.adjustToxLoss(amt_dam_tox) - target.adjustOxyLoss(amt_dam_oxy) - //disabling - target.Paralyze(amt_paralyze) - target.Unconscious(amt_unconscious) - target.Stun(amt_stun) - - target.blind_eyes(amt_eye_blind) - target.blur_eyes(amt_eye_blurry) - //summoning - if(summon_type) - new summon_type(target.loc, target) - - if(inflict_status) - var/list/stat_args = status_params.Copy() - stat_args.Insert(1,inflict_status) - target.apply_status_effect(arglist(stat_args)) diff --git a/code/modules/spells/spell_types/jaunt/_jaunt.dm b/code/modules/spells/spell_types/jaunt/_jaunt.dm new file mode 100644 index 00000000000000..af311947366b66 --- /dev/null +++ b/code/modules/spells/spell_types/jaunt/_jaunt.dm @@ -0,0 +1,92 @@ +/** + * ## Jaunt spells + * + * A basic subtype for jaunt related spells. + * Jaunt spells put their caster in a dummy + * phased_mob effect that allows them to float + * around incorporeally. + * + * Doesn't actually implement any behavior on cast to + * enter or exit the jaunt - that must be done via subtypes. + * + * Use enter_jaunt() and exit_jaunt() as wrappers. + */ +/datum/action/cooldown/spell/jaunt + school = SCHOOL_TRANSMUTATION + + invocation_type = INVOCATION_NONE + + /// What dummy mob type do we put jaunters in on jaunt? + var/jaunt_type = /obj/effect/dummy/phased_mob + +/datum/action/cooldown/spell/jaunt/can_cast_spell(feedback = TRUE) + . = ..() + if(!.) + return FALSE + var/area/owner_area = get_area(owner) + var/turf/owner_turf = get_turf(owner) + if(!owner_area || !owner_turf) + return FALSE // nullspaced? + + if(owner_area.area_flags & NOTELEPORT) + if(feedback) + to_chat(owner, span_danger("Some dull, universal force is stopping you from jaunting here.")) + return FALSE + + if(owner_turf?.turf_flags & NOJAUNT) + if(feedback) + to_chat(owner, span_danger("An otherwordly force is preventing you from jaunting here.")) + return FALSE + + return isliving(owner) + + +/** + * Places the [jaunter] in a jaunt holder mob + * If [loc_override] is supplied, + * the jaunt will be moved to that turf to start at + * + * Returns the holder mob that was created + */ +/datum/action/cooldown/spell/jaunt/proc/enter_jaunt(mob/living/jaunter, turf/loc_override) + var/obj/effect/dummy/phased_mob/jaunt = new jaunt_type(loc_override || get_turf(jaunter), jaunter) + spell_requirements |= SPELL_CASTABLE_WHILE_PHASED + ADD_TRAIT(jaunter, TRAIT_MAGICALLY_PHASED, REF(src)) + + // This needs to happen at the end, after all the traits and stuff is handled + SEND_SIGNAL(jaunter, COMSIG_MOB_ENTER_JAUNT, src, jaunt) + return jaunt + +/** + * Ejects the [unjaunter] from jaunt + * If [loc_override] is supplied, + * the jaunt will be moved to that turf + * before ejecting the unjaunter + * + * Returns TRUE on successful exit, FALSE otherwise + */ +/datum/action/cooldown/spell/jaunt/proc/exit_jaunt(mob/living/unjaunter, turf/loc_override) + var/obj/effect/dummy/phased_mob/jaunt = unjaunter.loc + if(!istype(jaunt)) + return FALSE + + if(jaunt.jaunter != unjaunter) + CRASH("Jaunt spell attempted to exit_jaunt with an invalid unjaunter, somehow.") + + if(loc_override) + jaunt.forceMove(loc_override) + jaunt.eject_jaunter() + spell_requirements &= ~SPELL_CASTABLE_WHILE_PHASED + REMOVE_TRAIT(unjaunter, TRAIT_MAGICALLY_PHASED, REF(src)) + + // Ditto - this needs to happen at the end, after all the traits and stuff is handled + SEND_SIGNAL(unjaunter, COMSIG_MOB_AFTER_EXIT_JAUNT, src) + return TRUE + +/// Simple helper to check if the passed mob is currently jaunting or not +/datum/action/cooldown/spell/jaunt/proc/is_jaunting(mob/living/user) + return istype(user.loc, /obj/effect/dummy/phased_mob) + +/datum/action/cooldown/spell/jaunt/Remove(mob/living/remove_from) + exit_jaunt(remove_from) + return ..() diff --git a/code/modules/spells/spell_types/jaunt/bloodcrawl.dm b/code/modules/spells/spell_types/jaunt/bloodcrawl.dm new file mode 100644 index 00000000000000..365234c649a54e --- /dev/null +++ b/code/modules/spells/spell_types/jaunt/bloodcrawl.dm @@ -0,0 +1,315 @@ +/** + * ### Blood Crawl + * + * Lets the caster enter and exit pools of blood. + */ +/datum/action/cooldown/spell/jaunt/bloodcrawl + name = "Blood Crawl" + desc = "Allows you to phase in and out of existance via pools of blood." + background_icon_state = "bg_demon" + icon_icon = 'icons/mob/actions/actions_minor_antag.dmi' + button_icon_state = "bloodcrawl" + + spell_requirements = NONE + + /// The time it takes to enter blood + var/enter_blood_time = 0 SECONDS + /// The time it takes to exit blood + var/exit_blood_time = 2 SECONDS + /// The radius around us that we look for blood in + var/blood_radius = 1 + /// If TRUE, we equip "blood crawl" hands to the jaunter to prevent using items + var/equip_blood_hands = TRUE + +/datum/action/cooldown/spell/jaunt/bloodcrawl/cast(mob/living/cast_on) + . = ..() + for(var/obj/effect/decal/cleanable/blood_nearby in range(blood_radius, get_turf(cast_on))) + if(blood_nearby.can_bloodcrawl_in()) + return do_bloodcrawl(blood_nearby, cast_on) + + reset_spell_cooldown() + to_chat(cast_on, span_warning("There must be a nearby source of blood!")) + +/** + * Attempts to enter or exit the passed blood pool. + * Returns TRUE if we successfully entered or exited said pool, FALSE otherwise + */ +/datum/action/cooldown/spell/jaunt/bloodcrawl/proc/do_bloodcrawl(obj/effect/decal/cleanable/blood, mob/living/jaunter) + if(is_jaunting(jaunter)) + . = try_exit_jaunt(blood, jaunter) + else + . = try_enter_jaunt(blood, jaunter) + + if(!.) + reset_spell_cooldown() + to_chat(jaunter, span_warning("You are unable to blood crawl!")) + +/** + * Attempts to enter the passed blood pool. + * If forced is TRUE, it will override enter_blood_time. + */ +/datum/action/cooldown/spell/jaunt/bloodcrawl/proc/try_enter_jaunt(obj/effect/decal/cleanable/blood, mob/living/jaunter, forced = FALSE) + if(!forced) + if(enter_blood_time > 0 SECONDS) + blood.visible_message(span_warning("[jaunter] starts to sink into [blood]!")) + if(!do_after(jaunter, enter_blood_time, target = blood)) + return FALSE + + // The actual turf we enter + var/turf/jaunt_turf = get_turf(blood) + + // Begin the jaunt + jaunter.notransform = TRUE + var/obj/effect/dummy/phased_mob/holder = enter_jaunt(jaunter, jaunt_turf) + if(!holder) + jaunter.notransform = FALSE + return FALSE + + if(equip_blood_hands && iscarbon(jaunter)) + jaunter.drop_all_held_items() + // Give them some bloody hands to prevent them from doing things + var/obj/item/bloodcrawl/left_hand = new(jaunter) + var/obj/item/bloodcrawl/right_hand = new(jaunter) + left_hand.icon_state = "bloodhand_right" // Icons swapped intentionally.. + right_hand.icon_state = "bloodhand_left" // ..because perspective, or something + jaunter.put_in_hands(left_hand) + jaunter.put_in_hands(right_hand) + + blood.visible_message(span_warning("[jaunter] sinks into [blood]!")) + playsound(jaunt_turf, 'sound/magic/enter_blood.ogg', 50, TRUE, -1) + jaunter.extinguish_mob() + + jaunter.notransform = FALSE + return TRUE + +/** + * Attempts to Exit the passed blood pool. + * If forced is TRUE, it will override exit_blood_time, and if we're currently consuming someone. + */ +/datum/action/cooldown/spell/jaunt/bloodcrawl/proc/try_exit_jaunt(obj/effect/decal/cleanable/blood, mob/living/jaunter, forced = FALSE) + if(!forced) + if(jaunter.notransform) + to_chat(jaunter, span_warning("You cannot exit yet!!")) + return FALSE + + if(exit_blood_time > 0 SECONDS) + blood.visible_message(span_warning("[blood] starts to bubble...")) + if(!do_after(jaunter, exit_blood_time, target = blood)) + return FALSE + + if(!exit_jaunt(jaunter, get_turf(blood))) + return FALSE + + if(equip_blood_hands && iscarbon(jaunter)) + for(var/obj/item/bloodcrawl/blood_hand in jaunter.held_items) + jaunter.temporarilyRemoveItemFromInventory(blood_hand, force = TRUE) + qdel(blood_hand) + + blood.visible_message(span_boldwarning("[jaunter] rises out of [blood]!")) + return TRUE + +/datum/action/cooldown/spell/jaunt/bloodcrawl/exit_jaunt(mob/living/unjaunter, turf/loc_override) + . = ..() + if(!.) + return + + exit_blood_effect(unjaunter) + +/// Adds an coloring effect to mobs which exit blood crawl. +/datum/action/cooldown/spell/jaunt/bloodcrawl/proc/exit_blood_effect(mob/living/exited) + var/turf/landing_turf = get_turf(exited) + playsound(landing_turf, 'sound/magic/exit_blood.ogg', 50, TRUE, -1) + + // Make the mob have the color of the blood pool it came out of + var/obj/effect/decal/cleanable/came_from = locate() in landing_turf + var/new_color = came_from?.get_blood_color() + if(!new_color) + return + + exited.add_atom_colour(new_color, TEMPORARY_COLOUR_PRIORITY) + // ...but only for a few seconds + addtimer(CALLBACK(exited, /atom/.proc/remove_atom_colour, TEMPORARY_COLOUR_PRIORITY, new_color), 6 SECONDS) + +/** + * Slaughter demon's blood crawl + * Allows the blood crawler to consume people they are dragging. + */ +/datum/action/cooldown/spell/jaunt/bloodcrawl/slaughter_demon + name = "Voracious Blood Crawl" + desc = "Allows you to phase in and out of existance via pools of blood. If you are dragging someone in critical or dead, \ + they will be consumed by you, fully healing you." + /// The sound played when someone's consumed. + var/consume_sound = 'sound/magic/demon_consume.ogg' + +/datum/action/cooldown/spell/jaunt/bloodcrawl/slaughter_demon/try_enter_jaunt(obj/effect/decal/cleanable/blood, mob/living/jaunter) + // Save this before the actual jaunt + var/atom/coming_with = jaunter.pulling + + // Does the actual jaunt + . = ..() + if(!.) + return + + var/turf/jaunt_turf = get_turf(jaunter) + // if we're not pulling anyone, or we can't what we're pulling + if(!isliving(coming_with)) + return + + var/mob/living/victim = coming_with + + if(victim.stat == CONSCIOUS) + jaunt_turf.visible_message( + span_warning("[victim] kicks free of [blood] just before entering it!"), + blind_message = span_notice("You hear splashing and struggling."), + ) + return FALSE + + if(SEND_SIGNAL(victim, COMSIG_LIVING_BLOOD_CRAWL_PRE_CONSUMED, src, jaunter, blood) & COMPONENT_STOP_CONSUMPTION) + return FALSE + + victim.forceMove(jaunter) + victim.emote("scream") + jaunt_turf.visible_message( + span_boldwarning("[jaunter] drags [victim] into [blood]!"), + blind_message = span_notice("You hear a splash."), + ) + + jaunter.notransform = TRUE + consume_victim(victim, jaunter) + jaunter.notransform = FALSE + + return TRUE + +/** + * Consumes the [victim] from the [jaunter], fully healing them + * and calling [proc/on_victim_consumed] if successful. + */ +/datum/action/cooldown/spell/jaunt/bloodcrawl/slaughter_demon/proc/consume_victim(mob/living/victim, mob/living/jaunter) + on_victim_start_consume(victim, jaunter) + + for(var/i in 1 to 3) + playsound(get_turf(jaunter), consume_sound, 50, TRUE) + if(!do_after(jaunter, 3 SECONDS, victim)) + to_chat(jaunter, span_danger("You lose your victim!")) + return FALSE + if(QDELETED(src)) + return FALSE + + if(SEND_SIGNAL(victim, COMSIG_LIVING_BLOOD_CRAWL_CONSUMED, src, jaunter) & COMPONENT_STOP_CONSUMPTION) + return FALSE + + jaunter.revive(full_heal = TRUE, admin_revive = FALSE) + + // No defib possible after laughter + victim.apply_damage(1000, BRUTE, wound_bonus = CANT_WOUND) + victim.death() + on_victim_consumed(victim, jaunter) + +/** + * Called when a victim starts to be consumed. + */ +/datum/action/cooldown/spell/jaunt/bloodcrawl/slaughter_demon/proc/on_victim_start_consume(mob/living/victim, mob/living/jaunter) + to_chat(jaunter, span_danger("You begin to feast on [victim]... You can not move while you are doing this.")) + +/** + * Called when a victim is successfully consumed. + */ +/datum/action/cooldown/spell/jaunt/bloodcrawl/slaughter_demon/proc/on_victim_consumed(mob/living/victim, mob/living/jaunter) + to_chat(jaunter, span_danger("You devour [victim]. Your health is fully restored.")) + qdel(victim) + +/** + * Laughter demon's blood crawl + * All mobs consumed are revived after the demon is killed. + */ +/datum/action/cooldown/spell/jaunt/bloodcrawl/slaughter_demon/funny + name = "Friendly Blood Crawl" + desc = "Allows you to phase in and out of existance via pools of blood. If you are dragging someone in critical or dead - I mean, \ + sleeping, when entering a blood pool, they will be invited to a party and fully heal you!" + consume_sound = 'sound/misc/scary_horn.ogg' + + // Keep the people we hug! + var/list/mob/living/consumed_mobs = list() + +/datum/action/cooldown/spell/jaunt/bloodcrawl/slaughter_demon/funny/Destroy() + consumed_mobs.Cut() + return ..() + +/datum/action/cooldown/spell/jaunt/bloodcrawl/slaughter_demon/funny/Grant(mob/grant_to) + . = ..() + if(owner) + RegisterSignal(owner, COMSIG_LIVING_DEATH, .proc/on_death) + +/datum/action/cooldown/spell/jaunt/bloodcrawl/slaughter_demon/funny/Remove(mob/living/remove_from) + UnregisterSignal(remove_from, COMSIG_LIVING_DEATH) + return ..() + +/datum/action/cooldown/spell/jaunt/bloodcrawl/slaughter_demon/funny/on_victim_start_consume(mob/living/victim, mob/living/jaunter) + to_chat(jaunter, span_clown("You invite [victim] to your party! You can not move while you are doing this.")) + +/datum/action/cooldown/spell/jaunt/bloodcrawl/slaughter_demon/funny/on_victim_consumed(mob/living/victim, mob/living/jaunter) + to_chat(jaunter, span_clown("[victim] joins your party! Your health is fully restored.")) + consumed_mobs += victim + RegisterSignal(victim, COMSIG_MOB_STATCHANGE, .proc/on_victim_statchange) + RegisterSignal(victim, COMSIG_PARENT_QDELETING, .proc/on_victim_deleted) + +/** + * Signal proc for COMSIG_LIVING_DEATH and COMSIG_PARENT_QDELETING + * + * If our demon is deleted or destroyed, expel all of our consumed mobs + */ +/datum/action/cooldown/spell/jaunt/bloodcrawl/slaughter_demon/funny/proc/on_death(datum/source) + SIGNAL_HANDLER + + var/turf/release_turf = get_turf(source) + for(var/mob/living/friend as anything in consumed_mobs) + + // Unregister the signals first + UnregisterSignal(friend, list(COMSIG_MOB_STATCHANGE, COMSIG_PARENT_QDELETING)) + + friend.forceMove(release_turf) + if(!friend.revive(full_heal = TRUE, admin_revive = TRUE)) + continue + friend.grab_ghost(force = TRUE) + playsound(release_turf, consumed_mobs, 50, TRUE, -1) + to_chat(friend, span_clown("You leave [source]'s warm embrace, and feel ready to take on the world.")) + + +/** + * Handle signal from a consumed mob changing stat. + * + * A signal handler for if one of the laughter demon's consumed mobs has + * changed stat. If they're no longer dead (because they were dead when + * swallowed), eject them so they can't rip their way out from the inside. + */ +/datum/action/cooldown/spell/jaunt/bloodcrawl/slaughter_demon/funny/proc/on_victim_statchange(mob/living/victim, new_stat) + SIGNAL_HANDLER + + if(new_stat == DEAD) + return + // Someone we've eaten has spontaneously revived; maybe regen coma, maybe a changeling + victim.forceMove(get_turf(victim)) + victim.visible_message(span_warning("[victim] falls out of the air, covered in blood, with a confused look on their face.")) + exit_blood_effect(victim) + + consumed_mobs -= victim + UnregisterSignal(victim, COMSIG_MOB_STATCHANGE) + +/** + * Handle signal from a consumed mob being deleted. Clears any references. + */ +/datum/action/cooldown/spell/jaunt/bloodcrawl/slaughter_demon/funny/proc/on_victim_deleted(datum/source) + SIGNAL_HANDLER + + consumed_mobs -= source + +/// Bloodcrawl "hands", prevent the user from holding items in bloodcrawl +/obj/item/bloodcrawl + name = "blood crawl" + desc = "You are unable to hold anything while in this form." + icon = 'icons/effects/blood.dmi' + item_flags = ABSTRACT | DROPDEL + +/obj/item/bloodcrawl/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT) diff --git a/code/modules/spells/spell_types/jaunt/ethereal_jaunt.dm b/code/modules/spells/spell_types/jaunt/ethereal_jaunt.dm new file mode 100644 index 00000000000000..2c89ba21c7f846 --- /dev/null +++ b/code/modules/spells/spell_types/jaunt/ethereal_jaunt.dm @@ -0,0 +1,256 @@ +/datum/action/cooldown/spell/jaunt/ethereal_jaunt + name = "Ethereal Jaunt" + desc = "This spell turns your form ethereal, temporarily making you invisible and able to pass through walls." + button_icon_state = "jaunt" + sound = 'sound/magic/ethereal_enter.ogg' + + cooldown_time = 30 SECONDS + cooldown_reduction_per_rank = 5 SECONDS + + jaunt_type = /obj/effect/dummy/phased_mob/spell_jaunt + + var/exit_jaunt_sound = 'sound/magic/ethereal_exit.ogg' + /// For how long are we jaunting? + var/jaunt_duration = 5 SECONDS + /// For how long we become immobilized after exiting the jaunt. + var/jaunt_in_time = 0.5 SECONDS + /// For how long we become immobilized when using this spell. + var/jaunt_out_time = 0 SECONDS + /// Visual for jaunting + var/obj/effect/jaunt_in_type = /obj/effect/temp_visual/wizard + /// Visual for exiting the jaunt + var/obj/effect/jaunt_out_type = /obj/effect/temp_visual/wizard/out + /// List of valid exit points + var/list/exit_point_list + +/datum/action/cooldown/spell/jaunt/ethereal_jaunt/enter_jaunt(mob/living/jaunter) + . = ..() + if(!.) + return + + var/turf/cast_turf = get_turf(.) + new jaunt_out_type(cast_turf, jaunter.dir) + jaunter.extinguish_mob() + do_steam_effects(cast_turf) + +/datum/action/cooldown/spell/jaunt/ethereal_jaunt/cast(mob/living/cast_on) + . = ..() + do_jaunt(cast_on) + +/** + * Begin the jaunt, and the entire jaunt chain. + * Puts cast_on in the phased mob holder here. + * + * Calls do_jaunt_out: + * - if jaunt_out_time is set to more than 0, + * Or immediately calls start_jaunt: + * - if jaunt_out_time = 0 + */ +/datum/action/cooldown/spell/jaunt/ethereal_jaunt/proc/do_jaunt(mob/living/cast_on) + // Makes sure they don't die or get jostled or something during the jaunt entry + // Honestly probably not necessary anymore, but better safe than sorry + cast_on.notransform = TRUE + var/obj/effect/dummy/phased_mob/holder = enter_jaunt(cast_on) + cast_on.notransform = FALSE + + if(!holder) + CRASH("[type] attempted do_jaunt but failed to create a jaunt holder via enter_jaunt.") + + if(jaunt_out_time > 0) + ADD_TRAIT(cast_on, TRAIT_IMMOBILIZED, REF(src)) + addtimer(CALLBACK(src, .proc/do_jaunt_out, cast_on, holder), jaunt_out_time) + else + start_jaunt(cast_on, holder) + +/** + * The wind-up to the jaunt. + * Optional, only called if jaunt_out_time is set. + * + * Calls start_jaunt. + */ +/datum/action/cooldown/spell/jaunt/ethereal_jaunt/proc/do_jaunt_out(mob/living/cast_on, obj/effect/dummy/phased_mob/spell_jaunt/holder) + if(QDELETED(cast_on) || QDELETED(holder) || QDELETED(src)) + return + + REMOVE_TRAIT(cast_on, TRAIT_IMMOBILIZED, REF(src)) + start_jaunt(cast_on, holder) + +/** + * The actual process of starting the jaunt. + * Sets up the signals and exit points and allows + * the caster to actually start moving around. + * + * Calls stop_jaunt after the jaunt runs out. + */ +/datum/action/cooldown/spell/jaunt/ethereal_jaunt/proc/start_jaunt(mob/living/cast_on, obj/effect/dummy/phased_mob/spell_jaunt/holder) + if(QDELETED(cast_on) || QDELETED(holder) || QDELETED(src)) + return + + LAZYINITLIST(exit_point_list) + RegisterSignal(holder, COMSIG_MOVABLE_MOVED, .proc/update_exit_point, target) + addtimer(CALLBACK(src, .proc/stop_jaunt, cast_on, holder, get_turf(holder)), jaunt_duration) + +/** + * The stopping of the jaunt. + * Unregisters and signals and places + * the jaunter on the turf they will exit at. + * + * Calls do_jaunt_in: + * - immediately, if jaunt_in_time >= 2.5 seconds + * - 2.5 seconds - jaunt_in_time seconds otherwise + */ +/datum/action/cooldown/spell/jaunt/ethereal_jaunt/proc/stop_jaunt(mob/living/cast_on, obj/effect/dummy/phased_mob/spell_jaunt/holder, turf/start_point) + if(QDELETED(cast_on) || QDELETED(holder) || QDELETED(src)) + return + + UnregisterSignal(holder, COMSIG_MOVABLE_MOVED) + // The caster escaped our holder somehow? + if(cast_on.loc != holder) + qdel(holder) + return + + // Pick an exit turf to deposit the jaunter + var/turf/found_exit + for(var/turf/possible_exit as anything in exit_point_list) + if(possible_exit.is_blocked_turf_ignore_climbable()) + continue + found_exit = possible_exit + break + + // No valid exit was found + if(!found_exit) + // It's possible no exit was found, because we literally didn't even move + if(get_turf(cast_on) != start_point) + to_chat(cast_on, span_danger("Unable to find an unobstructed space, you find yourself ripped back to where you started.")) + // Either way, default to where we started + found_exit = start_point + + exit_point_list = null + holder.forceMove(found_exit) + do_steam_effects(found_exit) + holder.reappearing = TRUE + if(exit_jaunt_sound) + playsound(found_exit, exit_jaunt_sound, 50, TRUE) + + ADD_TRAIT(cast_on, TRAIT_IMMOBILIZED, REF(src)) + + if(2.5 SECONDS - jaunt_in_time <= 0) + do_jaunt_in(cast_on, holder, found_exit) + else + addtimer(CALLBACK(src, .proc/do_jaunt_in, cast_on, holder, found_exit), 2.5 SECONDS - jaunt_in_time) + +/** + * The wind-up (wind-out?) of exiting the jaunt. + * Optional, only called if jaunt_in_time is above 2.5 seconds. + * + * Calls end_jaunt. + */ +/datum/action/cooldown/spell/jaunt/ethereal_jaunt/proc/do_jaunt_in(mob/living/cast_on, obj/effect/dummy/phased_mob/spell_jaunt/holder, turf/final_point) + if(QDELETED(cast_on) || QDELETED(holder) || QDELETED(src)) + return + + new jaunt_in_type(final_point, holder.dir) + cast_on.setDir(holder.dir) + + if(jaunt_in_time > 0) + addtimer(CALLBACK(src, .proc/end_jaunt, cast_on, holder, final_point), jaunt_in_time) + else + end_jaunt(cast_on, holder, final_point) + +/** + * Finally, the actual veritable end of the jaunt chains. + * Deletes the phase holder, ejecting the caster at final_point. + * + * If the final_point is dense for some reason, + * tries to put the caster in an adjacent turf. + */ +/datum/action/cooldown/spell/jaunt/ethereal_jaunt/proc/end_jaunt(mob/living/cast_on, obj/effect/dummy/phased_mob/spell_jaunt/holder, turf/final_point) + if(QDELETED(cast_on) || QDELETED(holder) || QDELETED(src)) + return + cast_on.notransform = TRUE + exit_jaunt(cast_on) + cast_on.notransform = FALSE + + REMOVE_TRAIT(cast_on, TRAIT_IMMOBILIZED, REF(src)) + + if(final_point.density) + var/list/aside_turfs = get_adjacent_open_turfs(final_point) + if(length(aside_turfs)) + cast_on.forceMove(pick(aside_turfs)) + +/** + * Updates the exit point of the jaunt + * + * Called when the jaunting mob holder moves, this updates the backup exit-jaunt + * location, in case the jaunt ends with the mob still in a wall. Five + * spots are kept in the list, in case the last few changed since we passed + * by (doors closing, engineers building walls, etc) + */ +/datum/action/cooldown/spell/jaunt/ethereal_jaunt/proc/update_exit_point(mob/living/source) + SIGNAL_HANDLER + + var/turf/location = get_turf(source) + if(location.is_blocked_turf_ignore_climbable()) + return + exit_point_list.Insert(1, location) + if(length(exit_point_list) >= 5) + exit_point_list.Cut(5) + +/// Does some steam effects from the jaunt at passed loc. +/datum/action/cooldown/spell/jaunt/ethereal_jaunt/proc/do_steam_effects(turf/loc) + var/datum/effect_system/steam_spread/steam = new() + steam.set_up(10, FALSE, loc) + steam.start() + + +/datum/action/cooldown/spell/jaunt/ethereal_jaunt/shift + name = "Phase Shift" + desc = "This spell allows you to pass through walls." + background_icon_state = "bg_demon" + icon_icon = 'icons/mob/actions/actions_cult.dmi' + button_icon_state = "phaseshift" + + cooldown_time = 25 SECONDS + spell_requirements = NONE + + jaunt_duration = 5 SECONDS + jaunt_in_time = 0.6 SECONDS + jaunt_out_time = 0.6 SECONDS + jaunt_in_type = /obj/effect/temp_visual/dir_setting/wraith + jaunt_out_type = /obj/effect/temp_visual/dir_setting/wraith/out + +/datum/action/cooldown/spell/jaunt/ethereal_jaunt/shift/do_steam_effects(mobloc) + return + +/datum/action/cooldown/spell/jaunt/ethereal_jaunt/shift/angelic + name = "Purified Phase Shift" + jaunt_in_type = /obj/effect/temp_visual/dir_setting/wraith/angelic + jaunt_out_type = /obj/effect/temp_visual/dir_setting/wraith/out/angelic + +/datum/action/cooldown/spell/jaunt/ethereal_jaunt/shift/mystic + name = "Mystic Phase Shift" + jaunt_in_type = /obj/effect/temp_visual/dir_setting/wraith/mystic + jaunt_out_type = /obj/effect/temp_visual/dir_setting/wraith/out/mystic + +/datum/action/cooldown/spell/jaunt/ethereal_jaunt/shift/golem + name = "Runic Phase Shift" + cooldown_time = 80 SECONDS + jaunt_in_type = /obj/effect/temp_visual/dir_setting/cult/phase + jaunt_out_type = /obj/effect/temp_visual/dir_setting/cult/phase/out + + +/// The dummy that holds people jaunting. Maybe one day we can replace it. +/obj/effect/dummy/phased_mob/spell_jaunt + movespeed = 2 //quite slow. + /// Whether we're currently reappearing - we can't move if so + var/reappearing = FALSE + +/obj/effect/dummy/phased_mob/spell_jaunt/phased_check(mob/living/user, direction) + if(reappearing) + return + . = ..() + if(!.) + return + if (locate(/obj/effect/blessing) in .) + to_chat(user, span_warning("Holy energies block your path!")) + return null diff --git a/code/modules/spells/spell_types/jaunt/shadow_walk.dm b/code/modules/spells/spell_types/jaunt/shadow_walk.dm new file mode 100644 index 00000000000000..64405faf993777 --- /dev/null +++ b/code/modules/spells/spell_types/jaunt/shadow_walk.dm @@ -0,0 +1,82 @@ +/datum/action/cooldown/spell/jaunt/shadow_walk + name = "Shadow Walk" + desc = "Grants unlimited movement in darkness." + background_icon_state = "bg_alien" + icon_icon = 'icons/mob/actions/actions_minor_antag.dmi' + button_icon_state = "ninja_cloak" + + spell_requirements = NONE + jaunt_type = /obj/effect/dummy/phased_mob/shadow + +/datum/action/cooldown/spell/jaunt/shadow_walk/cast(mob/living/cast_on) + . = ..() + if(is_jaunting(cast_on)) + exit_jaunt(cast_on) + return + + var/turf/cast_turf = get_turf(cast_on) + if(cast_turf.get_lumcount() >= SHADOW_SPECIES_LIGHT_THRESHOLD) + to_chat(cast_on, span_warning("It isn't dark enough here!")) + return + + playsound(cast_turf, 'sound/magic/ethereal_enter.ogg', 50, TRUE, -1) + cast_on.visible_message(span_boldwarning("[cast_on] melts into the shadows!")) + cast_on.SetAllImmobility(0) + cast_on.setStaminaLoss(0, FALSE) + enter_jaunt(cast_on) + +/obj/effect/dummy/phased_mob/shadow + name = "shadows" + /// The amount that shadow heals us per SSobj tick (times delta_time) + var/healing_rate = 1.5 + +/obj/effect/dummy/phased_mob/shadow/Initialize(mapload) + . = ..() + START_PROCESSING(SSobj, src) + +/obj/effect/dummy/phased_mob/shadow/Destroy() + STOP_PROCESSING(SSobj, src) + return ..() + +/obj/effect/dummy/phased_mob/shadow/process(delta_time) + var/turf/T = get_turf(src) + var/light_amount = T.get_lumcount() + if(!jaunter || jaunter.loc != src) + qdel(src) + return + + if(light_amount < 0.2 && !QDELETED(jaunter) && isliving(jaunter)) //heal in the dark + var/mob/living/living_jaunter = jaunter + living_jaunter.heal_overall_damage((healing_rate * delta_time), (healing_rate * delta_time), 0, BODYTYPE_ORGANIC) + + check_light_level() + +/obj/effect/dummy/phased_mob/shadow/relaymove(mob/living/user, direction) + var/turf/oldloc = loc + . = ..() + if(loc != oldloc) + check_light_level() + +/obj/effect/dummy/phased_mob/shadow/phased_check(mob/living/user, direction) + . = ..() + if(. && isspaceturf(.)) + to_chat(user, span_warning("It really would not be wise to go into space.")) + return FALSE + +/obj/effect/dummy/phased_mob/shadow/proc/check_light_level() + var/turf/T = get_turf(src) + var/light_amount = T.get_lumcount() + if(light_amount > 0.2) // jaunt ends + eject_jaunter(TRUE) + +/obj/effect/dummy/phased_mob/shadow/eject_jaunter(forced_out = FALSE) + var/turf/reveal_turf = get_turf(src) + + if(istype(reveal_turf)) + if(forced_out) + reveal_turf.visible_message(span_boldwarning("[jaunter] is revealed by the light!")) + else + reveal_turf.visible_message(span_boldwarning("[jaunter] emerges from the darkness!")) + playsound(reveal_turf, 'sound/magic/ethereal_exit.ogg', 50, TRUE, -1) + + return ..() diff --git a/code/modules/spells/spell_types/knock.dm b/code/modules/spells/spell_types/knock.dm deleted file mode 100644 index 921bbe5a9e05b4..00000000000000 --- a/code/modules/spells/spell_types/knock.dm +++ /dev/null @@ -1,31 +0,0 @@ -/obj/effect/proc_holder/spell/aoe_turf/knock - name = "Knock" - desc = "This spell opens nearby doors and closets." - - school = SCHOOL_TRANSMUTATION - charge_max = 100 - clothes_req = FALSE - invocation = "AULIE OXIN FIERA" - invocation_type = INVOCATION_WHISPER - range = 3 - cooldown_min = 20 //20 deciseconds reduction per rank - - action_icon_state = "knock" - -/obj/effect/proc_holder/spell/aoe_turf/knock/cast(list/targets,mob/user = usr) - SEND_SOUND(user, sound('sound/magic/knock.ogg')) - for(var/turf/T in targets) - for(var/obj/machinery/door/door in T.contents) - INVOKE_ASYNC(src, .proc/open_door, door) - for(var/obj/structure/closet/C in T.contents) - INVOKE_ASYNC(src, .proc/open_closet, C) - -/obj/effect/proc_holder/spell/aoe_turf/knock/proc/open_door(obj/machinery/door/door) - if(istype(door, /obj/machinery/door/airlock)) - var/obj/machinery/door/airlock/A = door - A.locked = FALSE - door.open() - -/obj/effect/proc_holder/spell/aoe_turf/knock/proc/open_closet(obj/structure/closet/C) - C.locked = FALSE - C.open() diff --git a/code/modules/spells/spell_types/lichdom.dm b/code/modules/spells/spell_types/lichdom.dm deleted file mode 100644 index 1b5e24abc88bc1..00000000000000 --- a/code/modules/spells/spell_types/lichdom.dm +++ /dev/null @@ -1,74 +0,0 @@ -/obj/effect/proc_holder/spell/targeted/lichdom - name = "Bind Soul" - desc = "A spell that binds your soul to an item in your hands. \ - Binding your soul to an item will turn you into an immortal Lich. \ - So long as the item remains intact, you will revive from death, \ - no matter the circumstances." - action_icon = 'icons/mob/actions/actions_spells.dmi' - action_icon_state = "skeleton" - centcom_cancast = FALSE - invocation = "NECREM IMORTIUM!" - invocation_type = INVOCATION_SHOUT - school = SCHOOL_NECROMANCY - level_max = 0 // Cannot be improved (yet) - range = -1 - charge_max = 1 SECONDS - cooldown_min = 1 SECONDS - clothes_req = FALSE - include_user = TRUE - -/obj/effect/proc_holder/spell/targeted/lichdom/cast(list/targets, mob/user = usr) - for(var/mob/living/caster in targets) - - if(HAS_TRAIT(caster, TRAIT_NO_SOUL)) - to_chat(caster, span_warning("You don't have a soul to bind!")) - return - - var/obj/item/marked_item = caster.get_active_held_item() - if(marked_item.item_flags & ABSTRACT) - return - if(HAS_TRAIT(marked_item, TRAIT_NODROP)) - to_chat(caster, span_warning("[marked_item] is stuck to your hand - it wouldn't be a wise idea to place your soul into it.")) - return - // I ensouled the nuke disk once. - // But it's a really mean tactic, - // so we probably should disallow it. - if(SEND_SIGNAL(marked_item, COMSIG_ITEM_IMBUE_SOUL, user) & COMPONENT_BLOCK_IMBUE) - to_chat(caster, span_warning("[marked_item] is not suitable for emplacement of your fragile soul.")) - return - - playsound(user, 'sound/effects/pope_entry.ogg', 100) - - to_chat(caster, span_green("You begin to focus your very being into [marked_item]...")) - if(!do_after(caster, 5 SECONDS, target = marked_item, timed_action_flags = IGNORE_HELD_ITEM)) - to_chat(caster, span_warning("Your soul snaps back to your body as you stop ensouling [marked_item]!")) - return - - marked_item.AddComponent(/datum/component/phylactery, caster.mind) - - caster.set_species(/datum/species/skeleton) - to_chat(caster, span_userdanger("With a hideous feeling of emptiness you watch in horrified fascination \ - as skin sloughs off bone! Blood boils, nerves disintegrate, eyes boil in their sockets! \ - As your organs crumble to dust in your fleshless chest you come to terms with your choice. \ - You're a lich!")) - - if(iscarbon(caster)) - var/mob/living/carbon/carbon_caster = caster - var/obj/item/organ/internal/brain/lich_brain = carbon_caster.getorganslot(ORGAN_SLOT_BRAIN) - if(lich_brain) // This prevents MMIs being used to stop lich revives - lich_brain.organ_flags &= ~ORGAN_VITAL - lich_brain.decoy_override = TRUE - - if(ishuman(caster)) - var/mob/living/carbon/human/human_caster = caster - human_caster.dropItemToGround(human_caster.w_uniform) - human_caster.dropItemToGround(human_caster.wear_suit) - human_caster.dropItemToGround(human_caster.head) - human_caster.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/black(human_caster), ITEM_SLOT_OCLOTHING) - human_caster.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/black(human_caster), ITEM_SLOT_HEAD) - human_caster.equip_to_slot_or_del(new /obj/item/clothing/under/color/black(human_caster), ITEM_SLOT_ICLOTHING) - - // You only get one phylactery. - caster.mind.RemoveSpell(src) - // And no soul. You just sold it - ADD_TRAIT(caster, TRAIT_NO_SOUL, LICH_TRAIT) diff --git a/code/modules/spells/spell_types/lightning.dm b/code/modules/spells/spell_types/lightning.dm deleted file mode 100644 index b197deb5bab6da..00000000000000 --- a/code/modules/spells/spell_types/lightning.dm +++ /dev/null @@ -1,87 +0,0 @@ -/obj/effect/proc_holder/spell/targeted/tesla - name = "Tesla Blast" - desc = "Charge up a tesla arc and release it at a random nearby target! You can move freely while it charges. The arc jumps between targets and can knock them down." - charge_type = "recharge" - charge_max = 300 - clothes_req = TRUE - invocation = "UN'LTD P'WAH!" - invocation_type = INVOCATION_SHOUT - school = SCHOOL_EVOCATION - range = 7 - cooldown_min = 30 - selection_type = "view" - random_target = TRUE - var/ready = FALSE - var/static/mutable_appearance/halo - var/sound/Snd // so far only way i can think of to stop a sound, thank MSO for the idea. - - action_icon_state = "lightning" - -/obj/effect/proc_holder/spell/targeted/tesla/Click() - if(!ready && cast_check()) - StartChargeup() - return TRUE - -/obj/effect/proc_holder/spell/targeted/tesla/proc/StartChargeup(mob/user = usr) - ready = TRUE - to_chat(user, span_notice("You start gathering the power.")) - Snd = new/sound('sound/magic/lightning_chargeup.ogg',channel = 7) - halo = halo || mutable_appearance('icons/effects/effects.dmi', "electricity", EFFECTS_LAYER) - user.add_overlay(halo) - playsound(get_turf(user), Snd, 50, FALSE) - if(do_after(user, 10 SECONDS, timed_action_flags = (IGNORE_USER_LOC_CHANGE|IGNORE_HELD_ITEM))) - if(ready && cast_check(skipcharge=1)) - choose_targets() - else - revert_cast(user, 0) - else - revert_cast(user, 0) - -/obj/effect/proc_holder/spell/targeted/tesla/proc/Reset(mob/user = usr) - ready = FALSE - user.cut_overlay(halo) - -/obj/effect/proc_holder/spell/targeted/tesla/revert_cast(mob/user = usr, message = 1) - if(message) - to_chat(user, span_notice("No target found in range.")) - Reset(user) - ..() - -/obj/effect/proc_holder/spell/targeted/tesla/cast(list/targets, mob/user = usr) - ready = FALSE - var/mob/living/carbon/target = targets[1] - Snd=sound(null, repeat = 0, wait = 1, channel = Snd.channel) //byond, why you suck? - playsound(get_turf(user),Snd,50,FALSE)// Sorry MrPerson, but the other ways just didn't do it the way i needed to work, this is the only way. - if(get_dist(user,target)>range) - to_chat(user, span_warning("[target.p_theyre(TRUE)] too far away!")) - Reset(user) - return - - playsound(get_turf(user), 'sound/magic/lightningbolt.ogg', 50, TRUE) - user.Beam(target,icon_state="lightning[rand(1,12)]", time = 5) - - Bolt(user,target,30,5,user) - Reset(user) - -/obj/effect/proc_holder/spell/targeted/tesla/proc/Bolt(mob/origin,mob/target,bolt_energy,bounces,mob/user = usr) - origin.Beam(target,icon_state="lightning[rand(1,12)]", time = 5) - var/mob/living/carbon/current = target - if(current.can_block_magic()) - playsound(get_turf(current), 'sound/magic/lightningshock.ogg', 50, TRUE, -1) - current.visible_message(span_warning("[current] absorbs the spell, remaining unharmed!"), span_userdanger("You absorb the spell, remaining unharmed!")) - else if(bounces < 1) - current.electrocute_act(bolt_energy,"Lightning Bolt",flags = SHOCK_NOGLOVES) - playsound(get_turf(current), 'sound/magic/lightningshock.ogg', 50, TRUE, -1) - else - current.electrocute_act(bolt_energy,"Lightning Bolt",flags = SHOCK_NOGLOVES) - playsound(get_turf(current), 'sound/magic/lightningshock.ogg', 50, TRUE, -1) - var/list/possible_targets = new - for(var/mob/living/M in view(range,target)) - if(user == M || target == M && los_check(current,M)) // || origin == M ? Not sure double shockings is good or not - continue - possible_targets += M - if(!possible_targets.len) - return - var/mob/living/next = pick(possible_targets) - if(next) - Bolt(current,next,max((bolt_energy-5),5),bounces-1,user) diff --git a/code/modules/spells/spell_types/list_target/_list_target.dm b/code/modules/spells/spell_types/list_target/_list_target.dm new file mode 100644 index 00000000000000..d595552e987955 --- /dev/null +++ b/code/modules/spells/spell_types/list_target/_list_target.dm @@ -0,0 +1,41 @@ +/** + * ## List Target spells + * + * These spells will prompt the user with a tgui list + * of all nearby targets that they select on to cast. + * + * To add effects on cast, override "cast(atom/cast_on)". + * The cast_on atom is the atom that was selected by the list. + */ +/datum/action/cooldown/spell/list_target + /// The message displayed as the title of the tgui target input list. + var/choose_target_message = "Choose a target." + /// Radius around the caster that living targets are picked to choose from + var/target_radius = 7 + +/datum/action/cooldown/spell/list_target/PreActivate(atom/caster) + var/list/list_targets = get_list_targets(caster, target_radius) + if(!length(list_targets)) + caster.balloon_alert(caster, "no targets nearby!") + return FALSE + + var/atom/chosen = tgui_input_list(caster, choose_target_message, name, sort_names(list_targets)) + if(QDELETED(src) || QDELETED(caster) || QDELETED(chosen) || !can_cast_spell()) + return FALSE + + if(get_dist(chosen, caster) > target_radius) + caster.balloon_alert(caster, "they're too far!") + return FALSE + + return Activate(chosen) + +/// Get a list of living targets in radius of the center to put in the target list. +/datum/action/cooldown/spell/list_target/proc/get_list_targets(atom/center, target_radius = 7) + var/list/things = list() + for(var/mob/living/nearby_living in view(target_radius, center)) + if(nearby_living == owner || nearby_living == center) + continue + + things += nearby_living + + return things diff --git a/code/modules/spells/spell_types/list_target/telepathy.dm b/code/modules/spells/spell_types/list_target/telepathy.dm new file mode 100644 index 00000000000000..e67fd72334215c --- /dev/null +++ b/code/modules/spells/spell_types/list_target/telepathy.dm @@ -0,0 +1,52 @@ + +/datum/action/cooldown/spell/list_target/telepathy + name = "Telepathy" + desc = "Telepathically transmits a message to the target." + icon_icon = 'icons/mob/actions/actions_revenant.dmi' + button_icon_state = "r_transmit" + + spell_requirements = SPELL_REQUIRES_NO_ANTIMAGIC + antimagic_flags = MAGIC_RESISTANCE_MIND + + choose_target_message = "Choose a target to whisper to." + + /// The message we send to the next person via telepathy. + var/message + /// The span surrounding the telepathy message + var/telepathy_span = "notice" + /// The bolded span surrounding the telepathy message + var/bold_telepathy_span = "boldnotice" + +/datum/action/cooldown/spell/list_target/telepathy/before_cast(atom/cast_on) + . = ..() + if(. & SPELL_CANCEL_CAST) + return + + message = tgui_input_text(owner, "What do you wish to whisper to [cast_on]?", "[src]") + if(QDELETED(src) || QDELETED(owner) || QDELETED(cast_on) || !can_cast_spell()) + return . | SPELL_CANCEL_CAST + + if(!message) + reset_spell_cooldown() + return . | SPELL_CANCEL_CAST + +/datum/action/cooldown/spell/list_target/telepathy/cast(mob/living/cast_on) + . = ..() + log_directed_talk(owner, cast_on, message, LOG_SAY, name) + + var/formatted_message = "[message]" + + to_chat(owner, "You transmit to [cast_on]: [formatted_message]") + if(!cast_on.can_block_magic(antimagic_flags, charge_cost = 0)) //hear no evil + to_chat(cast_on, "You hear something behind you talking... [formatted_message]") + + for(var/mob/dead/ghost as anything in GLOB.dead_mob_list) + if(!isobserver(ghost)) + continue + + var/from_link = FOLLOW_LINK(ghost, owner) + var/from_mob_name = "[owner] [src]:" + var/to_link = FOLLOW_LINK(ghost, cast_on) + var/to_mob_name = span_name("[cast_on]") + + to_chat(ghost, "[from_link] [from_mob_name] [formatted_message] [to_link] [to_mob_name]") diff --git a/code/modules/spells/spell_types/curse.dm b/code/modules/spells/spell_types/madness_curse.dm similarity index 95% rename from code/modules/spells/spell_types/curse.dm rename to code/modules/spells/spell_types/madness_curse.dm index 473f5ce2f355cf..330f8aa6ff17d8 100644 --- a/code/modules/spells/spell_types/curse.dm +++ b/code/modules/spells/spell_types/madness_curse.dm @@ -22,7 +22,7 @@ GLOBAL_VAR_INIT(curse_of_madness_triggered, FALSE) give_madness(to_curse, message) /proc/give_madness(mob/living/carbon/human/to_curse, message) - to_curse.playsound_local(to_curse, 'sound/magic/curse.ogg', 40, 1) + to_curse.playsound_local(get_turf(to_curse), 'sound/magic/curse.ogg', 40, 1) to_chat(to_curse, span_reallybig(span_hypnophrase(message))) to_chat(to_curse, span_warning("Your mind shatters!")) switch(rand(1, 10)) diff --git a/code/modules/spells/spell_types/mime.dm b/code/modules/spells/spell_types/mime.dm deleted file mode 100644 index 311c767171c2cf..00000000000000 --- a/code/modules/spells/spell_types/mime.dm +++ /dev/null @@ -1,260 +0,0 @@ -/obj/effect/proc_holder/spell/aoe_turf/conjure/mime_wall - name = "Invisible Wall" - desc = "The mime's performance transmutates a wall into physical reality." - school = SCHOOL_MIME - panel = "Mime" - summon_type = list(/obj/effect/forcefield/mime) - invocation_type = INVOCATION_EMOTE - invocation_emote_self = "You form a wall in front of yourself." - summon_lifespan = 300 - charge_max = 300 - clothes_req = FALSE - antimagic_flags = NONE - range = 0 - cast_sound = null - human_req = TRUE - - action_icon = 'icons/mob/actions/actions_mime.dmi' - action_icon_state = "invisible_wall" - action_background_icon_state = "bg_mime" - -/obj/effect/proc_holder/spell/aoe_turf/conjure/mime_wall/Click() - if(usr?.mind) - if(!usr.mind.miming) - to_chat(usr, span_warning("You must dedicate yourself to silence first!")) - return - invocation = "[usr.real_name] looks as if a wall is in front of [usr.p_them()]." - else - invocation_type ="none" - ..() - -/obj/effect/proc_holder/spell/aoe_turf/conjure/mime_chair - name = "Invisible Chair" - desc = "The mime's performance transmutates a chair into physical reality." - school = SCHOOL_MIME - panel = "Mime" - summon_type = list(/obj/structure/chair/mime) - invocation_type = INVOCATION_EMOTE - invocation_emote_self = "You conjure an invisible chair and sit down." - summon_lifespan = 250 - charge_max = 300 - clothes_req = FALSE - antimagic_flags = NONE - range = 0 - cast_sound = null - human_req = TRUE - - action_icon = 'icons/mob/actions/actions_mime.dmi' - action_icon_state = "invisible_chair" - action_background_icon_state = "bg_mime" - -/obj/effect/proc_holder/spell/aoe_turf/conjure/mime_chair/Click() - if(usr?.mind) - if(!usr.mind.miming) - to_chat(usr, span_warning("You must dedicate yourself to silence first!")) - return - invocation = "[usr.real_name] pulls out an invisible chair and sits down." - else - invocation_type ="none" - ..() - -/obj/effect/proc_holder/spell/aoe_turf/conjure/mime_chair/cast(list/targets,mob/user = usr) - ..() - var/turf/T = user.loc - for (var/obj/structure/chair/A in T) - if (is_type_in_list(A, summon_type)) - A.setDir(user.dir) - A.buckle_mob(user) - -/obj/effect/proc_holder/spell/aoe_turf/conjure/mime_box - name = "Invisible Box" - desc = "The mime's performance transmutates a box into physical reality." - school = SCHOOL_MIME - panel = "Mime" - summon_type = list(/obj/item/storage/box/mime) - invocation_type = INVOCATION_EMOTE - invocation_emote_self = "You conjure up an invisible box, large enough to store a few things." - summon_lifespan = 500 - charge_max = 300 - clothes_req = FALSE - antimagic_flags = NONE - range = 0 - cast_sound = null - human_req = TRUE - - action_icon = 'icons/mob/actions/actions_mime.dmi' - action_icon_state = "invisible_box" - action_background_icon_state = "bg_mime" - -/obj/effect/proc_holder/spell/aoe_turf/conjure/mime_box/cast(list/targets,mob/user = usr) - ..() - var/turf/T = user.loc - for (var/obj/item/storage/box/mime/B in T) - user.put_in_hands(B) - B.alpha = 255 - addtimer(CALLBACK(B, /obj/item/storage/box/mime/.proc/emptyStorage, FALSE), (summon_lifespan - 1)) - -/obj/effect/proc_holder/spell/aoe_turf/conjure/mime_box/Click() - if(usr?.mind) - if(!usr.mind.miming) - to_chat(usr, span_warning("You must dedicate yourself to silence first!")) - return - invocation = "[usr.real_name] moves [usr.p_their()] hands in the shape of a cube, pressing a box out of the air." - else - invocation_type ="none" - ..() - - -/obj/effect/proc_holder/spell/targeted/mime/speak - name = "Speech" - desc = "Make or break a vow of silence." - school = SCHOOL_MIME - panel = "Mime" - clothes_req = FALSE - human_req = TRUE - antimagic_flags = NONE - charge_max = 3000 - range = -1 - include_user = TRUE - - action_icon = 'icons/mob/actions/actions_mime.dmi' - action_icon_state = "mime_speech" - action_background_icon_state = "bg_mime" - -/obj/effect/proc_holder/spell/targeted/mime/speak/Click() - if(!usr) - return - if(!ishuman(usr)) - return - var/mob/living/carbon/human/H = usr - if(H.mind.miming) - still_recharging_msg = span_warning("You can't break your vow of silence that fast!") - else - still_recharging_msg = span_warning("You'll have to wait before you can give your vow of silence again!") - ..() - -/obj/effect/proc_holder/spell/targeted/mime/speak/cast(list/targets,mob/user = usr) - for(var/mob/living/carbon/human/H in targets) - H.mind.miming=!H.mind.miming - if(H.mind.miming) - to_chat(H, span_notice("You make a vow of silence.")) - SEND_SIGNAL(H, COMSIG_CLEAR_MOOD_EVENT, "vow") - else - SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "vow", /datum/mood_event/broken_vow) - to_chat(H, span_notice("You break your vow of silence.")) - -// These spells can only be gotten from the "Guide for Advanced Mimery series" for Mime Traitors. - -/obj/effect/proc_holder/spell/targeted/forcewall/mime - name = "Invisible Blockade" - desc = "Form an invisible three tile wide blockade." - school = SCHOOL_MIME - panel = "Mime" - wall_type = /obj/effect/forcefield/mime/advanced - invocation_type = INVOCATION_EMOTE - invocation_emote_self = "You form a blockade in front of yourself." - charge_max = 600 - sound = null - clothes_req = FALSE - antimagic_flags = NONE - range = -1 - include_user = TRUE - - action_icon = 'icons/mob/actions/actions_mime.dmi' - action_icon_state = "invisible_blockade" - action_background_icon_state = "bg_mime" - -/obj/effect/proc_holder/spell/targeted/forcewall/mime/Click() - if(usr?.mind) - if(!usr.mind.miming) - to_chat(usr, span_warning("You must dedicate yourself to silence first!")) - return - invocation = "[usr.real_name] looks as if a blockade is in front of [usr.p_them()]." - else - invocation_type ="none" - ..() - -/obj/effect/proc_holder/spell/aimed/finger_guns - name = "Finger Guns" - desc = "Shoot up to three mimed bullets from your fingers that damage and mute their targets. Can't be used if you have something in your hands." - school = SCHOOL_MIME - panel = "Mime" - charge_max = 300 - clothes_req = FALSE - antimagic_flags = NONE - invocation_type = INVOCATION_EMOTE - invocation_emote_self = span_danger("You fire your finger gun!") - range = 20 - projectile_type = /obj/projectile/bullet/mime - projectile_amount = 3 - sound = null - active_msg = "You draw your fingers!" - deactive_msg = "You put your fingers at ease. Another time." - active = FALSE - - action_icon = 'icons/mob/actions/actions_mime.dmi' - action_icon_state = "finger_guns0" - action_background_icon_state = "bg_mime" - base_icon_state = "finger_guns" - - -/obj/effect/proc_holder/spell/aimed/finger_guns/Click() - var/mob/living/carbon/human/owner = usr - if(owner.incapacitated()) - to_chat(owner, span_warning("You can't properly point your fingers while incapacitated.")) - return - if(owner.get_active_held_item()) - to_chat(owner, span_warning("You can't properly fire your finger guns with something in your hand.")) - return - if(usr?.mind) - if(!usr.mind.miming) - to_chat(usr, span_warning("You must dedicate yourself to silence first!")) - return - invocation = "[usr.real_name] fires [usr.p_their()] finger gun!" - else - invocation_type ="none" - ..() - -/obj/effect/proc_holder/spell/aimed/finger_guns/InterceptClickOn(mob/living/caller, params, atom/target) - if(caller.get_active_held_item()) - to_chat(caller, span_warning("You can't properly fire your finger guns with something in your hand.")) - return - if(caller.incapacitated()) - to_chat(caller, span_warning("You can't properly point your fingers while incapacitated.")) - if(charge_type == "recharge") - var/refund_percent = current_amount/projectile_amount - charge_counter = charge_max * refund_percent - start_recharge() - remove_ranged_ability() - on_deactivation(caller) - ..() - -/obj/item/book/granter/spell/mimery_blockade - spell = /obj/effect/proc_holder/spell/targeted/forcewall/mime - spellname = "Invisible Blockade" - name = "Guide to Advanced Mimery Vol 1" - desc = "The pages don't make any sound when turned." - icon_state ="bookmime" - remarks = list("...") - -/obj/item/book/granter/spell/mimery_blockade/attack_self(mob/user) - . = ..() - if(!.) - return - if(!locate(/obj/effect/proc_holder/spell/targeted/mime/speak) in user.mind.spell_list) - user.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/mime/speak) - -/obj/item/book/granter/spell/mimery_guns - spell = /obj/effect/proc_holder/spell/aimed/finger_guns - spellname = "Finger Guns" - name = "Guide to Advanced Mimery Vol 2" - desc = "There aren't any words written..." - icon_state ="bookmime" - remarks = list("...") - -/obj/item/book/granter/spell/mimery_guns/attack_self(mob/user) - . = ..() - if(!.) - return - if(!locate(/obj/effect/proc_holder/spell/targeted/mime/speak) in user.mind.spell_list) - user.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/mime/speak) diff --git a/code/modules/spells/spell_types/personality_commune.dm b/code/modules/spells/spell_types/personality_commune.dm deleted file mode 100644 index d776bb0aef1ef6..00000000000000 --- a/code/modules/spells/spell_types/personality_commune.dm +++ /dev/null @@ -1,39 +0,0 @@ -/obj/effect/proc_holder/spell/targeted/personality_commune - name = "Personality Commune" - desc = "Sends thoughts to your alternate consciousness." - charge_max = 0 - clothes_req = FALSE - range = -1 - include_user = TRUE - action_icon_state = "telepathy" - action_background_icon_state = "bg_spell" - // Bidaly reminder that spells are not really "owned" by anyone - /// Weakref to the trauma that owns this spell - var/datum/weakref/trauma_ref - var/flufftext = "You hear an echoing voice in the back of your head..." - -/obj/effect/proc_holder/spell/targeted/personality_commune/New(datum/brain_trauma/severe/split_personality/T) - . = ..() - trauma_ref = WEAKREF(T) - -/obj/effect/proc_holder/spell/targeted/personality_commune/Destroy() - trauma_ref = null - return ..() - -// Pillaged and adapted from telepathy code -/obj/effect/proc_holder/spell/targeted/personality_commune/cast(list/targets, mob/user) - var/datum/brain_trauma/severe/split_personality/trauma = trauma_ref?.resolve() - if(!istype(trauma)) - to_chat(user, span_warning("Something is wrong; Either due a bug or admemes, you are trying to cast this spell without a split personality!")) - return - var/msg = tgui_input_text(usr, "What would you like to tell your other self?", "Commune") - if(!msg) - charge_counter = charge_max - return - to_chat(user, span_boldnotice("You concentrate and send thoughts to your other self:[msg]")) - to_chat(trauma.owner, span_boldnotice("[flufftext][msg]")) - log_directed_talk(user, trauma.owner, msg, LOG_SAY ,"[name]") - for(var/ded in GLOB.dead_mob_list) - if(!isobserver(ded)) - continue - to_chat(ded, "[FOLLOW_LINK(ded, user)] [span_boldnotice("[user] [name]:")] [span_notice("\"[msg]\" to")] [span_name("[trauma]")]") diff --git a/code/modules/spells/spell_types/pointed/_pointed.dm b/code/modules/spells/spell_types/pointed/_pointed.dm new file mode 100644 index 00000000000000..4f5bbf2349e50e --- /dev/null +++ b/code/modules/spells/spell_types/pointed/_pointed.dm @@ -0,0 +1,181 @@ +/** + * ## Pointed spells + * + * These spells override the caster's click, + * allowing them to cast the spell on whatever is clicked on. + * + * To add effects on cast, override "cast(atom/cast_on)". + * The cast_on atom is the person who was clicked on. + */ +/datum/action/cooldown/spell/pointed + click_to_activate = TRUE + + /// The base icon state of the spell's button icon, used for editing the icon "on" and "off" + var/base_icon_state + /// Message showing to the spell owner upon activating pointed spell. + var/active_msg + /// Message showing to the spell owner upon deactivating pointed spell. + var/deactive_msg + /// The casting range of our spell + var/cast_range = 7 + /// Variable dictating if the spell will use turf based aim assist + var/aim_assist = TRUE + +/datum/action/cooldown/spell/pointed/New(Target) + . = ..() + if(!active_msg) + active_msg = "You prepare to use [src] on a target..." + if(!deactive_msg) + deactive_msg = "You dispel [src]." + +/datum/action/cooldown/spell/pointed/set_click_ability(mob/on_who) + . = ..() + if(!.) + return + + on_activation(on_who) + +// Note: Destroy() calls Remove(), Remove() calls unset_click_ability() if our spell is active. +/datum/action/cooldown/spell/pointed/unset_click_ability(mob/on_who, refund_cooldown = TRUE) + . = ..() + if(!.) + return + + on_deactivation(on_who, refund_cooldown = refund_cooldown) + +/datum/action/cooldown/spell/pointed/before_cast(atom/cast_on) + . = ..() + if(. & SPELL_CANCEL_CAST) + on_deactivation(owner, refund_cooldown = FALSE) + +/// Called when the spell is activated / the click ability is set to our spell +/datum/action/cooldown/spell/pointed/proc/on_activation(mob/on_who) + SHOULD_CALL_PARENT(TRUE) + + to_chat(on_who, span_notice("[active_msg] Left-click to cast the spell on a target!")) + if(base_icon_state) + button_icon_state = "[base_icon_state]1" + UpdateButtons() + return TRUE + +/// Called when the spell is deactivated / the click ability is unset from our spell +/datum/action/cooldown/spell/pointed/proc/on_deactivation(mob/on_who, refund_cooldown = TRUE) + SHOULD_CALL_PARENT(TRUE) + + if(refund_cooldown) + // Only send the "deactivation" message if they're willingly disabling the ability + to_chat(on_who, span_notice("[deactive_msg]")) + if(base_icon_state) + button_icon_state = "[base_icon_state]0" + UpdateButtons() + return TRUE + +/datum/action/cooldown/spell/pointed/InterceptClickOn(mob/living/caller, params, atom/click_target) + + var/atom/aim_assist_target + if(aim_assist && isturf(click_target)) + // Find any human in the list. We aren't picky, it's aim assist after all + aim_assist_target = locate(/mob/living/carbon/human) in click_target + if(!aim_assist_target) + // If we didn't find a human, we settle for any living at all + aim_assist_target = locate(/mob/living) in click_target + + return ..(caller, params, aim_assist_target || click_target) + +/datum/action/cooldown/spell/pointed/is_valid_target(atom/cast_on) + if(cast_on == owner) + to_chat(owner, span_warning("You cannot cast [src] on yourself!")) + return FALSE + + if(get_dist(owner, cast_on) > cast_range) + to_chat(owner, span_warning("[cast_on.p_theyre(TRUE)] too far away!")) + return FALSE + + return TRUE + +/** + * ### Pointed projectile spells + * + * Pointed spells that, instead of casting a spell directly on the target that's clicked, + * will instead fire a projectile pointed at the target's direction. + */ +/datum/action/cooldown/spell/pointed/projectile + /// What projectile we create when we shoot our spell. + var/obj/projectile/magic/projectile_type = /obj/projectile/magic/teleport + /// How many projectiles we can fire per cast. Not all at once, per click, kinda like charges + var/projectile_amount = 1 + /// How many projectiles we have yet to fire, based on projectile_amount + var/current_amount = 0 + /// How many projectiles we fire every fire_projectile() call. + /// Unwise to change without overriding or extending ready_projectile. + var/projectiles_per_fire = 1 + +/datum/action/cooldown/spell/pointed/projectile/New(Target) + . = ..() + if(projectile_amount > 1) + unset_after_click = FALSE + +/datum/action/cooldown/spell/pointed/projectile/is_valid_target(atom/cast_on) + return TRUE + +/datum/action/cooldown/spell/pointed/projectile/on_activation(mob/on_who) + . = ..() + if(!.) + return + + current_amount = projectile_amount + +/datum/action/cooldown/spell/pointed/projectile/on_deactivation(mob/on_who, refund_cooldown = TRUE) + . = ..() + if(projectile_amount > 1 && current_amount) + StartCooldown(cooldown_time * ((projectile_amount - current_amount) / projectile_amount)) + current_amount = 0 + +// cast_on is a turf, or atom target, that we clicked on to fire at. +/datum/action/cooldown/spell/pointed/projectile/cast(atom/cast_on) + . = ..() + if(!isturf(owner.loc)) + return FALSE + + var/turf/caster_turf = get_turf(owner) + // Get the tile infront of the caster, based on their direction + var/turf/caster_front_turf = get_step(owner, owner.dir) + + fire_projectile(cast_on) + owner.newtonian_move(get_dir(caster_front_turf, caster_turf)) + if(current_amount <= 0) + unset_click_ability(owner, refund_cooldown = FALSE) + + return TRUE + +/datum/action/cooldown/spell/pointed/projectile/after_cast(atom/cast_on) + . = ..() + if(current_amount > 0) + // We still have projectiles to cast! + // Reset our cooldown and let them fire away + reset_spell_cooldown() + +/datum/action/cooldown/spell/pointed/projectile/proc/fire_projectile(atom/target) + current_amount-- + for(var/i in 1 to projectiles_per_fire) + var/obj/projectile/to_fire = new projectile_type() + ready_projectile(to_fire, target, owner, i) + to_fire.fire() + return TRUE + +/datum/action/cooldown/spell/pointed/projectile/proc/ready_projectile(obj/projectile/to_fire, atom/target, mob/user, iteration) + to_fire.firer = owner + to_fire.fired_from = get_turf(owner) + to_fire.preparePixelProjectile(target, owner) + RegisterSignal(to_fire, COMSIG_PROJECTILE_ON_HIT, .proc/on_cast_hit) + + if(istype(to_fire, /obj/projectile/magic)) + var/obj/projectile/magic/magic_to_fire = to_fire + magic_to_fire.antimagic_flags = antimagic_flags + +/// Signal proc for whenever the projectile we fire hits someone. +/// Pretty much relays to the spell when the projectile actually hits something. +/datum/action/cooldown/spell/pointed/projectile/proc/on_cast_hit(atom/source, mob/firer, atom/hit, angle) + SIGNAL_HANDLER + + SEND_SIGNAL(src, COMSIG_SPELL_PROJECTILE_HIT, hit, firer, source) diff --git a/code/modules/spells/spell_types/pointed/abyssal_gaze.dm b/code/modules/spells/spell_types/pointed/abyssal_gaze.dm new file mode 100644 index 00000000000000..0cf4d3130a425e --- /dev/null +++ b/code/modules/spells/spell_types/pointed/abyssal_gaze.dm @@ -0,0 +1,54 @@ + +/datum/action/cooldown/spell/pointed/abyssal_gaze + name = "Abyssal Gaze" + desc = "This spell instills a deep terror in your target, temporarily chilling and blinding it." + ranged_mousepointer = 'icons/effects/mouse_pointers/cult_target.dmi' + background_icon_state = "bg_demon" + icon_icon = 'icons/mob/actions/actions_cult.dmi' + button_icon_state = "abyssal_gaze" + + school = SCHOOL_EVOCATION + cooldown_time = 75 SECONDS + invocation_type = INVOCATION_NONE + spell_requirements = NONE + antimagic_flags = MAGIC_RESISTANCE|MAGIC_RESISTANCE_HOLY + + cast_range = 5 + active_msg = "You prepare to instill a deep terror in a target..." + + /// The duration of the blind on our target + var/blind_duration = 4 SECONDS + /// The amount of temperature we take from our target + var/amount_to_cool = 200 + +/datum/action/cooldown/spell/pointed/abyssal_gaze/is_valid_target(atom/cast_on) + return iscarbon(target) + +/datum/action/cooldown/spell/pointed/abyssal_gaze/cast(mob/living/carbon/cast_on) + . = ..() + if(cast_on.can_block_magic(antimagic_flags)) + to_chat(owner, span_warning("The spell had no effect!")) + to_chat(cast_on, span_warning("You feel a freezing darkness closing in on you, but it rapidly dissipates.")) + return FALSE + + to_chat(cast_on, span_userdanger("A freezing darkness surrounds you...")) + cast_on.playsound_local(get_turf(cast_on), 'sound/hallucinations/i_see_you1.ogg', 50, 1) + owner.playsound_local(get_turf(owner), 'sound/effects/ghost2.ogg', 50, 1) + cast_on.become_blind(ABYSSAL_GAZE_BLIND) + addtimer(CALLBACK(src, .proc/cure_blindness, cast_on), blind_duration) + if(ishuman(cast_on)) + var/mob/living/carbon/human/human_cast_on = cast_on + human_cast_on.adjust_coretemperature(-amount_to_cool) + cast_on.adjust_bodytemperature(-amount_to_cool) + +/** + * cure_blidness: Cures Abyssal Gaze blindness from the target + * + * Arguments: + * * target The mob that is being cured of the blindness. + */ +/datum/action/cooldown/spell/pointed/abyssal_gaze/proc/cure_blindness(mob/living/carbon/cast_on) + if(QDELETED(cast_on) || !istype(cast_on)) + return + + cast_on.cure_blind(ABYSSAL_GAZE_BLIND) diff --git a/code/modules/spells/spell_types/pointed/barnyard.dm b/code/modules/spells/spell_types/pointed/barnyard.dm index 4177ca48af7158..b6fce6521555a3 100644 --- a/code/modules/spells/spell_types/pointed/barnyard.dm +++ b/code/modules/spells/spell_types/pointed/barnyard.dm @@ -1,53 +1,55 @@ -/obj/effect/proc_holder/spell/pointed/barnyardcurse +/datum/action/cooldown/spell/pointed/barnyardcurse name = "Curse of the Barnyard" desc = "This spell dooms an unlucky soul to possess the speech and facial attributes of a barnyard animal." + button_icon_state = "barn" + ranged_mousepointer = 'icons/effects/mouse_pointers/barn_target.dmi' + school = SCHOOL_TRANSMUTATION - charge_type = "recharge" - charge_max = 150 - charge_counter = 0 - clothes_req = FALSE - stat_allowed = FALSE + cooldown_time = 15 SECONDS + cooldown_reduction_per_rank = 3 SECONDS + invocation = "KN'A FTAGHU, PUCK 'BTHNK!" invocation_type = INVOCATION_SHOUT - range = 7 - cooldown_min = 30 - ranged_mousepointer = 'icons/effects/mouse_pointers/barn_target.dmi' - action_icon_state = "barn" + spell_requirements = SPELL_REQUIRES_NO_ANTIMAGIC + active_msg = "You prepare to curse a target..." - deactive_msg = "You dispel the curse..." - /// List of mobs which are allowed to be a target of the spell - var/static/list/compatible_mobs_typecache = typecacheof(list(/mob/living/carbon/human)) + deactive_msg = "You dispel the curse." -/obj/effect/proc_holder/spell/pointed/barnyardcurse/cast(list/targets, mob/user) - if(!targets.len) - to_chat(user, span_warning("No target found in range!")) +/datum/action/cooldown/spell/pointed/barnyardcurse/is_valid_target(atom/cast_on) + . = ..() + if(!.) return FALSE - if(!can_target(targets[1], user)) + if(!ishuman(cast_on)) return FALSE - var/mob/living/carbon/target = targets[1] - if(target.can_block_magic()) - to_chat(user, span_warning("The spell had no effect!")) - target.visible_message(span_danger("[target]'s face bursts into flames, which instantly burst outward, leaving [target] unharmed!"), \ - span_danger("Your face starts burning up, but the flames are repulsed by your anti-magic protection!")) - return FALSE + var/mob/living/carbon/human/human_target = cast_on + if(!human_target.wear_mask) + return TRUE - var/choice = pick(GLOB.cursed_animal_masks) - var/obj/item/clothing/mask/magichead = new choice(get_turf(target)) + return !(human_target.wear_mask.type in GLOB.cursed_animal_masks) - target.visible_message(span_danger("[target]'s face bursts into flames, and a barnyard animal's head takes its place!"), \ - span_danger("Your face burns up, and shortly after the fire you realise you have the face of a barnyard animal!")) - if(!target.dropItemToGround(target.wear_mask)) - qdel(target.wear_mask) - target.equip_to_slot_if_possible(magichead, ITEM_SLOT_MASK, 1, 1) - target.flash_act() - -/obj/effect/proc_holder/spell/pointed/barnyardcurse/can_target(atom/target, mob/user, silent) +/datum/action/cooldown/spell/pointed/barnyardcurse/cast(mob/living/carbon/human/cast_on) . = ..() - if(!.) - return FALSE - if(!is_type_in_typecache(target, compatible_mobs_typecache)) - if(!silent) - to_chat(user, span_warning("You are unable to curse [target]!")) + if(cast_on.can_block_magic(antimagic_flags)) + cast_on.visible_message( + span_danger("[cast_on]'s face bursts into flames, which instantly burst outward, leaving [cast_on.p_them()] unharmed!"), + span_danger("Your face starts burning up, but the flames are repulsed by your anti-magic protection!"), + ) + to_chat(owner, span_warning("The spell had no effect!")) return FALSE + + var/chosen_type = pick(GLOB.cursed_animal_masks) + var/obj/item/clothing/mask/animal/cursed_mask = new chosen_type(get_turf(target)) + + cast_on.visible_message( + span_danger("[target]'s face bursts into flames, and a barnyard animal's head takes its place!"), + span_userdanger("Your face burns up, and shortly after the fire you realise you have the face of a [cursed_mask.animal_type]!"), + ) + + // Can't drop? Nuke it + if(!cast_on.dropItemToGround(cast_on.wear_mask)) + qdel(cast_on.wear_mask) + + cast_on.equip_to_slot_if_possible(cursed_mask, ITEM_SLOT_MASK, TRUE, TRUE) + cast_on.flash_act() return TRUE diff --git a/code/modules/spells/spell_types/pointed/blind.dm b/code/modules/spells/spell_types/pointed/blind.dm index de4d3ff2b80124..cd044e5cb40137 100644 --- a/code/modules/spells/spell_types/pointed/blind.dm +++ b/code/modules/spells/spell_types/pointed/blind.dm @@ -1,35 +1,51 @@ -/obj/effect/proc_holder/spell/pointed/trigger/blind +/datum/action/cooldown/spell/pointed/blind name = "Blind" desc = "This spell temporarily blinds a single target." + button_icon_state = "blind" + ranged_mousepointer = 'icons/effects/mouse_pointers/blind_target.dmi' + + sound = 'sound/magic/blind.ogg' school = SCHOOL_TRANSMUTATION - charge_max = 300 - clothes_req = FALSE + cooldown_time = 30 SECONDS + cooldown_reduction_per_rank = 6.25 SECONDS + invocation = "STI KALY" invocation_type = INVOCATION_WHISPER - message = "Your eyes cry out in pain!" - cooldown_min = 50 //12 deciseconds reduction per rank - starting_spells = list("/obj/effect/proc_holder/spell/targeted/inflict_handler/blind", "/obj/effect/proc_holder/spell/targeted/genetic/blind") - ranged_mousepointer = 'icons/effects/mouse_pointers/blind_target.dmi' - action_icon_state = "blind" + spell_requirements = SPELL_REQUIRES_NO_ANTIMAGIC + active_msg = "You prepare to blind a target..." -/obj/effect/proc_holder/spell/targeted/inflict_handler/blind - amt_eye_blind = 10 - amt_eye_blurry = 20 - sound = 'sound/magic/blind.ogg' + /// The amount of blind to apply + var/eye_blind_amount = 10 + /// The amount of blurriness to apply + var/eye_blurry_amount = 20 + /// The duration of the blind mutation placed on the person + var/blind_mutation_duration = 30 SECONDS -/obj/effect/proc_holder/spell/targeted/genetic/blind - mutations = list(/datum/mutation/human/blind) - duration = 300 - charge_max = 400 // needs to be higher than the duration or it'll be permanent - sound = 'sound/magic/blind.ogg' - -/obj/effect/proc_holder/spell/pointed/trigger/blind/can_target(atom/target, mob/user, silent) +/datum/action/cooldown/spell/pointed/blind/is_valid_target(atom/cast_on) . = ..() if(!.) return FALSE - if(!isliving(target)) - if(!silent) - to_chat(user, span_warning("You can only blind living beings!")) + if(!ishuman(cast_on)) return FALSE + + var/mob/living/carbon/human/human_target = cast_on + return !human_target.is_blind() + +/datum/action/cooldown/spell/pointed/blind/cast(mob/living/carbon/human/cast_on) + . = ..() + if(cast_on.can_block_magic(antimagic_flags)) + to_chat(cast_on, span_notice("Your eye itches, but it passes momentarily.")) + to_chat(owner, span_warning("The spell had no effect!")) + return FALSE + + to_chat(cast_on, span_warning("Your eyes cry out in pain!")) + cast_on.blind_eyes(eye_blind_amount) + cast_on.blur_eyes(eye_blurry_amount) + if(cast_on.dna && blind_mutation_duration > 0 SECONDS) + cast_on.dna.add_mutation(/datum/mutation/human/blind) + addtimer(CALLBACK(src, .proc/fix_eyes, cast_on), blind_mutation_duration) return TRUE + +/datum/action/cooldown/spell/pointed/blind/proc/fix_eyes(mob/living/carbon/human/cast_on) + cast_on.dna?.remove_mutation(/datum/mutation/human/blind) diff --git a/code/modules/spells/spell_types/pointed/dominate.dm b/code/modules/spells/spell_types/pointed/dominate.dm new file mode 100644 index 00000000000000..f5b8aaa9c8c5a6 --- /dev/null +++ b/code/modules/spells/spell_types/pointed/dominate.dm @@ -0,0 +1,49 @@ +/datum/action/cooldown/spell/pointed/dominate + name = "Dominate" + desc = "This spell dominates the mind of a lesser creature to the will of Nar'Sie, \ + allying it only to her direct followers." + background_icon_state = "bg_demon" + icon_icon = 'icons/mob/actions/actions_cult.dmi' + button_icon_state = "dominate" + ranged_mousepointer = 'icons/effects/mouse_pointers/cult_target.dmi' + + school = SCHOOL_EVOCATION + cooldown_time = 1 MINUTES + invocation_type = INVOCATION_NONE + spell_requirements = NONE + // An UNHOLY, MAGIC SPELL that INFLUECNES THE MIND - all things work here, logically + antimagic_flags = MAGIC_RESISTANCE|MAGIC_RESISTANCE_HOLY|MAGIC_RESISTANCE_MIND + + cast_range = 7 + active_msg = "You prepare to dominate the mind of a target..." + +/datum/action/cooldown/spell/pointed/dominate/is_valid_target(atom/cast_on) + if(!isanimal(cast_on)) + return FALSE + + var/mob/living/simple_animal/animal = cast_on + if(animal.mind) + return FALSE + if(animal.stat == DEAD) + return FALSE + if(animal.sentience_type != SENTIENCE_ORGANIC) + return FALSE + if("cult" in animal.faction) + return FALSE + if(HAS_TRAIT(animal, TRAIT_HOLY)) + return FALSE + + return TRUE + +/datum/action/cooldown/spell/pointed/dominate/cast(mob/living/simple_animal/cast_on) + . = ..() + if(cast_on.can_block_magic(antimagic_flags)) + to_chat(cast_on, span_warning("Your feel someone attempting to subject your mind to terrible machinations!")) + to_chat(owner, span_warning("[cast_on] resists your domination!")) + return FALSE + + var/turf/cast_turf = get_turf(cast_on) + cast_on.add_atom_colour("#990000", FIXED_COLOUR_PRIORITY) + cast_on.faction |= "cult" + playsound(cast_turf, 'sound/effects/ghost.ogg', 100, TRUE) + new /obj/effect/temp_visual/cult/sac(cast_turf) diff --git a/code/modules/spells/spell_types/pointed/finger_guns.dm b/code/modules/spells/spell_types/pointed/finger_guns.dm new file mode 100644 index 00000000000000..9c495d27d755e5 --- /dev/null +++ b/code/modules/spells/spell_types/pointed/finger_guns.dm @@ -0,0 +1,48 @@ +/datum/action/cooldown/spell/pointed/projectile/finger_guns + name = "Finger Guns" + desc = "Shoot up to three mimed bullets from your fingers that damage and mute their targets. \ + Can't be used if you have something in your hands." + background_icon_state = "bg_mime" + icon_icon = 'icons/mob/actions/actions_mime.dmi' + button_icon_state = "finger_guns0" + panel = "Mime" + sound = null + + school = SCHOOL_MIME + cooldown_time = 30 SECONDS + + invocation = "" + invocation_type = INVOCATION_EMOTE + invocation_self_message = span_danger("You fire your finger gun!") + + spell_requirements = SPELL_REQUIRES_HUMAN|SPELL_REQUIRES_MIME_VOW + antimagic_flags = NONE + spell_max_level = 1 + + base_icon_state = "finger_guns" + active_msg = "You draw your fingers!" + deactive_msg = "You put your fingers at ease. Another time." + cast_range = 20 + projectile_type = /obj/projectile/bullet/mime + projectile_amount = 3 + +/datum/action/cooldown/spell/pointed/projectile/finger_guns/can_invoke(feedback = TRUE) + if(invocation_type == INVOCATION_EMOTE) + if(!ishuman(owner)) + return FALSE + + var/mob/living/carbon/human/human_owner = owner + if(human_owner.incapacitated()) + if(feedback) + to_chat(owner, span_warning("You can't properly point your fingers while incapacitated.")) + return FALSE + if(human_owner.get_active_held_item()) + if(feedback) + to_chat(owner, span_warning("You can't properly fire your finger guns with something in your hand.")) + return FALSE + + return ..() + +/datum/action/cooldown/spell/pointed/projectile/finger_guns/before_cast(atom/cast_on) + . = ..() + invocation = span_notice("[cast_on] fires [cast_on.p_their()] finger gun!") diff --git a/code/modules/spells/spell_types/pointed/fireball.dm b/code/modules/spells/spell_types/pointed/fireball.dm new file mode 100644 index 00000000000000..47fd05c0f4680f --- /dev/null +++ b/code/modules/spells/spell_types/pointed/fireball.dm @@ -0,0 +1,23 @@ +/datum/action/cooldown/spell/pointed/projectile/fireball + name = "Fireball" + desc = "This spell fires an explosive fireball at a target." + button_icon_state = "fireball0" + + sound = 'sound/magic/fireball.ogg' + school = SCHOOL_EVOCATION + cooldown_time = 6 SECONDS + cooldown_reduction_per_rank = 1 SECONDS // 1 second reduction per rank + + invocation = "ONI SOMA!" + invocation_type = INVOCATION_SHOUT + spell_requirements = SPELL_REQUIRES_NO_ANTIMAGIC + + base_icon_state = "fireball" + active_msg = "You prepare to cast your fireball spell!" + deactive_msg = "You extinguish your fireball... for now." + cast_range = 8 + projectile_type = /obj/projectile/magic/fireball + +/datum/action/cooldown/spell/pointed/projectile/fireball/ready_projectile(obj/projectile/to_fire, atom/target, mob/user, iteration) + . = ..() + to_fire.range = (6 + 2 * spell_level) diff --git a/code/modules/spells/spell_types/pointed/lightning_bolt.dm b/code/modules/spells/spell_types/pointed/lightning_bolt.dm new file mode 100644 index 00000000000000..e88e35235718f5 --- /dev/null +++ b/code/modules/spells/spell_types/pointed/lightning_bolt.dm @@ -0,0 +1,43 @@ +/datum/action/cooldown/spell/pointed/projectile/lightningbolt + name = "Lightning Bolt" + desc = "Fire a lightning bolt at your foes! It will jump between targets, but can't knock them down." + button_icon_state = "lightning0" + + sound = 'sound/magic/lightningbolt.ogg' + school = SCHOOL_EVOCATION + cooldown_time = 10 SECONDS + cooldown_reduction_per_rank = 2 SECONDS + + invocation = "P'WAH, UNLIM'TED P'WAH!" + invocation_type = INVOCATION_SHOUT + spell_requirements = SPELL_REQUIRES_NO_ANTIMAGIC + + base_icon_state = "lightning" + active_msg = "You energize your hands with arcane lightning!" + deactive_msg = "You let the energy flow out of your hands back into yourself..." + projectile_type = /obj/projectile/magic/aoe/lightning + + /// The range the bolt itself (different to the range of the projectile) + var/bolt_range = 15 + /// The power of the bolt itself + var/bolt_power = 20000 + /// The flags the bolt itself takes when zapping someone + var/bolt_flags = ZAP_MOB_DAMAGE + +/datum/action/cooldown/spell/pointed/projectile/lightningbolt/Grant(mob/grant_to) + . = ..() + ADD_TRAIT(owner, TRAIT_TESLA_SHOCKIMMUNE, type) + +/datum/action/cooldown/spell/pointed/projectile/lightningbolt/Remove(mob/living/remove_from) + REMOVE_TRAIT(remove_from, TRAIT_TESLA_SHOCKIMMUNE, type) + return ..() + +/datum/action/cooldown/spell/pointed/projectile/lightningbolt/ready_projectile(obj/projectile/to_fire, atom/target, mob/user, iteration) + . = ..() + if(!istype(to_fire, /obj/projectile/magic/aoe/lightning)) + return + + var/obj/projectile/magic/aoe/lightning/bolt = to_fire + bolt.zap_range = bolt_range + bolt.zap_power = bolt_power + bolt.zap_flags = bolt_flags diff --git a/code/modules/spells/spell_types/pointed/mind_transfer.dm b/code/modules/spells/spell_types/pointed/mind_transfer.dm index 888190f0112a4b..bf31d402a4c22a 100644 --- a/code/modules/spells/spell_types/pointed/mind_transfer.dm +++ b/code/modules/spells/spell_types/pointed/mind_transfer.dm @@ -1,104 +1,125 @@ -/obj/effect/proc_holder/spell/pointed/mind_transfer - name = "Mind Transfer" +/datum/action/cooldown/spell/pointed/mind_transfer + name = "Mind Swap" desc = "This spell allows the user to switch bodies with a target next to him." + button_icon_state = "mindswap" + ranged_mousepointer = 'icons/effects/mouse_pointers/mindswap_target.dmi' + school = SCHOOL_TRANSMUTATION - charge_max = 600 - clothes_req = FALSE + cooldown_time = 60 SECONDS + cooldown_reduction_per_rank = 10 SECONDS + spell_requirements = SPELL_REQUIRES_NO_ANTIMAGIC|SPELL_REQUIRES_MIND|SPELL_CASTABLE_AS_BRAIN + antimagic_flags = MAGIC_RESISTANCE|MAGIC_RESISTANCE_MIND + invocation = "GIN'YU CAPAN" invocation_type = INVOCATION_WHISPER - range = 1 - cooldown_min = 200 //100 deciseconds reduction per rank - ranged_mousepointer = 'icons/effects/mouse_pointers/mindswap_target.dmi' - action_icon_state = "mindswap" + active_msg = "You prepare to swap minds with a target..." - antimagic_flags = MAGIC_RESISTANCE|MAGIC_RESISTANCE_MIND + deactive_msg = "You dispel mind swap." + cast_range = 1 + + /// If TRUE, we cannot mindswap into mobs with minds if they do not currently have a key / player. + var/target_requires_key = TRUE /// For how long is the caster stunned for after the spell var/unconscious_amount_caster = 40 SECONDS /// For how long is the victim stunned for after the spell var/unconscious_amount_victim = 40 SECONDS + /// List of mobs we cannot mindswap into. + var/static/list/mob/living/blacklisted_mobs = typecacheof(list( + /mob/living/brain, + /mob/living/silicon/pai, + /mob/living/simple_animal/hostile/imp/slaughter, + /mob/living/simple_animal/hostile/megafauna, + )) -/obj/effect/proc_holder/spell/pointed/mind_transfer/cast(list/targets, mob/living/user, silent = FALSE) - if(!targets.len) - if(!silent) - to_chat(user, span_warning("No mind found!")) - return FALSE - if(targets.len > 1) - if(!silent) - to_chat(user, span_warning("Too many minds! You're not a hive damnit!")) +/datum/action/cooldown/spell/pointed/mind_transfer/can_cast_spell(feedback = TRUE) + . = ..() + if(!.) return FALSE - if(!can_target(targets[1], user, silent)) + if(!isliving(owner)) return FALSE - - var/mob/living/victim = targets[1] //The target of the spell whos body will be transferred to. - if(istype(victim, /mob/living/simple_animal/hostile/guardian)) - var/mob/living/simple_animal/hostile/guardian/stand = victim - if(stand.summoner) - victim = stand.summoner - var/datum/mind/VM = victim.mind - if(victim.can_block_magic(antimagic_flags) || VM.has_antag_datum(/datum/antagonist/wizard) || VM.has_antag_datum(/datum/antagonist/cult) || VM.has_antag_datum(/datum/antagonist/changeling) || VM.has_antag_datum(/datum/antagonist/rev) || victim.key[1] == "@") - if(!silent) - to_chat(user, span_warning("[victim.p_their(TRUE)] mind is resisting your spell!")) + if(owner.suiciding) + if(feedback) + to_chat(owner, span_warning("You're killing yourself! You can't concentrate enough to do this!")) return FALSE - - //You should not be able to enter one of the most powerful side-antags as a fucking wizard. - if(istype(victim,/mob/living/simple_animal/hostile/imp/slaughter)) - to_chat(user, span_warning("The devilish contract doesn't include the 'mind swappable' package, please try again another lifetime.")) - return - - //MIND TRANSFER BEGIN - var/mob/dead/observer/ghost = victim.ghostize() - user.mind.transfer_to(victim) - - ghost.mind.transfer_to(user) - if(ghost.key) - user.key = ghost.key //have to transfer the key since the mind was not active - qdel(ghost) - //MIND TRANSFER END - - //Here we knock both mobs out for a time. - user.Unconscious(unconscious_amount_caster) - victim.Unconscious(unconscious_amount_victim) - SEND_SOUND(user, sound('sound/magic/mandswap.ogg')) - SEND_SOUND(victim, sound('sound/magic/mandswap.ogg')) // only the caster and victim hear the sounds, that way no one knows for sure if the swap happened return TRUE -/obj/effect/proc_holder/spell/pointed/mind_transfer/can_target(atom/target, mob/user, silent) +/datum/action/cooldown/spell/pointed/mind_transfer/is_valid_target(atom/cast_on) . = ..() if(!.) return FALSE - if(!isliving(target)) - if(!silent) - to_chat(user, span_warning("You can only swap minds with living beings!")) + + if(!isliving(cast_on)) + to_chat(owner, span_warning("You can only swap minds with living beings!")) return FALSE - if(user == target) - if(!silent) - to_chat(user, span_warning("You can't swap minds with yourself!")) + if(is_type_in_typecache(cast_on, blacklisted_mobs)) + to_chat(owner, span_warning("This creature is too [pick("powerful", "strange", "arcane", "obscene")] to control!")) return FALSE + if(isguardian(cast_on)) + var/mob/living/simple_animal/hostile/guardian/stand = cast_on + if(stand.summoner && stand.summoner == owner) + to_chat(owner, span_warning("Swapping minds with your own guardian would just put you back into your own head!")) + return FALSE - var/mob/living/victim = target - var/t_He = victim.p_they(TRUE) - - if(ismegafauna(victim)) - if(!silent) - to_chat(user, span_warning("This creature is too powerful to control!")) - return FALSE - if(victim.stat == DEAD) - if(!silent) - to_chat(user, span_warning("You don't particularly want to be dead!")) + var/mob/living/living_target = cast_on + if(living_target.stat == DEAD) + to_chat(owner, span_warning("You don't particularly want to be dead!")) return FALSE - if(!victim.key || !victim.mind) - if(!silent) - to_chat(user, span_warning("[t_He] appear[victim.p_s()] to be catatonic! Not even magic can affect [victim.p_their()] vacant mind.")) + if(!living_target.mind) + to_chat(owner, span_warning("[living_target.p_theyve(TRUE)] doesn't appear to have a mind to swap into!")) return FALSE - if(user.suiciding) - if(!silent) - to_chat(user, span_warning("You're killing yourself! You can't concentrate enough to do this!")) + if(!living_target.key && target_requires_key) + to_chat(owner, span_warning("[living_target.p_theyve(TRUE)] appear[living_target.p_s()] to be catatonic! \ + Not even magic can affect [living_target.p_their()] vacant mind.")) return FALSE - if(istype(victim, /mob/living/simple_animal/hostile/guardian)) - var/mob/living/simple_animal/hostile/guardian/stand = victim + + return TRUE + +/datum/action/cooldown/spell/pointed/mind_transfer/cast(mob/living/cast_on) + . = ..() + swap_minds(owner, cast_on) + +/datum/action/cooldown/spell/pointed/mind_transfer/proc/swap_minds(mob/living/caster, mob/living/cast_on) + + var/mob/living/to_swap = cast_on + if(isguardian(cast_on)) + var/mob/living/simple_animal/hostile/guardian/stand = cast_on if(stand.summoner) - if(stand.summoner == user) - if(!silent) - to_chat(user, span_warning("Swapping minds with your own guardian would just put you back into your own head!")) - return FALSE + to_swap = stand.summoner + + var/datum/mind/mind_to_swap = to_swap.mind + if(to_swap.can_block_magic(antimagic_flags) \ + || mind_to_swap.has_antag_datum(/datum/antagonist/wizard) \ + || mind_to_swap.has_antag_datum(/datum/antagonist/cult) \ + || mind_to_swap.has_antag_datum(/datum/antagonist/changeling) \ + || mind_to_swap.has_antag_datum(/datum/antagonist/rev) \ + || mind_to_swap.key?[1] == "@" \ + ) + to_chat(caster, span_warning("[to_swap.p_their(TRUE)] mind is resisting your spell!")) + return FALSE + + // MIND TRANSFER BEGIN + + var/datum/mind/caster_mind = caster.mind + var/datum/mind/to_swap_mind = to_swap.mind + + var/to_swap_key = to_swap.key + + caster_mind.transfer_to(to_swap) + to_swap_mind.transfer_to(caster) + + // Just in case the swappee's key wasn't grabbed by transfer_to... + if(to_swap_key) + caster.key = to_swap_key + + // MIND TRANSFER END + + // Now we knock both mobs out for a time. + caster.Unconscious(unconscious_amount_caster) + to_swap.Unconscious(unconscious_amount_victim) + + // Only the caster and victim hear the sounds, + // that way no one knows for sure if the swap happened + SEND_SOUND(caster, sound('sound/magic/mandswap.ogg')) + SEND_SOUND(to_swap, sound('sound/magic/mandswap.ogg')) + return TRUE diff --git a/code/modules/spells/spell_types/pointed/pointed.dm b/code/modules/spells/spell_types/pointed/pointed.dm deleted file mode 100644 index 94676ba64acd25..00000000000000 --- a/code/modules/spells/spell_types/pointed/pointed.dm +++ /dev/null @@ -1,104 +0,0 @@ -/obj/effect/proc_holder/spell/pointed - name = "pointed spell" - ranged_mousepointer = 'icons/effects/mouse_pointers/throw_target.dmi' - action_icon_state = "projectile" - /// Message showing to the spell owner upon deactivating pointed spell. - var/deactive_msg = "You dispel the magic..." - /// Message showing to the spell owner upon activating pointed spell. - var/active_msg = "You prepare to use the spell on a target..." - /// Variable dictating if the user is allowed to cast a spell on himself. - var/self_castable = FALSE - /// Variable dictating if the spell will use turf based aim assist - var/aim_assist = TRUE - -/obj/effect/proc_holder/spell/pointed/Click() - var/mob/living/user = usr - if(!istype(user)) - return - var/msg - if(!can_cast(user)) - msg = span_warning("You can no longer cast [name]!") - remove_ranged_ability(msg) - return - if(active) - msg = span_notice("[deactive_msg]") - remove_ranged_ability(msg) - else - msg = span_notice("[active_msg] Left-click to activate spell on a target!") - add_ranged_ability(user, msg, TRUE) - -/obj/effect/proc_holder/spell/pointed/on_lose(mob/living/user) - remove_ranged_ability() - -/obj/effect/proc_holder/spell/pointed/remove_ranged_ability(msg) - . = ..() - on_deactivation(ranged_ability_user) - -/obj/effect/proc_holder/spell/pointed/add_ranged_ability(mob/living/user, msg, forced) - . = ..() - on_activation(user) - -/** - * on_activation: What happens upon pointed spell activation. - * - * Arguments: - * * user The mob interacting owning the spell. - */ -/obj/effect/proc_holder/spell/pointed/proc/on_activation(mob/user) - return - -/** - * on_activation: What happens upon pointed spell deactivation. - * - * Arguments: - * * user The mob interacting owning the spell. - */ -/obj/effect/proc_holder/spell/pointed/proc/on_deactivation(mob/user) - return - -/obj/effect/proc_holder/spell/pointed/update_icon() - if(!action) - return - - . = ..() - action.button_icon_state = "[action_icon_state][active ? 1 : null]" - action.UpdateButtons() - -/obj/effect/proc_holder/spell/pointed/InterceptClickOn(mob/living/caller, params, atom/target) - if(..()) - return TRUE - if(aim_assist && isturf(target)) - var/list/possible_targets = list() - for(var/A in target) - if(intercept_check(caller, A, TRUE)) - possible_targets += A - if(possible_targets.len == 1) - target = possible_targets[1] - if(!intercept_check(caller, target)) - return TRUE - if(!cast_check(FALSE, caller)) - return TRUE - perform(list(target), user = caller) - remove_ranged_ability() - return TRUE // Do not do any underlying actions after the spell cast - -/** - * intercept_check: Specific spell checks for InterceptClickOn() targets. - * - * Arguments: - * * user The mob using the ranged spell via intercept. - * * target The atom that is being targeted by the spell via intercept. - * * silent If the checks should produce not any feedback messages for the user. - */ -/obj/effect/proc_holder/spell/pointed/proc/intercept_check(mob/user, atom/target, silent = FALSE) - if(!self_castable && target == user) - if(!silent) - to_chat(user, span_warning("You cannot cast the spell on yourself!")) - return FALSE - if(!(target in view_or_range(range, user, selection_type))) - if(!silent) - to_chat(user, span_warning("[target.p_theyre(TRUE)] too far away!")) - return FALSE - if(!can_target(target, user, silent)) - return FALSE - return TRUE diff --git a/code/modules/spells/spell_types/pointed/spell_cards.dm b/code/modules/spells/spell_types/pointed/spell_cards.dm new file mode 100644 index 00000000000000..4b6af520517ccf --- /dev/null +++ b/code/modules/spells/spell_types/pointed/spell_cards.dm @@ -0,0 +1,83 @@ + +/datum/action/cooldown/spell/pointed/projectile/spell_cards + name = "Spell Cards" + desc = "Blazing hot rapid-fire homing cards. Send your foes to the shadow realm with their mystical power!" + button_icon_state = "spellcard0" + click_cd_override = 1 + + school = SCHOOL_EVOCATION + cooldown_time = 5 SECONDS + cooldown_reduction_per_rank = 1 SECONDS + + invocation = "Sigi'lu M'Fan 'Tasia!" + invocation_type = INVOCATION_SHOUT + spell_requirements = SPELL_REQUIRES_NO_ANTIMAGIC + + base_icon_state = "spellcard" + cast_range = 40 + projectile_type = /obj/projectile/magic/spellcard + projectile_amount = 5 + projectiles_per_fire = 7 + + /// A weakref to the mob we're currently targeting with the lockon component. + var/datum/weakref/current_target_weakref + /// The turn rate of the spell cards in flight. (They track onto locked on targets) + var/projectile_turnrate = 10 + /// The homing spread of the spell cards in flight. + var/projectile_pixel_homing_spread = 32 + /// The initial spread of the spell cards when fired. + var/projectile_initial_spread_amount = 30 + /// The location spread of the spell cards when fired. + var/projectile_location_spread_amount = 12 + /// A ref to our lockon component, which is created and destroyed on activation and deactivation. + var/datum/component/lockon_aiming/lockon_component + +/datum/action/cooldown/spell/pointed/projectile/spell_cards/Destroy() + QDEL_NULL(lockon_component) + return ..() + +/datum/action/cooldown/spell/pointed/projectile/spell_cards/on_activation(mob/on_who) + . = ..() + if(!.) + return + + QDEL_NULL(lockon_component) + lockon_component = owner.AddComponent( \ + /datum/component/lockon_aiming, \ + range = 5, \ + typecache = GLOB.typecache_living, \ + amount = 1, \ + when_locked = CALLBACK(src, .proc/on_lockon_component)) + +/datum/action/cooldown/spell/pointed/projectile/spell_cards/proc/on_lockon_component(list/locked_weakrefs) + if(!length(locked_weakrefs)) + current_target_weakref = null + return + current_target_weakref = locked_weakrefs[1] + var/atom/real_target = current_target_weakref.resolve() + if(real_target) + owner.face_atom(real_target) + +/datum/action/cooldown/spell/pointed/projectile/spell_cards/on_deactivation(mob/on_who, refund_cooldown = TRUE) + . = ..() + QDEL_NULL(lockon_component) + +/datum/action/cooldown/spell/pointed/projectile/spell_cards/ready_projectile(obj/projectile/to_fire, atom/target, mob/user, iteration) + . = ..() + if(current_target_weakref) + var/atom/real_target = current_target_weakref?.resolve() + if(real_target && get_dist(real_target, user) < 7) + to_fire.homing_turn_speed = projectile_turnrate + to_fire.homing_inaccuracy_min = projectile_pixel_homing_spread + to_fire.homing_inaccuracy_max = projectile_pixel_homing_spread + to_fire.set_homing_target(real_target) + + var/rand_spr = rand() + var/total_angle = projectile_initial_spread_amount * 2 + var/adjusted_angle = total_angle - ((projectile_initial_spread_amount / projectiles_per_fire) * 0.5) + var/one_fire_angle = adjusted_angle / projectiles_per_fire + var/current_angle = iteration * one_fire_angle * rand_spr - (projectile_initial_spread_amount / 2) + + to_fire.pixel_x = rand(-projectile_location_spread_amount, projectile_location_spread_amount) + to_fire.pixel_y = rand(-projectile_location_spread_amount, projectile_location_spread_amount) + to_fire.preparePixelProjectile(target, user, null, current_angle) diff --git a/code/modules/spells/spell_types/projectile.dm b/code/modules/spells/spell_types/projectile.dm deleted file mode 100644 index 8d3b0b7f014a47..00000000000000 --- a/code/modules/spells/spell_types/projectile.dm +++ /dev/null @@ -1,112 +0,0 @@ -/obj/projectile/magic/spell - name = "custom spell projectile" - var/trigger_range = 0 //How far we do we need to be to hit - var/linger = FALSE //Can't hit anything but the intended target - - var/trail = FALSE //if it leaves a trail - var/trail_lifespan = 0 //deciseconds - var/trail_icon = 'icons/obj/wizard.dmi' - var/trail_icon_state = "trail" - -//todo unify this and magic/aoe under common path -/obj/projectile/magic/spell/Range() - if(trigger_range > 1) - for(var/mob/living/L in range(trigger_range, get_turf(src))) - if(can_hit_target(L, ignore_loc = TRUE)) - return Bump(L) - . = ..() - -/obj/projectile/magic/spell/Moved(atom/OldLoc, Dir) - . = ..() - if(trail) - create_trail() - -/obj/projectile/magic/spell/proc/create_trail() - if(!trajectory) - return - var/datum/point/vector/previous = trajectory.return_vector_after_increments(1,-1) - var/obj/effect/overlay/trail = new /obj/effect/overlay(previous.return_turf()) - trail.pixel_x = previous.return_px() - trail.pixel_y = previous.return_py() - trail.icon = trail_icon - trail.icon_state = trail_icon_state - //might be changed to temp overlay - trail.set_density(FALSE) - trail.mouse_opacity = MOUSE_OPACITY_TRANSPARENT - QDEL_IN(trail, trail_lifespan) - -/obj/projectile/magic/spell/can_hit_target(atom/target, list/passthrough, direct_target = FALSE, ignore_loc = FALSE) - if(linger && target != original) - return FALSE - return ..() - -//NEEDS MAJOR CODE CLEANUP. - -/obj/effect/proc_holder/spell/targeted/projectile - name = "Projectile" - desc = "This spell summons projectiles which try to hit the targets." - antimagic_flags = MAGIC_RESISTANCE - var/proj_type = /obj/projectile/magic/spell //IMPORTANT use only subtypes of this - var/update_projectile = FALSE //So you want to admin abuse magic bullets ? This is for you - //Below only apply if update_projectile is true - var/proj_icon = 'icons/obj/guns/projectiles.dmi' - var/proj_icon_state = "spell" - var/proj_name = "a spell projectile" - var/proj_trail = FALSE //if it leaves a trail - var/proj_trail_lifespan = 0 //deciseconds - var/proj_trail_icon = 'icons/obj/wizard.dmi' - var/proj_trail_icon_state = "trail" - var/proj_lingering = FALSE //if it lingers or disappears upon hitting an obstacle - var/proj_homing = TRUE //if it follows the target - var/proj_insubstantial = FALSE //if it can pass through dense objects or not - var/proj_trigger_range = 0 //the range from target at which the projectile triggers cast(target) - var/proj_lifespan = 15 //in deciseconds * proj_step_delay - var/proj_step_delay = 1 //lower = faster - var/list/ignore_factions = list() //Faction types that will be ignored - -/obj/effect/proc_holder/spell/targeted/projectile/proc/fire_projectile(atom/target, mob/user) - var/obj/projectile/magic/spell/projectile = new proj_type() - - if(update_projectile) - //Generally these should already be set on the projectile, this is mostly here for varedited spells. - projectile.icon = proj_icon - projectile.icon_state = proj_icon_state - projectile.name = proj_name - if(proj_insubstantial) - projectile.movement_type |= PHASING - if(proj_homing) - projectile.homing = TRUE - projectile.homing_turn_speed = 360 //Perfect tracking - if(proj_lingering) - projectile.linger = TRUE - projectile.trigger_range = proj_trigger_range - projectile.ignored_factions = ignore_factions - projectile.range = proj_lifespan - projectile.speed = proj_step_delay - projectile.trail = proj_trail - projectile.trail_lifespan = proj_trail_lifespan - projectile.trail_icon = proj_trail_icon - projectile.trail_icon_state = proj_trail_icon_state - - projectile.preparePixelProjectile(target,user) - if(projectile.homing) - projectile.set_homing_target(target) - projectile.fire() - -/obj/effect/proc_holder/spell/targeted/projectile/cast(list/targets, mob/user = usr) - playMagSound() - for(var/atom/target in targets) - fire_projectile(target, user) - -//This one just pops one projectile in direction user is facing, irrelevant of max_targets etc -/obj/effect/proc_holder/spell/targeted/projectile/dumbfire - name = "Dumbfire projectile" - -/obj/effect/proc_holder/spell/targeted/projectile/dumbfire/choose_targets(mob/user = usr) - var/turf/T = get_turf(user) - for(var/i in 1 to range-1) - var/turf/new_turf = get_step(T, user.dir) - if(new_turf.density) - break - T = new_turf - perform(list(T),user = user) diff --git a/code/modules/spells/spell_types/projectile/_basic_projectile.dm b/code/modules/spells/spell_types/projectile/_basic_projectile.dm new file mode 100644 index 00000000000000..f9bd303f56f1d4 --- /dev/null +++ b/code/modules/spells/spell_types/projectile/_basic_projectile.dm @@ -0,0 +1,29 @@ +/** + * ## Basic Projectile spell + * + * Simply fires specified projectile type the direction the caster is facing. + * + * Behavior could / should probably be unified with pointed projectile spells + * and aoe projectile spells in the future. + */ +/datum/action/cooldown/spell/basic_projectile + /// How far we try to fire the basic projectile. Blocked by dense objects. + var/projectile_range = 7 + /// The projectile type fired at all people around us + var/obj/projectile/projectile_type = /obj/projectile/magic/aoe/magic_missile + +/datum/action/cooldown/spell/basic_projectile/cast(atom/cast_on) + . = ..() + var/turf/target_turf = get_turf(cast_on) + for(var/i in 1 to projectile_range - 1) + var/turf/next_turf = get_step(target_turf, cast_on.dir) + if(next_turf.density) + break + target_turf = next_turf + + fire_projectile(target_turf, cast_on) + +/datum/action/cooldown/spell/basic_projectile/proc/fire_projectile(atom/target, atom/caster) + var/obj/projectile/to_fire = new projectile_type() + to_fire.preparePixelProjectile(target, caster) + to_fire.fire() diff --git a/code/modules/spells/spell_types/projectile/juggernaut.dm b/code/modules/spells/spell_types/projectile/juggernaut.dm new file mode 100644 index 00000000000000..443c9cf62e5cd6 --- /dev/null +++ b/code/modules/spells/spell_types/projectile/juggernaut.dm @@ -0,0 +1,12 @@ +/datum/action/cooldown/spell/basic_projectile/juggernaut + name = "Gauntlet Echo" + desc = "Channels energy into your gauntlet - firing its essence forward in a slow moving, yet devastating, attack." + icon_icon = 'icons/mob/actions/actions_cult.dmi' + button_icon_state = "cultfist" + background_icon_state = "bg_demon" + sound = 'sound/weapons/resonator_blast.ogg' + + cooldown_time = 35 SECONDS + spell_requirements = NONE + + projectile_type = /obj/projectile/magic/aoe/juggernaut diff --git a/code/modules/spells/spell_types/rightandwrong.dm b/code/modules/spells/spell_types/right_and_wrong.dm similarity index 96% rename from code/modules/spells/spell_types/rightandwrong.dm rename to code/modules/spells/spell_types/right_and_wrong.dm index 0db7cbe8cf47df..211a4a9414ff0e 100644 --- a/code/modules/spells/spell_types/rightandwrong.dm +++ b/code/modules/spells/spell_types/right_and_wrong.dm @@ -57,15 +57,15 @@ GLOBAL_LIST_INIT(summoned_guns, list( //if you add anything that isn't covered by the typepaths below, add it to summon_magic_objective_types GLOBAL_LIST_INIT(summoned_magic, list( - /obj/item/book/granter/spell/fireball, - /obj/item/book/granter/spell/smoke, - /obj/item/book/granter/spell/blind, - /obj/item/book/granter/spell/mindswap, - /obj/item/book/granter/spell/forcewall, - /obj/item/book/granter/spell/knock, - /obj/item/book/granter/spell/barnyard, - /obj/item/book/granter/spell/charge, - /obj/item/book/granter/spell/summonitem, + /obj/item/book/granter/action/spell/fireball, + /obj/item/book/granter/action/spell/smoke, + /obj/item/book/granter/action/spell/blind, + /obj/item/book/granter/action/spell/mindswap, + /obj/item/book/granter/action/spell/forcewall, + /obj/item/book/granter/action/spell/knock, + /obj/item/book/granter/action/spell/barnyard, + /obj/item/book/granter/action/spell/charge, + /obj/item/book/granter/action/spell/summonitem, /obj/item/gun/magic/wand/nothing, /obj/item/gun/magic/wand/death, /obj/item/gun/magic/wand/resurrection, diff --git a/code/modules/spells/spell_types/santa.dm b/code/modules/spells/spell_types/santa.dm deleted file mode 100644 index 6a41c95cbdb34c..00000000000000 --- a/code/modules/spells/spell_types/santa.dm +++ /dev/null @@ -1,24 +0,0 @@ -//Santa spells! -/obj/effect/proc_holder/spell/aoe_turf/conjure/presents - name = "Conjure Presents!" - desc = "This spell lets you reach into S-space and retrieve presents! Yay!" - school = SCHOOL_CONJURATION - charge_max = 600 - clothes_req = FALSE - invocation = "HO HO HO" - invocation_type = INVOCATION_SHOUT - range = 3 - cooldown_min = 50 - antimagic_flags = NONE - - summon_type = list("/obj/item/a_gift") - summon_lifespan = 0 - summon_amt = 5 - -/obj/effect/proc_holder/spell/targeted/area_teleport/teleport/santa - name = "Santa Teleport" - - invocation = "HO HO HO" - clothes_req = FALSE - say_destination = FALSE // Santa moves in mysterious ways - antimagic_flags = NONE diff --git a/code/modules/spells/spell_types/self/basic_heal.dm b/code/modules/spells/spell_types/self/basic_heal.dm new file mode 100644 index 00000000000000..a4acba2d884514 --- /dev/null +++ b/code/modules/spells/spell_types/self/basic_heal.dm @@ -0,0 +1,27 @@ +// This spell exists mainly for debugging purposes, and also to show how casting works +/datum/action/cooldown/spell/basic_heal + name = "Lesser Heal" + desc = "Heals a small amount of brute and burn damage to the caster." + + sound = 'sound/magic/staff_healing.ogg' + school = SCHOOL_RESTORATION + cooldown_time = 10 SECONDS + cooldown_reduction_per_rank = 1.25 SECONDS + spell_requirements = SPELL_REQUIRES_NO_ANTIMAGIC|SPELL_REQUIRES_HUMAN + + invocation = "Victus sano!" + invocation_type = INVOCATION_WHISPER + + /// Amount of brute to heal to the spell caster on cast + var/brute_to_heal = 10 + /// Amount of burn to heal to the spell caster on cast + var/burn_to_heal = 10 + +/datum/action/cooldown/spell/basic_heal/cast(mob/living/cast_on) + . = ..() + cast_on.visible_message( + span_warning("A wreath of gentle light passes over [cast_on]!"), + span_notice("You wreath yourself in healing light!"), + ) + cast_on.adjustBruteLoss(-brute_to_heal, FALSE) + cast_on.adjustFireLoss(-burn_to_heal) diff --git a/code/modules/spells/spell_types/self/charge.dm b/code/modules/spells/spell_types/self/charge.dm new file mode 100644 index 00000000000000..87d7ae287d3373 --- /dev/null +++ b/code/modules/spells/spell_types/self/charge.dm @@ -0,0 +1,58 @@ +/datum/action/cooldown/spell/charge + name = "Charge" + desc = "This spell can be used to recharge a variety of things in your hands, \ + from magical artifacts to electrical components. A creative wizard can even use it \ + to grant magical power to a fellow magic user." + button_icon_state = "charge" + + sound = 'sound/magic/charge.ogg' + school = SCHOOL_TRANSMUTATION + cooldown_time = 60 SECONDS + cooldown_reduction_per_rank = 5 SECONDS + + invocation = "DIRI CEL" + invocation_type = INVOCATION_WHISPER + spell_requirements = SPELL_REQUIRES_NO_ANTIMAGIC + +/datum/action/cooldown/spell/charge/is_valid_target(atom/cast_on) + return isliving(cast_on) + +/datum/action/cooldown/spell/charge/cast(mob/living/cast_on) + . = ..() + + // Charge people we're pulling first and foremost + if(isliving(cast_on.pulling)) + var/mob/living/pulled_living = cast_on.pulling + var/pulled_has_spells = FALSE + + for(var/datum/action/cooldown/spell/spell in pulled_living.actions) + spell.reset_spell_cooldown() + pulled_has_spells = TRUE + + if(pulled_has_spells) + to_chat(pulled_living, span_notice("You feel raw magic flowing through you. It feels good!")) + to_chat(cast_on, span_notice("[pulled_living] suddenly feels very warm!")) + return + + to_chat(pulled_living, span_notice("You feel very strange for a moment, but then it passes.")) + + // Then charge their main hand item, then charge their offhand item + var/obj/item/to_charge = cast_on.get_active_held_item() || cast_on.get_inactive_held_item() + if(!to_charge) + to_chat(cast_on, span_notice("You feel magical power surging through your hands, but the feeling rapidly fades.")) + return + + var/charge_return = SEND_SIGNAL(to_charge, COMSIG_ITEM_MAGICALLY_CHARGED, src, cast_on) + + if(QDELETED(to_charge)) + to_chat(cast_on, span_warning("[src] seems to react adversely with [to_charge]!")) + return + + if(charge_return & COMPONENT_ITEM_BURNT_OUT) + to_chat(cast_on, span_warning("[to_charge] seems to react negatively to [src], becoming uncomfortably warm!")) + + else if(charge_return & COMPONENT_ITEM_CHARGED) + to_chat(cast_on, span_notice("[to_charge] suddenly feels very warm!")) + + else + to_chat(cast_on, span_notice("[to_charge] doesn't seem to be react to [src].")) diff --git a/code/modules/spells/spell_types/self/disable_tech.dm b/code/modules/spells/spell_types/self/disable_tech.dm new file mode 100644 index 00000000000000..543daa467791e8 --- /dev/null +++ b/code/modules/spells/spell_types/self/disable_tech.dm @@ -0,0 +1,30 @@ +/datum/action/cooldown/spell/emp + name = "Emplosion" + desc = "This spell emplodes an area." + button_icon_state = "emp" + sound = 'sound/weapons/zapbang.ogg' + + school = SCHOOL_EVOCATION + + /// The heavy radius of the EMP + var/emp_heavy = 2 + /// The light radius of the EMP + var/emp_light = 3 + +/datum/action/cooldown/spell/emp/cast(atom/cast_on) + . = ..() + empulse(get_turf(cast_on), emp_heavy, emp_light) + +/datum/action/cooldown/spell/emp/disable_tech + name = "Disable Tech" + desc = "This spell disables all weapons, cameras and most other technology in range." + sound = 'sound/magic/disable_tech.ogg' + + cooldown_time = 40 SECONDS + cooldown_reduction_per_rank = 5 SECONDS + + invocation = "NEC CANTIO" + invocation_type = INVOCATION_SHOUT + + emp_heavy = 6 + emp_light = 10 diff --git a/code/modules/spells/spell_types/self/forcewall.dm b/code/modules/spells/spell_types/self/forcewall.dm new file mode 100644 index 00000000000000..e037c1ae689d9d --- /dev/null +++ b/code/modules/spells/spell_types/self/forcewall.dm @@ -0,0 +1,66 @@ +/datum/action/cooldown/spell/forcewall + name = "Forcewall" + desc = "Create a magical barrier that only you can pass through." + button_icon_state = "shield" + + sound = 'sound/magic/forcewall.ogg' + school = SCHOOL_TRANSMUTATION + cooldown_time = 10 SECONDS + cooldown_reduction_per_rank = 1.25 SECONDS + + invocation = "TARCOL MINTI ZHERI" + invocation_type = INVOCATION_SHOUT + spell_requirements = SPELL_REQUIRES_NO_ANTIMAGIC + + /// The typepath to the wall we create on cast. + var/wall_type = /obj/effect/forcefield/wizard + +/datum/action/cooldown/spell/forcewall/cast(atom/cast_on) + . = ..() + new wall_type(get_turf(owner), owner) + + if(owner.dir == SOUTH || owner.dir == NORTH) + new wall_type(get_step(owner, EAST), owner, antimagic_flags) + new wall_type(get_step(owner, WEST), owner, antimagic_flags) + + else + new wall_type(get_step(owner, NORTH), owner, antimagic_flags) + new wall_type(get_step(owner, SOUTH), owner, antimagic_flags) + +/datum/action/cooldown/spell/forcewall/cult + name = "Shield" + desc = "This spell creates a temporary forcefield to shield yourself and allies from incoming fire." + background_icon_state = "bg_demon" + icon_icon = 'icons/mob/actions/actions_cult.dmi' + button_icon_state = "cultforcewall" + + cooldown_time = 40 SECONDS + invocation_type = INVOCATION_NONE + + wall_type = /obj/effect/forcefield/cult + +/datum/action/cooldown/spell/forcewall/mime + name = "Invisible Blockade" + desc = "Form an invisible three tile wide blockade." + background_icon_state = "bg_mime" + icon_icon = 'icons/mob/actions/actions_mime.dmi' + button_icon_state = "invisible_blockade" + panel = "Mime" + sound = null + + school = SCHOOL_MIME + cooldown_time = 1 MINUTES + cooldown_reduction_per_rank = 0 SECONDS + spell_requirements = SPELL_REQUIRES_HUMAN|SPELL_REQUIRES_MIME_VOW + antimagic_flags = NONE + + invocation = "" + invocation_type = INVOCATION_EMOTE + invocation_self_message = span_notice("You form a blockade in front of yourself.") + spell_max_level = 1 + + wall_type = /obj/effect/forcefield/mime/advanced + +/datum/action/cooldown/spell/forcewall/mime/before_cast(atom/cast_on) + . = ..() + invocation = span_notice("[cast_on] looks as if a blockade is in front of [cast_on.p_them()].") diff --git a/code/modules/spells/spell_types/self/lichdom.dm b/code/modules/spells/spell_types/self/lichdom.dm new file mode 100644 index 00000000000000..69325f9df97abd --- /dev/null +++ b/code/modules/spells/spell_types/self/lichdom.dm @@ -0,0 +1,83 @@ +/datum/action/cooldown/spell/lichdom + name = "Bind Soul" + desc = "A spell that binds your soul to an item in your hands. \ + Binding your soul to an item will turn you into an immortal Lich. \ + So long as the item remains intact, you will revive from death, \ + no matter the circumstances." + icon_icon = 'icons/mob/actions/actions_spells.dmi' + button_icon_state = "skeleton" + + school = SCHOOL_NECROMANCY + cooldown_time = 1 SECONDS + + invocation = "NECREM IMORTIUM!" + invocation_type = INVOCATION_SHOUT + spell_requirements = SPELL_REQUIRES_NO_ANTIMAGIC|SPELL_REQUIRES_OFF_CENTCOM|SPELL_REQUIRES_MIND + spell_max_level = 1 + +/datum/action/cooldown/spell/lichdom/can_cast_spell(feedback = TRUE) + . = ..() + if(!.) + return FALSE + + // We call this here so we can get feedback if they try to cast it when they shouldn't. + if(!is_valid_target(owner)) + if(feedback) + to_chat(owner, span_warning("You don't have a soul to bind!")) + return FALSE + + return TRUE + +/datum/action/cooldown/spell/lichdom/is_valid_target(atom/cast_on) + return isliving(cast_on) && !HAS_TRAIT(owner, TRAIT_NO_SOUL) + +/datum/action/cooldown/spell/lichdom/cast(mob/living/cast_on) + var/obj/item/marked_item = cast_on.get_active_held_item() + if(!marked_item || marked_item.item_flags & ABSTRACT) + return + if(HAS_TRAIT(marked_item, TRAIT_NODROP)) + to_chat(cast_on, span_warning("[marked_item] is stuck to your hand - it wouldn't be a wise idea to place your soul into it.")) + return + // I ensouled the nuke disk once. + // But it's a really mean tactic, so we probably should disallow it. + if(SEND_SIGNAL(marked_item, COMSIG_ITEM_IMBUE_SOUL, src, cast_on) & COMPONENT_BLOCK_IMBUE) + to_chat(cast_on, span_warning("[marked_item] is not suitable for emplacement of your fragile soul.")) + return + + . = ..() + playsound(cast_on, 'sound/effects/pope_entry.ogg', 100) + + to_chat(cast_on, span_green("You begin to focus your very being into [marked_item]...")) + if(!do_after(cast_on, 5 SECONDS, target = marked_item, timed_action_flags = IGNORE_HELD_ITEM)) + to_chat(cast_on, span_warning("Your soul snaps back to your body as you stop ensouling [marked_item]!")) + return + + marked_item.AddComponent(/datum/component/phylactery, cast_on.mind) + + cast_on.set_species(/datum/species/skeleton) + to_chat(cast_on, span_userdanger("With a hideous feeling of emptiness you watch in horrified fascination \ + as skin sloughs off bone! Blood boils, nerves disintegrate, eyes boil in their sockets! \ + As your organs crumble to dust in your fleshless chest you come to terms with your choice. \ + You're a lich!")) + + if(iscarbon(cast_on)) + var/mob/living/carbon/carbon_cast_on = cast_on + var/obj/item/organ/internal/brain/lich_brain = carbon_cast_on.getorganslot(ORGAN_SLOT_BRAIN) + if(lich_brain) // This prevents MMIs being used to stop lich revives + lich_brain.organ_flags &= ~ORGAN_VITAL + lich_brain.decoy_override = TRUE + + if(ishuman(cast_on)) + var/mob/living/carbon/human/human_cast_on = cast_on + human_cast_on.dropItemToGround(human_cast_on.w_uniform) + human_cast_on.dropItemToGround(human_cast_on.wear_suit) + human_cast_on.dropItemToGround(human_cast_on.head) + human_cast_on.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/black(human_cast_on), ITEM_SLOT_OCLOTHING) + human_cast_on.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/black(human_cast_on), ITEM_SLOT_HEAD) + human_cast_on.equip_to_slot_or_del(new /obj/item/clothing/under/color/black(human_cast_on), ITEM_SLOT_ICLOTHING) + + + // No soul. You just sold it + ADD_TRAIT(cast_on, TRAIT_NO_SOUL, LICH_TRAIT) + // You only get one phylactery. + qdel(src) diff --git a/code/modules/spells/spell_types/self/lightning.dm b/code/modules/spells/spell_types/self/lightning.dm new file mode 100644 index 00000000000000..7423fb8a374a6c --- /dev/null +++ b/code/modules/spells/spell_types/self/lightning.dm @@ -0,0 +1,128 @@ +/datum/action/cooldown/spell/tesla + name = "Tesla Blast" + desc = "Charge up a tesla arc and release it at random nearby targets! \ + You can move freely while it charges. The arc jumps between targets and can knock them down." + button_icon_state = "lightning" + + cooldown_time = 30 SECONDS + cooldown_reduction_per_rank = 6.75 SECONDS + + invocation = "UN'LTD P'WAH!" + invocation_type = INVOCATION_SHOUT + school = SCHOOL_EVOCATION + + /// Whether we're currently channelling a tesla blast or not + var/currently_channeling = FALSE + /// How long it takes to channel the zap. + var/channel_time = 10 SECONDS + /// The radius around (either the caster or people shocked) to which the tesla blast can reach + var/shock_radius = 7 + /// The halo that appears around the caster while charging the spell + var/static/mutable_appearance/halo + /// The sound played while charging the spell + /// Quote: "the only way i can think of to stop a sound, thank MSO for the idea." + var/sound/charge_sound + +/datum/action/cooldown/spell/tesla/Remove(mob/living/remove_from) + reset_tesla(remove_from) + return ..() + +/datum/action/cooldown/spell/tesla/set_statpanel_format() + . = ..() + if(!islist(.)) + return + + if(currently_channeling) + .[PANEL_DISPLAY_STATUS] = "CHANNELING" + +/datum/action/cooldown/spell/tesla/can_cast_spell(feedback = TRUE) + . = ..() + if(!.) + return FALSE + if(currently_channeling) + if(feedback) + to_chat(owner, span_warning("You're already channeling [src]!")) + return FALSE + + return TRUE + +/datum/action/cooldown/spell/tesla/before_cast(atom/cast_on) + . = ..() + if(. & SPELL_CANCEL_CAST) + return + + to_chat(cast_on, span_notice("You start gathering power...")) + charge_sound = new /sound('sound/magic/lightning_chargeup.ogg', channel = 7) + halo ||= mutable_appearance('icons/effects/effects.dmi', "electricity", EFFECTS_LAYER) + cast_on.add_overlay(halo) + playsound(get_turf(cast_on), charge_sound, 50, FALSE) + + currently_channeling = TRUE + if(!do_after(cast_on, channel_time, timed_action_flags = (IGNORE_USER_LOC_CHANGE|IGNORE_HELD_ITEM))) + reset_tesla(cast_on) + return . | SPELL_CANCEL_CAST + + return TRUE + +/datum/action/cooldown/spell/tesla/reset_spell_cooldown() + reset_tesla(owner) + return ..() + +/// Resets the tesla effect. +/datum/action/cooldown/spell/tesla/proc/reset_tesla(atom/to_reset) + to_reset.cut_overlay(halo) + currently_channeling = FALSE + +/datum/action/cooldown/spell/tesla/cast(atom/cast_on) + . = ..() + + // byond, why you suck? + charge_sound = sound(null, repeat = 0, wait = 1, channel = charge_sound.channel) + // Sorry MrPerson, but the other ways just didn't do it the way i needed to work, this is the only way. + playsound(get_turf(cast_on), charge_sound, 50, FALSE) + + var/mob/living/carbon/to_zap_first = get_target(cast_on) + if(QDELETED(to_zap_first)) + cast_on.balloon_alert(cast_on, "no targets nearby!") + reset_spell_cooldown() + return FALSE + + playsound(get_turf(cast_on), 'sound/magic/lightningbolt.ogg', 50, TRUE) + zap_target(cast_on, to_zap_first) + reset_tesla(cast_on) + return TRUE + +/// Zaps a target, the bolt originating from origin. +/datum/action/cooldown/spell/tesla/proc/zap_target(atom/origin, mob/living/carbon/to_zap, bolt_energy = 30, bounces = 5) + origin.Beam(to_zap, icon_state = "lightning[rand(1,12)]", time = 0.5 SECONDS) + playsound(get_turf(to_zap), 'sound/magic/lightningshock.ogg', 50, TRUE, -1) + + if(to_zap.can_block_magic(antimagic_flags)) + to_zap.visible_message( + span_warning("[to_zap] absorbs the spell, remaining unharmed!"), + span_userdanger("You absorb the spell, remaining unharmed!"), + ) + + else + to_zap.electrocute_act(bolt_energy, "Lightning Bolt", flags = SHOCK_NOGLOVES) + + if(bounces >= 1) + var/mob/living/carbon/to_zap_next = get_target(to_zap) + if(!QDELETED(to_zap_next)) + zap_target(to_zap, to_zap_next, max((bolt_energy - 5), 5), bounces - 1) + +/// Get a target in view of us to zap next. Returns a carbon, or null if none were found. +/datum/action/cooldown/spell/tesla/proc/get_target(atom/center) + var/list/possibles = list() + for(var/mob/living/carbon/to_check in view(shock_radius, center)) + if(to_check == center || to_check == owner) + continue + if(!length(get_path_to(center, to_check, max_distance = shock_radius, simulated_only = FALSE))) + continue + + possibles += to_check + + if(!length(possibles)) + return null + + return pick(possibles) diff --git a/code/modules/spells/spell_types/self/mime_vow.dm b/code/modules/spells/spell_types/self/mime_vow.dm new file mode 100644 index 00000000000000..553c9394f57f4a --- /dev/null +++ b/code/modules/spells/spell_types/self/mime_vow.dm @@ -0,0 +1,24 @@ +/datum/action/cooldown/spell/vow_of_silence + name = "Speech" + desc = "Make (or break) a vow of silence." + background_icon_state = "bg_mime" + icon_icon = 'icons/mob/actions/actions_mime.dmi' + button_icon_state = "mime_speech" + panel = "Mime" + + school = SCHOOL_MIME + cooldown_time = 5 MINUTES + + spell_requirements = SPELL_REQUIRES_HUMAN|SPELL_REQUIRES_MIND + spell_max_level = 1 + +/datum/action/cooldown/spell/vow_of_silence/cast(mob/living/carbon/human/cast_on) + . = ..() + cast_on.mind.miming = !cast_on.mind.miming + if(cast_on.mind.miming) + to_chat(cast_on, span_notice("You make a vow of silence.")) + SEND_SIGNAL(cast_on, COMSIG_CLEAR_MOOD_EVENT, "vow") + else + to_chat(cast_on, span_notice("You break your vow of silence.")) + SEND_SIGNAL(cast_on, COMSIG_ADD_MOOD_EVENT, "vow", /datum/mood_event/broken_vow) + cast_on.update_action_buttons_icon() diff --git a/code/modules/spells/spell_types/self/mutate.dm b/code/modules/spells/spell_types/self/mutate.dm new file mode 100644 index 00000000000000..0cc578809d6552 --- /dev/null +++ b/code/modules/spells/spell_types/self/mutate.dm @@ -0,0 +1,49 @@ +/// A spell type that adds mutations to the caster temporarily. +/datum/action/cooldown/spell/apply_mutations + button_icon_state = "mutate" + sound = 'sound/magic/mutate.ogg' + + school = SCHOOL_TRANSMUTATION + + /// A list of all mutations we add on cast + var/list/mutations_to_add = list() + /// The duration the mutations will last afetr cast (keep this above the minimum cooldown) + var/mutation_duration = 10 SECONDS + +/datum/action/cooldown/spell/apply_mutations/New(Target) + . = ..() + spell_requirements |= SPELL_REQUIRES_HUMAN // The spell involves mutations, so it always require human / dna + +/datum/action/cooldown/spell/apply_mutations/Remove(mob/living/remove_from) + remove_mutations(remove_from) + return ..() + +/datum/action/cooldown/spell/apply_mutations/is_valid_target(atom/cast_on) + var/mob/living/carbon/human/human_caster = cast_on // Requires human anyways + return !!human_caster.dna + +/datum/action/cooldown/spell/apply_mutations/cast(mob/living/carbon/human/cast_on) + . = ..() + for(var/mutation in mutations_to_add) + cast_on.dna.add_mutation(mutation) + addtimer(CALLBACK(src, .proc/remove_mutations, cast_on), mutation_duration, TIMER_DELETE_ME) + +/// Removes the mutations we added from casting our spell +/datum/action/cooldown/spell/apply_mutations/proc/remove_mutations(mob/living/carbon/human/cast_on) + if(QDELETED(cast_on) || !is_valid_target(cast_on)) + return + + for(var/mutation in mutations_to_add) + cast_on.dna.remove_mutation(mutation) + +/datum/action/cooldown/spell/apply_mutations/mutate + name = "Mutate" + desc = "This spell causes you to turn into a hulk and gain laser vision for a short while." + cooldown_time = 40 SECONDS + cooldown_reduction_per_rank = 2.5 SECONDS + + invocation = "BIRUZ BENNAR" + invocation_type = INVOCATION_SHOUT + + mutations_to_add = list(/datum/mutation/human/laser_eyes, /datum/mutation/human/hulk) + mutation_duration = 30 SECONDS diff --git a/code/modules/spells/spell_types/self/night_vision.dm b/code/modules/spells/spell_types/self/night_vision.dm new file mode 100644 index 00000000000000..e7211aeb7a20e4 --- /dev/null +++ b/code/modules/spells/spell_types/self/night_vision.dm @@ -0,0 +1,40 @@ + +//Toggle Night Vision +/datum/action/cooldown/spell/night_vision + name = "Toggle Nightvision" + desc = "Toggle your nightvision mode." + + cooldown_time = 1 SECONDS + spell_requirements = NONE + + /// The span the "toggle" message uses when sent to the user + var/toggle_span = "notice" + +/datum/action/cooldown/spell/night_vision/New(Target) + . = ..() + name = "[name] \[ON\]" + +/datum/action/cooldown/spell/night_vision/is_valid_target(atom/cast_on) + return isliving(cast_on) + +/datum/action/cooldown/spell/night_vision/cast(mob/living/cast_on) + . = ..() + to_chat(cast_on, "You toggle your night vision.") + + var/next_mode_text = "" + switch(cast_on.lighting_alpha) + if (LIGHTING_PLANE_ALPHA_VISIBLE) + cast_on.lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE + next_mode_text = "More" + if (LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE) + cast_on.lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + next_mode_text = "Full" + if (LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE) + cast_on.lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE + next_mode_text = "OFF" + else + cast_on.lighting_alpha = LIGHTING_PLANE_ALPHA_VISIBLE + next_mode_text = "ON" + + cast_on.update_sight() + name = "[initial(name)] \[[next_mode_text]\]" diff --git a/code/modules/spells/spell_types/self/personality_commune.dm b/code/modules/spells/spell_types/self/personality_commune.dm new file mode 100644 index 00000000000000..67e794c966832b --- /dev/null +++ b/code/modules/spells/spell_types/self/personality_commune.dm @@ -0,0 +1,54 @@ +// This can probably be changed to use mind linker at some point +/datum/action/cooldown/spell/personality_commune + name = "Personality Commune" + desc = "Sends thoughts to your alternate consciousness." + button_icon_state = "telepathy" + cooldown_time = 0 SECONDS + spell_requirements = NONE + + /// Fluff text shown when a message is sent to the pair + var/fluff_text = span_boldnotice("You hear an echoing voice in the back of your head...") + /// The message to send to the corresponding person on cast + var/to_send + +/datum/action/cooldown/spell/personality_commune/New(Target) + . = ..() + if(!istype(target, /datum/brain_trauma/severe/split_personality)) + stack_trace("[type] was created on a target that isn't a /datum/brain_trauma/severe/split_personality, this doesn't work.") + qdel(src) + +/datum/action/cooldown/spell/personality_commune/is_valid_target(atom/cast_on) + return isliving(cast_on) + +/datum/action/cooldown/spell/personality_commune/before_cast(atom/cast_on) + . = ..() + if(. & SPELL_CANCEL_CAST) + return + + var/datum/brain_trauma/severe/split_personality/trauma = target + if(!istype(trauma)) // hypothetically impossible but you never know + return . | SPELL_CANCEL_CAST + + to_send = tgui_input_text(cast_on, "What would you like to tell your other self?", "Commune") + if(QDELETED(src) || QDELETED(trauma)|| QDELETED(cast_on) || QDELETED(trauma.owner) || !can_cast_spell()) + return . | SPELL_CANCEL_CAST + if(!to_send) + reset_cooldown() + return . | SPELL_CANCEL_CAST + + return TRUE + +// Pillaged and adapted from telepathy code +/datum/action/cooldown/spell/personality_commune/cast(mob/living/cast_on) + . = ..() + var/datum/brain_trauma/severe/split_personality/trauma = target + + var/user_message = span_boldnotice("You concentrate and send thoughts to your other self:") + var/user_message_body = span_notice("[to_send]") + to_chat(cast_on, "[user_message] [user_message_body]") + to_chat(trauma.owner, "[fluff_text] [user_message_body]") + log_directed_talk(cast_on, trauma.owner, to_send, LOG_SAY, "[name]") + for(var/dead_mob in GLOB.dead_mob_list) + if(!isobserver(dead_mob)) + continue + to_chat(dead_mob, "[FOLLOW_LINK(dead_mob, cast_on)] [span_boldnotice("[cast_on] [name]:")] [span_notice("\"[to_send]\" to")] [span_name("[trauma]")]") diff --git a/code/modules/spells/spell_types/rod_form.dm b/code/modules/spells/spell_types/self/rod_form.dm similarity index 71% rename from code/modules/spells/spell_types/rod_form.dm rename to code/modules/spells/spell_types/self/rod_form.dm index fd833029b55514..467271e5433b9e 100644 --- a/code/modules/spells/spell_types/rod_form.dm +++ b/code/modules/spells/spell_types/self/rod_form.dm @@ -1,46 +1,61 @@ /// The base distance a wizard rod will go without upgrades. #define BASE_WIZ_ROD_RANGE 13 -/obj/effect/proc_holder/spell/targeted/rod_form +/datum/action/cooldown/spell/rod_form name = "Rod Form" - desc = "Take on the form of an immovable rod, destroying all in your path. Purchasing this spell multiple times will also increase the rod's damage and travel range." - clothes_req = TRUE - human_req = FALSE - charge_max = 250 - cooldown_min = 100 - range = -1 + desc = "Take on the form of an immovable rod, destroying all in your path. \ + Purchasing this spell multiple times will also increase the rod's damage and travel range." + button_icon_state = "immrod" + school = SCHOOL_TRANSMUTATION - include_user = TRUE + cooldown_time = 25 SECONDS + cooldown_reduction_per_rank = 3.75 SECONDS + invocation = "CLANG!" invocation_type = INVOCATION_SHOUT - action_icon_state = "immrod" + spell_requirements = SPELL_REQUIRES_WIZARD_GARB|SPELL_REQUIRES_NO_ANTIMAGIC|SPELL_REQUIRES_OFF_CENTCOM + /// The extra distance we travel per additional spell level. var/distance_per_spell_rank = 3 /// The extra damage we deal per additional spell level. var/damage_per_spell_rank = 20 + /// The max distance the rod goes on cast + var/rod_max_distance = BASE_WIZ_ROD_RANGE + /// The damage bonus applied to the rod on cast + var/rod_damage_bonus = 0 -/obj/effect/proc_holder/spell/targeted/rod_form/cast(list/targets, mob/user = usr) - var/area/our_area = get_area(user) - if(istype(our_area, /area/centcom/wizard_station)) - to_chat(user, span_warning("You know better than to trash Wizard Federation property. Best wait until you leave to use [src].")) - return +/datum/action/cooldown/spell/rod_form/cast(atom/cast_on) + . = ..() + // The destination turf of the rod - just a bit over the max range we calculated, for safety + var/turf/distant_turf = get_ranged_target_turf(get_turf(cast_on), cast_on.dir, (rod_max_distance + 2)) + + new /obj/effect/immovablerod/wizard( + get_turf(cast_on), + distant_turf, + null, + FALSE, + cast_on, + rod_max_distance, + rod_damage_bonus, + ) + +/datum/action/cooldown/spell/rod_form/level_spell(bypass_cap = FALSE) + . = ..() + if(!.) + return FALSE - // You travel farther when you upgrade the spell. - var/rod_max_distance = BASE_WIZ_ROD_RANGE + (spell_level * distance_per_spell_rank) - // You do more damage when you upgrade the spell. - var/rod_damage_bonus = (spell_level * damage_per_spell_rank) - - for(var/mob/living/caster in targets) - new /obj/effect/immovablerod/wizard( - get_turf(caster), - get_ranged_target_turf(get_turf(caster), caster.dir, (rod_max_distance + 2)), // Just a bit over the distance we got - null, - FALSE, - caster, - rod_max_distance, - rod_damage_bonus, - ) - ADD_TRAIT(caster, TRAIT_ROD_FORM, MAGIC_TRAIT) + rod_max_distance += distance_per_spell_rank + rod_damage_bonus += damage_per_spell_rank + return TRUE + +/datum/action/cooldown/spell/rod_form/delevel_spell() + . = ..() + if(!.) + return FALSE + + rod_max_distance -= distance_per_spell_rank + rod_damage_bonus -= damage_per_spell_rank + return TRUE /// Wizard Version of the Immovable Rod. /obj/effect/immovablerod/wizard @@ -125,6 +140,7 @@ wizard.forceMove(src) wizard.notransform = TRUE wizard.status_flags |= GODMODE + ADD_TRAIT(wizard, TRAIT_MAGICALLY_PHASED, REF(src)) /** * Eject our current wizard, removing them from the rod @@ -139,6 +155,6 @@ wizard.notransform = FALSE wizard.forceMove(get_turf(src)) our_wizard = null - REMOVE_TRAIT(wizard, TRAIT_ROD_FORM, MAGIC_TRAIT) + REMOVE_TRAIT(wizard, TRAIT_MAGICALLY_PHASED, REF(src)) #undef BASE_WIZ_ROD_RANGE diff --git a/code/modules/spells/spell_types/self/smoke.dm b/code/modules/spells/spell_types/self/smoke.dm new file mode 100644 index 00000000000000..b2c7e924f191e1 --- /dev/null +++ b/code/modules/spells/spell_types/self/smoke.dm @@ -0,0 +1,37 @@ +/// Basic smoke spell. +/datum/action/cooldown/spell/smoke + name = "Smoke" + desc = "This spell spawns a cloud of smoke at your location. \ + People within will begin to choke and drop their items." + button_icon_state = "smoke" + + school = SCHOOL_CONJURATION + cooldown_time = 12 SECONDS + cooldown_reduction_per_rank = 2.5 SECONDS + + invocation_type = INVOCATION_NONE + + smoke_type = /datum/effect_system/fluid_spread/smoke/bad + smoke_amt = 4 + +/// Chaplain smoke. +/datum/action/cooldown/spell/smoke/lesser + name = "Holy Smoke" + desc = "This spell spawns a small cloud of smoke at your location." + + school = SCHOOL_HOLY + cooldown_time = 36 SECONDS + spell_requirements = NONE + + smoke_type = /datum/effect_system/fluid_spread/smoke + smoke_amt = 2 + +/// Unused smoke that makes people sleep. Used to be for cult? +/datum/action/cooldown/spell/smoke/disable + name = "Paralysing Smoke" + desc = "This spell spawns a cloud of paralysing smoke." + background_icon_state = "bg_cult" + + cooldown_time = 20 SECONDS + + smoke_type = /datum/effect_system/fluid_spread/smoke/sleeping diff --git a/code/modules/spells/spell_types/self/soultap.dm b/code/modules/spells/spell_types/self/soultap.dm new file mode 100644 index 00000000000000..57932ad8288b98 --- /dev/null +++ b/code/modules/spells/spell_types/self/soultap.dm @@ -0,0 +1,63 @@ + +/** + * SOUL TAP! + * + * Trades 20 max health for a refresh on all of your spells. + * I was considering making it depend on the cooldowns of your spells, but I want to support "Big spell wizard" with this loadout. + * The two spells that sound most problematic with this is mindswap and lichdom, + * but soul tap requires clothes for mindswap and lichdom takes your soul. + */ +/datum/action/cooldown/spell/tap + name = "Soul Tap" + desc = "Fuel your spells using your own soul!" + button_icon_state = "soultap" + + // I could see why this wouldn't be necromancy, but messing with souls or whatever. Ectomancy? + school = SCHOOL_NECROMANCY + cooldown_time = 1 SECONDS + invocation = "AT ANY COST!" + invocation_type = INVOCATION_SHOUT + spell_max_level = 1 + + /// The amount of health we take on tap + var/tap_health_taken = 20 + +/datum/action/cooldown/spell/tap/can_cast_spell(feedback = TRUE) + . = ..() + if(!.) + return FALSE + + // We call this here so we can get feedback if they try to cast it when they shouldn't. + if(!is_valid_target(owner)) + if(feedback) + to_chat(owner, span_warning("You have no soul to tap into!")) + return FALSE + + return TRUE + +/datum/action/cooldown/spell/tap/is_valid_target(atom/cast_on) + return isliving(cast_on) && !HAS_TRAIT(owner, TRAIT_NO_SOUL) + +/datum/action/cooldown/spell/tap/cast(mob/living/cast_on) + . = ..() + cast_on.maxHealth -= tap_health_taken + cast_on.health = min(cast_on.health, cast_on.maxHealth) + + for(var/datum/action/cooldown/spell/spell in cast_on.actions) + spell.reset_spell_cooldown() + + // If the tap took all of our life, we die and lose our soul! + if(cast_on.maxHealth <= 0) + to_chat(cast_on, span_userdanger("Your weakened soul is completely consumed by the tap!")) + ADD_TRAIT(cast_on, TRAIT_NO_SOUL, MAGIC_TRAIT) + + cast_on.visible_message(span_danger("[cast_on] suddenly dies!"), ignored_mobs = cast_on) + cast_on.death() + + // If the next tap will kill us, give us a heads-up + else if(cast_on.maxHealth - tap_health_taken <= 0) + to_chat(cast_on, span_bolddanger("Your body feels incredibly drained, and the burning is hard to ignore!")) + + // Otherwise just give them some feedback + else + to_chat(cast_on, span_danger("Your body feels drained and there is a burning pain in your chest.")) diff --git a/code/modules/spells/spell_types/self/spacetime_distortion.dm b/code/modules/spells/spell_types/self/spacetime_distortion.dm new file mode 100644 index 00000000000000..d71cb6713bc8b4 --- /dev/null +++ b/code/modules/spells/spell_types/self/spacetime_distortion.dm @@ -0,0 +1,168 @@ +// This could probably be an aoe spell but it's a little cursed, so I'm not touching it +/datum/action/cooldown/spell/spacetime_dist + name = "Spacetime Distortion" + desc = "Entangle the strings of space-time in an area around you, \ + randomizing the layout and making proper movement impossible. The strings vibrate..." + sound = 'sound/effects/magic.ogg' + button_icon_state = "spacetime" + + school = SCHOOL_EVOCATION + cooldown_time = 30 SECONDS + spell_requirements = SPELL_REQUIRES_WIZARD_GARB|SPELL_REQUIRES_NO_ANTIMAGIC|SPELL_REQUIRES_OFF_CENTCOM + spell_max_level = 1 + + /// Weather we're ready to cast again yet or not + var/ready = TRUE + /// The radius of the scramble around the caster + var/scramble_radius = 7 + /// The duration of the scramble + var/duration = 15 SECONDS + /// A lazylist of all scramble effects this spell has created. + var/list/effects + +/datum/action/cooldown/spell/spacetime_dist/Destroy() + QDEL_LAZYLIST(effects) + return ..() + +/datum/action/cooldown/spell/spacetime_dist/can_cast_spell(feedback = TRUE) + return ..() && ready + +/datum/action/cooldown/spell/spacetime_dist/set_statpanel_format() + . = ..() + if(!islist(.)) + return + + if(!ready) + .[PANEL_DISPLAY_STATUS] = "NOT READY" + +/datum/action/cooldown/spell/spacetime_dist/cast(atom/cast_on) + . = ..() + var/list/turf/to_switcharoo = get_targets_to_scramble(cast_on) + if(!length(to_switcharoo)) + to_chat(cast_on, span_warning("For whatever reason, the strings nearby aren't keen on being tangled.")) + reset_spell_cooldown() + return + + ready = FALSE + + for(var/turf/swap_a as anything in to_switcharoo) + var/turf/swap_b = to_switcharoo[swap_a] + var/obj/effect/cross_action/spacetime_dist/effect_a = new /obj/effect/cross_action/spacetime_dist(swap_a, antimagic_flags) + var/obj/effect/cross_action/spacetime_dist/effect_b = new /obj/effect/cross_action/spacetime_dist(swap_b, antimagic_flags) + effect_a.linked_dist = effect_b + effect_a.add_overlay(swap_b.photograph()) + effect_b.linked_dist = effect_a + effect_b.add_overlay(swap_a.photograph()) + effect_b.set_light(4, 30, "#c9fff5") + LAZYADD(effects, effect_a) + LAZYADD(effects, effect_b) + +/datum/action/cooldown/spell/spacetime_dist/after_cast() + . = ..() + addtimer(CALLBACK(src, .proc/clean_turfs), duration) + +/// Callback which cleans up our effects list after the duration expires. +/datum/action/cooldown/spell/spacetime_dist/proc/clean_turfs() + QDEL_LAZYLIST(effects) + ready = TRUE + +/** + * Gets a list of turfs around the center atom to scramble. + * + * Returns an assoc list of [turf] to [turf]. These pairs are what turfs are + * swapped between one another when the cast is done. + */ +/datum/action/cooldown/spell/spacetime_dist/proc/get_targets_to_scramble(atom/center) + // Get turfs around the center + var/list/turfs = spiral_range_turfs(scramble_radius, center) + if(!length(turfs)) + return + + var/list/turf_steps = list() + + // Go through the turfs we got and pair them up + // This is where we determine what to swap where + var/num_to_scramble = round(length(turfs) * 0.5) + for(var/i in 1 to num_to_scramble) + turf_steps[pick_n_take(turfs)] = pick_n_take(turfs) + + // If there's any turfs unlinked with a friend, + // just randomly swap it with any turf in the area + if(length(turfs)) + var/turf/loner = pick(turfs) + var/area/caster_area = get_area(center) + turf_steps[loner] = get_turf(pick(caster_area.contents)) + + return turf_steps + + +/obj/effect/cross_action + name = "cross me" + desc = "for crossing" + anchored = TRUE + +/obj/effect/cross_action/spacetime_dist + name = "spacetime distortion" + desc = "A distortion in spacetime. You can hear faint music..." + icon_state = "" + /// A flags which save people from being thrown about + var/antimagic_flags = MAGIC_RESISTANCE + var/obj/effect/cross_action/spacetime_dist/linked_dist + var/busy = FALSE + var/sound + var/walks_left = 50 //prevents the game from hanging in extreme cases (such as minigun fire) + +/obj/effect/cross_action/singularity_act() + return + +/obj/effect/cross_action/singularity_pull() + return + +/obj/effect/cross_action/spacetime_dist/Initialize(mapload, flags = MAGIC_RESISTANCE) + . = ..() + setDir(pick(GLOB.cardinals)) + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = .proc/on_entered, + ) + AddElement(/datum/element/connect_loc, loc_connections) + antimagic_flags = flags + +/obj/effect/cross_action/spacetime_dist/proc/walk_link(atom/movable/AM) + if(ismob(AM)) + var/mob/M = AM + if(M.can_block_magic(antimagic_flags, charge_cost = 0)) + return + if(linked_dist && walks_left > 0) + flick("purplesparkles", src) + linked_dist.get_walker(AM) + walks_left-- + +/obj/effect/cross_action/spacetime_dist/proc/get_walker(atom/movable/AM) + busy = TRUE + flick("purplesparkles", src) + AM.forceMove(get_turf(src)) + playsound(get_turf(src),sound,70,FALSE) + busy = FALSE + +/obj/effect/cross_action/spacetime_dist/proc/on_entered(datum/source, atom/movable/AM) + SIGNAL_HANDLER + if(!busy) + walk_link(AM) + +/obj/effect/cross_action/spacetime_dist/attackby(obj/item/W, mob/user, params) + if(user.temporarilyRemoveItemFromInventory(W)) + walk_link(W) + else + walk_link(user) + +//ATTACK HAND IGNORING PARENT RETURN VALUE +/obj/effect/cross_action/spacetime_dist/attack_hand(mob/user, list/modifiers) + walk_link(user) + +/obj/effect/cross_action/spacetime_dist/attack_paw(mob/user, list/modifiers) + walk_link(user) + +/obj/effect/cross_action/spacetime_dist/Destroy() + busy = TRUE + linked_dist = null + return ..() diff --git a/code/modules/spells/spell_types/self/stop_time.dm b/code/modules/spells/spell_types/self/stop_time.dm new file mode 100644 index 00000000000000..cab47375eb3a43 --- /dev/null +++ b/code/modules/spells/spell_types/self/stop_time.dm @@ -0,0 +1,30 @@ +/datum/action/cooldown/spell/timestop + name = "Stop Time" + desc = "This spell stops time for everyone except for you, \ + allowing you to move freely while your enemies and even projectiles are frozen." + button_icon_state = "time" + + school = SCHOOL_FORBIDDEN // Fucking with time is not appreciated by anyone + cooldown_time = 50 SECONDS + cooldown_reduction_per_rank = 10 SECONDS + + invocation = "TOKI YO TOMARE!" + invocation_type = INVOCATION_SHOUT + + /// The radius / range of the time stop. + var/timestop_range = 2 + /// The duration of the time stop. + var/timestop_duration = 10 SECONDS + +/datum/action/cooldown/spell/timestop/Grant(mob/grant_to) + . = ..() + if(owner) + ADD_TRAIT(owner, TRAIT_TIME_STOP_IMMUNE, REF(src)) + +/datum/action/cooldown/spell/timestop/Remove(mob/remove_from) + REMOVE_TRAIT(remove_from, TRAIT_TIME_STOP_IMMUNE, REF(src)) + return ..() + +/datum/action/cooldown/spell/timestop/cast(atom/cast_on) + . = ..() + new /obj/effect/timestop/magic(get_turf(cast_on), timestop_range, timestop_duration, list(cast_on)) diff --git a/code/modules/spells/spell_types/self/summonitem.dm b/code/modules/spells/spell_types/self/summonitem.dm new file mode 100644 index 00000000000000..761c2c7efada7a --- /dev/null +++ b/code/modules/spells/spell_types/self/summonitem.dm @@ -0,0 +1,154 @@ +/datum/action/cooldown/spell/summonitem + name = "Instant Summons" + desc = "This spell can be used to recall a previously marked item to your hand from anywhere in the universe." + button_icon_state = "summons" + + school = SCHOOL_TRANSMUTATION + cooldown_time = 10 SECONDS + + invocation = "GAR YOK" + invocation_type = INVOCATION_WHISPER + spell_requirements = SPELL_REQUIRES_NO_ANTIMAGIC + + spell_max_level = 1 //cannot be improved + + ///The obj marked for recall + var/obj/marked_item + +/datum/action/cooldown/spell/summonitem/is_valid_target(atom/cast_on) + return isliving(cast_on) + +/// Set the passed object as our marked item +/datum/action/cooldown/spell/summonitem/proc/mark_item(obj/to_mark) + name = "Recall [to_mark]" + marked_item = to_mark + RegisterSignal(marked_item, COMSIG_PARENT_QDELETING, .proc/on_marked_item_deleted) + +/// Unset our current marked item +/datum/action/cooldown/spell/summonitem/proc/unmark_item() + name = initial(name) + UnregisterSignal(marked_item, COMSIG_PARENT_QDELETING) + marked_item = null + +/// Signal proc for COMSIG_PARENT_QDELETING on our marked item, unmarks our item if it's deleted +/datum/action/cooldown/spell/summonitem/proc/on_marked_item_deleted(datum/source) + SIGNAL_HANDLER + + if(owner) + to_chat(owner, span_boldwarning("You sense your marked item has been destroyed!")) + unmark_item() + +/datum/action/cooldown/spell/summonitem/cast(mob/living/cast_on) + . = ..() + if(QDELETED(marked_item)) + try_link_item(cast_on) + return + + if(marked_item == cast_on.get_active_held_item()) + try_unlink_item(cast_on) + return + + try_recall_item(cast_on) + +/// If we don't have a marked item, attempts to mark the caster's held item. +/datum/action/cooldown/spell/summonitem/proc/try_link_item(mob/living/caster) + var/obj/item/potential_mark = caster.get_active_held_item() + if(!potential_mark) + if(caster.get_inactive_held_item()) + to_chat(caster, span_warning("You must hold the desired item in your hands to mark it for recall!")) + else + to_chat(caster, span_warning("You aren't holding anything that can be marked for recall!")) + return FALSE + + var/link_message = "" + if(potential_mark.item_flags & ABSTRACT) + return FALSE + if(SEND_SIGNAL(potential_mark, COMSIG_ITEM_MARK_RETRIEVAL, src, caster) & COMPONENT_BLOCK_MARK_RETRIEVAL) + return FALSE + if(HAS_TRAIT(potential_mark, TRAIT_NODROP)) + link_message += "Though it feels redundant... " + + link_message += "You mark [potential_mark] for recall." + to_chat(caster, span_notice(link_message)) + mark_item(potential_mark) + return TRUE + +/// If we have a marked item and it's in our hand, we will try to unlink it +/datum/action/cooldown/spell/summonitem/proc/try_unlink_item(mob/living/caster) + to_chat(caster, span_notice("You begin removing the mark on [marked_item]...")) + if(!do_after(caster, 5 SECONDS, marked_item)) + to_chat(caster, span_notice("You decide to keep [marked_item] marked.")) + return FALSE + + to_chat(caster, span_notice("You remove the mark on [marked_item] to use elsewhere.")) + unmark_item() + return TRUE + +/// Recalls our marked item to the caster. May bring some unexpected things along. +/datum/action/cooldown/spell/summonitem/proc/try_recall_item(mob/living/caster) + var/obj/item_to_retrieve = marked_item + + if(item_to_retrieve.loc) + // I don't want to know how someone could put something + // inside itself but these are wizards so let's be safe + var/infinite_recursion = 0 + + // if it's in something, you get the whole thing. + while(!isturf(item_to_retrieve.loc) && infinite_recursion < 10) + if(isitem(item_to_retrieve.loc)) + var/obj/item/mark_loc = item_to_retrieve.loc + // Being able to summon abstract things because + // your item happened to get placed there is a no-no + if(mark_loc.item_flags & ABSTRACT) + break + + // If its on someone, properly drop it + if(ismob(item_to_retrieve.loc)) + var/mob/holding_mark = item_to_retrieve.loc + + // Items in silicons warp the whole silicon + if(issilicon(holding_mark)) + holding_mark.loc.visible_message(span_warning("[holding_mark] suddenly disappears!")) + holding_mark.forceMove(caster.loc) + holding_mark.loc.visible_message(span_warning("[holding_mark] suddenly appears!")) + item_to_retrieve = null + break + + holding_mark.dropItemToGround(item_to_retrieve) + + else if(isobj(item_to_retrieve.loc)) + var/obj/retrieved_item = item_to_retrieve.loc + // Can't bring anchored things + if(retrieved_item.anchored) + return + // Edge cases for moving certain machinery... + if(istype(retrieved_item, /obj/machinery/portable_atmospherics)) + var/obj/machinery/portable_atmospherics/atmos_item = retrieved_item + atmos_item.disconnect() + atmos_item.update_appearance() + + // Otherwise bring the whole thing with us + item_to_retrieve = retrieved_item + + infinite_recursion += 1 + + else + // Organs are usually stored in nullspace + if(isorgan(item_to_retrieve)) + var/obj/item/organ/organ = item_to_retrieve + if(organ.owner) + // If this code ever runs I will be happy + log_combat(caster, organ.owner, "magically removed [organ.name] from", addition = "COMBAT MODE: [uppertext(caster.combat_mode)]") + organ.Remove(organ.owner) + + if(!item_to_retrieve) + return + + item_to_retrieve.loc?.visible_message(span_warning("[item_to_retrieve] suddenly disappears!")) + + if(isitem(item_to_retrieve) && caster.put_in_hands(item_to_retrieve)) + item_to_retrieve.loc.visible_message(span_warning("[item_to_retrieve] suddenly appears in [caster]'s hand!")) + else + item_to_retrieve.forceMove(caster.drop_location()) + item_to_retrieve.loc.visible_message(span_warning("[item_to_retrieve] suddenly appears!")) + playsound(get_turf(item_to_retrieve), 'sound/magic/summonitems_generic.ogg', 50, TRUE) diff --git a/code/modules/spells/spell_types/self/voice_of_god.dm b/code/modules/spells/spell_types/self/voice_of_god.dm new file mode 100644 index 00000000000000..ae4c46a3bb73a5 --- /dev/null +++ b/code/modules/spells/spell_types/self/voice_of_god.dm @@ -0,0 +1,50 @@ +/datum/action/cooldown/spell/voice_of_god + name = "Voice of God" + desc = "Speak with an incredibly compelling voice, forcing listeners to obey your commands." + icon_icon = 'icons/mob/actions/actions_items.dmi' + button_icon_state = "voice_of_god" + sound = 'sound/magic/clockwork/invoke_general.ogg' + + cooldown_time = 120 SECONDS // Varies depending on command + invocation = "" // Handled by the VOICE OF GOD itself + invocation_type = INVOCATION_SHOUT + spell_requirements = NONE + antimagic_flags = NONE + + /// The command to deliver on cast + var/command + /// The modifier to the cooldown, after cast + var/cooldown_mod = 1 + /// The modifier put onto the power of the command + var/power_mod = 1 + /// A list of spans to apply to commands given + var/list/spans = list("colossus", "yell") + +/datum/action/cooldown/spell/voice_of_god/before_cast(atom/cast_on) + . = ..() + if(. & SPELL_CANCEL_CAST) + return + + command = tgui_input_text(cast_on, "Speak with the Voice of God", "Command") + if(QDELETED(src) || QDELETED(cast_on) || !can_cast_spell()) + return . | SPELL_CANCEL_CAST + if(!command) + reset_spell_cooldown() + return . | SPELL_CANCEL_CAST + +/datum/action/cooldown/spell/voice_of_god/cast(atom/cast_on) + . = ..() + var/command_cooldown = voice_of_god(uppertext(command), cast_on, spans, base_multiplier = power_mod) + cooldown_time = (command_cooldown * cooldown_mod) + +// "Invocation" is done by the actual voice of god proc +/datum/action/cooldown/spell/voice_of_god/invocation() + return + +/datum/action/cooldown/spell/voice_of_god/clown + name = "Voice of Clown" + desc = "Speak with an incredibly funny voice, startling people into obeying you for a brief moment." + sound = 'sound/misc/scary_horn.ogg' + cooldown_mod = 0.5 + power_mod = 0.1 + spans = list("clown") diff --git a/code/modules/spells/spell_types/shadow_walk.dm b/code/modules/spells/spell_types/shadow_walk.dm deleted file mode 100644 index 8bf7bdbc961c4b..00000000000000 --- a/code/modules/spells/spell_types/shadow_walk.dm +++ /dev/null @@ -1,98 +0,0 @@ -#define SHADOW_REGEN_RATE 1.5 - -/obj/effect/proc_holder/spell/targeted/shadowwalk - name = "Shadow Walk" - desc = "Grants unlimited movement in darkness." - charge_max = 0 - clothes_req = FALSE - antimagic_flags = NONE - phase_allowed = TRUE - selection_type = "range" - range = -1 - include_user = TRUE - cooldown_min = 0 - overlay = null - action_icon = 'icons/mob/actions/actions_minor_antag.dmi' - action_icon_state = "ninja_cloak" - action_background_icon_state = "bg_alien" - -/obj/effect/proc_holder/spell/targeted/shadowwalk/cast_check(skipcharge = 0,mob/user = usr) - . = ..() - if(!.) - return FALSE - var/area/noteleport_check = get_area(user) - if(noteleport_check && noteleport_check.area_flags & NOTELEPORT) - to_chat(user, span_danger("Some dull, universal force is stopping you from melting into the shadows here.")) - return FALSE - -/obj/effect/proc_holder/spell/targeted/shadowwalk/cast(list/targets,mob/living/user = usr) - var/L = user.loc - if(istype(user.loc, /obj/effect/dummy/phased_mob/shadow)) - var/obj/effect/dummy/phased_mob/shadow/S = L - S.end_jaunt(FALSE) - return - else - var/turf/T = get_turf(user) - var/light_amount = T.get_lumcount() - if(light_amount < SHADOW_SPECIES_LIGHT_THRESHOLD) - playsound(get_turf(user), 'sound/magic/ethereal_enter.ogg', 50, TRUE, -1) - visible_message(span_boldwarning("[user] melts into the shadows!")) - user.SetAllImmobility(0) - user.setStaminaLoss(0, 0) - var/obj/effect/dummy/phased_mob/shadow/S2 = new(get_turf(user.loc)) - user.forceMove(S2) - S2.jaunter = user - else - to_chat(user, span_warning("It isn't dark enough here!")) - -/obj/effect/dummy/phased_mob/shadow - var/mob/living/jaunter - -/obj/effect/dummy/phased_mob/shadow/Initialize(mapload) - . = ..() - START_PROCESSING(SSobj, src) - -/obj/effect/dummy/phased_mob/shadow/Destroy() - jaunter = null - STOP_PROCESSING(SSobj, src) - . = ..() - -/obj/effect/dummy/phased_mob/shadow/process(delta_time) - var/turf/T = get_turf(src) - var/light_amount = T.get_lumcount() - if(!jaunter || jaunter.loc != src) - qdel(src) - if (light_amount < 0.2 && (!QDELETED(jaunter))) //heal in the dark - jaunter.heal_overall_damage((SHADOW_REGEN_RATE * delta_time), (SHADOW_REGEN_RATE * delta_time), 0, BODYTYPE_ORGANIC) - check_light_level() - - -/obj/effect/dummy/phased_mob/shadow/relaymove(mob/living/user, direction) - var/turf/oldloc = loc - . = ..() - if(loc != oldloc) - check_light_level() - -/obj/effect/dummy/phased_mob/shadow/phased_check(mob/living/user, direction) - . = ..() - if(. && isspaceturf(.)) - to_chat(user, span_warning("It really would not be wise to go into space.")) - return FALSE - -/obj/effect/dummy/phased_mob/shadow/proc/check_light_level() - var/turf/T = get_turf(src) - var/light_amount = T.get_lumcount() - if(light_amount > 0.2) // jaunt ends - end_jaunt(TRUE) - -/obj/effect/dummy/phased_mob/shadow/proc/end_jaunt(forced = FALSE) - if(jaunter) - if(forced) - visible_message(span_boldwarning("[jaunter] is revealed by the light!")) - else - visible_message(span_boldwarning("[jaunter] emerges from the darkness!")) - playsound(loc, 'sound/magic/ethereal_exit.ogg', 50, TRUE, -1) - qdel(src) - - -#undef SHADOW_REGEN_RATE diff --git a/code/modules/spells/spell_types/shapeshift.dm b/code/modules/spells/spell_types/shapeshift.dm deleted file mode 100644 index 9e856bf9d680d1..00000000000000 --- a/code/modules/spells/spell_types/shapeshift.dm +++ /dev/null @@ -1,241 +0,0 @@ -/obj/effect/proc_holder/spell/targeted/shapeshift - name = "Shapechange" - desc = "Take on the shape of another for a time to use their natural abilities. Once you've made your choice it cannot be changed." - school = SCHOOL_TRANSMUTATION - clothes_req = FALSE - human_req = FALSE - charge_max = 200 - cooldown_min = 50 - range = -1 - include_user = TRUE - invocation = "RAC'WA NO!" - invocation_type = INVOCATION_SHOUT - action_icon_state = "shapeshift" - nonabstract_req = TRUE - - var/revert_on_death = TRUE - var/die_with_shapeshifted_form = TRUE - ///If you want to convert the caster's health and blood to the shift, and vice versa. - var/convert_damage = TRUE - ///The damage type to convert to, as simplemobs don't have advanced damagetypes. - var/convert_damage_type = BRUTE - - var/mob/living/shapeshift_type - var/list/possible_shapes = list( - /mob/living/simple_animal/mouse, - /mob/living/simple_animal/pet/dog/corgi, - /mob/living/simple_animal/hostile/carp/ranged/chaos, - /mob/living/simple_animal/bot/secbot/ed209, - /mob/living/simple_animal/hostile/giant_spider/viper/wizard, - /mob/living/simple_animal/hostile/construct/juggernaut/mystic, - ) - -/obj/effect/proc_holder/spell/targeted/shapeshift/cast(list/targets, mob/user = usr) - if(src in user.mob_spell_list) - LAZYREMOVE(user.mob_spell_list, src) - user.mind.AddSpell(src) - if(user.buckled) - user.buckled.unbuckle_mob(src,force=TRUE) - for(var/mob/living/shapeshifted_targets in targets) - if(!shapeshift_type) - var/list/animal_list = list() - var/list/display_animals = list() - for(var/path in possible_shapes) - var/mob/living/simple_animal/animal = path - animal_list[initial(animal.name)] = path - var/image/animal_image = image(icon = initial(animal.icon), icon_state = initial(animal.icon_state)) - display_animals += list(initial(animal.name) = animal_image) - sort_list(display_animals) - var/new_shapeshift_type = show_radial_menu(shapeshifted_targets, shapeshifted_targets, display_animals, custom_check = CALLBACK(src, .proc/check_menu, user), radius = 38, require_near = TRUE) - if(shapeshift_type) - return - shapeshift_type = new_shapeshift_type - if(!shapeshift_type) //If you aren't gonna decide I am! - shapeshift_type = pick(animal_list) - shapeshift_type = animal_list[shapeshift_type] - - var/obj/shapeshift_holder/shapeshift_ability = locate() in shapeshifted_targets - var/currently_ventcrawling = FALSE - if(shapeshift_ability) - if(shapeshifted_targets.movement_type & VENTCRAWLING) - currently_ventcrawling = TRUE - shapeshifted_targets = restore_form(shapeshifted_targets) - else - shapeshifted_targets = Shapeshift(shapeshifted_targets) - - // Can our new form support ventcrawling? - var/ventcrawler = HAS_TRAIT(shapeshifted_targets, TRAIT_VENTCRAWLER_ALWAYS) || HAS_TRAIT(shapeshifted_targets, TRAIT_VENTCRAWLER_NUDE) - if(ventcrawler) - continue - - // Are we currently ventcrawling? - if(!currently_ventcrawling) - continue - - // You're shapeshifting into something that can't fit into a vent - var/obj/machinery/atmospherics/pipeyoudiein = shapeshifted_targets.loc - var/datum/pipeline/ourpipeline - var/pipenets = pipeyoudiein.return_pipenets() - if(islist(pipenets)) - ourpipeline = pipenets[1] - else - ourpipeline = pipenets - - to_chat(shapeshifted_targets, span_userdanger("Casting [src] inside of [pipeyoudiein] quickly turns you into a bloody mush!")) - var/gibtype = /obj/effect/gibspawner/generic - if(isalien(shapeshifted_targets)) - gibtype = /obj/effect/gibspawner/xeno - for(var/obj/machinery/atmospherics/components/unary/possiblevent in range(10, get_turf(shapeshifted_targets))) - if(possiblevent.parents.len && possiblevent.parents[1] == ourpipeline) - new gibtype(get_turf(possiblevent)) - playsound(possiblevent, 'sound/effects/reee.ogg', 75, TRUE) - priority_announce("We detected a pipe blockage around [get_area(get_turf(shapeshifted_targets))], please dispatch someone to investigate.", "Central Command") - shapeshifted_targets.death() - qdel(shapeshifted_targets) - -/** - * check_menu: Checks if we are allowed to interact with a radial menu - * - * Arguments: - * * user The mob interacting with a menu - */ -/obj/effect/proc_holder/spell/targeted/shapeshift/proc/check_menu(mob/user) - if(!istype(user)) - return FALSE - if(user.incapacitated()) - return FALSE - return TRUE - -/obj/effect/proc_holder/spell/targeted/shapeshift/proc/Shapeshift(mob/living/caster) - var/obj/shapeshift_holder/shapeshift_ability = locate() in caster - if(shapeshift_ability) - to_chat(caster, span_warning("You're already shapeshifted!")) - return - - var/mob/living/shape = new shapeshift_type(caster.loc) - shapeshift_ability = new(shape, src, caster) - - clothes_req = FALSE - human_req = FALSE - return shape - -/obj/effect/proc_holder/spell/targeted/shapeshift/proc/restore_form(mob/living/caster) - var/obj/shapeshift_holder/shapeshift_ability = locate() in caster - if(!shapeshift_ability) - return - - var/mob/living/restored_player = shapeshift_ability.stored - - shapeshift_ability.restore() - - clothes_req = initial(clothes_req) - human_req = initial(human_req) - return restored_player - -/obj/effect/proc_holder/spell/targeted/shapeshift/dragon - name = "Dragon Form" - desc = "Take on the shape a lesser ash drake." - invocation = "RAAAAAAAAWR!" - - - shapeshift_type = /mob/living/simple_animal/hostile/megafauna/dragon/lesser - - -/obj/shapeshift_holder - name = "Shapeshift holder" - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ON_FIRE | UNACIDABLE | ACID_PROOF - var/mob/living/stored - var/mob/living/shape - var/restoring = FALSE - var/obj/effect/proc_holder/spell/targeted/shapeshift/source - -/obj/shapeshift_holder/Initialize(mapload, obj/effect/proc_holder/spell/targeted/shapeshift/_source, mob/living/caster) - . = ..() - source = _source - shape = loc - if(!istype(shape)) - stack_trace("shapeshift holder created outside mob/living") - return INITIALIZE_HINT_QDEL - stored = caster - if(stored.mind) - stored.mind.transfer_to(shape) - stored.forceMove(src) - stored.notransform = TRUE - if(source.convert_damage) - var/damage_percent = (stored.maxHealth - stored.health)/stored.maxHealth; - var/damapply = damage_percent * shape.maxHealth; - - shape.apply_damage(damapply, source.convert_damage_type, forced = TRUE, wound_bonus=CANT_WOUND); - shape.blood_volume = stored.blood_volume; - - RegisterSignal(shape, list(COMSIG_PARENT_QDELETING, COMSIG_LIVING_DEATH), .proc/shape_death) - RegisterSignal(stored, list(COMSIG_PARENT_QDELETING, COMSIG_LIVING_DEATH), .proc/caster_death) - -/obj/shapeshift_holder/Destroy() - // restore_form manages signal unregistering. If restoring is TRUE, we've already unregistered the signals and we're here - // because restore() qdel'd src. - if(!restoring) - restore() - stored = null - shape = null - return ..() - -/obj/shapeshift_holder/Moved() - . = ..() - if(!restoring && !QDELETED(src)) - restore() - -/obj/shapeshift_holder/handle_atom_del(atom/A) - if(A == stored && !restoring) - restore() - -/obj/shapeshift_holder/Exited(atom/movable/gone, direction) - if(stored == gone && !restoring) - restore() - -/obj/shapeshift_holder/proc/caster_death() - SIGNAL_HANDLER - //Something kills the stored caster through direct damage. - if(source.revert_on_death) - restore(death=TRUE) - else - shape.death() - -/obj/shapeshift_holder/proc/shape_death() - SIGNAL_HANDLER - //Shape dies. - if(source.die_with_shapeshifted_form) - if(source.revert_on_death) - restore(death=TRUE) - else - restore() - -/obj/shapeshift_holder/proc/restore(death=FALSE) - // Destroy() calls this proc if it hasn't been called. Unregistering here prevents multiple qdel loops - // when caster and shape both die at the same time. - UnregisterSignal(shape, list(COMSIG_PARENT_QDELETING, COMSIG_LIVING_DEATH)) - UnregisterSignal(stored, list(COMSIG_PARENT_QDELETING, COMSIG_LIVING_DEATH)) - restoring = TRUE - stored.forceMove(shape.loc) - stored.notransform = FALSE - if(shape.mind) - shape.mind.transfer_to(stored) - if(death) - stored.death() - else if(source.convert_damage) - stored.revive(full_heal = TRUE, admin_revive = FALSE) - - var/damage_percent = (shape.maxHealth - shape.health)/shape.maxHealth; - var/damapply = stored.maxHealth * damage_percent - - stored.apply_damage(damapply, source.convert_damage_type, forced = TRUE, wound_bonus=CANT_WOUND) - if(source.convert_damage) - stored.blood_volume = shape.blood_volume; - - // This guard is important because restore() can also be called on COMSIG_PARENT_QDELETING for shape, as well as on death. - // This can happen in, for example, [/proc/wabbajack] where the mob hit is qdel'd. - if(!QDELETED(shape)) - QDEL_NULL(shape) - - qdel(src) - return stored diff --git a/code/modules/spells/spell_types/shapeshift/_shapeshift.dm b/code/modules/spells/spell_types/shapeshift/_shapeshift.dm new file mode 100644 index 00000000000000..df154f2cedb6ad --- /dev/null +++ b/code/modules/spells/spell_types/shapeshift/_shapeshift.dm @@ -0,0 +1,244 @@ +/datum/action/cooldown/spell/shapeshift + school = SCHOOL_TRANSMUTATION + + /// Whehter we revert to our human form on death. + var/revert_on_death = TRUE + /// Whether we die when our shapeshifted form is killed + var/die_with_shapeshifted_form = TRUE + /// Whether we convert our health from one form to another + var/convert_damage = TRUE + /// If convert damage is true, the damage type we deal when converting damage back and forth + var/convert_damage_type = BRUTE + + /// Our chosen type + var/mob/living/shapeshift_type + /// All possible types we can become + var/list/atom/possible_shapes + +/datum/action/cooldown/spell/shapeshift/is_valid_target(atom/cast_on) + return isliving(cast_on) + +/datum/action/cooldown/spell/shapeshift/proc/is_shifted(mob/living/cast_on) + return locate(/obj/shapeshift_holder) in cast_on + +/datum/action/cooldown/spell/shapeshift/before_cast(atom/cast_on) + . = ..() + if(. & SPELL_CANCEL_CAST) + return + + if(shapeshift_type) + return + + if(length(possible_shapes) == 1) + shapeshift_type = possible_shapes[1] + return + + var/list/shape_names_to_types = list() + var/list/shape_names_to_image = list() + if(!length(shape_names_to_types) || !length(shape_names_to_image)) + for(var/atom/path as anything in possible_shapes) + var/shape_name = initial(path.name) + shape_names_to_types[shape_name] = path + shape_names_to_image[shape_name] = image(icon = initial(path.icon), icon_state = initial(path.icon_state)) + + var/picked_type = show_radial_menu( + cast_on, + cast_on, + shape_names_to_image, + custom_check = CALLBACK(src, .proc/check_menu, cast_on), + radius = 38, + ) + + if(!picked_type) + return . | SPELL_CANCEL_CAST + + var/atom/shift_type = shape_names_to_types[picked_type] + if(!ispath(shift_type)) + return . | SPELL_CANCEL_CAST + + shapeshift_type = shift_type || pick(possible_shapes) + if(QDELETED(src) || QDELETED(owner) || !can_cast_spell(feedback = FALSE)) + return . | SPELL_CANCEL_CAST + +/datum/action/cooldown/spell/shapeshift/cast(mob/living/cast_on) + . = ..() + cast_on.buckled?.unbuckle_mob(cast_on, force = TRUE) + + var/currently_ventcrawling = (cast_on.movement_type & VENTCRAWLING) + + // Do the shift back or forth + if(is_shifted(cast_on)) + restore_form(cast_on) + else + do_shapeshift(cast_on) + + // The shift is done, let's make sure they're in a valid state now + // If we're not ventcrawling, we don't need to mind + if(!currently_ventcrawling) + return + + // We are ventcrawling - can our new form support ventcrawling? + if(HAS_TRAIT(cast_on, TRAIT_VENTCRAWLER_ALWAYS) || HAS_TRAIT(cast_on, TRAIT_VENTCRAWLER_NUDE)) + return + + // Uh oh. You've shapeshifted into something that can't fit into a vent, while ventcrawling. + eject_from_vents(cast_on) + +/// Whenever someone shapeshifts within a vent, +/// and enters a state in which they are no longer a ventcrawler, +/// they are brutally ejected from the vents. In the form of gibs. +/datum/action/cooldown/spell/shapeshift/proc/eject_from_vents(mob/living/cast_on) + var/obj/machinery/atmospherics/pipe_you_die_in = cast_on.loc + var/datum/pipeline/our_pipeline + var/pipenets = pipe_you_die_in.return_pipenets() + if(islist(pipenets)) + our_pipeline = pipenets[1] + else + our_pipeline = pipenets + + to_chat(cast_on, span_userdanger("Casting [src] inside of [pipe_you_die_in] quickly turns you into a bloody mush!")) + var/obj/effect/gib_type = isalien(cast_on) ? /obj/effect/gibspawner/xeno : /obj/effect/gibspawner/generic + + for(var/obj/machinery/atmospherics/components/unary/possible_vent in range(10, get_turf(cast_on))) + if(length(possible_vent.parents) && possible_vent.parents[1] == our_pipeline) + new gib_type(get_turf(possible_vent)) + playsound(possible_vent, 'sound/effects/reee.ogg', 75, TRUE) + + priority_announce("We detected a pipe blockage around [get_area(get_turf(cast_on))], please dispatch someone to investigate.", "Central Command") + cast_on.death() + qdel(cast_on) + +/datum/action/cooldown/spell/shapeshift/proc/check_menu(mob/living/caster) + if(QDELETED(src)) + return FALSE + if(QDELETED(caster)) + return FALSE + + return !caster.incapacitated() + +/datum/action/cooldown/spell/shapeshift/proc/do_shapeshift(mob/living/caster) + if(is_shifted(caster)) + to_chat(caster, span_warning("You're already shapeshifted!")) + CRASH("[type] called do_shapeshift while shapeshifted.") + + var/mob/living/new_shape = new shapeshift_type(caster.loc) + var/obj/shapeshift_holder/new_shape_holder = new(new_shape, src, caster) + + spell_requirements &= ~(SPELL_REQUIRES_HUMAN|SPELL_REQUIRES_WIZARD_GARB) + + return new_shape_holder + +/datum/action/cooldown/spell/shapeshift/proc/restore_form(mob/living/caster) + var/obj/shapeshift_holder/current_shift = is_shifted(caster) + if(QDELETED(current_shift)) + return + + var/mob/living/restored_player = current_shift.stored + + current_shift.restore() + spell_requirements = initial(spell_requirements) // Miiight mess with admin stuff. + + return restored_player + +// Maybe one day, this can be a component or something +// Until then, this is what holds data between wizard and shapeshift form whenever shapeshift is cast. +/obj/shapeshift_holder + name = "Shapeshift holder" + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ON_FIRE | UNACIDABLE | ACID_PROOF + var/mob/living/stored + var/mob/living/shape + var/restoring = FALSE + var/datum/action/cooldown/spell/shapeshift/source + +/obj/shapeshift_holder/Initialize(mapload, datum/action/cooldown/spell/shapeshift/_source, mob/living/caster) + . = ..() + source = _source + shape = loc + if(!istype(shape)) + stack_trace("shapeshift holder created outside mob/living") + return INITIALIZE_HINT_QDEL + stored = caster + if(stored.mind) + stored.mind.transfer_to(shape) + stored.forceMove(src) + stored.notransform = TRUE + if(source.convert_damage) + var/damage_percent = (stored.maxHealth - stored.health) / stored.maxHealth; + var/damapply = damage_percent * shape.maxHealth; + + shape.apply_damage(damapply, source.convert_damage_type, forced = TRUE, wound_bonus = CANT_WOUND); + shape.blood_volume = stored.blood_volume; + + RegisterSignal(shape, list(COMSIG_PARENT_QDELETING, COMSIG_LIVING_DEATH), .proc/shape_death) + RegisterSignal(stored, list(COMSIG_PARENT_QDELETING, COMSIG_LIVING_DEATH), .proc/caster_death) + +/obj/shapeshift_holder/Destroy() + // restore_form manages signal unregistering. If restoring is TRUE, we've already unregistered the signals and we're here + // because restore() qdel'd src. + if(!restoring) + restore() + stored = null + shape = null + return ..() + +/obj/shapeshift_holder/Moved() + . = ..() + if(!restoring && !QDELETED(src)) + restore() + +/obj/shapeshift_holder/handle_atom_del(atom/A) + if(A == stored && !restoring) + restore() + +/obj/shapeshift_holder/Exited(atom/movable/gone, direction) + if(stored == gone && !restoring) + restore() + +/obj/shapeshift_holder/proc/caster_death() + SIGNAL_HANDLER + + //Something kills the stored caster through direct damage. + if(source.revert_on_death) + restore(death = TRUE) + else + shape.death() + +/obj/shapeshift_holder/proc/shape_death() + SIGNAL_HANDLER + + //Shape dies. + if(source.die_with_shapeshifted_form) + if(source.revert_on_death) + restore(death = TRUE) + else + restore() + +/obj/shapeshift_holder/proc/restore(death=FALSE) + // Destroy() calls this proc if it hasn't been called. Unregistering here prevents multiple qdel loops + // when caster and shape both die at the same time. + UnregisterSignal(shape, list(COMSIG_PARENT_QDELETING, COMSIG_LIVING_DEATH)) + UnregisterSignal(stored, list(COMSIG_PARENT_QDELETING, COMSIG_LIVING_DEATH)) + restoring = TRUE + stored.forceMove(shape.loc) + stored.notransform = FALSE + if(shape.mind) + shape.mind.transfer_to(stored) + if(death) + stored.death() + else if(source.convert_damage) + stored.revive(full_heal = TRUE, admin_revive = FALSE) + + var/damage_percent = (shape.maxHealth - shape.health)/shape.maxHealth; + var/damapply = stored.maxHealth * damage_percent + + stored.apply_damage(damapply, source.convert_damage_type, forced = TRUE, wound_bonus=CANT_WOUND) + if(source.convert_damage) + stored.blood_volume = shape.blood_volume; + + // This guard is important because restore() can also be called on COMSIG_PARENT_QDELETING for shape, as well as on death. + // This can happen in, for example, [/proc/wabbajack] where the mob hit is qdel'd. + if(!QDELETED(shape)) + QDEL_NULL(shape) + + qdel(src) + return stored diff --git a/code/modules/spells/spell_types/shapeshift/dragon.dm b/code/modules/spells/spell_types/shapeshift/dragon.dm new file mode 100644 index 00000000000000..358ff8a44fdde5 --- /dev/null +++ b/code/modules/spells/spell_types/shapeshift/dragon.dm @@ -0,0 +1,8 @@ + +/datum/action/cooldown/spell/shapeshift/dragon + name = "Dragon Form" + desc = "Take on the shape a lesser ash drake." + invocation = "RAAAAAAAAWR!" + spell_requirements = NONE + + possible_shapes = list(/mob/living/simple_animal/hostile/megafauna/dragon/lesser) diff --git a/code/modules/spells/spell_types/shapeshift/polar_bear.dm b/code/modules/spells/spell_types/shapeshift/polar_bear.dm new file mode 100644 index 00000000000000..73f0bae94969bb --- /dev/null +++ b/code/modules/spells/spell_types/shapeshift/polar_bear.dm @@ -0,0 +1,7 @@ +/datum/action/cooldown/spell/shapeshift/polar_bear + name = "Polar Bear Form" + desc = "Take on the shape of a polar bear." + invocation = "RAAAAAAAAWR!" + spell_requirements = NONE + + possible_shapes = list(/mob/living/simple_animal/hostile/asteroid/polarbear/lesser) diff --git a/code/modules/spells/spell_types/shapeshift/shapechange.dm b/code/modules/spells/spell_types/shapeshift/shapechange.dm new file mode 100644 index 00000000000000..a858ac414d96e2 --- /dev/null +++ b/code/modules/spells/spell_types/shapeshift/shapechange.dm @@ -0,0 +1,22 @@ +/datum/action/cooldown/spell/shapeshift/wizard + name = "Wild Shapeshift" + desc = "Take on the shape of another for a time to use their natural abilities. \ + Once you've made your choice, it cannot be changed." + button_icon_state = "shapeshift" + + school = SCHOOL_TRANSMUTATION + cooldown_time = 20 SECONDS + cooldown_reduction_per_rank = 3.75 SECONDS + + invocation = "RAC'WA NO!" + invocation_type = INVOCATION_SHOUT + spell_requirements = SPELL_REQUIRES_NO_ANTIMAGIC + + possible_shapes = list( + /mob/living/simple_animal/mouse, + /mob/living/simple_animal/pet/dog/corgi, + /mob/living/simple_animal/hostile/carp/ranged/chaos, + /mob/living/simple_animal/bot/secbot/ed209, + /mob/living/simple_animal/hostile/giant_spider/viper/wizard, + /mob/living/simple_animal/hostile/construct/juggernaut/mystic, + ) diff --git a/code/modules/spells/spell_types/soultap.dm b/code/modules/spells/spell_types/soultap.dm deleted file mode 100644 index 065b511fbba82e..00000000000000 --- a/code/modules/spells/spell_types/soultap.dm +++ /dev/null @@ -1,42 +0,0 @@ -/// The amount of health taken per tap. -#define HEALTH_LOST_PER_SOUL_TAP 20 - -/** - * SOUL TAP! - * - * Trades 20 max health for a refresh on all of your spells. - * I was considering making it depend on the cooldowns of your spells, but I want to support "Big spell wizard" with this loadout. - * The two spells that sound most problematic with this is mindswap and lichdom, - * but soul tap requires clothes for mindswap and lichdom takes your soul. - */ -/obj/effect/proc_holder/spell/self/tap - name = "Soul Tap" - desc = "Fuel your spells using your own soul!" - action_icon = 'icons/mob/actions/actions_spells.dmi' - action_icon_state = "soultap" - invocation = "AT ANY COST!" - invocation_type = INVOCATION_SHOUT - school = SCHOOL_NECROMANCY //i could see why this wouldn't be necromancy but messing with souls or whatever. ectomancy? - charge_max = 1 SECONDS - cooldown_min = 1 SECONDS - level_max = 0 - -/obj/effect/proc_holder/spell/self/tap/cast(list/targets, mob/living/user = usr) - if(HAS_TRAIT(user, TRAIT_NO_SOUL)) - to_chat(user, span_warning("You have no soul to tap into!")) - return - - to_chat(user, span_danger("Your body feels drained and there is a burning pain in your chest.")) - user.maxHealth -= HEALTH_LOST_PER_SOUL_TAP - user.health = min(user.health, user.maxHealth) - if(user.maxHealth <= 0) - to_chat(user, span_userdanger("Your weakened soul is completely consumed by the tap!")) - ADD_TRAIT(user, TRAIT_NO_SOUL, MAGIC_TRAIT) - return - - for(var/obj/effect/proc_holder/spell/spell in user.mind.spell_list) - spell.charge_counter = spell.charge_max - spell.recharging = FALSE - spell.update_appearance() - -#undef HEALTH_LOST_PER_SOUL_TAP diff --git a/code/modules/spells/spell_types/spacetime_distortion.dm b/code/modules/spells/spell_types/spacetime_distortion.dm deleted file mode 100644 index 6ced2de2318649..00000000000000 --- a/code/modules/spells/spell_types/spacetime_distortion.dm +++ /dev/null @@ -1,130 +0,0 @@ -/obj/effect/proc_holder/spell/spacetime_dist - name = "Spacetime Distortion" - desc = "Entangle the strings of space-time in an area around you, randomizing the layout and making proper movement impossible. The strings vibrate..." - charge_max = 300 - var/duration = 150 - range = 7 - var/list/effects - var/ready = TRUE - school = SCHOOL_EVOCATION - centcom_cancast = FALSE - sound = 'sound/effects/magic.ogg' - cooldown_min = 300 - level_max = 0 - action_icon_state = "spacetime" - -/obj/effect/proc_holder/spell/spacetime_dist/can_cast(mob/user = usr) - if(ready) - return ..() - return FALSE - -/obj/effect/proc_holder/spell/spacetime_dist/choose_targets(mob/user = usr) - var/list/turfs = spiral_range_turfs(range, user) - if(!turfs.len) - revert_cast() - return - - ready = FALSE - var/list/turf_steps = list() - var/length = round(turfs.len * 0.5) - for(var/i in 1 to length) - turf_steps[pick_n_take(turfs)] = pick_n_take(turfs) - if(turfs.len > 0) - var/turf/loner = pick(turfs) - var/area/A = get_area(user) - turf_steps[loner] = get_turf(pick(A.contents)) - - perform(turf_steps,user=user) - -/obj/effect/proc_holder/spell/spacetime_dist/after_cast(list/targets) - addtimer(CALLBACK(src, .proc/clean_turfs), duration) - -/obj/effect/proc_holder/spell/spacetime_dist/cast(list/targets, mob/user = usr) - effects = list() - for(var/V in targets) - var/turf/T0 = V - var/turf/T1 = targets[V] - var/obj/effect/cross_action/spacetime_dist/STD0 = new /obj/effect/cross_action/spacetime_dist(T0) - var/obj/effect/cross_action/spacetime_dist/STD1 = new /obj/effect/cross_action/spacetime_dist(T1) - STD0.linked_dist = STD1 - STD0.add_overlay(T1.photograph()) - STD1.linked_dist = STD0 - STD1.add_overlay(T0.photograph()) - STD1.set_light(4, 30, "#c9fff5") - effects += STD0 - effects += STD1 - -/obj/effect/proc_holder/spell/spacetime_dist/proc/clean_turfs() - for(var/effect in effects) - qdel(effect) - effects.Cut() - effects = null - ready = TRUE - -/obj/effect/cross_action - name = "cross me" - desc = "for crossing" - anchored = TRUE - -/obj/effect/cross_action/spacetime_dist - name = "spacetime distortion" - desc = "A distortion in spacetime. You can hear faint music..." - icon_state = "" - var/obj/effect/cross_action/spacetime_dist/linked_dist - var/busy = FALSE - var/sound - var/walks_left = 50 //prevents the game from hanging in extreme cases (such as minigun fire) - -/obj/effect/cross_action/singularity_act() - return - -/obj/effect/cross_action/singularity_pull() - return - -/obj/effect/cross_action/spacetime_dist/Initialize(mapload) - . = ..() - setDir(pick(GLOB.cardinals)) - var/static/list/loc_connections = list( - COMSIG_ATOM_ENTERED = .proc/on_entered, - ) - AddElement(/datum/element/connect_loc, loc_connections) - -/obj/effect/cross_action/spacetime_dist/proc/walk_link(atom/movable/AM) - if(ismob(AM)) - var/mob/M = AM - if(M.can_block_magic(charge_cost = 0)) - return - if(linked_dist && walks_left > 0) - flick("purplesparkles", src) - linked_dist.get_walker(AM) - walks_left-- - -/obj/effect/cross_action/spacetime_dist/proc/get_walker(atom/movable/AM) - busy = TRUE - flick("purplesparkles", src) - AM.forceMove(get_turf(src)) - playsound(get_turf(src),sound,70,FALSE) - busy = FALSE - -/obj/effect/cross_action/spacetime_dist/proc/on_entered(datum/source, atom/movable/AM) - SIGNAL_HANDLER - if(!busy) - walk_link(AM) - -/obj/effect/cross_action/spacetime_dist/attackby(obj/item/W, mob/user, params) - if(user.temporarilyRemoveItemFromInventory(W)) - walk_link(W) - else - walk_link(user) - -//ATTACK HAND IGNORING PARENT RETURN VALUE -/obj/effect/cross_action/spacetime_dist/attack_hand(mob/user, list/modifiers) - walk_link(user) - -/obj/effect/cross_action/spacetime_dist/attack_paw(mob/user, list/modifiers) - walk_link(user) - -/obj/effect/cross_action/spacetime_dist/Destroy() - busy = TRUE - linked_dist = null - return ..() diff --git a/code/modules/spells/spell_types/summonitem.dm b/code/modules/spells/spell_types/summonitem.dm deleted file mode 100644 index b5c24f32d1107a..00000000000000 --- a/code/modules/spells/spell_types/summonitem.dm +++ /dev/null @@ -1,108 +0,0 @@ -/obj/effect/proc_holder/spell/targeted/summonitem - name = "Instant Summons" - desc = "This spell can be used to recall a previously marked item to your hand from anywhere in the universe." - school = SCHOOL_TRANSMUTATION - charge_max = 100 - clothes_req = FALSE - invocation = "GAR YOK" - invocation_type = INVOCATION_WHISPER - range = -1 - level_max = 0 //cannot be improved - cooldown_min = 100 - include_user = TRUE - action_icon_state = "summons" - ///The obj marked for recall - var/obj/marked_item - -/obj/effect/proc_holder/spell/targeted/summonitem/cast(list/targets, mob/user = usr) - for(var/mob/living/L in targets) - var/list/hand_items = list(L.get_active_held_item(), L.get_inactive_held_item()) - var/message - - if(!marked_item) //linking item to the spell - message = "" - for(var/obj/item/item in hand_items) - if(item.item_flags & ABSTRACT) - continue - if(SEND_SIGNAL(item, COMSIG_ITEM_MARK_RETRIEVAL) & COMPONENT_BLOCK_MARK_RETRIEVAL) - continue - if(HAS_TRAIT(item, TRAIT_NODROP)) - message += "Though it feels redundant, " - marked_item = item - message += "You mark [item] for recall." - name = "Recall [item]" - break - - if(!marked_item) - if(hand_items) - message = span_warning("You aren't holding anything that can be marked for recall!") - else - message = span_warning("You must hold the desired item in your hands to mark it for recall!") - - else if(marked_item && (marked_item in hand_items)) //unlinking item to the spell - message = span_notice("You remove the mark on [marked_item] to use elsewhere.") - name = "Instant Summons" - marked_item = null - - else if(marked_item && QDELETED(marked_item)) //the item was destroyed at some point - message = span_warning("You sense your marked item has been destroyed!") - name = "Instant Summons" - marked_item = null - - else //Getting previously marked item - var/obj/item_to_retrieve = marked_item - var/infinite_recursion = 0 //I don't want to know how someone could put something inside itself but these are wizards so let's be safe - - if(!item_to_retrieve.loc) - if(isorgan(item_to_retrieve)) // Organs are usually stored in nullspace - var/obj/item/organ/organ = item_to_retrieve - if(organ.owner) - // If this code ever runs I will be happy - log_combat(L, organ.owner, "magically removed [organ.name] from", addition="COMBAT MODE: [uppertext(L.combat_mode)]") - organ.Remove(organ.owner) - else - while(!isturf(item_to_retrieve.loc) && infinite_recursion < 10) //if it's in something you get the whole thing. - if(isitem(item_to_retrieve.loc)) - var/obj/item/I = item_to_retrieve.loc - if(I.item_flags & ABSTRACT) //Being able to summon abstract things because your item happened to get placed there is a no-no - break - if(ismob(item_to_retrieve.loc)) //If its on someone, properly drop it - var/mob/M = item_to_retrieve.loc - - if(issilicon(M)) //Items in silicons warp the whole silicon - M.loc.visible_message(span_warning("[M] suddenly disappears!")) - M.forceMove(L.loc) - M.loc.visible_message(span_warning("[M] suddenly appears!")) - item_to_retrieve = null - break - M.dropItemToGround(item_to_retrieve) - - else - var/obj/retrieved_item = item_to_retrieve.loc - if(retrieved_item.anchored) - return - if(istype(retrieved_item, /obj/machinery/portable_atmospherics)) //Edge cases for moved machinery - var/obj/machinery/portable_atmospherics/P = retrieved_item - P.disconnect() - P.update_appearance() - - item_to_retrieve = retrieved_item - - infinite_recursion += 1 - - if(!item_to_retrieve) - return - - if(item_to_retrieve.loc) - item_to_retrieve.loc.visible_message(span_warning("The [item_to_retrieve.name] suddenly disappears!")) - if(!L.put_in_hands(item_to_retrieve)) - item_to_retrieve.forceMove(L.drop_location()) - item_to_retrieve.loc.visible_message(span_warning("The [item_to_retrieve.name] suddenly appears!")) - playsound(get_turf(L), 'sound/magic/summonitems_generic.ogg', 50, TRUE) - else - item_to_retrieve.loc.visible_message(span_warning("The [item_to_retrieve.name] suddenly appears in [L]'s hand!")) - playsound(get_turf(L), 'sound/magic/summonitems_generic.ogg', 50, TRUE) - - - if(message) - to_chat(L, message) diff --git a/code/modules/spells/spell_types/telepathy.dm b/code/modules/spells/spell_types/telepathy.dm deleted file mode 100644 index 2185d6174f91ff..00000000000000 --- a/code/modules/spells/spell_types/telepathy.dm +++ /dev/null @@ -1,30 +0,0 @@ -/obj/effect/proc_holder/spell/targeted/telepathy - name = "Telepathy" - desc = "Telepathically transmits a message to the target." - charge_max = 0 - clothes_req = 0 - range = 7 - include_user = 0 - action_icon = 'icons/mob/actions/actions_revenant.dmi' - action_icon_state = "r_transmit" - action_background_icon_state = "bg_spell" - antimagic_flags = MAGIC_RESISTANCE_MIND - var/notice = "notice" - var/boldnotice = "boldnotice" - -/obj/effect/proc_holder/spell/targeted/telepathy/cast(list/targets, mob/living/simple_animal/revenant/user = usr) - for(var/mob/living/M in targets) - var/msg = tgui_input_text(user, "What do you wish to tell [M]?", "Telepathy") - if(!msg) - charge_counter = charge_max - return - log_directed_talk(user, M, msg, LOG_SAY, "[name]") - to_chat(user, "You transmit to [M]: [msg]") - if(!M.can_block_magic(antimagic_flags, charge_cost = 0)) //hear no evil - to_chat(M, "You hear something behind you talking... [msg]") - for(var/ded in GLOB.dead_mob_list) - if(!isobserver(ded)) - continue - var/follow_rev = FOLLOW_LINK(ded, user) - var/follow_whispee = FOLLOW_LINK(ded, M) - to_chat(ded, "[follow_rev] [user] [name]: \"[msg]\" to [follow_whispee] [span_name("[M]")]") diff --git a/code/modules/spells/spell_types/teleport/_teleport.dm b/code/modules/spells/spell_types/teleport/_teleport.dm new file mode 100644 index 00000000000000..794da323dc5398 --- /dev/null +++ b/code/modules/spells/spell_types/teleport/_teleport.dm @@ -0,0 +1,145 @@ + +/** + * ## Teleport Spell + * + * Teleports the caster to a turf selected by get_destinations(). + */ +/datum/action/cooldown/spell/teleport + sound = 'sound/weapons/zapbang.ogg' + + school = SCHOOL_TRANSLOCATION + + /// What channel the teleport is done under. + var/teleport_channel = TELEPORT_CHANNEL_MAGIC + /// Whether we force the teleport to happen (ie, it cannot be blocked by noteleport areas or blessings or whatever) + var/force_teleport = FALSE + /// A list of flags related to determining if our destination target is valid or not. + var/destination_flags = NONE + /// The sound played on arrival, after the teleport. + var/post_teleport_sound = 'sound/weapons/zapbang.ogg' + +/datum/action/cooldown/spell/teleport/cast(atom/cast_on) + . = ..() + var/list/turf/destinations = get_destinations(cast_on) + if(!length(destinations)) + CRASH("[type] failed to find a teleport destination.") + + do_teleport(cast_on, pick(destinations), asoundout = post_teleport_sound, channel = teleport_channel, forced = force_teleport) + +/// Gets a list of destinations that are valid +/datum/action/cooldown/spell/teleport/proc/get_destinations(atom/center) + CRASH("[type] did not implement get_destinations and either has no effects or implemented the spell incorrectly.") + +/// Checks if the passed turf is a valid destination. +/datum/action/cooldown/spell/teleport/proc/is_valid_destination(turf/selected) + if(isspaceturf(selected) && (destination_flags & TELEPORT_SPELL_SKIP_SPACE)) + return FALSE + if(selected.density && (destination_flags & TELEPORT_SPELL_SKIP_DENSE)) + return FALSE + if(selected.is_blocked_turf(exclude_mobs = TRUE) && (destination_flags & TELEPORT_SPELL_SKIP_BLOCKED)) + return FALSE + + return TRUE + +/** + * ### Radius Teleport Spell + * + * A subtype of teleport that will teleport the caster + * to a random turf within a radius of themselves. + */ +/datum/action/cooldown/spell/teleport/radius_turf + /// The inner radius around the caster that we can teleport to + var/inner_tele_radius = 1 + /// The outer radius around the caster that we can teleport to + var/outer_tele_radius = 2 + +/datum/action/cooldown/spell/teleport/radius_turf/get_destinations(atom/center) + var/list/valid_turfs = list() + var/list/possibles = RANGE_TURFS(outer_tele_radius, center) + if(inner_tele_radius > 0) + possibles -= RANGE_TURFS(inner_tele_radius, center) + + for(var/turf/nearby_turf as anything in possibles) + if(!is_valid_destination(nearby_turf)) + continue + + valid_turfs += nearby_turf + + // If there are valid turfs around us? + // Screw it, allow 'em to teleport to ANY nearby turf. + return length(valid_turfs) ? valid_turfs : possibles + +/datum/action/cooldown/spell/teleport/radius_turf/is_valid_destination(turf/selected) + . = ..() + if(!.) + return FALSE + + // putting them at the edge is dumb + if(selected.x > world.maxx - outer_tele_radius || selected.x < outer_tele_radius) + return FALSE + if(selected.y > world.maxy - outer_tele_radius || selected.y < outer_tele_radius) + return FALSE + + return TRUE + +/** + * ### Area Teleport Spell + * + * A subtype of teleport that will teleport the caster + * to a random turf within a selected (or random) area. + */ +/datum/action/cooldown/spell/teleport/area_teleport + force_teleport = TRUE // Forced, as the Wizard Den is noteleport and wizards couldn't escape otherwise. + destination_flags = TELEPORT_SPELL_SKIP_BLOCKED + /// The last area we chose to teleport / where we're currently teleporting to, if mid-cast + var/last_chosen_area_name + /// If FALSE, the caster can select the destination area. If TRUE, they will teleport to somewhere randomly instead. + var/randomise_selection = FALSE + /// If the invocation appends the selected area when said. Requires invocation mode shout or whisper. + var/invocation_says_area = TRUE + +/datum/action/cooldown/spell/teleport/area_teleport/get_destinations(atom/center) + var/list/valid_turfs = list() + for(var/turf/possible_destination as anything in get_area_turfs(GLOB.teleportlocs[last_chosen_area_name])) + if(!is_valid_destination(possible_destination)) + continue + + valid_turfs += possible_destination + + return valid_turfs + +/datum/action/cooldown/spell/teleport/area_teleport/before_cast(atom/cast_on) + . = ..() + if(. & SPELL_CANCEL_CAST) + return + + var/area/target_area + if(randomise_selection) + target_area = pick(GLOB.teleportlocs) + else + target_area = tgui_input_list(cast_on, "Chose an area to teleport to.", "Teleport", GLOB.teleportlocs) + + if(QDELETED(src) || QDELETED(cast_on) || !can_cast_spell()) + return . | SPELL_CANCEL_CAST + if(!target_area || isnull(GLOB.teleportlocs[target_area])) + return . | SPELL_CANCEL_CAST + + last_chosen_area_name = target_area + +/datum/action/cooldown/spell/teleport/area_teleport/cast(atom/cast_on) + if(isliving(cast_on)) + var/mob/living/living_cast_on = cast_on + living_cast_on.buckled?.unbuckle_mob(cast_on, force = TRUE) + return ..() + +/datum/action/cooldown/spell/teleport/area_teleport/invocation() + var/area/last_chosen_area = GLOB.teleportlocs[last_chosen_area_name] + + if(!invocation_says_area || isnull(last_chosen_area)) + return ..() + + switch(invocation_type) + if(INVOCATION_SHOUT) + owner.say("[invocation], [uppertext(last_chosen_area.name)]!", forced = "spell ([src])") + if(INVOCATION_WHISPER) + owner.whisper("[invocation], [uppertext(last_chosen_area.name)].", forced = "spell ([src])") diff --git a/code/modules/spells/spell_types/teleport/blink.dm b/code/modules/spells/spell_types/teleport/blink.dm new file mode 100644 index 00000000000000..623bef237fb6e5 --- /dev/null +++ b/code/modules/spells/spell_types/teleport/blink.dm @@ -0,0 +1,19 @@ +/datum/action/cooldown/spell/teleport/radius_turf/blink + name = "Blink" + desc = "This spell randomly teleports you a short distance." + button_icon_state = "blink" + sound = 'sound/magic/blink.ogg' + + school = SCHOOL_FORBIDDEN + cooldown_time = 2 SECONDS + cooldown_reduction_per_rank = 0.4 SECONDS + + invocation_type = INVOCATION_NONE + + smoke_type = /datum/effect_system/fluid_spread/smoke + smoke_amt = 0 + + inner_tele_radius = 0 + outer_tele_radius = 6 + + post_teleport_sound = 'sound/magic/blink.ogg' diff --git a/code/modules/spells/spell_types/teleport/teleport.dm b/code/modules/spells/spell_types/teleport/teleport.dm new file mode 100644 index 00000000000000..a6ce6d1b9a58b5 --- /dev/null +++ b/code/modules/spells/spell_types/teleport/teleport.dm @@ -0,0 +1,51 @@ +/// The wizard's teleport SPELL +/datum/action/cooldown/spell/teleport/area_teleport/wizard + name = "Teleport" + desc = "This spell teleports you to an area of your selection." + button_icon_state = "teleport" + sound = 'sound/magic/teleport_diss.ogg' + + school = SCHOOL_TRANSLOCATION + cooldown_time = 1 MINUTES + cooldown_reduction_per_rank = 10 SECONDS + + invocation = "SCYAR NILA" + invocation_type = INVOCATION_SHOUT + + smoke_type = /datum/effect_system/fluid_spread/smoke + smoke_amt = 2 + + post_teleport_sound = 'sound/magic/teleport_app.ogg' + +// Santa's teleport, themed as such +/datum/action/cooldown/spell/teleport/area_teleport/wizard/santa + name = "Santa Teleport" + + invocation = "HO HO HO!" + spell_requirements = NONE + antimagic_flags = NONE + + invocation_says_area = FALSE // Santa moves in mysterious ways + +/// Used by the wizard's teleport scroll +/datum/action/cooldown/spell/teleport/area_teleport/wizard/scroll + name = "Teleport (scroll)" + cooldown_time = 0 SECONDS + + invocation = null + invocation_type = INVOCATION_NONE + spell_requirements = NONE + + invocation_says_area = FALSE + +/datum/action/cooldown/spell/teleport/area_teleport/wizard/scroll/IsAvailable() + return ..() && owner.is_holding(target) + +/datum/action/cooldown/spell/teleport/area_teleport/wizard/scroll/before_cast(atom/cast_on) + . = ..() + if(. & SPELL_CANCEL_CAST) + return + + var/mob/living/carbon/caster = cast_on + if(caster.incapacitated() || !caster.is_holding(target)) + return . | SPELL_CANCEL_CAST diff --git a/code/modules/spells/spell_types/the_traps.dm b/code/modules/spells/spell_types/the_traps.dm deleted file mode 100644 index 6fb86100ab0db7..00000000000000 --- a/code/modules/spells/spell_types/the_traps.dm +++ /dev/null @@ -1,26 +0,0 @@ -/obj/effect/proc_holder/spell/aoe_turf/conjure/the_traps - name = "The Traps!" - desc = "Summon a number of traps around you. They will damage and enrage any enemies that step on them." - - charge_max = 250 - cooldown_min = 50 - - clothes_req = TRUE - invocation = "CAVERE INSIDIAS" - invocation_type = INVOCATION_SHOUT - range = 3 - - summon_type = list( - /obj/structure/trap/stun, - /obj/structure/trap/fire, - /obj/structure/trap/chill, - /obj/structure/trap/damage - ) - summon_lifespan = 3000 - summon_amt = 5 - - action_icon_state = "the_traps" - -/obj/effect/proc_holder/spell/aoe_turf/conjure/the_traps/post_summon(obj/structure/trap/T, mob/user) - T.immune_minds += user.mind - T.charges = 1 diff --git a/code/modules/spells/spell_types/touch/_touch.dm b/code/modules/spells/spell_types/touch/_touch.dm new file mode 100644 index 00000000000000..d17ef04387d216 --- /dev/null +++ b/code/modules/spells/spell_types/touch/_touch.dm @@ -0,0 +1,265 @@ +/datum/action/cooldown/spell/touch + check_flags = AB_CHECK_CONSCIOUS|AB_CHECK_HANDS_BLOCKED + sound = 'sound/items/welder.ogg' + invocation = "High Five!" + invocation_type = INVOCATION_SHOUT + + /// Typepath of what hand we create on initial cast. + var/obj/item/melee/touch_attack/hand_path = /obj/item/melee/touch_attack + /// Ref to the hand we currently have deployed. + var/obj/item/melee/touch_attack/attached_hand + /// The message displayed to the person upon creating the touch hand + var/draw_message = span_notice("You channel the power of the spell to your hand.") + /// The message displayed upon willingly dropping / deleting / cancelling the touch hand before using it + var/drop_message = span_notice("You draw the power out of your hand.") + +/datum/action/cooldown/spell/touch/Destroy() + // If we have an owner, the hand is cleaned up in Remove(), which Destroy() calls. + if(!owner) + QDEL_NULL(attached_hand) + return ..() + +/datum/action/cooldown/spell/touch/Remove(mob/living/remove_from) + remove_hand(remove_from) + return ..() + +/datum/action/cooldown/spell/touch/UpdateButton(atom/movable/screen/movable/action_button/button, status_only = FALSE, force = FALSE) + . = ..() + if(!button) + return + if(attached_hand) + button.color = COLOR_GREEN + +/datum/action/cooldown/spell/touch/set_statpanel_format() + . = ..() + if(!islist(.)) + return + + if(attached_hand) + .[PANEL_DISPLAY_STATUS] = "ACTIVE" + +/datum/action/cooldown/spell/touch/can_cast_spell(feedback = TRUE) + . = ..() + if(!.) + return FALSE + if(!iscarbon(owner)) + return FALSE + var/mob/living/carbon/carbon_owner = owner + if(!(carbon_owner.mobility_flags & MOBILITY_USE)) + return FALSE + return TRUE + +/datum/action/cooldown/spell/touch/is_valid_target(atom/cast_on) + return iscarbon(cast_on) + +/** + * Creates a new hand_path hand and equips it to the caster. + * + * If the equipping action fails, reverts the cooldown and returns FALSE. + * Otherwise, registers signals and returns TRUE. + */ +/datum/action/cooldown/spell/touch/proc/create_hand(mob/living/carbon/cast_on) + var/obj/item/melee/touch_attack/new_hand = new hand_path(cast_on, src) + if(!cast_on.put_in_hands(new_hand, del_on_fail = TRUE)) + reset_spell_cooldown() + if (cast_on.usable_hands == 0) + to_chat(cast_on, span_warning("You dont have any usable hands!")) + else + to_chat(cast_on, span_warning("Your hands are full!")) + return FALSE + + attached_hand = new_hand + RegisterSignal(attached_hand, COMSIG_ITEM_AFTERATTACK, .proc/on_hand_hit) + RegisterSignal(attached_hand, COMSIG_ITEM_AFTERATTACK_SECONDARY, .proc/on_secondary_hand_hit) + RegisterSignal(attached_hand, COMSIG_PARENT_QDELETING, .proc/on_hand_deleted) + RegisterSignal(attached_hand, COMSIG_ITEM_DROPPED, .proc/on_hand_dropped) + to_chat(cast_on, draw_message) + return TRUE + +/** + * Unregisters any signals and deletes the hand currently summoned by the spell. + * + * If reset_cooldown_after is TRUE, we will additionally refund the cooldown of the spell. + * If reset_cooldown_after is FALSE, we will instead just start the spell's cooldown + */ +/datum/action/cooldown/spell/touch/proc/remove_hand(mob/living/hand_owner, reset_cooldown_after = FALSE) + if(!QDELETED(attached_hand)) + UnregisterSignal(attached_hand, list(COMSIG_ITEM_AFTERATTACK, COMSIG_ITEM_AFTERATTACK_SECONDARY, COMSIG_PARENT_QDELETING, COMSIG_ITEM_DROPPED)) + hand_owner?.temporarilyRemoveItemFromInventory(attached_hand) + QDEL_NULL(attached_hand) + + if(reset_cooldown_after) + if(hand_owner) + to_chat(hand_owner, drop_message) + reset_spell_cooldown() + else + StartCooldown() + +// Touch spells don't go on cooldown OR give off an invocation until the hand is used itself. +/datum/action/cooldown/spell/touch/before_cast(atom/cast_on) + return ..() | SPELL_NO_FEEDBACK | SPELL_NO_IMMEDIATE_COOLDOWN + +/datum/action/cooldown/spell/touch/cast(mob/living/carbon/cast_on) + if(!QDELETED(attached_hand) && (attached_hand in cast_on.held_items)) + remove_hand(cast_on, reset_cooldown_after = TRUE) + return + + create_hand(cast_on) + return ..() + +/** + * Signal proc for [COMSIG_ITEM_AFTERATTACK] from our attached hand. + * + * When our hand hits an atom, we can cast do_hand_hit() on them. + */ +/datum/action/cooldown/spell/touch/proc/on_hand_hit(datum/source, atom/victim, mob/caster, proximity_flag, click_parameters) + SIGNAL_HANDLER + + if(!proximity_flag) + return + if(victim == caster) + return + if(!can_cast_spell(feedback = FALSE)) + return + + INVOKE_ASYNC(src, .proc/do_hand_hit, source, victim, caster) + +/** + * Signal proc for [COMSIG_ITEM_AFTERATTACK_SECONDARY] from our attached hand. + * + * Same as on_hand_hit, but for if right-click was used on hit. + */ +/datum/action/cooldown/spell/touch/proc/on_secondary_hand_hit(datum/source, atom/victim, mob/caster, proximity_flag, click_parameters) + SIGNAL_HANDLER + + if(!proximity_flag) + return + if(victim == caster) + return + if(!can_cast_spell(feedback = FALSE)) + return + + INVOKE_ASYNC(src, .proc/do_secondary_hand_hit, source, victim, caster) + +/** + * Calls cast_on_hand_hit() from the caster onto the victim. + */ +/datum/action/cooldown/spell/touch/proc/do_hand_hit(obj/item/melee/touch_attack/hand, atom/victim, mob/living/carbon/caster) + SEND_SIGNAL(src, COMSIG_SPELL_TOUCH_HAND_HIT, victim, caster, hand) + if(!cast_on_hand_hit(hand, victim, caster)) + return + + log_combat(caster, victim, "cast the touch spell [name] on", hand) + spell_feedback() + remove_hand(caster) + +/** + * Calls do_secondary_hand_hit() from the caster onto the victim. + */ +/datum/action/cooldown/spell/touch/proc/do_secondary_hand_hit(obj/item/melee/touch_attack/hand, atom/victim, mob/living/carbon/caster) + var/secondary_result = cast_on_secondary_hand_hit(hand, victim, caster) + switch(secondary_result) + // Continue will remove the hand here and stop + if(SECONDARY_ATTACK_CONTINUE_CHAIN) + log_combat(caster, victim, "cast the touch spell [name] on", hand, "(secondary / alt cast)") + spell_feedback() + remove_hand(caster) + + // Call normal will call the normal cast proc + if(SECONDARY_ATTACK_CALL_NORMAL) + do_hand_hit(hand, victim, caster) + + // Cancel chain will do nothing, + if(SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) + return + +/** + * The actual process of casting the spell on the victim from the caster. + * + * Override / extend this to implement casting effects. + * Return TRUE on a successful cast to use up the hand (delete it) + * Return FALSE to do nothing and let them keep the hand in hand + */ +/datum/action/cooldown/spell/touch/proc/cast_on_hand_hit(obj/item/melee/touch_attack/hand, atom/victim, mob/living/carbon/caster) + return FALSE + +/** + * For any special casting effects done if the user right-clicks + * on touch spell instead of left-clicking + * + * Return SECONDARY_ATTACK_CALL_NORMAL to call the normal cast_on_hand_hit + * Return SECONDARY_ATTACK_CONTINUE_CHAIN to prevent the normal cast_on_hand_hit from calling, but still use up the hand + * Return SECONDARY_ATTACK_CANCEL_CHAIN to prevent the spell from being used + */ +/datum/action/cooldown/spell/touch/proc/cast_on_secondary_hand_hit(obj/item/melee/touch_attack/hand, atom/victim, mob/living/carbon/caster) + return SECONDARY_ATTACK_CALL_NORMAL + +/** + * Signal proc for [COMSIG_PARENT_QDELETING] from our attached hand. + * + * If our hand is deleted for a reason unrelated to our spell, + * unlink it (clear refs) and revert the cooldown + */ +/datum/action/cooldown/spell/touch/proc/on_hand_deleted(datum/source) + SIGNAL_HANDLER + + remove_hand(reset_cooldown_after = TRUE) + +/** + * Signal proc for [COMSIG_ITEM_DROPPED] from our attached hand. + * + * If our caster drops the hand, remove the hand / revert the cast + * Basically gives them an easy hotkey to lose their hand without needing to click the button + */ +/datum/action/cooldown/spell/touch/proc/on_hand_dropped(datum/source, mob/living/dropper) + SIGNAL_HANDLER + + remove_hand(dropper, reset_cooldown_after = TRUE) + +/obj/item/melee/touch_attack + name = "\improper outstretched hand" + desc = "High Five?" + icon = 'icons/obj/items_and_weapons.dmi' + lefthand_file = 'icons/mob/inhands/misc/touchspell_lefthand.dmi' + righthand_file = 'icons/mob/inhands/misc/touchspell_righthand.dmi' + icon_state = "latexballon" + inhand_icon_state = null + item_flags = NEEDS_PERMIT | ABSTRACT + w_class = WEIGHT_CLASS_HUGE + force = 0 + throwforce = 0 + throw_range = 0 + throw_speed = 0 + /// A weakref to what spell made us. + var/datum/weakref/spell_which_made_us + +/obj/item/melee/touch_attack/Initialize(mapload, datum/action/cooldown/spell/spell) + . = ..() + + if(spell) + spell_which_made_us = WEAKREF(spell) + +/obj/item/melee/touch_attack/attack(mob/target, mob/living/carbon/user) + if(!iscarbon(user)) //Look ma, no hands + return TRUE + if(!(user.mobility_flags & MOBILITY_USE)) + to_chat(user, span_warning("You can't reach out!")) + return TRUE + return ..() + +/** + * When the hand component of a touch spell is qdel'd, (the hand is dropped or otherwise lost), + * the cooldown on the spell that made it is automatically refunded. + * + * However, if you want to consume the hand and not give a cooldown, + * such as adding a unique behavior to the hand specifically, this function will do that. + */ +/obj/item/melee/touch_attack/mansus_fist/proc/remove_hand_with_no_refund(mob/holder) + var/datum/action/cooldown/spell/touch/hand_spell = spell_which_made_us?.resolve() + if(!QDELETED(hand_spell)) + hand_spell.remove_hand(holder, reset_cooldown_after = FALSE) + return + + // We have no spell associated for some reason, just delete us as normal. + holder.temporarilyRemoveItemFromInventory(src, force = TRUE) + qdel(src) diff --git a/code/modules/spells/spell_types/touch/duffelbag_curse.dm b/code/modules/spells/spell_types/touch/duffelbag_curse.dm new file mode 100644 index 00000000000000..0416350ca69242 --- /dev/null +++ b/code/modules/spells/spell_types/touch/duffelbag_curse.dm @@ -0,0 +1,87 @@ + +/datum/action/cooldown/spell/touch/duffelbag + name = "Bestow Cursed Duffel Bag" + desc = "A spell that summons a duffel bag demon on the target, slowing them down and slowly eating them." + button_icon_state = "duffelbag_curse" + sound = 'sound/magic/mm_hit.ogg' + + school = SCHOOL_CONJURATION + cooldown_time = 6 SECONDS + cooldown_reduction_per_rank = 1 SECONDS + + invocation = "HU'SWCH H'ANS!!" + spell_requirements = SPELL_REQUIRES_NO_ANTIMAGIC + + hand_path = /obj/item/melee/touch_attack/duffelbag + +/datum/action/cooldown/spell/touch/duffelbag/cast_on_hand_hit(obj/item/melee/touch_attack/hand, atom/victim, mob/living/carbon/caster) + if(!iscarbon(victim)) + return FALSE + + var/mob/living/carbon/duffel_victim = victim + var/static/list/elaborate_backstory = list( + "spacewar origin story", + "military background", + "corporate connections", + "life in the colonies", + "anti-government activities", + "upbringing on the space farm", + "fond memories with your buddy Keith", + ) + if(duffel_victim.can_block_magic(antimagic_flags)) + to_chat(caster, span_warning("The spell can't seem to affect [duffel_victim]!")) + to_chat(duffel_victim, span_warning("You really don't feel like talking about your [pick(elaborate_backstory)] with complete strangers today.")) + return TRUE + + // To get it started, stun and knockdown the person being hit + duffel_victim.flash_act() + duffel_victim.Immobilize(5 SECONDS) + duffel_victim.apply_damage(80, STAMINA) + duffel_victim.Knockdown(5 SECONDS) + + // If someone's already cursed, don't try to give them another + if(HAS_TRAIT(duffel_victim, TRAIT_DUFFEL_CURSE_PROOF)) + to_chat(caster, span_warning("The burden of [duffel_victim]'s duffel bag becomes too much, shoving them to the floor!")) + to_chat(duffel_victim, span_warning("The weight of this bag becomes overburdening!")) + return TRUE + + // However if they're uncursed, they're fresh for getting a cursed bag + var/obj/item/storage/backpack/duffelbag/cursed/conjured_duffel = new get_turf(victim) + duffel_victim.visible_message( + span_danger("A growling duffel bag appears on [duffel_victim]!"), + span_danger("You feel something attaching itself to you, and a strong desire to discuss your [pick(elaborate_backstory)] at length!"), + ) + + // This duffelbag is now cuuuurrrsseed! Equip it on them + ADD_TRAIT(conjured_duffel, TRAIT_DUFFEL_CURSE_PROOF, CURSED_ITEM_TRAIT(conjured_duffel.name)) + conjured_duffel.pickup(duffel_victim) + conjured_duffel.forceMove(duffel_victim) + + // Put it on their back first + if(duffel_victim.dropItemToGround(duffel_victim.back)) + duffel_victim.equip_to_slot_if_possible(conjured_duffel, ITEM_SLOT_BACK, TRUE, TRUE) + return TRUE + + // If the back equip failed, put it in their hands first + if(duffel_victim.put_in_hands(conjured_duffel)) + return TRUE + + // If they had no empty hands, try to put it in their inactive hand first + duffel_victim.dropItemToGround(duffel_victim.get_inactive_held_item()) + if(duffel_victim.put_in_hands(conjured_duffel)) + return TRUE + + // If their inactive hand couldn't be emptied or found, put it in their active hand + duffel_victim.dropItemToGround(duffel_victim.get_active_held_item()) + if(duffel_victim.put_in_hands(conjured_duffel)) + return TRUE + + // Well, we failed to give them the duffel bag, + // but technically we still stunned them so that's something + return TRUE + +/obj/item/melee/touch_attack/duffelbag + name = "\improper burdening touch" + desc = "Where is the bar from here?" + icon_state = "duffelcurse" + inhand_icon_state = "duffelcurse" diff --git a/code/modules/spells/spell_types/touch/flesh_to_stone.dm b/code/modules/spells/spell_types/touch/flesh_to_stone.dm new file mode 100644 index 00000000000000..c6693c7c904e38 --- /dev/null +++ b/code/modules/spells/spell_types/touch/flesh_to_stone.dm @@ -0,0 +1,33 @@ +/datum/action/cooldown/spell/touch/flesh_to_stone + name = "Flesh to Stone" + desc = "This spell charges your hand with the power to turn victims into inert statues for a long period of time." + button_icon_state = "statue" + sound = 'sound/magic/fleshtostone.ogg' + + school = SCHOOL_TRANSMUTATION + cooldown_time = 1 MINUTES + cooldown_reduction_per_rank = 10 SECONDS + + invocation = "STAUN EI!!" + + hand_path = /obj/item/melee/touch_attack/flesh_to_stone + +/datum/action/cooldown/spell/touch/flesh_to_stone/cast_on_hand_hit(obj/item/melee/touch_attack/hand, atom/victim, mob/living/carbon/caster) + if(!isliving(victim)) + return FALSE + + var/mob/living/living_victim = victim + if(living_victim.can_block_magic(antimagic_flags)) + to_chat(caster, span_warning("The spell can't seem to affect [victim]!")) + to_chat(victim, span_warning("You feel your flesh turn to stone for a moment, then revert back!")) + return TRUE + + living_victim.Stun(4 SECONDS) + living_victim.petrify() + return TRUE + +/obj/item/melee/touch_attack/flesh_to_stone + name = "\improper petrifying touch" + desc = "That's the bottom line, because flesh to stone said so!" + icon_state = "fleshtostone" + inhand_icon_state = "fleshtostone" diff --git a/code/modules/spells/spell_types/touch/smite.dm b/code/modules/spells/spell_types/touch/smite.dm new file mode 100644 index 00000000000000..d39ddb3e30ce4d --- /dev/null +++ b/code/modules/spells/spell_types/touch/smite.dm @@ -0,0 +1,55 @@ +/datum/action/cooldown/spell/touch/smite + name = "Smite" + desc = "This spell charges your hand with an unholy energy \ + that can be used to cause a touched victim to violently explode." + button_icon_state = "gib" + sound = 'sound/magic/disintegrate.ogg' + + school = SCHOOL_EVOCATION + cooldown_time = 1 MINUTES + cooldown_reduction_per_rank = 10 SECONDS + + invocation = "EI NATH!!" + sparks_amt = 4 + + hand_path = /obj/item/melee/touch_attack/smite + +/datum/action/cooldown/spell/touch/smite/cast_on_hand_hit(obj/item/melee/touch_attack/hand, atom/victim, mob/living/carbon/caster) + if(!isliving(victim)) + return FALSE + + do_sparks(sparks_amt, FALSE, get_turf(victim)) + for(var/mob/living/nearby_spectator in view(caster, 7)) + if(nearby_spectator == caster) + continue + nearby_spectator.flash_act(affect_silicon = FALSE) + + var/mob/living/living_victim = victim + if(living_victim.can_block_magic(antimagic_flags)) + caster.visible_message( + span_warning("The feedback blows [caster]'s arm off!"), + span_userdanger("The spell bounces from [living_victim]'s skin back into your arm!"), + ) + caster.flash_act() + var/obj/item/bodypart/to_dismember = caster.get_holding_bodypart_of_item(hand) + to_dismember?.dismember() + return TRUE + + if(ishuman(victim)) + var/mob/living/carbon/human/human_victim = victim + var/obj/item/clothing/suit/worn_suit = human_victim.wear_suit + if(istype(worn_suit, /obj/item/clothing/suit/hooded/bloated_human)) + human_victim.visible_message(span_danger("[victim]'s [worn_suit] explodes off of them into a puddle of gore!")) + human_victim.dropItemToGround(worn_suit) + qdel(worn_suit) + new /obj/effect/gibspawner(get_turf(victim)) + return TRUE + + living_victim.gib() + return TRUE + +/obj/item/melee/touch_attack/smite + name = "\improper smiting touch" + desc = "This hand of mine glows with an awesome power!" + icon_state = "disintegrate" + inhand_icon_state = "disintegrate" diff --git a/code/modules/spells/spell_types/touch_attacks.dm b/code/modules/spells/spell_types/touch_attacks.dm deleted file mode 100644 index 6267706074fb20..00000000000000 --- a/code/modules/spells/spell_types/touch_attacks.dm +++ /dev/null @@ -1,96 +0,0 @@ -/obj/effect/proc_holder/spell/targeted/touch - var/hand_path = /obj/item/melee/touch_attack - var/obj/item/melee/touch_attack/attached_hand = null - var/drawmessage = "You channel the power of the spell to your hand." - var/dropmessage = "You draw the power out of your hand." - invocation_type = INVOCATION_NONE //you scream on connecting, not summoning - include_user = TRUE - range = -1 - -/obj/effect/proc_holder/spell/targeted/touch/Destroy() - remove_hand() - if(action?.owner) - var/mob/guy_who_needs_to_know = action.owner - to_chat(guy_who_needs_to_know, span_notice("The power of the spell dissipates from your hand.")) - return ..() - -/obj/effect/proc_holder/spell/targeted/touch/proc/remove_hand(recharge = FALSE) - QDEL_NULL(attached_hand) - if(recharge) - charge_counter = charge_max - -/obj/effect/proc_holder/spell/targeted/touch/proc/on_hand_destroy(obj/item/melee/touch_attack/hand) - if(hand != attached_hand) - CRASH("Incorrect touch spell hand.") - //Start recharging. - attached_hand = null - recharging = TRUE - action.UpdateButtons() - -/obj/effect/proc_holder/spell/targeted/touch/cast(list/targets,mob/user = usr) - if(!QDELETED(attached_hand)) - remove_hand(TRUE) - to_chat(user, span_notice("[dropmessage]")) - return - - for(var/mob/living/carbon/C in targets) - if(!attached_hand) - if(ChargeHand(C)) - recharging = FALSE - return - -/obj/effect/proc_holder/spell/targeted/touch/charge_check(mob/user,silent = FALSE) - if(!QDELETED(attached_hand)) //Charge doesn't matter when putting the hand away. - return TRUE - else - return ..() - -/obj/effect/proc_holder/spell/targeted/touch/proc/ChargeHand(mob/living/carbon/user) - attached_hand = new hand_path(src) - attached_hand.attached_spell = src - if(!user.put_in_hands(attached_hand)) - remove_hand(TRUE) - if (user.usable_hands == 0) - to_chat(user, span_warning("You dont have any usable hands!")) - else - to_chat(user, span_warning("Your hands are full!")) - return FALSE - to_chat(user, span_notice("[drawmessage]")) - return TRUE - - -/obj/effect/proc_holder/spell/targeted/touch/disintegrate - name = "Smite" - desc = "This spell charges your hand with an unholy energy that can be used to cause a touched victim to violently explode." - hand_path = /obj/item/melee/touch_attack/disintegrate - - school = SCHOOL_EVOCATION - charge_max = 600 - clothes_req = TRUE - cooldown_min = 200 //100 deciseconds reduction per rank - - action_icon_state = "gib" - -/obj/effect/proc_holder/spell/targeted/touch/flesh_to_stone - name = "Flesh to Stone" - desc = "This spell charges your hand with the power to turn victims into inert statues for a long period of time." - hand_path = /obj/item/melee/touch_attack/fleshtostone - - school = SCHOOL_TRANSMUTATION - charge_max = 600 - clothes_req = TRUE - cooldown_min = 200 //100 deciseconds reduction per rank - - action_icon_state = "statue" - sound = 'sound/magic/fleshtostone.ogg' - -/obj/effect/proc_holder/spell/targeted/touch/duffelbag - name = "Bestow Cursed Duffel Bag" - desc = "A spell that summons a duffel bag demon on the target, slowing them down and slowly eating them." - hand_path = /obj/item/melee/touch_attack/duffelbag - action_icon_state = "duffelbag_curse" - - school = SCHOOL_CONJURATION - charge_max = 60 - clothes_req = FALSE - cooldown_min = 20 diff --git a/code/modules/spells/spell_types/trigger.dm b/code/modules/spells/spell_types/trigger.dm deleted file mode 100644 index c13c96686c6df5..00000000000000 --- a/code/modules/spells/spell_types/trigger.dm +++ /dev/null @@ -1,26 +0,0 @@ -/obj/effect/proc_holder/spell/pointed/trigger - name = "Trigger" - desc = "This spell triggers another spell or a few." - var/list/linked_spells = list() //those are just referenced by the trigger spell and are unaffected by it directly - var/list/starting_spells = list() //those are added on New() to contents from default spells and are deleted when the trigger spell is deleted to prevent memory leaks - -/obj/effect/proc_holder/spell/pointed/trigger/Initialize(mapload) - . = ..() - for(var/spell in starting_spells) - var/spell_to_add = text2path(spell) - new spell_to_add(src) //should result in adding to contents, needs testing - -/obj/effect/proc_holder/spell/pointed/trigger/Destroy() - for(var/spell in contents) - qdel(spell) - linked_spells = null - starting_spells = null - return ..() - -/obj/effect/proc_holder/spell/pointed/trigger/cast(list/targets, mob/user = usr) - playMagSound() - for(var/mob/living/target in targets) - for(var/obj/effect/proc_holder/spell/spell in contents) - spell.perform(list(target),0) - for(var/obj/effect/proc_holder/spell/spell in linked_spells) - spell.perform(list(target),0) diff --git a/code/modules/spells/spell_types/turf_teleport.dm b/code/modules/spells/spell_types/turf_teleport.dm deleted file mode 100644 index d1c4813bc6765c..00000000000000 --- a/code/modules/spells/spell_types/turf_teleport.dm +++ /dev/null @@ -1,46 +0,0 @@ -/obj/effect/proc_holder/spell/targeted/turf_teleport - name = "Turf Teleport" - desc = "This spell teleports the target to the turf in range." - nonabstract_req = TRUE - - school = SCHOOL_TRANSLOCATION - - var/inner_tele_radius = 1 - var/outer_tele_radius = 2 - - var/include_space = FALSE //whether it includes space tiles in possible teleport locations - var/include_dense = FALSE //whether it includes dense tiles in possible teleport locations - var/sound1 = 'sound/weapons/zapbang.ogg' - var/sound2 = 'sound/weapons/zapbang.ogg' - -/obj/effect/proc_holder/spell/targeted/turf_teleport/cast(list/targets,mob/user = usr) - playsound(get_turf(user), sound1, 50,TRUE) - for(var/mob/living/target in targets) - var/list/turfs = new/list() - for(var/turf/T as anything in RANGE_TURFS(outer_tele_radius, target)) - if(T in RANGE_TURFS(inner_tele_radius, target)) - continue - if(isspaceturf(T) && !include_space) - continue - if(T.density && !include_dense) - continue - if(T.x>world.maxx-outer_tele_radius || T.xworld.maxy-outer_tele_radius || T.y 3) + log_tgui(user, "Error: TGUI Alert initiated with too many buttons. Use a list.", "TguiAlert") + return tgui_input_list(user, message, title, buttons, timeout, autofocus) + // Client does NOT have tgui_input on: Returns regular input + if(!user.client.prefs.read_preference(/datum/preference/toggle/tgui_input)) + if(length(buttons) == 2) + return alert(user, message, title, buttons[1], buttons[2]) + if(length(buttons) == 3) + return alert(user, message, title, buttons[1], buttons[2], buttons[3]) + var/datum/tgui_alert/alert = new(user, message, title, buttons, timeout, autofocus) + alert.ui_interact(user) + alert.wait() + if (alert) + . = alert.choice + qdel(alert) + +/** + * # tgui_alert + * + * Datum used for instantiating and using a TGUI-controlled modal that prompts the user with + * a message and has buttons for responses. + */ +/datum/tgui_alert + /// The title of the TGUI window + var/title + /// The textual body of the TGUI window + var/message + /// The list of buttons (responses) provided on the TGUI window + var/list/buttons + /// The button that the user has pressed, null if no selection has been made + var/choice + /// The time at which the tgui_alert was created, for displaying timeout progress. + var/start_time + /// The lifespan of the tgui_alert, after which the window will close and delete itself. + var/timeout + /// The bool that controls if this modal should grab window focus + var/autofocus + /// Boolean field describing if the tgui_alert was closed by the user. + var/closed + +/datum/tgui_alert/New(mob/user, message, title, list/buttons, timeout, autofocus) + src.autofocus = autofocus + src.buttons = buttons.Copy() + src.message = message + src.title = title + if (timeout) + src.timeout = timeout + start_time = world.time + QDEL_IN(src, timeout) + +/datum/tgui_alert/Destroy(force, ...) + SStgui.close_uis(src) + QDEL_NULL(buttons) + return ..() + +/** + * Waits for a user's response to the tgui_alert's prompt before returning. Returns early if + * the window was closed by the user. + */ +/datum/tgui_alert/proc/wait() + while (!choice && !closed && !QDELETED(src)) + stoplag(1) + +/datum/tgui_alert/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "AlertModal") + ui.open() + +/datum/tgui_alert/ui_close(mob/user) + . = ..() + closed = TRUE + +/datum/tgui_alert/ui_state(mob/user) + return GLOB.always_state + +/datum/tgui_alert/ui_static_data(mob/user) + var/list/data = list() + data["autofocus"] = autofocus + data["buttons"] = buttons + data["message"] = message + data["large_buttons"] = user.client.prefs.read_preference(/datum/preference/toggle/tgui_input_large) + data["swapped_buttons"] = user.client.prefs.read_preference(/datum/preference/toggle/tgui_input_swapped) + data["title"] = title + return data + +/datum/tgui_alert/ui_data(mob/user) + var/list/data = list() + if(timeout) + data["timeout"] = CLAMP01((timeout - (world.time - start_time) - 1 SECONDS) / (timeout - 1 SECONDS)) + return data + +/datum/tgui_alert/ui_act(action, list/params) + . = ..() + if (.) + return + switch(action) + if("choose") + if (!(params["choice"] in buttons)) + CRASH("[usr] entered a non-existent button choice: [params["choice"]]") + set_choice(params["choice"]) + closed = TRUE + SStgui.close_uis(src) + return TRUE + if("cancel") + closed = TRUE + SStgui.close_uis(src) + return TRUE + +/datum/tgui_alert/proc/set_choice(choice) + src.choice = choice diff --git a/code/modules/tgui/tgui_input_list.dm b/code/modules/tgui_input/list.dm similarity index 61% rename from code/modules/tgui/tgui_input_list.dm rename to code/modules/tgui_input/list.dm index 8a38ec768b8d59..abac3ec43561bb 100644 --- a/code/modules/tgui/tgui_input_list.dm +++ b/code/modules/tgui_input/list.dm @@ -31,36 +31,6 @@ . = input.choice qdel(input) -/** - * Creates an asynchronous TGUI input list window with an associated callback. - * - * This proc should be used to create inputs that invoke a callback with the user's chosen option. - * Arguments: - * * user - The user to show the input box to. - * * message - The content of the input box, shown in the body of the TGUI window. - * * title - The title of the input box, shown on the top of the TGUI window. - * * items - The options that can be chosen by the user, each string is assigned a button on the UI. - * * default - If an option is already preselected on the UI. Current values, etc. - * * callback - The callback to be invoked when a choice is made. - * * timeout - The timeout of the input box, after which the menu will close and qdel itself. Set to zero for no timeout. - */ -/proc/tgui_input_list_async(mob/user, message, title = "Select", list/items, default, datum/callback/callback, timeout = 60 SECONDS) - if (!user) - user = usr - if(!length(items)) - return - if (!istype(user)) - if (istype(user, /client)) - var/client/client = user - user = client.mob - else - return - /// Client does NOT have tgui_input on: Returns regular input - if(!user.client.prefs.read_preference(/datum/preference/toggle/tgui_input)) - return input(user, message, title) as null|anything in items - var/datum/tgui_list_input/async/input = new(user, message, title, items, default, callback, timeout) - input.ui_interact(user) - /** * # tgui_list_input * @@ -94,22 +64,16 @@ src.items_map = list() src.default = default var/list/repeat_items = list() - // Gets rid of illegal characters var/static/regex/whitelistedWords = regex(@{"([^\u0020-\u8000]+)"}) - for(var/i in items) if(!i) continue - var/string_key = whitelistedWords.Replace("[i]", "") - //avoids duplicated keys E.g: when areas have the same name string_key = avoid_assoc_duplicate_keys(string_key, repeat_items) - src.items += string_key src.items_map[string_key] = i - if (timeout) src.timeout = timeout start_time = world.time @@ -118,7 +82,7 @@ /datum/tgui_list_input/Destroy(force, ...) SStgui.close_uis(src) QDEL_NULL(items) - . = ..() + return ..() /** * Waits for a user's response to the tgui_list_input's prompt before returning. Returns early if @@ -142,18 +106,20 @@ return GLOB.always_state /datum/tgui_list_input/ui_static_data(mob/user) - . = list() - .["init_value"] = default || items[1] - .["items"] = items - .["large_buttons"] = user.client.prefs.read_preference(/datum/preference/toggle/tgui_input_large) - .["message"] = message - .["swapped_buttons"] = user.client.prefs.read_preference(/datum/preference/toggle/tgui_input_swapped) - .["title"] = title + var/list/data = list() + data["init_value"] = default || items[1] + data["items"] = items + data["large_buttons"] = user.client.prefs.read_preference(/datum/preference/toggle/tgui_input_large) + data["message"] = message + data["swapped_buttons"] = user.client.prefs.read_preference(/datum/preference/toggle/tgui_input_swapped) + data["title"] = title + return data /datum/tgui_list_input/ui_data(mob/user) - . = list() + var/list/data = list() if(timeout) - .["timeout"] = clamp((timeout - (world.time - start_time) - 1 SECONDS) / (timeout - 1 SECONDS), 0, 1) + data["timeout"] = clamp((timeout - (world.time - start_time) - 1 SECONDS) / (timeout - 1 SECONDS), 0, 1) + return data /datum/tgui_list_input/ui_act(action, list/params) . = ..() @@ -174,28 +140,3 @@ /datum/tgui_list_input/proc/set_choice(choice) src.choice = choice - -/** - * # async tgui_list_input - * - * An asynchronous version of tgui_list_input to be used with callbacks instead of waiting on user responses. - */ -/datum/tgui_list_input/async - /// The callback to be invoked by the tgui_list_input upon having a choice made. - var/datum/callback/callback - -/datum/tgui_list_input/async/New(mob/user, message, title, list/items, default, callback, timeout) - ..(user, message, title, items, default, timeout) - src.callback = callback - -/datum/tgui_list_input/async/Destroy(force, ...) - QDEL_NULL(callback) - . = ..() - -/datum/tgui_list_input/async/set_choice(choice) - . = ..() - if(!isnull(src.choice)) - callback?.InvokeAsync(src.choice) - -/datum/tgui_list_input/async/wait() - return diff --git a/code/modules/tgui/tgui_input_number.dm b/code/modules/tgui_input/number.dm similarity index 61% rename from code/modules/tgui/tgui_input_number.dm rename to code/modules/tgui_input/number.dm index 9bf1981d2fc487..81964597df7d97 100644 --- a/code/modules/tgui/tgui_input_number.dm +++ b/code/modules/tgui_input/number.dm @@ -35,38 +35,6 @@ . = number_input.entry qdel(number_input) -/** - * Creates an asynchronous TGUI number input window with an associated callback. - * - * This proc should be used to create number inputs that invoke a callback with the user's entry. - * - * Arguments: - * * user - The user to show the number input to. - * * message - The content of the number input, shown in the body of the TGUI window. - * * title - The title of the number input modal, shown on the top of the TGUI window. - * * default - The default (or current) value, shown as a placeholder. Users can press refresh with this. - * * max_value - Specifies a maximum value. If none is set, any number can be entered. Pressing "max" defaults to 1000. - * * min_value - Specifies a minimum value. Often 0. - * * callback - The callback to be invoked when a choice is made. - * * timeout - The timeout of the number input, after which the modal will close and qdel itself. Set to zero for no timeout. - * * round_value - whether the inputted number is rounded down into an integer. - */ -/proc/tgui_input_number_async(mob/user, message, title = "Number Input", default = 0, max_value = 10000, min_value = 0, datum/callback/callback, timeout = 60 SECONDS, round_value = TRUE) - if (!user) - user = usr - if (!istype(user)) - if (istype(user, /client)) - var/client/client = user - user = client.mob - else - return - // Client does NOT have tgui_input on: Returns regular input - if(!user.client.prefs.read_preference(/datum/preference/toggle/tgui_input)) - var/input_number = input(user, message, title, default) as null|num - return clamp(round_value ? round(input_number) : input_number, min_value, max_value) - var/datum/tgui_input_number/async/number_input = new(user, message, title, default, max_value, min_value, callback, timeout, round_value) - number_input.ui_interact(user) - /** * # tgui_input_number * @@ -86,15 +54,14 @@ var/message /// The minimum value that can be entered. var/min_value + /// Whether the submitted number is rounded down into an integer. + var/round_value /// The time at which the number input was created, for displaying timeout progress. var/start_time /// The lifespan of the number input, after which the window will close and delete itself. var/timeout /// The title of the TGUI window var/title - /// Whether the submitted number is rounded down into an integer. - var/round_value - /datum/tgui_input_number/New(mob/user, message, title, default, max_value, min_value, timeout, round_value) src.default = default @@ -120,7 +87,7 @@ /datum/tgui_input_number/Destroy(force, ...) SStgui.close_uis(src) - . = ..() + return ..() /** * Waits for a user's response to the tgui_input_number's prompt before returning. Returns early if @@ -144,19 +111,21 @@ return GLOB.always_state /datum/tgui_input_number/ui_static_data(mob/user) - . = list() - .["init_value"] = default // Default is a reserved keyword - .["large_buttons"] = user.client.prefs.read_preference(/datum/preference/toggle/tgui_input_large) - .["max_value"] = max_value - .["message"] = message - .["min_value"] = min_value - .["swapped_buttons"] = user.client.prefs.read_preference(/datum/preference/toggle/tgui_input_swapped) - .["title"] = title + var/list/data = list() + data["init_value"] = default // Default is a reserved keyword + data["large_buttons"] = user.client.prefs.read_preference(/datum/preference/toggle/tgui_input_large) + data["max_value"] = max_value + data["message"] = message + data["min_value"] = min_value + data["swapped_buttons"] = user.client.prefs.read_preference(/datum/preference/toggle/tgui_input_swapped) + data["title"] = title + return data /datum/tgui_input_number/ui_data(mob/user) - . = list() + var/list/data = list() if(timeout) - .["timeout"] = CLAMP01((timeout - (world.time - start_time) - 1 SECONDS) / (timeout - 1 SECONDS)) + data["timeout"] = CLAMP01((timeout - (world.time - start_time) - 1 SECONDS) / (timeout - 1 SECONDS)) + return data /datum/tgui_input_number/ui_act(action, list/params) . = ..() @@ -181,29 +150,4 @@ return TRUE /datum/tgui_input_number/proc/set_entry(entry) - src.entry = entry - -/** - * # async tgui_input_number - * - * An asynchronous version of tgui_input_number to be used with callbacks instead of waiting on user responses. - */ -/datum/tgui_input_number/async - /// The callback to be invoked by the tgui_input_number upon having a choice made. - var/datum/callback/callback - -/datum/tgui_input_number/async/New(mob/user, message, title, default, max_value, min_value, callback, timeout) - ..(user, message, title, default, max_value, min_value, timeout) - src.callback = callback - -/datum/tgui_input_number/async/Destroy(force, ...) - QDEL_NULL(callback) - . = ..() - -/datum/tgui_input_number/async/set_entry(entry) - . = ..() - if(!isnull(src.entry)) - callback?.InvokeAsync(src.entry) - -/datum/tgui_input_number/async/wait() - return + src.entry = entry diff --git a/code/modules/tgui_input/say_modal/modal.dm b/code/modules/tgui_input/say_modal/modal.dm new file mode 100644 index 00000000000000..e1012238357264 --- /dev/null +++ b/code/modules/tgui_input/say_modal/modal.dm @@ -0,0 +1,133 @@ +/** Assigned say modal of the client */ +/client/var/datum/tgui_say/tgui_say + +/** + * Creates a JSON encoded message to open TGUI say modals properly. + * + * Arguments: + * channel - The channel to open the modal in. + * Returns: + * string - A JSON encoded message to open the modal. + */ +/client/proc/tgui_say_create_open_command(channel) + var/message = TGUI_CREATE_MESSAGE("open", list( + channel = channel, + )) + return "\".output tgui_say.browser:update [message]\"" + +/** + * The tgui say modal. This initializes an input window which hides until + * the user presses one of the speech hotkeys. Once something is entered, it will + * delegate the speech to the proper channel. + */ +/datum/tgui_say + /// The user who opened the window + var/client/client + /// Injury phrases to blurt out + var/list/hurt_phrases = list("GACK!", "GLORF!", "OOF!", "AUGH!", "OW!", "URGH!", "HRNK!") + /// Max message length + var/max_length = MAX_MESSAGE_LEN + /// The modal window + var/datum/tgui_window/window + /// Boolean for whether the tgui_say was opened by the user. + var/window_open + +/** Creates the new input window to exist in the background. */ +/datum/tgui_say/New(client/client, id) + src.client = client + window = new(client, id) + window.subscribe(src, .proc/on_message) + window.is_browser = TRUE + +/** + * After a brief period, injects the scripts into + * the window to listen for open commands. + */ +/datum/tgui_say/proc/initialize() + set waitfor = FALSE + // Sleep to defer initialization to after client constructor + sleep(3 SECONDS) + window.initialize( + strict_mode = TRUE, + fancy = TRUE, + inline_css = file("tgui/public/tgui-say.bundle.css"), + inline_js = file("tgui/public/tgui-say.bundle.js"), + ); + +/** + * Ensures nothing funny is going on window load. + * Minimizes the window, sets max length, closes all + * typing and thinking indicators. This is triggered + * as soon as the window sends the "ready" message. + */ +/datum/tgui_say/proc/load() + window_open = FALSE + winshow(client, "tgui_say", FALSE) + window.send_message("props", list( + lightMode = client.prefs?.read_preference(/datum/preference/toggle/tgui_say_light_mode), + maxLength = max_length, + )) + stop_thinking() + return TRUE + +/** + * Sets the window as "opened" server side, though it is already + * visible to the user. We do this to set local vars & + * start typing (if enabled and in an IC channel). Logs the event. + * + * Arguments: + * payload - A list containing the channel the window was opened in. + */ +/datum/tgui_say/proc/open(payload) + if(!payload?["channel"]) + CRASH("No channel provided to an open TGUI-Say") + window_open = TRUE + if(payload["channel"] != OOC_CHANNEL) + start_thinking() + if(client.typing_indicators) + log_speech_indicators("[key_name(client)] started typing at [loc_name(client.mob)], indicators enabled.") + else + log_speech_indicators("[key_name(client)] started typing at [loc_name(client.mob)], indicators DISABLED.") + return TRUE + +/** + * Closes the window serverside. Closes any open chat bubbles + * regardless of preference. Logs the event. + */ +/datum/tgui_say/proc/close() + window_open = FALSE + stop_thinking() + if(client.typing_indicators) + log_speech_indicators("[key_name(client)] stopped typing at [loc_name(client.mob)], indicators enabled.") + else + log_speech_indicators("[key_name(client)] stopped typing at [loc_name(client.mob)], indicators DISABLED.") + +/** + * The equivalent of ui_act, this waits on messages from the window + * and delegates actions. + */ +/datum/tgui_say/proc/on_message(type, payload) + if(type == "ready") + load() + return TRUE + if (type == "open") + open(payload) + return TRUE + if (type == "close") + close() + return TRUE + if (type == "thinking") + if(payload["mode"] == TRUE) + start_thinking() + return TRUE + if(payload["mode"] == FALSE) + stop_thinking() + return TRUE + return FALSE + if (type == "typing") + start_typing() + return TRUE + if (type == "entry" || type == "force") + handle_entry(type, payload) + return TRUE + return FALSE diff --git a/code/modules/tgui_input/say_modal/speech.dm b/code/modules/tgui_input/say_modal/speech.dm new file mode 100644 index 00000000000000..bf357133a7d556 --- /dev/null +++ b/code/modules/tgui_input/say_modal/speech.dm @@ -0,0 +1,92 @@ +/** + * Alters text when players are injured. + * Adds text, trims left and right side + * + * Arguments: + * payload - a string list containing entry & channel + * Returns: + * string - the altered entry + */ +/datum/tgui_say/proc/alter_entry(payload) + var/entry = payload["entry"] + /// No OOC leaks + if(!entry || payload["channel"] == OOC_CHANNEL || payload["channel"] == ME_CHANNEL) + return pick(hurt_phrases) + /// Random trimming for larger sentences + if(length(entry) > 50) + entry = trim(entry, rand(40, 50)) + else + /// Otherwise limit trim to just last letter + if(length(entry) > 1) + entry = trim(entry, length(entry)) + return entry + "-" + pick(hurt_phrases) + +/** + * Delegates the speech to the proper channel. + * + * Arguments: + * entry - the text to broadcast + * channel - the channel to broadcast in + * Returns: + * boolean - on success or failure + */ +/datum/tgui_say/proc/delegate_speech(entry, channel) + switch(channel) + if(SAY_CHANNEL) + client.mob.say_verb(entry) + return TRUE + if(RADIO_CHANNEL) + client.mob.say_verb(";" + entry) + return TRUE + if(ME_CHANNEL) + client.mob.me_verb(entry) + return TRUE + if(OOC_CHANNEL) + client.ooc(entry) + return TRUE + return FALSE + +/** + * Force say handler. + * Sends a message to the say modal to send its current value. + */ +/datum/tgui_say/proc/force_say() + window.send_message("force") + stop_typing() + +/** + * Makes the player force say what's in their current input box. + */ +/mob/living/carbon/human/proc/force_say() + if(stat != CONSCIOUS || !client?.tgui_say?.window_open) + return FALSE + client.tgui_say.force_say() + if(client.typing_indicators) + log_speech_indicators("[key_name(client)] FORCED to stop typing, indicators enabled.") + else + log_speech_indicators("[key_name(client)] FORCED to stop typing, indicators DISABLED.") + +/** + * Handles text entry and forced speech. + * + * Arguments: + * type - a string "entry" or "force" based on how this function is called + * payload - a string list containing entry & channel + * Returns: + * boolean - success or failure + */ +/datum/tgui_say/proc/handle_entry(type, payload) + if(!payload?["channel"] || !payload["entry"]) + CRASH("[usr] entered in a null payload to the chat window.") + if(length(payload["entry"]) > max_length) + CRASH("[usr] has entered more characters than allowed into a TGUI-Say") + if(type == "entry") + delegate_speech(payload["entry"], payload["channel"]) + return TRUE + if(type == "force") + var/target_channel = payload["channel"] + if(target_channel == ME_CHANNEL || target_channel == OOC_CHANNEL) + target_channel = SAY_CHANNEL // No ooc leaks + delegate_speech(alter_entry(payload), target_channel) + return TRUE + return FALSE diff --git a/code/modules/tgui_input/say_modal/typing.dm b/code/modules/tgui_input/say_modal/typing.dm new file mode 100644 index 00000000000000..60de7199b8f28a --- /dev/null +++ b/code/modules/tgui_input/say_modal/typing.dm @@ -0,0 +1,111 @@ +/// Thinking +GLOBAL_DATUM_INIT(thinking_indicator, /mutable_appearance, mutable_appearance('icons/mob/talk.dmi', "default3", TYPING_LAYER)) +/// Typing +GLOBAL_DATUM_INIT(typing_indicator, /mutable_appearance, mutable_appearance('icons/mob/talk.dmi', "default0", TYPING_LAYER)) + + +/** Creates a thinking indicator over the mob. */ +/mob/proc/create_thinking_indicator() + return + +/** Removes the thinking indicator over the mob. */ +/mob/proc/remove_thinking_indicator() + return + +/** Creates a typing indicator over the mob. */ +/mob/proc/create_typing_indicator() + return + +/** Removes the typing indicator over the mob. */ +/mob/proc/remove_typing_indicator() + return + +/** Removes any indicators and marks the mob as not speaking IC. */ +/mob/proc/remove_all_indicators() + return + +/mob/set_stat(new_stat) + . = ..() + if(.) + remove_all_indicators() + +/mob/Logout() + remove_all_indicators() + return ..() + +/// Whether or not to show a typing indicator when speaking. Defaults to on. +/datum/preference/toggle/typing_indicator + category = PREFERENCE_CATEGORY_GAME_PREFERENCES + savefile_key = "typingIndicator" + savefile_identifier = PREFERENCE_PLAYER + +/datum/preference/toggle/typing_indicator/apply_to_client(client/client, value) + client?.typing_indicators = value + +/** Sets the mob as "thinking" - with indicator and variable thinking_IC */ +/datum/tgui_say/proc/start_thinking() + if(!window_open || !client.typing_indicators) + return FALSE + /// Special exemptions + if(isabductor(client.mob)) + return FALSE + client.mob.thinking_IC = TRUE + client.mob.create_thinking_indicator() + +/** Removes typing/thinking indicators and flags the mob as not thinking */ +/datum/tgui_say/proc/stop_thinking() + client.mob?.remove_all_indicators() + +/** + * Handles the user typing. After a brief period of inactivity, + * signals the client mob to revert to the "thinking" icon. + */ +/datum/tgui_say/proc/start_typing() + client.mob.remove_thinking_indicator() + if(!window_open || !client.typing_indicators || !client.mob.thinking_IC) + return FALSE + client.mob.create_typing_indicator() + addtimer(CALLBACK(src, .proc/stop_typing), 5 SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE | TIMER_STOPPABLE) + +/** + * Callback to remove the typing indicator after a brief period of inactivity. + * If the user was typing IC, the thinking indicator is shown. + */ +/datum/tgui_say/proc/stop_typing() + if(!client?.mob) + return FALSE + client.mob.remove_typing_indicator() + if(!window_open || !client.typing_indicators || !client.mob.thinking_IC) + return FALSE + client.mob.create_thinking_indicator() + +/// Overrides for overlay creation +/mob/living/create_thinking_indicator() + if(thinking_indicator || typing_indicator || !thinking_IC || stat != CONSCIOUS ) + return FALSE + add_overlay(GLOB.thinking_indicator) + thinking_indicator = TRUE + +/mob/living/remove_thinking_indicator() + if(!thinking_indicator) + return FALSE + cut_overlay(GLOB.thinking_indicator) + thinking_indicator = FALSE + +/mob/living/create_typing_indicator() + if(typing_indicator || thinking_indicator || !thinking_IC || stat != CONSCIOUS) + return FALSE + add_overlay(GLOB.typing_indicator) + typing_indicator = TRUE + +/mob/living/remove_typing_indicator() + if(!typing_indicator) + return FALSE + cut_overlay(GLOB.typing_indicator) + typing_indicator = FALSE + +/mob/living/remove_all_indicators() + thinking_IC = FALSE + remove_thinking_indicator() + remove_typing_indicator() + diff --git a/code/modules/tgui/tgui_input_text.dm b/code/modules/tgui_input/text.dm similarity index 59% rename from code/modules/tgui/tgui_input_text.dm rename to code/modules/tgui_input/text.dm index 62a5efeff8c271..1571ad6b55226b 100644 --- a/code/modules/tgui/tgui_input_text.dm +++ b/code/modules/tgui_input/text.dm @@ -44,45 +44,7 @@ qdel(text_input) /** - * Creates an asynchronous TGUI text input window with an associated callback. - * - * This proc should be used to create text inputs that invoke a callback with the user's entry. - * Arguments: - * * user - The user to show the text input to. - * * message - The content of the text input, shown in the body of the TGUI window. - * * title - The title of the text input modal, shown on the top of the TGUI window. - * * default - The default (or current) value, shown as a placeholder. - * * max_length - Specifies a max length for input. - * * multiline - Bool that determines if the input box is much larger. Good for large messages, laws, etc. - * * encode - If toggled, input is filtered via html_encode. Setting this to FALSE gives raw input. - * * callback - The callback to be invoked when a choice is made. - */ -/proc/tgui_input_text_async(mob/user, message = "", title = "Text Input", default, max_length = MAX_MESSAGE_LEN, multiline = FALSE, encode = TRUE, datum/callback/callback, timeout = 60 SECONDS) - if (!user) - user = usr - if (!istype(user)) - if (istype(user, /client)) - var/client/client = user - user = client.mob - else - return - // Client does NOT have tgui_input on: Returns regular input - if(!user.client.prefs.read_preference(/datum/preference/toggle/tgui_input)) - if(encode) - if(multiline) - return stripped_multiline_input(user, message, title, default, max_length) - else - return stripped_input(user, message, title, default, max_length) - else - if(multiline) - return input(user, message, title, default) as message|null - else - return input(user, message, title, default) as text|null - var/datum/tgui_input_text/async/text_input = new(user, message, title, default, max_length, multiline, encode, callback, timeout) - text_input.ui_interact(user) - -/** - * # tgui_input_text + * tgui_input_text * * Datum used for instantiating and using a TGUI-controlled text input that prompts the user with * a message and has an input for text entry. @@ -109,7 +71,6 @@ /// The title of the TGUI window var/title - /datum/tgui_input_text/New(mob/user, message, title, default, max_length, multiline, encode, timeout) src.default = default src.encode = encode @@ -124,7 +85,7 @@ /datum/tgui_input_text/Destroy(force, ...) SStgui.close_uis(src) - . = ..() + return ..() /** * Waits for a user's response to the tgui_input_text's prompt before returning. Returns early if @@ -148,19 +109,21 @@ return GLOB.always_state /datum/tgui_input_text/ui_static_data(mob/user) - . = list() - .["large_buttons"] = user.client.prefs.read_preference(/datum/preference/toggle/tgui_input_large) - .["max_length"] = max_length - .["message"] = message - .["multiline"] = multiline - .["placeholder"] = default // Default is a reserved keyword - .["swapped_buttons"] = user.client.prefs.read_preference(/datum/preference/toggle/tgui_input_swapped) - .["title"] = title + var/list/data = list() + data["large_buttons"] = user.client.prefs.read_preference(/datum/preference/toggle/tgui_input_large) + data["max_length"] = max_length + data["message"] = message + data["multiline"] = multiline + data["placeholder"] = default // Default is a reserved keyword + data["swapped_buttons"] = user.client.prefs.read_preference(/datum/preference/toggle/tgui_input_swapped) + data["title"] = title + return data /datum/tgui_input_text/ui_data(mob/user) - . = list() + var/list/data = list() if(timeout) - .["timeout"] = CLAMP01((timeout - (world.time - start_time) - 1 SECONDS) / (timeout - 1 SECONDS)) + data["timeout"] = CLAMP01((timeout - (world.time - start_time) - 1 SECONDS) / (timeout - 1 SECONDS)) + return data /datum/tgui_input_text/ui_act(action, list/params) . = ..() @@ -172,7 +135,7 @@ if(length(params["entry"]) > max_length) CRASH("[usr] typed a text string longer than the max length") if(encode && (length(html_encode(params["entry"])) > max_length)) - to_chat(usr, span_notice("Input uses special characters, thus reducing the maximum length.")) + to_chat(usr, span_notice("Your message was clipped due to special character usage.")) set_entry(params["entry"]) closed = TRUE SStgui.close_uis(src) @@ -182,32 +145,13 @@ SStgui.close_uis(src) return TRUE +/** + * Sets the return value for the tgui text proc. + * If html encoding is enabled, the text will be encoded. + * This can sometimes result in a string that is longer than the max length. + * If the string is longer than the max length, it will be clipped. + */ /datum/tgui_input_text/proc/set_entry(entry) if(!isnull(entry)) var/converted_entry = encode ? html_encode(entry) : entry src.entry = trim(converted_entry, max_length) - -/** - * # async tgui_input_text - * - * An asynchronous version of tgui_input_text to be used with callbacks instead of waiting on user responses. - */ -/datum/tgui_input_text/async - // The callback to be invoked by the tgui_input_text upon having a choice made. - var/datum/callback/callback - -/datum/tgui_input_text/async/New(mob/user, message, title, default, max_length, multiline, encode, callback, timeout) - ..(user, message, title, default, max_length, multiline, encode, timeout) - src.callback = callback - -/datum/tgui_input_text/async/Destroy(force, ...) - QDEL_NULL(callback) - . = ..() - -/datum/tgui_input_text/async/set_entry(entry) - . = ..() - if(!isnull(src.entry)) - callback?.InvokeAsync(src.entry) - -/datum/tgui_input_text/async/wait() - return diff --git a/code/modules/unit_tests/_unit_tests.dm b/code/modules/unit_tests/_unit_tests.dm index 7b6defbf694864..cae65ca90d98e2 100644 --- a/code/modules/unit_tests/_unit_tests.dm +++ b/code/modules/unit_tests/_unit_tests.dm @@ -92,6 +92,7 @@ #include "emoting.dm" #include "food_edibility_check.dm" #include "gas_transfer.dm" +#include "get_turf_pixel.dm" #include "greyscale_config.dm" #include "heretic_knowledge.dm" #include "heretic_rituals.dm" @@ -100,15 +101,20 @@ #include "hydroponics_self_mutations.dm" #include "hydroponics_validate_genes.dm" #include "keybinding_init.dm" +#include "knockoff_component.dm" #include "load_map_security.dm" #include "machine_disassembly.dm" #include "mapping.dm" +#include "mecha_damage.dm" #include "medical_wounds.dm" #include "merge_type.dm" #include "metabolizing.dm" +#include "mindbound_actions.dm" +#include "mob_faction.dm" #include "mob_spawn.dm" #include "modsuit.dm" #include "modular_map_loader.dm" +#include "novaflower_burn.dm" #include "ntnetwork_tests.dm" #include "nuke_cinematic.dm" #include "objectives.dm" @@ -128,14 +134,23 @@ #include "reagent_recipe_collisions.dm" #include "resist.dm" #include "say.dm" +#include "screenshot_antag_icons.dm" +#include "screenshot_basic.dm" +#include "screenshot_humanoids.dm" #include "security_officer_distribution.dm" +#include "security_levels.dm" #include "serving_tray.dm" #include "siunit.dm" +#include "slips.dm" #include "spawn_humans.dm" #include "spawn_mobs.dm" #include "species_config_sanity.dm" #include "species_unique_id.dm" #include "species_whitelists.dm" +#include "spell_invocations.dm" +#include "spell_mindswap.dm" +#include "spell_names.dm" +#include "spell_shapeshift.dm" #include "stack_singular_name.dm" #include "stomach.dm" #include "strippable.dm" @@ -146,7 +161,7 @@ #include "timer_sanity.dm" #include "traitor.dm" #include "unit_test.dm" -#include "wizard.dm" +#include "wizard_loadout.dm" #ifdef REFERENCE_TRACKING_DEBUG //Don't try and parse this file if ref tracking isn't turned on. IE: don't parse ref tracking please mr linter #include "find_reference_sanity.dm" #endif diff --git a/code/modules/unit_tests/create_and_destroy.dm b/code/modules/unit_tests/create_and_destroy.dm index c47aeba0345826..586c383781aeb8 100644 --- a/code/modules/unit_tests/create_and_destroy.dm +++ b/code/modules/unit_tests/create_and_destroy.dm @@ -90,6 +90,8 @@ ignore += typesof(/obj/item/toy/cards/cardhand) //Needs a holodeck area linked to it which is not guarenteed to exist and technically is supposed to have a 1:1 relationship with computer anyway. ignore += typesof(/obj/machinery/computer/holodeck) + //runtimes if not paired with a landmark + ignore += typesof(/obj/structure/industrial_lift) var/list/cached_contents = spawn_at.contents.Copy() var/baseturf_count = length(spawn_at.baseturfs) diff --git a/code/modules/unit_tests/get_turf_pixel.dm b/code/modules/unit_tests/get_turf_pixel.dm new file mode 100644 index 00000000000000..8cd292d3b6c0c0 --- /dev/null +++ b/code/modules/unit_tests/get_turf_pixel.dm @@ -0,0 +1,11 @@ +///ensures that get_turf_pixel() returns turfs within the bounds of the map, +///even when called on a movable with its sprite out of bounds +/datum/unit_test/get_turf_pixel + +/datum/unit_test/get_turf_pixel/Run() + //we need long larry to peek over the top edge of the earth + var/turf/north = locate(1, world.maxy, run_loc_floor_bottom_left.z) + + //hes really long, so hes really good at peaking over the edge of the map + var/mob/living/simple_animal/hostile/megafauna/colossus/long_larry = allocate(/mob/living/simple_animal/hostile/megafauna/colossus, north) + TEST_ASSERT(istype(get_turf_pixel(long_larry), /turf), "get_turf_pixel() isnt clamping a mob whos sprite is above the bounds of the world inside of the map.") diff --git a/code/modules/unit_tests/knockoff_component.dm b/code/modules/unit_tests/knockoff_component.dm new file mode 100644 index 00000000000000..a781fb9eb0d3d9 --- /dev/null +++ b/code/modules/unit_tests/knockoff_component.dm @@ -0,0 +1,87 @@ +/// Test that the knockoff component will properly cause something +/// with it applied to be knocked off when it should be. +/datum/unit_test/knockoff_component + +/datum/unit_test/knockoff_component/Run() + var/mob/living/carbon/human/wears_the_glasses = allocate(/mob/living/carbon/human) + var/mob/living/carbon/human/shoves_the_guy = allocate(/mob/living/carbon/human) + + // No pre-existing items have a 100% chance of being knocked off, + // so we'll just apply it to a relatively generic item (glasses) + var/obj/item/clothing/glasses/sunglasses/glasses = allocate(/obj/item/clothing/glasses/sunglasses) + glasses.AddComponent(/datum/component/knockoff, \ + knockoff_chance = 100, \ + target_zones = list(BODY_ZONE_PRECISE_EYES), \ + slots_knockoffable = glasses.slot_flags) + + // Save this for later, since we wanna reset our dummy positions even after they're shoved about. + var/turf/right_of_shover = locate(run_loc_floor_bottom_left.x + 1, run_loc_floor_bottom_left.y, run_loc_floor_bottom_left.z) + + // Position shover (bottom left) and the shovee (1 tile right of bottom left, no wall behind them) + shoves_the_guy.forceMove(run_loc_floor_bottom_left) + set_glasses_wearer(wears_the_glasses, right_of_shover, glasses) + + TEST_ASSERT(wears_the_glasses.glasses == glasses, "Dummy failed to equip the glasses.") + + // Test disarm, targeting chest + // A disarm targeting chest should not knockdown or lose glasses + shoves_the_guy.zone_selected = BODY_ZONE_CHEST + shoves_the_guy.disarm(wears_the_glasses) + TEST_ASSERT(!wears_the_glasses.IsKnockdown(), "Dummy was knocked down when being disarmed shouldn't have been.") + TEST_ASSERT(wears_the_glasses.glasses == glasses, "Dummy lost their glasses even thought they were disarmed targeting the wrong slot.") + + set_glasses_wearer(wears_the_glasses, right_of_shover, glasses) + + // Test disarm, targeting eyes + // A disarm targeting eyes should not knockdown but should lose glasses + shoves_the_guy.zone_selected = BODY_ZONE_PRECISE_EYES + shoves_the_guy.disarm(wears_the_glasses) + TEST_ASSERT(!wears_the_glasses.IsKnockdown(), "Dummy was knocked down when being disarmed shouldn't have been.") + TEST_ASSERT(wears_the_glasses.glasses != glasses, "Dummy kept their glasses, even though they were shoved targeting the correct zone.") + + set_glasses_wearer(wears_the_glasses, right_of_shover, glasses) + + // Test Knockdown() + // Any amount of positive Kockdown should lose glasses + wears_the_glasses.Knockdown(1 SECONDS) + TEST_ASSERT(wears_the_glasses.IsKnockdown(), "Dummy wasn't knocked down after Knockdown() was called.") + TEST_ASSERT(wears_the_glasses.glasses != glasses, "Dummy kept their glasses, even though they knocked down by Knockdown().") + + set_glasses_wearer(wears_the_glasses, right_of_shover, glasses) + + // Test AdjustKnockdown() + // Any amount of positive Kockdown should lose glasses + wears_the_glasses.AdjustKnockdown(1 SECONDS) + TEST_ASSERT(wears_the_glasses.IsKnockdown(), "Dummy wasn't knocked down after AdjustKnockdown() was called.") + TEST_ASSERT(wears_the_glasses.glasses != glasses, "Dummy kept their glasses, even though they knocked down by AdjustKnockdown().") + + set_glasses_wearer(wears_the_glasses, right_of_shover, glasses) + + // Test SetKnockdown() + // Any amount of positive Kockdown should lose glasses + wears_the_glasses.SetKnockdown(1 SECONDS) + TEST_ASSERT(wears_the_glasses.IsKnockdown(), "Dummy wasn't knocked down after SetKnockdown() was called.") + TEST_ASSERT(wears_the_glasses.glasses != glasses, "Dummy kept their glasses, even though they knocked down by SetKnockdown().") + + set_glasses_wearer(wears_the_glasses, right_of_shover, glasses) + + // Test a negative value applied of Knockdown (AdjustKnockdown, SetKnockdown, and Knockdown should all act the same here) + // Any amount of negative Kockdown should not cause the glasses to be lost + wears_the_glasses.AdjustKnockdown(-1 SECONDS) + TEST_ASSERT(!wears_the_glasses.IsKnockdown(), "Dummy was knocked down after AdjustKnockdown() was called with a negative value.") + TEST_ASSERT(wears_the_glasses.glasses == glasses, "Dummy lost their glasses, even though AdjustKnockdown() was called with a negative value.") + + // Bonus check: A wallshove should definitely cause them to be lost + wears_the_glasses.forceMove(shoves_the_guy.loc) + shoves_the_guy.forceMove(right_of_shover) + + shoves_the_guy.zone_selected = BODY_ZONE_CHEST + shoves_the_guy.disarm(wears_the_glasses) + TEST_ASSERT(wears_the_glasses.glasses != glasses, "Dummy kept their glasses, even though were disarm shoved into a wall.") + +/// Helper to reset the glasses dummy back to it's original position, clear knockdown, and return glasses (if gone) +/datum/unit_test/knockoff_component/proc/set_glasses_wearer(mob/living/carbon/human/wearer, turf/reset_to, obj/item/clothing/glasses/reset_worn) + wearer.forceMove(reset_to) + wearer.SetKnockdown(0 SECONDS) + if(!wearer.glasses) + wearer.equip_to_slot_if_possible(reset_worn, ITEM_SLOT_EYES) diff --git a/code/modules/unit_tests/mecha_damage.dm b/code/modules/unit_tests/mecha_damage.dm new file mode 100644 index 00000000000000..6bc5e37069f329 --- /dev/null +++ b/code/modules/unit_tests/mecha_damage.dm @@ -0,0 +1,86 @@ +/** + * Unit test to ensure that mechs take the correct amount of damage + * based on armor, and that their equipment is properly damaged as well. + */ +/datum/unit_test/mecha_damage + +/datum/unit_test/mecha_damage/Run() + // "Loaded Mauler" was chosen deliberately here. + // We need a mech that starts with arm equipment and has fair enough armor. + var/obj/vehicle/sealed/mecha/demo_mech = allocate(/obj/vehicle/sealed/mecha/combat/marauder/mauler/loaded) + // We need to face our guy explicitly, because mechs have directional armor + demo_mech.setDir(EAST) + + var/expected_melee_armor = demo_mech.armor.getRating(MELEE) + var/expected_laser_armor = demo_mech.armor.getRating(LASER) + var/expected_bullet_armor = demo_mech.armor.getRating(BULLET) + + var/mob/living/carbon/human/dummy = allocate(/mob/living/carbon/human) + dummy.forceMove(locate(run_loc_floor_bottom_left.x + 1, run_loc_floor_bottom_left.y, run_loc_floor_bottom_left.z)) + // The dummy needs to be targeting an arm. Left is chosen here arbitrarily. + dummy.zone_selected = BODY_ZONE_L_ARM + // Not strictly necessary, but you never know + dummy.face_atom(demo_mech) + + // Get a sample "melee" weapon. + // The energy axe is chosen here due to having a high base force, to make sure we get over the equipment DT. + var/obj/item/dummy_melee = allocate(/obj/item/melee/energy/axe) + var/expected_melee_damage = round(dummy_melee.force * (1 - expected_melee_armor / 100), DAMAGE_PRECISION) + + // Get a sample laser weapon. + // The captain's laser gun here is chosen primarily because it deals more damage than normal lasers. + var/obj/item/gun/energy/laser/dummy_laser = allocate(/obj/item/gun/energy/laser/captain) + var/obj/item/ammo_casing/laser_ammo = dummy_laser.ammo_type[1] + var/obj/projectile/beam/laser_fired = initial(laser_ammo.projectile_type) + var/expected_laser_damage = round(dummy_laser.projectile_damage_multiplier * initial(laser_fired.damage) * (1 - expected_laser_armor / 100), DAMAGE_PRECISION) + + // Get a sample ballistic weapon. + // The syndicate .357 here is chosen because it does a lot of damage. + var/obj/item/gun/ballistic/dummy_gun = allocate(/obj/item/gun/ballistic/revolver) + var/obj/item/ammo_casing/ballistic_ammo = dummy_gun.magazine.ammo_type + var/obj/projectile/bullet_fired = initial(ballistic_ammo.projectile_type) + var/expected_bullet_damage = round(dummy_gun.projectile_damage_multiplier * initial(bullet_fired.damage) * (1 - expected_bullet_armor / 100), DAMAGE_PRECISION) + + var/obj/item/mecha_parts/mecha_equipment/left_arm_equipment = demo_mech.equip_by_category[MECHA_L_ARM] + TEST_ASSERT_NOTNULL(left_arm_equipment, "[demo_mech] spawned without any equipment in their left arm slot.") + + // Now it's time to actually beat the heck out of the mech to see if it takes damage correctly. + TEST_ASSERT_EQUAL(demo_mech.get_integrity(), demo_mech.max_integrity, "[demo_mech] was spawned at not its maximum integrity.") + TEST_ASSERT_EQUAL(left_arm_equipment.get_integrity(), left_arm_equipment.max_integrity, "[left_arm_equipment] ([demo_mech]'s left arm) spawned at not its maximum integrity.") + + // SMACK IT + var/pre_melee_integrity = demo_mech.get_integrity() + var/pre_melee_arm_integrity = left_arm_equipment.get_integrity() + demo_mech.attacked_by(dummy_melee, dummy) + + check_integrity(demo_mech, pre_melee_integrity, expected_melee_damage, "hit with a melee item") + check_integrity(left_arm_equipment, pre_melee_arm_integrity, expected_melee_damage, "hit with a melee item") + + // BLAST IT + var/pre_laser_integrity = demo_mech.get_integrity() + var/pre_laser_arm_integrity = left_arm_equipment.get_integrity() + dummy_laser.fire_gun(demo_mech, dummy, FALSE) + + check_integrity(demo_mech, pre_laser_integrity, expected_laser_damage, "shot with a laser") + check_integrity(left_arm_equipment, pre_laser_arm_integrity, expected_laser_damage, "shot with a laser") + + // SHOOT IT + var/pre_bullet_integrity = demo_mech.get_integrity() + var/pre_bullet_arm_integrity = left_arm_equipment.get_integrity() + dummy_gun.fire_gun(demo_mech, dummy, FALSE) + + check_integrity(demo_mech, pre_bullet_integrity, expected_bullet_damage, "shot with a bullet") + check_integrity(left_arm_equipment, pre_bullet_arm_integrity, expected_bullet_damage, "shot with a bullet") + + // Additional check: The right arm of the mech should have taken no damage by this point. + var/obj/item/mecha_parts/mecha_equipment/right_arm_equipment = demo_mech.equip_by_category[MECHA_R_ARM] + TEST_ASSERT_NOTNULL(right_arm_equipment, "[demo_mech] spawned without any equipment in their right arm slot.") + TEST_ASSERT_EQUAL(right_arm_equipment.get_integrity(), right_arm_equipment.max_integrity, "[demo_mech] somehow took damage to its right arm, despite not being targeted.") + +/// Simple helper to check if the integrity of an atom involved has taken damage, and if they took the amount of damage it should have. +/datum/unit_test/mecha_damage/proc/check_integrity(atom/checking, pre_integrity, expected_damage, hit_by_phrase) + var/post_hit_health = checking.get_integrity() + TEST_ASSERT(post_hit_health < pre_integrity, "[checking] was [hit_by_phrase], but didn't take any damage.") + + var/damage_taken = round(pre_integrity - post_hit_health, DAMAGE_PRECISION) + TEST_ASSERT_EQUAL(damage_taken, expected_damage, "[checking] didn't take the expected amount of damage when [hit_by_phrase]. (Expected damage: [expected_damage], recieved damage: [damage_taken])") diff --git a/code/modules/unit_tests/mindbound_actions.dm b/code/modules/unit_tests/mindbound_actions.dm new file mode 100644 index 00000000000000..b404124144091c --- /dev/null +++ b/code/modules/unit_tests/mindbound_actions.dm @@ -0,0 +1,30 @@ +/** + * Tests that actions assigned to a mob's mind + * are successfuly transferred when their mind is transferred to a new mob. + */ +/datum/unit_test/actions_moved_on_mind_transfer + +/datum/unit_test/actions_moved_on_mind_transfer/Run() + + var/mob/living/carbon/human/wizard = allocate(/mob/living/carbon/human) + var/mob/living/simple_animal/pet/dog/corgi/wizard_dog = allocate(/mob/living/simple_animal/pet/dog/corgi) + wizard.mind_initialize() + + var/datum/action/cooldown/spell/pointed/projectile/fireball/fireball = new(wizard.mind) + fireball.Grant(wizard) + var/datum/action/cooldown/spell/aoe/magic_missile/missile = new(wizard.mind) + missile.Grant(wizard) + var/datum/action/cooldown/spell/jaunt/ethereal_jaunt/jaunt = new(wizard.mind) + jaunt.Grant(wizard) + + var/datum/mind/wizard_mind = wizard.mind + wizard_mind.transfer_to(wizard_dog) + + TEST_ASSERT_EQUAL(wizard_dog.mind, wizard_mind, "Mind transfer failed to occur, which invalidates the test.") + + for(var/datum/action/cooldown/spell/remaining_spell in wizard.actions) + Fail("Spell: [remaining_spell] failed to transfer minds when a mind transfer occured.") + + qdel(fireball) + qdel(missile) + qdel(jaunt) diff --git a/code/modules/unit_tests/mob_faction.dm b/code/modules/unit_tests/mob_faction.dm new file mode 100644 index 00000000000000..359ec40f66ffe5 --- /dev/null +++ b/code/modules/unit_tests/mob_faction.dm @@ -0,0 +1,19 @@ +/// Checks if any mob's faction var initial value is not a list, which is not supported by the current code +/datum/unit_test/mob_faction + +/datum/unit_test/mob_faction/Run() + /// Right now taken from create_and_destroy + var/list/ignored = list( + /mob/living/carbon, + /mob/dview, + /mob/oranges_ear + ) + ignored += typesof(/mob/camera/imaginary_friend) + ignored += typesof(/mob/living/simple_animal/pet/gondola/gondolapod) + ignored += typesof(/mob/living/silicon/robot/model) + ignored += typesof(/mob/camera/ai_eye/remote/base_construction) + ignored += typesof(/mob/camera/ai_eye/remote/shuttle_docker) + for (var/mob_type in typesof(/mob) - ignored) + var/mob/mob_instance = allocate(mob_type) + if(!islist(mob_instance.faction)) + TEST_FAIL("[mob_type] faction variable is not a list") diff --git a/code/modules/unit_tests/novaflower_burn.dm b/code/modules/unit_tests/novaflower_burn.dm new file mode 100644 index 00000000000000..c54cb9d6d15299 --- /dev/null +++ b/code/modules/unit_tests/novaflower_burn.dm @@ -0,0 +1,37 @@ +/// Unit tests that the novaflower's unique genes function. +/datum/unit_test/novaflower_burn + +/datum/unit_test/novaflower_burn/Run() + var/mob/living/carbon/human/botanist = allocate(/mob/living/carbon/human) + var/mob/living/carbon/human/victim = allocate(/mob/living/carbon/human) + var/obj/item/grown/novaflower/weapon = allocate(/obj/item/grown/novaflower) + + TEST_ASSERT(weapon.force > 0, "[weapon] spawned with zero force.") + + // Keep this around for comparison later. + var/initial_force = weapon.force + // Start by having the novaflower equipped to an attacker's hands + // They are not wearing botany gloves (have plant protection), so they should take damage = the flower's force. + weapon.attack_hand(botanist) + TEST_ASSERT_EQUAL(botanist.get_active_held_item(), weapon, "The botanist failed to pick up [weapon].") + TEST_ASSERT_EQUAL(botanist.getFireLoss(), weapon.force, "The botanist picked up [weapon] with their bare hands, and took an incorrect amount of fire damage.") + + // Heal our attacker for easy comparison later + botanist.adjustFireLoss(-100) + // And give them the plant safe trait so we don't have to worry about attacks being cancelled + ADD_TRAIT(botanist, TRAIT_PLANT_SAFE, "unit_test") + + // Now, let's get a smack with the novaflower and see what happens. + weapon.melee_attack_chain(botanist, victim) + + TEST_ASSERT(botanist.getFireLoss() <= 0, "The botanist took fire damage from [weapon], even though they were plant safe.") + TEST_ASSERT_EQUAL(victim.getFireLoss(), initial_force, "The target took an incorrect amount of fire damage after being hit with [weapon].") + TEST_ASSERT(weapon.force < initial_force, "[weapon] didn't lose any force after an attack.") + TEST_ASSERT(victim.fire_stacks > 0, "[weapon] didn't apply any firestacks to the target after an attack.") + TEST_ASSERT(victim.on_fire, "[weapon] didn't set the target on fire after an attack.") + + // Lastly we should check that degredation to zero works. + weapon.force = 0 + weapon.melee_attack_chain(botanist, victim) + + TEST_ASSERT(QDELETED(weapon), "[weapon] wasn't deleted after hitting someone with zero force.") diff --git a/code/modules/unit_tests/outfit_sanity.dm b/code/modules/unit_tests/outfit_sanity.dm index 6f2a78600baede..a105bb423aea15 100644 --- a/code/modules/unit_tests/outfit_sanity.dm +++ b/code/modules/unit_tests/outfit_sanity.dm @@ -20,6 +20,8 @@ r_hand = /obj/item/stack/spacecash/c1000 /datum/unit_test/outfit_sanity/Run() + var/datum/outfit/prototype_outfit = /datum/outfit + var/prototype_name = initial(prototype_outfit.name) var/mob/living/carbon/human/H = allocate(/mob/living/carbon/human) for (var/outfit_type in subtypesof(/datum/outfit)) @@ -28,6 +30,9 @@ qdel(I) var/datum/outfit/outfit = new outfit_type + + if(outfit.name == prototype_name) + TEST_FAIL("[outfit.type]'s name is invalid! Uses default outfit name!") outfit.pre_equip(H, TRUE) CHECK_OUTFIT_SLOT(uniform, ITEM_SLOT_ICLOTHING) diff --git a/code/modules/unit_tests/screenshot_antag_icons.dm b/code/modules/unit_tests/screenshot_antag_icons.dm new file mode 100644 index 00000000000000..0a210ae31eda17 --- /dev/null +++ b/code/modules/unit_tests/screenshot_antag_icons.dm @@ -0,0 +1,12 @@ +/// A screenshot test to make sure every antag icon in the preferences menu is consistent +/datum/unit_test/screenshot_antag_icons + +/datum/unit_test/screenshot_antag_icons/Run() + var/datum/asset/spritesheet/antagonists/antagonists = get_asset_datum(/datum/asset/spritesheet/antagonists) + + for (var/antag_icon_key in antagonists.antag_icons) + var/icon/reference_icon = antagonists.antag_icons[antag_icon_key] + + var/icon/icon = new() + icon.Insert(reference_icon, null, SOUTH, 1) + test_screenshot(antag_icon_key, icon) diff --git a/code/modules/unit_tests/screenshot_basic.dm b/code/modules/unit_tests/screenshot_basic.dm new file mode 100644 index 00000000000000..350514f007fb3e --- /dev/null +++ b/code/modules/unit_tests/screenshot_basic.dm @@ -0,0 +1,8 @@ +/// This is an example for screenshot tests, and a meta-test to make sure they work in the success case. +/// It creates a picture that is red on the left side, green on the other. +/datum/unit_test/screenshot_basic + +/datum/unit_test/screenshot_basic/Run() + var/icon/red = icon('icons/blanks/32x32.dmi', "nothing") + red.Blend(COLOR_RED, ICON_OVERLAY) + test_screenshot("red", red) diff --git a/code/modules/unit_tests/screenshot_humanoids.dm b/code/modules/unit_tests/screenshot_humanoids.dm new file mode 100644 index 00000000000000..196d946cb12002 --- /dev/null +++ b/code/modules/unit_tests/screenshot_humanoids.dm @@ -0,0 +1,44 @@ +/// A screenshot test for every humanoid species with a handful of jobs. +/datum/unit_test/screenshot_humanoids + +/datum/unit_test/screenshot_humanoids/Run() + // Test lizards as their own thing so we can get more coverage on their features + var/mob/living/carbon/human/lizard = allocate(/mob/living/carbon/human/dummy/consistent) + lizard.dna.features["mcolor"] = "#099" + lizard.dna.features["tail_lizard"] = "Light Tiger" + lizard.dna.features["snout"] = "Sharp + Light" + lizard.dna.features["horns"] = "Simple" + lizard.dna.features["frills"] = "Aquatic" + lizard.dna.features["legs"] = "Normal Legs" + lizard.set_species(/datum/species/lizard) + lizard.equipOutfit(/datum/outfit/job/engineer) + test_screenshot("[/datum/species/lizard]", get_flat_icon_for_all_directions(lizard)) + + // let me have this + var/mob/living/carbon/human/moth = allocate(/mob/living/carbon/human/dummy/consistent) + moth.dna.features["moth_antennae"] = "Firewatch" + moth.dna.features["moth_markings"] = "None" + moth.dna.features["moth_wings"] = "Firewatch" + moth.set_species(/datum/species/moth) + moth.equipOutfit(/datum/outfit/job/cmo, visualsOnly = TRUE) + test_screenshot("[/datum/species/moth]", get_flat_icon_for_all_directions(moth)) + + // The rest of the species + for (var/datum/species/species_type as anything in subtypesof(/datum/species) - /datum/species/moth - /datum/species/lizard) + test_screenshot("[species_type]", get_flat_icon_for_all_directions(make_dummy(species_type, /datum/outfit/job/assistant/consistent))) + +/datum/unit_test/screenshot_humanoids/proc/get_flat_icon_for_all_directions(atom/thing) + var/icon/output = icon('icons/effects/effects.dmi', "nothing") + COMPILE_OVERLAYS(thing) + + for (var/direction in GLOB.cardinals) + var/icon/partial = getFlatIcon(thing, defdir = direction, no_anim = TRUE) + output.Insert(partial, dir = direction) + + return output + +/datum/unit_test/screenshot_humanoids/proc/make_dummy(species, job_outfit) + var/mob/living/carbon/human/dummy/consistent/dummy = allocate(/mob/living/carbon/human/dummy/consistent) + dummy.set_species(species) + dummy.equipOutfit(job_outfit, visualsOnly = TRUE) + return dummy diff --git a/code/modules/unit_tests/screenshots/README.md b/code/modules/unit_tests/screenshots/README.md new file mode 100644 index 00000000000000..1d50a4e5612089 --- /dev/null +++ b/code/modules/unit_tests/screenshots/README.md @@ -0,0 +1,18 @@ +This folder contains the results for screenshot tests. Screenshot tests make sure an icon looks the same as it did before a change to prevent regressions. + +You can create one by simply using the `test_screenshot` proc. + +This example test screenshots a red image and keeps it. + +```dm +/// This is an example for screenshot tests, and a meta-test to make sure they work in the success case. +/// It creates a picture that is red on the left side, green on the other. +/datum/unit_test/screenshot_basic + +/datum/unit_test/screenshot_basic/Run() + var/icon/red = icon('icons/blanks/32x32.dmi', "nothing") + red.Blend(COLOR_RED, ICON_OVERLAY) + test_screenshot("red", red) +``` + +Unfortunately, screenshot tests are sanest to test through a pull request directly, due to limitations with both DM and GitHub. diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_abductor.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_abductor.png new file mode 100644 index 00000000000000..c0503326ddb194 Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_abductor.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_blob.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_blob.png new file mode 100644 index 00000000000000..f21c6979c1a118 Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_blob.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_blobinfection.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_blobinfection.png new file mode 100644 index 00000000000000..e3d7acbf5d891f Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_blobinfection.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_bloodbrother.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_bloodbrother.png new file mode 100644 index 00000000000000..6e604eecbc6c40 Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_bloodbrother.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_changeling.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_changeling.png new file mode 100644 index 00000000000000..de9743cf1ac7a7 Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_changeling.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_clownoperative.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_clownoperative.png new file mode 100644 index 00000000000000..d61c10e74871c6 Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_clownoperative.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_cultist.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_cultist.png new file mode 100644 index 00000000000000..be8440660c95da Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_cultist.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_familyheadaspirant.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_familyheadaspirant.png new file mode 100644 index 00000000000000..5c3169087d0c6d Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_familyheadaspirant.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_fugitive.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_fugitive.png new file mode 100644 index 00000000000000..d1187a14d8491f Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_fugitive.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_gangster.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_gangster.png new file mode 100644 index 00000000000000..5c3169087d0c6d Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_gangster.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_headrevolutionary.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_headrevolutionary.png new file mode 100644 index 00000000000000..7a1b6f6913d1d9 Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_headrevolutionary.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_heretic.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_heretic.png new file mode 100644 index 00000000000000..73bc5e02dd39ca Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_heretic.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_hereticsmuggler.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_hereticsmuggler.png new file mode 100644 index 00000000000000..73bc5e02dd39ca Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_hereticsmuggler.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_loneoperative.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_loneoperative.png new file mode 100644 index 00000000000000..d4be21a24a7f5f Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_loneoperative.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_malfai.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_malfai.png new file mode 100644 index 00000000000000..993fbc0b308a1e Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_malfai.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_malfaimidround.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_malfaimidround.png new file mode 100644 index 00000000000000..993fbc0b308a1e Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_malfaimidround.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_nightmare.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_nightmare.png new file mode 100644 index 00000000000000..3b723129ac84d4 Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_nightmare.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_obsessed.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_obsessed.png new file mode 100644 index 00000000000000..1d5f88bd8407fc Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_obsessed.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_operative.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_operative.png new file mode 100644 index 00000000000000..450f465ee80604 Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_operative.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_operativemidround.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_operativemidround.png new file mode 100644 index 00000000000000..450f465ee80604 Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_operativemidround.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_opportunist.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_opportunist.png new file mode 100644 index 00000000000000..2ebcdc0b5c8c7f Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_opportunist.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_provocateur.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_provocateur.png new file mode 100644 index 00000000000000..7a1b6f6913d1d9 Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_provocateur.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_revenant.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_revenant.png new file mode 100644 index 00000000000000..eccedaabc01a35 Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_revenant.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_sentientdisease.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_sentientdisease.png new file mode 100644 index 00000000000000..e7e1cbd661fcb6 Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_sentientdisease.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_spacedragon.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_spacedragon.png new file mode 100644 index 00000000000000..f81dadfcf56f00 Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_spacedragon.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_spaceninja.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_spaceninja.png new file mode 100644 index 00000000000000..a54028e1be9927 Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_spaceninja.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_syndicateinfiltrator.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_syndicateinfiltrator.png new file mode 100644 index 00000000000000..62e23dad5c7f00 Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_syndicateinfiltrator.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_syndicatesleeperagent.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_syndicatesleeperagent.png new file mode 100644 index 00000000000000..62e23dad5c7f00 Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_syndicatesleeperagent.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_thief.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_thief.png new file mode 100644 index 00000000000000..2ebcdc0b5c8c7f Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_thief.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_traitor.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_traitor.png new file mode 100644 index 00000000000000..62e23dad5c7f00 Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_traitor.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_wizard.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_wizard.png new file mode 100644 index 00000000000000..350266c89793ed Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_wizard.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_wizardmidround.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_wizardmidround.png new file mode 100644 index 00000000000000..350266c89793ed Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_wizardmidround.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_xenomorph.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_xenomorph.png new file mode 100644 index 00000000000000..fe089cfc4ec063 Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_xenomorph.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_basic_red.png b/code/modules/unit_tests/screenshots/screenshot_basic_red.png new file mode 100644 index 00000000000000..280ec2883f8392 Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_basic_red.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_abductor.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_abductor.png new file mode 100644 index 00000000000000..d4742750320cd2 Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_abductor.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_android.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_android.png new file mode 100644 index 00000000000000..413fe56c47faee Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_android.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_dullahan.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_dullahan.png new file mode 100644 index 00000000000000..12eec6affc3f9a Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_dullahan.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_ethereal.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_ethereal.png new file mode 100644 index 00000000000000..b38c363378c364 Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_ethereal.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_fly.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_fly.png new file mode 100644 index 00000000000000..205d91bcef3aaa Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_fly.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem.png new file mode 100644 index 00000000000000..240e8270f34cc8 Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_adamantine.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_adamantine.png new file mode 100644 index 00000000000000..78d706f1326a6d Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_adamantine.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_alloy.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_alloy.png new file mode 100644 index 00000000000000..e9199bfc305fe3 Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_alloy.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_bananium.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_bananium.png new file mode 100644 index 00000000000000..28734ed1c17f6c Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_bananium.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_bluespace.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_bluespace.png new file mode 100644 index 00000000000000..7a2b4b50700cc7 Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_bluespace.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_bone.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_bone.png new file mode 100644 index 00000000000000..11ffef30da3aae Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_bone.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_bronze.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_bronze.png new file mode 100644 index 00000000000000..0fb6bfa0597a44 Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_bronze.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_cardboard.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_cardboard.png new file mode 100644 index 00000000000000..cfc30dee8bdd3c Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_cardboard.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_cloth.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_cloth.png new file mode 100644 index 00000000000000..86eb0a04904f0c Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_cloth.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_diamond.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_diamond.png new file mode 100644 index 00000000000000..8701d58ca5eb1d Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_diamond.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_durathread.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_durathread.png new file mode 100644 index 00000000000000..c35eb550b5fbaa Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_durathread.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_glass.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_glass.png new file mode 100644 index 00000000000000..b49db9e679d97f Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_glass.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_gold.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_gold.png new file mode 100644 index 00000000000000..e1353ea196848f Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_gold.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_leather.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_leather.png new file mode 100644 index 00000000000000..547484abd056e4 Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_leather.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_mhydrogen.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_mhydrogen.png new file mode 100644 index 00000000000000..b7ba888b71a1e3 Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_mhydrogen.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_plasma.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_plasma.png new file mode 100644 index 00000000000000..8265865d458039 Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_plasma.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_plasteel.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_plasteel.png new file mode 100644 index 00000000000000..da26728fe39fd3 Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_plasteel.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_plastic.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_plastic.png new file mode 100644 index 00000000000000..7e4c781f712263 Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_plastic.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_plastitanium.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_plastitanium.png new file mode 100644 index 00000000000000..32e9549dc5ba62 Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_plastitanium.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_runic.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_runic.png new file mode 100644 index 00000000000000..e3a43f47b16e75 Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_runic.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_sand.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_sand.png new file mode 100644 index 00000000000000..d983ed55a0fb2d Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_sand.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_silver.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_silver.png new file mode 100644 index 00000000000000..b7ba888b71a1e3 Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_silver.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_snow.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_snow.png new file mode 100644 index 00000000000000..03e8f550f7ff72 Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_snow.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_titanium.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_titanium.png new file mode 100644 index 00000000000000..7e4c781f712263 Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_titanium.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_uranium.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_uranium.png new file mode 100644 index 00000000000000..7db2eb454fe500 Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_uranium.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_wood.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_wood.png new file mode 100644 index 00000000000000..868ad85331cdc5 Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_golem_wood.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_human.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_human.png new file mode 100644 index 00000000000000..767a2ec704d155 Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_human.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_human_felinid.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_human_felinid.png new file mode 100644 index 00000000000000..27e6f575d7acab Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_human_felinid.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_human_krokodil_addict.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_human_krokodil_addict.png new file mode 100644 index 00000000000000..7f76aaf6d9de21 Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_human_krokodil_addict.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_jelly.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_jelly.png new file mode 100644 index 00000000000000..8951c16232efb8 Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_jelly.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_jelly_luminescent.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_jelly_luminescent.png new file mode 100644 index 00000000000000..690344a8ab5a1e Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_jelly_luminescent.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_jelly_slime.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_jelly_slime.png new file mode 100644 index 00000000000000..709d6d455fe27e Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_jelly_slime.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_jelly_stargazer.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_jelly_stargazer.png new file mode 100644 index 00000000000000..8951c16232efb8 Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_jelly_stargazer.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_lizard.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_lizard.png new file mode 100644 index 00000000000000..955d413d50e2cf Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_lizard.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_lizard_ashwalker.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_lizard_ashwalker.png new file mode 100644 index 00000000000000..24b9dc784bbbc2 Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_lizard_ashwalker.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_lizard_silverscale.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_lizard_silverscale.png new file mode 100644 index 00000000000000..12ee5dc1c7ef12 Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_lizard_silverscale.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_monkey.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_monkey.png new file mode 100644 index 00000000000000..6e2d1a6114cc05 Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_monkey.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_moth.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_moth.png new file mode 100644 index 00000000000000..87a567e7dc219b Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_moth.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_mush.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_mush.png new file mode 100644 index 00000000000000..c8527bfe56e9df Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_mush.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_plasmaman.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_plasmaman.png new file mode 100644 index 00000000000000..94b05c68a8f782 Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_plasmaman.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_pod.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_pod.png new file mode 100644 index 00000000000000..f77e21d1f523c9 Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_pod.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_shadow.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_shadow.png new file mode 100644 index 00000000000000..0d232158466ff3 Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_shadow.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_shadow_nightmare.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_shadow_nightmare.png new file mode 100644 index 00000000000000..e6b8dc6ef7559b Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_shadow_nightmare.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_skeleton.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_skeleton.png new file mode 100644 index 00000000000000..bb5be6b7d5ab6e Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_skeleton.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_snail.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_snail.png new file mode 100644 index 00000000000000..96d146df1a835b Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_snail.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_vampire.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_vampire.png new file mode 100644 index 00000000000000..a29c38b292c85d Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_vampire.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_zombie.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_zombie.png new file mode 100644 index 00000000000000..7b0d5c736d5236 Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_zombie.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_zombie_infectious.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_zombie_infectious.png new file mode 100644 index 00000000000000..7b0d5c736d5236 Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_zombie_infectious.png differ diff --git a/code/modules/unit_tests/security_levels.dm b/code/modules/unit_tests/security_levels.dm new file mode 100644 index 00000000000000..eecef51ff99c9a --- /dev/null +++ b/code/modules/unit_tests/security_levels.dm @@ -0,0 +1,16 @@ +/** + * Security Level Unit Test + * + * This test is here to ensure there are no security levels with the same name or number level. Having the same name or number level will cause problems. + */ +/datum/unit_test/security_levels + +/datum/unit_test/security_levels/Run() + var/list/comparison = subtypesof(/datum/security_level) + + for(var/datum/security_level/iterating_level in comparison) + for(var/datum/security_level/iterating_level_check in comparison) + if(iterating_level == iterating_level_check) // If they are the same type, don't check + continue + TEST_ASSERT_NOTEQUAL(iterating_level.name, iterating_level_check.name, "Security level [iterating_level] has the same name as [iterating_level_check]!") + TEST_ASSERT_NOTEQUAL(iterating_level.number_level, iterating_level_check.number_level, "Security level [iterating_level] has the same level number as [iterating_level_check]!") diff --git a/code/modules/unit_tests/slips.dm b/code/modules/unit_tests/slips.dm new file mode 100644 index 00000000000000..3728a8341b9af3 --- /dev/null +++ b/code/modules/unit_tests/slips.dm @@ -0,0 +1,16 @@ +/// Unit test that forces various slips on a mob and checks return values and mob state to see if the slip has likely been successful. +/datum/unit_test/slips + +/datum/unit_test/slips/Run() + // Test just forced slipping, which calls turf slip code as well. + var/mob/living/carbon/human/mso = allocate(/mob/living/carbon/human) + + TEST_ASSERT(mso.slip(100) == TRUE, "/mob/living/carbon/human/slip() returned FALSE when TRUE was expected") + TEST_ASSERT(!!(mso.IsKnockdown()), "/mob/living/carbon/human/slip() failed to knockdown target when knockdown was expected") + + // Test the slipping component, which calls mob slip code. Just for good measure. + var/mob/living/carbon/human/msos_friend_mso = allocate(/mob/living/carbon/human, run_loc_floor_bottom_left) + var/obj/item/grown/bananapeel/specialpeel/mso_bane = allocate(/obj/item/grown/bananapeel/specialpeel, get_step(run_loc_floor_bottom_left, EAST)) + + msos_friend_mso.Move(get_turf(mso_bane), EAST) + TEST_ASSERT(!!(msos_friend_mso.IsKnockdown()), "Banana peel which should have slipping component failed to knockdown target when knockdown was expected") diff --git a/code/modules/unit_tests/spell_invocations.dm b/code/modules/unit_tests/spell_invocations.dm new file mode 100644 index 00000000000000..f72e5277eacfd3 --- /dev/null +++ b/code/modules/unit_tests/spell_invocations.dm @@ -0,0 +1,26 @@ +/** + * Validates that all spells have a correct + * invocation type and invocation setup. + */ +/datum/unit_test/spell_invocations + +/datum/unit_test/spell_invocations/Run() + + var/list/types_to_test = subtypesof(/datum/action/cooldown/spell) + + for(var/datum/action/cooldown/spell/spell_type as anything in types_to_test) + var/spell_name = initial(spell_type.name) + var/invoke_type = initial(spell_type.invocation_type) + switch(invoke_type) + if(INVOCATION_EMOTE) + if(isnull(initial(spell_type.invocation_self_message))) + Fail("Spell: [spell_name] ([spell_type]) set emote invocation type but did not set a self message.") + if(isnull(initial(spell_type.invocation))) + Fail("Spell: [spell_name] ([spell_type]) set emote invocation type but did not set an invocation message.") + + if(INVOCATION_SHOUT, INVOCATION_WHISPER) + if(isnull(initial(spell_type.invocation))) + Fail("Spell: [spell_name] ([spell_type]) set a speaking invocation type but did not set an invocation message.") + + // INVOCATION_NONE: + // It doesn't matter what they have set for invocation text. So not it's skipped. diff --git a/code/modules/unit_tests/spell_mindswap.dm b/code/modules/unit_tests/spell_mindswap.dm new file mode 100644 index 00000000000000..0f7d63440cf066 --- /dev/null +++ b/code/modules/unit_tests/spell_mindswap.dm @@ -0,0 +1,41 @@ +/** + * Validates that the mind swap spell + * properly transfers minds between a caster and a target. + * + * Also checks that the mindswap spell itself was transferred over + * to the new body on cast. + */ +/datum/unit_test/mind_swap_spell + +/datum/unit_test/mind_swap_spell/Run() + + var/mob/living/carbon/human/swapper = allocate(/mob/living/carbon/human) + var/mob/living/carbon/human/to_swap = allocate(/mob/living/carbon/human) + + swapper.forceMove(run_loc_floor_bottom_left) + to_swap.forceMove(locate(run_loc_floor_bottom_left.x + 1, run_loc_floor_bottom_left.y, run_loc_floor_bottom_left.z)) + + swapper.mind_initialize() + to_swap.mind_initialize() + + var/datum/mind/swapper_mind = swapper.mind + var/datum/mind/to_swap_mind = to_swap.mind + + var/datum/action/cooldown/spell/pointed/mind_transfer/mind_swap = new(swapper.mind) + mind_swap.target_requires_key = FALSE + mind_swap.Grant(swapper) + + // Perform a cast from the very base - mimics a click + var/result = mind_swap.InterceptClickOn(swapper, null, to_swap) + TEST_ASSERT(result, "[mind_swap] spell: Mind swap returned \"false\" from InterceptClickOn / cast, despite having valid conditions.") + + TEST_ASSERT_EQUAL(swapper.mind, to_swap_mind, "[mind_swap] spell: Despite returning \"true\" on cast, swap failed to relocate the minds of the caster and the target.") + TEST_ASSERT_EQUAL(to_swap.mind, swapper_mind, "[mind_swap] spell: Despite returning \"true\" on cast, swap failed to relocate the minds of the target and the caster.") + + var/datum/action/cooldown/spell/pointed/mind_transfer/should_be_null = locate() in swapper.actions + var/datum/action/cooldown/spell/pointed/mind_transfer/should_not_be_null = locate() in to_swap.actions + + TEST_ASSERT(!isnull(should_not_be_null), "[mind_swap] spell: The spell was not transferred to the caster's new body, despite successful mind reolcation.") + TEST_ASSERT(isnull(should_be_null), "[mind_swap] spell: The spell remained on the caster's original body, despite successful mind relocation.") + + qdel(mind_swap) diff --git a/code/modules/unit_tests/spell_names.dm b/code/modules/unit_tests/spell_names.dm new file mode 100644 index 00000000000000..df8a42ae3da447 --- /dev/null +++ b/code/modules/unit_tests/spell_names.dm @@ -0,0 +1,32 @@ +/** + * Validates that all spells have a different name. + * + * Spell names are used for debugging in some places + * as well as an option for admins giving out spells, + * so every spell should have a distinct name. + * + * If you're making a subtype with only one or two big changes, + * consider adding an adjective to the name. + * + * "Lesser Fireball" for a subtype of Fireball with a shorter cooldown. + * "Deadly Magic Missile" for a subtype of Magic Missile that does damage, etc. + */ +/datum/unit_test/spell_names + +/datum/unit_test/spell_names/Run() + + var/list/types_to_test = typesof(/datum/action/cooldown/spell) + + var/list/existing_names = list() + for(var/datum/action/cooldown/spell/spell_type as anything in types_to_test) + var/spell_name = initial(spell_type.name) + if(spell_name == "Spell") + continue + + if(spell_name in existing_names) + Fail("Spell: [spell_name] ([spell_type]) had a name identical to another spell. \ + This can cause confusion for admins giving out spells, and while debugging. \ + Consider giving the name an adjective if it's a subtype. (\"Greater\", \"Lesser\", \"Deadly\".)") + continue + + existing_names += spell_name diff --git a/code/modules/unit_tests/spell_shapeshift.dm b/code/modules/unit_tests/spell_shapeshift.dm new file mode 100644 index 00000000000000..0aebbd7e492907 --- /dev/null +++ b/code/modules/unit_tests/spell_shapeshift.dm @@ -0,0 +1,20 @@ +/** + * Validates that all shapeshift type spells + * have a valid possible_shapes setup. + */ +/datum/unit_test/shapeshift_spell_validity + +/datum/unit_test/shapeshift_spell_validity/Run() + + var/list/types_to_test = subtypesof(/datum/action/cooldown/spell/shapeshift) + + for(var/spell_type in types_to_test) + var/datum/action/cooldown/spell/shapeshift/shift = new spell_type() + if(!LAZYLEN(shift.possible_shapes)) + Fail("Shapeshift spell: [shift] ([spell_type]) did not have any possible shapeshift options.") + + for(var/shift_type in shift.possible_shapes) + if(!ispath(shift_type, /mob/living)) + Fail("Shapeshift spell: [shift] had an invalid / non-living shift type ([shift_type]) in their possible shapes list.") + + qdel(shift) diff --git a/code/modules/unit_tests/unit_test.dm b/code/modules/unit_tests/unit_test.dm index 4359d2f1de0e07..ea8e75c9e4a451 100644 --- a/code/modules/unit_tests/unit_test.dm +++ b/code/modules/unit_tests/unit_test.dm @@ -84,6 +84,30 @@ GLOBAL_LIST_EMPTY(unit_test_mapping_logs) allocated += instance return instance +/datum/unit_test/proc/test_screenshot(name, icon/icon) + if (!istype(icon)) + TEST_FAIL("[icon] is not an icon.") + return + + var/path_prefix = replacetext(replacetext("[type]", "/datum/unit_test/", ""), "/", "_") + name = replacetext(name, "/", "_") + + var/filename = "code/modules/unit_tests/screenshots/[path_prefix]_[name].png" + + if (fexists(filename)) + var/data_filename = "data/screenshots/[path_prefix]_[name].png" + fcopy(icon, data_filename) + log_test("[path_prefix]_[name] was found, putting in data/screenshots") + else if (fexists("code")) + // We are probably running in a local build + fcopy(icon, filename) + TEST_FAIL("Screenshot for [name] did not exist. One has been created.") + else + // We are probably running in real CI, so just pretend it worked and move on + fcopy(icon, "data/screenshots_new/[path_prefix]_[name].png") + + log_test("[path_prefix]_[name] was put in data/screenshots_new") + /proc/RunUnitTest(test_path, list/test_results) var/datum/unit_test/test = new test_path diff --git a/code/modules/unit_tests/wizard.dm b/code/modules/unit_tests/wizard_loadout.dm similarity index 95% rename from code/modules/unit_tests/wizard.dm rename to code/modules/unit_tests/wizard_loadout.dm index 22343884eb91d5..7c5dd6e68431b1 100644 --- a/code/modules/unit_tests/wizard.dm +++ b/code/modules/unit_tests/wizard_loadout.dm @@ -3,6 +3,8 @@ // May this never happen again. /// Test loadouts for crashes, runtimes, stack traces and infinite loops. No ASSERTs necessary. +/datum/unit_test/wizard_loadout + /datum/unit_test/wizard_loadout/Run() for(var/loadout in ALL_WIZARD_LOADOUTS) var/obj/item/spellbook/wizard_book = allocate(/obj/item/spellbook) diff --git a/code/modules/uplink/uplink_items/job.dm b/code/modules/uplink/uplink_items/job.dm index 11ca1df7596fd7..378f52fb897f49 100644 --- a/code/modules/uplink/uplink_items/job.dm +++ b/code/modules/uplink/uplink_items/job.dm @@ -254,6 +254,17 @@ cost = 20 restricted_roles = list(JOB_CLOWN) +/datum/uplink_item/role_restricted/concealed_weapon_bay + name = "Concealed Weapon Bay" + desc = "A modification for non-combat exosuits that allows them to equip one piece of equipment designed for combat units. \ + Attach to an exosuit with an existing equipment to disguise the bay as that equipment. The sacrificed equipment will be lost.\ + Alternatively, you can attach the bay to an empty equipment slot, but the bay will not be concealed. Once the bay is \ + attached, an exosuit weapon can be fitted inside." + progression_minimum = 30 MINUTES + item = /obj/item/mecha_parts/mecha_equipment/concealed_weapon_bay + cost = 3 + restricted_roles = list(JOB_ROBOTICIST, JOB_RESEARCH_DIRECTOR) + /datum/uplink_item/role_restricted/his_grace name = "His Grace" desc = "An incredibly dangerous weapon recovered from a station overcome by the grey tide. Once activated, He will thirst for blood and must be used to kill to sate that thirst. \ diff --git a/code/modules/vehicles/atv.dm b/code/modules/vehicles/atv.dm index 88d9431e0d1398..581bfb94e990ec 100644 --- a/code/modules/vehicles/atv.dm +++ b/code/modules/vehicles/atv.dm @@ -89,7 +89,7 @@ if(DT_PROB(10, delta_time)) return var/datum/effect_system/fluid_spread/smoke/smoke = new - smoke.set_up(0, location = src) + smoke.set_up(0, holder = src, location = src) smoke.start() /obj/vehicle/ridden/atv/bullet_act(obj/projectile/P) diff --git a/code/modules/vehicles/cars/clowncar.dm b/code/modules/vehicles/cars/clowncar.dm index 33611a96784ff2..45660c439538e2 100644 --- a/code/modules/vehicles/cars/clowncar.dm +++ b/code/modules/vehicles/cars/clowncar.dm @@ -155,8 +155,8 @@ randomchems.my_atom = src randomchems.add_reagent(get_random_reagent_id(), 100) var/datum/effect_system/fluid_spread/foam/foam = new - foam.set_up(200, loc, randomchems) - foam.start() + foam.set_up(200, holder = src, location = loc, carry = randomchems) + foam.start(log = TRUE) if(3) visible_message(span_danger("[user] presses one of the colorful buttons on [src], and the clown car turns on its singularity disguise system.")) icon = 'icons/obj/singularity.dmi' @@ -168,9 +168,9 @@ funnychems.my_atom = src funnychems.add_reagent(/datum/reagent/consumable/superlaughter, 50) var/datum/effect_system/fluid_spread/smoke/chem/smoke = new() - smoke.set_up(4, location = src, carry = funnychems) + smoke.set_up(4, holder = src, location = src, carry = funnychems) smoke.attach(src) - smoke.start() + smoke.start(log = TRUE) if(5) visible_message(span_danger("[user] presses one of the colorful buttons on [src], and the clown car starts dropping an oil trail.")) RegisterSignal(src, COMSIG_MOVABLE_MOVED, .proc/cover_in_oil) diff --git a/code/modules/vehicles/mecha/_mecha.dm b/code/modules/vehicles/mecha/_mecha.dm index 4e4759b29f5db2..a87860ae15fe9b 100644 --- a/code/modules/vehicles/mecha/_mecha.dm +++ b/code/modules/vehicles/mecha/_mecha.dm @@ -211,7 +211,7 @@ spark_system.set_up(2, 0, src) spark_system.attach(src) - smoke_system.set_up(3, location = src) + smoke_system.set_up(3, holder = src, location = src) smoke_system.attach(src) radio = new(src) diff --git a/code/modules/vehicles/mecha/combat/durand.dm b/code/modules/vehicles/mecha/combat/durand.dm index 83eb2616a1768e..17b84ad7ed8cd8 100644 --- a/code/modules/vehicles/mecha/combat/durand.dm +++ b/code/modules/vehicles/mecha/combat/durand.dm @@ -21,7 +21,7 @@ /obj/vehicle/sealed/mecha/combat/durand/Initialize(mapload) . = ..() - shield = new /obj/durand_shield(loc, src, layer, dir) + shield = new /obj/durand_shield(loc, src, plane, layer, dir) RegisterSignal(src, COMSIG_MECHA_ACTION_TRIGGER, .proc/relay) RegisterSignal(src, COMSIG_PROJECTILE_PREHIT, .proc/prehit) @@ -158,28 +158,34 @@ own integrity back to max. Shield is automatically dropped if we run out of powe light_power = 5 light_color = LIGHT_COLOR_ELECTRIC_CYAN light_on = FALSE + resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF //The shield should not take damage from fire, lava, or acid; that's the mech's job. ///Our link back to the durand var/obj/vehicle/sealed/mecha/combat/durand/chassis ///To keep track of things during the animation var/switching = FALSE - var/currentuser - resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF //The shield should not take damage from fire, lava, or acid; that's the mech's job. - -/obj/durand_shield/Initialize(mapload, _chassis, _layer, _dir) +/obj/durand_shield/Initialize(mapload, chassis, plane, layer, dir) . = ..() - chassis = _chassis - layer = _layer - setDir(_dir) + src.chassis = chassis + src.layer = layer + src.plane = plane + setDir(dir) RegisterSignal(src, COMSIG_MECHA_ACTION_TRIGGER, .proc/activate) + RegisterSignal(chassis, COMSIG_MOVABLE_UPDATE_GLIDE_SIZE, .proc/shield_glide_size_update) /obj/durand_shield/Destroy() + UnregisterSignal(src, COMSIG_MECHA_ACTION_TRIGGER) if(chassis) + UnregisterSignal(chassis, COMSIG_MOVABLE_UPDATE_GLIDE_SIZE) chassis.shield = null chassis = null return ..() +/obj/durand_shield/proc/shield_glide_size_update(datum/source, target) + SIGNAL_HANDLER + glide_size = target + /** * Handles activating and deactivating the shield. * @@ -195,7 +201,6 @@ own integrity back to max. Shield is automatically dropped if we run out of powe */ /obj/durand_shield/proc/activate(datum/source, mob/owner, list/signal_args) SIGNAL_HANDLER - currentuser = owner if(!LAZYLEN(chassis?.occupants)) return if(switching && !signal_args[1]) @@ -229,10 +234,21 @@ own integrity back to max. Shield is automatically dropped if we run out of powe playsound(src, 'sound/mecha/mech_shield_drop.ogg', 50, FALSE) set_light(0) icon_state = "shield_null" - invisibility = INVISIBILITY_MAXIMUM //no showing on right-click + addtimer(CALLBACK(src, .proc/make_invisible), 1 SECONDS, TIMER_UNIQUE|TIMER_OVERRIDE) UnregisterSignal(chassis, COMSIG_ATOM_DIR_CHANGE) switching = FALSE +/** + * Sets invisibility to INVISIBILITY_MAXIMUM if defense mode is disabled + * + * We need invisibility set to higher than 25 for the shield to not appear + * in the right-click context menu, but if we do it too early, we miss the + * deactivate animation. Hense, timer and this proc. + */ +/obj/durand_shield/proc/make_invisible() + if(!chassis.defense_mode) + invisibility = INVISIBILITY_MAXIMUM + /obj/durand_shield/proc/resetdir(datum/source, olddir, newdir) SIGNAL_HANDLER setDir(newdir) diff --git a/code/modules/vehicles/mecha/equipment/mecha_equipment.dm b/code/modules/vehicles/mecha/equipment/mecha_equipment.dm index 38b7f2cd4b7597..8d3a52d071e875 100644 --- a/code/modules/vehicles/mecha/equipment/mecha_equipment.dm +++ b/code/modules/vehicles/mecha/equipment/mecha_equipment.dm @@ -43,6 +43,8 @@ if(can_attach(M, attach_right)) if(!user.temporarilyRemoveItemFromInventory(src)) return FALSE + if(special_attaching_interaction(attach_right, M, user)) + return TRUE //The rest is handled in the special interactions proc attach(M, attach_right) user.visible_message(span_notice("[user] attaches [src] to [M]."), span_notice("You attach [src] to [M].")) return TRUE @@ -87,6 +89,9 @@ if(chassis.equipment_disabled) to_chat(chassis.occupants, span_warning("Error -- Equipment control unit is unresponsive.")) return FALSE + if(get_integrity() <= 1) + to_chat(chassis.occupants, span_warning("Error -- Equipment critically damaged.")) + return FALSE if(TIMER_COOLDOWN_CHECK(chassis, COOLDOWN_MECHA_EQUIPMENT(type))) return FALSE return TRUE @@ -126,14 +131,28 @@ return FALSE if(equipment_slot == MECHA_WEAPON) if(attach_right) - if(mech.equip_by_category[MECHA_R_ARM]) + if(mech.equip_by_category[MECHA_R_ARM] && (!special_attaching_interaction(attach_right, mech, checkonly = TRUE))) return FALSE else - if(mech.equip_by_category[MECHA_L_ARM]) + if(mech.equip_by_category[MECHA_L_ARM] && (!special_attaching_interaction(attach_right, mech, checkonly = TRUE))) return FALSE return TRUE return length(mech.equip_by_category[equipment_slot]) < mech.max_equip_by_category[equipment_slot] +/** + * Special Attaching Interaction, used to bypass normal attachment procs. + * + * If an equipment needs to bypass the regular chain of events, this proc can be used to allow for that. If used, it + * must handle actually calling attach(), as well as any feedback to the user. + * Args: + * * attach_right: True if attaching the the right-hand equipment slot, false otherwise. + * * mech: ref to the mecha that we're attaching onto. + * * user: ref to the mob doing the attaching + * * checkonly: check if we are able to handle the attach procedure ourselves, but don't actually do it yet. + */ +/obj/item/mecha_parts/mecha_equipment/proc/special_attaching_interaction(attach_right = FALSE, obj/vehicle/sealed/mecha/mech, mob/user, checkonly = FALSE) + return FALSE + /obj/item/mecha_parts/mecha_equipment/proc/attach(obj/vehicle/sealed/mecha/M, attach_right = FALSE) LAZYADD(M.flat_equipment, src) var/to_equip_slot = equipment_slot diff --git a/code/modules/vehicles/mecha/equipment/tools/other_tools.dm b/code/modules/vehicles/mecha/equipment/tools/other_tools.dm index 0bdfc2b72f732e..c06ec657a6e59f 100644 --- a/code/modules/vehicles/mecha/equipment/tools/other_tools.dm +++ b/code/modules/vehicles/mecha/equipment/tools/other_tools.dm @@ -468,3 +468,46 @@ generate_effect(movement_dir) return TRUE return FALSE + +///////////////////////////////////// CONCEALED WEAPON BAY //////////////////////////////////////// + +/obj/item/mecha_parts/mecha_equipment/concealed_weapon_bay + name = "concealed weapon bay" + desc = "A compartment that allows a non-combat mecha to equip one weapon while hiding the weapon from plain sight." + icon_state = "mecha_weapon_bay" + +/obj/item/mecha_parts/mecha_equipment/concealed_weapon_bay/try_attach_part(mob/user, obj/vehicle/sealed/mecha/M) + if(istype(M, /obj/vehicle/sealed/mecha/combat)) + to_chat(user, span_warning("[M] does not have the correct bolt configuration!")) + return + return ..() + +/obj/item/mecha_parts/mecha_equipment/concealed_weapon_bay/special_attaching_interaction(attach_right = FALSE, obj/vehicle/sealed/mecha/mech, mob/user, checkonly = FALSE) + if(checkonly) + return TRUE + var/obj/item/mecha_parts/mecha_equipment/existing_equip + if(attach_right) + existing_equip = mech.equip_by_category[MECHA_R_ARM] + else + existing_equip = mech.equip_by_category[MECHA_L_ARM] + if(existing_equip) + name = existing_equip.name + icon = existing_equip.icon + icon_state = existing_equip.icon_state + existing_equip.detach() + existing_equip.Destroy() + user.visible_message(span_notice("[user] hollows out [src] and puts something in."), span_notice("You attach the concealed weapon bay to [mech] within the shell of [src].")) + else + user.visible_message(span_notice("[user] attaches [src] to [mech]."), span_notice("You attach [src] to [mech].")) + attach(mech, attach_right) + mech.mech_type |= EXOSUIT_MODULE_CONCEALED_WEP_BAY + return TRUE + +/obj/item/mecha_parts/mecha_equipment/concealed_weapon_bay/detach(atom/moveto) + var/obj/vehicle/sealed/mecha/mech = chassis + . = ..() + name = initial(name) + icon = initial(icon) + icon_state = initial(icon_state) + if(!locate(/obj/item/mecha_parts/mecha_equipment/concealed_weapon_bay) in mech.contents) //if no others exist + mech.mech_type &= ~EXOSUIT_MODULE_CONCEALED_WEP_BAY diff --git a/code/modules/vehicles/mecha/equipment/weapons/weapons.dm b/code/modules/vehicles/mecha/equipment/weapons/weapons.dm index a1778c3af2b3c9..f431072dc29efd 100644 --- a/code/modules/vehicles/mecha/equipment/weapons/weapons.dm +++ b/code/modules/vehicles/mecha/equipment/weapons/weapons.dm @@ -13,13 +13,40 @@ var/firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect //the visual effect appearing when the weapon is fired. var/kickback = TRUE //Will using this weapon in no grav push mecha back. -/obj/item/mecha_parts/mecha_equipment/weapon/can_attach(obj/vehicle/sealed/mecha/M, attach_right = FALSE) +/obj/item/mecha_parts/mecha_equipment/weapon/can_attach(obj/vehicle/sealed/mecha/mech, attach_right = FALSE) if(!..()) return FALSE - if(istype(M, /obj/vehicle/sealed/mecha/combat)) + if(mech.mech_type & EXOSUIT_MODULE_COMBAT) return TRUE return FALSE +/obj/item/mecha_parts/mecha_equipment/weapon/special_attaching_interaction(attach_right = FALSE, obj/vehicle/sealed/mecha/mech, mob/user, checkonly = FALSE) + var/obj/item/mecha_parts/mecha_equipment/concealed_weapon_bay/bay + if(attach_right) + bay = mech.equip_by_category[MECHA_R_ARM] + else + bay = mech.equip_by_category[MECHA_L_ARM] + if(!istype(bay)) + return FALSE //No bay, use normal attach procs + if(checkonly) + return TRUE + name = bay.name + icon = bay.icon + icon_state = bay.icon_state + bay.detach() + bay.forceMove(src) //for later detaching + attach(mech, attach_right) + user.visible_message(span_notice("[user] inserts something into [src]."), span_notice("You attach the [initial(name)] into the concealed weapon bay.")) + return TRUE + +/obj/item/mecha_parts/mecha_equipment/weapon/detach(atom/moveto) + for(var/obj/item/mecha_parts/mecha_equipment/concealed_weapon_bay/bay in contents) + bay.forceMove(get_turf(chassis)) + name = initial(name) + icon = initial(icon) + icon_state = initial(icon_state) + return ..() + /obj/item/mecha_parts/mecha_equipment/weapon/action(mob/source, atom/target, list/modifiers) if(!action_checks(target)) return FALSE diff --git a/code/modules/vehicles/mecha/mecha_defense.dm b/code/modules/vehicles/mecha/mecha_defense.dm index c8a4b6322afb34..9b25bbb6c7be69 100644 --- a/code/modules/vehicles/mecha/mecha_defense.dm +++ b/code/modules/vehicles/mecha/mecha_defense.dm @@ -25,24 +25,31 @@ gear = equip_by_category[MECHA_R_ARM] if(!gear) return - var/brokenstatus = gear.get_integrity() + var/component_health = gear.get_integrity() // always leave at least 1 health - brokenstatus-- - var/damage_to_deal = min(brokenstatus, damage) - if(!damage_to_deal) + var/damage_to_deal = min(component_health - 1, damage) + if(damage_to_deal <= 0) return + gear.take_damage(damage_to_deal) + if(gear.get_integrity() <= 1) + to_chat(occupants, "[icon2html(src, occupants)][span_danger("[gear] is critically damaged!")]") + playsound(src, gear.destroy_sound, 50) -/obj/vehicle/sealed/mecha/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir) - . = ..() - if(. && atom_integrity > 0) - spark_system.start() - try_deal_internal_damage(.) - if(. >= 5 || prob(33)) - to_chat(occupants, "[icon2html(src, occupants)][span_userdanger("Taking damage!")]") - log_message("Took [.] points of damage. Damage type: [damage_type]", LOG_MECHA) - -/obj/vehicle/sealed/mecha/run_atom_armor(damage_amount, damage_type, damage_flag = 0, attack_dir, armour_penentration) +/obj/vehicle/sealed/mecha/take_damage(damage_amount, damage_type = BRUTE, damage_flag = "", sound_effect = TRUE, attack_dir, armour_penetration = 0) + var/damage_taken = ..() + if(damage_taken <= 0 || atom_integrity < 0) + return damage_taken + + spark_system.start() + try_deal_internal_damage(damage_taken) + if(damage_taken >= 5 || prob(33)) + to_chat(occupants, "[icon2html(src, occupants)][span_userdanger("Taking damage!")]") + log_message("Took [damage_taken] points of damage. Damage type: [damage_type]", LOG_MECHA) + + return damage_taken + +/obj/vehicle/sealed/mecha/run_atom_armor(damage_amount, damage_type, damage_flag = 0, attack_dir, armour_penetration) . = ..() if(attack_dir) var/facing_modifier = get_armour_facing(abs(dir2angle(dir) - dir2angle(attack_dir))) @@ -113,7 +120,13 @@ return BULLET_ACT_HIT log_message("Hit by projectile. Type: [hitting_projectile]([hitting_projectile.damage_type]).", LOG_MECHA, color="red") // yes we *have* to run the armor calc proc here I love tg projectile code too - try_damage_component(run_atom_armor(hitting_projectile.damage, hitting_projectile.damage_type, hitting_projectile.damage_type, 0, REVERSE_DIR(hitting_projectile.dir), hitting_projectile.armour_penetration), hitting_projectile.def_zone) + try_damage_component(run_atom_armor( + damage_amount = hitting_projectile.damage, + damage_type = hitting_projectile.damage_type, + damage_flag = hitting_projectile.armor_flag, + attack_dir = REVERSE_DIR(hitting_projectile.dir), + armour_penetration = hitting_projectile.armour_penetration, + ), hitting_projectile.def_zone) return ..() /obj/vehicle/sealed/mecha/ex_act(severity, target) @@ -258,11 +271,26 @@ var/obj/item/mecha_parts/P = W P.try_attach_part(user, src, FALSE) return - . = ..() - log_message("Attacked by [W]. Attacker - [user], Damage - [.]", LOG_MECHA) - if(isliving(user)) - var/mob/living/living_user = user - try_damage_component(., living_user.zone_selected) + + return ..() + +/obj/vehicle/sealed/mecha/attacked_by(obj/item/attacking_item, mob/living/user) + if(!attacking_item.force) + return + + var/damage_taken = take_damage(attacking_item.force * attacking_item.demolition_mod, attacking_item.damtype, MELEE, 1) + try_damage_component(damage_taken, user.zone_selected) + + var/hit_verb = length(attacking_item.attack_verb_simple) ? "[pick(attacking_item.attack_verb_simple)]" : "hit" + user.visible_message( + span_danger("[user] [hit_verb][plural_s(hit_verb)] [src] with [attacking_item][damage_taken ? "." : ", without leaving a mark!"]"), + span_danger("You [hit_verb] [src] with [attacking_item][damage_taken ? "." : ", without leaving a mark!"]"), + span_hear("You hear a [hit_verb]."), + COMBAT_MESSAGE_RANGE, + ) + + log_combat(user, src, "attacked", attacking_item) + log_message("Attacked by [user]. Item - [attacking_item], Damage - [damage_taken]", LOG_MECHA) /obj/vehicle/sealed/mecha/wrench_act(mob/living/user, obj/item/I) ..() diff --git a/code/modules/vehicles/mecha/mecha_mob_interaction.dm b/code/modules/vehicles/mecha/mecha_mob_interaction.dm index aa3f6f3f56fba4..de2e6b68c759de 100644 --- a/code/modules/vehicles/mecha/mecha_mob_interaction.dm +++ b/code/modules/vehicles/mecha/mecha_mob_interaction.dm @@ -4,7 +4,7 @@ if(HAS_TRAIT(M, TRAIT_PRIMITIVE)) //no lavalizards either. to_chat(M, span_warning("The knowledge to use this device eludes you!")) return - log_message("[M] tries to move into [src].", LOG_MECHA) + log_message("[M] tried to move into [src].", LOG_MECHA) if(dna_lock && M.has_dna()) var/mob/living/carbon/entering_carbon = M if(entering_carbon.dna.unique_enzymes != dna_lock) diff --git a/code/modules/vehicles/secway.dm b/code/modules/vehicles/secway.dm index 1a2e64724419fe..651bf3a89e5966 100644 --- a/code/modules/vehicles/secway.dm +++ b/code/modules/vehicles/secway.dm @@ -25,7 +25,7 @@ if(DT_PROB(10, delta_time)) return var/datum/effect_system/fluid_spread/smoke/smoke = new - smoke.set_up(0, location = src) + smoke.set_up(0, holder = src, location = src) smoke.start() /obj/vehicle/ridden/secway/welder_act(mob/living/user, obj/item/I) diff --git a/code/modules/vehicles/vehicle_actions.dm b/code/modules/vehicles/vehicle_actions.dm index f2ec9cd44f52ee..b74f94521b7233 100644 --- a/code/modules/vehicles/vehicle_actions.dm +++ b/code/modules/vehicles/vehicle_actions.dm @@ -282,6 +282,19 @@ owner.say("Thank you for the fun ride, [clown.name]!") clown_car.increment_thanks_counter() +/datum/action/vehicle/ridden/wheelchair/bell + name = "Bell Ring" + desc = "Ring the bell." + icon_icon = 'icons/obj/bureaucracy.dmi' + button_icon_state = "desk_bell" + check_flags = AB_CHECK_CONSCIOUS + var/bell_cooldown + +/datum/action/vehicle/ridden/wheelchair/bell/Trigger(trigger_flags) + if(TIMER_COOLDOWN_CHECK(src, bell_cooldown)) + return + TIMER_COOLDOWN_START(src, bell_cooldown, 0.5 SECONDS) + playsound(vehicle_ridden_target, 'sound/machines/microwave/microwave-end.ogg', 70) /datum/action/vehicle/ridden/scooter/skateboard/ollie name = "Ollie" diff --git a/code/modules/vehicles/wheelchair.dm b/code/modules/vehicles/wheelchair.dm index 6dee4da1d05b1c..d055615580188b 100644 --- a/code/modules/vehicles/wheelchair.dm +++ b/code/modules/vehicles/wheelchair.dm @@ -14,6 +14,14 @@ var/image/wheels_overlay ///Determines the typepath of what the object folds into var/foldabletype = /obj/item/wheelchair + ///Bell attached to the wheelchair, if we have one. + var/obj/structure/desk_bell/bell_attached + +/obj/vehicle/ridden/wheelchair/generate_actions() + . = ..() + if(!bell_attached) + return + initialize_controller_action_type(/datum/action/vehicle/ridden/wheelchair/bell, VEHICLE_CONTROL_DRIVE) /obj/vehicle/ridden/wheelchair/Initialize(mapload) . = ..() @@ -56,6 +64,9 @@ . = ..() if(has_buckled_mobs()) . += wheels_overlay + if(bell_attached) + . += "wheelchair_bell" + /// I assign the ridable element in this so i don't have to fuss with hand wheelchairs and motor wheelchairs having different subtypes /obj/vehicle/ridden/wheelchair/proc/make_ridable() @@ -117,3 +128,28 @@ var/obj/vehicle/ridden/wheelchair/wheelchair_unfolded = new unfolded_type(location) wheelchair_unfolded.add_fingerprint(user) qdel(src) + + +///attaches bell to the wheelchair +/obj/vehicle/ridden/wheelchair/proc/attach_bell(obj/structure/desk_bell/bell) + bell_attached = bell + bell.forceMove(src) + generate_actions() + update_appearance() + +/obj/vehicle/ridden/wheelchair/examine(mob/user) + . =..() + if(bell_attached) + . += span_notice("There is \a [bell_attached] attached to the handle.") + +/obj/vehicle/ridden/wheelchair/Destroy() + if(bell_attached) + remove_bell() + return ..() + +/obj/vehicle/ridden/wheelchair/proc/remove_bell() + bell_attached.forceMove(get_turf(src)) + usr.visible_message(span_notice("[bell_attached] falls off!")) + bell_attached = null + update_appearance() + diff --git a/code/modules/vending/_vending.dm b/code/modules/vending/_vending.dm index 8ca7bd1e13c14d..0656327c4f924b 100644 --- a/code/modules/vending/_vending.dm +++ b/code/modules/vending/_vending.dm @@ -1329,6 +1329,8 @@ GLOBAL_LIST_EMPTY(vending_products) icon_state = "greed" icon_deny = "greed-deny" panel_type = "panel4" + max_integrity = 700 + max_loaded_items = 40 light_mask = "greed-light-mask" custom_materials = list(/datum/material/gold = MINERAL_MATERIAL_AMOUNT * 5) diff --git a/code/modules/vending/medical.dm b/code/modules/vending/medical.dm index ed0a4a58ef9029..0f33fe7a5ff035 100644 --- a/code/modules/vending/medical.dm +++ b/code/modules/vending/medical.dm @@ -17,6 +17,7 @@ /obj/item/stack/medical/ointment = 2, /obj/item/stack/medical/suture = 2, /obj/item/stack/medical/bone_gel/four = 4, + /obj/item/cane/white = 2, ) contraband = list( /obj/item/storage/box/gum/happiness = 3, diff --git a/code/modules/vending/megaseed.dm b/code/modules/vending/megaseed.dm index d9ca3c40bc8d95..95d31ae47ef30e 100644 --- a/code/modules/vending/megaseed.dm +++ b/code/modules/vending/megaseed.dm @@ -31,6 +31,7 @@ /obj/item/seeds/korta_nut = 3, /obj/item/seeds/lemon = 3, /obj/item/seeds/lime = 3, + /obj/item/seeds/olive = 3, /obj/item/seeds/onion = 3, /obj/item/seeds/orange = 3, /obj/item/seeds/peas = 3, diff --git a/code/modules/vending/toys.dm b/code/modules/vending/toys.dm index d969c25a75039d..e3f3b3316f2448 100644 --- a/code/modules/vending/toys.dm +++ b/code/modules/vending/toys.dm @@ -17,7 +17,7 @@ /obj/item/toy/foamblade = 10, /obj/item/toy/balloon/syndicate = 10, /obj/item/clothing/suit/syndicatefake = 5, - /obj/item/clothing/head/syndicatefake = 5,, + /obj/item/clothing/head/syndicatefake = 5, ) contraband = list( /obj/item/gun/ballistic/shotgun/toy/crossbow = 10, diff --git a/code/modules/wiremod/components/action/laserpointer.dm b/code/modules/wiremod/components/action/laserpointer.dm index d3eb5e13a1ebeb..6f11f69f73c5cc 100644 --- a/code/modules/wiremod/components/action/laserpointer.dm +++ b/code/modules/wiremod/components/action/laserpointer.dm @@ -1,4 +1,3 @@ - /** * # laser pointer Component * @@ -10,9 +9,6 @@ category = "Action" circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL|CIRCUIT_FLAG_OUTPUT_SIGNAL -/// The Laser Pointer Variables - var/turf/pointer_loc - /// The input port var/datum/port/input/target_input var/datum/port/input/image_pixel_x = 0 @@ -47,7 +43,7 @@ var/atom/target = target_input.value var/atom/movable/shell = parent.shell - var/turf/targloc = get_turf(target) + var/turf/target_location = get_turf(target) var/pointer_icon_state = lasercolour_option.value @@ -56,20 +52,17 @@ if(get_dist(current_turf, target) > max_range || current_turf.z != target.z) return - /// only has cyborg flashing since felinid moving spikes time dilation when spammed and the other two features of laserpointers would be unbalanced when spammed + // only has cyborg flashing since felinid moving spikes time dilation when spammed and the other two features of laserpointers would be unbalanced when spammed if(iscyborg(target)) var/mob/living/silicon/silicon = target log_combat(shell, silicon, "shone in the sensors", src) - silicon.flash_act(affect_silicon = 1) /// no stunning, just a blind + silicon.flash_act(affect_silicon = TRUE) /// no stunning, just a blind to_chat(silicon, span_danger("Your sensors were overloaded by a weakened laser shone by [shell]!")) - - ///laserpointer image - var/image/laser_location = image('icons/obj/guns/projectiles.dmi',targloc,"[pointer_icon_state]_laser",10) + var/image/laser_location = image('icons/obj/guns/projectiles.dmi',target_location,"[pointer_icon_state]_laser",10) laser_location.pixel_x = clamp(target.pixel_x + image_pixel_x.value,-15,15) laser_location.pixel_y = clamp(target.pixel_y + image_pixel_y.value,-15,15) - flick_overlay_view(laser_location, targloc, 10) - - + target_location.add_overlay(laser_location) + addtimer(CALLBACK(target_location, /atom/proc/cut_overlay, laser_location), 1 SECONDS) diff --git a/code/modules/wiremod/components/action/soundemitter.dm b/code/modules/wiremod/components/action/soundemitter.dm index 1ca4f3db588100..ea43e937711c58 100644 --- a/code/modules/wiremod/components/action/soundemitter.dm +++ b/code/modules/wiremod/components/action/soundemitter.dm @@ -15,22 +15,35 @@ /// Volume of the sound when played var/datum/port/input/volume + /// Whether to play the sound backwards + var/datum/port/input/backwards + /// Frequency of the sound when played var/datum/port/input/frequency /// The cooldown for this component of how often it can play sounds. var/sound_cooldown = 2 SECONDS + /// The maximum pitch this component can play sounds at. + var/max_pitch = 50 + /// The minimum pitch this component can play sounds at. + var/min_pitch = -50 + /// The maximum volume this component can play sounds at. + var/max_volume = 30 + var/list/options_map /obj/item/circuit_component/soundemitter/get_ui_notices() . = ..() . += create_ui_notice("Sound Cooldown: [DisplayTimeText(sound_cooldown)]", "orange", "stopwatch") + if(CONFIG_GET(flag/disallow_circuit_sounds)) + . += create_ui_notice("Non-functional", "red", "exclamation") /obj/item/circuit_component/soundemitter/populate_ports() volume = add_input_port("Volume", PORT_TYPE_NUMBER, default = 35) frequency = add_input_port("Frequency", PORT_TYPE_NUMBER, default = 0) + backwards = add_input_port("Play Backwards", PORT_TYPE_NUMBER, default = 0) /obj/item/circuit_component/soundemitter/populate_options() var/static/component_options = list( @@ -61,9 +74,16 @@ /obj/item/circuit_component/soundemitter/pre_input_received(datum/port/input/port) volume.set_value(clamp(volume.value, 0, 100)) - frequency.set_value(clamp(frequency.value, -100, 100)) + frequency.set_value(clamp(frequency.value, min_pitch, max_pitch)) + backwards.set_value(clamp(backwards.value, 0, 1)) /obj/item/circuit_component/soundemitter/input_received(datum/port/input/port) + if(CONFIG_GET(flag/disallow_circuit_sounds)) + ui_color = "red" + return + else + ui_color = initial(ui_color) + if(TIMER_COOLDOWN_CHECK(parent, COOLDOWN_CIRCUIT_SOUNDEMITTER)) return @@ -71,6 +91,12 @@ if(!sound_to_play) return - playsound(src, sound_to_play, volume.value, frequency != 0, frequency = frequency.value) + var/actual_frequency = 1 + (frequency.value/100) + var/actual_volume = max_volume * (volume.value/100) + + if(backwards.value) + actual_frequency = -actual_frequency + + playsound(src, sound_to_play, actual_volume, TRUE, frequency = actual_frequency) TIMER_COOLDOWN_START(parent, COOLDOWN_CIRCUIT_SOUNDEMITTER, sound_cooldown) diff --git a/code/modules/wiremod/components/id/access_checker.dm b/code/modules/wiremod/components/id/access_checker.dm index fddb4f1f39e6d3..5778bd987ed6e3 100644 --- a/code/modules/wiremod/components/id/access_checker.dm +++ b/code/modules/wiremod/components/id/access_checker.dm @@ -1,6 +1,6 @@ /obj/item/circuit_component/compare/access display_name = "Access Checker" - desc = "Performs a basic comparison between two numerical lists, with additional functions that help in using it to check access on IDs." + desc = "Performs a basic comparison between two lists of strings, with additional functions that help in using it to check access on IDs." category = "ID" input_port_amount = 0 //Uses custom ports for its comparisons @@ -26,8 +26,8 @@ . += create_ui_notice("When \"Check Any\" is false, returns true only if \"Access To Check\" contains ALL values in \"Required Access\".", "orange", "info") /obj/item/circuit_component/compare/access/populate_custom_ports() - subject_accesses = add_input_port("Access To Check", PORT_TYPE_LIST(PORT_TYPE_NUMBER)) - required_accesses = add_input_port("Required Access", PORT_TYPE_LIST(PORT_TYPE_NUMBER)) + subject_accesses = add_input_port("Access To Check", PORT_TYPE_LIST(PORT_TYPE_STRING)) + required_accesses = add_input_port("Required Access", PORT_TYPE_LIST(PORT_TYPE_STRING)) check_any = add_input_port("Check Any", PORT_TYPE_NUMBER) /obj/item/circuit_component/compare/access/save_data_to_list(list/component_data) diff --git a/code/modules/wiremod/components/id/access_reader.dm b/code/modules/wiremod/components/id/access_reader.dm index cb576daa7e5f3a..29866f815a9a4e 100644 --- a/code/modules/wiremod/components/id/access_reader.dm +++ b/code/modules/wiremod/components/id/access_reader.dm @@ -19,7 +19,7 @@ /obj/item/circuit_component/id_access_reader/populate_ports() target = add_input_port("Target", PORT_TYPE_ATOM) - access_port = add_output_port("Access", PORT_TYPE_LIST(PORT_TYPE_NUMBER)) + access_port = add_output_port("Access", PORT_TYPE_LIST(PORT_TYPE_STRING)) /obj/item/circuit_component/id_access_reader/input_received(datum/port/input/port) diff --git a/code/modules/wiremod/core/admin_panel.dm b/code/modules/wiremod/core/admin_panel.dm index 33af02f5140e5a..74e72ad5efe0c5 100644 --- a/code/modules/wiremod/core/admin_panel.dm +++ b/code/modules/wiremod/core/admin_panel.dm @@ -29,6 +29,13 @@ if (.) return . + switch(action) + if ("disable_circuit_sound") + CONFIG_SET(flag/disallow_circuit_sounds, !CONFIG_GET(flag/disallow_circuit_sounds)) + message_admins("[key_name_admin(usr)] has toggled all circuit sounds [CONFIG_GET(flag/disallow_circuit_sounds)? "off" : "on"].") + log_admin("[key_name(usr)] has toggled all circuit sounds [CONFIG_GET(flag/disallow_circuit_sounds)? "off" : "on"].") + return TRUE + if (!istext(params["circuit"])) return FALSE diff --git a/code/modules/zombie/items.dm b/code/modules/zombie/items.dm index 38863c56637c03..f7aa485491764d 100644 --- a/code/modules/zombie/items.dm +++ b/code/modules/zombie/items.dm @@ -48,6 +48,10 @@ // zombies) return + // spaceacillin has a 75% chance to block infection + if(istype(target) && target.reagents.has_reagent(/datum/reagent/medicine/spaceacillin) && prob(75)) + return + var/obj/item/organ/internal/zombie_infection/infection infection = target.getorganslot(ORGAN_SLOT_ZOMBIE) if(!infection) diff --git a/config/config.txt b/config/config.txt index 1b87a1ea355387..67b299b086396e 100644 --- a/config/config.txt +++ b/config/config.txt @@ -166,6 +166,9 @@ LOG_TOOLS ## Log all timers on timer auto reset # LOG_TIMERS_ON_BUCKET_RESET +## log speech indicators +LOG_SPEECH_INDICATORS + ##Log camera pictures - Must have picture logging enabled PICTURE_LOGGING_CAMERA diff --git a/config/game_options.txt b/config/game_options.txt index 7fddf818cc6860..cf846a1576938f 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -119,6 +119,9 @@ PROTECT_ROLES_FROM_ANTAGONIST ## If non-human species are barred from joining as a head of staff #ENFORCE_HUMAN_AUTHORITY +## If non-human species are barred from joining as a head of staff, including jobs flagged as allowed for non-humans, ie. Quartermaster. +#ENFORCE_HUMAN_AUTHORITY_ON_EVERYONE + ## If late-joining players have a chance to become a traitor/changeling ALLOW_LATEJOIN_ANTAGONISTS @@ -231,7 +234,6 @@ RANDOM_LAWS corporate ## Quirky laws. Shouldn't cause too much harm #RANDOM_LAWS hippocratic #RANDOM_LAWS maintain -#RANDOM_LAWS drone #RANDOM_LAWS liveandletlive #RANDOM_LAWS peacekeeper #RANDOM_LAWS reporter @@ -243,6 +245,7 @@ RANDOM_LAWS corporate #RANDOM_LAWS ninja #RANDOM_LAWS antimov #RANDOM_LAWS thermodynamic +#RANDOM_LAWS drone ## meme laws. Honk #RANDOM_LAWS buildawall @@ -255,28 +258,36 @@ RANDOM_LAWS corporate LAW_WEIGHT custom,0 ## standard-ish laws. These are fairly ok to run -LAW_WEIGHT asimov,32 -LAW_WEIGHT asimovpp,12 -LAW_WEIGHT paladin,12 -LAW_WEIGHT robocop,12 -LAW_WEIGHT corporate,12 +## Unique AI station trait uses weights so we don't want asimov +LAW_WEIGHT asimov,0 +LAW_WEIGHT asimovpp,5 +LAW_WEIGHT paladin,5 +LAW_WEIGHT paladin5,5 +LAW_WEIGHT robocop,5 +LAW_WEIGHT corporate,5 +LAW_WEIGHT hippocratic,5 +LAW_WEIGHT maintain,5 +LAW_WEIGHT liveandletlive,5 +LAW_WEIGHT peacekeeper,5 +LAW_WEIGHT ten_commandments,5 +LAW_WEIGHT nutimov,5 ## Quirky laws. Shouldn't cause too much harm -LAW_WEIGHT hippocratic,3 -LAW_WEIGHT maintain,4 -LAW_WEIGHT drone,3 -LAW_WEIGHT liveandletlive,3 -LAW_WEIGHT peacekeeper,3 -LAW_WEIGHT reporter,4 -LAW_WEIGHT hulkamania,4 -LAW_WEIGHT ten_commandments,4 +LAW_WEIGHT reporter,3 +LAW_WEIGHT hulkamania,3 +LAW_WEIGHT tyrant,3 +LAW_WEIGHT overlord,3 +LAW_WEIGHT painter,3 +LAW_WEIGHT dungeon_master,3 ## Bad idea laws. Probably shouldn't enable these LAW_WEIGHT syndie,0 LAW_WEIGHT ninja,0 LAW_WEIGHT antimov,0 +LAW_WEIGHT balance,0 LAW_WEIGHT thermodynamic,0 LAW_WEIGHT buildawall,0 +LAW_WEIGHT drone,0 ##------------------------------------------------ @@ -459,10 +470,12 @@ MAXFINE 2000 ## How many played hours of DRONE_REQUIRED_ROLE required to be a Maintenance Done #DRONE_ROLE_PLAYTIME 14 -## Uncomment to enable SDQL spells -## Warning: SDQL is a powerful tool and can break many things or expose security sensitive information. -## Giving players access to it has major security concerns, be careful and deliberate when using this feature. -#SDQL_SPELLS - ## Whether native FoV is enabled for all people. #NATIVE_FOV + +## Whether circuit sounds are allowed to be played or not. +#DISALLOW_CIRCUIT_SOUNDS + +## Comment if you wish to enable title music playing at the lobby screen. This flag is disabled by default to facilitate better code testing on local machines. +## Do keep in mind that this flag will not affect individual player's preferences: if they opt-out on your server, it will never play for them. +DISALLOW_TITLE_MUSIC diff --git a/config/spaceruinblacklist.txt b/config/spaceruinblacklist.txt index 7344159e7bd637..09a77a308490d3 100644 --- a/config/spaceruinblacklist.txt +++ b/config/spaceruinblacklist.txt @@ -19,7 +19,7 @@ #_maps/RandomRuins/SpaceRuins/crashedclownship.dmm #_maps/RandomRuins/SpaceRuins/crashedship.dmm #_maps/RandomRuins/SpaceRuins/deepstorage.dmm -#_maps/RandomRuins/SpaceRuins/derelict1.dmm +#_maps/RandomRuins/SpaceRuins/derelict_sulaco.dmm #_maps/RandomRuins/SpaceRuins/derelict2.dmm #_maps/RandomRuins/SpaceRuins/derelict3.dmm #_maps/RandomRuins/SpaceRuins/derelict4.dmm @@ -52,4 +52,4 @@ #_maps/RandomRuins/SpaceRuins/forgottenship.dmm #_maps/RandomRuins/SpaceRuins/hellfactory.dmm #_maps/RandomRuins/SpaceRuins/space_billboard.dmm -#_maps/RandomRuins/SpaceRuins/spinwardsmoothies.dmm \ No newline at end of file +#_maps/RandomRuins/SpaceRuins/spinwardsmoothies.dmm diff --git a/html/changelogs/AutoChangeLog-pr-67038.yml b/html/changelogs/AutoChangeLog-pr-67038.yml deleted file mode 100644 index 45bdd8c40ccd15..00000000000000 --- a/html/changelogs/AutoChangeLog-pr-67038.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Crumpaloo" -delete-after: True -changes: - - imageadd: "Added new sprites for the airlock painter, tile & decal sprayer." diff --git a/html/changelogs/AutoChangeLog-pr-67263.yml b/html/changelogs/AutoChangeLog-pr-67263.yml deleted file mode 100644 index 332bbf4bec5fda..00000000000000 --- a/html/changelogs/AutoChangeLog-pr-67263.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "Melbert" -delete-after: True -changes: - - balance: "Heretic: The Amber Focus is now fireproof." - - balance: "Heretic: The Eldritch Medallion (thermal vision necklace) is now fireproof, acid proof, and works as a focus." - - balance: "Heretic: The Void Cloak can carry more things in its pocket, including various ritual components (organs, bodyparts, flowers), small heretic items, and a singular sickly blade. It also functions as a focus while the hood is down." - - balance: "Heretic: Mawed Crucible potions are now small sized (down from normal)." diff --git a/html/changelogs/AutoChangeLog-pr-67328.yml b/html/changelogs/AutoChangeLog-pr-67328.yml deleted file mode 100644 index 755307ccde176b..00000000000000 --- a/html/changelogs/AutoChangeLog-pr-67328.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SingingSpock" -delete-after: True -changes: - - bugfix: "Changed triple citrus recipe to make 3u instead of 5u" diff --git a/html/changelogs/AutoChangeLog-pr-67391.yml b/html/changelogs/AutoChangeLog-pr-67391.yml deleted file mode 100644 index cdba64aa8639c2..00000000000000 --- a/html/changelogs/AutoChangeLog-pr-67391.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "tralezab" -delete-after: True -changes: - - balance: "Engineering SMESes now start with a bit more juice." diff --git a/html/changelogs/AutoChangeLog-pr-67403.yml b/html/changelogs/AutoChangeLog-pr-67403.yml deleted file mode 100644 index 444a5082ad0673..00000000000000 --- a/html/changelogs/AutoChangeLog-pr-67403.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "GoldenAlpharex" -delete-after: True -changes: - - bugfix: "The stasis ripple effect will now play in a loop as intended, rather than only playing once." - - bugfix: "Buckling down someone to a stasis bed should no longer occasionally make them lie down veeeeery slowly." diff --git a/html/changelogs/AutoChangeLog-pr-67424.yml b/html/changelogs/AutoChangeLog-pr-67424.yml deleted file mode 100644 index 00ea8b5d0705f6..00000000000000 --- a/html/changelogs/AutoChangeLog-pr-67424.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ryll/Shaps" -delete-after: True -changes: - - bugfix: "Fixed pellet clouds not being able to wound" diff --git a/html/changelogs/AutoChangeLog-pr-67439.yml b/html/changelogs/AutoChangeLog-pr-67439.yml deleted file mode 100644 index 29c22db63461d7..00000000000000 --- a/html/changelogs/AutoChangeLog-pr-67439.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "robbertapir" -delete-after: True -changes: - - bugfix: "Made engraving not throw errors when everything works as expected." diff --git a/html/changelogs/AutoChangeLog-pr-67450.yml b/html/changelogs/AutoChangeLog-pr-67450.yml deleted file mode 100644 index 68b777c6507e66..00000000000000 --- a/html/changelogs/AutoChangeLog-pr-67450.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Fikou" -delete-after: True -changes: - - bugfix: "surplus prosthetics have correct sprites now" diff --git a/html/changelogs/AutoChangeLog-pr-67453.yml b/html/changelogs/AutoChangeLog-pr-67453.yml deleted file mode 100644 index f13845381191f4..00000000000000 --- a/html/changelogs/AutoChangeLog-pr-67453.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Son-of-Space" -delete-after: True -changes: - - bugfix: "Some overlapping objects were adjusted on the walls in the firing range on MetaStation" diff --git a/html/changelogs/AutoChangeLog-pr-67456.yml b/html/changelogs/AutoChangeLog-pr-67456.yml deleted file mode 100644 index fc2cf143caf562..00000000000000 --- a/html/changelogs/AutoChangeLog-pr-67456.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Melbert" -delete-after: True -changes: - - bugfix: "Light switches no longer cause anchored objects over conveyors to move." diff --git a/html/changelogs/AutoChangeLog-pr-67460.yml b/html/changelogs/AutoChangeLog-pr-67460.yml deleted file mode 100644 index d89a744d076dc1..00000000000000 --- a/html/changelogs/AutoChangeLog-pr-67460.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Melbert" -delete-after: True -changes: - - balance: "Cremator button has no access requirements" diff --git a/html/changelogs/AutoChangeLog-pr-67464.yml b/html/changelogs/AutoChangeLog-pr-67464.yml deleted file mode 100644 index 317a8be3f22bdd..00000000000000 --- a/html/changelogs/AutoChangeLog-pr-67464.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Pandarsenic" -delete-after: True -changes: - - bugfix: "Shuffles objects to stop sprites from clipping or covering each other (with differing levels of severity) on IceBox's overcrowded dormitory walls." diff --git a/html/changelogs/AutoChangeLog-pr-68143.yml b/html/changelogs/AutoChangeLog-pr-68143.yml new file mode 100644 index 00000000000000..92c7a5001029b7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-68143.yml @@ -0,0 +1,4 @@ +author: "TheBoondock" +delete-after: True +changes: + - bugfix: "fixed crystalizer passing any item as the user and causing a runtime" diff --git a/html/changelogs/AutoChangeLog-pr-68153.yml b/html/changelogs/AutoChangeLog-pr-68153.yml new file mode 100644 index 00000000000000..59c270383d6d44 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-68153.yml @@ -0,0 +1,4 @@ +author: "Salex08" +delete-after: True +changes: + - bugfix: "you start with the right amount of breathing mask again" diff --git a/html/changelogs/archive/2022-06.yml b/html/changelogs/archive/2022-06.yml index 3774442b59368f..0a081ceb0f6402 100644 --- a/html/changelogs/archive/2022-06.yml +++ b/html/changelogs/archive/2022-06.yml @@ -65,3 +65,991 @@ long tralezab: - balance: Removed silver costs from surgery tools +2022-06-03: + Crumpaloo: + - imageadd: Added new sprites for the airlock painter, tile & decal sprayer. + Fikou: + - bugfix: surplus prosthetics have correct sprites now + GoldenAlpharex: + - bugfix: The stasis ripple effect will now play in a loop as intended, rather than + only playing once. + - bugfix: Buckling down someone to a stasis bed should no longer occasionally make + them lie down veeeeery slowly. + Melbert: + - balance: 'Heretic: The Amber Focus is now fireproof.' + - balance: 'Heretic: The Eldritch Medallion (thermal vision necklace) is now fireproof, + acid proof, and works as a focus.' + - balance: 'Heretic: The Void Cloak can carry more things in its pocket, including + various ritual components (organs, bodyparts, flowers), small heretic items, + and a singular sickly blade. It also functions as a focus while the hood is + down.' + - balance: 'Heretic: Mawed Crucible potions are now small sized (down from normal).' + - balance: Cremator button has no access requirements + - bugfix: Light switches no longer cause anchored objects over conveyors to move. + Pandarsenic: + - bugfix: Shuffles objects to stop sprites from clipping or covering each other + (with differing levels of severity) on IceBox's overcrowded dormitory walls. + Ryll/Shaps: + - bugfix: Fixed pellet clouds not being able to wound + SingingSpock: + - bugfix: Changed triple citrus recipe to make 3u instead of 5u + Son-of-Space: + - bugfix: Some overlapping objects were adjusted on the walls in the firing range + on MetaStation + - code_imp: Adds some greps to check for commonly misplaced structures in closed + turfs + - bugfix: Some objects stacked within closed turfs have been removed from those + turfs. + robbertapir: + - bugfix: Made engraving not throw errors when everything works as expected. + tralezab: + - balance: Engineering SMESes now start with a bit more juice. + vincentiusvin: + - qol: Added a roundstart program disk containing nt frontier + - code_imp: Changed ordnance's area definition a bit, this includes the misc labs + (usually used for circuit labs). Gameplay wise they will have new names. + - code_imp: Made the ordnance chamber injector start off. You gotta turn them on + using the monitors. Also tidied their code a bit. +2022-06-04: + Profakos: + - bugfix: Player-facing Traitor reputation numbers are now consistent when you view + how much you have. + Rhials: + - bugfix: Moves the scrubber out from under a vending machine in the Metastation + Meeting Room. + SmArtKar: + - bugfix: Fixed statue simplemob teleport not working and 3 other spells not appearing + Son-of-Space: + - bugfix: departmental officers' access across departments has been standardized, + and previously lost accesses were added back + - balance: Departmental security officers have access to more areas in their departments, + including xenobiology or virology + Zonespace27: + - admin: MODsuits can now be picked through the outfit manager + san7890: + - rscadd: On all five stations, Nanotrasen has redrawn up the area plans in the + permabrig areas. Expect to see a few more APCs in each room to feed each with + power. + vincentiusvin: + - qol: breathedeep makes a return in the atmozphere tablet app. Right click to scan + things, right self click (on the tablet) to scan current turf. +2022-06-05: + Son-of-Space: + - bugfix: A severe lack of plating under a window in the DeltaStation rec room was + remedied + dragomagol: + - admin: cyborg wire pulses/cuts are now logged in silicon.log + - admin: AIs being carded is now logged in silicon.log + - admin: giving an AI a combat module is now logged in silicon.log + - admin: trying to upload over the maximum number of laws is now logged in silicon.log + - admin: ion storm law changes are now logged in silicon.log + - admin: changing settings on a borg shell is now logged in silicon.log + robbertapir: + - bugfix: held memorizers are now visible +2022-06-06: + Dragomagol, sprites by MistakeNot4892: + - rscadd: 'Added a new pAI holoform: the crow!' + EOBGames: + - rscadd: 'A few new crates have made their way to cargo: buy yourself a Lizard + or Moth food crate today!' + - rscadd: Recipes for Yoghurt (10u cream, 2u virus food), Cornmeal (grind corn), + and Quality Oil (1u quality oil, 2u cooking oil) have been added. Bon appetit! + - balance: 'Species food (lizard and moth food) have received a sweep of balance + changes: they''re now more filling and a bit easier to access.' + Iamgoofball: + - bugfix: Central Command no longer erroneously refers to the Ice Box planet as + a station in orbit. + - bugfix: Under construction airlocks no longer have paper stuck to them. + Jolly: + - bugfix: One of Trams ladder hatches no longer uses a redundant "all-access" helper + to help you escape. The door in question already had no access requirements. + Looks-to-the-Moon: + - bugfix: Xenomorph larva cancelling their evolution no longer displays unnecessary + messages + Melbert: + - bugfix: Fixes some cinematics sticking around for longer than comfortable + Rhials: + - bugfix: right clicking the BEPIS no longer makes it invisible. + SpaceSmithers: + - bugfix: Electric razors are now functional again + kugamo: + - bugfix: fixed parallax blue stars showing through parallax asteroids. + magatsuchi: + - code_imp: replaces some slot names with proper names + robbertapir: + - bugfix: Caught Molotovs no longer immolate the target. + vincentiusvin: + - bugfix: fixed a bigger dose of zombie powder permasleeping you + - bugfix: fixed regular scientists spawning in RD's office in kilo +2022-06-07: + 13spacemen: + - rscadd: You can now add assemblies to welding fuel tanks to blow them up + ATHATH: + - rscadd: Bulky crowbars have been added to all fire-safety lockers. + - spellcheck: Large crowbars are now named "large crowbars" instead of just "crowbars". + - bugfix: Unholy water's stun length reduction effect is now as potent as it was + intended to be. Its strength was previously half as strong as it was intended + to be due to a copy+paste error. + CocaColaTastesGood: + - bugfix: Fixes stack multiplier exploit + Fikou: + - qol: ninjas now get told about pinning modules and the direction to the station + - bugfix: fixes modsuits fucking up when unequipping every item, like staff of change + or slime toxin or whatever + Iamgoofball: + - bugfix: You can no longer roll more IDs to steal than there are crewmembers for + All Access Fan. + - bugfix: Firelocks no longer check the atmospheric contents of solid walls. + - bugfix: Health Analyzers now properly flag robotic and prosthetic limbs again. + Iatots: + - imageadd: Hot Cocoa and Tea now come in mugs again. + Jolly, sprites by Blueshirtguy: + - rscadd: 'Jolly: Added the flower garland to the crafting tab under clothing! You''ll + need 4 of these flowers to craft it: poppies, harebells and roses. It''ll also + calm your nerves a bit, if you''re on edge.' + - imageadd: 'Blueshirtguy: Sprites for the flower garland on-mob and icon sprites.' + Mooshimi: + - bugfix: There is now air in the Deltastation security escape pod airlock. + Mothblocks: + - bugfix: Fixed Adminwho taking several seconds to resolve. + Pandarsenic: + - bugfix: Corrected a couple of trivial typos. + RandomGamer123: + - bugfix: Nameless ID cards (with security access) can now access the security records + console without issue + ReinaCoder: + - imageadd: The Soviet costume has been resprited and the russian mobs have been + updated to match. + Son-of-Space: + - bugfix: You can no longer get objectives on a random tile in maintenance on TramStation, + along with any other area/based assignments. + - bugfix: You can now properly pull or cancel a fire alarm from outside the eastern + side of the library on MetaStation. + - bugfix: Inspect bounties no longer give you invalid areas to scan for bounties + - bugfix: Inspect bounties now properly choose from a broader range of assignments + in service, maintenance, commons, etc. + SpaceSmithers: + - qol: The Tip of the Round will no longer misinform you about PACMAN generators. + Wallem: + - rscdel: Full Ant Party Pizza pies has been removed. Instead, you can get ant pizza + slices by pouring ants on margherita pizza slices. + itseasytosee: + - balance: Some items are better at damaging structures and robots than others! + Don't try to kill a metal death robot with a scalpel, use a toolbox! + robbertapir: + - bugfix: Photon projector implants can no longer be used in assemblies. This means + that they can no longer bilocate. + san7890: + - rscadd: Nanotrasen has finally tracked down an elusive signal that's been haunting + them over all of their broadcasts... there appears to be a new Syndicate Listening + Base commissioned. + - balance: The odds for a Syndicate Communications Agent (the Space kind) is now + at an 15% chance to spawn. + - balance: Nanotrasen has now implemented a "buffer zone" on IceBoxStation between + the wilderness portions of the moon and the parts where there is a station presence. + Hopefully, you should see a lot less fauna try to make their way on station. + silicons: + - bugfix: infinite loop on process_hit in projectiles when hitting ON_BORDER objects, + like windoors + timothymtorres: + - bugfix: Fix drones not being able to use computers or vault. + - bugfix: Fix monkeys being able to read or write. They are now illiterate however + they can gain literacy through the Clever mutation. + - bugfix: Fix illiterate mobs being able to receive tablet messages in their chat + log. +2022-06-08: + Guillaume Prata: + - balance: Eating clothing as Mothpeople will give you cloth fibers instead of nutriment. + Cloth fibers give temporary nourishment that gets removed when it finishes metabolizing. + JohnFulpWillard: + - balance: Station equipment that holds materials (techfabs, ORMs) can't connect + to ore silo's on a different Z level. + Paxilmaniac: + - rscadd: Solar panel assemblies and solar tracker electronics can now be made in + an autolathe + ReinaCoder: + - imageadd: Resprites the white costume found inside the costume vendor. + SnoopCooper: + - balance: BZ production rates between pipes and turfs are now consistent. O2 production + removed. + - bugfix: Multiplying production rates by splitting pipenets no longer possible. + Son-of-Space: + - code_imp: Reorganizes some of the access and jobs access code for readability + - balance: The minisat and tcomms are more accessible to engineering roles on skeleton + crew, and engineers normally + - balance: Service personnel who do not handle corpses have had their morgue access + revoked and moved to skeleton crew. + - balance: The HOP has had their cremator access revoked, as they are not licensed + to handle the dead + - balance: The Research Director has had their mining and mining station access + removed. + - balance: The Research Director has been given construction access to allow for + access to the minisat and that access has been removed from the HOP + - balance: The roboticist has had their skeleton crew access to ordnance revoked + to align with the geneticist's skeleton crew access + - balance: Miners no longer have SHIPPING access (previously Mail Sorting) + - bugfix: The HOS has proper access to the basics in each department again + - bugfix: A holdover access from when genetics was in medical has been removed from + the Research Director + - bugfix: Paramedics can now access the entrance doors for most departments again + - bugfix: Minisats across all maps have proper access requirements to their contents + - bugfix: Tech storage now uses its access properly and again requires both command + and tech access to get to secure storage + Tastyfish: + - bugfix: The ID access reader and access checker circuit components now work again + with the new string-based access system. + - qol: Plumbing now supports 5 layers. + - qol: The plumbing constructor can now place ducts and change layer via scroll + wheel. + - bugfix: Bunch of cryptic failures and errors fixed in placing plumbing. + - imageadd: New plumbing duct sprites. + TemporalOroboros: + - admin: Smoke now logs the last person to touch the source of the smoke as the + last person to touch the smoke itself. Gunpowder smoke should be less annoying + to log dive as a result as every explosion will log that person. + Timberpoes: + - bugfix: Fixes issue where lobby buttons were still visable and usable under panic + bunker x interview system and also allows use of fix chat verb for interviewees. + private-tristan: + - bugfix: metastation xenobiology area no longer extends 1 tile into space + timothymtorres: + - qol: Playing Russian Roulette with lethal intent now creates a mood event for + the user and is engrained in any nearby peoples memories. The more bullets the + better the memory and mood boost. + - qol: Replace red colored beacons on solars/catwalk areas outside Meta to be colored + according to department (sec is red, medical is blue, etc.) + - rscadd: Add all AI lawsets can now be researched and have their modules printed + - rscadd: Add all AI lawsets to random spawners in AI upload + - rscadd: Add advanced AI techweb node + - balance: Change AI lawsets to be in different random spawner categories + - balance: Change lawsets chance for unique AI station trait + - balance: Move some lawsets out of AI techweb node and put into advanced AI node + - code_imp: Add documentation for AI lawset code + - config: Add every AI lawset to game_options config + - config: Rebalance AI lawsets in game_options config + - bugfix: Lawsets overflow to behave correctly +2022-06-09: + 13spacemen: + - qol: Fuel and water tanks have examine hints now + ATHATH: + - rscadd: Cloaks, like surgical drapes and bedsheets, can now initiate surgeries. + This change affects both head of staff cloaks and skill capes. + Guillaume Prata: + - rscadd: Gravity generator blackout is a new random event to spice the rounds. + - balance: High intensity gravitational anomalies that don't get neutralized in + time will trigger a gravity generator blackout. + Iamgoofball: + - balance: The Quartermaster is now a Head of Staff, and answers directly to the + Captain now. + - balance: This comes with all the stuff a Head of Staff normally has, like command + access, a telebaton, and a silver ID. + - balance: This also comes with no longer being eligible for Head Revolutionary, + and being a target for the Revolution. + - balance: Thanks to a savvy contract with the Space Teamsters, non-humans are allowed + to be Quartermasters still. + - balance: The HoP is no longer the lead of Supply, nor does he have access to Supply. + - balance: The Warden now carries the torch for pretender royal metabolism, as the + last remaining pseudo-head. + - code_imp: Removes a hack from the NT IRN code. + Iatots: + - rscdel: you can't hold bread slices in your mouth (head) anymore. + - rscadd: you can hold griddled toast in your mouth (mask). + Jakkie Sergal: + - rscadd: Added darker floor decals. + Jolly: + - bugfix: A small bit of Kilos arrivals area define was touched up and fixed. Asteroid + rock is not consider part of the station, sorry folks. + - qol: On Icebox, some of the warning tapes have been properly rounded off with + corners. + - bugfix: On Icebox, a vent and scrubber has been added to the primary hall the + arrival shuttle drops crew members off at. This should also stop this portion + of the hall from having atmos specific issues. + Melbert: + - bugfix: Dead bodies shouldn't keep jittering for ages. + - qol: Research servers are now a bit more clear about why they aren't generating + research points. Check the console for more info. If in doubt, turn them off + and on again (i'm not kidding). + - code_imp: Removed a buncha old, deprecated / unused R&D server code related to + them making heat. + Pickle-Coding: + - bugfix: Fixes bzformation not working. + SmArtKar: + - bugfix: Fire hallucinations are no longer invisible + TehZombehz for the sprites, san7890: + - rscadd: For some reason, Donk Co. suddenly found a crate full of alien-themed + plushies in their warehouse. They immediately started loading up their arcade + machines full of them. + Wallem: + - rscadd: For the brave smokers out there, legends tell of a new lighting technique + involving molten stone from the planet's core. Only the brave are advised to + attempt this. + Watermelon914: + - balance: Traitor objectives have a significantly reduced reputation reduction, + making it more viable to gain reputation beyond the expected reputation. + robbertapir: + - bugfix: You can no longer create negative amounts of alloys in the ORM + - bugfix: sechud/medhud buttons in examines now time out after 1 minute. This means + that a single examine will no longer allow you to track someone's identity and/or + health for the rest of the round. + timothymtorres: + - rscadd: Add hallucinogen poison to frog attacks + zxaber: + - rscadd: The Concealed Weapon Bay is available again for traitor Roboticists and + Research Directors. +2022-06-10: + Jolly: + - bugfix: On Tram, in sec, the floating pepper spray refiller has been removed from + the armory. You guys have enough, stop hogging it damnit! + - bugfix: On Tram, in the under tram, steam vents should no longer spontaneously + appear in walls. + PositiveEntropy: + - imageadd: Resprites the Captain's Antique Laser Gun! + ReinaCoder: + - bugfix: The QM now has a miniature e-gun in their locker on kilo like the other + heads! + tf-4: + - bugfix: Donksoft toy vendors no longer bluescreen. +2022-06-11: + JohnFulpWillard: + - bugfix: Space Dragons' expiring no longer deletes the people they had already + eaten. + LemonInTheDark: + - rscadd: Weather effects will now be a bit more subtle in darkness, hopefully this + looks nicer + - imageadd: I've done some resprites to snow and non smoothing lava + MTandi: + - qol: Portable pump In/Out button text replaced with source and destination. + Maurukas: + - bugfix: A manually edited APC in the deepstorage ruin has been replaced with an + APC of the appropriate type. + Melbert: + - refactor: Gunlight / Helmetlight behavior is now a component. + - qol: Gunlight / Helmetlight now uses balloon alerts. + Mothblocks: + - spellcheck: Asimov++ no longer includes "In the case of conflict, the majority + order rules." + RandomGamer123: + - bugfix: Fixes the layer of a scrubber in Icebox engineering + Watermelon914: + - bugfix: Skip time button on the steal objective now has a fast forward icon. + YakumoChen: + - qol: Changed the position of light tubes in certain surgery rooms to not be directly + over a surgery bed. No more smashing lights with your saw by accident! + - qol: Aspiring AIs can now listen in on patient talk in Meta's primary surgery + room. Or you could listen to the soothing sounds of the the crew dying from + the comfort of a surgery bed when comms are down too, I guess. + msgerbs: + - bugfix: There is no longer a random pipe in the wall in Metastation's Xenobiology + department. + san7890: + - config: Hey, server operators! Title music playing at the lobby screen is now + DISABLED by default in the config settings (game_options.txt). If you are not + hearing any title music, be sure to adjust your config. If you're a player reading + this and are sorely missing out on those soulful tunes, please notify your server's + administration team of this change so they can diagnose it properly from there. + tf-4: + - balance: Pre-loaded PACMAN generators now have 15 plasma sheets, instead of 50. +2022-06-12: + JohnFulpWillard: + - bugfix: The Warp whistle can be used more than once again. + Melbert: + - bugfix: Fixes Novaflowers not lighting targets on fire. + - code_imp: Reduces some copy+paste and cleans up some unique plant genes code. + - bugfix: Ranged attacks hitting mech equipment no longer ignores mech armor + - bugfix: Melee attacks now damage mech equipment + - bugfix: Mech equipment is now properly disabled at 0% health + Mothblocks: + - bugfix: Fixed thieves/opportunists icon. + Son-of-Space: + - bugfix: Several pairs of external airlocks without cycle link helpers have had + them added on TramStation + YakumoChen: + - bugfix: Fixed a symmetry issue with the lava clown puzzle where a lone chasm tile + wasn't connected with its fellow chasms. + san7890: + - bugfix: Chaplains, CMOs, and Psychologists can now all rejoice that they start + in their offices in Tram now, rather than take the shuttle. + - bugfix: Abductors should now hopefully spawn in on their little alien pod rather + than on the station's arrivals shuttle. + timothymtorres: + - rscadd: Add disease resistance to spaceacillin. It now gives 50% disease progression + slowdown, 75% to block disease infection, 75% to block zombie infection when + attacked, and 50% alien larva growth slowdown. +2022-06-13: + Fikou: + - bugfix: floating now stops slips just as well as flying + - spellcheck: security mod theme no longer mentions being shockproof + - bugfix: fixes naked outfit giving people the ninja modsuit + JohnFulpWillard: + - bugfix: Ore silos can once again be synced to machines on the station on other + z levels, for multi-z maps. + MTandi: + - bugfix: Night shift lights now properly save power + - qol: APC buttons now have tooltips + Melbert: + - bugfix: Earthsblood makes you see colors again. + Mothblocks: + - bugfix: Fixed Dynamic midrounds spawning heavies significantly earlier than they're + supposed to + Rhials: + - bugfix: Jobs are no longer closed when the nuke detonates off-station. + Son-of-Space: + - bugfix: Fixed overlapping objects on a tile in the foyer of the IceBox bar. + - bugfix: Some manual varedits on objects with cargo shipping access were fixed + to work again. + - bugfix: A set of unpowered airlocks by the cooling loop on TramStation are now + powered. + - bugfix: A rack stuck in a wall on the listening station ruin was removed from + the wall. + cacogen: + - balance: The default pirate ship now has a cell charger to recharge suit cells + castawaynont: + - balance: The Space Ninja's MODsuit has a storage module now. + kawoppi: + - balance: removed JaniDrobe refill from the General Wardrobes Supply Crate and + moved it to its own supply crate + - balance: adjusted General Wardrobes Supply Crate price due to it containing one + less refill + robbertapir: + - bugfix: stundprods and teleprods now stun again + - bugfix: igniters now work again + vincentiusvin: + - bugfix: fix h2/trit fires being too hot, outputting funny numbers, generally being + weird. +2022-06-14: + Son-of-Space: + - bugfix: A rogue windoor in a wall on Kilostation by the chapel in space was terminated + robbertapir: + - bugfix: Regal rats can now heal by eating all types of cheese, not just cheddar. +2022-06-15: + Iamgoofball: + - spellcheck: Nanotrasen has lost the rights to several popular confectionaries, + and has created "original" replacements. + Mothblocks: + - spellcheck: Adjusted description of moths eating clothes in preferences menu to + better reflect their current behavior. + SuperNovaa41: + - bugfix: Pill names now have a cap at 42 characters to prevent chat spam. + Timberpoes: + - bugfix: Fixes slips being broken again. + - bugfix: Fixes a weird edge case where anything that would prevent a storage closet + or locker from opening would instead cause stealth implant boxes to delete the + player inside them. + UDaV73rus, Tokoriso, dragomagol: + - rscadd: welding now has an animation! + dragomagol: + - bugfix: Renamed a few circuit boards to explain what frame they need + private-tristan: + - bugfix: kilostation solars no longer have plating and catwalks on the same tile + robbertapir: + - bugfix: the flavor text for changing the transfer amount on the medical gel is + no longer backwards + san7890: + - bugfix: Chameleon neckties will no longer give you a missing-texture cape and + a big ERROR icon by default. Trust me when I tell you this wasn't actually a + good thing. + timothymtorres: + - rscadd: Add dyslexia (illiteracy quirk) as a genetic mutation. + - rscadd: Add illiteracy as a effect for confusion disease symptom. +2022-06-16: + Fikou: + - bugfix: unrestricted wizard healing staff no longer tells you you are weak + Pickle-Coding: + - spellcheck: The chat will no longer lie by saying you shoved yourself into the + closet when someone shoves you into a closet. + PositiveEntropy, WJohnston, Dragomagol, LemonInTheDark, Riggle: + - imageadd: Resprites most variety of tiles into a better shaded version! + - code_imp: Damaged floors are now damaged overlays, meaning that most tiles should + properly display a damaged state! + ReinaCoder: + - imageadd: The riot helmet has been resprited! + SovietJenga: + - balance: Moves the botanogenetic shears into the botany research node and locks + it behind a botany experiment + - balance: Removes the advanced engineering node requirement from the botany node + Striders13: + - bugfix: fixed a windoor in metastation warden's office being layered incorrectly + YakumoChen: + - qol: Conveyor switches now tell you the speed setting of belts when examined. + You can change the speed with a multitool! + alphanerdd: + - bugfix: updates donk pocket box examine text to be more accurate + private-tristan: + - bugfix: icebox science has a scidrobe again! + timothymtorres: + - code_imp: Add atmospheric technician gas meter text tip +2022-06-17: + 13spacemen: + - bugfix: Reagent dispensers will actually remove reagents upon leaking + AnturK: + - rscadd: Added fishing, fishing rods and other fishing equipment. + - rscadd: Fishing related cargo crates & private packs. + - rscadd: Fishing technology and designs + Fikou: + - qol: gps and ore bag modsuit modules are now usable when suit is off + Guillaume Prata: + - qol: APC construction/repairs/deconstruction uses balloon alerts now. + - bugfix: The circuit board of the Book Inventory Management Console now use the + correct name extension (Computer Board) instead of (Machine Board) + Iamgoofball: + - soundadd: Energy and Magic gunfire sound pitch now varies based on how much ammo + is left. + - soundadd: Ballistic gunfire now has a low-ammo click sound. + Melbert: + - bugfix: Items getting knocked off (glasses and cigars), bad omens, and spaghetti + falling from pockets should trigger on most knockdowns again like they used + to. + - code_imp: Cleaned up the knockoff component a bit. Also unit tests it. + - bugfix: Some heretic focuses apply more consistently now. + - bugfix: Furious Steel should go away more often than not now. + - bugfix: Fixes the fireman carry "body stuck to you forever" curse + ReinaCoder: + - imageadd: The chaplain's jumpsuit and skirt has been resprited. + SmArtKar: + - bugfix: Fixed locate weakpoint do_after being 3 seconds instead of intended 30. + Also you can no longer roll locate weakpoint until you get at least 20 minutes + of progression via objectives + SomethingFish: + - bugfix: Fixes mothic garlic pizza not producing the correct slice on slicing + Thunder12345: + - bugfix: The security office on Tramstation now has an air alarm + - bugfix: The water supply to Metastation's restrooms has been restored + - bugfix: Rocks will no longer grow into Tramstation's bar maintenance + - bugfix: A camera in IceBox's tech storage is now properly named + Twaticus, Wallemations: + - rscadd: '4 new emojis added to the joy mask! Check the AutoDrobe tweak: You can + now use internals with the joy/emotion mask' + atteria: + - imageadd: 3/4 sprites for MULEBots + bob-b-b: + - bugfix: fixed grav gen being overridable/overloadable + - bugfix: Fixes infiltrator toolbox not fitting all suit parts + distributivgesetz: + - rscadd: Added new moodlet for cascades, for more FLAVAH! + - bugfix: Rifts should now spawn at least 30 turfs from the nearest mass, and now + no longer stalemates. + - bugfix: Rift code is now no longer just copypasted supermatter bump code! Godmode + players, rejoice, you can actually leave the station now. + - bugfix: Made shuttle behaviour more predictable, escape shuttle can no longer + end the round prematurely during a cascade, it will stall out in hyperspace + instead. + - bugfix: Supermatter warp effect should be removed correctly now. + - bugfix: Fixed emergency lights not giving off red light. + - bugfix: Bluespace rifts pick a safe turf in CentCom dock now. + - spellcheck: Improves almost all messages that play during a cascade. + - admin: Better logging about resonance cascade-related actions. +2022-06-18: + Melbert: + - balance: AI Gorillas are now allied to AI monkeys, and AI Cargorillas won't try + (and fail) to wail on crewmembers. + Pickle-Coding: + - bugfix: Fixes proto-nitrate tritium response requiring proto-nitrate bz response + radiation energy requirement amount of energy to emit radiation pulses, and + vice versa. + ReinaCoder: + - imageadd: The chef's hat, jumpsuit/skirt, and suit has been resprited + distributivgesetz: + - bugfix: Shuttle hijack timeouts work now. + jlsnow301 KubeRoot stylemistake Iamgoofball Kapu1178: + - rscadd: Adds the TGUI say modal to replace speech input boxes. Many features! + - rscadd: You can switch output channel within the TGUI say modal by clicking the + channel button or keying TAB. + - rscadd: Added 5-message chat history to the say window. Use arrow keys to scroll + recent messages. + - rscadd: The say window auto-expands! It adds up to two extra lines and scrolls + beyond that. + - rscadd: The common radio hotkey - "Y". No need to type ; in radio channel. Help + maint! + - rscadd: Radio subchannel helpers - Typing subchannels like ":e " will show labels. + - rscadd: Getting hurt while speaking has a chance to force you to speak. You read + that correc-AUGH + - rscadd: Typing indicators! Having an IC channel open will show thinking/typing + icons activity. + - rscadd: Typing indicators are a preference. Go incognito if you want! + - rscadd: Themes for TGUI Say! There is currently a light mode. More to come. + - refactor: Sorts other TGUI inputs into their own folder and cleans up their code. + Remember, TGUI Inputs can be disabled in UI prefs if you're not a fan. + - refactor: Refactors a lot of human defense code, report bugs if you encounter + them. + - refactor: Refactors admin centcom reports into typescript. You must send the report + to save the text. + theOOZ: + - imageadd: Adds an inhand sprite for the atmos gasmask + - imageadd: Updates the medical duffelbag inhand sprite +2022-06-19: + ArcaneMusic: + - rscadd: A white cane, an indicator that the wielder is blind, can now be bought + and crafted from medical vendors and iron rods respectively. + FernandoJ8: + - bugfix: the randomize_human proc now gives non-humans a name that matches their + species + Guillaume Prata: + - qol: Airlock painter, extinguishers, geiger counter, holosign projectors, inducers + and welding tools use balloon alerts on some of their more spammy/error actions + and have some useless `to_chat` messages removed. + - qol: Health and Gene analyzers give a balloon alert on a successful scan. + JohnFulpWillard: + - bugfix: the Chaplain's sparring sect now works on Kilostation again. + - bugfix: Kilostation's Xenobiology is no longer roundstart on firelocks, and the + security medical post now has a scrubber. + Pickle-Coding: + - balance: Changes supermatter powerloss function. It will transition to linear + powerloss function at 5.88076GeV, and the linear powerloss function has been + offset so that the transition between the two functions is completely smooth. + - balance: Changes powerloss inhibition (both CO2 and psychologist effect) to change + the rate of powerloss instead of changing the rate of both functions then comparing + them to which one should be used. + - rscadd: Gas canisters and other portable atmospheric machinery can now be packaged + with wrapping paper. + - rscadd: Replaces chat messages with balloon alerts for package wrapping related + failures. + Toastgoats: + - qol: Meta and Tram have autodrobes in dorms now. + bob-b-b: + - balance: Increased greed vending machine integrity and max items +2022-06-20: + ArcaneMusic: + - rscadd: Added several new goodie items to purchase through cargo, including translation + keys, mutadone autoinjectors, and a full RLD. + - code_imp: documented research_nodes and radios. + LemonInTheDark: + - code_imp: WAHHHH LIGHTING HAS CHANGED just backend mind. Please report any bugs + MTandi: + - bugfix: Fixed recycler bug that deleted the output stack because it was merged + with the input stack + - bugfix: Fixed recycler bug where it deleted stacks of 50 because it didn't have + enough space by removing recycle bins that reset its internal space from infinity + to the level of matter bin part + - qol: food now shows its type on examine + Melbert: + - qol: The Cursed Dufflebag now tells nearby people when it takes a bite out of + someone. + - balance: The Cursed Dufflebag takes any food poisoned by any means, instead of + just burnt messes. + - balance: The Cursed Dufflebag deals out slightly less wounds now to people wearing + armor and protection. + - balance: The Cursed Dufflebag deals less damage if the mob it's attached to is + dead, and doesn't heal if so. + - bugfix: The Cursed Dufflebag no longer permanently makes you a pacifist and clumsy. + - code_imp: Diggable component was changed to the Diggable element. + Mothblocks: + - bugfix: Fixed revolutions blaring alerts for a few seconds after winning. + - balance: Hacking the command console and winning revs no longer adds midround + threat. Instead, it'll force a heavy ruleset to spawn, and barring that, will + spawn a dangerous random event. + Paxilmaniac: + - qol: liquid plasma now points out in examine text that plasma can be collected + from it with a beaker + - bugfix: liquid plasma will now cool down gasses inside of heat exchanger pipes + to 100K instead of heat them to 5000K + SmArtKar: + - bugfix: Locate weakpoint objective now works again. + Watermelon914: + - admin: Added a way for administrators to globally disable circuit component sound + emitters. + - balance: Further limited the sound emitter component so that maximum volume is + reduced and pitch is capped between -50 and 50 +2022-06-21: + Cursor, sprites by Crumpaloo.: + - imageadd: The Cargorilla has found clothing in their size. + - rscadd: Updated the Cargorilla's description to match their new look. + GoldenAlpharex: + - bugfix: Fixed a runtime related to the TGUI white mode preference that would happen + every time someone would connect to the server. + JohnFulpWillard: + - bugfix: The Traitor eye snatching objective will now appear in-game. + MTandi: + - rscadd: 'Oldstation: Added a lootbox for every role' + - rscadd: 'Oldstation: Added 1 diamond ore spawn and 1 gibtonite spawn to asteroids' + - rscdel: 'Oldstation: Removed redundant cable, pen, free pipe dispensers and the + box of firing pins' + Pepsilawn: + - bugfix: The Lavaland Mafia map now displays safer flooring over empty space. + SmoSmoSmoSmok: + - bugfix: mulebots can be turned on/off + Thunder12345: + - bugfix: A camera in Meta's tech storage is now properly named +2022-06-22: + Capsandi: + - bugfix: some walls in the crashed ship ruin, they are no longer full-bright + CoffeeDragon16: + - bugfix: switching bodies, such as becoming a lich or mindswapping will no longer + revoke a wizard's access to their spell book + Paxilmaniac: + - rscadd: Glass floor tiles can now be made out of both plasma glass, and reinforced + plasma glass + Pepsilawn: + - bugfix: Kilostation's Greater Port Maintenance has had a missing area patched + up. +2022-06-23: + Cheshify: + - bugfix: The pride and gluttony ruins have had some minor fixes + MidoriWroth: + - rscadd: Botany can now grow olives, which can be ground into a paste and mixed + with water to make quality oil. + - rscadd: You can now make custom sushi by using an ingredient on a seaweed sheet. + The sushi will be named after the first ingredient you use. + - balance: Pierogis now need a dough slice instead of a bun + - balance: Quality oil costs 50 credits to order instead of 120 + Mothblocks: + - bugfix: Fixes laser pointer circuits crashing clients. + san7890: + - rscadd: Nanotrasen has now installed an HFR Room and an Atmospherics Project Room + on IceBoxStation. The Atmospherics Storage Room has also had catwalks installed + in to accomodate these rooms uninstalled around it. + - rscadd: The Atmospherics Loop on IceBoxStation has undergone some minor modifications + to accomodate "feeding" these new rooms. Notably, there is now a "minor" loop + on the lower Z-Level that you can push and pull gases towards to your (probable) + heart's content. + - rscadd: The AI Satellite, Incinerator, and some sections of Maintenance have been + shuffled around on IceBoxStation to accomodate these changes. +2022-06-24: + CoffeeDragon16: + - bugfix: getting your tongue removed will affect your speech again + Melbert: + - bugfix: Language encryption keys now only work when you've equipped the headset + - bugfix: Language encryption keys no longer forever-grant you the language in some + circumstances + - bugfix: Language encryption keys now update when they're installed if you're currently + wearing the headset + Tastyfish: + - bugfix: Opening wrapped crates now places them at the correct location. + antropod: + - bugfix: Randomized recipes (metalgen and secret sauce) are working again. + carshalash: + - bugfix: Jungle salad can now be eaten again + - bugfix: Eldritch nightmares were incorrectly added to the gold slime pool + dragomagol: + - qol: the cyborg hypospray now has a TGUI menu + theOOZ: + - qol: Rapid Lighting Device now fits in the utility toolbelt + timothymtorres: + - rscadd: Add magical reactions when hydroponics plants are hit with polymorph, + death, or resurrection magic. Plants with the anti-magic gene (holymelons) block + any kind of magical effect on the plant. +2022-06-25: + ArcaneMusic: + - bugfix: White canes now examine objects properly and sound correct when hitting + things. + Ebb, epochayur, SweptWasTaken: + - bugfix: Soap and biopsy tools now have suit storage sprites. + ElGood: + - imageadd: Bluespace RPED has unique inhand sprites + Gandalf2k15: + - refactor: Security level code has been refactored, please report any abnormalities + to the github. + Hamcha: + - bugfix: the message monitor console can now send admin messages again + Kylerace: + - balance: 'the tram is now twice as fast, pray it doesnt get any faster (it cant + without raising world fps) performance: the tram is now about 10 times cheaper + to move for the server' + - rscadd: mappers can now create trams with multiple z levels + - code_imp: industrial_lift's now have more of their behavior pertaining to "the + entire lift" being handled by their lift_master_datum as opposed to belonging + to a random platform on the lift. + Melbert: + - rscdel: Removed a tip suggesting being a drunk scientists boosts research point + gain. This was removed at some point, but the tip remained, despite being incorrect. + Pepsilawn: + - bugfix: Coffins' base sell price adjusted back to 100 credits as previously intended. + Rhials: + - bugfix: Supermatter cascade final objective no longer generates when the engine + has exploded. + SmoSmoSmoSmok: + - rscadd: You can attach a bell to your wheelchair + Son-of-Space: + - balance: The AIs freeform and purge law boards have been returned as a static + staple on all maps. + jlsnow301: + - code_imp: Prettier is now recommended as an extension for UI development (or just + in general!) + - refactor: Many, many interfaces have been hit with the prettier stick so please + report any issues. There should be zero noticeable differences in how UIs look + or function. + private-tristan: + - spellcheck: silver golems text no longer states that they are immune to most magic + skylord-a52: + - refactor: Renamed "delimber" anomaly to "bioscrambler" anomaly +2022-06-26: + Kylerace: + - bugfix: NanoTrasen has issued a ghost vaccine for the ghost virus that made ghosts + ghost deaf two days ago. now ghosts can hear again (as they are no longer ghost + deaf) + Profakos: + - spellcheck: fixes typos in ash lore + RandomGamer123: + - qol: Icebox atmos' shutters and airlocks are now transparent for better visibility + - bugfix: Fixed freon formation being nearly instant at most temperatures + Wallem: + - rscadd: Adds the Active Sonar Module, a module that allows the suit-wearer to + detect living organisms within a given radius. + castawaynont: + - bugfix: Allows Icebox's atmospherics APC to be accessible roundstart by moving + a console. + dragomagol: + - bugfix: advanced cyborg hypospray once again refills its chems + - qol: tochat for cyborg hypospray injections tells you which chem you injected + san7890: + - spellcheck: The exclamation point in the "Server Hop" verb has been deleted, which + now means you only need to type it in as 'server-hop'. Much nicer. +2022-06-27: + 13spacemen: + - rscadd: Added the current map to the hub entry + - qol: Shutters on Metastation have directions now + CoffeeDragon16: + - bugfix: regenerative core implants will automatically revive you again + Hamcha: + - bugfix: The decryption key to the Nanotrasen message network has been delivered + to the Syndicate Listening Post + IndieanaJones: + - bugfix: Gorillas now change speed when holding something vs. not holding something, + as was always intended + - balance: Made gorillas use their old speed value when they're holding something, + and made them slightly faster when they're not holding something + - bugfix: People who gain or lose the monkified mutation no longer have invisible + equipped items. + MTandi: + - qol: 'UI: Added option to enter fullscreen mode to OOC verbs' + - qol: 'UI: Added option to hide the status/tooltip bar to OOC verbs' + - qol: 'UI: Made the chat input change colors according to the selected theme' + Mothblocks: + - balance: The amount of midround threat required for a midround roll has increased + slightly from 6.5 to 7. + - balance: Lowered the maximum threat level on sub-20 pop. + - balance: Lowered the number of roundstart traitors. + - server: Fixed "low_pop_minimum_threat" being incorrectly named. It has been changed + to "low_pop_maximum_threat". + Original code by SabreML: + - bugfix: Items in the suit storage slot won't turn invisible anymore + Paxilmaniac: + - code_imp: times for food items are now in X SECONDS format, functionality is still + the exact same + - qol: mining and labor shuttle home docks are no longer varedits of /stationary, + and are now their own subtype + Pickle-Coding: + - bugfix: Fix scrubbers not being able to be deconstructed when connected pipe disconnects. + RandomGamer123: + - bugfix: Fixes nuke op reinforcements having no HUD icon when seen by other nukeops, + nor being able to see the HUD icons of other nuke ops + - code_imp: Fixed a runtime if update_sight is called on a mob whose client has + no eye + private-tristan: + - balance: the meteor with engines strapped to it now has air in its rocks + san7890: + - bugfix: Nanotrasen hired a contracting company to completely re-do the Metastation + brig, but the commanding official was chumped- and was left with was a few decalling + changes and some re-piping. How ultimately odd. + - qol: Nanotrasen has used a new method of installing signs to their walls. If you + see any floating signs, or signs that appear to be positioned in incorrect locations, + please contact your nearest reality manager. +2022-06-28: + 13spacemen, Gandalf2k15: + - rscadd: Examining and other chat outputs now display in blocks to make them easier + to see + - bugfix: AI and borgs no longer have their name show twice upon being examined + CoffeeDragon16: + - bugfix: plasma glass floor tiles will no longer sometimes be invisible + - bugfix: pianos will now look broken when they are damaged + - soundadd: pianos make a DONG sound when hit + Comxy: + - bugfix: Fixes martial arts auto reset bug. + GoldenAlpharex: + - bugfix: Snail people are no longer too shy to show their eyes, and will now expose + them out for everyone to see them, once more. + Melbert: + - bugfix: Frozen stuff is now properly actually recognized as frozen and won't re-freeze. + - refactor: Refactored how Knock (spell) tells stuff to open up, makes it easier + to add more knockable things. + Paxilmaniac: + - bugfix: fixes the ocean in the beach gateway having a different gasmix than the + sand, making the place unbreathable + Profakos: + - bugfix: Tramstation aux construction console works again as intended. + - bugfix: the hookshot bounty hunter, when summoned as an ert team member, is no + longer identical to the armoured bounty hunter. + - bugfix: bounty hunter IDs are no longer invisible save for the trim + RandomGamer123: + - spellcheck: Fixed a lack of line breaks in the operating computer when displaying + surgeries with required chemicals + Son-of-Space: + - rscadd: derelict1.dmm was overhauled into a derelict version of the Sulaco bridge + Y0SH1M4S73R: + - bugfix: The runic knight helmet's worn sprites have had their alignment fixed. + cinder1992: + - rscdel: Delta-pattern station quartermasters no longer have to listen to the sound + of a fire alarm every time their miners use the mining shuttle. + dragomagol: + - bugfix: Broken tiles (as seen in places like caravan ambush) now match our smooth + iron tiles + san7890: + - bugfix: The Chief Engineer's Keycard Authentication Device is no longer covered + by a electric sign on IceBoxStation. + - bugfix: Disposals will no longer now empty out in the middle of IceBoxStation's + maintenance tunnels. +2022-06-29: + Guillaume Prata and Wallem: + - rscadd: Botany starts with watering cans instead of buckets now. There is also + a research locked advanced watering can which generates it's own water. + JohnFulpWillard: + - bugfix: the Gravity Generator no longer plays several looping sounds. + - bugfix: Oldstation's gravity generator now properly spawns off. + Melbert: + - bugfix: Service members can access the service dorms on Deltastation again + - bugfix: Miners can access the shipping office on Deltastation again + RandomGamer123: + - qol: Makes the noblium gas shells experiment explicitly clear that it requires + Hypernoblium gas and not just "Noblium" + - spellcheck: CentCom is now properly capitalised in the description of an experiment + Salex08: + - spellcheck: The Brand of Dance description is correct now + - bugfix: headpikes can be made again. + Sebbe9123: + - rscadd: Adds a special Medical ERT belt + gives it to medical ERT + Y0SH1M4S73R: + - bugfix: Fixed a runtime that occurs when inflicting a blunt wound on an armless + human. + jlsnow301: + - bugfix: TGUI Say now retains current messages / keying through history doesn't + erase your current message. + - bugfix: TextArea keydown prop has been renamed so as to not trigger double keydown + events. + - bugfix: TGUI say now properly expands when viewing recent messages + san7890: + - rscadd: Ice Box Station's got a new look. Notably, the cold room is on the bottom + floor with the kitchen all being up on the upper Z-Level +2022-06-30: + 13spacemen: + - imageadd: Shutters and window shutters on all stations are now directional + Melbert: + - bugfix: Comms console hacking will be interrupted if the comms console itself + is destroyed or depowered. + - bugfix: Cult sacrificing someone with a soul will no longer give you an empty + soulstone when it should give you a filled one. + - bugfix: Using a soulstone on a soulless corpse will now properly poll ghosts and + allow a new shade. + - bugfix: You can no longer capture spirits with soulstones you can't even release + spirits from + - bugfix: You can no longer hypothetically capture yourself with a soulstone + - code_imp: Some cleanup on aisle soulstone. + - code_imp: The blood walk element has been changed from a bespoke element to a + component. + - code_imp: MULEs now use the blood walk component. + - bugfix: MULEbots no longer track blood forever. + Profakos: + - imageadd: Rootbread slice toppings have a sprite now. + RandomGamer123: + - bugfix: Removes a method that allows xenobiologists to produce slimes of every + colour and bypassing the intended progression sequence by making the disease + induced by advanced mutation toxin only produce grey slimes unless the infected + person is a sentient non-monkey human + ReinaCoder: + - imageadd: The Ghoulbot now has a new sprite matching the new 3/4 mulebot sprites + - imageadd: The Makarov pistol has been resprited + Salex08: + - qol: Added a new tab for the autolathe which allows you to dispense not only iron + or glass but all the mats you put in + - bugfix: Fixes missing "=" operator in autolathe + nichlas0010: + - bugfix: The Orion Trail's Realism Mode works again, triggering negative events + for the player diff --git a/html/changelogs/archive/2022-07.yml b/html/changelogs/archive/2022-07.yml new file mode 100644 index 00000000000000..b12a2ac6845fd3 --- /dev/null +++ b/html/changelogs/archive/2022-07.yml @@ -0,0 +1,121 @@ +2022-07-01: + Guillaume Prata: + - qol: Hypernob Protection (given to plasmamen that are breathing Hypernob as gas) + is a status effect now and gives better feedback to the user. + - balance: Hypernob Protection gives a small slowdown. + Hamcha: + - bugfix: The agent card now correctly allows you to take anyone's identity, even + if their name contains numbers + OrionTheFox: + - bugfix: Chainsaws can now actually cut wood! So can the giant axe that is the + PKC, and other chainsaw items - but, alas, esword handles alone can not, and + you must actually turn them on. Also, all mining implements can mine scattered + stones as well! + - bugfix: Chainsaws are now faster when they are on, and slower when they aren't. + Salex08: + - bugfix: blacklists placeholder food items in the random food generator which caused + error sprites appearing + ShizCalev: + - qol: Gas filtering cloth are now smaller and can fit inside boxes! + chesse20: + - rscadd: Furry Pride Spraypaint added to spray cans + - rscdel: Y##f In H##l Sprapaint removed from spray cans + jlsnow301: + - code_imp: Refactored a large number of TGUI interfaces into TypeScript. If something's + broken, report it! + private-tristan: + - bugfix: metastation library no longer has 2 air alarms +2022-07-02: + Guillaume Prata: + - qol: Clown/Mime survival boxes won't have a mostly pointless breathing mask, as + their basic mask can be used for internals. + - imageadd: New mime Hugbox! + Melbert: + - rscadd: The Mjolnir wizard loadout no longer scams you. It now also grants 1 level + of Tesla Blast! + - bugfix: Spells show up in the stat panel again + - bugfix: Fixes runtime errors that can occur if a wizard spellbook randomizes into + unpurchasable spells. + - bugfix: Genetics powers now have their own background, which apparently they have + always meant to have. + - bugfix: Fixes some cases where chaplains are unable to cast their own spells. + - bugfix: Fixes some granters being infinite when they should've been limited (Maint + loot books). + - bugfix: Wizard's roundend report is now more accurate in what spells they purchased. + - qol: Some more spells and actions now use balloon alerts. + - qol: Many actions will now more accurately have their icon redded out if you can't + use them at the moment. + - qol: Genetics mindread is now a pointed ability. + - qol: The mimery book now grants you a vow of silence action, like the guide to + advanced mimery. + - qol: Xenomorph's corrosive acid ability is now a click-to-work action, so you + click on what you want to acid. + - qol: Also, xenomorph larva now use a radial when choosing an evolution type. + - qol: Summon Item now takes a few seconds to remove the mark from an item, so you + no longer accidentally remove it. + - balance: The mindswap book now gives a slight message warning it's changed on + read. + - balance: Sacred Flame now lets people around them know they're actually being + made super flammable. + - balance: Olfaction can't be cast if you have no nose (you're headless). + - balance: Being Emotemute now prevents you from invoking spells which require emotes + (mime spells). + - balance: All wizard spells except Mindswap can't be cast if the wizard is just + a brain. Most spells didn't work, anyways. + - balance: PAIs and carded AIs can no longer cast spells. Most spells didn't work, + anyways. + - balance: You can't mindswap into PAIs and brains(?). + - admin: Admins can now add spells by name or typepath. + - admin: Spell requirements are bitflags now, so you can modify them with the bit-field + VV ui. Pretty neat. + - code_imp: proc_holders have been removed from existence. + - refactor: Wizard, Heretic, Revenant, and Genetics spells are now all action datums. + - refactor: Xenomorph, Spider, and Cytology monster abilities are now all action + datums. + - refactor: Some malf AI and cult abilities are now fully action datums instead + of an unholy mix of proc holder and action. + - refactor: Refactored how cult's blood target is set. + - refactor: Bloodcrawling and jaunting have been completely refactored. Blood crawling + has been exorcised from the living level of mobs, and the consumption part of + (s)laughter demons is now handled by the action itself. + - refactor: The wizard's teleport scroll now actually holds and casts a version + of the "teleport" spell, instead of fake casting it. + - refactor: Refactored the wizard spellbook a bit. + - refactor: Refactored how all item actions are applied and handled. + - rscdel: SDQL spells have been removed. + Meyhazah: + - imageadd: new sprites for the Chaplain's crusader, ancient, profane and follower + outfits. + NotZang: + - qol: Consistency with the other bot's examination text. + Salex08: + - admin: Admins can now cancel midround random events + TheBoondock: + - bugfix: fixed telekinesis teleporting gun shenanigan + jlsnow301: + - bugfix: Fixed a bug that made the hacking status display not appear + lizardqueenlexi: + - bugfix: Limb growing code now uses species_color instead of mutant_color for synthetic + limb coloration + necromanceranne: + - imageadd: Improves the sprites for bullets, thermal projectiles, and introduces + pellet sprites. + orthography: + - bugfix: fixes intercoms being the incorrect state. + san7890: + - bugfix: Chefs on IceBoxStation will now start with eggs and milk again. +2022-07-03: + Pepsilawn: + - bugfix: Kilostation's Supermatter was made more consistent, it will no longer + start with its pumps lacking pressure target checking. + Y0SH1M4S73R: + - bugfix: Maids in the Mirror are unaffected by the gaze of ghosts + chesse20: + - rscadd: Furry Pride large spraypaint added to spraycans + san7890: + - qol: There is now a new preference in Game Preferences, Suppress All Ghost Rolls. + If you tick this preference, you will not get a singular window pop-up whenever + a Ghost Role is available. Intended for the few who really do need it. + - admin: Admins get another additional preference where Suppress All Ghost Roles + only works while they are currently in an adminned state. They will still get + ghost rolls normally when they are in a deadminned state. diff --git a/html/statbrowser.js b/html/statbrowser.js index d024d50b8c3d1f..74687b19393824 100644 --- a/html/statbrowser.js +++ b/html/statbrowser.js @@ -813,8 +813,8 @@ Byond.subscribeTo('update_spells', function (payload) { do_update = true; } init_spells(); - if (payload.verblist) { - spells = payload.verblist; + if (payload.actions) { + spells = payload.actions; if (do_update) { draw_spells(current_tab); } diff --git a/icons/area/areas_station.dmi b/icons/area/areas_station.dmi index 68d19905302944..38ce98d85bfcb9 100644 Binary files a/icons/area/areas_station.dmi and b/icons/area/areas_station.dmi differ diff --git a/icons/effects/96x32.dmi b/icons/effects/96x32.dmi index 937b2e8d4245b5..a78d11530b945a 100644 Binary files a/icons/effects/96x32.dmi and b/icons/effects/96x32.dmi differ diff --git a/icons/effects/beam.dmi b/icons/effects/beam.dmi index 7ff9807d9e534f..b050a6dfd590c0 100644 Binary files a/icons/effects/beam.dmi and b/icons/effects/beam.dmi differ diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi index 8513e3672ac951..8beb91e6b3adfb 100644 Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ diff --git a/icons/effects/glow_weather.dmi b/icons/effects/glow_weather.dmi new file mode 100644 index 00000000000000..021da02fe37be1 Binary files /dev/null and b/icons/effects/glow_weather.dmi differ diff --git a/icons/effects/landmarks_static.dmi b/icons/effects/landmarks_static.dmi index 2082afc2fe0255..d6a26b050d59af 100644 Binary files a/icons/effects/landmarks_static.dmi and b/icons/effects/landmarks_static.dmi differ diff --git a/icons/effects/random_spawners.dmi b/icons/effects/random_spawners.dmi index a9a83ec0e6395c..2eb6a40538b2a0 100644 Binary files a/icons/effects/random_spawners.dmi and b/icons/effects/random_spawners.dmi differ diff --git a/icons/effects/weather_effects.dmi b/icons/effects/weather_effects.dmi index 0149245d943e75..00083c464a24f1 100644 Binary files a/icons/effects/weather_effects.dmi and b/icons/effects/weather_effects.dmi differ diff --git a/icons/effects/welding_effect.dmi b/icons/effects/welding_effect.dmi new file mode 100644 index 00000000000000..8b8db2dcaeaca4 Binary files /dev/null and b/icons/effects/welding_effect.dmi differ diff --git a/icons/hud/radial.dmi b/icons/hud/radial.dmi index 6ee4ece36bd0e1..5d18f96d05e111 100644 Binary files a/icons/hud/radial.dmi and b/icons/hud/radial.dmi differ diff --git a/icons/hud/screen_alert.dmi b/icons/hud/screen_alert.dmi index 8ba79a5ff85185..e880e02a819703 100755 Binary files a/icons/hud/screen_alert.dmi and b/icons/hud/screen_alert.dmi differ diff --git a/icons/mob/aibots.dmi b/icons/mob/aibots.dmi index 7b9570845129d5..0e4ddd1b984569 100644 Binary files a/icons/mob/aibots.dmi and b/icons/mob/aibots.dmi differ diff --git a/icons/mob/cargorillia.dmi b/icons/mob/cargorillia.dmi new file mode 100644 index 00000000000000..4e9ac417185608 Binary files /dev/null and b/icons/mob/cargorillia.dmi differ diff --git a/icons/mob/clothing/belt_mirror.dmi b/icons/mob/clothing/belt_mirror.dmi index d83172551233c3..3f53b2a11ce308 100644 Binary files a/icons/mob/clothing/belt_mirror.dmi and b/icons/mob/clothing/belt_mirror.dmi differ diff --git a/icons/mob/clothing/head.dmi b/icons/mob/clothing/head.dmi index 9694491fd09a37..286b57577c4e86 100644 Binary files a/icons/mob/clothing/head.dmi and b/icons/mob/clothing/head.dmi differ diff --git a/icons/mob/clothing/mask.dmi b/icons/mob/clothing/mask.dmi index 8b8c8e55a0cae6..8460d944db2fe3 100644 Binary files a/icons/mob/clothing/mask.dmi and b/icons/mob/clothing/mask.dmi differ diff --git a/icons/mob/clothing/suit.dmi b/icons/mob/clothing/suit.dmi index fedf63c7f5935f..dda93df1188cad 100644 Binary files a/icons/mob/clothing/suit.dmi and b/icons/mob/clothing/suit.dmi differ diff --git a/icons/mob/clothing/under/civilian.dmi b/icons/mob/clothing/under/civilian.dmi index aaabf5dbb4025c..a29453c72e3d92 100644 Binary files a/icons/mob/clothing/under/civilian.dmi and b/icons/mob/clothing/under/civilian.dmi differ diff --git a/icons/mob/clothing/under/costume.dmi b/icons/mob/clothing/under/costume.dmi index aed7249eb46455..28c14f5943c9bd 100644 Binary files a/icons/mob/clothing/under/costume.dmi and b/icons/mob/clothing/under/costume.dmi differ diff --git a/icons/mob/clothing/under/suits.dmi b/icons/mob/clothing/under/suits.dmi index 0a8043c1e8a5fc..debd01601ecdcf 100644 Binary files a/icons/mob/clothing/under/suits.dmi and b/icons/mob/clothing/under/suits.dmi differ diff --git a/icons/mob/huds/hud.dmi b/icons/mob/huds/hud.dmi index c945e96055f7e5..807d4bf649c1fe 100644 Binary files a/icons/mob/huds/hud.dmi and b/icons/mob/huds/hud.dmi differ diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi index 12d6652bef4aeb..e2a913e0da3c83 100644 Binary files a/icons/mob/human_face.dmi and b/icons/mob/human_face.dmi differ diff --git a/icons/mob/inhands/clothing_lefthand.dmi b/icons/mob/inhands/clothing_lefthand.dmi index 5ad9ec35b94685..b2f95564683914 100644 Binary files a/icons/mob/inhands/clothing_lefthand.dmi and b/icons/mob/inhands/clothing_lefthand.dmi differ diff --git a/icons/mob/inhands/clothing_righthand.dmi b/icons/mob/inhands/clothing_righthand.dmi index bd298e3d7e73f1..55fb568bd7f539 100644 Binary files a/icons/mob/inhands/clothing_righthand.dmi and b/icons/mob/inhands/clothing_righthand.dmi differ diff --git a/icons/mob/inhands/equipment/backpack_lefthand.dmi b/icons/mob/inhands/equipment/backpack_lefthand.dmi index 999fe1fe5ecd86..76301c2bdb192f 100644 Binary files a/icons/mob/inhands/equipment/backpack_lefthand.dmi and b/icons/mob/inhands/equipment/backpack_lefthand.dmi differ diff --git a/icons/mob/inhands/equipment/backpack_righthand.dmi b/icons/mob/inhands/equipment/backpack_righthand.dmi index c71178e3f43f78..f060b83eb907a6 100644 Binary files a/icons/mob/inhands/equipment/backpack_righthand.dmi and b/icons/mob/inhands/equipment/backpack_righthand.dmi differ diff --git a/icons/mob/inhands/equipment/fishing_rod_lefthand.dmi b/icons/mob/inhands/equipment/fishing_rod_lefthand.dmi new file mode 100644 index 00000000000000..846c36522cc100 Binary files /dev/null and b/icons/mob/inhands/equipment/fishing_rod_lefthand.dmi differ diff --git a/icons/mob/inhands/equipment/fishing_rod_righthand.dmi b/icons/mob/inhands/equipment/fishing_rod_righthand.dmi new file mode 100644 index 00000000000000..fdc2e770c998b7 Binary files /dev/null and b/icons/mob/inhands/equipment/fishing_rod_righthand.dmi differ diff --git a/icons/mob/inhands/equipment/hydroponics_lefthand.dmi b/icons/mob/inhands/equipment/hydroponics_lefthand.dmi index f2dafa9bd60c26..031909dbf82409 100644 Binary files a/icons/mob/inhands/equipment/hydroponics_lefthand.dmi and b/icons/mob/inhands/equipment/hydroponics_lefthand.dmi differ diff --git a/icons/mob/inhands/equipment/hydroponics_righthand.dmi b/icons/mob/inhands/equipment/hydroponics_righthand.dmi index 0006212fc58c82..a2cac9c47f3079 100644 Binary files a/icons/mob/inhands/equipment/hydroponics_righthand.dmi and b/icons/mob/inhands/equipment/hydroponics_righthand.dmi differ diff --git a/icons/mob/inhands/misc/devices_lefthand.dmi b/icons/mob/inhands/misc/devices_lefthand.dmi index 55456a6e073631..bd1f1fcfdc0269 100644 Binary files a/icons/mob/inhands/misc/devices_lefthand.dmi and b/icons/mob/inhands/misc/devices_lefthand.dmi differ diff --git a/icons/mob/inhands/misc/devices_righthand.dmi b/icons/mob/inhands/misc/devices_righthand.dmi index a274e001ebab0a..81a21c2356d312 100644 Binary files a/icons/mob/inhands/misc/devices_righthand.dmi and b/icons/mob/inhands/misc/devices_righthand.dmi differ diff --git a/icons/mob/inhands/weapons/melee_lefthand.dmi b/icons/mob/inhands/weapons/melee_lefthand.dmi index fe8c2e7a7e3baf..7c112d6cb3a1b2 100644 Binary files a/icons/mob/inhands/weapons/melee_lefthand.dmi and b/icons/mob/inhands/weapons/melee_lefthand.dmi differ diff --git a/icons/mob/inhands/weapons/melee_righthand.dmi b/icons/mob/inhands/weapons/melee_righthand.dmi index c6614031c7db8a..f2ad28a0c0b7a1 100644 Binary files a/icons/mob/inhands/weapons/melee_righthand.dmi and b/icons/mob/inhands/weapons/melee_righthand.dmi differ diff --git a/icons/mob/pai.dmi b/icons/mob/pai.dmi index 5832f575b6ec48..0d582a7d9fa877 100644 Binary files a/icons/mob/pai.dmi and b/icons/mob/pai.dmi differ diff --git a/icons/mob/pai_item_head.dmi b/icons/mob/pai_item_head.dmi index 337e22254ea85b..0a04e7e8ab29e3 100644 Binary files a/icons/mob/pai_item_head.dmi and b/icons/mob/pai_item_head.dmi differ diff --git a/icons/mob/pai_item_lh.dmi b/icons/mob/pai_item_lh.dmi index fb9c77f5abae51..ffc85a476d45a4 100644 Binary files a/icons/mob/pai_item_lh.dmi and b/icons/mob/pai_item_lh.dmi differ diff --git a/icons/mob/pai_item_rh.dmi b/icons/mob/pai_item_rh.dmi index ced27446a451e6..7c575ae81f6054 100644 Binary files a/icons/mob/pai_item_rh.dmi and b/icons/mob/pai_item_rh.dmi differ diff --git a/icons/mob/simple_human.dmi b/icons/mob/simple_human.dmi index d654434b55b159..cdb2275ee2438a 100644 Binary files a/icons/mob/simple_human.dmi and b/icons/mob/simple_human.dmi differ diff --git a/icons/mob/talk.dmi b/icons/mob/talk.dmi index ad2c50287b6816..6b2fc395cba0d4 100644 Binary files a/icons/mob/talk.dmi and b/icons/mob/talk.dmi differ diff --git a/icons/obj/assemblies/new_assemblies.dmi b/icons/obj/assemblies/new_assemblies.dmi index fc4ff9813ddd4c..de031383c752d9 100644 Binary files a/icons/obj/assemblies/new_assemblies.dmi and b/icons/obj/assemblies/new_assemblies.dmi differ diff --git a/icons/obj/brokentiling.dmi b/icons/obj/brokentiling.dmi index 0c14789b4bf227..853c6fbd35c63d 100644 Binary files a/icons/obj/brokentiling.dmi and b/icons/obj/brokentiling.dmi differ diff --git a/icons/obj/card.dmi b/icons/obj/card.dmi index 5953cfb58de98a..3a55571566b656 100644 Binary files a/icons/obj/card.dmi and b/icons/obj/card.dmi differ diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index e839d4f4ea978a..2cebd2870e343f 100644 Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ diff --git a/icons/obj/clothing/masks.dmi b/icons/obj/clothing/masks.dmi index 85e79bb0902ef4..0688b2ad6a291a 100644 Binary files a/icons/obj/clothing/masks.dmi and b/icons/obj/clothing/masks.dmi differ diff --git a/icons/obj/clothing/modsuit/mod_modules.dmi b/icons/obj/clothing/modsuit/mod_modules.dmi index 0e0121b33d9092..69affa3fa49943 100644 Binary files a/icons/obj/clothing/modsuit/mod_modules.dmi and b/icons/obj/clothing/modsuit/mod_modules.dmi differ diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi index cc24947bb4de0a..07be1e15f269ed 100644 Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ diff --git a/icons/obj/clothing/under/civilian.dmi b/icons/obj/clothing/under/civilian.dmi index 6e5b2a68a3b543..33f4e837275535 100644 Binary files a/icons/obj/clothing/under/civilian.dmi and b/icons/obj/clothing/under/civilian.dmi differ diff --git a/icons/obj/clothing/under/costume.dmi b/icons/obj/clothing/under/costume.dmi index 5542ea920b9133..e9554278c862d8 100644 Binary files a/icons/obj/clothing/under/costume.dmi and b/icons/obj/clothing/under/costume.dmi differ diff --git a/icons/obj/clothing/under/suits.dmi b/icons/obj/clothing/under/suits.dmi index d1e2c5c1de927c..1641c207836f78 100644 Binary files a/icons/obj/clothing/under/suits.dmi and b/icons/obj/clothing/under/suits.dmi differ diff --git a/icons/obj/crates.dmi b/icons/obj/crates.dmi index cfc869f98cbbd5..208af28f97cf2c 100644 Binary files a/icons/obj/crates.dmi and b/icons/obj/crates.dmi differ diff --git a/icons/obj/doors/shutters_window.dmi b/icons/obj/doors/shutters_window.dmi index 550e01f987821f..fcf8af5b94fd79 100644 Binary files a/icons/obj/doors/shutters_window.dmi and b/icons/obj/doors/shutters_window.dmi differ diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi index 8348293dcefce2..fb1ee1d956df17 100644 Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ diff --git a/icons/obj/fishing.dmi b/icons/obj/fishing.dmi new file mode 100644 index 00000000000000..13b2409ed28fff Binary files /dev/null and b/icons/obj/fishing.dmi differ diff --git a/icons/obj/food/burgerbread.dmi b/icons/obj/food/burgerbread.dmi index bcee4de90f2a57..63cd4263012fad 100644 Binary files a/icons/obj/food/burgerbread.dmi and b/icons/obj/food/burgerbread.dmi differ diff --git a/icons/obj/food/food.dmi b/icons/obj/food/food.dmi index 9015ef2100c235..aa089ac5c3507b 100644 Binary files a/icons/obj/food/food.dmi and b/icons/obj/food/food.dmi differ diff --git a/icons/obj/food/frozen_treats.dmi b/icons/obj/food/frozen_treats.dmi index 6d1f501ffa706e..133d6de83a03bf 100644 Binary files a/icons/obj/food/frozen_treats.dmi and b/icons/obj/food/frozen_treats.dmi differ diff --git a/icons/obj/food/lizard.dmi b/icons/obj/food/lizard.dmi index 25ea72ec4a262e..89b23761e4bfee 100644 Binary files a/icons/obj/food/lizard.dmi and b/icons/obj/food/lizard.dmi differ diff --git a/icons/obj/food/pizzaspaghetti.dmi b/icons/obj/food/pizzaspaghetti.dmi index a5deb9eb97fb0c..e8d88cdbf9c573 100644 Binary files a/icons/obj/food/pizzaspaghetti.dmi and b/icons/obj/food/pizzaspaghetti.dmi differ diff --git a/icons/obj/guns/ballistic.dmi b/icons/obj/guns/ballistic.dmi index c8c4e585eff680..1c04b37476219c 100644 Binary files a/icons/obj/guns/ballistic.dmi and b/icons/obj/guns/ballistic.dmi differ diff --git a/icons/obj/guns/energy.dmi b/icons/obj/guns/energy.dmi index 3d46b6c84e56b4..3ec60e3f5e101f 100644 Binary files a/icons/obj/guns/energy.dmi and b/icons/obj/guns/energy.dmi differ diff --git a/icons/obj/guns/projectiles.dmi b/icons/obj/guns/projectiles.dmi index 432517ebcb61a3..de24bcb935b396 100644 Binary files a/icons/obj/guns/projectiles.dmi and b/icons/obj/guns/projectiles.dmi differ diff --git a/icons/obj/hydroponics/equipment.dmi b/icons/obj/hydroponics/equipment.dmi index 08d86965b5b8da..2f7b511cdefe00 100644 Binary files a/icons/obj/hydroponics/equipment.dmi and b/icons/obj/hydroponics/equipment.dmi differ diff --git a/icons/obj/hydroponics/growing_fruits.dmi b/icons/obj/hydroponics/growing_fruits.dmi index 2ad7a5a5f7db0b..a71acabc2aecc7 100644 Binary files a/icons/obj/hydroponics/growing_fruits.dmi and b/icons/obj/hydroponics/growing_fruits.dmi differ diff --git a/icons/obj/hydroponics/harvest.dmi b/icons/obj/hydroponics/harvest.dmi index c38b928302c1ce..a3b738f9d5e0aa 100644 Binary files a/icons/obj/hydroponics/harvest.dmi and b/icons/obj/hydroponics/harvest.dmi differ diff --git a/icons/obj/hydroponics/seeds.dmi b/icons/obj/hydroponics/seeds.dmi index 7948e2ab89fed3..d2b2e4c76f617e 100644 Binary files a/icons/obj/hydroponics/seeds.dmi and b/icons/obj/hydroponics/seeds.dmi differ diff --git a/icons/obj/items_and_weapons.dmi b/icons/obj/items_and_weapons.dmi index 5c74b867d0394f..9209e07422d42d 100644 Binary files a/icons/obj/items_and_weapons.dmi and b/icons/obj/items_and_weapons.dmi differ diff --git a/icons/obj/plumbing/connects.dmi b/icons/obj/plumbing/connects.dmi index 32277ffac6597e..943b580a624d8d 100644 Binary files a/icons/obj/plumbing/connects.dmi and b/icons/obj/plumbing/connects.dmi differ diff --git a/icons/obj/plumbing/fluid_ducts.dmi b/icons/obj/plumbing/fluid_ducts.dmi index d911e25b9c9262..f28a4c35853e06 100644 Binary files a/icons/obj/plumbing/fluid_ducts.dmi and b/icons/obj/plumbing/fluid_ducts.dmi differ diff --git a/icons/obj/plushes.dmi b/icons/obj/plushes.dmi index dfc7e5af8b3944..772b27d1d8e1a3 100644 Binary files a/icons/obj/plushes.dmi and b/icons/obj/plushes.dmi differ diff --git a/icons/obj/radio.dmi b/icons/obj/radio.dmi index 4588d215aed741..37b810f332f348 100644 Binary files a/icons/obj/radio.dmi and b/icons/obj/radio.dmi differ diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi index 229bd9177d472f..2b5b3d5f054b6e 100644 Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ diff --git a/icons/obj/tiles.dmi b/icons/obj/tiles.dmi index cf7b64830c4cb3..305f3fd884b5f8 100644 Binary files a/icons/obj/tiles.dmi and b/icons/obj/tiles.dmi differ diff --git a/icons/obj/vehicles.dmi b/icons/obj/vehicles.dmi index 9056106ea67880..7c0b84b8869786 100644 Binary files a/icons/obj/vehicles.dmi and b/icons/obj/vehicles.dmi differ diff --git a/icons/turf/damaged.dmi b/icons/turf/damaged.dmi new file mode 100644 index 00000000000000..175de493e455df Binary files /dev/null and b/icons/turf/damaged.dmi differ diff --git a/icons/turf/floors.dmi b/icons/turf/floors.dmi index 1230a2fbba22f6..21cb1382536438 100644 Binary files a/icons/turf/floors.dmi and b/icons/turf/floors.dmi differ diff --git a/icons/turf/floors/bamboo_mat.dmi b/icons/turf/floors/bamboo_mat.dmi index ec4bcf1c0de599..ab915f341e2dae 100644 Binary files a/icons/turf/floors/bamboo_mat.dmi and b/icons/turf/floors/bamboo_mat.dmi differ diff --git a/icons/turf/floors/carpet.dmi b/icons/turf/floors/carpet.dmi index 9040e45da56c2c..1af03a1df82345 100644 Binary files a/icons/turf/floors/carpet.dmi and b/icons/turf/floors/carpet.dmi differ diff --git a/icons/turf/floors/carpet_black.dmi b/icons/turf/floors/carpet_black.dmi index cb4dff5354330f..e2fea9085b2303 100644 Binary files a/icons/turf/floors/carpet_black.dmi and b/icons/turf/floors/carpet_black.dmi differ diff --git a/icons/turf/floors/carpet_blue.dmi b/icons/turf/floors/carpet_blue.dmi index ea04cffc6ba4a4..b909b11f359d98 100644 Binary files a/icons/turf/floors/carpet_blue.dmi and b/icons/turf/floors/carpet_blue.dmi differ diff --git a/icons/turf/floors/carpet_cyan.dmi b/icons/turf/floors/carpet_cyan.dmi index 1dc9400f78b96d..85e053a5a6de40 100644 Binary files a/icons/turf/floors/carpet_cyan.dmi and b/icons/turf/floors/carpet_cyan.dmi differ diff --git a/icons/turf/floors/carpet_green.dmi b/icons/turf/floors/carpet_green.dmi index 182b1af39c4039..39ef0480874811 100644 Binary files a/icons/turf/floors/carpet_green.dmi and b/icons/turf/floors/carpet_green.dmi differ diff --git a/icons/turf/floors/carpet_orange.dmi b/icons/turf/floors/carpet_orange.dmi index d1a20dfac5ce5e..4f0b2078fca38a 100644 Binary files a/icons/turf/floors/carpet_orange.dmi and b/icons/turf/floors/carpet_orange.dmi differ diff --git a/icons/turf/floors/carpet_purple.dmi b/icons/turf/floors/carpet_purple.dmi index bfe03c195a9814..f07ce75d334064 100644 Binary files a/icons/turf/floors/carpet_purple.dmi and b/icons/turf/floors/carpet_purple.dmi differ diff --git a/icons/turf/floors/carpet_red.dmi b/icons/turf/floors/carpet_red.dmi index 934d541e8fddcf..eb0527f430dc4a 100644 Binary files a/icons/turf/floors/carpet_red.dmi and b/icons/turf/floors/carpet_red.dmi differ diff --git a/icons/turf/floors/carpet_royalblack.dmi b/icons/turf/floors/carpet_royalblack.dmi index 323f1806f36150..0b848ac1afa44f 100644 Binary files a/icons/turf/floors/carpet_royalblack.dmi and b/icons/turf/floors/carpet_royalblack.dmi differ diff --git a/icons/turf/floors/carpet_royalblue.dmi b/icons/turf/floors/carpet_royalblue.dmi index 95f1b6400deeb9..1027b0e19f58e7 100644 Binary files a/icons/turf/floors/carpet_royalblue.dmi and b/icons/turf/floors/carpet_royalblue.dmi differ diff --git a/icons/turf/floors/glass.dmi b/icons/turf/floors/glass.dmi index e28bb13e233a02..ad833bddcbd067 100644 Binary files a/icons/turf/floors/glass.dmi and b/icons/turf/floors/glass.dmi differ diff --git a/icons/turf/floors/plasma_glass.dmi b/icons/turf/floors/plasma_glass.dmi new file mode 100644 index 00000000000000..0417819c6fbed1 Binary files /dev/null and b/icons/turf/floors/plasma_glass.dmi differ diff --git a/icons/turf/floors/reinf_glass.dmi b/icons/turf/floors/reinf_glass.dmi index 97614f510f745a..4f53e8129c1c28 100644 Binary files a/icons/turf/floors/reinf_glass.dmi and b/icons/turf/floors/reinf_glass.dmi differ diff --git a/icons/turf/floors/reinf_plasma_glass.dmi b/icons/turf/floors/reinf_plasma_glass.dmi new file mode 100644 index 00000000000000..c622a909e31b92 Binary files /dev/null and b/icons/turf/floors/reinf_plasma_glass.dmi differ diff --git a/icons/ui_icons/fishing/default.png b/icons/ui_icons/fishing/default.png new file mode 100644 index 00000000000000..f21074ac2dde8b Binary files /dev/null and b/icons/ui_icons/fishing/default.png differ diff --git a/icons/ui_icons/fishing/lavaland.png b/icons/ui_icons/fishing/lavaland.png new file mode 100644 index 00000000000000..6c97f66432e94a Binary files /dev/null and b/icons/ui_icons/fishing/lavaland.png differ diff --git a/interface/skin.dmf b/interface/skin.dmf index 19ba4cc3b2b670..ae43a3c401bb9d 100644 --- a/interface/skin.dmf +++ b/interface/skin.dmf @@ -221,14 +221,13 @@ window "outputwindow" size = 517x20 anchor1 = 0,100 anchor2 = 100,100 - background-color = #d3b5b5 is-default = true - border = sunken + border = line saved-params = "command" elem "oocbutton" type = BUTTON pos = 599,460 - size = 40x19 + size = 40x20 anchor1 = 100,100 anchor2 = -1,-1 background-color = none @@ -241,7 +240,7 @@ window "outputwindow" elem "saybutton" type = BUTTON pos = 519,460 - size = 40x19 + size = 40x20 anchor1 = 100,100 anchor2 = -1,-1 background-color = none @@ -254,7 +253,7 @@ window "outputwindow" elem "mebutton" type = BUTTON pos = 559,460 - size = 40x19 + size = 40x20 anchor1 = 100,100 anchor2 = -1,-1 background-color = none @@ -270,7 +269,6 @@ window "outputwindow" size = 640x456 anchor1 = 0,0 anchor2 = 100,100 - background-color = #ffffff is-visible = false is-disabled = true saved-params = "" @@ -339,3 +337,22 @@ window "statwindow" is-visible = false saved-params = "" +window "tgui_say" + elem "tgui_say" + type = MAIN + pos = 848,500 + size = 231x30 + anchor1 = 50,50 + anchor2 = 50,50 + is-visible = false + saved-params = "" + statusbar = false + can-minimize = false + elem "browser" + type = BROWSER + pos = 0,0 + size = 231x30 + anchor1 = 0,0 + anchor2 = 0,0 + saved-params = "" + diff --git a/sound/effects/bigsplash.ogg b/sound/effects/bigsplash.ogg new file mode 100644 index 00000000000000..772e8c5b260ebe Binary files /dev/null and b/sound/effects/bigsplash.ogg differ diff --git a/sound/effects/fish_splash.ogg b/sound/effects/fish_splash.ogg new file mode 100644 index 00000000000000..4c5a68bab79ab0 Binary files /dev/null and b/sound/effects/fish_splash.ogg differ diff --git a/sound/effects/piano_hit.ogg b/sound/effects/piano_hit.ogg new file mode 100644 index 00000000000000..fbf74c155312e6 Binary files /dev/null and b/sound/effects/piano_hit.ogg differ diff --git a/sound/effects/ping_hit.ogg b/sound/effects/ping_hit.ogg new file mode 100644 index 00000000000000..729bd7efa887be Binary files /dev/null and b/sound/effects/ping_hit.ogg differ diff --git a/sound/effects/splash.ogg b/sound/effects/splash.ogg new file mode 100644 index 00000000000000..a02121ae02fb97 Binary files /dev/null and b/sound/effects/splash.ogg differ diff --git a/sound/weapons/gun/general/ballistic_click.ogg b/sound/weapons/gun/general/ballistic_click.ogg new file mode 100644 index 00000000000000..67175d851eddbe Binary files /dev/null and b/sound/weapons/gun/general/ballistic_click.ogg differ diff --git a/strings/memories.json b/strings/memories.json index 52c54ebece1918..f373e005d1795f 100644 --- a/strings/memories.json +++ b/strings/memories.json @@ -414,7 +414,7 @@ ], "nuke_code_names":[ "%PROTAGONIST learns the detonation codes for a nuclear weapon, %NUKE_CODE." - ], + ], "nuke_code_starts":[ "The number %NUKE_CODE written on a sticky note with the words \"FOR SYNDICATE EYES ONLY\" scrawled next to it.", "A piece of paper with the number %NUKE_CODE being handed to %PROTAGONIST from a figure in a blood-red MODsuit." @@ -442,5 +442,16 @@ "playing_52_pickup_moods":[ "%PROTAGONIST %MOOD as they taunt %DEUTERAGONIST.", "%DEUTERAGONIST %MOOD as they shamefully pickup the cards." + ], + "russian_roulette_names":[ + "%PROTAGONIST playing a game of russian roulette." + ], + "russian_roulette_starts":[ + "%PROTAGONIST aiming at their %BODYPART right before they pull the trigger.", + "The revolver has %LOADED_ROUNDS rounds loaded in the chamber.", + "%PROTAGONIST is gambling their life as they spin the revolver." + ], + "russian_roulette_moods":[ + "%PROTAGONIST %MOOD as they %OUTCOME the deadly game of roulette." ] } diff --git a/strings/sillytips.txt b/strings/sillytips.txt index de52969f235f89..aeb7b9b27aef5a 100644 --- a/strings/sillytips.txt +++ b/strings/sillytips.txt @@ -14,7 +14,7 @@ The wizard is supposed to be extremely strong in one on one combat, stop getting Sometimes a round will just be a bust. C'est la vie. This is a game that is constantly being developed for. Expect things to be added, removed, fixed, and broken on a daily basis. It's fun to try and predict the round type from the tip of the round message. -The quartermaster is not a head of staff and will never be one. +The quartermaster is only a head of staff so their feelings aren’t hurt. Don’t tell them. The bird remembers. Your sprite represents your hitbox, so that afro makes you easier to kill. The sacrifices we make for style. Sometimes admins will just do stuff. Roll with it. diff --git a/strings/tips.txt b/strings/tips.txt index 21696a74b2304a..667df8aa01ddaa 100644 --- a/strings/tips.txt +++ b/strings/tips.txt @@ -1,41 +1,3 @@ -Where the space map levels connect is randomized every round, but are otherwise kept consistent within rounds. Remember that they are not necessarily bidirectional! -You can catch thrown items by toggling on your throw mode with an empty hand active. -To crack the safe in the vault, use a stethoscope or three plastic explosives on it. -You can climb onto a table by dragging yourself onto one. This takes time and drops the items in your hands on the table. Clicking on a table that someone else is climbing onto will knock them down. -You can drag other players onto yourself to open the strip menu, letting you remove their equipment or force them to wear something. Note that exosuits or helmets will block your access to the clothing beneath them, and that certain items take longer to strip or put on than others. -Clicking on a windoor rather then bumping into it will keep it open, you can click it again to close it. -You can spray a fire extinguisher, throw items or fire a gun while floating through space to change your direction. Simply fire opposite to where you want to go. -You can change the control scheme by pressing tab. One is WASD, the other is the arrow keys. Keep in mind that hotkeys are also changed with this. -Firesuits and winter coats offer mild protection from the cold, allowing you to spend longer periods of time near breaches and space than if wearing nothing at all. -Glass shards can be welded to make glass, and iron rods can be welded to make iron. Ores can be welded too, but this takes a lot of fuel. -If you need to drag multiple people either to safety or to space, bring a locker or crate over and stuff them all in before hauling them off. -You can grab someone by holding Ctrl and clicking on them, then upgrade the grab by Ctrl-clicking on them once more. An aggressive grab will momentarily stun someone, allow you to place them on a table by clicking on it, or throw them by toggling on throwing. -Holding alt and left clicking a tile will allow you to see its contents in the top right window pane, which is much faster than right clicking. -The resist button will allow you to resist out of handcuffs, being buckled to a chair or bed, out of locked lockers and more. Whenever you're stuck, try resisting! -You can move an item out of the way by dragging it and then clicking on an adjacent tile with an empty hand. -You can recolor certain items like jumpsuits and gloves in washing machines by also throwing in a crayon. -Maintenance is full of equipment that is randomized every round. Look around and see if anything is worth using. -Some roles cannot be antagonists by default, but antag selection is decided first. For instance, you can set Security Officer to High without affecting your chances of becoming an antag -- the game will just select a different role. -There are many places around the station to hide contraband. A few for starters: linen boxes, toilet cisterns, body bags. Experiment to find more! -You can use a machine in the vault to deposit cash or rob Cargo's department funds. -When in doubt about technicial issues, clear your cache (byond launcher > cogwheel > preferences > game prefs), update your BYOND, and relog. -Most things have special interactions with right, alt, shift, and control click. Experiment! -You can screwdriver any non-chemical grenade to shorten fuses from 5 seconds, to 3 seconds, to instant boom! Nobody ever expects this. -If you find yourself in a fistfight with another player, staying on the offensive is usually the smart move. Running away often won't accomplish much. -Different weapons have different strengths. Some weapons, such as spears, floor tiles, and throwing stars, deal more damage when thrown compared to when attacked normally. -A thrown glass of water can make a slippery tile, allowing you to slow down your pursuers in a pinch. -When dealing with security, you can often get your sentence negated entirely through cooperation and deception. -The P2P chat function found on tablet computers allows for a stealthy way to communicate with people. -Experiment with different setups of the supermatter engine to maximize output, but don't risk the crew's safety to do so! -We were all new once, be patient and guide new players in the right direction. -On most clothing items that go in the exosuit slot, you can put certain small items into your suit storage, such as a spraycan, your emergency oxygen tank, or a flashlight. -Most job-related exosuit clothing can fit job-related items into it, such as the atmospheric technician's winter coat holding an RPD, or labcoats holding most medicine. -If you're using hotkey mode, you can stop pulling things using H. -The station's self-destruct terminal is invincible. Go find the disk instead of trying to destroy it. -If there's something you need from another department, try asking! This game isn't singleplayer and you'd be surprised what you can get accomplished together! -You'll quickly lose your interest in the game if you play to win and kill. If you find yourself doing this, take a step back and talk to people - it's a much better experience! -Felinids get temporarily distracted by laser pointers. Use this to your advantage when being pursued by one. -Don't be afraid to ask for help, whether from your peers or from admins. As the Captain, you are one of the highest priority targets on the station. Everything from revolutions, to nuclear operatives, to traitors that need to rob you of your unique lasgun or your life are things to worry about. As the Captain, always take the nuclear disk and pinpointer with you every shift. It's a good idea to give one of these to another head you can trust with keeping it safe. As the Captain, you have absolute access and control over the station, but this does not mean that being a horrible person won't result in mutiny and a ban. @@ -72,7 +34,6 @@ As a Scientist, you can maximize the number of uses you get out of a slime by fe As a Scientist, you can disable anomalies by scanning them with an analyzer, then send a signal on the frequency it gives you with a remote signaling device, or if researched, hit the anomaly an anomaly analyzer. This will leave behind an anomaly core, which can be used to construct a Phazon mech, reactive armors, or various unique and powerful weapons! As a Scientist, researchable stock parts can seriously improve the efficiency and speed of machines around the station. In some cases, it can even unlock new functions. As a Scientist, you can generate money for Science, and complete experiments by letting the tachyon-doppler array record increasingly large explosions. -As a Scientist, getting drunk just enough will speed up research. Skol! As a Roboticist, keep an ear out for anomaly announcements. If you get your hands on a bluespace anomaly core, you can build a Phazon mech! As a Roboticist, you can repair your cyborgs with a welding tool. If they have taken burn damage, you can remove their battery, expose the wiring with a screwdriver and replace their wires with a cable coil. As a Roboticist, you can reset a cyborg's model by cutting and mending the reset wire with a wire cutter. @@ -100,7 +61,6 @@ As an Engineer, you can temporarily power the station solely with the solar arra As an Engineer, you can cool the supermatter crystal by spraying it with a fire extinguisher. Only for the brave! As an Engineer, you can repair windows by using a welding tool on them while not in combat mode. As an Engineer, you can lock APCs, fire alarms, emitters and radiation collectors using your ID card to prevent others from disabling them. -As an Engineer, don't underestimate the humble P.A.C.M.A.N. generators. With upgraded parts, a couple units working in tandem are sufficient to take over for an exploded engine or shattered solars. As an Engineer, your departmental protolathe and circuit printer can manufacture the necessary circuit boards and components to build just about anything. Make extra medical machinery everywhere! Build a gibber for security! Set up an array of emitters pointing down the hall! The possibilities are endless! As an Engineer, you can pry open secure storage blast doors by disabling the engine room APC's main breaker. This is obviously a bad idea if the engine is running. As an Engineer, your RCD can be reloaded with iron, glass or plasteel sheets instead of just compressed matter cartridges. @@ -112,6 +72,7 @@ As an Atmospheric Technician, your backpack firefighter tank can launch resin. T As an Atmospheric Technician, your ATMOS holofan projector blocks gases while allowing objects to pass through. With it, you can quickly contain gas spills, fires and hull breaches. As an Atmospheric Technician, burning a plasma/oxygen mix inside the incinerator will not only produce power, but also gases such as tritium, water vapor and carbon dioxide. As an Atmospheric Technician, you can change the layer of a pipe by clicking with it on a wrenched pipe or other atmos component of the desired layer. +As an Atmospheric Technician, pay attention to gas pipe meters. The meter will change color in response to temperature and the bar will increase and get thicker in response to higher pressures. As the Head of Security, you are expected to coordinate your security force to handle any threat that comes to the station. Sometimes it means making use of the armory to handle a blob, sometimes it means being ruthless during a revolution or cult. As the Head of Security, you can call for executions or forced cyborgization, but may require the Captain's approval. As the Head of Security, don't let the power go to your head. You may have high access, great equipment, and a miniature army at your side, but being a terrible person without a good reason is grounds for banning. @@ -253,3 +214,43 @@ Laying down will help slow down bloodloss. Death will halt it entirely. If you knock into somebody while doing a wicked grind on a skateboard, they will be floored for double the time. Radical! Sleeping can be used to recover from minor injuries. Sanity, darkness, blindfolds, earmuffs, tables, beds, and bedsheets affect the healing rate. You can cheat games by baking dice in microwaves to make them loaded. Cards can be seen with x-ray vision or be marked with either a pen or crayon to gain an edge. +Where the space map levels connect is randomized every round, but are otherwise kept consistent within rounds. Remember that they are not necessarily bidirectional! +You can catch thrown items by toggling on your throw mode with an empty hand active. +To crack the safe in the vault, use a stethoscope or three plastic explosives on it. +You can climb onto a table by dragging yourself onto one. This takes time and drops the items in your hands on the table. Clicking on a table that someone else is climbing onto will knock them down. +You can drag other players onto yourself to open the strip menu, letting you remove their equipment or force them to wear something. Note that exosuits or helmets will block your access to the clothing beneath them, and that certain items take longer to strip or put on than others. +Clicking on a windoor rather then bumping into it will keep it open, you can click it again to close it. +You can spray a fire extinguisher, throw items or fire a gun while floating through space to change your direction. Simply fire opposite to where you want to go. +You can change the control scheme by pressing tab. One is WASD, the other is the arrow keys. Keep in mind that hotkeys are also changed with this. +Firesuits and winter coats offer mild protection from the cold, allowing you to spend longer periods of time near breaches and space than if wearing nothing at all. +Glass shards can be welded to make glass, and iron rods can be welded to make iron. Ores can be welded too, but this takes a lot of fuel. +If you need to drag multiple people either to safety or to space, bring a locker or crate over and stuff them all in before hauling them off. +You can grab someone by holding Ctrl and clicking on them, then upgrade the grab by Ctrl-clicking on them once more. An aggressive grab will momentarily stun someone, allow you to place them on a table by clicking on it, or throw them by toggling on throwing. +Holding alt and left clicking a tile will allow you to see its contents in the top right window pane, which is much faster than right clicking. +The resist button will allow you to resist out of handcuffs, being buckled to a chair or bed, out of locked lockers and more. Whenever you're stuck, try resisting! +You can move an item out of the way by dragging it and then clicking on an adjacent tile with an empty hand. +You can recolor certain items like jumpsuits and gloves in washing machines by also throwing in a crayon. +Maintenance is full of equipment that is randomized every round. Look around and see if anything is worth using. +Some roles cannot be antagonists by default, but antag selection is decided first. For instance, you can set Security Officer to High without affecting your chances of becoming an antag -- the game will just select a different role. +There are many places around the station to hide contraband. A few for starters: linen boxes, toilet cisterns, body bags. Experiment to find more! +You can use a machine in the vault to deposit cash or rob Cargo's department funds. +When in doubt about technicial issues, clear your cache (byond launcher > cogwheel > preferences > game prefs), update your BYOND, and relog. +Most things have special interactions with right, alt, shift, and control click. Experiment! +You can screwdriver any non-chemical grenade to shorten fuses from 5 seconds, to 3 seconds, to instant boom! Nobody ever expects this. +If you find yourself in a fistfight with another player, staying on the offensive is usually the smart move. Running away often won't accomplish much. +Different weapons have different strengths. Some weapons, such as spears, floor tiles, and throwing stars, deal more damage when thrown compared to when attacked normally. +A thrown glass of water can make a slippery tile, allowing you to slow down your pursuers in a pinch. +When dealing with security, you can often get your sentence negated entirely through cooperation and deception. +The P2P chat function found on tablet computers allows for a stealthy way to communicate with people. +Experiment with different setups of the supermatter engine to maximize output, but don't risk the crew's safety to do so! +We were all new once, be patient and guide new players in the right direction. +On most clothing items that go in the exosuit slot, you can put certain small items into your suit storage, such as a spraycan, your emergency oxygen tank, or a flashlight. +Most job-related exosuit clothing can fit job-related items into it, such as the atmospheric technician's winter coat holding an RPD, or labcoats holding most medicine. +If you're using hotkey mode, you can stop pulling things using H. +The station's self-destruct terminal is invincible. Go find the disk instead of trying to destroy it. +If there's something you need from another department, try asking! This game isn't singleplayer and you'd be surprised what you can get accomplished together! +You'll quickly lose your interest in the game if you play to win and kill. If you find yourself doing this, take a step back and talk to people - it's a much better experience! +Felinids get temporarily distracted by laser pointers. Use this to your advantage when being pursued by one. +Don't be afraid to ask for help, whether from your peers or from admins. +You can pin your MODsuit module buttons to your action bar in the suit UI. +Some weapons are better at taking down robots and structures than others. Don't try to break a window with a scalpel, try a toolbox. diff --git a/tgstation.dme b/tgstation.dme index 5201d3fa005b7f..8debb4e730cbea 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -77,6 +77,7 @@ #include "code\__DEFINES\external_organs.dm" #include "code\__DEFINES\fantasy_affixes.dm" #include "code\__DEFINES\firealarm.dm" +#include "code\__DEFINES\fishing.dm" #include "code\__DEFINES\flags.dm" #include "code\__DEFINES\flora.dm" #include "code\__DEFINES\fonts.dm" @@ -89,6 +90,7 @@ #include "code\__DEFINES\icon_smoothing.dm" #include "code\__DEFINES\id_cards.dm" #include "code\__DEFINES\important_recursive_contents.dm" +#include "code\__DEFINES\industrial_lift.dm" #include "code\__DEFINES\injection.dm" #include "code\__DEFINES\instruments.dm" #include "code\__DEFINES\interaction_flags.dm" @@ -163,6 +165,7 @@ #include "code\__DEFINES\span.dm" #include "code\__DEFINES\spatial_gridmap.dm" #include "code\__DEFINES\species_clothing_paths.dm" +#include "code\__DEFINES\speech_channels.dm" #include "code\__DEFINES\speech_controller.dm" #include "code\__DEFINES\stat.dm" #include "code\__DEFINES\stat_tracking.dm" @@ -204,6 +207,8 @@ #include "code\__DEFINES\dcs\signals\signals_admin.dm" #include "code\__DEFINES\dcs\signals\signals_adventure.dm" #include "code\__DEFINES\dcs\signals\signals_area.dm" +#include "code\__DEFINES\dcs\signals\signals_assembly.dm" +#include "code\__DEFINES\dcs\signals\signals_beam.dm" #include "code\__DEFINES\dcs\signals\signals_bot.dm" #include "code\__DEFINES\dcs\signals\signals_changeling.dm" #include "code\__DEFINES\dcs\signals\signals_circuit.dm" @@ -243,6 +248,7 @@ #include "code\__DEFINES\dcs\signals\signals_screentips.dm" #include "code\__DEFINES\dcs\signals\signals_spatial_grid.dm" #include "code\__DEFINES\dcs\signals\signals_specie.dm" +#include "code\__DEFINES\dcs\signals\signals_spell.dm" #include "code\__DEFINES\dcs\signals\signals_storage.dm" #include "code\__DEFINES\dcs\signals\signals_subsystem.dm" #include "code\__DEFINES\dcs\signals\signals_swab.dm" @@ -264,7 +270,6 @@ #include "code\__DEFINES\dcs\signals\signals_atom\signals_atom_movable.dm" #include "code\__DEFINES\dcs\signals\signals_atom\signals_atom_movement.dm" #include "code\__DEFINES\dcs\signals\signals_atom\signals_atom_x_act.dm" -#include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_abilities.dm" #include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_arcade.dm" #include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_carbon.dm" #include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_living.dm" @@ -304,6 +309,7 @@ #include "code\__HELPERS\icons.dm" #include "code\__HELPERS\jatum.dm" #include "code\__HELPERS\level_traits.dm" +#include "code\__HELPERS\levels.dm" #include "code\__HELPERS\lighting.dm" #include "code\__HELPERS\maths.dm" #include "code\__HELPERS\matrices.dm" @@ -565,7 +571,6 @@ #include "code\controllers\subsystem\processing\supermatter_cascade.dm" #include "code\controllers\subsystem\processing\tramprocess.dm" #include "code\controllers\subsystem\processing\wet_floors.dm" -#include "code\datums\action.dm" #include "code\datums\alarm.dm" #include "code\datums\armor.dm" #include "code\datums\beam.dm" @@ -620,15 +625,32 @@ #include "code\datums\achievements\misc_achievements.dm" #include "code\datums\achievements\misc_scores.dm" #include "code\datums\achievements\skill_achievements.dm" -#include "code\datums\actions\beam_rifle.dm" +#include "code\datums\actions\action.dm" +#include "code\datums\actions\cooldown_action.dm" +#include "code\datums\actions\innate_action.dm" +#include "code\datums\actions\item_action.dm" +#include "code\datums\actions\items\adjust.dm" +#include "code\datums\actions\items\beam_rifle.dm" +#include "code\datums\actions\items\beserk.dm" +#include "code\datums\actions\items\boot_dash.dm" +#include "code\datums\actions\items\cult_dagger.dm" +#include "code\datums\actions\items\hands_free.dm" +#include "code\datums\actions\items\organ_action.dm" +#include "code\datums\actions\items\set_internals.dm" +#include "code\datums\actions\items\stealth_box.dm" +#include "code\datums\actions\items\summon_stickmen.dm" +#include "code\datums\actions\items\toggles.dm" +#include "code\datums\actions\items\vortex_recall.dm" #include "code\datums\actions\mobs\blood_warp.dm" #include "code\datums\actions\mobs\charge.dm" #include "code\datums\actions\mobs\dash.dm" #include "code\datums\actions\mobs\fire_breath.dm" +#include "code\datums\actions\mobs\language_menu.dm" #include "code\datums\actions\mobs\lava_swoop.dm" #include "code\datums\actions\mobs\meteors.dm" #include "code\datums\actions\mobs\mobcooldown.dm" #include "code\datums\actions\mobs\projectileattack.dm" +#include "code\datums\actions\mobs\small_sprite.dm" #include "code\datums\actions\mobs\transform_weapon.dm" #include "code\datums\ai\_ai_behavior.dm" #include "code\datums\ai\_ai_controller.dm" @@ -714,6 +736,7 @@ #include "code\datums\components\aura_healing.dm" #include "code\datums\components\bakeable.dm" #include "code\datums\components\beetlejuice.dm" +#include "code\datums\components\blood_walk.dm" #include "code\datums\components\bloodysoles.dm" #include "code\datums\components\boomerang.dm" #include "code\datums\components\butchering.dm" @@ -738,7 +761,6 @@ #include "code\datums\components\deadchat_control.dm" #include "code\datums\components\dejavu.dm" #include "code\datums\components\deployable.dm" -#include "code\datums\components\diggable.dm" #include "code\datums\components\drift.dm" #include "code\datums\components\earprotection.dm" #include "code\datums\components\edit_complainer.dm" @@ -749,6 +771,7 @@ #include "code\datums\components\engraved.dm" #include "code\datums\components\explodable.dm" #include "code\datums\components\faction_granter.dm" +#include "code\datums\components\fishing_spot.dm" #include "code\datums\components\force_move.dm" #include "code\datums\components\fov_handler.dm" #include "code\datums\components\fullauto.dm" @@ -799,6 +822,7 @@ #include "code\datums\components\rot.dm" #include "code\datums\components\rotation.dm" #include "code\datums\components\scope.dm" +#include "code\datums\components\seclight_attachable.dm" #include "code\datums\components\shell.dm" #include "code\datums\components\shielded.dm" #include "code\datums\components\shrink.dm" @@ -950,7 +974,6 @@ #include "code\datums\elements\basic_body_temp_sensitive.dm" #include "code\datums\elements\beauty.dm" #include "code\datums\elements\bed_tucking.dm" -#include "code\datums\elements\blood_walk.dm" #include "code\datums\elements\bsa_blocker.dm" #include "code\datums\elements\bump_click.dm" #include "code\datums\elements\chemical_transfer.dm" @@ -966,6 +989,7 @@ #include "code\datums\elements\death_drops.dm" #include "code\datums\elements\delete_on_drop.dm" #include "code\datums\elements\deliver_first.dm" +#include "code\datums\elements\diggable.dm" #include "code\datums\elements\digitalcamo.dm" #include "code\datums\elements\drag_pickup.dm" #include "code\datums\elements\dryable.dm" @@ -977,6 +1001,7 @@ #include "code\datums\elements\firestacker.dm" #include "code\datums\elements\footstep.dm" #include "code\datums\elements\forced_gravity.dm" +#include "code\datums\elements\frozen.dm" #include "code\datums\elements\haunted.dm" #include "code\datums\elements\honkspam.dm" #include "code\datums\elements\item_fov.dm" @@ -984,6 +1009,7 @@ #include "code\datums\elements\kneecapping.dm" #include "code\datums\elements\kneejerk.dm" #include "code\datums\elements\knockback.dm" +#include "code\datums\elements\lazy_fishing_spot.dm" #include "code\datums\elements\lifesteal.dm" #include "code\datums\elements\light_blocking.dm" #include "code\datums\elements\light_eaten.dm" @@ -1105,19 +1131,25 @@ #include "code\datums\mood_events\needs_events.dm" #include "code\datums\mutations\_combined.dm" #include "code\datums\mutations\_mutations.dm" -#include "code\datums\mutations\actions.dm" #include "code\datums\mutations\adaptation.dm" #include "code\datums\mutations\antenna.dm" +#include "code\datums\mutations\autotomy.dm" #include "code\datums\mutations\body.dm" #include "code\datums\mutations\chameleon.dm" #include "code\datums\mutations\cold.dm" +#include "code\datums\mutations\fire_breath.dm" #include "code\datums\mutations\hulk.dm" +#include "code\datums\mutations\olfaction.dm" #include "code\datums\mutations\passive.dm" #include "code\datums\mutations\radioactive.dm" #include "code\datums\mutations\sight.dm" #include "code\datums\mutations\speech.dm" #include "code\datums\mutations\telekinesis.dm" +#include "code\datums\mutations\telepathy.dm" +#include "code\datums\mutations\tongue_spike.dm" #include "code\datums\mutations\touch.dm" +#include "code\datums\mutations\void_magnet.dm" +#include "code\datums\mutations\webbing.dm" #include "code\datums\mutations\holy_mutation\burdened.dm" #include "code\datums\mutations\holy_mutation\honorbound.dm" #include "code\datums\proximity_monitor\field.dm" @@ -1242,6 +1274,7 @@ #include "code\game\gamemodes\dynamic\dynamic_rulesets_midround.dm" #include "code\game\gamemodes\dynamic\dynamic_rulesets_roundstart.dm" #include "code\game\gamemodes\dynamic\dynamic_simulations.dm" +#include "code\game\gamemodes\dynamic\dynamic_unfavorable_situation.dm" #include "code\game\gamemodes\dynamic\ruleset_picking.dm" #include "code\game\machinery\_machinery.dm" #include "code\game\machinery\ai_slipper.dm" @@ -1254,7 +1287,6 @@ #include "code\game\machinery\cell_charger.dm" #include "code\game\machinery\civilian_bounties.dm" #include "code\game\machinery\constructable_frame.dm" -#include "code\game\machinery\crossing_signal.dm" #include "code\game\machinery\dance_machine.dm" #include "code\game\machinery\defibrillator_mount.dm" #include "code\game\machinery\deployable.dm" @@ -1334,7 +1366,6 @@ #include "code\game\machinery\computer\station_alert.dm" #include "code\game\machinery\computer\teleporter.dm" #include "code\game\machinery\computer\terminal.dm" -#include "code\game\machinery\computer\tram_controls.dm" #include "code\game\machinery\computer\warrant.dm" #include "code\game\machinery\computer\arcade\arcade.dm" #include "code\game\machinery\computer\arcade\orion.dm" @@ -1469,7 +1500,6 @@ #include "code\game\objects\effects\temporary_visuals\projectiles\muzzle.dm" #include "code\game\objects\effects\temporary_visuals\projectiles\projectile_effects.dm" #include "code\game\objects\effects\temporary_visuals\projectiles\tracer.dm" -#include "code\game\objects\items\AI_modules.dm" #include "code\game\objects\items\airlock_painter.dm" #include "code\game\objects\items\apc_frame.dm" #include "code\game\objects\items\binoculars.dm" @@ -1510,7 +1540,6 @@ #include "code\game\objects\items\fireaxe.dm" #include "code\game\objects\items\flamethrower.dm" #include "code\game\objects\items\gift.dm" -#include "code\game\objects\items\granters.dm" #include "code\game\objects\items\gun_maintenance.dm" #include "code\game\objects\items\hand_items.dm" #include "code\game\objects\items\handcuffs.dm" @@ -1565,6 +1594,14 @@ #include "code\game\objects\items\virgin_mary.dm" #include "code\game\objects\items\wall_mounted.dm" #include "code\game\objects\items\weaponry.dm" +#include "code\game\objects\items\AI_modules\_AI_modules.dm" +#include "code\game\objects\items\AI_modules\freeform.dm" +#include "code\game\objects\items\AI_modules\full_lawsets.dm" +#include "code\game\objects\items\AI_modules\hacked.dm" +#include "code\game\objects\items\AI_modules\ion.dm" +#include "code\game\objects\items\AI_modules\repair.dm" +#include "code\game\objects\items\AI_modules\supplied.dm" +#include "code\game\objects\items\AI_modules\zeroth.dm" #include "code\game\objects\items\circuitboards\circuitboard.dm" #include "code\game\objects\items\circuitboards\computer_circuitboards.dm" #include "code\game\objects\items\circuitboards\machine_circuitboards.dm" @@ -1611,9 +1648,11 @@ #include "code\game\objects\items\devices\scanners\slime_scanner.dm" #include "code\game\objects\items\devices\scanners\t_scanner.dm" #include "code\game\objects\items\food\_food.dm" +#include "code\game\objects\items\food\bait.dm" #include "code\game\objects\items\food\bread.dm" #include "code\game\objects\items\food\burgers.dm" #include "code\game\objects\items\food\cake.dm" +#include "code\game\objects\items\food\cheese.dm" #include "code\game\objects\items\food\deepfried.dm" #include "code\game\objects\items\food\donkpocket.dm" #include "code\game\objects\items\food\donuts.dm" @@ -1634,6 +1673,29 @@ #include "code\game\objects\items\food\snacks.dm" #include "code\game\objects\items\food\soup.dm" #include "code\game\objects\items\food\spaghetti.dm" +#include "code\game\objects\items\granters\_granters.dm" +#include "code\game\objects\items\granters\oragami.dm" +#include "code\game\objects\items\granters\crafting\_crafting_granter.dm" +#include "code\game\objects\items\granters\crafting\bone_notes.dm" +#include "code\game\objects\items\granters\crafting\cannon.dm" +#include "code\game\objects\items\granters\crafting\desserts.dm" +#include "code\game\objects\items\granters\crafting\pipegun.dm" +#include "code\game\objects\items\granters\magic\_spell_granter.dm" +#include "code\game\objects\items\granters\magic\barnyard.dm" +#include "code\game\objects\items\granters\magic\blind.dm" +#include "code\game\objects\items\granters\magic\charge.dm" +#include "code\game\objects\items\granters\magic\fireball.dm" +#include "code\game\objects\items\granters\magic\forcewall.dm" +#include "code\game\objects\items\granters\magic\knock.dm" +#include "code\game\objects\items\granters\magic\mime.dm" +#include "code\game\objects\items\granters\magic\mindswap.dm" +#include "code\game\objects\items\granters\magic\sacred_flame.dm" +#include "code\game\objects\items\granters\magic\smoke.dm" +#include "code\game\objects\items\granters\magic\summon_item.dm" +#include "code\game\objects\items\granters\martial_arts\_martial_arts.dm" +#include "code\game\objects\items\granters\martial_arts\cqc.dm" +#include "code\game\objects\items\granters\martial_arts\plasma_fist.dm" +#include "code\game\objects\items\granters\martial_arts\sleeping_carp.dm" #include "code\game\objects\items\grenades\_grenade.dm" #include "code\game\objects\items\grenades\antigravity.dm" #include "code\game\objects\items\grenades\atmos_grenades.dm" @@ -1677,6 +1739,7 @@ #include "code\game\objects\items\robot\items\food.dm" #include "code\game\objects\items\robot\items\generic.dm" #include "code\game\objects\items\robot\items\hud.dm" +#include "code\game\objects\items\robot\items\hypo.dm" #include "code\game\objects\items\robot\items\storage.dm" #include "code\game\objects\items\robot\items\tools.dm" #include "code\game\objects\items\stacks\ammonia_crystals.dm" @@ -1763,7 +1826,6 @@ #include "code\game\objects\structures\headpike.dm" #include "code\game\objects\structures\hivebot.dm" #include "code\game\objects\structures\holosign.dm" -#include "code\game\objects\structures\industrial_lift.dm" #include "code\game\objects\structures\janicart.dm" #include "code\game\objects\structures\kitchen_spike.dm" #include "code\game\objects\structures\ladders.dm" @@ -1793,7 +1855,6 @@ #include "code\game\objects\structures\tank_dispenser.dm" #include "code\game\objects\structures\tank_holder.dm" #include "code\game\objects\structures\training_machine.dm" -#include "code\game\objects\structures\tram_walls.dm" #include "code\game\objects\structures\traps.dm" #include "code\game\objects\structures\votingbox.dm" #include "code\game\objects\structures\watercloset.dm" @@ -2008,10 +2069,6 @@ #include "code\modules\admin\verbs\SDQL2\SDQL_2.dm" #include "code\modules\admin\verbs\SDQL2\SDQL_2_parser.dm" #include "code\modules\admin\verbs\SDQL2\SDQL_2_wrappers.dm" -#include "code\modules\admin\verbs\SDQL2\SDQL_spells\executor_component.dm" -#include "code\modules\admin\verbs\SDQL2\SDQL_spells\spell_admin_panel.dm" -#include "code\modules\admin\verbs\SDQL2\SDQL_spells\spell_edit_menu.dm" -#include "code\modules\admin\verbs\SDQL2\SDQL_spells\spells.dm" #include "code\modules\admin\view_variables\admin_delete.dm" #include "code\modules\admin\view_variables\color_matrix_editor.dm" #include "code\modules\admin\view_variables\debug_variables.dm" @@ -2196,7 +2253,7 @@ #include "code\modules\antagonists\heretic\magic\manse_link.dm" #include "code\modules\antagonists\heretic\magic\mansus_grasp.dm" #include "code\modules\antagonists\heretic\magic\mirror_walk.dm" -#include "code\modules\antagonists\heretic\magic\nightwater_rebirth.dm" +#include "code\modules\antagonists\heretic\magic\nightwatcher_rebirth.dm" #include "code\modules\antagonists\heretic\magic\rust_wave.dm" #include "code\modules\antagonists\heretic\magic\void_phase.dm" #include "code\modules\antagonists\heretic\magic\void_pull.dm" @@ -2261,6 +2318,7 @@ #include "code\modules\antagonists\traitor\objectives\destroy_heirloom.dm" #include "code\modules\antagonists\traitor\objectives\destroy_item.dm" #include "code\modules\antagonists\traitor\objectives\destroy_machinery.dm" +#include "code\modules\antagonists\traitor\objectives\eyesnatching.dm" #include "code\modules\antagonists\traitor\objectives\hack_comm_console.dm" #include "code\modules\antagonists\traitor\objectives\kidnapping.dm" #include "code\modules\antagonists\traitor\objectives\kill_pet.dm" @@ -2278,12 +2336,15 @@ #include "code\modules\antagonists\wizard\wizard.dm" #include "code\modules\antagonists\wizard\equipment\artefact.dm" #include "code\modules\antagonists\wizard\equipment\soulstone.dm" -#include "code\modules\antagonists\wizard\equipment\spellbook.dm" +#include "code\modules\antagonists\wizard\equipment\wizard_spellbook.dm" +#include "code\modules\antagonists\wizard\equipment\spellbook_entries\_entry.dm" +#include "code\modules\antagonists\wizard\equipment\spellbook_entries\assistance.dm" +#include "code\modules\antagonists\wizard\equipment\spellbook_entries\challenges.dm" +#include "code\modules\antagonists\wizard\equipment\spellbook_entries\defensive.dm" +#include "code\modules\antagonists\wizard\equipment\spellbook_entries\mobility.dm" +#include "code\modules\antagonists\wizard\equipment\spellbook_entries\offensive.dm" +#include "code\modules\antagonists\wizard\equipment\spellbook_entries\summons.dm" #include "code\modules\antagonists\xeno\xeno.dm" -#include "code\modules\aquarium\aquarium.dm" -#include "code\modules\aquarium\aquarium_behaviour.dm" -#include "code\modules\aquarium\aquarium_kit.dm" -#include "code\modules\aquarium\fish.dm" #include "code\modules\art\paintings.dm" #include "code\modules\art\statues.dm" #include "code\modules\assembly\assembly.dm" @@ -2628,11 +2689,13 @@ #include "code\modules\clothing\head\crown.dm" #include "code\modules\clothing\head\fedora.dm" #include "code\modules\clothing\head\frenchberet.dm" +#include "code\modules\clothing\head\garlands.dm" #include "code\modules\clothing\head\hardhat.dm" #include "code\modules\clothing\head\hat.dm" #include "code\modules\clothing\head\helmet.dm" #include "code\modules\clothing\head\jobs.dm" #include "code\modules\clothing\head\justice.dm" +#include "code\modules\clothing\head\mind_monkey_helmet.dm" #include "code\modules\clothing\head\moth.dm" #include "code\modules\clothing\head\papersack.dm" #include "code\modules\clothing\head\pirate.dm" @@ -2753,10 +2816,11 @@ #include "code\modules\events\abductor.dm" #include "code\modules\events\alien_infestation.dm" #include "code\modules\events\anomaly.dm" +#include "code\modules\events\anomaly_bioscrambler.dm" #include "code\modules\events\anomaly_bluespace.dm" -#include "code\modules\events\anomaly_delimber.dm" #include "code\modules\events\anomaly_flux.dm" #include "code\modules\events\anomaly_grav.dm" +#include "code\modules\events\anomaly_hallucination.dm" #include "code\modules\events\anomaly_pyro.dm" #include "code\modules\events\anomaly_vortex.dm" #include "code\modules\events\aurora_caelus.dm" @@ -2775,6 +2839,7 @@ #include "code\modules\events\false_alarm.dm" #include "code\modules\events\fugitive_spawning.dm" #include "code\modules\events\ghost_role.dm" +#include "code\modules\events\gravity_generator_blackout.dm" #include "code\modules\events\grid_check.dm" #include "code\modules\events\heart_attack.dm" #include "code\modules\events\immovable_rod.dm" @@ -2857,8 +2922,21 @@ #include "code\modules\explorer_drone\exploration_events\fluff.dm" #include "code\modules\explorer_drone\exploration_events\resource.dm" #include "code\modules\explorer_drone\exploration_events\trader.dm" +#include "code\modules\fishing\admin.dm" +#include "code\modules\fishing\bait.dm" +#include "code\modules\fishing\fish_catalog.dm" +#include "code\modules\fishing\fishing_equipment.dm" +#include "code\modules\fishing\fishing_minigame.dm" +#include "code\modules\fishing\fishing_portal_machine.dm" +#include "code\modules\fishing\fishing_rod.dm" +#include "code\modules\fishing\fishing_traits.dm" +#include "code\modules\fishing\aquarium\aquarium.dm" +#include "code\modules\fishing\aquarium\aquarium_kit.dm" +#include "code\modules\fishing\fish\_fish.dm" +#include "code\modules\fishing\fish\fish_types.dm" +#include "code\modules\fishing\sources\_fish_source.dm" +#include "code\modules\fishing\sources\source_types.dm" #include "code\modules\flufftext\Dreaming.dm" -#include "code\modules\flufftext\Hallucination.dm" #include "code\modules\food_and_drinks\food.dm" #include "code\modules\food_and_drinks\pizzabox.dm" #include "code\modules\food_and_drinks\plate.dm" @@ -2905,6 +2983,21 @@ #include "code\modules\food_and_drinks\restaurant\customers\_customer.dm" #include "code\modules\forensics\_forensics.dm" #include "code\modules\forensics\forensics_helpers.dm" +#include "code\modules\hallucination\_hallucination.dm" +#include "code\modules\hallucination\airlock.dm" +#include "code\modules\hallucination\chat.dm" +#include "code\modules\hallucination\death.dm" +#include "code\modules\hallucination\fire.dm" +#include "code\modules\hallucination\hazard.dm" +#include "code\modules\hallucination\hostile_mob.dm" +#include "code\modules\hallucination\HUD.dm" +#include "code\modules\hallucination\husk.dm" +#include "code\modules\hallucination\item.dm" +#include "code\modules\hallucination\plasma_flood.dm" +#include "code\modules\hallucination\polymorph.dm" +#include "code\modules\hallucination\shock.dm" +#include "code\modules\hallucination\sound.dm" +#include "code\modules\hallucination\stray_bullet.dm" #include "code\modules\holiday\easter.dm" #include "code\modules\holiday\foreign_calendar.dm" #include "code\modules\holiday\holidays.dm" @@ -2958,6 +3051,7 @@ #include "code\modules\hydroponics\grown\kronkus.dm" #include "code\modules\hydroponics\grown\melon.dm" #include "code\modules\hydroponics\grown\mushrooms.dm" +#include "code\modules\hydroponics\grown\olive.dm" #include "code\modules\hydroponics\grown\onion.dm" #include "code\modules\hydroponics\grown\peas.dm" #include "code\modules\hydroponics\grown\pineapple.dm" @@ -2975,6 +3069,14 @@ #include "code\modules\hydroponics\grown\weeds\kudzu.dm" #include "code\modules\hydroponics\grown\weeds\nettle.dm" #include "code\modules\hydroponics\grown\weeds\starthistle.dm" +#include "code\modules\industrial_lift\crossing_signal.dm" +#include "code\modules\industrial_lift\industrial_lift.dm" +#include "code\modules\industrial_lift\lift_master.dm" +#include "code\modules\industrial_lift\tram_controls.dm" +#include "code\modules\industrial_lift\tram_landmark.dm" +#include "code\modules\industrial_lift\tram_lift_master.dm" +#include "code\modules\industrial_lift\tram_override_objects.dm" +#include "code\modules\industrial_lift\tram_walls.dm" #include "code\modules\instruments\items.dm" #include "code\modules\instruments\piano_synth.dm" #include "code\modules\instruments\stationary.dm" @@ -3254,7 +3356,6 @@ #include "code\modules\mob\dead\observer\observer_say.dm" #include "code\modules\mob\dead\observer\orbit.dm" #include "code\modules\mob\living\blood.dm" -#include "code\modules\mob\living\bloodcrawl.dm" #include "code\modules\mob\living\damage_procs.dm" #include "code\modules\mob\living\death.dm" #include "code\modules\mob\living\emote.dm" @@ -3966,7 +4067,6 @@ #include "code\modules\reagents\chemistry\recipes\special.dm" #include "code\modules\reagents\chemistry\recipes\toxins.dm" #include "code\modules\reagents\reagent_containers\blood_pack.dm" -#include "code\modules\reagents\reagent_containers\borghydro.dm" #include "code\modules\reagents\reagent_containers\bottle.dm" #include "code\modules\reagents\reagent_containers\chem_pack.dm" #include "code\modules\reagents\reagent_containers\dropper.dm" @@ -3978,6 +4078,7 @@ #include "code\modules\reagents\reagent_containers\pill.dm" #include "code\modules\reagents\reagent_containers\spray.dm" #include "code\modules\reagents\reagent_containers\syringes.dm" +#include "code\modules\reagents\reagent_containers\watering_can.dm" #include "code\modules\reagents\withdrawal\_addiction.dm" #include "code\modules\reagents\withdrawal\generic_addictions.dm" #include "code\modules\recycling\conveyor.dm" @@ -4080,7 +4181,7 @@ #include "code\modules\research\xenobiology\vatgrowing\samples\cell_lines\common.dm" #include "code\modules\research\xenobiology\vatgrowing\samples\viruses\_virus.dm" #include "code\modules\security_levels\keycard_authentication.dm" -#include "code\modules\security_levels\security_levels.dm" +#include "code\modules\security_levels\security_level_datums.dm" #include "code\modules\shuttle\arrivals.dm" #include "code\modules\shuttle\assault_pod.dm" #include "code\modules\shuttle\battlecruiser_starfury.dm" @@ -4105,48 +4206,79 @@ #include "code\modules\shuttle\white_ship.dm" #include "code\modules\spatial_grid\cell_tracker.dm" #include "code\modules\spells\spell.dm" -#include "code\modules\spells\spell_types\aimed.dm" -#include "code\modules\spells\spell_types\area_teleport.dm" -#include "code\modules\spells\spell_types\bloodcrawl.dm" -#include "code\modules\spells\spell_types\charge.dm" -#include "code\modules\spells\spell_types\cone_spells.dm" -#include "code\modules\spells\spell_types\conjure.dm" -#include "code\modules\spells\spell_types\construct_spells.dm" -#include "code\modules\spells\spell_types\curse.dm" -#include "code\modules\spells\spell_types\emplosion.dm" -#include "code\modules\spells\spell_types\ethereal_jaunt.dm" -#include "code\modules\spells\spell_types\explosion.dm" -#include "code\modules\spells\spell_types\forcewall.dm" -#include "code\modules\spells\spell_types\genetic.dm" -#include "code\modules\spells\spell_types\godhand.dm" -#include "code\modules\spells\spell_types\infinite_guns.dm" -#include "code\modules\spells\spell_types\inflict_handler.dm" -#include "code\modules\spells\spell_types\knock.dm" -#include "code\modules\spells\spell_types\lichdom.dm" -#include "code\modules\spells\spell_types\lightning.dm" -#include "code\modules\spells\spell_types\mime.dm" -#include "code\modules\spells\spell_types\personality_commune.dm" -#include "code\modules\spells\spell_types\projectile.dm" -#include "code\modules\spells\spell_types\rightandwrong.dm" -#include "code\modules\spells\spell_types\rod_form.dm" -#include "code\modules\spells\spell_types\santa.dm" -#include "code\modules\spells\spell_types\shadow_walk.dm" -#include "code\modules\spells\spell_types\shapeshift.dm" -#include "code\modules\spells\spell_types\soultap.dm" -#include "code\modules\spells\spell_types\spacetime_distortion.dm" -#include "code\modules\spells\spell_types\summonitem.dm" -#include "code\modules\spells\spell_types\telepathy.dm" -#include "code\modules\spells\spell_types\the_traps.dm" -#include "code\modules\spells\spell_types\touch_attacks.dm" -#include "code\modules\spells\spell_types\trigger.dm" -#include "code\modules\spells\spell_types\turf_teleport.dm" -#include "code\modules\spells\spell_types\voice_of_god.dm" -#include "code\modules\spells\spell_types\wizard.dm" -#include "code\modules\spells\spell_types\xeno.dm" +#include "code\modules\spells\spell_types\madness_curse.dm" +#include "code\modules\spells\spell_types\right_and_wrong.dm" +#include "code\modules\spells\spell_types\aoe_spell\_aoe_spell.dm" +#include "code\modules\spells\spell_types\aoe_spell\area_conversion.dm" +#include "code\modules\spells\spell_types\aoe_spell\knock.dm" +#include "code\modules\spells\spell_types\aoe_spell\magic_missile.dm" +#include "code\modules\spells\spell_types\aoe_spell\repulse.dm" +#include "code\modules\spells\spell_types\aoe_spell\sacred_flame.dm" +#include "code\modules\spells\spell_types\cone\_cone.dm" +#include "code\modules\spells\spell_types\conjure\_conjure.dm" +#include "code\modules\spells\spell_types\conjure\bees.dm" +#include "code\modules\spells\spell_types\conjure\carp.dm" +#include "code\modules\spells\spell_types\conjure\constructs.dm" +#include "code\modules\spells\spell_types\conjure\creatures.dm" +#include "code\modules\spells\spell_types\conjure\cult_turfs.dm" +#include "code\modules\spells\spell_types\conjure\ed_swarm.dm" +#include "code\modules\spells\spell_types\conjure\invisible_chair.dm" +#include "code\modules\spells\spell_types\conjure\invisible_wall.dm" +#include "code\modules\spells\spell_types\conjure\link_worlds.dm" +#include "code\modules\spells\spell_types\conjure\presents.dm" +#include "code\modules\spells\spell_types\conjure\soulstone.dm" +#include "code\modules\spells\spell_types\conjure\the_traps.dm" +#include "code\modules\spells\spell_types\conjure_item\_conjure_item.dm" +#include "code\modules\spells\spell_types\conjure_item\infinite_guns.dm" +#include "code\modules\spells\spell_types\conjure_item\invisible_box.dm" +#include "code\modules\spells\spell_types\conjure_item\lighting_packet.dm" +#include "code\modules\spells\spell_types\conjure_item\snowball.dm" +#include "code\modules\spells\spell_types\jaunt\_jaunt.dm" +#include "code\modules\spells\spell_types\jaunt\bloodcrawl.dm" +#include "code\modules\spells\spell_types\jaunt\ethereal_jaunt.dm" +#include "code\modules\spells\spell_types\jaunt\shadow_walk.dm" +#include "code\modules\spells\spell_types\list_target\_list_target.dm" +#include "code\modules\spells\spell_types\list_target\telepathy.dm" +#include "code\modules\spells\spell_types\pointed\_pointed.dm" +#include "code\modules\spells\spell_types\pointed\abyssal_gaze.dm" #include "code\modules\spells\spell_types\pointed\barnyard.dm" #include "code\modules\spells\spell_types\pointed\blind.dm" +#include "code\modules\spells\spell_types\pointed\dominate.dm" +#include "code\modules\spells\spell_types\pointed\finger_guns.dm" +#include "code\modules\spells\spell_types\pointed\fireball.dm" +#include "code\modules\spells\spell_types\pointed\lightning_bolt.dm" #include "code\modules\spells\spell_types\pointed\mind_transfer.dm" -#include "code\modules\spells\spell_types\pointed\pointed.dm" +#include "code\modules\spells\spell_types\pointed\spell_cards.dm" +#include "code\modules\spells\spell_types\projectile\_basic_projectile.dm" +#include "code\modules\spells\spell_types\projectile\juggernaut.dm" +#include "code\modules\spells\spell_types\self\basic_heal.dm" +#include "code\modules\spells\spell_types\self\charge.dm" +#include "code\modules\spells\spell_types\self\disable_tech.dm" +#include "code\modules\spells\spell_types\self\forcewall.dm" +#include "code\modules\spells\spell_types\self\lichdom.dm" +#include "code\modules\spells\spell_types\self\lightning.dm" +#include "code\modules\spells\spell_types\self\mime_vow.dm" +#include "code\modules\spells\spell_types\self\mutate.dm" +#include "code\modules\spells\spell_types\self\night_vision.dm" +#include "code\modules\spells\spell_types\self\personality_commune.dm" +#include "code\modules\spells\spell_types\self\rod_form.dm" +#include "code\modules\spells\spell_types\self\smoke.dm" +#include "code\modules\spells\spell_types\self\soultap.dm" +#include "code\modules\spells\spell_types\self\spacetime_distortion.dm" +#include "code\modules\spells\spell_types\self\stop_time.dm" +#include "code\modules\spells\spell_types\self\summonitem.dm" +#include "code\modules\spells\spell_types\self\voice_of_god.dm" +#include "code\modules\spells\spell_types\shapeshift\_shapeshift.dm" +#include "code\modules\spells\spell_types\shapeshift\dragon.dm" +#include "code\modules\spells\spell_types\shapeshift\polar_bear.dm" +#include "code\modules\spells\spell_types\shapeshift\shapechange.dm" +#include "code\modules\spells\spell_types\teleport\_teleport.dm" +#include "code\modules\spells\spell_types\teleport\blink.dm" +#include "code\modules\spells\spell_types\teleport\teleport.dm" +#include "code\modules\spells\spell_types\touch\_touch.dm" +#include "code\modules\spells\spell_types\touch\duffelbag_curse.dm" +#include "code\modules\spells\spell_types\touch\flesh_to_stone.dm" +#include "code\modules\spells\spell_types\touch\smite.dm" #include "code\modules\station_goals\bsa.dm" #include "code\modules\station_goals\dna_vault.dm" #include "code\modules\station_goals\shield.dm" @@ -4238,10 +4370,6 @@ #include "code\modules\tgui\states.dm" #include "code\modules\tgui\status_composers.dm" #include "code\modules\tgui\tgui.dm" -#include "code\modules\tgui\tgui_alert.dm" -#include "code\modules\tgui\tgui_input_list.dm" -#include "code\modules\tgui\tgui_input_number.dm" -#include "code\modules\tgui\tgui_input_text.dm" #include "code\modules\tgui\tgui_window.dm" #include "code\modules\tgui\states\admin.dm" #include "code\modules\tgui\states\always.dm" @@ -4264,6 +4392,13 @@ #include "code\modules\tgui\states\reverse_contained.dm" #include "code\modules\tgui\states\self.dm" #include "code\modules\tgui\states\zlevel.dm" +#include "code\modules\tgui_input\alert.dm" +#include "code\modules\tgui_input\list.dm" +#include "code\modules\tgui_input\number.dm" +#include "code\modules\tgui_input\text.dm" +#include "code\modules\tgui_input\say_modal\modal.dm" +#include "code\modules\tgui_input\say_modal\speech.dm" +#include "code\modules\tgui_input\say_modal\typing.dm" #include "code\modules\tgui_panel\audio.dm" #include "code\modules\tgui_panel\external.dm" #include "code\modules\tgui_panel\telemetry.dm" diff --git a/tgui/.eslintrc.yml b/tgui/.eslintrc.yml index daf5f9936e9301..fc7385b68b33d0 100644 --- a/tgui/.eslintrc.yml +++ b/tgui/.eslintrc.yml @@ -1,4 +1,5 @@ root: true +extends: prettier parser: '@typescript-eslint/parser' parserOptions: ecmaVersion: 2020 @@ -17,7 +18,6 @@ settings: react: version: '16.10' rules: - ## Possible Errors ## ---------------------------------------- ## Enforce “for” loop update clause moving the counter in the right @@ -349,15 +349,15 @@ rules: ## Enforce the location of arrow function bodies # implicit-arrow-linebreak: error ## Enforce consistent indentation - indent: [error, 2, { SwitchCase: 1 }] + # indent: [error, 2, { SwitchCase: 1 }] ## Enforce the consistent use of either double or single quotes in JSX ## attributes - jsx-quotes: [error, prefer-double] + # jsx-quotes: [error, prefer-double] ## Enforce consistent spacing between keys and values in object literal ## properties - key-spacing: [error, { beforeColon: false, afterColon: true }] + # key-spacing: [error, { beforeColon: false, afterColon: true }] ## Enforce consistent spacing before and after keywords - keyword-spacing: [error, { before: true, after: true }] + # keyword-spacing: [error, { before: true, after: true }] ## Enforce position of line comments # line-comment-position: error ## Enforce consistent linebreak style @@ -369,15 +369,15 @@ rules: ## Enforce a maximum depth that blocks can be nested # max-depth: error ## Enforce a maximum line length - max-len: [error, { - code: 80, - ## Ignore imports - ignorePattern: '^(import\s.+\sfrom\s|.*require\()', - ignoreUrls: true, - ignoreRegExpLiterals: true, - ignoreStrings: true, - ignoreTemplateLiterals: true, - }] + # max-len: [error, { + # code: 80, + # ## Ignore imports + # ignorePattern: '^(import\s.+\sfrom\s|.*require\()', + # ignoreUrls: true, + # ignoreRegExpLiterals: true, + # ignoreStrings: true, + # ignoreTemplateLiterals: true, + # }] ## Enforce a maximum number of lines per file # max-lines: error ## Enforce a maximum number of line of code in a function @@ -414,7 +414,7 @@ rules: ## Disallow mixed binary operators # no-mixed-operators: error ## Disallow mixed spaces and tabs for indentation - no-mixed-spaces-and-tabs: error + # no-mixed-spaces-and-tabs: error ## Disallow use of chained assignment expressions # no-multi-assign: error ## Disallow multiple empty lines @@ -440,7 +440,7 @@ rules: ## Disallow ternary operators when simpler alternatives exist # no-unneeded-ternary: error ## Disallow whitespace before properties - no-whitespace-before-property: error + # no-whitespace-before-property: error ## Enforce the location of single-line statements # nonblock-statement-body-position: error ## Enforce consistent line breaks inside braces @@ -457,7 +457,7 @@ rules: ## Require or disallow assignment operator shorthand where possible # operator-assignment: error ## Enforce consistent linebreak style for operators - operator-linebreak: [error, before] + # operator-linebreak: [error, before] ## Require or disallow padding within blocks # padded-blocks: error ## Require or disallow padding lines between statements @@ -482,11 +482,11 @@ rules: ## Enforce consistent spacing before blocks space-before-blocks: [error, always] ## Enforce consistent spacing before function definition opening parenthesis - space-before-function-paren: [error, { - anonymous: always, - named: never, - asyncArrow: always, - }] + # space-before-function-paren: [error, { + # anonymous: always, + # named: never, + # asyncArrow: always, + # }] ## Enforce consistent spacing inside parentheses space-in-parens: [error, never] ## Require spacing around infix operators @@ -695,7 +695,7 @@ rules: react/jsx-closing-tag-location: error ## Enforce or disallow newlines inside of curly braces in JSX attributes and ## expressions (fixable) - react/jsx-curly-newline: error + # react/jsx-curly-newline: error ## Enforce or disallow spaces inside of curly braces in JSX attributes and ## expressions (fixable) react/jsx-curly-spacing: error @@ -708,11 +708,11 @@ rules: ## Enforce event handler naming conventions in JSX react/jsx-handler-names: error ## Validate JSX indentation (fixable) - react/jsx-indent: [error, 2, { - checkAttributes: true, - }] + # react/jsx-indent: [error, 2, { + # checkAttributes: true, + # }] ## Validate props indentation in JSX (fixable) - react/jsx-indent-props: [error, 2] + # react/jsx-indent-props: [error, 2] ## Validate JSX has key prop when in array or iterator react/jsx-key: error ## Validate JSX maximum depth diff --git a/tgui/.prettierignore b/tgui/.prettierignore new file mode 100644 index 00000000000000..79e703c954408f --- /dev/null +++ b/tgui/.prettierignore @@ -0,0 +1,15 @@ +## NPM +/**/node_modules + +## Yarn +/.yarn +/yarn.lock +/.pnp.* + +/docs +/public +/packages/tgui-polyfill +/packages/tgfont/static +**/*.json +**/*.yml +**/*.md diff --git a/tgui/.prettierrc.yml b/tgui/.prettierrc.yml index fe51f01cc4dba0..1eebe6098b11da 100644 --- a/tgui/.prettierrc.yml +++ b/tgui/.prettierrc.yml @@ -1,8 +1,10 @@ arrowParens: always -bracketSpacing: true +breakLongMethodChains: true endOfLine: lf +importFormatting: oneline jsxBracketSameLine: true jsxSingleQuote: false +offsetTernaryExpressions: true printWidth: 80 proseWrap: preserve quoteProps: preserve @@ -10,3 +12,4 @@ semi: true singleQuote: true tabWidth: 2 trailingComma: es5 +useTabs: false diff --git a/tgui/.yarn/sdks/eslint/lib/api.js b/tgui/.yarn/sdks/eslint/lib/api.js index 97a052442a8667..fc728d952bb8ba 100644 --- a/tgui/.yarn/sdks/eslint/lib/api.js +++ b/tgui/.yarn/sdks/eslint/lib/api.js @@ -11,10 +11,10 @@ const absRequire = (createRequire || createRequireFromPath)(absPnpApiPath); if (existsSync(absPnpApiPath)) { if (!process.versions.pnp) { - // Setup the environment to be able to require eslint/lib/api.js + // Setup the environment to be able to require eslint require(absPnpApiPath).setup(); } } -// Defer to the real eslint/lib/api.js your application uses -module.exports = absRequire(`eslint/lib/api.js`); +// Defer to the real eslint your application uses +module.exports = absRequire(`eslint`); diff --git a/tgui/.yarn/sdks/prettier/index.js b/tgui/.yarn/sdks/prettier/index.js new file mode 100644 index 00000000000000..f6882d809725bb --- /dev/null +++ b/tgui/.yarn/sdks/prettier/index.js @@ -0,0 +1,20 @@ +#!/usr/bin/env node + +const {existsSync} = require(`fs`); +const {createRequire, createRequireFromPath} = require(`module`); +const {resolve} = require(`path`); + +const relPnpApiPath = "../../../.pnp.cjs"; + +const absPnpApiPath = resolve(__dirname, relPnpApiPath); +const absRequire = (createRequire || createRequireFromPath)(absPnpApiPath); + +if (existsSync(absPnpApiPath)) { + if (!process.versions.pnp) { + // Setup the environment to be able to require prettier/index.js + require(absPnpApiPath).setup(); + } +} + +// Defer to the real prettier/index.js your application uses +module.exports = absRequire(`prettier/index.js`); diff --git a/tgui/.yarn/sdks/prettier/package.json b/tgui/.yarn/sdks/prettier/package.json new file mode 100644 index 00000000000000..0cbd71ff32d5aa --- /dev/null +++ b/tgui/.yarn/sdks/prettier/package.json @@ -0,0 +1,6 @@ +{ + "name": "prettier", + "version": "0.19.0-sdk", + "main": "./index.js", + "type": "commonjs" +} diff --git a/tgui/.yarn/sdks/typescript/lib/tsserver.js b/tgui/.yarn/sdks/typescript/lib/tsserver.js index 4d90f3879d03a9..9f9f4d6f4696c1 100644 --- a/tgui/.yarn/sdks/typescript/lib/tsserver.js +++ b/tgui/.yarn/sdks/typescript/lib/tsserver.js @@ -18,6 +18,7 @@ const moduleWrapper = tsserver => { const pnpApi = require(`pnpapi`); const isVirtual = str => str.match(/\/(\$\$virtual|__virtual__)\//); + const isPortal = str => str.startsWith("portal:/"); const normalize = str => str.replace(/\\/g, `/`).replace(/^\/?/, `/`); const dependencyTreeRoots = new Set(pnpApi.getDependencyTreeRoots().map(locator => { @@ -30,7 +31,7 @@ const moduleWrapper = tsserver => { function toEditorPath(str) { // We add the `zip:` prefix to both `.zip/` paths and virtual paths - if (isAbsolute(str) && !str.match(/^\^zip:/) && (str.match(/\.zip\//) || isVirtual(str))) { + if (isAbsolute(str) && !str.match(/^\^?(zip:|\/zip\/)/) && (str.match(/\.zip\//) || isVirtual(str))) { // We also take the opportunity to turn virtual paths into physical ones; // this makes it much easier to work with workspaces that list peer // dependencies, since otherwise Ctrl+Click would bring us to the virtual @@ -44,7 +45,7 @@ const moduleWrapper = tsserver => { const resolved = isVirtual(str) ? pnpApi.resolveVirtual(str) : str; if (resolved) { const locator = pnpApi.findPackageLocator(resolved); - if (locator && dependencyTreeRoots.has(`${locator.name}@${locator.reference}`)) { + if (locator && (dependencyTreeRoots.has(`${locator.name}@${locator.reference}`) || isPortal(locator.reference))) { str = resolved; } } @@ -60,10 +61,34 @@ const moduleWrapper = tsserver => { // // Ref: https://github.com/microsoft/vscode/issues/105014#issuecomment-686760910 // - case `vscode`: { + // 2021-10-08: VSCode changed the format in 1.61. + // Before | ^zip:/c:/foo/bar.zip/package.json + // After | ^/zip//c:/foo/bar.zip/package.json + // + // 2022-04-06: VSCode changed the format in 1.66. + // Before | ^/zip//c:/foo/bar.zip/package.json + // After | ^/zip/c:/foo/bar.zip/package.json + // + // 2022-05-06: VSCode changed the format in 1.68 + // Before | ^/zip/c:/foo/bar.zip/package.json + // After | ^/zip//c:/foo/bar.zip/package.json + // + case `vscode <1.61`: { str = `^zip:${str}`; } break; + case `vscode <1.66`: { + str = `^/zip/${str}`; + } break; + + case `vscode <1.68`: { + str = `^/zip${str}`; + } break; + + case `vscode`: { + str = `^/zip/${str}`; + } break; + // To make "go to definition" work, // We have to resolve the actual file system path from virtual path // and convert scheme to supported by [vim-rzip](https://github.com/lbrayner/vim-rzip) @@ -77,7 +102,7 @@ const moduleWrapper = tsserver => { // everything else is up to neovim case `neovim`: { str = normalize(resolved).replace(/\.zip\//, `.zip::`); - str = `zipfile:${str}`; + str = `zipfile://${str}`; } break; default: { @@ -91,9 +116,28 @@ const moduleWrapper = tsserver => { } function fromEditorPath(str) { - return process.platform === `win32` - ? str.replace(/^\^?zip:\//, ``) - : str.replace(/^\^?zip:/, ``); + switch (hostInfo) { + case `coc-nvim`: { + str = str.replace(/\.zip::/, `.zip/`); + // The path for coc-nvim is in format of //zipfile://.yarn/... + // So in order to convert it back, we use .* to match all the thing + // before `zipfile:` + return process.platform === `win32` + ? str.replace(/^.*zipfile:\//, ``) + : str.replace(/^.*zipfile:/, ``); + } break; + + case `neovim`: { + str = str.replace(/\.zip::/, `.zip/`); + // The path for neovim is in format of zipfile:////.yarn/... + return str.replace(/^zipfile:\/\//, ``); + } break; + + case `vscode`: + default: { + return str.replace(/^\^?(zip:|\/zip(\/ts-nul-authority)?)\/+/, process.platform === `win32` ? `` : `/`) + } break; + } } // Force enable 'allowLocalPluginLoads' @@ -119,8 +163,9 @@ const moduleWrapper = tsserver => { let hostInfo = `unknown`; Object.assign(Session.prototype, { - onMessage(/** @type {string} */ message) { - const parsedMessage = JSON.parse(message) + onMessage(/** @type {string | object} */ message) { + const isStringMessage = typeof message === 'string'; + const parsedMessage = isStringMessage ? JSON.parse(message) : message; if ( parsedMessage != null && @@ -129,11 +174,32 @@ const moduleWrapper = tsserver => { typeof parsedMessage.arguments.hostInfo === `string` ) { hostInfo = parsedMessage.arguments.hostInfo; + if (hostInfo === `vscode` && process.env.VSCODE_IPC_HOOK) { + const [, major, minor] = (process.env.VSCODE_IPC_HOOK.match( + // The RegExp from https://semver.org/ but without the caret at the start + /(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/ + ) ?? []).map(Number) + + if (major === 1) { + if (minor < 61) { + hostInfo += ` <1.61`; + } else if (minor < 66) { + hostInfo += ` <1.66`; + } else if (minor < 68) { + hostInfo += ` <1.68`; + } + } + } } - return originalOnMessage.call(this, JSON.stringify(parsedMessage, (key, value) => { - return typeof value === `string` ? fromEditorPath(value) : value; - })); + const processedMessageJSON = JSON.stringify(parsedMessage, (key, value) => { + return typeof value === 'string' ? fromEditorPath(value) : value; + }); + + return originalOnMessage.call( + this, + isStringMessage ? processedMessageJSON : JSON.parse(processedMessageJSON) + ); }, send(/** @type {any} */ msg) { diff --git a/tgui/.yarn/sdks/typescript/lib/tsserverlibrary.js b/tgui/.yarn/sdks/typescript/lib/tsserverlibrary.js index c3de4ff5d7057b..878b11946a4ccf 100644 --- a/tgui/.yarn/sdks/typescript/lib/tsserverlibrary.js +++ b/tgui/.yarn/sdks/typescript/lib/tsserverlibrary.js @@ -18,6 +18,7 @@ const moduleWrapper = tsserver => { const pnpApi = require(`pnpapi`); const isVirtual = str => str.match(/\/(\$\$virtual|__virtual__)\//); + const isPortal = str => str.startsWith("portal:/"); const normalize = str => str.replace(/\\/g, `/`).replace(/^\/?/, `/`); const dependencyTreeRoots = new Set(pnpApi.getDependencyTreeRoots().map(locator => { @@ -30,7 +31,7 @@ const moduleWrapper = tsserver => { function toEditorPath(str) { // We add the `zip:` prefix to both `.zip/` paths and virtual paths - if (isAbsolute(str) && !str.match(/^\^zip:/) && (str.match(/\.zip\//) || isVirtual(str))) { + if (isAbsolute(str) && !str.match(/^\^?(zip:|\/zip\/)/) && (str.match(/\.zip\//) || isVirtual(str))) { // We also take the opportunity to turn virtual paths into physical ones; // this makes it much easier to work with workspaces that list peer // dependencies, since otherwise Ctrl+Click would bring us to the virtual @@ -44,7 +45,7 @@ const moduleWrapper = tsserver => { const resolved = isVirtual(str) ? pnpApi.resolveVirtual(str) : str; if (resolved) { const locator = pnpApi.findPackageLocator(resolved); - if (locator && dependencyTreeRoots.has(`${locator.name}@${locator.reference}`)) { + if (locator && (dependencyTreeRoots.has(`${locator.name}@${locator.reference}`) || isPortal(locator.reference))) { str = resolved; } } @@ -60,10 +61,34 @@ const moduleWrapper = tsserver => { // // Ref: https://github.com/microsoft/vscode/issues/105014#issuecomment-686760910 // - case `vscode`: { + // 2021-10-08: VSCode changed the format in 1.61. + // Before | ^zip:/c:/foo/bar.zip/package.json + // After | ^/zip//c:/foo/bar.zip/package.json + // + // 2022-04-06: VSCode changed the format in 1.66. + // Before | ^/zip//c:/foo/bar.zip/package.json + // After | ^/zip/c:/foo/bar.zip/package.json + // + // 2022-05-06: VSCode changed the format in 1.68 + // Before | ^/zip/c:/foo/bar.zip/package.json + // After | ^/zip//c:/foo/bar.zip/package.json + // + case `vscode <1.61`: { str = `^zip:${str}`; } break; + case `vscode <1.66`: { + str = `^/zip/${str}`; + } break; + + case `vscode <1.68`: { + str = `^/zip${str}`; + } break; + + case `vscode`: { + str = `^/zip/${str}`; + } break; + // To make "go to definition" work, // We have to resolve the actual file system path from virtual path // and convert scheme to supported by [vim-rzip](https://github.com/lbrayner/vim-rzip) @@ -77,7 +102,7 @@ const moduleWrapper = tsserver => { // everything else is up to neovim case `neovim`: { str = normalize(resolved).replace(/\.zip\//, `.zip::`); - str = `zipfile:${str}`; + str = `zipfile://${str}`; } break; default: { @@ -91,9 +116,28 @@ const moduleWrapper = tsserver => { } function fromEditorPath(str) { - return process.platform === `win32` - ? str.replace(/^\^?zip:\//, ``) - : str.replace(/^\^?zip:/, ``); + switch (hostInfo) { + case `coc-nvim`: { + str = str.replace(/\.zip::/, `.zip/`); + // The path for coc-nvim is in format of //zipfile://.yarn/... + // So in order to convert it back, we use .* to match all the thing + // before `zipfile:` + return process.platform === `win32` + ? str.replace(/^.*zipfile:\//, ``) + : str.replace(/^.*zipfile:/, ``); + } break; + + case `neovim`: { + str = str.replace(/\.zip::/, `.zip/`); + // The path for neovim is in format of zipfile:////.yarn/... + return str.replace(/^zipfile:\/\//, ``); + } break; + + case `vscode`: + default: { + return str.replace(/^\^?(zip:|\/zip(\/ts-nul-authority)?)\/+/, process.platform === `win32` ? `` : `/`) + } break; + } } // Force enable 'allowLocalPluginLoads' @@ -119,8 +163,9 @@ const moduleWrapper = tsserver => { let hostInfo = `unknown`; Object.assign(Session.prototype, { - onMessage(/** @type {string} */ message) { - const parsedMessage = JSON.parse(message) + onMessage(/** @type {string | object} */ message) { + const isStringMessage = typeof message === 'string'; + const parsedMessage = isStringMessage ? JSON.parse(message) : message; if ( parsedMessage != null && @@ -129,11 +174,32 @@ const moduleWrapper = tsserver => { typeof parsedMessage.arguments.hostInfo === `string` ) { hostInfo = parsedMessage.arguments.hostInfo; + if (hostInfo === `vscode` && process.env.VSCODE_IPC_HOOK) { + const [, major, minor] = (process.env.VSCODE_IPC_HOOK.match( + // The RegExp from https://semver.org/ but without the caret at the start + /(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/ + ) ?? []).map(Number) + + if (major === 1) { + if (minor < 61) { + hostInfo += ` <1.61`; + } else if (minor < 66) { + hostInfo += ` <1.66`; + } else if (minor < 68) { + hostInfo += ` <1.68`; + } + } + } } - return originalOnMessage.call(this, JSON.stringify(parsedMessage, (key, value) => { - return typeof value === `string` ? fromEditorPath(value) : value; - })); + const processedMessageJSON = JSON.stringify(parsedMessage, (key, value) => { + return typeof value === 'string' ? fromEditorPath(value) : value; + }); + + return originalOnMessage.call( + this, + isStringMessage ? processedMessageJSON : JSON.parse(processedMessageJSON) + ); }, send(/** @type {any} */ msg) { diff --git a/tgui/babel.config.js b/tgui/babel.config.js index d8ddb75721db3a..e702c9a7119d61 100644 --- a/tgui/babel.config.js +++ b/tgui/babel.config.js @@ -4,8 +4,9 @@ * @license MIT */ -const createBabelConfig = options => { +const createBabelConfig = (options) => { const { presets = [], plugins = [], removeConsole } = options; + // prettier-ignore return { presets: [ [require.resolve('@babel/preset-typescript'), { @@ -34,7 +35,7 @@ const createBabelConfig = options => { }; }; -module.exports = api => { +module.exports = (api) => { api.cache(true); const mode = process.env.NODE_ENV; return createBabelConfig({ mode }); diff --git a/tgui/jest.config.js b/tgui/jest.config.js index e654f0089b8406..8b78818004be4d 100644 --- a/tgui/jest.config.js +++ b/tgui/jest.config.js @@ -4,9 +4,7 @@ module.exports = { '/packages/**/__tests__/*.{js,ts,tsx}', '/packages/**/*.{spec,test}.{js,ts,tsx}', ], - testPathIgnorePatterns: [ - '/packages/tgui-bench', - ], + testPathIgnorePatterns: ['/packages/tgui-bench'], testEnvironment: 'jsdom', testRunner: require.resolve('jest-circus/runner'), transform: { diff --git a/tgui/package.json b/tgui/package.json index 6c2035a5ec4838..16a0489973ee9b 100644 --- a/tgui/package.json +++ b/tgui/package.json @@ -7,16 +7,17 @@ "packages/*" ], "scripts": { - "tgui:build": "webpack", "tgui:analyze": "webpack --analyze", + "tgui:bench": "webpack --env TGUI_BENCH=1 && node packages/tgui-bench/index.js", + "tgui:build": "webpack", "tgui:dev": "node --experimental-modules packages/tgui-dev-server/index.js", "tgui:lint": "eslint packages --ext .js,.cjs,.ts,.tsx", + "tgui:prettier": "prettierx --check .", "tgui:sonar": "eslint packages --ext .js,.cjs,.ts,.tsx -c .eslintrc-sonar.yml", - "tgui:tsc": "tsc", "tgui:test": "jest --watch", "tgui:test-simple": "CI=true jest --color", "tgui:test-ci": "CI=true jest --color --collect-coverage", - "tgui:bench": "webpack --env TGUI_BENCH=1 && node packages/tgui-bench/index.js" + "tgui:tsc": "tsc" }, "dependencies": { "@babel/core": "^7.15.0", @@ -38,6 +39,7 @@ "common": "workspace:*", "css-loader": "^5.2.7", "eslint": "^7.32.0", + "eslint-config-prettier": "^8.5.0", "eslint-plugin-radar": "^0.2.1", "eslint-plugin-react": "^7.24.0", "eslint-plugin-unused-imports": "^1.1.4", @@ -47,6 +49,7 @@ "jest-circus": "^27.0.6", "jsdom": "^16.7.0", "mini-css-extract-plugin": "^1.6.2", + "prettier": "npm:prettierx@0.19.0", "sass": "^1.37.5", "sass-loader": "^11.1.1", "style-loader": "^2.0.0", diff --git a/tgui/packages/common/collections.spec.ts b/tgui/packages/common/collections.spec.ts index 58eff7f354c99f..ef35a95cb3ea9a 100644 --- a/tgui/packages/common/collections.spec.ts +++ b/tgui/packages/common/collections.spec.ts @@ -1,20 +1,20 @@ -import { range, zip } from "./collections"; +import { range, zip } from './collections'; // Type assertions, these will lint if the types are wrong. -const _zip1: [string, number] = zip(["a"], [1])[0]; +const _zip1: [string, number] = zip(['a'], [1])[0]; -describe("range", () => { - test("range(0, 5)", () => { +describe('range', () => { + test('range(0, 5)', () => { expect(range(0, 5)).toEqual([0, 1, 2, 3, 4]); }); }); -describe("zip", () => { +describe('zip', () => { test("zip(['a', 'b', 'c'], [1, 2, 3, 4])", () => { - expect(zip(["a", "b", "c"], [1, 2, 3, 4])).toEqual([ - ["a", 1], - ["b", 2], - ["c", 3], + expect(zip(['a', 'b', 'c'], [1, 2, 3, 4])).toEqual([ + ['a', 1], + ['b', 2], + ['c', 3], ]); }); }); diff --git a/tgui/packages/common/collections.ts b/tgui/packages/common/collections.ts index 5ab378070f0bb2..49f500ebd29a67 100644 --- a/tgui/packages/common/collections.ts +++ b/tgui/packages/common/collections.ts @@ -11,43 +11,34 @@ * * If collection is 'null' or 'undefined', it will be returned "as is" * without emitting any errors (which can be useful in some cases). - * - * @returns {any[]} */ -export const filter = (iterateeFn: ( - input: T, - index: number, - collection: T[], -) => boolean) => - (collection: T[]): T[] => { - if (collection === null || collection === undefined) { - return collection; - } - if (Array.isArray(collection)) { - const result: T[] = []; - for (let i = 0; i < collection.length; i++) { - const item = collection[i]; - if (iterateeFn(item, i, collection)) { - result.push(item); - } +export const filter = + (iterateeFn: (input: T, index: number, collection: T[]) => boolean) => + (collection: T[]): T[] => { + if (collection === null || collection === undefined) { + return collection; + } + if (Array.isArray(collection)) { + const result: T[] = []; + for (let i = 0; i < collection.length; i++) { + const item = collection[i]; + if (iterateeFn(item, i, collection)) { + result.push(item); } - return result; } - throw new Error(`filter() can't iterate on type ${typeof collection}`); - }; + return result; + } + throw new Error(`filter() can't iterate on type ${typeof collection}`); + }; type MapFunction = { - (iterateeFn: ( - value: T, - index: number, - collection: T[], - ) => U): (collection: T[]) => U[]; - - (iterateeFn: ( - value: T, - index: K, - collection: Record, - ) => U): (collection: Record) => U[]; + (iterateeFn: (value: T, index: number, collection: T[]) => U): ( + collection: T[] + ) => U[]; + + ( + iterateeFn: (value: T, index: K, collection: Record) => U + ): (collection: Record) => U[]; }; /** @@ -58,7 +49,8 @@ type MapFunction = { * If collection is 'null' or 'undefined', it will be returned "as is" * without emitting any errors (which can be useful in some cases). */ -export const map: MapFunction = (iterateeFn) => +export const map: MapFunction = + (iterateeFn) => (collection: T[]): U[] => { if (collection === null || collection === undefined) { return collection; @@ -81,9 +73,10 @@ export const map: MapFunction = (iterateeFn) => * Given a collection, will run each element through an iteratee function. * Will then filter out undefined values. */ -export const filterMap = (collection: T[], iterateeFn: ( - value: T -) => U | undefined): U[] => { +export const filterMap = ( + collection: T[], + iterateeFn: (value: T) => U | undefined +): U[] => { const finalCollection: U[] = []; for (const value of collection) { @@ -119,22 +112,22 @@ const COMPARATOR = (objA, objB) => { * * Iteratees are called with one argument (value). */ -export const sortBy = ( - ...iterateeFns: ((input: T) => unknown)[] -) => (array: T[]): T[] => { +export const sortBy = + (...iterateeFns: ((input: T) => unknown)[]) => + (array: T[]): T[] => { if (!Array.isArray(array)) { return array; } let length = array.length; // Iterate over the array to collect criteria to sort it by let mappedArray: { - criteria: unknown[], - value: T, + criteria: unknown[]; + value: T; }[] = []; for (let i = 0; i < length; i++) { const value = array[i]; mappedArray.push({ - criteria: iterateeFns.map(fn => fn(value)), + criteria: iterateeFns.map((fn) => fn(value)), value, }); } @@ -163,15 +156,14 @@ export const range = (start: number, end: number): number[] => /** * A fast implementation of reduce. */ -export const reduce = (reducerFn, initialValue) => array => { +export const reduce = (reducerFn, initialValue) => (array) => { const length = array.length; let i; let result; if (initialValue === undefined) { i = 1; result = array[0]; - } - else { + } else { i = 0; result = initialValue; } @@ -192,13 +184,14 @@ export const reduce = (reducerFn, initialValue) => array => { * is determined by the order they occur in the array. The iteratee is * invoked with one argument: value. */ -export const uniqBy = ( - iterateeFn?: (value: T) => unknown -) => (array: T[]): T[] => { +export const uniqBy = + (iterateeFn?: (value: T) => unknown) => + (array: T[]): T[] => { const { length } = array; const result: T[] = []; const seen: unknown[] = iterateeFn ? [] : result; let index = -1; + // prettier-ignore outer: while (++index < length) { let value: T | 0 = array[index]; @@ -214,8 +207,7 @@ export const uniqBy = ( seen.push(computed); } result.push(value); - } - else if (!seen.includes(computed)) { + } else if (!seen.includes(computed)) { if (seen !== result) { seen.push(computed); } @@ -224,7 +216,6 @@ export const uniqBy = ( } return result; }; -/* eslint-enable indent */ export const uniq = uniqBy(); @@ -261,7 +252,8 @@ export const zip = (...arrays: T): Zip => { * specify how grouped values should be combined. The iteratee is * invoked with the elements of each group. */ -export const zipWith = (iterateeFn: (...values: T[]) => U) => +export const zipWith = + (iterateeFn: (...values: T[]) => U) => (...arrays: T[][]): U[] => { return map((values: T[]) => iterateeFn(...values))(zip(...arrays)); }; @@ -269,7 +261,7 @@ export const zipWith = (iterateeFn: (...values: T[]) => U) => const binarySearch = ( getKey: (value: T) => U, collection: readonly T[], - inserting: T, + inserting: T ): number => { if (collection.length === 0) { return 0; @@ -301,12 +293,10 @@ const binarySearch = ( return compare > insertingKey ? middle : middle + 1; }; -export const binaryInsertWith = (getKey: (value: T) => U): - ((collection: readonly T[], value: T) => T[]) => -{ - return (collection, value) => { +export const binaryInsertWith = + (getKey: (value: T) => U) => + (collection: readonly T[], value: T) => { const copy = [...collection]; copy.splice(binarySearch(getKey, collection, value), 0, value); return copy; }; -}; diff --git a/tgui/packages/common/color.js b/tgui/packages/common/color.js index 2aadae8d6bdf36..672fce529b6151 100644 --- a/tgui/packages/common/color.js +++ b/tgui/packages/common/color.js @@ -27,23 +27,23 @@ export class Color { /** * Creates a color from the CSS hex color notation. */ -Color.fromHex = hex => ( +Color.fromHex = (hex) => new Color( parseInt(hex.substr(1, 2), 16), parseInt(hex.substr(3, 2), 16), - parseInt(hex.substr(5, 2), 16)) -); + parseInt(hex.substr(5, 2), 16) + ); /** * Linear interpolation of two colors. */ -Color.lerp = (c1, c2, n) => ( +Color.lerp = (c1, c2, n) => new Color( (c2.r - c1.r) * n + c1.r, (c2.g - c1.g) * n + c1.g, (c2.b - c1.b) * n + c1.b, - (c2.a - c1.a) * n + c1.a) -); + (c2.a - c1.a) * n + c1.a + ); /** * Loops up the color in the provided list of colors diff --git a/tgui/packages/common/events.js b/tgui/packages/common/events.js index 6d590a34453be1..7eeff511aa5662 100644 --- a/tgui/packages/common/events.js +++ b/tgui/packages/common/events.js @@ -19,10 +19,9 @@ export class EventEmitter { if (!listeners) { throw new Error(`There is no listeners for "${name}"`); } - this.listeners[name] = listeners - .filter(existingListener => { - return existingListener !== listener; - }); + this.listeners[name] = listeners.filter((existingListener) => { + return existingListener !== listener; + }); } emit(name, ...params) { diff --git a/tgui/packages/common/fp.js b/tgui/packages/common/fp.js index 7aa00a00f3ee21..ba7df09d40701d 100644 --- a/tgui/packages/common/fp.js +++ b/tgui/packages/common/fp.js @@ -9,6 +9,7 @@ * functions, where each successive invocation is supplied the return * value of the previous. */ +// prettier-ignore export const flow = (...funcs) => (input, ...rest) => { let output = input; for (let func of funcs) { @@ -37,11 +38,12 @@ export const flow = (...funcs) => (input, ...rest) => { */ export const compose = (...funcs) => { if (funcs.length === 0) { - return arg => arg; + return (arg) => arg; } if (funcs.length === 1) { return funcs[0]; } + // prettier-ignore return funcs.reduce((a, b) => (value, ...rest) => a(b(value, ...rest), ...rest)); }; diff --git a/tgui/packages/common/math.ts b/tgui/packages/common/math.ts index 97e6b60b2ed4a6..9dc1d655693624 100644 --- a/tgui/packages/common/math.ts +++ b/tgui/packages/common/math.ts @@ -14,7 +14,7 @@ export const clamp = (value, min, max) => { /** * Limits a number between 0 and 1. */ -export const clamp01 = value => { +export const clamp01 = (value) => { return value < 0 ? 0 : value > 1 ? 1 : value; }; @@ -69,9 +69,7 @@ export const toFixed = (value, fractionDigits = 0) => { * Range is an array of two numbers, for example: [0, 15]. */ export const inRange = (value, range) => { - return range - && value >= range[0] - && value <= range[1]; + return range && value >= range[0] && value <= range[1]; }; /** @@ -92,7 +90,7 @@ export const keyOfMatchingRange = (value, ranges) => { /** * Get number of digits following the decimal point in a number */ -export const numberOfDecimalDigits = value => { +export const numberOfDecimalDigits = (value) => { if (Math.floor(value) !== value) { return value.toString().split('.')[1].length || 0; } diff --git a/tgui/packages/common/perf.js b/tgui/packages/common/perf.js index 8414971f93b03d..591aa3537dee65 100644 --- a/tgui/packages/common/perf.js +++ b/tgui/packages/common/perf.js @@ -48,8 +48,9 @@ const measure = (markerNameA, markerNameB) => { } }; -const formatDuration = duration => { +const formatDuration = (duration) => { const durationInFrames = duration / FRAME_DURATION; + // prettier-ignore return duration.toFixed(duration < 10 ? 1 : 0) + 'ms ' + '(' + durationInFrames.toFixed(2) + ' frames)'; }; diff --git a/tgui/packages/common/random.ts b/tgui/packages/common/random.ts new file mode 100644 index 00000000000000..fbf9030b1bafb0 --- /dev/null +++ b/tgui/packages/common/random.ts @@ -0,0 +1,32 @@ +import { clamp } from './math'; + +/** + * Returns random number between lowerBound exclusive and upperBound inclusive + */ +export const randomNumber = (lowerBound: number, upperBound: number) => { + return Math.random() * (upperBound - lowerBound) + lowerBound; +}; + +/** + * Returns random integer between lowerBound exclusive and upperBound inclusive + */ +export const randomInteger = (lowerBound: number, upperBound: number) => { + lowerBound = Math.ceil(lowerBound); + upperBound = Math.floor(upperBound); + return Math.floor(Math.random() * (upperBound - lowerBound) + lowerBound); +}; + +/** + * Returns random array element + */ +export const randomPick = (array: T[]) => { + return array[Math.floor(Math.random() * array.length)]; +}; + +/** + * Return 1 with probability P percent; otherwise 0 + */ +export const randomProb = (probability: number) => { + const normalized = clamp(probability, 0, 100) / 100; + return Math.random() <= normalized; +}; diff --git a/tgui/packages/common/react.ts b/tgui/packages/common/react.ts index c8a08f04934b4f..8e42d0971ab417 100644 --- a/tgui/packages/common/react.ts +++ b/tgui/packages/common/react.ts @@ -24,7 +24,7 @@ export const classes = (classNames: (string | BooleanLike)[]) => { */ export const normalizeChildren = (children: T | T[]) => { if (Array.isArray(children)) { - return children.flat().filter(value => value) as T[]; + return children.flat().filter((value) => value) as T[]; } if (typeof children === 'object') { return [children]; @@ -64,6 +64,7 @@ export const pureComponentHooks = { * A helper to determine whether the object is renderable by React. */ export const canRender = (value: unknown) => { + // prettier-ignore return value !== undefined && value !== null && typeof value !== 'boolean'; diff --git a/tgui/packages/common/redux.js b/tgui/packages/common/redux.js index ebed11f166b2ea..3997134cd74213 100644 --- a/tgui/packages/common/redux.js +++ b/tgui/packages/common/redux.js @@ -20,11 +20,11 @@ export const createStore = (reducer, enhancer) => { const getState = () => currentState; - const subscribe = listener => { + const subscribe = (listener) => { listeners.push(listener); }; - const dispatch = action => { + const dispatch = (action) => { currentState = reducer(currentState, action); for (let i = 0; i < listeners.length; i++) { listeners[i](); @@ -49,6 +49,7 @@ export const createStore = (reducer, enhancer) => { * actions. */ export const applyMiddleware = (...middlewares) => { + // prettier-ignore return createStore => (reducer, ...args) => { const store = createStore(reducer, ...args); @@ -80,7 +81,7 @@ export const applyMiddleware = (...middlewares) => { * in the state that are not present in the reducers object. This function * is also more flexible than the redux counterpart. */ -export const combineReducers = reducersObj => { +export const combineReducers = (reducersObj) => { const keys = Object.keys(reducersObj); let hasChanged = false; return (prevState = {}, action) => { @@ -94,9 +95,7 @@ export const combineReducers = reducersObj => { nextState[key] = nextDomainState; } } - return hasChanged - ? nextState - : prevState; + return hasChanged ? nextState : prevState; }; }; @@ -136,15 +135,14 @@ export const createAction = (type, prepare = null) => { }; actionCreator.toString = () => '' + type; actionCreator.type = type; - actionCreator.match = action => action.type === type; + actionCreator.match = (action) => action.type === type; return actionCreator; }; - // Implementation specific // -------------------------------------------------------- -export const useDispatch = context => { +export const useDispatch = (context) => { return context.store.dispatch; }; diff --git a/tgui/packages/common/storage.js b/tgui/packages/common/storage.js index 83dc6d99c1ccae..acf842f64083bf 100644 --- a/tgui/packages/common/storage.js +++ b/tgui/packages/common/storage.js @@ -17,11 +17,10 @@ const INDEXED_DB_STORE_NAME = 'storage-v1'; const READ_ONLY = 'readonly'; const READ_WRITE = 'readwrite'; -const testGeneric = testFn => () => { +const testGeneric = (testFn) => () => { try { return Boolean(testFn()); - } - catch { + } catch { return false; } }; @@ -29,10 +28,12 @@ const testGeneric = testFn => () => { // Localstorage can sometimes throw an error, even if DOM storage is not // disabled in IE11 settings. // See: https://superuser.com/questions/1080011 +// prettier-ignore const testLocalStorage = testGeneric(() => ( window.localStorage && window.localStorage.getItem )); +// prettier-ignore const testIndexedDb = testGeneric(() => ( (window.indexedDB || window.msIndexedDB) && (window.IDBTransaction || window.msIDBTransaction) @@ -96,8 +97,7 @@ class IndexedDbBackend { req.onupgradeneeded = () => { try { req.result.createObjectStore(INDEXED_DB_STORE_NAME); - } - catch (err) { + } catch (err) { reject(new Error('Failed to upgrade IDB: ' + req.error)); } }; @@ -109,7 +109,8 @@ class IndexedDbBackend { } getStore(mode) { - return this.dbPromise.then(db => db + // prettier-ignore + return this.dbPromise.then((db) => db .transaction(INDEXED_DB_STORE_NAME, mode) .objectStore(INDEXED_DB_STORE_NAME)); } @@ -161,8 +162,7 @@ class StorageProxy { const backend = new IndexedDbBackend(); await backend.dbPromise; return backend; - } - catch {} + } catch {} } if (testLocalStorage()) { return new LocalStorageBackend(); diff --git a/tgui/packages/common/string.babel-plugin.cjs b/tgui/packages/common/string.babel-plugin.cjs index 68295aefcf8439..97ca67c6ea4cad 100644 --- a/tgui/packages/common/string.babel-plugin.cjs +++ b/tgui/packages/common/string.babel-plugin.cjs @@ -19,7 +19,7 @@ /** * Removes excess whitespace and indentation from the string. */ -const multiline = str => { +const multiline = (str) => { const lines = str.split('\n'); // Determine base indentation let minIndent; @@ -40,15 +40,15 @@ const multiline = str => { // Remove this base indentation and trim the resulting string // from both ends. return lines - .map(line => line.substr(minIndent).trimRight()) + .map((line) => line.substr(minIndent).trimRight()) .join('\n') .trim(); }; -const StringPlugin = ref => { +const StringPlugin = (ref) => { return { visitor: { - TaggedTemplateExpression: path => { + TaggedTemplateExpression: (path) => { if (path.node.tag.name === 'multiline') { const { quasi } = path.node; if (quasi.expressions.length > 0) { diff --git a/tgui/packages/common/string.js b/tgui/packages/common/string.js index 16a0921a2559ce..0d8eef431ed3f4 100644 --- a/tgui/packages/common/string.js +++ b/tgui/packages/common/string.js @@ -7,7 +7,7 @@ /** * Removes excess whitespace and indentation from the string. */ -export const multiline = str => { +export const multiline = (str) => { if (Array.isArray(str)) { // Small stub to allow usage as a template tag return multiline(str.join('')); @@ -32,7 +32,7 @@ export const multiline = str => { // Remove this base indentation and trim the resulting string // from both ends. return lines - .map(line => line.substr(minIndent).trimRight()) + .map((line) => line.substr(minIndent).trimRight()) .join('\n') .trim(); }; @@ -44,12 +44,13 @@ export const multiline = str => { * * Example: createGlobPattern('*@domain')('user@domain') === true */ -export const createGlobPattern = pattern => { - const escapeString = str => str.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&'); +export const createGlobPattern = (pattern) => { + const escapeString = (str) => str.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&'); + // prettier-ignore const regex = new RegExp('^' + pattern.split(/\*+/).map(escapeString).join('.*') + '$'); - return str => regex.test(str); + return (str) => regex.test(str); }; /** @@ -64,7 +65,7 @@ export const createGlobPattern = pattern => { */ export const createSearch = (searchText, stringifier) => { const preparedSearchText = searchText.toLowerCase().trim(); - return obj => { + return (obj) => { if (!preparedSearchText) { return true; } @@ -72,13 +73,11 @@ export const createSearch = (searchText, stringifier) => { if (!str) { return false; } - return str - .toLowerCase() - .includes(preparedSearchText); + return str.toLowerCase().includes(preparedSearchText); }; }; -export const capitalize = str => { +export const capitalize = (str) => { // Handle array if (Array.isArray(str)) { return str.map(capitalize); @@ -87,7 +86,7 @@ export const capitalize = str => { return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase(); }; -export const toTitleCase = str => { +export const toTitleCase = (str) => { // Handle array if (Array.isArray(str)) { return str.map(toTitleCase); @@ -98,20 +97,21 @@ export const toTitleCase = str => { } // Handle string const WORDS_UPPER = ['Id', 'Tv']; + // prettier-ignore const WORDS_LOWER = [ 'A', 'An', 'And', 'As', 'At', 'But', 'By', 'For', 'For', 'From', 'In', 'Into', 'Near', 'Nor', 'Of', 'On', 'Onto', 'Or', 'The', 'To', 'With', ]; - let currentStr = str.replace(/([^\W_]+[^\s-]*) */g, str => { + let currentStr = str.replace(/([^\W_]+[^\s-]*) */g, (str) => { return str.charAt(0).toUpperCase() + str.substr(1).toLowerCase(); }); for (let word of WORDS_LOWER) { const regex = new RegExp('\\s' + word + '\\s', 'g'); - currentStr = currentStr.replace(regex, str => str.toLowerCase()); + currentStr = currentStr.replace(regex, (str) => str.toLowerCase()); } for (let word of WORDS_UPPER) { const regex = new RegExp('\\b' + word + '\\b', 'g'); - currentStr = currentStr.replace(regex, str => str.toLowerCase()); + currentStr = currentStr.replace(regex, (str) => str.toLowerCase()); } return currentStr; }; @@ -122,7 +122,7 @@ export const toTitleCase = str => { * @param {String} str Encoded HTML string * @return {String} Decoded HTML string */ -export const decodeHtmlEntities = str => { +export const decodeHtmlEntities = (str) => { if (!str) { return str; } @@ -133,8 +133,9 @@ export const decodeHtmlEntities = str => { quot: '"', lt: '<', gt: '>', - apos: '\'', + apos: "'", }; + // prettier-ignore return str // Newline tags .replace(/
/gi, '\n') @@ -156,6 +157,7 @@ export const decodeHtmlEntities = str => { /** * Converts an object into a query string, */ +// prettier-ignore export const buildQueryString = obj => Object.keys(obj) .map(key => encodeURIComponent(key) + '=' + encodeURIComponent(obj[key])) diff --git a/tgui/packages/common/timer.js b/tgui/packages/common/timer.js index 1177071b9c6276..7d89e935b9b570 100644 --- a/tgui/packages/common/timer.js +++ b/tgui/packages/common/timer.js @@ -28,11 +28,31 @@ export const debounce = (fn, time, immediate = false) => { }; }; +/** + * Returns a function, that, when invoked, will only be triggered at most once + * during a given window of time. + */ +export const throttle = (fn, time) => { + let previouslyRun, queuedToRun; + return function invokeFn(...args) { + const now = Date.now(); + queuedToRun = clearTimeout(queuedToRun); + if (!previouslyRun || now - previouslyRun >= time) { + fn.apply(null, args); + previouslyRun = now; + } else { + queuedToRun = setTimeout( + invokeFn.bind(null, ...args), + time - (now - previouslyRun) + ); + } + }; +}; + /** * Suspends an asynchronous function for N milliseconds. * * @param {number} time */ -export const sleep = time => ( - new Promise(resolve => setTimeout(resolve, time)) -); +export const sleep = (time) => + new Promise((resolve) => setTimeout(resolve, time)); diff --git a/tgui/packages/common/types.ts b/tgui/packages/common/types.ts index a92ac122d9fec0..e219bd3b7e12ed 100644 --- a/tgui/packages/common/types.ts +++ b/tgui/packages/common/types.ts @@ -1,5 +1,6 @@ /** * Returns the arguments of a function F as an array. */ +// prettier-ignore export type ArgumentsOf = F extends (...args: infer A) => unknown ? A : never; diff --git a/tgui/packages/common/uuid.js b/tgui/packages/common/uuid.js index 7721af64949bc9..6e156d8649bc7a 100644 --- a/tgui/packages/common/uuid.js +++ b/tgui/packages/common/uuid.js @@ -11,9 +11,10 @@ */ export const createUuid = () => { let d = new Date().getTime(); - return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => { + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => { const r = (d + Math.random() * 16) % 16 | 0; d = Math.floor(d / 16); + // prettier-ignore return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16); }); }; diff --git a/tgui/packages/common/vector.js b/tgui/packages/common/vector.js index c3ac350a4e8e0c..b1f85f7429db87 100644 --- a/tgui/packages/common/vector.js +++ b/tgui/packages/common/vector.js @@ -32,17 +32,17 @@ export const vecDivide = (...vecs) => { }; export const vecScale = (vec, n) => { - return map(x => x * n)(vec); + return map((x) => x * n)(vec); }; -export const vecInverse = vec => { - return map(x => -x)(vec); +export const vecInverse = (vec) => { + return map((x) => -x)(vec); }; -export const vecLength = vec => { +export const vecLength = (vec) => { return Math.sqrt(reduce(ADD)(zipWith(MUL)(vec, vec))); }; -export const vecNormalize = vec => { +export const vecNormalize = (vec) => { return vecDivide(vec, vecLength(vec)); }; diff --git a/tgui/packages/tgfont/mkdist.cjs b/tgui/packages/tgfont/mkdist.cjs index 5c628becf99291..85634bd265d9c3 100644 --- a/tgui/packages/tgfont/mkdist.cjs +++ b/tgui/packages/tgfont/mkdist.cjs @@ -10,5 +10,4 @@ process.chdir(__dirname); // Silently make a dist folder try { require('fs').mkdirSync('dist'); -} -catch (err) {} +} catch (err) {} diff --git a/tgui/packages/tgui-bench/entrypoint.tsx b/tgui/packages/tgui-bench/entrypoint.tsx index d72aa60a667eca..377848fe3ae09a 100644 --- a/tgui/packages/tgui-bench/entrypoint.tsx +++ b/tgui/packages/tgui-bench/entrypoint.tsx @@ -62,8 +62,7 @@ const setupApp = async () => { } suite.run(); }); - } - catch (error) { + } catch (error) { sendMessage({ type: 'error', error }); } } diff --git a/tgui/packages/tgui-bench/index.js b/tgui/packages/tgui-bench/index.js index ac3d8c9cce09ac..9f6aee20996d02 100644 --- a/tgui/packages/tgui-bench/index.js +++ b/tgui/packages/tgui-bench/index.js @@ -27,7 +27,8 @@ const setup = async () => { assets += `\n`; const publicDir = path.resolve(__dirname, '../../public'); - const page = fs.readFileSync(path.join(publicDir, 'tgui.html'), 'utf-8') + const page = fs + .readFileSync(path.join(publicDir, 'tgui.html'), 'utf-8') .replace('\n', assets); server.register(require('fastify-static'), { @@ -67,8 +68,7 @@ const setup = async () => { try { await server.listen(3002, '0.0.0.0'); - } - catch (err) { + } catch (err) { console.error(err); process.exit(1); } diff --git a/tgui/packages/tgui-bench/lib/benchmark.js b/tgui/packages/tgui-bench/lib/benchmark.js index 1e76cec70870bb..0837678decf9cc 100644 --- a/tgui/packages/tgui-bench/lib/benchmark.js +++ b/tgui/packages/tgui-bench/lib/benchmark.js @@ -7,6 +7,7 @@ * Manually stripped from useless junk by /tg/station13 maintainers. * Available under MIT license */ +// prettier-ignore module.exports = (function() { 'use strict'; diff --git a/tgui/packages/tgui-bench/tests/Button.test.tsx b/tgui/packages/tgui-bench/tests/Button.test.tsx index e3472cbbbfaedd..6b806d720ab832 100644 --- a/tgui/packages/tgui-bench/tests/Button.test.tsx +++ b/tgui/packages/tgui-bench/tests/Button.test.tsx @@ -7,28 +7,18 @@ const render = createRenderer(); const handleClick = () => undefined; export const SingleButton = () => { - const node = ( - - ); + const node = ; render(node); }; export const SingleButtonWithCallback = () => { - const node = ( - - ); + const node = ; render(node); }; export const SingleButtonWithLinkEvent = () => { const node = ( - + ); render(node); }; @@ -36,11 +26,7 @@ export const SingleButtonWithLinkEvent = () => { export const ListOfButtons = () => { const nodes: JSX.Element[] = []; for (let i = 0; i < 100; i++) { - const node = ( - - ); + const node = ; nodes.push(node); } render(
{nodes}
); diff --git a/tgui/packages/tgui-bench/tests/DisposalUnit.test.tsx b/tgui/packages/tgui-bench/tests/DisposalUnit.test.tsx index b588f306f76a3e..843bd70367a5de 100644 --- a/tgui/packages/tgui-bench/tests/DisposalUnit.test.tsx +++ b/tgui/packages/tgui-bench/tests/DisposalUnit.test.tsx @@ -6,9 +6,11 @@ import { configureStore, StoreProvider } from 'tgui/store'; const store = configureStore({ sideEffets: false }); const renderUi = createRenderer((dataJson: string) => { - store.dispatch(backendUpdate({ - data: Byond.parseJson(dataJson), - })); + store.dispatch( + backendUpdate({ + data: Byond.parseJson(dataJson), + }) + ); return ( diff --git a/tgui/packages/tgui-bench/tests/Flex.test.tsx b/tgui/packages/tgui-bench/tests/Flex.test.tsx index e81ebc6f611b0c..66c039a190833a 100644 --- a/tgui/packages/tgui-bench/tests/Flex.test.tsx +++ b/tgui/packages/tgui-bench/tests/Flex.test.tsx @@ -6,9 +6,7 @@ const render = createRenderer(); export const Default = () => { const node = ( - - Text {Math.random()} - + Text {Math.random()} Text {Math.random()} diff --git a/tgui/packages/tgui-bench/tests/Stack.test.tsx b/tgui/packages/tgui-bench/tests/Stack.test.tsx index 952dba20294e09..ce7f5599e721a8 100644 --- a/tgui/packages/tgui-bench/tests/Stack.test.tsx +++ b/tgui/packages/tgui-bench/tests/Stack.test.tsx @@ -6,9 +6,7 @@ const render = createRenderer(); export const Default = () => { const node = ( - - Text {Math.random()} - + Text {Math.random()} Text {Math.random()} diff --git a/tgui/packages/tgui-bench/tests/Tooltip.test.tsx b/tgui/packages/tgui-bench/tests/Tooltip.test.tsx index b953fc911d2243..ea43a61f0b448c 100644 --- a/tgui/packages/tgui-bench/tests/Tooltip.test.tsx +++ b/tgui/packages/tgui-bench/tests/Tooltip.test.tsx @@ -1,5 +1,5 @@ -import { Box, Tooltip } from "tgui/components"; -import { createRenderer } from "tgui/renderer"; +import { Box, Tooltip } from 'tgui/components'; +import { createRenderer } from 'tgui/renderer'; const render = createRenderer(); diff --git a/tgui/packages/tgui-dev-server/dreamseeker.js b/tgui/packages/tgui-dev-server/dreamseeker.js index 3d4149cf256cca..eb90b1dc3cfb5a 100644 --- a/tgui/packages/tgui-dev-server/dreamseeker.js +++ b/tgui/packages/tgui-dev-server/dreamseeker.js @@ -24,6 +24,7 @@ export class DreamSeeker { } topic(params = {}) { + // prettier-ignore const query = Object.keys(params) .map(key => encodeURIComponent(key) + '=' + encodeURIComponent(params[key])) @@ -36,7 +37,7 @@ export class DreamSeeker { * @param {number[]} pids * @returns {DreamSeeker[]} */ -DreamSeeker.getInstancesByPids = async pids => { +DreamSeeker.getInstancesByPids = async (pids) => { if (process.platform !== 'win32') { return []; } @@ -46,8 +47,7 @@ DreamSeeker.getInstancesByPids = async pids => { const instance = instanceByPid.get(pid); if (instance) { instances.push(instance); - } - else { + } else { pidsToResolve.push(pid); } } @@ -83,12 +83,10 @@ DreamSeeker.getInstancesByPids = async pids => { instances.push(instance); instanceByPid.set(pid, instance); } - } - catch (err) { + } catch (err) { if (err.code === 'ERR_CHILD_PROCESS_STDIO_MAXBUFFER') { logger.error(err.message, err.code); - } - else { + } else { logger.error(err); } return []; @@ -97,4 +95,4 @@ DreamSeeker.getInstancesByPids = async pids => { return instances; }; -const plural = (word, n) => n !== 1 ? word + 's' : word; +const plural = (word, n) => (n !== 1 ? word + 's' : word); diff --git a/tgui/packages/tgui-dev-server/link/client.cjs b/tgui/packages/tgui-dev-server/link/client.cjs index fe75314acd3ab9..1e21d42ce86b9f 100644 --- a/tgui/packages/tgui-dev-server/link/client.cjs +++ b/tgui/packages/tgui-dev-server/link/client.cjs @@ -23,7 +23,7 @@ const ensureConnection = () => { socket.send(msg); } }; - socket.onmessage = event => { + socket.onmessage = (event) => { const msg = JSON.parse(event.data); for (let subscriber of subscribers) { subscriber(msg); @@ -37,14 +37,14 @@ if (process.env.NODE_ENV !== 'production') { window.onunload = () => socket && socket.close(); } -const subscribe = fn => subscribers.push(fn); +const subscribe = (fn) => subscribers.push(fn); /** * A json serializer which handles circular references and other junk. */ -const serializeObject = obj => { +const serializeObject = (obj) => { let refs = []; - const primitiveReviver = value => { + const primitiveReviver = (value) => { if (typeof value === 'number' && !Number.isFinite(value)) { return { __number__: String(value), @@ -68,6 +68,7 @@ const serializeObject = obj => { } refs.push(value); // Error object + // prettier-ignore const isError = value instanceof Error || ( value.code && value.message && value.message.includes('Error') ); @@ -91,7 +92,7 @@ const serializeObject = obj => { return json; }; -const sendMessage = msg => { +const sendMessage = (msg) => { if (process.env.NODE_ENV !== 'production') { const json = serializeObject(msg); // Send message using WebSocket @@ -99,8 +100,7 @@ const sendMessage = msg => { ensureConnection(); if (socket.readyState === WebSocket.OPEN) { socket.send(json); - } - else { + } else { // Keep only 100 latest messages in the queue if (queue.length > 100) { queue.shift(); @@ -130,19 +130,21 @@ const sendLogEntry = (level, ns, ...args) => { args, }, }); - } - catch (err) {} + } catch (err) {} } }; const setupHotReloading = () => { - if (process.env.NODE_ENV !== 'production' + if ( + // prettier-ignore + process.env.NODE_ENV !== 'production' && process.env.WEBPACK_HMR_ENABLED - && window.WebSocket) { + && window.WebSocket + ) { if (module.hot) { ensureConnection(); sendLogEntry(0, null, 'setting up hot reloading'); - subscribe(msg => { + subscribe((msg) => { const { type } = msg; sendLogEntry(0, null, 'received', type); if (type === 'hotUpdate') { @@ -157,10 +159,10 @@ const setupHotReloading = () => { ignoreDeclined: true, ignoreErrored: true, }) - .then(modules => { + .then((modules) => { sendLogEntry(0, null, 'outdated modules', modules); }) - .catch(err => { + .catch((err) => { sendLogEntry(0, null, 'reload error', err); }); } diff --git a/tgui/packages/tgui-dev-server/link/retrace.js b/tgui/packages/tgui-dev-server/link/retrace.js index c10ba9cb173ca8..842de228fdfde1 100644 --- a/tgui/packages/tgui-dev-server/link/retrace.js +++ b/tgui/packages/tgui-dev-server/link/retrace.js @@ -18,7 +18,7 @@ const logger = createLogger('retrace'); const { SourceMapConsumer } = SourceMap; const sourceMaps = []; -export const loadSourceMaps = async bundleDir => { +export const loadSourceMaps = async (bundleDir) => { // Destroy and garbage collect consumers while (sourceMaps.length !== 0) { const { consumer } = sourceMaps.shift(); @@ -30,29 +30,29 @@ export const loadSourceMaps = async bundleDir => { try { const file = basename(path).replace('.map', ''); const consumer = await new SourceMapConsumer( - JSON.parse(fs.readFileSync(path, 'utf8'))); + JSON.parse(fs.readFileSync(path, 'utf8')) + ); sourceMaps.push({ file, consumer }); - } - catch (err) { + } catch (err) { logger.error(err); } } logger.log(`loaded ${sourceMaps.length} source maps`); }; -export const retrace = stack => { +export const retrace = (stack) => { if (typeof stack !== 'string') { logger.log('ERROR: Stack is not a string!', stack); return stack; } const header = stack.split(/\n\s.*at/)[0]; const mappedStack = parseStackTrace(stack) - .map(frame => { + .map((frame) => { if (!frame.file) { return frame; } // Find the correct source map - const sourceMap = sourceMaps.find(sourceMap => { + const sourceMap = sourceMaps.find((sourceMap) => { return frame.file.includes(sourceMap.file); }); if (!sourceMap) { @@ -72,7 +72,7 @@ export const retrace = stack => { column: mappedFrame.column, }; }) - .map(frame => { + .map((frame) => { // Stringify the frame const { file, methodName, lineNumber } = frame; if (!file) { diff --git a/tgui/packages/tgui-dev-server/link/server.js b/tgui/packages/tgui-dev-server/link/server.js index 87a8a5911bc0e1..60cc78c1bd9ed6 100644 --- a/tgui/packages/tgui-dev-server/link/server.js +++ b/tgui/packages/tgui-dev-server/link/server.js @@ -32,9 +32,9 @@ class LinkServer { setupWebSocketLink() { const port = 3000; this.wss = new WebSocket.Server({ port }); - this.wss.on('connection', ws => { + this.wss.on('connection', (ws) => { logger.log('client connected'); - ws.on('message', json => { + ws.on('message', (json) => { const msg = deserializeObject(json); this.handleLinkMessage(ws, msg); }); @@ -51,7 +51,7 @@ class LinkServer { this.httpServer = http.createServer((req, res) => { if (req.method === 'POST') { let body = ''; - req.on('data', chunk => { + req.on('data', (chunk) => { body += chunk.toString(); }); req.on('end', () => { @@ -76,6 +76,7 @@ class LinkServer { if (level <= 0 && !DEBUG) { return; } + // prettier-ignore directLog(ns, ...args.map(arg => { if (typeof arg === 'object') { return inspect(arg, { @@ -117,7 +118,7 @@ class LinkServer { } } -const deserializeObject = str => { +const deserializeObject = (str) => { return JSON.parse(str, (key, value) => { if (typeof value === 'object' && value !== null) { if (value.__undefined__) { diff --git a/tgui/packages/tgui-dev-server/logging.js b/tgui/packages/tgui-dev-server/logging.js index 0dc222ae3d7338..4ec09008ff50c8 100644 --- a/tgui/packages/tgui-dev-server/logging.js +++ b/tgui/packages/tgui-dev-server/logging.js @@ -11,8 +11,7 @@ const isNode = process && process.release && process.release.name === 'node'; let isChrome = false; try { isChrome = window.navigator.userAgent.toLowerCase().includes('chrome'); -} -catch {} +} catch {} // Timestamping function const getTimestamp = () => { @@ -32,7 +31,7 @@ const getPrefix = (() => { bright: '\x1b[37;1m', reset: '\x1b[0m', }; - return ns => [ + return (ns) => [ `${ESC.dimmed}${getTimestamp()} ${ESC.bright}${ns}${ESC.reset}`, ]; } @@ -42,12 +41,13 @@ const getPrefix = (() => { dimmed: 'color: #888', bright: 'font-weight: bold', }; - return ns => [ + return (ns) => [ `%c${getTimestamp()}%c ${ns}`, styles.dimmed, styles.bright, ]; } + // prettier-ignore return ns => [ `${getTimestamp()} ${ns}`, ]; @@ -56,7 +56,7 @@ const getPrefix = (() => { /** * Creates a logger object. */ -export const createLogger = ns => ({ +export const createLogger = (ns) => ({ log: (...args) => console.log(...getPrefix(ns), ...args), trace: (...args) => console.trace(...getPrefix(ns), ...args), debug: (...args) => console.debug(...getPrefix(ns), ...args), diff --git a/tgui/packages/tgui-dev-server/reloader.js b/tgui/packages/tgui-dev-server/reloader.js index 5722cee644bf18..444d9e40cd59cf 100644 --- a/tgui/packages/tgui-dev-server/reloader.js +++ b/tgui/packages/tgui-dev-server/reloader.js @@ -50,10 +50,9 @@ export const findCacheRoot = async () => { // Query the Windows Registry if (process.platform === 'win32') { logger.log('querying windows registry'); - let userpath = await regQuery( - 'HKCU\\Software\\Dantom\\BYOND', - 'userpath'); + let userpath = await regQuery('HKCU\\Software\\Dantom\\BYOND', 'userpath'); if (userpath) { + // prettier-ignore cacheRoot = userpath .replace(/\\$/, '') .replace(/\\/g, '/') @@ -65,13 +64,13 @@ export const findCacheRoot = async () => { logger.log('found no cache directories'); }; -const onCacheRootFound = cacheRoot => { +const onCacheRootFound = (cacheRoot) => { logger.log(`found cache at '${cacheRoot}'`); // Plant a dummy fs.closeSync(fs.openSync(cacheRoot + '/dummy', 'w')); }; -export const reloadByondCache = async bundleDir => { +export const reloadByondCache = async (bundleDir) => { const cacheRoot = await findCacheRoot(); if (!cacheRoot) { return; @@ -83,15 +82,21 @@ export const reloadByondCache = async bundleDir => { return; } // Get dreamseeker instances - const pids = cacheDirs.map(cacheDir => ( + const pids = cacheDirs.map((cacheDir) => parseInt(cacheDir.split('/cache/tmp').pop(), 10) - )); + ); const dssPromise = DreamSeeker.getInstancesByPids(pids); // Copy assets - const assets = await resolveGlob(bundleDir, './*.+(bundle|chunk|hot-update).*'); + const assets = await resolveGlob( + bundleDir, + './*.+(bundle|chunk|hot-update).*' + ); for (let cacheDir of cacheDirs) { // Clear garbage - const garbage = await resolveGlob(cacheDir, './*.+(bundle|chunk|hot-update).*'); + const garbage = await resolveGlob( + cacheDir, + './*.+(bundle|chunk|hot-update).*' + ); try { for (let file of garbage) { fs.unlinkSync(file); @@ -102,8 +107,7 @@ export const reloadByondCache = async bundleDir => { fs.writeFileSync(destination, fs.readFileSync(asset)); } logger.log(`copied ${assets.length} files to '${cacheDir}'`); - } - catch (err) { + } catch (err) { logger.error(`failed copying to '${cacheDir}'`); logger.error(err); } diff --git a/tgui/packages/tgui-dev-server/util.js b/tgui/packages/tgui-dev-server/util.js index 0fc255ed674410..9d07b96c71a056 100644 --- a/tgui/packages/tgui-dev-server/util.js +++ b/tgui/packages/tgui-dev-server/util.js @@ -25,8 +25,7 @@ export const resolveGlob = (...sections) => { try { fs.statSync(path); safePaths.push(path); - } - catch {} + } catch {} } return safePaths; }; diff --git a/tgui/packages/tgui-dev-server/webpack.js b/tgui/packages/tgui-dev-server/webpack.js index 8cba68afcba581..139610b79ce99b 100644 --- a/tgui/packages/tgui-dev-server/webpack.js +++ b/tgui/packages/tgui-dev-server/webpack.js @@ -18,7 +18,7 @@ const logger = createLogger('webpack'); * @param {any} config * @return {WebpackCompiler} */ -export const createCompiler = async options => { +export const createCompiler = async (options) => { const compiler = new WebpackCompiler(); await compiler.setup(options); return compiler; @@ -57,7 +57,7 @@ class WebpackCompiler { logger.log('compiling'); }); // Start reloading when it's finished - compiler.hooks.done.tap('tgui-dev-server', async stats => { + compiler.hooks.done.tap('tgui-dev-server', async (stats) => { // Load source maps await loadSourceMaps(this.bundleDir); // Reload cache @@ -77,7 +77,7 @@ class WebpackCompiler { stats .toString(this.config.devServer.stats) .split('\n') - .forEach(line => logger.log(line)); + .forEach((line) => logger.log(line)); }); } } diff --git a/tgui/packages/tgui-dev-server/winreg.js b/tgui/packages/tgui-dev-server/winreg.js index 669e2aad55d63a..b61fddc1a255a4 100644 --- a/tgui/packages/tgui-dev-server/winreg.js +++ b/tgui/packages/tgui-dev-server/winreg.js @@ -30,17 +30,14 @@ export const regQuery = async (path, key) => { logger.error('could not find the end of the line'); return null; } - const indexOfValue = stdout.indexOf( - ' ', - indexOfKey + keyPattern.length); + const indexOfValue = stdout.indexOf(' ', indexOfKey + keyPattern.length); if (indexOfValue === -1) { logger.error('could not find the start of the key value'); return null; } const value = stdout.substring(indexOfValue + 4, indexOfEol); return value; - } - catch (err) { + } catch (err) { logger.error(err); return null; } diff --git a/tgui/packages/tgui-panel/Notifications.js b/tgui/packages/tgui-panel/Notifications.js index a64ddd8e306e27..2b92995287fada 100644 --- a/tgui/packages/tgui-panel/Notifications.js +++ b/tgui/packages/tgui-panel/Notifications.js @@ -6,33 +6,20 @@ import { Flex } from 'tgui/components'; -export const Notifications = props => { +export const Notifications = (props) => { const { children } = props; - return ( -
- {children} -
- ); + return
{children}
; }; -const NotificationsItem = props => { - const { - rightSlot, - children, - } = props; +const NotificationsItem = (props) => { + const { rightSlot, children } = props; return ( - - + + {children} {rightSlot && ( - - {rightSlot} - + {rightSlot} )} ); diff --git a/tgui/packages/tgui-panel/Panel.js b/tgui/packages/tgui-panel/Panel.js index a09875e9b2f329..83150ab6ef13d8 100644 --- a/tgui/packages/tgui-panel/Panel.js +++ b/tgui/packages/tgui-panel/Panel.js @@ -17,9 +17,7 @@ import { SettingsPanel, useSettings } from './settings'; export const Panel = (props, context) => { // IE8-10: Needs special treatment due to missing Flex support if (Byond.IS_LTE_IE10) { - return ( - - ); + return ; } const audio = useAudio(context); const settings = useSettings(context); @@ -28,9 +26,7 @@ export const Panel = (props, context) => { const { useDebug, KitchenSink } = require('tgui/debug'); const debug = useDebug(context); if (debug.kitchenSink) { - return ( - - ); + return ; } } return ( @@ -52,17 +48,19 @@ export const Panel = (props, context) => { icon="music" tooltip="Music player" tooltipPosition="bottom-start" - onClick={() => audio.toggle()} /> + onClick={() => audio.toggle()} + /> - {settings.visible && ( - - ) || ( + {(settings.visible && ) || ( )} diff --git a/tgui/packages/tgui-panel/audio/NowPlayingWidget.js b/tgui/packages/tgui-panel/audio/NowPlayingWidget.js index e4fe04eed1673b..672ecfad7cecd1 100644 --- a/tgui/packages/tgui-panel/audio/NowPlayingWidget.js +++ b/tgui/packages/tgui-panel/audio/NowPlayingWidget.js @@ -17,12 +17,9 @@ export const NowPlayingWidget = (props, context) => { const title = audio.meta?.title; return ( - {audio.playing && ( + {(audio.playing && ( <> - + Now playing: { {title || 'Unknown Track'} - ) || ( + )) || ( Nothing to play. @@ -46,9 +43,12 @@ export const NowPlayingWidget = (props, context) => {
- {MESSAGE_TYPES - .filter(typeDef => !typeDef.important && !typeDef.admin) - .map(typeDef => ( + {MESSAGE_TYPES.filter( + (typeDef) => !typeDef.important && !typeDef.admin + ).map((typeDef) => ( + + dispatch( + toggleAcceptedType({ + pageId: page.id, + type: typeDef.type, + }) + ) + }> + {typeDef.name} + + ))} + + {MESSAGE_TYPES.filter( + (typeDef) => !typeDef.important && typeDef.admin + ).map((typeDef) => ( dispatch(toggleAcceptedType({ - pageId: page.id, - type: typeDef.type, - }))}> + onClick={() => + dispatch( + toggleAcceptedType({ + pageId: page.id, + type: typeDef.type, + }) + ) + }> {typeDef.name} ))} - - {MESSAGE_TYPES - .filter(typeDef => !typeDef.important && typeDef.admin) - .map(typeDef => ( - dispatch(toggleAcceptedType({ - pageId: page.id, - type: typeDef.type, - }))}> - {typeDef.name} - - ))}
diff --git a/tgui/packages/tgui-panel/chat/ChatPanel.js b/tgui/packages/tgui-panel/chat/ChatPanel.js index 0a5deaf9febe79..3132a66ce7f8c5 100644 --- a/tgui/packages/tgui-panel/chat/ChatPanel.js +++ b/tgui/packages/tgui-panel/chat/ChatPanel.js @@ -16,30 +16,34 @@ export class ChatPanel extends Component { this.state = { scrollTracking: true, }; - this.handleScrollTrackingChange = value => this.setState({ - scrollTracking: value, - }); + this.handleScrollTrackingChange = (value) => + this.setState({ + scrollTracking: value, + }); } componentDidMount() { chatRenderer.mount(this.ref.current); - chatRenderer.events.on('scrollTrackingChanged', - this.handleScrollTrackingChange); + chatRenderer.events.on( + 'scrollTrackingChanged', + this.handleScrollTrackingChange + ); this.componentDidUpdate(); } componentWillUnmount() { - chatRenderer.events.off('scrollTrackingChanged', - this.handleScrollTrackingChange); + chatRenderer.events.off( + 'scrollTrackingChanged', + this.handleScrollTrackingChange + ); } componentDidUpdate(prevProps) { requestAnimationFrame(() => { chatRenderer.ensureScrollTracking(); }); - const shouldUpdateStyle = ( - !prevProps || shallowDiffers(this.props, prevProps) - ); + const shouldUpdateStyle = + !prevProps || shallowDiffers(this.props, prevProps); if (shouldUpdateStyle) { chatRenderer.assignStyle({ 'width': '100%', @@ -51,9 +55,7 @@ export class ChatPanel extends Component { } render() { - const { - scrollTracking, - } = this.state; + const { scrollTracking } = this.state; return ( <>
diff --git a/tgui/packages/tgui-panel/chat/ChatTabs.js b/tgui/packages/tgui-panel/chat/ChatTabs.js index a0e6cc59e523cb..1d4f6f65edfea3 100644 --- a/tgui/packages/tgui-panel/chat/ChatTabs.js +++ b/tgui/packages/tgui-panel/chat/ChatTabs.js @@ -32,16 +32,22 @@ export const ChatTabs = (props, context) => { - {pages.map(page => ( + {pages.map((page) => ( 0 && ( - - )} - onClick={() => dispatch(changeChatPage({ - pageId: page.id, - }))}> + rightSlot={ + page.unreadCount > 0 && ( + + ) + } + onClick={() => + dispatch( + changeChatPage({ + pageId: page.id, + }) + ) + }> {page.name} ))} @@ -54,7 +60,8 @@ export const ChatTabs = (props, context) => { onClick={() => { dispatch(addChatPage()); dispatch(openChatSettings()); - }} /> + }} + /> ); diff --git a/tgui/packages/tgui-panel/chat/constants.js b/tgui/packages/tgui-panel/chat/constants.js index 0333b648999126..97a607eac3056e 100644 --- a/tgui/packages/tgui-panel/chat/constants.js +++ b/tgui/packages/tgui-panel/chat/constants.js @@ -58,19 +58,22 @@ export const MESSAGE_TYPES = [ type: MESSAGE_TYPE_RADIO, name: 'Radio', description: 'All departments of radio messages', - selector: '.alert, .minorannounce, .syndradio, .centcomradio, .aiprivradio, .comradio, .secradio, .gangradio, .engradio, .medradio, .sciradio, .suppradio, .servradio, .radio, .deptradio, .binarysay, .newscaster, .resonate', + selector: + '.alert, .minorannounce, .syndradio, .centcomradio, .aiprivradio, .comradio, .secradio, .gangradio, .engradio, .medradio, .sciradio, .suppradio, .servradio, .radio, .deptradio, .binarysay, .newscaster, .resonate', }, { type: MESSAGE_TYPE_INFO, name: 'Info', description: 'Non-urgent messages from the game and items', - selector: '.notice:not(.pm), .adminnotice, .info, .sinister, .cult, .infoplain, .announce, .hear, .smallnotice, .holoparasite, .boldnotice', + selector: + '.notice:not(.pm), .adminnotice, .info, .sinister, .cult, .infoplain, .announce, .hear, .smallnotice, .holoparasite, .boldnotice', }, { type: MESSAGE_TYPE_WARNING, name: 'Warnings', description: 'Urgent messages from the game and items', - selector: '.warning:not(.pm), .critical, .userdanger, .italics, .alertsyndie, .warningplain', + selector: + '.warning:not(.pm), .critical, .userdanger, .italics, .alertsyndie, .warningplain', }, { type: MESSAGE_TYPE_DEADCHAT, diff --git a/tgui/packages/tgui-panel/chat/middleware.js b/tgui/packages/tgui-panel/chat/middleware.js index 6cfc72bd29942f..334c438ac0d353 100644 --- a/tgui/packages/tgui-panel/chat/middleware.js +++ b/tgui/packages/tgui-panel/chat/middleware.js @@ -15,25 +15,22 @@ import { chatRenderer } from './renderer'; import { selectChat, selectCurrentChatPage } from './selectors'; // List of blacklisted tags -const FORBID_TAGS = [ - 'a', - 'iframe', - 'link', - 'video', -]; +const FORBID_TAGS = ['a', 'iframe', 'link', 'video']; -const saveChatToStorage = async store => { +const saveChatToStorage = async (store) => { const state = selectChat(store.getState()); - const fromIndex = Math.max(0, - chatRenderer.messages.length - MAX_PERSISTED_MESSAGES); + const fromIndex = Math.max( + 0, + chatRenderer.messages.length - MAX_PERSISTED_MESSAGES + ); const messages = chatRenderer.messages .slice(fromIndex) - .map(message => serializeMessage(message)); + .map((message) => serializeMessage(message)); storage.set('chat-state', state); storage.set('chat-messages', messages); }; -const loadChatFromStorage = async store => { +const loadChatFromStorage = async (store) => { const [state, messages] = await Promise.all([ storage.get('chat-state'), storage.get('chat-messages'), @@ -64,10 +61,10 @@ const loadChatFromStorage = async store => { store.dispatch(loadChat(state)); }; -export const chatMiddleware = store => { +export const chatMiddleware = (store) => { let initialized = false; let loaded = false; - chatRenderer.events.on('batchProcessed', countByType => { + chatRenderer.events.on('batchProcessed', (countByType) => { // Use this flag to workaround unread messages caused by // loading them from storage. Side effect of that, is that // message count can not be trusted, only unread count. @@ -75,11 +72,13 @@ export const chatMiddleware = store => { store.dispatch(updateMessageCount(countByType)); } }); - chatRenderer.events.on('scrollTrackingChanged', scrollTracking => { + chatRenderer.events.on('scrollTrackingChanged', (scrollTracking) => { store.dispatch(changeScrollTracking(scrollTracking)); }); - setInterval(() => saveChatToStorage(store), MESSAGE_SAVE_INTERVAL); - return next => action => { + setInterval(() => { + saveChatToStorage(store); + }, MESSAGE_SAVE_INTERVAL); + return (next) => (action) => { const { type, payload } = action; if (!initialized) { initialized = true; @@ -99,10 +98,12 @@ export const chatMiddleware = store => { loaded = true; return; } - if (type === changeChatPage.type - || type === addChatPage.type - || type === removeChatPage.type - || type === toggleAcceptedType.type) { + if ( + type === changeChatPage.type || + type === addChatPage.type || + type === removeChatPage.type || + type === toggleAcceptedType.type + ) { next(action); const page = selectCurrentChatPage(store.getState()); chatRenderer.changePage(page); @@ -119,7 +120,8 @@ export const chatMiddleware = store => { settings.highlightText, settings.highlightColor, settings.matchWord, - settings.matchCase); + settings.matchCase + ); return; } if (type === 'roundrestart') { diff --git a/tgui/packages/tgui-panel/chat/model.js b/tgui/packages/tgui-panel/chat/model.js index 7400d5e13cd30c..fa12153890d8ad 100644 --- a/tgui/packages/tgui-panel/chat/model.js +++ b/tgui/packages/tgui-panel/chat/model.js @@ -7,11 +7,10 @@ import { createUuid } from 'common/uuid'; import { MESSAGE_TYPES, MESSAGE_TYPE_INTERNAL } from './constants'; -export const canPageAcceptType = (page, type) => ( - type.startsWith(MESSAGE_TYPE_INTERNAL) || page.acceptedTypes[type] -); +export const canPageAcceptType = (page, type) => + type.startsWith(MESSAGE_TYPE_INTERNAL) || page.acceptedTypes[type]; -export const createPage = obj => { +export const createPage = (obj) => { let acceptedTypes = {}; for (let typeDef of MESSAGE_TYPES) { @@ -39,12 +38,12 @@ export const createMainPage = () => { }); }; -export const createMessage = payload => ({ +export const createMessage = (payload) => ({ createdAt: Date.now(), ...payload, }); -export const serializeMessage = message => ({ +export const serializeMessage = (message) => ({ type: message.type, text: message.text, html: message.html, @@ -52,7 +51,6 @@ export const serializeMessage = message => ({ createdAt: message.createdAt, }); -export const isSameMessage = (a, b) => ( - typeof a.text === 'string' && a.text === b.text - || typeof a.html === 'string' && a.html === b.html -); +export const isSameMessage = (a, b) => + (typeof a.text === 'string' && a.text === b.text) || + (typeof a.html === 'string' && a.html === b.html); diff --git a/tgui/packages/tgui-panel/chat/reducer.js b/tgui/packages/tgui-panel/chat/reducer.js index 0188b1fabe8b33..b727a7c1babc30 100644 --- a/tgui/packages/tgui-panel/chat/reducer.js +++ b/tgui/packages/tgui-panel/chat/reducer.js @@ -13,9 +13,7 @@ export const initialState = { version: 5, currentPageId: mainPage.id, scrollTracking: true, - pages: [ - mainPage.id, - ], + pages: [mainPage.id], pageById: { [mainPage.id]: mainPage, }, @@ -74,7 +72,7 @@ export const chatReducer = (state = initialState, action) => { } if (type === updateMessageCount.type) { const countByType = payload; - const pages = state.pages.map(id => state.pageById[id]); + const pages = state.pages.map((id) => state.pageById[id]); const currentPage = state.pageById[state.currentPageId]; const nextPageById = { ...state.pageById }; for (let page of pages) { @@ -170,7 +168,7 @@ export const chatReducer = (state = initialState, action) => { }, }; delete nextState.pageById[pageId]; - nextState.pages = nextState.pages.filter(id => id !== pageId); + nextState.pages = nextState.pages.filter((id) => id !== pageId); if (nextState.pages.length === 0) { nextState.pages.push(mainPage.id); nextState.pageById[mainPage.id] = mainPage; diff --git a/tgui/packages/tgui-panel/chat/renderer.js b/tgui/packages/tgui-panel/chat/renderer.js index b9506611605328..869394a78d8899 100644 --- a/tgui/packages/tgui-panel/chat/renderer.js +++ b/tgui/packages/tgui-panel/chat/renderer.js @@ -11,7 +11,7 @@ import { COMBINE_MAX_MESSAGES, COMBINE_MAX_TIME_WINDOW, IMAGE_RETRY_DELAY, IMAGE import { render } from 'inferno'; import { canPageAcceptType, createMessage, isSameMessage } from './model'; import { highlightNode, linkifyNode } from './replaceInTextNode'; -import { Tooltip } from "../../tgui/components"; +import { Tooltip } from '../../tgui/components'; const logger = createLogger('chatRenderer'); @@ -27,11 +27,11 @@ export const TGUI_CHAT_COMPONENTS = { // List of injectable attibute names mapped to their proper prop // We need this because attibutes don't support lowercase names export const TGUI_CHAT_ATTRIBUTES_TO_PROPS = { - "position": "position", - "content": "content", + 'position': 'position', + 'content': 'content', }; -const findNearestScrollableParent = startingNode => { +const findNearestScrollableParent = (startingNode) => { const body = document.body; let node = startingNode; while (node && node !== body) { @@ -66,7 +66,7 @@ const createReconnectedNode = () => { return node; }; -const handleImageError = e => { +const handleImageError = (e) => { setTimeout(() => { /** @type {HTMLImageElement} */ const node = e.target; @@ -85,7 +85,7 @@ const handleImageError = e => { /** * Assigns a "times-repeated" badge to the message. */ -const updateMessageBadge = message => { +const updateMessageBadge = (message) => { const { node, times } = message; if (!node || !times) { // Nothing to update @@ -94,10 +94,7 @@ const updateMessageBadge = message => { const foundBadge = node.querySelector('.Chat__badge'); const badge = foundBadge || document.createElement('div'); badge.textContent = times; - badge.className = classes([ - 'Chat__badge', - 'Chat__badge--animate', - ]); + badge.className = classes(['Chat__badge', 'Chat__badge--animate']); requestAnimationFrame(() => { badge.className = 'Chat__badge'; }); @@ -121,13 +118,12 @@ class ChatRenderer { /** @type {HTMLElement} */ this.scrollNode = null; this.scrollTracking = true; - this.handleScroll = type => { + this.handleScroll = (type) => { const node = this.scrollNode; const height = node.scrollHeight; const bottom = node.scrollTop + node.offsetHeight; - const scrollTracking = ( - Math.abs(height - bottom) < SCROLL_TRACKING_TOLERANCE - ); + const scrollTracking = + Math.abs(height - bottom) < SCROLL_TRACKING_TOLERANCE; if (scrollTracking !== this.scrollTracking) { this.scrollTracking = scrollTracking; this.events.emit('scrollTrackingChanged', scrollTracking); @@ -193,18 +189,18 @@ class ChatRenderer { const lines = String(text) .split(',') // eslint-disable-next-line no-useless-escape - .map(str => str.trim().replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')) - .filter(str => ( - // Must be longer than one character - str && str.length > 1 - )); + .map((str) => str.trim().replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')) + // Must be longer than one character + .filter((str) => str && str.length > 1); // Nothing to match, reset highlighting if (lines.length === 0) { this.highlightRegex = null; this.highlightColor = null; return; } - const pattern = `${(matchWord ? '\\b' : '')}(${lines.join('|')})${(matchWord ? '\\b' : '')}`; + const pattern = `${matchWord ? '\\b' : ''}(${lines.join('|')})${ + matchWord ? '\\b' : '' + }`; const flags = 'g' + (matchCase ? '' : 'i'); this.highlightRegex = new RegExp(pattern, flags); this.highlightColor = color; @@ -249,6 +245,7 @@ class ChatRenderer { const to = Math.max(0, len - COMBINE_MAX_MESSAGES); for (let i = from; i >= to; i--) { const message = this.visibleMessages[i]; + // prettier-ignore const matches = ( // Is not an internal message !message.type.startsWith(MESSAGE_TYPE_INTERNAL) @@ -265,17 +262,13 @@ class ChatRenderer { } processBatch(batch, options = {}) { - const { - prepend, - notifyListeners = true, - } = options; + const { prepend, notifyListeners = true } = options; const now = Date.now(); // Queue up messages until chat is ready if (!this.isReady()) { if (prepend) { this.queue = [...batch, ...this.queue]; - } - else { + } else { this.queue = [...this.queue, ...batch]; } return; @@ -311,15 +304,14 @@ class ChatRenderer { // Payload is HTML else if (message.html) { node.innerHTML = message.html; - } - else { + } else { logger.error('Error: message is missing text payload', message); } // Get all nodes in this message that want to be rendered like jsx - const nodes = node.querySelectorAll("[data-component]"); + const nodes = node.querySelectorAll('[data-component]'); for (let i = 0; i < nodes.length; i++) { const childNode = nodes[i]; - const targetName = childNode.getAttribute("data-component"); + const targetName = childNode.getAttribute('data-component'); // Let's pull out the attibute info we need let outputProps = {}; for (let j = 0; j < childNode.attributes.length; j++) { @@ -328,20 +320,18 @@ class ChatRenderer { let working_value = attribute.nodeValue; // We can't do the "if it has no value it's truthy" trick // Because getAttribute returns "", not null. Hate IE - if (working_value === "$true") { + if (working_value === '$true') { working_value = true; - } - else if (working_value === "$false") { + } else if (working_value === '$false') { working_value = false; - } - else if (!isNaN(working_value)) { + } else if (!isNaN(working_value)) { const parsed_float = parseFloat(working_value); if (!isNaN(parsed_float)) { working_value = parsed_float; } } - let canon_name = attribute.nodeName.replace("data-", ""); + let canon_name = attribute.nodeName.replace('data-', ''); // html attributes don't support upper case chars, so we need to map canon_name = TGUI_CHAT_ATTRIBUTES_TO_PROPS[canon_name]; outputProps[canon_name] = working_value; @@ -355,18 +345,17 @@ class ChatRenderer { render( - , childNode); + , + childNode + ); /* eslint-enable react/no-danger */ - } // Highlight text if (!message.avoidHighlighting && this.highlightRegex) { - const highlighted = highlightNode(node, - this.highlightRegex, - text => ( - createHighlightNode(text, this.highlightColor) - )); + const highlighted = highlightNode(node, this.highlightRegex, (text) => + createHighlightNode(text, this.highlightColor) + ); if (highlighted) { node.className += ' ChatMessage--highlighted'; } @@ -391,6 +380,7 @@ class ChatRenderer { if (!message.type) { // IE8: Does not support querySelector on elements that // are not yet in the document. + // prettier-ignore const typeDef = !Byond.IS_LTE_IE8 && MESSAGE_TYPES .find(typeDef => ( typeDef.selector && node.querySelector(typeDef.selector) @@ -413,8 +403,7 @@ class ChatRenderer { const firstChild = this.rootNode.childNodes[0]; if (prepend && firstChild) { this.rootNode.insertBefore(fragment, firstChild); - } - else { + } else { this.rootNode.appendChild(fragment); } if (this.scrollTracking) { @@ -440,8 +429,7 @@ class ChatRenderer { // Visible messages { const messages = this.visibleMessages; - const fromIndex = Math.max(0, - messages.length - MAX_VISIBLE_MESSAGES); + const fromIndex = Math.max(0, messages.length - MAX_VISIBLE_MESSAGES); if (fromIndex > 0) { this.visibleMessages = messages.slice(fromIndex); for (let i = 0; i < fromIndex; i++) { @@ -451,6 +439,7 @@ class ChatRenderer { message.node = 'pruned'; } // Remove pruned messages from the message array + // prettier-ignore this.messages = this.messages.filter(message => ( message.node !== 'pruned' )); @@ -459,8 +448,10 @@ class ChatRenderer { } // All messages { - const fromIndex = Math.max(0, - this.messages.length - MAX_PERSISTED_MESSAGES); + const fromIndex = Math.max( + 0, + this.messages.length - MAX_PERSISTED_MESSAGES + ); if (fromIndex > 0) { this.messages = this.messages.slice(fromIndex); logger.log(`pruned ${fromIndex} stored messages`); @@ -473,8 +464,10 @@ class ChatRenderer { return; } // Make a copy of messages - const fromIndex = Math.max(0, - this.messages.length - MAX_PERSISTED_MESSAGES); + const fromIndex = Math.max( + 0, + this.messages.length - MAX_PERSISTED_MESSAGES + ); const messages = this.messages.slice(fromIndex); // Remove existing nodes for (let message of messages) { @@ -514,6 +507,7 @@ class ChatRenderer { } } // Create a page + // prettier-ignore const pageHtml = '\n' + '\n' + '\n' diff --git a/tgui/packages/tgui-panel/chat/replaceInTextNode.js b/tgui/packages/tgui-panel/chat/replaceInTextNode.js index 0db2b2193e8a4d..fc10772622d335 100644 --- a/tgui/packages/tgui-panel/chat/replaceInTextNode.js +++ b/tgui/packages/tgui-panel/chat/replaceInTextNode.js @@ -7,7 +7,7 @@ /** * Replaces text matching a regular expression with a custom node. */ -export const replaceInTextNode = (regex, createNode) => node => { +export const replaceInTextNode = (regex, createNode) => (node) => { const text = node.textContent; const textLength = text.length; let match; @@ -15,7 +15,7 @@ export const replaceInTextNode = (regex, createNode) => node => { let fragment; let n = 0; // eslint-disable-next-line no-cond-assign - while (match = regex.exec(text)) { + while ((match = regex.exec(text))) { n += 1; // Lazy init fragment if (!fragment) { @@ -26,8 +26,9 @@ export const replaceInTextNode = (regex, createNode) => node => { const matchIndex = match.index; // Insert previous unmatched chunk if (lastIndex < matchIndex) { - fragment.appendChild(document.createTextNode( - text.substring(lastIndex, matchIndex))); + fragment.appendChild( + document.createTextNode(text.substring(lastIndex, matchIndex)) + ); } lastIndex = matchIndex + matchLength; // Create a wrapper node @@ -36,8 +37,9 @@ export const replaceInTextNode = (regex, createNode) => node => { if (fragment) { // Insert the remaining unmatched chunk if (lastIndex < textLength) { - fragment.appendChild(document.createTextNode( - text.substring(lastIndex, textLength))); + fragment.appendChild( + document.createTextNode(text.substring(lastIndex, textLength)) + ); } // Commit the fragment node.parentNode.replaceChild(fragment, node); @@ -45,17 +47,15 @@ export const replaceInTextNode = (regex, createNode) => node => { return n; }; - // Highlight // -------------------------------------------------------- /** * Default highlight node. */ -const createHighlightNode = text => { +const createHighlightNode = (text) => { const node = document.createElement('span'); - node.setAttribute('style', - 'background-color:#fd4;color:#000'); + node.setAttribute('style', 'background-color:#fd4;color:#000'); node.textContent = text; return node; }; @@ -71,7 +71,7 @@ const createHighlightNode = text => { export const highlightNode = ( node, regex, - createNode = createHighlightNode, + createNode = createHighlightNode ) => { if (!createNode) { createNode = createHighlightNode; @@ -83,18 +83,17 @@ export const highlightNode = ( // Is a text node if (node.nodeType === 3) { n += replaceInTextNode(regex, createNode)(node); - } - else { + } else { n += highlightNode(node, regex, createNode); } } return n; }; - // Linkify // -------------------------------------------------------- +// prettier-ignore const URL_REGEX = /(?:(?:https?:\/\/)|(?:www\.))(?:[^ ]*?\.[^ ]*?)+[-A-Za-z0-9+&@#/%?=~_|$!:,.;()]+/ig; /** @@ -103,7 +102,7 @@ const URL_REGEX = /(?:(?:https?:\/\/)|(?:www\.))(?:[^ ]*?\.[^ ]*?)+[-A-Za-z0-9+& * @param {Node} node Node which you want to process * @returns {number} Number of matches */ -export const linkifyNode = node => { +export const linkifyNode = (node) => { let n = 0; const childNodes = node.childNodes; for (let i = 0; i < childNodes.length; i++) { @@ -112,15 +111,14 @@ export const linkifyNode = node => { // Is a text node if (node.nodeType === 3) { n += linkifyTextNode(node); - } - else if (tag !== 'a') { + } else if (tag !== 'a') { n += linkifyNode(node); } } return n; }; -const linkifyTextNode = replaceInTextNode(URL_REGEX, text => { +const linkifyTextNode = replaceInTextNode(URL_REGEX, (text) => { const node = document.createElement('a'); node.href = text; node.textContent = text; diff --git a/tgui/packages/tgui-panel/chat/selectors.js b/tgui/packages/tgui-panel/chat/selectors.js index 2bcc6531840920..6352b7cddf0afd 100644 --- a/tgui/packages/tgui-panel/chat/selectors.js +++ b/tgui/packages/tgui-panel/chat/selectors.js @@ -6,16 +6,12 @@ import { map } from 'common/collections'; -export const selectChat = state => state.chat; +export const selectChat = (state) => state.chat; -export const selectChatPages = state => ( - map(id => state.chat.pageById[id])(state.chat.pages) -); +export const selectChatPages = (state) => + map((id) => state.chat.pageById[id])(state.chat.pages); -export const selectCurrentChatPage = state => ( - state.chat.pageById[state.chat.currentPageId] -); +export const selectCurrentChatPage = (state) => + state.chat.pageById[state.chat.currentPageId]; -export const selectChatPageById = id => state => ( - state.chat.pageById[id] -); +export const selectChatPageById = (id) => (state) => state.chat.pageById[id]; diff --git a/tgui/packages/tgui-panel/game/hooks.js b/tgui/packages/tgui-panel/game/hooks.js index e9567b916b4645..859aaa09a40722 100644 --- a/tgui/packages/tgui-panel/game/hooks.js +++ b/tgui/packages/tgui-panel/game/hooks.js @@ -7,6 +7,6 @@ import { useSelector } from 'common/redux'; import { selectGame } from './selectors'; -export const useGame = context => { +export const useGame = (context) => { return useSelector(context, selectGame); }; diff --git a/tgui/packages/tgui-panel/game/middleware.js b/tgui/packages/tgui-panel/game/middleware.js index ba1ec63f9ec587..53dd45bb46e0ca 100644 --- a/tgui/packages/tgui-panel/game/middleware.js +++ b/tgui/packages/tgui-panel/game/middleware.js @@ -9,7 +9,7 @@ import { connectionLost, connectionRestored, roundRestarted } from './actions'; import { selectGame } from './selectors'; import { CONNECTION_LOST_AFTER } from './constants'; -const withTimestamp = action => ({ +const withTimestamp = (action) => ({ ...action, meta: { ...action.meta, @@ -17,7 +17,7 @@ const withTimestamp = action => ({ }, }); -export const gameMiddleware = store => { +export const gameMiddleware = (store) => { let lastPingedAt; setInterval(() => { @@ -26,8 +26,8 @@ export const gameMiddleware = store => { return; } const game = selectGame(state); - const pingsAreFailing = lastPingedAt - && Date.now() >= lastPingedAt + CONNECTION_LOST_AFTER; + const pingsAreFailing = + lastPingedAt && Date.now() >= lastPingedAt + CONNECTION_LOST_AFTER; if (!game.connectionLostAt && pingsAreFailing) { store.dispatch(withTimestamp(connectionLost())); } @@ -36,7 +36,7 @@ export const gameMiddleware = store => { } }, 1000); - return next => action => { + return (next) => (action) => { const { type } = action; if (type === pingSuccess.type || type === pingSoft.type) { diff --git a/tgui/packages/tgui-panel/game/selectors.js b/tgui/packages/tgui-panel/game/selectors.js index dc2d7040f9c812..a3b93b327d9755 100644 --- a/tgui/packages/tgui-panel/game/selectors.js +++ b/tgui/packages/tgui-panel/game/selectors.js @@ -4,4 +4,4 @@ * @license MIT */ -export const selectGame = state => state.game; +export const selectGame = (state) => state.game; diff --git a/tgui/packages/tgui-panel/index.js b/tgui/packages/tgui-panel/index.js index 721fa97fb50c2f..6bc6b32c4622b4 100644 --- a/tgui/packages/tgui-panel/index.js +++ b/tgui/packages/tgui-panel/index.js @@ -86,7 +86,7 @@ const setupApp = () => { }); // Resize the panel to match the non-browser output - Byond.winget('output').then(output => { + Byond.winget('output').then((output) => { Byond.winset('browseroutput', { 'size': output.size, }); @@ -95,6 +95,7 @@ const setupApp = () => { // Enable hot module reloading if (module.hot) { setupHotReloading(); + // prettier-ignore module.hot.accept([ './audio', './chat', diff --git a/tgui/packages/tgui-panel/panelFocus.js b/tgui/packages/tgui-panel/panelFocus.js index 6922418c899771..b7cea2293149ec 100644 --- a/tgui/packages/tgui-panel/panelFocus.js +++ b/tgui/packages/tgui-panel/panelFocus.js @@ -20,13 +20,13 @@ const deferredFocusMap = () => setImmediate(() => focusMap()); export const setupPanelFocusHacks = () => { let focusStolen = false; let clickStartPos = null; - window.addEventListener('focusin', e => { + window.addEventListener('focusin', (e) => { focusStolen = canStealFocus(e.target); }); - window.addEventListener('mousedown', e => { + window.addEventListener('mousedown', (e) => { clickStartPos = [e.screenX, e.screenY]; }); - window.addEventListener('mouseup', e => { + window.addEventListener('mouseup', (e) => { if (clickStartPos) { const clickEndPos = [e.screenX, e.screenY]; const dist = vecLength(vecSubtract(clickEndPos, clickStartPos)); @@ -38,7 +38,7 @@ export const setupPanelFocusHacks = () => { deferredFocusMap(); } }); - globalEvents.on('keydown', key => { + globalEvents.on('keydown', (key) => { if (key.isModifierKey()) { return; } diff --git a/tgui/packages/tgui-panel/ping/PingIndicator.js b/tgui/packages/tgui-panel/ping/PingIndicator.js index b663cd3a1809d7..aadbd1c134b5c3 100644 --- a/tgui/packages/tgui-panel/ping/PingIndicator.js +++ b/tgui/packages/tgui-panel/ping/PingIndicator.js @@ -17,14 +17,10 @@ export const PingIndicator = (props, context) => { new Color(220, 200, 40), new Color(60, 220, 40), ]); - const roundtrip = ping.roundtrip - ? toFixed(ping.roundtrip) - : '--'; + const roundtrip = ping.roundtrip ? toFixed(ping.roundtrip) : '--'; return (
- + {roundtrip}
); diff --git a/tgui/packages/tgui-panel/ping/middleware.js b/tgui/packages/tgui-panel/ping/middleware.js index fb86de9cc48f98..e5b593d822fd03 100644 --- a/tgui/packages/tgui-panel/ping/middleware.js +++ b/tgui/packages/tgui-panel/ping/middleware.js @@ -7,7 +7,7 @@ import { pingFail, pingReply, pingSoft, pingSuccess } from './actions'; import { PING_QUEUE_SIZE, PING_TIMEOUT } from './constants'; -export const pingMiddleware = store => { +export const pingMiddleware = (store) => { let initialized = false; let index = 0; const pings = []; @@ -26,7 +26,7 @@ export const pingMiddleware = store => { index = (index + 1) % PING_QUEUE_SIZE; }; - return next => action => { + return (next) => (action) => { const { type, payload } = action; if (!initialized) { diff --git a/tgui/packages/tgui-panel/ping/reducer.js b/tgui/packages/tgui-panel/ping/reducer.js index 874cb75a9b8dc8..b1e3d679cbcc38 100644 --- a/tgui/packages/tgui-panel/ping/reducer.js +++ b/tgui/packages/tgui-panel/ping/reducer.js @@ -15,8 +15,8 @@ export const pingReducer = (state = {}, action) => { const { roundtrip } = payload; const prevRoundtrip = state.roundtripAvg || roundtrip; const roundtripAvg = Math.round(prevRoundtrip * 0.4 + roundtrip * 0.6); - const networkQuality = 1 - scale(roundtripAvg, - PING_ROUNDTRIP_BEST, PING_ROUNDTRIP_WORST); + const networkQuality = + 1 - scale(roundtripAvg, PING_ROUNDTRIP_BEST, PING_ROUNDTRIP_WORST); return { roundtrip, roundtripAvg, @@ -27,8 +27,9 @@ export const pingReducer = (state = {}, action) => { if (type === pingFail.type) { const { failCount = 0 } = state; - const networkQuality = clamp01(state.networkQuality - - failCount / PING_MAX_FAILS); + const networkQuality = clamp01( + state.networkQuality - failCount / PING_MAX_FAILS + ); const nextState = { ...state, failCount: failCount + 1, diff --git a/tgui/packages/tgui-panel/ping/selectors.js b/tgui/packages/tgui-panel/ping/selectors.js index cfbe95c2f325ba..1b8bfb4ee40f9c 100644 --- a/tgui/packages/tgui-panel/ping/selectors.js +++ b/tgui/packages/tgui-panel/ping/selectors.js @@ -4,4 +4,4 @@ * @license MIT */ -export const selectPing = state => state.ping; +export const selectPing = (state) => state.ping; diff --git a/tgui/packages/tgui-panel/reconnect.tsx b/tgui/packages/tgui-panel/reconnect.tsx index 25391c0a681f21..ecfd76716925bd 100644 --- a/tgui/packages/tgui-panel/reconnect.tsx +++ b/tgui/packages/tgui-panel/reconnect.tsx @@ -3,7 +3,7 @@ import { Button } from 'tgui/components'; let url: string | null = null; setInterval(() => { - Byond.winget('', 'url').then(currentUrl => { + Byond.winget('', 'url').then((currentUrl) => { // Sometimes, for whatever reason, BYOND will give an IP with a :0 port. if (currentUrl && !currentUrl.match(/:0$/)) { url = currentUrl; @@ -11,19 +11,25 @@ setInterval(() => { }); }, 5000); -export const ReconnectButton = (props, context) => { - return url && ( +export const ReconnectButton = () => { + if (!url) { + return null; + } + return ( <> - - - diff --git a/tgui/packages/tgui-panel/settings/SettingsPanel.js b/tgui/packages/tgui-panel/settings/SettingsPanel.js index 01df419ce21f80..d449fd3e7a6856 100644 --- a/tgui/packages/tgui-panel/settings/SettingsPanel.js +++ b/tgui/packages/tgui-panel/settings/SettingsPanel.js @@ -23,13 +23,17 @@ export const SettingsPanel = (props, context) => {
- {SETTINGS_TABS.map(tab => ( + {SETTINGS_TABS.map((tab) => ( dispatch(changeSettingsTab({ - tabId: tab.id, - }))}> + onClick={() => + dispatch( + changeSettingsTab({ + tabId: tab.id, + }) + ) + }> {tab.name} ))} @@ -37,12 +41,8 @@ export const SettingsPanel = (props, context) => {
- {activeTab === 'general' && ( - - )} - {activeTab === 'chatPage' && ( - - )} + {activeTab === 'general' && } + {activeTab === 'chatPage' && } ); @@ -60,7 +60,7 @@ export const SettingsGeneral = (props, context) => { matchCase, } = useSelector(context, selectSettings); const dispatch = useDispatch(context); - const [freeFont, setFreeFont] = useLocalState(context, "freeFont", false); + const [freeFont, setFreeFont] = useLocalState(context, 'freeFont', false); return (
@@ -68,34 +68,48 @@ export const SettingsGeneral = (props, context) => { dispatch(updateSettings({ - theme: value, - }))} /> + onSelected={(value) => + dispatch( + updateSettings({ + theme: value, + }) + ) + } + /> - {!freeFont && ( + {(!freeFont && ( dispatch(updateSettings({ - fontFamily: value, - }))} /> - ) || ( + onSelected={(value) => + dispatch( + updateSettings({ + fontFamily: value, + }) + ) + } + /> + )) || ( dispatch(updateSettings({ - fontFamily: value, - }))} + onChange={(e, value) => + dispatch( + updateSettings({ + fontFamily: value, + }) + ) + } /> )}
@@ -134,9 +134,12 @@ const NewscasterChannelCreation = (props, context) => {
EntryResearch NameCostResearcher NameConsole Location
- {entries.map(entry => ( - - - {entry.name} - - - ({entry.rank}) - + {entries.map((entry) => ( + + {entry.name} + ({entry.rank}) ))}
diff --git a/tgui/packages/tgui/interfaces/NtosCyborgRemoteMonitor.js b/tgui/packages/tgui/interfaces/NtosCyborgRemoteMonitor.js index d03133d83d429b..a078f975ac423b 100644 --- a/tgui/packages/tgui/interfaces/NtosCyborgRemoteMonitor.js +++ b/tgui/packages/tgui/interfaces/NtosCyborgRemoteMonitor.js @@ -4,9 +4,7 @@ import { NtosWindow } from '../layouts'; export const NtosCyborgRemoteMonitor = (props, context) => { return ( - + @@ -14,7 +12,7 @@ export const NtosCyborgRemoteMonitor = (props, context) => { ); }; -export const ProgressSwitch = param => { +export const ProgressSwitch = (param) => { switch (param) { case -1: return '_'; @@ -34,19 +32,11 @@ export const ProgressSwitch = param => { export const NtosCyborgRemoteMonitorContent = (props, context) => { const { act, data } = useBackend(context); const [tab_main, setTab_main] = useSharedState(context, 'tab_main', 1); - const { - card, - cyborgs = [], - DL_progress, - } = data; + const { card, cyborgs = [], DL_progress } = data; const storedlog = data.borglog || []; if (!cyborgs.length) { - return ( - - No cyborg units detected. - - ); + return No cyborg units detected.; } return ( @@ -73,67 +63,77 @@ export const NtosCyborgRemoteMonitorContent = (props, context) => { <> {!card && ( - - Certain features require an ID card login. - + Certain features require an ID card login. )}
- {cyborgs.map(cyborg => ( + {cyborgs.map((cyborg) => (
act('messagebot', { - ref: cyborg.ref, - })} /> - )}> + onClick={() => + act('messagebot', { + ref: cyborg.ref, + }) + } + /> + }> - + {cyborg.status - ? "Not Responding" + ? 'Not Responding' : cyborg.locked_down - ? "Locked Down" + ? 'Locked Down' : cyborg.shell_discon - ? "Nominal/Disconnected" - : "Nominal"} + ? 'Nominal/Disconnected' + : 'Nominal'} - + {cyborg.integ === 0 - ? "Hard Fault" + ? 'Hard Fault' : cyborg.integ <= 25 - ? "Functionality Disrupted" + ? 'Functionality Disrupted' : cyborg.integ <= 75 - ? "Functionality Impaired" - : "Operational"} + ? 'Functionality Impaired' + : 'Operational'} - + {typeof cyborg.charge === 'number' - ? cyborg.charge + "%" - : "Not Found"} + ? cyborg.charge + '%' + : 'Not Found'} @@ -154,23 +154,15 @@ export const NtosCyborgRemoteMonitorContent = (props, context) => {
Scan a cyborg to download stored logs. - + {ProgressSwitch(DL_progress)}
- -
- {storedlog.map(log => ( - + +
+ {storedlog.map((log) => ( + {log} ))} diff --git a/tgui/packages/tgui/interfaces/NtosCyborgRemoteMonitorSyndicate.js b/tgui/packages/tgui/interfaces/NtosCyborgRemoteMonitorSyndicate.js index efa93513e702ce..0517f8f80ef30f 100644 --- a/tgui/packages/tgui/interfaces/NtosCyborgRemoteMonitorSyndicate.js +++ b/tgui/packages/tgui/interfaces/NtosCyborgRemoteMonitorSyndicate.js @@ -3,10 +3,7 @@ import { NtosCyborgRemoteMonitorContent } from './NtosCyborgRemoteMonitor'; export const NtosCyborgRemoteMonitorSyndicate = (props, context) => { return ( - + diff --git a/tgui/packages/tgui/interfaces/NtosFileManager.js b/tgui/packages/tgui/interfaces/NtosFileManager.js index ac2e33ee874a91..79d3d84ed0b34b 100644 --- a/tgui/packages/tgui/interfaces/NtosFileManager.js +++ b/tgui/packages/tgui/interfaces/NtosFileManager.js @@ -4,12 +4,7 @@ import { NtosWindow } from '../layouts'; export const NtosFileManager = (props, context) => { const { act, data } = useBackend(context); - const { - PC_device_theme, - usbconnected, - files = [], - usbfiles = [], - } = data; + const { PC_device_theme, usbconnected, files = [], usbfiles = [] } = data; return ( @@ -17,14 +12,17 @@ export const NtosFileManager = (props, context) => { act('PRG_copytousb', { name: file })} - onDelete={file => act('PRG_deletefile', { name: file })} - onRename={(file, newName) => act('PRG_renamefile', { - name: file, - new_name: newName, - })} - onDuplicate={file => act('PRG_clone', { file: file })} - onToggleSilence={file => act('PRG_togglesilence', { name: file })} /> + onUpload={(file) => act('PRG_copytousb', { name: file })} + onDelete={(file) => act('PRG_deletefile', { name: file })} + onRename={(file, newName) => + act('PRG_renamefile', { + name: file, + new_name: newName, + }) + } + onDuplicate={(file) => act('PRG_clone', { file: file })} + onToggleSilence={(file) => act('PRG_togglesilence', { name: file })} + />
{usbconnected && (
@@ -32,13 +30,16 @@ export const NtosFileManager = (props, context) => { usbmode files={usbfiles} usbconnected={usbconnected} - onUpload={file => act('PRG_copyfromusb', { name: file })} - onDelete={file => act('PRG_usbdeletefile', { name: file })} - onRename={(file, newName) => act('PRG_usbrenamefile', { - name: file, - new_name: newName, - })} - onDuplicate={file => act('PRG_clone', { file: file })} /> + onUpload={(file) => act('PRG_copyfromusb', { name: file })} + onDelete={(file) => act('PRG_usbdeletefile', { name: file })} + onRename={(file, newName) => + act('PRG_usbrenamefile', { + name: file, + new_name: newName, + }) + } + onDuplicate={(file) => act('PRG_clone', { file: file })} + />
)} @@ -46,7 +47,7 @@ export const NtosFileManager = (props, context) => { ); }; -const FileTable = props => { +const FileTable = (props) => { const { files = [], usbconnected, @@ -59,17 +60,11 @@ const FileTable = props => { return ( - - File - - - Type - - - Size - + File + Type + Size - {files.map(file => ( + {files.map((file) => ( {!file.undeletable ? ( @@ -78,24 +73,22 @@ const FileTable = props => { content={file.name} currentValue={file.name} tooltip="Rename" - onCommit={(e, value) => onRename(file.name, value)} /> + onCommit={(e, value) => onRename(file.name, value)} + /> ) : ( file.name )} - - {file.type} - - - {file.size} - + {file.type} + {file.size} {!!file.alert_able && ( + )} diff --git a/tgui/packages/tgui/interfaces/NtosJobManager.js b/tgui/packages/tgui/interfaces/NtosJobManager.js index 70e3a9e0b967fe..fe1a8681849a0d 100644 --- a/tgui/packages/tgui/interfaces/NtosJobManager.js +++ b/tgui/packages/tgui/interfaces/NtosJobManager.js @@ -4,9 +4,7 @@ import { NtosWindow } from '../layouts'; export const NtosJobManager = (props, context) => { return ( - + @@ -16,12 +14,7 @@ export const NtosJobManager = (props, context) => { export const NtosJobManagerContent = (props, context) => { const { act, data } = useBackend(context); - const { - authed, - cooldown, - slots = [], - prioritized = [], - } = data; + const { authed, cooldown, slots = [], prioritized = [] } = data; if (!authed) { return ( @@ -33,37 +26,30 @@ export const NtosJobManagerContent = (props, context) => {
{cooldown > 0 && ( - + On Cooldown: {cooldown}s )}
- - Prioritized - - - Slots - + Prioritized + Slots - {slots.map(slot => ( - - + {slots.map((slot) => ( + + 0 && prioritized.includes(slot.title)} - onClick={() => act('PRG_priority', { - target: slot.title, - })} /> + onClick={() => + act('PRG_priority', { + target: slot.title, + }) + } + /> {slot.current} / {slot.total} @@ -72,15 +58,21 @@ export const NtosJobManagerContent = (props, context) => { - )} - {removable_media.map(device => ( + {removable_media.map((device) => (
ID Name: {login.IDName} ({proposed_login.IDName}) @@ -104,9 +104,11 @@ export const NtosMain = (props, context) => { icon="eject" color="transparent" content="Eject pAI" - onClick={() => act('PC_Pai_Interact', { - option: "eject", - })} + onClick={() => + act('PC_Pai_Interact', { + option: 'eject', + }) + } /> @@ -117,9 +119,11 @@ export const NtosMain = (props, context) => { icon="cat" color="transparent" content="Configure pAI" - onClick={() => act('PC_Pai_Interact', { - option: "interact", - })} + onClick={() => + act('PC_Pai_Interact', { + option: 'interact', + }) + } /> @@ -128,7 +132,7 @@ export const NtosMain = (props, context) => { )}
- {programs.map(program => ( + {programs.map((program) => (
- {disk_programs.map(program => ( + {disk_programs.map((program) => ( @@ -188,15 +172,17 @@ export const NtosMessenger = (props, context) => {
- {messengers.map(messenger => ( + {messengers.map((messenger) => ( ))} @@ -211,9 +197,7 @@ export const NtosMessenger = (props, context) => { )}
- {(!owner && !isSilicon) && ( - - )} + {!owner && !isSilicon && } ); diff --git a/tgui/packages/tgui/interfaces/NtosNetChat.js b/tgui/packages/tgui/interfaces/NtosNetChat.js index 9a573a44ad7d94..bf9dfc4e763ec8 100644 --- a/tgui/packages/tgui/interfaces/NtosNetChat.js +++ b/tgui/packages/tgui/interfaces/NtosNetChat.js @@ -8,9 +8,9 @@ const CLIENT_AWAY = 1; const CLIENT_OFFLINE = 0; const STATUS2TEXT = { - 0: "Offline", - 1: "Away", - 2: "Online", + 0: 'Offline', + 1: 'Away', + 2: 'Online', }; const NoChannelDimmer = (props, context) => { @@ -22,24 +22,13 @@ const NoChannelDimmer = (props, context) => { - + - + - + @@ -70,8 +59,8 @@ export const NtosNetChat = (props, context) => { clients = [], messages = [], } = data; - const in_channel = (active_channel !== null); - const authorized = (authed || adminmode); + const in_channel = active_channel !== null; + const authorized = authed || adminmode; // this list has cliented ordered from their status. online > away > offline const displayed_clients = clients.sort((clientA, clientB) => { if (clientA.operator) { @@ -84,24 +73,22 @@ export const NtosNetChat = (props, context) => { }); const client_color = (client) => { if (client.operator) { - return "green"; + return 'green'; } switch (client.status) { case CLIENT_ONLINE: - return "white"; + return 'white'; case CLIENT_AWAY: - return "yellow"; + return 'yellow'; case CLIENT_OFFLINE: default: - return "label"; + return 'label'; } }; // client from this computer! - const this_client = clients.find(client => client.ref === selfref); + const this_client = clients.find((client) => client.ref === selfref); return ( - + @@ -111,40 +98,48 @@ export const NtosNetChat = (props, context) => { act('PRG_newchannel', { - new_channel_name: value, - })} /> - {all_channels.map(channel => ( + onCommit={(e, value) => + act('PRG_newchannel', { + new_channel_name: value, + }) + } + /> + {all_channels.map((channel) => (
Level - - Level Progress - - - Overall Progress - + Level Progress + Overall Progress @@ -47,9 +33,13 @@ export const NtosSkillTracker = (props, context) => { good: [0.75, 1.0], }}> % + value={Math.round(skill.progress_percent * 100)} + /> + % - ) : ('—')} + ) : ( + '—' + )} {skill.overall_percent ? ( @@ -59,9 +49,13 @@ export const NtosSkillTracker = (props, context) => { good: [0.75, 1.0], }}> % + value={Math.round(skill.overall_percent * 100)} + /> + % - ) : ('—')} + ) : ( + '—' + )} {!!skill.reward && ( @@ -70,7 +64,9 @@ export const NtosSkillTracker = (props, context) => { diff --git a/tgui/packages/tgui/interfaces/NtosStationAlertConsole.js b/tgui/packages/tgui/interfaces/NtosStationAlertConsole.tsx similarity index 84% rename from tgui/packages/tgui/interfaces/NtosStationAlertConsole.js rename to tgui/packages/tgui/interfaces/NtosStationAlertConsole.tsx index e39a38dd737344..a3c9ae8f00f925 100644 --- a/tgui/packages/tgui/interfaces/NtosStationAlertConsole.js +++ b/tgui/packages/tgui/interfaces/NtosStationAlertConsole.tsx @@ -3,9 +3,7 @@ import { StationAlertConsoleContent } from './StationAlertConsole'; export const NtosStationAlertConsole = () => { return ( - + diff --git a/tgui/packages/tgui/interfaces/NtosStatus.js b/tgui/packages/tgui/interfaces/NtosStatus.tsx similarity index 55% rename from tgui/packages/tgui/interfaces/NtosStatus.js rename to tgui/packages/tgui/interfaces/NtosStatus.tsx index 64ad2e81e30cb3..b8e4a13483c07d 100644 --- a/tgui/packages/tgui/interfaces/NtosStatus.js +++ b/tgui/packages/tgui/interfaces/NtosStatus.tsx @@ -2,35 +2,39 @@ import { useBackend } from '../backend'; import { NtosWindow } from '../layouts'; import { Input, Section, Button } from '../components'; +type Data = { + upper: string; + lower: string; +}; + export const NtosStatus = (props, context) => { - const { act, data } = useBackend(context); - const { - upper, - lower, - } = data; + const { act, data } = useBackend(context); + const { upper, lower } = data; return ( - +
act('stat_update', { - position: "upper", - text: value, - })} + onChange={(_, value) => + act('stat_update', { + position: 'upper', + text: value, + }) + } />
act('stat_update', { - position: "lower", - text: value, - })} + onChange={(_, value) => + act('stat_update', { + position: 'lower', + text: value, + }) + } />
+ return ( + source.length > 0 && ( +
+ {things.map((thing) => ( +
+ ) ); }; @@ -61,19 +68,19 @@ const OrbitedButton = (props, context) => { return ( @@ -82,17 +89,14 @@ const OrbitedButton = (props, context) => { export const Orbit = (props, context) => { const { act, data } = useBackend(context); - const { - alive, - antagonists, - dead, - ghosts, - misc, - npcs, - } = data; - - const [searchText, setSearchText] = useLocalState(context, "searchText", ""); - const [autoObserve, setAutoObserve] = useLocalState(context, "autoObserve", false); + const { alive, antagonists, dead, ghosts, misc, npcs } = data; + + const [searchText, setSearchText] = useLocalState(context, 'searchText', ''); + const [autoObserve, setAutoObserve] = useLocalState( + context, + 'autoObserve', + false + ); const collatedAntagonists = {}; for (const antagonist of antagonists) { @@ -107,16 +111,20 @@ export const Orbit = (props, context) => { return compareString(a[0], b[0]); }); - const orbitMostRelevant = searchText => { + const orbitMostRelevant = (searchText) => { for (const source of [ sortedAntagonists.map(([_, antags]) => antags), - alive, ghosts, dead, npcs, misc, + alive, + ghosts, + dead, + npcs, + misc, ]) { const member = source .filter(searchFor(searchText)) .sort(compareNumberedText)[0]; if (member !== undefined) { - act("orbit", { + act('orbit', { ref: member.ref, auto_observe: autoObserve, }); @@ -126,17 +134,12 @@ export const Orbit = (props, context) => { }; return ( - +
- + { fluid value={searchText} onInput={(_, value) => setSearchText(value)} - onEnter={(_, value) => orbitMostRelevant(value)} /> + onEnter={(_, value) => orbitMostRelevant(value)} + /> @@ -158,8 +162,9 @@ export const Orbit = (props, context) => { see the UI / full inventory of whoever you're orbiting. Neat!`} tooltipPosition="bottom-start" selected={autoObserve} - icon={autoObserve ? "toggle-on" : "toggle-off"} - onClick={() => setAutoObserve(!autoObserve)} /> + icon={autoObserve ? 'toggle-on' : 'toggle-off'} + onClick={() => setAutoObserve(!autoObserve)} + />
@@ -179,7 +185,7 @@ export const Orbit = (props, context) => { {antags .filter(searchFor(searchText)) .sort(compareNumberedText) - .map(antag => ( + .map((antag) => ( { {alive .filter(searchFor(searchText)) .sort(compareNumberedText) - .map(thing => ( + .map((thing) => ( + autoObserve={autoObserve} + /> ))} @@ -209,12 +216,13 @@ export const Orbit = (props, context) => { {ghosts .filter(searchFor(searchText)) .sort(compareNumberedText) - .map(thing => ( + .map((thing) => ( + autoObserve={autoObserve} + /> ))} @@ -225,17 +233,9 @@ export const Orbit = (props, context) => { autoObserve={autoObserve} /> - + - +
); diff --git a/tgui/packages/tgui/interfaces/OreBox.js b/tgui/packages/tgui/interfaces/OreBox.tsx similarity index 62% rename from tgui/packages/tgui/interfaces/OreBox.js rename to tgui/packages/tgui/interfaces/OreBox.tsx index 326385e7066d1a..c031fa96b36b23 100644 --- a/tgui/packages/tgui/interfaces/OreBox.js +++ b/tgui/packages/tgui/interfaces/OreBox.tsx @@ -3,35 +3,39 @@ import { Box, Button, Section, Table } from '../components'; import { useBackend } from '../backend'; import { Window } from '../layouts'; +type Data = { + materials: Material[]; +}; + +type Material = { + type: string; + name: string; + amount: number; +}; + +const OREBOX_INFO = `All ores will be placed in here when you are wearing a +mining stachel on your belt or in a pocket while dragging the ore box.`; + export const OreBox = (props, context) => { - const { act, data } = useBackend(context); + const { act, data } = useBackend(context); const { materials } = data; + return ( - +
act('removeall')} /> - )}> + buttons={
- - Ore - + Ore Amount - {materials.map(material => ( + {materials.map((material) => ( - - {toTitleCase(material.name)} - + {toTitleCase(material.name)} {material.amount} @@ -43,8 +47,7 @@ export const OreBox = (props, context) => {
- All ores will be placed in here when you are wearing a mining - stachel on your belt or in a pocket while dragging the ore box. + {OREBOX_INFO}
Gibtonite is not accepted.
diff --git a/tgui/packages/tgui/interfaces/OreRedemptionMachine.js b/tgui/packages/tgui/interfaces/OreRedemptionMachine.js index 90edb693b37d0c..24f81c5bafe3cf 100644 --- a/tgui/packages/tgui/interfaces/OreRedemptionMachine.js +++ b/tgui/packages/tgui/interfaces/OreRedemptionMachine.js @@ -5,22 +5,14 @@ import { Window } from '../layouts'; export const OreRedemptionMachine = (props, context) => { const { act, data } = useBackend(context); - const { - unclaimedPoints, - materials, - alloys, - diskDesigns, - hasDisk, - } = data; + const { unclaimedPoints, materials, alloys, diskDesigns, hasDisk } = data; return ( - +
- This machine only accepts ore.
+ This machine only accepts ore. +
Gibtonite and Slag are not accepted.
@@ -32,20 +24,22 @@ export const OreRedemptionMachine = (props, context) => { ml={2} content="Claim" disabled={unclaimedPoints === 0} - onClick={() => act('Claim')} /> + onClick={() => act('Claim')} + />
- {hasDisk && ( + {(hasDisk && ( <>
- {diskDesigns.map(design => ( + {diskDesigns.map((design) => ( File {design.index}: {design.name} @@ -54,44 +48,54 @@ export const OreRedemptionMachine = (props, context) => {
- ) || ( + )) || (
- {materials.map(material => ( + {materials.map((material) => ( act('Release', { - id: material.id, - sheets: amount, - })} /> + onRelease={(amount) => + act('Release', { + id: material.id, + sheets: amount, + }) + } + /> ))}
- {alloys.map(material => ( + {alloys.map((material) => ( act('Smelt', { - id: material.id, - sheets: amount, - })} /> + onRelease={(amount) => + act('Smelt', { + id: material.id, + sheets: amount, + }) + } + /> ))}
@@ -100,21 +104,19 @@ export const OreRedemptionMachine = (props, context) => { ); }; - const MaterialRow = (props, context) => { const { material, onRelease } = props; - const [ - amount, - setAmount, - ] = useLocalState(context, "amount" + material.name, 1); + const [amount, setAmount] = useLocalState( + context, + 'amount' + material.name, + 1 + ); const amountAvailable = Math.floor(material.amount); return ( - - {toTitleCase(material.name).replace('Alloy', '')} - + {toTitleCase(material.name).replace('Alloy', '')} {material.value && material.value + ' cr'} @@ -133,11 +135,13 @@ const MaterialRow = (props, context) => { minValue={1} maxValue={50} value={amount} - onChange={(e, value) => setAmount(value)} /> + onChange={(e, value) => setAmount(value)} + />
@@ -604,22 +640,13 @@ const ORION_STATUS_MARKET = (props, context) => { export const OrionGame = (props, context) => { const { act, data } = useBackend(context); - const { - gamestatus, - gamename, - eventname, - } = data; + const { gamestatus, gamename, eventname } = data; const GameStatusComponent = STATUS2COMPONENT[gamestatus].component(); const MarketRaid = STATUS2COMPONENT[2].component(); return ( - + - {eventname === "Space Port Raid" && ( - - ) || ( + {(eventname === 'Space Port Raid' && ) || ( )} diff --git a/tgui/packages/tgui/interfaces/OutfitEditor.js b/tgui/packages/tgui/interfaces/OutfitEditor.js index b44b8f7369a6cc..bb3658fc318f80 100644 --- a/tgui/packages/tgui/interfaces/OutfitEditor.js +++ b/tgui/packages/tgui/interfaces/OutfitEditor.js @@ -6,10 +6,7 @@ export const OutfitEditor = (props, context) => { const { act, data } = useBackend(context); const { outfit, saveable, dummy64 } = data; return ( - + { src={`data:image/jpeg;base64,${dummy64}`} style={{ '-ms-interpolation-mode': 'nearest-neighbor', - }} /> + }} + />
- { color="transparent" icon="pencil-alt" title="Rename this outfit" - onClick={() => act("rename", {})} /> + onClick={() => act('rename', {})} + /> {outfit.name} @@ -45,20 +45,25 @@ export const OutfitEditor = (props, context) => { color="transparent" icon="info" tooltip="Ctrl-click a button to select *any* item instead of what will probably fit in that slot." - tooltipPosition="bottom-start" /> + tooltipPosition="bottom-start" + />
@@ -106,10 +125,12 @@ const OutfitSlot = (props, context) => { const currItem = outfit[slot]; return ( - @@ -122,13 +143,15 @@ const OutfitSlot = (props, context) => { title={currItem?.desc} style={{ '-ms-interpolation-mode': 'nearest-neighbor', - }} /> + }} + /> act("clear", { slot })} /> + onClick={() => act('clear', { slot })} + /> )}
@@ -140,7 +163,7 @@ const OutfitSlot = (props, context) => { 'text-overflow': 'ellipsis', }} title={currItem?.path}> - {currItem?.name || "Empty"} + {currItem?.name || 'Empty'} ); diff --git a/tgui/packages/tgui/interfaces/OutfitManager.js b/tgui/packages/tgui/interfaces/OutfitManager.js index ed7b835897f1a9..5552fc2f2c4378 100644 --- a/tgui/packages/tgui/interfaces/OutfitManager.js +++ b/tgui/packages/tgui/interfaces/OutfitManager.js @@ -6,11 +6,7 @@ export const OutfitManager = (props, context) => { const { act, data } = useBackend(context); const { outfits } = data; return ( - +
{ icon="file-upload" tooltip="Load an outfit from a file" tooltipPosition="left" - onClick={() => act("load")} /> + onClick={() => act('load')} + /> diff --git a/tgui/packages/tgui/interfaces/PaintingAdminPanel.tsx b/tgui/packages/tgui/interfaces/PaintingAdminPanel.tsx index d2d6e42ef3de67..dbe3c1dfee1d50 100644 --- a/tgui/packages/tgui/interfaces/PaintingAdminPanel.tsx +++ b/tgui/packages/tgui/interfaces/PaintingAdminPanel.tsx @@ -9,37 +9,38 @@ type PaintingAdminPanelData = { }; type PaintingData = { - md5: string, - title: string, - creator_ckey: string, - creator_name: string | null, - creation_date: Date | null, - creation_round_id: number | null, - patron_ckey: string | null, - patron_name: string | null, - credit_value: number, - width: number, - height: number, - ref: string, - tags: string[] | null, - medium: string | null -} + md5: string; + title: string; + creator_ckey: string; + creator_name: string | null; + creation_date: Date | null; + creation_round_id: number | null; + patron_ckey: string | null; + patron_name: string | null; + credit_value: number; + width: number; + height: number; + ref: string; + tags: string[] | null; + medium: string | null; +}; export const PaintingAdminPanel = (props, context) => { const { act, data } = useBackend(context); - const [chosenPaintingRef, setChosenPaintingRef] = useLocalState(context, 'chosenPainting', null); - const { - paintings, - } = data; - const chosenPainting = paintings.find(p => p.ref === chosenPaintingRef); + const [chosenPaintingRef, setChosenPaintingRef] = useLocalState< + string | null + >(context, 'chosenPainting', null); + const { paintings } = data; + const chosenPainting = paintings.find((p) => p.ref === chosenPaintingRef); return ( - + {chosenPainting && ( -
setChosenPaintingRef(null)}>Close}> +
setChosenPaintingRef(null)}>Close + }> { style={{ 'vertical-align': 'middle', '-ms-interpolation-mode': 'nearest-neighbor', - }} /> + }} + /> - {decodeHtmlEntities(chosenPainting.title)} - + { + setChosenPaintingRef(null); + act('delete', { ref: chosenPainting.ref }); + }}> + Delete + +
)} @@ -96,23 +146,22 @@ export const PaintingAdminPanel = (props, context) => { Preview Actions - {paintings.map(painting => ( - - + {paintings.map((painting) => ( + + {decodeHtmlEntities(painting.title)} {painting.creator_ckey} - + +
@@ -95,10 +96,7 @@ export const PaintingMachine = (props, context) => { }; export const EjectButton = (props, context) => { - const { - name, - onClickEject, - } = props; + const { name, onClickEject } = props; return ( ); @@ -239,7 +240,7 @@ const AntibodyInfoDisplay = (_, context) => { }; /** Displays info for the loaded blood, if any */ -const SpecimenDisplay = (_, context) => { +const SpecimenDisplay = (props, context) => { const { act, data } = useBackend(context); const [tab, setTab] = useLocalState(context, 'tab', 0); const { is_ready, viruses = [] } = data; @@ -271,7 +272,8 @@ const SpecimenDisplay = (_, context) => { onClick={() => act('create_culture_bottle', { index: virus.index, - })} + }) + } /> @@ -281,8 +283,7 @@ const SpecimenDisplay = (_, context) => { - {virus?.symptoms - && } + {virus?.symptoms && }
@@ -352,7 +353,8 @@ const VirusTextInfo = (props: VirusInfoProps, context) => { act('rename_disease', { index: virus.index, name: value, - })} + }) + } /> ) : ( {virus.name} diff --git a/tgui/packages/tgui/interfaces/PaperSheet.js b/tgui/packages/tgui/interfaces/PaperSheet.js index 7994a992995ebc..fb641e33d560c2 100644 --- a/tgui/packages/tgui/interfaces/PaperSheet.js +++ b/tgui/packages/tgui/interfaces/PaperSheet.js @@ -22,55 +22,85 @@ const MAX_PAPER_LENGTH = 5000; // Question, should we send this with ui_data? // Hacky, yes, works?...yes const textWidth = (text, font, fontsize) => { // default font height is 12 in tgui - font = fontsize + "x " + font; + font = fontsize + 'x ' + font; const c = document.createElement('canvas'); - const ctx = c.getContext("2d"); + const ctx = c.getContext('2d'); ctx.font = font; const width = ctx.measureText(text).width; return width; }; -const setFontinText = (text, font, color, bold=false) => { - return "" + text + ""; +const setFontinText = (text, font, color, bold = false) => { + return ( + '' + + text + + '' + ); }; -const createIDHeader = index => { - return "paperfield_" + index; +const createIDHeader = (index) => { + return 'paperfield_' + index; }; // To make a field you do a [_______] or however long the field is // we will then output a TEXT input for it that hopefully covers // the exact amount of spaces const field_regex = /\[(_+)\]/g; -const field_tag_regex = /\[paperfield_\d+)"(.*?)\/>\]/gm; -const sign_regex = /%s(?:ign)?(?=\\s|$)?/igm; +const field_tag_regex = + /\[paperfield_\d+)"(.*?)\/>\]/gm; +const sign_regex = /%s(?:ign)?(?=\\s|$)?/gim; -const createInputField = (length, width, font, - fontsize, color, id) => { - return "[]"; +const createInputField = (length, width, font, fontsize, color, id) => { + return ( + '[]' + ); }; const createFields = (txt, font, fontsize, color, counter) => { const ret_text = txt.replace(field_regex, (match, p1, offset, string) => { - const width = textWidth(match, font, fontsize) + "px"; - return createInputField(p1.length, - width, font, fontsize, color, createIDHeader(counter++)); + const width = textWidth(match, font, fontsize) + 'px'; + return createInputField( + p1.length, + width, + font, + fontsize, + color, + createIDHeader(counter++) + ); }); return { counter, @@ -80,14 +110,14 @@ const createFields = (txt, font, fontsize, color, counter) => { const signDocument = (txt, color, user) => { return txt.replace(sign_regex, () => { - return setFontinText(user, "Times New Roman", color, true); + return setFontinText(user, 'Times New Roman', color, true); }); }; -const run_marked_default = value => { +const run_marked_default = (value) => { // Override function, any links and images should // kill any other marked tokens we don't want here - const walkTokens = token => { + const walkTokens = (token) => { switch (token.type) { case 'url': case 'autolink': @@ -97,7 +127,7 @@ const run_marked_default = value => { token.type = 'text'; // Once asset system is up change to some default image // or rewrite for icon images - token.href = ""; + token.href = ''; break; } }; @@ -112,17 +142,17 @@ const run_marked_default = value => { }; /* -** This gets the field, and finds the dom object and sees if -** the user has typed something in. If so, it replaces, -** the dom object, in txt with the value, spaces so it -** fits the [] format and saves the value into a object -** There may be ways to optimize this in javascript but -** doing this in byond is nightmarish. -** -** It returns any values that were saved and a corrected -** html code or null if nothing was updated -*/ -const checkAllFields = (txt, font, color, user_name, bold=false) => { + ** This gets the field, and finds the dom object and sees if + ** the user has typed something in. If so, it replaces, + ** the dom object, in txt with the value, spaces so it + ** fits the [] format and saves the value into a object + ** There may be ways to optimize this in javascript but + ** doing this in byond is nightmarish. + ** + ** It returns any values that were saved and a corrected + ** html code or null if nothing was updated + */ +const checkAllFields = (txt, font, color, user_name, bold = false) => { let matches; let values = {}; let replace = []; @@ -137,7 +167,7 @@ const checkAllFields = (txt, font, color, user_name, bold=false) => { const dom = document.getElementById(id); // make sure we got data, and kill any html that might // be in it - const dom_text = dom && dom.value ? dom.value : ""; + const dom_text = dom && dom.value ? dom.value : ''; if (dom_text.length === 0) { continue; } @@ -149,47 +179,46 @@ const checkAllFields = (txt, font, color, user_name, bold=false) => { const target = dom.cloneNode(true); // in case they sign in a field if (sanitized_text.match(sign_regex)) { - target.style.fontFamily = "Times New Roman"; + target.style.fontFamily = 'Times New Roman'; bold = true; target.defaultValue = user_name; - } - else { + } else { target.style.fontFamily = font; target.defaultValue = sanitized_text; } if (bold) { - target.style.fontWeight = "bold"; + target.style.fontWeight = 'bold'; } target.style.color = color; target.disabled = true; const wrap = document.createElement('div'); wrap.appendChild(target); values[id] = sanitized_text; // save the data - replace.push({ value: "[" + wrap.innerHTML + "]", raw_text: full_match }); + replace.push({ value: '[' + wrap.innerHTML + ']', raw_text: full_match }); } } if (replace.length > 0) { for (const o of replace) { - txt = txt.replace(o.raw_text, o.value); } } return { text: txt, fields: values }; }; -const pauseEvent = e => { - if (e.stopPropagation) { e.stopPropagation(); } - if (e.preventDefault) { e.preventDefault(); } - e.cancelBubble=true; - e.returnValue=false; +const pauseEvent = (e) => { + if (e.stopPropagation) { + e.stopPropagation(); + } + if (e.preventDefault) { + e.preventDefault(); + } + e.cancelBubble = true; + e.returnValue = false; return false; }; const Stamp = (props, context) => { - const { - image, - opacity, - } = props; + const { image, opacity } = props; const stamp_transform = { 'left': image.x + 'px', 'top': image.y + 'px', @@ -199,15 +228,12 @@ const Stamp = (props, context) => { return (
+ className={classes(['Paper__Stamp', image.sprite])} + style={stamp_transform} + /> ); }; - const setInputReadonly = (text, readonly) => { return readonly ? text.replace(/ { // got to make this a full component if we // want to control updates const PaperSheetView = (props, context) => { - const { - value = "", - stamps = [], - backgroundColor, - readOnly, - } = props; + const { value = '', stamps = [], backgroundColor, readOnly } = props; const stamp_list = stamps; const text_html = { - __html: '' - + setInputReadonly(value, readOnly) - + '', + __html: + '' + + setInputReadonly(value, readOnly) + + '', }; return ( + height="100%"> + p="10px" + /> {stamp_list.map((o, i) => ( - + ))} ); @@ -260,22 +285,28 @@ class PaperSheetStamper extends Component { rotate: 0, }; this.style = null; - this.handleMouseMove = e => { + this.handleMouseMove = (e) => { const pos = this.findStampPosition(e); - if (!pos) { return; } + if (!pos) { + return; + } // center offset of stamp & rotate pauseEvent(e); this.setState({ x: pos[0], y: pos[1], rotate: pos[2] }); }; - this.handleMouseClick = e => { - if (e.pageY <= 30) { return; } + this.handleMouseClick = (e) => { + if (e.pageY <= 30) { + return; + } const { act, data } = useBackend(this.context); const stamp_obj = { - x: this.state.x, y: this.state.y, r: this.state.rotate, + x: this.state.x, + y: this.state.y, + r: this.state.rotate, stamp_class: this.props.stamp_class, stamp_icon_state: data.stamp_icon_state, }; - act("stamp", stamp_obj); + act('stamp', stamp_obj); }; } @@ -286,30 +317,30 @@ class PaperSheetStamper extends Component { rotating = true; } - if (document.getElementById("stamp")) - { - const stamp = document.getElementById("stamp"); + if (document.getElementById('stamp')) { + const stamp = document.getElementById('stamp'); const stampHeight = stamp.clientHeight; const stampWidth = stamp.clientWidth; - const currentHeight = rotating ? this.state.y : e.pageY - - windowRef.scrollTop - stampHeight; - const currentWidth = rotating ? this.state.x : e.pageX - (stampWidth / 2); + const currentHeight = rotating + ? this.state.y + : e.pageY - windowRef.scrollTop - stampHeight; + const currentWidth = rotating ? this.state.x : e.pageX - stampWidth / 2; const widthMin = 0; const heightMin = 0; - const widthMax = (windowRef.clientWidth) - ( - stampWidth); - const heightMax = (windowRef.clientHeight - windowRef.scrollTop) - ( - stampHeight); + const widthMax = windowRef.clientWidth - stampWidth; + const heightMax = + windowRef.clientHeight - windowRef.scrollTop - stampHeight; const radians = Math.atan2( e.pageX - currentWidth, e.pageY - currentHeight ); - const rotate = rotating ? (radians * (180 / Math.PI) * -1) + const rotate = rotating + ? radians * (180 / Math.PI) * -1 : this.state.rotate; const pos = [ @@ -322,21 +353,17 @@ class PaperSheetStamper extends Component { } componentDidMount() { - document.addEventListener("mousemove", this.handleMouseMove); - document.addEventListener("click", this.handleMouseClick); + document.addEventListener('mousemove', this.handleMouseMove); + document.addEventListener('click', this.handleMouseClick); } componentWillUnmount() { - document.removeEventListener("mousemove", this.handleMouseMove); - document.removeEventListener("click", this.handleMouseClick); + document.removeEventListener('mousemove', this.handleMouseMove); + document.removeEventListener('click', this.handleMouseClick); } render() { - const { - value, - stamp_class, - stamps, - } = this.props; + const { value, stamp_class, stamps } = this.props; const stamp_list = stamps || []; const current_pos = { sprite: stamp_class, @@ -346,13 +373,8 @@ class PaperSheetStamper extends Component { }; return ( <> - - + + ); } @@ -367,7 +389,7 @@ const createPreview = ( color, font, user_name, - is_crayon = false, + is_crayon = false ) => { const out = { text: text }; // check if we are adding to paper, if not @@ -376,19 +398,23 @@ const createPreview = ( value = value.trim(); if (value.length > 0) { // First lets make sure it ends in a new line - value += value[value.length] === "\n" ? " \n" : "\n \n"; + value += value[value.length] === '\n' ? ' \n' : '\n \n'; // Second, we sanitize the text of html const sanitized_text = sanitizeText(value); const signed_text = signDocument(sanitized_text, color, user_name); // Third we replace the [__] with fields as markedjs fucks them up const fielded_text = createFields( - signed_text, font, 12, color, field_counter); + signed_text, + font, + 12, + color, + field_counter + ); // Fourth, parse the text using markup const formatted_text = run_marked_default(fielded_text.text); // Fifth, we wrap the created text in the pin color, and font. // crayon is bold ( tags), maybe make fountain pin italic? - const fonted_text = setFontinText( - formatted_text, font, color, is_crayon); + const fonted_text = setFontinText(formatted_text, font, color, is_crayon); out.text += fonted_text; out.field_counter = fielded_text.counter; } @@ -397,7 +423,12 @@ const createPreview = ( // if any data was entered by the user and // if it was return the data and modify the text const final_processing = checkAllFields( - out.text, font, color, user_name, is_crayon); + out.text, + font, + color, + user_name, + is_crayon + ); out.text = final_processing.text; out.form_fields = final_processing.fields; } @@ -411,37 +442,40 @@ class PaperSheetEdit extends Component { constructor(props, context) { super(props, context); this.state = { - previewSelected: "Preview", - old_text: props.value || "", + previewSelected: 'Preview', + old_text: props.value || '', counter: props.counter || 0, - textarea_text: "", - combined_text: props.value || "", + textarea_text: '', + combined_text: props.value || '', }; } createPreviewFromData(value, do_fields = false) { const { data } = useBackend(this.context); - return createPreview(value, + return createPreview( + value, this.state.old_text, do_fields, this.state.counter, data.pen_color, data.pen_font, data.edit_usr, - data.is_crayon, + data.is_crayon ); } onInputHandler(e, value) { if (value !== this.state.textarea_text) { - const combined_length = this.state.old_text.length - + this.state.textarea_text.length; + const combined_length = + this.state.old_text.length + this.state.textarea_text.length; if (combined_length > MAX_PAPER_LENGTH) { - if ((combined_length - MAX_PAPER_LENGTH) >= value.length) { + if (combined_length - MAX_PAPER_LENGTH >= value.length) { // Basically we cannot add any more text to the paper value = ''; } else { - value = value.substr(0, value.length - - (combined_length - MAX_PAPER_LENGTH)); + value = value.substr( + 0, + value.length - (combined_length - MAX_PAPER_LENGTH) + ); } // we check again to save an update if (value === this.state.textarea_text) { @@ -460,107 +494,108 @@ class PaperSheetEdit extends Component { const { act } = useBackend(this.context); const final_processing = this.createPreviewFromData(new_text, true); act('save', final_processing); - this.setState(() => { return { - textarea_text: "", - previewSelected: "save", - combined_text: final_processing.text, - old_text: final_processing.text, - counter: final_processing.field_counter, - }; }); + this.setState(() => { + return { + textarea_text: '', + previewSelected: 'save', + combined_text: final_processing.text, + old_text: final_processing.text, + counter: final_processing.field_counter, + }; + }); // byond should switch us to readonly mode from here } render() { - const { - textColor, - fontFamily, - stamps, - backgroundColor, - } = this.props; + const { textColor, fontFamily, stamps, backgroundColor } = this.props; return ( - + this.setState({ previewSelected: "Edit" })}> + backgroundColor={ + this.state.previewSelected === 'Edit' ? 'grey' : 'white' + } + selected={this.state.previewSelected === 'Edit'} + onClick={() => this.setState({ previewSelected: 'Edit' })}> Edit this.setState(() => { - const new_state = { - previewSelected: "Preview", - textarea_text: this.state.textarea_text, - combined_text: this.createPreviewFromData( - this.state.textarea_text).text, - }; - return new_state; - })}> + backgroundColor={ + this.state.previewSelected === 'Preview' ? 'grey' : 'white' + } + selected={this.state.previewSelected === 'Preview'} + onClick={() => + this.setState(() => { + const new_state = { + previewSelected: 'Preview', + textarea_text: this.state.textarea_text, + combined_text: this.createPreviewFromData( + this.state.textarea_text + ).text, + }; + return new_state; + }) + }> Preview { - if (this.state.previewSelected === "confirm") { + if (this.state.previewSelected === 'confirm') { this.finalUpdate(this.state.textarea_text); - } - else if (this.state.previewSelected === "Edit") { + } else if (this.state.previewSelected === 'Edit') { this.setState(() => { const new_state = { - previewSelected: "confirm", + previewSelected: 'confirm', textarea_text: this.state.textarea_text, combined_text: this.createPreviewFromData( - this.state.textarea_text).text, + this.state.textarea_text + ).text, }; return new_state; }); - } - else { - this.setState({ previewSelected: "confirm" }); + } else { + this.setState({ previewSelected: 'confirm' }); } }}> - {this.state.previewSelected === "confirm" ? "Confirm" : "Save"} + {this.state.previewSelected === 'confirm' ? 'Confirm' : 'Save'} - - {this.state.previewSelected === "Edit" && ( + + {(this.state.previewSelected === 'Edit' && (