diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index ed255a80ce6..511a885dd0b 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -5,44 +5,20 @@ # to the same file or dir, add them to the end under Multiple Owners # GoldenAlpharex -/modular_skyrat/ @GoldenAlpharex +/.github/workflows/ @GoldenAlpharex +/SQL/ @GoldenAlpharex /tools/ @GoldenAlpharex - -# Jake Park -/modular_skyrat/modules/apocolypse_of_scythes/ @jjpark-kb -/modular_skyrat/modules/ash_chemical_centrifuge/ @jjpark-kb -/modular_skyrat/modules/ash_farming/ @jjpark-kb -/modular_skyrat/modules/ashwalker_change/ @jjpark-kb -/modular_skyrat/modules/ashwalker_shaman/ @jjpark-kb -/modular_skyrat/modules/borg_buffs/ @jjpark-kb -/modular_skyrat/modules/cargo_teleporter/ @jjpark-kb -/modular_skyrat/modules/conveyor_sorter/ @jjpark-kb -/modular_skyrat/modules/cortical_borer/ @jjpark-kb -/modular_skyrat/modules/connecting_computer/ @jjpark-kb -/modular_skyrat/modules/fishing/ @jjpark-kb -/modular_skyrat/modules/positronic_alert_console/ @jjpark-kb -/modular_skyrat/modules/primitive_production/ @jjpark-kb -/modular_skyrat/modules/reagent_forging/ @jjpark-kb -/modular_skyrat/modules/xenoarch/ @jjpark-kb +/modular_nova/ @GoldenAlpharex +/icons/ @GoldenAlpharex # Jolly-66 -/modular_skyrat/modules/mapping @Jolly-66 +/modular_nova/modules/mapping @Jolly-66 /tools/UpdatePaths @Jolly-66 -# LT3 -/code/modules/transport/ @lessthnthree -/modular_skyrat/master_files/code/controllers/subsystem/ @lessthnthree -/modular_skyrat/modules/advanced_engineering/ @lessthnthree -/modular_skyrat/modules/airlock_override/ @lessthnthree -/modular_skyrat/modules/alerts/ @lessthnthree -/modular_skyrat/modules/cme/ @lessthnthree -/modular_skyrat/modules/events/ @lessthnthree -/modular_skyrat/modules/ices_events/ @lessthnthree - # Multiple Owners # Maptainers -/_maps/ @Jolly-66 @KathrinBailey +/_maps/ @Jolly-66 # Expensive files that touching basically always cause performance problems ## Init times diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index c7af887cac4..14db6cf1297 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -164,7 +164,7 @@ If you are porting features/tools from other codebases, you must give them credi Regarding sprites & sounds, you must credit the artist and possibly the codebase. All /tg/station assets including icons and sound are under a [Creative Commons 3.0 BY-SA license](https://creativecommons.org/licenses/by-sa/3.0/) unless otherwise indicated. -Regarding sprites in particular, you still need to take your own screenshots of the sprites in-game on your Skyrat code in your PR body, not just re-use the screenshots provided in the original PR. +Regarding sprites in particular, you still need to take your own screenshots of the sprites in-game on your Nova Sector code in your PR body, not just re-use the screenshots provided in the original PR. ## Banned content Do not add any of the following in a Pull Request or risk getting the PR closed: diff --git a/.github/workflows/auto_changelog.yml b/.github/workflows/auto_changelog.yml index 7fde51b119b..cbdeccbc5a0 100644 --- a/.github/workflows/auto_changelog.yml +++ b/.github/workflows/auto_changelog.yml @@ -21,4 +21,4 @@ jobs: script: | const { processAutoChangelog } = await import('${{ github.workspace }}/tools/pull_request_hooks/autoChangelog.js') await processAutoChangelog({ github, context }) - github-token: ${{ secrets.SKYRATBOT_TOKEN || secrets.GITHUB_TOKEN }} + github-token: ${{ secrets.NOVABOT_TOKEN || secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/ci_suite.yml b/.github/workflows/ci_suite.yml index e5a0995c812..42e6d827c47 100644 --- a/.github/workflows/ci_suite.yml +++ b/.github/workflows/ci_suite.yml @@ -73,14 +73,14 @@ jobs: if: steps.linter-setup.conclusion == 'success' && !cancelled() run: | bash tools/ci/check_grep.sh - bash skyrat/tools/skyrat_check_grep.sh # SKYRAT EDIT ADDITION - checking modular_skyrat code + bash skyrat/tools/skyrat_check_grep.sh # NOVA EDIT ADDITION - checking modular_nova code bash fluffy/tools/fluffy_check_grep.sh # FLUFFY EDIT ADDITION - checking tff_modular code - name: Ticked File Enforcement if: steps.linter-setup.conclusion == 'success' && !cancelled() run: | tools/bootstrap/python tools/ticked_file_enforcement/ticked_file_enforcement.py < tools/ticked_file_enforcement/schemas/tgstation_dme.json tools/bootstrap/python tools/ticked_file_enforcement/ticked_file_enforcement.py < tools/ticked_file_enforcement/schemas/unit_tests.json - tools/bootstrap/python tools/ticked_file_enforcement/ticked_file_enforcement.py < tools/ticked_file_enforcement/schemas/modular_skyrat.json # SKYRAT EDIT ADDITION - modular tick enforcement + tools/bootstrap/python tools/ticked_file_enforcement/ticked_file_enforcement.py < tools/ticked_file_enforcement/schemas/modular_nova.json # NOVA EDIT ADDITION - modular tick enforcement - name: Check Define Sanity if: steps.linter-setup.conclusion == 'success' && !cancelled() run: tools/bootstrap/python -m define_sanity.check diff --git a/.github/workflows/codeowner_reviews.yml b/.github/workflows/codeowner_reviews.yml index a461a96d931..67f41af03cb 100644 --- a/.github/workflows/codeowner_reviews.yml +++ b/.github/workflows/codeowner_reviews.yml @@ -1,19 +1,21 @@ name: Codeowner Reviews # Controls when the workflow will run -on: pull_request_target +on: + pull_request_target: + types: [opened, synchronize, reopened, ready_for_review] jobs: assign-users: runs-on: ubuntu-latest - steps: # Checks-out your repository under $GITHUB_WORKSPACE, so the job can access it - uses: actions/checkout@v3 - #Parse the Codeowner file + #Parse the Codeowner file on non draft PRs - name: CodeOwnersParser + if: github.event.pull_request.draft == false id: CodeOwnersParser uses: tgstation/CodeOwnersParser@v1 diff --git a/.github/workflows/compile_changelogs.yml b/.github/workflows/compile_changelogs.yml index 7983138649e..291f2994da9 100644 --- a/.github/workflows/compile_changelogs.yml +++ b/.github/workflows/compile_changelogs.yml @@ -51,4 +51,4 @@ jobs: if: steps.value_holder.outputs.ACTIONS_ENABLED uses: ad-m/github-push-action@master with: - github_token: ${{ secrets.SKYRATBOT_TOKEN }} + github_token: ${{ secrets.NOVABOT_TOKEN ||secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml index 17f60f5255a..8e3f5638624 100644 --- a/.github/workflows/labeler.yml +++ b/.github/workflows/labeler.yml @@ -1,19 +1,17 @@ name: PR Labeler on: - push: - branches: - - master - pull_request_target: + - pull_request_target jobs: Label: + permissions: + contents: read + pull-requests: write runs-on: ubuntu-latest steps: - - name: Checkout - uses: actions/checkout@v4 - name: Apply labels based on changed files - if: github.event_name != 'push' + if: ${{ github.event_name != 'push'}} uses: actions/labeler@v5 with: repo-token: "${{ secrets.GITHUB_TOKEN }}" diff --git a/.github/workflows/tgs_test.yml b/.github/workflows/tgs_test.yml index 4925019bc6a..6a9316f493a 100644 --- a/.github/workflows/tgs_test.yml +++ b/.github/workflows/tgs_test.yml @@ -50,7 +50,7 @@ jobs: env: Database__DatabaseType: Sqlite Database__ConnectionString: Data Source=TGS_TGTest.sqlite3;Mode=ReadWriteCreate - General__ConfigVersion: 4.1.0 + General__ConfigVersion: 5.0.0 General__ApiPort: ${{ env.TGS_API_PORT }} General__SetupWizardMode: Never ports: @@ -59,7 +59,7 @@ jobs: - name: Setup dotnet uses: actions/setup-dotnet@v2 with: - dotnet-version: 7.0.x + dotnet-version: 8.0.x - name: Checkout Repository uses: actions/checkout@v3 diff --git a/.github/workflows/update_tgs_dmapi.yml b/.github/workflows/update_tgs_dmapi.yml index aae81f7e0d8..bbd237c102d 100644 --- a/.github/workflows/update_tgs_dmapi.yml +++ b/.github/workflows/update_tgs_dmapi.yml @@ -44,4 +44,4 @@ jobs: pr_body: "This pull request updates the TGS DMAPI to the latest version. Please note any changes that may be breaking or unimplemented in your codebase by checking what changes are in the definitions file: code/__DEFINES/tgs.dm before merging." pr_label: "Tools" pr_allow_empty: false - github_token: ${{ secrets.COMFY_ORANGE_PAT }} + github_token: ${{ secrets.NOVABOT_TOKEN }} diff --git a/.gitignore b/.gitignore index 1c74dfcdf37..97393735c82 100644 --- a/.gitignore +++ b/.gitignore @@ -210,7 +210,7 @@ Temporary Items # Autowiki /tools/autowiki/node_modules -# TGUI bundles - SKYRAT EDIT +# TGUI bundles - NOVA EDIT /tgui/public/tgui-common.bundle.js # Built auxtools libraries and intermediate files diff --git a/SQL/database_changelog.md b/SQL/database_changelog.md index 5e8317a8f85..52a0a5535ba 100644 --- a/SQL/database_changelog.md +++ b/SQL/database_changelog.md @@ -131,7 +131,7 @@ Version 5.18, 23 August 2021, by GoldenAlpharex Added `discord_report` column to the `ban table` ```sql -`discord_reported` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0', /* SKYRAT EDIT - Labelling bans for ease of reporting them over Discord. */ +`discord_reported` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0', /* NOVA EDIT - Labelling bans for ease of reporting them over Discord. */ ``` ----------------------------------------------------- diff --git a/SQL/tgstation_schema.sql b/SQL/tgstation_schema.sql index e7167f766df..3c7131035b7 100644 --- a/SQL/tgstation_schema.sql +++ b/SQL/tgstation_schema.sql @@ -93,7 +93,7 @@ CREATE TABLE `ban` ( `unbanned_ip` INT(10) UNSIGNED NULL DEFAULT NULL, `unbanned_computerid` VARCHAR(32) NULL DEFAULT NULL, `unbanned_round_id` INT(11) UNSIGNED NULL DEFAULT NULL, - `discord_reported` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0', /* SKYRAT EDIT - Labelling bans for ease of reporting them over Discord. */ + `discord_reported` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0', /* NOVA EDIT - Labelling bans for ease of reporting them over Discord. */ PRIMARY KEY (`id`), KEY `idx_ban_isbanned` (`ckey`,`role`,`unbanned_datetime`,`expiration_time`), KEY `idx_ban_isbanned_details` (`ckey`,`ip`,`computerid`,`role`,`unbanned_datetime`,`expiration_time`), diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_wendigo_cave.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_wendigo_cave.dmm index 9a4abac267d..8f823063856 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_wendigo_cave.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_wendigo_cave.dmm @@ -1,197 +1,295 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "a" = ( -/turf/closed/indestructible/rock/snow/ice/ore, -/area/icemoon/underground/explored) -"b" = ( -/turf/open/misc/asteroid/snow/ice/icemoon, -/area/icemoon/underground/unexplored) -"d" = ( /turf/template_noop, /area/template_noop) +"c" = ( +/obj/structure/flora/rock/pile/icy/style_random, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/unexplored) +"d" = ( +/obj/structure/flora/tree/pine/style_random, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/explored) +"e" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 9 + }, +/turf/open/indestructible/necropolis{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored) +"g" = ( +/obj/structure/flora/rock/pile/icy/style_random, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/explored) +"h" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 9 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 4 + }, +/turf/open/indestructible/necropolis{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored) "j" = ( -/obj/effect/mob_spawn/corpse/human/miner/explorer, -/turf/open/misc/asteroid/snow/ice/icemoon, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 9 + }, +/obj/effect/turf_decal/weather/snow/corner, +/turf/open/indestructible/necropolis{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored) +"k" = ( +/obj, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/unexplored) +"l" = ( +/turf/closed/indestructible/rock/snow/ice/ore, +/area/icemoon/underground/explored) +"m" = ( +/obj/effect/decal/cleanable/blood, +/turf/open/indestructible/necropolis{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored) +"n" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/obj/effect/turf_decal/weather/snow/corner, +/turf/open/indestructible/necropolis{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored) +"o" = ( +/turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/unexplored) +"p" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 8 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 4 + }, +/turf/open/indestructible/necropolis{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored) "q" = ( -/mob/living/simple_animal/hostile/megafauna/wendigo, +/obj/effect/decal/cleanable/blood/gibs/core, /turf/open/indestructible/necropolis{ initial_gas_mix = "ICEMOON_ATMOS" }, /area/icemoon/underground/explored) -"z" = ( -/obj/effect/landmark/portal_exit{ +"t" = ( +/obj/effect/portal/permanent/one_way{ id = "wendigo arena" }, /turf/open/indestructible/necropolis{ initial_gas_mix = "ICEMOON_ATMOS" }, +/area/icemoon/underground/unexplored) +"u" = ( +/obj/effect/decal/cleanable/blood/old, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/explored) +"w" = ( +/obj/effect/decal/cleanable/blood/drip, +/obj/effect/decal/cleanable/blood/drip{ + pixel_x = 11; + pixel_y = 18 + }, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/explored) +"y" = ( +/obj/structure/flora/grass/both/style_random, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/unexplored) +"z" = ( +/obj/structure/flora/grass/brown/style_random, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/explored) +"A" = ( +/obj/effect/decal/cleanable/blood/gibs/torso, +/obj/effect/decal/cleanable/blood/old, +/turf/open/indestructible/necropolis{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored) +"B" = ( +/obj/effect/turf_decal/weather/snow/corner, +/turf/open/indestructible/necropolis{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored) +"C" = ( +/obj/effect/mob_spawn/corpse/human/miner/explorer, +/obj/effect/decal/cleanable/blood/gibs/old, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/unexplored) +"D" = ( +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/indestructible/necropolis{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored) +"F" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 6 + }, +/obj/effect/decal/cleanable/blood/drip{ + pixel_x = 2; + pixel_y = 3 + }, +/obj/effect/decal/cleanable/blood/drip{ + pixel_x = 8; + pixel_y = 11 + }, +/turf/open/indestructible/necropolis{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/unexplored) +"G" = ( +/obj/structure/flora/rock/pile/icy/style_random, +/obj/structure/flora/grass/brown/style_random, +/turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) +"H" = ( +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/explored) +"I" = ( +/turf/closed/indestructible/rock/snow/ice/ore, +/area/icemoon/underground/unexplored) +"J" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 10 + }, +/turf/open/indestructible/necropolis{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/unexplored) "K" = ( -/obj/effect/landmark/portal_exit{ - id = "wendigo arena exit" +/turf/open/indestructible/necropolis{ + initial_gas_mix = "ICEMOON_ATMOS" }, -/turf/open/misc/asteroid/snow/ice/icemoon, +/area/icemoon/underground/explored) +"L" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 8 + }, +/turf/open/indestructible/necropolis{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored) +"M" = ( +/obj/structure/flora/tree/pine/style_random, +/turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/unexplored) "N" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 6 + }, +/turf/open/indestructible/necropolis{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/unexplored) +"O" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, /turf/open/indestructible/necropolis{ initial_gas_mix = "ICEMOON_ATMOS" }, /area/icemoon/underground/explored) -"U" = ( -/obj/item/paper/crumpled/bloody{ - default_raw_text = "for your own sake, do not enter" +"P" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 8 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 6 + }, +/turf/open/indestructible/necropolis{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored) +"Q" = ( +/obj/effect/decal/cleanable/blood/drip{ + pixel_x = -5 + }, +/obj/effect/decal/cleanable/blood/drip{ + pixel_x = 7; + pixel_y = 17 + }, +/obj/effect/decal/cleanable/blood/drip{ + pixel_x = 10; + pixel_y = 7 }, -/turf/open/misc/asteroid/snow/ice/icemoon, +/turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/unexplored) -"V" = ( -/obj/effect/portal/permanent/one_way{ +"R" = ( +/obj/effect/landmark/portal_exit{ id = "wendigo arena" }, -/turf/open/misc/asteroid/snow/ice/icemoon, +/obj/effect/decal/cleanable/blood/drip, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/explored) +"S" = ( +/obj/structure/flora/grass/brown/style_random, +/turf/closed/indestructible/rock/snow/ice/ore, +/area/icemoon/underground/explored) +"T" = ( +/obj/structure/flora/rock/pile/icy/style_3, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/explored) +"U" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 5 + }, +/turf/open/indestructible/necropolis{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored) +"V" = ( +/obj/effect/landmark/portal_exit{ + id = "wendigo arena exit" + }, +/turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/unexplored) +"W" = ( +/mob/living/simple_animal/hostile/megafauna/wendigo, +/turf/open/indestructible/necropolis{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored) +"X" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 6 + }, +/turf/open/indestructible/necropolis{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored) +"Y" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 4 + }, +/turf/open/indestructible/necropolis{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored) +"Z" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 10 + }, +/turf/open/indestructible/necropolis{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored) (1,1,1) = {" -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -"} -(2,1,1) = {" -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -"} -(3,1,1) = {" -d -d -d -d -d -d -d -d -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -d -d -d -d -d -d -d -d -"} -(4,1,1) = {" -d -d -d -d -d -d -d -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -d -d -d -d -d -d -d -"} -(5,1,1) = {" -d -d -d -d -d -d -b -b -b a a a @@ -205,25 +303,6 @@ a a a a -b -b -b -d -d -d -d -d -d -"} -(6,1,1) = {" -d -d -d -d -d -b -b -b a a a @@ -239,23 +318,37 @@ a a a a -b -b -b -d -d -d -d -d -"} -(7,1,1) = {" -d -d -d -d -b -b -b +a +a +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 +a +a a a a @@ -263,6 +356,8 @@ a a a a +"} +(3,1,1) = {" a a a @@ -270,30 +365,58 @@ a a a a +o +o +o +o +y +y +o +o +o +o +o +y +o +o +o +o +o +a +a +a +a +a a a a -b -b -b -d -d -d -d "} -(8,1,1) = {" -d -d -d -b -b -b +(4,1,1) = {" a a a a a a +o +o +y +l +I +M +o +c +o +o +o +o +o +o +y +y +o +o +o a a a @@ -301,657 +424,926 @@ a a a a +"} +(5,1,1) = {" +a +a +a +a +a +o +o +y +o +l +l +l +l +l +y +o +o +M +l +l +l +l +l +o +c +o a a a a a a -b -b -b -d -d -d "} -(9,1,1) = {" -d -d -b -b -b +(6,1,1) = {" a a a a +o +o +o +y +l +l +l +l +l +l +l +l +l +l +l +l +l +l +M +c +o +o +o a a -N -N -N -N -N -N -N -N -N a a a +"} +(7,1,1) = {" +a +a +a +o +o +o +c +l +l +l +l +l +l +l +l +l +l +l +l +l +l +l +o +o +y +o +o +o +a a a a -b -b -b -d -d "} -(10,1,1) = {" -d -d -b -b +(8,1,1) = {" a a a +o +o +M +l +l +l +l +l +l +l +d +H +z +g +g +l +l +l +l +l +l +M +o +o +o a a a -N -N -N -N -N -N -N -N -N -N -N a +"} +(9,1,1) = {" a a a +o +o +y +l +l +l +l +l +z +H +H +h +Z +H +z +z +H +l +l +l +l +l +y +y +o +a +a a a -b -b -d -d "} -(11,1,1) = {" -d -d -b -b +(10,1,1) = {" a a a +k +M +y +l +l +l +l +g +H +j +H +H +O +L +L +P +g +H +l +l +l +l +l +c +o a a -N -N -N -N -N -N -N -N -N -N -N -N -N a a +"} +(11,1,1) = {" +a +a +a +o +o +l +l +l +z +n +H +H +U +Z +H +O +K +B +H +H +H +n +H +l +l +l +o +M +a a a a -b -b -d -d "} (12,1,1) = {" -d -d -b -b a a a -a -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N +o +l +l +l +h +L +K +Z +H +T +O +L +K +K +B +g +e +L +B +H +g +l +l +l +o a a a a -b -b -d -d "} (13,1,1) = {" -d -d -b -b a a +o +o +l +l +l +H +H +O +K +Z +H +O +K +K +K +K +L +K +K +K +Z +H +l +l +l +o a -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N a a a -b -b -d -d "} (14,1,1) = {" +a +a +o +o +M +l +l +l d -d -b -b +O +K +B +H +O +K +K +K +K +K +K +K +K +K +L +l +l +l +o +o a a a -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N +"} +(15,1,1) = {" +a +a +y +y +c +l +l +l +l +K +K +K +L +K +K +K +K +K +K +K +K +K +K +Y +l +l +o +o +M +a +a +a +"} +(16,1,1) = {" +a +a +o +M +o +l +l +l +l +K +K +K +K +K +K +K +m +q +K +K +K +K +X +H +l +l +J +C +o +y +a +a +"} +(17,1,1) = {" a a +o +o +V +o +l +l +l +K +K +K +K +K +K +W +A +K +K +K +K +B +w +R +l +t +F +Q +o +y +a a -b -b -d -d "} -(15,1,1) = {" -d -d -b -b -a +(18,1,1) = {" a a +o +o +o +y +l +l +l +K +K +K +K +K +K +K +D +K +K +K +K +B +u +H +l N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N +c +o +o +o a a -a -b -b -d -d "} -(16,1,1) = {" -d -d -b -b +(19,1,1) = {" a a +o +o +y +M +l +l +Y +Y +Y +K +K +K +K +K +K +K +K +K +K +K +L +L +l +l +y +o +o +M a -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N a +"} +(20,1,1) = {" a a -b -b -d +M +o +o +l +l d +H +H +H +O +K +Y +K +K +K +K +K +K +K +K +K +K +l +l +l +y +o +a +a +a "} -(17,1,1) = {" -d -d -b -b +(21,1,1) = {" a a +o +o +c +l +l +g +H +e +L +K +B +H +O +K +Y +K +K +K +Y +Y +K +K +l +l +l +y a -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N a a a -j -b -d -d "} -(18,1,1) = {" -d -d -b -K +(22,1,1) = {" a a +o +c +l +l +l +L +p +Y +K +K +B +H +O +B +T +U +K +B +H +g +U +l +l +l +l +c a -N -N -N -N -N -N -N -N -q -N -N -N -N -N -N -N -z a a a -V -U -d -d "} -(19,1,1) = {" -d -d -b -b +(23,1,1) = {" a a a -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N +o +l +l +l +l +z +H +O +K +X +g +O +B +H +H +O +B +H +H +H +l +l +l +o +o +a a a a -b -b -d -d "} -(20,1,1) = {" -d -d -b -b +(24,1,1) = {" a a a -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N +o +o +l +l +l +S +d +O +X +g +H +U +X +H +H +U +B +H +H +l +l +l +l +o +M +a a a a -b -b -d -d "} -(21,1,1) = {" -d -d -b -b +(25,1,1) = {" a a a -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N +o +o +o +l +l +l +l +B +H +H +z +H +H +g +z +z +O +l +l +l +l +l +c +o +o +a a a a -b -b -d -d "} -(22,1,1) = {" -d -d -b -b +(26,1,1) = {" a a a -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N +M +o +o +o +M +l +l +l +H +z +z +l +l +l +d +G +l +l +l +l +o +o +o +o +o +a a a a -b -b -d -d "} -(23,1,1) = {" -d -d -b -b +(27,1,1) = {" a a a -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N +a +c +o +y +y +l +l +l +l +l +l +l +l +l +l +l +l +l +l +l +o +o +o +M +o +a a a a -b -b -d -d "} -(24,1,1) = {" -d -d -b -b +(28,1,1) = {" a a a a -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N +a +c +o +y +o +l +l +l +l +l +l +l +l +l +l +l +l +l +c +o +o +o +o +a a a a a -b -b -d -d "} -(25,1,1) = {" -d -d -b -b +(29,1,1) = {" a a a a a -N -N -N -N -N -N -N -N -N -N -N -N -N +a +o +o +o +o +M +y +o +l +l +l +l +l +l +l +l +o +o +o +M +o +a a a a a a -b -b -d -d "} -(26,1,1) = {" -d -d -b -b +(30,1,1) = {" a a a a a a -N -N -N -N -N -N -N -N -N -N -N +a +o +o +o +c +o +o +o +M +o +l +l +l +l +o +o +o +o +o +a a a a a a a -b -b -d -d "} -(27,1,1) = {" -d -d -b -b -b +(31,1,1) = {" a a a a a a -N -N -N -N -N -N -N -N -N a a +o +o +M +o +o +o +c +y +y +o +o +o +c +o +o +M a a a a -b -b -b -d -d -"} -(28,1,1) = {" -d -d -d -b -b -b a a a a +"} +(32,1,1) = {" a a a @@ -967,21 +1359,6 @@ a a a a -b -b -b -d -d -d -"} -(29,1,1) = {" -d -d -d -d -b -b -b a a a @@ -999,23 +1376,12 @@ a a a a -b -b -b -d -d -d -d "} -(30,1,1) = {" -d -d -d -d -d -b -b -b +(33,1,1) = {" +a +a +a +a a a a @@ -1031,25 +1397,6 @@ a a a a -b -b -b -d -d -d -d -d -"} -(31,1,1) = {" -d -d -d -d -d -d -b -b -b a a a @@ -1063,145 +1410,4 @@ a a a a -b -b -b -d -d -d -d -d -d -"} -(32,1,1) = {" -d -d -d -d -d -d -d -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -d -d -d -d -d -d -d -"} -(33,1,1) = {" -d -d -d -d -d -d -d -d -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -d -d -d -d -d -d -d -d -"} -(34,1,1) = {" -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -"} -(35,1,1) = {" -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d "} diff --git a/_maps/RandomRuins/IceRuins/skyrat/icemoon_underground_icewalker_lower.dmm b/_maps/RandomRuins/IceRuins/skyrat/icemoon_underground_icewalker_lower.dmm index 4e5a3e21f19..6c1b5fc71eb 100644 --- a/_maps/RandomRuins/IceRuins/skyrat/icemoon_underground_icewalker_lower.dmm +++ b/_maps/RandomRuins/IceRuins/skyrat/icemoon_underground_icewalker_lower.dmm @@ -243,7 +243,7 @@ /turf/open/misc/dirt/icemoon, /area/ruin/unpowered/primitive_catgirl_den) "fY" = ( -/obj/structure/flora/ash/cap_shroom, +/obj/structure/flora/ash, /turf/open/misc/dirt/icemoon, /area/ruin/unpowered/primitive_catgirl_den) "gt" = ( @@ -342,6 +342,7 @@ /obj/item/seeds/plum, /obj/item/seeds/berry, /obj/item/seeds/grape, +/obj/item/seeds/watermelon, /turf/open/misc/asteroid/snow/icemoon, /area/ruin/unpowered/primitive_catgirl_den) "iJ" = ( @@ -391,6 +392,10 @@ /obj/structure/stairs/wood, /turf/open/misc/dirt/icemoon, /area/ruin/unpowered/primitive_catgirl_den) +"jO" = ( +/obj/structure/flora/ash/stem_shroom, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) "jV" = ( /obj/effect/turf_decal/siding/wood, /obj/structure/fluff/minepost, @@ -845,6 +850,10 @@ }, /turf/open/misc/dirt/icemoon, /area/ruin/unpowered/primitive_catgirl_den) +"sf" = ( +/obj/structure/flora/ash/cap_shroom, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) "su" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -990,6 +999,7 @@ /obj/item/seeds/tea/catnip, /obj/item/seeds/bamboo, /obj/item/seeds/ambrosia, +/obj/item/seeds/grass, /turf/open/misc/dirt/icemoon, /area/ruin/unpowered/primitive_catgirl_den) "wF" = ( @@ -2955,7 +2965,7 @@ oJ pa GN GN -fY +jO jV Oy MP @@ -3215,7 +3225,7 @@ GN GN GN mu -fY +sf GN pa hA diff --git a/_maps/RandomRuins/LavaRuins/skyrat/lavaland_surface_ash_walker1_skyrat.dmm b/_maps/RandomRuins/LavaRuins/skyrat/lavaland_surface_ash_walker1_skyrat.dmm index f870375de62..7463a6012d7 100644 --- a/_maps/RandomRuins/LavaRuins/skyrat/lavaland_surface_ash_walker1_skyrat.dmm +++ b/_maps/RandomRuins/LavaRuins/skyrat/lavaland_surface_ash_walker1_skyrat.dmm @@ -28,7 +28,7 @@ /area/ruin/unpowered/ash_walkers) "bH" = ( /obj/structure/rack/shelf{ - icon = 'modular_skyrat/modules/mapping/icons/unique/furniture.dmi'; + icon = 'modular_nova/modules/mapping/icons/unique/furniture.dmi'; icon_state = "empty_shelf_1" }, /obj/item/gun/ballistic/bow/longbow, @@ -125,7 +125,7 @@ /area/ruin/unpowered/ash_walkers) "hA" = ( /obj/structure/rack/shelf{ - icon = 'modular_skyrat/modules/mapping/icons/unique/furniture.dmi'; + icon = 'modular_nova/modules/mapping/icons/unique/furniture.dmi'; icon_state = "empty_shelf_1" }, /obj/structure/stone_tile/slab, @@ -172,7 +172,7 @@ /area/ruin/unpowered/ash_walkers) "ij" = ( /obj/structure/rack/shelf{ - icon = 'modular_skyrat/modules/mapping/icons/unique/furniture.dmi'; + icon = 'modular_nova/modules/mapping/icons/unique/furniture.dmi'; icon_state = "empty_shelf_1" }, /obj/item/reagent_containers/cup/glass/bottle/lizardwine, @@ -397,7 +397,7 @@ dir = 1 }, /obj/structure/rack/shelf{ - icon = 'modular_skyrat/modules/mapping/icons/unique/furniture.dmi'; + icon = 'modular_nova/modules/mapping/icons/unique/furniture.dmi'; icon_state = "empty_shelf_1" }, /obj/item/screwdriver/ashwalker, @@ -446,7 +446,7 @@ /area/ruin/unpowered/ash_walkers) "qr" = ( /obj/structure/rack/shelf{ - icon = 'modular_skyrat/modules/mapping/icons/unique/furniture.dmi'; + icon = 'modular_nova/modules/mapping/icons/unique/furniture.dmi'; icon_state = "empty_shelf_1" }, /obj/item/reagent_containers/cup/bowl/mushroom_bowl{ @@ -513,7 +513,7 @@ /area/ruin/unpowered/ash_walkers) "sl" = ( /obj/structure/rack/shelf{ - icon = 'modular_skyrat/modules/mapping/icons/unique/furniture.dmi'; + icon = 'modular_nova/modules/mapping/icons/unique/furniture.dmi'; icon_state = "empty_shelf_1" }, /obj/item/knife/combat/bone{ @@ -544,7 +544,7 @@ /area/ruin/unpowered/ash_walkers) "tg" = ( /obj/structure/rack/shelf{ - icon = 'modular_skyrat/modules/mapping/icons/unique/furniture.dmi'; + icon = 'modular_nova/modules/mapping/icons/unique/furniture.dmi'; icon_state = "empty_shelf_1" }, /obj/item/reagent_containers/cup/bottle/nutrient/rh{ @@ -572,7 +572,7 @@ /area/ruin/unpowered/ash_walkers) "tl" = ( /obj/structure/rack/shelf{ - icon = 'modular_skyrat/modules/mapping/icons/unique/furniture.dmi'; + icon = 'modular_nova/modules/mapping/icons/unique/furniture.dmi'; icon_state = "empty_shelf_1" }, /obj/item/spear/bonespear, @@ -1065,7 +1065,7 @@ /area/ruin/unpowered/ash_walkers) "Nf" = ( /obj/structure/rack/shelf{ - icon = 'modular_skyrat/modules/mapping/icons/unique/furniture.dmi'; + icon = 'modular_nova/modules/mapping/icons/unique/furniture.dmi'; icon_state = "empty_shelf_1" }, /obj/item/claymore/bone, @@ -1089,7 +1089,7 @@ /area/ruin/unpowered/ash_walkers) "NB" = ( /obj/structure/rack/shelf{ - icon = 'modular_skyrat/modules/mapping/icons/unique/furniture.dmi'; + icon = 'modular_nova/modules/mapping/icons/unique/furniture.dmi'; icon_state = "empty_shelf_1" }, /obj/item/forging/billow/primitive, @@ -1179,7 +1179,7 @@ /area/ruin/unpowered/ash_walkers) "Pr" = ( /obj/structure/rack/shelf{ - icon = 'modular_skyrat/modules/mapping/icons/unique/furniture.dmi'; + icon = 'modular_nova/modules/mapping/icons/unique/furniture.dmi'; icon_state = "empty_shelf_1" }, /obj/item/bedsheet/black{ @@ -1198,7 +1198,7 @@ /area/ruin/unpowered/ash_walkers) "PB" = ( /obj/structure/rack/shelf{ - icon = 'modular_skyrat/modules/mapping/icons/unique/furniture.dmi'; + icon = 'modular_nova/modules/mapping/icons/unique/furniture.dmi'; icon_state = "empty_shelf_1" }, /obj/item/stack/sheet/iron/twenty, @@ -1219,7 +1219,7 @@ /area/ruin/unpowered/ash_walkers) "PG" = ( /obj/structure/rack/shelf{ - icon = 'modular_skyrat/modules/mapping/icons/unique/furniture.dmi'; + icon = 'modular_nova/modules/mapping/icons/unique/furniture.dmi'; icon_state = "empty_shelf_1" }, /obj/item/forging/billow/primitive, @@ -1287,7 +1287,7 @@ /area/ruin/unpowered/ash_walkers) "SE" = ( /obj/structure/rack/shelf{ - icon = 'modular_skyrat/modules/mapping/icons/unique/furniture.dmi'; + icon = 'modular_nova/modules/mapping/icons/unique/furniture.dmi'; icon_state = "empty_shelf_1" }, /obj/item/secateurs, @@ -1436,7 +1436,7 @@ /area/ruin/unpowered/ash_walkers) "Xe" = ( /obj/structure/rack/shelf{ - icon = 'modular_skyrat/modules/mapping/icons/unique/furniture.dmi'; + icon = 'modular_nova/modules/mapping/icons/unique/furniture.dmi'; icon_state = "empty_shelf_1" }, /obj/item/reagent_containers/cup/glass/bottle/small{ diff --git a/_maps/RandomRuins/SpaceRuins/skyrat/interdynefob.dmm b/_maps/RandomRuins/SpaceRuins/skyrat/interdynefob.dmm index 1ada129b23f..99ba6f32bc0 100644 --- a/_maps/RandomRuins/SpaceRuins/skyrat/interdynefob.dmm +++ b/_maps/RandomRuins/SpaceRuins/skyrat/interdynefob.dmm @@ -8195,11 +8195,11 @@ /turf/open/floor/iron/cafeteria, /area/ruin/space/has_grav/skyrat/interdynefob/service/diner) "MB" = ( -/obj/item/clothing/suit/toggle/labcoat/skyrat/hospitalgown{ +/obj/item/clothing/suit/toggle/labcoat/hospitalgown{ pixel_x = -3; pixel_y = 4 }, -/obj/item/clothing/suit/toggle/labcoat/skyrat/hospitalgown{ +/obj/item/clothing/suit/toggle/labcoat/hospitalgown{ pixel_x = -7 }, /obj/structure/table/glass, diff --git a/_maps/_basemap.dm b/_maps/_basemap.dm index a2fbfed494b..8bd71f0db34 100644 --- a/_maps/_basemap.dm +++ b/_maps/_basemap.dm @@ -13,10 +13,10 @@ #include "map_files\Mining\Lavaland.dmm" #include "map_files\NorthStar\north_star.dmm" #include "map_files\tramstation\tramstation.dmm" - // SKYRAT EDIT ADDITON START - Compiling our modular maps too! + // NOVA EDIT ADDITON START - Compiling our modular maps too! #include "map_files\VoidRaptor\VoidRaptor.dmm" #include "map_files\NSVBlueshift\Blueshift.dmm" - // SKYRAT EDIT END + // NOVA EDIT END #ifdef CIBUILDING #include "templates.dm" diff --git a/_maps/map_files/VoidRaptor/VoidRaptor.dmm b/_maps/map_files/VoidRaptor/VoidRaptor.dmm index d20bf56ba1a..b00c3ef8c0c 100644 --- a/_maps/map_files/VoidRaptor/VoidRaptor.dmm +++ b/_maps/map_files/VoidRaptor/VoidRaptor.dmm @@ -1553,9 +1553,6 @@ dir = 4 }, /obj/machinery/duct, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, /turf/open/floor/iron/white/smooth_edge{ dir = 8 }, @@ -2197,17 +2194,9 @@ /area/station/science/research) "aFT" = ( /obj/effect/turf_decal/bot, -/obj/structure/rack, -/obj/item/reagent_containers/cup/bottle/mercury{ - pixel_x = -5; - pixel_y = 3 - }, -/obj/item/reagent_containers/cup/bottle/nitrogen{ - pixel_x = 7; - pixel_y = 3 - }, -/obj/item/reagent_containers/cup/bottle/oxygen{ - pixel_x = 1 +/obj/structure/table/glass, +/obj/item/storage/box/beakers{ + pixel_y = 4 }, /turf/open/floor/iron/white/smooth_large, /area/station/medical/medbay/central) @@ -3231,12 +3220,6 @@ dir = 4 }, /area/station/engineering/storage) -"aVZ" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 5 - }, -/turf/open/floor/iron/freezer, -/area/station/medical/chemistry) "aWh" = ( /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, @@ -3381,9 +3364,6 @@ /area/station/maintenance/port/aft) "aWZ" = ( /obj/effect/turf_decal/trimline/blue/filled/line, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/chair{ dir = 1 }, @@ -3391,6 +3371,9 @@ /obj/structure/disposalpipe/segment{ dir = 5 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/smooth_edge{ dir = 1 }, @@ -5990,6 +5973,22 @@ }, /turf/open/floor/wood/large, /area/station/hallway/primary/central/fore) +"bNE" = ( +/obj/structure/rack/shelf, +/obj/item/reagent_containers/cup/bottle/acidic_buffer{ + pixel_x = 7; + pixel_y = 3 + }, +/obj/item/reagent_containers/cup/bottle/basic_buffer{ + pixel_x = -5; + pixel_y = 3 + }, +/obj/item/reagent_containers/cup/bottle/formaldehyde{ + pixel_x = 1 + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/white/smooth_large, +/area/station/medical/medbay/central) "bNF" = ( /obj/effect/turf_decal/trimline/purple/filled/warning{ dir = 10 @@ -7994,7 +7993,7 @@ "cut" = ( /obj/effect/turf_decal/tile/blue/full, /turf/open/floor/iron/airless{ - icon = 'modular_skyrat/modules/advanced_shuttles/icons/erokez.dmi'; + icon = 'modular_nova/modules/advanced_shuttles/icons/erokez.dmi'; icon_state = "floor1" }, /area/space/nearstation) @@ -8094,6 +8093,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/maintenance/department/engine/atmos) +"cwd" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 6 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/iron/freezer, +/area/station/medical/pharmacy) "cwf" = ( /obj/effect/turf_decal/vg_decals/numbers/one, /turf/open/floor/iron/dark/smooth_large, @@ -8372,6 +8378,7 @@ /area/station/medical/surgery) "cAR" = ( /obj/item/mod/module/plasma_stabilizer, +/obj/item/mod/module/thermal_regulator, /obj/structure/table, /obj/structure/window/reinforced/spawner/directional/north, /obj/machinery/door/window/right/directional/west{ @@ -8389,8 +8396,6 @@ /obj/effect/turf_decal/trimline/dark_red/filled/mid_joiner{ dir = 1 }, -/obj/item/mod/module/signlang_radio, -/obj/item/mod/module/thermal_regulator, /turf/open/floor/iron/dark/smooth_large, /area/station/medical/storage) "cBb" = ( @@ -9273,7 +9278,7 @@ /area/station/hallway/secondary/command) "cOf" = ( /turf/open/floor/iron/airless{ - icon = 'modular_skyrat/modules/advanced_shuttles/icons/erokez.dmi'; + icon = 'modular_nova/modules/advanced_shuttles/icons/erokez.dmi'; icon_state = "floor1" }, /area/space/nearstation) @@ -9839,10 +9844,6 @@ /obj/structure/disposalpipe/segment, /turf/closed/wall, /area/station/maintenance/aft/upper) -"cXE" = ( -/obj/machinery/duct, -/turf/open/floor/iron/freezer, -/area/station/medical/pharmacy) "cXX" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/dark/smooth_large, @@ -10047,8 +10048,19 @@ /area/station/engineering/atmos/storage) "daB" = ( /obj/effect/turf_decal/trimline/yellow/filled/line, -/obj/machinery/airalarm/directional/south{ - pixel_x = 10 +/obj/structure/table/reinforced/rglass, +/obj/item/assembly/timer{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/assembly/igniter, +/obj/item/stack/package_wrap{ + pixel_y = -1; + pixel_x = 1 + }, +/obj/item/hand_labeler{ + pixel_y = -3; + pixel_x = 4 }, /turf/open/floor/iron/freezer, /area/station/medical/pharmacy) @@ -10376,10 +10388,12 @@ /obj/effect/turf_decal/trimline/blue/line{ dir = 1 }, -/obj/machinery/duct, -/obj/structure/disposalpipe/junction/flip{ - dir = 8 +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 8; + name = "Pharmacy Junction" }, +/obj/machinery/duct, +/obj/effect/mapping_helpers/mail_sorting/medbay/chemistry, /turf/open/floor/iron/white/smooth_large, /area/station/medical/medbay/lobby) "dfk" = ( @@ -10817,14 +10831,20 @@ /turf/open/floor/iron/grimy, /area/station/service/library) "dle" = ( -/obj/item/reagent_containers/cup/beaker/large{ - pixel_y = 5 +/obj/structure/sign/warning/chem_diamond/directional/east, +/obj/structure/rack/shelf, +/obj/item/reagent_containers/cup/bottle/fluorine{ + pixel_x = 7; + pixel_y = 3 }, -/obj/item/reagent_containers/dropper{ - pixel_y = -4 +/obj/item/reagent_containers/cup/bottle/epinephrine{ + pixel_x = -5; + pixel_y = 3 }, -/obj/structure/sign/warning/chem_diamond/directional/east, -/obj/structure/table/glass, +/obj/item/reagent_containers/cup/bottle/iodine{ + pixel_x = 1 + }, +/obj/effect/turf_decal/bot, /turf/open/floor/iron/white/smooth_large, /area/station/medical/medbay/central) "dlg" = ( @@ -11031,8 +11051,8 @@ }, /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/structure/disposalpipe/junction/flip{ + dir = 8 }, /turf/open/floor/iron/freezer, /area/station/medical/pharmacy) @@ -13035,10 +13055,14 @@ /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 8 }, -/turf/open/floor/iron/white/smooth_edge{ - dir = 4 +/obj/machinery/smartfridge/chemistry/preloaded, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "chemistry_shutters_south"; + name = "Pharmacy Shutters" }, -/area/station/hallway/primary/central/aft) +/turf/open/floor/iron/dark/smooth_large, +/area/station/medical/pharmacy) "dPw" = ( /obj/effect/turf_decal/trimline/dark_red/filled/line, /obj/machinery/light/small/directional/south, @@ -13921,10 +13945,6 @@ "ebp" = ( /obj/structure/table/reinforced, /obj/machinery/door/firedoor, -/obj/machinery/door/window/right/directional/east{ - name = "Pharmacy Desk"; - req_access = list("pharmacy") - }, /obj/item/reagent_containers/cup/bottle/morphine, /obj/item/reagent_containers/cup/bottle/toxin{ pixel_x = 5; @@ -13942,6 +13962,12 @@ id = "chemistry_shutters"; name = "Pharmacy Shutters" }, +/obj/machinery/door/window/right/directional/east{ + name = "Pharmacy Desk"; + req_access = list("pharmacy"); + safe = 4; + dir = 8 + }, /turf/open/floor/iron/white/smooth_large, /area/station/medical/pharmacy) "ebz" = ( @@ -14487,11 +14513,7 @@ /area/station/service/chapel) "eil" = ( /obj/effect/turf_decal/trimline/yellow/filled/corner, -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/box, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, +/obj/machinery/chem_mass_spec, /turf/open/floor/iron/freezer, /area/station/medical/pharmacy) "ein" = ( @@ -15042,18 +15064,14 @@ /turf/open/floor/iron/grimy, /area/station/security/detectives_office) "epZ" = ( +/obj/structure/table/glass, /obj/effect/turf_decal/bot, -/obj/structure/rack, -/obj/item/reagent_containers/cup/bottle/epinephrine{ - pixel_x = -5; - pixel_y = 3 - }, -/obj/item/reagent_containers/cup/bottle/fluorine{ - pixel_x = 7; - pixel_y = 3 +/obj/item/storage/toolbox/mechanical{ + pixel_y = 1 }, -/obj/item/reagent_containers/cup/bottle/iodine{ - pixel_x = 1 +/obj/item/reagent_containers/spray/cleaner{ + pixel_y = 4; + pixel_x = 9 }, /turf/open/floor/iron/white/smooth_large, /area/station/medical/medbay/central) @@ -15712,7 +15730,6 @@ /obj/item/restraints/handcuffs, /obj/effect/turf_decal/tile/dark_red/diagonal_centre, /obj/effect/turf_decal/tile/neutral/diagonal_centre, -/obj/item/paper/fluff/genpop_instructions, /turf/open/floor/iron/dark/diagonal, /area/station/security/execution/transfer) "eBa" = ( @@ -15980,19 +15997,11 @@ /turf/open/floor/glass/reinforced, /area/station/security/office) "eEq" = ( -/obj/structure/chair/sofa/bench/left{ - dir = 4; - pixel_x = -5 - }, /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 8 }, -/obj/effect/landmark/start/assistant, -/obj/machinery/light/cold/directional/west, -/turf/open/floor/iron/white/smooth_edge{ - dir = 4 - }, -/area/station/hallway/primary/central/aft) +/turf/closed/wall/r_wall, +/area/station/medical/pharmacy) "eEr" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -16717,7 +16726,7 @@ /area/station/ai_monitored/security/armory) "eNH" = ( /turf/open/floor/iron/airless{ - icon = 'modular_skyrat/modules/advanced_shuttles/icons/evac_shuttle.dmi' + icon = 'modular_nova/modules/advanced_shuttles/icons/evac_shuttle.dmi' }, /area/space/nearstation) "eNR" = ( @@ -17795,10 +17804,14 @@ }, /area/station/hallway/secondary/command) "fft" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ +/obj/effect/turf_decal/bot, +/obj/structure/fake_stairs/directional/north, +/obj/structure/railing{ dir = 8 }, -/obj/effect/turf_decal/bot, +/obj/structure/railing{ + dir = 4 + }, /turf/open/floor/iron/freezer, /area/station/medical/pharmacy) "ffz" = ( @@ -18837,6 +18850,17 @@ "fvs" = ( /turf/open/floor/iron/white/smooth_large, /area/station/science/lab) +"fvW" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 5 + }, +/obj/effect/turf_decal/bot, +/obj/item/toy/figure/chemist{ + pixel_y = 18 + }, +/obj/machinery/vending/wardrobe/chem_wardrobe, +/turf/open/floor/iron/freezer, +/area/station/medical/chemistry) "fwc" = ( /obj/structure/table, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -18939,12 +18963,20 @@ /turf/open/floor/iron/cafeteria, /area/station/service/cafeteria) "fxD" = ( -/obj/effect/turf_decal/bot, /obj/structure/sign/warning/chem_diamond/directional/north, -/obj/item/storage/box/beakers{ - pixel_y = 4 +/obj/structure/rack/shelf, +/obj/item/reagent_containers/cup/bottle/carbon{ + pixel_x = 7; + pixel_y = 3 }, -/obj/structure/table/glass, +/obj/item/reagent_containers/cup/bottle/ethanol{ + pixel_x = -5; + pixel_y = 3 + }, +/obj/item/reagent_containers/cup/bottle/chlorine{ + pixel_x = 1 + }, +/obj/effect/turf_decal/bot, /turf/open/floor/iron/white/smooth_large, /area/station/medical/medbay/central) "fxO" = ( @@ -18997,22 +19029,6 @@ }, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/maintenance/aft/upper) -"fyz" = ( -/obj/effect/turf_decal/bot, -/obj/structure/rack, -/obj/item/reagent_containers/cup/bottle/iron{ - pixel_x = -5; - pixel_y = 3 - }, -/obj/item/reagent_containers/cup/bottle/lithium{ - pixel_x = 7; - pixel_y = 3 - }, -/obj/item/reagent_containers/cup/bottle/multiver{ - pixel_x = 1 - }, -/turf/open/floor/iron/white/smooth_large, -/area/station/medical/medbay/central) "fyB" = ( /obj/structure/table/wood, /obj/item/paper_bin{ @@ -19766,10 +19782,9 @@ /area/station/maintenance/aft/upper) "fLC" = ( /obj/effect/turf_decal/trimline/yellow/filled/warning, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/freezer, /area/station/medical/pharmacy) "fLX" = ( @@ -21976,7 +21991,6 @@ /turf/closed/wall, /area/station/maintenance/disposal) "gta" = ( -/obj/effect/turf_decal/bot, /obj/structure/sign/poster/official/periodic_table/directional/north, /turf/open/floor/iron/white/smooth_large, /area/station/medical/medbay/central) @@ -22115,24 +22129,31 @@ /turf/open/floor/catwalk_floor/iron_smooth, /area/station/maintenance/solars/port/fore) "gut" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, /obj/item/book/manual/wiki/chemistry{ - pixel_x = -4; + pixel_x = -13; pixel_y = 7 }, +/obj/structure/table/reinforced/rglass, /obj/item/book/manual/wiki/grenades{ - pixel_y = 3 + pixel_y = 3; + pixel_x = -7 }, -/obj/item/assembly/igniter, -/obj/item/assembly/timer{ +/obj/item/grenade/chem_grenade, +/obj/item/grenade/chem_grenade{ + pixel_x = -2 + }, +/obj/item/stack/cable_coil, +/obj/item/ph_meter{ + pixel_x = 12; + pixel_y = 6 + }, +/obj/item/stack/cable_coil{ pixel_x = 3; pixel_y = 3 }, -/obj/structure/table/reinforced/rglass, -/obj/item/ph_booklet{ - pixel_x = -15 +/obj/item/screwdriver, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 5 }, /turf/open/floor/iron/freezer, /area/station/medical/pharmacy) @@ -23656,6 +23677,10 @@ /area/station/maintenance/port/greater) "gQm" = ( /obj/effect/turf_decal/stripes/line, +/obj/structure/railing/corner, +/obj/structure/railing/corner{ + dir = 8 + }, /turf/open/floor/iron/dark/smooth_large, /area/station/medical/pharmacy) "gQq" = ( @@ -24086,9 +24111,6 @@ dir = 8 }, /obj/machinery/duct, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, /turf/open/floor/iron/freezer, /area/station/medical/pharmacy) "gWN" = ( @@ -26489,7 +26511,7 @@ dir = 1 }, /turf/open/floor/iron/airless{ - icon = 'modular_skyrat/modules/advanced_shuttles/icons/erokez.dmi'; + icon = 'modular_nova/modules/advanced_shuttles/icons/erokez.dmi'; icon_state = "floor1" }, /area/space/nearstation) @@ -26622,10 +26644,10 @@ /obj/structure/chair/office/light{ dir = 1 }, -/obj/effect/landmark/start/chemist, /obj/effect/turf_decal/trimline/yellow/filled/warning{ dir = 1 }, +/obj/effect/landmark/start/chemist, /turf/open/floor/iron/dark/smooth_large, /area/station/medical/pharmacy) "hGP" = ( @@ -31646,11 +31668,14 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/item/radio/intercom/directional/west, /obj/machinery/firealarm/directional/west{ pixel_y = -16 }, /obj/structure/sink/directional/east, +/obj/structure/extinguisher_cabinet/directional/west{ + pixel_y = 2; + pixel_x = -28 + }, /turf/open/floor/iron/freezer, /area/station/medical/pharmacy) "jcf" = ( @@ -33198,19 +33223,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/maintenance/aft/greater) -"jyi" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 4 - }, -/obj/machinery/door/firedoor, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/edge{ - dir = 8 - }, -/area/station/hallway/primary/central/aft) "jyD" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -35355,10 +35367,10 @@ /area/station/medical/break_room) "kcP" = ( /obj/machinery/holopad, -/obj/effect/turf_decal/bot, /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/effect/turf_decal/bot, /turf/open/floor/iron/dark/smooth_large, /area/station/medical/chemistry) "kcW" = ( @@ -35551,13 +35563,15 @@ /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 6 }, -/obj/machinery/requests_console/directional/south{ - department = "Pharmacy"; - name = "Pharmacy Requests Console" +/obj/structure/table/reinforced/rglass, +/obj/machinery/light/cold/directional/east, +/obj/item/clothing/gloves/latex, +/obj/item/clothing/gloves/latex, +/obj/item/clothing/glasses/science, +/obj/item/clothing/glasses/science{ + pixel_y = 3 }, -/obj/effect/mapping_helpers/requests_console/ore_update, -/obj/structure/closet/secure_closet/medical1, -/obj/effect/turf_decal/bot, +/obj/item/radio/intercom/directional/east, /turf/open/floor/iron/freezer, /area/station/medical/pharmacy) "kgl" = ( @@ -36076,6 +36090,10 @@ dir = 8 }, /area/station/medical/medbay/central) +"kny" = ( +/obj/effect/turf_decal/trimline/yellow/filled/corner, +/turf/open/floor/iron/freezer, +/area/station/medical/pharmacy) "knA" = ( /obj/structure/chair/wood, /obj/machinery/firealarm/directional/north, @@ -36894,39 +36912,14 @@ /turf/open/floor/engine, /area/station/maintenance/disposal/incinerator) "kyV" = ( -/obj/structure/table/reinforced, -/obj/item/folder/white{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/pen{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ +/obj/effect/turf_decal/trimline/yellow/filled/warning{ dir = 4 }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/machinery/door/firedoor, -/obj/structure/desk_bell{ - pixel_x = 7; - pixel_y = 6 - }, -/obj/machinery/door/window/right/directional/west{ - name = "Pharmacy Desk"; - req_access = list("pharmacy") - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "chemistry_shutters"; - name = "Pharmacy Shutters" +/obj/effect/landmark/start/chemist, +/obj/structure/chair/office/light{ + dir = 4 }, -/turf/open/floor/iron/white/smooth_large, +/turf/open/floor/iron/dark/smooth_large, /area/station/medical/pharmacy) "kyY" = ( /obj/structure/disposalpipe/segment{ @@ -37225,9 +37218,6 @@ /turf/open/floor/iron/smooth, /area/station/maintenance/starboard/aft) "kCE" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 1 - }, /obj/structure/disposalpipe/segment, /turf/open/floor/iron/corner{ dir = 1 @@ -39057,25 +39047,14 @@ /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 4 }, -/obj/machinery/status_display/evac/directional/east, /obj/structure/table/reinforced/rglass, -/obj/item/stack/ducts/fifty, -/obj/item/stack/ducts/fifty, -/obj/item/stack/ducts/fifty, -/obj/item/stack/ducts/fifty, -/obj/item/stack/ducts/fifty, -/obj/item/stack/ducts/fifty, -/obj/item/stack/ducts/fifty, -/obj/item/stack/ducts/fifty, -/obj/item/stack/cable_coil, -/obj/item/stack/cable_coil, -/obj/item/clothing/glasses/science, -/obj/item/clothing/glasses/science, -/obj/item/screwdriver{ +/obj/item/stack/sheet/iron/fifty, +/obj/machinery/status_display/evac/directional/east, +/obj/item/stack/sheet/iron/fifty, +/obj/item/construction/plumbing{ pixel_y = 6 }, -/obj/item/storage/toolbox/mechanical, -/obj/item/clothing/head/utility/welding, +/obj/item/construction/plumbing, /turf/open/floor/iron/freezer, /area/station/medical/chemistry) "lbh" = ( @@ -39513,8 +39492,7 @@ /area/station/maintenance/department/medical/central) "lgZ" = ( /obj/machinery/door/airlock/security{ - name = "Isolation Cell"; - id_tag = "IsolationCell" + name = "Isolation Cell" }, /obj/effect/mapping_helpers/airlock/access/all/security/brig, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -40099,7 +40077,10 @@ /turf/open/floor/iron/white/diagonal, /area/station/science/research) "loL" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 10 + }, /turf/open/floor/iron/white/smooth_edge{ dir = 1 }, @@ -41387,13 +41368,13 @@ /obj/effect/turf_decal/trimline/blue/corner{ dir = 1 }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/duct, /obj/structure/disposalpipe/junction/yjunction{ dir = 8 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/duct, /turf/open/floor/iron/white/smooth_large, /area/station/medical/medbay/lobby) "lHx" = ( @@ -42169,14 +42150,22 @@ dir = 4 }, /obj/machinery/status_display/ai/directional/east, -/obj/structure/table/reinforced/rglass, -/obj/item/stack/sheet/iron/fifty, -/obj/item/stack/sheet/iron/fifty, -/obj/item/construction/plumbing{ - pixel_y = 6 - }, -/obj/item/construction/plumbing, /obj/machinery/light/cold/directional/east, +/obj/structure/rack, +/obj/item/book/manual/wiki/chemistry{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/book/manual/wiki/grenades, +/obj/item/book/manual/wiki/plumbing{ + pixel_x = 4; + pixel_y = -4 + }, +/obj/item/plunger, +/obj/item/plunger{ + pixel_x = -9 + }, +/obj/effect/turf_decal/bot, /turf/open/floor/iron/freezer, /area/station/medical/chemistry) "lSs" = ( @@ -42464,15 +42453,11 @@ /obj/effect/turf_decal/trimline/blue/corner{ dir = 8 }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/duct, -/obj/structure/disposalpipe/sorting/mail/flip{ - dir = 2; - name = "Pharmacy Junction" - }, -/obj/effect/mapping_helpers/mail_sorting/medbay/chemistry, /turf/open/floor/iron/white/smooth_large, /area/station/medical/medbay/lobby) "lVG" = ( @@ -43191,11 +43176,11 @@ /turf/open/floor/carpet/purple, /area/station/command/heads_quarters/rd) "mgm" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 8 }, /obj/machinery/airalarm/directional/north, -/turf/open/floor/iron/white/smooth_edge, +/turf/open/floor/iron/white/smooth_large, /area/station/hallway/primary/central/aft) "mgt" = ( /obj/effect/turf_decal/trimline/green/filled/line{ @@ -44427,12 +44412,8 @@ /turf/open/floor/engine, /area/station/engineering/main) "mAC" = ( -/obj/structure/chair/office/light{ - dir = 4 - }, -/obj/effect/landmark/start/chemist, -/obj/effect/turf_decal/trimline/yellow/filled/warning{ - dir = 4 +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, /turf/open/floor/iron/dark/smooth_large, /area/station/medical/pharmacy) @@ -44522,19 +44503,15 @@ /obj/structure/sign/warning/no_smoking/circle/directional/north{ pixel_y = 28 }, -/obj/effect/turf_decal/bot, -/obj/structure/rack, -/obj/item/reagent_containers/cup/bottle/ethanol{ - pixel_x = -5; - pixel_y = 3 - }, -/obj/item/reagent_containers/cup/bottle/carbon{ - pixel_x = 7; - pixel_y = 3 +/obj/structure/table/glass, +/obj/item/reagent_containers/cup/beaker/large{ + pixel_y = 5 }, -/obj/item/reagent_containers/cup/bottle/chlorine{ - pixel_x = 1 +/obj/item/assembly/igniter, +/obj/item/reagent_containers/dropper{ + pixel_y = -4 }, +/obj/effect/turf_decal/bot, /turf/open/floor/iron/white/smooth_large, /area/station/medical/medbay/central) "mBF" = ( @@ -45095,7 +45072,9 @@ /turf/open/floor/catwalk_floor/iron_smooth, /area/station/maintenance/department/medical/central) "mJB" = ( -/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, /turf/open/floor/iron/freezer, /area/station/medical/pharmacy) "mJC" = ( @@ -46262,6 +46241,28 @@ }, /turf/open/floor/iron/dark/smooth_edge, /area/station/security/office) +"mYW" = ( +/obj/machinery/button/door/directional/east{ + id = "chemistry_shutters_south"; + name = "Shutters Control"; + req_access = list("pharmacy") + }, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/filled/mid_joiner{ + dir = 4 + }, +/obj/effect/turf_decal/bot_red, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/railing{ + dir = 1 + }, +/obj/machinery/chem_heater/withbuffer, +/turf/open/floor/iron/dark/smooth_large, +/area/station/medical/pharmacy) "mZe" = ( /obj/effect/turf_decal/trimline/dark_red/arrow_cw{ dir = 8 @@ -46751,10 +46752,10 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 4 }, -/turf/open/floor/iron/dark/smooth_large, +/turf/open/floor/iron/freezer, /area/station/medical/pharmacy) "nhS" = ( /obj/machinery/atmospherics/pipe/smart/simple/green/visible, @@ -46909,11 +46910,41 @@ /turf/open/floor/iron/dark/smooth_edge, /area/station/security/interrogation) "njQ" = ( -/obj/effect/turf_decal/trimline/yellow/filled/warning{ - dir = 9 +/obj/machinery/door/firedoor, +/obj/structure/table/reinforced, +/obj/structure/desk_bell{ + pixel_x = 7; + pixel_y = 6 }, -/turf/open/floor/iron/white, -/area/station/hallway/primary/central/aft) +/obj/item/folder/white{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/pen{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "chemistry_shutters_south"; + name = "Pharmacy Shutters" + }, +/obj/machinery/door/window/right/directional/west{ + name = "Pharmacy Desk"; + req_access = list("pharmacy"); + dir = 4 + }, +/turf/open/floor/iron/white/smooth_large, +/area/station/medical/pharmacy) "njV" = ( /obj/effect/turf_decal/trimline/dark_green/filled/line{ dir = 5 @@ -47899,7 +47930,7 @@ pixel_y = 32 }, /turf/open/floor/iron/airless{ - icon = 'modular_skyrat/modules/advanced_shuttles/icons/erokez.dmi'; + icon = 'modular_nova/modules/advanced_shuttles/icons/erokez.dmi'; icon_state = "floor1" }, /area/space/nearstation) @@ -48553,18 +48584,20 @@ /turf/open/floor/iron/smooth, /area/station/science/ordnance) "nIJ" = ( -/obj/item/reagent_containers/cup/beaker/large, -/obj/item/reagent_containers/cup/beaker/large, -/obj/item/reagent_containers/dropper, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 6 - }, -/obj/structure/extinguisher_cabinet/directional/south, +/obj/effect/turf_decal/trimline/yellow/filled/line, /obj/effect/turf_decal/trimline/yellow/filled/mid_joiner, -/obj/effect/turf_decal/trimline/yellow/filled/mid_joiner{ - dir = 4 +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, -/obj/structure/table/reinforced/rglass, +/obj/structure/railing{ + dir = 8 + }, +/obj/machinery/airalarm/directional/south{ + pixel_x = 3; + pixel_y = -32 + }, +/obj/machinery/chem_master, +/obj/effect/turf_decal/bot_red, /turf/open/floor/iron/dark/smooth_large, /area/station/medical/pharmacy) "nIK" = ( @@ -49846,6 +49879,12 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/command/heads_quarters/qm) +"nXW" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 4 + }, +/turf/open/floor/iron/freezer, +/area/station/medical/pharmacy) "nYc" = ( /obj/effect/turf_decal/tile/purple{ dir = 1 @@ -50855,19 +50894,14 @@ /area/station/service/chapel/office) "onJ" = ( /obj/effect/turf_decal/bot, -/obj/structure/rack, -/obj/item/reagent_containers/cup/bottle/phosphorus{ - pixel_x = -5; - pixel_y = 3 - }, -/obj/item/reagent_containers/cup/bottle/potassium{ - pixel_x = 7; - pixel_y = 3 +/obj/machinery/light/cold/directional/south, +/obj/structure/table/glass, +/obj/item/storage/test_tube_rack{ + pixel_y = 10 }, -/obj/item/reagent_containers/cup/bottle/sodium{ - pixel_x = 1 +/obj/item/storage/test_tube_rack{ + pixel_y = 2 }, -/obj/machinery/light/cold/directional/south, /turf/open/floor/iron/white/smooth_large, /area/station/medical/medbay/central) "onK" = ( @@ -51142,12 +51176,12 @@ /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 6 }, -/obj/machinery/disposal/bin, /obj/effect/turf_decal/box, /obj/structure/disposalpipe/trunk{ dir = 8 }, /obj/structure/extinguisher_cabinet/directional/east, +/obj/machinery/disposal/bin, /turf/open/floor/iron/freezer, /area/station/medical/chemistry) "oru" = ( @@ -54791,6 +54825,7 @@ c_tag = "Aft Central Primary Hallway - Fore"; name = "hallway camera" }, +/obj/machinery/door/firedoor, /turf/open/floor/iron/edge{ dir = 8 }, @@ -55586,23 +55621,17 @@ }, /area/station/engineering/atmos) "pAK" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 4 - }, -/obj/machinery/chem_master, -/obj/effect/turf_decal/trimline/yellow/filled/mid_joiner{ - dir = 4 - }, -/obj/machinery/button/door/directional/east{ - id = "chemistry_shutters"; - name = "Shutters Control"; - req_access = list("pharmacy") - }, -/obj/effect/turf_decal/bot_red, /obj/effect/turf_decal/stripes/line{ - dir = 1 + dir = 9 }, -/obj/machinery/light/cold/directional/east, +/obj/structure/railing{ + dir = 9; + layer = 3.1 + }, +/obj/structure/table/reinforced/rglass, +/obj/item/reagent_containers/cup/beaker/large, +/obj/item/reagent_containers/cup/beaker/large, +/obj/item/reagent_containers/dropper, /turf/open/floor/iron/dark/smooth_large, /area/station/medical/pharmacy) "pAZ" = ( @@ -55841,6 +55870,14 @@ /turf/open/floor/plating, /area/station/maintenance/department/crew_quarters/bar) "pDV" = ( +/obj/structure/chair/sofa/bench/right{ + dir = 4; + pixel_x = -5 + }, +/obj/effect/landmark/start/hangover, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, /turf/open/floor/iron/white/smooth_large, /area/station/hallway/primary/central/aft) "pEi" = ( @@ -56212,11 +56249,11 @@ /turf/open/floor/iron/dark/smooth_large, /area/station/service/hydroponics) "pKg" = ( +/obj/effect/turf_decal/bot, /obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 4 + dir = 5 }, -/obj/machinery/chem_mass_spec, -/obj/effect/turf_decal/bot, +/obj/structure/closet/secure_closet/medical1, /turf/open/floor/iron/freezer, /area/station/medical/pharmacy) "pKl" = ( @@ -56264,18 +56301,6 @@ "pKD" = ( /obj/structure/extinguisher_cabinet/directional/north, /obj/effect/turf_decal/bot, -/obj/structure/rack, -/obj/item/reagent_containers/cup/bottle/basic_buffer{ - pixel_x = -5; - pixel_y = 3 - }, -/obj/item/reagent_containers/cup/bottle/acidic_buffer{ - pixel_x = 7; - pixel_y = 3 - }, -/obj/item/reagent_containers/cup/bottle/formaldehyde{ - pixel_x = 1 - }, /turf/open/floor/iron/white/smooth_large, /area/station/medical/medbay/central) "pKM" = ( @@ -56451,11 +56476,11 @@ /turf/open/floor/iron/smooth_large, /area/station/cargo/warehouse) "pNq" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/trimline/blue/filled/warning, /obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/smooth_edge{ dir = 1 }, @@ -57733,16 +57758,6 @@ /obj/structure/table/reinforced, /turf/open/floor/iron/dark/smooth_large, /area/station/ai_monitored/command/storage/eva) -"qcl" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 - }, -/obj/structure/sign/departments/chemistry/pharmacy/directional/west, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/edge{ - dir = 4 - }, -/area/station/hallway/primary/central/aft) "qcq" = ( /obj/effect/turf_decal/trimline/yellow/filled/warning{ dir = 4 @@ -58059,16 +58074,6 @@ dir = 1 }, /area/station/cargo/bitrunning/den) -"qha" = ( -/obj/machinery/chem_heater/withbuffer, -/obj/effect/turf_decal/trimline/yellow/filled/line, -/obj/effect/turf_decal/trimline/yellow/filled/mid_joiner, -/obj/effect/turf_decal/bot_red, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/medical/pharmacy) "qhe" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -58472,7 +58477,7 @@ /area/station/ai_monitored/turret_protected/ai) "qmI" = ( /obj/machinery/flasher/directional/south{ - id = "IsolationCell" + id = "Cell 6" }, /obj/machinery/light/small/broken/directional/south, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -59973,6 +59978,19 @@ /obj/effect/turf_decal/bot, /turf/open/floor/circuit/green/telecomms/mainframe, /area/station/tcommsat/server) +"qIw" = ( +/obj/effect/landmark/start/assistant, +/obj/structure/chair/sofa/bench/left{ + dir = 4; + pixel_x = -5 + }, +/obj/machinery/light/cold/directional/west, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/obj/structure/sign/poster/official/moth_epi/directional/west, +/turf/open/floor/iron/white/smooth_large, +/area/station/hallway/primary/central/aft) "qIx" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -61794,7 +61812,6 @@ /turf/open/floor/iron/dark/small, /area/station/security/prison/work) "rjs" = ( -/obj/effect/turf_decal/bot, /obj/machinery/button/door/directional/south{ id = "ChemStorage"; name = "Shutter Control"; @@ -63459,14 +63476,20 @@ /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 9 }, -/obj/item/stack/sheet/mineral/plasma{ - pixel_y = 3 - }, /obj/structure/sign/poster/official/periodic_table/directional/north, +/obj/machinery/light/cold/directional/north, /obj/structure/table/reinforced/rglass, /obj/machinery/reagentgrinder{ pixel_y = 7 }, +/obj/item/ph_booklet{ + pixel_x = -7; + pixel_y = -2 + }, +/obj/item/stack/sheet/mineral/plasma{ + pixel_y = -5; + pixel_x = 2 + }, /turf/open/floor/iron/freezer, /area/station/medical/pharmacy) "rIF" = ( @@ -65622,19 +65645,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/medical/break_room) -"spF" = ( -/obj/structure/chair/sofa/bench/right{ - dir = 4; - pixel_x = -5 - }, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 8 - }, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron/white/smooth_edge{ - dir = 4 - }, -/area/station/hallway/primary/central/aft) "spI" = ( /obj/structure/flora/grass/jungle, /obj/structure/flora/bush/grassy, @@ -66442,14 +66452,15 @@ pixel_x = 7; pixel_y = 6 }, -/obj/machinery/door/window/left/directional/south{ - name = "Pharmacy Desk"; - req_access = list("pharmacy") - }, /obj/machinery/door/poddoor/shutters/preopen{ id = "chemistry_shutters"; name = "Pharmacy Shutters" }, +/obj/machinery/door/window/left/directional/south{ + name = "Pharmacy Desk"; + req_access = list("pharmacy"); + dir = 1 + }, /turf/open/floor/iron/white/smooth_large, /area/station/medical/pharmacy) "sCQ" = ( @@ -67251,7 +67262,9 @@ /area/station/service/janitor) "sLk" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/duct, +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 4 + }, /turf/open/floor/iron/freezer, /area/station/medical/pharmacy) "sLq" = ( @@ -67392,16 +67405,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/freezer, /area/station/medical/chemistry) -"sMm" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 4 - }, -/obj/structure/closet/secure_closet/chemical, -/obj/item/storage/box/syringes, -/obj/item/storage/box/beakers, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/freezer, -/area/station/medical/pharmacy) "sMs" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 6 @@ -67983,9 +67986,8 @@ /turf/open/floor/iron/smooth_large, /area/station/cargo/sorting) "sUt" = ( -/obj/machinery/holopad, /obj/effect/turf_decal/bot, -/obj/machinery/duct, +/obj/machinery/holopad, /turf/open/floor/iron/freezer, /area/station/medical/pharmacy) "sUu" = ( @@ -68177,16 +68179,6 @@ /obj/item/reagent_containers/cup/glass/shaker, /turf/open/floor/iron, /area/station/service/bar) -"sWj" = ( -/obj/machinery/chem_dispenser{ - layer = 2.7 - }, -/obj/effect/turf_decal/bot_red, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/medical/pharmacy) "sWB" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/tank_holder/extinguisher, @@ -68539,9 +68531,9 @@ "tbw" = ( /obj/structure/table, /obj/effect/turf_decal/bot, -/obj/item/mod/module/plasma_stabilizer, -/obj/item/mod/module/signlang_radio, -/obj/item/mod/module/thermal_regulator, +/obj/item/storage/toolbox/mechanical, +/obj/item/flashlight, +/obj/item/clothing/glasses/meson/engine, /turf/open/floor/iron/dark/smooth_large, /area/station/engineering/main) "tbD" = ( @@ -68819,10 +68811,20 @@ /turf/open/floor/iron/kitchen, /area/station/service/kitchen/abandoned) "tfc" = ( -/obj/item/storage/toolbox/mechanical, -/obj/item/reagent_containers/spray/cleaner, /obj/item/radio/intercom/directional/east, -/obj/structure/table/glass, +/obj/structure/rack/shelf, +/obj/item/reagent_containers/cup/bottle/potassium{ + pixel_x = 7; + pixel_y = 3 + }, +/obj/item/reagent_containers/cup/bottle/phosphorus{ + pixel_x = -5; + pixel_y = 3 + }, +/obj/item/reagent_containers/cup/bottle/sodium{ + pixel_x = 1 + }, +/obj/effect/turf_decal/bot, /turf/open/floor/iron/white/smooth_large, /area/station/medical/medbay/central) "tfi" = ( @@ -69391,6 +69393,9 @@ /obj/effect/decal/cleanable/greenglow, /turf/open/floor/iron/smooth, /area/station/maintenance/aft/lesser) +"tnx" = ( +/turf/closed/wall, +/area/station/hallway/primary/central/aft) "tnD" = ( /obj/machinery/power/solar_control{ dir = 4; @@ -70003,25 +70008,28 @@ /turf/open/floor/iron/dark/smooth_large, /area/station/maintenance/disposal/incinerator) "tvg" = ( +/obj/item/radio/intercom/directional/east, /obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 4 - }, -/obj/structure/rack, -/obj/item/book/manual/wiki/chemistry{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/book/manual/wiki/grenades, -/obj/item/book/manual/wiki/plumbing{ - pixel_x = 4; - pixel_y = -4 + dir = 5 }, -/obj/item/radio/intercom/directional/east, -/obj/effect/turf_decal/bot, -/obj/item/plunger{ - pixel_x = -9 +/obj/structure/table/reinforced/rglass, +/obj/item/stack/ducts/fifty, +/obj/item/stack/ducts/fifty, +/obj/item/stack/ducts/fifty, +/obj/item/stack/ducts/fifty, +/obj/item/stack/ducts/fifty, +/obj/item/stack/ducts/fifty, +/obj/item/stack/ducts/fifty, +/obj/item/stack/ducts/fifty, +/obj/item/stack/cable_coil, +/obj/item/stack/cable_coil, +/obj/item/screwdriver{ + pixel_y = 6 }, -/obj/item/plunger, +/obj/item/storage/toolbox/mechanical, +/obj/item/clothing/glasses/science, +/obj/item/clothing/glasses/science, +/obj/item/clothing/head/utility/welding, /turf/open/floor/iron/freezer, /area/station/medical/chemistry) "tvm" = ( @@ -70168,14 +70176,16 @@ /turf/open/floor/iron/white/smooth_large, /area/station/commons/fitness/recreation/entertainment) "twU" = ( -/obj/machinery/chem_heater/withbuffer, -/obj/effect/turf_decal/bot_red, /obj/effect/turf_decal/stripes/line{ dir = 10 }, -/obj/structure/disposalpipe/segment{ +/obj/structure/railing{ dir = 10 }, +/obj/item/reagent_containers/cup/beaker/large, +/obj/item/reagent_containers/cup/beaker/large, +/obj/item/reagent_containers/dropper, +/obj/structure/table/reinforced/rglass, /turf/open/floor/iron/dark/smooth_large, /area/station/medical/pharmacy) "twX" = ( @@ -70492,15 +70502,16 @@ /turf/open/floor/iron, /area/station/service/bar) "tAr" = ( -/obj/structure/chair/office/light{ - dir = 8 - }, /obj/effect/turf_decal/trimline/yellow/filled/warning{ dir = 8 }, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/duct, +/obj/structure/chair/office/light{ + dir = 8 + }, /turf/open/floor/iron/freezer, /area/station/medical/pharmacy) "tAw" = ( @@ -70854,15 +70865,6 @@ }, /turf/open/floor/iron/white, /area/station/science/research) -"tFq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/status_display/door_timer{ - id = "IsolationCell"; - name = "Isolation Cell"; - pixel_y = 32 - }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/security/execution/transfer) "tFt" = ( /turf/closed/wall/r_wall, /area/station/maintenance/department/engine/atmos) @@ -71081,12 +71083,11 @@ }, /area/station/hallway/primary/fore) "tIS" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 - }, -/obj/machinery/door/firedoor, /obj/structure/disposalpipe/segment, /obj/effect/landmark/start/hangover, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 1 + }, /turf/open/floor/iron/edge{ dir = 4 }, @@ -71626,12 +71627,12 @@ /obj/effect/turf_decal/trimline/yellow/filled/corner{ dir = 1 }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment{ dir = 10 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/freezer, /area/station/medical/pharmacy) "tRQ" = ( @@ -72044,15 +72045,7 @@ /turf/open/floor/iron/smooth, /area/station/command/cc_dock) "tZj" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 4 - }, -/obj/machinery/requests_console/directional/east{ - department = "Chemistry"; - name = "Chemistry Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/assistance, -/obj/machinery/light/cold/directional/east, +/obj/effect/turf_decal/trimline/yellow/filled/corner, /turf/open/floor/iron/freezer, /area/station/medical/chemistry) "tZu" = ( @@ -72323,9 +72316,19 @@ /turf/open/floor/iron/dark/diagonal, /area/station/hallway/primary/fore) "ucx" = ( +/obj/structure/rack/shelf, +/obj/item/reagent_containers/cup/bottle/nitrogen{ + pixel_x = 7; + pixel_y = 3 + }, +/obj/item/reagent_containers/cup/bottle/mercury{ + pixel_x = -5; + pixel_y = 3 + }, +/obj/item/reagent_containers/cup/bottle/oxygen{ + pixel_x = 1 + }, /obj/effect/turf_decal/bot, -/obj/item/assembly/igniter, -/obj/structure/table/glass, /turf/open/floor/iron/white/smooth_large, /area/station/medical/medbay/central) "ucB" = ( @@ -74586,11 +74589,11 @@ /obj/effect/turf_decal/trimline/blue/line{ dir = 8 }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, /obj/machinery/duct, -/obj/structure/disposalpipe/segment, /turf/open/floor/iron/white/smooth_large, /area/station/medical/medbay/lobby) "uGy" = ( @@ -74861,6 +74864,9 @@ /area/station/ai_monitored/turret_protected/ai) "uKE" = ( /obj/effect/landmark/start/hangover, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, /turf/open/floor/iron/white/smooth_large, /area/station/hallway/primary/central/aft) "uKL" = ( @@ -75000,29 +75006,6 @@ /obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/incinerator_ordmix, /turf/open/floor/engine, /area/station/science/ordnance/burnchamber) -"uMt" = ( -/obj/item/stack/cable_coil, -/obj/item/stack/cable_coil{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/grenade/chem_grenade, -/obj/item/grenade/chem_grenade{ - pixel_x = -2 - }, -/obj/item/screwdriver, -/obj/item/stack/package_wrap{ - pixel_y = 16 - }, -/obj/item/hand_labeler{ - pixel_y = 16 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/table/reinforced/rglass, -/turf/open/floor/iron/freezer, -/area/station/medical/pharmacy) "uMy" = ( /obj/effect/landmark/start/hangover, /turf/open/floor/iron/large, @@ -75333,7 +75316,7 @@ dir = 1 }, /turf/open/floor/iron/airless{ - icon = 'modular_skyrat/modules/advanced_shuttles/icons/erokez.dmi'; + icon = 'modular_nova/modules/advanced_shuttles/icons/erokez.dmi'; icon_state = "floor1" }, /area/space/nearstation) @@ -79212,9 +79195,6 @@ /turf/open/floor/iron/large, /area/station/hallway/primary/fore) "vVO" = ( -/obj/item/reagent_containers/cup/beaker/large, -/obj/item/reagent_containers/cup/beaker/large, -/obj/item/reagent_containers/dropper, /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 1 }, @@ -79229,12 +79209,11 @@ /obj/effect/turf_decal/trimline/yellow/filled/mid_joiner{ dir = 1 }, -/obj/item/ph_meter{ - pixel_x = -15; - pixel_y = 6 +/obj/structure/railing{ + dir = 8 }, -/obj/structure/table/reinforced/rglass, -/obj/machinery/light/cold/directional/north, +/obj/effect/turf_decal/bot_red, +/obj/machinery/chem_heater/withbuffer, /turf/open/floor/iron/dark/smooth_large, /area/station/medical/pharmacy) "vVT" = ( @@ -79997,6 +79976,16 @@ }, /turf/open/floor/iron/smooth, /area/station/engineering/atmos) +"wga" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/edge{ + dir = 4 + }, +/area/station/hallway/primary/central/aft) "wgl" = ( /obj/effect/turf_decal/trimline/blue/filled/warning{ dir = 8 @@ -81103,14 +81092,12 @@ /area/station/cargo/sorting) "wwr" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/item/clothing/gloves/latex, -/obj/item/clothing/gloves/latex, -/obj/item/clothing/glasses/science{ - pixel_y = 3 +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 }, -/obj/item/clothing/glasses/science, -/obj/structure/disposalpipe/segment, -/obj/structure/table/reinforced/rglass, +/obj/structure/closet/secure_closet/chemical, +/obj/item/storage/box/syringes, +/obj/item/storage/box/beakers, /turf/open/floor/iron/freezer, /area/station/medical/pharmacy) "wwA" = ( @@ -81815,9 +81802,6 @@ /turf/open/floor/iron/smooth_large, /area/station/engineering/atmos) "wEK" = ( -/obj/machinery/chem_dispenser{ - layer = 2.7 - }, /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 4 }, @@ -81826,6 +81810,8 @@ }, /obj/effect/turf_decal/bot_red, /obj/effect/turf_decal/stripes/line, +/obj/structure/railing, +/obj/machinery/chem_master, /turf/open/floor/iron/dark/smooth_large, /area/station/medical/pharmacy) "wEO" = ( @@ -82239,9 +82225,9 @@ /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 }, -/obj/structure/sign/poster/official/moth_epi/directional/west, /obj/structure/disposalpipe/segment, /obj/machinery/light/directional/west, +/obj/structure/sign/departments/chemistry/pharmacy/directional/west, /turf/open/floor/iron/edge{ dir = 4 }, @@ -82353,13 +82339,13 @@ /turf/open/floor/iron/dark/smooth_large, /area/station/command/heads_quarters/qm) "wMl" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/trimline/blue/filled/warning{ dir = 1 }, /obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white/smooth_edge, /area/station/medical/medbay/lobby) "wMm" = ( @@ -83689,11 +83675,8 @@ /turf/open/floor/iron/smooth_large, /area/station/maintenance/department/medical) "xkq" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 10 - }, -/obj/item/kirbyplants/random, -/turf/open/floor/iron/white, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating/airless, /area/station/hallway/primary/central/aft) "xkA" = ( /obj/structure/disposalpipe/junction{ @@ -83946,11 +83929,21 @@ /turf/closed/wall/r_wall, /area/station/security/checkpoint/engineering) "xnP" = ( -/obj/machinery/smartfridge/chemistry/preloaded, -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "chemistry_shutters"; - name = "Pharmacy Shutters" +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 6 + }, +/obj/effect/turf_decal/trimline/yellow/filled/mid_joiner, +/obj/effect/turf_decal/trimline/yellow/filled/mid_joiner{ + dir = 4 + }, +/obj/machinery/requests_console/directional/south{ + department = "Pharmacy"; + name = "Pharmacy Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/ore_update, +/obj/effect/turf_decal/bot_red, +/obj/machinery/chem_dispenser{ + layer = 2.7 }, /turf/open/floor/iron/dark/smooth_large, /area/station/medical/pharmacy) @@ -85383,12 +85376,13 @@ /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 10 }, -/obj/machinery/vending/wardrobe/chem_wardrobe, /obj/structure/sign/warning/chem_diamond/directional/west, -/obj/item/toy/figure/chemist{ - pixel_y = 18 +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/box, +/obj/structure/disposalpipe/trunk{ + dir = 1 }, -/obj/effect/turf_decal/bot, +/obj/machinery/light/warm/directional/west, /turf/open/floor/iron/freezer, /area/station/medical/pharmacy) "xHW" = ( @@ -86066,6 +86060,22 @@ }, /turf/open/floor/iron/smooth_large, /area/station/engineering/atmos/hfr_room) +"xSD" = ( +/obj/structure/rack/shelf, +/obj/item/reagent_containers/cup/bottle/lithium{ + pixel_x = 7; + pixel_y = 3 + }, +/obj/item/reagent_containers/cup/bottle/iron{ + pixel_x = -5; + pixel_y = 3 + }, +/obj/item/reagent_containers/cup/bottle/multiver{ + pixel_x = 1 + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/white/smooth_large, +/area/station/medical/medbay/central) "xSK" = ( /turf/open/floor/iron/large, /area/station/commons/storage/primary) @@ -86238,9 +86248,6 @@ pixel_y = 16 }, /obj/item/inspector, -/obj/item/mod/module/signlang_radio{ - pixel_y = 12 - }, /obj/item/mod/module/thermal_regulator{ pixel_y = 16 }, @@ -87160,6 +87167,18 @@ /obj/machinery/light/floor, /turf/open/floor/iron/dark/smooth_large, /area/station/commons/fitness/recreation/entertainment) +"yjP" = ( +/obj/machinery/requests_console/directional/east{ + department = "Chemistry"; + name = "Chemistry Requests Console" + }, +/obj/machinery/light/cold/directional/east, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 6 + }, +/obj/effect/mapping_helpers/requests_console/ore_update, +/turf/open/floor/iron/freezer, +/area/station/medical/chemistry) "yjU" = ( /obj/machinery/computer/slot_machine, /obj/effect/turf_decal/siding/wood{ @@ -87298,7 +87317,6 @@ /turf/open/floor/wood/large, /area/station/command/heads_quarters/rd) "ylT" = ( -/obj/machinery/chem_master, /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 5 }, @@ -87317,6 +87335,9 @@ req_access = list("pharmacy") }, /obj/effect/turf_decal/bot_red, +/obj/machinery/chem_dispenser{ + layer = 2.7 + }, /turf/open/floor/iron/dark/smooth_large, /area/station/medical/pharmacy) @@ -115993,7 +116014,7 @@ dNH abQ pKD stN -fyz +xOU fzP aUc qoG @@ -116762,9 +116783,9 @@ iJn rrm kFJ abQ -xOU +bNE lol -xOU +xSD fzP ofd mtY @@ -119327,13 +119348,13 @@ uQf jLi aAN gut -uMt +nXW sLk sUt -cXE -sWj +kny +nXW nhR -qha +cwd iyx vXr goS @@ -119592,15 +119613,15 @@ pAK mAC nIJ ifq -aVZ -yiT +vXr +goS tZj +yiT +yiT +yiT uUT goS goS -goS -goS -goS aAz yiT bFv @@ -119845,13 +119866,13 @@ gQm fft ayp daB -fDn +mYW kyV xnP ifq -jjf -jjf -fiN +fvW +yiT +yjP lCA kcP xqA @@ -120100,15 +120121,15 @@ rUf ylT wEK pKg -sMm +nXW kgk fDn njQ dPv eEq -spF xkq -jjf +xkq +fiN sNW lLk xgA @@ -120359,10 +120380,10 @@ jfX eaM eaM fDn -fDn +tnx mgm uKE -pDV +qIw pDV loL fiN @@ -120615,7 +120636,7 @@ jvu jvu jvu jvu -qcl +wga tIS kCE jtf @@ -120872,8 +120893,8 @@ shZ gei gei gei -gei ocf +gei qtQ gei shZ @@ -121130,7 +121151,7 @@ xru rfG iYf poe -jyi +rfG rfG uVe rfG @@ -131339,7 +131360,7 @@ pbe okn okn cDj -tFq +lFM rPq gPQ bsr diff --git a/_maps/map_files/generic/CentCom_skyrat_z2.dmm b/_maps/map_files/generic/CentCom_skyrat_z2.dmm index 22be3f59713..540adbbfb4b 100644 --- a/_maps/map_files/generic/CentCom_skyrat_z2.dmm +++ b/_maps/map_files/generic/CentCom_skyrat_z2.dmm @@ -36,14 +36,22 @@ /turf/open/misc/grass/planet, /area/centcom/holding/cafepark) "abK" = ( -/obj/structure/table/wood, -/turf/open/indestructible/hotelwood, -/area/centcom/holding/cafedorms) +/obj/structure/stone_tile/surrounding_tile{ + dir = 8 + }, +/turf/open/floor/fakebasalt, +/area/centcom/holding/cafepark) "abZ" = ( /obj/machinery/vending/clothing, /obj/effect/turf_decal/bot, /turf/open/floor/iron/dark, /area/centcom/interlink) +"acF" = ( +/obj/effect/turf_decal/siding{ + color = "#2e2e2e" + }, +/turf/closed/indestructible/weeb, +/area/centcom/holding/cafe) "adt" = ( /obj/structure/table/wood, /obj/machinery/chem_dispenser/drinks/beer/fullupgrade{ @@ -52,21 +60,47 @@ }, /turf/open/floor/wood, /area/centcom/holding/cafe) +"adu" = ( +/obj/structure/table/wood, +/obj/item/folder/blue{ + pixel_x = -7 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) "adw" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 }, /turf/open/floor/plating, /area/centcom/interlink) +"adR" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood, +/turf/closed/indestructible/wood, +/area/centcom/holding/cafe) "adU" = ( /obj/effect/turf_decal/delivery, /obj/structure/closet/crate/bin, /turf/open/floor/iron, /area/centcom/interlink) "aer" = ( -/obj/structure/chair/sofa/corner/brown, +/obj/structure/table/wood, +/obj/structure/window/spawner/directional/south, +/obj/item/food/poppypretzel{ + pixel_x = -5; + pixel_y = -2 + }, +/obj/item/food/hotcrossbun{ + pixel_x = 5; + pixel_y = 7 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, /turf/open/indestructible/hotelwood, -/area/centcom/holding/cafedorms) +/area/centcom/holding/cafe) "aeG" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/indestructible{ @@ -133,26 +167,16 @@ /obj/item/hatchet, /turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) -"afs" = ( -/obj/structure/fireplace{ - dir = 4 - }, -/turf/open/indestructible/hotelwood{ - desc = "It's really cozy! Great for soft paws!"; - icon = 'modular_skyrat/modules/ghostcafe/icons/carpet_royalblack.dmi'; - icon_state = "carpet"; - name = "soft carpet" - }, -/area/centcom/holding/cafedorms) "afx" = ( /obj/machinery/light/directional/east, -/turf/open/floor/plating, +/turf/open/floor/plating/vox, /area/centcom/holding/cafevox) "afy" = ( -/obj/item/bedsheet/dorms_double, -/obj/structure/bed/double, -/turf/open/indestructible/hotelwood, -/area/centcom/holding/cafedorms) +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/centcom/holding/cafe) "afz" = ( /obj/structure/table, /obj/machinery/coffeemaker, @@ -186,8 +210,11 @@ /turf/open/floor/mineral/titanium/blue, /area/centcom/interlink) "afN" = ( -/obj/structure/flora/bush/sparsegrass, -/turf/open/floor/plating/cobblestone, +/obj/structure/chair/sofa/bench/right{ + dir = 4 + }, +/obj/structure/flora/grass/jungle/b/style_random, +/turf/open/misc/grass/planet, /area/centcom/holding/cafepark) "aga" = ( /obj/structure/table, @@ -206,15 +233,20 @@ /turf/open/floor/grass/fairy, /area/centcom/holding/cafepark) "agk" = ( -/obj/structure/chair/sofa/corp/right{ +/obj/effect/turf_decal/siding/wood/corner{ dir = 4 }, -/turf/open/indestructible/hotelwood{ - desc = "It's really cozy! Great for soft paws!"; - icon = 'modular_skyrat/modules/ghostcafe/icons/carpet_royalblack.dmi'; - icon_state = "carpet"; - name = "soft carpet" +/obj/effect/turf_decal/siding/wood/corner, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/obj/structure/beebox{ + name = "Shrine" }, +/turf/open/floor/wood, /area/centcom/holding/cafe) "agr" = ( /obj/machinery/vending/access/command, @@ -225,9 +257,12 @@ /turf/open/misc/grass/planet, /area/centcom/holding/cafepark) "agA" = ( -/obj/structure/fireplace, -/turf/open/indestructible/hotelwood, -/area/centcom/holding/cafedorms) +/obj/structure/chair/stool/directional/south{ + dir = 8 + }, +/obj/structure/flora/grass/jungle/b/style_random, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) "agF" = ( /obj/structure/flora/bush/grassy/style_4, /turf/open/misc/grass/planet, @@ -275,16 +310,8 @@ /turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) "ahk" = ( -/obj/machinery/button/door{ - id = "cozyfloofspot1"; - name = "Dorm Bolt Control"; - normaldoorcontrol = 1; - pixel_y = 24; - specialfunctions = 4 - }, -/obj/structure/closet/abductor, -/turf/open/floor/plating/abductor, -/area/centcom/holding/cafe) +/turf/open/indestructible/carpet, +/area/centcom/holding/cafepark) "ahs" = ( /obj/structure/flora/bush/leavy/style_2, /turf/open/misc/grass/planet, @@ -295,30 +322,6 @@ /obj/structure/flora/bush/pointy, /turf/open/misc/grass/planet, /area/centcom/holding/cafepark) -"ahC" = ( -/obj/structure/rack, -/obj/item/storage/box/lights/mixed, -/obj/item/clothing/gloves/botanic_leather, -/obj/item/clothing/gloves/color/blue, -/obj/item/clothing/suit/caution, -/obj/item/clothing/suit/caution, -/obj/item/clothing/suit/caution, -/obj/item/clothing/suit/caution, -/obj/item/reagent_containers/cup/bucket, -/obj/item/reagent_containers/cup/bucket, -/obj/item/mop, -/obj/item/mop, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/item/storage/bag/trash, -/turf/open/indestructible/hoteltile{ - icon_state = "white" - }, -/area/centcom/holding/cafe) "ahG" = ( /obj/structure/rack, /obj/item/clothing/mask/breath, @@ -334,9 +337,11 @@ /turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) "ahI" = ( -/obj/effect/spawner/random/entertainment/arcade, -/turf/open/indestructible/hotelwood, -/area/centcom/holding/cafedorms) +/obj/structure/table{ + name = "Jim Norton's Quebecois Coffee table" + }, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) "ahK" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -348,6 +353,13 @@ icon_state = "floor" }, /area/centcom/holding/cafe) +"ahP" = ( +/obj/structure/fans/tiny/invisible, +/obj/machinery/door/airlock{ + id_tag = "CCD2" + }, +/turf/open/indestructible/carpet, +/area/centcom/holding/cafe) "ahQ" = ( /obj/structure/flora/bush/sparsegrass, /turf/open/misc/grass/planet, @@ -373,6 +385,9 @@ /obj/structure/chair/comfy/brown{ dir = 8 }, +/obj/structure/sign/painting/library{ + pixel_y = 32 + }, /turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) "aiw" = ( @@ -386,12 +401,11 @@ /turf/open/lava/fake, /area/centcom/holding/cafepark) "aiD" = ( -/obj/structure/table/wood, -/obj/machinery/chem_dispenser/drinks/fullupgrade{ - density = 0 +/obj/effect/turf_decal/weather/snow/corner{ + dir = 8 }, -/turf/open/indestructible/hotelwood, -/area/centcom/holding/cafedorms) +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafepark) "aiK" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -456,12 +470,7 @@ color = "#B22222"; name = "Curtain" }, -/turf/open/indestructible/hotelwood{ - desc = "It's really cozy! Great for soft paws!"; - icon = 'modular_skyrat/modules/ghostcafe/icons/carpet_royalblack.dmi'; - icon_state = "carpet"; - name = "soft carpet" - }, +/turf/open/indestructible/carpet, /area/centcom/holding/cafe) "ajK" = ( /obj/structure/flora/rock/pile{ @@ -470,11 +479,11 @@ /turf/open/misc/grass/planet, /area/centcom/holding/cafepark) "ajR" = ( -/obj/structure/chair/sofa/middle/brown{ - dir = 8 +/obj/structure/flora/rock/pile{ + icon_state = "basalt3" }, -/turf/open/indestructible/hotelwood, -/area/centcom/holding/cafedorms) +/turf/open/misc/grass/planet, +/area/centcom/holding/cafe) "aka" = ( /obj/effect/turf_decal/box, /obj/effect/turf_decal/caution/stand_clear, @@ -496,14 +505,17 @@ /area/centcom/holding/cafe) "aki" = ( /obj/effect/turf_decal/tile/blue{ - dir = 1 + dir = 8 }, /obj/effect/turf_decal/tile/blue{ - dir = 8 + dir = 4 }, -/obj/effect/turf_decal/tile/blue, -/turf/open/floor/iron/white, -/area/centcom/holding/cafe) +/obj/structure/table, +/obj/structure/bedsheetbin, +/turf/open/indestructible/hoteltile{ + icon_state = "white" + }, +/area/centcom/holding/cafepark) "akp" = ( /obj/structure/flora/bush/flowers_pp, /obj/structure/flora/bush/flowers_br, @@ -541,17 +553,10 @@ }, /area/centcom/holding/cafe) "akS" = ( -/obj/effect/turf_decal/box, -/obj/effect/turf_decal/caution/stand_clear, -/obj/machinery/door/firedoor, -/obj/structure/fans/tiny/invisible, -/obj/machinery/door/airlock/abductor{ - desc = "What could possibly be in here?"; - name = "Laboraty" - }, -/turf/open/indestructible/hoteltile{ - icon_state = "darkfull" +/obj/machinery/door/airlock/medical/glass{ + name = "Medbay" }, +/turf/open/floor/iron/white, /area/centcom/holding/cafe) "akW" = ( /turf/open/indestructible/cobble/side{ @@ -559,18 +564,11 @@ }, /area/centcom/holding/cafepark) "alb" = ( -/obj/structure/mirror{ - pixel_y = 32 - }, -/obj/structure/toilet{ - pixel_y = 14 - }, -/turf/open/indestructible/hoteltile{ - icon = 'modular_skyrat/modules/ghostcafe/icons/floors.dmi'; - icon_state = "titanium_blue_old"; - name = "bathroom floor" - }, -/area/centcom/holding/cafedorms) +/obj/structure/flora/grass/jungle/a/style_3, +/obj/structure/flora/bush/flowers_br, +/obj/effect/light_emitter/interlink, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) "ald" = ( /turf/open/indestructible/cobble/corner{ dir = 4 @@ -582,9 +580,10 @@ /turf/open/misc/grass/planet, /area/centcom/holding/cafepark) "alk" = ( -/obj/machinery/light/directional/east, -/turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/obj/item/bedsheet/dorms_double, +/obj/structure/bed/double, +/turf/open/indestructible/carpet, +/area/centcom/holding/cafe) "alm" = ( /obj/effect/turf_decal/tile/blue{ dir = 1 @@ -605,10 +604,12 @@ }, /area/centcom/holding/cafe) "alo" = ( -/obj/structure/flora/tree/jungle/small{ - icon_state = "tree5" +/obj/structure/flora/grass/jungle, +/mob/living/basic/rabbit, +/obj/effect/light_emitter/interlink, +/turf/open/misc/grass/planet{ + smoothing_flags = 0 }, -/turf/open/misc/grass/planet, /area/centcom/holding/cafepark) "alx" = ( /obj/machinery/door/airlock/centcom{ @@ -643,16 +644,8 @@ /turf/open/misc/grass/planet, /area/centcom/holding/cafepark) "alH" = ( -/obj/structure/table, -/obj/effect/turf_decal/bot, -/obj/machinery/light/directional/south, -/obj/item/surgical_drapes, -/obj/item/surgicaldrill/alien, -/obj/item/cautery/alien, -/obj/item/bonesetter, -/turf/open/indestructible/hoteltile{ - icon_state = "darkfull" - }, +/obj/structure/fans/tiny/invisible, +/turf/open/misc/grass/planet, /area/centcom/holding/cafe) "alM" = ( /obj/item/reagent_containers/cup/glass/shaker{ @@ -722,54 +715,54 @@ /turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) "alW" = ( -/obj/structure/bed/double, -/obj/item/bedsheet/dorms_double, -/turf/open/indestructible/hotelwood{ - desc = "It's really cozy! Great for soft paws!"; - icon = 'modular_skyrat/modules/ghostcafe/icons/carpet_royalblack.dmi'; - icon_state = "carpet"; - name = "soft carpet" - }, -/area/centcom/holding/cafedorms) -"amk" = ( -/obj/structure/chair/sofa/middle/brown{ +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/structure/railing, +/obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/turf/open/indestructible/hotelwood, -/area/centcom/holding/cafedorms) +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/indestructible/hoteltile{ + icon_state = "floor" + }, +/area/centcom/holding/cafepark) +"amk" = ( +/obj/structure/flora/tree/jungle/small/style_random, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) "amu" = ( -/obj/structure/dresser{ - icon = 'icons/obj/antags/abductor.dmi'; - icon_state = "dispenser"; - name = "organ storage" +/obj/structure/stone_tile/block{ + dir = 8 }, -/turf/open/floor/plating/abductor, -/area/centcom/holding/cafe) +/turf/open/lava/fake, +/area/centcom/holding/cafepark) "amv" = ( /obj/item/kirbyplants/random, /turf/open/floor/iron, /area/centcom/interlink) "amx" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/machinery/washing_machine, -/turf/open/indestructible/hoteltile{ - icon_state = "white" +/turf/closed/wall/mineral/stone, +/area/centcom/holding/cafepark) +"amD" = ( +/obj/structure/sink/directional/east, +/obj/machinery/button/door{ + id = "CCShowers"; + name = "Bolt Control"; + normaldoorcontrol = 1; + specialfunctions = 4; + pixel_y = 0; + pixel_x = -25 }, +/turf/open/floor/iron/freezer, /area/centcom/holding/cafe) -"amD" = ( -/obj/structure/chair/sofa/right/brown, -/turf/open/indestructible/hotelwood, -/area/centcom/holding/cafedorms) "amF" = ( -/obj/structure/bed, -/obj/item/bedsheet/dorms, -/turf/open/floor/carpet/royalblack, -/area/centcom/holding/cafedorms) +/turf/open/indestructible/carpet, +/area/centcom/holding/cafe) "amG" = ( /obj/structure/chair/sofa/corp/left, /turf/open/floor/carpet/purple, @@ -787,12 +780,10 @@ /turf/open/misc/grass/planet, /area/centcom/holding/cafepark) "amU" = ( -/obj/machinery/door/airlock{ - id_tag = "CCD2" - }, -/obj/structure/fans/tiny/invisible, -/turf/open/floor/carpet/royalblack, -/area/centcom/holding/cafedorms) +/obj/structure/wall_torch/spawns_lit/directional/north, +/obj/structure/flora/bush/sparsegrass/style_random, +/turf/open/misc/asteroid/snow/indestructible/planet, +/area/centcom/holding/cafepark) "ana" = ( /obj/effect/turf_decal/tile/green, /obj/effect/turf_decal/tile/blue{ @@ -837,10 +828,33 @@ }, /turf/open/floor/iron, /area/centcom/interlink) +"anw" = ( +/obj/structure/chair/sofa/corp/left{ + dir = 1 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) "anz" = ( -/obj/structure/chair/sofa/corp/corner, -/turf/open/floor/carpet/royalblack, -/area/centcom/holding/cafedorms) +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 4 + }, +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/indestructible/hoteltile{ + icon_state = "floor" + }, +/area/centcom/holding/cafepark) "anC" = ( /obj/structure/flora/rock/pile/jungle/large{ pixel_x = 0; @@ -849,11 +863,13 @@ /turf/open/misc/grass/planet, /area/centcom/holding/cafepark) "anD" = ( -/obj/structure/chair/sofa/corner/brown{ - dir = 4 +/obj/structure/flora/grass/jungle/a/style_3, +/obj/structure/flora/bush/flowers_pp, +/obj/effect/light_emitter/interlink, +/turf/open/misc/grass/planet{ + smoothing_flags = 0 }, -/turf/open/indestructible/hotelwood, -/area/centcom/holding/cafedorms) +/area/centcom/holding/cafepark) "anL" = ( /obj/item/storage/box/donkpockets{ pixel_x = 7 @@ -871,10 +887,10 @@ }, /area/centcom/holding/cafe) "anQ" = ( -/obj/structure/flora/bush/reed, -/turf/open/misc/beach/sand{ - dir = 6 - }, +/obj/effect/light_emitter/interlink, +/obj/structure/railing, +/obj/structure/fans/tiny/invisible, +/turf/open/misc/dirt/planet, /area/centcom/holding/cafepark) "anZ" = ( /obj/machinery/light/cold/directional/east, @@ -905,19 +921,12 @@ }, /area/centcom/holding/cafe) "aoE" = ( -/obj/effect/turf_decal/box, -/obj/effect/turf_decal/caution/stand_clear, -/obj/machinery/door/firedoor, -/obj/structure/fans/tiny/invisible, -/obj/machinery/door/airlock/abductor{ - desc = "What could possibly be in here? Probably naked people."; - id_tag = "cozyfloofspot1"; - name = "Bedroom" - }, -/turf/open/indestructible/hoteltile{ - icon_state = "darkfull" +/obj/effect/turf_decal/weather/snow/corner, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 }, -/area/centcom/holding/cafe) +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafepark) "aoO" = ( /obj/effect/turf_decal/box, /obj/effect/turf_decal/caution/stand_clear, @@ -1050,20 +1059,21 @@ }, /area/centcom/holding/cafe) "apT" = ( -/obj/machinery/button/door{ - id = "CCD1"; - name = "Dorm Bolt Control"; - normaldoorcontrol = 1; - pixel_x = 25; - specialfunctions = 4 +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 }, -/obj/item/kirbyplants/random, -/turf/open/floor/carpet/royalblack, -/area/centcom/holding/cafedorms) -"apW" = ( -/obj/machinery/light/dim/directional/east, -/turf/open/indestructible/hotelwood, -/area/centcom/holding/cafedorms) +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/indestructible/hoteltile{ + icon_state = "floor" + }, +/area/centcom/holding/cafepark) "apX" = ( /turf/open/misc/beach/sand{ dir = 6 @@ -1078,15 +1088,20 @@ /area/centcom/holding/cafe) "aqo" = ( /obj/machinery/light/directional/east, -/turf/open/misc/ashplanet{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15" - }, +/turf/open/indestructible/plating, /area/centcom/holding/cafepark) "aqw" = ( -/obj/structure/table/wood, -/obj/item/toy/cards/deck, -/turf/open/indestructible/hotelwood, -/area/centcom/holding/cafedorms) +/obj/machinery/button/door{ + id = "CCD2"; + name = "Dorm Bolt Control"; + normaldoorcontrol = 1; + pixel_x = 25; + specialfunctions = 4 + }, +/obj/structure/bed/double/pod, +/obj/item/bedsheet/dorms_double, +/turf/open/indestructible/carpet, +/area/centcom/holding/cafe) "aqy" = ( /obj/machinery/vending/wardrobe/cargo_wardrobe/ghost_cafe, /turf/open/indestructible/hotelwood, @@ -1095,8 +1110,8 @@ /turf/open/floor/plating, /area/centcom/interlink) "aqO" = ( -/obj/machinery/photocopier, /obj/machinery/light/directional/south, +/obj/machinery/photocopier/gratis, /turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) "aqP" = ( @@ -1112,51 +1127,31 @@ /turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) "aqV" = ( -/obj/structure/flora/bush/ferny{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/structure/flora/bush/fullgrass{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/structure/flora/bush/flowers_br{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/structure/window/reinforced/spawner/directional/east{ - layer = 2.9 - }, -/obj/structure/window/reinforced/spawner/directional/south, -/turf/open/floor/grass/fairy, -/area/centcom/holding/cafe) +/obj/structure/flora/grass/jungle/a/style_5, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) "aqX" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/structure/mop_bucket/janitorialcart{ - dir = 4 - }, -/turf/open/indestructible/hoteltile{ - icon_state = "white" - }, -/area/centcom/holding/cafe) -"arh" = ( -/obj/effect/turf_decal/tile/blue{ +/obj/structure/closet/crate/bin, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 }, -/obj/effect/turf_decal/tile/blue{ +/obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/structure/chair/office/light{ +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ dir = 1 }, /turf/open/indestructible/hoteltile{ - icon_state = "white" + icon_state = "floor" }, +/area/centcom/holding/cafepark) +"arh" = ( +/turf/open/floor/iron/dark, /area/centcom/holding/cafe) "arp" = ( /obj/effect/turf_decal/tile/green, @@ -1209,10 +1204,9 @@ /turf/closed/indestructible/wood, /area/centcom/holding/cafevox) "asz" = ( -/obj/structure/flora/bush/flowers_br, -/obj/structure/flora/bush/fullgrass, -/obj/structure/flora/bush/pointy, -/turf/open/misc/beach/sand, +/obj/structure/table/wood/fancy/blue, +/obj/machinery/light/directional/north, +/turf/open/indestructible/carpet, /area/centcom/holding/cafepark) "asC" = ( /obj/effect/turf_decal/tile/blue{ @@ -1305,15 +1299,23 @@ }, /area/centcom/holding/cafe) "atF" = ( -/turf/open/indestructible/hotelwood, -/area/centcom/holding/cafedorms) +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 1 + }, +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/centcom/holding/cafe) "atJ" = ( +/obj/machinery/door/window/right/directional/east, /obj/effect/turf_decal/stripes/line{ - dir = 5 + dir = 4 }, -/turf/open/indestructible/hoteltile{ - icon_state = "white" +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 1 }, +/turf/open/floor/iron, /area/centcom/holding/cafe) "atQ" = ( /obj/structure/flora/bush/fullgrass{ @@ -1371,25 +1373,29 @@ /area/centcom/holding/cafepark) "auH" = ( /obj/machinery/light/directional/south, -/turf/open/misc/ashplanet{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15" - }, +/turf/open/indestructible/plating, /area/centcom/holding/cafepark) "auM" = ( /obj/structure/fans/tiny/invisible, /turf/open/indestructible/cobble, /area/centcom/holding/cafepark) "auP" = ( -/obj/structure/bed/double, -/obj/item/bedsheet/dorms_double, -/turf/open/indestructible/hotelwood, -/area/centcom/holding/cafedorms) +/obj/effect/turf_decal/siding{ + color = "#2e2e2e"; + dir = 1 + }, +/turf/open/floor/bamboo, +/area/centcom/holding/cafe) "auQ" = ( -/obj/structure/chair/sofa/corp{ +/obj/structure/stone_tile/block{ dir = 8 }, -/turf/open/floor/carpet/royalblack, -/area/centcom/holding/cafedorms) +/obj/structure/stone_tile/block{ + dir = 4 + }, +/obj/item/flashlight/flare/candle/infinite, +/turf/open/floor/fakebasalt, +/area/centcom/holding/cafepark) "auR" = ( /obj/structure/flora/biolumi/flower{ light_color = "#D9FF00"; @@ -1409,10 +1415,17 @@ /turf/open/misc/grass/planet, /area/centcom/holding/cafepark) "avl" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp/green, -/turf/open/floor/carpet/royalblack, -/area/centcom/holding/cafedorms) +/obj/structure/rack/wooden, +/obj/item/reagent_containers/cup/glass/trophy{ + pixel_y = 16; + pixel_x = 7 + }, +/obj/item/reagent_containers/cup/glass/trophy{ + pixel_y = 16; + pixel_x = -2 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafepark) "avn" = ( /obj/structure/closet/secure_closet/freezer/meat/all_access, /obj/item/food/meat/slab/chicken, @@ -1430,11 +1443,9 @@ /turf/open/floor/iron/showroomfloor, /area/centcom/holding/cafe) "avt" = ( -/obj/structure/chair/sofa/left/brown{ - dir = 4 - }, -/turf/open/indestructible/hotelwood, -/area/centcom/holding/cafedorms) +/obj/structure/flora/grass/jungle/a/style_2, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) "avu" = ( /obj/vehicle/ridden/janicart/upgraded, /obj/item/key/janitor, @@ -1469,14 +1480,15 @@ /turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) "awt" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp/green, -/turf/open/indestructible/hotelwood, -/area/centcom/holding/cafedorms) +/obj/structure/wall_torch/spawns_lit/directional/south, +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafepark) "awv" = ( -/obj/structure/chair/sofa/corp/left, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, /turf/open/indestructible/hotelwood, -/area/centcom/holding/cafedorms) +/area/centcom/holding/cafe) "awA" = ( /obj/structure/chair/comfy/shuttle{ dir = 1 @@ -1504,21 +1516,23 @@ }, /area/centcom/holding/cafe) "awN" = ( -/mob/living/basic/chick, -/turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/obj/structure/chair/sofa/bench{ + dir = 4 + }, +/obj/machinery/light/warm/directional/west, +/turf/open/floor/wood/large, +/area/centcom/holding/cafe) "awQ" = ( /obj/machinery/light/directional/south, /obj/machinery/vending/wardrobe/engi_wardrobe/ghost_cafe, /turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) "awU" = ( -/obj/structure/flora/biolumi/flower{ - light_color = "#D9FF00"; - random_light = null +/obj/structure/railing/wooden_fencing{ + dir = 4 }, -/turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/turf/open/floor/wood/large, +/area/centcom/holding/cafe) "awV" = ( /obj/structure/spacevine{ name = "thick vines"; @@ -1527,29 +1541,34 @@ /turf/open/misc/grass/planet, /area/centcom/holding/cafepark) "awW" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/indestructible/hoteltile{ - icon_state = "white" +/obj/structure/chair/sofa/bench/left{ + dir = 1 }, +/obj/effect/turf_decal/tile/blue/half/contrasted, +/obj/machinery/status_display/evac/directional/south, +/turf/open/floor/iron/white, /area/centcom/holding/cafe) "awY" = ( -/obj/machinery/button/door{ - id = "ghostcafecabin2"; - name = "Dorm Bolt Control"; - normaldoorcontrol = 1; - pixel_y = -24; - specialfunctions = 4 +/obj/structure/table, +/obj/machinery/recharger{ + pixel_x = -2; + pixel_y = 1 }, -/obj/structure/bed/double, -/obj/item/bedsheet/dorms_double, -/turf/open/indestructible/hotelwood{ - desc = "It's really cozy! Great for soft paws!"; - icon = 'modular_skyrat/modules/ghostcafe/icons/carpet_royalblack.dmi'; - icon_state = "carpet"; - name = "soft carpet" +/obj/item/book/manual/wiki/security_space_law{ + pixel_x = 9; + pixel_y = 5 + }, +/obj/item/restraints/handcuffs{ + pixel_x = 1; + pixel_y = -4 }, +/obj/item/restraints/handcuffs{ + pixel_x = 1; + pixel_y = -4 + }, +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark, /area/centcom/holding/cafe) "axa" = ( /turf/open/misc/beach/sand{ @@ -1557,12 +1576,10 @@ }, /area/centcom/holding/cafepark) "axo" = ( -/obj/effect/turf_decal/stripes/line{ +/obj/structure/chair/sofa/corner/brown{ dir = 4 }, -/turf/open/indestructible/hoteltile{ - icon_state = "white" - }, +/turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) "axw" = ( /obj/structure/flora/bush/leavy/style_3, @@ -1584,8 +1601,9 @@ }, /area/centcom/holding/cafe) "axA" = ( -/turf/closed/indestructible/wood, -/area/centcom/holding/cafedorms) +/obj/structure/chair/sofa/bench/left, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) "axB" = ( /obj/structure/chair/sofa/bench{ dir = 8 @@ -1593,25 +1611,30 @@ /turf/open/floor/iron, /area/centcom/interlink) "axC" = ( -/obj/structure/table/wood, -/obj/machinery/chem_dispenser/drinks/beer/fullupgrade{ - density = 0 +/obj/structure/flora/grass/jungle/b/style_5, +/obj/effect/light_emitter/interlink, +/turf/open/misc/grass/planet{ + smoothing_flags = 0 }, -/turf/open/indestructible/hotelwood, -/area/centcom/holding/cafedorms) +/area/centcom/holding/cafepark) "axD" = ( -/turf/open/indestructible/hoteltile{ - icon = 'modular_skyrat/modules/ghostcafe/icons/floors.dmi'; - icon_state = "titanium_blue_old"; - name = "bathroom floor" +/obj/structure/curtain, +/obj/machinery/light/floor{ + alpha = 0; + invisibility = 100; + light_range = 10; + nightshift_light_power = 10 }, -/area/centcom/holding/cafedorms) +/turf/open/indestructible/bathroom, +/area/centcom/holding/cafe) "axF" = ( -/obj/structure/chair/sofa/left/brown{ - dir = 8 +/obj/structure/bed/dogbed, +/obj/item/pillow/random{ + pixel_y = 4; + pixel_x = -3 }, -/turf/open/indestructible/hotelwood, -/area/centcom/holding/cafedorms) +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafepark) "axJ" = ( /turf/open/misc/beach/sand{ dir = 4 @@ -1666,10 +1689,12 @@ /turf/open/misc/grass/planet, /area/centcom/holding/cafepark) "aye" = ( -/obj/machinery/light/directional/east, -/obj/structure/table/wood, -/turf/open/indestructible/hotelwood, -/area/centcom/holding/cafedorms) +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/white, +/area/centcom/holding/cafe) "ayj" = ( /obj/structure/fluff/tram_rail/anchor{ desc = "This probably won't stop a titanium tram from hitting the wall, but it's the thought that counts."; @@ -1710,15 +1735,24 @@ /turf/open/misc/dirt/planet, /area/centcom/holding/cafepark) "ayt" = ( -/obj/structure/table/wood/fancy/blue, -/obj/machinery/light/directional/north, -/turf/open/indestructible/hotelwood{ - desc = "It's really cozy! Great for soft paws!"; - icon = 'modular_skyrat/modules/ghostcafe/icons/carpet_royalblack.dmi'; - icon_state = "carpet"; - name = "soft carpet" +/obj/structure/chair/sofa/bench/left, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 }, -/area/centcom/holding/cafe) +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/indestructible/hoteltile{ + icon_state = "floor" + }, +/area/centcom/holding/cafepark) "ayx" = ( /obj/effect/turf_decal/tile/green{ dir = 1 @@ -1764,11 +1798,10 @@ }, /area/centcom/holding/cafe) "azj" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/light/directional/north, -/turf/open/indestructible/hoteltile{ - icon_state = "darkfull" +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 4 }, +/turf/open/floor/iron/white, /area/centcom/holding/cafe) "azk" = ( /obj/structure/flora/tree/jungle/small, @@ -1804,12 +1837,12 @@ /turf/open/misc/dirt/planet, /area/centcom/holding/cafepark) "azB" = ( -/turf/open/floor/plating, +/turf/open/floor/plating/vox, /area/centcom/holding/cafevox) "azC" = ( -/obj/structure/barricade/wooden, -/turf/open/misc/dirt/planet, -/area/centcom/holding/cafepark) +/obj/structure/sign/chalkboard_menu, +/turf/closed/indestructible/steel, +/area/centcom/holding/cafe) "azR" = ( /obj/structure/fluff/tram_rail{ desc = "This probably won't stop a titanium tram from hitting the wall, but it's the thought that counts."; @@ -1829,17 +1862,16 @@ }, /area/centcom/holding/cafe) "azY" = ( -/turf/open/floor/plating/cobblestone, +/obj/structure/closet/crate/wooden/storage_barrel, +/turf/open/misc/dirt/planet, /area/centcom/holding/cafepark) "aAc" = ( /obj/structure/flora/bush/flowers_pp, /turf/open/misc/grass/planet, /area/centcom/holding/cafepark) "aAd" = ( -/obj/effect/spawner/random/entertainment/arcade, -/obj/machinery/light/directional/north, -/turf/open/indestructible/hotelwood, -/area/centcom/holding/cafedorms) +/turf/open/misc/asteroid/snow/indestructible/planet, +/area/centcom/holding/cafepark) "aAe" = ( /obj/machinery/door/airlock/multi_tile/public/glass{ dir = 4 @@ -1848,31 +1880,68 @@ /area/centcom/interlink) "aAh" = ( /obj/machinery/light/directional/west, -/turf/open/misc/ashplanet{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15" - }, +/turf/open/indestructible/plating, /area/centcom/holding/cafepark) "aAq" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 +/obj/structure/rack/wooden, +/obj/item/perfume/amber{ + pixel_x = -8; + pixel_y = 10 }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 +/obj/item/perfume/cologne{ + pixel_x = -4; + pixel_y = 10 }, -/obj/structure/closet/crate/trashcart, -/turf/open/indestructible/hoteltile{ - icon_state = "white" +/obj/item/perfume/wood{ + pixel_y = 10 + }, +/obj/item/perfume/mint{ + pixel_x = 4; + pixel_y = 10 + }, +/obj/item/perfume/cherry{ + pixel_x = -8; + pixel_y = -5 + }, +/obj/item/perfume/jasmine{ + pixel_x = -4; + pixel_y = -5 + }, +/obj/item/perfume/pear{ + pixel_y = -5 }, +/obj/item/perfume/rose{ + pixel_x = 4; + pixel_y = -5 + }, +/obj/item/perfume/vanilla{ + pixel_x = 8; + pixel_y = 10 + }, +/obj/item/perfume/strawberry{ + pixel_x = 8; + pixel_y = -5 + }, +/obj/structure/window/spawner/directional/east, +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) "aAr" = ( -/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, /turf/open/indestructible/hoteltile{ icon_state = "white" }, -/area/centcom/holding/cafe) +/area/centcom/holding/cafepark) "aAu" = ( /obj/effect/turf_decal/tile/blue{ dir = 1 @@ -1886,13 +1955,9 @@ }, /area/centcom/holding/cafe) "aAv" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/cup/rag, -/obj/machinery/reagentgrinder{ - pixel_y = 8 - }, -/turf/open/indestructible/hotelwood, -/area/centcom/holding/cafedorms) +/obj/structure/sign/departments/medbay/alt, +/turf/closed/indestructible/steel, +/area/centcom/holding/cafe) "aAz" = ( /obj/structure/flora/bush/jungle/a/style_3, /turf/open/misc/grass/planet, @@ -1908,11 +1973,6 @@ /area/centcom/interlink) "aAE" = ( /obj/structure/table/wood, -/obj/item/flashlight/lamp/green{ - pixel_x = -3; - pixel_y = 8; - start_on = 0 - }, /obj/item/camera_film, /obj/item/canvas/twentythree_twentythree, /obj/item/canvas/twentythree_twentythree, @@ -1929,21 +1989,10 @@ /turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) "aAJ" = ( -/obj/effect/turf_decal/siding{ - color = "#2e2e2e" - }, -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/item/flashlight/flare/candle/infinite{ - pixel_x = -19; - pixel_y = -10 - }, -/obj/item/flashlight/flare/candle/infinite{ - pixel_x = -16 - }, -/turf/open/floor/bamboo, -/area/centcom/holding/cafedorms) +/obj/machinery/primitive_stove, +/obj/structure/wall_torch/spawns_lit/directional/west, +/turf/open/floor/stone, +/area/centcom/holding/cafepark) "aAL" = ( /obj/item/reagent_containers/cup/soda_cans/thirteenloko{ pixel_x = -10; @@ -1991,26 +2040,23 @@ /obj/structure/mirror{ pixel_y = 32 }, -/turf/open/indestructible/hotelwood{ - desc = "It's really cozy! Great for soft paws!"; - icon = 'modular_skyrat/modules/ghostcafe/icons/carpet_royalblack.dmi'; - icon_state = "carpet"; - name = "soft carpet" - }, +/turf/open/indestructible/carpet, /area/centcom/holding/cafe) "aAY" = ( -/obj/structure/flora/bush/sunny, -/obj/structure/flora/bush/grassy, -/obj/structure/flora/bush/lavendergrass, -/turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/closed/indestructible/steel, +/area/centcom/holding/cafe) "aBa" = ( /obj/structure/fence{ dir = 4 }, -/turf/open/misc/ashplanet{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15" +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/weather/dirt{ + dir = 8 }, +/turf/open/indestructible/plating, /area/centcom/holding/cafepark) "aBd" = ( /turf/open/indestructible/hoteltile{ @@ -2072,10 +2118,10 @@ }, /area/centcom/holding/cafe) "aBv" = ( -/obj/structure/fence{ +/obj/structure/chair/sofa/corp/right{ dir = 4 }, -/turf/open/floor/iron, +/turf/open/indestructible/carpet, /area/centcom/holding/cafe) "aBH" = ( /obj/effect/turf_decal/tile/neutral{ @@ -2097,22 +2143,21 @@ }, /area/centcom/holding/cafe) "aBT" = ( -/obj/structure/chair/sofa/corp/left{ - dir = 4 - }, -/turf/open/floor/carpet/royalblack, -/area/centcom/holding/cafedorms) +/obj/structure/table/wood, +/turf/open/indestructible/carpet, +/area/centcom/holding/cafe) "aBW" = ( /obj/machinery/hydroponics/constructable, /obj/machinery/light/directional/north, /turf/open/misc/dirt/planet, /area/centcom/holding/cafe) "aCa" = ( -/obj/structure/flora/tree/jungle/small{ - icon_state = "tree3" +/obj/effect/spawner/liquids_spawner, +/obj/machinery/light/floor, +/turf/open/floor/iron/pool/cobble/corner{ + dir = 8 }, -/turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/area/centcom/holding/cafe) "aCc" = ( /obj/item/storage/box/drinkingglasses{ pixel_x = -2; @@ -2138,6 +2183,7 @@ /obj/machinery/power/shuttle_engine/heater{ dir = 4 }, +/obj/effect/light_emitter/interlink, /turf/open/floor/plating{ baseturfs = /turf/open/floor/plating }, @@ -2148,23 +2194,18 @@ }, /area/centcom/holding/cafepark) "aCw" = ( -/obj/structure/chair/sofa/corp, -/turf/open/floor/carpet/royalblack, -/area/centcom/holding/cafedorms) -"aCD" = ( -/obj/structure/table/wood, -/turf/open/indestructible/hotelwood, -/area/centcom/holding/cafe) -"aCF" = ( -/obj/structure/chair/sofa/corp/right{ - dir = 8 +/obj/structure/chair/stool/directional/south{ + dir = 1; + name = "Jim Norton's Quebecois Coffee stool" }, -/turf/open/indestructible/hotelwood{ - desc = "It's really cozy! Great for soft paws!"; - icon = 'modular_skyrat/modules/ghostcafe/icons/carpet_royalblack.dmi'; - icon_state = "carpet"; - name = "soft carpet" +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) +"aCF" = ( +/obj/machinery/button/curtain{ + id = "ghostcafecabin3curtain"; + pixel_y = -25 }, +/turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) "aCK" = ( /obj/effect/turf_decal/tile/green/opposingcorners, @@ -2178,48 +2219,35 @@ /turf/open/misc/grass/planet, /area/centcom/holding/cafepark) "aCQ" = ( -/obj/structure/chair/sofa/left/brown, -/turf/open/indestructible/hotelwood, -/area/centcom/holding/cafedorms) +/obj/structure/flora/bush/fullgrass, +/obj/structure/railing/wooden_fencing, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) "aCR" = ( /obj/item/hilbertshotel/ghostdojo, /turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) "aCS" = ( /obj/machinery/light/directional/west, -/turf/open/floor/plating, +/turf/open/floor/plating/vox, /area/centcom/holding/cafevox) "aCU" = ( -/obj/structure/table/wood/fancy/blue, -/turf/open/indestructible/hotelwood{ - desc = "It's really cozy! Great for soft paws!"; - icon = 'modular_skyrat/modules/ghostcafe/icons/carpet_royalblack.dmi'; - icon_state = "carpet"; - name = "soft carpet" - }, -/area/centcom/holding/cafe) -"aCY" = ( -/obj/item/reagent_containers/dropper, -/obj/item/reagent_containers/cup/beaker{ - pixel_x = 8; - pixel_y = 2 - }, -/obj/structure/table/glass, -/obj/item/storage/box/rxglasses{ - pixel_x = 5; - pixel_y = 10 +/turf/open/misc/grass/planet{ + smoothing_flags = 0 }, -/obj/item/storage/box/bodybags{ - pixel_x = -5; - pixel_y = 10 - }, -/obj/item/storage/box/disks{ - pixel_x = 2; - pixel_y = 2 +/area/centcom/holding/cafepark) +"aCX" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 }, -/turf/open/indestructible/hoteltile{ - icon_state = "darkfull" +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafepark) +"aCY" = ( +/obj/machinery/vending/wardrobe/viro_wardrobe/ghost_cafe, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 }, +/turf/open/floor/iron/white, /area/centcom/holding/cafe) "aDa" = ( /obj/structure/flora/bush/sparsegrass, @@ -2237,9 +2265,10 @@ /turf/open/floor/carpet/purple, /area/centcom/holding/cafe) "aDl" = ( -/obj/structure/chair/sofa/corp/right, -/turf/open/indestructible/hotelwood, -/area/centcom/holding/cafedorms) +/obj/structure/flora/rock/pile/jungle/style_3, +/obj/effect/light_emitter/interlink, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) "aDr" = ( /obj/machinery/chem_master/condimaster, /obj/machinery/light/directional/north, @@ -2257,29 +2286,27 @@ }, /area/centcom/holding/cafe) "aDB" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/vending/wardrobe/robo_wardrobe/ghost_cafe, -/turf/open/indestructible/hoteltile{ - icon_state = "darkfull" +/obj/effect/turf_decal/weather/snow/corner{ + dir = 10 }, -/area/centcom/holding/cafe) +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafepark) "aDC" = ( /turf/closed/indestructible/opshuttle, /area/centcom/holding/cafe) "aDQ" = ( -/obj/effect/turf_decal/box, -/obj/effect/turf_decal/caution/stand_clear, -/obj/machinery/door/firedoor, -/obj/structure/fans/tiny/invisible, -/obj/machinery/door/airlock/abductor{ - desc = "What could possibly be in here? Probably naked people."; - id_tag = "ghostcafecabin2"; - name = "Bedroom" +/obj/machinery/door/window/left/directional/west{ + base_state = "right"; + dir = 1; + icon_state = "right"; + name = "Monkey Pen"; + pixel_y = 2; + req_access = list("genetics") }, /turf/open/indestructible/hoteltile{ icon_state = "darkfull" }, -/area/centcom/holding/cafe) +/area/centcom/holding/cafepark) "aDY" = ( /obj/machinery/processor, /obj/machinery/light/directional/west, @@ -2301,13 +2328,12 @@ /turf/open/floor/grass/fairy, /area/centcom/holding/cafepark) "aEm" = ( -/obj/structure/table/wood, -/obj/item/book/manual/wiki/barman_recipes{ - pixel_x = -4; - pixel_y = 7 +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 }, -/turf/open/indestructible/hotelwood, -/area/centcom/holding/cafedorms) +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/centcom/holding/cafe) "aEp" = ( /obj/machinery/chem_dispenser/mutagensaltpeter, /turf/open/indestructible/hoteltile{ @@ -2341,10 +2367,10 @@ /turf/open/floor/grass/fairy, /area/centcom/holding/cafepark) "aEX" = ( -/obj/structure/table/wood, -/obj/item/paper_bin, -/turf/open/floor/carpet/royalblack, -/area/centcom/holding/cafedorms) +/obj/structure/wall_torch/spawns_lit/directional/south, +/obj/structure/flora/bush/sparsegrass/style_random, +/turf/open/misc/asteroid/snow/indestructible/planet, +/area/centcom/holding/cafepark) "aFe" = ( /obj/structure/table/wood, /turf/open/floor/wood, @@ -2366,22 +2392,9 @@ }, /area/centcom/holding/cafepark) "aFy" = ( -/obj/effect/turf_decal/siding{ - color = "#2e2e2e"; - dir = 4 - }, -/obj/structure/bed/double{ - pixel_y = -9 - }, -/obj/item/flashlight/flare/candle/infinite{ - pixel_x = 9; - pixel_y = 29 - }, -/obj/item/bedsheet/dorms_double{ - pixel_y = -9 - }, -/turf/open/floor/bamboo, -/area/centcom/holding/cafedorms) +/obj/structure/mineral_door/wood, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) "aFB" = ( /obj/structure/flora/bush/ferny, /turf/open/misc/grass/planet, @@ -2393,30 +2406,16 @@ /turf/open/misc/grass/planet, /area/centcom/holding/cafepark) "aFK" = ( +/obj/structure/table/optable, +/obj/effect/turf_decal/tile/purple/half/contrasted, /obj/machinery/light/directional/south, -/obj/structure/table/wood, -/turf/open/indestructible/hotelwood, -/area/centcom/holding/cafedorms) +/turf/open/floor/iron, +/area/centcom/holding/cafe) "aFN" = ( -/obj/structure/flora/bush/sunny{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/structure/flora/bush/grassy{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/structure/window/reinforced/spawner/directional/west, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/flora/bush/flowers_br{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/structure/flora/bush/ferny, -/obj/structure/window/reinforced/spawner/directional/east{ - layer = 2.9 +/obj/effect/spawner/liquids_spawner, +/turf/open/indestructible/cobble/side{ + dir = 8 }, -/turf/open/floor/grass/fairy, /area/centcom/holding/cafe) "aFP" = ( /turf/open/misc/grass/planet, @@ -2428,11 +2427,8 @@ /turf/open/misc/grass/planet, /area/centcom/holding/cafepark) "aGb" = ( -/obj/structure/curtain/cloth/fancy/mechanical{ - id = "ghostcafecabin3curtain" - }, -/turf/closed/indestructible/fakeglass, -/area/centcom/holding/cafedorms) +/turf/closed/indestructible/riveted/boss, +/area/centcom/holding/cafepark) "aGg" = ( /obj/structure/flora/bush/large/style_2, /turf/open/misc/grass/planet, @@ -2491,9 +2487,7 @@ light_range = 10; nightshift_light_power = 10 }, -/turf/open/misc/ashplanet{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15" - }, +/turf/open/indestructible/plating, /area/centcom/holding/cafepark) "aGT" = ( /obj/effect/turf_decal/tile/neutral{ @@ -2550,40 +2544,31 @@ }, /area/centcom/holding/cafe) "aHi" = ( -/obj/machinery/button/door{ - id = "ghostcafecabin1"; - name = "Dorm Bolt Control"; - normaldoorcontrol = 1; - pixel_y = 24; - specialfunctions = 4 - }, +/obj/structure/fake_stairs/wood/directional/east, /turf/open/indestructible/hotelwood, -/area/centcom/holding/cafedorms) +/area/centcom/holding/cafe) "aHj" = ( -/obj/effect/turf_decal/bot, -/obj/structure/grandfatherclock{ - desc = "An alien console, it's completely holographic and is complete gibberish with phrases like 'Bogos Binted' flying across the screen."; - icon = 'icons/obj/antags/abductor.dmi'; - icon_state = "console"; - name = "alien console" - }, -/turf/open/indestructible/hoteltile{ - icon_state = "darkfull" +/obj/structure/flora/bush/ferny{ + pixel_x = -3; + pixel_y = 3 }, -/area/centcom/holding/cafe) -"aHl" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 +/obj/structure/flora/bush/fullgrass{ + pixel_x = -3; + pixel_y = 3 }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 +/obj/structure/flora/bush/flowers_br{ + pixel_x = -3; + pixel_y = 3 }, -/obj/machinery/washing_machine, -/obj/machinery/light/small/directional/north, -/turf/open/indestructible/hoteltile{ - icon_state = "white" +/obj/structure/window/reinforced/spawner/directional/east{ + layer = 2.9 }, -/area/centcom/holding/cafe) +/obj/structure/window/reinforced/spawner/directional/south, +/turf/open/floor/grass/fairy, +/area/centcom/holding/cafepark) +"aHl" = ( +/turf/open/floor/wood, +/area/centcom/holding/cafepark) "aHC" = ( /obj/machinery/vending/wardrobe/chef_wardrobe/ghost_cafe, /turf/open/floor/iron/showroomfloor, @@ -2595,15 +2580,11 @@ }, /area/centcom/holding/cafepark) "aHJ" = ( -/obj/item/bedsheet/dorms_double, -/obj/structure/bed/double, -/turf/open/indestructible/hotelwood{ - desc = "It's really cozy! Great for soft paws!"; - icon = 'modular_skyrat/modules/ghostcafe/icons/carpet_royalblack.dmi'; - icon_state = "carpet"; - name = "soft carpet" +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 4 }, -/area/centcom/holding/cafedorms) +/turf/open/floor/fakebasalt, +/area/centcom/holding/cafepark) "aHK" = ( /obj/structure/chair/comfy/brown{ dir = 1 @@ -2630,11 +2611,8 @@ /turf/open/misc/dirt/planet, /area/centcom/holding/cafepark) "aHY" = ( -/obj/effect/turf_decal/bot, -/obj/structure/showcase/machinery/signal_decrypter, -/turf/open/indestructible/hoteltile{ - icon_state = "darkfull" - }, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/iron/recharge_floor, /area/centcom/holding/cafe) "aHZ" = ( /turf/open/misc/beach/coast, @@ -2646,9 +2624,11 @@ }, /area/centcom/holding/cafe) "aIm" = ( -/obj/structure/spacevine, -/turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/obj/effect/turf_decal/siding{ + color = "#2e2e2e" + }, +/turf/open/floor/bamboo, +/area/centcom/holding/cafe) "aIp" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -2658,9 +2638,7 @@ }, /area/centcom/holding/cafe) "aIr" = ( -/turf/open/misc/ashplanet{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15" - }, +/turf/open/indestructible/plating, /area/centcom/holding/cafepark) "aIt" = ( /obj/structure/table/wood, @@ -2713,16 +2691,11 @@ /turf/open/misc/grass/planet, /area/centcom/holding/cafepark) "aII" = ( -/obj/structure/chair/comfy/brown{ - color = "#c45c57"; - desc = "Remarkably soft, with plush cozy cushions, premium memory-foam and covered in stain-resistant fabric. Made by Kat-Kea???!"; - name = "Premium Cozy Chair" +/obj/structure/chair/comfy/barber_chair{ + dir = 8 }, /turf/open/indestructible/hotelwood, -/area/centcom/holding/cafedorms) -"aIN" = ( -/turf/open/floor/carpet/royalblack, -/area/centcom/holding/cafedorms) +/area/centcom/holding/cafe) "aIU" = ( /obj/structure/bodycontainer/crematorium{ dir = 4; @@ -2773,26 +2746,36 @@ /turf/open/floor/plating, /area/centcom/interlink) "aJP" = ( -/obj/machinery/button/door{ - id = "CCD2"; - name = "Dorm Bolt Control"; - normaldoorcontrol = 1; - pixel_x = 25; - specialfunctions = 4 +/obj/structure/chair/sofa/bench/right{ + dir = 1 }, -/obj/structure/bed/double/pod, -/obj/item/bedsheet/dorms_double, -/turf/open/floor/carpet/royalblack, -/area/centcom/holding/cafedorms) +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/indestructible/hoteltile{ + icon_state = "floor" + }, +/area/centcom/holding/cafepark) "aJT" = ( /turf/open/indestructible/cobble/side{ dir = 4 }, /area/centcom/holding/cafepark) "aJX" = ( -/obj/structure/sink/directional/west, -/turf/open/indestructible/hotelwood, -/area/centcom/holding/cafedorms) +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/flora/bush/jungle/b, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafe) "aKa" = ( /obj/effect/turf_decal/weather/dirt{ dir = 10 @@ -2828,18 +2811,9 @@ }, /area/centcom/holding/cafepark) "aKQ" = ( -/obj/structure/toilet, -/obj/structure/curtain{ - alpha = 250; - color = "#292929"; - name = "Curtain"; - pixel_x = 2 - }, -/obj/effect/turf_decal/tile/red/anticorner{ - dir = 1 - }, -/turf/open/floor/iron, -/area/centcom/holding/cafe) +/obj/structure/chair/wood, +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafepark) "aKU" = ( /obj/effect/turf_decal/stripes/asteroid/line{ dir = 8 @@ -2847,42 +2821,31 @@ /turf/open/floor/plating, /area/centcom/interlink) "aKX" = ( -/obj/machinery/light/directional/south, -/turf/open/indestructible/hotelwood, -/area/centcom/holding/cafedorms) -"aLe" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/structure/chair/office/light{ +/obj/structure/window/reinforced/spawner/directional/west, +/turf/open/floor/iron/dark/side{ dir = 4 }, -/turf/open/indestructible/hoteltile{ - icon_state = "white" - }, /area/centcom/holding/cafe) -"aLu" = ( -/obj/structure/table/wood, -/obj/machinery/light/floor{ - alpha = 0; - invisibility = 100; - light_range = 10; - nightshift_light_power = 10 - }, -/obj/item/reagent_containers/cup/glass/mug/tea, -/turf/open/indestructible/hotelwood, -/area/centcom/holding/cafedorms) -"aLz" = ( -/obj/structure/chair/sofa/corp/corner{ +"aLe" = ( +/obj/structure/chair/sofa/right/brown{ dir = 4 }, -/turf/open/floor/carpet/royalblack, -/area/centcom/holding/cafedorms) +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) +"aLu" = ( +/obj/structure/fake_stairs/wood/directional/north, +/turf/open/floor/wood, +/area/centcom/holding/cafepark) "aLD" = ( /turf/open/misc/beach/coast{ dir = 5 }, /area/centcom/holding/cafepark) +"aLF" = ( +/obj/effect/spawner/liquids_spawner, +/obj/structure/chair/sofa/bench/corner, +/turf/open/floor/iron/pool/cobble/corner, +/area/centcom/holding/cafe) "aLH" = ( /obj/structure/flora/bush/fullgrass, /turf/open/misc/grass/planet, @@ -2940,11 +2903,11 @@ /turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) "aMG" = ( -/obj/structure/chair/sofa/corp/left{ - dir = 1 - }, -/turf/open/indestructible/hotelwood, -/area/centcom/holding/cafedorms) +/obj/structure/fans/tiny/invisible, +/obj/structure/flora/grass/jungle/b, +/obj/effect/light_emitter/interlink, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) "aMJ" = ( /obj/structure/flora/tree/jungle, /turf/open/misc/grass/planet, @@ -2956,31 +2919,20 @@ /turf/open/floor/iron, /area/centcom/interlink) "aMQ" = ( -/obj/structure/chair/sofa/corp/left{ - dir = 8 - }, -/turf/open/indestructible/hotelwood{ - desc = "It's really cozy! Great for soft paws!"; - icon = 'modular_skyrat/modules/ghostcafe/icons/carpet_royalblack.dmi'; - icon_state = "carpet"; - name = "soft carpet" - }, -/area/centcom/holding/cafe) +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafepark) "aMR" = ( /obj/machinery/power/shuttle_engine/large{ dir = 4 }, +/obj/effect/light_emitter/interlink, /turf/open/floor/plating{ baseturfs = /turf/open/floor/plating }, /area/centcom/holding/cafe) "aMV" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/indestructible/hoteltile{ - icon_state = "white" - }, +/obj/structure/chair/sofa/right/brown, +/turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) "aMW" = ( /obj/structure/flora/grass/green{ @@ -2988,35 +2940,32 @@ }, /turf/open/misc/grass/planet, /area/centcom/holding/cafepark) -"aNa" = ( -/obj/structure/mineral_door/wood, -/turf/open/indestructible/hotelwood, -/area/centcom/holding/cafedorms) "aNd" = ( -/obj/structure/sink/directional/east, -/obj/structure/mirror{ - pixel_y = 32 - }, -/obj/structure/toilet{ - pixel_y = 14 - }, -/turf/open/indestructible/hoteltile{ - icon = 'modular_skyrat/modules/ghostcafe/icons/floors.dmi'; - icon_state = "titanium_blue_old"; - name = "bathroom floor" +/obj/structure/table/wood, +/obj/item/stack/sheet/bone{ + pixel_y = 7; + pixel_x = 3 }, -/area/centcom/holding/cafedorms) +/obj/structure/wall_torch/spawns_lit/directional/south, +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafepark) "aNe" = ( /obj/machinery/chem_master/condimaster, /turf/open/floor/wood, /area/centcom/holding/cafe) "aNg" = ( -/obj/machinery/door/airlock{ - id_tag = "CCD1" +/obj/structure/stone_tile/center, +/obj/structure/stone_tile/surrounding_tile{ + dir = 4 }, -/obj/structure/fans/tiny/invisible, -/turf/open/floor/carpet/royalblack, -/area/centcom/holding/cafedorms) +/obj/structure/stone_tile/surrounding_tile{ + dir = 8 + }, +/obj/structure/stone_tile/surrounding_tile{ + dir = 1 + }, +/turf/open/lava/fake, +/area/centcom/holding/cafepark) "aNi" = ( /obj/item/reagent_containers/cup/glass/bottle/gin{ pixel_x = -7; @@ -3064,17 +3013,23 @@ /turf/open/misc/grass/planet, /area/centcom/holding/cafepark) "aNp" = ( -/obj/machinery/light/directional/west, -/turf/open/indestructible/hotelwood, -/area/centcom/holding/cafedorms) -"aNq" = ( -/obj/structure/flora/biolumi/flower{ - light_power = 0.3; - light_range = 10; - random_light = null +/obj/structure/stone_tile/block, +/obj/structure/stone_tile/block{ + dir = 1 }, -/turf/open/misc/beach/sand, +/obj/item/flashlight/flare/candle/infinite, +/turf/open/floor/fakebasalt, /area/centcom/holding/cafepark) +"aNq" = ( +/obj/machinery/button/door{ + id = "ghostcafecabinb"; + name = "Dorm Bolt Control"; + normaldoorcontrol = 1; + pixel_x = -25; + specialfunctions = 4 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) "aNy" = ( /obj/structure/chair/comfy/shuttle{ dir = 8 @@ -3084,21 +3039,24 @@ }, /area/centcom/holding/cafe) "aNz" = ( -/obj/structure/chair/sofa/corp/right{ - dir = 1 +/obj/machinery/light/directional/east, +/turf/open/floor/iron/dark/side{ + dir = 8 }, -/turf/open/indestructible/hotelwood, -/area/centcom/holding/cafedorms) +/area/centcom/holding/cafe) "aNB" = ( -/obj/machinery/light/directional/east, -/turf/open/indestructible/hotelwood, -/area/centcom/holding/cafedorms) +/obj/structure/flora/bush/leavy/style_3, +/obj/structure/flora/tree/jungle, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) "aNF" = ( -/obj/structure/chair/sofa/corp/left{ - dir = 8 +/obj/structure/fans/tiny/invisible, +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/weather/dirt{ + dir = 1 }, -/turf/open/floor/carpet/royalblack, -/area/centcom/holding/cafedorms) +/turf/open/misc/beach/sand, +/area/centcom/holding/cafepark) "aNK" = ( /obj/structure/flora/bush/flowers_yw{ pixel_x = 3; @@ -3107,17 +3065,13 @@ /turf/open/floor/grass/fairy, /area/centcom/holding/cafepark) "aNT" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/cup/glass/bottle/vodka{ - pixel_x = 3; - pixel_y = 2 - }, -/obj/item/reagent_containers/cup/glass/bottle/whiskey{ - pixel_x = -5; - pixel_y = 4 +/obj/structure/fans/tiny/invisible, +/obj/machinery/door/airlock/wood{ + id_tag = "CCSauna"; + name = "Sauna" }, /turf/open/indestructible/hotelwood, -/area/centcom/holding/cafedorms) +/area/centcom/holding/cafe) "aNU" = ( /obj/structure/closet/crate/wooden/toy, /turf/open/misc/dirt/planet, @@ -3129,11 +3083,13 @@ /obj/structure/table, /obj/item/lightreplacer, /obj/item/lightreplacer, +/obj/item/lightreplacer, +/obj/item/lightreplacer, /turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) "aOc" = ( /obj/machinery/light/directional/south, -/turf/open/floor/plating, +/turf/open/floor/plating/vox, /area/centcom/holding/cafevox) "aOi" = ( /obj/machinery/seed_extractor, @@ -3201,9 +3157,8 @@ /turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) "aOz" = ( -/obj/structure/flora/rock/pile, -/obj/structure/fans/tiny/invisible, -/turf/open/misc/grass/planet, +/obj/effect/light_emitter/interlink, +/turf/open/misc/dirt/planet, /area/centcom/holding/cafepark) "aOG" = ( /obj/structure/closet, @@ -3232,7 +3187,7 @@ }, /obj/item/clothing/glasses/welding, /obj/item/clothing/glasses/welding, -/turf/open/floor/plating, +/turf/open/floor/plating/vox, /area/centcom/holding/cafevox) "aOI" = ( /obj/effect/turf_decal/tile/neutral{ @@ -3264,13 +3219,10 @@ /turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) "aOW" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, /turf/open/indestructible/hoteltile{ - icon_state = "white" + icon_state = "darkfull" }, -/area/centcom/holding/cafe) +/area/centcom/holding/cafepark) "aOY" = ( /obj/structure/curtain, /obj/machinery/light/floor{ @@ -3279,11 +3231,7 @@ light_range = 10; nightshift_light_power = 10 }, -/turf/open/indestructible/hoteltile{ - icon = 'modular_skyrat/modules/ghostcafe/icons/floors.dmi'; - icon_state = "titanium_blue_old"; - name = "bathroom floor" - }, +/turf/open/indestructible/bathroom, /area/centcom/holding/cafedorms) "aOZ" = ( /obj/machinery/light/directional/north, @@ -3304,14 +3252,16 @@ /obj/structure/sink/directional/west, /turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) -"aPx" = ( -/turf/open/indestructible/hotelwood{ - desc = "It's really cozy! Great for soft paws!"; - icon = 'modular_skyrat/modules/ghostcafe/icons/carpet_royalblack.dmi'; - icon_state = "carpet"; - name = "soft carpet" +"aPC" = ( +/obj/structure/railing{ + invisibility = 100; + dir = 8 }, -/area/centcom/holding/cafe) +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) "aPG" = ( /obj/structure/sink/kitchen/directional/east, /turf/open/indestructible/hoteltile{ @@ -3323,19 +3273,18 @@ /turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) "aPU" = ( +/obj/effect/light_emitter/interlink, /turf/open/floor/plating{ baseturfs = /turf/open/floor/plating }, /area/centcom/holding/cafe) "aPV" = ( -/obj/structure/table/wood, -/obj/item/flashlight{ - desc = "A hand-held not-so-emergency light that's very very bright!"; - light_power = 10; - name = "Super Light" +/obj/structure/chair/sofa/bench/right{ + dir = 1 }, -/turf/open/floor/carpet/royalblack, -/area/centcom/holding/cafedorms) +/obj/effect/turf_decal/tile/red/opposingcorners, +/turf/open/floor/iron/dark, +/area/centcom/holding/cafe) "aPY" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -3343,16 +3292,8 @@ /turf/open/floor/wood, /area/centcom/interlink/dorm_rooms) "aPZ" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/indestructible/hoteltile{ - icon_state = "white" - }, +/obj/structure/sign/painting/library_secure, +/turf/closed/indestructible/wood, /area/centcom/holding/cafe) "aQa" = ( /obj/machinery/vending/wardrobe/det_wardrobe, @@ -3375,7 +3316,8 @@ /turf/open/water/beach, /area/centcom/holding/cafepark) "aQw" = ( -/obj/structure/flora/bush/grassy, +/obj/structure/flora/grass/jungle/b/style_random, +/obj/structure/flora/grass/jungle/b/style_random, /turf/open/misc/grass/planet, /area/centcom/holding/cafepark) "aQx" = ( @@ -3408,17 +3350,12 @@ }, /area/centcom/holding/cafe) "aQE" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/cup/glass/shaker{ - pixel_x = 1; - pixel_y = 13 - }, -/obj/item/reagent_containers/cup/glass/bottle/rum{ - pixel_x = -7; - pixel_y = 2 +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/weather/dirt{ + dir = 4 }, -/turf/open/indestructible/hotelwood, -/area/centcom/holding/cafedorms) +/turf/open/indestructible/plating, +/area/centcom/holding/cafepark) "aQK" = ( /obj/structure/closet, /obj/item/stack/sheet/mineral/wood/fifty, @@ -3450,12 +3387,13 @@ /area/centcom/holding/cafe) "aQM" = ( /obj/machinery/portable_atmospherics/canister/nitrogen, -/turf/open/floor/plating, +/turf/open/floor/plating/vox, /area/centcom/holding/cafevox) "aQQ" = ( -/turf/open/indestructible/hoteltile{ - icon_state = "white" +/obj/structure/fireplace{ + dir = 4 }, +/turf/open/indestructible/carpet, /area/centcom/holding/cafe) "aQR" = ( /obj/effect/turf_decal/stripes/line{ @@ -3484,22 +3422,17 @@ /turf/open/floor/wood, /area/centcom/interlink) "aRd" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/indestructible/hoteltile{ - icon_state = "white" - }, -/area/centcom/holding/cafe) +/obj/item/kirbyplants/random, +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafepark) "aRe" = ( /obj/structure/flora/bush/fullgrass, /turf/open/misc/beach/sand, /area/centcom/holding/cafepark) "aRi" = ( +/obj/structure/railing{ + dir = 8 + }, /turf/open/indestructible/cobble/corner{ dir = 1 }, @@ -3509,9 +3442,16 @@ /turf/open/floor/plating, /area/centcom/interlink) "aRo" = ( -/obj/structure/musician/piano, +/obj/structure/table/wood, +/obj/machinery/light/floor{ + alpha = 0; + invisibility = 100; + light_range = 10; + nightshift_light_power = 10 + }, +/obj/item/reagent_containers/cup/glass/mug/tea, /turf/open/indestructible/hotelwood, -/area/centcom/holding/cafedorms) +/area/centcom/holding/cafe) "aRt" = ( /obj/structure/table/wood/fancy/blue, /obj/item/reagent_containers/condiment/peppermill{ @@ -3547,36 +3487,18 @@ /turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) "aRx" = ( -/obj/item/folder/white{ - pixel_x = 4; - pixel_y = -3 - }, -/obj/item/folder/white{ - pixel_x = 4; - pixel_y = -3 - }, -/obj/item/storage/pill_bottle/mutadone, -/obj/item/storage/pill_bottle/mannitol, -/obj/structure/table/glass, -/obj/item/clothing/gloves/latex, -/obj/item/flashlight/pen{ - pixel_x = 4; - pixel_y = 3 +/obj/structure/sink/directional/east, +/obj/structure/mirror{ + pixel_y = 32 }, -/turf/open/indestructible/hoteltile{ - icon_state = "darkfull" +/obj/structure/toilet{ + pixel_y = 14 }, +/turf/open/indestructible/bathroom, /area/centcom/holding/cafe) "aRC" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/indestructible/hoteltile{ - icon_state = "white" - }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark, /area/centcom/holding/cafe) "aRH" = ( /obj/structure/flora/bush/flowers_br{ @@ -3598,8 +3520,14 @@ /turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) "aRP" = ( -/obj/structure/flora/tree/jungle/small, -/turf/open/misc/dirt/planet, +/obj/structure/flora/bush/sparsegrass, +/obj/structure/flora/biolumi/flower{ + light_color = "#D9FF00"; + light_power = 0.3; + light_range = 10; + random_light = null + }, +/turf/open/misc/grass/planet, /area/centcom/holding/cafepark) "aRS" = ( /turf/open/misc/beach/coast/corner{ @@ -3668,54 +3596,29 @@ /turf/open/misc/grass/planet, /area/centcom/holding/cafepark) "aSt" = ( -/obj/item/kirbyplants/random, -/turf/open/floor/carpet/royalblack, -/area/centcom/holding/cafedorms) +/obj/effect/turf_decal/sand, +/turf/open/indestructible/plating, +/area/centcom/holding/cafepark) "aSy" = ( /obj/structure/bookcase/random, /turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) "aSC" = ( -/turf/open/indestructible/hotelwood{ - desc = "It's really cozy! Great for soft paws!"; - icon = 'modular_skyrat/modules/ghostcafe/icons/carpet_royalblack.dmi'; - icon_state = "carpet"; - name = "soft carpet" - }, -/area/centcom/holding/cafedorms) -"aSH" = ( -/obj/structure/dresser{ - pixel_y = 7 - }, -/obj/item/flashlight/lamp/green{ - pixel_x = -3; - pixel_y = 22 - }, -/turf/open/indestructible/hotelwood{ - desc = "It's really cozy! Great for soft paws!"; - icon = 'modular_skyrat/modules/ghostcafe/icons/carpet_royalblack.dmi'; - icon_state = "carpet"; - name = "soft carpet" - }, -/area/centcom/holding/cafedorms) +/obj/structure/chair/stool/directional/south, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) "aSP" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/indestructible/hoteltile{ - icon_state = "white" - }, +/turf/closed/indestructible/rock, /area/centcom/holding/cafe) "aSV" = ( -/obj/structure/chair/sofa/right/brown{ +/obj/structure/stone_tile/block{ + dir = 8 + }, +/obj/structure/stone_tile/block{ dir = 4 }, -/turf/open/indestructible/hotelwood, -/area/centcom/holding/cafedorms) +/turf/open/lava/fake, +/area/centcom/holding/cafepark) "aSY" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -3723,10 +3626,10 @@ /turf/open/floor/plating, /area/centcom/interlink) "aSZ" = ( -/obj/structure/flora/bush/fullgrass, -/obj/structure/flora/bush/flowers_yw, -/obj/structure/flora/bush/sunny, -/turf/open/misc/beach/sand, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 5 + }, +/turf/open/misc/dirt/planet, /area/centcom/holding/cafepark) "aTb" = ( /turf/closed/indestructible/fakeglass, @@ -3745,9 +3648,9 @@ }, /area/centcom/holding/cafe) "aTl" = ( -/mob/living/basic/cow, -/turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/obj/effect/turf_decal/tile/blue/half/contrasted, +/turf/open/floor/iron/white, +/area/centcom/holding/cafe) "aTp" = ( /obj/machinery/light/floor{ alpha = 0; @@ -3756,65 +3659,53 @@ light_range = 20; nightshift_light_power = 10 }, -/turf/open/misc/ashplanet{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15" +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 4 }, +/turf/open/indestructible/plating, /area/centcom/holding/cafepark) "aTu" = ( /obj/structure/flora/bush/grassy/style_2, /turf/open/misc/grass/planet, /area/centcom/holding/cafepark) "aTv" = ( -/obj/structure/dresser, -/turf/open/indestructible/hotelwood, -/area/centcom/holding/cafedorms) +/obj/structure/closet/crate/bin, +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafepark) "aTB" = ( -/obj/structure/flora/bush/fullgrass{ - icon_state = "brflowers_3" +/obj/machinery/light/floor{ + alpha = 0; + invisibility = 100; + light_power = 10; + light_range = 20; + nightshift_light_power = 10 }, -/turf/open/misc/grass/planet, +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 8 + }, +/turf/open/indestructible/plating, /area/centcom/holding/cafepark) "aTD" = ( -/obj/structure/chair/sofa/corp/right{ +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ dir = 4 }, -/obj/machinery/light/directional/west, -/turf/open/floor/carpet/royalblack, -/area/centcom/holding/cafedorms) +/turf/open/indestructible/hoteltile{ + icon_state = "white" + }, +/area/centcom/holding/cafepark) "aTE" = ( /obj/effect/turf_decal/caution, /obj/effect/turf_decal/siding/white, /turf/open/floor/iron, /area/centcom/interlink) "aTG" = ( -/obj/machinery/door/airlock/wood{ - id_tag = "ghostcafecabin3"; - name = "Wooden Cabin" - }, -/obj/structure/fans/tiny/invisible, -/turf/open/indestructible/hotelwood, -/area/centcom/holding/cafedorms) -"aTI" = ( -/obj/structure/table/glass, -/obj/item/storage/box/disks{ - pixel_x = -8; - pixel_y = 10 - }, -/obj/item/storage/box/syringes{ - pixel_x = 7; - pixel_y = 10 - }, -/obj/item/storage/box/beakers{ - pixel_x = 2; - pixel_y = 2 - }, -/obj/item/reagent_containers/spray/cleaner{ - pixel_x = -11 - }, -/turf/open/indestructible/hoteltile{ - icon_state = "darkfull" - }, -/area/centcom/holding/cafe) +/obj/structure/flora/grass/jungle/b/style_5, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) "aTR" = ( /obj/structure/spacevine{ name = "thick vines"; @@ -3828,18 +3719,30 @@ /turf/open/floor/iron, /area/centcom/interlink) "aTV" = ( -/obj/structure/showcase/fakeid{ - name = "console" +/obj/effect/turf_decal/box, +/obj/effect/turf_decal/caution/stand_clear, +/obj/machinery/door/firedoor, +/obj/structure/fans/tiny/invisible, +/obj/machinery/door/airlock/abductor{ + desc = "What could possibly be in here?"; + name = "Laboraty" }, /turf/open/indestructible/hoteltile{ icon_state = "darkfull" }, -/area/centcom/holding/cafe) +/area/centcom/holding/cafepark) "aUd" = ( -/obj/machinery/light/directional/south, -/turf/open/indestructible/hoteltile{ - icon_state = "white" +/obj/machinery/button/door/directional/west{ + id = "ghostcafecell1"; + name = "Prison Cell 1 Lock"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 1 }, +/obj/structure/closet/secure_closet/brig, +/turf/open/floor/iron, /area/centcom/holding/cafe) "aUf" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ @@ -3868,40 +3771,33 @@ }, /area/centcom/holding/cafepark) "aUu" = ( -/obj/structure/chair/sofa/corp/right{ +/obj/structure/chair/sofa/corp/left{ dir = 4 }, -/turf/open/floor/carpet/royalblack, -/area/centcom/holding/cafedorms) +/turf/open/indestructible/carpet, +/area/centcom/holding/cafe) "aUw" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/structure/sink/directional/east, -/turf/open/indestructible/hoteltile{ - icon_state = "white" +/obj/structure/stone_tile/surrounding_tile{ + dir = 1 }, -/area/centcom/holding/cafe) +/turf/open/floor/fakebasalt, +/area/centcom/holding/cafepark) "aUz" = ( /obj/machinery/light/directional/south, /turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) "aUA" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 +/obj/machinery/door/window/left/directional/west{ + dir = 1; + name = "Monkey Pen"; + pixel_y = 2; + req_access = list("genetics") }, -/obj/structure/table, -/obj/structure/bedsheetbin, +/obj/machinery/light/directional/west, /turf/open/indestructible/hoteltile{ - icon_state = "white" + icon_state = "darkfull" }, -/area/centcom/holding/cafe) +/area/centcom/holding/cafepark) "aUK" = ( /obj/effect/turf_decal/box, /obj/effect/turf_decal/caution/stand_clear, @@ -3938,18 +3834,20 @@ }, /area/centcom/holding/cafe) "aVg" = ( -/obj/machinery/door/airlock/wood{ - id_tag = "ghostcafecabin1"; - name = "Wooden Cabin" +/obj/structure/table/wood, +/obj/item/folder/white{ + pixel_x = -4; + pixel_y = -3 + }, +/obj/item/toy/figure/psychologist{ + pixel_x = 4; + pixel_y = 10 }, -/obj/structure/fans/tiny/invisible, /turf/open/indestructible/hotelwood, -/area/centcom/holding/cafedorms) +/area/centcom/holding/cafe) "aVk" = ( /obj/machinery/light/directional/north, -/turf/open/misc/ashplanet{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15" - }, +/turf/open/indestructible/plating, /area/centcom/holding/cafepark) "aVp" = ( /obj/effect/turf_decal/box, @@ -3978,28 +3876,13 @@ /area/centcom/holding/cafepark) "aVC" = ( /obj/machinery/shower/directional/west, -/turf/open/indestructible/hoteltile{ - icon = 'modular_skyrat/modules/ghostcafe/icons/floors.dmi'; - icon_state = "titanium_blue_old"; - name = "bathroom floor" - }, +/turf/open/indestructible/bathroom, /area/centcom/holding/cafedorms) "aVI" = ( -/turf/open/indestructible/cobble/corner{ - dir = 8 - }, +/obj/structure/fake_stairs/directional/east, +/obj/structure/railing, +/turf/open/misc/dirt/planet, /area/centcom/holding/cafepark) -"aVS" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/indestructible/hoteltile{ - icon_state = "white" - }, -/area/centcom/holding/cafe) "aWb" = ( /turf/open/floor/iron/white, /area/centcom/interlink) @@ -4046,9 +3929,14 @@ /turf/open/misc/dirt/planet, /area/centcom/holding/cafepark) "aWp" = ( -/obj/machinery/light/directional/east, -/turf/open/floor/carpet/royalblack, -/area/centcom/holding/cafedorms) +/obj/effect/turf_decal/siding{ + color = "#2e2e2e"; + dir = 9 + }, +/obj/machinery/washing_machine, +/obj/machinery/light/warm/directional/west, +/turf/open/floor/bamboo, +/area/centcom/holding/cafe) "aWq" = ( /obj/effect/turf_decal/tile/blue{ dir = 1 @@ -4062,9 +3950,11 @@ }, /area/centcom/holding/cafe) "aWy" = ( -/obj/machinery/light/directional/north, -/turf/open/indestructible/hotelwood, -/area/centcom/holding/cafedorms) +/obj/structure/flora/bush/flowers_pp, +/turf/open/misc/grass/planet{ + smoothing_flags = 0 + }, +/area/centcom/holding/cafepark) "aWL" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -4086,9 +3976,17 @@ /area/centcom/holding/cafe) "aWP" = ( /obj/structure/fence/door/opened, -/turf/open/misc/ashplanet{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15" +/obj/effect/turf_decal/trimline/yellow/filled/warning, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, +/turf/open/floor/catwalk_floor/iron_smooth, /area/centcom/holding/cafepark) "aWT" = ( /obj/structure/easel, @@ -4113,6 +4011,17 @@ "aXm" = ( /turf/closed/wall/mineral/titanium, /area/centcom/interlink) +"aXn" = ( +/obj/structure/stone_tile/center, +/obj/structure/stone_tile/surrounding_tile{ + dir = 4 + }, +/obj/structure/stone_tile/surrounding_tile{ + dir = 1 + }, +/obj/structure/stone_tile/surrounding_tile, +/turf/open/lava/fake, +/area/centcom/holding/cafepark) "aXA" = ( /obj/structure/flora/grass/green{ icon_state = "snowgrass3gb" @@ -4120,18 +4029,10 @@ /turf/open/misc/beach/sand, /area/centcom/holding/cafepark) "aXF" = ( -/obj/effect/turf_decal/tile/blue{ +/obj/structure/chair/sofa/bench/right{ dir = 1 }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/indestructible/hoteltile{ - icon_state = "white" - }, +/turf/open/floor/iron/dark, /area/centcom/holding/cafe) "aXG" = ( /turf/open/floor/iron/dark, @@ -4147,15 +4048,8 @@ /turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) "aXR" = ( -/obj/machinery/button/door{ - id = "ghostcafecabin3"; - name = "Dorm Bolt Control"; - normaldoorcontrol = 1; - pixel_x = -25; - specialfunctions = 4 - }, -/turf/open/indestructible/hotelwood, -/area/centcom/holding/cafedorms) +/turf/open/floor/iron/freezer, +/area/centcom/holding/cafe) "aXV" = ( /obj/structure/table, /turf/open/indestructible/hotelwood, @@ -4165,26 +4059,33 @@ /turf/open/misc/beach/sand, /area/centcom/holding/cafepark) "aYc" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/vending/wardrobe/science_wardrobe/ghost_cafe, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, /turf/open/indestructible/hoteltile{ - icon_state = "darkfull" + icon_state = "floor" }, -/area/centcom/holding/cafe) +/area/centcom/holding/cafepark) "aYj" = ( /obj/machinery/vending/wardrobe/chap_wardrobe/unholy/ghost_cafe, /turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) "aYk" = ( -/obj/structure/chair/sofa/corp/left{ - dir = 4 - }, -/turf/open/indestructible/hotelwood{ - desc = "It's really cozy! Great for soft paws!"; - icon = 'modular_skyrat/modules/ghostcafe/icons/carpet_royalblack.dmi'; - icon_state = "carpet"; - name = "soft carpet" +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 8 }, +/obj/structure/sink/directional/east, +/turf/open/floor/iron, /area/centcom/holding/cafe) "aYn" = ( /obj/structure/fluff/tram_rail/end{ @@ -4216,11 +4117,12 @@ /turf/open/floor/iron, /area/centcom/interlink) "aYO" = ( -/obj/structure/spacevine, -/obj/structure/mineral_door/wood, -/obj/structure/fans/tiny/invisible, +/obj/structure/table/wood, +/obj/machinery/chem_dispenser/drinks/beer/fullupgrade{ + density = 0 + }, /turf/open/indestructible/hotelwood, -/area/centcom/holding/cafedorms) +/area/centcom/holding/cafe) "aYP" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -4246,27 +4148,25 @@ /turf/open/floor/iron/white, /area/centcom/interlink) "aZq" = ( -/obj/structure/chair/sofa/corp{ - dir = 4 - }, -/turf/open/floor/carpet/royalblack, -/area/centcom/holding/cafedorms) -"aZs" = ( -/obj/machinery/hypnochair, -/turf/open/indestructible/hoteltile{ - icon_state = "darkfull" - }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/indestructible/plating, /area/centcom/holding/cafe) +"aZs" = ( +/obj/structure/flora/rock/pile/jungle/style_2, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) "aZz" = ( -/obj/effect/turf_decal/bot, -/obj/structure/showcase/machinery/implanter{ - icon = 'icons/obj/antags/abductor.dmi'; - icon_state = "experiment"; - name = "pod" - }, -/turf/open/indestructible/hoteltile{ - icon_state = "darkfull" +/obj/structure/table/wood, +/obj/item/stack/sheet/mineral/wood/fifty, +/obj/item/reagent_containers/cup/bucket/wooden, +/obj/machinery/button/door{ + id = "CCSauna"; + name = "Bolt Control"; + normaldoorcontrol = 1; + specialfunctions = 4; + pixel_y = -25 }, +/turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) "aZC" = ( /obj/machinery/deepfryer, @@ -4302,16 +4202,32 @@ }, /area/centcom/holding/cafe) "aZU" = ( -/obj/structure/chair/sofa/right/brown{ +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/structure/chair/sofa/bench/left{ dir = 8 }, -/turf/open/indestructible/hotelwood, -/area/centcom/holding/cafedorms) -"aZW" = ( -/obj/machinery/light/directional/north, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, /turf/open/indestructible/hoteltile{ - icon_state = "darkfull" + icon_state = "floor" }, +/area/centcom/holding/cafepark) +"aZW" = ( +/obj/structure/table/wood, +/obj/machinery/chem_dispenser/drinks/fullupgrade{ + density = 0 + }, +/turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) "bae" = ( /obj/structure/table, @@ -4321,6 +4237,19 @@ }, /turf/open/floor/iron, /area/centcom/interlink) +"baM" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/centcom/holding/cafepark) +"bbW" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/vending/wardrobe/gene_wardrobe/ghost_cafe, +/turf/open/indestructible/hoteltile{ + icon_state = "darkfull" + }, +/area/centcom/holding/cafepark) "bcb" = ( /turf/open/floor/carpet/cyan, /area/centcom/holding/cafe) @@ -4328,6 +4257,12 @@ /obj/structure/sign/poster/random/directional/south, /turf/open/floor/iron, /area/centcom/interlink) +"bcE" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 4 + }, +/turf/open/lava/fake, +/area/centcom/holding/cafepark) "bdI" = ( /obj/structure/railing, /turf/open/floor/iron/dark, @@ -4355,6 +4290,12 @@ }, /turf/open/floor/iron/smooth_large, /area/cruiser_dock) +"bhQ" = ( +/obj/structure/mineral_door/paperframe{ + name = "Shinto Cabin Bedroom" + }, +/turf/open/floor/carpet, +/area/centcom/holding/cafe) "bit" = ( /obj/machinery/door/airlock{ id_tag = "room7"; @@ -4362,6 +4303,18 @@ }, /turf/open/floor/iron, /area/centcom/interlink) +"biB" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/cup/glass/trophy{ + pixel_y = 7; + pixel_x = -11 + }, +/obj/item/reagent_containers/cup/glass/trophy{ + pixel_y = 11; + pixel_x = -1 + }, +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafepark) "biF" = ( /obj/structure/table/wood, /obj/item/paper_bin{ @@ -4370,6 +4323,13 @@ /obj/item/pen, /turf/open/floor/wood, /area/centcom/interlink) +"bja" = ( +/obj/structure/railing/wooden_fencing, +/obj/structure/railing/wooden_fencing{ + dir = 4 + }, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) "bjh" = ( /obj/structure/chair/sofa/bench/left{ dir = 4 @@ -4385,25 +4345,25 @@ /area/centcom/interlink) "bkA" = ( /obj/effect/turf_decal/tile/blue{ - dir = 1 + dir = 8 }, /obj/effect/turf_decal/tile/blue{ - dir = 8 + dir = 4 }, -/obj/machinery/light/directional/west, -/obj/structure/bed/medical/emergency, -/obj/machinery/iv_drip, -/turf/open/floor/iron/white, -/area/centcom/holding/cafe) +/obj/machinery/washing_machine, +/obj/machinery/light/small/directional/north, +/turf/open/indestructible/hoteltile{ + icon_state = "white" + }, +/area/centcom/holding/cafepark) "bll" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 +/obj/effect/turf_decal/stripes/line{ + dir = 9 }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 +/turf/open/indestructible/hoteltile{ + icon_state = "white" }, -/turf/open/floor/iron/white, -/area/centcom/holding/cafe) +/area/centcom/holding/cafepark) "blq" = ( /obj/effect/turf_decal/siding/white/corner{ dir = 1 @@ -4411,6 +4371,11 @@ /obj/effect/landmark/latejoin, /turf/open/floor/iron, /area/centcom/interlink) +"blD" = ( +/obj/structure/railing, +/obj/structure/fans/tiny/invisible, +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafepark) "blI" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/window/reinforced/spawner/directional/south, @@ -4420,6 +4385,23 @@ /obj/item/reagent_containers/cup/glass/coffee_cup, /turf/open/floor/iron, /area/centcom/interlink) +"bnI" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/cup/glass/bottle/moonshine{ + pixel_x = -5; + pixel_y = 7 + }, +/obj/item/reagent_containers/cup/beaker/large/ceramic{ + pixel_x = 9; + pixel_y = 11 + }, +/obj/item/reagent_containers/cup/beaker/large/ceramic{ + pixel_x = 7; + pixel_y = 2 + }, +/obj/structure/wall_torch/spawns_lit/directional/west, +/turf/open/floor/fakebasalt, +/area/centcom/holding/cafepark) "bnU" = ( /obj/structure/flora/tree/stump, /obj/effect/light_emitter/interlink, @@ -4454,6 +4436,10 @@ }, /turf/open/floor/wood, /area/centcom/interlink) +"bqT" = ( +/obj/structure/wall_torch/spawns_lit/directional/north, +/turf/open/floor/fakebasalt, +/area/centcom/holding/cafepark) "brL" = ( /obj/effect/turf_decal/trimline/dark_red/filled/corner{ dir = 8 @@ -4466,6 +4452,14 @@ "bsj" = ( /turf/open/floor/wood, /area/centcom/interlink/dorm_rooms) +"bsO" = ( +/obj/structure/dresser, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/centcom/holding/cafe) "bsT" = ( /obj/machinery/status_display/evac/directional/north, /obj/effect/turf_decal/tile/dark_blue/opposingcorners, @@ -4512,6 +4506,23 @@ icon_state = "darkfull" }, /area/centcom/holding/cafe) +"bvn" = ( +/obj/machinery/door/airlock/security{ + id_tag = "ghostcafecell1"; + name = "Cell 1" + }, +/turf/open/floor/iron, +/area/centcom/holding/cafe) +"bvA" = ( +/obj/machinery/door/window/right/directional/south, +/turf/open/floor/iron/dark/corner{ + dir = 1 + }, +/area/centcom/holding/cafe) +"bwG" = ( +/obj/structure/table/wood, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) "bwP" = ( /obj/machinery/door/airlock/multi_tile/public/glass{ name = "Interlink Longue" @@ -4534,13 +4545,26 @@ /turf/open/floor/wood, /area/centcom/interlink) "bAr" = ( -/obj/structure/flora/biolumi/flower{ - light_power = 0.3; - light_range = 10; - random_light = null +/obj/effect/turf_decal/siding/wood, +/obj/item/flashlight/flare/candle/infinite{ + pixel_x = -12; + pixel_y = -42 }, -/turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/obj/item/fancy_pillow{ + pixel_x = -22; + pixel_y = -7 + }, +/obj/item/fancy_pillow{ + pixel_y = -1 + }, +/turf/open/floor/bamboo, +/area/centcom/holding/cafe) +"bBV" = ( +/obj/structure/showcase/fakeid{ + dir = 4 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) "bBX" = ( /obj/structure/closet/secure_closet/personal, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -4580,6 +4604,11 @@ }, /turf/open/floor/iron/white, /area/centcom/interlink) +"bEV" = ( +/obj/structure/fans/tiny/invisible, +/obj/structure/fake_stairs/wood/directional/north, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) "bFi" = ( /turf/open/misc/beach/coast{ dir = 10 @@ -4591,6 +4620,11 @@ }, /turf/open/misc/asteroid, /area/cruiser_dock) +"bFD" = ( +/obj/effect/spawner/liquids_spawner, +/obj/machinery/light/floor, +/turf/open/floor/iron/pool, +/area/centcom/holding/cafepark) "bFN" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 @@ -4604,18 +4638,6 @@ /obj/structure/alien/weeds, /turf/open/misc/dirt/planet, /area/centcom/holding/cafepark) -"bGE" = ( -/obj/effect/turf_decal/siding/wood, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/machinery/door/airlock/wood{ - id_tag = "ghostcafecabinjap"; - name = "Shinto Cabin" - }, -/obj/structure/fans/tiny/invisible, -/turf/open/floor/carpet, -/area/centcom/holding/cafedorms) "bGH" = ( /obj/effect/turf_decal/trimline/dark_red/filled/arrow_cw{ dir = 8 @@ -4626,10 +4648,29 @@ /obj/effect/turf_decal/trimline/green/filled/arrow_ccw, /turf/open/floor/iron/dark, /area/centcom/interlink) +"bHC" = ( +/obj/structure/flora/bush/large{ + icon_state = "bush3" + }, +/obj/effect/light_emitter/interlink, +/turf/open/misc/grass/planet{ + smoothing_flags = 0 + }, +/area/centcom/holding/cafepark) "bIf" = ( /obj/machinery/biogenerator, /turf/closed/indestructible/wood, /area/centcom/holding/cafe) +"bIL" = ( +/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ + dir = 4 + }, +/obj/structure/extinguisher_cabinet/directional/east, +/turf/open/floor/iron, +/area/centcom/holding/cafe) +"bIO" = ( +/turf/closed/indestructible/weeb, +/area/centcom/holding/cafe) "bJb" = ( /obj/machinery/door/airlock/security/glass{ name = "Interlink Security Post" @@ -4654,6 +4695,12 @@ }, /turf/open/floor/iron/dark, /area/centcom/interlink) +"bLZ" = ( +/obj/structure/chair/sofa/bench/left{ + dir = 4 + }, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) "bNh" = ( /obj/structure/chair/sofa/bench{ dir = 4 @@ -4674,6 +4721,16 @@ }, /turf/open/floor/iron, /area/centcom/interlink) +"bNV" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 8 + }, +/turf/open/indestructible/plating, +/area/centcom/holding/cafepark) "bOl" = ( /obj/effect/turf_decal/siding/white/corner{ dir = 4 @@ -4683,6 +4740,34 @@ }, /turf/open/floor/iron/dark, /area/centcom/interlink) +"bON" = ( +/obj/structure/chair/sofa/bench/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 10 + }, +/obj/machinery/light/small/directional/south, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/indestructible/hoteltile{ + icon_state = "floor" + }, +/area/centcom/holding/cafepark) +"bQR" = ( +/obj/structure/chair/sofa/corp{ + dir = 4 + }, +/turf/open/indestructible/carpet, +/area/centcom/holding/cafe) "bQZ" = ( /obj/structure/reagent_dispensers/plumbed, /turf/open/floor/iron/white, @@ -4691,6 +4776,23 @@ /obj/machinery/vending/dorms, /turf/open/floor/iron/white, /area/centcom/interlink) +"bSf" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/railing{ + dir = 8 + }, +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/fans/tiny/invisible, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafepark) +"bTg" = ( +/obj/machinery/light/directional/south, +/turf/open/indestructible/hoteltile{ + icon_state = "white" + }, +/area/centcom/holding/cafepark) "bTH" = ( /obj/structure/chair/sofa/bench/left{ dir = 4 @@ -4699,12 +4801,11 @@ /turf/open/floor/iron, /area/centcom/interlink) "bTK" = ( -/obj/effect/turf_decal/siding{ - color = "#2e2e2e"; - dir = 1 +/obj/structure/fireplace{ + dir = 8 }, -/turf/open/floor/bamboo, -/area/centcom/holding/cafedorms) +/turf/open/indestructible/carpet, +/area/centcom/holding/cafe) "bTR" = ( /obj/structure/table/reinforced, /obj/item/book/manual/wiki/security_space_law{ @@ -4730,10 +4831,43 @@ /obj/item/bedsheet/random/double, /turf/open/floor/wood, /area/centcom/interlink/dorm_rooms) +"bUS" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 + }, +/obj/structure/railing{ + dir = 5 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/indestructible/hoteltile{ + icon_state = "floor" + }, +/area/centcom/holding/cafepark) +"bVn" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/obj/structure/chair/sofa/bench/left, +/turf/open/floor/iron/white, +/area/centcom/holding/cafe) "bVx" = ( -/obj/machinery/vending/boozeomat/cafe, +/obj/structure/table/wood, +/obj/machinery/coffeemaker/impressa, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/light/directional/north, /turf/open/indestructible/hotelwood, -/area/centcom/holding/cafedorms) +/area/centcom/holding/cafe) "bVH" = ( /obj/machinery/door/poddoor/shutters/window/indestructible{ id = "interlink_hall"; @@ -4759,27 +4893,62 @@ }, /turf/open/floor/iron/dark, /area/centcom/interlink) +"bWA" = ( +/obj/structure/closet/cabinet, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/iron, +/area/centcom/holding/cafe) "bXF" = ( /obj/structure/table/wood, /turf/open/floor/wood, /area/centcom/holding/cafe) +"bYx" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) "bYH" = ( /obj/effect/turf_decal/siding/wood/corner, /obj/structure/table/wood, -/obj/item/flashlight/lamp/green{ - pixel_y = 6 - }, /obj/effect/turf_decal/siding/wood/corner{ dir = 8 }, /turf/open/floor/wood/tile, /area/centcom/interlink) +"bZt" = ( +/obj/structure/chair/sofa/corp/corner, +/turf/open/indestructible/carpet, +/area/centcom/holding/cafe) "cal" = ( /obj/structure/railing{ dir = 1 }, /turf/open/floor/iron/dark, /area/centcom/interlink) +"caJ" = ( +/obj/structure/curtain/cloth/fancy/mechanical{ + icon_state = "bounty-open"; + icon_type = "bounty"; + id = "CCSalon"; + name = "curtain" + }, +/turf/open/floor/iron/stairs/old, +/area/centcom/holding/cafe) +"caY" = ( +/obj/structure/railing/wooden_fencing, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafepark) +"cby" = ( +/obj/structure/railing{ + invisibility = 100; + dir = 8 + }, +/obj/effect/spawner/liquids_spawner, +/turf/open/floor/iron/pool, +/area/centcom/holding/cafepark) "cbF" = ( /obj/effect/turf_decal/siding/wood/corner{ dir = 8 @@ -4802,9 +4971,6 @@ /obj/item/folder/blue{ pixel_y = 19 }, -/obj/item/flashlight/lamp/green{ - pixel_y = 5 - }, /turf/open/floor/wood, /area/centcom/interlink) "cfs" = ( @@ -4815,6 +4981,10 @@ "cfu" = ( /turf/open/floor/grass, /area/centcom/interlink) +"cgU" = ( +/obj/effect/light_emitter/interlink, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) "che" = ( /obj/effect/light_emitter/interlink, /obj/effect/turf_decal/weather/dirt{ @@ -4861,6 +5031,19 @@ /obj/structure/alien/weeds/node, /turf/open/misc/dirt/planet, /area/centcom/holding/cafepark) +"clF" = ( +/obj/structure/chair/sofa/corp/left{ + dir = 8 + }, +/turf/open/indestructible/carpet, +/area/centcom/holding/cafe) +"cmh" = ( +/obj/effect/turf_decal/siding{ + color = "#2e2e2e"; + dir = 8 + }, +/turf/open/floor/bamboo, +/area/centcom/holding/cafe) "cmV" = ( /obj/effect/turf_decal/weather/dirt{ dir = 5 @@ -4868,6 +5051,52 @@ /obj/effect/light_emitter/interlink, /turf/open/floor/grass, /area/centcom/interlink) +"cna" = ( +/obj/structure/chair/wood{ + dir = 1; + layer = 2.8 + }, +/obj/structure/wall_torch/spawns_lit/directional/east, +/turf/open/floor/wood, +/area/centcom/holding/cafepark) +"cnz" = ( +/obj/structure/railing{ + invisibility = 100 + }, +/obj/structure/chair/wood, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafepark) +"cqv" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/window/reinforced/spawner/directional/west, +/turf/open/floor/iron/dark/corner{ + dir = 4 + }, +/area/centcom/holding/cafe) +"cqw" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 8 + }, +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/indestructible/hoteltile{ + icon_state = "floor" + }, +/area/centcom/holding/cafepark) "cqC" = ( /obj/structure/chair/sofa/bench/right{ dir = 4 @@ -4940,6 +5169,11 @@ }, /turf/open/floor/iron/dark, /area/centcom/interlink) +"cxU" = ( +/obj/machinery/firealarm/directional/north, +/obj/structure/showcase/fake_cafe_console, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) "cxX" = ( /obj/structure/closet/syndicate{ desc = "It's a personal storage unit for operative gear." @@ -5017,6 +5251,29 @@ }, /turf/open/floor/wood/tile, /area/centcom/interlink) +"cDr" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/rack/wooden, +/obj/item/flashlight/lantern{ + pixel_x = -5; + pixel_y = 2 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafepark) +"cEt" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 10 + }, +/obj/machinery/smartfridge/drying_rack, +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafepark) +"cEy" = ( +/obj/structure/spacevine, +/obj/structure/fans/tiny/invisible, +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafepark) "cFK" = ( /obj/machinery/light/directional/east, /obj/effect/turf_decal/tile/green/opposingcorners, @@ -5029,6 +5286,14 @@ "cGG" = ( /turf/open/floor/mineral/titanium/blue, /area/centcom/interlink) +"cGX" = ( +/obj/structure/bed, +/obj/item/bedsheet/dorms, +/obj/structure/sign/painting/library_secure{ + pixel_x = 32 + }, +/turf/open/indestructible/carpet, +/area/centcom/holding/cafe) "cHY" = ( /obj/effect/turf_decal/weather/dirt{ dir = 6 @@ -5051,6 +5316,9 @@ }, /turf/open/floor/iron, /area/centcom/interlink) +"cLv" = ( +/turf/open/floor/carpet, +/area/centcom/holding/cafepark) "cLD" = ( /obj/structure/table, /obj/item/storage/medkit/regular{ @@ -5085,13 +5353,9 @@ /turf/open/floor/wood, /area/centcom/interlink) "cMM" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue, -/obj/structure/table/optable, -/turf/open/floor/iron/white, -/area/centcom/holding/cafe) +/obj/structure/stone_tile/slab/cracked, +/turf/open/floor/fakebasalt, +/area/centcom/holding/cafepark) "cNa" = ( /obj/effect/turf_decal/siding/thinplating_new/dark, /turf/open/misc/asteroid, @@ -5101,6 +5365,14 @@ /obj/effect/light_emitter/interlink, /turf/open/floor/grass, /area/centcom/interlink) +"cOu" = ( +/obj/machinery/door/airlock/wood{ + id_tag = "ghostcafecabin1"; + name = "Wooden Cabin" + }, +/obj/structure/fans/tiny/invisible, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) "cOV" = ( /obj/machinery/door/airlock/centcom{ name = "Administrative Offices" @@ -5111,6 +5383,10 @@ /obj/effect/mapping_helpers/airlock/access/any/cent_com/rep_or_captain, /turf/open/floor/iron, /area/centcom/interlink) +"cPo" = ( +/obj/structure/table/abductor, +/turf/open/floor/plating/abductor, +/area/centcom/holding/cafepark) "cQq" = ( /obj/effect/turf_decal/weather/dirt, /obj/structure/hedge, @@ -5118,6 +5394,14 @@ /obj/effect/light_emitter/interlink, /turf/open/floor/grass, /area/centcom/interlink) +"cQH" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/indestructible/hoteltile{ + icon_state = "white" + }, +/area/centcom/holding/cafepark) "cRs" = ( /obj/effect/turf_decal/siding/wood/corner{ dir = 1 @@ -5173,11 +5457,15 @@ /turf/open/floor/iron/freezer, /area/centcom/interlink) "cXb" = ( -/obj/effect/turf_decal/siding{ - color = "#2e2e2e" +/obj/structure/bed/maint{ + pixel_y = 13 }, -/turf/closed/indestructible/weeb, -/area/centcom/holding/cafedorms) +/obj/structure/bed/maint, +/obj/item/bedsheet/black/double{ + dir = 1 + }, +/turf/open/floor/wood, +/area/centcom/holding/cafepark) "cYb" = ( /obj/effect/turf_decal/tile/red/opposingcorners, /obj/effect/turf_decal/siding/dark{ @@ -5211,8 +5499,7 @@ "dai" = ( /obj/item/flashlight/flare/torch{ pixel_x = -4; - pixel_y = -10; - start_on = 1 + pixel_y = -10 }, /turf/open/misc/dirt/planet, /area/centcom/holding/cafepark) @@ -5225,6 +5512,21 @@ /obj/effect/turf_decal/caution/stand_clear, /turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) +"dav" = ( +/obj/structure/railing/corner/end{ + dir = 4 + }, +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafepark) +"dbn" = ( +/obj/structure/mirror{ + pixel_y = 32 + }, +/obj/structure/toilet{ + pixel_y = 14 + }, +/turf/open/indestructible/bathroom, +/area/centcom/holding/cafe) "dbZ" = ( /obj/effect/turf_decal/weather/dirt{ dir = 4 @@ -5243,6 +5545,15 @@ /obj/structure/closet/secure_closet/freezer/kitchen/all_access, /turf/open/floor/iron/showroomfloor, /area/centcom/holding/cafe) +"ddp" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/centcom/holding/cafepark) "deD" = ( /obj/machinery/status_display/shuttle{ pixel_y = -32; @@ -5257,6 +5568,10 @@ /obj/effect/light_emitter/interlink, /turf/open/floor/grass, /area/centcom/interlink) +"dgl" = ( +/obj/effect/spawner/liquids_spawner, +/turf/open/floor/iron/stairs, +/area/centcom/holding/cafepark) "dgo" = ( /obj/item/trench_tool, /obj/item/tank/internals/emergency_oxygen/double, @@ -5274,12 +5589,23 @@ "dgV" = ( /turf/open/floor/iron/white, /area/centcom/interlink/dorm_rooms) +"dhi" = ( +/obj/structure/fans/tiny/invisible, +/obj/structure/fence{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/centcom/holding/cafepark) "djn" = ( -/obj/effect/turf_decal/tile/red/half{ - dir = 1 +/obj/effect/turf_decal/siding/wood{ + dir = 4 }, -/obj/machinery/light/directional/north, -/turf/open/floor/iron, +/obj/structure/fans/tiny, +/obj/structure/mineral_door/wood, +/turf/open/floor/wood/large, /area/centcom/holding/cafe) "dky" = ( /obj/structure/flora/tree/jungle/style_4, @@ -5322,6 +5648,9 @@ /obj/effect/spawner/random/vending/snackvend, /turf/open/floor/iron/dark, /area/centcom/interlink) +"doA" = ( +/turf/open/floor/wood/large, +/area/centcom/holding/cafe) "drE" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -5338,6 +5667,14 @@ /obj/effect/light_emitter/interlink, /turf/open/floor/carpet/red, /area/centcom/interlink) +"dtr" = ( +/obj/machinery/status_display/evac/directional/north, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 1 + }, +/obj/machinery/computer/operating, +/turf/open/floor/iron/white, +/area/centcom/holding/cafe) "dtL" = ( /obj/effect/turf_decal/trimline/blue/filled/warning{ dir = 4 @@ -5378,6 +5715,20 @@ /obj/machinery/duct, /turf/open/floor/iron/freezer, /area/centcom/interlink) +"dyU" = ( +/obj/structure/chair/sofa/corp/corner{ + dir = 4 + }, +/turf/open/indestructible/carpet, +/area/centcom/holding/cafe) +"dzn" = ( +/obj/structure/fence{ + dir = 4 + }, +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/trimline/yellow/filled/warning, +/turf/open/indestructible/plating, +/area/centcom/holding/cafepark) "dAC" = ( /obj/effect/turf_decal/siding/white{ dir = 6 @@ -5411,6 +5762,10 @@ /obj/structure/sign/poster/random/directional/south, /turf/open/floor/wood, /area/centcom/interlink) +"dDF" = ( +/obj/structure/chair/sofa/corp, +/turf/open/indestructible/carpet, +/area/centcom/holding/cafe) "dFj" = ( /obj/machinery/door/airlock/medical/glass{ name = "Interlink Medbay" @@ -5458,10 +5813,38 @@ dir = 1 }, /area/cruiser_dock) +"dIM" = ( +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 8 + }, +/obj/structure/closet/secure_closet/medical2, +/turf/open/floor/iron/white, +/area/centcom/holding/cafe) +"dIR" = ( +/obj/structure/mineral_door/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) "dLq" = ( /obj/structure/sign/poster/random/directional/north, /turf/open/floor/iron/dark, /area/centcom/interlink) +"dMl" = ( +/obj/structure/fermenting_barrel, +/turf/open/floor/fakebasalt, +/area/centcom/holding/cafepark) +"dNn" = ( +/obj/structure/chair/wood{ + dir = 4 + }, +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafepark) +"dNB" = ( +/obj/structure/fake_stairs/directional, +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafepark) "dOC" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/window/reinforced/spawner/directional/south, @@ -5470,6 +5853,9 @@ /obj/item/binoculars, /turf/open/floor/wood, /area/centcom/holding/cafepark) +"dOM" = ( +/turf/open/floor/iron/white, +/area/centcom/holding/cafe) "dOP" = ( /obj/structure/table/glass/plasmaglass, /obj/item/storage/box/beakers{ @@ -5503,6 +5889,14 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/dark, /area/centcom/interlink) +"dPJ" = ( +/obj/machinery/door/airlock{ + id_tag = "CCShowers"; + name = "Showers" + }, +/obj/structure/fans/tiny/invisible, +/turf/open/floor/iron/freezer, +/area/centcom/holding/cafe) "dRs" = ( /obj/structure/closet/crate/freezer, /obj/item/food/canned/tomatoes, @@ -5531,6 +5925,43 @@ /obj/effect/landmark/latejoin, /turf/open/floor/iron/white, /area/centcom/interlink) +"dRI" = ( +/obj/structure/table/reinforced/rglass, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/item/lipstick{ + pixel_x = -11; + pixel_y = 11 + }, +/obj/item/lipstick/black{ + pixel_x = -11; + pixel_y = 6 + }, +/obj/item/lipstick/jade{ + pixel_x = -11; + pixel_y = 1 + }, +/obj/item/lipstick/purple{ + pixel_x = -11; + pixel_y = -4 + }, +/obj/item/lipstick/quantum{ + pixel_x = -11; + pixel_y = -9 + }, +/obj/item/hairbrush{ + pixel_x = 2; + pixel_y = 3 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) +"dSf" = ( +/obj/structure/chair/sofa/bench{ + dir = 8 + }, +/turf/open/floor/wood/large, +/area/centcom/holding/cafe) "dSt" = ( /turf/open/floor/iron/stairs/right{ dir = 1 @@ -5542,9 +5973,12 @@ /turf/open/floor/wood, /area/centcom/interlink) "dUh" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/plating/abductor, -/area/centcom/holding/cafe) +/obj/effect/turf_decal/weather/snow/corner{ + dir = 4 + }, +/obj/structure/wall_torch/spawns_lit/directional/east, +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafepark) "dVb" = ( /obj/effect/turf_decal/weather/dirt, /obj/effect/light_emitter/interlink, @@ -5565,6 +5999,17 @@ /obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/carpet/purple, /area/centcom/holding/cafe) +"dWE" = ( +/obj/machinery/door/airlock{ + id_tag = "CCD1" + }, +/obj/structure/fans/tiny/invisible, +/turf/open/indestructible/carpet, +/area/centcom/holding/cafe) +"dXe" = ( +/obj/structure/flora/grass/jungle/b/style_2, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) "dXJ" = ( /obj/effect/turf_decal/siding/wood/corner{ dir = 8 @@ -5577,6 +6022,16 @@ }, /turf/open/floor/iron/cafeteria, /area/centcom/interlink) +"dYa" = ( +/obj/structure/stone_tile/surrounding_tile/cracked, +/turf/open/floor/fakebasalt, +/area/centcom/holding/cafepark) +"eaJ" = ( +/obj/structure/fence{ + dir = 4 + }, +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafepark) "eaT" = ( /obj/structure/bookcase/random/fiction, /turf/open/floor/wood, @@ -5592,14 +6047,21 @@ /obj/effect/turf_decal/siding/white/corner, /turf/open/floor/iron/dark, /area/centcom/interlink) +"eeZ" = ( +/obj/structure/chair/sofa/corp/right, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) "egn" = ( -/obj/structure/bed/maint, -/obj/item/toy/figure/prisoner, -/obj/effect/turf_decal/tile/red/half{ +/obj/structure/stone_tile/center, +/obj/structure/stone_tile/surrounding_tile{ + dir = 8 + }, +/obj/structure/stone_tile/surrounding_tile{ dir = 1 }, -/turf/open/floor/iron, -/area/centcom/holding/cafe) +/obj/structure/stone_tile/surrounding_tile, +/turf/open/lava/fake, +/area/centcom/holding/cafepark) "egr" = ( /obj/effect/turf_decal/siding/thinplating_new/dark/corner{ dir = 8 @@ -5623,17 +6085,19 @@ /obj/structure/dresser{ pixel_y = 7 }, -/obj/item/flashlight/lamp/green{ - pixel_x = -3; - pixel_y = 22 - }, /turf/open/floor/carpet/red, /area/centcom/holding/cafedorms) +"ejQ" = ( +/obj/machinery/door/airlock/wood{ + id_tag = "ghostcafecabin3"; + name = "Wooden Cabin" + }, +/obj/structure/fans/tiny/invisible, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) "ekp" = ( -/obj/structure/table/wood, -/obj/item/soap/deluxe, -/turf/open/floor/sepia, -/area/centcom/holding/cafedorms) +/turf/closed/indestructible/steel, +/area/centcom/holding/cafepark) "eks" = ( /obj/item/toy/beach_ball, /turf/open/misc/beach/coast/corner{ @@ -5687,10 +6151,30 @@ /obj/machinery/light/cold/directional/west, /turf/open/misc/asteroid, /area/cruiser_dock) +"eon" = ( +/obj/structure/railing{ + invisibility = 100; + dir = 8 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/obj/structure/chair/wood{ + dir = 8 + }, +/turf/open/indestructible/cobble, +/area/centcom/holding/cafepark) "epr" = ( /obj/structure/chair/sofa/left/brown, /turf/open/floor/wood, /area/centcom/holding/cafedorms) +"eqe" = ( +/obj/machinery/door/airlock{ + name = "Locker Room" + }, +/obj/structure/fans/tiny/invisible, +/turf/open/floor/iron, +/area/centcom/holding/cafe) "eqS" = ( /obj/machinery/duct, /turf/open/floor/wood/tile, @@ -5699,6 +6183,14 @@ /obj/machinery/vending/dorms, /turf/open/floor/iron/showroomfloor, /area/centcom/holding/cafe) +"erR" = ( +/obj/structure/flora/grass/jungle/b/style_5, +/mob/living/basic/rabbit, +/obj/effect/light_emitter/interlink, +/turf/open/misc/grass/planet{ + smoothing_flags = 0 + }, +/area/centcom/holding/cafepark) "esx" = ( /obj/effect/decal/cleanable/xenoblood, /obj/structure/alien/weeds, @@ -5736,6 +6228,12 @@ }, /turf/open/floor/iron, /area/centcom/interlink) +"ewl" = ( +/obj/structure/chair/sofa/bench/left{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/centcom/holding/cafe) "exf" = ( /obj/structure/chair/sofa/bench/left{ dir = 4 @@ -5774,6 +6272,21 @@ }, /turf/open/floor/wood/tile, /area/centcom/interlink) +"eAq" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/obj/structure/table, +/obj/item/folder/white{ + pixel_x = 4; + pixel_y = -3 + }, +/obj/item/kirbyplants/fern{ + pixel_y = 14; + pixel_x = -5 + }, +/turf/open/floor/iron/white, +/area/centcom/holding/cafe) "eAA" = ( /turf/closed/indestructible/fakedoor{ desc = "Why would you want to go back, you just got here!"; @@ -5785,9 +6298,20 @@ /obj/effect/turf_decal/bot_white, /turf/open/floor/iron/dark/textured_large, /area/cruiser_dock) +"eDy" = ( +/obj/structure/sauna_oven, +/turf/open/floor/wood/large, +/area/centcom/holding/cafe) "eEg" = ( /turf/open/floor/carpet/blue, /area/centcom/holding/cafepark) +"eFC" = ( +/obj/structure/railing/wooden_fencing, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 8 + }, +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafepark) "eFV" = ( /obj/effect/turf_decal/trimline/green/filled/arrow_cw, /turf/open/floor/iron/dark, @@ -5811,6 +6335,10 @@ }, /turf/open/floor/iron, /area/centcom/interlink) +"eIq" = ( +/obj/structure/chair/sofa/corner/brown, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) "eJP" = ( /obj/structure/table/reinforced, /obj/item/folder{ @@ -5875,6 +6403,31 @@ }, /turf/open/floor/iron, /area/centcom/interlink) +"eNw" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 6 + }, +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafepark) +"eNI" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/indestructible/hoteltile{ + icon_state = "floor" + }, +/area/centcom/holding/cafepark) "eOx" = ( /obj/structure/chair/sofa/bench{ dir = 8 @@ -5918,6 +6471,12 @@ /obj/effect/turf_decal/siding/wood, /turf/open/floor/wood/parquet, /area/centcom/interlink) +"eTt" = ( +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 8 + }, +/turf/open/indestructible/plating, +/area/centcom/holding/cafepark) "eVe" = ( /obj/effect/turf_decal/siding/white{ dir = 1 @@ -5984,6 +6543,43 @@ }, /turf/open/floor/wood, /area/centcom/holding/cafe) +"fbz" = ( +/obj/structure/rack/wooden, +/obj/item/cautery/ashwalker{ + pixel_y = 10 + }, +/obj/item/scalpel/ashwalker{ + pixel_y = 6 + }, +/obj/item/circular_saw/ashwalker{ + pixel_y = -9 + }, +/obj/item/surgicaldrill/ashwalker{ + pixel_y = -7; + pixel_x = 7 + }, +/obj/item/retractor/ashwalker{ + pixel_y = -9 + }, +/obj/item/hemostat/ashwalker{ + pixel_y = 6 + }, +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafepark) +"fbM" = ( +/obj/effect/turf_decal/box, +/obj/effect/turf_decal/caution/stand_clear, +/obj/machinery/door/firedoor, +/obj/structure/fans/tiny/invisible, +/obj/machinery/door/airlock/abductor{ + desc = "What could possibly be in here? Probably naked people."; + id_tag = "cozyfloofspot1"; + name = "Bedroom" + }, +/turf/open/indestructible/hoteltile{ + icon_state = "darkfull" + }, +/area/centcom/holding/cafepark) "fcW" = ( /obj/effect/turf_decal/tile/dark_blue/opposingcorners, /obj/effect/turf_decal/siding/wood{ @@ -6004,6 +6600,33 @@ }, /turf/open/floor/carpet/red, /area/cruiser_dock) +"fdX" = ( +/obj/effect/turf_decal/bot, +/obj/structure/grandfatherclock{ + desc = "An alien console, it's completely holographic and is complete gibberish with phrases like 'Bogos Binted' flying across the screen."; + icon = 'icons/obj/antags/abductor.dmi'; + icon_state = "console"; + name = "alien console" + }, +/turf/open/indestructible/hoteltile{ + icon_state = "darkfull" + }, +/area/centcom/holding/cafepark) +"feR" = ( +/obj/machinery/light/small/directional/west, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) +"feU" = ( +/obj/structure/table/wood, +/obj/machinery/microwave{ + pixel_x = 1; + pixel_y = 6 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) "fiC" = ( /obj/structure/closet/crate/bin, /obj/item/paper/crumpled{ @@ -6019,6 +6642,10 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/centcom/interlink) +"fjN" = ( +/obj/structure/wall_torch/spawns_lit/directional/east, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafepark) "fmq" = ( /obj/structure/frame/computer, /turf/open/floor/plating, @@ -6028,6 +6655,29 @@ dir = 8 }, /area/cruiser_dock) +"foq" = ( +/obj/structure/sign/poster/official/cleanliness/directional/east, +/obj/machinery/camera/directional/north{ + c_tag = "Jim Norton's Quebecois Coffee" + }, +/obj/structure/noticeboard/directional/north, +/obj/item/reagent_containers/condiment/sugar{ + pixel_y = 4 + }, +/obj/item/storage/pill_bottle/happinesspsych{ + pixel_x = -4; + pixel_y = -1 + }, +/obj/item/storage/box/coffeepack, +/obj/item/storage/box/coffeepack/robusta, +/obj/item/reagent_containers/condiment/soymilk, +/obj/item/reagent_containers/condiment/milk, +/obj/structure/closet/secure_closet/freezer/empty/open, +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) "fov" = ( /turf/closed/indestructible/fakedoor{ desc = "Why would you want to go back, you just got here!"; @@ -6039,6 +6689,21 @@ /obj/effect/turf_decal/trimline/dark_green/line, /turf/open/floor/iron/dark, /area/centcom/interlink) +"foJ" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 10 + }, +/obj/structure/closet/crate/wooden/storage_barrel, +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafepark) +"fpe" = ( +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/obj/structure/table/optable, +/turf/open/floor/iron/white, +/area/centcom/holding/cafe) "fqg" = ( /turf/open/floor/iron/smooth, /area/centcom/interlink) @@ -6061,11 +6726,11 @@ /area/centcom/interlink) "fvx" = ( /obj/effect/turf_decal/bot, -/obj/machinery/vending/wardrobe/coroner_wardrobe/ghost_cafe, +/obj/structure/showcase/machinery/signal_decrypter, /turf/open/indestructible/hoteltile{ icon_state = "darkfull" }, -/area/centcom/holding/cafe) +/area/centcom/holding/cafepark) "fwc" = ( /obj/effect/turf_decal/sand, /obj/structure/chair/stool/bar/directional/west{ @@ -6084,28 +6749,35 @@ }, /turf/open/misc/beach/sand, /area/centcom/holding/cafepark) +"fwu" = ( +/obj/structure/water_source/puddle, +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafepark) "fxE" = ( /obj/structure/chair/sofa/bench/right{ greyscale_colors = "#AA8A61" }, /turf/open/floor/wood, /area/centcom/interlink) +"fza" = ( +/obj/structure/dresser{ + icon = 'icons/obj/antags/abductor.dmi'; + icon_state = "dispenser"; + name = "organ storage" + }, +/turf/open/floor/plating/abductor, +/area/centcom/holding/cafepark) "fzV" = ( /obj/structure/rack, /obj/item/pushbroom, /turf/open/floor/iron/dark, /area/centcom/interlink) "fAL" = ( -/obj/effect/turf_decal/tile/blue/full, -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "GhostCafeMedical" +/obj/structure/window/spawner/directional/south, +/obj/structure/flora/grass/jungle/b/style_random, +/turf/open/misc/grass/planet{ + smoothing_flags = 0 }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "ghostcafemedical" - }, -/turf/open/floor/iron/white, /area/centcom/holding/cafe) "fCt" = ( /obj/machinery/light/directional/west, @@ -6114,6 +6786,16 @@ }, /turf/open/floor/iron/dark, /area/centcom/interlink) +"fCz" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/weather/dirt{ + dir = 6 + }, +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 4 + }, +/turf/open/indestructible/plating, +/area/centcom/holding/cafepark) "fEg" = ( /obj/structure/toilet{ dir = 8 @@ -6128,18 +6810,8 @@ /turf/open/floor/carpet/purple, /area/centcom/holding/cafe) "fFr" = ( -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/obj/structure/showcase/fakesec{ - name = "\improper Cafe security records" - }, -/obj/structure/fence{ - dir = 1; - pixel_x = -18 - }, -/turf/open/floor/iron, -/area/centcom/holding/cafe) +/turf/open/indestructible/cobble, +/area/centcom/holding/cafepark) "fFy" = ( /obj/effect/light_emitter/interlink, /obj/effect/turf_decal/weather/dirt{ @@ -6147,6 +6819,23 @@ }, /turf/open/floor/grass, /area/centcom/interlink) +"fFL" = ( +/obj/machinery/light/directional/south, +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/centcom/holding/cafe) +"fGv" = ( +/obj/machinery/light/directional/north, +/turf/open/indestructible/hoteltile{ + icon_state = "darkfull" + }, +/area/centcom/holding/cafepark) "fGC" = ( /obj/structure/chair/sofa/bench, /obj/effect/landmark/latejoin, @@ -6192,20 +6881,54 @@ /obj/structure/flora/bush/fullgrass/style_random, /turf/open/floor/grass, /area/centcom/interlink) +"fLD" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) "fMM" = ( /obj/machinery/duct, /turf/open/floor/iron/dark, /area/centcom/interlink) "fOb" = ( -/obj/structure/fans/tiny/invisible, -/obj/machinery/door/airlock/wood{ - name = "Medical" +/obj/structure/rack, +/obj/item/storage/box/lights/mixed, +/obj/item/clothing/gloves/botanic_leather, +/obj/item/clothing/gloves/color/blue, +/obj/item/clothing/suit/caution, +/obj/item/clothing/suit/caution, +/obj/item/clothing/suit/caution, +/obj/item/clothing/suit/caution, +/obj/item/reagent_containers/cup/bucket, +/obj/item/reagent_containers/cup/bucket, +/obj/item/mop, +/obj/item/mop, +/obj/effect/turf_decal/tile/blue{ + dir = 8 }, -/obj/effect/turf_decal/caution/stand_clear, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/item/storage/bag/trash, /turf/open/indestructible/hoteltile{ - icon_state = "darkfull" + icon_state = "white" + }, +/area/centcom/holding/cafepark) +"fOr" = ( +/obj/structure/chair/sofa/bench/right{ + dir = 4 }, +/turf/open/floor/wood/large, /area/centcom/holding/cafe) +"fOu" = ( +/obj/structure/flora/grass/jungle, +/obj/structure/flora/bush/flowers_pp, +/obj/effect/light_emitter/interlink, +/turf/open/misc/grass/planet{ + smoothing_flags = 0 + }, +/area/centcom/holding/cafepark) "fOv" = ( /obj/machinery/door/airlock/multi_tile/public/glass{ name = "Interlink Public Garden" @@ -6221,6 +6944,10 @@ /obj/structure/fence, /turf/open/floor/grass, /area/centcom/interlink) +"fPs" = ( +/obj/item/kirbyplants/random, +/turf/open/indestructible/carpet, +/area/centcom/holding/cafe) "fQt" = ( /mob/living/basic/crab{ name = "Bait" @@ -6238,6 +6965,12 @@ /obj/effect/light_emitter/interlink, /turf/open/misc/dirt/planet, /area/centcom/interlink) +"fTb" = ( +/obj/effect/spawner/liquids_spawner, +/turf/open/indestructible/cobble/side{ + dir = 4 + }, +/area/centcom/holding/cafe) "fTu" = ( /obj/structure/table/wood, /obj/item/reagent_containers/cup/glass/shaker{ @@ -6247,6 +6980,29 @@ /obj/item/reagent_containers/cup/rag, /turf/open/floor/wood, /area/centcom/holding/cafe) +"fTv" = ( +/obj/item/reagent_containers/dropper, +/obj/item/reagent_containers/cup/beaker{ + pixel_x = 8; + pixel_y = 2 + }, +/obj/structure/table/glass, +/obj/item/storage/box/rxglasses{ + pixel_x = 5; + pixel_y = 10 + }, +/obj/item/storage/box/bodybags{ + pixel_x = -5; + pixel_y = 10 + }, +/obj/item/storage/box/disks{ + pixel_x = 2; + pixel_y = 2 + }, +/turf/open/indestructible/hoteltile{ + icon_state = "darkfull" + }, +/area/centcom/holding/cafepark) "fTz" = ( /obj/effect/turf_decal/trimline/green/line{ dir = 6 @@ -6260,6 +7016,20 @@ }, /turf/open/water/beach, /area/centcom/holding/cafepark) +"fTY" = ( +/obj/structure/chair/sofa/corp/right{ + dir = 1 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) +"fUQ" = ( +/obj/structure/fans/tiny/invisible, +/obj/machinery/door/airlock{ + name = "Salon"; + id_tag = "CCSalon" + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) "fVh" = ( /obj/structure/closet/crate/trashcart, /obj/effect/turf_decal/bot_white, @@ -6279,6 +7049,12 @@ }, /turf/open/floor/iron/dark, /area/centcom/interlink) +"fXi" = ( +/obj/machinery/light/small/directional/south, +/obj/structure/sink/directional/east, +/obj/structure/mirror/directional/west, +/turf/open/floor/iron/freezer, +/area/centcom/holding/cafe) "fYY" = ( /obj/machinery/light/small/directional/east, /turf/open/floor/wood/tile, @@ -6294,6 +7070,25 @@ /obj/structure/punching_bag, /turf/open/floor/plating, /area/cruiser_dock) +"gdL" = ( +/obj/structure/towel_bin, +/obj/structure/table/wood, +/turf/open/indestructible/cobble/side{ + dir = 4 + }, +/area/centcom/holding/cafepark) +"gdN" = ( +/obj/structure/chair/stool/directional/south{ + dir = 8 + }, +/turf/open/floor/iron, +/area/centcom/holding/cafe) +"gea" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 1 + }, +/turf/open/floor/fakebasalt, +/area/centcom/holding/cafepark) "geG" = ( /turf/open/floor/iron/stairs, /area/centcom/holding/cafepark) @@ -6315,6 +7110,13 @@ }, /turf/open/floor/wood, /area/centcom/holding/cafepark) +"ggx" = ( +/obj/structure/closet/crate/bin, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/circuit/green, +/area/centcom/holding/cafe) "git" = ( /obj/structure/table/glass/plasmaglass, /obj/machinery/reagentgrinder{ @@ -6345,83 +7147,107 @@ }, /turf/open/floor/iron/dark, /area/centcom/interlink) +"gko" = ( +/obj/structure/flora/grass/jungle/a/style_4, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) +"gmD" = ( +/obj/structure/stone_tile/slab, +/obj/structure/stone_tile/slab/cracked, +/turf/open/floor/fakebasalt, +/area/centcom/holding/cafepark) "gmE" = ( -/obj/structure/table/reinforced, -/obj/item/clothing/under/rank/prisoner/supermax, -/obj/item/clothing/under/rank/prisoner/supermax, -/obj/item/clothing/under/rank/prisoner/supermax, -/obj/item/clothing/under/rank/prisoner/skirt/supermax, -/obj/item/clothing/under/rank/prisoner/skirt/supermax, -/obj/item/clothing/under/rank/prisoner/skirt/supermax, -/obj/item/clothing/under/rank/prisoner/skirt/protcust, -/obj/item/clothing/under/rank/prisoner/skirt/protcust, -/obj/item/clothing/under/rank/prisoner/skirt/protcust, -/obj/item/clothing/under/rank/prisoner/skirt/lowsec, -/obj/item/clothing/under/rank/prisoner/skirt/lowsec, -/obj/item/clothing/under/rank/prisoner/skirt/lowsec, -/obj/item/clothing/under/rank/prisoner/skirt/highsec, -/obj/item/clothing/under/rank/prisoner/skirt/highsec, -/obj/item/clothing/under/rank/prisoner/skirt/highsec, -/obj/item/clothing/under/rank/prisoner/skirt, -/obj/item/clothing/under/rank/prisoner/skirt, -/obj/item/clothing/under/rank/prisoner/skirt, -/obj/item/clothing/under/rank/prisoner/protcust, -/obj/item/clothing/under/rank/prisoner/protcust, -/obj/item/clothing/under/rank/prisoner/protcust, -/obj/item/clothing/under/rank/prisoner/lowsec, -/obj/item/clothing/under/rank/prisoner/lowsec, -/obj/item/clothing/under/rank/prisoner/lowsec, -/obj/item/clothing/under/rank/prisoner/highsec, -/obj/item/clothing/under/rank/prisoner/highsec, -/obj/item/clothing/under/rank/prisoner/highsec, -/obj/item/clothing/under/rank/prisoner/classic, -/obj/item/clothing/under/rank/prisoner, -/obj/item/clothing/under/rank/prisoner, -/obj/item/clothing/under/rank/prisoner, -/obj/effect/turf_decal/tile/red/anticorner, -/obj/machinery/light/directional/east, -/obj/machinery/button/door{ - id = "ghostcafesec"; - name = "Detainment Lockdown"; - normaldoorcontrol = 1; - pixel_x = 26; - pixel_y = 5; - specialfunctions = 4 +/obj/machinery/vending/wardrobe/medi_wardrobe/ghost_cafe, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 }, -/obj/machinery/button/door{ - id = "ghostcafesec"; - name = "Cell Lockdown"; - pixel_x = 26; - pixel_y = -7 +/turf/open/floor/iron/white, +/area/centcom/holding/cafe) +"gmT" = ( +/obj/structure/fake_stairs/directional/east, +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafepark) +"gmU" = ( +/obj/structure/chair/sofa/bench/corner{ + dir = 1 }, -/obj/item/clothing/under/rank/prisoner/syndicate, -/obj/item/clothing/under/rank/prisoner/syndicate, -/turf/open/floor/iron, +/turf/open/floor/iron/dark, /area/centcom/holding/cafe) -"goK" = ( -/obj/item/surgery_tray/full, -/obj/effect/turf_decal/tile/blue{ - dir = 8 +"gnq" = ( +/obj/effect/spawner/liquids_spawner, +/obj/structure/chair/sofa/bench/right, +/turf/open/floor/iron/pool/cobble/corner{ + dir = 1 }, +/area/centcom/holding/cafe) +"gnv" = ( /obj/effect/turf_decal/tile/blue{ dir = 1 }, -/obj/structure/table/glass, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, /turf/open/floor/iron/white, /area/centcom/holding/cafe) +"goK" = ( +/obj/structure/railing{ + invisibility = 100; + dir = 1 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/obj/structure/chair/wood{ + dir = 1 + }, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) "gpk" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 8 }, /turf/open/misc/asteroid, /area/cruiser_dock) +"gqq" = ( +/obj/structure/railing{ + invisibility = 100; + dir = 1 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/obj/structure/chair/wood{ + dir = 1 + }, +/turf/open/indestructible/cobble, +/area/centcom/holding/cafepark) "grr" = ( -/obj/item/flashlight/flare/candle/infinite{ - pixel_x = 19; - pixel_y = -22 +/obj/structure/table, +/obj/structure/towel_bin, +/turf/open/floor/iron/freezer, +/area/centcom/holding/cafe) +"grW" = ( +/obj/effect/turf_decal/siding{ + color = "#2e2e2e"; + dir = 1 + }, +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/clothing/head/costume/shrine_wig{ + pixel_y = 7 + }, +/obj/item/clothing/suit/costume/shrine_maiden, +/obj/item/storage/basket{ + pixel_y = 11 }, +/obj/item/gohei, /turf/open/floor/bamboo, -/area/centcom/holding/cafedorms) +/area/centcom/holding/cafe) +"grX" = ( +/obj/effect/turf_decal/weather/sand{ + dir = 8 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafepark) "gsc" = ( /obj/structure/chair/sofa/corp/corner{ dir = 8 @@ -6429,11 +7255,36 @@ /obj/machinery/light/warm/directional/south, /turf/open/floor/wood/parquet, /area/centcom/interlink) +"gsj" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/burnt{ + dir = 8 + }, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 4 + }, +/turf/open/lava/fake, +/area/centcom/holding/cafepark) "gsO" = ( /obj/structure/table, /obj/structure/bedsheetbin, /turf/open/floor/iron/dark, /area/centcom/interlink) +"gsX" = ( +/obj/structure/flora/rock/pile/jungle/large/style_2, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) +"gtO" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 1 + }, +/turf/open/indestructible/plating, +/area/centcom/holding/cafepark) "gtZ" = ( /obj/structure/chair/sofa/bench/left{ dir = 8 @@ -6458,6 +7309,21 @@ /obj/machinery/armament_station/assault_operatives, /turf/open/floor/iron/dark/textured_large, /area/cruiser_dock) +"gxF" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/door/airlock/wood{ + id_tag = "ghostcafecabinjap"; + name = "Shinto Cabin" + }, +/obj/structure/fans/tiny/invisible, +/turf/open/floor/carpet, +/area/centcom/holding/cafe) +"gxX" = ( +/turf/open/floor/fakebasalt, +/area/centcom/holding/cafepark) "gyK" = ( /obj/machinery/status_display/shuttle{ pixel_y = 32; @@ -6468,6 +7334,19 @@ }, /turf/open/floor/iron, /area/centcom/interlink) +"gyS" = ( +/obj/effect/light_emitter/interlink, +/turf/open/misc/grass/planet{ + smoothing_flags = 0 + }, +/area/centcom/holding/cafepark) +"gzT" = ( +/obj/structure/fake_stairs/wood/directional/north, +/obj/structure/railing/wooden_fencing{ + dir = 8 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) "gAj" = ( /obj/structure/sign/poster/random/directional/south, /turf/open/floor/iron/dark, @@ -6497,6 +7376,11 @@ /obj/effect/turf_decal/siding/white, /turf/open/floor/iron/white, /area/centcom/interlink) +"gCQ" = ( +/obj/structure/chair/sofa/corp, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/circuit/green, +/area/centcom/holding/cafe) "gCR" = ( /turf/closed/wall/mineral/sandstone, /area/centcom/holding/cafe) @@ -6544,45 +7428,43 @@ }, /turf/open/floor/iron/dark, /area/centcom/interlink) -"gLq" = ( -/turf/open/floor/carpet, -/area/centcom/holding/cafedorms) "gMw" = ( /turf/closed/wall/mineral/sandstone, /area/centcom/holding/cafedorms) "gMy" = ( -/obj/effect/turf_decal/tile/blue/half{ - dir = 4 +/obj/effect/turf_decal/tile/blue{ + dir = 8 }, -/obj/structure/chair/office/light{ +/obj/effect/turf_decal/tile/blue{ dir = 4 }, -/turf/open/floor/iron/white, -/area/centcom/holding/cafe) -"gPj" = ( -/obj/effect/turf_decal/siding{ - color = "#2e2e2e" +/turf/open/indestructible/hoteltile{ + icon_state = "white" }, -/obj/effect/turf_decal/siding{ - color = "#2e2e2e"; - dir = 10 +/area/centcom/holding/cafepark) +"gOS" = ( +/obj/item/flashlight/flare/candle/infinite{ + pixel_x = 19; + pixel_y = -22 }, -/obj/effect/turf_decal/siding/wood{ - dir = 4 +/turf/open/floor/bamboo, +/area/centcom/holding/cafe) +"gPj" = ( +/obj/structure/railing{ + dir = 8 }, -/obj/item/flashlight/flare/candle/infinite{ - pixel_x = 15 +/turf/open/indestructible/cobble/side{ + dir = 8 }, -/obj/machinery/button/door{ - id = "ghostcafecabinjap"; - name = "Dorm Bolt Control"; - normaldoorcontrol = 1; - pixel_y = -24; - specialfunctions = 4 +/area/centcom/holding/cafepark) +"gPD" = ( +/obj/structure/rack/shelf{ + icon = 'modular_nova/modules/mapping/icons/unique/furniture.dmi'; + icon_state = "empty_shelf_1" }, -/obj/machinery/light/warm/directional/west, -/turf/open/floor/bamboo, -/area/centcom/holding/cafedorms) +/obj/item/reagent_containers/cup/bucket/wooden, +/turf/open/floor/fakebasalt, +/area/centcom/holding/cafepark) "gPN" = ( /obj/effect/spawner/random/entertainment/arcade, /obj/effect/turf_decal/siding/wood, @@ -6591,13 +7473,42 @@ }, /turf/open/floor/eighties, /area/centcom/holding/cafe) -"gSD" = ( -/obj/effect/turf_decal/siding/wood, -/obj/effect/turf_decal/siding/wood{ +"gRb" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 }, -/turf/closed/indestructible/weeb, -/area/centcom/holding/cafedorms) +/obj/structure/closet/crate/bin, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/indestructible/hoteltile{ + icon_state = "floor" + }, +/area/centcom/holding/cafepark) +"gSx" = ( +/obj/machinery/light/directional/south, +/turf/open/indestructible/cobble/side, +/area/centcom/holding/cafepark) +"gSB" = ( +/obj/structure/rack/wooden, +/obj/item/cultivator/rake, +/obj/item/seeds/ambrosia, +/obj/item/seeds/korta_nut/sweet, +/obj/item/shovel, +/obj/structure/wall_torch/spawns_lit/directional/east, +/obj/item/reagent_containers/cup/bucket/wooden, +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafepark) +"gSD" = ( +/turf/open/floor/iron, +/area/centcom/holding/cafe) "gUi" = ( /obj/machinery/light/directional/north, /obj/effect/turf_decal/siding/white, @@ -6609,6 +7520,15 @@ dir = 4 }, /area/centcom/holding/cafepark) +"gUZ" = ( +/obj/effect/turf_decal/tile/red/opposingcorners, +/turf/open/floor/iron/dark, +/area/centcom/holding/cafe) +"gVD" = ( +/obj/machinery/light/directional/east, +/obj/structure/flora/bush/jungle/b, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) "gWT" = ( /obj/structure/table/wood, /obj/item/toy/cards/deck/cas/black, @@ -6624,6 +7544,26 @@ }, /turf/open/floor/grass, /area/centcom/interlink) +"gZK" = ( +/obj/structure/table/wood, +/turf/open/floor/fakebasalt, +/area/centcom/holding/cafepark) +"gZM" = ( +/obj/structure/rack/wooden, +/obj/item/reagent_containers/cup/mortar{ + pixel_y = -5; + pixel_x = 2 + }, +/obj/item/pestle{ + pixel_y = -7; + pixel_x = -5 + }, +/obj/item/reagent_containers/cup/glass/bottle/moonshine{ + pixel_y = 10; + pixel_x = -4 + }, +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafepark) "hap" = ( /obj/structure/table/wood, /obj/machinery/chem_dispenser/drinks/fullupgrade{ @@ -6632,9 +7572,20 @@ /obj/structure/sign/poster/contraband/starkist/directional/north, /turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) +"hat" = ( +/obj/structure/bed/maint, +/obj/item/bedsheet/black, +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafepark) "haE" = ( /turf/open/floor/carpet/red, /area/centcom/holding/cafedorms) +"haM" = ( +/obj/structure/dresser{ + pixel_y = 7 + }, +/turf/open/indestructible/carpet, +/area/centcom/holding/cafe) "hbE" = ( /obj/structure/fence/interlink{ dir = 4 @@ -6642,20 +7593,52 @@ /obj/effect/light_emitter/interlink, /turf/open/floor/grass, /area/centcom/interlink) +"hbY" = ( +/obj/structure/stone_tile/block, +/obj/structure/stone_tile/block{ + dir = 1 + }, +/obj/structure/wall_torch/spawns_lit/directional/east, +/turf/open/floor/fakebasalt, +/area/centcom/holding/cafepark) "hcR" = ( /turf/open/floor/wood/parquet, /area/centcom/interlink) +"hds" = ( +/obj/structure/table, +/obj/machinery/light/directional/east, +/obj/item/reagent_containers/cup/soda_cans/monkey_energy{ + pixel_x = -7; + pixel_y = 7 + }, +/obj/item/reagent_containers/cup/rag{ + pixel_y = 7; + pixel_x = 6 + }, +/turf/open/floor/iron, +/area/centcom/holding/cafe) "hdV" = ( -/obj/structure/fence{ - pixel_x = 17 +/obj/effect/turf_decal/tile/blue{ + dir = 1 }, -/turf/closed/indestructible/syndicate, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/iron/white, /area/centcom/holding/cafe) "hea" = ( -/obj/structure/table/wood, -/obj/item/paper_bin, -/turf/open/indestructible/hotelwood, -/area/centcom/holding/cafedorms) +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/weather/dirt{ + dir = 9 + }, +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 8 + }, +/turf/open/indestructible/plating, +/area/centcom/holding/cafepark) "heB" = ( /obj/effect/turf_decal/weather/dirt{ dir = 1 @@ -6664,13 +7647,35 @@ /obj/structure/flora/tree/jungle/small/style_5, /turf/open/floor/grass, /area/centcom/interlink) -"hge" = ( +"hfJ" = ( +/obj/structure/fans/tiny/invisible, +/obj/structure/bonfire/prelit, +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafepark) +"hgd" = ( +/obj/machinery/light/directional/west, /obj/effect/turf_decal/siding/wood{ - dir = 1 + dir = 8 }, -/obj/effect/turf_decal/siding/wood, -/turf/closed/indestructible/weeb, -/area/centcom/holding/cafedorms) +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) +"hge" = ( +/obj/structure/fans/tiny/invisible, +/obj/machinery/door/airlock/security{ + name = "Cafe Security" + }, +/turf/open/floor/iron, +/area/centcom/holding/cafe) +"hje" = ( +/obj/structure/stone_tile/block{ + dir = 4 + }, +/obj/structure/stone_tile/block{ + dir = 8 + }, +/obj/item/flashlight/flare/candle/infinite, +/turf/open/floor/fakebasalt, +/area/centcom/holding/cafepark) "hjy" = ( /obj/item/kirbyplants/organic/plant22, /obj/effect/turf_decal/trimline/dark_green/line, @@ -6758,21 +7763,55 @@ }, /turf/open/floor/wood, /area/centcom/holding/cafe) -"hpP" = ( -/obj/structure/fence{ - dir = 4 +"hpl" = ( +/obj/machinery/light/floor{ + alpha = 0; + invisibility = 100; + light_range = 10; + nightshift_light_power = 10 }, -/obj/effect/turf_decal/tile/red/half{ - dir = 8 +/obj/effect/turf_decal/weather/dirt{ + dir = 1 }, -/turf/open/floor/iron, -/area/centcom/holding/cafe) +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 1 + }, +/turf/open/indestructible/plating, +/area/centcom/holding/cafepark) +"hpP" = ( +/mob/living/basic/butterfly, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) "hpR" = ( /obj/effect/turf_decal/weather/dirt, /obj/effect/light_emitter/interlink, /obj/structure/flora/bush/fullgrass/style_random, /turf/open/floor/grass, /area/centcom/interlink) +"hpX" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/indestructible/hoteltile{ + icon_state = "white" + }, +/area/centcom/holding/cafepark) +"hqp" = ( +/obj/machinery/door/airlock/bathroom{ + id_tag = "CCToilet"; + name = "Toilet Stall" + }, +/turf/open/floor/iron/freezer, +/area/centcom/holding/cafe) +"hrt" = ( +/obj/machinery/shower/directional/south, +/obj/structure/window/spawner/directional/west, +/turf/open/floor/iron/freezer, +/area/centcom/holding/cafe) "hrF" = ( /obj/effect/turf_decal/trimline/dark_green/line{ dir = 5 @@ -6804,6 +7843,19 @@ "hvQ" = ( /turf/open/floor/iron, /area/centcom/interlink) +"hxm" = ( +/obj/structure/chair/wood{ + dir = 4 + }, +/turf/open/floor/wood, +/area/centcom/holding/cafepark) +"hyt" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/vending/wardrobe/viro_wardrobe/ghost_cafe, +/turf/open/indestructible/hoteltile{ + icon_state = "darkfull" + }, +/area/centcom/holding/cafepark) "hyO" = ( /obj/effect/turf_decal/box/corners, /turf/open/floor/iron/dark/textured_large, @@ -6850,6 +7902,10 @@ }, /turf/open/floor/iron, /area/centcom/interlink) +"hBy" = ( +/obj/structure/flora/tree/jungle/style_random, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) "hEK" = ( /obj/structure/railing/corner{ dir = 8 @@ -6894,6 +7950,19 @@ }, /turf/open/floor/iron/dark/textured_large, /area/cruiser_dock) +"hJz" = ( +/obj/structure/stone_tile/surrounding_tile{ + dir = 4 + }, +/obj/machinery/primitive_stove, +/obj/structure/stone_tile/slab, +/turf/open/floor/fakebasalt, +/area/centcom/holding/cafepark) +"hKI" = ( +/obj/structure/table, +/obj/item/folder/red, +/turf/open/floor/iron, +/area/centcom/holding/cafe) "hLA" = ( /obj/structure/table/wood, /obj/item/folder/yellow{ @@ -6913,34 +7982,98 @@ "hLW" = ( /turf/open/floor/iron/smooth_edge, /area/cruiser_dock) +"hMt" = ( +/obj/structure/fans/tiny/invisible, +/obj/structure/mineral_door/wood/large_gate{ + dir = 1 + }, +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafepark) "hNU" = ( /obj/effect/turf_decal/siding/white/corner{ dir = 4 }, /turf/open/floor/iron/cafeteria, /area/centcom/interlink) -"hPK" = ( -/obj/effect/turf_decal/siding/wood{ +"hOy" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/turf/open/floor/wood/tile, -/area/centcom/interlink) -"hQy" = ( -/obj/effect/turf_decal/delivery/white, -/obj/machinery/door/puzzle/keycard/assault_ops_chemistry, -/turf/open/floor/iron/dark/textured_large, -/area/cruiser_dock) -"hSC" = ( -/obj/structure/table/wood, -/obj/item/folder{ - pixel_x = -7; - pixel_y = 5 +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 }, -/obj/item/pen/fountain{ - pixel_x = 3 +/turf/open/indestructible/hoteltile{ + icon_state = "floor" }, -/turf/open/floor/carpet/executive, -/area/centcom/interlink) +/area/centcom/holding/cafepark) +"hPq" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/chair/office/light{ + dir = 1 + }, +/turf/open/indestructible/hoteltile{ + icon_state = "white" + }, +/area/centcom/holding/cafepark) +"hPH" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/indestructible/hoteltile{ + icon_state = "white" + }, +/area/centcom/holding/cafepark) +"hPK" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood/tile, +/area/centcom/interlink) +"hQy" = ( +/obj/effect/turf_decal/delivery/white, +/obj/machinery/door/puzzle/keycard/assault_ops_chemistry, +/turf/open/floor/iron/dark/textured_large, +/area/cruiser_dock) +"hQV" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lantern{ + pixel_x = -5; + pixel_y = 2 + }, +/turf/open/floor/wood, +/area/centcom/holding/cafepark) +"hRJ" = ( +/obj/structure/railing{ + invisibility = 100; + dir = 4 + }, +/obj/structure/chair/wood{ + dir = 4 + }, +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafepark) +"hSC" = ( +/obj/structure/table/wood, +/obj/item/folder{ + pixel_x = -7; + pixel_y = 5 + }, +/obj/item/pen/fountain{ + pixel_x = 3 + }, +/turf/open/floor/carpet/executive, +/area/centcom/interlink) "hSU" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 1 @@ -6950,29 +8083,35 @@ }, /turf/open/floor/iron/smooth_large, /area/cruiser_dock) +"hTf" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted, +/obj/machinery/iv_drip, +/turf/open/floor/iron/white, +/area/centcom/holding/cafe) "hTh" = ( /obj/machinery/door/poddoor/shutters/window/preopen, /obj/effect/turf_decal/siding/dark, /turf/open/floor/iron, /area/centcom/interlink) "hTD" = ( -/obj/structure/closet/crate/wooden, -/obj/item/stack/sheet/mineral/wood/fifty, -/obj/item/stack/sheet/mineral/wood/fifty, -/obj/item/lighter, -/turf/open/indestructible/hotelwood{ - desc = "It's really cozy! Great for soft paws!"; - icon = 'modular_skyrat/modules/ghostcafe/icons/carpet_royalblack.dmi'; - icon_state = "carpet"; - name = "soft carpet" +/obj/effect/turf_decal/tile/blue{ + dir = 4 }, -/area/centcom/holding/cafedorms) +/turf/open/floor/iron/white, +/area/centcom/holding/cafe) "hVf" = ( /obj/effect/turf_decal/siding/white/corner{ dir = 1 }, /turf/open/floor/iron/dark, /area/centcom/interlink) +"hVq" = ( +/obj/structure/dresser, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) "hVC" = ( /obj/structure/dresser, /obj/machinery/light/warm/no_nightlight/directional/north, @@ -6995,16 +8134,57 @@ }, /turf/open/floor/iron/dark, /area/centcom/interlink) -"hYP" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ +"hWY" = ( +/obj/structure/railing{ + invisibility = 100 + }, +/obj/effect/turf_decal/weather/dirt, +/obj/structure/chair/wood, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) +"hXd" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/structure/chair/sofa/bench/right{ dir = 8 }, -/obj/effect/turf_decal/tile/blue{ +/obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/structure/closet/crate/freezer/blood, -/turf/open/floor/iron/white, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/indestructible/hoteltile{ + icon_state = "floor" + }, +/area/centcom/holding/cafepark) +"hYn" = ( +/obj/structure/stone_tile/center, +/obj/structure/stone_tile/surrounding_tile{ + dir = 8 + }, +/obj/structure/stone_tile/surrounding_tile, +/obj/structure/stone_tile/surrounding_tile{ + dir = 1 + }, +/obj/structure/stone_tile/surrounding_tile{ + dir = 4 + }, +/turf/open/floor/fakebasalt, +/area/centcom/holding/cafepark) +"hYA" = ( +/turf/open/floor/iron/dark/corner{ + dir = 8 + }, +/area/centcom/holding/cafe) +"hYP" = ( +/obj/structure/chair/sofa/bench, +/turf/open/floor/wood/large, /area/centcom/holding/cafe) "hZk" = ( /obj/structure/sink/directional/south, @@ -7062,6 +8242,25 @@ dir = 4 }, /area/cruiser_dock) +"ifZ" = ( +/obj/structure/chair/sofa/bench, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/indestructible/hoteltile{ + icon_state = "floor" + }, +/area/centcom/holding/cafepark) "igp" = ( /obj/effect/turf_decal/tile/green/opposingcorners, /obj/effect/turf_decal/siding/wood{ @@ -7069,6 +8268,13 @@ }, /turf/open/floor/iron, /area/centcom/interlink) +"ihd" = ( +/turf/open/floor/sepia, +/area/centcom/holding/cafe) +"iho" = ( +/obj/structure/flora/grass/jungle/b/style_4, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) "iiV" = ( /obj/item/trench_tool, /obj/item/tank/internals/emergency_oxygen/double, @@ -7089,6 +8295,57 @@ /obj/effect/turf_decal/siding/wood, /turf/open/floor/iron, /area/centcom/interlink) +"ikb" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/obj/structure/stone_tile/block/cracked{ + dir = 1 + }, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 8 + }, +/turf/open/floor/fakebasalt, +/area/centcom/holding/cafepark) +"iki" = ( +/turf/open/floor/carpet, +/area/centcom/holding/cafe) +"ikl" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 6 + }, +/obj/structure/chair/sofa/bench/corner{ + dir = 8 + }, +/obj/machinery/light/small/directional/south, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/indestructible/hoteltile{ + icon_state = "floor" + }, +/area/centcom/holding/cafepark) +"ikn" = ( +/obj/structure/chair/stool/directional/south{ + dir = 8 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/freezer, +/area/centcom/holding/cafe) +"ikE" = ( +/obj/structure/weightmachine, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) "ikG" = ( /obj/structure/table, /obj/machinery/computer/libraryconsole, @@ -7129,6 +8386,10 @@ }, /turf/open/floor/iron/white, /area/centcom/interlink) +"ioZ" = ( +/obj/machinery/light/directional/east, +/turf/open/indestructible/carpet, +/area/centcom/holding/cafe) "ipc" = ( /obj/structure/sign/poster/random/directional/east, /obj/effect/turf_decal/trimline/dark_green/filled/line{ @@ -7151,10 +8412,25 @@ /obj/structure/fans/tiny/invisible, /turf/open/floor/wood, /area/centcom/holding/cafe) +"iqj" = ( +/obj/machinery/button/door{ + id = "CCPsych"; + name = "Psych Office Bolt Control"; + normaldoorcontrol = 1; + specialfunctions = 4; + pixel_y = -29 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) "iqO" = ( /obj/structure/chair/stool/directional/north, /turf/open/floor/iron, /area/centcom/interlink) +"iqT" = ( +/obj/structure/flora/grass/jungle/a/style_2, +/obj/structure/flora/bush/flowers_yw, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) "iqY" = ( /obj/structure/flora/bush/sparsegrass, /turf/open/floor/grass/fairy, @@ -7166,6 +8442,15 @@ /obj/effect/landmark/latejoin, /turf/open/floor/iron, /area/centcom/interlink) +"iro" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 1 + }, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 8 + }, +/turf/open/floor/fakebasalt, +/area/centcom/holding/cafepark) "ism" = ( /obj/structure/filingcabinet/employment, /obj/machinery/button/door/directional/south{ @@ -7175,6 +8460,14 @@ /obj/machinery/light/cold/no_nightlight/directional/west, /turf/open/floor/iron/dark/textured_large, /area/centcom/interlink) +"itm" = ( +/obj/structure/flora/tree/jungle/style_2, +/obj/structure/flora/grass/jungle, +/obj/effect/light_emitter/interlink, +/turf/open/misc/grass/planet{ + smoothing_flags = 0 + }, +/area/centcom/holding/cafepark) "iuK" = ( /obj/effect/light_emitter/interlink, /turf/open/floor/carpet/red, @@ -7215,11 +8508,30 @@ }, /turf/open/floor/wood, /area/centcom/interlink) +"izJ" = ( +/obj/structure/flora/bush/sparsegrass/style_random, +/turf/open/misc/asteroid/snow/indestructible/planet, +/area/centcom/holding/cafepark) +"izT" = ( +/obj/structure/fans/tiny/invisible, +/obj/structure/railing/corner, +/turf/open/indestructible/cobble/side, +/area/centcom/holding/cafepark) "iBc" = ( /turf/open/floor/iron/smooth_edge{ dir = 1 }, /area/cruiser_dock) +"iBq" = ( +/obj/structure/curtain, +/obj/machinery/shower/directional/south, +/obj/structure/drain, +/obj/effect/turf_decal/siding/thinplating_new/end{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating_new/end, +/turf/open/indestructible/bathroom, +/area/centcom/holding/cafe) "iCz" = ( /obj/structure/fans/tiny/invisible, /obj/machinery/door/airlock/sandstone{ @@ -7228,10 +8540,32 @@ }, /turf/open/floor/wood, /area/centcom/holding/cafedorms) +"iDL" = ( +/obj/effect/turf_decal/siding{ + color = "#2e2e2e" + }, +/obj/effect/turf_decal/siding{ + color = "#2e2e2e"; + dir = 6 + }, +/obj/machinery/light/warm/directional/east, +/turf/open/floor/bamboo, +/area/centcom/holding/cafe) "iEd" = ( /obj/structure/fireplace, /turf/open/floor/iron/dark, /area/centcom/interlink) +"iFq" = ( +/obj/effect/turf_decal/bot, +/obj/structure/table, +/obj/item/hemostat/alien, +/obj/item/scalpel/alien, +/obj/item/circular_saw/alien, +/obj/item/retractor/alien, +/turf/open/indestructible/hoteltile{ + icon_state = "darkfull" + }, +/area/centcom/holding/cafepark) "iFY" = ( /obj/effect/turf_decal/weather/dirt{ dir = 5 @@ -7244,17 +8578,13 @@ /turf/open/floor/wood, /area/centcom/interlink) "iGS" = ( -/obj/effect/turf_decal/siding{ - color = "#2e2e2e"; - dir = 1 - }, -/obj/machinery/button/curtain{ - id = "ghostcafecabinjapcurtain"; - pixel_x = 20; - pixel_y = -4 - }, -/turf/open/floor/bamboo, -/area/centcom/holding/cafedorms) +/turf/closed/indestructible/alien, +/area/centcom/holding/cafepark) +"iHv" = ( +/obj/structure/fans/tiny/invisible, +/obj/structure/flora/grass/jungle/a/style_4, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) "iIb" = ( /obj/effect/turf_decal/trimline/dark_green/filled/line{ dir = 5 @@ -7262,12 +8592,9 @@ /turf/open/floor/iron, /area/centcom/interlink) "iJK" = ( -/obj/effect/turf_decal/siding{ - color = "#2e2e2e"; - dir = 1 - }, -/turf/closed/indestructible/weeb, -/area/centcom/holding/cafedorms) +/obj/structure/flora/bush/jungle/a, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) "iJX" = ( /obj/structure/chair/sofa/bench/right{ dir = 8 @@ -7295,6 +8622,22 @@ }, /turf/open/floor/iron, /area/centcom/interlink) +"iNW" = ( +/obj/machinery/door/window/left/directional/west{ + dir = 4 + }, +/obj/structure/sink/directional/east, +/turf/open/floor/plating/abductor2, +/area/centcom/holding/cafepark) +"iOt" = ( +/obj/structure/stone_tile/block{ + dir = 4 + }, +/obj/structure/stone_tile/block{ + dir = 8 + }, +/turf/open/floor/fakebasalt, +/area/centcom/holding/cafepark) "iOR" = ( /obj/effect/turf_decal/siding/thinplating_new/dark, /obj/structure/deployable_barricade/guardrail, @@ -7308,12 +8651,10 @@ /turf/open/floor/carpet/red, /area/centcom/interlink) "iQp" = ( -/obj/effect/turf_decal/tile/red/anticorner{ - dir = 4 +/obj/structure/curtain/cloth/fancy/mechanical{ + id = "ghostcafecabin3curtain" }, -/obj/machinery/light/directional/east, -/obj/machinery/vending/wardrobe/sec_wardrobe, -/turf/open/floor/iron, +/turf/closed/indestructible/fakeglass, /area/centcom/holding/cafe) "iQP" = ( /obj/item/kirbyplants/organic/plant22, @@ -7337,6 +8678,12 @@ }, /turf/open/floor/iron/dark, /area/centcom/interlink) +"iTA" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafepark) "iUc" = ( /obj/structure/table/glass/plasmaglass, /obj/item/paper_bin{ @@ -7375,6 +8722,13 @@ /obj/effect/turf_decal/siding/white, /turf/open/floor/iron, /area/centcom/interlink) +"iWH" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/iron/white, +/area/centcom/holding/cafe) "iWY" = ( /obj/structure/chair/sofa/bench/left{ dir = 4; @@ -7412,12 +8766,16 @@ /turf/open/floor/plating, /area/centcom/interlink) "iYC" = ( -/obj/effect/turf_decal/siding{ - color = "#2e2e2e"; - dir = 8 +/obj/machinery/button/door{ + id = "cozyfloofspot1"; + name = "Dorm Bolt Control"; + normaldoorcontrol = 1; + pixel_y = 24; + specialfunctions = 4 }, -/turf/open/floor/bamboo, -/area/centcom/holding/cafedorms) +/obj/structure/closet/abductor, +/turf/open/floor/plating/abductor, +/area/centcom/holding/cafepark) "iZc" = ( /obj/structure/table/reinforced/plastitaniumglass, /obj/item/storage/fancy/cigarettes/cigars/havana{ @@ -7462,13 +8820,21 @@ /obj/effect/landmark/latejoin, /turf/open/floor/mineral/titanium, /area/centcom/interlink) +"jbu" = ( +/obj/structure/railing/wooden_fencing, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafepark) "jdx" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/vending/wardrobe/gene_wardrobe/ghost_cafe, -/turf/open/indestructible/hoteltile{ - icon_state = "darkfull" +/obj/structure/flora/grass/jungle, +/obj/structure/flora/bush/flowers_yw, +/obj/effect/light_emitter/interlink, +/turf/open/misc/grass/planet{ + smoothing_flags = 0 }, -/area/centcom/holding/cafe) +/area/centcom/holding/cafepark) "jeI" = ( /obj/machinery/cryopod/quiet{ dir = 1 @@ -7484,12 +8850,35 @@ }, /turf/open/floor/iron/dark, /area/centcom/interlink) +"jfl" = ( +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 4 + }, +/turf/open/indestructible/plating, +/area/centcom/holding/cafepark) "jgg" = ( -/obj/effect/turf_decal/siding{ - color = "#2e2e2e" +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/centcom/holding/cafe) +"jgt" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lantern{ + pixel_x = -5; + pixel_y = 2 }, /turf/open/floor/bamboo, -/area/centcom/holding/cafedorms) +/area/centcom/holding/cafe) +"jgG" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/fans/tiny/invisible, +/obj/structure/fence{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/centcom/holding/cafepark) "jgT" = ( /obj/effect/light_emitter/interlink, /obj/structure/fence/corner, @@ -7503,8 +8892,17 @@ /turf/open/floor/iron/white, /area/centcom/interlink) "jhR" = ( -/turf/closed/indestructible/syndicate, +/obj/machinery/light/directional/east, +/obj/structure/table/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) +"jiN" = ( +/obj/structure/stone_tile/block/cracked, +/obj/structure/stone_tile/block{ + dir = 1 + }, +/turf/open/floor/fakebasalt, +/area/centcom/holding/cafepark) "jiQ" = ( /obj/structure/reagent_dispensers/watertank/high, /turf/open/misc/dirt/planet, @@ -7516,6 +8914,11 @@ /obj/effect/turf_decal/tile/red/opposingcorners, /turf/open/floor/iron/dark, /area/centcom/interlink) +"jmI" = ( +/obj/item/toy/beach_ball, +/obj/effect/spawner/liquids_spawner, +/turf/open/floor/iron/pool, +/area/centcom/holding/cafepark) "jnu" = ( /obj/machinery/button/door/directional/east{ id = "interlink_hall2"; @@ -7597,6 +9000,23 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/dark, /area/centcom/interlink) +"jtc" = ( +/obj/structure/railing, +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/indestructible/hoteltile{ + icon_state = "floor" + }, +/area/centcom/holding/cafepark) "jtf" = ( /obj/effect/turf_decal/weather/dirt{ dir = 10 @@ -7614,6 +9034,17 @@ /obj/structure/table/wood, /turf/open/floor/carpet/red, /area/centcom/interlink) +"jvm" = ( +/obj/machinery/door/airlock/wood{ + id_tag = "ghostcafecabinb"; + name = "Wooden Cabin" + }, +/obj/structure/fans/tiny/invisible, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) "jvR" = ( /obj/structure/noticeboard/directional/south, /obj/structure/table/wood, @@ -7626,6 +9057,10 @@ }, /turf/open/floor/iron, /area/centcom/interlink) +"jxl" = ( +/obj/structure/wall_torch/spawns_lit/directional/north, +/turf/open/misc/asteroid/snow/indestructible/planet, +/area/centcom/holding/cafepark) "jxw" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/window/indestructible{ @@ -7665,6 +9100,22 @@ }, /turf/open/floor/wood, /area/centcom/holding/cafedorms) +"jDf" = ( +/obj/structure/table/bronze, +/obj/structure/stone_tile/block/burnt, +/turf/open/floor/fakebasalt, +/area/centcom/holding/cafepark) +"jEk" = ( +/obj/structure/fence{ + dir = 4 + }, +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/weather/dirt{ + dir = 6 + }, +/obj/effect/turf_decal/trimline/yellow/filled/warning, +/turf/open/indestructible/plating, +/area/centcom/holding/cafepark) "jFn" = ( /obj/structure/alien/weeds, /obj/structure/alien/egg/burst, @@ -7735,16 +9186,25 @@ }, /turf/open/misc/beach/sand, /area/centcom/holding/cafepark) +"jOc" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 1 + }, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 8 + }, +/obj/structure/stone_tile/surrounding_tile/cracked, +/turf/open/floor/fakebasalt, +/area/centcom/holding/cafepark) "jQJ" = ( -/obj/effect/turf_decal/bot, -/obj/structure/table, -/obj/item/hemostat/alien, -/obj/item/scalpel/alien, -/obj/item/circular_saw/alien, -/obj/item/retractor/alien, -/turf/open/indestructible/hoteltile{ - icon_state = "darkfull" +/obj/machinery/button/door{ + id = "ghostcafecabin3"; + name = "Dorm Bolt Control"; + normaldoorcontrol = 1; + pixel_x = -25; + specialfunctions = 4 }, +/turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) "jRW" = ( /obj/effect/turf_decal/trimline/dark_red/filled/arrow_cw{ @@ -7811,6 +9271,18 @@ /obj/machinery/light/directional/east, /turf/open/floor/iron/dark, /area/centcom/interlink) +"jYf" = ( +/obj/structure/table/wood, +/obj/item/paper_bin, +/turf/open/indestructible/carpet, +/area/centcom/holding/cafe) +"jYy" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/weather/dirt{ + dir = 6 + }, +/turf/open/indestructible/plating, +/area/centcom/holding/cafepark) "jZb" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -7833,6 +9305,23 @@ icon_state = "floor" }, /area/centcom/holding/cafe) +"jZH" = ( +/obj/effect/turf_decal/weather/sand{ + dir = 10 + }, +/obj/machinery/light/small/directional/east, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafepark) +"kdo" = ( +/obj/structure/hedge/opaque, +/obj/structure/curtain/cloth/fancy/mechanical{ + icon_state = "bounty-open"; + icon_type = "bounty"; + id = "CCSalon"; + name = "curtain" + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) "kdw" = ( /obj/effect/light_emitter/interlink, /obj/effect/turf_decal/weather/dirt{ @@ -7863,6 +9352,24 @@ }, /turf/open/floor/iron, /area/centcom/interlink) +"kfK" = ( +/obj/structure/flora/grass/jungle/a/style_5, +/obj/structure/flora/grass/jungle/a/style_2, +/turf/open/misc/grass/planet{ + smoothing_flags = 0 + }, +/area/centcom/holding/cafe) +"kgI" = ( +/obj/structure/flora/biolumi/flower{ + light_color = "#D9FF00"; + light_power = 0.3; + light_range = 10; + random_light = null + }, +/turf/open/misc/grass/planet{ + smoothing_flags = 0 + }, +/area/centcom/holding/cafepark) "khz" = ( /obj/structure/chair/sofa/bench/right, /turf/open/floor/iron/cafeteria, @@ -7888,6 +9395,16 @@ "kjb" = ( /turf/closed/indestructible/rock, /area/cruiser_dock) +"kkV" = ( +/obj/machinery/button/door{ + id = "ghostcafecabin1"; + name = "Dorm Bolt Control"; + normaldoorcontrol = 1; + pixel_y = 24; + specialfunctions = 4 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) "klI" = ( /obj/docking_port/stationary{ dir = 2; @@ -7948,6 +9465,22 @@ }, /turf/open/floor/iron/dark, /area/centcom/interlink) +"kpY" = ( +/obj/structure/closet/cabinet, +/obj/item/stamp/head/rd{ + pixel_x = 3; + pixel_y = -2 + }, +/obj/item/stamp/head/captain, +/obj/item/stamp/head/ce, +/obj/item/stamp/head/cmo, +/obj/item/stamp/head/hop, +/obj/item/stamp/head/hos, +/obj/item/stamp/head/qm, +/obj/item/stamp/cat, +/obj/item/toy/crayon/spraycan, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) "kqs" = ( /obj/structure/table/reinforced, /obj/item/paper_bin{ @@ -7977,6 +9510,16 @@ /obj/effect/light_emitter/interlink, /turf/open/floor/grass, /area/centcom/interlink) +"kso" = ( +/obj/machinery/light/directional/south, +/obj/effect/spawner/liquids_spawner, +/turf/open/floor/iron/pool/cobble, +/area/centcom/holding/cafepark) +"kuV" = ( +/obj/structure/flora/bush/leavy/style_2, +/obj/structure/flora/tree/jungle/style_random, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) "kvj" = ( /turf/open/floor/plating, /area/cruiser_dock) @@ -7989,6 +9532,16 @@ /obj/effect/landmark/latejoin, /turf/open/floor/iron/white, /area/centcom/interlink) +"kvU" = ( +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 1 + }, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 8 + }, +/obj/structure/barricade/wooden, +/turf/open/floor/fakebasalt, +/area/centcom/holding/cafepark) "kwp" = ( /obj/machinery/status_display/evac/directional/south, /obj/effect/turf_decal/trimline/dark_green/line{ @@ -8004,6 +9557,16 @@ /obj/effect/turf_decal/siding/white, /turf/open/floor/iron/smooth, /area/centcom/interlink) +"kxO" = ( +/obj/structure/chair/sofa/corp/corner{ + dir = 4 + }, +/turf/open/floor/carpet/black, +/area/centcom/holding/cafe) +"kzb" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron, +/area/centcom/holding/cafe) "kzD" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 1 @@ -8041,6 +9604,14 @@ }, /turf/open/floor/iron/showroomfloor, /area/centcom/holding/cafe) +"kHi" = ( +/obj/machinery/mech_bay_recharge_port, +/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/box, +/turf/open/floor/iron, +/area/centcom/holding/cafe) "kHP" = ( /obj/structure/chair/sofa/corp/left, /obj/effect/turf_decal/siding/wood, @@ -8054,6 +9625,65 @@ /obj/machinery/vending/wardrobe/sec_wardrobe/red, /turf/open/misc/dirt/planet, /area/centcom/holding/cafepark) +"kIR" = ( +/obj/structure/bed/abductor, +/turf/open/floor/plating/abductor, +/area/centcom/holding/cafepark) +"kJq" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/indestructible/hoteltile{ + icon_state = "floor" + }, +/area/centcom/holding/cafepark) +"kJu" = ( +/obj/structure/chair/sofa/corp/corner{ + dir = 4 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) +"kJw" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/indestructible/hoteltile{ + icon_state = "floor" + }, +/area/centcom/holding/cafepark) +"kJz" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/indestructible/hoteltile{ + icon_state = "white" + }, +/area/centcom/holding/cafepark) +"kJL" = ( +/obj/item/flashlight/flare/candle/infinite{ + pixel_x = 9; + pixel_y = 29 + }, +/turf/open/floor/carpet, +/area/centcom/holding/cafe) "kJO" = ( /obj/effect/turf_decal/siding/wood, /obj/structure/chair/sofa/middle/brown, @@ -8062,12 +9692,43 @@ }, /turf/open/floor/wood/tile, /area/centcom/interlink) +"kJU" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/closed/indestructible/weeb, +/area/centcom/holding/cafe) "kKo" = ( /obj/machinery/computer/records/security{ dir = 8 }, /turf/open/floor/iron/dark/textured_large, /area/centcom/interlink) +"kKs" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 4 + }, +/turf/open/indestructible/plating, +/area/centcom/holding/cafepark) +"kLD" = ( +/obj/machinery/light/directional/south, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafepark) +"kLW" = ( +/obj/structure/railing{ + invisibility = 100; + dir = 8 + }, +/obj/structure/chair/wood{ + dir = 8 + }, +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafepark) "kLZ" = ( /obj/effect/light_emitter/interlink, /obj/effect/turf_decal/weather/dirt, @@ -8079,6 +9740,12 @@ desc = "There's been a recent disturbance right here, it's evident something must've been buried; but it's pretty deep. A faint, yet deep humming sound emanates from the spot as you get closer." }, /area/centcom/holding/cafepark) +"kMw" = ( +/obj/structure/chair/stool/directional/south{ + dir = 4 + }, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) "kMV" = ( /obj/structure/flora/biolumi/flower{ random_light = null @@ -8117,21 +9784,21 @@ }, /turf/open/floor/iron, /area/centcom/interlink) +"kPf" = ( +/obj/structure/chair/sofa/bench/corner{ + dir = 4 + }, +/turf/open/floor/wood/large, +/area/centcom/holding/cafe) "kPg" = ( /obj/effect/turf_decal/sand, /obj/machinery/light/directional/south, /turf/open/misc/beach/sand, /area/centcom/holding/cafepark) "kPK" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/centcom/holding/cafe) +/obj/structure/railing/wooden_fencing, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) "kQs" = ( /obj/machinery/door/airlock/public/glass{ name = "Interlink Locker Room" @@ -8153,6 +9820,19 @@ /obj/machinery/light/warm/directional/north, /turf/open/floor/iron/dark, /area/centcom/interlink) +"kWb" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/structure/railing/wooden_fencing{ + dir = 8 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) +"kWr" = ( +/obj/structure/flora/grass/jungle/b/style_random, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) "kWA" = ( /obj/effect/turf_decal/trimline/green/line{ dir = 8 @@ -8162,13 +9842,23 @@ "kWH" = ( /turf/open/floor/iron/grimy, /area/centcom/interlink) -"kYn" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/skill_station, -/turf/open/indestructible/hoteltile{ - icon_state = "darkfull" +"kWI" = ( +/obj/structure/chair/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 1 }, +/obj/machinery/light/small/directional/east, +/turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) +"kYn" = ( +/obj/structure/stone_tile/surrounding_tile{ + dir = 4 + }, +/obj/structure/chair/stool/bamboo{ + dir = 8 + }, +/turf/open/floor/fakebasalt, +/area/centcom/holding/cafepark) "kZB" = ( /obj/machinery/light/directional/west, /obj/structure/table, @@ -8184,6 +9874,27 @@ /obj/structure/flora/bush/fullgrass/style_random, /turf/open/floor/grass, /area/centcom/interlink) +"kZK" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/structure/chair/sofa/bench/left{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/indestructible/hoteltile{ + icon_state = "floor" + }, +/area/centcom/holding/cafepark) "kZQ" = ( /obj/machinery/modular_computer/preset/command{ dir = 1 @@ -8194,6 +9905,26 @@ }, /turf/open/floor/iron, /area/centcom/interlink) +"lat" = ( +/obj/structure/hedge/opaque, +/obj/structure/railing{ + dir = 8 + }, +/obj/structure/curtain/cloth/fancy/mechanical{ + icon_state = "bounty-open"; + icon_type = "bounty"; + id = "CCSalon"; + name = "curtain" + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) +"laX" = ( +/obj/structure/fans/tiny/invisible, +/obj/structure/railing/corner{ + dir = 8 + }, +/turf/open/indestructible/cobble/side, +/area/centcom/holding/cafepark) "lba" = ( /obj/machinery/computer/records/medical{ dir = 8 @@ -8213,10 +9944,64 @@ "lcR" = ( /turf/closed/indestructible/riveted, /area/centcom/interlink/dorm_rooms) +"ldK" = ( +/obj/structure/toilet{ + pixel_y = 12 + }, +/obj/machinery/light/small/directional/west, +/obj/machinery/button/door{ + id = "CCToilet"; + name = "Door Lock"; + normaldoorcontrol = 1; + specialfunctions = 4; + pixel_y = 0; + pixel_x = 28 + }, +/turf/open/floor/iron/freezer, +/area/centcom/holding/cafe) "lgh" = ( /obj/item/stack/sheet/mineral/wood/fifty, /turf/open/misc/dirt/planet, /area/centcom/holding/cafepark) +"lgm" = ( +/obj/structure/rack/shelf{ + icon = 'modular_nova/modules/mapping/icons/unique/furniture.dmi'; + icon_state = "empty_shelf_1" + }, +/obj/structure/stone_tile/slab, +/obj/item/reagent_containers/cup/bowl/mushroom_bowl{ + pixel_y = 7; + pixel_x = -5 + }, +/obj/item/reagent_containers/cup/bowl/mushroom_bowl{ + pixel_y = 7; + pixel_x = 7 + }, +/obj/item/reagent_containers/cup/bowl/mushroom_bowl{ + pixel_y = 11; + pixel_x = 1 + }, +/obj/item/smelling_salts{ + pixel_y = -9; + pixel_x = -5 + }, +/obj/item/smelling_salts{ + pixel_y = -9; + pixel_x = 6 + }, +/obj/item/reagent_containers/cup/bowl/mushroom_bowl{ + pixel_y = 11; + pixel_x = 1 + }, +/obj/structure/wall_torch/spawns_lit/directional/west, +/turf/open/floor/fakebasalt, +/area/centcom/holding/cafepark) +"lgt" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 9 + }, +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafepark) "lgF" = ( /obj/machinery/door/airlock/centcom{ name = "Blueshield's Office" @@ -8226,6 +10011,10 @@ /obj/effect/turf_decal/tile/green/opposingcorners, /turf/open/floor/iron, /area/centcom/interlink) +"lhh" = ( +/obj/machinery/shower/directional/south, +/turf/open/floor/iron/freezer, +/area/centcom/holding/cafe) "lht" = ( /obj/effect/turf_decal/siding/wood/corner{ dir = 4 @@ -8237,15 +10026,16 @@ /turf/open/floor/wood/tile, /area/centcom/interlink) "lhF" = ( -/obj/machinery/computer/operating{ +/obj/structure/stone_tile/block, +/turf/open/lava/fake, +/area/centcom/holding/cafepark) +"lhK" = ( +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 8 }, -/obj/effect/turf_decal/tile/blue/half{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/closet/crate/bin, /turf/open/floor/iron/white, /area/centcom/holding/cafe) "lic" = ( @@ -8255,6 +10045,17 @@ /obj/effect/turf_decal/tile/red/opposingcorners, /turf/open/floor/iron/dark, /area/centcom/interlink) +"lij" = ( +/obj/item/kirbyplants/random, +/obj/machinery/button/door{ + id = "CCSalon"; + name = "Bolt Control"; + normaldoorcontrol = 1; + specialfunctions = 4; + pixel_y = -25 + }, +/turf/open/floor/wood/large, +/area/centcom/holding/cafe) "liK" = ( /obj/structure/reagent_dispensers/cooking_oil, /turf/open/floor/iron/showroomfloor, @@ -8278,6 +10079,14 @@ /obj/structure/spacevine, /turf/open/water/beach, /area/centcom/holding/cafepark) +"lkC" = ( +/obj/structure/chair/sofa/bench/left{ + dir = 1; + greyscale_colors = "#AA8A61" + }, +/obj/effect/turf_decal/tile/red/opposingcorners, +/turf/open/floor/iron/dark, +/area/centcom/holding/cafe) "lla" = ( /obj/machinery/iv_drip, /obj/effect/turf_decal/bot_blue, @@ -8305,6 +10114,10 @@ /obj/item/kirbyplants/random, /turf/open/floor/iron/dark, /area/centcom/interlink) +"lro" = ( +/obj/structure/marker_beacon/burgundy, +/turf/open/indestructible/plating, +/area/centcom/holding/cafepark) "lrp" = ( /obj/effect/turf_decal/trimline/dark_green/filled/corner, /turf/open/floor/iron, @@ -8318,6 +10131,31 @@ /obj/structure/railing, /turf/open/floor/iron/dark, /area/centcom/interlink) +"ltu" = ( +/obj/item/folder/white{ + pixel_x = 4; + pixel_y = -3 + }, +/obj/item/folder/white{ + pixel_x = 4; + pixel_y = -3 + }, +/obj/item/storage/pill_bottle/mutadone, +/obj/item/storage/pill_bottle/mannitol, +/obj/structure/table/glass, +/obj/item/clothing/gloves/latex, +/obj/item/flashlight/pen{ + pixel_x = 4; + pixel_y = 3 + }, +/turf/open/indestructible/hoteltile{ + icon_state = "darkfull" + }, +/area/centcom/holding/cafepark) +"lvk" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/large, +/area/centcom/holding/cafe) "lvR" = ( /obj/effect/turf_decal/trimline/dark_green/filled/warning{ dir = 9 @@ -8331,24 +10169,14 @@ /turf/open/misc/beach/sand, /area/centcom/holding/cafepark) "lwt" = ( -/obj/structure/fence/door, -/turf/open/floor/iron, -/area/centcom/holding/cafe) -"lwv" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ +/obj/structure/chair/wood{ dir = 4 }, -/obj/machinery/vending/medical{ - pixel_x = -2 - }, -/turf/open/floor/iron/white, +/turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) +"lwv" = ( +/turf/closed/indestructible/wood, +/area/centcom/holding/cafepark) "lxl" = ( /obj/structure/chair/sofa/bench/right, /obj/effect/landmark/latejoin, @@ -8362,9 +10190,6 @@ dir = 8 }, /obj/structure/table/wood, -/obj/item/flashlight/lamp/green{ - pixel_y = 6 - }, /turf/open/floor/wood/tile, /area/centcom/interlink) "lzr" = ( @@ -8379,6 +10204,12 @@ /obj/machinery/light/cold/directional/east, /turf/open/misc/asteroid, /area/cruiser_dock) +"lAv" = ( +/obj/structure/chair/sofa/corp/right{ + dir = 4 + }, +/turf/open/floor/carpet/black, +/area/centcom/holding/cafe) "lAx" = ( /obj/effect/turf_decal/siding/white{ dir = 1 @@ -8388,6 +10219,16 @@ }, /turf/open/floor/iron, /area/centcom/interlink) +"lBn" = ( +/obj/structure/bed/maint{ + pixel_y = 13 + }, +/obj/structure/bed/maint, +/obj/item/bedsheet/black/double{ + dir = 1 + }, +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafepark) "lCi" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/window/reinforced/spawner/directional/north{ @@ -8401,6 +10242,28 @@ /obj/item/clothing/under/shorts/red, /turf/open/floor/wood, /area/centcom/holding/cafepark) +"lDo" = ( +/obj/structure/chair/wood{ + dir = 8 + }, +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafepark) +"lDy" = ( +/obj/effect/turf_decal/siding{ + color = "#2e2e2e"; + dir = 5 + }, +/obj/structure/table/wood/fancy/orange{ + pixel_y = -3 + }, +/obj/item/flashlight/flare/candle/infinite{ + pixel_x = -7; + pixel_y = -2 + }, +/obj/item/flashlight/flare/candle/infinite, +/obj/machinery/light/warm/directional/east, +/turf/open/floor/bamboo, +/area/centcom/holding/cafe) "lFU" = ( /obj/structure/table/wood, /obj/item/folder/white{ @@ -8423,6 +10286,13 @@ /obj/effect/mapping_helpers/airlock/access/all/command/general, /turf/open/floor/iron, /area/centcom/interlink) +"lHD" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted, +/obj/structure/chair{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/centcom/holding/cafe) "lHT" = ( /obj/effect/turf_decal/trimline/dark_red/filled/arrow_cw, /turf/open/floor/iron, @@ -8454,14 +10324,30 @@ /turf/open/floor/wood, /area/centcom/holding/cafedorms) "lLN" = ( -/obj/machinery/light/small/directional/north, +/obj/structure/mirror/directional/east, +/obj/structure/sink/directional/west, /turf/open/floor/sepia, -/area/centcom/holding/cafedorms) +/area/centcom/holding/cafe) +"lMj" = ( +/obj/structure/chair/stool/bamboo{ + dir = 8 + }, +/turf/open/floor/fakebasalt, +/area/centcom/holding/cafepark) +"lMY" = ( +/obj/structure/stone_tile/slab/cracked, +/obj/structure/statue/bone/rib{ + dir = 1 + }, +/turf/open/lava/fake, +/area/centcom/holding/cafepark) "lNi" = ( -/obj/machinery/light/directional/north, -/obj/machinery/vending/boozeomat/cafe, -/turf/open/indestructible/hotelwood, -/area/centcom/holding/cafedorms) +/obj/machinery/vending/wardrobe/chem_wardrobe/ghost_cafe, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/centcom/holding/cafe) "lOD" = ( /obj/structure/sign/directions/evac{ pixel_y = -8 @@ -8557,25 +10443,56 @@ /obj/structure/flora/tree/jungle/style_6, /turf/open/floor/grass, /area/centcom/interlink) +"lVs" = ( +/obj/effect/turf_decal/siding{ + color = "#2e2e2e"; + dir = 1 + }, +/turf/closed/indestructible/weeb, +/area/centcom/holding/cafe) "lVL" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 }, /turf/open/floor/wood/tile, /area/centcom/interlink) +"lWZ" = ( +/obj/structure/table{ + name = "Jim Norton's Quebecois Coffee table" + }, +/obj/item/flashlight/flare/candle/infinite{ + pixel_x = 4; + pixel_y = 10 + }, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) "lXk" = ( /obj/item/flashlight/lantern, /turf/open/misc/dirt/planet, /area/centcom/interlink) "lXl" = ( -/obj/structure/easel, -/obj/item/canvas/nineteen_nineteen, -/turf/open/misc/grass/planet, +/obj/structure/wall_torch/spawns_lit/directional/east, +/turf/open/misc/asteroid/snow/indestructible/planet, /area/centcom/holding/cafepark) "lXo" = ( /obj/machinery/oven/range, /turf/open/floor/wood, /area/centcom/holding/cafe) +"lYJ" = ( +/obj/effect/spawner/liquids_spawner, +/obj/structure/chair/sofa/bench/left{ + dir = 8 + }, +/turf/open/floor/iron/pool/cobble/corner{ + dir = 4 + }, +/area/centcom/holding/cafe) +"lZn" = ( +/obj/structure/chair/wood{ + dir = 8 + }, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) "mac" = ( /obj/effect/turf_decal/siding/white{ dir = 1 @@ -8613,6 +10530,20 @@ }, /turf/open/floor/wood, /area/centcom/interlink) +"mfo" = ( +/obj/structure/stone_tile/slab/cracked, +/obj/structure/mineral_door/wood/large_gate{ + dir = 8 + }, +/turf/open/floor/fakebasalt, +/area/centcom/holding/cafepark) +"mfu" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/weather/dirt{ + dir = 9 + }, +/turf/open/indestructible/plating, +/area/centcom/holding/cafepark) "mfN" = ( /obj/structure/table{ name = "Jim Norton's Quebecois Coffee table" @@ -8629,6 +10560,15 @@ }, /turf/open/floor/iron, /area/centcom/interlink) +"mgr" = ( +/obj/structure/wall_torch/spawns_lit/directional/east, +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafepark) +"mgY" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp/green, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) "mjo" = ( /obj/machinery/door/airlock/centcom{ name = "Interlink Security Checkpoint" @@ -8697,6 +10637,11 @@ /obj/item/toner/extreme, /turf/open/floor/iron, /area/centcom/interlink) +"mon" = ( +/obj/structure/fans/tiny/invisible, +/obj/structure/flora/bush/jungle/b, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) "moG" = ( /obj/item/kirbyplants/organic/plant22, /turf/open/floor/iron/dark, @@ -8724,20 +10669,6 @@ }, /turf/open/floor/wood, /area/centcom/interlink/dorm_rooms) -"mtr" = ( -/obj/structure/toilet/snappop{ - dir = 4 - }, -/obj/effect/turf_decal/siding/thinplating/end{ - dir = 4; - pixel_y = -6 - }, -/obj/effect/turf_decal/siding/thinplating{ - dir = 8; - pixel_y = -7 - }, -/turf/open/floor/sepia, -/area/centcom/holding/cafedorms) "mtv" = ( /obj/structure/chair/sofa/bench/right{ dir = 8 @@ -8761,6 +10692,61 @@ }, /turf/open/floor/iron/dark, /area/centcom/interlink) +"mwo" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/cup/glass/mug{ + pixel_x = 13; + pixel_y = -1 + }, +/obj/item/reagent_containers/cup/glass/mug{ + pixel_x = 6; + pixel_y = 3 + }, +/obj/item/reagent_containers/cup/glass/mug{ + pixel_x = 13; + pixel_y = 7 + }, +/obj/item/reagent_containers/cup/glass/shaker{ + pixel_x = -2; + pixel_y = 12 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/structure/railing/wooden_fencing{ + dir = 8 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) +"mwV" = ( +/obj/structure/stone_tile/surrounding_tile{ + dir = 4 + }, +/obj/structure/flora/ash/cacti, +/obj/structure/wall_torch/spawns_lit/directional/north, +/turf/open/floor/fakebasalt, +/area/centcom/holding/cafepark) +"mxd" = ( +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/indestructible/hoteltile{ + icon_state = "floor" + }, +/area/centcom/holding/cafepark) "mxj" = ( /obj/structure/table/reinforced, /obj/item/reagent_containers/cup/glass/shaker{ @@ -8777,10 +10763,23 @@ }, /turf/open/floor/iron/dark, /area/centcom/interlink) +"mxI" = ( +/obj/structure/fans/tiny/invisible, +/obj/structure/fake_stairs/wood/directional/north, +/obj/machinery/light/directional/east, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) "mxQ" = ( /obj/structure/table, /turf/open/floor/carpet/red, /area/cruiser_dock) +"mza" = ( +/obj/structure/closet/crate/bin, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafepark) "mzf" = ( /obj/effect/turf_decal/trimline/green/filled/arrow_ccw, /obj/effect/turf_decal/siding/white, @@ -8820,12 +10819,81 @@ /obj/structure/bookcase/random/reference, /turf/open/floor/iron, /area/centcom/interlink) +"mBs" = ( +/obj/structure/flora/grass/jungle/a/style_5, +/obj/effect/light_emitter/interlink, +/turf/open/misc/grass/planet{ + smoothing_flags = 0 + }, +/area/centcom/holding/cafepark) +"mBM" = ( +/obj/structure/table/rolling, +/obj/item/hhmirror{ + pixel_x = 5; + pixel_y = 9 + }, +/obj/item/hairbrush/comb, +/obj/item/razor{ + pixel_x = -7; + pixel_y = 3 + }, +/obj/item/scissors{ + pixel_x = 2; + pixel_y = 3 + }, +/obj/item/straight_razor{ + pixel_x = 9; + pixel_y = 2 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/window/spawner/directional/east, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) +"mBS" = ( +/obj/structure/closet/crate/wooden, +/obj/item/hemostat/ashwalker, +/obj/item/retractor/ashwalker{ + pixel_y = -9 + }, +/obj/item/scalpel/ashwalker{ + pixel_y = -4 + }, +/obj/item/surgicaldrill/ashwalker, +/obj/item/circular_saw/ashwalker, +/obj/item/cautery/ashwalker, +/turf/open/floor/fakebasalt, +/area/centcom/holding/cafepark) +"mCg" = ( +/obj/structure/railing/wooden_fencing, +/obj/structure/railing/wooden_fencing{ + dir = 8 + }, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) "mCr" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 6 }, /turf/open/floor/plating, /area/cruiser_dock) +"mCv" = ( +/obj/structure/table/reinforced/rglass, +/obj/structure/mirror/directional/west, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/machinery/light/directional/west, +/obj/item/reagent_containers/dropper{ + pixel_x = 3; + pixel_y = 1 + }, +/obj/machinery/dryer{ + pixel_y = 14 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) "mDs" = ( /obj/structure/chair/sofa/bench{ dir = 4 @@ -8841,6 +10909,12 @@ /obj/structure/flora/bush/flowers_br/style_random, /turf/open/floor/grass, /area/centcom/interlink) +"mDS" = ( +/obj/machinery/hypnochair, +/turf/open/indestructible/hoteltile{ + icon_state = "darkfull" + }, +/area/centcom/holding/cafepark) "mEW" = ( /obj/effect/turf_decal/sand, /obj/structure/chair/stool/bar/directional/west{ @@ -8849,6 +10923,20 @@ /obj/effect/turf_decal/stripes/asteroid/line, /turf/open/misc/beach/sand, /area/centcom/holding/cafepark) +"mGn" = ( +/obj/structure/table{ + name = "Jim Norton's Quebecois Coffee table" + }, +/obj/item/food/poppypretzel{ + pixel_x = -5; + pixel_y = -2 + }, +/obj/item/reagent_containers/cup/glass/mug{ + pixel_x = 10; + pixel_y = 7 + }, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) "mHF" = ( /obj/structure/sink/directional/east, /turf/open/floor/iron, @@ -8864,6 +10952,22 @@ /obj/machinery/vending/boozeomat/cafe, /turf/open/floor/wood, /area/centcom/holding/cafe) +"mIp" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/cup/glass/trophy{ + pixel_y = 11; + pixel_x = 9 + }, +/obj/item/reagent_containers/cup/glass/bottle/wine/unlabeled{ + pixel_x = -3; + pixel_y = 7 + }, +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafepark) +"mJB" = ( +/obj/structure/fireplace, +/turf/open/floor/stone, +/area/centcom/holding/cafe) "mJG" = ( /obj/structure/chair/sofa/bench/right{ dir = 8 @@ -8885,12 +10989,12 @@ /turf/open/floor/grass, /area/centcom/interlink) "mLK" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/vending/wardrobe/viro_wardrobe/ghost_cafe, -/turf/open/indestructible/hoteltile{ - icon_state = "darkfull" +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 5 }, -/area/centcom/holding/cafe) +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafepark) "mMu" = ( /obj/structure/chair/sofa/bench{ dir = 4 @@ -8906,19 +11010,72 @@ dir = 9 }, /area/centcom/holding/cafepark) +"mOW" = ( +/obj/machinery/newscaster/directional/north, +/turf/open/floor/iron/dark, +/area/centcom/holding/cafe) "mPR" = ( -/obj/effect/turf_decal/tile/blue/half{ - dir = 4 +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/weather/dirt{ + dir = 9 }, -/obj/machinery/iv_drip, -/obj/machinery/defibrillator_mount/loaded{ - pixel_x = 28 +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 1 }, -/turf/open/floor/iron/white, +/turf/open/indestructible/plating, +/area/centcom/holding/cafepark) +"mQa" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/skill_station, +/turf/open/indestructible/hoteltile{ + icon_state = "darkfull" + }, +/area/centcom/holding/cafepark) +"mRb" = ( +/obj/structure/chair/sofa/bench/left{ + dir = 8 + }, +/obj/machinery/light/warm/directional/east, +/turf/open/floor/wood/large, /area/centcom/holding/cafe) +"mRV" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/chair/sofa/bench/right, +/turf/open/indestructible/hoteltile{ + icon_state = "floor" + }, +/area/centcom/holding/cafepark) "mSs" = ( /turf/open/floor/iron/freezer, /area/centcom/interlink) +"mSw" = ( +/obj/structure/stone_tile/surrounding_tile{ + dir = 4 + }, +/obj/structure/stone_tile/surrounding_tile{ + dir = 8 + }, +/turf/open/floor/fakebasalt, +/area/centcom/holding/cafepark) +"mSQ" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/weather/dirt{ + dir = 5 + }, +/turf/open/indestructible/plating, +/area/centcom/holding/cafepark) "mTS" = ( /obj/machinery/stasis{ dir = 4 @@ -8959,17 +11116,25 @@ icon_state = "darkfull" }, /area/centcom/holding/cafe) -"mZp" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ +"mYy" = ( +/obj/structure/railing/corner{ dir = 8 }, -/obj/vehicle/ridden/wheelchair{ - dir = 4 +/obj/structure/fake_stairs/directional/south, +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafepark) +"mZp" = ( +/obj/structure/flora/tree/jungle/small/style_random, +/obj/structure/flora/grass/jungle, +/obj/effect/light_emitter/interlink, +/turf/open/misc/grass/planet{ + smoothing_flags = 0 }, -/turf/open/floor/iron/white, +/area/centcom/holding/cafepark) +"mZu" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, /area/centcom/holding/cafe) "nap" = ( /mob/living/basic/crab{ @@ -8992,6 +11157,10 @@ /obj/machinery/deepfryer, /turf/open/floor/wood, /area/centcom/holding/cafe) +"ncP" = ( +/obj/structure/flora/ash/cacti, +/turf/open/floor/fakebasalt, +/area/centcom/holding/cafepark) "ndc" = ( /obj/effect/turf_decal/tile/dark_blue/opposingcorners, /obj/effect/turf_decal/siding/wood{ @@ -9012,25 +11181,25 @@ /turf/open/misc/asteroid, /area/cruiser_dock) "neb" = ( -/obj/structure/bed/abductor, -/turf/open/floor/plating/abductor, +/obj/structure/reagent_dispensers/watertank/high, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/iron, /area/centcom/holding/cafe) "ngg" = ( /obj/structure/chair/stool/bar/directional/west, /turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) -"nii" = ( -/obj/machinery/door/window/left/directional/west{ - base_state = "right"; - dir = 1; - icon_state = "right"; - name = "Monkey Pen"; - pixel_y = 2; - req_access = list("genetics") - }, -/turf/open/indestructible/hoteltile{ - icon_state = "darkfull" +"nhZ" = ( +/obj/structure/chair/sofa/corp/left{ + dir = 8 }, +/turf/open/indestructible/carpet, +/area/centcom/holding/cafepark) +"nii" = ( +/obj/structure/fireplace, +/turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) "nim" = ( /obj/effect/turf_decal/trimline/green/filled/arrow_cw{ @@ -9041,6 +11210,29 @@ }, /turf/open/floor/iron/dark, /area/centcom/interlink) +"nis" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/structure/rack/wooden, +/obj/item/plate/blowing_glass{ + pixel_y = -9; + pixel_x = -2 + }, +/obj/item/plate/blowing_glass{ + pixel_y = -6; + pixel_x = -1 + }, +/obj/item/reagent_containers/cup/beaker/large/blowing_glass{ + pixel_y = 9; + pixel_x = 5 + }, +/obj/item/reagent_containers/cup/beaker/large/blowing_glass{ + pixel_y = 9; + pixel_x = -5 + }, +/turf/open/floor/stone, +/area/centcom/holding/cafepark) "niJ" = ( /obj/structure/closet/crate/bin, /turf/open/floor/iron/dark, @@ -9052,15 +11244,96 @@ }, /turf/open/misc/beach/sand, /area/centcom/holding/cafepark) -"nlM" = ( -/obj/structure/chair/office{ - dir = 1 +"njQ" = ( +/obj/effect/turf_decal/bot, +/obj/structure/showcase/machinery/implanter{ + icon = 'icons/obj/antags/abductor.dmi'; + icon_state = "experiment"; + name = "pod" }, +/turf/open/indestructible/hoteltile{ + icon_state = "darkfull" + }, +/area/centcom/holding/cafepark) +"nkZ" = ( +/obj/machinery/light/directional/west, +/obj/structure/closet, /turf/open/floor/iron, /area/centcom/holding/cafe) +"nlv" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/structure/chair/sofa/bench/right, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/indestructible/hoteltile{ + icon_state = "floor" + }, +/area/centcom/holding/cafepark) +"nlB" = ( +/obj/structure/chair/stool{ + name = "Jim Norton's Quebecois Coffee stool" + }, +/obj/structure/flora/grass/jungle/b/style_random, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) +"nlM" = ( +/obj/structure/curtain, +/obj/machinery/shower/directional/north, +/obj/structure/window/reinforced/tinted/spawner/directional/east, +/turf/open/floor/plating/abductor2, +/area/centcom/holding/cafepark) +"nng" = ( +/obj/structure/table/wood, +/obj/item/food/muffin/berry{ + pixel_x = 18; + pixel_y = 9 + }, +/obj/structure/desk_bell{ + pixel_x = 7 + }, +/obj/effect/turf_decal/siding/wood, +/obj/structure/window/spawner/directional/south, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) +"nnJ" = ( +/obj/structure/rack/wooden, +/obj/item/storage/box/matches{ + pixel_y = -8; + pixel_x = -3 + }, +/obj/item/pen/charcoal{ + pixel_y = 5 + }, +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafepark) "noq" = ( /turf/open/floor/wood, /area/centcom/holding/cafe) +"noy" = ( +/obj/structure/table/reinforced/rglass, +/obj/structure/mirror/directional/west, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/machinery/light/directional/west, +/obj/item/hhmirror, +/obj/item/clothing/head/wig/random{ + pixel_x = 4; + pixel_y = 3 + }, +/obj/item/clothing/head/wig/natural, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) "noA" = ( /obj/structure/table{ name = "Jim Norton's Quebecois Coffee table" @@ -9075,6 +11348,12 @@ }, /turf/open/floor/iron, /area/centcom/interlink) +"npc" = ( +/obj/structure/chair/sofa/corp/right{ + dir = 8 + }, +/turf/open/indestructible/carpet, +/area/centcom/holding/cafepark) "npe" = ( /obj/effect/turf_decal/tile/dark_blue/opposingcorners, /obj/effect/turf_decal/siding/wood/corner{ @@ -9083,9 +11362,16 @@ /obj/structure/bookcase/random/religion, /turf/open/floor/iron, /area/centcom/interlink) +"npr" = ( +/obj/structure/fake_stairs/wood/directional/east, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafepark) "nps" = ( /obj/structure/easel, /obj/item/canvas/twentythree_twentythree, +/obj/structure/sign/painting/library{ + pixel_x = -32 + }, /turf/open/floor/carpet/cyan, /area/centcom/holding/cafe) "nqQ" = ( @@ -9131,21 +11417,24 @@ /turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) "nxR" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 }, -/obj/structure/sign/poster/contraband/lusty_xenomorph/directional/south, -/obj/machinery/vending/wardrobe/jani_wardrobe/ghost_cafe, -/turf/open/indestructible/hoteltile{ - icon_state = "white" +/turf/open/floor/iron/white, +/area/centcom/holding/cafe) +"nyj" = ( +/obj/structure/chair/office{ + dir = 8 }, +/turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) "nyr" = ( /turf/open/floor/iron/smooth_large, /area/cruiser_dock) +"nzn" = ( +/obj/effect/turf_decal/weather/snow/corner, +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafepark) "nzO" = ( /obj/machinery/door/poddoor/shutters/window/preopen, /turf/open/floor/iron, @@ -9172,6 +11461,12 @@ dir = 4 }, /area/cruiser_dock) +"nFi" = ( +/obj/structure/curtain, +/obj/machinery/shower/directional/north, +/obj/structure/window/spawner/directional/west, +/turf/open/floor/iron/freezer, +/area/centcom/holding/cafe) "nFH" = ( /obj/machinery/door/airlock/public/glass{ name = "Interlink Garden" @@ -9181,6 +11476,11 @@ }, /turf/open/floor/wood/tile, /area/centcom/interlink) +"nGL" = ( +/obj/structure/table/wood, +/obj/item/soap/deluxe, +/turf/open/floor/sepia, +/area/centcom/holding/cafe) "nHC" = ( /obj/machinery/photocopier, /obj/machinery/button/door/directional/south{ @@ -9193,9 +11493,13 @@ /turf/open/floor/wood, /area/centcom/interlink) "nHH" = ( -/mob/living/basic/chicken, -/turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/obj/machinery/recharge_station, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/circuit/green, +/area/centcom/holding/cafe) "nHK" = ( /obj/structure/flora/bush/fullgrass/style_random, /obj/effect/turf_decal/weather/dirt, @@ -9207,17 +11511,9 @@ /turf/open/floor/iron, /area/centcom/interlink) "nJO" = ( -/obj/effect/turf_decal/siding{ - color = "#2e2e2e" - }, -/obj/effect/turf_decal/siding{ - color = "#2e2e2e"; - dir = 6 - }, -/obj/item/kirbyplants/random, -/obj/machinery/light/warm/directional/east, -/turf/open/floor/bamboo, -/area/centcom/holding/cafedorms) +/obj/structure/railing/wooden_fencing, +/turf/open/floor/wood, +/area/centcom/holding/cafepark) "nJQ" = ( /obj/effect/turf_decal/arrows{ dir = 8 @@ -9230,8 +11526,10 @@ /turf/open/floor/wood/tile, /area/centcom/interlink) "nKz" = ( -/obj/structure/table/abductor, -/turf/open/floor/plating/abductor, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/white, /area/centcom/holding/cafe) "nKJ" = ( /obj/effect/turf_decal/weather/dirt{ @@ -9240,6 +11538,18 @@ /obj/effect/light_emitter/interlink, /turf/open/floor/grass, /area/centcom/interlink) +"nLr" = ( +/obj/structure/fake_stairs/wood/directional/east, +/turf/open/indestructible/cobble/side, +/area/centcom/holding/cafepark) +"nMw" = ( +/obj/structure/fence{ + dir = 4 + }, +/obj/effect/turf_decal/caution/stand_clear, +/obj/effect/turf_decal/trimline/yellow/filled/warning, +/turf/open/indestructible/plating, +/area/centcom/holding/cafepark) "nNe" = ( /obj/structure/table, /obj/item/pizzabox/pineapple, @@ -9293,6 +11603,13 @@ }, /turf/open/floor/iron, /area/centcom/interlink) +"nPr" = ( +/obj/structure/table{ + name = "Jim Norton's Quebecois Coffee table" + }, +/obj/item/reagent_containers/cup/glass/mug/coco, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) "nQm" = ( /obj/effect/turf_decal/weather/dirt{ dir = 1 @@ -9326,6 +11643,52 @@ }, /turf/open/floor/iron/grimy, /area/centcom/interlink) +"nUS" = ( +/obj/structure/flora/grass/jungle/a/style_2, +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafepark) +"nWn" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/structure/railing{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/indestructible/hoteltile{ + icon_state = "floor" + }, +/area/centcom/holding/cafepark) +"nXu" = ( +/obj/structure/stone_tile/slab, +/turf/open/floor/fakebasalt, +/area/centcom/holding/cafepark) +"nXw" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 1 + }, +/turf/open/indestructible/plating, +/area/centcom/holding/cafepark) +"nYp" = ( +/obj/structure/chair/sofa/corp/right, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/circuit/green, +/area/centcom/holding/cafe) "nYB" = ( /obj/effect/turf_decal/siding/white{ dir = 9 @@ -9359,20 +11722,17 @@ /turf/open/floor/wood/parquet, /area/centcom/interlink) "oaM" = ( -/obj/effect/turf_decal/tile/blue/half{ - dir = 4 +/obj/effect/turf_decal/tile/blue{ + dir = 8 }, -/obj/structure/table, -/obj/item/storage/medkit/brute{ - pixel_x = 3; - pixel_y = 3 +/obj/effect/turf_decal/tile/blue{ + dir = 4 }, -/obj/item/storage/medkit/o2{ - pixel_x = -2; - pixel_y = -2 +/obj/machinery/washing_machine, +/turf/open/indestructible/hoteltile{ + icon_state = "white" }, -/turf/open/floor/iron/white, -/area/centcom/holding/cafe) +/area/centcom/holding/cafepark) "obP" = ( /obj/effect/turf_decal/box/corners{ dir = 1 @@ -9397,6 +11757,11 @@ /obj/machinery/light/directional/south, /turf/open/misc/beach/sand, /area/centcom/holding/cafepark) +"ofw" = ( +/obj/structure/closet/crate/wooden/storage_barrel, +/obj/structure/wall_torch/spawns_lit/directional/east, +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafepark) "ofJ" = ( /turf/open/misc/beach/coast{ dir = 6 @@ -9417,6 +11782,13 @@ /obj/machinery/light/very_dim/directional/south, /turf/open/floor/wood, /area/centcom/interlink) +"oja" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/centcom/holding/cafepark) "ojv" = ( /obj/effect/turf_decal/siding/dark{ dir = 4 @@ -9459,21 +11831,72 @@ }, /turf/open/floor/iron, /area/centcom/interlink) +"onU" = ( +/obj/structure/weightmachine, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) +"ooD" = ( +/obj/structure/table, +/obj/item/reagent_containers/cup/glass/waterbottle{ + pixel_x = 7; + pixel_y = 2 + }, +/turf/open/floor/iron, +/area/centcom/holding/cafe) "ooG" = ( /obj/effect/turf_decal/siding/wood/corner{ dir = 1 }, /turf/open/floor/wood, /area/centcom/interlink) -"osk" = ( -/obj/effect/turf_decal/siding/wood/corner{ - dir = 8 +"ooW" = ( +/obj/structure/bed/pod{ + pixel_y = 1 }, -/obj/item/kirbyplants/random, -/obj/machinery/button/door/directional/south{ - id = "room1"; - name = "Door Lock"; - normaldoorcontrol = 1; +/obj/structure/mirror/directional/east, +/turf/open/floor/carpet/black, +/area/centcom/holding/cafe) +"ooY" = ( +/obj/structure/flora/grass/jungle/a/style_4, +/obj/structure/chair/sofa/bench/right, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) +"orh" = ( +/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/box, +/obj/structure/window/spawner/directional/east, +/obj/structure/showcase/fake_cafe_console/rd, +/turf/open/floor/iron, +/area/centcom/holding/cafe) +"orB" = ( +/obj/item/paper_bin/bundlenatural, +/turf/open/floor/sepia, +/area/centcom/holding/cafe) +"orU" = ( +/obj/item/flashlight/flare/candle/infinite{ + pixel_x = -19; + pixel_y = -23 + }, +/obj/item/fancy_pillow{ + pixel_x = -10; + pixel_y = -7 + }, +/turf/open/floor/bamboo, +/area/centcom/holding/cafe) +"osk" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/obj/item/kirbyplants/random, +/obj/machinery/button/door/directional/south{ + id = "room1"; + name = "Door Lock"; + normaldoorcontrol = 1; pixel_x = -8; specialfunctions = 4 }, @@ -9493,6 +11916,11 @@ /obj/structure/chair/sofa/bench, /turf/open/floor/iron/dark, /area/centcom/interlink) +"ovF" = ( +/obj/structure/fans/tiny/invisible, +/obj/effect/light_emitter/interlink, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) "ovH" = ( /obj/machinery/vending/wardrobe/syndie_wardrobe/ghost_cafe{ default_price = 0; @@ -9501,6 +11929,18 @@ }, /turf/open/misc/dirt/planet, /area/centcom/holding/cafepark) +"owJ" = ( +/obj/effect/turf_decal/tile/purple/anticorner/contrasted, +/obj/machinery/button/door{ + id = "CCRobotics"; + name = "Bolt Control"; + normaldoorcontrol = 1; + specialfunctions = 4; + pixel_y = 0; + pixel_x = 25 + }, +/turf/open/floor/iron, +/area/centcom/holding/cafe) "oxb" = ( /obj/effect/turf_decal/weather/dirt{ dir = 1 @@ -9509,6 +11949,27 @@ /obj/effect/light_emitter/interlink, /turf/open/floor/grass, /area/centcom/interlink) +"oyf" = ( +/obj/structure/flora/bush/sunny{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/structure/flora/bush/grassy{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/flora/bush/flowers_br{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/structure/flora/bush/ferny, +/obj/structure/window/reinforced/spawner/directional/east{ + layer = 2.9 + }, +/turf/open/floor/grass/fairy, +/area/centcom/holding/cafepark) "oyi" = ( /obj/item/reagent_containers/cup/soda_cans/dr_gibb{ pixel_x = -8; @@ -9555,6 +12016,31 @@ /obj/effect/light_emitter/interlink, /turf/open/floor/grass, /area/centcom/interlink) +"ozJ" = ( +/obj/structure/railing/wooden_fencing, +/obj/structure/railing/wooden_fencing{ + dir = 4 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafepark) +"ozR" = ( +/obj/structure/table/reinforced/rglass, +/obj/structure/curtain/cloth, +/obj/machinery/light/directional/east, +/obj/item/reagent_containers/medigel/aiuri{ + desc = "A medicinal massage oil containing aiuri, normally gives a nice cooling effect on the bodypart where it's applied whilst also healing minor burns."; + name = "Cooling massage oil"; + pixel_x = 2; + pixel_y = 5 + }, +/obj/item/reagent_containers/medigel/libital{ + desc = "A medicinal massage oil that warms up and relaxes the skin and muscles, great at both treating backpains, cramps and bruises."; + name = "Relaxing massage oil"; + pixel_x = -4; + pixel_y = 5 + }, +/turf/open/floor/carpet/black, +/area/centcom/holding/cafe) "oAn" = ( /obj/structure/chair/sofa/bench/right, /obj/effect/landmark/latejoin, @@ -9563,6 +12049,25 @@ }, /turf/open/floor/iron, /area/centcom/interlink) +"oAt" = ( +/obj/structure/flora/grass/jungle/a/style_4, +/obj/structure/fans/tiny/invisible, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) +"oBa" = ( +/obj/structure/stone_tile/center, +/obj/structure/stone_tile/surrounding_tile/cracked, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 8 + }, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 1 + }, +/turf/open/floor/fakebasalt, +/area/centcom/holding/cafepark) "oBf" = ( /obj/structure/chair/sofa/bench{ dir = 8 @@ -9571,6 +12076,13 @@ /obj/effect/landmark/latejoin, /turf/open/floor/mineral/titanium, /area/centcom/interlink) +"oBn" = ( +/obj/effect/turf_decal/tile/red/anticorner/contrasted, +/obj/structure/toilet{ + dir = 1 + }, +/turf/open/floor/iron, +/area/centcom/holding/cafe) "oCU" = ( /obj/effect/turf_decal/weather/dirt{ dir = 1 @@ -9586,11 +12098,30 @@ }, /turf/open/floor/iron, /area/centcom/interlink) +"oEm" = ( +/obj/structure/table, +/obj/item/reagent_containers/cup/rag{ + pixel_y = 7; + pixel_x = -1 + }, +/obj/item/reagent_containers/cup/glass/waterbottle{ + pixel_x = 7; + pixel_y = 2 + }, +/turf/open/floor/iron/dark, +/area/centcom/holding/cafe) "oFj" = ( /turf/open/floor/iron/smooth_corner{ dir = 4 }, /area/cruiser_dock) +"oGv" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/vending/wardrobe/chem_wardrobe/ghost_cafe, +/turf/open/indestructible/hoteltile{ + icon_state = "darkfull" + }, +/area/centcom/holding/cafepark) "oIK" = ( /obj/effect/turf_decal/trimline/dark_green/filled/warning{ dir = 8 @@ -9615,6 +12146,18 @@ }, /turf/open/floor/iron/white, /area/centcom/interlink) +"oLI" = ( +/obj/structure/chair/sofa/corp/left, +/turf/open/floor/carpet/black, +/area/centcom/holding/cafe) +"oNz" = ( +/obj/structure/closet/boxinggloves, +/obj/item/clothing/gloves/boxing, +/obj/item/clothing/gloves/boxing/blue, +/obj/item/clothing/gloves/boxing/green, +/obj/item/clothing/gloves/boxing/yellow, +/turf/open/floor/iron/dark, +/area/centcom/holding/cafe) "oOC" = ( /obj/effect/turf_decal/trimline/dark_green/filled/corner{ dir = 1 @@ -9627,6 +12170,24 @@ }, /turf/open/floor/iron/cafeteria, /area/centcom/interlink) +"oOS" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/indestructible/hoteltile{ + icon_state = "white" + }, +/area/centcom/holding/cafepark) +"oPL" = ( +/obj/structure/chair/stool/directional/south{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/centcom/holding/cafe) "oQR" = ( /turf/closed/indestructible/fakedoor{ name = "Base Access" @@ -9638,6 +12199,14 @@ }, /turf/open/floor/wood/tile, /area/centcom/interlink) +"oRX" = ( +/obj/structure/fans/tiny/invisible, +/obj/machinery/door/airlock/research{ + name = "Robotics"; + id_tag = "CCRobotics" + }, +/turf/open/floor/iron, +/area/centcom/holding/cafe) "oSp" = ( /obj/structure/table/wood, /obj/item/paper_bin{ @@ -9647,61 +12216,45 @@ /turf/open/floor/wood, /area/centcom/interlink) "oSG" = ( -/obj/effect/turf_decal/tile/blue/half{ - dir = 4 - }, -/obj/machinery/button/door{ - id = "ghostcafemedical"; - pixel_x = 25 +/obj/structure/rack/shelf{ + icon = 'modular_nova/modules/mapping/icons/unique/furniture.dmi'; + icon_state = "empty_shelf_1" }, -/obj/structure/table, -/obj/item/storage/medkit/fire{ - pixel_x = 3; - pixel_y = 3 +/obj/item/bedsheet/black{ + pixel_x = 5; + pixel_y = 4 }, -/obj/item/storage/medkit/toxin{ - pixel_x = -3 +/obj/item/bedsheet/black{ + pixel_x = 5; + pixel_y = 8 }, -/turf/open/floor/iron/white, -/area/centcom/holding/cafe) +/turf/open/floor/fakebasalt, +/area/centcom/holding/cafepark) "oTx" = ( /obj/machinery/shower/directional/west, /turf/open/floor/iron/freezer, /area/centcom/interlink) -"oVT" = ( -/obj/structure/curtain, -/obj/machinery/shower/directional/south, -/obj/structure/drain, -/obj/effect/turf_decal/siding/thinplating_new/end{ - dir = 1 - }, -/obj/effect/turf_decal/siding/thinplating_new/end, -/turf/open/indestructible/hoteltile{ - icon = 'modular_skyrat/modules/ghostcafe/icons/floors.dmi'; - icon_state = "titanium_blue_old"; - name = "bathroom floor" - }, -/area/centcom/holding/cafedorms) -"oWR" = ( -/obj/effect/turf_decal/tile/yellow/half{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/half{ +"oUI" = ( +/obj/structure/stone_tile/surrounding_tile/cracked{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 8 - }, -/obj/structure/mineral_door/paperframe{ - name = "Shinto Cabin Bedroom" - }, -/turf/open/floor/iron/textured_half{ +/obj/structure/stone_tile/surrounding_tile/cracked{ dir = 1 }, -/area/centcom/holding/cafedorms) +/turf/open/floor/fakebasalt, +/area/centcom/holding/cafepark) +"oVT" = ( +/obj/structure/flora/grass/jungle, +/obj/structure/flora/bush/flowers_br/style_random, +/obj/effect/light_emitter/interlink, +/turf/open/misc/grass/planet{ + smoothing_flags = 0 + }, +/area/centcom/holding/cafepark) +"oWR" = ( +/obj/structure/fake_stairs/wood/directional/north, +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafepark) "oXS" = ( /turf/open/floor/carpet/red, /area/cruiser_dock) @@ -9723,6 +12276,41 @@ /obj/effect/turf_decal/tile/red/opposingcorners, /turf/open/floor/iron/dark, /area/centcom/interlink) +"oYg" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 1 + }, +/obj/structure/railing/corner{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/indestructible/hoteltile{ + icon_state = "floor" + }, +/area/centcom/holding/cafepark) +"oYO" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood, +/turf/closed/indestructible/weeb, +/area/centcom/holding/cafe) +"paj" = ( +/obj/structure/chair/sofa/corp/right{ + dir = 4 + }, +/obj/machinery/light/directional/west, +/turf/open/indestructible/carpet, +/area/centcom/holding/cafe) "pao" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 6 @@ -9733,12 +12321,29 @@ /obj/structure/deployable_barricade/guardrail, /turf/open/floor/iron/smooth_large, /area/cruiser_dock) -"pbz" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "ghostcafemedical" +"paJ" = ( +/obj/machinery/button/door{ + id = "CCD1"; + name = "Dorm Bolt Control"; + normaldoorcontrol = 1; + pixel_x = 25; + specialfunctions = 4 }, -/turf/closed/indestructible/fakeglass, +/obj/item/kirbyplants/random, +/turf/open/indestructible/carpet, /area/centcom/holding/cafe) +"pbz" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/sink/directional/east, +/turf/open/indestructible/hoteltile{ + icon_state = "white" + }, +/area/centcom/holding/cafepark) "pbP" = ( /obj/structure/flora/bush/flowers_yw/style_random, /obj/effect/turf_decal/weather/dirt{ @@ -9747,14 +12352,18 @@ /obj/effect/light_emitter/interlink, /turf/open/floor/grass, /area/centcom/interlink) -"pcp" = ( -/obj/structure/flora/biolumi/flower{ - random_light = null - }, -/turf/open/misc/beach/sand{ - dir = 4 +"pci" = ( +/obj/structure/mineral_door/wood/large_gate{ + dir = 8 }, +/turf/open/misc/dirt/planet, /area/centcom/holding/cafepark) +"pcp" = ( +/obj/structure/fans/tiny/invisible, +/obj/effect/turf_decal/siding/wood, +/obj/structure/mineral_door/wood, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) "pcH" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -9764,6 +12373,15 @@ }, /turf/open/floor/wood/tile, /area/centcom/interlink) +"pdt" = ( +/obj/machinery/light/floor{ + alpha = 0; + invisibility = 100; + light_range = 10; + nightshift_light_power = 10 + }, +/turf/open/floor/iron/white, +/area/centcom/holding/cafe) "pdC" = ( /obj/machinery/cryopod{ dir = 4 @@ -9782,6 +12400,25 @@ }, /turf/open/floor/iron/dark, /area/centcom/interlink) +"pej" = ( +/obj/structure/sign/painting/library{ + pixel_y = -32 + }, +/turf/open/floor/carpet/cyan, +/area/centcom/holding/cafe) +"pgm" = ( +/obj/structure/hedge/opaque, +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/curtain/cloth/fancy/mechanical{ + icon_state = "bounty-open"; + icon_type = "bounty"; + id = "CCSalon"; + name = "curtain" + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) "pgL" = ( /obj/structure/chair/sofa/bench/right, /obj/effect/turf_decal/trimline/dark_green/filled/line{ @@ -9804,17 +12441,19 @@ }, /turf/open/floor/iron/dark, /area/centcom/interlink) -"pkJ" = ( -/obj/item/flashlight/flare/candle/infinite{ - pixel_x = -19; - pixel_y = -23 +"pib" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 4 }, -/obj/item/fancy_pillow{ - pixel_x = -10; - pixel_y = -7 +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafepark) +"pkJ" = ( +/obj/structure/fans/tiny/invisible, +/obj/structure/fence{ + dir = 4 }, -/turf/open/floor/bamboo, -/area/centcom/holding/cafedorms) +/turf/open/floor/iron/white, +/area/centcom/holding/cafepark) "pmu" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 8 @@ -9838,6 +12477,13 @@ }, /turf/open/floor/mineral/titanium/tiled/white, /area/cruiser_dock) +"pny" = ( +/obj/structure/stone_tile/block, +/obj/structure/stone_tile/block{ + dir = 1 + }, +/turf/open/lava/fake, +/area/centcom/holding/cafepark) "pnH" = ( /obj/effect/turf_decal/siding/wood/corner, /turf/open/floor/wood, @@ -9852,9 +12498,30 @@ /obj/effect/light_emitter/interlink, /turf/open/floor/grass, /area/centcom/interlink) +"ppd" = ( +/obj/structure/flora/tree/jungle/small/style_random{ + pixel_x = -49; + pixel_y = -12 + }, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) "ppR" = ( -/turf/open/floor/bamboo, -/area/centcom/holding/cafedorms) +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/railing{ + dir = 8 + }, +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/fans/tiny/invisible, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafepark) +"pqy" = ( +/obj/structure/chair/sofa/corp/left, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) "pqX" = ( /turf/open/floor/iron/stairs/left, /area/cruiser_dock) @@ -9866,12 +12533,22 @@ }, /turf/open/floor/wood, /area/centcom/interlink/dorm_rooms) +"prH" = ( +/obj/machinery/door/window/right/directional/east{ + base_state = "left"; + dir = 8; + icon_state = "left"; + name = "Fitness Ring" + }, +/turf/open/floor/iron/dark/corner, +/area/centcom/holding/cafe) "prT" = ( -/obj/structure/chair/office/light{ - dir = 1 +/obj/structure/weightmachine/weightlifter, +/obj/effect/turf_decal/siding/wood{ + dir = 9 }, -/turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) "psl" = ( /obj/structure/closet/crate/cardboard, /obj/item/reagent_containers/cup/glass/bottle/champagne, @@ -9887,34 +12564,65 @@ /obj/effect/turf_decal/siding/wood, /turf/open/floor/eighties, /area/centcom/holding/cafe) +"ptx" = ( +/obj/structure/chair/office/light{ + dir = 4 + }, +/obj/machinery/dryer{ + pixel_y = 14 + }, +/turf/open/floor/carpet/black, +/area/centcom/holding/cafe) "puo" = ( /obj/effect/turf_decal/sand, /obj/machinery/light/directional/east, /turf/open/misc/beach/sand, /area/centcom/holding/cafepark) "pux" = ( -/obj/machinery/door/window/left/directional/west{ - dir = 1; - name = "Monkey Pen"; - pixel_y = 2; - req_access = list("genetics") - }, -/obj/machinery/light/directional/west, -/turf/open/indestructible/hoteltile{ - icon_state = "darkfull" +/obj/structure/flora/bush/jungle/c/style_2, +/obj/effect/light_emitter/interlink, +/turf/open/misc/grass/planet{ + smoothing_flags = 0 }, -/area/centcom/holding/cafe) +/area/centcom/holding/cafepark) "pvN" = ( /turf/open/floor/iron/stairs/left{ dir = 8 }, /area/cruiser_dock) +"pwO" = ( +/obj/structure/chair/sofa/bench/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 9 + }, +/obj/machinery/light/small/directional/west, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/indestructible/hoteltile{ + icon_state = "floor" + }, +/area/centcom/holding/cafepark) "pwV" = ( -/obj/effect/turf_decal/tile/red/half{ +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/chair/office/light{ dir = 4 }, -/turf/open/floor/iron, -/area/centcom/holding/cafe) +/turf/open/indestructible/hoteltile{ + icon_state = "white" + }, +/area/centcom/holding/cafepark) "pxW" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -9938,11 +12646,13 @@ /turf/open/floor/iron, /area/centcom/interlink) "pBW" = ( -/turf/closed/indestructible/weeb, -/area/centcom/holding/cafedorms) +/obj/machinery/light/directional/south, +/obj/structure/flora/grass/jungle/b/style_random, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) "pCd" = ( -/turf/open/floor/sepia, -/area/centcom/holding/cafedorms) +/turf/closed/wall/mineral/wood/nonmetal, +/area/centcom/holding/cafepark) "pCw" = ( /obj/structure/rack, /obj/item/reagent_containers/cup/rag, @@ -9974,9 +12684,10 @@ /turf/open/floor/iron/white, /area/centcom/interlink/dorm_rooms) "pET" = ( -/obj/structure/flora/bush/flowers_yw, -/turf/open/misc/grass/planet, -/area/centcom/holding/cafepark) +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/tile/blue/half/contrasted, +/turf/open/floor/iron/white, +/area/centcom/holding/cafe) "pFe" = ( /obj/machinery/door/airlock/freezer{ name = "Freezer" @@ -10008,14 +12719,8 @@ /turf/open/floor/grass, /area/centcom/interlink) "pGK" = ( -/obj/machinery/shower/directional/west, -/obj/structure/sink/directional/south, -/turf/open/indestructible/hoteltile{ - icon = 'modular_skyrat/modules/ghostcafe/icons/floors.dmi'; - icon_state = "titanium_blue_old"; - name = "bathroom floor" - }, -/area/centcom/holding/cafedorms) +/turf/open/floor/iron/dark/side, +/area/centcom/holding/cafe) "pGZ" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/window/indestructible{ @@ -10073,6 +12778,37 @@ }, /turf/open/floor/iron/dark, /area/centcom/interlink) +"pLq" = ( +/obj/structure/rack/wooden, +/obj/item/dyespray{ + pixel_x = -6; + pixel_y = 11 + }, +/obj/item/dyespray{ + pixel_x = 5; + pixel_y = 11 + }, +/obj/item/reagent_containers/spray/quantum_hair_dye{ + pixel_x = 11 + }, +/obj/item/reagent_containers/spray/barbers_aid{ + pixel_x = -3; + pixel_y = -2 + }, +/obj/item/reagent_containers/spray/baldium{ + pixel_x = -10; + pixel_y = -2 + }, +/obj/item/reagent_containers/spray/super_barbers_aid{ + pixel_x = 4; + pixel_y = -2 + }, +/obj/machinery/light/directional/west, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) "pMg" = ( /obj/machinery/door/airlock{ id_tag = "room1"; @@ -10113,8 +12849,13 @@ /turf/open/floor/carpet/blue, /area/centcom/holding/cafedorms) "pNf" = ( -/obj/item/toy/plush/bubbleplush, -/turf/closed/mineral/earth_like, +/obj/structure/stone_tile/block{ + dir = 8 + }, +/obj/structure/stone_tile/block{ + dir = 4 + }, +/turf/open/floor/fakebasalt, /area/centcom/holding/cafepark) "pNF" = ( /obj/effect/turf_decal/siding/white/corner{ @@ -10141,16 +12882,10 @@ /turf/open/floor/wood, /area/centcom/interlink) "pPH" = ( -/obj/structure/fans/tiny/invisible, -/obj/effect/turf_decal/caution/stand_clear, -/obj/machinery/door/airlock/security/old{ - id_tag = "ghostcafesec"; - name = "Detainment" - }, -/turf/open/indestructible/hoteltile{ - icon_state = "darkfull" - }, -/area/centcom/holding/cafe) +/obj/structure/stone_tile/surrounding_tile/cracked, +/obj/structure/flora/ash/stem_shroom, +/turf/open/floor/fakebasalt, +/area/centcom/holding/cafepark) "pPI" = ( /obj/machinery/door/airlock/multi_tile/public/glass{ name = "Interlink" @@ -10164,15 +12899,13 @@ /turf/open/floor/grass, /area/centcom/interlink) "pQp" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/effect/turf_decal/siding/wood, -/obj/structure/curtain/cloth/fancy/mechanical/start_closed{ - id = "ghostcafecabinjapcurtain" +/obj/structure/bed/pod{ + pixel_y = 1 }, -/turf/closed/indestructible/fakeglass, -/area/centcom/holding/cafedorms) +/obj/structure/window/spawner/directional/south, +/obj/structure/mirror/directional/east, +/turf/open/floor/carpet/black, +/area/centcom/holding/cafe) "pSt" = ( /obj/effect/turf_decal/trimline/dark_green/filled/corner{ dir = 8 @@ -10198,6 +12931,12 @@ }, /turf/open/floor/wood/tile, /area/centcom/interlink) +"pSZ" = ( +/obj/structure/chair/sofa/corp/right{ + dir = 4 + }, +/turf/open/indestructible/carpet, +/area/centcom/holding/cafepark) "pTO" = ( /obj/structure/table/reinforced, /obj/machinery/door/window/brigdoor/right/directional/north{ @@ -10208,8 +12947,16 @@ /turf/open/floor/iron/dark, /area/centcom/interlink) "pUJ" = ( -/turf/open/floor/plating/abductor, +/obj/structure/chair/sofa/left/brown{ + dir = 8 + }, +/turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) +"pUQ" = ( +/obj/structure/flora/grass/jungle/a/style_2, +/obj/structure/flora/bush/flowers_br, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) "pVh" = ( /obj/machinery/photocopier, /obj/machinery/button/door/directional/north{ @@ -10228,6 +12975,10 @@ }, /turf/open/floor/iron, /area/centcom/interlink) +"pWF" = ( +/obj/structure/flora/ash/cap_shroom, +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafepark) "pXn" = ( /obj/machinery/button/door/directional/east{ id = "evac_hall_lookout"; @@ -10243,6 +12994,20 @@ }, /turf/open/floor/iron/cafeteria, /area/centcom/interlink) +"pXT" = ( +/obj/effect/turf_decal/box, +/obj/effect/turf_decal/caution/stand_clear, +/obj/machinery/door/firedoor, +/obj/structure/fans/tiny/invisible, +/obj/machinery/door/airlock/abductor{ + desc = "What could possibly be in here? Probably naked people."; + id_tag = "ghostcafecabin2"; + name = "Bedroom" + }, +/turf/open/indestructible/hoteltile{ + icon_state = "darkfull" + }, +/area/centcom/holding/cafepark) "pYF" = ( /obj/effect/turf_decal/weather/dirt{ dir = 6 @@ -10306,16 +13071,61 @@ }, /turf/open/floor/iron/smooth_large, /area/cruiser_dock) +"qdG" = ( +/obj/structure/railing{ + dir = 6 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 6 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/indestructible/hoteltile{ + icon_state = "floor" + }, +/area/centcom/holding/cafepark) +"qdV" = ( +/obj/structure/stone_tile/surrounding_tile/cracked, +/obj/structure/wall_torch/spawns_lit/directional/south, +/turf/open/floor/fakebasalt, +/area/centcom/holding/cafepark) "qey" = ( /obj/effect/turf_decal/caution/stand_clear{ dir = 1 }, /turf/open/floor/iron/dark, /area/centcom/interlink) +"qfy" = ( +/obj/structure/table/wood/fancy/blue, +/turf/open/indestructible/carpet, +/area/centcom/holding/cafepark) +"qgh" = ( +/obj/structure/stone_tile/surrounding, +/turf/open/floor/fakebasalt, +/area/centcom/holding/cafepark) +"qhl" = ( +/obj/structure/flora/bush/large/style_2, +/obj/effect/light_emitter/interlink, +/turf/open/misc/grass/planet{ + smoothing_flags = 0 + }, +/area/centcom/holding/cafepark) "qhn" = ( /obj/machinery/light/very_dim/directional/east, /turf/open/floor/iron/dark, /area/centcom/interlink) +"qiI" = ( +/obj/machinery/light/directional/south, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) "qjh" = ( /obj/structure/chair/sofa/bench/right{ dir = 4 @@ -10340,6 +13150,13 @@ /obj/effect/turf_decal/siding/wood/corner, /turf/open/floor/iron, /area/centcom/interlink) +"qmG" = ( +/obj/machinery/light/directional/south, +/obj/structure/chair/stool/directional/south{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/centcom/holding/cafe) "qna" = ( /obj/structure/barricade/wooden, /turf/open/misc/dirt/planet, @@ -10387,6 +13204,13 @@ /obj/effect/turf_decal/siding/white/corner, /turf/open/floor/iron/dark, /area/centcom/interlink) +"qnH" = ( +/obj/structure/flora/grass/jungle/b/style_2, +/obj/effect/light_emitter/interlink, +/turf/open/misc/grass/planet{ + smoothing_flags = 0 + }, +/area/centcom/holding/cafepark) "qot" = ( /obj/effect/turf_decal/weather/dirt{ dir = 9 @@ -10425,6 +13249,11 @@ }, /turf/open/misc/beach/sand, /area/centcom/holding/cafepark) +"qpx" = ( +/obj/machinery/status_display/evac/directional/north, +/obj/structure/chair/office, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) "qrv" = ( /obj/structure/table{ name = "Jim Norton's Quebecois Coffee table" @@ -10438,6 +13267,10 @@ /obj/item/coffee_cartridge/bootleg, /turf/open/floor/iron, /area/centcom/interlink) +"qrK" = ( +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/iron/white, +/area/centcom/holding/cafe) "qsQ" = ( /obj/machinery/stasis, /obj/effect/turf_decal/trimline/blue/filled/corner{ @@ -10445,9 +13278,20 @@ }, /turf/open/floor/iron/white, /area/centcom/interlink) -"qub" = ( -/obj/effect/turf_decal/weather/dirt{ - dir = 4 +"qtz" = ( +/obj/structure/hedge/opaque, +/obj/structure/fans/tiny/invisible, +/obj/structure/curtain/cloth/fancy/mechanical{ + icon_state = "bounty-open"; + icon_type = "bounty"; + id = "CCSalon"; + name = "curtain" + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) +"qub" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 4 }, /turf/open/floor/grass, /area/centcom/interlink) @@ -10481,9 +13325,24 @@ /obj/machinery/vending/snack, /turf/open/misc/beach/sand, /area/centcom/holding/cafepark) +"qwJ" = ( +/obj/structure/chair/sofa/corp/left, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/circuit/green, +/area/centcom/holding/cafe) "qyu" = ( /turf/open/floor/iron/cafeteria, /area/centcom/interlink) +"qze" = ( +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 5 + }, +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/weather/dirt{ + dir = 5 + }, +/turf/open/indestructible/plating, +/area/centcom/holding/cafepark) "qzE" = ( /obj/structure/sign/poster/random/directional/west, /obj/structure/chair/sofa/bench{ @@ -10494,16 +13353,30 @@ }, /turf/open/floor/iron, /area/centcom/interlink) +"qAg" = ( +/obj/structure/chair/stool/directional/south{ + dir = 8 + }, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) "qAW" = ( /obj/effect/turf_decal/siding/white{ dir = 4 }, /turf/open/floor/iron/dark, /area/centcom/interlink) +"qBd" = ( +/obj/machinery/light/directional/west, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) "qBC" = ( /obj/machinery/vending/primitive_catgirl_clothing_vendor, /turf/open/misc/dirt/planet, /area/centcom/holding/cafepark) +"qCU" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/plating/abductor, +/area/centcom/holding/cafepark) "qDc" = ( /obj/machinery/door/window/left/directional/south{ name = "Coffee Counter" @@ -10511,6 +13384,14 @@ /obj/machinery/duct, /turf/open/floor/iron, /area/centcom/interlink) +"qDk" = ( +/obj/structure/table/reinforced/rglass, +/obj/structure/window/spawner/directional/west, +/obj/structure/curtain/cloth, +/obj/item/clothing/gloves/latex, +/obj/item/clothing/gloves/latex, +/turf/open/floor/carpet/black, +/area/centcom/holding/cafe) "qEp" = ( /turf/open/floor/iron/smooth_edge{ dir = 8 @@ -10520,6 +13401,12 @@ /obj/structure/sign/poster/random/directional/north, /turf/open/floor/wood, /area/centcom/interlink) +"qFt" = ( +/obj/structure/chair/comfy/black{ + dir = 8 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) "qFG" = ( /obj/machinery/light/directional/south, /obj/machinery/status_display/shuttle{ @@ -10529,21 +13416,45 @@ /obj/effect/turf_decal/trimline/blue/filled/line, /turf/open/floor/iron/white, /area/centcom/interlink) +"qGA" = ( +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/machinery/vending/wardrobe/sec_wardrobe, +/turf/open/floor/iron/dark, +/area/centcom/holding/cafe) "qGW" = ( /obj/structure/chair/comfy/brown, /turf/open/floor/carpet/executive, /area/centcom/interlink) "qHc" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/vending/wardrobe/chem_wardrobe/ghost_cafe, -/turf/open/indestructible/hoteltile{ - icon_state = "darkfull" - }, +/obj/structure/closet/crate/wooden, +/obj/item/stack/sheet/mineral/wood/fifty, +/obj/item/stack/sheet/mineral/wood/fifty, +/obj/item/lighter, +/turf/open/indestructible/carpet, /area/centcom/holding/cafe) "qHJ" = ( /obj/structure/extinguisher_cabinet/directional/north, /turf/open/floor/iron/cafeteria, /area/centcom/interlink) +"qHT" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/structure/chair/sofa/bench/left{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/indestructible/hoteltile{ + icon_state = "floor" + }, +/area/centcom/holding/cafepark) "qIl" = ( /obj/effect/turf_decal/siding/thinplating_new/dark/corner{ dir = 4 @@ -10572,32 +13483,40 @@ /turf/open/floor/iron/dark, /area/centcom/interlink) "qKi" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 +/obj/effect/turf_decal/siding/wood{ + dir = 6 }, -/obj/machinery/vending/wardrobe/medi_wardrobe/ghost_cafe, -/turf/open/floor/iron/white, -/area/centcom/holding/cafe) +/turf/open/floor/stone, +/area/centcom/holding/cafepark) "qLQ" = ( /obj/machinery/washing_machine, /turf/open/floor/iron/dark, /area/centcom/interlink) "qMl" = ( -/obj/machinery/vending/drugs, -/obj/effect/turf_decal/tile/blue{ - dir = 1 +/obj/structure/wall_torch/spawns_lit/directional/west, +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafepark) +"qNu" = ( +/obj/structure/railing{ + invisibility = 100; + dir = 4 }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 +/obj/effect/turf_decal/weather/dirt{ + dir = 4 }, -/obj/effect/turf_decal/tile/blue{ +/obj/structure/chair/wood{ dir = 4 }, -/turf/open/floor/iron/white, +/turf/open/indestructible/cobble, +/area/centcom/holding/cafepark) +"qNZ" = ( +/obj/effect/spawner/liquids_spawner, +/obj/effect/light_emitter/interlink, +/turf/open/floor/iron/pool/cobble, +/area/centcom/holding/cafepark) +"qPk" = ( +/obj/structure/window/spawner/directional/south, +/turf/open/floor/carpet/black, /area/centcom/holding/cafe) "qPw" = ( /obj/effect/turf_decal/siding/wood{ @@ -10609,6 +13528,12 @@ }, /turf/open/floor/wood/parquet, /area/centcom/interlink) +"qPy" = ( +/obj/structure/chair/sofa/corp{ + dir = 8 + }, +/turf/open/indestructible/carpet, +/area/centcom/holding/cafe) "qQl" = ( /obj/machinery/light/directional/south, /obj/effect/turf_decal/tile/red/opposingcorners, @@ -10644,17 +13569,59 @@ }, /turf/open/floor/wood, /area/centcom/holding/cafe) -"qWc" = ( +"qUb" = ( /obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) +"qUK" = ( +/obj/structure/fans/tiny/invisible, +/obj/structure/fake_stairs/directional/south, +/obj/structure/fence/door/opened, +/obj/effect/light_emitter/interlink, +/turf/open/indestructible/dark, +/area/centcom/holding/cafepark) +"qVO" = ( +/obj/structure/railing/wooden_fencing{ + dir = 8 + }, +/obj/structure/fake_stairs/wood/directional/north, +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafepark) +"qVQ" = ( +/obj/structure/chair/office/light{ + dir = 4; + pixel_y = 3 + }, +/obj/structure/window/spawner/directional/south, +/turf/open/floor/carpet/black, +/area/centcom/holding/cafe) +"qVU" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/effect/turf_decal/siding/wood, -/obj/structure/curtain/cloth/fancy/mechanical/start_closed{ - id = "ghostcafecabinjapcurtain" +/turf/open/indestructible/hoteltile{ + icon_state = "floor" }, -/obj/structure/fans/tiny/invisible, -/turf/closed/indestructible/fakeglass, -/area/centcom/holding/cafedorms) +/area/centcom/holding/cafepark) +"qWc" = ( +/obj/machinery/shower/directional/west, +/turf/open/indestructible/bathroom, +/area/centcom/holding/cafe) +"qWv" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/centcom/holding/cafe) "qWA" = ( /obj/structure/table/wood, /obj/machinery/reagentgrinder{ @@ -10662,11 +13629,21 @@ }, /turf/open/floor/wood, /area/centcom/holding/cafe) +"qWE" = ( +/turf/open/floor/carpet/black, +/area/centcom/holding/cafe) +"qWG" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) "qWZ" = ( /obj/effect/light_emitter/interlink, /obj/structure/fluff/arc, /turf/open/floor/grass, /area/centcom/interlink) +"qXC" = ( +/turf/open/floor/bamboo, +/area/centcom/holding/cafe) "rah" = ( /obj/structure/flora/bush/flowers_br/style_random, /obj/effect/light_emitter/interlink, @@ -10694,15 +13671,14 @@ /turf/open/floor/iron/white, /area/centcom/interlink/dorm_rooms) "rcq" = ( -/obj/structure/table/reinforced, -/obj/item/restraints/handcuffs/fake, -/obj/item/restraints/handcuffs/fake, -/obj/item/restraints/handcuffs/fake, -/obj/effect/turf_decal/tile/red/anticorner{ +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ dir = 8 }, -/turf/open/floor/iron, -/area/centcom/holding/cafe) +/turf/open/indestructible/hoteltile{ + icon_state = "white" + }, +/area/centcom/holding/cafepark) "rfx" = ( /obj/structure/reagent_dispensers/fueltank/large, /turf/open/misc/dirt/planet, @@ -10731,14 +13707,64 @@ /obj/effect/turf_decal/tile/red/opposingcorners, /turf/open/floor/iron/dark, /area/centcom/interlink) +"riB" = ( +/obj/effect/turf_decal/siding{ + color = "#2e2e2e"; + dir = 4 + }, +/obj/structure/bed/double{ + pixel_y = -9 + }, +/obj/item/bedsheet/dorms_double{ + pixel_y = -9 + }, +/turf/open/floor/bamboo, +/area/centcom/holding/cafe) "rjf" = ( /obj/effect/turf_decal/trimline/green/filled/arrow_ccw, /turf/open/floor/iron/dark, /area/centcom/interlink) +"rjg" = ( +/obj/structure/stone_tile/block/cracked, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 4 + }, +/obj/structure/statue/bone/rib{ + dir = 1 + }, +/turf/open/lava/fake, +/area/centcom/holding/cafepark) +"rjk" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/centcom/holding/cafe) +"rjD" = ( +/obj/structure/fake_stairs/wood/directional/east, +/turf/closed/indestructible/wood, +/area/centcom/holding/cafepark) "rkm" = ( /obj/machinery/vending/tool, /turf/open/floor/iron/dark/textured_large, /area/cruiser_dock) +"rkW" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/structure/closet/crate/bin, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/indestructible/hoteltile{ + icon_state = "floor" + }, +/area/centcom/holding/cafepark) "rma" = ( /obj/structure/railing/corner{ dir = 1 @@ -10781,12 +13807,54 @@ /obj/effect/light_emitter/interlink, /turf/open/floor/grass, /area/centcom/interlink) +"rnK" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 4 + }, +/obj/structure/table, +/obj/item/storage/medkit/brute{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/storage/medkit/o2{ + pixel_x = -2; + pixel_y = -2 + }, +/obj/item/storage/medkit/fire{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/storage/medkit/toxin{ + pixel_x = -3 + }, +/turf/open/floor/iron/white, +/area/centcom/holding/cafe) +"rnM" = ( +/obj/structure/wall_torch/spawns_lit/directional/south, +/turf/open/misc/asteroid/snow/indestructible/planet, +/area/centcom/holding/cafepark) +"roh" = ( +/obj/structure/flora/grass/jungle/a/style_3, +/obj/structure/flora/tree/jungle/small/style_random, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) "rpG" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 4 }, /turf/open/misc/asteroid, /area/cruiser_dock) +"rpX" = ( +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/tile/blue/half/contrasted, +/obj/structure/chair/sofa/bench/right{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/centcom/holding/cafe) "rrA" = ( /obj/item/kirbyplants/random, /turf/open/floor/iron/dark/textured_large, @@ -10795,12 +13863,33 @@ /obj/machinery/light/cold/directional/north, /turf/open/floor/iron/smooth_large, /area/cruiser_dock) +"rvn" = ( +/obj/structure/flora/grass/jungle/b/style_4, +/obj/effect/light_emitter/interlink, +/turf/open/misc/grass/planet{ + smoothing_flags = 0 + }, +/area/centcom/holding/cafepark) "rxB" = ( /obj/structure/closet/secure_closet/freezer/meat, /turf/open/indestructible/hoteltile{ icon_state = "cafeteria" }, /area/centcom/holding/cafe) +"rzO" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/centcom/holding/cafepark) +"rzT" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/obj/structure/extinguisher_cabinet/directional/north, +/obj/structure/chair/sofa/bench/right, +/turf/open/floor/iron/white, +/area/centcom/holding/cafe) "rAe" = ( /obj/structure/chair/sofa/bench/left{ dir = 1; @@ -10808,6 +13897,24 @@ }, /turf/open/floor/wood, /area/centcom/interlink) +"rCf" = ( +/obj/structure/fans/tiny/invisible, +/obj/effect/turf_decal/siding/blue, +/obj/effect/turf_decal/siding/blue{ + dir = 1 + }, +/obj/machinery/door/airlock/medical/glass{ + name = "Healthcare Center" + }, +/turf/open/floor/iron/white, +/area/centcom/holding/cafe) +"rCl" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/vending/wardrobe/science_wardrobe/ghost_cafe, +/turf/open/indestructible/hoteltile{ + icon_state = "darkfull" + }, +/area/centcom/holding/cafepark) "rDg" = ( /obj/effect/light_emitter/interlink, /obj/effect/turf_decal/weather/dirt{ @@ -10840,6 +13947,25 @@ }, /turf/open/floor/iron, /area/centcom/interlink) +"rHD" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/mop_bucket/janitorialcart{ + dir = 4 + }, +/turf/open/indestructible/hoteltile{ + icon_state = "white" + }, +/area/centcom/holding/cafepark) +"rHH" = ( +/obj/structure/railing/wooden_fencing, +/obj/structure/water_source/puddle, +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafepark) "rHY" = ( /obj/structure/closet/secure_closet/personal/cabinet, /obj/item/condom_pack, @@ -10894,6 +14020,32 @@ }, /turf/open/floor/iron/dark, /area/centcom/interlink) +"rMZ" = ( +/obj/structure/railing{ + invisibility = 100; + dir = 4 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/obj/structure/chair/wood{ + dir = 4 + }, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) +"rNs" = ( +/obj/structure/chair/office{ + dir = 1 + }, +/obj/machinery/button/door{ + id = "CCGenOffice"; + name = "Command Office Bolt Control"; + normaldoorcontrol = 1; + specialfunctions = 4; + pixel_y = -29 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) "rNI" = ( /obj/machinery/duct, /obj/effect/turf_decal/trimline/blue/filled/warning{ @@ -10901,12 +14053,47 @@ }, /turf/open/floor/iron/white, /area/centcom/interlink) +"rNR" = ( +/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/centcom/holding/cafe) "rOf" = ( /obj/machinery/door/window/left/directional/east{ name = "Coffee Counter" }, /turf/open/floor/iron, /area/centcom/interlink) +"rOn" = ( +/obj/structure/railing{ + invisibility = 100; + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/indestructible/hoteltile{ + icon_state = "floor" + }, +/area/centcom/holding/cafepark) +"rOQ" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 9 + }, +/obj/structure/flora/ash/leaf_shroom, +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafepark) "rPh" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/window/reinforced/spawner/directional/west, @@ -10985,6 +14172,17 @@ /obj/structure/flora/bush/flowers_yw/style_random, /turf/open/floor/grass, /area/centcom/interlink) +"rSu" = ( +/obj/machinery/door/airlock/medical{ + id_tag = "CCPsych"; + name = "Psychology Office" + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/siding/dark, +/turf/open/floor/iron/dark, +/area/centcom/holding/cafe) "rSK" = ( /obj/effect/turf_decal/siding/dark, /turf/open/floor/iron, @@ -11037,12 +14235,21 @@ /obj/structure/flora/bush/flowers_br/style_random, /turf/open/floor/grass, /area/centcom/interlink) +"rXY" = ( +/obj/effect/light_emitter/interlink, +/turf/closed/indestructible/opshuttle, +/area/centcom/holding/cafe) "rYj" = ( -/obj/structure/mineral_door/paperframe{ - name = "Shinto Cabin Washroom" +/obj/structure/fans/tiny/invisible, +/obj/machinery/door/airlock/captain{ + id_tag = "CCGenOffice"; + name = "Cafe Manager Office" }, -/turf/open/floor/sepia, -/area/centcom/holding/cafedorms) +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) "rYy" = ( /obj/structure/sign/directions/evac{ pixel_y = -8 @@ -11078,15 +14285,62 @@ /obj/effect/turf_decal/siding/white/corner, /turf/open/floor/iron/white, /area/centcom/interlink) +"saT" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) "sci" = ( /obj/effect/turf_decal/siding/wood, /turf/open/floor/wood, /area/centcom/interlink) +"sck" = ( +/obj/machinery/button/curtain{ + id = "CCSalon"; + pixel_x = 1; + pixel_y = 28 + }, +/turf/open/floor/carpet/black, +/area/centcom/holding/cafe) +"sen" = ( +/obj/structure/railing{ + invisibility = 100 + }, +/obj/effect/turf_decal/weather/dirt, +/obj/structure/chair/wood, +/turf/open/indestructible/cobble, +/area/centcom/holding/cafepark) +"sfd" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 + }, +/obj/structure/chair/sofa/bench/corner, +/obj/machinery/light/small/directional/east, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/indestructible/hoteltile{ + icon_state = "floor" + }, +/area/centcom/holding/cafepark) "sfN" = ( -/obj/structure/mirror/directional/east, -/obj/structure/sink/directional/west, -/turf/open/floor/sepia, -/area/centcom/holding/cafedorms) +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/indestructible/hoteltile{ + icon_state = "white" + }, +/area/centcom/holding/cafepark) "sga" = ( /obj/item/kirbyplants/random, /obj/effect/turf_decal/trimline/dark_green/filled/line{ @@ -11126,10 +14380,20 @@ /obj/effect/turf_decal/siding/white, /turf/open/floor/iron/white, /area/centcom/interlink) +"ski" = ( +/obj/structure/flora/bush/large{ + icon_state = "bush3" + }, +/obj/effect/light_emitter/interlink, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) "skM" = ( -/obj/structure/sign/painting/parting, -/turf/closed/indestructible/wood, -/area/centcom/holding/cafedorms) +/obj/structure/fans/tiny/invisible, +/obj/machinery/door/airlock{ + name = "Gym" + }, +/turf/open/indestructible/dark, +/area/centcom/holding/cafe) "slz" = ( /obj/structure/chair/sofa/corp/left{ dir = 4 @@ -11144,10 +14408,42 @@ }, /turf/open/floor/iron, /area/centcom/interlink) +"smx" = ( +/obj/effect/turf_decal/siding{ + color = "#2e2e2e" + }, +/obj/effect/turf_decal/siding{ + color = "#2e2e2e"; + dir = 10 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/item/flashlight/flare/candle/infinite{ + pixel_x = 15 + }, +/obj/machinery/button/door{ + id = "ghostcafecabinjap"; + name = "Dorm Bolt Control"; + normaldoorcontrol = 1; + pixel_y = -24; + specialfunctions = 4 + }, +/obj/machinery/light/warm/directional/west, +/turf/open/floor/bamboo, +/area/centcom/holding/cafe) "smA" = ( /obj/structure/flora/tree/dead, /turf/open/floor/grass/fairy, /area/centcom/holding/cafepark) +"smT" = ( +/obj/structure/railing{ + dir = 10 + }, +/turf/open/indestructible/cobble/corner{ + dir = 8 + }, +/area/centcom/holding/cafepark) "sow" = ( /obj/machinery/cryopod{ dir = 4 @@ -11173,9 +14469,27 @@ /obj/structure/chair/sofa/bench/left, /turf/open/floor/iron/cafeteria, /area/centcom/interlink) +"srA" = ( +/obj/structure/chair/wood{ + dir = 8 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafepark) "srS" = ( /turf/open/floor/iron/stairs/old, /area/centcom/holding/cafepark) +"ssi" = ( +/obj/machinery/button/door{ + id = "ghostcafecabin2"; + name = "Dorm Bolt Control"; + normaldoorcontrol = 1; + pixel_y = -24; + specialfunctions = 4 + }, +/obj/structure/bed/double, +/obj/item/bedsheet/dorms_double, +/turf/open/indestructible/carpet, +/area/centcom/holding/cafepark) "ssn" = ( /obj/machinery/status_display/shuttle{ pixel_y = 32; @@ -11185,6 +14499,12 @@ /obj/effect/turf_decal/box, /turf/open/floor/iron/dark, /area/centcom/interlink) +"ssQ" = ( +/obj/structure/stone_tile/slab, +/obj/structure/curtain/bounty, +/obj/structure/bed/maint, +/turf/open/floor/fakebasalt, +/area/centcom/holding/cafepark) "std" = ( /obj/machinery/door/airlock/service{ name = "Interlink Kitchen" @@ -11203,14 +14523,11 @@ /turf/open/floor/iron/white, /area/centcom/interlink) "sto" = ( -/obj/effect/turf_decal/siding{ - color = "#2e2e2e"; - dir = 9 - }, -/obj/machinery/washing_machine, -/obj/machinery/light/warm/directional/west, -/turf/open/floor/bamboo, -/area/centcom/holding/cafedorms) +/obj/machinery/oven/stone, +/obj/structure/stone_tile/slab, +/obj/structure/wall_torch/spawns_lit/directional/west, +/turf/open/floor/fakebasalt, +/area/centcom/holding/cafepark) "suL" = ( /obj/effect/turf_decal/weather/dirt{ dir = 8 @@ -11239,6 +14556,23 @@ /obj/structure/flora/bush/large/style_random, /turf/open/floor/grass, /area/centcom/interlink) +"sys" = ( +/obj/machinery/shower/directional/west, +/obj/structure/sink/directional/south, +/turf/open/indestructible/bathroom, +/area/centcom/holding/cafe) +"sAC" = ( +/obj/effect/turf_decal/box, +/obj/effect/turf_decal/caution/stand_clear, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/wood/glass{ + name = "Lounge" + }, +/obj/structure/fans/tiny/invisible, +/turf/open/indestructible/hoteltile{ + icon_state = "darkfull" + }, +/area/centcom/holding/cafepark) "sBJ" = ( /obj/effect/turf_decal/trimline/dark_red/filled/arrow_cw, /obj/effect/turf_decal/trimline/green/filled/arrow_cw{ @@ -11257,35 +14591,76 @@ /obj/machinery/light/warm/no_nightlight/directional/north, /turf/open/floor/wood, /area/centcom/interlink/dorm_rooms) +"sCh" = ( +/obj/structure/showcase/fakeid{ + name = "console" + }, +/turf/open/indestructible/hoteltile{ + icon_state = "darkfull" + }, +/area/centcom/holding/cafepark) "sDJ" = ( /obj/structure/bookcase/random/nonfiction, /turf/open/floor/wood, /area/centcom/interlink) +"sDY" = ( +/obj/structure/railing, +/turf/open/indestructible/cobble/corner{ + dir = 8 + }, +/area/centcom/holding/cafepark) +"sFB" = ( +/obj/machinery/vending/boozeomat/cafe, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) +"sFC" = ( +/obj/structure/fake_stairs/wood/directional/east, +/turf/open/indestructible/cobble, +/area/centcom/holding/cafepark) "sFF" = ( -/obj/effect/turf_decal/siding{ - color = "#2e2e2e"; +/obj/machinery/door/airlock/multi_tile/public/glass, +/obj/structure/fans/tiny/invisible, +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/weather/dirt{ dir = 1 }, -/obj/structure/table/reinforced/plastitaniumglass, -/obj/item/clothing/head/costume/shrine_wig{ - pixel_y = 7 - }, -/obj/item/clothing/suit/costume/shrine_maiden, -/obj/item/storage/basket{ - pixel_y = 11 +/turf/open/misc/beach/sand, +/area/centcom/holding/cafepark) +"sGb" = ( +/obj/machinery/door/airlock/medical{ + name = "Surgery"; + id_tag = "CCSurgery" }, -/obj/item/gohei, -/turf/open/floor/bamboo, -/area/centcom/holding/cafedorms) -"sGf" = ( /turf/open/floor/iron/white, /area/centcom/holding/cafe) -"sGU" = ( -/obj/structure/flora/bush/fullgrass/style_random, +"sGf" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/closet/crate/trashcart, +/turf/open/indestructible/hoteltile{ + icon_state = "white" + }, +/area/centcom/holding/cafepark) +"sGw" = ( +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 1 + }, +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafepark) +"sGU" = ( +/obj/structure/flora/bush/fullgrass/style_random, /obj/structure/flora/bush/flowers_br/style_random, /obj/effect/light_emitter/interlink, /turf/open/floor/grass, /area/centcom/interlink) +"sHR" = ( +/obj/structure/musician/piano, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) "sIb" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -11308,6 +14683,27 @@ }, /turf/open/floor/wood/tile, /area/centcom/interlink) +"sIZ" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/indestructible/hoteltile{ + icon_state = "floor" + }, +/area/centcom/holding/cafepark) "sJa" = ( /obj/effect/turf_decal/siding/white{ dir = 5 @@ -11328,16 +14724,56 @@ }, /turf/open/floor/iron/dark, /area/centcom/interlink) +"sKP" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/vending/wardrobe/robo_wardrobe/ghost_cafe, +/turf/open/indestructible/hoteltile{ + icon_state = "darkfull" + }, +/area/centcom/holding/cafepark) "sMF" = ( -/obj/structure/sign/painting/library, -/turf/closed/indestructible/wood, -/area/centcom/holding/cafedorms) +/obj/effect/turf_decal/tile/blue/anticorner/contrasted, +/obj/machinery/firealarm/directional/south, +/obj/structure/closet/crate/bin, +/turf/open/floor/iron/white, +/area/centcom/holding/cafe) "sNg" = ( /obj/structure/rack, /obj/item/mop, /obj/item/soap/homemade, /turf/open/floor/iron/dark, /area/centcom/interlink) +"sNh" = ( +/obj/structure/window/spawner/directional/south, +/obj/effect/turf_decal/siding/wood, +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/flora/grass/jungle/a/style_4, +/obj/structure/flora/bush/flowers_pp, +/turf/open/misc/grass/planet{ + smoothing_flags = 0 + }, +/area/centcom/holding/cafe) +"sNs" = ( +/obj/structure/bed/double/pod, +/obj/item/bedsheet/random/double{ + dir = 2 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) +"sOj" = ( +/obj/structure/table/reinforced/rglass, +/obj/item/kirbyplants/fern{ + pixel_y = 14; + pixel_x = -5 + }, +/obj/item/folder/white{ + pixel_x = 4; + pixel_y = -3 + }, +/turf/open/floor/carpet/black, +/area/centcom/holding/cafe) "sOk" = ( /obj/machinery/door/airlock/public/glass{ name = "Interlink Evac Library" @@ -11345,6 +14781,18 @@ /obj/effect/turf_decal/trimline/green/filled/arrow_cw, /turf/open/floor/iron, /area/centcom/interlink) +"sPA" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted, +/obj/item/kirbyplants/random, +/turf/open/floor/iron/white, +/area/centcom/holding/cafe) +"sPH" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/light/directional/north, +/turf/open/indestructible/hoteltile{ + icon_state = "darkfull" + }, +/area/centcom/holding/cafepark) "sQh" = ( /turf/open/floor/iron/smooth_corner, /area/cruiser_dock) @@ -11368,9 +14816,16 @@ /turf/open/floor/iron/dark, /area/centcom/interlink) "sSe" = ( -/obj/structure/sign/painting/library_secure, -/turf/closed/indestructible/wood, -/area/centcom/holding/cafedorms) +/obj/structure/stone_tile/center, +/obj/structure/stone_tile/surrounding_tile{ + dir = 8 + }, +/obj/structure/stone_tile/surrounding_tile{ + dir = 4 + }, +/obj/structure/stone_tile/surrounding_tile, +/turf/open/lava/fake, +/area/centcom/holding/cafepark) "sSX" = ( /obj/machinery/door/airlock/medical{ name = "Interlink Operating Room" @@ -11385,6 +14840,29 @@ }, /turf/open/floor/iron/white, /area/centcom/interlink) +"sUC" = ( +/obj/structure/fans/tiny/invisible, +/obj/structure/flora/grass/jungle/a/style_3, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) +"sUE" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/indestructible/hoteltile{ + icon_state = "floor" + }, +/area/centcom/holding/cafepark) "sWb" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/closet/secure_closet/freezer/empty{ @@ -11398,6 +14876,9 @@ /obj/item/reagent_containers/cup/glass/bottle/juice/cream, /turf/open/floor/iron, /area/centcom/interlink) +"sXR" = ( +/turf/open/floor/stone, +/area/centcom/holding/cafe) "sYC" = ( /obj/structure/closet/secure_closet/freezer/empty{ name = "produce freezer" @@ -11433,6 +14914,14 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/freezer, /area/centcom/interlink) +"sYY" = ( +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 4 + }, +/obj/effect/turf_decal/bot, +/obj/machinery/vending/drugs, +/turf/open/floor/iron/white, +/area/centcom/holding/cafe) "sZl" = ( /obj/effect/light_emitter/interlink, /obj/structure/flora/tree/jungle/small, @@ -11442,10 +14931,6 @@ /obj/structure/dresser{ pixel_y = 7 }, -/obj/item/flashlight/lamp/green{ - pixel_x = -3; - pixel_y = 22 - }, /turf/open/floor/carpet/blue, /area/centcom/holding/cafedorms) "sZV" = ( @@ -11460,12 +14945,15 @@ }, /turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) -"tal" = ( -/obj/structure/flora/bush/lavendergrass{ - icon_state = "lavendergrass_4" +"tbI" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 }, -/turf/open/floor/plating/cobblestone, -/area/centcom/holding/cafepark) +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/centcom/holding/cafe) "tch" = ( /obj/machinery/chem_dispenser/fullupgrade, /turf/open/floor/iron/dark/textured_large, @@ -11475,6 +14963,24 @@ /obj/item/paper_bin, /turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) +"tct" = ( +/obj/structure/closet/crate/bin, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/indestructible/hoteltile{ + icon_state = "floor" + }, +/area/centcom/holding/cafepark) "tdm" = ( /obj/structure/chair/sofa/bench/corner, /obj/effect/turf_decal/siding/white/corner{ @@ -11504,9 +15010,16 @@ /turf/open/floor/iron/white, /area/centcom/interlink/dorm_rooms) "tfI" = ( -/obj/item/paper_bin/bundlenatural, -/turf/open/floor/sepia, -/area/centcom/holding/cafedorms) +/turf/open/indestructible/hoteltile{ + icon_state = "white" + }, +/area/centcom/holding/cafepark) +"tgU" = ( +/obj/structure/chair/wood{ + dir = 4 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafepark) "thr" = ( /obj/structure/table/wood, /obj/effect/spawner/random/entertainment/deck{ @@ -11521,12 +15034,28 @@ }, /turf/open/floor/plating, /area/centcom/interlink) +"tik" = ( +/obj/structure/stone_tile/surrounding_tile{ + dir = 4 + }, +/turf/open/floor/fakebasalt, +/area/centcom/holding/cafepark) "tin" = ( /obj/effect/turf_decal/caution{ dir = 1 }, /turf/open/floor/iron, /area/centcom/interlink) +"tjv" = ( +/obj/structure/stone_tile/block{ + dir = 1 + }, +/obj/structure/stone_tile/block, +/turf/open/floor/fakebasalt, +/area/centcom/holding/cafepark) +"tky" = ( +/turf/open/indestructible/bathroom, +/area/centcom/holding/cafe) "tlu" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -11563,6 +15092,13 @@ }, /turf/open/floor/iron/dark, /area/centcom/interlink) +"tsx" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/turf/open/indestructible/plating, +/area/centcom/holding/cafepark) "ttx" = ( /obj/structure/table, /obj/item/storage/fancy/candle_box{ @@ -11573,21 +15109,39 @@ }, /turf/open/floor/iron/dark, /area/centcom/interlink) -"tuO" = ( -/obj/effect/turf_decal/tile/blue/half, +"ttN" = ( +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 8 + }, +/obj/structure/chair{ + dir = 4 + }, /turf/open/floor/iron/white, /area/centcom/holding/cafe) -"tvh" = ( +"tur" = ( +/obj/structure/chair/stool/bar/directional/south, +/turf/open/indestructible/cobble/side, +/area/centcom/holding/cafepark) +"tuO" = ( /obj/effect/turf_decal/tile/blue{ dir = 8 }, /obj/effect/turf_decal/tile/blue{ - dir = 1 + dir = 4 }, -/obj/effect/turf_decal/tile/blue, -/obj/structure/closet/secure_closet/medical2/unlocked, -/turf/open/floor/iron/white, -/area/centcom/holding/cafe) +/obj/structure/sign/poster/contraband/lusty_xenomorph/directional/south, +/obj/machinery/vending/wardrobe/jani_wardrobe/ghost_cafe, +/turf/open/indestructible/hoteltile{ + icon_state = "white" + }, +/area/centcom/holding/cafepark) +"tvh" = ( +/obj/structure/fence{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/filled/warning, +/turf/open/indestructible/plating, +/area/centcom/holding/cafepark) "tvm" = ( /obj/machinery/door/airlock{ id_tag = "room8"; @@ -11614,6 +15168,26 @@ /obj/machinery/vending/cola, /turf/open/misc/beach/sand, /area/centcom/holding/cafepark) +"tzz" = ( +/obj/structure/toilet/snappop{ + dir = 4 + }, +/obj/effect/turf_decal/siding/thinplating/end{ + dir = 4; + pixel_y = -6 + }, +/obj/effect/turf_decal/siding/thinplating{ + dir = 8; + pixel_y = -7 + }, +/turf/open/floor/sepia, +/area/centcom/holding/cafe) +"tzR" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafepark) "tBo" = ( /obj/structure/table, /obj/machinery/microwave{ @@ -11640,6 +15214,18 @@ /obj/effect/turf_decal/caution, /turf/open/floor/iron, /area/centcom/interlink) +"tDj" = ( +/obj/structure/rack/shelf{ + icon = 'modular_nova/modules/mapping/icons/unique/furniture.dmi'; + icon_state = "empty_shelf_1" + }, +/obj/structure/wall_torch/spawns_lit/directional/west, +/obj/item/bedsheet/black{ + pixel_x = 5; + pixel_y = 8 + }, +/turf/open/floor/fakebasalt, +/area/centcom/holding/cafepark) "tEg" = ( /obj/structure/fans/tiny/invisible, /turf/open/water/beach, @@ -11677,6 +15263,11 @@ }, /turf/open/floor/wood, /area/centcom/holding/cafe) +"tIM" = ( +/obj/structure/flora/bush/jungle/b, +/obj/structure/fans/tiny/invisible, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) "tIN" = ( /obj/effect/light_emitter/interlink, /obj/structure/flora/bush/flowers_yw/style_random, @@ -11684,17 +15275,23 @@ /turf/open/floor/grass, /area/centcom/interlink) "tKt" = ( -/obj/structure/curtain, -/obj/machinery/shower/directional/north, -/obj/structure/window/reinforced/tinted/spawner/directional/east, -/turf/open/floor/plating/abductor2, -/area/centcom/holding/cafe) +/turf/open/floor/plating/abductor, +/area/centcom/holding/cafepark) "tLu" = ( /obj/item/toy/plush/lizard_plushie/green{ name = "Soaks-The-Rays" }, /turf/open/floor/carpet/orange, /area/centcom/holding/cafepark) +"tMb" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 4 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 8 + }, +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafepark) "tNw" = ( /obj/structure/railing/corner{ dir = 4 @@ -11737,6 +15334,14 @@ /obj/structure/fans/tiny/invisible, /turf/open/floor/iron/showroomfloor, /area/centcom/holding/cafe) +"tVM" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 1 + }, +/obj/structure/stone_tile/block, +/obj/item/flashlight/flare/candle/infinite, +/turf/open/floor/fakebasalt, +/area/centcom/holding/cafepark) "tWA" = ( /obj/machinery/light/directional/east, /obj/effect/turf_decal/trimline/dark_green/filled/line{ @@ -11767,6 +15372,13 @@ icon_state = "floor" }, /area/centcom/holding/cafe) +"tXp" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafepark) "tYf" = ( /obj/machinery/vending/autodrobe/all_access, /obj/effect/turf_decal/bot, @@ -11788,6 +15400,12 @@ }, /turf/open/floor/wood, /area/centcom/holding/cafedorms) +"tYP" = ( +/obj/structure/table/wood, +/obj/item/toy/cards/deck, +/obj/item/lighter, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) "tZU" = ( /obj/effect/turf_decal/siding/white{ dir = 1 @@ -11875,6 +15493,27 @@ /obj/effect/turf_decal/tile/red/opposingcorners, /turf/open/floor/iron/dark, /area/centcom/interlink) +"udI" = ( +/obj/structure/chair/stool/directional/south{ + dir = 1 + }, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) +"uew" = ( +/obj/structure/table/reinforced, +/obj/item/storage/belt/utility{ + pixel_y = -2; + pixel_x = -3 + }, +/obj/item/clothing/glasses/welding{ + pixel_x = 5; + pixel_y = 5 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/circuit/green, +/area/centcom/holding/cafe) "ueC" = ( /obj/structure/table/wood, /obj/item/reagent_containers/condiment/enzyme{ @@ -11966,6 +15605,15 @@ }, /turf/open/misc/dirt/planet, /area/centcom/interlink) +"ujV" = ( +/obj/structure/sign/painting/large/library{ + dir = 4 + }, +/obj/structure/sign/painting/library{ + pixel_y = -32 + }, +/turf/open/floor/carpet/cyan, +/area/centcom/holding/cafe) "ujZ" = ( /obj/item/kirbyplants/organic/plant22, /obj/effect/turf_decal/tile/green/opposingcorners, @@ -11982,7 +15630,12 @@ /turf/open/floor/iron, /area/centcom/interlink) "umm" = ( -/turf/closed/indestructible/alien, +/obj/structure/chair/comfy/brown{ + color = "#c45c57"; + desc = "Remarkably soft, with plush cozy cushions, premium memory-foam and covered in stain-resistant fabric. Made by Kat-Kea???!"; + name = "Premium Cozy Chair" + }, +/turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) "unt" = ( /obj/structure/flora/rock/pile/style_random, @@ -11995,6 +15648,10 @@ /obj/effect/landmark/latejoin, /turf/open/floor/iron, /area/centcom/interlink) +"uoM" = ( +/obj/effect/spawner/liquids_spawner, +/turf/open/floor/iron/pool/cobble, +/area/centcom/holding/cafepark) "upo" = ( /obj/structure/chair/sofa/bench/left{ dir = 4 @@ -12012,6 +15669,13 @@ /obj/effect/turf_decal/tile/green/opposingcorners, /turf/open/floor/iron, /area/centcom/interlink) +"use" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 4 + }, +/turf/open/indestructible/plating, +/area/centcom/holding/cafepark) "usr" = ( /obj/effect/light_emitter/interlink, /obj/effect/turf_decal/weather/dirt{ @@ -12020,11 +15684,20 @@ /obj/structure/flora/bush/fullgrass/style_random, /turf/open/floor/grass, /area/centcom/interlink) +"uwP" = ( +/obj/structure/chair/wood, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) "uxW" = ( /turf/open/misc/beach/coast{ dir = 4 }, /area/centcom/holding/cafepark) +"uxZ" = ( +/turf/open/misc/dirt/planet{ + desc = "Upon closer examination, it's still dirt." + }, +/area/centcom/holding/cafepark) "uyr" = ( /obj/structure/chair/sofa/bench/right{ dir = 4 @@ -12046,6 +15719,10 @@ }, /turf/open/floor/iron/smooth, /area/centcom/interlink) +"uAN" = ( +/obj/structure/chair/stool/bamboo, +/turf/open/floor/fakebasalt, +/area/centcom/holding/cafepark) "uBw" = ( /obj/effect/decal/remains/xeno, /obj/structure/alien/weeds, @@ -12121,25 +15798,22 @@ /turf/open/floor/iron/dark, /area/centcom/interlink) "uIf" = ( -/obj/effect/turf_decal/siding/wood, -/obj/item/flashlight/flare/candle/infinite{ - pixel_x = -12; - pixel_y = -42 - }, -/obj/item/fancy_pillow{ - pixel_x = -22; - pixel_y = -7 - }, -/obj/item/fancy_pillow{ - pixel_y = -1 - }, -/turf/open/floor/bamboo, -/area/centcom/holding/cafedorms) +/obj/structure/closet, +/turf/open/floor/iron, +/area/centcom/holding/cafe) "uIh" = ( /obj/structure/alien/weeds, /obj/structure/bed/nest, /turf/open/misc/dirt/planet, /area/centcom/holding/cafepark) +"uIo" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/obj/structure/marker_beacon/burgundy, +/turf/open/indestructible/plating, +/area/centcom/holding/cafepark) "uIp" = ( /obj/machinery/deepfryer, /obj/machinery/light/cold/directional/east, @@ -12152,6 +15826,12 @@ }, /turf/open/floor/wood/tile, /area/centcom/interlink) +"uJK" = ( +/obj/machinery/door/airlock/bathroom{ + name = "Bathroom" + }, +/turf/open/floor/iron/freezer, +/area/centcom/holding/cafe) "uKw" = ( /turf/open/floor/catwalk_floor/iron_smooth, /area/cruiser_dock) @@ -12165,6 +15845,12 @@ /obj/structure/chair/sofa/bench, /turf/open/floor/iron/cafeteria, /area/centcom/interlink) +"uMR" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) "uNg" = ( /obj/structure/bed/double{ dir = 8 @@ -12207,12 +15893,34 @@ }, /turf/open/floor/plating, /area/centcom/interlink) -"uWe" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "ghostcafesec" +"uUf" = ( +/turf/open/floor/iron/dark/side{ + dir = 8 }, -/turf/closed/indestructible/fakeglass, /area/centcom/holding/cafe) +"uVm" = ( +/obj/structure/stone_tile/center, +/obj/structure/stone_tile/surrounding_tile{ + dir = 8 + }, +/obj/structure/stone_tile/surrounding_tile, +/obj/structure/stone_tile/surrounding_tile{ + dir = 1 + }, +/obj/structure/stone_tile/surrounding_tile{ + dir = 4 + }, +/obj/structure/wall_torch/spawns_lit/directional/west, +/turf/open/floor/fakebasalt, +/area/centcom/holding/cafepark) +"uWe" = ( +/obj/structure/stone_tile/block, +/obj/structure/stone_tile/block/cracked{ + dir = 1 + }, +/obj/structure/wall_torch/spawns_lit/directional/east, +/turf/open/lava/fake, +/area/centcom/holding/cafepark) "uWG" = ( /obj/effect/turf_decal/tile/dark_blue/opposingcorners, /obj/effect/turf_decal/siding/wood/corner{ @@ -12220,6 +15928,39 @@ }, /turf/open/floor/iron, /area/centcom/interlink) +"uXf" = ( +/obj/structure/mirror{ + pixel_y = 32 + }, +/obj/structure/toilet{ + pixel_y = 14 + }, +/obj/structure/window/reinforced/tinted/spawner/directional/east, +/turf/open/floor/plating/abductor2, +/area/centcom/holding/cafepark) +"uXF" = ( +/obj/structure/chair/sofa/bench{ + dir = 4 + }, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) +"uXH" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafepark) +"uXK" = ( +/obj/structure/mineral_door/wood/large_gate{ + dir = 8 + }, +/obj/structure/fans/tiny/invisible, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafepark) "uYe" = ( /obj/machinery/light/cold/directional/east, /turf/open/floor/iron/dark/textured_large, @@ -12296,15 +16037,19 @@ /obj/item/kirbyplants/organic/plant22, /turf/open/floor/iron/dark, /area/centcom/interlink) +"vdW" = ( +/obj/structure/flora/bush/jungle/b, +/obj/effect/light_emitter/interlink, +/turf/open/misc/grass/planet{ + smoothing_flags = 0 + }, +/area/centcom/holding/cafepark) "veh" = ( /obj/structure/fence/door, /turf/open/misc/grass/planet, /area/centcom/holding/cafepark) "vgs" = ( /obj/structure/table/wood, -/obj/item/flashlight/lamp/green{ - pixel_y = 5 - }, /turf/open/floor/wood, /area/centcom/interlink) "vgx" = ( @@ -12315,21 +16060,63 @@ /obj/structure/closet/firecloset, /turf/open/floor/iron/dark/textured_large, /area/cruiser_dock) +"vgQ" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/indestructible/hoteltile{ + icon_state = "floor" + }, +/area/centcom/holding/cafepark) +"vhm" = ( +/obj/structure/railing/corner, +/obj/effect/turf_decal/trimline/blue/filled/corner, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/indestructible/hoteltile{ + icon_state = "floor" + }, +/area/centcom/holding/cafepark) +"vkD" = ( +/obj/effect/turf_decal/siding{ + color = "#2e2e2e"; + dir = 1 + }, +/obj/machinery/button/curtain{ + id = "ghostcafecabinjapcurtain"; + pixel_x = 20; + pixel_y = -4 + }, +/turf/open/floor/bamboo, +/area/centcom/holding/cafe) "vpT" = ( /obj/structure/table/reinforced, /obj/machinery/chem_dispenser/drinks/beer, /turf/open/floor/iron/dark, /area/centcom/interlink) "vqx" = ( -/obj/structure/mirror{ - pixel_y = 32 - }, -/obj/structure/toilet{ - pixel_y = 14 - }, -/obj/structure/window/reinforced/tinted/spawner/directional/east, -/turf/open/floor/plating/abductor2, -/area/centcom/holding/cafe) +/obj/structure/flora/bush/sparsegrass, +/obj/structure/flora/bush/reed, +/turf/open/misc/beach/sand, +/area/centcom/holding/cafepark) "vqy" = ( /obj/effect/light_emitter/interlink, /obj/effect/turf_decal/weather/dirt{ @@ -12361,11 +16148,7 @@ /obj/structure/mirror{ pixel_y = 32 }, -/turf/open/indestructible/hoteltile{ - icon = 'modular_skyrat/modules/ghostcafe/icons/floors.dmi'; - icon_state = "titanium_blue_old"; - name = "bathroom floor" - }, +/turf/open/indestructible/bathroom, /area/centcom/holding/cafedorms) "vui" = ( /obj/effect/turf_decal/siding/wood{ @@ -12429,6 +16212,13 @@ }, /turf/open/floor/iron/dark, /area/centcom/interlink) +"vxC" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/vending/wardrobe/coroner_wardrobe/ghost_cafe, +/turf/open/indestructible/hoteltile{ + icon_state = "darkfull" + }, +/area/centcom/holding/cafepark) "vxF" = ( /obj/machinery/vending/games, /turf/open/floor/carpet/cyan, @@ -12438,6 +16228,22 @@ dir = 4 }, /area/cruiser_dock) +"vyS" = ( +/obj/structure/flora/bush/leafy, +/turf/open/misc/grass/planet{ + smoothing_flags = 0 + }, +/area/centcom/holding/cafepark) +"vzb" = ( +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 10 + }, +/obj/effect/turf_decal/sand, +/obj/structure/fence{ + dir = 4 + }, +/turf/open/indestructible/plating, +/area/centcom/holding/cafepark) "vzH" = ( /obj/structure/sign/poster/random/directional/north, /obj/effect/turf_decal/trimline/dark_green/filled/line{ @@ -12445,6 +16251,18 @@ }, /turf/open/floor/iron, /area/centcom/interlink) +"vDr" = ( +/obj/structure/table, +/obj/effect/turf_decal/bot, +/obj/machinery/light/directional/south, +/obj/item/surgical_drapes, +/obj/item/surgicaldrill/alien, +/obj/item/cautery/alien, +/obj/item/bonesetter, +/turf/open/indestructible/hoteltile{ + icon_state = "darkfull" + }, +/area/centcom/holding/cafepark) "vEs" = ( /obj/structure/fans/tiny/invisible, /obj/structure/spacevine{ @@ -12463,6 +16281,12 @@ /obj/machinery/light/warm/directional/south, /turf/open/floor/wood, /area/centcom/interlink) +"vFM" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) "vFW" = ( /obj/structure/table/wood, /obj/machinery/recharger, @@ -12477,6 +16301,11 @@ /obj/effect/turf_decal/trimline/green/filled/arrow_ccw, /turf/open/floor/iron/dark, /area/centcom/interlink) +"vIX" = ( +/obj/structure/table, +/obj/item/soap, +/turf/open/floor/iron/freezer, +/area/centcom/holding/cafe) "vLh" = ( /obj/effect/turf_decal/trimline/green/filled/arrow_cw{ dir = 8 @@ -12505,6 +16334,33 @@ /obj/effect/turf_decal/trimline/green/filled/arrow_ccw, /turf/open/floor/iron/cafeteria, /area/centcom/interlink) +"vNe" = ( +/obj/structure/fans/tiny/invisible, +/obj/structure/railing/wooden_fencing{ + dir = 4 + }, +/turf/open/floor/wood/large, +/area/centcom/holding/cafe) +"vNs" = ( +/obj/effect/turf_decal/tile/yellow/half{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow/half{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral/half{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/half{ + dir = 8 + }, +/obj/structure/mineral_door/paperframe{ + name = "Shinto Cabin Bedroom" + }, +/turf/open/floor/iron/textured_half{ + dir = 1 + }, +/area/centcom/holding/cafe) "vPe" = ( /obj/structure/chair/stool/bar/directional/east, /turf/open/floor/iron/cafeteria, @@ -12530,15 +16386,26 @@ }, /turf/open/floor/wood, /area/centcom/interlink) +"vTT" = ( +/turf/closed/indestructible/steel, +/area/centcom/holding/cafe) "vUu" = ( -/obj/machinery/door/window/left/directional/west{ - dir = 4 - }, -/obj/structure/sink/directional/east, -/turf/open/floor/plating/abductor2, +/obj/structure/chair/sofa/left/brown, +/turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) "vUv" = ( -/obj/effect/turf_decal/tile/red/half, +/obj/structure/chair/sofa/bench/left{ + dir = 1 + }, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) +"vUI" = ( +/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ + dir = 8 + }, +/obj/machinery/computer/operating{ + dir = 1 + }, /turf/open/floor/iron, /area/centcom/holding/cafe) "vUJ" = ( @@ -12555,6 +16422,10 @@ }, /turf/open/floor/iron, /area/centcom/interlink) +"vXr" = ( +/obj/structure/flora/grass/jungle/b, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) "vYz" = ( /obj/machinery/button/curtain{ id = "ghostcaferesort1curtain"; @@ -12562,14 +16433,52 @@ }, /turf/open/floor/wood, /area/centcom/holding/cafedorms) +"vYC" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/indestructible/hoteltile{ + icon_state = "white" + }, +/area/centcom/holding/cafepark) +"vYI" = ( +/obj/effect/turf_decal/siding{ + color = "#2e2e2e" + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/item/flashlight/flare/candle/infinite{ + pixel_x = -19; + pixel_y = -10 + }, +/obj/item/flashlight/flare/candle/infinite{ + pixel_x = -16 + }, +/turf/open/floor/bamboo, +/area/centcom/holding/cafe) "vYR" = ( /obj/structure/flora/coconuts, /turf/open/misc/beach/sand, /area/centcom/holding/cafepark) +"vYV" = ( +/obj/machinery/light/directional/east, +/obj/structure/table/reinforced/rglass, +/obj/structure/towel_bin, +/turf/open/floor/wood/large, +/area/centcom/holding/cafe) +"vZb" = ( +/obj/structure/chair/sofa/corp/left{ + dir = 4 + }, +/turf/open/indestructible/carpet, +/area/centcom/holding/cafepark) "vZv" = ( -/obj/structure/sign/painting/library_private, -/turf/closed/indestructible/wood, -/area/centcom/holding/cafedorms) +/obj/structure/window/reinforced/spawner/directional/south, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/centcom/holding/cafe) "wag" = ( /obj/effect/turf_decal/trimline/green/line{ dir = 4 @@ -12577,21 +16486,13 @@ /turf/open/floor/iron/dark, /area/centcom/interlink) "wcd" = ( -/obj/effect/turf_decal/siding{ - color = "#2e2e2e"; - dir = 5 - }, -/obj/structure/table/wood/fancy/orange{ - pixel_y = -3 - }, -/obj/item/flashlight/flare/candle/infinite{ - pixel_x = -7; - pixel_y = -2 +/obj/structure/flora/bush/flowers_pp, +/obj/structure/flora/bush/flowers_br, +/obj/structure/flora/bush/lavendergrass, +/turf/open/misc/grass/planet{ + smoothing_flags = 0 }, -/obj/item/flashlight/flare/candle/infinite, -/obj/machinery/light/warm/directional/east, -/turf/open/floor/bamboo, -/area/centcom/holding/cafedorms) +/area/centcom/holding/cafepark) "wcf" = ( /obj/structure/closet/secure_closet/freezer/kitchen/all_access, /obj/item/reagent_containers/condiment/mayonnaise, @@ -12636,20 +16537,10 @@ /turf/open/floor/iron, /area/centcom/interlink) "weP" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/structure/table/glass, -/obj/item/storage/box/gloves{ - pixel_x = 3; - pixel_y = 3 +/obj/structure/mineral_door/paperframe{ + name = "Shinto Cabin Washroom" }, -/obj/item/storage/box/masks, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/white, +/turf/open/floor/sepia, /area/centcom/holding/cafe) "wfh" = ( /obj/effect/landmark/latejoin, @@ -12662,9 +16553,8 @@ /turf/open/floor/wood/tile, /area/centcom/interlink) "wfN" = ( -/turf/open/misc/ashplanet{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15" - }, +/obj/effect/light_emitter/interlink, +/turf/open/indestructible/plating, /area/centcom/holding/cafe) "wgp" = ( /obj/machinery/door/poddoor/shutters/indestructible, @@ -12683,14 +16573,43 @@ /obj/structure/flora/rock/style_random, /turf/open/misc/dirt/planet, /area/centcom/interlink) +"wjI" = ( +/obj/structure/flora/grass/jungle/a/style_2, +/obj/machinery/light/directional/north, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) "wkG" = ( /obj/structure/chair/stool/bar/directional/south, /turf/open/floor/wood/parquet, /area/centcom/interlink) +"wkQ" = ( +/obj/structure/railing{ + invisibility = 100; + dir = 1 + }, +/obj/structure/chair/wood{ + dir = 1 + }, +/obj/effect/turf_decal/weather/snow/corner, +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafepark) "wlA" = ( /obj/structure/window/reinforced/tinted/spawner/directional/south, /turf/open/floor/iron/white, /area/centcom/interlink/dorm_rooms) +"wlL" = ( +/obj/structure/stone_tile/block{ + dir = 1 + }, +/obj/structure/stone_tile/block, +/obj/item/flashlight/flare/candle/infinite, +/turf/open/floor/fakebasalt, +/area/centcom/holding/cafepark) +"wmA" = ( +/obj/structure/stone_tile/slab/cracked, +/obj/structure/fans/tiny/invisible, +/turf/open/floor/fakebasalt, +/area/centcom/holding/cafepark) "wmW" = ( /obj/effect/turf_decal/trimline/dark_red/filled/arrow_cw{ dir = 8 @@ -12701,6 +16620,11 @@ /obj/structure/reagent_water_basin, /turf/open/misc/dirt/planet, /area/centcom/holding/cafepark) +"wns" = ( +/obj/structure/fans/tiny/invisible, +/obj/structure/flora/grass/jungle/b, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) "wod" = ( /obj/structure/sign/poster/random/directional/north, /obj/effect/turf_decal/trimline/green/filled/arrow_ccw, @@ -12711,6 +16635,10 @@ /obj/structure/flora/bush/flowers_pp/style_random, /turf/open/floor/grass, /area/centcom/interlink) +"wqC" = ( +/obj/structure/lavaland/ash_walker_fake, +/turf/open/lava/fake, +/area/centcom/holding/cafepark) "wqG" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 8 @@ -12748,6 +16676,18 @@ }, /turf/open/floor/carpet/executive, /area/centcom/interlink) +"wtw" = ( +/obj/structure/stone_tile/slab, +/obj/structure/bed/maint{ + pixel_y = 13 + }, +/obj/structure/bed/maint, +/obj/item/bedsheet/black/double{ + dir = 1 + }, +/obj/structure/curtain/bounty, +/turf/open/floor/fakebasalt, +/area/centcom/holding/cafepark) "wtI" = ( /obj/effect/turf_decal/siding/wood, /turf/open/floor/wood/tile, @@ -12758,6 +16698,11 @@ /obj/effect/turf_decal/delivery/blue, /turf/open/floor/iron/white, /area/centcom/interlink) +"wvy" = ( +/obj/structure/closet/firecloset, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/centcom/holding/cafe) "wwD" = ( /obj/effect/turf_decal/weather/dirt{ dir = 4 @@ -12822,13 +16767,13 @@ /obj/effect/turf_decal/trimline/green/filled/arrow_ccw, /turf/open/floor/iron/dark, /area/centcom/interlink) +"wBV" = ( +/obj/structure/railing, +/turf/open/indestructible/cobble/side, +/area/centcom/holding/cafepark) "wBX" = ( /obj/structure/sink/directional/south, -/turf/open/indestructible/hoteltile{ - icon = 'modular_skyrat/modules/ghostcafe/icons/floors.dmi'; - icon_state = "titanium_blue_old"; - name = "bathroom floor" - }, +/turf/open/indestructible/bathroom, /area/centcom/holding/cafedorms) "wCl" = ( /obj/item/kirbyplants/random, @@ -12836,12 +16781,10 @@ /turf/open/floor/iron/dark/textured_large, /area/cruiser_dock) "wCC" = ( -/obj/effect/turf_decal/siding{ - color = "#2e2e2e"; - dir = 4 - }, -/turf/open/floor/bamboo, -/area/centcom/holding/cafedorms) +/obj/structure/flora/bush/large/style_random, +/obj/effect/light_emitter/interlink, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) "wCN" = ( /obj/machinery/computer/records/security, /obj/effect/turf_decal/tile/green/opposingcorners, @@ -12852,6 +16795,13 @@ /obj/structure/chair/stool/bar/directional/north, /turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) +"wFe" = ( +/obj/structure/stone_tile/surrounding_tile/cracked, +/obj/structure/chair/stool/bamboo{ + dir = 8 + }, +/turf/open/floor/fakebasalt, +/area/centcom/holding/cafepark) "wFF" = ( /obj/machinery/light/directional/west, /obj/structure/closet/crate/bin, @@ -12908,6 +16858,13 @@ }, /turf/open/floor/iron/cafeteria, /area/centcom/interlink) +"wIO" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 8 + }, +/turf/open/indestructible/plating, +/area/centcom/holding/cafepark) "wJj" = ( /obj/effect/turf_decal/caution/stand_clear, /turf/open/floor/iron/dark, @@ -12920,6 +16877,45 @@ dir = 4 }, /area/cruiser_dock) +"wKb" = ( +/obj/structure/table/glass, +/obj/item/storage/box/disks{ + pixel_x = -8; + pixel_y = 10 + }, +/obj/item/storage/box/syringes{ + pixel_x = 7; + pixel_y = 10 + }, +/obj/item/storage/box/beakers{ + pixel_x = 2; + pixel_y = 2 + }, +/obj/item/reagent_containers/spray/cleaner{ + pixel_x = -11 + }, +/turf/open/indestructible/hoteltile{ + icon_state = "darkfull" + }, +/area/centcom/holding/cafepark) +"wKT" = ( +/obj/structure/bed/pod{ + pixel_y = 1 + }, +/turf/open/floor/wood/large, +/area/centcom/holding/cafe) +"wLx" = ( +/obj/effect/turf_decal/tile/purple/half/contrasted, +/turf/open/floor/iron, +/area/centcom/holding/cafe) +"wLN" = ( +/obj/structure/railing{ + invisibility = 100; + dir = 4 + }, +/obj/effect/spawner/liquids_spawner, +/turf/open/floor/iron/pool, +/area/centcom/holding/cafepark) "wME" = ( /obj/structure/table, /obj/item/paper/pamphlet/centcom/visitor_info{ @@ -12929,6 +16925,13 @@ /obj/item/paper/pamphlet/centcom/visitor_info, /turf/open/floor/iron/dark, /area/centcom/interlink) +"wOi" = ( +/obj/structure/weightmachine/weightlifter, +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) "wOQ" = ( /obj/effect/turf_decal/siding/white/corner{ dir = 1 @@ -12947,17 +16950,49 @@ /obj/machinery/light/cold/directional/east, /turf/open/floor/iron/dark/textured_large, /area/cruiser_dock) +"wUt" = ( +/obj/structure/table/wood, +/obj/structure/towel_bin, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) "wUS" = ( /obj/effect/turf_decal/tile/blue{ - dir = 1 + dir = 4 }, /obj/effect/turf_decal/tile/blue{ dir = 8 }, -/obj/structure/bed/medical/emergency, -/obj/machinery/iv_drip, -/turf/open/floor/iron/white, -/area/centcom/holding/cafe) +/turf/open/indestructible/hoteltile{ + icon_state = "white" + }, +/area/centcom/holding/cafepark) +"wVd" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/structure/chair/sofa/bench/right{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/indestructible/hoteltile{ + icon_state = "floor" + }, +/area/centcom/holding/cafepark) +"wWm" = ( +/obj/structure/chair/stool/bar/directional/south, +/turf/open/indestructible/cobble/corner{ + dir = 4 + }, +/area/centcom/holding/cafepark) "wXe" = ( /obj/structure/bookcase/random/adult, /obj/effect/turf_decal/siding/wood{ @@ -12976,12 +17011,26 @@ }, /turf/open/floor/iron/white, /area/centcom/interlink/dorm_rooms) +"wYD" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/centcom/holding/cafe) "wYH" = ( /obj/structure/railing/corner{ dir = 1 }, /turf/open/floor/iron/dark, /area/centcom/interlink) +"wZa" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/obj/structure/table/reinforced, +/obj/item/surgery_tray/full/deployed, +/turf/open/floor/iron/white, +/area/centcom/holding/cafe) "wZh" = ( /obj/machinery/door/airlock/sandstone{ id_tag = "ghostcaferesortbathroom2"; @@ -12990,6 +17039,10 @@ /obj/structure/fans/tiny/invisible, /turf/open/floor/wood, /area/centcom/holding/cafe) +"wZw" = ( +/obj/structure/chair/sofa/bench/corner, +/turf/open/floor/wood/large, +/area/centcom/holding/cafe) "wZS" = ( /obj/item/storage/cans/sixbeer, /turf/open/floor/carpet/orange, @@ -13010,6 +17063,13 @@ }, /turf/open/floor/iron/white, /area/centcom/interlink) +"xbn" = ( +/obj/structure/flora/grass/jungle, +/obj/effect/light_emitter/interlink, +/turf/open/misc/grass/planet{ + smoothing_flags = 0 + }, +/area/centcom/holding/cafepark) "xct" = ( /obj/effect/turf_decal/tile/dark_blue/opposingcorners, /obj/effect/turf_decal/siding/dark{ @@ -13029,12 +17089,33 @@ /obj/effect/turf_decal/delivery/blue, /turf/open/floor/iron/white, /area/centcom/interlink) +"xec" = ( +/obj/structure/table/wood, +/obj/item/flashlight/flare/candle/infinite{ + pixel_x = 4; + pixel_y = 10 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafepark) +"xfD" = ( +/obj/structure/punching_bag, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) "xfT" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 1 }, /turf/open/misc/asteroid, /area/cruiser_dock) +"xga" = ( +/obj/structure/table/wood, +/obj/item/flashlight{ + desc = "A hand-held not-so-emergency light that's very very bright!"; + light_power = 10; + name = "Super Light" + }, +/turf/open/indestructible/carpet, +/area/centcom/holding/cafe) "xgz" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -13042,12 +17123,76 @@ /obj/machinery/duct, /turf/open/floor/wood/tile, /area/centcom/interlink) +"xkO" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/flora/bush/jungle/b, +/turf/open/misc/grass/planet{ + smoothing_flags = 0 + }, +/area/centcom/holding/cafe) +"xlP" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 1 + }, +/turf/open/lava/fake, +/area/centcom/holding/cafepark) +"xlS" = ( +/obj/structure/stone_tile/block{ + dir = 4 + }, +/obj/structure/stone_tile/block{ + dir = 8 + }, +/obj/structure/stone_tile/surrounding_tile{ + dir = 4 + }, +/turf/open/floor/fakebasalt, +/area/centcom/holding/cafepark) "xmn" = ( /obj/structure/flora/bush/flowers_pp/style_random, /obj/structure/flora/bush/flowers_yw/style_random, /obj/effect/light_emitter/interlink, /turf/open/floor/grass, /area/centcom/interlink) +"xnl" = ( +/obj/effect/turf_decal/sand, +/obj/structure/marker_beacon/burgundy, +/turf/open/indestructible/plating, +/area/centcom/holding/cafepark) +"xnI" = ( +/obj/structure/table/reinforced, +/obj/item/storage/backpack/duffelbag/science/robo/surgery{ + pixel_y = 7 + }, +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/tile/purple/half/contrasted, +/obj/structure/window/spawner/directional/east, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/iron, +/area/centcom/holding/cafe) +"xoB" = ( +/obj/structure/table/wood, +/obj/structure/window/spawner/directional/west, +/obj/structure/window/spawner/directional/south, +/obj/item/reagent_containers/cup/bottle/syrup_bottle/liqueur{ + pixel_x = -5; + pixel_y = 16 + }, +/obj/item/reagent_containers/cup/bottle/syrup_bottle/korta_nectar{ + pixel_x = 5; + pixel_y = 16 + }, +/obj/item/reagent_containers/cup/bottle/syrup_bottle/caramel{ + pixel_x = 15; + pixel_y = 16 + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) "xpl" = ( /obj/structure/chair/sofa/bench/right{ dir = 8 @@ -13091,6 +17236,10 @@ }, /turf/open/floor/carpet/red, /area/cruiser_dock) +"xsf" = ( +/obj/structure/flora/ash/stem_shroom, +/turf/open/floor/fakebasalt, +/area/centcom/holding/cafepark) "xsg" = ( /obj/effect/turf_decal/trimline/blue/filled/arrow_cw{ dir = 8 @@ -13099,17 +17248,36 @@ /turf/open/floor/iron/dark, /area/centcom/interlink) "xsM" = ( -/obj/structure/flora/bush/lavendergrass{ - icon_state = "lavendergrass_2" - }, -/turf/open/floor/plating/cobblestone, -/area/centcom/holding/cafepark) +/obj/structure/window/spawner/directional/south, +/obj/structure/reagent_dispensers/water_cooler, +/obj/machinery/light/directional/west, +/turf/open/floor/carpet/black, +/area/centcom/holding/cafe) "xtQ" = ( /obj/effect/turf_decal/weather/dirt, /obj/effect/light_emitter/interlink, /obj/structure/flora/bush/flowers_pp/style_random, /turf/open/floor/grass, /area/centcom/interlink) +"xuk" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/structure/chair/sofa/bench{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/indestructible/hoteltile{ + icon_state = "floor" + }, +/area/centcom/holding/cafepark) "xuY" = ( /turf/closed/indestructible/syndicate, /area/cruiser_dock) @@ -13128,9 +17296,10 @@ /turf/open/floor/wood, /area/centcom/holding/cafedorms) "xyn" = ( -/obj/structure/sign/departments/medbay/alt, -/turf/closed/indestructible/wood, -/area/centcom/holding/cafe) +/obj/structure/flora/grass/jungle/a/style_4, +/obj/machinery/light/directional/north, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) "xyz" = ( /obj/structure/closet/crate/bin, /obj/effect/turf_decal/delivery, @@ -13154,9 +17323,55 @@ /obj/structure/alien/egg/burst, /turf/open/misc/dirt/planet, /area/centcom/holding/cafepark) +"xCO" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/indestructible/hoteltile{ + icon_state = "floor" + }, +/area/centcom/holding/cafepark) +"xDp" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/structure/chair/sofa/bench/right{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/indestructible/hoteltile{ + icon_state = "floor" + }, +/area/centcom/holding/cafepark) "xDE" = ( /turf/open/floor/iron/dark/textured_large, /area/cruiser_dock) +"xDR" = ( +/obj/effect/turf_decal/tile/blue/anticorner/contrasted, +/obj/effect/turf_decal/bot, +/obj/machinery/vending/medical, +/turf/open/floor/iron/white, +/area/centcom/holding/cafe) "xEn" = ( /obj/structure/table/reinforced, /obj/machinery/door/window/brigdoor/left/directional/north{ @@ -13169,6 +17384,12 @@ "xFA" = ( /turf/open/floor/iron/stairs/right, /area/cruiser_dock) +"xFE" = ( +/obj/structure/chair/sofa/bench/right{ + dir = 1 + }, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) "xFU" = ( /obj/effect/turf_decal/sand, /turf/open/misc/beach/sand, @@ -13177,6 +17398,21 @@ /obj/structure/flora/bush/sunny, /turf/open/misc/grass/planet, /area/centcom/holding/cafepark) +"xGO" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/flora/grass/jungle, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafe) +"xHs" = ( +/obj/machinery/light/small/directional/west, +/turf/open/floor/bamboo, +/area/centcom/holding/cafe) +"xIx" = ( +/obj/structure/chair/office, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) "xIR" = ( /obj/effect/turf_decal/siding/wood, /obj/machinery/door/airlock/multi_tile/public/glass{ @@ -13265,6 +17501,18 @@ }, /turf/open/floor/plating, /area/centcom/interlink) +"xQK" = ( +/obj/structure/bed/double, +/obj/item/bedsheet/dorms_double, +/obj/structure/sign/painting/library_secure{ + pixel_y = -32 + }, +/turf/open/indestructible/carpet, +/area/centcom/holding/cafe) +"xRx" = ( +/obj/item/stack/sheet/mineral/wood/fifty, +/turf/open/floor/stone, +/area/centcom/holding/cafe) "xSr" = ( /obj/effect/turf_decal/tile/red/opposingcorners, /turf/open/floor/iron/dark, @@ -13300,6 +17548,16 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/freezer, /area/centcom/interlink) +"xTZ" = ( +/obj/machinery/vending/wardrobe/coroner_wardrobe/ghost_cafe, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/centcom/holding/cafe) "xVv" = ( /obj/machinery/button/door/directional/west{ id = "interlink_hall2"; @@ -13352,6 +17610,12 @@ /obj/structure/marker_beacon/teal, /turf/open/misc/asteroid, /area/cruiser_dock) +"xXU" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) "xYp" = ( /obj/machinery/door/airlock/multi_tile/public/glass{ name = "Interlink Cafe" @@ -13374,12 +17638,9 @@ /turf/open/floor/iron/dark/textured_large, /area/cruiser_dock) "ybu" = ( -/obj/machinery/button/curtain{ - id = "ghostcafecabin3curtain"; - pixel_y = -25 - }, -/turf/open/indestructible/hotelwood, -/area/centcom/holding/cafedorms) +/obj/structure/flora/rock/pile/jungle/style_3, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) "ybB" = ( /obj/item/kirbyplants/random, /obj/effect/turf_decal/trimline/dark_green/filled/line{ @@ -13391,6 +17652,15 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron/smooth, /area/centcom/interlink) +"ybQ" = ( +/obj/machinery/light/small/directional/north, +/turf/open/floor/sepia, +/area/centcom/holding/cafe) +"ybS" = ( +/obj/structure/flora/grass/jungle/a/style_2, +/obj/structure/flora/bush/flowers_pp, +/turf/open/misc/grass/planet, +/area/centcom/holding/cafepark) "ybX" = ( /obj/effect/turf_decal/weather/dirt, /obj/effect/turf_decal/weather/dirt{ @@ -13403,29 +17673,30 @@ /turf/open/floor/grass, /area/centcom/interlink) "ycB" = ( -/obj/effect/turf_decal/siding/wood/corner{ +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ dir = 4 }, -/obj/effect/turf_decal/siding/wood/corner, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 1 - }, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 8 +/obj/structure/bed, +/obj/item/bedsheet/dorms, +/turf/open/floor/iron, +/area/centcom/holding/cafe) +"ycD" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 4 }, -/obj/structure/beebox{ - name = "Shrine" +/obj/effect/turf_decal/tile/blue{ + dir = 1 }, -/turf/open/floor/wood, -/area/centcom/holding/cafedorms) -"ycD" = ( -/obj/effect/turf_decal/tile/blue/full, -/obj/machinery/door/airlock/wood{ - glass = 1; - name = "Surgery" +/obj/structure/table/reinforced, +/obj/item/clothing/suit/jacket/straight_jacket, +/obj/machinery/button/door{ + id = "CCSurgery"; + name = "Bolt Control"; + normaldoorcontrol = 1; + specialfunctions = 4; + pixel_y = 0; + pixel_x = 25 }, -/obj/effect/turf_decal/caution/stand_clear, -/obj/structure/fans/tiny/invisible, /turf/open/floor/iron/white, /area/centcom/holding/cafe) "ycL" = ( @@ -13434,6 +17705,13 @@ /obj/effect/turf_decal/bot_blue, /turf/open/floor/iron/white, /area/centcom/interlink) +"yde" = ( +/obj/structure/flora/bush/jungle/a, +/obj/effect/light_emitter/interlink, +/turf/open/misc/grass/planet{ + smoothing_flags = 0 + }, +/area/centcom/holding/cafepark) "ydt" = ( /obj/effect/landmark/latejoin, /obj/effect/turf_decal/trimline/blue/filled/corner{ @@ -13483,6 +17761,23 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/freezer, /area/centcom/interlink) +"yjC" = ( +/obj/effect/turf_decal/weather/snow/corner, +/obj/structure/rack/wooden, +/obj/item/storage/box/matches{ + pixel_y = -8; + pixel_x = -3 + }, +/obj/item/towel{ + pixel_y = 9; + pixel_x = 6 + }, +/obj/item/towel{ + pixel_y = 9; + pixel_x = 1 + }, +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafepark) "yjX" = ( /obj/structure/closet, /obj/item/clothing/under/rank/centcom/officer/replica{ @@ -49335,18 +53630,6 @@ ofJ aWi aWi ajj -ajj -ajj -ajj -ajj -ajj -ajj -ajj -ajj -ajj -ajj -ajj -ajj aaa aaa aaa @@ -49362,6 +53645,18 @@ aaa aaa aaa aaa +ajj +ajj +ajj +ajj +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -49592,18 +53887,6 @@ aWi aVv twL ajj -aPf -aPf -aPf -aPf -aPf -aPf -aPf -aPf -aPf -aPf -aPf -ajj aaa aaa aaa @@ -49617,6 +53900,18 @@ aaa aaa aaa aaa +ajj +ajj +ajj +ajj +ajj +ajj +ajj +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -49849,18 +54144,6 @@ aVv axY aWg ajj -aPf -aPf -aPf -aPf -aPf -aPf -aPf -aPf -aPf -aPf -aPf -ajj aaa aaa aaa @@ -49873,6 +54156,18 @@ aaa aaa aaa aaa +ajj +ajj +iGS +iGS +iGS +iGS +iGS +ajj +ajj +ajj +ajj +aaa aaa aaa aaa @@ -50074,11 +54369,11 @@ ajj ajj ajj ajj -aqf -aqf -aqf -aqf -aqf +ajj +aFP +aFP +aFP +aFP axw auf aAz @@ -50106,20 +54401,6 @@ gjj axa aUm ajj -aPf -aPf -aPf -aPf -aPf -aPf -aPf -aPf -aPf -aPf -aPf -ajj -aaa -aaa aaa aaa aaa @@ -50131,6 +54412,20 @@ aaa aaa aaa aaa +ajj +ajj +ajj +iGS +mDS +aAr +oOS +iGS +ajj +ajj +ajj +ajj +ajj +ajj aaa aaa aaa @@ -50331,15 +54626,15 @@ aFP aFP asF aMJ -aqf -aqX -aUw -ahC -aqf +kPK aFP -aLH aFP aFP +aFP +aFP +aLH +aFP +aMJ aBr aFP aFP @@ -50360,34 +54655,34 @@ uxW ofJ aWi gjj -axa +cLv aUm ajj -aPf -aPf -aPf -aPf -aPf -aPf -aPf -aPf -aPf -aPf -aPf -ajj -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa aaa aaa aaa +ajj +ajj +ajj +ajj +ajj +ajj +ajj +ajj +ajj +aEQ +aNK +iGS +sCh +hPq +rcq +iGS +iGS +iGS +iGS +iGS +iGS +ajj aaa aaa aaa @@ -50588,11 +54883,11 @@ avb aLH aFP aFP -aqf -aHl -aRC -aUA -aqf +kPK +aFP +aFP +aFP +aFP aVA aFP aCM @@ -50606,7 +54901,7 @@ aFP aFP aLH aFP -aFP +hBy aFP aFP aFP @@ -50617,9 +54912,13 @@ bFi aWi aVv aRS -axa +cLv aRe ajj +ajj +ajj +ajj +ajj aPf aPf aPf @@ -50627,10 +54926,20 @@ aPf aPf aPf aPf -aPf -aPf -aPf -aPf +ajj +aRH +iqY +aUA +aOW +sfN +rcq +iGS +mQa +rCl +vxC +sKP +iGS +ajj ajj aaa aaa @@ -50768,20 +55077,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa "} (146,1,1) = {" aaa @@ -50837,7 +55132,7 @@ aWo ajj ajj aCM -aFP +auf ahU aFP aIV @@ -50845,22 +55140,22 @@ ahA aFP ahQ aFP -aqf -aAq -aRC -nxR -aqf -aFB -akp +kPK aFP +auf aFP aFP aFB +akp +azk +aFP +kWr +aFB aFP aFP aVA aIV -axw +aNB aFP aKu aFP @@ -50889,20 +55184,20 @@ atp aPf aPf ajj -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +agb +aEf +aDQ +aOW +hpX +aTD +aTV +tfI +tfI +tfI +bTg +iGS +ajj +ajj aaa aaa aaa @@ -51102,21 +55397,21 @@ aAz ahs aFP aAc -aqf -amx -aRC -aUA -aqf +kPK +aFP aFP -agy aFP aFP aFP -aeT -asX -avb agy -ahU +aMJ +aFP +aFP +aFP +aFP +aFP +aFP +aFP aFP aBr aCM @@ -51146,20 +55441,20 @@ atp aPf aPf ajj -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +smA +afB +iGS +wKb +fTv +ltu +iGS +bbW +tfI +oGv +hyt +iGS +ajj +ajj aaa aaa aaa @@ -51356,25 +55651,25 @@ axw aFP aFB aFP -aFP +auf ahQ aFP -aqf -aqf -aVp -aqf -aqf +kPK +aFP +aFP +aFP +aFP ahU aFP ayd aBp +kWr aFP +rMZ aFP -aAz -aFP -ahQ +kWr +kWr aFP -alf arT ayd agy @@ -51403,20 +55698,20 @@ atp aPf aPf ajj -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +ajj +ajj +iGS +iGS +iGS +iGS +iGS +iGS +aTV +iGS +iGS +iGS +ajj +ajj aaa aaa aaa @@ -51605,20 +55900,20 @@ ajj ayI azs ajj +ajj aqf aqf -aTb aqf -aTb aqf aqf +aFP aLH aFP aFP ayd -aLH +kPK aKu -azY +aFP aFP agy asX @@ -51626,9 +55921,9 @@ aLH aFP aFP aFP -aAc -aFP -aLH +hWY +hfJ +goK aFP aFP aFP @@ -51640,14 +55935,14 @@ alF asX aFP aFP -axA -axA -axA -axA -axA -axA -axA -aPf +aFP +aqf +aqf +aqf +aqf +aqf +aqf +aqf aPf atp atp @@ -51659,6 +55954,20 @@ atp atp aPf aPf +ayI +ajj +ajj +ajj +ajj +ajj +ajj +iGS +aHj +aOW +fvx +njQ +iGS +iGS ajj aaa aaa @@ -51796,6 +56105,29 @@ aaa aaa aaa aaa +"} +(150,1,1) = {" +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -51810,122 +56142,6 @@ aaa aaa aaa aaa -"} -(150,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -ajj -ayI -ajj -ajj -aqf -aAE -azr -aWT -aUo -aBk -aqf -aBr -aFP -arT -aFP -aBr -azY -azY -ahs -aeT -aAc -aFP -ahs -aFP -aFP -azk -alF -aFP -aFP -aFP -aFP -aMJ -aFP -aFP -aLH -aAc -aFP -aFP -ahA -axA -avl -aBT -aUu -axA -aNd -axA -aPf -aPf -atp -bGx -qJm -ckY -ckY -qJm -atp -aPf -aPf -aPf -ajj -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa aaa aaa aaa @@ -51937,6 +56153,85 @@ aaa aaa aaa aaa +ajj +ayI +ajj +ajj +ajj +aqf +nGL +tzz +orB +aqf +aFP +aBr +aFP +arT +aFP +aCQ +aFP +aFP +ahs +aeT +aAc +aFP +kuV +aFP +uwP +aFP +aPC +aFP +aFP +aFP +aFP +aMJ +aFP +aFP +aLH +aAc +aFP +auf +ayI +ayI +aqf +aBT +aUu +aBv +aqf +aRx +aqf +aPf +atp +bGx +qJm +ckY +ckY +qJm +atp +aPf +aPf +ayI +ayI +ayI +tUL +ayI +ayI +ayI +ayI +iGS +sPH +bll +hPH +vYC +iFq +iGS +ajj +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -52119,20 +56414,20 @@ ajj aCf ayI ajj +ajj aqf -aZF -aHK -aWT -aUo -aqO +ybQ +ihd +ihd aqf +aFP axw aFP aFP ahU +kPK +aIV aFP -tal -azY aFP aFP agy @@ -52140,9 +56435,9 @@ aFB aFP aBr aFP -aFP -aeT -akp +kWr +lZn +lZn aFP aFP aFP @@ -52152,16 +56447,16 @@ ahs aMW aFP aFP -aGg aFP -aNg -aIN -aIN -aIN -aOY +ayI +ayI +dWE +amF +amF +amF axD -axA -aPf +tky +aqf aPf atp atp @@ -52171,8 +56466,22 @@ qJm jFn atp aPf -aPf -aPf +ayI +ayI +ayI +ayI +ayI +ayI +ayI +ayI +ayI +aTV +aOW +cQH +kJz +pwV +vDr +iGS ajj aaa aaa @@ -52310,20 +56619,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa "} (152,1,1) = {" aaa @@ -52376,49 +56671,49 @@ ajj ayI ayI ajj -sQj -ail -aUo -aUo -aUo -aUo -aUK -azY -azY -azY +ajj +aqf +iBq +ihd +lLN +aqf +aFP +aFP +aFP +aFP +aFP +kPK +aFP aFP -axw -azY -azY aFP azk -ahQ +aRP aNk arT aLH aFP -aFB aFP -axw -aKu -aQw aFP aFP +aFP +aQw +kWr +aFP alf aFP aVA aFP agy aFP -aKu -axA -apT -aIN +ayI +ayI +aqf +paJ amF -axA -aVC -axA -aPf +cGX +aqf +qWc +aqf aPf atp atp @@ -52428,24 +56723,24 @@ cfs atp aPf aPf -aPf -aPf +ayI +ayI +ayI +ayI +ayI +ayI +ayI +ayI +tUL +iGS +oyf +aTV +iGS +fdX +iGS +iGS +ajj ajj -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa aaa aaa aaa @@ -52634,18 +56929,18 @@ azs ayI ajj aqf -aOZ -aUo -aSy -aUo -afF aqf -avb -azY -azY -azY -auf -azY +aqf +weP +aqf +aqf +aFP +aFP +aFP +aFP +xFZ +kPK +aFP akp aFP aFP @@ -52667,15 +56962,15 @@ aFP akp aFP aFP +ayI aFP -axA -axA -axA -sSe -axA -axA -axA -aPf +aqf +aqf +aqf +aqf +aqf +aqf +aqf aPf atp qJm @@ -52684,25 +56979,25 @@ atp ckY atp aPf -aPf -aPf -aPf +ayI +ayI +ayI +ayI +ajj +ajj +ajj +ajj +ajj +ajj +iGS +aOW +aOW +iGS +iGS +iGS +iGS +iGS ajj -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa aaa aaa aaa @@ -52891,19 +57186,19 @@ aPf ayI ajj aqf -rJC -aUo -awr -aUo -aGk +aWp +cmh +gOS +smx aqf -aTB aFP -azY -azY -azY -azY -azY +aFP +aFP +aFP +auf +kPK +aFP +aFP aFP aLH aFP @@ -52923,16 +57218,16 @@ aFP aFP aMJ aFP -aeT -aBr aFP -ajj -aPf -aPf -aPf -aPf -aPf -aPf +ayI +aFP +aqf +aRx +aqf +haM +aQQ +qHc +aqf atp atp qJm @@ -52941,25 +57236,25 @@ atp atp atp aPf -aPf -aPf -aPf +ayI +ayI +ayI +ajj +ajj +iGS +iGS +iGS +iGS +iGS +iGS +aOW +aOW +iGS +uXf +iNW +nlM +iGS ajj -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa aaa aaa aaa @@ -53148,19 +57443,19 @@ aPf ayI ajj aqf -aqf -sQj -aqf -dau -aqf -aqf +grW +qXC +bAr +agk +kJU aFP aFP -ahQ +axw +aFP +aFP +bja +aFP aFP -azY -azY -azY alF aFP aFP @@ -53180,16 +57475,16 @@ aFP asF aFP aFP -arT aFP +ayI aFP -ajj -aPf -aPf -aPf -aPf -aPf -aPf +aqf +qWc +axD +amF +amF +alk +sQj atp qJm qJm @@ -53198,25 +57493,25 @@ aPf aPf aPf aPf -aPf -aPf -aPf +ayI +ayI +ayI +ajj +ajj +iGS +vZb +pSZ +ahk +ahk +iGS +fGv +aOW +iGS +tKt +tKt +qCU +iGS ajj -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa aaa aaa aaa @@ -53404,20 +57699,20 @@ ajj aPf ayI ajj -aqf -ufz -nps -vxF -bcb -sQj -aFP -aAc -aFP -aFP -azk -aFP -azY -azY +adR +auP +qXC +orU +vYI +kJU +aHl +aHl +aHl +aHl +nJO +aLu +ayI +ayI aIV ahQ aFB @@ -53438,42 +57733,42 @@ aFP afA ahU aFP +ayI aFP -aFP -ajj -aPf -aPf -aPf -aPf -aPf -aPf +aqf +aqf +aqf +aqf +aFy +aqf +aqf atp qJm qJm atp aPf -aPf -aPf -aPf -aPf -aPf -aPf +ayI +ayI +ayI +ayI +ayI +ayI +ajj +ajj +iGS +asz +qfy +ahk +ahk +pXT +aOW +aOW +fbM +tKt +tKt +kIR +iGS ajj -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa aaa aaa aaa @@ -53661,21 +57956,21 @@ ajj aCf ayI ajj -aqf -bcb -bcb -bcb -bcb -sQj -aFP -aFP -aLH -aFP -asX -aFV -azY -azY -azY +adR +vkD +qXC +qXC +iki +gxF +aHl +aHl +aHl +aHl +aHl +aLu +ayI +ayI +ayI atQ aFP aLH @@ -53695,15 +57990,15 @@ aFP aLH ahs aFP -alf +ayI aFP -ajj -ajj -aPf -aPf -aPf -aPf -aPf +auf +aqf +kkV +aUo +aUo +aUo +aqf atp ckY qJm @@ -53711,26 +58006,26 @@ atp aPf aPf aPf -aPf -aPf -aPf -aPf +ayI +ayI +ayI +ayI +ajj +ajj +iGS +npc +nhZ +ahk +ssi +iGS +aOW +aOW +iGS +iYC +fza +cPo +iGS ajj -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa aaa aaa aaa @@ -53918,25 +58213,25 @@ ajj aPf ayI ajj -aqf -rTU -bcb -bcb -bcb -sQj -aFP -aFP -aFV -aFB +adR +lVs +vNs +bIO +acF +kJU +aHl +aHl +aHl +aHl +nJO +aLu +ayI +ayI +ayI +ayI aFP aFP -arT -azY -azY -azY -aKu aFP -aAc aFP azk aFP @@ -53952,15 +58247,15 @@ agy aFP aFP aFP -aFP -aFP -auf -ajj -aPf -aPf -aPf -aPf -aPf +ayI +ayI +ayI +cOu +aUo +eeZ +bwG +anw +aqf atp qJm qJm @@ -53969,25 +58264,25 @@ atp atp aPf aPf -aPf -aPf -aPf +ayI +ayI +ayI +ajj +ajj +iGS +iGS +iGS +iGS +iGS +iGS +iGS +iGS +iGS +iGS +iGS +iGS +iGS ajj -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa aaa aaa aaa @@ -54176,24 +58471,24 @@ aPf ayI ajj aqf -sRt -btN -bcb -btN -sQj -aFP +auP +qXC +qXC +aIm +oYO aFP +aLH aFP -avb -aeT -aMJ +aAc aFP +mCg aFP -azY -azY aFP -aSs -aSs +ayI +ayI +ayI +ayI +ayI aFP aLH aFP @@ -54209,15 +58504,15 @@ aIV aFP aVA aAc +ayI aFP aFP -aFP -ajj -aPf -aPf -aPf -aPf -aPf +aqf +aUo +pqy +jhR +fTY +aqf atp esx qJm @@ -54226,25 +58521,25 @@ atp atp aPf aPf -aPf -aPf -aPf +ayI +tUL +ayI +ayI +asw +asw +asw +asw +asw +asw +asw +asw +asw +asw +ajj +ajj +ajj +ajj ajj -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa aaa aaa aaa @@ -54433,25 +58728,25 @@ aPf ayI ajj aqf -aqf -aqf -aqf -aqf +lDy +kJL +riB +iDL aqf aFP -auf -ahQ -aTB aFP aFP -aMJ +auf aFP -azY -azY +kPK aFP -aeT aFP -ahA +aFP +ayI +ayI +ayI +ayI +ayI aFP aFP aFP @@ -54465,16 +58760,16 @@ aGg aFP aAz asX -aFP -aFP +ayI +ayI ayd -aKu -ajj -aPf -aPf -aPf -aPf -aPf +aMJ +aqf +aqf +aqf +aqf +aqf +aqf atp atp cBT @@ -54483,9 +58778,22 @@ aTR atp aPf aPf -aPf -aPf -aPf +ayI +ayI +ayI +ayI +asw +azB +azB +aCS +azB +azB +aCS +azB +azB +asw +ajj +ajj ajj aaa aaa @@ -54624,19 +58932,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa "} (161,1,1) = {" aaa @@ -54689,23 +58984,26 @@ ajj aCf ayI ajj +aqf +aqf +bhQ +bIO +aqf +aqf aFP aFP aFP +aSs aFP -aIV -aFP -ayd -aIV -aAz -aFP -aFP -aFP -aFP -aFP -aFP -azY +lwv +lwv +lwv +lwv +lwv +lwv aFP +ayI +ayI aFP aFP aFP @@ -54715,23 +59013,20 @@ aFP aFP aFP aFP +ayI +ayI +ayI +ayI +ayI +ayI aFP aFP aFP -jhR -hdV -jhR -jhR -jhR +axw aFP +axw aFP aFP -ajj -ajj -aPf -aPf -aPf -aPf atp atp atp @@ -54740,20 +59035,20 @@ cBT atp aPf aPf -aPf -aPf -aPf -ajj -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +ayI +ayI +ayI +tUL +asw +azB +azB +azB +azB +azB +azB +azB +azB +asw aaa aaa aaa @@ -54946,61 +59241,71 @@ ajj ayI aPf ajj +ajR +xHs +qXC +jgt +aSP +aSP aFP -aLH -ahU -axw +azk aFP -aqf -aqf -aqf -aqf -aqf -aqf -aqf -aqf -aqf +aFP +aFP +lwv +rHD +wUS pbz fOb -aqf +lwv aRi akW akW akW -akW -akW -akW -akW -akW -akW +gPj +gPj +gPj +gPj +gPj +gPj +gPj +smT +gmT +gmT aVI +ayI +ayI +ayI +ayI aFP -jhR -aKQ -hpP -rcq -jhR aFP aFP aFP aFP -ajj -ajj -ajj -aPf -aPf -ajj +kWr +aFP +aFP ajj ajj kFE aaY aPf aPf +cEy +aqP aPf aPf aPf -aPf -ajj +asw +azB +azB +azB +azB +azB +azB +azB +aOc +asw aaa aaa aaa @@ -55141,6 +59446,133 @@ aaa aaa aaa aaa +"} +(163,1,1) = {" +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ajj +ayI +aPf +ajj +alH +alH +alH +alH +aSP +aSP +aFP +aFP +aFP +aFP +aFP +lwv +bkA +wUS +gMy +aki +lwv +aBi +auM +aFr +aFr +aFr +aFr +aFr +aFr +aFr +auM +fFr +fFr +akW +akW +sDY +aFP +aFP +ayI +ayI +ayI +ayI +ayI +ayI +ayI +aFP +aFP +aFP +aFI +axw +aFP +aFP +axw +aFP +aFP +aPf +aPf +aPf +aPf +asw +azB +azB +azB +azB +azB +azB +azB +azB +asw +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -55151,143 +59583,6 @@ aaa aaa aaa aaa -"} -(163,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -ajj -ayI -aPf -ajj -aFP -aCM -aFP -auf -aFP -aqf -qMl -weP -goK -tvh -aqf -lwv -bkA -wUS -mZp -aki -aqf -aBi -auM -aFr -aFr -aFr -aFr -aFr -aFr -aFr -auM -aKc -aFP -jhR -djn -lwt -vUv -jhR -aFP -aFP -aGg -aFP -aFP -aMJ -ajj -ajj -ajj -ajj -aFI -axw -aFP -aFP -axw -aPf -aPf -aPf -aPf -aPf -ajj -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa aaa aaa aaa @@ -55460,23 +59755,23 @@ ajj ayI aPf ajj -ajK -ahQ +aFN +aFN +aFN +aFN +aSP +aSP +auf aFP aFP aFP -aqf -sGf -sGf -sGf -tuO -ycD -bll -sGf -sGf +aMJ +lwv sGf +wUS +gMy tuO -aqf +lwv aBi ayA alC @@ -55487,22 +59782,22 @@ alC alC alC aUM -aKc -aFP -uWe -egn -aBv -vUv -jhR -aFP -aFP -aFP -aFP -aFP +fFr +fFr +qNu +fFr +wBV +kWr aFP aFP +ayI +ayI +ayI +ayI +ayI +ayI +ayI aFP -aaY aFP aFP aFP @@ -55510,21 +59805,21 @@ aFP aFP aFP agy -aPf -aPf -aPf -aPf -ajj -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +aFP +ayI +ayI +ayI +ayI +aYQ +azB +azB +azB +azB +azB +azB +azB +azB +asw aaa aaa aaa @@ -55717,71 +60012,71 @@ ajj ayI aPf ajj +fTb +fTb +fTb +fTb +aSP +aSP aFP -ahQ aFP aFP aFP -aqf -lhF -cMM -mPR -hYP -aqf -qKi +aFP +lwv oaM -oSG +wUS gMy -kPK -aqf +aki +lwv aBi ayA alC +bFD alC alC alC -alC -alC +bFD alC aUM -aKc -aFV -jhR fFr -nlM -vUv -jhR -aVA -aFP +sen +hfJ +gqq +wBV aFP +kWr +kWr aFP aFP aFP +auf aFP +ayI +ayI aFP -aaY -aFP -aFP +auf aFP aFP aFP aFP +auf aFP -aBr -aPf -aPf -aPf -ajj -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +ayI +ayI +ayI +ayI +ayI +asw +aOG +azB +azB +azB +azB +azB +azB +azB +asw aaa aaa aaa @@ -55974,11 +60269,11 @@ ajj aqP aPf ajj -aFP -aFP -azk -aFP -ahA +ajj +ajj +ajj +ajj +ajj aqf aqf aqf @@ -55988,35 +60283,35 @@ aqf aqf aqf aqf -fAL -fOb -xyn +aVp +aqf +aqf aJp -ayA -alC -alC +izT +wLN alC alC alC +jmI alC alC aUM -aKc -aFP -jhR -iQp -pwV -gmE -jhR -aFP -aAY -aFP -aFP -aFP -avb -aFP +fFr +fFr +eon +fFr +gSx +aqf +aqf +aTb +aqf +aTb +aqf +aqf +kWr +ayI +ayI aFP -aaY aFP aFP aFP @@ -56024,21 +60319,21 @@ aFP aMJ aFP aFP -alf -aPf -aPf +ayI +ayI aPf -ajj -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +ayI +ayI +asw +aOG +azB +azB +azB +azB +azB +azB +aOc +asw aaa aaa aaa @@ -56250,7 +60545,7 @@ aUo aqf aBi ayA -alC +dgl alC alC alC @@ -56258,44 +60553,44 @@ alC alC alC aUM -aKc -aFP -jhR -jhR -pPH -jhR -jhR -aKu -aFP +fFr +fFr +aJT +aJT +ald +aqf +aAE +azr +aWT +aUo +aBk +aqf aFP +ayI +ayI aFP aFP aFP -ajj -ajj -ajj -ajj -awU aFP aFP aFP aFP +ayI +ayI aFP -avb aPf aPf aPf -ajj -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +asw +aQM +aQM +azB +azB +azB +azB +azB +azB +asw aaa aaa aaa @@ -56507,52 +60802,52 @@ aUz aqf aBi ayA +dgl +bFD alC alC alC -alC -alC -alC +bFD alC aUM +fFr aKc +rjD +sFC +nLr +aqf +aZF +aHK +aWT +aUo +aqO +aqf aFP +ayI +ayI +ayI aFP aFP aFP aFP aFP +ayI +ayI aFP aFP -aFP -aMJ -ajj -ajj -ajj -ajj -ajj -ajj -ajj -ahs -aFP -aFP -aFP -aFP -ahQ -aFP aPf aPf ajj -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +asw +aQM +aQM +afx +azB +azB +afx +azB +azB +asw aaa aaa aaa @@ -56763,8 +61058,8 @@ aUo azm aTb aBi -ayA -alC +laX +cby alC alC alC @@ -56772,34 +61067,45 @@ alC alC alC aUM -aKc -aIV -aAc -ahs -aAz -ayd -aFP -aFP -avb -aFP -ajj -ajj -umm -umm -umm -umm -umm -ajj -ajj -ajj -ajj -ahs -aFP +fFr +tur +tXp +tzR +tzR +aqf +ail +aUo +aUo +aUo +aUo +aUK +ayI +ayI +ayI +ayI +ayI +ayI +ayI +ayI +ayI +ayI +ayI aFP aFP aPf aPf ajj +asw +asw +asw +asw +asw +asw +asw +asw +asw +asw +aaa aaa aaa aaa @@ -56907,51 +61213,40 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(170,1,1) = {" +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +"} +(170,1,1) = {" aaa aaa aaa @@ -57020,40 +61315,40 @@ aUo aUo aOR aBi -ayA -alC -alC -alC -alC -alC -alC -alC -aUM -aKc -aFP -aLH -aAY -bAr -aCM -axw -aFP -aGg -ajj -ajj -ajj -umm -aZs -aXF -aPZ -umm -ajj -ajj -ajj -ajj -ajj -ajj -akp -aFP +auM +aIA +aIA +aIA +aIA +aIA +aIA +aIA +auM +fFr +tur +uXH +aMQ +kLD +aqf +aOZ +aUo +aSy +aUo +afF +aqf +ayI +ayI +ayI +ayI +ayI +ayI +ayI +ayI +ayI +aPf +aPf +aPf +aPf aPf aPf ajj @@ -57277,53 +61572,53 @@ aUo aUo aTb aBi -auM -aIA -aIA -aIA -aIA -aIA -aIA -aIA -auM -aKc -aFP -aKu -aVA +fFr +fFr +fFr +fFr +fFr +fFr +fFr +fFr +fFr +fFr +tur +uXH +aMQ +aMQ +aqf +rJC +aUo +awr +aUo +aGk +aqf +ayI +ayI +ayI aFP -azk +aMJ aFP aFP aFP -ajj -aEQ -aNK -umm -aTV -arh -aAr -umm -umm -umm -umm -umm -umm -ajj -aCa -aFP +ayI +aWo +ayI +aPf +aPf aFP aPf ajj -asw -asw -asw -asw -asw -asw -asw -asw -asw -asw +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -57538,49 +61833,49 @@ aiw aJT aJT aJT -aJT -aYA +gdL +aiw aYA aJT awm -ald -aFP -aFP -aFP -aFP +aJT +wWm +mLK +iTA +mza +aqf +aqf +aqf +aqf +dau +aqf +aqf +ayI +ayI aFP +auf +kWr aFP +kWr aFP aFP -ajj -aRH -iqY -pux -aGL -aVS -aAr -umm -kYn -aYc -fvx -aDB -umm -ajj -ajj -alF +aPf +ayI +aPf +auf aFP aLH ajj -asw -azB -azB -aCS -azB -azB -aCS -azB -azB -asw +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -57802,42 +62097,42 @@ aqf aqf aqf aqf +lwv +sAC +lwv +aqf +ufz +nps +vxF +pej +aqf +kWr +ayI +ayI aFP aFP -alk -aFP -arT -aFP -aFP -ajj -agb -aEf -nii -aGL -aSP -aRd -akS -aQQ -aQQ -aQQ -aUd -umm -ajj -ajj -aIV +aqf +aqf +aqf +aqf +aqf +aqf +ejQ +aqf +aqf aVA aFP ajj -asw -azB -azB -azB -azB -azB -azB -azB -azB -asw +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -58059,42 +62354,42 @@ aUo ayo ahY aqf +aUo +aUo +aUo aqf -ang +bcb +bcb +bcb +pej aqf +ayI +ayI +ayI +kWr +vUv aqf -aaY -aaY -aaY -ajj -smA -afB -umm -aTI -aCY -aRx -umm -jdx -aQQ -qHc -mLK -umm -ajj -ajj -aBr -aFB +aUo +aUo +aUo +aWf +jQJ +aUo +sHR +aqf +ahU akp -aFP -asw -azB -azB -azB -azB -azB -azB -azB -aOc -asw +ajj +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -58296,7 +62591,7 @@ auU aqf aDr aUo -aCD +bwG aNi aUo aUo @@ -58320,38 +62615,38 @@ aqy aUo agr aqf +rTU +bcb +bcb +pej +aqf +ayI +ayI +ayI aFP +xFE +aqf +aHM +aUo +axo +aLe +aUo +aUo +aUo +iQp aFP aFP ajj -ajj -ajj -umm -umm -umm -umm -umm -umm -akS -umm -umm -umm -ajj -ajj -ayd -aFP -agy -aFP -asw -azB -azB -azB -azB -azB -azB -azB -azB -asw +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -58577,38 +62872,38 @@ aPK aUo awQ aqf +sRt +btN +bcb +ujV +aqf +auf +ayI +ayI aFP aFP +aqf +aUo +aUo +vUu +bwG +bwG +aUo +aUo +iQp +hpP aFP -awU -ajj -ajj -ajj -ajj -ajj -ajj -umm -aqV -aGL -aHY -aZz -umm -umm -ajj ajj -ahU -aFP -aFP -aYQ -azB -azB -azB -azB -azB -azB -azB -azB -asw +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -58813,7 +63108,7 @@ aUo aUo aUo aUo -aCD +bwG wDG aUo aUz @@ -58834,38 +63129,38 @@ aYj aUo aKD aqf -aFP -aFP -aFP -aFP -aFP -aFP -aIm -aqP -azC +aqf +aqf +aqf +aqf +aqf +aqf +kWr ayI +aFP +kWr +aqf +nii +aUo umm -azj -awW -aOW -aMV -jQJ -umm -ajj -ajj +aRo +bwG +aUo +aUo +iQp aFP aLH -aFP -asw -aOG -azB -azB -azB -azB -azB -azB -azB -asw +ajj +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -59070,7 +63365,7 @@ aUo aUo aUo aUo -aCD +bwG wDG aUo aUo @@ -59091,38 +63386,38 @@ aXd aUo aQa aqf -aLH -aFP -aFP -aFP +dyU +bQR +paj +fPs +amF +aqf aFP +ayI aFP aFP -aIm -azC -ayI -akS -aGL -atJ -axo -aLe -alH -umm -ajj -ajj +aqf +sFB +aUo +aMV +bwG +bwG +aUo +aCF +aqf aAc -aFP -awU -asw -aOG -azB -azB -azB -azB -azB -azB -aOc -asw +auf +ajj +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -59327,7 +63622,7 @@ aid aUo aUo aid -aCD +bwG wDG aUo aUo @@ -59347,39 +63642,39 @@ aqf aqf aUo aqf +aPZ +dDF +jYf +xga +amF +amF aqf aFP -aFP -aFP -aFP -aFP -aIm -aFP -aRP -azC ayI -umm -aFN -akS -umm -aHj -umm -umm -ajj -ajj -agy +aFP +auf +aqf +aZW +aUo +eIq +pUJ +aUo +aUo +aUz +aqf +npr aFB ajj -asw -aQM -aQM -azB -azB -azB -azB -azB -azB -asw +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -59605,38 +63900,38 @@ aIU aUo bNi aqf -ahQ -aFB +bZt +qPy +clF +amF +amF +ahP aFP +ayI +ayI aFP +aqf +aYO +aUo +aCo +aUo +aUo +aUo +aUo +pcp +jbu +vyS ajj -ajj -ajj -ajj -ajj -ajj -umm -aGL -aGL -umm -umm -umm -umm -umm -ajj -ahQ -aNk -ajj -asw -aQM -aQM -afx -azB -azB -afx -azB -azB -asw +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -59841,7 +64136,7 @@ aPo aUo aUo aUo -aCD +bwG wDG aUo aUz @@ -59862,38 +64157,38 @@ aUo aUo jeI aqf -atQ -aFP -aLH -ajj -ajj -umm -umm -umm -umm -umm -umm -aGL -aGL -umm -vqx -vUu -tKt -umm -ajj -akp +aqf +aqf +amF +amF +amF +aqf +kWr +ayI +ayI aFP +aqf +aqf +aqf +aqf +dIR +aqf +aqf +aqf +aqf +caY +aWy ajj -asw -asw -asw -asw -asw -asw -asw -asw -asw -asw +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -60098,7 +64393,7 @@ aqf aRt aUo alM -aCD +bwG wDG aUo aUo @@ -60119,27 +64414,27 @@ aGY aUo jeI aqf -aFP -aFP -aFP -ajj -ajj -umm -aYk -agk -aPx -aPx -umm -aZW -aGL -umm -pUJ -pUJ -dUh -umm -ajj -aFP -aFP +dbn +axD +amF +amF +amF +aqf +lwv +lwv +npr +lwv +aqf +aRx +axD +amF +amF +qHc +aqf +tgU +aMQ +ozJ +aCU ajj ajj ajj @@ -60376,27 +64671,27 @@ aUo aUo jeI aqf -aFP -aFP -aFP -ajj -ajj -umm -ayt -aCU -aPx -aPx -aDQ -aGL -aGL -aoE -pUJ -pUJ -neb -umm -ajj -aaY -aOz +sys +aqf +amF +ioZ +aqw +aqf +cDr +tzR +tzR +tzR +aqf +qWc +aqf +amF +bTK +xQK +aqf +xec +caY +kgI +alF ajj ajj ajj @@ -60633,27 +64928,27 @@ aUo aUo jeI aqf -aFP -aFP -aBr -ajj -ajj -umm -aCF +aqf +aqf +aqf +aqf +aqf +aqf +avl +fjN aMQ -aPx -awY -umm -aGL -aGL -umm -ahk -amu -nKz -umm -ajj -akp -aFP +fjN +aqf +aqf +aqf +aqf +aqf +aqf +aqf +srA +caY +wcd +aNk ajj ajj ajj @@ -60890,27 +65185,27 @@ aUo aUo aqf aqf -aFP -aLH -ayd -aFP ajj -umm -umm -umm -umm -umm -umm -umm -umm -umm -umm -umm -umm -umm ajj -agy -aFP +ajj +ajj +ajj +ajj +ajj +amx +uXK +amx +lwv +ajj +ajj +ajj +ajj +ajj +ajj +ajj +ajj +ajj +ajj ajj ajj aaa @@ -61131,44 +65426,44 @@ rUT ayy aeZ aqf -aCa -aFP -azY -azY -azY -aFP -aFP +pwO +wVd +aYc +aYc +aYc +kZK +bON aqf aAX ajx -aCo +aUo aUo aUo xqI aqf -awU -aFP -aFP -aFP -aFP -ajj -ajj -ajj -ajj -ajj -ajj -ajj -ajj -ajj -ajj -ajj -ajj -ajj +vTT +vTT +vTT +vTT +vTT +vTT +vTT +vTT +pWF +ayI +ayI +ayI +dUh +pib +pib +pib +aDB +aAd +aAd +izJ +izJ +amx ajj -aFP -aFP -ayd -aFP ajj aaa aaa @@ -61388,44 +65683,44 @@ aqf aTb aqf aqf -aFP -aFP -azY -azY -azY -aFP -aFP -aqf +ayt +qVU +qVU +qVU +qVU +qVU +aJP aqf aqf aqf +aHM +aUo aUo avu aqf -aqf -aFP -aFP -aFP -aFP -aFP -aFP -aFP -ajj -ajj -ajj -ajj -ajj -ajj -ajj -ajj -ajj -ajj -aFP -aFP -aFP -aLH -aFP -ajj +vTT +kJu +ahY +awr +vTT +aJX +xGO +vTT +vTT +vTT +vTT +vTT +amx +aAd +aAd +aAd +aSZ +aDB +aAd +aAd +aEX +amx +amx ajj aaa aaa @@ -61632,57 +65927,57 @@ aPf aPf aPf aPf -ajj -aIr -aIr -aIr -aIr -aIr -aIr -aIr -aIr -aIr -aIr -aIr +ekp +ayI +ayI +ayI +ayI +mfu +tsx +tsx +tsx +tsx +tsx +tsx aBa -aFP -aFP -aFP -azY -azY -aFP -aAz -aFP +aqX +qVU +vhm +rOn +mxd +qVU +tct aqf aAX ajx aUo +aUo +aUo aCR aqf -aFP -aFP -aFP -aFP -alo -ahQ -aNk -arT -aLH -aFP -aFP -aFP -aFP -ahQ -aFP -agy -aFP -ahQ -aFP -agy -aFP -aFP -ahs -ajj +vTT +pqy +bwG +aUo +vTT +atF +ttN +vTT +dtr +rjk +dIM +vTT +amx +aiD +eFC +aAd +aAd +aCX +aDB +aAd +aAd +izJ +aAd ajj aaa aaa @@ -61889,57 +66184,57 @@ ayI aPf aPf aPf -ajj -aIr -aIr -aIr -aIr -aIr -aTp -aIr -aIr -aIr -aIr -aIr -aBa -awU -aFP -azY -azY -azY -aFP -aFP -aLH +ekp +ayI +ayI +hea +bNV +eTt +aTB +eTt +eTt +wIO +wIO +wIO +vzb +sUE +vhm +qdG +vdW +bUS +anz +apT aqf aqf aqf aTb +aTb +aTb +aTb aqf -aqf -aFP -aFP -aFP -aFP -aFP -aFP -aFV -avb -aFP -aFP -auf -alF -aeT -asX -ahU -aFP -ayd -asX -ahU -aFP -ayd -aFB -awV -ajj +vTT +qpx +aUo +aUo +rSu +nxR +pET +vTT +fpe +dOM +hTf +vTT +amx +gSB +rHH +izJ +aAd +aSZ +ayI +aDB +aAd +aAd +izJ ajj aaa aaa @@ -62147,56 +66442,56 @@ aPf aPf aFP agU -aIr -aIr -aIr +mPR +uIo +aSt aIr aIg aIg aIg aIr aIr -aIr -aIr -aBa -aFP -aFP -azY -azY -aBr -aFP -alF -aFP -aFP -aFP -aFP -aFP -aFP -alF -aFP -aFP -aFP -aFP -aLH -aFP -aFP -aFP -aFP -aFP -akp -aFP -aFP -aFP -aFP -aLH -aFP -aFP -aFP -aLH -aFP -aFP -aFP -awV +xnl +aSt +dzn +sUE +jtc +oVT +axC +gyS +nWn +kJw +dhi +avt +bLZ +uXF +uXF +afN +pUQ +aNk +vTT +saT +aVg +iqj +vTT +nxR +aTl +vTT +wZa +dOM +lHD +vTT +amx +amx +pCd +amx +amU +aAd +aCX +hRJ +aDB +aAd +aAd ajj aaa aaa @@ -62404,9 +66699,9 @@ aPf asX aFP agU -aIr -aIr -aIr +nXw +aSt +aSt aIr aIg aiM @@ -62415,45 +66710,45 @@ aIr aIr aIr aIr -aBa -aNk -azY -azY -azY -aFP -aFP -aeT -akp -agy -aFP -aFP -aFP -aFP -aeT -akp -aFP -aFP -aFP -aFP -aFP -aFP -aFP -aFP -aFP -agy -aFP -aFP -aFP -aeT -aMJ -ahs -aFP -aAc +nMw +sUE +jtc +pux +qhl +qnH +nWn +qVU +pkJ +iqT +aqV +dXe aFP aFP -ahQ -aFP -ajj +kWr +aqV +vTT +cxU +nyj +aCo +vTT +nxR +aTl +aAY +ycD +azj +sMF +vTT +pCd +mIp +lBn +pCd +izJ +aAd +cnz +hfJ +wkQ +aAd +aAd ajj aaa aaa @@ -62661,7 +66956,7 @@ aPf aFP aFP agU -aIr +nXw aIr aIr aqo @@ -62670,47 +66965,47 @@ aNy aDC aqo aIr -aIr -aIr +rzO +ddp aWP -azY -azY -azY -azY -aFP -aFB -aFP -axw -aFP -aBr -awN -aFB -aFP -aFP -axw -aKu -aQw -aFP -ahQ -aFB -aFP -aFP -aFP -aFP -aFP -ayd -aBp -aFP -aFP -aFP -aFP -aFP -agy -aFB -aeT -asX -ahU -ajj +sIZ +jtc +gyS +mZp +yde +nWn +qVU +qUK +ayI +aOz +ayI +ayI +aOz +ayI +pBW +aAv +vTT +vTT +vTT +vTT +nxR +aTl +vTT +vTT +sGb +vTT +vTT +pCd +lDo +awt +amx +aAd +rOQ +ayI +kLW +eNw +aAd +aAd ajj aaa aaa @@ -62918,7 +67213,7 @@ aFP aFP asX agU -aIr +gtO aIr aIr aDC @@ -62927,47 +67222,47 @@ aSi aDC aDC aIr +oja aIr -aIr -aBa -aMW -azY -azY -aeT -aFP -aIE -aNk -asX -nHH -aFP -ahQ -aFP -aFP -aNk -asX -aFP -aFP -aFP -atQ -aFP -aLH -aFP -aWj -aFP -aLH -aFP -aFP -aFP -aAc -aFP -akp -aFP -aFP -aFP -aFP +nMw +sUE +jtc +mBs +bHC +anD +nWn +qVU +pkJ +avt +kWr aFP +kWr aFP -ajj +ayI +ayI +rCf +tbI +aye +nKz +akS +nxR +qWv +rjk +rjk +rjk +lhK +vTT +pCd +nnJ +ayI +hMt +tMb +pib +uxZ +eNw +aAd +aAd +izJ ajj aaa aaa @@ -63175,7 +67470,7 @@ aFP amT aFP veh -aIr +gtO aIr aIr aDC @@ -63184,47 +67479,47 @@ aGL rne mYg aGC +baM aIr -aIr -aBa -aFP -aFP -azY -aFP -aFP -aFP -aFP -aKu -aFP -aeT -asX -ahU -aFP -aFP -aFP -aFP -ahQ -aFP -aFP -aKu -aFP -aAc -aFP -aFP -aFP -aFP -aFP -aFP -aFP -aFP -aFP -aFP -aFP -aFP -aFP -aCM -aFB -ajj +tvh +eNI +jtc +qnH +vdW +axC +nWn +kJq +jgG +iJK +nlB +ahI +aCw +kWr +ayI +ayI +rCf +gnv +hTD +aTl +akS +nxR +dOM +dOM +pdt +dOM +aTl +aAv +amx +amx +pCd +amx +jxl +aAd +aoE +aAd +aAd +izJ +izJ ajj aaa aaa @@ -63426,13 +67721,13 @@ aaa ajj aPf aPf -aPf +ayI ajj aFP aFP aFP agU -aIr +gtO auH aDC aDC @@ -63443,45 +67738,45 @@ aDC aDC aVk aIr -aBa -aFP -aFP -azY -awU -aFP -aFP -aTl -aFP -alf -nHH -aFP -aFP -aFP -aKu -aFP -aeT -asX -ahU -aFP -aFP -aSs -aSs -aFP -arT -agy -aBr -ahQ -aFP -aFP -aFP -aFP -alF +tvh +nlv +jtc +yde +erR +oVT +nWn +hOy +ekp +aTv +nUS aFP -aeT aFP -aMJ aFP +ayI +qiI +aAv +xTZ +hdV +awW +vTT +eAq +qrK +azj +azj +azj +fFL +vTT ajj +izJ +aAd +izJ +izJ +aAd +aoE +aAd +rnM +amx +amx ajj aaa aaa @@ -63689,55 +67984,55 @@ ajj kMV aFP agU -aGR -aDC -aDC -aDC +hpl +rXY +rXY +rXY aox aGL apn -aDC -aDC -aDC +rXY +rXY +rXY aGR -aBa -aFP -aFP -azY -azY -akp -lXl -prT -aFP -avb -ahs -aFP -aAc -aFP -aFP -alf -aFP -aFP -aFP -aFP -ahs -aFP -aAc -aFP -aFP -aFP -aFP -aFP -azk -aFP -ahA -agy -aIV -aFP -aFP -aFP -aFP -aFP +tvh +ifZ +jtc +bHC +fOu +axC +nWn +qHT +vTT +mwo +kWb +gzT +ayI +ayI +ayI +kMw +aZq +lNi +dOM +rpX +vTT +rzT +aTl +vTT +vTT +oRX +vTT +vTT +ajj +amx +cEt +aAd +izJ +aAd +aoE +aAd +izJ +amx ajj ajj ajj @@ -63938,7 +68233,7 @@ aaa aaa aaa ajj -ayI +aPf ayI ayI ayI @@ -63946,55 +68241,55 @@ ajj aFP aFP agU -aIr +gtO aCs aCs -aDC +rXY akf aGL awA -aDC +rXY aCs aCs aIr -aBa -aFP -aFP -azY -azY -aFP -aFP -aFP -aIV -ahQ -aFP -aFP -agy -aFP -aFP -avb -ahs -aFP -aAc -aFP -aFP -aFP -aFP -aFP -aFP -aFP -aSs -axA -axA -axA -axA -axA -aBr -aFP -aFB -akp +tvh +ayt +jtc +jdx +yde +jdx +nWn +xuk +azC +bVx +aUo +xoB +kMw aFP -aBr +aOz +lWZ +aZq +aCY +dOM +sPA +aAv +bVn +aTl +vTT +kHi +rNR +vUI +vTT +ajj +amx +yjC +lXl +aAd +lgt +nzn +lXl +izJ +ajj ajj ajj ajj @@ -64195,64 +68490,64 @@ aaa aaa aaa ajj -ayI -aPf aPf -aWo +ayI +ayI +ayI ajj aFP aeT agU -aIr +gtO aPU aMR -aDC +rXY ani aGL aGL -aDC +rXY aPU aMR aIr -aBa -aFP -aFP -aFP -azY -azY -ahQ -aFP -aFP -aFP -aFP -alo -ahQ -aFP -aIV -ahQ -aFP -aFP -agy -aFP -avb -aFP -aIE -aFP -aFP -aFP -aFP -axA -ekp -mtr -tfI -axA -ayd -aFP -aFP -aFP -aFP -aFP +tvh +eNI +jtc +xbn +itm +rvn +nWn +xDp +vTT +feU +aUo +nng +nPr aFP +ayI +qAg +vTT +gmE +azj +rnK +vTT +iWH +aTl +vTT +aHY +afy +aFK +vTT +ajj +pCd +amx +amx +pCd +pci +pCd +amx +aAd +ajj +aUm ajj ajj ajj @@ -64452,72 +68747,72 @@ aaa aaa aaa ajj -ayI aPf ayI ayI +ayI ajj aFP aFP agU -aIr +gtO wfN wfN -aDC +rXY aNy aNy aNy -aDC +rXY wfN wfN aIr -aBa -ahs -aFP -aFP -azY -azY -azY -aeT -aFP -akp -aFP -aFP -aFP -aFP -aFP -aFP -aFP -aFP -aFP -auf -aFP -aFP -aFP -aFP -aVA -aFP -ahQ -axA -lLN +tvh +sUE +jtc +fOu +vdW +yde +nWn +hOy +vTT +foq +awv +aer +agA +kWr +ayI +kWr +vTT +vTT +vTT +vTT +vTT +nxR +pET +vTT +orh +atJ +xnI +vTT +vTT pCd +aAJ +qKi +dNn +ayI +dNn pCd -axA -aFP -aFP -aFP -aFP -aFP -aFP -aFP -aFP -aDa +aAd +ajj aUm aUm -apX +aDa +aUm aHZ aQf gjj +aUm +aUm aGw aUm aUm @@ -64709,15 +69004,15 @@ aaa aaa aaa ajj -ayI aPf ayI +ayI ajj ajj aeT aFP agU -aIr +gtO aIr aIr aDC @@ -64728,46 +69023,44 @@ aDC aIr aIr aIr -aBa -aFP -aFP -aFP -aFP -azY -azY -azY -aFB -aFP -aFP -aLH -aFP -axA -axA -axA -axA -axA -axA -axA -aIV -aFP -aFP -aSs -aFP -aAz -aFP -axA +tvh +sUE +alW oVT -pCd -sfN -axA -aLH -aFP -aFP -aBr -aFP +alo +qnH +nWn +apT +vTT +vTT +vTT +vTT +vTT +aqV +ayI +aqV aFP aFP -aUm +kWr +ski +vTT +sYY +xDR +vTT +nYp +afy +wLx +uew +vTT +pCd +nis +aKQ +vQH +ayI +aNd +amx +aAd +ajj aUm aUm aUm @@ -64775,7 +69068,9 @@ aSq ofJ aQf gjj -axa +aOO +aUm +aUm aUm aUm aUm @@ -64966,16 +69261,16 @@ aaa aaa aaa ajj -ayI aPf +ayI aWo ajj aFP aFP asX agU -aIr -aIr +nXw +lro aIr aAh aIr @@ -64983,58 +69278,58 @@ aIr aIr aAh aIr +lro aIr -aIr -aBa -aFP -akp -aFP -alF -azY +dzn +sUE +alW +yde +bHC +gyS +nWn +apT +vTT +bBV +saT +rNs +vTT +aqV +ayI +iqT +aFP +cgU +kMw +kWr +vTT +vTT +vTT +vTT +gCQ +afy +wLx +nHH +vTT +pCd azY -afN -aVA -ahA -agy -aIV -ahQ -axA -aNd -axA -aSH -afs -hTD -axA -aFP -aFP -pET -aFP -avb -aFP -axA -axA -axA -rYj -axA -axA -aFP -aCM -aeT -aFP -aFP -aFP +aKQ +biB +ayI +lDo +pCd +aAd +ajj aUm aRe aUm -sQX -aqQ aHZ aQf -aVv -aRS +aQf +gjj axa +sQX +aUm +aUm aUm -aDa aUm aUm aUm @@ -65223,73 +69518,73 @@ aaa aaa aaa ajj -ayI aPf +ayI aWo awV aFP asX aFP agU +nXw +aSt +aSt +aSt aIr aIr aIr aIr -aIr -aIr -aIr -aIr -aIr -aIr -aIr -aBa -aFP -aFP -aLH -aAc -auf -azY -azY -avb -aFP +aSt +aQE +aQE +jEk +gRb +alW +qnH +pux +gyS +nWn +rkW +vTT +xIx +adu +aUo +rYj +ayI +ayI +kWr aFP -aBr -atQ -axA -aVC -aOY -aSC aSC -aHJ -sMF -aFP -aVA -aFP -aVA -aFP -aFP -axA -sto -iYC -grr -gPj -axA -akp -aFP -aFP -aMJ -aFB -aFP +mGn +udI +cgU +kWr +wCC +vTT +qwJ +bIL +owJ +ggx +vTT +pCd +qBC +ayI +mgr +ayI +fbz +pCd +foJ +ajj aDa aUm -aUm -aUm -apX +aqQ aHZ aQf +aQf gjj -aOO +aGw aUm +aDa aUm aUm aUm @@ -65480,71 +69775,71 @@ aaa aaa aaa ajj -ayI aPf +ayI aPf ajj ajj aFP aFP agU -aIr -aIr -aIr -aIr -aIr +qze +kKs +kKs +use +jfl aTp -aIr -aIr -aIr -aIr -aIr -aBa -aeT -ahs -aMW +jfl +kKs +fCz +ayI +ayI +eaJ +mRV +cqw +xCO +xCO +xCO +oYg +qHT +vTT +aHM +aUo +aUo +vTT +kWr +ayI aFP -azk -azY -azY -azY -arT -aLH -ayd aFP -axA -axA -axA -axA -aNa -axA -axA aFP -aIE -aFP -auf -aAc -aIV -pBW -sFF -ppR -uIf -ycB -gSD -agy +qAg aFP aFP aFP -aeT -aFP -aUm +kWr +vTT +vTT +vTT +vTT +vTT +vTT +pCd +amx +amx +amx +ayI +gZM +amx +amx +ajj +ajj aUm aUm -apX -aSq -ofJ -aVv -aRS +aCv +bFi +aQf +gjj +aJh aUm aUm aUm @@ -65737,7 +70032,7 @@ aaa aaa aaa ajj -ayI +aPf ayI aPf aPf @@ -65745,69 +70040,69 @@ ajj ajj aFP agU -aIr -aIr -aIr -aIr -aIr -aIr -aIr -aIr -aIr -aIr -aIr -aBa -alf -aFP -aVA -aFP -aFP -agy -azY -azY -azY -azk -aFP -aFP -auf -axA -aHi -atF -atF -atF -axA -aIV -aFP -aKu -aFP -pET -aFP -pQp -bTK -ppR -pkJ -aAJ -gSD -aFP -ayd -aBp +ayI +ayI +ayI +mSQ +aQE +aQE +jYy +ayI +ayI +ayI +ayI +eaJ +sfd +aZU +vgQ +vgQ +vgQ +hXd +ikl +vTT +kpY +qFt +awr +vTT +wjI +aOz aFP +kWr aFP +kWr +ybS +kWr aFP +kWr +aDl +vTT +ldK +hqp +fXi +vTT +ajj +pCd +cXb +nJO +ayI +ayI +qMl +lBn +pCd +ajj aUm aUm -aUm -aSq -ofJ +aLQ +aHZ aQf -gjj -aOO -aUm -aUm -aUm +aLD +aKP +axa aUm aUm +aRe aUm +cZJ aUm ajj aaa @@ -65994,75 +70289,589 @@ aaa aaa aaa ajj +aPf +ayI +ayI +ayI +aPf +ajj +ajj +ekp +ekp +ekp +ekp +ekp +ekp +ekp +ekp +ekp +ekp +ekp +ekp +ekp +vTT +vTT +vTT +vTT +vTT +vTT +vTT +vTT +vTT +vTT +vTT +vTT +amk +ayI +ayI +ayI +ayI +ayI +ayI +ayI +aOz +aFP +aFP +vTT +vTT +vTT +uJK +vTT +ajj +pCd +hxm +aHl +qVO +ayI +ayI +axF +pCd +ajj +aUm +aUm +aUm +aHZ +aQf +aQf +gjj +aGw +aUm +aUm +aUm +aUm +vYR +aUm +ajj +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +kjb +kjb +kjb +kjb +kjb +kjb +kjb +kjb +kjb +kjb +kjb +kjb +kjb +kjb +kjb +kjb +kjb +kjb +kjb +kjb +kjb +eof +eWR +uKw +lJi +ndy +kjb +kjb +kjb +kjb +kjb +kjb +kjb +kjb +kjb +kjb +kjb +xuY +hrS +hrS +hrS +kjb +kjb +kjb +kjb +kjb +kjb +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +"} +(206,1,1) = {" +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ajj +aPf +ayI +ayI +ayI +ayI +ayI +aPf +aPf +aPf +aPf +aPf +aPf +aPf +aPf +aPf +aPf +aPf +aPf +aPf +aPf +vTT +kxO +lAv +xsM +kdo +kfK +fAL +pLq +mCv +dRI +noy +vTT +aKu +ayI +ayI +ayI +aOz +ayI +ayI +ayI +ayI +ayI +aFP +iho +kWr +qBd +aFP +vTT +ajj +pCd +hQV +cna +oWR +ayI +ofw +hat +pCd +ajj +aUm +aUm +aUm +aCv +bFi +aQf +gjj +aJh +aUm +sQX +aUm +aUm +aUm +aUm +ajj +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +kjb +kjb +kjb +kjb +kjb +kjb +kjb +kjb +kjb +kjb +kjb +kjb +kjb +kjb +kjb +kjb +kjb +kjb +kjb +kjb +hrS +cNa +eWR +uKw +lJi +xfT +hrS +kjb +kjb +kjb +kjb +kjb +kjb +kjb +kjb +kjb +kjb +kjb +kjb +kjb +kjb +kjb +kjb +kjb +kjb +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +"} +(207,1,1) = {" +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ajj +aPf +aPf ayI ayI ayI ayI +ovH +rUA +qBC aPf -ajj -ajj -ajj -ajj -ajj -ajj -ajj -ajj -ajj -ajj -ajj -ajj -ajj -ajj -ajj -aMJ -aFP -aAc -aFP -ahs -aFP -azY -azY -azY -azY -azY -azY -azY -aVg -atF -aDl -abK -aMG -axA -aFP -aFP -aAc -aAz +aPf +aPf +aPf +aPf +aPf +aPf +aPf +aPf +aPf +aPf +vTT +oLI +sOj +qPk +pgm +xkO +sNh +mBM +aII +aUo +aII +vTT +aqV +ayI +kWr +gko +kWr aFP aFP -pQp -iGS -ppR -ppR -gLq -bGE +kWr aFP +ayI aFP aFP aFP -aAc aFP +kWr +vTT +ajj +amx +amx +amx +amx +amx +amx +amx +ajj +ajj aUm -aRe aUm +aUm +aLQ aHZ aQf -aQf -gjj -axa -sQX -aUm +aLD +aKP aUm aUm +aDa aUm aUm aUm @@ -66121,6 +70930,8 @@ aaa aaa aaa aaa +aaa +aaa kjb kjb kjb @@ -66139,14 +70950,13 @@ kjb kjb kjb kjb -kjb -kjb -kjb -eof +hrS +cNa eWR uKw lJi -ndy +xfT +hrS kjb kjb kjb @@ -66158,10 +70968,6 @@ kjb kjb kjb kjb -xuY -hrS -hrS -hrS kjb kjb kjb @@ -66202,8 +71008,11 @@ aaa aaa aaa aaa +aaa +aaa +aaa "} -(206,1,1) = {" +(208,1,1) = {" aaa aaa aaa @@ -66252,6 +71061,12 @@ aaa aaa ajj aPf +aPf +aPf +ayI +ayI +ayI +ayI ayI ayI ayI @@ -66259,65 +71074,59 @@ ayI ayI aPf aPf +aGb +pCd +aGb +pCd +aGb aPf -aPf -aPf -aPf -aPf -aPf -aPf -aPf -aPf -aPf -aPf -aPf -aFP -aFP -agy -aFB -aFP -aFP -aMJ -azY -azY -azY -aFP -aFP -aFP -axA -atF +vTT +sck +qWE +qWE +caJ +doA +doA +lvk awv -aye -aNz -axA -aFP -aAz +awv +aAq +vTT +kWr +ayI +ybS +dXe +aTG aFP +dXe aFP -aNk aFP -qWc -iJK -oWR -pBW -cXb -gSD +aOz aFP -ahs aFP +dXe aFP -azk +ybu +vTT +vTT +vTT +vTT +vTT +vTT +vTT +vTT +ajj +ajj +vqx aUm +aDa aUm aUm -aqQ aHZ aQf aQf gjj -aGw -aUm -aDa +axa aUm aUm aUm @@ -66378,6 +71187,9 @@ aaa aaa aaa aaa +aaa +aaa +aaa kjb kjb kjb @@ -66396,9 +71208,6 @@ kjb kjb kjb kjb -kjb -kjb -hrS cNa eWR uKw @@ -66420,9 +71229,9 @@ kjb kjb kjb kjb -kjb -kjb -kjb +aaa +aaa +aaa aaa aaa aaa @@ -66460,7 +71269,7 @@ aaa aaa aaa "} -(207,1,1) = {" +(209,1,1) = {" aaa aaa aaa @@ -66510,66 +71319,68 @@ aaa ajj aPf aPf +aPf +aPf +ayI +ayI +ayI +ayI +ayI +ayI ayI ayI ayI aPf -ovH -rUA -qBC -aPf -aPf -aPf -aPf -aPf -aPf -aPf -aPf -aPf +pCd +wtw +tDj +ssQ +pCd aPf +vTT +ptx +qDk +qVQ +lat +vNe +vNe +awU +doA +doA +doA +fUQ +ayI +ayI +gko aFP +iho +iho +dXe +dXe +kWr +ayI +kWr aFP aFP -ahQ -aNk -arT -aLH -afN -azY -azY -aFP -aFP -aFP -aFP -axA -axA -axA -axA -axA -axA -aFP -aFP -aFP -aFP -aIE -aVA -pBW -bTK -ppR -ppR -jgg -hge -aFB -bAr -aFP -aFP -aFP +kWr +aKu +kWr +aaY +qNZ +vTT +aUd +aEm +aYk +vTT aUm aUm aUm aUm -aCv -bFi +aUm +aUm +aqQ +aHZ +aQf aQf gjj aJh @@ -66578,8 +71389,6 @@ aUm aUm aUm aUm -aUm -aUm ajj aaa aaa @@ -66637,12 +71446,15 @@ aaa aaa aaa aaa +aaa +aaa kjb kjb kjb kjb kjb kjb +aaa kjb kjb kjb @@ -66653,21 +71465,11 @@ kjb kjb kjb kjb -kjb -kjb -hrS -cNa +dmO eWR uKw lJi -xfT -hrS -kjb -kjb -kjb -kjb -kjb -kjb +lAd kjb kjb kjb @@ -66716,8 +71518,15 @@ aaa aaa aaa aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa "} -(208,1,1) = {" +(210,1,1) = {" aaa aaa aaa @@ -66768,74 +71577,74 @@ ajj aPf aPf aPf -ayI aPf -ayI -ayI -ayI -ayI -ayI -ayI -ayI aPf +dai +aPf +aNU +aPf +aPf +aPf +kHZ ayI -ayI -aWo -awV -aFP -aFP -aeT -asX -avb -agy -aFV -avb -aFP -azY -azY -aFP -aFP -aFP -aFP -aeT -asX -ahU -aFP -aFP -aLH -aFP +aPf +pCd +tik +qgh +abK +pCd +aPf +vTT +ooW +ozR +pQp +qtz +gnq +aCa +bEV +doA +doA +lij +vTT aFP aFP +kWr aFP -aMJ +cgU +gsX +kWr +kWr aFP +ayI +ayI +ayI +ayI aFP -axA -wcd -aFy -wCC -nJO -axA -aNk -arT -aLH +cgU aFP -aFB +aaY +uoM +vTT +ycB +wYD +oBn +vTT +aRe aUm -aDa aUm aUm -aLQ +aUm +sQX +aUm aHZ aQf +aQf aLD aKP -axa aUm aUm -aRe aUm -cZJ +aUm aUm ajj aaa @@ -66895,6 +71704,16 @@ aaa aaa aaa aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa kjb kjb kjb @@ -66903,6 +71722,11 @@ kjb kjb kjb kjb +xuY +mXK +vxU +nER +xuY kjb kjb kjb @@ -66913,27 +71737,12 @@ kjb kjb kjb kjb -cNa -eWR -uKw -lJi -xfT -hrS -kjb -kjb -kjb -kjb -kjb -kjb -kjb -kjb -kjb -kjb -kjb -kjb -kjb -kjb -kjb +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -66974,7 +71783,7 @@ aaa aaa aaa "} -(209,1,1) = {" +(211,1,1) = {" aaa aaa aaa @@ -67026,74 +71835,74 @@ aPf aPf aPf aPf +aPf ayI +aPf +aPf +aPf +aPf +aPf +aPf +aPf +aPf +aGb +pCd +mfo +pCd +aGb +aPf +vTT +vTT +vTT +vTT +qtz +aLF +lYJ +mxI +wKT +wKT +vYV +vTT +mZu +jgg +wvy +iho +aTG +iho +gVD +ybu +kWr +gko +kWr +aOz ayI -ayI -ayI -ayI -ayI -ayI -ayI -ayI -ayI -aWo -awV -aFP -aFP -aFP -aFP -aAz -aFP -ahQ -aFP -aFP -azY -azY -awU -aFP -aFP -aFP -aFP -aFP -aFP -aFP -aLH -aAc -aFP -ahs -ahQ -aFP -aFP -aFP -xFZ -aFP -axA -axA -pBW -pBW -axA -axA -aFV -avb -aFP -ahQ -aIE -aFP +kWr +kWr +aaY +uoM +uoM +vTT +vTT +bvn +vTT +vTT +aUm aUm aUm aUm +aRe +aUm aUm aHZ aQf aQf +aQf gjj -aGw -aUm -aUm aUm aUm vYR aUm +aUm ajj aaa aaa @@ -67153,33 +71962,30 @@ aaa aaa aaa aaa -kjb -kjb -kjb -kjb -kjb -kjb +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa kjb kjb kjb kjb kjb -kjb -kjb -kjb -kjb -kjb -dmO -eWR -uKw -lJi -lAd -kjb -kjb -kjb -kjb -kjb +xuY +xuY +xuY +hLW +nyr +iBc +xuY +xuY +xuY kjb kjb kjb @@ -67230,8 +72036,11 @@ aaa aaa aaa aaa +aaa +aaa +aaa "} -(210,1,1) = {" +(212,1,1) = {" aaa aaa aaa @@ -67283,73 +72092,73 @@ aPf aPf aPf aPf -aPf -dai -aPf -aNU -aPf +ayI +ayI aPf aPf -kHZ -ayI +aGb +pCd +pCd +pCd +pCd +aGb +sto +hJz +nXu +uAN +bnI +aPf +aPf +aPf +vTT +vTT +vTT +vTT +vTT +vTT +vTT +vTT +vTT +vTT +vTT +vTT +vTT +vTT +vTT +vTT +vTT +vTT +iJK +pUQ +kWr +kWr ayI ayI -aWo -awV -auf -aFP -aAc -aFP -aLH -aFP -aFP -azY -azY -azY -aFP -aFP -aFP -aFP -aFP -ahs -aFP -aAc -aFP -agy -aFB -aFP -aAz -aFP -aFP -aFP -aFP -aFP -aFP -aFP -aFP -aFP -aLH -aFP -aFP -aFP -aFP -aFP -aFP -aFP +pUQ +oAt +uoM +kso +vTT +awY +gUZ +lkC +vTT aUm +aDa aUm aUm aUm -aCv -bFi -aQf -gjj -aJh aUm -sQX +aUm +aHZ +aQf +aQf +aVv +aRS aUm aUm aUm +cZJ aUm ajj aaa @@ -67419,29 +72228,29 @@ aaa aaa aaa aaa -kjb -kjb -kjb +aaa kjb kjb kjb kjb kjb xuY -mXK -vxU -nER +guS +hIU +hLW +uKw +iBc +hIU +guS xuY kjb kjb kjb kjb kjb -kjb -kjb -kjb -kjb -kjb +aaa +aaa +aaa aaa aaa aaa @@ -67488,7 +72297,7 @@ aaa aaa aaa "} -(211,1,1) = {" +(213,1,1) = {" aaa aaa aaa @@ -67538,74 +72347,74 @@ aaa ajj aPf aPf -aPf -aPf -aPf +ayI +ayI ayI aPf aPf aPf +pCd +lgm +ssQ +mBS +aHJ +nXu +cMM +gmD +pPH +gxX +kYn aPf aPf aPf -aPf -aPf -aPf -aPf -aPf -aPf -aMJ -aFP -aFP -aFP -aFP -aFP -azY -azY -aFP -aFP -aFP -aFP -aFP -aFP -aFP -aFP -agy -aFB -aFP -aFP -aFP -aFP -aFP -pET -aFP -aIV -aFP -aFP -aFP -aFP -alF -aFP -aFP -aFP -aFP -aFP -asF -aFP -aFP -aFP +vTT +neb +bsO +bWA +vTT +uIf +uIf +nkZ +uIf +vTT +mOW +prT +hgd +onU +xXU +ewl +gmU +vTT +gko +aNk +avt +ooY +aFP +dav +oAt +uoM +uoM +uoM +vTT +qGA +gUZ +aPV +vTT +aqQ aUm aUm aUm -aLQ +aUm +aUm +apX aHZ aQf -aLD -aKP -aUm +aQf +gjj +axa aUm -aDa aUm +aRe aUm aUm ajj @@ -67677,22 +72486,20 @@ aaa aaa aaa aaa +aaa kjb kjb kjb kjb -kjb -xuY -xuY xuY +cxX +kqL hLW -nyr +uKw iBc +kqL +iiV xuY -xuY -xuY -kjb -kjb kjb kjb kjb @@ -67744,8 +72551,10 @@ aaa aaa aaa aaa +aaa +aaa "} -(212,1,1) = {" +(214,1,1) = {" aaa aaa aaa @@ -67795,77 +72604,78 @@ aaa ajj aPf aPf -aPf -aPf +ayI ayI ayI aPf aPf aPf +pCd +ssQ +gxX +nXu +oBa +dYa +ncP +gxX +gxX +tik +cMM aPf aPf aPf -aPf -aPf -aPf -aPf -aPf -aPf -aPf -aIV -ahA -aFP -aFP -aFP -azY -arT -agy -aBr -aFP -aFB -akp -aFP -aFP -azk -ahQ -aNk -aFP -aVA -aIV -aFP -aFP -aFP -arT -agy -aBr -aFP -aFB -akp -aFP -aFP -aMJ -aFB -aFP -aFP -aFP -aFP -aFP +vTT +aUo +aUo +aUo +aNT +gSD +kzb +kzb +gSD +eqe +arh +uMR +aUo +aUo +qWG +arh +aXF +vTT aFP +avt +ppd +axA +kWr +anQ +uoM +uoM +uoM +aaY +vTT +vTT +hge +vTT +vTT aUm -aDa aUm aUm -aHZ -aQf -aQf -gjj -axa +aDa aUm aUm +aSq +ofJ +aQf +aVv +aRS +aqQ aUm +nap aUm aUm ajj +ajj +aaa aaa aaa aaa @@ -67934,25 +72744,24 @@ aaa aaa aaa aaa -kjb kjb kjb kjb kjb xuY -guS -hIU +uYx +kqL hLW uKw iBc -hIU -guS +kqL +uYx xuY kjb kjb kjb kjb -kjb +aaa aaa aaa aaa @@ -68002,7 +72811,7 @@ aaa aaa aaa "} -(213,1,1) = {" +(215,1,1) = {" aaa aaa aaa @@ -68052,80 +72861,80 @@ aaa ajj aPf aPf +dai +aPf ayI ayI -ayI -aPf -aPf -aPf -aPf -aPf -aPf -aPf -aPf -aPf aPf aPf +pCd +oSG +gxX +cMM +qdV +aGb +mSw +cMM +aSV +gsj +aGb aPf aPf aPf +vTT +wUt +aHi +aZz +vTT +uIf +kzb +kzb +gdN +vTT +arh +wOi +awv +ikE +bYx +arh +arh +skM +ayI +ayI aFP -aAz -ahs -aFP -aAc -azY -aFP -aFP -azY -ahQ -aFP -agy -aFP -aFP -aFP -aeT -asX -avb -agy -ahU -aFP -aAc -aFP -aFP -aFP -auf -ahQ -aFP -agy -aFP -aFP -aFP -aeT -asX -ahQ -aFP -agy -aFP +kWr +ayI +blD +uoM +uoM +aaY +gko aFP +qBd +ayI +ekp aUm aUm aUm +aUm +anr +aUm aqQ aHZ aQf -aQf -gjj -aJh -aUm -aUm +aVv +aRS +aUr aUm +sQX aUm aUm ajj -aaa -aaa -aaa +ajj +ajj +ajj +ajj +ajj aaa aaa aaa @@ -68197,13 +73006,13 @@ kjb kjb kjb xuY -cxX -kqL +mmL +wCl hLW uKw iBc -kqL -iiV +wCl +mmL xuY kjb kjb @@ -68259,7 +73068,7 @@ aaa aaa aaa "} -(214,1,1) = {" +(216,1,1) = {" aaa aaa aaa @@ -68313,72 +73122,75 @@ ayI ayI ayI aPf +fwu aPf +pCd +nXu +tik +nXu +xsf +aUw +hYn +pNf +auQ +pNf +uVm aPf -aPf -aPf -aPf -aPf -aPf -aPf -aPf -aPf -aPf -aPf -aPf -aFP -aFP -aFP -ahQ -azY -azY -aKu -aFP -aeT -asX -ahU -aFP -ayd -aBp -azY -aFP -aAz -aFP -ahQ -aFP -aFP -aFP -aFP -aKu -aFP -aeT -asX -ahU -aFP -ayd -aBp -aFP -aFP -aAz -asX -ahU -aFP -ayd -aFP -aUm -aUm -sQX -aUm -aHZ -aQf -aQf -aLD -aKP -aUm -aUm +aqf +aqf +aqf +aqf +djn +aqf +vTT +gdN +kzb +kzb +hKI +vTT +arh +arh +arh +arh +arh +arh +oPL +vTT +xyn +ayI +aOz +ayI +ayI +mYy +ppR +bSf +dNB +aOz +ayI +ayI +ayI +sFF aUm aUm +aRe aUm +rZY +ggb +ggb +ggb +ggb +ggb +ggb +geG +xFU +xFU +xFU +xFU +xFU +rPm +gCR +gCR +gCR ajj aaa aaa @@ -68447,9 +73259,6 @@ aaa aaa aaa aaa -aaa -aaa -kjb kjb kjb kjb @@ -68516,7 +73325,7 @@ aaa aaa aaa "} -(215,1,1) = {" +(217,1,1) = {" aaa aaa aaa @@ -68566,76 +73375,79 @@ aaa ajj aPf aPf -dai -aPf ayI ayI aPf aPf +ayI aPf +aGb +mwV +oUI +iro +gxX +tik +wlL +egn +bcE +aXn +jiN aPf -aPf -aPf -aPf -aPf -aPf -aPf -aPf -aPf -aPf -aFP -auf -aFP -ayd -azY -aLH -auf -alf -aFP -aFP -aFP -aLH -aFP -aFP -aFP -aAc -aFP -aLH -aFP -aFP -azY -ayd -aLH -aFP -alf -aMJ -aFP -aFP -aLH -aFP -aFP -aFP -aAc -aFP -aFP -aFP -aLH -aFP -aUm -aUm -aRe -aUm -aUm -aHZ -aQf -aQf -aQf -gjj +aqf +kPf +awN +fOr +doA +aqf +vTT +gdN +gSD +hds +ooD +vTT +aRC +oNz +oEm +oPL +arh +arh +qmG +vTT +aKu +avt +gko +kWr +vXr +iHv +uoM +uoM +oAt +ayI +ayI +ayI +ayI +aNF aUm aUm -vYR aUm aUm +rZY +wdo +wdo +wdo +wdo +wdo +wdo +geG +xFU +xFU +xFU +xFU +xFU +xFU +ipK +qoB +gCR ajj aaa aaa @@ -68704,25 +73516,22 @@ aaa aaa aaa aaa -aaa -aaa -kjb kjb kjb kjb xuY -mmL -wCl +dgo +kqL hLW uKw iBc -wCl -mmL +kqL +iiV xuY kjb kjb kjb -kjb +aaa aaa aaa aaa @@ -68773,7 +73582,7 @@ aaa aaa aaa "} -(216,1,1) = {" +(218,1,1) = {" aaa aaa aaa @@ -68826,73 +73635,76 @@ aPf ayI ayI ayI -aPf ayI +sGw +ikb +wmA +jOc +nXu +wFe +aHJ +pny +tjv +lhF +wqC +xlP +aNp aPf -aPf -axA -axA -axA -axA -axA -axA -axA -aPf -aPf -aPf -aFP -aFP -arT -azY -azY -aBr -aFP -avb -ahs -aFP -aAc -aFP -ahs -aFP -aFP -azk -alF -aFP -aFP -aFP -aFP -aFP -aBr -aFP -avb -ahs -aFP -aAc -aFP -ahs -aFP -aFP -azk -alF -aFP -aAc -aFP -ahs -aUm +aqf +hYP +vFM +xXU +doA +aqf +vTT +vTT +dPJ +vTT +vTT +vTT +prH +aKX +aKX +cqv +vFM +qUb +xXU +vTT +avt +amk +pUQ +aaY +iHv +uoM +uoM +uoM +tIM +pUQ +gko +kWr +aRd +ekp aUm +aqQ aUm aUm aUm +apX aHZ aQf aQf -aVv -aRS -aUm -aUm -aUm -cZJ +gjj +axa aUm +xFU +xFU +xFU +xFU +xFU +oei +gCR +gCR +gCR ajj aaa aaa @@ -68961,25 +73773,22 @@ aaa aaa aaa aaa -aaa -aaa -aaa kjb kjb kjb xuY -uYx -kqL +guS +hIU hLW uKw iBc -kqL -uYx +hIU +guS xuY kjb kjb kjb -kjb +aaa aaa aaa aaa @@ -69030,7 +73839,7 @@ aaa aaa aaa "} -(217,1,1) = {" +(219,1,1) = {" aaa aaa aaa @@ -69080,76 +73889,79 @@ aaa ajj aPf aPf +tUL ayI +tUL ayI aPf aPf -ayI -aPf -aPf -axA -aLz -aZq -aTD -aSt -aIN -axA -aPf +aGb +bqT +uAN +gZK +iro +uWe +tVM +sSe +amu +aNg +hbY aPf +aqf +hYP +fLD +bYx +doA +aqf +vTT +grr +aXR +amD +vIX +vTT +pGK +gSD +gSD +vZv +uMR +xfD +qWG +vTT +aaY +aaY +ovF +uoM +uoM +uoM +uoM +aaY +vXr +vXr +vXr aFP -aFP -agy -azY -azY -aFP -ahU -aIV -ahQ -aFP -aFP -agy -aFB -aFP -aFP -aFP -aFP -aeT -akp -auf -aFP -aFP -ahU -aFP -aIV -ahQ -azY -aFP -agy -aFB -azY -aFP -aFP -aFP -aeT -aFP -agy -aFB -aFP -aUm +ekp +ekp aUm aUm +cZJ aUm apX -aHZ -aQf +aSq +ofJ aQf -gjj -axa -aUm -aUm -aRe +aVv +aHD aUm aUm +xFU +xFU +xFU +xFU +xFU +xFU +wZh +mzs +gCR ajj aaa aaa @@ -69218,20 +74030,17 @@ aaa aaa aaa aaa -aaa -aaa -aaa kjb kjb kjb xuY -dgo -kqL -hLW -uKw -iBc -kqL -iiV +xuY +xuY +guS +nyr +uYx +xuY +xuY xuY kjb kjb @@ -69287,7 +74096,7 @@ aaa aaa aaa "} -(218,1,1) = {" +(220,1,1) = {" aaa aaa aaa @@ -69340,60 +74149,57 @@ aPf ayI ayI ayI -ayI -ayI +lgh aPf aPf -sSe -aCw -aEX -aPV -aIN -aIN -axA +pCd +gxX +gxX +lMj +cMM +aGb +hYn +xlS +hje +iOt +aGb aPf +aqf +wZw +dSf +mRb +eDy +aqf +vTT +hrt +aXR +aXR +nFi +vTT +pGK +gSD +gSD +vZv +uMR +xfD +qWG +vTT +uoM +uoM +uoM +uoM +uoM +uoM +uoM +ovF +aFP +vXr aFP -aFP -avb -aFB -azY -aLH -aFP -axw -aFP -aFP -aFP -azk -ahQ -aNk -arT -aLH -aFP -aFB -aFP -axw -aKu -aQw -aFP -aFP -axw -aFP -aFP -aFP -azk -ahQ -aNk -arT -aLH -aFP -aFB -bAr -azY -aBr -aFP +ekp +ekp +aUm aUm aUm -aDa aUm aUm aSq @@ -69401,16 +74207,19 @@ ofJ aQf aVv aRS -aqQ -aUm -nap +axa aUm aUm +xFU +xFU +xFU +xFU +xFU +xFU +gCR +gCR +gCR ajj -ajj -aaa -aaa -aaa aaa aaa aaa @@ -69481,18 +74290,18 @@ aaa kjb kjb kjb +kjb +kjb xuY -guS -hIU -hLW -uKw -iBc +cuF +kGL hIU -guS xuY kjb kjb kjb +kjb +kjb aaa aaa aaa @@ -69544,7 +74353,7 @@ aaa aaa aaa "} -(219,1,1) = {" +(221,1,1) = {" aaa aaa aaa @@ -69594,74 +74403,76 @@ aaa ajj aPf aPf -tUL +chT ayI -tUL ayI +ayI +jiQ aPf +pCd +gPD +dMl +xsf +gea aPf aPf -axA -anz -auQ -aNF -aIN -aIN -axA -aFP -aFP -aFP -aKu -azY -azY -aCM -aFP -aFP -aFP -akp -aFP -aFP -aFP -aFV -avb -aFP -ahQ -aIE -aNk -asX -aFP -aFP -aFP -aFP -aFP -aFP -akp -aFP -aFP -aFP -aFV -avb -aFP -ahQ -aIE -aNk +lMY +jDf +rjg +aPf +aPf +aqf +aqf +aqf +aqf +aqf +aqf +vTT +lhh +ikn +aXR +nFi +vTT +hYA +uUf +aNz +bvA +fLD +awv +bYx +vTT +uoM +uoM +uoM +qNZ +uoM +aMG +wns aFP aFP -ahQ +ekp +ekp +ekp +aUm +aUm +aUm aUm aUm -anr aUm -aqQ aHZ aQf -aVv -aRS -aUr +aQf +gjj +aOO aUm -sQX aUm aUm +xFU +xFU +qpu +qwo +tyG +iwF ajj ajj ajj @@ -69734,22 +74545,20 @@ aaa aaa aaa aaa -aaa +kjb kjb kjb kjb xuY xuY xuY -guS -nyr -uYx -xuY xuY xuY kjb kjb kjb +kjb +aaa aaa aaa aaa @@ -69801,7 +74610,7 @@ aaa aaa aaa "} -(220,1,1) = {" +(222,1,1) = {" aaa aaa aaa @@ -69851,76 +74660,78 @@ aaa ajj aPf aPf +vQH ayI ayI ayI -lgh +rfx aPf +aGb +pCd +pCd +aGb +kvU aPf aPf -axA -axA -axA -aIN -aIN -aIN -amU -azY -azY -azY -azY -azY -aFP -aFP -aFP -aFP -aFP -aMJ -aFP -aLH -aFP -aFP -aFP -aFP -aFP -aFP -aFP -aVA -aFP -aFP -aMJ -aFP -aFP -aFP -aFP -aFP -aLH -aFP -aFP -aFP -aFP -aFP -aFP -aFP -aMJ -aeT -aFP -xsM +ajj +ajj +ajj +ajj +ajj +ajj +vTT +vTT +vTT +vTT +vTT +vTT +vTT +vTT +vTT +vTT +vTT +vTT +vTT +vTT +vTT +vTT +vTT +vTT +vTT +ekp +ekp +ekp +mon +sUC +vXr +gko +vXr +aZs +ekp aUm -rZY -ggb -ggb -ggb -ggb -ggb -ggb -geG -xFU -xFU -xFU -xFU -xFU -rPm +aUm +aUm +aUm +aUm +aUm +cZJ +aSq +ofJ +aQf +aVv +aRS +aUm +aUm +dIw +aUm +kPg +gCR +gCR +gCR +gCR +gCR +gCR +gCR gCR gCR gCR @@ -69997,16 +74808,14 @@ kjb kjb kjb kjb -xuY -cuF -kGL -hIU -xuY kjb kjb kjb kjb kjb +kjb +kjb +aaa aaa aaa aaa @@ -70058,7 +74867,7 @@ aaa aaa aaa "} -(221,1,1) = {" +(223,1,1) = {" aaa aaa aaa @@ -70108,78 +74917,80 @@ aaa ajj aPf aPf -chT ayI +wnj ayI ayI -jiQ aPf aPf -axA +aPf +aPf +aPf +aPf +aPf +aPf +aPf +ajj +aaa +aaa +aaa +aaa +ajj +ajj +ajj +ajj +ajj +ajj +ajj +ajj +ajj +ajj +ajj +ajj +ajj +ajj +ajj +ajj +ajj +ajj +ajj +ajj +ajj +ajj +ekp +ekp +roh +iJK alb -aOY -aIN -aIN -aIN -axA -awU -aFP -aFP -aFP -aFP -aFV -ahQ -aFP -aFP -aFP -aFP -alF -aFP -aFP -aFP -aMJ -aFP -asF -aFP -aeT -ayd -aLH -aFP -aFP -aFP -aFP -aFP -aFP -alF -aFP -aFP -aFP -aFP -aFP -asF -aFP -aeT -aFP -aFP -aFP +ekp +ekp +ekp aUm aUm -rZY -wdo -wdo -wdo -wdo -wdo -wdo -geG -xFU -xFU -xFU -xFU -xFU +aUm +aUm +aSq +uxW +uxW +ofJ +aQf +aQf +gjj +aGw +aUm +aUm +aUm +pZn xFU -ipK -qoB +gCR +lXo +aAO +bhr +pKF +ncr +gCR +avn +dcP gCR ajj aaa @@ -70249,20 +75060,18 @@ aaa aaa aaa aaa -aaa kjb kjb kjb kjb -xuY -xuY -xuY -xuY -xuY kjb kjb kjb kjb +kjb +kjb +kjb +aaa aaa aaa aaa @@ -70315,7 +75124,7 @@ aaa aaa aaa "} -(222,1,1) = {" +(224,1,1) = {" aaa aaa aaa @@ -70365,78 +75174,80 @@ aaa ajj aPf aPf -vQH -ayI -ayI -ayI -rfx +aiA +aiA +aiA +aiA +aiA +aiA aPf aPf -axA -pGK -axA -aIN -aWp -aJP -axA aPf aPf -aFP -aFP -aAc -aFP -aFP -azk -auf -ahA -agy -aIV -ahQ -aFB -aFP -aFP -aFP -aLH -aFP -aFP -aFP -aFP -aFP -aFP -azk -aFP -ahA -agy -aIV -ahQ -aFB -aFP -aFP -aFP -aLH -aFP -aFP -aFP -aFP -aUm -aUm +aPf +aPf +aPf +ajj +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ajj +ajj +aXW aUm aUm -apX -aHZ +sQX +ajj +ajj +ekp +ekp +ekp +ekp +ekp +ajj +ajj +axJ +axJ +axJ +aSq +ofJ aQf aQf -gjj +aQf +aQf +aVv +aRS axa +rPh +dOC +crI aUm -xFU -xFU -xFU -xFU -xFU -oei -gCR -gCR +uCw +bXF +noq +noq +noq +noq +noq +kGT +aNY +cwh gCR ajj aaa @@ -70516,10 +75327,8 @@ kjb kjb kjb kjb -kjb -kjb -kjb -kjb +aaa +aaa aaa aaa aaa @@ -70572,7 +75381,7 @@ aaa aaa aaa "} -(223,1,1) = {" +(225,1,1) = {" aaa aaa aaa @@ -70622,78 +75431,80 @@ aaa ajj aPf aPf -ayI -wnj -ayI -ayI -aPf -aPf -aPf -axA -axA -axA -axA -axA -axA -axA -aPf -aPf +aiA +aiA +aiA +aiA +aiA +aiA +aiA +aiA +aiA +aiA +aiA +xWg aPf -aLH -aFP -aFP -aFP -asX -aFV -aFP -aFP -aBr -atQ -aFP -aLH -aFP -aWj -aFP -aFP -aFP -aFP -aFP -aFP -aFP -asX -aFV -auf -aFP -aBr -atQ -aFP -aLH -aFP -aWj -aFP -aTu -aFP -aFP +ajj +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ajj +aEO +aXA aUm aUm aUm aUm -apX +ajj +ajj +ajj +ajj +ajj +ajj +ajj +ajj aSq +uxW +uxW ofJ aQf aVv -aHD +twL +twL +twL +aRS aUm +axa +lCi +vgx +srS aUm -xFU -xFU -xFU -xFU -xFU -xFU -wZh -mzs +uCw +bXF +noq +iwU +tHO +noq +vuq +gCR +qnA +aNY gCR ajj aaa @@ -70765,17 +75576,15 @@ aaa aaa aaa aaa -kjb -kjb -kjb -kjb -kjb -kjb -kjb -kjb -kjb -kjb -kjb +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -70829,7 +75638,7 @@ aaa aaa aaa "} -(224,1,1) = {" +(226,1,1) = {" aaa aaa aaa @@ -70885,72 +75694,74 @@ aiA aiA aiA aiA +aiA +aiA +aiA aPf +ayI +ayI aPf -aPf -aPf -aPf -aPf -aPf -aPf -aPf -aPf -aPf -aFP -aFP -aFP -aFB -aFP -aFP -arT -aLH -ayd -aFP -aKu -aFP -aAc -aFP -azk -aFP -aFP -aFP -aAz -asF -aFP -aFP -aFP -arT -aLH -ayd -aFP -aKu -aFP -aAc -aFP -aFP -aFP -aFP -aUm -aUm -aRe -pcp +ajj +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ajj aUm aSq +uxW +uxW +uxW +aRL +aKP +aUm +ajj +ajj +ajj +ajj +ifp +gUC ofJ aQf +aQf +aQf aVv aRS -axa +aOO +aUr +aUr +aUr +aUr aUm aUm -xFU -xFU -xFU -xFU -xFU -xFU +aUm +aUm +aUm +uCw +fbn +noq +noq +noq +noq +ueC gCR gCR +tVg gCR ajj aaa @@ -71024,14 +75835,12 @@ aaa aaa aaa aaa -kjb -kjb -kjb -kjb -kjb -kjb -kjb -kjb +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -71086,7 +75895,7 @@ aaa aaa aaa "} -(225,1,1) = {" +(227,1,1) = {" aaa aaa aaa @@ -71141,76 +75950,76 @@ aiA aiA aiA aiA -aPf -aiA aiA aiA aiA aiA -xWg aPf aPf -pNf aPf aPf -aFP -aFP -aFP -avb -aeT -aFP -aMJ -aFP -aFP -aFP -aFP -aFP -azk -auf -aLH -aFP -aTu -aBr -aFP -aFP -aFP -aeT -aFP -aFP -aMJ -aFP -aFP -aFP -azk -aFP -aFP -aLH -aFP ajj -aUm -axJ -axJ -axJ -anQ -aHZ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ajj +aSq +ofJ aQf aQf -gjj +aQf +aQf +aGB +uxW +uxW +ajj +lkn +fTV +fTV +fTV +lkn +aVv +twL +twL +aRS aOO aUm +eEg aUm +nDE +aUm +aUm +aUm +cZJ +vYR aUm xFU -xFU -qpu -qwo -tyG -iwF -ajj -ajj -ajj -ajj -ajj +gCR +tBo +noq +noq +noq +qWA +gCR +erP +aNY +gCR ajj aaa aaa @@ -71343,7 +76152,7 @@ aaa aaa aaa "} -(226,1,1) = {" +(228,1,1) = {" aaa aaa aaa @@ -71402,67 +76211,67 @@ aiA aiA aiA aiA +aiA aPf -ayI -ayI -aPf -aPf -aFP -awV -aFP -aFP -aFP -ahQ -aTB -aFP -aFP -aFP -aFP -aFP -aFP -aFP -aeT -aFP -ahA -aFP -aFP -aFP -aFP -aIE -aFP -aFP -aFP -aFP -aFP -aFP -aFP -aFP -aFP -aeT -aFP -ahA -aFP ajj ajj -axJ -axJ -aSq -uxW -uxW -ofJ +ajj +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ajj +aHZ aQf -aVv +aQf +aQf +aQf +aQf +aQf +aQf +aQf +tEg +aQf +lkn +fTV +mMx +twL aRS aUm +aAS +aUr aUm -dIw +mzR +eEg +fRe +nDE aUm -kPg -gCR -gCR -gCR +aDa +aUm +aUm +anr +aUm +xFU gCR gCR +uYJ +bXF +cBm gCR gCR gCR @@ -71600,7 +76409,7 @@ aaa aaa aaa "} -(227,1,1) = {" +(229,1,1) = {" aaa aaa aaa @@ -71650,80 +76459,80 @@ aaa ajj aPf aPf +aPf aiA aiA aiA +aPf aiA aiA aiA aiA aiA -aiA -aPf -aPf -aPf aPf -aFP -aFP -aPf -aPf -aMJ -aFP -aFP -aFP -aFP -aFP -aFP -aFP -aFP -aFP -aFP -aMJ -aFP -aFP -aFP -aFP -aFP -ajj -ajj -ajj -ajj -ajj -ajj -aFP -aFP -aFP -aFP -aFP -aFP -aFP -ajj ajj +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa ajj -axJ -axJ -aSq -ofJ +aHZ aQf aQf aQf aQf -gjj -aGw +aQf +aQf +aQf +aQf +tEg +aQf +aQf +lkn +ajj +ajj +aUm +aUm +aUm +aUm +aUm +aUm +aUm +aUm +aUm +aUm +aUm +sQX aUm aUm aUm -pZn +xFU +hAW +xFU +cVK +cVK xFU gCR -lXo -aAO -bhr -pKF -ncr -gCR -avn -dcP +hoV +noq +aNe gCR ajj aaa @@ -71857,7 +76666,7 @@ aaa aaa aaa "} -(228,1,1) = {" +(230,1,1) = {" aaa aaa aaa @@ -71907,20 +76716,10 @@ aaa ajj aPf aPf -aiA -aiA -aiA -aiA -aiA aPf -aiA -aiA -aPf -aiA aPf aPf aPf -aFP aPf aPf aPf @@ -71928,59 +76727,69 @@ aPf aPf aPf aPf -aPf -aFP -aFP -aFP -aFP -aFP -aFP -aFP -aFP -aFP -aFP -aFP -ajj -ajj -aXW -aUm -aUm -sQX -ajj -ajj -aFP -aFP -aFP -aFP -aFP ajj +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa ajj -axJ -axJ -axJ -aSq -ofJ -aQf +aCv +twL +bFi aQf aQf aQf aVv -aRS -axa -rPh -dOC -crI +twL +twL +ajj +ajj +ajj +ajj +ajj +ajj +ajj aUm -uCw -bXF -noq -noq -noq +vYR +aUm +aUm +aUm +aUm +aUm +aUm +aUm +fQt +aUm +aRe +aUm +aUm +kMe +xFU +xFU +xFU +xFU +xFU +ckg noq noq -kGT -aNY -cwh +qTu gCR ajj aaa @@ -72114,7 +76923,7 @@ aaa aaa aaa "} -(229,1,1) = {" +(231,1,1) = {" aaa aaa aaa @@ -72162,48 +76971,7 @@ aaa aaa aaa ajj -aPf -aPf -aPf -aiA -aiA -aiA -aPf -aiA -aiA -aiA -aiA -aiA -aPf -aPf -aPf -aFP -aFP -aPf -aPf -aPf -aPf -aPf -aPf -aPf -aPf -aPf -aPf -aPf -aFP -aFP -aFP -aFP -aFP -aPf -aPf ajj -aEO -aXA -aUm -aUm -aUm -aUm ajj ajj ajj @@ -72212,32 +76980,73 @@ ajj ajj ajj ajj -aSq -uxW -uxW -ofJ -aQf -aVv +ajj +ajj +ajj +ajj +ajj +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aSP +aSP +aSP +aSP +aUm +aUm +aCv twL twL twL aRS aUm -axa -lCi -vgx -srS aUm -uCw +ajj +ajj +ajj +ajj +ajj +ajj +ajj +aUm +cZJ +aUm +aDa +sQX +aUm +aUm +aUm +aUm +aUm +upo +hoi +aUm +upo +hoi +xFU +aLW +aLW +aLW +mEW bXF noq -iwU -tHO noq -vuq -gCR -qnA -aNY +fTu gCR ajj aaa @@ -72371,7 +77180,7 @@ aaa aaa aaa "} -(230,1,1) = {" +(232,1,1) = {" aaa aaa aaa @@ -72418,83 +77227,83 @@ aaa aaa aaa aaa -ajj -aPf -aPf -aPf -aPf -aPf -aPf -aPf -aPf -aPf -aPf -aPf -aPf -aPf -aPf -aPf -aPf -aFP -aqP -aWo -aPf -aPf -ajj -ajj -ajj -ajj -ajj -ajj +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aSP +aqf +aqf +aqf +aqf +aUm +aUm +anr +aUm +ydM +aUm +aUm ajj ajj ajj -aPf -aPf -aPf +jNB +ydM +fwr ajj ajj aUm aUm -aSq -uxW -uxW -uxW -aRL -aKP aUm -ajj -ajj -ajj -ajj -ifp -gUC -ofJ -aQf -aQf -aQf -aVv -aRS -aOO -aUr -aUr -aUr -aUr aUm aUm aUm aUm aUm -uCw -fbn -noq -noq +dIw +aUm +aqe +aqe +aUm +aqe +niQ +xFU +aLW +aLW +aLW +mEW +bXF noq noq -ueC -gCR -gCR -tVg +qaO gCR ajj aaa @@ -72627,8 +77436,41 @@ aaa aaa aaa aaa -"} -(231,1,1) = {" +"} +(233,1,1) = {" +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -72675,83 +77517,50 @@ aaa aaa aaa aaa +aSP +aqf +sNs +feR +aqf +grX +jZH +aUm +aRe +aUm +aUm +aUm ajj ajj ajj +cZJ +tLu +aUm ajj ajj -ajj -ajj -aPf -aPf -aPf -aPf -aPf -aPf -aPf -aPf -axA -axA -axA -axA -aYO -axA -axA -axA -axA -axA -axA -axA -axA -axA -axA -axA -ajj -ajj -ajj -ajj -asz +dIw aUm -aSq -ofJ -aQf -aQf -aQf -aQf -aGB -uxW -uxW -ajj -lkn -fTV -fTV -fTV -lkn -aVv -twL -twL -aRS -aOO aUm -eEg aUm -nDE aUm aUm aUm -cZJ -vYR aUm +aUm +aUm +mJG +lwc +aUm +mJG +lwc xFU -gCR -tBo -noq +aLW +aLW +aLW +fwc +bXF noq noq -qWA -gCR -erP -aNY +adt gCR ajj aaa @@ -72885,7 +77694,7 @@ aaa aaa aaa "} -(232,1,1) = {" +(234,1,1) = {" aaa aaa aaa @@ -72938,77 +77747,77 @@ aaa aaa aaa aaa -ajj -aPf -aPf -aPf -aPf -aPf -aPf -aPf -aPf -axA -aAv -atF -atF -atF -avt -amk -aSV -axA -axA -aNd -aOY -aSC -afs -hTD -axA +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aSP +aqf +hVq +aUo +aqf +jvm +aqf aUm aUm -aNq aUm aUm +ajj +ajj +ajj +ajj +cZJ +wZS +aUm +jzL +vEs +dIw aUm -aHZ -aQf -aQf -aQf -aQf -aQf -aQf -aQf -aQf -tEg -aQf -lkn -fTV -mMx -twL -aRS aUm -aAS -aUr aUm -mzR -eEg -fRe -nDE aUm -aDa aUm aUm -anr aUm xFU +puo +xFU +xFU +xFU +xFU +xFU +xFU +xFU +xFU +xFU +xFU gCR -gCR -uYJ -bXF -cBm -gCR -gCR -gCR -gCR +jAH +noq +mIk gCR ajj aaa @@ -73142,7 +77951,7 @@ aaa aaa aaa "} -(233,1,1) = {" +(235,1,1) = {" aaa aaa aaa @@ -73195,77 +78004,77 @@ aaa aaa aaa aaa -ajj -aPf -aPf -aPf -aPf -aPf -aPf -aPf -aPf -axA -lNi -atF -aEm -atF -hea -abK -aFK -axA -axA -aVC -axA -aSC -aSC -alW -sSe -aSZ -aUm +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aSP +aqf +sXR +uMR +aNq +aUo +aqf aUm aUm aUm aUm -aHZ -aQf -aQf -aQf -aQf -aQf -aQf -aQf -aQf -tEg -aQf -aQf -lkn ajj ajj +ajj +ajj +jNB aUm -aUm -aUm -aUm -aUm -aUm -aUm -aUm -aUm -aUm -aUm -sQX -aUm -aUm -aUm -xFU -hAW -xFU -cVK -cVK -xFU +fwr +ajj +gMw +gMw +gMw +gMw +gMw +gMw +gMw +kDh +gMw +lJK +gMw +gMw +gMw +gMw +gMw +gMw +gMw +pzq +gMw +iCz +gMw +gCR +gCR +gCR gCR -hoV -noq -aNe gCR ajj aaa @@ -73398,8 +78207,35 @@ aaa aaa aaa aaa -"} -(234,1,1) = {" +"} +(236,1,1) = {" +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -73452,46 +78288,15 @@ aaa aaa aaa aaa +aSP +aqf +mJB +uMR +lwt +lwt +aqf +ajj ajj -aPf -aPf -aPf -aPf -aPf -aPf -aPf -aPf -axA -aiD -atF -aQE -atF -abK -abK -aqw -axA -axA -axA -axA -axA -aNa -axA -axA -axA -aTG -axA -axA -aUm -aUm -aCv -twL -bFi -aQf -aQf -aQf -aVv -twL -twL ajj ajj ajj @@ -73499,31 +78304,35 @@ ajj ajj ajj ajj -aUm -vYR -aUm -aUm -aUm -aUm -aUm -aUm -aUm -fQt -aUm -aRe -aUm -aUm -kMe -xFU -xFU -xFU -xFU -xFU -ckg -noq -noq -qTu -gCR +ajj +ajj +ajj +gMw +vsW +gMw +yev +haE +xxv +jBF +jIj +jIj +boa +gMw +vsW +gMw +pMT +wrf +xxv +vYz +jIj +jIj +lct +gMw +ajj +ajj +ajj +ajj +ajj ajj aaa aaa @@ -73656,7 +78465,7 @@ aaa aaa aaa "} -(235,1,1) = {" +(237,1,1) = {" aaa aaa aaa @@ -73709,89 +78518,6 @@ aaa aaa aaa aaa -ajj -aPf -aPf -aPf -aPf -aPf -aPf -aPf -aPf -axA -axC -aJX -aNT -atF -aZU -ajR -axF -axA -ajj -ajj -axA -ahI -atF -atF -aNp -aXR -atF -aRo -axA -aUm -aUm -aUm -aUm -aCv -twL -twL -twL -aRS -aUm -aUm -ajj -ajj -ajj -ajj -ajj -ajj -ajj -aUm -cZJ -aUm -aDa -sQX -aUm -aUm -aUm -aUm -aUm -upo -hoi -aUm -upo -hoi -xFU -aLW -aLW -aLW -mEW -bXF -noq -noq -fTu -gCR -ajj -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa aaa aaa aaa @@ -73819,6 +78545,14 @@ aaa aaa aaa aaa +aSP +aqf +xRx +kWI +tYP +mgY +aqf +aSP aaa aaa aaa @@ -73829,6 +78563,29 @@ aaa aaa aaa aaa +ajj +gMw +wBX +aOY +haE +haE +gMw +jIj +knL +tYk +tBN +gMw +wBX +aOY +wrf +wrf +gMw +jIj +knL +wId +tBN +gMw +ajj aaa aaa aaa @@ -73912,8 +78669,6 @@ aaa aaa aaa aaa -"} -(236,1,1) = {" aaa aaa aaa @@ -73966,80 +78721,8 @@ aaa aaa aaa aaa -ajj -aPf -aPf -aPf -aPf -aPf -aPf -aPf -aPf -axA -axA -axA -axA -aNa -axA -axA -axA -axA -ajj -ajj -axA -aAd -atF -anD -aSV -atF -atF -atF -aGb -aUm -aRe -aUm -aUm -aUm -aUm -aUm -aUm -aUm -aUm -ajj -ajj -ajj -jNB -ydM -fwr -ajj -ajj -aUm -aUm -aUm -aUm -aUm -aUm -aUm -aUm -dIw -aUm -aqe -aqe -aUm -aqe -niQ -xFU -aLW -aLW -aLW -mEW -bXF -noq -noq -qaO -gCR -ajj -aaa +"} +(238,1,1) = {" aaa aaa aaa @@ -74119,6 +78802,14 @@ aaa aaa aaa aaa +aSP +aqf +aqf +aqf +aqf +aqf +aqf +aSP aaa aaa aaa @@ -74129,6 +78820,29 @@ aaa aaa aaa aaa +ajj +gMw +aVC +gMw +ehI +lQB +gMw +jIj +epr +yea +lIy +gMw +aVC +gMw +sZM +uNg +gMw +jIj +epr +yea +lIy +gMw +ajj aaa aaa aaa @@ -74169,8 +78883,6 @@ aaa aaa aaa aaa -"} -(237,1,1) = {" aaa aaa aaa @@ -74223,79 +78935,6 @@ aaa aaa aaa aaa -ajj -aPf -aPf -aPf -aPf -aPf -aPf -aPf -aPf -axA -awt -aTv -axA -atF -axA -aTv -awt -axA -ajj -ajj -axA -atF -atF -aCQ -abK -abK -atF -atF -aGb -aUm -aUm -aUm -aUm -aUm -aUm -aRe -aUm -aUm -aUm -ajj -ajj -ajj -cZJ -tLu -aUm -ajj -ajj -dIw -aUm -aUm -aUm -aUm -aUm -aUm -aUm -aUm -aUm -mJG -lwc -aUm -mJG -lwc -xFU -aLW -aLW -aLW -fwc -bXF -noq -noq -adt -gCR -ajj aaa aaa aaa @@ -74339,6 +78978,8 @@ aaa aaa aaa aaa +"} +(239,1,1) = {" aaa aaa aaa @@ -74418,6 +79059,14 @@ aaa aaa aaa aaa +aSP +aSP +aSP +aSP +aSP +aSP +aSP +aSP aaa aaa aaa @@ -74426,10 +79075,31 @@ aaa aaa aaa aaa -"} -(238,1,1) = {" aaa aaa +ajj +gMw +gMw +gMw +gMw +gMw +gMw +gMw +gMw +gMw +gMw +gMw +gMw +gMw +gMw +gMw +gMw +gMw +gMw +gMw +gMw +gMw +ajj aaa aaa aaa @@ -74480,79 +79150,6 @@ aaa aaa aaa aaa -ajj -aPf -aPf -aPf -aPf -aPf -aPf -aPf -aPf -axA -aWy -atF -axA -atF -axA -atF -aKX -axA -ajj -ajj -axA -agA -atF -aII -aLu -abK -atF -atF -aGb -aUm -aUm -aUm -aUm -aUm -aUm -aUm -aUm -aUm -ajj -ajj -ajj -ajj -cZJ -wZS -aUm -jzL -vEs -dIw -aUm -aUm -aUm -aUm -aUm -aUm -aUm -xFU -puo -xFU -xFU -xFU -xFU -xFU -xFU -xFU -xFU -xFU -xFU -gCR -jAH -noq -mIk -gCR -ajj aaa aaa aaa @@ -74638,6 +79235,8 @@ aaa aaa aaa aaa +"} +(240,1,1) = {" aaa aaa aaa @@ -74683,8 +79282,6 @@ aaa aaa aaa aaa -"} -(239,1,1) = {" aaa aaa aaa @@ -74738,77 +79335,27 @@ aaa aaa aaa ajj -aPf -aPf -aPf -aPf -aPf -aPf -aPf -aPf -skM -afy -atF -aNa -apW -aNa -atF -auP -axA ajj ajj -axA -bVx -atF -amD -abK -abK -atF -ybu -axA -aUm -aUm -aNq -aRe -aUm -aUm -aUm -aUm -aUm ajj ajj ajj ajj -jNB -aUm -fwr ajj -gMw -gMw -gMw -gMw -gMw -gMw -gMw -kDh -gMw -lJK -gMw -gMw -gMw -gMw -gMw -gMw -gMw -pzq -gMw -iCz -gMw -gCR -gCR -gCR -gCR -gCR +ajj +ajj +ajj +ajj +ajj +ajj +ajj +ajj +ajj +ajj +ajj +ajj +ajj +ajj ajj aaa aaa @@ -74940,150 +79487,13 @@ aaa aaa aaa aaa -"} -(240,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -ajj -ajj -ajj -ajj -ajj -ajj -ajj -ajj -ajj -axA -axA -axA -axA -axA -axA -axA -vZv -axA -ajj -ajj -axA -aiD -atF -aer -axF -atF -atF -aKX -axA -ajj -ajj -ajj -ajj -ajj -ajj -ajj -ajj -ajj -ajj -ajj -ajj -ajj -ajj -ajj -ajj -ajj -gMw -vsW -gMw -yev -haE -xxv -jBF -jIj -jIj -boa -gMw -vsW -gMw -pMT -wrf -xxv -vYz -jIj -jIj -lct -gMw -ajj -ajj -ajj -ajj -ajj -ajj -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa aaa aaa aaa aaa aaa +"} +(241,1,1) = {" aaa aaa aaa @@ -75197,8 +79607,6 @@ aaa aaa aaa aaa -"} -(241,1,1) = {" aaa aaa aaa @@ -75271,15 +79679,6 @@ aaa aaa aaa aaa -axA -axC -atF -aNB -atF -atF -atF -atF -axA aaa aaa aaa @@ -75296,29 +79695,6 @@ aaa aaa aaa aaa -ajj -gMw -wBX -aOY -haE -haE -gMw -jIj -knL -tYk -tBN -gMw -wBX -aOY -wrf -wrf -gMw -jIj -knL -wId -tBN -gMw -ajj aaa aaa aaa @@ -75373,6 +79749,8 @@ aaa aaa aaa aaa +"} +(242,1,1) = {" aaa aaa aaa @@ -75454,8 +79832,6 @@ aaa aaa aaa aaa -"} -(242,1,1) = {" aaa aaa aaa @@ -75528,15 +79904,6 @@ aaa aaa aaa aaa -axA -axA -axA -axA -axA -axA -axA -axA -axA aaa aaa aaa @@ -75553,32 +79920,6 @@ aaa aaa aaa aaa -ajj -gMw -aVC -gMw -ehI -lQB -gMw -jIj -epr -yea -lIy -gMw -aVC -gMw -sZM -uNg -gMw -jIj -epr -yea -lIy -gMw -ajj -aaa -aaa -aaa aaa aaa aaa @@ -75665,6 +80006,8 @@ aaa aaa aaa aaa +"} +(243,1,1) = {" aaa aaa aaa @@ -75711,8 +80054,6 @@ aaa aaa aaa aaa -"} -(243,1,1) = {" aaa aaa aaa @@ -75810,29 +80151,6 @@ aaa aaa aaa aaa -ajj -gMw -gMw -gMw -gMw -gMw -gMw -gMw -gMw -gMw -gMw -gMw -gMw -gMw -gMw -gMw -gMw -gMw -gMw -gMw -gMw -gMw -ajj aaa aaa aaa @@ -75945,6 +80263,8 @@ aaa aaa aaa aaa +"} +(244,1,1) = {" aaa aaa aaa @@ -75968,8 +80288,6 @@ aaa aaa aaa aaa -"} -(244,1,1) = {" aaa aaa aaa @@ -76067,29 +80385,6 @@ aaa aaa aaa aaa -ajj -ajj -ajj -ajj -ajj -ajj -ajj -ajj -ajj -ajj -ajj -ajj -ajj -ajj -ajj -ajj -ajj -ajj -ajj -ajj -ajj -ajj -ajj aaa aaa aaa diff --git a/_maps/shuttles/emergency_tranquility.dmm b/_maps/shuttles/emergency_tranquility.dmm index b2a15c5df11..5458e59c843 100644 --- a/_maps/shuttles/emergency_tranquility.dmm +++ b/_maps/shuttles/emergency_tranquility.dmm @@ -716,7 +716,7 @@ /turf/open/floor/grass, /area/shuttle/escape) "nQ" = ( -/mob/living/simple_animal/bot/hygienebot, +/mob/living/basic/bot/hygienebot, /turf/open/floor/wood, /area/shuttle/escape) "nV" = ( diff --git a/_maps/shuttles/ruin_cyborg_mothership.dmm b/_maps/shuttles/ruin_cyborg_mothership.dmm index 7188b8bd3c0..9f8cc92dd22 100644 --- a/_maps/shuttles/ruin_cyborg_mothership.dmm +++ b/_maps/shuttles/ruin_cyborg_mothership.dmm @@ -585,7 +585,7 @@ /turf/open/floor/iron/showroomfloor, /area/shuttle/ruin/cyborg_mothership) "Fe" = ( -/mob/living/simple_animal/bot/hygienebot, +/mob/living/basic/bot/hygienebot, /obj/machinery/camera/directional/south, /turf/open/floor/iron/showroomfloor, /area/shuttle/ruin/cyborg_mothership) diff --git a/_maps/skyrat/automapper/automapper_config.toml b/_maps/skyrat/automapper/automapper_config.toml index 00c9ae33593..e5fec573ebe 100644 --- a/_maps/skyrat/automapper/automapper_config.toml +++ b/_maps/skyrat/automapper/automapper_config.toml @@ -352,14 +352,6 @@ required_map = "north_star.dmm" coordinates = [121, 109, 4] trait_name = "Station" -# Northstar Prison -[templates.northstar_prison] -map_files = ["northstar_prison.dmm"] -directory = "_maps/skyrat/automapper/templates/northstar/" -required_map = "north_star.dmm" -coordinates = [149, 109, 4] -trait_name = "Station" - # Northstar NTR Office [templates.northstar_ntrep_office] map_files = ["northstar_ntrep_office.dmm"] diff --git a/_maps/skyrat/automapper/templates/mining/lavaland_ashwalker_nenest.dmm b/_maps/skyrat/automapper/templates/mining/lavaland_ashwalker_nenest.dmm index e488cbeb684..b85cc42558b 100644 --- a/_maps/skyrat/automapper/templates/mining/lavaland_ashwalker_nenest.dmm +++ b/_maps/skyrat/automapper/templates/mining/lavaland_ashwalker_nenest.dmm @@ -140,7 +140,7 @@ /area/ruin/unpowered/ash_walkers) "fd" = ( /obj/structure/rack/shelf{ - icon = 'modular_skyrat/modules/mapping/icons/unique/furniture.dmi'; + icon = 'modular_nova/modules/mapping/icons/unique/furniture.dmi'; icon_state = "empty_shelf_1" }, /obj/item/reagent_containers/cup/glass/bottle/small{ @@ -194,7 +194,7 @@ dir = 1 }, /obj/structure/rack/shelf{ - icon = 'modular_skyrat/modules/mapping/icons/unique/furniture.dmi'; + icon = 'modular_nova/modules/mapping/icons/unique/furniture.dmi'; icon_state = "empty_shelf_1" }, /obj/item/screwdriver/ashwalker, @@ -321,7 +321,7 @@ /area/ruin/unpowered/ash_walkers) "kP" = ( /obj/structure/rack/shelf{ - icon = 'modular_skyrat/modules/mapping/icons/unique/furniture.dmi'; + icon = 'modular_nova/modules/mapping/icons/unique/furniture.dmi'; icon_state = "empty_shelf_1" }, /obj/item/forging/billow/primitive, @@ -424,7 +424,7 @@ /area/ruin/unpowered/ash_walkers) "oH" = ( /obj/structure/rack/shelf{ - icon = 'modular_skyrat/modules/mapping/icons/unique/furniture.dmi'; + icon = 'modular_nova/modules/mapping/icons/unique/furniture.dmi'; icon_state = "empty_shelf_1" }, /obj/item/forging/billow/primitive, @@ -499,7 +499,7 @@ /area/ruin/unpowered/ash_walkers) "sp" = ( /obj/structure/rack/shelf{ - icon = 'modular_skyrat/modules/mapping/icons/unique/furniture.dmi'; + icon = 'modular_nova/modules/mapping/icons/unique/furniture.dmi'; icon_state = "empty_shelf_1" }, /obj/item/bedsheet/black{ @@ -523,7 +523,7 @@ /area/ruin/unpowered/ash_walkers) "sN" = ( /obj/structure/rack/shelf{ - icon = 'modular_skyrat/modules/mapping/icons/unique/furniture.dmi'; + icon = 'modular_nova/modules/mapping/icons/unique/furniture.dmi'; icon_state = "empty_shelf_1" }, /obj/item/stack/sheet/iron/twenty, @@ -541,7 +541,7 @@ /area/ruin/unpowered/ash_walkers) "un" = ( /obj/structure/rack/shelf{ - icon = 'modular_skyrat/modules/mapping/icons/unique/furniture.dmi'; + icon = 'modular_nova/modules/mapping/icons/unique/furniture.dmi'; icon_state = "empty_shelf_1" }, /obj/structure/stone_tile/slab, @@ -673,7 +673,7 @@ /area/ruin/unpowered/ash_walkers) "xl" = ( /obj/structure/rack/shelf{ - icon = 'modular_skyrat/modules/mapping/icons/unique/furniture.dmi'; + icon = 'modular_nova/modules/mapping/icons/unique/furniture.dmi'; icon_state = "empty_shelf_1" }, /obj/item/reagent_containers/cup/bowl/mushroom_bowl{ @@ -728,7 +728,7 @@ /area/ruin/unpowered/ash_walkers) "yO" = ( /obj/structure/rack/shelf{ - icon = 'modular_skyrat/modules/mapping/icons/unique/furniture.dmi'; + icon = 'modular_nova/modules/mapping/icons/unique/furniture.dmi'; icon_state = "empty_shelf_1" }, /obj/item/gun/ballistic/bow/longbow, @@ -768,7 +768,7 @@ /area/ruin/unpowered/ash_walkers) "zV" = ( /obj/structure/rack/shelf{ - icon = 'modular_skyrat/modules/mapping/icons/unique/furniture.dmi'; + icon = 'modular_nova/modules/mapping/icons/unique/furniture.dmi'; icon_state = "empty_shelf_1" }, /obj/item/knife/combat/bone{ @@ -990,7 +990,7 @@ /area/ruin/unpowered/ash_walkers) "Jx" = ( /obj/structure/rack/shelf{ - icon = 'modular_skyrat/modules/mapping/icons/unique/furniture.dmi'; + icon = 'modular_nova/modules/mapping/icons/unique/furniture.dmi'; icon_state = "empty_shelf_1" }, /obj/item/reagent_containers/cup/bottle/nutrient/rh{ @@ -1298,7 +1298,7 @@ /area/ruin/unpowered/ash_walkers) "UN" = ( /obj/structure/rack/shelf{ - icon = 'modular_skyrat/modules/mapping/icons/unique/furniture.dmi'; + icon = 'modular_nova/modules/mapping/icons/unique/furniture.dmi'; icon_state = "empty_shelf_1" }, /obj/item/reagent_containers/cup/glass/bottle/lizardwine, @@ -1344,7 +1344,7 @@ /area/ruin/unpowered/ash_walkers) "Wn" = ( /obj/structure/rack/shelf{ - icon = 'modular_skyrat/modules/mapping/icons/unique/furniture.dmi'; + icon = 'modular_nova/modules/mapping/icons/unique/furniture.dmi'; icon_state = "empty_shelf_1" }, /obj/item/claymore/bone, @@ -1393,7 +1393,7 @@ /area/ruin/unpowered/ash_walkers) "Xq" = ( /obj/structure/rack/shelf{ - icon = 'modular_skyrat/modules/mapping/icons/unique/furniture.dmi'; + icon = 'modular_nova/modules/mapping/icons/unique/furniture.dmi'; icon_state = "empty_shelf_1" }, /obj/item/secateurs, @@ -1406,7 +1406,7 @@ /area/ruin/unpowered/ash_walkers) "XH" = ( /obj/structure/rack/shelf{ - icon = 'modular_skyrat/modules/mapping/icons/unique/furniture.dmi'; + icon = 'modular_nova/modules/mapping/icons/unique/furniture.dmi'; icon_state = "empty_shelf_1" }, /obj/item/spear/bonespear, diff --git a/_maps/skyrat/automapper/templates/northstar/northstar_prison.dmm b/_maps/skyrat/automapper/templates/northstar/northstar_prison.dmm deleted file mode 100644 index 403bebf29b0..00000000000 --- a/_maps/skyrat/automapper/templates/northstar/northstar_prison.dmm +++ /dev/null @@ -1,23 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/obj/machinery/cryopod/prison/directional/west{ - quiet = 1 - }, -/turf/template_noop, -/area/template_noop) -"r" = ( -/obj/machinery/cryopod/prison/directional/north, -/turf/template_noop, -/area/template_noop) -"P" = ( -/turf/template_noop, -/area/template_noop) - -(1,1,1) = {" -r -P -P -P -P -a -"} diff --git a/_maps/virtual_domains/skyrat_ancientmilsim.dmm b/_maps/virtual_domains/skyrat_ancientmilsim.dmm index 86a71a32584..ab9984ae054 100644 --- a/_maps/virtual_domains/skyrat_ancientmilsim.dmm +++ b/_maps/virtual_domains/skyrat_ancientmilsim.dmm @@ -434,7 +434,7 @@ dir = 1; name = "vehicle console"; icon_screen = "shuttle"; - icon = 'modular_skyrat/modules/advanced_shuttles/icons/computer.dmi'; + icon = 'modular_nova/modules/advanced_shuttles/icons/computer.dmi'; icon_state = "intercom"; desc = "An armored vehicle control computer. Doesn't work anymore... who would've thought."; density = 0; diff --git a/_maps/virtual_domains/wendigo.dmm b/_maps/virtual_domains/wendigo.dmm index 9d57c242aff..57c002c148c 100644 --- a/_maps/virtual_domains/wendigo.dmm +++ b/_maps/virtual_domains/wendigo.dmm @@ -1,1375 +1,1651 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( +"aa" = ( /turf/open/indestructible/necropolis{ initial_gas_mix = "ICEMOON_ATMOS" }, /area/icemoon/underground/explored/virtual_domain) -"b" = ( +"ab" = ( /turf/closed/indestructible/rock/snow/ice/ore, /area/icemoon/underground/explored/virtual_domain) -"e" = ( -/turf/open/misc/asteroid/snow/ice/icemoon, +"ac" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 8 + }, +/turf/open/indestructible/necropolis{ + initial_gas_mix = "ICEMOON_ATMOS" + }, /area/icemoon/underground/explored/virtual_domain) -"f" = ( -/obj/structure/marker_beacon/olive, +"ad" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 9 + }, /turf/open/indestructible/necropolis{ initial_gas_mix = "ICEMOON_ATMOS" }, /area/icemoon/underground/explored/virtual_domain) -"i" = ( +"ae" = ( +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/explored/virtual_domain) +"ag" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 10 + }, +/turf/open/indestructible/necropolis{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored/virtual_domain) +"ah" = ( +/obj/effect/decal/cleanable/blood, +/turf/open/indestructible/necropolis{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored/virtual_domain) +"ai" = ( /turf/closed/indestructible/binary, /area/icemoon/underground/explored/virtual_domain) -"o" = ( -/obj/structure/marker_beacon/indigo, +"aj" = ( +/obj/effect/mob_spawn/corpse/human/cargo_tech, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/explored/virtual_domain) +"ak" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 8 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 6 + }, /turf/open/indestructible/necropolis{ initial_gas_mix = "ICEMOON_ATMOS" }, /area/icemoon/underground/explored/virtual_domain) -"p" = ( -/obj/structure/marker_beacon/bronze, +"al" = ( +/obj/structure/flora/rock/pile/icy/style_3, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/explored/virtual_domain) +"am" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 5 + }, /turf/open/indestructible/necropolis{ initial_gas_mix = "ICEMOON_ATMOS" }, /area/icemoon/underground/explored/virtual_domain) -"q" = ( -/obj/structure/marker_beacon/yellow, +"an" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 4 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 8 + }, +/turf/open/indestructible/necropolis{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored/virtual_domain) +"ar" = ( +/obj/structure/flora/tree/stump, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/explored/virtual_domain) +"as" = ( +/turf/closed/indestructible/necropolis, +/area/icemoon/underground/explored/virtual_domain) +"au" = ( +/obj/structure/flora/rock/pile/icy/style_random, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/explored/virtual_domain) +"av" = ( +/obj/structure/flora/grass/brown/style_random, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/explored/virtual_domain) +"aw" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 10 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 4 + }, /turf/open/indestructible/necropolis{ initial_gas_mix = "ICEMOON_ATMOS" }, /area/icemoon/underground/explored/virtual_domain) -"t" = ( -/obj/structure/marker_beacon/teal, +"ay" = ( +/obj/effect/mob_spawn/corpse/human/bitrunner, /turf/open/indestructible/necropolis{ initial_gas_mix = "ICEMOON_ATMOS" }, /area/icemoon/underground/explored/virtual_domain) -"x" = ( -/obj/structure/marker_beacon/burgundy, +"az" = ( +/obj/effect/turf_decal/weather/snow/corner, /turf/open/indestructible/necropolis{ initial_gas_mix = "ICEMOON_ATMOS" }, /area/icemoon/underground/explored/virtual_domain) -"A" = ( +"aA" = ( /obj/effect/baseturf_helper/virtual_domain, /turf/template_noop, /area/virtual_domain/safehouse) -"E" = ( -/obj/effect/mob_spawn/corpse/human/miner, -/turf/open/misc/asteroid/snow/ice/icemoon, +"aB" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 10 + }, +/obj/structure/holosign/barrier, +/turf/open/indestructible/necropolis{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored/virtual_domain) +"aC" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/turf/open/indestructible/necropolis{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored/virtual_domain) +"aD" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 6 + }, +/turf/open/indestructible/necropolis{ + initial_gas_mix = "ICEMOON_ATMOS" + }, /area/icemoon/underground/explored/virtual_domain) -"H" = ( +"aF" = ( +/obj/effect/turf_decal/weather/snow/corner, +/obj/effect/mob_spawn/corpse/human/bitrunner, +/turf/open/indestructible/necropolis{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored/virtual_domain) +"aG" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 5 + }, +/obj/effect/turf_decal/weather/snow/corner, +/turf/open/indestructible/necropolis{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored/virtual_domain) +"aH" = ( /mob/living/simple_animal/hostile/megafauna/wendigo, /turf/open/indestructible/necropolis{ initial_gas_mix = "ICEMOON_ATMOS" }, /area/icemoon/underground/explored/virtual_domain) -"L" = ( +"aI" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 4 + }, +/turf/open/indestructible/necropolis{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored/virtual_domain) +"aJ" = ( +/obj/effect/decal/cleanable/blood/gibs/torso, +/obj/effect/decal/cleanable/blood/old, +/turf/open/indestructible/necropolis{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored/virtual_domain) +"aK" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 6 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/turf/open/indestructible/necropolis{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored/virtual_domain) +"aL" = ( /obj/effect/baseturf_helper/virtual_domain, /turf/closed/indestructible/binary, /area/icemoon/underground/explored/virtual_domain) -"R" = ( +"aM" = ( +/obj/effect/decal/cleanable/blood/gibs/core, +/turf/open/indestructible/necropolis{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored/virtual_domain) +"aN" = ( +/obj/structure/flora/grass/brown/style_random, +/obj/structure/holosign/barrier, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/explored/virtual_domain) +"aO" = ( +/obj/effect/mob_spawn/corpse/human/cyber_police, +/turf/open/indestructible/necropolis{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored/virtual_domain) +"aP" = ( +/obj/structure/flora/rock/pile/icy/style_random, +/obj/structure/flora/grass/brown/style_random, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/explored/virtual_domain) +"aQ" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 5 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 8 + }, +/turf/open/indestructible/necropolis{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored/virtual_domain) +"aR" = ( /obj/item/paper/crumpled/bloody{ default_raw_text = "for your own sake, do not enter" }, -/turf/open/misc/asteroid/snow/ice/icemoon, +/turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored/virtual_domain) -"S" = ( +"aS" = ( /turf/template_noop, /area/template_noop) -"V" = ( +"aT" = ( +/obj/effect/turf_decal/weather/snow/corner, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/turf/open/indestructible/necropolis{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored/virtual_domain) +"aU" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 10 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/turf/open/indestructible/necropolis{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored/virtual_domain) +"aV" = ( /turf/template_noop, /area/virtual_domain/safehouse) -"Z" = ( +"aW" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 6 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 8 + }, +/turf/open/indestructible/necropolis{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored/virtual_domain) +"aX" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/obj/effect/turf_decal/weather/snow/corner, +/turf/open/indestructible/necropolis{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored/virtual_domain) +"aY" = ( +/obj/effect/decal/cleanable/blood/drip{ + pixel_x = 2; + pixel_y = 3 + }, +/turf/open/indestructible/necropolis{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored/virtual_domain) +"aZ" = ( /obj/modular_map_root/safehouse{ key = "lavaland_boss" }, /turf/template_noop, /area/virtual_domain/safehouse) +"bX" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 6 + }, +/turf/open/indestructible/necropolis{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored/virtual_domain) +"jc" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 9 + }, +/obj/effect/turf_decal/weather/snow/corner, +/turf/open/indestructible/necropolis{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored/virtual_domain) +"lc" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 8 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 4 + }, +/turf/open/indestructible/necropolis{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored/virtual_domain) +"pl" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/obj/effect/mob_spawn/corpse/human/bitrunner, +/turf/open/indestructible/necropolis{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored/virtual_domain) +"sn" = ( +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/indestructible/necropolis{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored/virtual_domain) +"KV" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 9 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 4 + }, +/turf/open/indestructible/necropolis{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored/virtual_domain) +"Vt" = ( +/obj/structure/flora/grass/brown/style_random, +/turf/closed/indestructible/rock/snow/ice/ore, +/area/icemoon/underground/explored/virtual_domain) (1,1,1) = {" -S -S -S -S -S -S -i -i -i -i -i -i -i -i -i -i -i -i -i -i -i -i -i -S -S -S -S -S -S -S -S -S -S -S -S -S -S +aS +aS +aS +aS +aS +aS +ai +ai +ai +ai +ai +ai +ai +ai +ai +ai +ai +ai +ai +ai +ai +ai +ai +aS +aS +aS +aS +aS +aS +aS +aS +aS +aS +aS +aS +aS +aS "} (2,1,1) = {" -S -S -S -S -S -i -i -e -e -e -e -e -e -e -e -e -e -e -e -e -e -e -i -i -S -S -S -S -S -S -S -S -S -S -S -S -S +aS +aS +aS +aS +aS +ai +ai +ae +ae +ae +ae +ae +ar +ae +ae +ad +ag +ae +ae +ae +ar +ae +ai +ai +aS +aS +aS +aS +aS +aS +aS +aS +aS +aS +aS +aS +aS "} (3,1,1) = {" -S -S -S -S -i -i -e -e -e -e -e -e -e -e -e -e -e -e -e -e -e -e -e -i -i -S -S -S -S -S -S -S -S -S -S -S -S +aS +aS +aS +aS +ai +ai +ae +ae +ae +ae +ae +ae +ae +ae +ad +aI +aI +an +aw +ae +ae +ae +ae +ai +ai +aS +aS +aS +aS +aS +aS +aS +aS +aS +aS +aS +aS "} (4,1,1) = {" -S -S -S -i -i -e -e -e -b -b -b -b -b -e -e -e -b -b -b -b -b -e -e -e -i -i -S -S -S -S -S -S -S -S -S -S -S +aS +aS +aS +ai +ai +ae +ae +av +ab +ab +ar +ae +au +ad +az +ae +ae +ae +ae +av +av +ae +ae +ae +ai +ai +aS +aS +aS +aS +aS +aS +aS +aS +aS +aS +aS "} (5,1,1) = {" -S -S -i -i -e -e -e -b -b -b -b -b -b -b -e -b -b -b -b -b -b -b -e -e -e -i -i -i -i -i -i -i -i -i -i -i -L +aS +aS +ai +ai +ae +ae +av +ae +ab +ab +ab +ab +ab +aC +aa +ag +ar +ab +ab +ab +ab +ab +ae +au +ae +ai +ai +ai +ai +ai +ai +ai +ai +ai +ai +ai +aL "} (6,1,1) = {" -S -i -i -e -e -e -b -b -b -b -b -b -b -b -e -b -b -b -b -b -b -b -b -e -e -e -i -i -e -e -e -e -e -e -e -e -i +aS +ai +ai +ae +ae +ae +av +ab +ab +ab +ab +ab +ab +as +ab +ab +ab +ab +ab +ab +ab +ar +au +ae +ae +ae +ai +ai +ae +ae +ae +ae +ae +ae +ae +ae +ai "} (7,1,1) = {" -i -i -e -e -e -b -b -b -b -b -b -b -b -b -e -b -b -b -b -b -b -b -b -b -e -e -e -i -e -e -e -e -e -e -e -e -i +ai +ai +ae +ae +ae +au +ab +ab +ab +ab +ab +ab +ab +as +as +ab +ab +ab +ab +ab +ab +ae +ae +av +ae +ae +ae +ai +ae +ae +ae +ae +ad +ag +ae +ae +ai "} (8,1,1) = {" -i -e -e -e -b -b -b -b -b -b -a -a -a -a -a -a -a -a -a -b -b -b -b -b -b -e -e -e -e -e -e -e -e -e -e -e -i +ai +ae +ae +ae +ar +ab +ab +ab +ab +ab +ab +ab +ar +aC +aa +az +au +ab +ab +ab +ab +ab +ab +ar +ae +ae +ae +ae +ae +ae +ae +aQ +aa +aa +ag +ae +ai "} (9,1,1) = {" -i -e -e -b -b -b -b -b -b -a -a -a -a -a -a -a -a -a -a -a -b -b -b -b -b -b -e -e -e -e -e -e -e -e -e -e -i +ai +ae +ae +ae +av +ab +ab +ab +ab +ab +av +ae +ae +am +aa +aF +av +av +ae +ab +ab +ab +ab +ab +av +av +ae +ae +ae +ae +ae +ae +am +aa +aD +ae +ai "} (10,1,1) = {" -i -e -e -b -b -b -b -b -a -a -a -a -a -a -a -a -a -a -a -a -a -b -b -b -b -b -e -e -e -e -e -e -e -e -e -e -i +ai +ae +ae +ar +av +ab +ab +ab +ab +au +ae +jc +ae +ae +aC +aa +ac +ak +au +ae +ab +ab +ab +ab +ab +au +ae +ae +ad +aw +ae +ae +ae +aT +ae +ae +ai "} (11,1,1) = {" -i -e -E -b -b -b -b -a -a -a -a -a -a -a -a -a -a -a -a -o -a -a -b -b -b -b -e -e -e -e -e -e -e -e -e -e -i +ai +ae +ae +ae +ab +ab +ab +av +aX +ae +ae +am +ag +ae +aC +aa +az +ae +ae +al +aX +ae +ab +ab +ab +ae +ae +aQ +aD +ae +ae +ae +ae +aK +ae +ae +ai "} (12,1,1) = {" -i -e -e -b -b -b -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -b -b -b -e -e -e -e -e -e -e -e -e -e -i +ai +ae +ae +ab +ab +ab +KV +ac +aa +ag +ae +al +aC +ac +aa +aa +az +au +ad +ac +az +ae +au +ab +ab +ab +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ai "} (13,1,1) = {" -i -e -e -b -b -b -a -a -a -a -q -a -a -a -a -a -a -a -a -a -a -a -a -b -b -b -e -e -e -e -e -e -e -e -e -e -i +ai +ae +ae +ab +ab +ab +ae +ae +aC +aa +ag +ae +aC +aa +aa +aa +aa +ac +aa +aa +aa +ag +ae +ab +ab +ab +av +ae +ae +ae +ae +ae +ae +ae +ae +ae +ai "} (14,1,1) = {" -i -e -e -b -b -b -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -b -b -b -e -e -e -V -V -V -V -V -Z -e -i +ai +ae +ae +ar +ab +ab +ab +ar +aC +aa +az +ae +aC +aa +aa +aa +aa +aa +aa +aa +aa +aa +ac +ab +ab +ab +al +ar +ae +aV +aV +aV +aV +aV +aZ +ae +ai "} (15,1,1) = {" -i -e -e -b -b -b -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -b -b -b -E -e -e -V -V -V -V -V -V -e -i +ai +ae +ae +au +ab +ab +ab +as +aa +aa +aa +ac +aa +aa +aa +aa +aa +aa +aa +aa +aa +ay +aa +as +as +av +ae +aj +ae +aV +aV +aV +aV +aV +aV +ae +ai "} (16,1,1) = {" -i -e -e -e -b -b -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -b -b -e -e -e -e -V -V -V -V -V -V -e -i +ai +ae +ad +ac +ab +as +as +as +aa +aa +aa +aa +aa +aa +aa +ah +aM +aa +aa +aa +aa +aa +aa +aa +as +aB +ae +ae +av +aV +aV +aV +aV +aV +aV +ae +ai "} (17,1,1) = {" -i -e -e -e -e -e -a -a -a -a -a -a -a -a -H -a -a -a -a -x -a -a -a -e -e -e -e -R -e -V -V -V -V -V -V -e -i +ai +KV +aI +aa +aa +as +as +as +aa +aa +aa +aa +aa +aa +aH +aJ +aa +aa +aa +aa +aa +aa +aa +aa +aa +aY +aw +aR +av +aV +aV +aV +aV +aV +aV +ae +ai "} (18,1,1) = {" -i -e -e -e -b -b -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -b -b -e -e -e -e -V -V -V -V -V -V -e -i +ai +ae +ae +am +aa +as +as +as +aa +aa +aa +aa +aa +aa +aa +sn +aa +aa +aa +aa +aa +aa +aa +aa +aa +aD +ae +ae +ae +aV +aV +aV +aV +aV +aV +ae +ai "} (19,1,1) = {" -i -e -e -b -b -b -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -b -b -b -e -e -e -V -V -V -V -V -V -e -i +ai +ae +ae +av +aC +ab +as +aI +aI +aI +aa +aa +aa +aa +aa +aa +aO +aa +aa +aa +aa +aa +aa +as +as +aN +ae +ae +ar +aV +aV +aV +aV +aV +aV +ae +ai "} (20,1,1) = {" -i -e -e -b -b -b -a -a -a -a -a -a -a -a -p -a -a -a -a -a -a -a -a -b -b -b -e -e -e -V -V -V -V -V -A -e -i +ai +ae +ae +ae +ab +ab +ar +ae +ae +al +aC +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +av +ae +ae +aV +aV +aV +aV +aV +aA +ae +ai "} (21,1,1) = {" -i -e -e -b -b -b -a -a -a -a -f -a -a -a -a -a -a -a -a -a -a -a -a -b -b -b -e -e -e -e -e -e -e -e -e -e -i +ai +ar +ae +au +ab +ab +au +ae +ad +ac +aa +aa +aa +aa +aa +aI +aa +aa +aa +aI +aI +aa +aa +ab +ab +ab +av +ae +ae +ae +ae +ae +ae +ae +ae +ae +ai "} (22,1,1) = {" -i -e -e -b -b -b -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -b -b -b -e -e -e -e -e -e -e -e -e -e -i +ai +ae +ae +ab +ab +ab +ac +lc +aI +aa +aa +az +al +aC +az +al +am +aa +az +ae +au +am +ab +ab +ab +ab +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ai "} (23,1,1) = {" -i -e -e -b -b -b -b -a -a -a -a -a -a -a -a -a -a -a -a -a -t -a -b -b -b -b -e -e -e -e -e -e -e -e -e -e -i +ai +ae +ae +ab +ab +ab +ab +av +ae +pl +aa +aD +au +aC +az +ae +ae +aC +az +ae +ae +ae +ab +ab +ab +ae +ae +aQ +ag +ae +ae +ae +ae +ae +ae +ae +ai "} (24,1,1) = {" -i -e -e -b -b -b -b -b -a -a -a -a -a -a -a -a -a -a -a -a -a -b -b -b -b -b -e -e -e -e -e -e -e -e -e -e -i +ai +ae +ae +ae +ab +ab +ab +Vt +ar +aC +aD +au +ae +aC +aa +aW +ae +am +az +ae +ae +ab +ab +ab +ab +ae +ae +ae +am +ac +aW +ae +ae +aU +ae +ae +ai "} (25,1,1) = {" -i -e -e -b -b -b -b -b -b -a -a -a -a -a -a -a -a -a -a -a -b -b -b -b -b -b -e -e -e -e -e -e -e -e -e -e -i +ai +ae +ae +ae +ae +ab +ab +ab +ab +az +ae +ae +ad +aa +az +au +av +av +aC +ab +ab +ab +ab +ab +au +ae +ae +ae +ae +aG +ae +ae +ad +aI +aW +ae +ai "} (26,1,1) = {" -i -e -e -e -b -b -b -b -b -b -a -a -a -a -a -a -a -a -a -b -b -b -b -b -b -e -e -e -e -e -e -e -e -e -e -e -i +ai +ae +ae +ae +ae +ae +ar +ab +ab +ab +ae +av +aC +as +as +ab +ar +aP +ab +ab +ab +ab +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +aK +ae +ae +ae +ai "} (27,1,1) = {" -i -i -e -e -e -b -b -b -b -b -b -b -b -b -e -b -b -b -b -b -b -b -b -b -e -e -e -i -e -e -e -e -e -e -e -e -i +ai +ai +ae +au +ae +av +av +ab +ab +ab +ab +ab +as +as +ab +ab +ab +ab +ab +ab +ab +ab +ae +ae +ae +ar +ae +ai +ae +ae +ae +ae +ae +ae +ae +ae +ai "} (28,1,1) = {" -S -i -i -e -e -e -b -b -b -b -b -b -b -b -e -b -b -b -b -b -b -b -b -e -e -e -i -i -e -e -e -e -e -e -e -e -i +aS +ai +ai +ae +au +ae +av +ae +ab +ab +ab +ab +as +as +ab +ab +ab +ab +ab +ab +ab +au +ae +ae +ae +ae +ai +ai +ae +ae +ae +ae +ae +ae +ae +ae +ai "} (29,1,1) = {" -S -S -i -i -e -e -e -b -b -b -b -b -b -b -e -b -b -b -b -b -b -b -e -e -e -i -i -i -i -i -i -i -i -i -i -i -i +aS +aS +ai +ai +ae +ae +ae +ae +ae +ar +av +aC +as +as +ab +ab +ab +ab +ab +ab +ae +ae +ae +ar +ae +ai +ai +ai +ai +ai +ai +ai +ai +ai +ai +ai +ai "} (30,1,1) = {" -S -S -S -i -i -e -e -e -b -b -b -b -b -e -e -e -b -b -b -b -b -e -e -e -i -i -S -S -S -S -S -S -S -S -S -S -S +aS +aS +aS +ai +ai +ae +ae +ae +ae +au +ae +am +aa +aa +aI +ab +ab +ab +ab +ae +ae +ae +ae +ae +ai +ai +aS +aS +aS +aS +aS +aS +aS +aS +aS +aS +aS "} (31,1,1) = {" -S -S -S -S -i -i -e -e -e -e -e -e -e -e -e -e -e -e -e -e -e -e -e -i -i -S -S -S -S -S -S -S -S -S -S -S -S +aS +aS +aS +aS +ai +ai +ae +ae +ae +ae +ae +ae +aC +aD +ae +ae +ae +ae +ae +ae +ae +ae +ae +ai +ai +aS +aS +aS +aS +aS +aS +aS +aS +aS +aS +aS +aS "} (32,1,1) = {" -S -S -S -S -S -i -i -e -e -e -e -e -e -e -e -e -e -e -e -e -e -e -i -i -S -S -S -S -S -S -S -S -S -S -S -S -S +aS +aS +aS +aS +aS +ai +ai +ae +ae +ae +ae +ae +bX +ae +ae +ae +ae +ae +ae +ae +ae +ae +ai +ai +aS +aS +aS +aS +aS +aS +aS +aS +aS +aS +aS +aS +aS "} (33,1,1) = {" -S -S -S -S -S -S -i -i -i -i -i -i -i -i -i -i -i -i -i -i -i -i -i -S -S -S -S -S -S -S -S -S -S -S -S -S -S +aS +aS +aS +aS +aS +aS +ai +ai +ai +ai +ai +ai +ai +ai +ai +ai +ai +ai +ai +ai +ai +ai +ai +aS +aS +aS +aS +aS +aS +aS +aS +aS +aS +aS +aS +aS +aS "} diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm index ebb14c09240..f756678b43a 100644 --- a/code/__DEFINES/DNA.dm +++ b/code/__DEFINES/DNA.dm @@ -40,7 +40,7 @@ #define DNA_UNI_IDENTITY_BLOCKS 8 -//SKYRAT EDIT REMOVAL BEGIN - CUSTOMIZATION (moved to modular_skyrat/modules/customization/_DEFINES/DNA.dm) +//NOVA EDIT REMOVAL BEGIN - CUSTOMIZATION (moved to modular_nova/modules/customization/_DEFINES/DNA.dm) /* /// This number needs to equal the total number of DNA blocks #define DNA_MUTANT_COLOR_BLOCK 1 @@ -60,7 +60,7 @@ #define DNA_POD_HAIR_BLOCK 15 #define DNA_FEATURE_BLOCKS 15 -*/ //SKYRAT EDIT CHANGE - ORIGINAL +*/ //NOVA EDIT CHANGE - ORIGINAL #define DNA_FEATURE_BLOCKS GLOB.dna_total_feature_blocks #define DNA_MANDATORY_COLOR_BLOCKS 5 @@ -72,7 +72,7 @@ #define DNA_POD_HAIR_BLOCK 15 -// SKYRAT EDIT CHANGE END +// NOVA EDIT CHANGE END #define DNA_SEQUENCE_LENGTH 4 #define DNA_MUTATION_BLOCKS 8 diff --git a/code/__DEFINES/access.dm b/code/__DEFINES/access.dm index 7a1e91cd408..65ae6609ee1 100644 --- a/code/__DEFINES/access.dm +++ b/code/__DEFINES/access.dm @@ -333,7 +333,7 @@ ACCESS_WEAPONS, \ ACCESS_XENOBIOLOGY, \ ACCESS_BARBER, \ -) // SKYRAT EDIT ADDITION +) // NOVA EDIT ADDITION /// 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( \ @@ -360,7 +360,7 @@ ACCESS_HOP, \ ACCESS_QM, \ ACCESS_RD, \ -) // SKYRAT EDIT - Added ACCESS_CE and ACCESS_CMO to PRIVATE_COMMAND_ACCESS +) // NOVA EDIT - Added ACCESS_CE and ACCESS_CMO to PRIVATE_COMMAND_ACCESS /// Captains private rooms. Do not use direct, access via SSid_access.get_flag_access_list(ACCESS_FLAG_CAPTAIN) #define CAPTAIN_ACCESS list( \ diff --git a/code/__DEFINES/achievements.dm b/code/__DEFINES/achievements.dm index 7af89f2673a..60b9ed03948 100644 --- a/code/__DEFINES/achievements.dm +++ b/code/__DEFINES/achievements.dm @@ -42,8 +42,8 @@ #define MEDAL_BLADE_ASCENSION "Blade" #define MEDAL_COSMOS_ASCENSION "Cosmos" #define MEDAL_LOCK_ASCENSION "Knock" +#define MEDAL_MOON_ASCENSION "Moon" #define MEDAL_TOOLBOX_SOUL "Toolsoul" -#define MEDAL_CHEM_TUT "Beginner Chemist" #define MEDAL_HOT_DAMN "Hot Damn!" #define MEDAL_CAYENNE_DISK "Very Important Piscis" #define MEDAL_TRAM_SURFER "Tram Surfer" diff --git a/code/__DEFINES/admin.dm b/code/__DEFINES/admin.dm index 9946e022b61..c7274638e79 100644 --- a/code/__DEFINES/admin.dm +++ b/code/__DEFINES/admin.dm @@ -7,9 +7,9 @@ #define MUTE_ADMINHELP (1<<3) #define MUTE_DEADCHAT (1<<4) #define MUTE_INTERNET_REQUEST (1<<5) -// Skyrat Edit Addition - Mute LOOC +// NOVA EDIT Addition - Mute LOOC #define MUTE_LOOC (1<<6) -// Skyrat Edit End +// NOVA EDIT End #define MUTE_ALL ALL //Some constants for DB_Ban @@ -102,7 +102,7 @@ #define AHELP_RESOLVED 3 /// Amount of time after the round starts that the player disconnect report is issued. -#define ROUNDSTART_LOGOUT_REPORT_TIME (21 MINUTES) // SKYRAT EDIT CHANGE - ORIGINAL: 10 MINUTES +#define ROUNDSTART_LOGOUT_REPORT_TIME (21 MINUTES) // NOVA EDIT CHANGE - ORIGINAL: 10 MINUTES /// Threshold in minutes for counting a player as AFK on the roundstart report. #define ROUNDSTART_LOGOUT_AFK_THRESHOLD (ROUNDSTART_LOGOUT_REPORT_TIME * 0.7) diff --git a/code/__DEFINES/ai/bot_keys.dm b/code/__DEFINES/ai/bot_keys.dm index 25467e45485..5cf2e4263d4 100644 --- a/code/__DEFINES/ai/bot_keys.dm +++ b/code/__DEFINES/ai/bot_keys.dm @@ -15,6 +15,8 @@ #define BB_RADIO_CHANNEL "radio_channel" ///list of unreachable things we will temporarily ignore #define BB_TEMPORARY_IGNORE_LIST "temporary_ignore_list" +///Last thing we attempted to reach +#define BB_LAST_ATTEMPTED_PATHING "last_attempted_pathing" // medbot keys ///the patient we must heal @@ -55,3 +57,17 @@ #define BB_ACID_SPRAY_TARGET "acid_spray_target" ///key that holds trash we will burn #define BB_HUNTABLE_TRASH "huntable_trash" + +//hygienebots +///key that holds our threats +#define BB_WASH_THREATS "wash_threats" +///key that holds speech when we find our target +#define BB_WASH_FOUND "wash_found" +///key that holds speech when we cleaned our target +#define BB_WASH_DONE "wash_done" +///key that holds target we will wash +#define BB_WASH_TARGET "wash_target" +///key that holds how frustrated we are when target is running away +#define BB_WASH_FRUSTRATION "wash_frustration" +///key that holds cooldown after we finish cleaning something, so we dont immediately run off to patrol +#define BB_POST_CLEAN_COOLDOWN "post_clean_cooldown" diff --git a/code/__DEFINES/ai/monkey.dm b/code/__DEFINES/ai/monkey.dm index fc4af74d9f0..0e8c44e40fa 100644 --- a/code/__DEFINES/ai/monkey.dm +++ b/code/__DEFINES/ai/monkey.dm @@ -15,3 +15,4 @@ #define BB_MONKEY_TARGET_MONKEYS "BB_monkey_target_monkeys" #define BB_MONKEY_DISPOSING "BB_monkey_disposing" #define BB_MONKEY_RECRUIT_COOLDOWN "BB_monkey_recruit_cooldown" +#define BB_RESISTING "BB_resisting" diff --git a/code/__DEFINES/antagonists.dm b/code/__DEFINES/antagonists.dm index 6ed9272a9ff..d750a0a3631 100644 --- a/code/__DEFINES/antagonists.dm +++ b/code/__DEFINES/antagonists.dm @@ -84,6 +84,7 @@ #define PATH_BLADE "Blade Path" #define PATH_COSMIC "Cosmic Path" #define PATH_LOCK "Lock Path" +#define PATH_MOON "Moon Path" /// Defines are used in /proc/has_living_heart() to report if the heretic has no heart period, no living heart, or has a living heart. #define HERETIC_NO_HEART_ORGAN -1 @@ -222,8 +223,10 @@ GLOBAL_LIST_INIT(ai_employers, list( #define IS_HERETIC(mob) (mob.mind?.has_antag_datum(/datum/antagonist/heretic)) /// Check if the given mob is a heretic monster. #define IS_HERETIC_MONSTER(mob) (mob.mind?.has_antag_datum(/datum/antagonist/heretic_monster)) -/// Checks if the given mob is either a heretic or a heretic monster. -#define IS_HERETIC_OR_MONSTER(mob) (IS_HERETIC(mob) || IS_HERETIC_MONSTER(mob)) +/// Check if the given mob is a lunatic +#define IS_LUNATIC(mob) (mob.mind?.has_antag_datum(/datum/antagonist/lunatic)) +/// Checks if the given mob is either a heretic, heretic monster or a lunatic. +#define IS_HERETIC_OR_MONSTER(mob) (IS_HERETIC(mob) || IS_HERETIC_MONSTER(mob) || IS_LUNATIC(mob)) /// Checks if the given mob is a wizard #define IS_WIZARD(mob) (mob?.mind?.has_antag_datum(/datum/antagonist/wizard)) @@ -333,6 +336,7 @@ GLOBAL_LIST_INIT(human_invader_antagonists, list( #define ANTAG_GROUP_FUGITIVES "Escaped Fugitives" #define ANTAG_GROUP_HUNTERS "Bounty Hunters" #define ANTAG_GROUP_PARADOX "Spacetime Aberrations" +#define ANTAG_GROUP_CREW "Deviant Crew" // This flag disables certain checks that presume antagonist datums mean 'baddie'. diff --git a/code/__DEFINES/atom_hud.dm b/code/__DEFINES/atom_hud.dm index 7a1ca9705ac..eeac64d4bca 100644 --- a/code/__DEFINES/atom_hud.dm +++ b/code/__DEFINES/atom_hud.dm @@ -48,7 +48,7 @@ /// Steady Hacked APC effect, visible only to Malf AIs #define MALF_APC_HUD "23" -// SKYRAT EDIT ADDITION BEGIN - gun permits and DNR +// NOVA EDIT ADDITION BEGIN - gun permits and DNR /// ammo of guns #define AMMO_HUD "25" /// if they have a gun permit @@ -56,7 +56,7 @@ /// If they have the DNR trait #define DNR_HUD "27" -// SKYRAT EDIT ADDITION END +// NOVA EDIT ADDITION END //by default everything in the hud_list of an atom is an image //a value in hud_list with one of these will change that behavior @@ -75,8 +75,8 @@ #define DATA_HUD_AI_DETECT 9 #define DATA_HUD_FAN 10 #define DATA_HUD_MALF_APC 11 -#define DATA_HUD_PERMIT 12 //SKYRAT EDIT -#define DATA_HUD_DNR 13 // SKYRAT EDIT +#define DATA_HUD_PERMIT 12 //NOVA EDIT +#define DATA_HUD_DNR 13 // NOVA EDIT /// cooldown for being shown the images for any particular data hud #define ADD_HUD_TO_COOLDOWN 20 diff --git a/code/__DEFINES/blob_defines.dm b/code/__DEFINES/blob_defines.dm index 966e02af3fc..781aed2cab3 100644 --- a/code/__DEFINES/blob_defines.dm +++ b/code/__DEFINES/blob_defines.dm @@ -14,7 +14,7 @@ // Generic blob defines //#define BLOB_BASE_POINT_RATE 2 // Base amount of points per process() -#define BLOB_BASE_POINT_RATE 2.5 // SKYRAT EDIT CHANGE +#define BLOB_BASE_POINT_RATE 2.5 // NOVA EDIT CHANGE #define BLOB_EXPAND_COST 4 // Price to expand onto a new tile #define BLOB_ATTACK_REFUND 2 // Points 'refunded' when the expand attempt actually attacks something instead #define BLOB_BRUTE_RESIST 0.5 // Brute damage taken gets multiplied by this value diff --git a/code/__DEFINES/bodyparts.dm b/code/__DEFINES/bodyparts.dm index b8d7e86f4ae..de721dcf861 100644 --- a/code/__DEFINES/bodyparts.dm +++ b/code/__DEFINES/bodyparts.dm @@ -6,9 +6,9 @@ /// The max damage a limb can take before it stops taking damage. /// Used by the max_damage var. #define LIMB_MAX_HP_PROSTHESIS 20 //Used by surplus prosthesis limbs. -#define LIMB_MAX_HP_DEFAULT 60 //Used by most all limbs by default. // SKYRAT EDIT CHANGE - ORIGINAL : #define LIMB_MAX_HP_DEFAULT 50 +#define LIMB_MAX_HP_DEFAULT 60 //Used by most all limbs by default. // NOVA EDIT CHANGE - ORIGINAL : #define LIMB_MAX_HP_DEFAULT 50 #define LIMB_MAX_HP_ADVANCED 75 //Used by advanced robotic limbs. -#define LIMB_MAX_HP_CORE 250 //Only use this for heads and torsos. // SKYRAT EDIT CHANGE - ORIGINAL : #define LIMB_MAX_HP_CORE 200 +#define LIMB_MAX_HP_CORE 250 //Only use this for heads and torsos. // NOVA EDIT CHANGE - ORIGINAL : #define LIMB_MAX_HP_CORE 200 /// Xenomorph Limbs #define LIMB_MAX_HP_ALIEN_LARVA 50 //Used by the weird larva chest and head. Did you know they have those? diff --git a/code/__DEFINES/cargo.dm b/code/__DEFINES/cargo.dm index 56d3896f0dc..63d5682ef0f 100644 --- a/code/__DEFINES/cargo.dm +++ b/code/__DEFINES/cargo.dm @@ -53,21 +53,14 @@ /// Universal Scanner mode for using the price tagger. #define SCAN_PRICE_TAG 3 -GLOBAL_LIST_EMPTY(supplypod_loading_bays) +///Used by coupons to define that they're cursed +#define COUPON_OMEN "omen" -GLOBAL_LIST_INIT(podstyles, list(\ - list(POD_SHAPE_NORML, "pod", TRUE, "default", "yellow", RUBBLE_NORMAL, "supply pod", "A Nanotrasen supply drop pod."),\ - list(POD_SHAPE_NORML, "advpod", TRUE, "bluespace", "blue", RUBBLE_NORMAL, "bluespace supply pod" , "A Nanotrasen Bluespace supply pod. Teleports back to CentCom after delivery."),\ - list(POD_SHAPE_NORML, "advpod", TRUE, "centcom", "blue", RUBBLE_NORMAL, "\improper CentCom supply pod", "A Nanotrasen supply pod, this one has been marked with Central Command's designations. Teleports back to CentCom after delivery."),\ - list(POD_SHAPE_NORML, "darkpod", TRUE, "syndicate", "red", RUBBLE_NORMAL, "blood-red supply pod", "An intimidating supply pod, covered in the blood-red markings of the Syndicate. It's probably best to stand back from this."),\ - list(POD_SHAPE_NORML, "darkpod", TRUE, "deathsquad", "blue", RUBBLE_NORMAL, "\improper Deathsquad drop pod", "A Nanotrasen drop pod. This one has been marked the markings of Nanotrasen's elite strike team."),\ - list(POD_SHAPE_NORML, "pod", TRUE, "cultist", "red", RUBBLE_NORMAL, "bloody supply pod", "A Nanotrasen supply pod covered in scratch-marks, blood, and strange runes."),\ - list(POD_SHAPE_OTHER, "missile", FALSE, FALSE, FALSE, RUBBLE_THIN, "cruise missile", "A big ass missile that didn't seem to fully detonate. It was likely launched from some far-off deep space missile silo. There appears to be an auxillery payload hatch on the side, though manually opening it is likely impossible."),\ - list(POD_SHAPE_OTHER, "smissile", FALSE, FALSE, FALSE, RUBBLE_THIN, "\improper Syndicate cruise missile", "A big ass, blood-red missile that didn't seem to fully detonate. It was likely launched from some deep space Syndicate missile silo. There appears to be an auxillery payload hatch on the side, though manually opening it is likely impossible."),\ - list(POD_SHAPE_OTHER, "box", TRUE, FALSE, FALSE, RUBBLE_WIDE, "\improper Aussec supply crate", "An incredibly sturdy supply crate, designed to withstand orbital re-entry. Has 'Aussec Armory - 2532' engraved on the side."),\ - list(POD_SHAPE_NORML, "clownpod", TRUE, "clown", "green", RUBBLE_NORMAL, "\improper HONK pod", "A brightly-colored supply pod. It likely originated from the Clown Federation."),\ - list(POD_SHAPE_OTHER, "orange", TRUE, FALSE, FALSE, RUBBLE_NONE, "\improper Orange", "An angry orange."),\ - list(POD_SHAPE_OTHER, FALSE, FALSE, FALSE, FALSE, RUBBLE_NONE, "\improper S.T.E.A.L.T.H. pod MKVII", "A supply pod that, under normal circumstances, is completely invisible to conventional methods of detection. How are you even seeing this?"),\ - list(POD_SHAPE_OTHER, "gondola", FALSE, FALSE, FALSE, RUBBLE_NONE, "gondola", "The silent walker. This one seems to be part of a delivery agency."),\ - list(POD_SHAPE_OTHER, FALSE, FALSE, FALSE, FALSE, RUBBLE_NONE, FALSE, FALSE, "rl_click", "give_po")\ -)) +///Discount categories for coupons. This one is for anything that isn't discountable. +#define SUPPLY_PACK_NOT_DISCOUNTABLE null +///Discount category for the standard stuff, mostly goodies. +#define SUPPLY_PACK_STD_DISCOUNTABLE "standard_discount" +///Discount category for stuff that's mostly niche and/or that might be useful. +#define SUPPLY_PACK_UNCOMMON_DISCOUNTABLE "uncommon_discount" +///Discount category for the silly, overpriced, joke content, sometimes useful or plain bad. +#define SUPPLY_PACK_RARE_DISCOUNTABLE "rare_discount" diff --git a/code/__DEFINES/communications.dm b/code/__DEFINES/communications.dm index 813179974f9..94b53cd8bc9 100644 --- a/code/__DEFINES/communications.dm +++ b/code/__DEFINES/communications.dm @@ -4,7 +4,7 @@ /// The extended time an admin has to cancel a cross-sector message if they pass the filter, for instance #define EXTENDED_CROSS_SECTOR_CANCEL_TIME (30 SECONDS) -// SKYRAT EDIT REMOVAL BEGIN - modularized into code/__DEFINES/~skyrat_defines/security_alerts.dm +// NOVA EDIT REMOVAL BEGIN - modularized into code/__DEFINES/~skyrat_defines/security_alerts.dm /* //Security levels affect the escape shuttle timer /// Security level is green. (no threats) @@ -16,4 +16,4 @@ /// Security level is delta. (station destruction immiment) #define SEC_LEVEL_DELTA 3 */ -//SKYRAT EDIT REMOVAL END +//NOVA EDIT REMOVAL END diff --git a/code/__DEFINES/construction/material.dm b/code/__DEFINES/construction/material.dm index dad575c58c3..294fe6364cd 100644 --- a/code/__DEFINES/construction/material.dm +++ b/code/__DEFINES/construction/material.dm @@ -40,26 +40,6 @@ ///If the user won't receive a warning when attacking the container with an unallowed item. #define MATCONTAINER_SILENT (1<<3) -// The following flags are for decomposing alloys. Should be expanded upon and diversified once someone gets around to reworking recycling. -/// Can reduce an alloy into its component materials. -#define BREAKDOWN_ALLOYS (1<<4) -/// Makes the material composition include transmuted materials objects -#define BREAKDOWN_INCLUDE_ALCHEMY (1<<5) -/// Breakdown flags used by techfabs and circuit printers. -#define BREAKDOWN_FLAGS_LATHE (BREAKDOWN_ALLOYS) -/// Breakdown flags used by the ORM. -#define BREAKDOWN_FLAGS_ORM (BREAKDOWN_ALLOYS) -/// Breakdown flags used by the recycler. -#define BREAKDOWN_FLAGS_RECYCLER (BREAKDOWN_ALLOYS) -/// Breakdown flags used by the sheetifier. -#define BREAKDOWN_FLAGS_SHEETIFIER (BREAKDOWN_ALLOYS) -/// Breakdown flags used by the ore processor. -#define BREAKDOWN_FLAGS_ORE_PROCESSOR (BREAKDOWN_ALLOYS) -/// Breakdown flags used by the drone dispenser. -#define BREAKDOWN_FLAGS_DRONE_DISPENSER (BREAKDOWN_ALLOYS) -/// Breakdown flags used when exporting materials. -#define BREAKDOWN_FLAGS_EXPORT (NONE) - /// Whether a material's mechanical effects should apply to the atom. This is necessary for other flags to work. #define MATERIAL_EFFECTS (1<<0) /// Applies the material color to the atom's color. Deprecated, use MATERIAL_GREYSCALE instead diff --git a/code/__DEFINES/dcs/signals/signals_circuit.dm b/code/__DEFINES/dcs/signals/signals_circuit.dm index 1b7b6b53c4f..c0676d768ce 100644 --- a/code/__DEFINES/dcs/signals/signals_circuit.dm +++ b/code/__DEFINES/dcs/signals/signals_circuit.dm @@ -75,3 +75,9 @@ ///Called when an Ntnet sender is sending Ntnet data #define COMSIG_GLOB_CIRCUIT_NTNET_DATA_SENT "!circuit_ntnet_data_sent" + +/// Called when an equipment action component is added to a shell (/obj/item/circuit_component/equipment_action/action_comp) +#define COMSIG_CIRCUIT_ACTION_COMPONENT_REGISTERED "circuit_action_component_registered" + +/// Called when an equipment action component is removed from a shell (/obj/item/circuit_component/equipment_action/action_comp) +#define COMSIG_CIRCUIT_ACTION_COMPONENT_UNREGISTERED "circuit_action_component_unregistered" diff --git a/code/__DEFINES/dcs/signals/signals_material_container.dm b/code/__DEFINES/dcs/signals/signals_material_container.dm index f33567a2739..2c77be55c31 100644 --- a/code/__DEFINES/dcs/signals/signals_material_container.dm +++ b/code/__DEFINES/dcs/signals/signals_material_container.dm @@ -2,10 +2,14 @@ /// Called from datum/component/material_container/proc/can_hold_material() : (mat) #define COMSIG_MATCONTAINER_MAT_CHECK "matcontainer_mat_check" #define MATCONTAINER_ALLOW_MAT (1<<0) -/// Called from datum/component/material_container/proc/user_insert() : (held_item, user) +/// Called from datum/component/material_container/proc/user_insert() : (target_item, user) #define COMSIG_MATCONTAINER_PRE_USER_INSERT "matcontainer_pre_user_insert" #define MATCONTAINER_BLOCK_INSERT (1<<1) -/// Called from datum/component/material_container/proc/insert_item() : (target, last_inserted_id, mats_consumed, material_amount, context) +/// Called from datum/component/material_container/proc/insert_item() : (item, primary_mat, mats_consumed, material_amount, context) #define COMSIG_MATCONTAINER_ITEM_CONSUMED "matcontainer_item_consumed" -/// Called from datum/component/material_container/proc/retrieve_sheets() : (sheets, context) +/// Called from datum/component/material_container/proc/retrieve_sheets() : (new_sheets, context) #define COMSIG_MATCONTAINER_SHEETS_RETRIEVED "matcontainer_sheets_retrieved" + +//mat container signals but from the ore silo's perspective +/// Called from /obj/machinery/ore_silo/on_item_consumed() : (container, item_inserted, last_inserted_id, mats_consumed, amount_inserted) +#define COMSIG_SILO_ITEM_CONSUMED "silo_item_consumed" diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_silicon.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_silicon.dm index 07e93bebcf3..47f5b748599 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_silicon.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_silicon.dm @@ -3,8 +3,6 @@ ///sent from borg mobs to itself, for tools to catch an upcoming destroy() due to safe decon (rather than detonation) #define COMSIG_BORG_SAFE_DECONSTRUCT "borg_safe_decon" ///called from /obj/item/borg/cyborghug/attack proc -#define COMSIG_BORG_TOUCH_MOB "borg_touch_mob" -///called from /obj/item/borg/cyborghug/attack proc #define COMSIG_BORG_HUG_MOB "borg_hug_mob" ///returned if this action was handled by signal handler. #define COMSIG_BORG_HUG_HANDLED 1 diff --git a/code/__DEFINES/dcs/signals/signals_moveloop.dm b/code/__DEFINES/dcs/signals/signals_moveloop.dm index 38ab63a5969..8a354f8bfbb 100644 --- a/code/__DEFINES/dcs/signals/signals_moveloop.dm +++ b/code/__DEFINES/dcs/signals/signals_moveloop.dm @@ -9,3 +9,5 @@ #define COMSIG_MOVELOOP_POSTPROCESS "moveloop_postprocess" //from [/datum/move_loop/has_target/jps/recalculate_path] (): #define COMSIG_MOVELOOP_JPS_REPATH "moveloop_jps_repath" +///from [/datum/move_loop/has_target/jps/on_finish_pathing] +#define COMSIG_MOVELOOP_JPS_FINISHED_PATHING "moveloop_jps_finished_pathing" diff --git a/code/__DEFINES/fonts.dm b/code/__DEFINES/fonts.dm index eab28820c41..14c221b22fa 100644 --- a/code/__DEFINES/fonts.dm +++ b/code/__DEFINES/fonts.dm @@ -13,7 +13,7 @@ #define SIGNATURE_FONT "Segoe Script" /// Emoji icon set -#define EMOJI_SET 'modular_skyrat/master_files/icons/emoji.dmi' // SKYRAT EDIT - ORIGINAL: 'icons/ui_icons/emoji/emoji.dmi' +#define EMOJI_SET 'modular_nova/master_files/icons/emoji.dmi' // NOVA EDIT - ORIGINAL: 'icons/ui_icons/emoji/emoji.dmi' // Font metrics bitfield /// Include leading A width and trailing C width in GetWidth() or in DrawText() diff --git a/code/__DEFINES/food.dm b/code/__DEFINES/food.dm index 85ced17e67c..e1c9185914f 100644 --- a/code/__DEFINES/food.dm +++ b/code/__DEFINES/food.dm @@ -19,7 +19,7 @@ #define BUGS (1<<18) #define GORE (1<<19) #define STONE (1<<20) -#define BLOODY (1<<21) // SKYRAT EDIT - Hemophage Food +#define BLOODY (1<<21) // NOVA EDIT - Hemophage Food DEFINE_BITFIELD(foodtypes, list( "MEAT" = MEAT, @@ -43,7 +43,7 @@ DEFINE_BITFIELD(foodtypes, list( "BUGS" = BUGS, "GORE" = GORE, "STONE" = STONE, - "BLOODY" = BLOODY, // SKYRAT EDIT - Hemophage Food + "BLOODY" = BLOODY, // NOVA EDIT - Hemophage Food )) /// A list of food type names, in order of their flags @@ -69,7 +69,7 @@ DEFINE_BITFIELD(foodtypes, list( "BUGS", \ "GORE", \ "STONE", \ - "BLOODY", /* SKYRAT EDIT - Hemophage Food */ \ + "BLOODY", /* NOVA EDIT - Hemophage Food */ \ ) /// IC meaning (more or less) for food flags @@ -95,7 +95,7 @@ DEFINE_BITFIELD(foodtypes, list( "Bugs", \ "Gore", \ "Rocks", \ - "Bloody", /* SKYRAT EDIT - Hemophage Food */ \ + "Bloody", /* NOVA EDIT - Hemophage Food */ \ ) #define DRINK_REVOLTING 1 @@ -182,7 +182,7 @@ DEFINE_BITFIELD(food_flags, list( "FOOD_IN_CONTAINER" = FOOD_IN_CONTAINER, )) -#define STOP_SERVING_BREAKFAST (35 MINUTES) // SKYRAT EDIT - ORIGINAL: 15 MINUTES +#define STOP_SERVING_BREAKFAST (35 MINUTES) // NOVA EDIT - ORIGINAL: 15 MINUTES #define FOOD_MEAT_NORMAL 5 #define FOOD_MEAT_HUMAN 50 diff --git a/code/__DEFINES/icon_smoothing.dm b/code/__DEFINES/icon_smoothing.dm index c00361184a5..63bfb4192af 100644 --- a/code/__DEFINES/icon_smoothing.dm +++ b/code/__DEFINES/icon_smoothing.dm @@ -131,14 +131,14 @@ DEFINE_BITFIELD(smoothing_junction, list( #define SMOOTH_GROUP_SURVIVAL_TITANIUM_WALLS S_TURF(59) ///turf/closed/wall/mineral/titanium/survival #define SMOOTH_GROUP_TURF_OPEN_CLIFF S_TURF(60) ///turf/open/cliff -// SKYRAT EDIT ADDITION +// NOVA EDIT ADDITION #define SMOOTH_GROUP_ELEVATED_PLASTEEL S_TURF(61) #define SMOOTH_GROUP_LOWERED_PLASTEEL S_TURF(62) #define SMOOTH_GROUP_FISSURE S_TURF(63) #define MAX_S_TURF 63 //Always match this value with the one above it. -//SKYRAT EDIT END +//NOVA EDIT END #define S_OBJ(num) ("-" + #num + ",") @@ -162,10 +162,10 @@ DEFINE_BITFIELD(smoothing_junction, list( #define SMOOTH_GROUP_BAMBOO_WALLS S_TURF(17) //![/turf/closed/wall/mineral/bamboo, /obj/structure/falsewall/bamboo] #define SMOOTH_GROUP_PLASTINUM_WALLS S_TURF(18) //![turf/closed/indestructible/riveted/plastinum] -//SKYRAT EDIT ADDITION +//NOVA EDIT ADDITION #define SMOOTH_GROUP_SHIPWALLS S_OBJ(19) ///turf/closed/wall/mineral/titanium/spaceship #define SMOOTH_GROUP_STONE_WALLS S_OBJ(20) ///turf/closed/wall/mineral/stone, /obj/structure/falsewall/stone -//SKYRAT EDIT END +//NOVA EDIT END #define SMOOTH_GROUP_PAPERFRAME S_OBJ(21) ///obj/structure/window/paperframe, /obj/structure/mineral_door/paperframe @@ -207,11 +207,11 @@ DEFINE_BITFIELD(smoothing_junction, list( #define SMOOTH_GROUP_GAS_TANK S_OBJ(72) -//SKYRAT EDIT ADDITION +//NOVA EDIT ADDITION #define SMOOTH_GROUP_SHUTTERS S_OBJ(73) #define SMOOTH_GROUP_WATER S_OBJ(74) ///obj/effect/abstract/liquid_turf -//SKYRAT EDIT END +//NOVA EDIT END /// Performs the work to set smoothing_groups and canSmoothWith. /// An inlined function used in both turf/Initialize and atom/Initialize. diff --git a/code/__DEFINES/inventory.dm b/code/__DEFINES/inventory.dm index f164c78d422..f77bbda463e 100644 --- a/code/__DEFINES/inventory.dm +++ b/code/__DEFINES/inventory.dm @@ -90,7 +90,7 @@ ///hides mutant/moth wings, does not apply to functional wings #define HIDEMUTWINGS (1<<13) -//SKYRAT EDIT ADDITION: CUSTOM EAR TOGGLE FOR ANTHRO/ETC EAR SHOWING - +//NOVA EDIT ADDITION: CUSTOM EAR TOGGLE FOR ANTHRO/ETC EAR SHOWING - /// Manually set this on items you want anthro ears to show on! #define SHOWSPRITEEARS (1<<14) /// Does this sprite hide the tail? @@ -99,7 +99,7 @@ #define HIDESPINE (1<<16) /// Does this sprite hide devious devices? #define HIDESEXTOY (1<<17) -//SKYRAT EDIT ADDITION END +//NOVA EDIT ADDITION END //bitflags for clothing coverage - also used for limbs #define HEAD (1<<0) @@ -133,10 +133,10 @@ #define FEMALE_UNIFORM_TOP_ONLY (1<<1) /// For when you don't want the "breast" effect to be applied (the one that cuts two pixels in the middle of the front of the uniform when facing east or west). #define FEMALE_UNIFORM_NO_BREASTS (1<<2) -// SKYRAT EDIT ADDITION START +// NOVA EDIT ADDITION START /// For when you -don't- want to apply FEMALE_UNIFORM_TOP_ONLY to the digi version (which happens by default). #define FEMALE_UNIFORM_DIGI_FULL (1<<3) -// SKYRAT EDIT ADDITION END +// NOVA EDIT ADDITION END //flags for alternate styles: These are hard sprited so don't set this if you didn't put the effort in #define NORMAL_STYLE 0 @@ -152,7 +152,7 @@ #define CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON (1<<2) ///has a sprite for monkeys #define CLOTHING_MONKEY_VARIATION (1<<3) -// SKYRAT EDIT ADDITION START +// NOVA EDIT ADDITION START /// The sprite works fine for snouts. #define CLOTHING_SNOUTED_VARIATION (1<<4) /// The sprite works fine for snouts as-is. @@ -165,7 +165,7 @@ #define CLOTHING_SNOUTED_BETTER_VOX_VARIATION (1<<8) /// The sprite works fine for vox snouts as is. #define CLOTHING_SNOUTED_BETTER_VOX_VARIATION_NO_NEW_ICON (1<<9) -// SKYRAT EDIT END +// NOVA EDIT END //flags for covering body parts #define GLASSESCOVERSEYES (1<<0) @@ -210,7 +210,7 @@ GLOBAL_LIST_INIT(detective_vest_allowed, list( /obj/item/storage/belt/holster/nukie, /obj/item/storage/belt/holster/energy, /obj/item/gun/ballistic/shotgun/automatic/combat/compact, - /obj/item/gun/microfusion, //SKYRAT EDIT ADDITION + /obj/item/gun/microfusion, //NOVA EDIT ADDITION )) GLOBAL_LIST_INIT(security_vest_allowed, list( @@ -228,7 +228,7 @@ GLOBAL_LIST_INIT(security_vest_allowed, list( /obj/item/storage/belt/holster/energy, /obj/item/gun/ballistic/shotgun/automatic/combat/compact, /obj/item/pen/red/security, - /obj/item/gun/microfusion, //SKYRAT EDIT ADDITION + /obj/item/gun/microfusion, //NOVA EDIT ADDITION )) GLOBAL_LIST_INIT(security_wintercoat_allowed, list( @@ -241,7 +241,7 @@ GLOBAL_LIST_INIT(security_wintercoat_allowed, list( /obj/item/storage/belt/holster/nukie, /obj/item/storage/belt/holster/energy, /obj/item/gun/ballistic/shotgun/automatic/combat/compact, - /obj/item/gun/microfusion, //SKYRAT EDIT ADDITION + /obj/item/gun/microfusion, //NOVA EDIT ADDITION )) //Allowed list for all chaplain suits (except the honkmother robe) diff --git a/code/__DEFINES/jobs.dm b/code/__DEFINES/jobs.dm index 7feca0782dc..7e09a7ea178 100644 --- a/code/__DEFINES/jobs.dm +++ b/code/__DEFINES/jobs.dm @@ -60,18 +60,18 @@ #define JOB_SECURITY_OFFICER_ENGINEERING "Security Officer (Engineering)" #define JOB_SECURITY_OFFICER_SCIENCE "Security Officer (Science)" #define JOB_SECURITY_OFFICER_SUPPLY "Security Officer (Cargo)" -#define JOB_CORRECTIONS_OFFICER "Corrections Officer" // SKYRAT EDIT ADDITION +#define JOB_CORRECTIONS_OFFICER "Corrections Officer" // NOVA EDIT ADDITION //Engineering #define JOB_STATION_ENGINEER "Station Engineer" #define JOB_ATMOSPHERIC_TECHNICIAN "Atmospheric Technician" -#define JOB_ENGINEERING_GUARD "Engineering Guard" // SKYRAT EDIT ADDITION +#define JOB_ENGINEERING_GUARD "Engineering Guard" // NOVA EDIT ADDITION //Medical #define JOB_CORONER "Coroner" #define JOB_MEDICAL_DOCTOR "Medical Doctor" #define JOB_PARAMEDIC "Paramedic" #define JOB_CHEMIST "Chemist" #define JOB_VIROLOGIST "Virologist" -#define JOB_ORDERLY "Orderly" // SKYRAT EDIT ADDITION +#define JOB_ORDERLY "Orderly" // NOVA EDIT ADDITION //Science #define JOB_SCIENTIST "Scientist" #define JOB_ROBOTICIST "Roboticist" @@ -82,7 +82,7 @@ #define JOB_CARGO_TECHNICIAN "Cargo Technician" #define JOB_SHAFT_MINER "Shaft Miner" #define JOB_BITRUNNER "Bitrunner" -#define JOB_CUSTOMS_AGENT "Customs Agent" // SKYRAT EDIT ADDITION +#define JOB_CUSTOMS_AGENT "Customs Agent" // NOVA EDIT ADDITION //Service #define JOB_BARTENDER "Bartender" #define JOB_BOTANIST "Botanist" @@ -94,8 +94,8 @@ #define JOB_LAWYER "Lawyer" #define JOB_CHAPLAIN "Chaplain" #define JOB_PSYCHOLOGIST "Psychologist" -#define JOB_BARBER "Barber" // SKYRAT EDIT ADDITION -#define JOB_BOUNCER "Service Guard" // SKYRAT EDIT ADDITION +#define JOB_BARBER "Barber" // NOVA EDIT ADDITION +#define JOB_BOUNCER "Service Guard" // NOVA EDIT ADDITION //ERTs #define JOB_ERT_DEATHSQUAD "Death Commando" #define JOB_ERT_COMMANDER "Emergency Response Team Commander" @@ -118,7 +118,7 @@ #define JOB_CENTCOM_RESEARCH_OFFICER "Research Officer" #define JOB_CENTCOM_SPECIAL_OFFICER "Special Ops Officer" #define JOB_CENTCOM_PRIVATE_SECURITY "Private Security Force" -// SKYRAT EDIT ADDITION START +// NOVA EDIT ADDITION START #define JOB_BLUESHIELD "Blueshield" #define JOB_NT_REP "Nanotrasen Consultant" // Nanotrasen Naval Command jobs @@ -134,7 +134,7 @@ #define JOB_SPACE_POLICE "Space Police" #define JOB_SOLFED "SolFed" #define JOB_SOLFED_LIASON "SolFed Liason" -// SKYRAT EDIT ADDITION END +// NOVA EDIT ADDITION END #define JOB_GROUP_ENGINEERS list( \ JOB_STATION_ENGINEER, \ @@ -179,16 +179,16 @@ #define JOB_DISPLAY_ORDER_DETECTIVE 35 #define JOB_DISPLAY_ORDER_SECURITY_OFFICER 36 #define JOB_DISPLAY_ORDER_PRISONER 37 -#define JOB_DISPLAY_ORDER_SECURITY_MEDIC 38 //SKYRAT EDIT ADDITON -#define JOB_DISPLAY_ORDER_CORRECTIONS_OFFICER 39 //SKYRAT EDIT ADDITON -#define JOB_DISPLAY_ORDER_NANOTRASEN_CONSULTANT 40 //SKYRAT EDIT ADDITON -#define JOB_DISPLAY_ORDER_BLUESHIELD 41 //SKYRAT EDIT ADDITON -#define JOB_DISPLAY_ORDER_ORDERLY 42 //SKYRAT EDIT ADDITION -#define JOB_DISPLAY_ORDER_SCIENCE_GUARD 43 //SKYRAT EDIT ADDITION -#define JOB_DISPLAY_ORDER_BOUNCER 44 //SKYRAT EDIT ADDITION -#define JOB_DISPLAY_ORDER_ENGINEER_GUARD 45 //SKYRAT EDIT ADDITION -#define JOB_DISPLAY_ORDER_CUSTOMS_AGENT 46 //SKYRAT EDIT ADDITION -#define JOB_DISPLAY_ORDER_EXP_CORPS 47 //SKYRAT EDIT ADDITON +#define JOB_DISPLAY_ORDER_SECURITY_MEDIC 38 //NOVA EDIT ADDITON +#define JOB_DISPLAY_ORDER_CORRECTIONS_OFFICER 39 //NOVA EDIT ADDITON +#define JOB_DISPLAY_ORDER_NANOTRASEN_CONSULTANT 40 //NOVA EDIT ADDITON +#define JOB_DISPLAY_ORDER_BLUESHIELD 41 //NOVA EDIT ADDITON +#define JOB_DISPLAY_ORDER_ORDERLY 42 //NOVA EDIT ADDITION +#define JOB_DISPLAY_ORDER_SCIENCE_GUARD 43 //NOVA EDIT ADDITION +#define JOB_DISPLAY_ORDER_BOUNCER 44 //NOVA EDIT ADDITION +#define JOB_DISPLAY_ORDER_ENGINEER_GUARD 45 //NOVA EDIT ADDITION +#define JOB_DISPLAY_ORDER_CUSTOMS_AGENT 46 //NOVA EDIT ADDITION +#define JOB_DISPLAY_ORDER_EXP_CORPS 47 //NOVA EDIT ADDITON #define DEPARTMENT_UNASSIGNED "No Department" @@ -212,8 +212,8 @@ #define DEPARTMENT_ASSISTANT "Assistant" #define DEPARTMENT_BITFLAG_CAPTAIN (1<<9) #define DEPARTMENT_CAPTAIN "Captain" -#define DEPARTMENT_BITFLAG_CENTRAL_COMMAND (1<<10) //SKYRAT EDIT CHANGE -#define DEPARTMENT_CENTRAL_COMMAND "Central Command" //SKYRAT EDIT CHANGE +#define DEPARTMENT_BITFLAG_CENTRAL_COMMAND (1<<10) //NOVA EDIT CHANGE +#define DEPARTMENT_CENTRAL_COMMAND "Central Command" //NOVA EDIT CHANGE /* Job datum job_flags */ /// Whether the mob is announced on arrival. diff --git a/code/__DEFINES/lag_switch.dm b/code/__DEFINES/lag_switch.dm index 2152d0d9a55..fc0922a33d3 100644 --- a/code/__DEFINES/lag_switch.dm +++ b/code/__DEFINES/lag_switch.dm @@ -16,8 +16,8 @@ #define DISABLE_PARALLAX 7 /// Disables footsteps, TRAIT_BYPASS_MEASURES exempted #define DISABLE_FOOTSTEPS 8 -// SKYRAT EDIT ADDITION +// NOVA EDIT ADDITION /// Stops people from changing things in the character creator. Entirely. #define DISABLE_CREATOR 9 -// SKYRAT EDIT END -#define MEASURES_AMOUNT 9 // The total number of switches defined above // SKYRAT EDIT ADDITION +// NOVA EDIT END +#define MEASURES_AMOUNT 9 // The total number of switches defined above // NOVA EDIT ADDITION diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm index 0cdad4f7241..1ba6879005b 100644 --- a/code/__DEFINES/layers.dm +++ b/code/__DEFINES/layers.dm @@ -2,35 +2,31 @@ //KEEP THESE IN A NICE ACSCENDING ORDER, PLEASE //NEVER HAVE ANYTHING BELOW THIS PLANE ADJUST IF YOU NEED MORE SPACE -#define LOWEST_EVER_PLANE -100 +#define LOWEST_EVER_PLANE -50 -#define FIELD_OF_VISION_BLOCKER_PLANE -90 +// Doesn't really layer, just throwing this in here cause it's the best place imo +#define FIELD_OF_VISION_BLOCKER_PLANE -45 #define FIELD_OF_VISION_BLOCKER_RENDER_TARGET "*FIELD_OF_VISION_BLOCKER_RENDER_TARGET" -#define CLICKCATCHER_PLANE -80 +#define CLICKCATCHER_PLANE -40 -#define PLANE_SPACE -25 +#define PLANE_SPACE -21 #define PLANE_SPACE_PARALLAX -20 -#define GRAVITY_PULSE_PLANE -13 +#define GRAVITY_PULSE_PLANE -12 #define GRAVITY_PULSE_RENDER_TARGET "*GRAVPULSE_RENDER_TARGET" -#define RENDER_PLANE_TRANSPARENT -12 //Transparent plane that shows openspace underneath the floor +#define RENDER_PLANE_TRANSPARENT -11 //Transparent plane that shows openspace underneath the floor -#define TRANSPARENT_FLOOR_PLANE -11 +#define TRANSPARENT_FLOOR_PLANE -10 -#define FLOOR_PLANE -10 - -#define WALL_PLANE -9 -#define GAME_PLANE -8 -#define GAME_PLANE_FOV_HIDDEN -7 -#define GAME_PLANE_UPPER -6 -#define WALL_PLANE_UPPER -5 -#define GAME_PLANE_UPPER_FOV_HIDDEN -4 +#define FLOOR_PLANE -6 +#define WALL_PLANE -5 +#define GAME_PLANE -4 +#define ABOVE_GAME_PLANE -3 ///Slightly above the game plane but does not catch mouse clicks. Useful for certain visuals that should be clicked through, like seethrough trees -#define SEETHROUGH_PLANE -3 -#define ABOVE_GAME_PLANE -2 +#define SEETHROUGH_PLANE -2 #define RENDER_PLANE_GAME_WORLD -1 @@ -91,31 +87,36 @@ //-------------------- HUD --------------------- //HUD layer defines -#define HUD_PLANE 40 -#define ABOVE_HUD_PLANE 41 +#define HUD_PLANE 35 +#define ABOVE_HUD_PLANE 36 ///Plane of the "splash" icon used that shows on the lobby screen -#define SPLASHSCREEN_PLANE 50 +#define SPLASHSCREEN_PLANE 37 // The largest plane here must still be less than RENDER_PLANE_GAME //-------------------- Rendering --------------------- -#define RENDER_PLANE_GAME 100 -#define RENDER_PLANE_NON_GAME 101 +#define RENDER_PLANE_GAME 40 +/// If fov is enabled we'll draw game to this and do shit to it +#define RENDER_PLANE_GAME_MASKED 41 +/// The bit of the game plane that is let alone is sent here +#define RENDER_PLANE_GAME_UNMASKED 42 +#define RENDER_PLANE_NON_GAME 45 // Only VERY special planes should be here, as they are above not just the game, but the UI planes as well. /// Plane related to the menu when pressing Escape. /// Needed so that we can apply a blur effect to EVERYTHING, and guarantee we are above all UI. -#define ESCAPE_MENU_PLANE 105 +#define ESCAPE_MENU_PLANE 46 -#define RENDER_PLANE_MASTER 110 +#define RENDER_PLANE_MASTER 50 // Lummox I swear to god I will find you // NOTE! You can only ever have planes greater then -10000, if you add too many with large offsets you will brick multiz // Same can be said for large multiz maps. Tread carefully mappers #define HIGHEST_EVER_PLANE RENDER_PLANE_MASTER /// The range unique planes can be in +/// Try and keep this to a nice whole number, so it's easy to look at a plane var and know what's going on #define PLANE_RANGE (HIGHEST_EVER_PLANE - LOWEST_EVER_PLANE) // PLANE_SPACE layer(s) @@ -188,8 +189,6 @@ #define NOT_HIGH_OBJ_LAYER 3.5 #define HIGH_OBJ_LAYER 3.6 #define BELOW_MOB_LAYER 3.7 - -// GAME_PLANE_FOV_HIDDEN layers #define LOW_MOB_LAYER 3.75 #define LYING_MOB_LAYER 3.8 #define VEHICLE_LAYER 3.9 @@ -199,21 +198,16 @@ #define MOB_ABOVE_PIGGYBACK_LAYER 4.06 #define MOB_UPPER_LAYER 4.07 #define HITSCAN_PROJECTILE_LAYER 4.09 //above all mob but still hidden by FoV - -// GAME_PLANE_UPPER layers #define ABOVE_MOB_LAYER 4.1 #define WALL_OBJ_LAYER 4.25 #define TRAM_SIGNAL_LAYER 4.26 -// WALL_PLANE_UPPER layers #define EDGED_TURF_LAYER 4.3 #define ON_EDGED_TURF_LAYER 4.35 - -// GAME_PLANE_UPPER_FOV_HIDDEN layers #define SPACEVINE_LAYER 4.4 #define LARGE_MOB_LAYER 4.5 #define SPACEVINE_MOB_LAYER 4.6 -// Intermediate layer used by both GAME_PLANE_FOV_HIDDEN and ABOVE_GAME_PLANE +// Intermediate layer used by both GAME_PLANE and ABOVE_GAME_PLANE #define ABOVE_ALL_MOB_LAYER 4.7 // ABOVE_GAME_PLANE layers @@ -229,6 +223,8 @@ */ #define WATER_VISUAL_OVERLAY_LAYER 1000 +// SEETHROUGH_PLANE layers here, tho it has no layer values + //---------- LIGHTING ------------- // LIGHTING_PLANE layers diff --git a/code/__DEFINES/lazy_templates.dm b/code/__DEFINES/lazy_templates.dm index 1e8fab8d92c..1f715778f0d 100644 --- a/code/__DEFINES/lazy_templates.dm +++ b/code/__DEFINES/lazy_templates.dm @@ -11,4 +11,4 @@ "Abductor Ships" = LAZY_TEMPLATE_KEY_ABDUCTOR_SHIPS, \ "Heretic Sacrifice Level" = LAZY_TEMPLATE_KEY_HERETIC_SACRIFICE, \ "Outpost of Cogs" = LAZY_TEMPLATE_KEY_OUTPOST_OF_COGS, \ -) // SKYRAT EDIT ABOVE - OUTPOST OF COGS +) // NOVA EDIT ABOVE - OUTPOST OF COGS diff --git a/code/__DEFINES/lighting.dm b/code/__DEFINES/lighting.dm index dba718901fb..576164bd136 100644 --- a/code/__DEFINES/lighting.dm +++ b/code/__DEFINES/lighting.dm @@ -22,7 +22,7 @@ /// frequency, in 1/10ths of a second, of the lighting process #define LIGHTING_INTERVAL 5 -#define MINIMUM_USEFUL_LIGHT_RANGE 1.5 // SKYRAT EDIT CHANGE - Original value 1.4 +#define MINIMUM_USEFUL_LIGHT_RANGE 1.5 // NOVA EDIT CHANGE - Original value 1.4 /// type of falloff to use for lighting; 1 for circular, 2 for square #define LIGHTING_FALLOFF 1 diff --git a/code/__DEFINES/machines.dm b/code/__DEFINES/machines.dm index d5f7c1d1517..62f201f015e 100644 --- a/code/__DEFINES/machines.dm +++ b/code/__DEFINES/machines.dm @@ -66,10 +66,10 @@ /// For wiremod/integrated circuits. Uses various minerals. #define COMPONENT_PRINTER (1<<10) //Note: More than one of these can be added to a design but imprinter and lathe designs are incompatable. -// SKYRAT EDIT ADDITION +// NOVA EDIT ADDITION /// Can be made by the orderable colony fabricator #define COLONY_FABRICATOR (1<<11) -// SKYRAT EDIT END +// NOVA EDIT END #define FIREDOOR_OPEN 1 #define FIREDOOR_CLOSED 2 diff --git a/code/__DEFINES/map_exporter.dm b/code/__DEFINES/map_exporter.dm new file mode 100644 index 00000000000..becedcd23e5 --- /dev/null +++ b/code/__DEFINES/map_exporter.dm @@ -0,0 +1,14 @@ +//Bits to save +#define SAVE_OBJECTS (1 << 1) //! Save objects? +#define SAVE_MOBS (1 << 2) //! Save Mobs? +#define SAVE_TURFS (1 << 3) //! Save turfs? +#define SAVE_AREAS (1 << 4) //! Save areas? +#define SAVE_SPACE (1 << 5) //! Save space areas? (If not they will be saved as NOOP) +#define SAVE_OBJECT_PROPERTIES (1 << 6) //! Save custom properties of objects (obj.on_object_saved() output) + +//Ignore turf if it contains +#define SAVE_SHUTTLEAREA_DONTCARE 0 +#define SAVE_SHUTTLEAREA_IGNORE 1 +#define SAVE_SHUTTLEAREA_ONLY 2 + +#define DMM2TGM_MESSAGE "MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE" diff --git a/code/__DEFINES/matrices.dm b/code/__DEFINES/matrices.dm index 1bb86f9ff47..26ff5a7232a 100644 --- a/code/__DEFINES/matrices.dm +++ b/code/__DEFINES/matrices.dm @@ -1,3 +1,27 @@ /// Helper macro for creating a matrix at the given offsets. /// Works at compile time. #define TRANSLATE_MATRIX(offset_x, offset_y) matrix(1, 0, (offset_x), 0, 1, (offset_y)) +/// The color matrix of an image which colors haven't been altered. Does nothing. +#define COLOR_MATRIX_IDENTITY list(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1, 0,0,0,0) +/// Color inversion +#define COLOR_MATRIX_INVERT list(-1,0,0,0, 0,-1,0,0, 0,0,-1,0, 0,0,0,1, 1,1,1,0) +///Sepiatone +#define COLOR_MATRIX_SEPIATONE list(0.393,0.349,0.272,0, 0.769,0.686,0.534,0, 0.189,0.168,0.131,0, 0,0,0,1, 0,0,0,0) +///Grayscale +#define COLOR_MATRIX_GRAYSCALE list(0.33,0.33,0.33,0, 0.59,0.59,0.59,0, 0.11,0.11,0.11,0, 0,0,0,1, 0,0,0,0) +///Polaroid colors +#define COLOR_MATRIX_POLAROID list(1.438,-0.062,-0.062,0, -0.122,1.378,-0.122,0, -0.016,-0.016,1.483,0, 0,0,0,1, 0,0,0,0) +/// Converts reds to blue, green to red and blue to green. +#define COLOR_MATRIX_BRG list(0,0,1,0, 0,1,0,0, 1,0,0,0, 0,0,0,1, 0,0,0,0) +/// Black & White +#define COLOR_MATRIX_BLACK_WHITE list(1.5,1.5,1.5,0, 1.5,1.5,1.5,0, 1.5,1.5,1.5,0, 0,0,0,1, -1,-1,-1,0) +/** + * Adds/subtracts overall lightness + * 0 is identity, 1 makes everything white, -1 makes everything black + */ +#define COLOR_MATRIX_LIGHTNESS(power) list(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1, power,power,power,0) +/** + * Changes distance colors have from rgb(127,127,127) grey + * 1 is identity. 0 makes everything grey >1 blows out colors and greys + */ +#define COLOR_MATRIX_CONTRAST(val) list(val,0,0,0, 0,val,0,0, 0,0,val,0, 0,0,0,1, (1-val)*0.5,(1-val)*0.5,(1-val)*0.5,0) diff --git a/code/__DEFINES/melee.dm b/code/__DEFINES/melee.dm index 6cc9f47fa18..df7320f5085 100644 --- a/code/__DEFINES/melee.dm +++ b/code/__DEFINES/melee.dm @@ -11,4 +11,4 @@ #define MARTIALART_WRESTLING "wrestling" /// The number of hits required to crit a target -#define HITS_TO_CRIT(damage) round(HUMAN_MAXHEALTH / damage, 0.1) // SKYRAT EDIT - changes the magic health number of 100 to HUMAN_MAXHEALTH. +#define HITS_TO_CRIT(damage) round(HUMAN_MAXHEALTH / damage, 0.1) // NOVA EDIT - changes the magic health number of 100 to HUMAN_MAXHEALTH. diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index e4d7bc60502..4c2eea59834 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -13,7 +13,7 @@ //Blood levels #define BLOOD_VOLUME_MAX_LETHAL 2150 #define BLOOD_VOLUME_EXCESS 2100 -#define BLOOD_VOLUME_MAXIMUM 1000 // SKYRAT EDIT - Blood volume balancing (mainly for Hemophages as nobody else really goes much above regular blood volume) - ORIGINAL VALUE: 2000 +#define BLOOD_VOLUME_MAXIMUM 1000 // NOVA EDIT - Blood volume balancing (mainly for Hemophages as nobody else really goes much above regular blood volume) - ORIGINAL VALUE: 2000 #define BLOOD_VOLUME_SLIME_SPLIT 1120 #define BLOOD_VOLUME_NORMAL 560 #define BLOOD_VOLUME_SAFE 475 @@ -97,7 +97,7 @@ #define BODYTYPE_ALIEN (1<<7) ///The limb is from a golem #define BODYTYPE_GOLEM (1<<8) -// SKYRAT EDIT ADDITION +// NOVA EDIT ADDITION ///The limb fits a modular custom shape #define BODYTYPE_CUSTOM (1<<9) ///The limb fits a taur body @@ -106,7 +106,7 @@ #define BODYTYPE_HIDE_SHOES (1<<11) ///The limb causes glasses and hats to be drawn on layers 5 and 4 respectively. Currently used for snouts with the (Top) suffix, which are drawn on layer 6 and would normally cover facewear #define BODYTYPE_ALT_FACEWEAR_LAYER (1<<12) -// SKYRAT EDIT END +// NOVA EDIT END #define BODYTYPE_BIOSCRAMBLE_COMPATIBLE (BODYTYPE_HUMANOID | BODYTYPE_MONKEY | BODYTYPE_ALIEN) #define BODYTYPE_CAN_BE_BIOSCRAMBLED(bodytype) (!(bodytype & BODYTYPE_ROBOTIC) && (bodytype & BODYTYPE_BIOSCRAMBLE_COMPATIBLE)) @@ -456,12 +456,12 @@ #define OFFSET_SUIT "suit" #define OFFSET_NECK "neck" #define OFFSET_HELD "held" -#define OFFSET_ACCESSORY "accessory" // Skyrat edit - addition -#define OFFSET_HAIR "hair" // Skyrat edit - addition - Akulas +#define OFFSET_ACCESSORY "accessory" // NOVA EDIT - addition +#define OFFSET_HAIR "hair" // NOVA EDIT - addition - Akulas //MINOR TWEAKS/MISC //#define AGE_MIN 17 //youngest a character can be //ORIGINAL -#define AGE_MIN 18 //youngest a character can be //SKYRAT EDIT CHANGE - age +#define AGE_MIN 18 //youngest a character can be //NOVA EDIT CHANGE - age #define AGE_MAX 85 //oldest a character can be #define AGE_MINOR 20 //legal age of space drinking and smoking #define WIZARD_AGE_MIN 30 //youngest a wizard can be @@ -707,36 +707,36 @@ GLOBAL_LIST_INIT(human_heights_to_offsets, list( /// Total number of layers for mob overlays /// KEEP THIS UP-TO-DATE OR SHIT WILL BREAK /// Also consider updating layers_to_offset -#define TOTAL_LAYERS 40 // SKYRAT EDIT CHANGE - ORIGINAL: 34 +#define TOTAL_LAYERS 40 // NOVA EDIT CHANGE - ORIGINAL: 34 /// Mutations layer - Tk headglows, cold resistance glow, etc -#define MUTATIONS_LAYER 40 // SKYRAT EDIT CHANGE - ORIGINAL: 34 +#define MUTATIONS_LAYER 40 // NOVA EDIT CHANGE - ORIGINAL: 34 /// Mutantrace features (tail when looking south) that must appear behind the body parts -#define BODY_BEHIND_LAYER 39 // SKYRAT EDIT CHANGE - ORIGINAL: 33 +#define BODY_BEHIND_LAYER 39 // NOVA EDIT CHANGE - ORIGINAL: 33 /// Layer for bodyparts that should appear behind every other bodypart - Mostly, legs when facing WEST or EAST -#define BODYPARTS_LOW_LAYER 38 // SKYRAT EDIT CHANGE - ORIGINAL: 32 +#define BODYPARTS_LOW_LAYER 38 // NOVA EDIT CHANGE - ORIGINAL: 32 /// Layer for most bodyparts, appears above BODYPARTS_LOW_LAYER and below BODYPARTS_HIGH_LAYER -#define BODYPARTS_LAYER 37 // SKYRAT EDIT CHANGE - ORIGINAL: 31 +#define BODYPARTS_LAYER 37 // NOVA EDIT CHANGE - ORIGINAL: 31 /// Mutantrace features (snout, body markings) that must appear above the body parts -#define BODY_ADJ_LAYER 36 // SKYRAT EDIT CHANGE - ORIGINAL: 30 +#define BODY_ADJ_LAYER 36 // NOVA EDIT CHANGE - ORIGINAL: 30 /// Underwear, undershirts, socks, eyes, lips(makeup) -#define BODY_LAYER 35 // SKYRAT EDIT CHANGE - ORIGINAL: 29 +#define BODY_LAYER 35 // NOVA EDIT CHANGE - ORIGINAL: 29 /// Mutations that should appear above body, body_adj and bodyparts layer (e.g. laser eyes) -#define FRONT_MUTATIONS_LAYER 34 // SKYRAT EDIT CHANGE - ORIGINAL: 28 +#define FRONT_MUTATIONS_LAYER 34 // NOVA EDIT CHANGE - ORIGINAL: 28 /// Damage indicators (cuts and burns) -#define DAMAGE_LAYER 33 // SKYRAT EDIT CHANGE - ORIGINAL: 27 -// SKYRAT EDIT ADDITION START +#define DAMAGE_LAYER 33 // NOVA EDIT CHANGE - ORIGINAL: 27 +// NOVA EDIT ADDITION START /// This layer is used for things that shouldn't be over clothes, but should be over mutations #define BODY_FRONT_UNDER_CLOTHES 32 -// SKYRAT EDIT ADDITION END +// NOVA EDIT ADDITION END /// Jumpsuit clothing layer -#define UNIFORM_LAYER 31 // SKYRAT EDIT CHANGE - ORIGINAL: 26 -// SKYRAT EDIT ADDITION BEGIN - cursed layers under clothing +#define UNIFORM_LAYER 31 // NOVA EDIT CHANGE - ORIGINAL: 26 +// NOVA EDIT ADDITION BEGIN - cursed layers under clothing #define ANUS_LAYER 30 #define VAGINA_LAYER 29 #define PENIS_LAYER 28 #define NIPPLES_LAYER 27 #define BANDAGE_LAYER 26 -//SKYRAT EDIT ADDITION END +//NOVA EDIT ADDITION END /// ID card layer #define ID_LAYER 25 /// ID card layer (might be deprecated) @@ -839,14 +839,14 @@ GLOBAL_LIST_INIT(layers_to_offset, list( #define EXTERNAL_ADJACENT (1 << 2) /// Draws organ on the BODY_BEHIND_LAYER #define EXTERNAL_BEHIND (1 << 3) -// SKYRAT EDIT ADDITION - Customization +// NOVA EDIT ADDITION - Customization /// Draws organ on the BODY_FRONT_UNDER_CLOTHES #define EXTERNAL_FRONT_UNDER_CLOTHES (1 << 4) /// Draws organ on the ABOVE_BODY_FRONT_HEAD_LAYER #define EXTERNAL_FRONT_OVER (1 << 5) /// Draws organ on the HEAD_LAYER, for things that need to be above hair but below hats. #define EXTERNAL_FRONT_ABOVE_HAIR (1 << 6) -// SKYRAT EDIT END (not touching what comes next because we don't actually have to (nor want to)) +// NOVA EDIT END (not touching what comes next because we don't actually have to (nor want to)) /// Draws organ on all EXTERNAL layers #define ALL_EXTERNAL_OVERLAYS EXTERNAL_FRONT | EXTERNAL_ADJACENT | EXTERNAL_BEHIND diff --git a/code/__DEFINES/modular_computer.dm b/code/__DEFINES/modular_computer.dm index 1c9f3b59ecd..a316c1443b1 100644 --- a/code/__DEFINES/modular_computer.dm +++ b/code/__DEFINES/modular_computer.dm @@ -1,37 +1,75 @@ -//NTNet stuff, for modular computers - -//Caps for NTNet logging. Less than 10 would make logging useless anyway, more than 500 may make the log browser too laggy. Defaults to 100 unless user changes it. -#define MAX_NTNET_LOGS 300 -#define MIN_NTNET_LOGS 10 - -//Program bitflags +/** + * can_run_on_flags bitflags + * Used by programs to tell what type of ModPC it can run on. + * Everything a program can run on needs valid icons for each individual one. + */ +///Runs on everything. #define PROGRAM_ALL ALL +///Can run on Modular PC Consoles #define PROGRAM_CONSOLE (1<<0) +///Can run on Laptops. #define PROGRAM_LAPTOP (1<<1) -#define PROGRAM_TABLET (1<<2) +///Can run on PDAs. +#define PROGRAM_PDA (1<<2) + +/** + * program_flags + * Used by programs to tell the ModPC any special functions it has. + */ +///If the program requires NTNet to be online for it to work. +#define PROGRAM_REQUIRES_NTNET (1<<0) +///The program can be downloaded from the default NTNet downloader store. +#define PROGRAM_ON_NTNET_STORE (1<<1) +///The program can only be downloaded from the Syndinet store, usually nukie/emagged pda. +#define PROGRAM_ON_SYNDINET_STORE (1<<2) +///The program is unique and will delete itself upon being transferred to ensure only one copy exists. +#define PROGRAM_UNIQUE_COPY (1<<3) +///The program is a header and will show up at the top of the ModPC's UI. +#define PROGRAM_HEADER (1<<4) +///The program will run despite the ModPC not having any power in it. +#define PROGRAM_RUNS_WITHOUT_POWER (1<<5) + //Program categories -#define PROGRAM_CATEGORY_CREW "Crew" -#define PROGRAM_CATEGORY_ENGI "Engineering" -#define PROGRAM_CATEGORY_SUPL "Supply" -#define PROGRAM_CATEGORY_SCI "Science" -#define PROGRAM_CATEGORY_MISC "Other" +#define PROGRAM_CATEGORY_DEVICE "Device Tools" +#define PROGRAM_CATEGORY_EQUIPMENT "Equipment" +#define PROGRAM_CATEGORY_GAMES "Games" +#define PROGRAM_CATEGORY_SECURITY "Security & Records" +#define PROGRAM_CATEGORY_ENGINEERING "Engineering" +#define PROGRAM_CATEGORY_SUPPLY "Supply" +#define PROGRAM_CATEGORY_SCIENCE "Science" +///This app grants a minor protection against being PDA bombed if installed. +///(can sometimes prevent it from being sent, while wasting a PDA bomb from the sender). #define DETOMATIX_RESIST_MINOR 1 +///This app grants a larger protection against being PDA bombed if installed. +///(can sometimes prevent it from being sent, while wasting a PDA bomb from the sender). #define DETOMATIX_RESIST_MAJOR 2 +///This app gives a diminished protection against being PDA bombed if installed. +#define DETOMATIX_RESIST_MALUS -4 -//NTNet transfer speeds, used when downloading/uploading a file/program. -#define NTNETSPEED_LOWSIGNAL 0.5 // GQ/s transfer speed when the device is wirelessly connected and on Low signal -#define NTNETSPEED_HIGHSIGNAL 1 // GQ/s transfer speed when the device is wirelessly connected and on High signal -#define NTNETSPEED_ETHERNET 2 // GQ/s transfer speed when the device is using wired connection +/** + * NTNet transfer speeds, used when downloading/uploading a file/program. + * The define is how fast it will download an app every program's process_tick. + */ +///Used for wireless devices with low signal. +#define NTNETSPEED_LOWSIGNAL 0.5 +///Used for wireless devices with high signal. +#define NTNETSPEED_HIGHSIGNAL 1 +///Used for laptops with a high signal, or computers, which is connected regardless of z level. +#define NTNETSPEED_ETHERNET 2 -// NTNet connection signals -///When you're away from the station/mining base and not on a console, you can't access the internet +/** + * NTNet connection signals + * Used to calculate the defines above from NTNet Downloader, this is how + * good a ModPC's signal is. + */ +///When you're away from the station/mining base and not on a console, you can't access the internet. #define NTNET_NO_SIGNAL 0 ///Low signal, so away from the station, but still connected #define NTNET_LOW_SIGNAL 1 -///On station, good signal +///On station with good signal. #define NTNET_GOOD_SIGNAL 2 -///Using a Computer, ethernet-connected. +///Using a Computer or Laptop with good signal, ethernet-connected. #define NTNET_ETHERNET_SIGNAL 3 /// The default ringtone of the Messenger app. @@ -40,6 +78,11 @@ /// The maximum length of the ringtone of the Messenger app. #define MESSENGER_RINGTONE_MAX_LENGTH 20 +/** + * PDA Themes + * For these to work, the defines must be defined in tgui/styles/themes/[define].scss + */ + ///Default NtOS PDA theme #define PDA_THEME_NTOS "ntos" #define PDA_THEME_DARK_MODE "ntos_darkmode" diff --git a/code/__DEFINES/pai.dm b/code/__DEFINES/pai.dm index 356cbc28843..c2b4cf7ba84 100644 --- a/code/__DEFINES/pai.dm +++ b/code/__DEFINES/pai.dm @@ -12,7 +12,7 @@ #define PAI_SPAM_TIME (40 SECONDS) /// Maximum distance you can set the holoform leash -#define HOLOFORM_MAX_RANGE 25 // SKYRAT EDIT CHANGE - ORIGINAL: #define HOLOFORM_MAX_RANGE 9 +#define HOLOFORM_MAX_RANGE 25 // NOVA EDIT CHANGE - ORIGINAL: #define HOLOFORM_MAX_RANGE 9 /// Minimum distance you can set the holoform leash #define HOLOFORM_MIN_RANGE 3 /// Default holoform leash distance diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm index fa24963e34e..44a9115ec2d 100644 --- a/code/__DEFINES/preferences.dm +++ b/code/__DEFINES/preferences.dm @@ -60,7 +60,7 @@ // Playtime tracking system, see jobs_exp.dm #define EXP_TYPE_LIVING "Living" #define EXP_TYPE_CREW "Crew" -#define EXP_TYPE_CENTRAL_COMMAND "Central Command" // SKYRAT EDIT ADD +#define EXP_TYPE_CENTRAL_COMMAND "Central Command" // NOVA EDIT ADD #define EXP_TYPE_COMMAND "Command" #define EXP_TYPE_ENGINEERING "Engineering" #define EXP_TYPE_MEDICAL "Medical" diff --git a/code/__DEFINES/reagents.dm b/code/__DEFINES/reagents.dm index 64e084b6e00..533bff874ff 100644 --- a/code/__DEFINES/reagents.dm +++ b/code/__DEFINES/reagents.dm @@ -136,11 +136,11 @@ #define MAX_ADDICTION_POINTS 1000 ///Addiction start/ends -#define WITHDRAWAL_STAGE1_START_CYCLE 121 // SKYRAT EDIT CHANGE - Original 61 -#define WITHDRAWAL_STAGE1_END_CYCLE 240 // SKYRAT EDIT CHANGE - Original 120 -#define WITHDRAWAL_STAGE2_START_CYCLE 241 // SKYRAT EDIT CHANGE - Original 121 -#define WITHDRAWAL_STAGE2_END_CYCLE 360 // SKYRAT EDIT CHANGE - Original 180 -#define WITHDRAWAL_STAGE3_START_CYCLE 361 // SKYRAT EDIT CHANGE - Original 181 +#define WITHDRAWAL_STAGE1_START_CYCLE 121 // NOVA EDIT CHANGE - Original 61 +#define WITHDRAWAL_STAGE1_END_CYCLE 240 // NOVA EDIT CHANGE - Original 120 +#define WITHDRAWAL_STAGE2_START_CYCLE 241 // NOVA EDIT CHANGE - Original 121 +#define WITHDRAWAL_STAGE2_END_CYCLE 360 // NOVA EDIT CHANGE - Original 180 +#define WITHDRAWAL_STAGE3_START_CYCLE 361 // NOVA EDIT CHANGE - Original 181 ///reagent tags - used to look up reagents for specific effects. Feel free to add to but comment it /// This reagent does brute effects (BOTH damaging and healing) diff --git a/code/__DEFINES/research/anomalies.dm b/code/__DEFINES/research/anomalies.dm index 9ab97ae5a8d..0ae1c24b0e3 100644 --- a/code/__DEFINES/research/anomalies.dm +++ b/code/__DEFINES/research/anomalies.dm @@ -44,9 +44,9 @@ GLOBAL_LIST_INIT(bioscrambler_organs_blacklist, typecacheof(list ( /obj/item/organ/internal/monster_core, /obj/item/organ/internal/vocal_cords/colossus, /obj/item/organ/internal/zombie_infection, - /obj/item/organ/internal/empowered_borer_egg, // SKYRAT EDIT ADDITION - /obj/item/organ/internal/eyes/robotic, // SKYRAT EDIT ADDITION - /obj/item/organ/internal/eyes/night_vision/cyber, // SKYRAT EDIT ADDITION + /obj/item/organ/internal/empowered_borer_egg, // NOVA EDIT ADDITION + /obj/item/organ/internal/eyes/robotic, // NOVA EDIT ADDITION + /obj/item/organ/internal/eyes/night_vision/cyber, // NOVA EDIT ADDITION ))) /// List of body parts we can apply to people diff --git a/code/__DEFINES/research/slimes.dm b/code/__DEFINES/research/slimes.dm index 64a85afc217..59410564928 100644 --- a/code/__DEFINES/research/slimes.dm +++ b/code/__DEFINES/research/slimes.dm @@ -1,7 +1,13 @@ +#define SLIME_LIFE_STAGE_BABY "baby" +#define SLIME_LIFE_STAGE_ADULT "adult" + +#define SLIME_MIN_POWER 0 +#define SLIME_MEDIUM_POWER 5 +#define SLIME_MAX_POWER 10 + // Just slimin' here. -// Warning: These defines are used for slime cores and their icon states, so if you -// touch these names, remember to update icons/mob/simple/slimes.dmi and the respective -// slime core paths too! +// Warning: These defines are used for slime icon states, so if you +// touch these names, remember to update icons/mob/simple/slimes.dmi! #define SLIME_TYPE_ADAMANTINE "adamantine" #define SLIME_TYPE_BLACK "black" diff --git a/code/__DEFINES/robots.dm b/code/__DEFINES/robots.dm index 26b66f0de60..1bf75871175 100644 --- a/code/__DEFINES/robots.dm +++ b/code/__DEFINES/robots.dm @@ -51,14 +51,14 @@ ///Third Borg module slot. #define BORG_CHOOSE_MODULE_THREE 3 -// SKYRAT EDIT START - TODO - Move this upstream later +// NOVA EDIT START - TODO - Move this upstream later /// To store all the different cyborg models, instead of creating that for each cyborg. GLOBAL_LIST_EMPTY(cyborg_model_list) /// To store all of the different base cyborg model icons, instead of creating them every time the pick_module() proc is called. GLOBAL_LIST_EMPTY(cyborg_base_models_icon_list) /// To store all of the different cyborg model icons, instead of creating them every time the be_transformed_to() proc is called. GLOBAL_LIST_EMPTY(cyborg_all_models_icon_list) -// SKYRAT EDIT END +// NOVA EDIT END #define SKIN_ICON "skin_icon" #define SKIN_ICON_STATE "skin_icon_state" diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm index 5ac9be55345..44a6eadafff 100644 --- a/code/__DEFINES/role_preferences.dm +++ b/code/__DEFINES/role_preferences.dm @@ -16,10 +16,10 @@ #define ROLE_OPERATIVE "Operative" #define ROLE_TRAITOR "Traitor" #define ROLE_WIZARD "Wizard" -// SKYRAT EDIT START +// NOVA EDIT START #define ROLE_ASSAULT_OPERATIVE "Assault Operative" #define ROLE_OPFOR_CANDIDATE "OPFOR Candidate" -// SKYRAT EDIT END +// NOVA EDIT END // Midround roles #define ROLE_ABDUCTOR "Abductor" @@ -41,13 +41,13 @@ #define ROLE_SPACE_DRAGON "Space Dragon" #define ROLE_SPIDER "Spider" #define ROLE_WIZARD_MIDROUND "Wizard (Midround)" -//SKYRAT EDIT START +//NOVA EDIT START #define ROLE_BORER "Borer" #define ROLE_DRIFTING_CONTRACTOR "Drifting Contractor" #define ROLE_LONE_INFILTRATOR "Lone Infiltrator" #define ROLE_MUTANT "Mutated Abomination" #define ROLE_CLOCK_CULTIST "Clock Cultist" -// SKYRAT EDIT END +// NOVA EDIT END // Latejoin roles #define ROLE_HERETIC_SMUGGLER "Heretic Smuggler" @@ -122,13 +122,13 @@ #define ROLE_CYBER_POLICE "Cyber Police" #define ROLE_CYBER_TAC "Cyber Tac" #define ROLE_NETGUARDIAN "NetGuardian Prime" -//SKYRAT EDIT START - Skyrat roles +//NOVA EDIT START - Skyrat roles #define ROLE_BLACK_MARKET_DEALER "Black Market Dealer" #define ROLE_DS2 "DS2 Syndicate" #define ROLE_FREIGHTER_CREW "Freighter Crew" #define ROLE_GHOST_CAFE "Ghost Cafe Visitor" #define ROLE_PORT_TARKON "Port Tarkon Survivor" -//SKYRAT EDIT END +//NOVA EDIT END /// This defines the antagonists you can operate with in the settings. /// Keys are the antagonist, values are the number of days since the player's @@ -145,9 +145,9 @@ GLOBAL_LIST_INIT(special_roles, list( ROLE_REV_HEAD = 14, ROLE_TRAITOR = 0, ROLE_WIZARD = 14, - // SKYRAT EDIT ADDITION + // NOVA EDIT ADDITION ROLE_ASSAULT_OPERATIVE = 14, - // SKYRAT EDIT END + // NOVA EDIT END // Midround ROLE_ABDUCTOR = 0, @@ -169,12 +169,12 @@ GLOBAL_LIST_INIT(special_roles, list( ROLE_SPACE_DRAGON = 0, ROLE_SPIDER = 0, ROLE_WIZARD_MIDROUND = 14, - //SKYRAT EDIT START + //NOVA EDIT START ROLE_LONE_INFILTRATOR = 0, ROLE_BORER = 0, ROLE_DRIFTING_CONTRACTOR = 14, ROLE_MUTANT = 0, - //SKYRAT EDIT END + //NOVA EDIT END // Latejoin ROLE_HERETIC_SMUGGLER = 0, diff --git a/code/__DEFINES/say.dm b/code/__DEFINES/say.dm index d5f1496079f..4ea5e070146 100644 --- a/code/__DEFINES/say.dm +++ b/code/__DEFINES/say.dm @@ -98,7 +98,7 @@ #define FOLLOW_OR_TURF_LINK(alice, bob, turfy) "(F)" //Don't set this very much higher then 1024 unless you like inviting people in to dos your server with message spam -#define MAX_MESSAGE_LEN 2048 //SKYRAT EDIT CHANGE - ORIGINAL 1024 - I SAID DOUBLE IT!! FUCK THE WARNING! +#define MAX_MESSAGE_LEN 2048 //NOVA EDIT CHANGE - ORIGINAL 1024 - I SAID DOUBLE IT!! FUCK THE WARNING! #define MAX_NAME_LEN 42 #define MAX_BROADCAST_LEN 512 #define MAX_CHARTER_LEN 80 diff --git a/code/__DEFINES/sound.dm b/code/__DEFINES/sound.dm index d95973e3fdb..4bd9c5acefd 100644 --- a/code/__DEFINES/sound.dm +++ b/code/__DEFINES/sound.dm @@ -2,7 +2,7 @@ #define CHANNEL_LOBBYMUSIC 1024 #define CHANNEL_ADMIN 1023 #define CHANNEL_VOX 1022 -#define CHANNEL_JUKEBOX 1011 // SKYRAT EDIT - JUKEBOX - ORIGINAL: #define CHANNEL_JUKEBOX 1021 +#define CHANNEL_JUKEBOX 1011 // NOVA EDIT - JUKEBOX - ORIGINAL: #define CHANNEL_JUKEBOX 1021 #define CHANNEL_HEARTBEAT 1020 //sound channel for heartbeats #define CHANNEL_BOSS_MUSIC 1019 #define CHANNEL_AMBIENCE 1018 @@ -11,10 +11,10 @@ #define CHANNEL_CHARGED_SPELL 1015 #define CHANNEL_ELEVATOR 1014 -// SKYRAT EDIT START - JUKEBOX +// NOVA EDIT START - JUKEBOX #define CHANNEL_JUKEBOX_START 1006 #define CHANNEL_HEV 1005 -//SKYRAT EDIT CHANGE END +//NOVA EDIT CHANGE END ///Default range of a sound. #define SOUND_RANGE 17 @@ -31,7 +31,7 @@ //THIS SHOULD ALWAYS BE THE LOWEST ONE! //KEEP IT UPDATED -#define CHANNEL_HIGHEST_AVAILABLE 1005 //SKYRAT EDIT CHANGE - JUKEBOX > ORIGINAL VALUE 1015 +#define CHANNEL_HIGHEST_AVAILABLE 1005 //NOVA EDIT CHANGE - JUKEBOX > ORIGINAL VALUE 1015 #define MAX_INSTRUMENT_CHANNELS (128 * 6) @@ -124,7 +124,7 @@ #define ANNOUNCER_SHUTTLERECALLED "announcer_shuttlerecalled" #define ANNOUNCER_SPANOMALIES "announcer_spanomalies" -//SKYRAT EDIT ADDITION BEGIN +//NOVA EDIT ADDITION BEGIN #define ANNOUNCER_SHUTTLELEFT "announcer_shuttleleft" #define ANNOUNCER_CARP "announcer_carp" #define ANNOUNCER_VORTEXANOMALIES "announcer_vortexanomalies" @@ -152,7 +152,7 @@ #define ANNOUNCER_OUTBREAK6 "announcer_outbreak6" #define ANNOUNCER_DEPARTMENTAL "announcer_departmental" #define ANNOUNCER_SHUTTLE "announcer_shuttle" -//SKYRAT EDIT END +//NOVA EDIT END /// Global list of all of our announcer keys. @@ -173,7 +173,7 @@ GLOBAL_LIST_INIT(announcer_keys, list( ANNOUNCER_SHUTTLEDOCK, ANNOUNCER_SHUTTLERECALLED, ANNOUNCER_SPANOMALIES, - //SKYRAT EDIT ADDITION BEGIN + //NOVA EDIT ADDITION BEGIN ANNOUNCER_SHUTTLELEFT, ANNOUNCER_CARP, ANNOUNCER_VORTEXANOMALIES, @@ -198,7 +198,7 @@ GLOBAL_LIST_INIT(announcer_keys, list( ANNOUNCER_ICARUS, ANNOUNCER_NRI_RAIDERS, ANNOUNCER_OUTBREAK6, - //SKYRAT EDIT END + //NOVA EDIT END )) /// List of all of our sound keys. diff --git a/code/__DEFINES/spacevines.dm b/code/__DEFINES/spacevines.dm index 84739f344b5..602b8143f55 100644 --- a/code/__DEFINES/spacevines.dm +++ b/code/__DEFINES/spacevines.dm @@ -27,10 +27,10 @@ #define SEVERITY_MAJOR 10 /// Kudzu mutativeness is based on a scale factor * potency -#define MUTATIVENESS_SCALE_FACTOR 0.1 // SKYRAT EDIT CHANGE - Original: 0.2 +#define MUTATIVENESS_SCALE_FACTOR 0.1 // NOVA EDIT CHANGE - Original: 0.2 /// Kudzu maximum mutation severity is a linear function of potency -#define MAX_SEVERITY_LINEAR_COEFF 0.1 // SKYRAT EDIT CHANGE - Original: 0.15 +#define MAX_SEVERITY_LINEAR_COEFF 0.1 // NOVA EDIT CHANGE - Original: 0.15 #define MAX_SEVERITY_CONSTANT_TERM 10 /// Additional maximum mutation severity given to kudzu spawned by a random event diff --git a/code/__DEFINES/species_clothing_paths.dm b/code/__DEFINES/species_clothing_paths.dm index 9b7a3b88905..38247852182 100644 --- a/code/__DEFINES/species_clothing_paths.dm +++ b/code/__DEFINES/species_clothing_paths.dm @@ -8,12 +8,12 @@ //MONKEY PATHS ///The dmi for monkey uniforms -#define MONKEY_UNIFORM_FILE 'modular_skyrat/master_files/icons/mob/clothing/species/monkey/uniform.dmi' // SKYRAT EDIT CHANGE +#define MONKEY_UNIFORM_FILE 'modular_nova/master_files/icons/mob/clothing/species/monkey/uniform.dmi' // NOVA EDIT CHANGE //DIGITIGRADE PATHS ///The dmi containing digitigrade uniforms -#define DIGITIGRADE_UNIFORM_FILE 'modular_skyrat/master_files/icons/mob/clothing/uniform_digi.dmi' // SKYRAT EDIT CHANGE +#define DIGITIGRADE_UNIFORM_FILE 'modular_nova/master_files/icons/mob/clothing/uniform_digi.dmi' // NOVA EDIT CHANGE ///The dmi containing digitigrade shoes -#define DIGITIGRADE_SHOES_FILE 'modular_skyrat/master_files/icons/mob/clothing/feet_digi.dmi' // SKYRAT EDIT CHANGE +#define DIGITIGRADE_SHOES_FILE 'modular_nova/master_files/icons/mob/clothing/feet_digi.dmi' // NOVA EDIT CHANGE ///The dmi containing digitigrade oversuits -#define DIGITIGRADE_SUIT_FILE 'modular_skyrat/master_files/icons/mob/clothing/suit_digi.dmi' // SKYRAT EDIT CHANGE +#define DIGITIGRADE_SUIT_FILE 'modular_nova/master_files/icons/mob/clothing/suit_digi.dmi' // NOVA EDIT CHANGE diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index d227744ddd1..802ff324bd2 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -20,7 +20,7 @@ * * make sure you add an update to the schema_version stable in the db changelog */ -#define DB_MINOR_VERSION 26 +#define DB_MINOR_VERSION 28 //! ## Timing subsystem @@ -137,7 +137,7 @@ #define INIT_ORDER_BLACKBOX 94 #define INIT_ORDER_SERVER_MAINT 93 #define INIT_ORDER_INPUT 85 -#define INIT_ORDER_PLAYER_RANKS 84 // SKYRAT EDIT - Player Ranks Subsystem +#define INIT_ORDER_PLAYER_RANKS 84 // NOVA EDIT - Player Ranks Subsystem #define INIT_ORDER_SOUNDS 83 #define INIT_ORDER_INSTRUMENTS 82 #define INIT_ORDER_GREYSCALE 81 @@ -155,7 +155,7 @@ #define INIT_ORDER_AI_CONTROLLERS 55 //So the controller can get the ref #define INIT_ORDER_TICKER 55 #define INIT_ORDER_TCG 55 -#define INIT_ORDER_AUTOMAPPER 51 // SKYRAT EDIT ADDITION - We need to load just before mapping. +#define INIT_ORDER_AUTOMAPPER 51 // NOVA EDIT ADDITION - We need to load just before mapping. #define INIT_ORDER_MAPPING 50 #define INIT_ORDER_EARLY_ASSETS 48 #define INIT_ORDER_RESEARCH 47 @@ -164,10 +164,10 @@ #define INIT_ORDER_ECONOMY 40 #define INIT_ORDER_OUTPUTS 35 #define INIT_ORDER_RESTAURANT 34 -#define INIT_ORDER_POLLUTION 32 //SKYRAT EDIT ADDITION - //Needs to be above atoms +#define INIT_ORDER_POLLUTION 32 //NOVA EDIT ADDITION - //Needs to be above atoms #define INIT_ORDER_TTS 33 #define INIT_ORDER_ATOMS 30 -#define INIT_ORDER_ARMAMENTS 27 // SKYRAT EDIT ADDITION - Needs to be between atoms and default so it runs before gun companies +#define INIT_ORDER_ARMAMENTS 27 // NOVA EDIT ADDITION - Needs to be between atoms and default so it runs before gun companies #define INIT_ORDER_LANGUAGE 25 #define INIT_ORDER_MACHINES 20 #define INIT_ORDER_SKILLS 15 @@ -187,7 +187,7 @@ #define INIT_ORDER_SHUTTLE -21 #define INIT_ORDER_MINOR_MAPPING -40 #define INIT_ORDER_PATH -50 -#define INIT_ORDER_DECAY -61 //SKYRAT EDIT ADDITION +#define INIT_ORDER_DECAY -61 //NOVA EDIT ADDITION #define INIT_ORDER_EXPLOSIONS -69 #define INIT_ORDER_STATPANELS -97 #define INIT_ORDER_BAN_CACHE -98 diff --git a/code/__DEFINES/surgery.dm b/code/__DEFINES/surgery.dm index 6f078c28724..e0a3c3b9837 100644 --- a/code/__DEFINES/surgery.dm +++ b/code/__DEFINES/surgery.dm @@ -26,10 +26,10 @@ #define ORGAN_HIDDEN (1<<9) /// Has the organ already been inserted inside someone #define ORGAN_VIRGIN (1<<10) -// SKYRAT EDIT START - Customization +// NOVA EDIT START - Customization /// Synthetic organ granted by a species (for use for organ replacements between species) #define ORGAN_SYNTHETIC_FROM_SPECIES (1<<11) -// SKYRAT EDIT END +// NOVA EDIT END /// Helper to figure out if a limb is organic #define IS_ORGANIC_LIMB(limb) (limb.bodytype & BODYTYPE_ORGANIC) diff --git a/code/__DEFINES/text.dm b/code/__DEFINES/text.dm index c98baa5f4aa..9529d6c4fe2 100644 --- a/code/__DEFINES/text.dm +++ b/code/__DEFINES/text.dm @@ -84,10 +84,10 @@ #define FLESH_SCAR_FILE "wounds/flesh_scar_desc.json" /// File location for bone wound descriptions #define BONE_SCAR_FILE "wounds/bone_scar_desc.json" -// SKYRAT EDIT ADDITION BEGIN - SYNTH WOUNDS +// NOVA EDIT ADDITION BEGIN - SYNTH WOUNDS /// File location for metalic wound descriptions -#define METAL_SCAR_FILE "wounds/metal_scar_desc.json" -// SKYRAT EDIT ADDITION END +#define METAL_SCAR_FILE "wounds/metal_scar_desc.json" +// NOVA EDIT ADDITION END /// File location for scar wound descriptions #define SCAR_LOC_FILE "wounds/scar_loc.json" /// File location for exodrone descriptions diff --git a/code/__DEFINES/tgs.dm b/code/__DEFINES/tgs.dm index b0e97e05e9b..c561a64ebf5 100644 --- a/code/__DEFINES/tgs.dm +++ b/code/__DEFINES/tgs.dm @@ -1,6 +1,6 @@ // tgstation-server DMAPI -#define TGS_DMAPI_VERSION "6.7.0" +#define TGS_DMAPI_VERSION "7.0.1" // All functions and datums outside this document are subject to change with any version and should not be relied on. @@ -73,12 +73,12 @@ #define TGS_EVENT_REPO_MERGE_PULL_REQUEST 3 /// Before the repository makes a sychronize operation. Parameters: Absolute repostiory path. #define TGS_EVENT_REPO_PRE_SYNCHRONIZE 4 -/// Before a BYOND install operation begins. Parameters: [/datum/tgs_version] of the installing BYOND. -#define TGS_EVENT_BYOND_INSTALL_START 5 -/// When a BYOND install operation fails. Parameters: Error message -#define TGS_EVENT_BYOND_INSTALL_FAIL 6 -/// When the active BYOND version changes. Parameters: (Nullable) [/datum/tgs_version] of the current BYOND, [/datum/tgs_version] of the new BYOND. -#define TGS_EVENT_BYOND_ACTIVE_VERSION_CHANGE 7 +/// Before a engine install operation begins. Parameters: Version string of the installing engine. +#define TGS_EVENT_ENGINE_INSTALL_START 5 +/// When a engine install operation fails. Parameters: Error message +#define TGS_EVENT_ENGINE_INSTALL_FAIL 6 +/// When the active engine version changes. Parameters: (Nullable) Version string of the current engine, version string of the new engine. +#define TGS_EVENT_ENGINE_ACTIVE_VERSION_CHANGE 7 /// When the compiler starts running. Parameters: Game directory path, origin commit SHA. #define TGS_EVENT_COMPILE_START 8 /// When a compile is cancelled. No parameters. @@ -108,7 +108,7 @@ // #define TGS_EVENT_DREAM_DAEMON_LAUNCH 22 /// After a single submodule update is performed. Parameters: Updated submodule name. #define TGS_EVENT_REPO_SUBMODULE_UPDATE 23 -/// After CodeModifications are applied, before DreamMaker is run. Parameters: Game directory path, origin commit sha, byond version. +/// After CodeModifications are applied, before DreamMaker is run. Parameters: Game directory path, origin commit sha, version string of the used engine. #define TGS_EVENT_PRE_DREAM_MAKER 24 /// Whenever a deployment folder is deleted from disk. Parameters: Game directory path. #define TGS_EVENT_DEPLOYMENT_CLEANUP 25 @@ -122,6 +122,7 @@ /// The watchdog will restart on reboot. #define TGS_REBOOT_MODE_RESTART 2 +// Note that security levels are currently meaningless in OpenDream /// DreamDaemon Trusted security level. #define TGS_SECURITY_TRUSTED 0 /// DreamDaemon Safe security level. @@ -136,6 +137,11 @@ /// DreamDaemon invisible visibility level. #define TGS_VISIBILITY_INVISIBLE 2 +/// The Build Your Own Net Dream engine. +#define TGS_ENGINE_TYPE_BYOND 0 +/// The OpenDream engine. +#define TGS_ENGINE_TYPE_OPENDREAM 1 + //REQUIRED HOOKS /** @@ -449,6 +455,10 @@ /world/proc/TgsVersion() return +/// Returns the running engine type +/world/proc/TgsEngine() + return + /// Returns the current [/datum/tgs_version] of the DMAPI being used if it was activated, null otherwise. This function may sleep if the call to [/world/proc/TgsNew] is sleeping! /world/proc/TgsApiVersion() return diff --git a/code/__DEFINES/traits/declarations.dm b/code/__DEFINES/traits/declarations.dm index 8b7cb16c21f..2f8098cc6dd 100644 --- a/code/__DEFINES/traits/declarations.dm +++ b/code/__DEFINES/traits/declarations.dm @@ -415,6 +415,10 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai // Being close enough to the supermatter makes it heal at higher temperatures // and emit less heat. Present on /mob or /datum/mind #define TRAIT_SUPERMATTER_SOOTHER "supermatter_soother" +/// Mob has fov applied to it +#define TRAIT_FOV_APPLIED "fov_applied" +/// Mob is using the scope component +#define TRAIT_USER_SCOPED "user_scoped" /// Trait added when a revenant is visible. #define TRAIT_REVENANT_REVEALED "revenant_revealed" @@ -612,9 +616,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai ///Used for managing KEEP_TOGETHER in [/atom/var/appearance_flags] #define TRAIT_KEEP_TOGETHER "keep-together" -///Marks the item as having been transmuted. Functionally blacklists the item from being recycled or sold for materials. -#define TRAIT_MAT_TRANSMUTED "transmuted" - // cargo traits ///If the item will block the cargo shuttle from flying to centcom #define TRAIT_BANNED_FROM_CARGO_SHUTTLE "banned_from_cargo_shuttle" @@ -774,10 +775,12 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// Trait applied when an integrated circuit opens a UI on a player (see list pick component) #define TRAIT_CIRCUIT_UI_OPEN "circuit_ui_open" -/// PDA Traits. This one makes PDAs explode if the user opens the messages menu +/// PDA/ModPC Traits. This one makes PDAs explode if the user opens the messages menu #define TRAIT_PDA_MESSAGE_MENU_RIGGED "pda_message_menu_rigged" /// This one denotes a PDA has received a rigged message and will explode when the user tries to reply to a rigged PDA message #define TRAIT_PDA_CAN_EXPLODE "pda_can_explode" +///The download speeds of programs from the dowloader is halved. +#define TRAIT_MODPC_HALVED_DOWNLOAD_SPEED "modpc_halved_download_speed" /// If present on a [/mob/living/carbon], will make them appear to have a medium level disease on health HUDs. #define TRAIT_DISEASELIKE_SEVERITY_MEDIUM "diseaselike_severity_medium" @@ -1011,6 +1014,12 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// Trait given to foam darts that have an insert in them #define TRAIT_DART_HAS_INSERT "dart_has_insert" +/// Trait determines if this mob has examined an eldritch painting +#define TRAIT_ELDRITCH_PAINTING_EXAMINE "eldritch_painting_examine" + +/// Trait used by the /datum/brain_trauma/severe/flesh_desire trauma to change their preferences of what they eat +#define TRAIT_FLESH_DESIRE "flesh_desire" + ///Trait granted by janitor skillchip, allows communication with cleanbots #define TRAIT_CLEANBOT_WHISPERER "cleanbot_whisperer" diff --git a/code/__DEFINES/transport.dm b/code/__DEFINES/transport.dm index b0b38ee70ef..7413ad58916 100644 --- a/code/__DEFINES/transport.dm +++ b/code/__DEFINES/transport.dm @@ -99,10 +99,10 @@ DEFINE_BITFIELD(request_flags, list( #define XING_STATE_RED 2 #define XING_STATE_MALF 3 -#define AMBER_THRESHOLD_NORMAL 60 // SKYRAT EDIT CHANGE - RUN/WALK SPEED -#define RED_THRESHOLD_NORMAL 37 // SKYRAT EDIT CHANGE - RUN/WALK SPEED -#define AMBER_THRESHOLD_DEGRADED 45 // SKYRAT EDIT CHANGE - RUN/WALK SPEED -#define RED_THRESHOLD_DEGRADED 33 // SKYRAT EDIT CHANGE - RUN/WALK SPEED +#define AMBER_THRESHOLD_NORMAL 60 // NOVA EDIT CHANGE - RUN/WALK SPEED +#define RED_THRESHOLD_NORMAL 37 // NOVA EDIT CHANGE - RUN/WALK SPEED +#define AMBER_THRESHOLD_DEGRADED 45 // NOVA EDIT CHANGE - RUN/WALK SPEED +#define RED_THRESHOLD_DEGRADED 33 // NOVA EDIT CHANGE - RUN/WALK SPEED #define DEFAULT_TRAM_LENGTH 10 diff --git a/code/__DEFINES/uplink.dm b/code/__DEFINES/uplink.dm index fcc2118348c..d6412e0e4d1 100644 --- a/code/__DEFINES/uplink.dm +++ b/code/__DEFINES/uplink.dm @@ -9,6 +9,9 @@ /// This item is purchasable to clown ops #define UPLINK_CLOWN_OPS (1 << 2) +/// This item is purchasable to infiltrators (midround traitors) +#define UPLINK_INFILTRATORS (1 << 3) + /// Progression gets turned into a user-friendly form. This is just an abstract equation that makes progression not too large. #define DISPLAY_PROGRESSION(time) round(time/60, 0.01) diff --git a/code/__DEFINES/vv.dm b/code/__DEFINES/vv.dm index 787dfe13957..dfa930f7a76 100644 --- a/code/__DEFINES/vv.dm +++ b/code/__DEFINES/vv.dm @@ -1,6 +1,6 @@ #define VV_NUM "Number" #define VV_TEXT "Text" -#define VV_MESSAGE "Mutiline Text" +#define VV_MESSAGE "Multiline Text" #define VV_COLOR "Color" #define VV_COLOR_MATRIX "Color Matrix" #define VV_ICON "Icon" diff --git a/code/__DEFINES/wall_dents.dm b/code/__DEFINES/wall_dents.dm index 1e4f813849e..555f98671c0 100644 --- a/code/__DEFINES/wall_dents.dm +++ b/code/__DEFINES/wall_dents.dm @@ -1,2 +1,3 @@ #define WALL_DENT_HIT 1 #define WALL_DENT_SHOT 2 +#define MAX_DENT_DECALS 15 diff --git a/code/__DEFINES/wounds.dm b/code/__DEFINES/wounds.dm index 79c188cd481..224b2c973cb 100644 --- a/code/__DEFINES/wounds.dm +++ b/code/__DEFINES/wounds.dm @@ -124,7 +124,7 @@ GLOBAL_LIST_INIT(bio_state_anatomy, list( /// Generic loss wounds. See loss.dm #define WOUND_SERIES_LOSS_BASIC "wound_series_loss_basic" -// SKYRAT EDIT ADDITION BEGIN - MUSCLE AND SYNTH WOUNDS +// NOVA EDIT ADDITION BEGIN - MUSCLE AND SYNTH WOUNDS // Have to put it here so I can use it in the global list of wound series /// See muscle.dm and robotic_blunt.dm #define WOUND_SERIES_MUSCLE_DAMAGE "skyrat_wound_series_muscle_damage" @@ -133,7 +133,7 @@ GLOBAL_LIST_INIT(bio_state_anatomy, list( #define WOUND_SERIES_METAL_BURN_OVERHEAT "wound_series_metal_burn_basic" #define WOUND_SERIES_WIRE_SLASH_ELECTRICAL_DAMAGE "wound_series_metal_slash_electrical_damage_basic" #define WOUND_SERIES_WIRE_PIERCE_ELECTRICAL_DAMAGE "wound_series_metal_pierce_electrical_damage_basic" -// SKYRAT EDIT ADDITION END +// NOVA EDIT ADDITION END /// A assoc list of (wound typepath -> wound_pregen_data instance). Every wound should have a pregen data. GLOBAL_LIST_INIT_TYPED(all_wound_pregen_data, /datum/wound_pregen_data, generate_wound_static_data()) @@ -207,24 +207,24 @@ GLOBAL_LIST_INIT(wound_series_collections, generate_wound_series_collection()) GLOBAL_LIST_INIT(wounding_types_to_series, list( WOUND_BLUNT = list( WOUND_SERIES_BONE_BLUNT_BASIC, - WOUND_SERIES_MUSCLE_DAMAGE, // SKYRAT EDIT -- MUSCLE WOUNDS - WOUND_SERIES_METAL_BLUNT_BASIC, // SKYRAT EDIT ADDITION - SYNTH WOUNDS + WOUND_SERIES_MUSCLE_DAMAGE, // NOVA EDIT -- MUSCLE WOUNDS + WOUND_SERIES_METAL_BLUNT_BASIC, // NOVA EDIT ADDITION - SYNTH WOUNDS ), WOUND_SLASH = list( WOUND_SERIES_FLESH_SLASH_BLEED, - WOUND_SERIES_MUSCLE_DAMAGE, // SKYRAT EDIT ADDITION - MUSCLE WOUNDS - WOUND_SERIES_WIRE_SLASH_ELECTRICAL_DAMAGE, // SKYRAT EDIT ADDITION - SYNTH WOUNDS + WOUND_SERIES_MUSCLE_DAMAGE, // NOVA EDIT ADDITION - MUSCLE WOUNDS + WOUND_SERIES_WIRE_SLASH_ELECTRICAL_DAMAGE, // NOVA EDIT ADDITION - SYNTH WOUNDS ), WOUND_BURN = list( WOUND_SERIES_FLESH_BURN_BASIC, - WOUND_SERIES_METAL_BURN_OVERHEAT, // SKYRAT EDIT ADDITION - SYNTH WOUNDS + WOUND_SERIES_METAL_BURN_OVERHEAT, // NOVA EDIT ADDITION - SYNTH WOUNDS ), WOUND_PIERCE = list( WOUND_SERIES_FLESH_PUNCTURE_BLEED, - WOUND_SERIES_MUSCLE_DAMAGE, // SKYRAT EDIT ADDITION - MUSCLE WOUNDS - WOUND_SERIES_WIRE_PIERCE_ELECTRICAL_DAMAGE, // SKYRAT EDIT ADDITION - SYNTH WOUNDS + WOUND_SERIES_MUSCLE_DAMAGE, // NOVA EDIT ADDITION - MUSCLE WOUNDS + WOUND_SERIES_WIRE_PIERCE_ELECTRICAL_DAMAGE, // NOVA EDIT ADDITION - SYNTH WOUNDS ), )) @@ -296,7 +296,7 @@ GLOBAL_LIST_INIT(wounding_types_to_series, list( GLOBAL_LIST_INIT(biotypes_to_scar_file, list( "[BIO_FLESH]" = FLESH_SCAR_FILE, "[BIO_BONE]" = BONE_SCAR_FILE, - "[BIO_METAL]" = METAL_SCAR_FILE // SKYRAT EDIT ADDITION - METAL SCARS (see robotic_blunt.dm) + "[BIO_METAL]" = METAL_SCAR_FILE // NOVA EDIT ADDITION - METAL SCARS (see robotic_blunt.dm) )) // ~burn wound infection defines diff --git a/code/__DEFINES/zoom.dm b/code/__DEFINES/zoom.dm new file mode 100644 index 00000000000..590e0c47500 --- /dev/null +++ b/code/__DEFINES/zoom.dm @@ -0,0 +1,6 @@ +///How the scope component is toggled. This one is done by right-clicking. +#define ZOOM_METHOD_RIGHT_CLICK 1 +/// Wielding the object with both hands toggles the zoom. Requires the two-handed component to work. +#define ZOOM_METHOD_WIELD 2 +/// Activated by clicking an item action button specified by the `item_action_type` var. +#define ZOOM_METHOD_ITEM_ACTION 3 diff --git a/code/__DEFINES/~skyrat_defines/barsigns.dm b/code/__DEFINES/~skyrat_defines/barsigns.dm index 8a6fe2652bb..37e40b375ef 100644 --- a/code/__DEFINES/~skyrat_defines/barsigns.dm +++ b/code/__DEFINES/~skyrat_defines/barsigns.dm @@ -1,2 +1,2 @@ -#define SKYRAT_BARSIGN_FILE 'modular_skyrat/modules/barsigns/icons/barsigns.dmi' -#define SKYRAT_LARGE_BARSIGN_FILE 'modular_skyrat/modules/barsigns/icons/barsigns96x96.dmi' +#define SKYRAT_BARSIGN_FILE 'modular_nova/modules/barsigns/icons/barsigns.dmi' +#define SKYRAT_LARGE_BARSIGN_FILE 'modular_nova/modules/barsigns/icons/barsigns96x96.dmi' diff --git a/code/__DEFINES/~skyrat_defines/mobs.dm b/code/__DEFINES/~skyrat_defines/mobs.dm index 71f8c21e894..2943a1b5e3c 100644 --- a/code/__DEFINES/~skyrat_defines/mobs.dm +++ b/code/__DEFINES/~skyrat_defines/mobs.dm @@ -15,20 +15,20 @@ #define DEFIB_FAIL_DNR (1<<11) ///Defines for icons used for modular bodyparts, created to make it easier to relocate the module or files if necessary. -#define BODYPART_ICON_HUMAN 'modular_skyrat/modules/bodyparts/icons/human_parts_greyscale.dmi' -#define BODYPART_ICON_MAMMAL 'modular_skyrat/modules/bodyparts/icons/mammal_parts_greyscale.dmi' -#define BODYPART_ICON_AKULA 'modular_skyrat/modules/bodyparts/icons/akula_parts_greyscale.dmi' -#define BODYPART_ICON_AQUATIC 'modular_skyrat/modules/bodyparts/icons/aquatic_parts_greyscale.dmi' -#define BODYPART_ICON_GHOUL 'modular_skyrat/modules/bodyparts/icons/ghoul_bodyparts.dmi' -#define BODYPART_ICON_INSECT 'modular_skyrat/modules/bodyparts/icons/insect_parts_greyscale.dmi' -#define BODYPART_ICON_LIZARD 'modular_skyrat/modules/bodyparts/icons/lizard_parts_greyscale.dmi' -#define BODYPART_ICON_MOTH 'modular_skyrat/modules/bodyparts/icons/moth_parts_greyscale.dmi' -#define BODYPART_ICON_ROUNDSTARTSLIME 'modular_skyrat/modules/bodyparts/icons/slime_parts_greyscale.dmi' -#define BODYPART_ICON_SKRELL 'modular_skyrat/modules/bodyparts/icons/skrell_parts_greyscale.dmi' -#define BODYPART_ICON_TAUR 'modular_skyrat/modules/bodyparts/icons/taur_invisible_legs.dmi' -#define BODYPART_ICON_TESHARI 'modular_skyrat/modules/bodyparts/icons/teshari_parts_greyscale.dmi' -#define BODYPART_ICON_VOX 'modular_skyrat/modules/bodyparts/icons/vox_parts_greyscale.dmi' -#define BODYPART_ICON_XENO 'modular_skyrat/modules/bodyparts/icons/xeno_parts_greyscale.dmi' -#define BODYPART_ICON_SYNTHMAMMAL 'modular_skyrat/modules/bodyparts/icons/synthmammal_parts_greyscale.dmi' -#define BODYPART_ICON_IPC 'modular_skyrat/modules/bodyparts/icons/ipc_parts.dmi' -#define BODYPART_ICON_SYNTHLIZARD 'modular_skyrat/modules/bodyparts/icons/synthliz_parts_greyscale.dmi' +#define BODYPART_ICON_HUMAN 'modular_nova/modules/bodyparts/icons/human_parts_greyscale.dmi' +#define BODYPART_ICON_MAMMAL 'modular_nova/modules/bodyparts/icons/mammal_parts_greyscale.dmi' +#define BODYPART_ICON_AKULA 'modular_nova/modules/bodyparts/icons/akula_parts_greyscale.dmi' +#define BODYPART_ICON_AQUATIC 'modular_nova/modules/bodyparts/icons/aquatic_parts_greyscale.dmi' +#define BODYPART_ICON_GHOUL 'modular_nova/modules/bodyparts/icons/ghoul_bodyparts.dmi' +#define BODYPART_ICON_INSECT 'modular_nova/modules/bodyparts/icons/insect_parts_greyscale.dmi' +#define BODYPART_ICON_LIZARD 'modular_nova/modules/bodyparts/icons/lizard_parts_greyscale.dmi' +#define BODYPART_ICON_MOTH 'modular_nova/modules/bodyparts/icons/moth_parts_greyscale.dmi' +#define BODYPART_ICON_ROUNDSTARTSLIME 'modular_nova/modules/bodyparts/icons/slime_parts_greyscale.dmi' +#define BODYPART_ICON_SKRELL 'modular_nova/modules/bodyparts/icons/skrell_parts_greyscale.dmi' +#define BODYPART_ICON_TAUR 'modular_nova/modules/bodyparts/icons/taur_invisible_legs.dmi' +#define BODYPART_ICON_TESHARI 'modular_nova/modules/bodyparts/icons/teshari_parts_greyscale.dmi' +#define BODYPART_ICON_VOX 'modular_nova/modules/bodyparts/icons/vox_parts_greyscale.dmi' +#define BODYPART_ICON_XENO 'modular_nova/modules/bodyparts/icons/xeno_parts_greyscale.dmi' +#define BODYPART_ICON_SYNTHMAMMAL 'modular_nova/modules/bodyparts/icons/synthmammal_parts_greyscale.dmi' +#define BODYPART_ICON_IPC 'modular_nova/modules/bodyparts/icons/ipc_parts.dmi' +#define BODYPART_ICON_SYNTHLIZARD 'modular_nova/modules/bodyparts/icons/synthliz_parts_greyscale.dmi' diff --git a/code/__DEFINES/~skyrat_defines/robot_defines.dm b/code/__DEFINES/~skyrat_defines/robot_defines.dm index 935fe1db1c8..e25e11091bf 100644 --- a/code/__DEFINES/~skyrat_defines/robot_defines.dm +++ b/code/__DEFINES/~skyrat_defines/robot_defines.dm @@ -7,50 +7,50 @@ #define SKIN_FEATURES "skin_features" //for the new system of borg making // Icon file locations for modular borg icons -#define CYBORG_ICON_STANDARD 'modular_skyrat/modules/borgs/icons/robots.dmi' +#define CYBORG_ICON_STANDARD 'modular_nova/modules/borgs/icons/robots.dmi' -#define CYBORG_ICON_MED 'modular_skyrat/modules/borgs/icons/robots_med.dmi' -#define CYBORG_ICON_MED_WIDE 'modular_skyrat/modules/borgs/icons/widerobot_med.dmi' -#define CYBORG_ICON_MED_TALL 'modular_skyrat/modules/borgs/icons/tallrobot_med.dmi' +#define CYBORG_ICON_MED 'modular_nova/modules/borgs/icons/robots_med.dmi' +#define CYBORG_ICON_MED_WIDE 'modular_nova/modules/borgs/icons/widerobot_med.dmi' +#define CYBORG_ICON_MED_TALL 'modular_nova/modules/borgs/icons/tallrobot_med.dmi' -#define CYBORG_ICON_CARGO 'modular_skyrat/modules/borgs/icons/robots_cargo.dmi' -#define CYBORG_ICON_CARGO_WIDE 'modular_skyrat/modules/borgs/icons/widerobots_cargo.dmi' -#define CYBORG_ICON_CARGO_TALL 'modular_skyrat/modules/borgs/icons/tallrobot_cargo.dmi' +#define CYBORG_ICON_CARGO 'modular_nova/modules/borgs/icons/robots_cargo.dmi' +#define CYBORG_ICON_CARGO_WIDE 'modular_nova/modules/borgs/icons/widerobots_cargo.dmi' +#define CYBORG_ICON_CARGO_TALL 'modular_nova/modules/borgs/icons/tallrobot_cargo.dmi' -#define CYBORG_ICON_SEC 'modular_skyrat/modules/borgs/icons/robots_sec.dmi' -#define CYBORG_ICON_SEC_WIDE 'modular_skyrat/modules/borgs/icons/widerobot_sec.dmi' -#define CYBORG_ICON_SEC_TALL 'modular_skyrat/modules/borgs/icons/tallrobot_sec.dmi' +#define CYBORG_ICON_SEC 'modular_nova/modules/borgs/icons/robots_sec.dmi' +#define CYBORG_ICON_SEC_WIDE 'modular_nova/modules/borgs/icons/widerobot_sec.dmi' +#define CYBORG_ICON_SEC_TALL 'modular_nova/modules/borgs/icons/tallrobot_sec.dmi' -#define CYBORG_ICON_ENG 'modular_skyrat/modules/borgs/icons/robots_eng.dmi' -#define CYBORG_ICON_ENG_WIDE 'modular_skyrat/modules/borgs/icons/widerobot_eng.dmi' -#define CYBORG_ICON_ENG_TALL 'modular_skyrat/modules/borgs/icons/tallrobot_eng.dmi' +#define CYBORG_ICON_ENG 'modular_nova/modules/borgs/icons/robots_eng.dmi' +#define CYBORG_ICON_ENG_WIDE 'modular_nova/modules/borgs/icons/widerobot_eng.dmi' +#define CYBORG_ICON_ENG_TALL 'modular_nova/modules/borgs/icons/tallrobot_eng.dmi' -#define CYBORG_ICON_PEACEKEEPER 'modular_skyrat/modules/borgs/icons/robots_pk.dmi' -#define CYBORG_ICON_PEACEKEEPER_WIDE 'modular_skyrat/modules/borgs/icons/widerobot_pk.dmi' -#define CYBORG_ICON_PEACEKEEPER_TALL 'modular_skyrat/modules/borgs/icons/tallrobot_pk.dmi' +#define CYBORG_ICON_PEACEKEEPER 'modular_nova/modules/borgs/icons/robots_pk.dmi' +#define CYBORG_ICON_PEACEKEEPER_WIDE 'modular_nova/modules/borgs/icons/widerobot_pk.dmi' +#define CYBORG_ICON_PEACEKEEPER_TALL 'modular_nova/modules/borgs/icons/tallrobot_pk.dmi' -#define CYBORG_ICON_SERVICE 'modular_skyrat/modules/borgs/icons/robots_serv.dmi' -#define CYBORG_ICON_SERVICE_WIDE 'modular_skyrat/modules/borgs/icons/widerobot_serv.dmi' -#define CYBORG_ICON_SERVICE_TALL 'modular_skyrat/modules/borgs/icons/tallrobot_serv.dmi' +#define CYBORG_ICON_SERVICE 'modular_nova/modules/borgs/icons/robots_serv.dmi' +#define CYBORG_ICON_SERVICE_WIDE 'modular_nova/modules/borgs/icons/widerobot_serv.dmi' +#define CYBORG_ICON_SERVICE_TALL 'modular_nova/modules/borgs/icons/tallrobot_serv.dmi' -#define CYBORG_ICON_MINING 'modular_skyrat/modules/borgs/icons/robots_mine.dmi' -#define CYBORG_ICON_MINING_WIDE 'modular_skyrat/modules/borgs/icons/widerobot_mine.dmi' -#define CYBORG_ICON_MINING_TALL 'modular_skyrat/modules/borgs/icons/tallrobot_mine.dmi' +#define CYBORG_ICON_MINING 'modular_nova/modules/borgs/icons/robots_mine.dmi' +#define CYBORG_ICON_MINING_WIDE 'modular_nova/modules/borgs/icons/widerobot_mine.dmi' +#define CYBORG_ICON_MINING_TALL 'modular_nova/modules/borgs/icons/tallrobot_mine.dmi' -#define CYBORG_ICON_JANI 'modular_skyrat/modules/borgs/icons/robots_jani.dmi' -#define CYBORG_ICON_JANI_WIDE 'modular_skyrat/modules/borgs/icons/widerobot_jani.dmi' -#define CYBORG_ICON_JANI_TALL 'modular_skyrat/modules/borgs/icons/tallrobot_jani.dmi' +#define CYBORG_ICON_JANI 'modular_nova/modules/borgs/icons/robots_jani.dmi' +#define CYBORG_ICON_JANI_WIDE 'modular_nova/modules/borgs/icons/widerobot_jani.dmi' +#define CYBORG_ICON_JANI_TALL 'modular_nova/modules/borgs/icons/tallrobot_jani.dmi' -#define CYBORG_ICON_SYNDIE 'modular_skyrat/modules/borgs/icons/robots_syndi.dmi' -#define CYBORG_ICON_SYNDIE_WIDE 'modular_skyrat/modules/borgs/icons/widerobot_syndi.dmi' -#define CYBORG_ICON_SYNDIE_TALL 'modular_skyrat/modules/borgs/icons/tallrobot_syndi.dmi' +#define CYBORG_ICON_SYNDIE 'modular_nova/modules/borgs/icons/robots_syndi.dmi' +#define CYBORG_ICON_SYNDIE_WIDE 'modular_nova/modules/borgs/icons/widerobot_syndi.dmi' +#define CYBORG_ICON_SYNDIE_TALL 'modular_nova/modules/borgs/icons/tallrobot_syndi.dmi' -#define CYBORG_ICON_CLOWN 'modular_skyrat/modules/borgs/icons/robots_clown.dmi' -#define CYBORG_ICON_CLOWN_WIDE 'modular_skyrat/modules/borgs/icons/widerobot_clown.dmi' -#define CYBORG_ICON_CLOWN_TALL 'modular_skyrat/modules/borgs/icons/tallrobot_clown.dmi' +#define CYBORG_ICON_CLOWN 'modular_nova/modules/borgs/icons/robots_clown.dmi' +#define CYBORG_ICON_CLOWN_WIDE 'modular_nova/modules/borgs/icons/widerobot_clown.dmi' +#define CYBORG_ICON_CLOWN_TALL 'modular_nova/modules/borgs/icons/tallrobot_clown.dmi' -#define CYBORG_ICON_NINJA 'modular_skyrat/modules/borgs/icons/robots_ninja.dmi' -#define CYBORG_ICON_NINJA_TALL 'modular_skyrat/modules/borgs/icons/tallrobot_ninja.dmi' +#define CYBORG_ICON_NINJA 'modular_nova/modules/borgs/icons/robots_ninja.dmi' +#define CYBORG_ICON_NINJA_TALL 'modular_nova/modules/borgs/icons/tallrobot_ninja.dmi' /// Module is compatible with Cargo Cyborg model #define BORG_MODEL_CARGO (BORG_MODEL_ENGINEERING<<1) diff --git a/code/__DEFINES/~skyrat_defines/species_clothing_paths.dm b/code/__DEFINES/~skyrat_defines/species_clothing_paths.dm index 8a537ed9015..64c4a5692ea 100644 --- a/code/__DEFINES/~skyrat_defines/species_clothing_paths.dm +++ b/code/__DEFINES/~skyrat_defines/species_clothing_paths.dm @@ -1,30 +1,30 @@ ///The dmi containing snouted masks -#define SNOUTED_MASK_FILE 'modular_skyrat/master_files/icons/mob/clothing/mask_muzzled.dmi' +#define SNOUTED_MASK_FILE 'modular_nova/master_files/icons/mob/clothing/mask_muzzled.dmi' ///The dmi containing snouted hats -#define SNOUTED_HEAD_FILE 'modular_skyrat/master_files/icons/mob/clothing/head_muzzled.dmi' +#define SNOUTED_HEAD_FILE 'modular_nova/master_files/icons/mob/clothing/head_muzzled.dmi' // Vox stuff -#define VOX_BACK_ICON 'modular_skyrat/master_files/icons/mob/clothing/species/vox/back.dmi' -#define VOX_BELT_ICON 'modular_skyrat/master_files/icons/mob/clothing/species/vox/belt.dmi' -#define VOX_EYES_ICON 'modular_skyrat/master_files/icons/mob/clothing/species/vox/eyes.dmi' -#define VOX_FEET_ICON 'modular_skyrat/master_files/icons/mob/clothing/species/vox/feet.dmi' -#define VOX_HANDS_ICON 'modular_skyrat/master_files/icons/mob/clothing/species/vox/hands.dmi' -#define VOX_HEAD_ICON 'modular_skyrat/master_files/icons/mob/clothing/head_vox.dmi' -#define VOX_MASK_ICON 'modular_skyrat/master_files/icons/mob/clothing/species/vox/mask.dmi' -#define VOX_NECK_ICON 'modular_skyrat/master_files/icons/mob/clothing/species/vox/neck.dmi' -#define VOX_SUIT_ICON 'modular_skyrat/master_files/icons/mob/clothing/species/vox/suit.dmi' -#define VOX_UNIFORM_ICON 'modular_skyrat/master_files/icons/mob/clothing/species/vox/uniform.dmi' -#define VOX_EARS_ICON 'modular_skyrat/master_files/icons/mob/clothing/species/vox/ears.dmi' +#define VOX_BACK_ICON 'modular_nova/master_files/icons/mob/clothing/species/vox/back.dmi' +#define VOX_BELT_ICON 'modular_nova/master_files/icons/mob/clothing/species/vox/belt.dmi' +#define VOX_EYES_ICON 'modular_nova/master_files/icons/mob/clothing/species/vox/eyes.dmi' +#define VOX_FEET_ICON 'modular_nova/master_files/icons/mob/clothing/species/vox/feet.dmi' +#define VOX_HANDS_ICON 'modular_nova/master_files/icons/mob/clothing/species/vox/hands.dmi' +#define VOX_HEAD_ICON 'modular_nova/master_files/icons/mob/clothing/head_vox.dmi' +#define VOX_MASK_ICON 'modular_nova/master_files/icons/mob/clothing/species/vox/mask.dmi' +#define VOX_NECK_ICON 'modular_nova/master_files/icons/mob/clothing/species/vox/neck.dmi' +#define VOX_SUIT_ICON 'modular_nova/master_files/icons/mob/clothing/species/vox/suit.dmi' +#define VOX_UNIFORM_ICON 'modular_nova/master_files/icons/mob/clothing/species/vox/uniform.dmi' +#define VOX_EARS_ICON 'modular_nova/master_files/icons/mob/clothing/species/vox/ears.dmi' // Vox primalis stuff -#define VOX_PRIMALIS_BACK_ICON 'modular_skyrat/modules/better_vox/icons/clothing/back.dmi' -#define VOX_PRIMALIS_BELT_ICON 'modular_skyrat/modules/better_vox/icons/clothing/belt.dmi' -#define VOX_PRIMALIS_EYES_ICON 'modular_skyrat/modules/better_vox/icons/clothing/eyes.dmi' -#define VOX_PRIMALIS_FEET_ICON 'modular_skyrat/modules/better_vox/icons/clothing/feet.dmi' -#define VOX_PRIMALIS_GLOVES_ICON 'modular_skyrat/modules/better_vox/icons/clothing/hands.dmi' -#define VOX_PRIMALIS_HEAD_ICON 'modular_skyrat/modules/better_vox/icons/clothing/head.dmi' -#define VOX_PRIMALIS_MASK_ICON 'modular_skyrat/modules/better_vox/icons/clothing/mask.dmi' -#define VOX_PRIMALIS_NECK_ICON 'modular_skyrat/modules/better_vox/icons/clothing/neck.dmi' -#define VOX_PRIMALIS_SUIT_ICON 'modular_skyrat/modules/better_vox/icons/clothing/suit.dmi' -#define VOX_PRIMALIS_UNIFORM_ICON 'modular_skyrat/modules/better_vox/icons/clothing/uniform.dmi' -#define VOX_PRIMALIS_EARS_ICON 'modular_skyrat/modules/better_vox/icons/clothing/ears.dmi' +#define VOX_PRIMALIS_BACK_ICON 'modular_nova/modules/better_vox/icons/clothing/back.dmi' +#define VOX_PRIMALIS_BELT_ICON 'modular_nova/modules/better_vox/icons/clothing/belt.dmi' +#define VOX_PRIMALIS_EYES_ICON 'modular_nova/modules/better_vox/icons/clothing/eyes.dmi' +#define VOX_PRIMALIS_FEET_ICON 'modular_nova/modules/better_vox/icons/clothing/feet.dmi' +#define VOX_PRIMALIS_GLOVES_ICON 'modular_nova/modules/better_vox/icons/clothing/hands.dmi' +#define VOX_PRIMALIS_HEAD_ICON 'modular_nova/modules/better_vox/icons/clothing/head.dmi' +#define VOX_PRIMALIS_MASK_ICON 'modular_nova/modules/better_vox/icons/clothing/mask.dmi' +#define VOX_PRIMALIS_NECK_ICON 'modular_nova/modules/better_vox/icons/clothing/neck.dmi' +#define VOX_PRIMALIS_SUIT_ICON 'modular_nova/modules/better_vox/icons/clothing/suit.dmi' +#define VOX_PRIMALIS_UNIFORM_ICON 'modular_nova/modules/better_vox/icons/clothing/uniform.dmi' +#define VOX_PRIMALIS_EARS_ICON 'modular_nova/modules/better_vox/icons/clothing/ears.dmi' diff --git a/code/__DEFINES/~skyrat_defines/teshari_clothing_paths.dm b/code/__DEFINES/~skyrat_defines/teshari_clothing_paths.dm index fbc66c208f1..20034b3a59f 100644 --- a/code/__DEFINES/~skyrat_defines/teshari_clothing_paths.dm +++ b/code/__DEFINES/~skyrat_defines/teshari_clothing_paths.dm @@ -1,12 +1,12 @@ -#define TESHARI_ACCESSORIES_ICON 'modular_skyrat/master_files/icons/mob/clothing/species/teshari/accessories.dmi' -#define TESHARI_BACK_ICON 'modular_skyrat/master_files/icons/mob/clothing/species/teshari/back.dmi' -#define TESHARI_BELT_ICON 'modular_skyrat/master_files/icons/mob/clothing/species/teshari/belt.dmi' -#define TESHARI_EYES_ICON 'modular_skyrat/master_files/icons/mob/clothing/species/teshari/eyes.dmi' -#define TESHARI_FEET_ICON 'modular_skyrat/master_files/icons/mob/clothing/species/teshari/feet.dmi' -#define TESHARI_HANDS_ICON 'modular_skyrat/master_files/icons/mob/clothing/species/teshari/hands.dmi' -#define TESHARI_HEAD_ICON 'modular_skyrat/master_files/icons/mob/clothing/species/teshari/head.dmi' -#define TESHARI_MASK_ICON 'modular_skyrat/master_files/icons/mob/clothing/species/teshari/mask.dmi' -#define TESHARI_NECK_ICON 'modular_skyrat/master_files/icons/mob/clothing/species/teshari/neck.dmi' -#define TESHARI_SUIT_ICON 'modular_skyrat/master_files/icons/mob/clothing/species/teshari/suit.dmi' -#define TESHARI_UNIFORM_ICON 'modular_skyrat/master_files/icons/mob/clothing/species/teshari/uniform.dmi' -#define TESHARI_EARS_ICON 'modular_skyrat/master_files/icons/mob/clothing/species/teshari/ears.dmi' +#define TESHARI_ACCESSORIES_ICON 'modular_nova/master_files/icons/mob/clothing/species/teshari/accessories.dmi' +#define TESHARI_BACK_ICON 'modular_nova/master_files/icons/mob/clothing/species/teshari/back.dmi' +#define TESHARI_BELT_ICON 'modular_nova/master_files/icons/mob/clothing/species/teshari/belt.dmi' +#define TESHARI_EYES_ICON 'modular_nova/master_files/icons/mob/clothing/species/teshari/eyes.dmi' +#define TESHARI_FEET_ICON 'modular_nova/master_files/icons/mob/clothing/species/teshari/feet.dmi' +#define TESHARI_HANDS_ICON 'modular_nova/master_files/icons/mob/clothing/species/teshari/hands.dmi' +#define TESHARI_HEAD_ICON 'modular_nova/master_files/icons/mob/clothing/species/teshari/head.dmi' +#define TESHARI_MASK_ICON 'modular_nova/master_files/icons/mob/clothing/species/teshari/mask.dmi' +#define TESHARI_NECK_ICON 'modular_nova/master_files/icons/mob/clothing/species/teshari/neck.dmi' +#define TESHARI_SUIT_ICON 'modular_nova/master_files/icons/mob/clothing/species/teshari/suit.dmi' +#define TESHARI_UNIFORM_ICON 'modular_nova/master_files/icons/mob/clothing/species/teshari/uniform.dmi' +#define TESHARI_EARS_ICON 'modular_nova/master_files/icons/mob/clothing/species/teshari/ears.dmi' diff --git a/code/__DEFINES/~skyrat_defines/traits/declarations.dm b/code/__DEFINES/~skyrat_defines/traits/declarations.dm index c005247fb55..66fe2caf072 100644 --- a/code/__DEFINES/~skyrat_defines/traits/declarations.dm +++ b/code/__DEFINES/~skyrat_defines/traits/declarations.dm @@ -47,7 +47,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_INSTANT_RELOAD "instant_reload" // Trait sources -#define TRAIT_GHOSTROLE "ghostrole" // SKYRAT EDIT ADDITION -- Ghost Cafe Traits +#define TRAIT_GHOSTROLE "ghostrole" // NOVA EDIT ADDITION -- Ghost Cafe Traits /// One can breath under water, you get me? #define TRAIT_WATER_BREATHING "water_breathing" diff --git a/code/__HELPERS/dynamic_human_icon_gen.dm b/code/__HELPERS/dynamic_human_icon_gen.dm index eb6d53517df..b799406376f 100644 --- a/code/__HELPERS/dynamic_human_icon_gen.dm +++ b/code/__HELPERS/dynamic_human_icon_gen.dm @@ -17,7 +17,7 @@ GLOBAL_LIST_EMPTY(dynamic_human_appearances) dummy.underwear = "Nude" dummy.undershirt = "Nude" dummy.socks = "Nude" - dummy.bra = "Nude" // SKYRAT EDIT ADDITION - Underwear and bra split + dummy.bra = "Nude" // NOVA EDIT ADDITION - Underwear and bra split if(outfit_path) var/datum/outfit/outfit = new outfit_path() if(r_hand != NO_REPLACE) //we can still override to be null, no replace means just use outfit's diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index adf8722b120..99c7dd562ea 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -174,145 +174,6 @@ active_players++ return active_players -///Show the poll window to the candidate mobs -/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) - var/list/answers = ignore_category ? list("Yes", "No", "Never for this round") : list("Yes", "No") - switch(tgui_alert(candidate_mob, question, "A limited-time offer!", answers, poll_time, autofocus = FALSE)) - if("Yes") - to_chat(candidate_mob, span_notice("Choice registered: Yes.")) - if(time_passed + poll_time <= world.time) - to_chat(candidate_mob, span_danger("Sorry, you answered too late to be considered!")) - SEND_SOUND(candidate_mob, 'sound/machines/buzz-sigh.ogg') - candidates -= candidate_mob - else - candidates += candidate_mob - if("No") - to_chat(candidate_mob, span_danger("Choice registered: No.")) - candidates -= candidate_mob - if("Never for this round") - var/list/ignore_list = GLOB.poll_ignore[ignore_category] - if(!ignore_list) - GLOB.poll_ignore[ignore_category] = list() - GLOB.poll_ignore[ignore_category] += candidate_mob.ckey - to_chat(candidate_mob, span_danger("Choice registered: Never for this round.")) - candidates -= candidate_mob - else - candidates -= candidate_mob - -///Wrapper to send all ghosts the poll to ask them if they want to be considered for a mob. -/proc/poll_ghost_candidates(question, jobban_type, be_special_flag = 0, poll_time = 300, ignore_category = null, flashwindow = TRUE) - var/list/candidates = list() - if(!(GLOB.ghost_role_flags & GHOSTROLE_STATION_SENTIENCE)) - return candidates - - for(var/mob/dead/observer/ghost_player in GLOB.player_list) - candidates += ghost_player - - return poll_candidates(question, jobban_type, be_special_flag, poll_time, ignore_category, flashwindow, candidates) - -///Calls the show_candidate_poll_window() to all eligible ghosts -/proc/poll_candidates(question, jobban_type, be_special_flag = 0, poll_time = 300, ignore_category = null, flashwindow = TRUE, list/group = null) - if (group.len == 0) - return list() - - var/time_passed = world.time - if (!question) - question = "Would you like to be a special role?" - var/list/result = list() - for(var/mob/candidate_mob as anything in group) - if(!candidate_mob.key || !candidate_mob.client || (ignore_category && GLOB.poll_ignore[ignore_category] && (candidate_mob.ckey in GLOB.poll_ignore[ignore_category]))) - continue - //SKYRAT EDIT ADDITION BEGIN - if(is_banned_from(candidate_mob.ckey, BAN_GHOST_TAKEOVER) || is_banned_from(candidate_mob.ckey, BAN_ANTAGONIST)) - to_chat(candidate_mob, "There was a ghost prompt for: [question], unfortunately you are banned from ghost takeovers.") - continue - //SKYRAT EDIT END - if(be_special_flag) - if(!(candidate_mob.client.prefs) || !(be_special_flag in candidate_mob.client.prefs.be_special)) - continue - - var/required_time = GLOB.special_roles[be_special_flag] || 0 - if (candidate_mob.client && candidate_mob.client.get_remaining_days(required_time) > 0) - continue - if(jobban_type) - if(is_banned_from(candidate_mob.ckey, list(jobban_type, ROLE_SYNDICATE)) || QDELETED(candidate_mob)) - continue - - show_candidate_poll_window(candidate_mob, poll_time, question, result, ignore_category, time_passed, flashwindow) - sleep(poll_time) - - //Check all our candidates, to make sure they didn't log off or get deleted during the wait period. - for(var/mob/asking_mob in result) - if(!asking_mob.key || !asking_mob.client) - result -= asking_mob - - list_clear_nulls(result) - - return result - -/** - * Returns a list of ghosts that are eligible to take over and wish to be considered for a mob. - * - * Arguments: - * * question - question to show players as part of poll - * * jobban_type - Type of jobban to use to filter out potential candidates. - * * be_special_flag - The required role that the player has to have enabled to see the prompt. - * * poll_time - Length of time in deciseconds that the poll input box exists before closing. - * * target_mob - The mob that is being polled for. - * * ignore_category - The notification preference that hides the prompt. - */ -/proc/poll_candidates_for_mob(question, jobban_type, be_special_flag = 0, poll_time = 30 SECONDS, mob/target_mob, ignore_category = null) - var/static/list/mob/currently_polling_mobs = list() - - if(currently_polling_mobs.Find(target_mob)) - return list() - - currently_polling_mobs += target_mob - - var/list/possible_candidates = poll_ghost_candidates(question, jobban_type, be_special_flag, poll_time, ignore_category) - - currently_polling_mobs -= target_mob - if(!target_mob || QDELETED(target_mob) || !target_mob.loc) - return list() - - return possible_candidates - -/** - * Returns a list of ghosts that are eligible to take over and wish to be considered for a mob. - * - * Arguments: - * * question - question to show players as part of poll - * * jobban_type - Type of jobban to use to filter out potential candidates. - * * be_special_flag - The required role that the player has to have enabled to see the prompt. - * * poll_time - Length of time in deciseconds that the poll input box exists before closing. - * * mobs - The list of mobs being polled for. This list is mutated and invalid mobs are removed from it before the proc returns. - * * ignore_category - The notification preference that hides the prompt. - */ -/proc/poll_candidates_for_mobs(question, jobban_type, be_special_flag = 0, poll_time = 30 SECONDS, list/mobs, ignore_category = null) - var/list/candidate_list = poll_ghost_candidates(question, jobban_type, be_special_flag, poll_time, ignore_category) - - for(var/mob/potential_mob as anything in mobs) - if(QDELETED(potential_mob) || !potential_mob.loc) - mobs -= potential_mob - - if(!length(mobs)) - return list() - - return candidate_list - ///Uses stripped down and bastardized code from respawn character /proc/make_body(mob/dead/observer/ghost_player) if(!ghost_player || !ghost_player.key) diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index ba342c20d5e..408852af459 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -14,7 +14,7 @@ //socks init_sprite_accessory_subtypes(/datum/sprite_accessory/socks, GLOB.socks_list) //bodypart accessories (blizzard intensifies) - //SKYRAT EDIT REMOVAL BEGIN - CUSTOMIZATION + //NOVA EDIT REMOVAL BEGIN - CUSTOMIZATION /* init_sprite_accessory_subtypes(/datum/sprite_accessory/body_markings, GLOB.body_markings_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/human, GLOB.tails_list_human, add_blank = TRUE) @@ -33,15 +33,15 @@ init_sprite_accessory_subtypes(/datum/sprite_accessory/moth_wings, GLOB.moth_wings_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/moth_antennae, GLOB.moth_antennae_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/moth_markings, GLOB.moth_markings_list) - */ //SKYRAT EDIT REMOVAL END + */ //NOVA EDIT REMOVAL END //bras - init_sprite_accessory_subtypes(/datum/sprite_accessory/bra, GLOB.bra_list, GLOB.bra_m, GLOB.bra_f) // SKYRAT EDIT ADDITION + init_sprite_accessory_subtypes(/datum/sprite_accessory/bra, GLOB.bra_list, GLOB.bra_m, GLOB.bra_f) // NOVA EDIT ADDITION - init_sprite_accessory_subtypes(/datum/sprite_accessory/wings/moth, GLOB.moth_wings_list) // SKYRAT EDIT ADDITION - Customization - init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/monkey, GLOB.tails_list_monkey, add_blank = TRUE) // SKYRAT EDIT ADDITION - We don't want monkeys getting randomized non-monkey tails - init_sprite_accessory_subtypes(/datum/sprite_accessory/pod_hair, GLOB.pod_hair_list, add_blank = TRUE) // SKYRAT EDIT - Customization - ORIGINAL: init_sprite_accessory_subtypes(/datum/sprite_accessory/pod_hair, GLOB.pod_hair_list) + init_sprite_accessory_subtypes(/datum/sprite_accessory/wings/moth, GLOB.moth_wings_list) // NOVA EDIT ADDITION - Customization + init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/monkey, GLOB.tails_list_monkey, add_blank = TRUE) // NOVA EDIT ADDITION - We don't want monkeys getting randomized non-monkey tails + init_sprite_accessory_subtypes(/datum/sprite_accessory/pod_hair, GLOB.pod_hair_list, add_blank = TRUE) // NOVA EDIT - Customization - ORIGINAL: init_sprite_accessory_subtypes(/datum/sprite_accessory/pod_hair, GLOB.pod_hair_list) - //SKYRAT EDIT ADDITION BEGIN + //NOVA EDIT ADDITION BEGIN //Scream types for(var/spath in subtypesof(/datum/scream_type)) var/datum/scream_type/S = new spath() @@ -53,7 +53,7 @@ var/datum/laugh_type/L = new spath() GLOB.laugh_types[L.name] = spath sort_list(GLOB.laugh_types, GLOBAL_PROC_REF(cmp_typepaths_asc)) - //SKYRAT EDIT END + //NOVA EDIT END //THE FLUFFY FRONTIER EDIT ADDITION BEGIN - Blooper for(var/sound_blooper_path in subtypesof(/datum/blooper)) @@ -97,7 +97,7 @@ GLOB.emote_list = init_emote_list() // WHY DOES THIS NEED TO GO HERE? IT JUST INITS DATUMS - make_skyrat_datum_references() //SKYRAT EDIT ADDITION - CUSTOMIZATION + make_skyrat_datum_references() //NOVA EDIT ADDITION - CUSTOMIZATION init_crafting_recipes() init_crafting_recipes_atoms() @@ -107,7 +107,7 @@ if(ispath(path, /datum/crafting_recipe/stack)) continue var/datum/crafting_recipe/recipe = new path() - var/is_cooking = ((recipe.category in GLOB.crafting_category_food) || (recipe.category in GLOB.crafting_category_food_skyrat)) // SKYRAT EDIT - Add skyrat food crafting category + var/is_cooking = ((recipe.category in GLOB.crafting_category_food) || (recipe.category in GLOB.crafting_category_food_skyrat)) // NOVA EDIT - Add skyrat food crafting category recipe.reqs = sort_list(recipe.reqs, GLOBAL_PROC_REF(cmp_crafting_req_priority)) if(recipe.name != "" && recipe.result) if(is_cooking) @@ -128,7 +128,7 @@ /obj/item/stack/sheet/sinew = GLOB.sinew_recipes, /obj/item/stack/sheet/animalhide/carp = GLOB.carp_recipes, /obj/item/stack/sheet/mineral/sandstone = GLOB.sandstone_recipes, - /obj/item/stack/sheet/mineral/clay = GLOB.clay_recipes, // SKYRAT EDIT ADDITION + /obj/item/stack/sheet/mineral/clay = GLOB.clay_recipes, // NOVA EDIT ADDITION /obj/item/stack/sheet/mineral/sandbags = GLOB.sandbag_recipes, /obj/item/stack/sheet/mineral/diamond = GLOB.diamond_recipes, /obj/item/stack/sheet/mineral/uranium = GLOB.uranium_recipes, @@ -270,7 +270,7 @@ GLOBAL_LIST_INIT(WALLITEMS_INTERIOR, typecacheof(list( /obj/machinery/status_display, /obj/machinery/ticket_machine, /obj/machinery/turretid, - /obj/machinery/time_clock, //SKYRAT EDIT TIME CLOCK + /obj/machinery/time_clock, //NOVA EDIT TIME CLOCK /obj/machinery/barsign, /obj/structure/extinguisher_cabinet, /obj/structure/fireaxecabinet, diff --git a/code/__HELPERS/heap.dm b/code/__HELPERS/heap.dm index 363fbbb80d6..eeabfa6a20b 100644 --- a/code/__HELPERS/heap.dm +++ b/code/__HELPERS/heap.dm @@ -10,7 +10,7 @@ L = new() cmp = compare -/datum/heap/Destroy(force, ...) +/datum/heap/Destroy(force) for(var/i in L) // because this is before the list helpers are loaded qdel(i) L = null diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm index acb03151f1d..798059ac7b7 100644 --- a/code/__HELPERS/icons.dm +++ b/code/__HELPERS/icons.dm @@ -1021,7 +1021,7 @@ GLOBAL_LIST_EMPTY(friendly_animal_types) if(job) body.dna.species.pre_equip_species_outfit(job, body, TRUE) if(outfit) - body.equip_outfit_and_loadout(outfit, prefs, TRUE) //SKYRAT EDIT CHANGE + body.equip_outfit_and_loadout(outfit, prefs, TRUE) //NOVA EDIT CHANGE var/icon/out_icon = icon('icons/effects/effects.dmi', "nothing") for(var/direction in showDirs) diff --git a/code/__HELPERS/logging/_logging.dm b/code/__HELPERS/logging/_logging.dm index 045d7fcbcce..1e8b688efcc 100644 --- a/code/__HELPERS/logging/_logging.dm +++ b/code/__HELPERS/logging/_logging.dm @@ -99,7 +99,7 @@ GLOBAL_LIST_INIT(testing_global_profiler, list("_PROFILE_NAME" = "Global")) if(!log_globally) return - //SKYRAT EDIT ADDITION BEGIN + //NOVA EDIT ADDITION BEGIN #ifndef SPACEMAN_DMM if(CONFIG_GET(flag/sql_game_log) && CONFIG_GET(flag/sql_enabled)) SSdbcore.add_log_to_mass_insert_queue( @@ -116,7 +116,7 @@ GLOBAL_LIST_INIT(testing_global_profiler, list("_PROFILE_NAME" = "Global")) if(!CONFIG_GET(flag/file_game_log)) return #endif - //SKYRAT EDIT ADDITION END + //NOVA EDIT ADDITION END var/log_text = "[key_name_and_tag(src)] [message] [loc_name(src)]" switch(message_type) /// ship both attack logs and victim logs to the end of round attack.log just to ensure we don't lose information @@ -128,12 +128,12 @@ GLOBAL_LIST_INIT(testing_global_profiler, list("_PROFILE_NAME" = "Global")) log_whisper(log_text, data) if(LOG_EMOTE) log_emote(log_text, data) - //SKYRAT EDIT ADDITION BEGIN + //NOVA EDIT ADDITION BEGIN if(LOG_SUBTLE) log_subtle(log_text, data) if(LOG_SUBTLER) log_subtler(log_text, data) - //SKYRAT EDIT ADDITION END + //NOVA EDIT ADDITION END if(LOG_RADIO_EMOTE) log_radio_emote(log_text, data) if(LOG_DSAY) diff --git a/code/__HELPERS/logging/dynamic.dm b/code/__HELPERS/logging/dynamic.dm index 51bba86ca05..488aeaec3be 100644 --- a/code/__HELPERS/logging/dynamic.dm +++ b/code/__HELPERS/logging/dynamic.dm @@ -1,5 +1,5 @@ /// Log to dynamic and message admins -/datum/game_mode/dynamic/proc/log_dynamic_and_announce(text) +/datum/controller/subsystem/dynamic/proc/log_dynamic_and_announce(text) message_admins("DYNAMIC: [text]") log_dynamic("[text]") diff --git a/code/__HELPERS/logging/mob.dm b/code/__HELPERS/logging/mob.dm index 9b8f3c0a831..05893970db6 100644 --- a/code/__HELPERS/logging/mob.dm +++ b/code/__HELPERS/logging/mob.dm @@ -44,12 +44,12 @@ colored_message = "(ASAY) [colored_message]" if(LOG_EMOTE) colored_message = "(EMOTE) [colored_message]" - //SKYRAT EDIT ADDITION BEGIN + //NOVA EDIT ADDITION BEGIN if(LOG_SUBTLE) colored_message = "(EMOTE) (SUBTLE) [colored_message]" if(LOG_SUBTLER) colored_message = "(EMOTE) (SUBTLER) [colored_message]" - //SKYRAT EDIT ADDITION END + //NOVA EDIT ADDITION END if(LOG_RADIO_EMOTE) colored_message = "(RADIOEMOTE) [colored_message]" diff --git a/code/__HELPERS/matrices.dm b/code/__HELPERS/matrices.dm index 075a5e5ae0e..e6a9e038849 100644 --- a/code/__HELPERS/matrices.dm +++ b/code/__HELPERS/matrices.dm @@ -102,15 +102,6 @@ list(-1,0,0,0, 0,-1,0,0, 0,0,-1,0, 0,0,0,1, 1,1,1,0) list(0.393,0.349,0.272,0, 0.769,0.686,0.534,0, 0.189,0.168,0.131,0, 0,0,0,1, 0,0,0,0) */ -//Does nothing -/proc/color_matrix_identity() - return list(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1, 0,0,0,0) - -//Adds/subtracts overall lightness -//0 is identity, 1 makes everything white, -1 makes everything black -/proc/color_matrix_lightness(power) - return list(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1, power,power,power,0) - //Changes distance hues have from grey while maintaining the overall lightness. Greys are unaffected. //1 is identity, 0 is greyscale, >1 oversaturates colors /proc/color_matrix_saturation(value) @@ -121,12 +112,6 @@ list(0.393,0.349,0.272,0, 0.769,0.686,0.534,0, 0.189,0.168,0.131,0, 0,0,0,1, 0,0 return list(R + value,R,R,0, G,G + value,G,0, B,B,B + value,0, 0,0,0,1, 0,0,0,0) -//Changes distance colors have from rgb(127,127,127) grey -//1 is identity. 0 makes everything grey >1 blows out colors and greys -/proc/color_matrix_contrast(value) - var/add = (1 - value) / 2 - return list(value,0,0,0, 0,value,0,0, 0,0,value,0, 0,0,0,1, add,add,add,0) - //Moves all colors angle degrees around the color wheel while maintaining intensity of the color and not affecting greys //0 is identity, 120 moves reds to greens, 240 moves reds to blues /proc/color_matrix_rotate_hue(angle) @@ -159,9 +144,9 @@ round(cos_inv_third+sqrt3_sin, 0.001), round(cos_inv_third-sqrt3_sin, 0.001), ro //Returns a matrix addition of A with B /proc/color_matrix_add(list/A, list/B) if(!istype(A) || !istype(B)) - return color_matrix_identity() + return COLOR_MATRIX_IDENTITY if(A.len != 20 || B.len != 20) - return color_matrix_identity() + return COLOR_MATRIX_IDENTITY var/list/output = list() output.len = 20 for(var/value in 1 to 20) @@ -171,9 +156,9 @@ round(cos_inv_third+sqrt3_sin, 0.001), round(cos_inv_third-sqrt3_sin, 0.001), ro //Returns a matrix multiplication of A with B /proc/color_matrix_multiply(list/A, list/B) if(!istype(A) || !istype(B)) - return color_matrix_identity() + return COLOR_MATRIX_IDENTITY if(A.len != 20 || B.len != 20) - return color_matrix_identity() + return COLOR_MATRIX_IDENTITY var/list/output = list() output.len = 20 var/x = 1 @@ -191,14 +176,14 @@ round(cos_inv_third+sqrt3_sin, 0.001), round(cos_inv_third-sqrt3_sin, 0.001), ro */ /proc/color_to_full_rgba_matrix(color, return_identity_on_fail = TRUE) if(!color) - return color_matrix_identity() + return COLOR_MATRIX_IDENTITY if(istext(color)) var/list/L = ReadRGB(color) if(!L) var/message = "Invalid/unsupported color ([color]) argument in color_to_full_rgba_matrix()" if(return_identity_on_fail) stack_trace(message) - return color_matrix_identity() + return COLOR_MATRIX_IDENTITY CRASH(message) return list(L[1]/255,0,0,0, 0,L[2]/255,0,0, 0,0,L[3]/255,0, 0,0,0,L.len>3?L[4]/255:1, 0,0,0,0) if(!islist(color)) //invalid format @@ -231,7 +216,7 @@ round(cos_inv_third+sqrt3_sin, 0.001), round(cos_inv_third-sqrt3_sin, 0.001), ro var/message = "Invalid/unsupported color (list of length [L.len]) argument in color_to_full_rgba_matrix()" if(return_identity_on_fail) stack_trace(message) - return color_matrix_identity() + return COLOR_MATRIX_IDENTITY CRASH(message) #undef LUMA_R diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 5a408937a04..19a062bb156 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -58,7 +58,7 @@ /proc/random_backpack() return pick(GLOB.backpacklist) -// SKYRAT EDIT REMOVAL - CUSTOMIZATION (moved to modular) +// NOVA EDIT REMOVAL - CUSTOMIZATION (moved to modular) /* /proc/random_features() if(!GLOB.tails_list.len) @@ -114,7 +114,7 @@ "pod_hair" = pick(GLOB.pod_hair_list), )) */ -//SKYRAT EDIT REMOVAL END +//NOVA EDIT REMOVAL END /proc/random_hairstyle(gender) switch(gender) @@ -218,7 +218,7 @@ GLOBAL_LIST_EMPTY(species_list) /proc/age2agedescription(age) switch(age) - if(0 to 30) //SKYRAT EDIT CHANGE - NO + if(0 to 30) //NOVA EDIT CHANGE - NO return "young adult" if(30 to 45) return "adult" @@ -623,10 +623,10 @@ GLOBAL_LIST_EMPTY(species_list) moblist += mob_to_sort for(var/mob/living/basic/mob_to_sort in sortmob) moblist += mob_to_sort - // SKYRAT EDIT START - SOULCATCHERS + // NOVA EDIT START - SOULCATCHERS for(var/mob/living/soulcatcher_soul/mob_to_sort in sortmob) moblist += mob_to_sort - // SKYRAT EDIT END - SOULCATCHERS + // NOVA EDIT END - SOULCATCHERS return moblist ///returns a mob type controlled by a specified ckey /proc/get_mob_by_ckey(key) diff --git a/code/__HELPERS/paths/jps.dm b/code/__HELPERS/paths/jps.dm index 6a86f6ebe62..2dc46dea1b7 100644 --- a/code/__HELPERS/paths/jps.dm +++ b/code/__HELPERS/paths/jps.dm @@ -38,7 +38,7 @@ f_value = number_tiles + heuristic // otherwise, no parent node means this is from a subscan lateral scan, so we just need the tile for now until we call [datum/jps/proc/update_parent] on it -/datum/jps_node/Destroy(force, ...) +/datum/jps_node/Destroy(force) previous_node = null return ..() diff --git a/code/__HELPERS/paths/path.dm b/code/__HELPERS/paths/path.dm index 14241ef8e70..28ef66aa45e 100644 --- a/code/__HELPERS/paths/path.dm +++ b/code/__HELPERS/paths/path.dm @@ -97,7 +97,7 @@ /// Datum that holds the canpass info of this pathing attempt. This is what CanAstarPass sees var/datum/can_pass_info/pass_info -/datum/pathfind/Destroy(force, ...) +/datum/pathfind/Destroy(force) . = ..() SSpathfinder.active_pathing -= src SSpathfinder.currentrun -= src diff --git a/code/__HELPERS/priority_announce.dm b/code/__HELPERS/priority_announce.dm index d675b252796..f63b90b83a1 100644 --- a/code/__HELPERS/priority_announce.dm +++ b/code/__HELPERS/priority_announce.dm @@ -142,7 +142,7 @@ else finalized_announcement = CHAT_ALERT_DEFAULT_SPAN(jointext(minor_announcement_strings, "")) - var/custom_sound = sound_override || (alert ? 'modular_skyrat/modules/alerts/sound/alerts/alert1.ogg' : 'sound/misc/notice2.ogg') // SKYRAT EDIT CHANGE - CUSTOM ANNOUNCEMENTS - Original: 'sound/misc/notice1.ogg' + var/custom_sound = sound_override || (alert ? 'modular_nova/modules/alerts/sound/alerts/alert1.ogg' : 'sound/misc/notice2.ogg') // NOVA EDIT CHANGE - CUSTOM ANNOUNCEMENTS - Original: 'sound/misc/notice1.ogg' dispatch_announcement_to_players(finalized_announcement, players, custom_sound, should_play_sound) /// Sends an announcement about the level changing to players. Uses the passed in datum and the subsystem's previous security level to generate the message. @@ -186,7 +186,7 @@ /// Proc that just dispatches the announcement to our applicable audience. Only the announcement is a mandatory arg. /proc/dispatch_announcement_to_players(announcement, list/players = GLOB.player_list, sound_override = null, should_play_sound = TRUE) - // SKYRAT EDIT CHANGE BEGIN - CUSTOM ANNOUNCEMENTS + // NOVA EDIT CHANGE BEGIN - CUSTOM ANNOUNCEMENTS /* Original: var/sound_to_play = !isnull(sound_override) ? sound_override : 'sound/misc/notice2.ogg' @@ -219,7 +219,7 @@ continue to_chat(target, announcement) - // SKYRAT EDIT CHANGE END - CUSTOM ANNOUNCEMENTS + // NOVA EDIT CHANGE END - CUSTOM ANNOUNCEMENTS #undef MAJOR_ANNOUNCEMENT_TITLE #undef MAJOR_ANNOUNCEMENT_TEXT diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm index bad17bdc28f..03660568a7e 100644 --- a/code/__HELPERS/roundend.dm +++ b/code/__HELPERS/roundend.dm @@ -234,32 +234,32 @@ GLOBAL_LIST_INIT(achievements_unlocked, list()) CHECK_TICK - /* ///SKYRAT EDIT START + /* ///NOVA EDIT START // Add AntagHUD to everyone, see who was really evil the whole time! for(var/datum/atom_hud/alternate_appearance/basic/antagonist_hud/antagonist_hud in GLOB.active_alternate_appearances) for(var/mob/player as anything in GLOB.player_list) antagonist_hud.show_to(player) CHECK_TICK - ///Skyrat EDIT END + ///NOVA EDIT END */ //Set news report and mode result - mode.set_round_result() + SSdynamic.set_round_result() to_chat(world, span_infoplain(span_big(span_bold("


The round has ended.")))) log_game("The round has ended.") send2chat(new /datum/tgs_message_content("[GLOB.round_id ? "Round [GLOB.round_id]" : "The round has"] just ended."), CONFIG_GET(string/channel_announce_end_game)) send2adminchat("Server", "Round just ended.") - /* //SKYRAT EDIT - START (DISCORD Updates) + /* //NOVA EDIT - START (DISCORD Updates) MOVED CHECK INTO TICKER.DM if(length(CONFIG_GET(keyed_list/cross_server))) send_news_report() */ send2chat("The current round has ended. Please standby for your shift interlude Nanotrasen News Network's report!", CONFIG_GET(string/channel_announce_end_game)) send2chat(send_news_report(), CONFIG_GET(string/channel_announce_end_game)) - //SKYRAT EDIT - END + //NOVA EDIT - END CHECK_TICK @@ -322,7 +322,7 @@ GLOBAL_LIST_INIT(achievements_unlocked, list()) //Antagonists parts += antag_report() - parts += opfor_report() //SKYRAT EDIT ADDITION + parts += opfor_report() //NOVA EDIT ADDITION parts += hardcore_random_report() @@ -364,17 +364,17 @@ GLOBAL_LIST_INIT(achievements_unlocked, list()) //ignore this comment, it fixes the broken sytax parsing caused by the " above else parts += "[FOURSPACES]Nobody died this shift!" - if(istype(SSticker.mode, /datum/game_mode/dynamic)) - var/datum/game_mode/dynamic/mode = SSticker.mode - parts += "[FOURSPACES]Threat level: [mode.threat_level]" - parts += "[FOURSPACES]Threat left: [mode.mid_round_budget]" - if(mode.roundend_threat_log.len) - parts += "[FOURSPACES]Threat edits:" - for(var/entry as anything in mode.roundend_threat_log) - parts += "[FOURSPACES][FOURSPACES][entry]
" - parts += "[FOURSPACES]Executed rules:" - for(var/datum/dynamic_ruleset/rule in mode.executed_rules) - parts += "[FOURSPACES][FOURSPACES][rule.ruletype] - [rule.name]: -[rule.cost + rule.scaled_times * rule.scaling_cost] threat" + + parts += "[FOURSPACES]Threat level: [SSdynamic.threat_level]" + parts += "[FOURSPACES]Threat left: [SSdynamic.mid_round_budget]" + if(SSdynamic.roundend_threat_log.len) + parts += "[FOURSPACES]Threat edits:" + for(var/entry as anything in SSdynamic.roundend_threat_log) + parts += "[FOURSPACES][FOURSPACES][entry]
" + parts += "[FOURSPACES]Executed rules:" + for(var/datum/dynamic_ruleset/rule in SSdynamic.executed_rules) + parts += "[FOURSPACES][FOURSPACES][rule.ruletype] - [rule.name]: -[rule.cost + rule.scaled_times * rule.scaling_cost] threat" + return parts.Join("
") /client/proc/roundend_report_file() @@ -471,7 +471,7 @@ GLOBAL_LIST_INIT(achievements_unlocked, list()) var/mob/living/silicon/ai/aiPlayer = i var/datum/mind/aiMind = aiPlayer.deployed_shell?.mind || aiPlayer.mind if(aiMind) - parts += "[aiPlayer.name]'s laws [aiPlayer.stat != DEAD ? "at the end of the round" : "when it was [span_redtext("deactivated")]"] were:" //SKYRAT EDIT CHANGE + parts += "[aiPlayer.name]'s laws [aiPlayer.stat != DEAD ? "at the end of the round" : "when it was [span_redtext("deactivated")]"] were:" //NOVA EDIT CHANGE parts += aiPlayer.laws.get_law_list(include_zeroth=TRUE) parts += "Total law changes: [aiPlayer.law_change_counter]" @@ -482,19 +482,19 @@ GLOBAL_LIST_INIT(achievements_unlocked, list()) for(var/mob/living/silicon/robot/robo in aiPlayer.connected_robots) borg_num-- if(robo.mind) - //SKYRAT EDIT CHANGE BEGIN - ROUNDEND - //parts += "[robo.name] (Played by: [robo.mind.key])[robo.stat == DEAD ? " [span_redtext("(Deactivated)")]" : ""][borg_num ?", ":""]" - SKYRAT EDIT - ORIGINAL + //NOVA EDIT CHANGE BEGIN - ROUNDEND + //parts += "[robo.name] (Played by: [robo.mind.key])[robo.stat == DEAD ? " [span_redtext("(Deactivated)")]" : ""][borg_num ?", ":""]" - NOVA EDIT - ORIGINAL parts += "[robo.name] [robo.stat == DEAD ? " [span_redtext("(Deactivated)")]" : ""][borg_num ?", ":""]" - //SKYRAT EDIT CHANGE END + //NOVA EDIT CHANGE END if(!borg_spacer) borg_spacer = TRUE for (var/mob/living/silicon/robot/robo in GLOB.silicon_mobs) if (!robo.connected_ai && robo.mind) - //SKYRAT EDIT CHANGE BEGIN - ROUNDEND + //NOVA EDIT CHANGE BEGIN - ROUNDEND //parts += "[borg_spacer?"
":""][robo.name] (Played by: [robo.mind.key]) [(robo.stat != DEAD)? "[span_greentext("survived")] as an AI-less borg!" : "was [span_redtext("unable to survive")] the rigors of being a cyborg without an AI."] Its laws were:" parts += "[borg_spacer?"
":""][robo.name] [(robo.stat != DEAD)? "[span_greentext("survived")] as an AI-less borg!" : "was [span_redtext("unable to survive")] the rigors of being a cyborg without an AI."] Its laws were:" - //SKYRAT EDIT CHANGE END + //NOVA EDIT CHANGE END if(robo) //How the hell do we lose robo between here and the world messages directly above this? parts += robo.laws.get_law_list(include_zeroth=TRUE) @@ -700,10 +700,10 @@ GLOBAL_LIST_INIT(achievements_unlocked, list()) var/jobtext = "" if(!is_unassigned_job(ply.assigned_role)) jobtext = " the [ply.assigned_role.title]" - //SKYRAT EDIT CHANGE BEGIN - ROUNDEND - //var/text = "[ply.key] was [ply.name][jobtext] and" - SKYRAT EDIT - ORIGINAL + //NOVA EDIT CHANGE BEGIN - ROUNDEND + //var/text = "[ply.key] was [ply.name][jobtext] and" - NOVA EDIT - ORIGINAL var/text = "[ply.name][jobtext]" - //SKYRAT EDIT CHANGE END + //NOVA EDIT CHANGE END if(ply.current) if(ply.current.stat == DEAD) text += " [span_redtext("died")]" @@ -827,7 +827,7 @@ GLOBAL_LIST_INIT(achievements_unlocked, list()) parts += "Total Achievements Earned: [length(GLOB.achievements_unlocked)]!
" parts += "" return "
" diff --git a/code/__HELPERS/sanitize_values.dm b/code/__HELPERS/sanitize_values.dm index 002ac24c732..f4de5bedab7 100644 --- a/code/__HELPERS/sanitize_values.dm +++ b/code/__HELPERS/sanitize_values.dm @@ -53,11 +53,11 @@ /proc/sanitize_hexcolor(color, desired_format = DEFAULT_HEX_COLOR_LEN, include_crunch = TRUE, default) var/crunch = include_crunch ? "#" : "" - //SKYRAT EDIT ADDITION BEGIN - CUSTOMIZATION + //NOVA EDIT ADDITION BEGIN - CUSTOMIZATION if(islist(color)) var/list/color_list = color color = color_list.Join() - //SKYRAT EDIT ADDITION END + //NOVA EDIT ADDITION END if(!istext(color)) color = "" diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm index 1e39cd6eaf3..d12ac9a2d50 100644 --- a/code/__HELPERS/text.dm +++ b/code/__HELPERS/text.dm @@ -157,7 +157,7 @@ * * allow_numbers - allows numbers and common special characters - used for silicon/other weird things names * * cap_after_symbols - words like Bob's will be capitalized to Bob'S by default. False is good for titles. */ -/proc/reject_bad_name(t_in, allow_numbers = TRUE, max_length = MAX_NAME_LEN, ascii_only = TRUE, strict = FALSE, cap_after_symbols = TRUE) // SKYRAT EDIT CHANGE - allow_numbers to TRUE +/proc/reject_bad_name(t_in, allow_numbers = TRUE, max_length = MAX_NAME_LEN, ascii_only = TRUE, strict = FALSE, cap_after_symbols = TRUE) // NOVA EDIT CHANGE - allow_numbers to TRUE if(!t_in) return //Rejects the input if it is null diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm index 3b2d52fbbb6..98e48852094 100644 --- a/code/__HELPERS/type2type.dm +++ b/code/__HELPERS/type2type.dm @@ -337,7 +337,7 @@ GLOBAL_LIST_INIT(modulo_angle_to_dir, list(NORTH,NORTHEAST,EAST,SOUTHEAST,SOUTH, /proc/color_hex2color_matrix(string) var/length = length(string) if((length != 7 && length != 9) || length != length_char(string)) - return color_matrix_identity() + return COLOR_MATRIX_IDENTITY var/r = hex2num(copytext(string, 2, 4))/255 var/g = hex2num(copytext(string, 4, 6))/255 var/b = hex2num(copytext(string, 6, 8))/255 @@ -345,7 +345,7 @@ GLOBAL_LIST_INIT(modulo_angle_to_dir, list(NORTH,NORTHEAST,EAST,SOUTHEAST,SOUTH, if(length == 9) a = hex2num(copytext(string, 8, 10))/255 if(!isnum(r) || !isnum(g) || !isnum(b) || !isnum(a)) - return color_matrix_identity() + return COLOR_MATRIX_IDENTITY return list(r,0,0,0, 0,g,0,0, 0,0,b,0, 0,0,0,a, 0,0,0,0) //will drop all values not on the diagonal diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index 93d55731d95..d2ff2e7b542 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -205,10 +205,10 @@ DEFINE_BITFIELD(flags_inv, list( "HIDESHOES" = HIDESHOES, "HIDESNOUT" = HIDESNOUT, "HIDESUITSTORAGE" = HIDESUITSTORAGE, - "SHOWSPRITEEARS" = SHOWSPRITEEARS, // SKYRAT EDIT ADDITION START + "SHOWSPRITEEARS" = SHOWSPRITEEARS, // NOVA EDIT ADDITION START "HIDETAIL" = HIDETAIL, "HIDESPINE" = HIDESPINE, - "HIDESEXTOY" = HIDESEXTOY, // SKYRAT EDIT ADDITION END + "HIDESEXTOY" = HIDESEXTOY, // NOVA EDIT ADDITION END )) DEFINE_BITFIELD(machine_stat, list( @@ -222,8 +222,7 @@ DEFINE_BITFIELD(mat_container_flags, list( "MATCONTAINER_EXAMINE" = MATCONTAINER_EXAMINE, "MATCONTAINER_NO_INSERT" = MATCONTAINER_NO_INSERT, "MATCONTAINER_ANY_INTENT" = MATCONTAINER_ANY_INTENT, - "MATCONTAINER_SILENT" = MATCONTAINER_SILENT, - "BREAKDOWN_ALLOYS" = BREAKDOWN_ALLOYS, + "MATCONTAINER_SILENT" = MATCONTAINER_SILENT )) DEFINE_BITFIELD(internal_damage, list( @@ -398,12 +397,12 @@ DEFINE_BITFIELD(acceptable_bodytype, list( "BODYTYPE_LARVA_PLACEHOLDER" = BODYTYPE_LARVA_PLACEHOLDER, "BODYTYPE_ALIEN" = BODYTYPE_ALIEN, "BODYTYPE_GOLEM" = BODYTYPE_GOLEM, - // SKYRAT EDIT ADDITION - customization + // NOVA EDIT ADDITION - customization "BODYTYPE_CUSTOM" = BODYTYPE_CUSTOM, "BODYTYPE_TAUR" = BODYTYPE_TAUR, "BODYTYPE_HIDE_SHOES" = BODYTYPE_HIDE_SHOES, "BODYTYPE_ALT_FACEWEAR_LAYER" = BODYTYPE_ALT_FACEWEAR_LAYER, - // SKYRAT EDIT END + // NOVA EDIT END )) DEFINE_BITFIELD(bodypart_flags, list( @@ -430,11 +429,11 @@ DEFINE_BITFIELD(supports_variations_flags, list( "CLOTHING_NO_VARIATION" = CLOTHING_NO_VARIATION, "CLOTHING_DIGITIGRADE_VARIATION" = CLOTHING_DIGITIGRADE_VARIATION, "CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON" = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON, - "CLOTHING_MONKEY_VARIATION" = CLOTHING_MONKEY_VARIATION, // SKYRAT EDIT ADDITION BEGIN + "CLOTHING_MONKEY_VARIATION" = CLOTHING_MONKEY_VARIATION, // NOVA EDIT ADDITION BEGIN "CLOTHING_SNOUTED_VARIATION" = CLOTHING_SNOUTED_VARIATION, "CLOTHING_SNOUTED_VARIATION_NO_NEW_ICON" = CLOTHING_SNOUTED_VARIATION_NO_NEW_ICON, "CLOTHING_SNOUTED_VOX_VARIATION" = CLOTHING_SNOUTED_VOX_VARIATION, - "CLOTHING_SNOUTED_VOX_VARIATION_NO_NEW_ICON" = CLOTHING_SNOUTED_VOX_VARIATION_NO_NEW_ICON, // SKYRAT EDIT END + "CLOTHING_SNOUTED_VOX_VARIATION_NO_NEW_ICON" = CLOTHING_SNOUTED_VOX_VARIATION_NO_NEW_ICON, // NOVA EDIT END )) DEFINE_BITFIELD(flora_flags, list( @@ -489,7 +488,7 @@ DEFINE_BITFIELD(liked_foodtypes, list( "BUGS" = BUGS, "GORE" = GORE, "STONE" = STONE, - "BLOODY" = BLOODY, // SKYRAT EDIT - Hemophage Food + "BLOODY" = BLOODY, // NOVA EDIT - Hemophage Food )) DEFINE_BITFIELD(disliked_foodtypes, list( @@ -514,7 +513,7 @@ DEFINE_BITFIELD(disliked_foodtypes, list( "BUGS" = BUGS, "GORE" = GORE, "STONE" = STONE, - "BLOODY" = BLOODY, // SKYRAT EDIT - Hemophage Food + "BLOODY" = BLOODY, // NOVA EDIT - Hemophage Food )) DEFINE_BITFIELD(toxic_foodtypes, list( @@ -539,7 +538,7 @@ DEFINE_BITFIELD(toxic_foodtypes, list( "BUGS" = BUGS, "GORE" = GORE, "STONE" = STONE, - "BLOODY" = BLOODY, // SKYRAT EDIT - Hemophage Food + "BLOODY" = BLOODY, // NOVA EDIT - Hemophage Food )) DEFINE_BITFIELD(sharpness, list( diff --git a/code/_globalvars/lists/ambience.dm b/code/_globalvars/lists/ambience.dm index 60d3dfad789..261b8133dd0 100644 --- a/code/_globalvars/lists/ambience.dm +++ b/code/_globalvars/lists/ambience.dm @@ -1,4 +1,4 @@ -/* SKYRAT EDIT REMOVAL BEGIN +/* NOVA EDIT REMOVAL BEGIN GLOBAL_LIST_INIT(generic_ambience,list( 'sound/ambience/ambigen1.ogg', 'sound/ambience/ambigen2.ogg', @@ -14,7 +14,7 @@ GLOBAL_LIST_INIT(generic_ambience,list( 'sound/ambience/ambigen13.ogg', 'sound/ambience/ambigen14.ogg', )) -*/ //SKYRAT EDIT REMOVAL END +*/ //NOVA EDIT REMOVAL END GLOBAL_LIST_INIT(holy_ambience,list( 'sound/ambience/ambicha1.ogg', @@ -111,7 +111,7 @@ GLOBAL_LIST_INIT(spooky_ambience,list( )) GLOBAL_LIST_INIT(space_ambience,list( - 'modular_skyrat/master_files/sound/ambience/starlight.ogg', //SKYRAT EDIT ADDITION + 'modular_nova/master_files/sound/ambience/starlight.ogg', //NOVA EDIT ADDITION 'sound/ambience/ambiatmos.ogg', 'sound/ambience/ambispace.ogg', 'sound/ambience/ambispace2.ogg', diff --git a/code/_globalvars/lists/cargo.dm b/code/_globalvars/lists/cargo.dm new file mode 100644 index 00000000000..5e4766fc7c3 --- /dev/null +++ b/code/_globalvars/lists/cargo.dm @@ -0,0 +1,34 @@ +GLOBAL_LIST_INIT(discountable_packs, init_discountable_packs()) + +/proc/init_discountable_packs() + var/list/packs = list() + for(var/datum/supply_pack/prototype as anything in subtypesof(/datum/supply_pack)) + var/discountable = initial(prototype.discountable) + if(discountable) + LAZYADD(packs[discountable], prototype) + return packs + +GLOBAL_LIST_INIT(pack_discount_odds, list( + SUPPLY_PACK_STD_DISCOUNTABLE = 45, + SUPPLY_PACK_UNCOMMON_DISCOUNTABLE = 4, + SUPPLY_PACK_RARE_DISCOUNTABLE = 1, +)) + +GLOBAL_LIST_EMPTY(supplypod_loading_bays) + +GLOBAL_LIST_INIT(podstyles, list(\ + list(POD_SHAPE_NORML, "pod", TRUE, "default", "yellow", RUBBLE_NORMAL, "supply pod", "A Nanotrasen supply drop pod."),\ + list(POD_SHAPE_NORML, "advpod", TRUE, "bluespace", "blue", RUBBLE_NORMAL, "bluespace supply pod" , "A Nanotrasen Bluespace supply pod. Teleports back to CentCom after delivery."),\ + list(POD_SHAPE_NORML, "advpod", TRUE, "centcom", "blue", RUBBLE_NORMAL, "\improper CentCom supply pod", "A Nanotrasen supply pod, this one has been marked with Central Command's designations. Teleports back to CentCom after delivery."),\ + list(POD_SHAPE_NORML, "darkpod", TRUE, "syndicate", "red", RUBBLE_NORMAL, "blood-red supply pod", "An intimidating supply pod, covered in the blood-red markings of the Syndicate. It's probably best to stand back from this."),\ + list(POD_SHAPE_NORML, "darkpod", TRUE, "deathsquad", "blue", RUBBLE_NORMAL, "\improper Deathsquad drop pod", "A Nanotrasen drop pod. This one has been marked the markings of Nanotrasen's elite strike team."),\ + list(POD_SHAPE_NORML, "pod", TRUE, "cultist", "red", RUBBLE_NORMAL, "bloody supply pod", "A Nanotrasen supply pod covered in scratch-marks, blood, and strange runes."),\ + list(POD_SHAPE_OTHER, "missile", FALSE, FALSE, FALSE, RUBBLE_THIN, "cruise missile", "A big ass missile that didn't seem to fully detonate. It was likely launched from some far-off deep space missile silo. There appears to be an auxillery payload hatch on the side, though manually opening it is likely impossible."),\ + list(POD_SHAPE_OTHER, "smissile", FALSE, FALSE, FALSE, RUBBLE_THIN, "\improper Syndicate cruise missile", "A big ass, blood-red missile that didn't seem to fully detonate. It was likely launched from some deep space Syndicate missile silo. There appears to be an auxillery payload hatch on the side, though manually opening it is likely impossible."),\ + list(POD_SHAPE_OTHER, "box", TRUE, FALSE, FALSE, RUBBLE_WIDE, "\improper Aussec supply crate", "An incredibly sturdy supply crate, designed to withstand orbital re-entry. Has 'Aussec Armory - 2532' engraved on the side."),\ + list(POD_SHAPE_NORML, "clownpod", TRUE, "clown", "green", RUBBLE_NORMAL, "\improper HONK pod", "A brightly-colored supply pod. It likely originated from the Clown Federation."),\ + list(POD_SHAPE_OTHER, "orange", TRUE, FALSE, FALSE, RUBBLE_NONE, "\improper Orange", "An angry orange."),\ + list(POD_SHAPE_OTHER, FALSE, FALSE, FALSE, FALSE, RUBBLE_NONE, "\improper S.T.E.A.L.T.H. pod MKVII", "A supply pod that, under normal circumstances, is completely invisible to conventional methods of detection. How are you even seeing this?"),\ + list(POD_SHAPE_OTHER, "gondola", FALSE, FALSE, FALSE, RUBBLE_NONE, "gondola", "The silent walker. This one seems to be part of a delivery agency."),\ + list(POD_SHAPE_OTHER, FALSE, FALSE, FALSE, FALSE, RUBBLE_NONE, FALSE, FALSE, "rl_click", "give_po")\ +)) diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index 5123ffaec00..1fceed44004 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -19,7 +19,7 @@ GLOBAL_LIST_EMPTY(undershirt_f) //stores only undershirt name //Socks GLOBAL_LIST_EMPTY(socks_list) //stores /datum/sprite_accessory/socks indexed by name //Lizard Bits (all datum lists indexed by name) -//SKYRAT EDIT REMOVAL - CUSTOMIZATION +//NOVA EDIT REMOVAL - CUSTOMIZATION /* GLOBAL_LIST_EMPTY(body_markings_list) GLOBAL_LIST_EMPTY(snouts_list) @@ -41,9 +41,9 @@ GLOBAL_LIST_EMPTY(moth_antennae_list) GLOBAL_LIST_EMPTY(moth_markings_list) GLOBAL_LIST_EMPTY(caps_list) */ -//SKYRAT EDIT REMOVAL END -GLOBAL_LIST_EMPTY(moth_wings_list) // SKYRAT EDIT ADDITION - Customization -GLOBAL_LIST_EMPTY(tails_list_monkey) // SKYRAT EDIT ADDITION - Customization +//NOVA EDIT REMOVAL END +GLOBAL_LIST_EMPTY(moth_wings_list) // NOVA EDIT ADDITION - Customization +GLOBAL_LIST_EMPTY(tails_list_monkey) // NOVA EDIT ADDITION - Customization GLOBAL_LIST_EMPTY(pod_hair_list) GLOBAL_LIST_INIT(color_list_ethereal, list( @@ -301,12 +301,12 @@ GLOBAL_LIST_INIT(status_display_approved_pictures, list( "lockdown", "greenalert", "bluealert", - "violetalert", // SKYRAT EDIT ADD - Alert Levels - "orangealert", // SKYRAT EDIT ADD - Alert Levels - "amberalert", // SKYRAT EDIT ADD - Alert Levels + "violetalert", // NOVA EDIT ADD - Alert Levels + "orangealert", // NOVA EDIT ADD - Alert Levels + "amberalert", // NOVA EDIT ADD - Alert Levels "redalert", "deltaalert", - "gammaalert", // SKYRAT EDIT ADD - Alert Levels + "gammaalert", // NOVA EDIT ADD - Alert Levels "radiation", "currentalert", //For automatic set of status display on current level )) diff --git a/code/_globalvars/lists/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm index 05aa4e419a2..fe4d88468df 100644 --- a/code/_globalvars/lists/maintenance_loot.dm +++ b/code/_globalvars/lists/maintenance_loot.dm @@ -256,10 +256,10 @@ GLOBAL_LIST_INIT(uncommon_loot, list(//uncommon: useful items list(//computer disks /obj/item/computer_disk/maintenance/scanner = 1, - ///obj/item/computer_disk/maintenance/camera = 1, //SKYRAT EDIT REMOVAL - Available To Crew Now + ///obj/item/computer_disk/maintenance/camera = 1, //NOVA EDIT REMOVAL - Available To Crew Now /obj/item/computer_disk/maintenance/modsuit_control = 1, /obj/item/computer_disk/maintenance/theme = 3, - ) = 3, //SKYRAT EDIT CHANGE - Original : 4 + ) = 3, //NOVA EDIT CHANGE - Original : 4 list(//modsuits /obj/effect/spawner/random/mod/maint = 3, diff --git a/code/_globalvars/lists/poll_ignore.dm b/code/_globalvars/lists/poll_ignore.dm index 9dcdf05db73..fa23263abb0 100644 --- a/code/_globalvars/lists/poll_ignore.dm +++ b/code/_globalvars/lists/poll_ignore.dm @@ -1,7 +1,7 @@ //Each lists stores ckeys for "Never for this round" option category #define POLL_IGNORE_ACADEMY_WIZARD "academy_wizard" -#define POLL_IGNORE_CORTICAL_BORER "cortical_borer" // SKYRAT EDIT - Cortical Borer +#define POLL_IGNORE_CORTICAL_BORER "cortical_borer" // NOVA EDIT - Cortical Borer #define POLL_IGNORE_ALIEN_LARVA "alien_larva" #define POLL_IGNORE_ASH_SPIRIT "ash_spirit" #define POLL_IGNORE_ASHWALKER "ashwalker" @@ -40,7 +40,7 @@ GLOBAL_LIST_INIT(poll_ignore_desc, list( POLL_IGNORE_ACADEMY_WIZARD = "Academy Wizard Defender", - POLL_IGNORE_CORTICAL_BORER = "Cortical Borer", // SKYRAT EDIT ADDITION + POLL_IGNORE_CORTICAL_BORER = "Cortical Borer", // NOVA EDIT ADDITION POLL_IGNORE_ALIEN_LARVA = "Xenomorph larva", POLL_IGNORE_ASH_SPIRIT = "Ash Spirit", POLL_IGNORE_ASHWALKER = "Ashwalker eggs", diff --git a/code/_globalvars/lists/quirks.dm b/code/_globalvars/lists/quirks.dm index 5db4f53ed71..3d15865a527 100644 --- a/code/_globalvars/lists/quirks.dm +++ b/code/_globalvars/lists/quirks.dm @@ -8,7 +8,7 @@ GLOBAL_LIST_INIT(nearsighted_glasses, list( "Thin" = /obj/item/clothing/glasses/regular/thin, "Jamjar" = /obj/item/clothing/glasses/regular/jamjar, "Binoclard" = /obj/item/clothing/glasses/regular/kim, - "Modern" = /obj/item/clothing/glasses/regular/betterunshit, // SKYRAT EDIT ADDITION + "Modern" = /obj/item/clothing/glasses/regular/betterunshit, // NOVA EDIT ADDITION )) @@ -19,3 +19,10 @@ GLOBAL_LIST_INIT(limb_choice, list( "Left Leg" = /obj/item/bodypart/leg/left/robot/surplus, "Right Leg" = /obj/item/bodypart/leg/right/robot/surplus, )) + +GLOBAL_LIST_INIT(limb_choice_transhuman, list( + "Left Arm" = /obj/item/bodypart/arm/left/robot, + "Right Arm" = /obj/item/bodypart/arm/right/robot, + "Left Leg" = /obj/item/bodypart/leg/left/robot, + "Right Leg" = /obj/item/bodypart/leg/right/robot, +)) diff --git a/code/_globalvars/lists/reagents.dm b/code/_globalvars/lists/reagents.dm index 47b1008aa8a..a2946e838da 100644 --- a/code/_globalvars/lists/reagents.dm +++ b/code/_globalvars/lists/reagents.dm @@ -35,7 +35,7 @@ GLOBAL_LIST_INIT(reagent_containers, list( CAT_PATCHES = typecacheof(list( /obj/item/reagent_containers/pill/patch/style )), - // SKYRAT EDIT ADDITION START + // NOVA EDIT ADDITION START CAT_HYPOS = list( /obj/item/reagent_containers/cup/vial/small, /obj/item/reagent_containers/cup/vial/large, @@ -43,7 +43,7 @@ GLOBAL_LIST_INIT(reagent_containers, list( CAT_DARTS = typecacheof(list( /obj/item/reagent_containers/syringe/smartdart )), - // SKYRAT EDIT ADDITION END + // NOVA EDIT ADDITION END )) /// list of all /datum/chemical_reaction datums indexed by their typepath. Use this for general lookup stuff diff --git a/code/_globalvars/tgui.dm b/code/_globalvars/tgui.dm index a81078420f5..84a5019fd75 100644 --- a/code/_globalvars/tgui.dm +++ b/code/_globalvars/tgui.dm @@ -1,4 +1,4 @@ GLOBAL_DATUM(crew_manifest_tgui, /datum/crew_manifest) GLOBAL_DATUM(changelog_tgui, /datum/changelog) GLOBAL_DATUM(hotkeys_tgui, /datum/hotkeys_help) -GLOBAL_DATUM(record_manifest_tgui, /datum/record_manifest) //SKYRAT EDIT ADDITION -- EXPLOITABLE VERB +GLOBAL_DATUM(record_manifest_tgui, /datum/record_manifest) //NOVA EDIT ADDITION -- EXPLOITABLE VERB diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index 68691895452..7d5bd3040d0 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -22,7 +22,6 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_FOOD_SILVER" = TRAIT_FOOD_SILVER, "TRAIT_KEEP_TOGETHER" = TRAIT_KEEP_TOGETHER, "TRAIT_LIGHTING_DEBUGGED" = TRAIT_LIGHTING_DEBUGGED, - "TRAIT_MAT_TRANSMUTED" = TRAIT_MAT_TRANSMUTED, "TRAIT_RECENTLY_COINED" = TRAIT_RECENTLY_COINED, "TRAIT_RUSTY" = TRAIT_RUSTY, "TRAIT_SPINNING" = TRAIT_SPINNING, @@ -180,6 +179,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_EASYBLEED" = TRAIT_EASYBLEED, "TRAIT_ECHOLOCATION_EXTRA_RANGE" = TRAIT_ECHOLOCATION_EXTRA_RANGE, "TRAIT_ECHOLOCATION_RECEIVER" = TRAIT_ECHOLOCATION_RECEIVER, + "TRAIT_ELDRITCH_PAINTING_EXAMINE" = TRAIT_ELDRITCH_PAINTING_EXAMINE, "TRAIT_ELITE_CHALLENGER" = TRAIT_ELITE_CHALLENGER, "TRAIT_EMOTEMUTE " = TRAIT_EMOTEMUTE, "TRAIT_EMOTEMUTE" = TRAIT_EMOTEMUTE, @@ -196,10 +196,12 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_FIST_MINING" = TRAIT_FIST_MINING, "TRAIT_FIXED_HAIRCOLOR" = TRAIT_FIXED_HAIRCOLOR, "TRAIT_FIXED_MUTANT_COLORS" = TRAIT_FIXED_MUTANT_COLORS, + "TRAIT_FLESH_DESIRE" = TRAIT_FLESH_DESIRE, "TRAIT_FLOORED" = TRAIT_FLOORED, "TRAIT_FORBID_MINING_SHUTTLE_CONSOLE_OUTSIDE_STATION" = TRAIT_FORBID_MINING_SHUTTLE_CONSOLE_OUTSIDE_STATION, "TRAIT_FORCED_GRAVITY" = TRAIT_FORCED_GRAVITY, "TRAIT_FORCED_STANDING" = TRAIT_FORCED_STANDING, + "TRAIT_FOV_APPLIED" = TRAIT_FOV_APPLIED, "TRAIT_FREE_FLOAT_MOVEMENT" = TRAIT_FREE_FLOAT_MOVEMENT, "TRAIT_FREE_HYPERSPACE_MOVEMENT" = TRAIT_FREE_HYPERSPACE_MOVEMENT, "TRAIT_FREE_HYPERSPACE_SOFTCORDON_MOVEMENT" = TRAIT_FREE_HYPERSPACE_SOFTCORDON_MOVEMENT, @@ -443,6 +445,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_UNOBSERVANT" = TRAIT_UNOBSERVANT, "TRAIT_UNSTABLE" = TRAIT_UNSTABLE, "TRAIT_USED_DNA_VAULT" = TRAIT_USED_DNA_VAULT, + "TRAIT_USER_SCOPED" = TRAIT_USER_SCOPED, "TRAIT_USES_SKINTONES" = TRAIT_USES_SKINTONES, "TRAIT_VATGROWN" = TRAIT_VATGROWN, "TRAIT_VENTCRAWLER_ALWAYS" = TRAIT_VENTCRAWLER_ALWAYS, @@ -524,6 +527,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_COMPONENT_MMI" = TRAIT_COMPONENT_MMI, ), /obj/item/modular_computer = list( + "TRAIT_MODPC_HALVED_DOWNLOAD_SPEED" = TRAIT_MODPC_HALVED_DOWNLOAD_SPEED, "TRAIT_PDA_CAN_EXPLODE" = TRAIT_PDA_CAN_EXPLODE, "TRAIT_PDA_MESSAGE_MENU_RIGGED" = TRAIT_PDA_MESSAGE_MENU_RIGGED, ), @@ -571,7 +575,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_TURF_IGNORE_SLOWDOWN" = TRAIT_TURF_IGNORE_SLOWDOWN, "TRAIT_ELEVATED_TURF" = TRAIT_ELEVATED_TURF, ), - // SKYRAT EDIT ADDITION START - SKYRAT TRAITS + // NOVA EDIT ADDITION START - SKYRAT TRAITS /obj/item/toy/plush/skyrat = list( "TRAIT_AFFECTION_AVERSION" = TRAIT_AFFECTION_AVERSION, "TRAIT_APHRO" = TRAIT_APHRO, @@ -645,7 +649,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_XENO_INNATE" = TRAIT_XENO_INNATE, "TRAIT_CLOTHES_DAMAGED_BY_PIERCING" = TRAIT_CLOTHES_DAMAGED_BY_PIERCING, ), - // SKYRAT EDIT ADDITION END + // NOVA EDIT ADDITION END )) /// value -> trait name, list of ALL traits that exist in the game, used for any type of accessing. diff --git a/code/_globalvars/traits/admin_tooling.dm b/code/_globalvars/traits/admin_tooling.dm index 221d6ef820d..debea57306d 100644 --- a/code/_globalvars/traits/admin_tooling.dm +++ b/code/_globalvars/traits/admin_tooling.dm @@ -275,7 +275,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( /obj/item/organ/internal/lungs = list( "TRAIT_SPACEBREATHING" = TRAIT_SPACEBREATHING, ), - // SKYRAT EDIT ADDITION START - SKYRAT TRAITS + // NOVA EDIT ADDITION START - SKYRAT TRAITS /obj/item/toy/plush/skyrat = list( "TRAIT_AFFECTION_AVERSION" = TRAIT_AFFECTION_AVERSION, "TRAIT_APHRO" = TRAIT_APHRO, @@ -349,7 +349,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_XENO_INNATE" = TRAIT_XENO_INNATE, "TRAIT_CLOTHES_DAMAGED_BY_PIERCING" = TRAIT_CLOTHES_DAMAGED_BY_PIERCING, ), - // SKYRAT EDIT ADDITION END + // NOVA EDIT ADDITION END )) /// value -> trait name, generated as needed for adminning. diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm index 3d632a99f73..7660b0c7bc3 100644 --- a/code/_onclick/ai.dm +++ b/code/_onclick/ai.dm @@ -111,7 +111,7 @@ for AI shift, ctrl, and alt clicking. */ -/mob/living/silicon/ai/CtrlShiftClickOn(atom/target) // Procs overriden in modular_skyrat/modules/Silicon_QoL +/mob/living/silicon/ai/CtrlShiftClickOn(atom/target) // Procs overriden in modular_nova/modules/Silicon_QoL target.AICtrlShiftClick(src) /mob/living/silicon/ai/ShiftClickOn(atom/target) diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 98c5c4d94a7..d898fd9f618 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -461,7 +461,7 @@ /mob/proc/ShiftMiddleClickOn(atom/A) src.pointed(A) return -//SKYRAT EDIT NOTE: CtrlShiftClick for HUMANS has been overriden in click.dm in the interaction module. +//NOVA EDIT NOTE: CtrlShiftClick for HUMANS has been overriden in click.dm in the interaction module. /atom/proc/CtrlShiftClick(mob/user) if(!can_interact(user)) return FALSE diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm index 8cc8603f552..50b341cd906 100644 --- a/code/_onclick/cyborg.dm +++ b/code/_onclick/cyborg.dm @@ -88,7 +88,7 @@ //Give cyborgs hotkey clicks without breaking existing uses of hotkey clicks // for non-doors/apcs -/mob/living/silicon/robot/CtrlShiftClickOn(atom/target) // Procs overriden in modular_skyrat/modules/Silicon_QoL +/mob/living/silicon/robot/CtrlShiftClickOn(atom/target) // Procs overriden in modular_nova/modules/Silicon_QoL target.BorgCtrlShiftClick(src) /mob/living/silicon/robot/ShiftClickOn(atom/target) @@ -197,14 +197,14 @@ /mob/living/silicon/robot/RangedAttack(atom/A) A.attack_robot(src) -/* //SKYRAT EDIT - MOVED TO modular_skyrat/master_files/code/_onclick/cyborg.dm +/* //NOVA EDIT - MOVED TO modular_nova/master_files/code/_onclick/cyborg.dm /atom/proc/attack_robot(mob/user) if (SEND_SIGNAL(src, COMSIG_ATOM_ATTACK_ROBOT, user) & COMPONENT_CANCEL_ATTACK_CHAIN) return attack_ai(user) return -*/ //SKYRAT EDIT END +*/ //NOVA EDIT END /** * What happens when the cyborg without active module holds right-click on an item. Returns a SECONDARY_ATTACK_* value. diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index 2f3df52dfd3..e73cebf14c0 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -12,7 +12,7 @@ *flicks are forwarded to master *override makes it so the alert is not replaced until cleared by a clear_alert with clear_override, and it's used for hallucinations. */ -/mob/proc/throw_alert(category, type, severity, obj/new_master, override = FALSE) +/mob/proc/throw_alert(category, type, severity, obj/new_master, override = FALSE, timeout_override, no_anim = FALSE) if(!category || QDELETED(src)) return @@ -39,7 +39,7 @@ // No need to update existing alert return thealert // Reset timeout of existing alert - var/timeout = initial(thealert.timeout) + var/timeout = timeout_override || initial(thealert.timeout) addtimer(CALLBACK(src, PROC_REF(alert_timeout), thealert, category), timeout) thealert.timeout = world.time + timeout - world.tick_lag return thealert @@ -67,9 +67,11 @@ alerts[category] = thealert if(client && hud_used) hud_used.reorganize_alerts() - thealert.transform = matrix(32, 6, MATRIX_TRANSLATE) - animate(thealert, transform = matrix(), time = 2.5, easing = CUBIC_EASING) - + if(!no_anim) + thealert.transform = matrix(32, 6, MATRIX_TRANSLATE) + animate(thealert, transform = matrix(), time = 2.5, easing = CUBIC_EASING) + if(timeout_override) + thealert.timeout = timeout_override if(thealert.timeout) addtimer(CALLBACK(src, PROC_REF(alert_timeout), thealert, category), thealert.timeout) thealert.timeout = world.time + thealert.timeout - world.tick_lag @@ -802,6 +804,155 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." ghost_owner.observer_view(target) +/atom/movable/screen/alert/poll_alert + name = "Looking for candidates" + icon_state = "template" + timeout = 30 SECONDS + ghost_screentips = TRUE + /// If true you need to call START_PROCESSING manually + var/show_time_left = FALSE + /// MA for maptext showing time left for poll + var/mutable_appearance/time_left_overlay + /// MA for overlay showing that you're signed up to poll + var/mutable_appearance/signed_up_overlay + /// MA for maptext overlay showing how many polls are stacked together + var/mutable_appearance/stacks_overlay + /// MA for maptext overlay showing how many candidates are signed up to a poll + var/mutable_appearance/candidates_num_overlay + /// MA for maptext overlay of poll's role name or question + var/mutable_appearance/role_overlay + /// If set, on Click() it'll register the player as a candidate + var/datum/candidate_poll/poll + +/atom/movable/screen/alert/poll_alert/Initialize(mapload) + . = ..() + signed_up_overlay = mutable_appearance('icons/hud/screen_gen.dmi', icon_state = "selector") + register_context() + +/atom/movable/screen/alert/poll_alert/proc/set_role_overlay() + var/role_or_only_question = poll.role || "?" + role_overlay = new + role_overlay.screen_loc = screen_loc + role_overlay.maptext = MAPTEXT("[full_capitalize(role_or_only_question)]") + role_overlay.maptext_width = 128 + role_overlay.transform = role_overlay.transform.Translate(-128, 0) + add_overlay(role_overlay) + +/atom/movable/screen/alert/poll_alert/Destroy() + QDEL_NULL(role_overlay) + QDEL_NULL(time_left_overlay) + QDEL_NULL(stacks_overlay) + QDEL_NULL(candidates_num_overlay) + QDEL_NULL(signed_up_overlay) + if(poll) + poll.alert_buttons -= src + poll = null + return ..() + +/atom/movable/screen/alert/poll_alert/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = ..() + var/left_click_text + if(poll) + if(owner in poll.signed_up) + left_click_text = "Leave" + else + left_click_text = "Enter" + context[SCREENTIP_CONTEXT_LMB] = "[left_click_text] Poll" + if(poll.ignoring_category) + var/selected_never = FALSE + if(owner.ckey in GLOB.poll_ignore[poll.ignoring_category]) + selected_never = TRUE + context[SCREENTIP_CONTEXT_ALT_LMB] = "[selected_never ? "Cancel " : ""]Never For This Round" + if(poll.jump_to_me && isobserver(owner)) + context[SCREENTIP_CONTEXT_CTRL_LMB] = "Jump To" + return CONTEXTUAL_SCREENTIP_SET + +/atom/movable/screen/alert/poll_alert/process() + if(show_time_left) + var/timeleft = timeout - world.time + if(timeleft <= 0) + return PROCESS_KILL + cut_overlay(time_left_overlay) + time_left_overlay = new + time_left_overlay.maptext = MAPTEXT("[CEILING(timeleft / (1 SECONDS), 1)]") + time_left_overlay.transform = time_left_overlay.transform.Translate(4, 19) + add_overlay(time_left_overlay) + +/atom/movable/screen/alert/poll_alert/Click(location, control, params) + . = ..() + if(!. || isnull(poll)) + return + var/list/modifiers = params2list(params) + if(LAZYACCESS(modifiers, ALT_CLICK) && poll.ignoring_category) + set_never_round() + return + if(LAZYACCESS(modifiers, CTRL_CLICK) && poll.jump_to_me) + jump_to_pic_source() + return + handle_sign_up() + +/atom/movable/screen/alert/poll_alert/proc/handle_sign_up() + if(owner in poll.signed_up) + poll.remove_candidate(owner) + else if(!(owner.ckey in GLOB.poll_ignore[poll.ignoring_category])) + poll.sign_up(owner) + update_signed_up_overlay() + +/atom/movable/screen/alert/poll_alert/proc/set_never_round() + if(!(owner.ckey in GLOB.poll_ignore[poll.ignoring_category])) + poll.do_never_for_this_round(owner) + color = "red" + update_signed_up_overlay() + return + poll.undo_never_for_this_round(owner) + color = initial(color) + +/atom/movable/screen/alert/poll_alert/proc/jump_to_pic_source() + if(!poll?.jump_to_me || !isobserver(owner)) + return + var/turf/target_turf = get_turf(poll.jump_to_me) + if(target_turf && isturf(target_turf)) + owner.abstract_move(target_turf) + +/atom/movable/screen/alert/poll_alert/Topic(href, href_list) + if(href_list["never"]) + set_never_round() + return + if(href_list["signup"]) + handle_sign_up() + if(href_list["jump"]) + jump_to_pic_source() + return + +/atom/movable/screen/alert/poll_alert/proc/update_signed_up_overlay() + if(owner in poll.signed_up) + add_overlay(signed_up_overlay) + else + cut_overlay(signed_up_overlay) + +/atom/movable/screen/alert/poll_alert/proc/update_candidates_number_overlay() + cut_overlay(candidates_num_overlay) + if(!length(poll.signed_up)) + return + candidates_num_overlay = new + candidates_num_overlay.maptext = MAPTEXT("[length(poll.signed_up)]") + candidates_num_overlay.transform = candidates_num_overlay.transform.Translate(-4, 2) + add_overlay(candidates_num_overlay) + +/atom/movable/screen/alert/poll_alert/proc/update_stacks_overlay() + cut_overlay(stacks_overlay) + var/stack_number = 1 + for(var/datum/candidate_poll/other_poll as anything in SSpolling.currently_polling) + if(other_poll != poll && other_poll.poll_key == poll.poll_key && !other_poll.finished) + stack_number++ + if(stack_number <= 1) + return + stacks_overlay = new + stacks_overlay.maptext = MAPTEXT("[stack_number]x") + stacks_overlay.transform = stacks_overlay.transform.Translate(3, 2) + stacks_overlay.layer = layer + add_overlay(stacks_overlay) + //OBJECT-BASED /atom/movable/screen/alert/buckled diff --git a/code/_onclick/hud/fullscreen.dm b/code/_onclick/hud/fullscreen.dm index 79f857e8cbe..e928a2b8b3e 100644 --- a/code/_onclick/hud/fullscreen.dm +++ b/code/_onclick/hud/fullscreen.dm @@ -223,3 +223,4 @@ icon_state = "noise" color = "#04a8d1" alpha = 80 + diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index ba5f987a473..aceb360c953 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -17,29 +17,29 @@ GLOBAL_LIST_INIT(available_ui_styles, list( "Detective" = 'icons/hud/screen_detective.dmi', )) -//SKYRAT EDIT - ADDITION - ERP ICONS FIX +//NOVA EDIT - ADDITION - ERP ICONS FIX GLOBAL_LIST_INIT(available_erp_ui_styles, list( - "Midnight" = 'modular_skyrat/modules/modular_items/lewd_items/icons/obj/lewd_items/inventory_icons/midnight.dmi', - "Retro" = 'modular_skyrat/modules/modular_items/lewd_items/icons/obj/lewd_items/inventory_icons/retro.dmi', - "Plasmafire" = 'modular_skyrat/modules/modular_items/lewd_items/icons/obj/lewd_items/inventory_icons/plasmafire.dmi', - "Slimecore" = 'modular_skyrat/modules/modular_items/lewd_items/icons/obj/lewd_items/inventory_icons/slimecore.dmi', - "Operative" = 'modular_skyrat/modules/modular_items/lewd_items/icons/obj/lewd_items/inventory_icons/operative.dmi', - "Clockwork" = 'modular_skyrat/modules/modular_items/lewd_items/icons/obj/lewd_items/inventory_icons/clockwork.dmi', - "Glass" = 'modular_skyrat/modules/modular_items/lewd_items/icons/obj/lewd_items/inventory_icons/glass.dmi' + "Midnight" = 'modular_nova/modules/modular_items/lewd_items/icons/obj/lewd_items/inventory_icons/midnight.dmi', + "Retro" = 'modular_nova/modules/modular_items/lewd_items/icons/obj/lewd_items/inventory_icons/retro.dmi', + "Plasmafire" = 'modular_nova/modules/modular_items/lewd_items/icons/obj/lewd_items/inventory_icons/plasmafire.dmi', + "Slimecore" = 'modular_nova/modules/modular_items/lewd_items/icons/obj/lewd_items/inventory_icons/slimecore.dmi', + "Operative" = 'modular_nova/modules/modular_items/lewd_items/icons/obj/lewd_items/inventory_icons/operative.dmi', + "Clockwork" = 'modular_nova/modules/modular_items/lewd_items/icons/obj/lewd_items/inventory_icons/clockwork.dmi', + "Glass" = 'modular_nova/modules/modular_items/lewd_items/icons/obj/lewd_items/inventory_icons/glass.dmi' )) -//SKYRAT EDIT - ADDITION - ERP ICONS FIX - END +//NOVA EDIT - ADDITION - ERP ICONS FIX - END /proc/ui_style2icon(ui_style) return GLOB.available_ui_styles[ui_style] || GLOB.available_ui_styles[GLOB.available_ui_styles[1]] -//SKYRAT EDIT - ADDITION - ERP ICONS FIX +//NOVA EDIT - ADDITION - ERP ICONS FIX /proc/erp_ui_style2icon(ui_style) return GLOB.available_erp_ui_styles[ui_style] || GLOB.available_erp_ui_styles[GLOB.available_erp_ui_styles[1]] -//SKYRAT EDIT - ADDITION - ERP ICONS FIX - END +//NOVA EDIT - ADDITION - ERP ICONS FIX - END /datum/hud var/mob/mymob @@ -49,7 +49,7 @@ GLOBAL_LIST_INIT(available_erp_ui_styles, list( var/inventory_shown = FALSE //Equipped item inventory var/hotkey_ui_hidden = FALSE //This is to hide the buttons that can be used via hotkeys. (hotkeybuttons list of buttons) - var/atom/movable/screen/ammo_counter //SKYRAT EDIT ADDITION + var/atom/movable/screen/ammo_counter //NOVA EDIT ADDITION var/atom/movable/screen/blobpwrdisplay @@ -120,7 +120,7 @@ GLOBAL_LIST_INIT(available_erp_ui_styles, list( var/atom/movable/screen/spacesuit // subtypes can override this to force a specific UI style var/ui_style - var/erp_ui_style //SKYRAT EDIT - ADDITION - ERP ICONS FIX + var/erp_ui_style //NOVA EDIT - ADDITION - ERP ICONS FIX // List of weakrefs to objects that we add to our screen that we don't expect to DO anything // They typically use * in their render target. They exist solely so we can reuse them, @@ -133,7 +133,7 @@ GLOBAL_LIST_INIT(available_erp_ui_styles, list( if (!ui_style) // will fall back to the default if any of these are null ui_style = ui_style2icon(owner.client?.prefs?.read_preference(/datum/preference/choiced/ui_style)) - erp_ui_style = erp_ui_style2icon(owner.client?.prefs?.read_preference(/datum/preference/choiced/ui_style)) //SKYRAT EDIT - ADDITION - ERP ICONS FIX + erp_ui_style = erp_ui_style2icon(owner.client?.prefs?.read_preference(/datum/preference/choiced/ui_style)) //NOVA EDIT - ADDITION - ERP ICONS FIX toggle_palette = new() toggle_palette.set_hud(src) @@ -269,9 +269,9 @@ GLOBAL_LIST_INIT(available_erp_ui_styles, list( alien_queen_finder = null combo_display = null - //SKYRAT EDIT START - SKYRAT HUD + //NOVA EDIT START - SKYRAT HUD wanted_lvl = null - // SKYRAT EDIT END - SKYRAT HUD + // NOVA EDIT END - SKYRAT HUD QDEL_LIST_ASSOC_VAL(master_groups) QDEL_LIST_ASSOC_VAL(plane_master_controllers) diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index 11f186e9877..410f6c07a45 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -288,8 +288,8 @@ combo_display = new /atom/movable/screen/combo(null, src) infodisplay += combo_display - ammo_counter = new /atom/movable/screen/ammo_counter(null, src) //SKYRAT EDIT ADDITION - infodisplay += ammo_counter //SKYRAT EDIT ADDITION + ammo_counter = new /atom/movable/screen/ammo_counter(null, src) //NOVA EDIT ADDITION + infodisplay += ammo_counter //NOVA EDIT ADDITION for(var/atom/movable/screen/inventory/inv in (static_inventory + toggleable_inventory)) if(inv.slot_id) diff --git a/code/_onclick/hud/new_player.dm b/code/_onclick/hud/new_player.dm index 376164235a7..86735de1127 100644 --- a/code/_onclick/hud/new_player.dm +++ b/code/_onclick/hud/new_player.dm @@ -1,4 +1,4 @@ -/* SKYRAT EDIT REMOVAL - Custom HTML Lobby Screen +/* NOVA EDIT REMOVAL - Custom HTML Lobby Screen #define SHUTTER_MOVEMENT_DURATION 0.4 SECONDS #define SHUTTER_WAIT_DURATION 0.2 SECONDS @@ -84,7 +84,7 @@ return flick("[base_icon_state]_pressed", src) update_appearance(UPDATE_ICON) - SEND_SOUND(hud.mymob, sound('modular_skyrat/master_files/sound/effects/save.ogg')) //SKYRAT EDIT ADDITION + SEND_SOUND(hud.mymob, sound('modular_nova/master_files/sound/effects/save.ogg')) //NOVA EDIT ADDITION return TRUE /atom/movable/screen/lobby/button/MouseEntered(location,control,params) @@ -184,11 +184,11 @@ return var/mob/dead/new_player/new_player = hud.mymob - // SKYRAT EDIT BEGIN + // NOVA EDIT BEGIN if(!is_admin(new_player.client) && length_char(new_player.client?.prefs?.read_preference(/datum/preference/text/flavor_text)) < FLAVOR_TEXT_CHAR_REQUIREMENT) to_chat(new_player, span_notice("You need at least [FLAVOR_TEXT_CHAR_REQUIREMENT] characters of flavor text to ready up for the round. You have [length_char(new_player.client.prefs.read_preference(/datum/preference/text/flavor_text))] characters.")) return - // SKYRAT EDIT END + // NOVA EDIT END ready = !ready if(ready) @@ -253,11 +253,11 @@ to_chat(new_player, span_notice("You have been added to the queue to join the game. Your position in queue is [SSticker.queued_players.len].")) return - // SKYRAT EDIT BEGIN + // NOVA EDIT BEGIN if(length_char(new_player.client.prefs.read_preference(/datum/preference/text/flavor_text)) <= FLAVOR_TEXT_CHAR_REQUIREMENT) to_chat(new_player, span_notice("You need at least [FLAVOR_TEXT_CHAR_REQUIREMENT] characters of flavor text to join the round. You have [length_char(new_player.client.prefs.read_preference(/datum/preference/text/flavor_text))] characters.")) return - // SKYRAT EDIT END + // NOVA EDIT END if(!LAZYACCESS(params2list(params), CTRL_CLICK)) GLOB.latejoin_menu.ui_interact(new_player) @@ -541,4 +541,4 @@ #undef SHUTTER_MOVEMENT_DURATION #undef SHUTTER_WAIT_DURATION -*/ // SKYRAT EDIT END +*/ // NOVA EDIT END diff --git a/code/_onclick/hud/radial.dm b/code/_onclick/hud/radial.dm index ba1ccbd5d47..51220c48512 100644 --- a/code/_onclick/hud/radial.dm +++ b/code/_onclick/hud/radial.dm @@ -111,7 +111,7 @@ GLOBAL_LIST_EMPTY(radial_menus) var/hudfix_method = TRUE //TRUE to change anchor to user, FALSE to shift by py_shift var/py_shift = 0 var/entry_animation = TRUE - var/icon_path = 'icons/hud/radial.dmi' //SKYRAT EDIT ADDITION - GUNPOINT + var/icon_path = 'icons/hud/radial.dmi' //NOVA EDIT ADDITION - GUNPOINT ///A replacement icon state for the generic radial slice bg icon. Doesn't affect the next page nor the center buttons var/radial_slice_icon @@ -159,7 +159,7 @@ GLOBAL_LIST_EMPTY(radial_menus) var/elements_to_add = max_elements - elements.len for(var/i in 1 to elements_to_add) //Create all elements var/atom/movable/screen/radial/slice/new_element = new /atom/movable/screen/radial/slice - new_element.icon = icon_path //SKYRAT EDIT ADDITION - GUNPOINT + new_element.icon = icon_path //NOVA EDIT ADDITION - GUNPOINT new_element.tooltips = use_tooltips new_element.set_parent(src) elements += new_element @@ -396,7 +396,7 @@ GLOBAL_LIST_EMPTY(radial_menus) /// If provided, will display an info button that will put this text in your chat var/info -/datum/radial_menu_choice/Destroy(force, ...) +/datum/radial_menu_choice/Destroy(force) . = ..() QDEL_NULL(image) diff --git a/code/_onclick/hud/rendering/plane_masters/plane_master_subtypes.dm b/code/_onclick/hud/rendering/plane_masters/plane_master_subtypes.dm index 8988b2f7f33..63206afdaa9 100644 --- a/code/_onclick/hud/rendering/plane_masters/plane_master_subtypes.dm +++ b/code/_onclick/hud/rendering/plane_masters/plane_master_subtypes.dm @@ -1,3 +1,38 @@ +/atom/movable/screen/plane_master/field_of_vision_blocker + name = "Field of vision blocker" + documentation = "This is one of those planes that's only used as a filter. It cuts out a portion of the game plate and does effects to it." + plane = FIELD_OF_VISION_BLOCKER_PLANE + appearance_flags = PLANE_MASTER|NO_CLIENT_COLOR + render_target = FIELD_OF_VISION_BLOCKER_RENDER_TARGET + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + render_relay_planes = list() + // We do NOT allow offsetting, because there's no case where you would want to block only one layer, at least currently + allows_offsetting = FALSE + // We mark as multiz_scaled FALSE so transforms don't effect us, and we draw to the planes below us as if they were us. + // This is safe because we will ALWAYS be on the top z layer, so it DON'T MATTER + multiz_scaled = FALSE + +/atom/movable/screen/plane_master/field_of_vision_blocker/show_to(mob/mymob) + . = ..() + if(!. || !mymob) + return . + RegisterSignal(mymob, SIGNAL_ADDTRAIT(TRAIT_FOV_APPLIED), PROC_REF(fov_enabled), override = TRUE) + RegisterSignal(mymob, SIGNAL_REMOVETRAIT(TRAIT_FOV_APPLIED), PROC_REF(fov_disabled), override = TRUE) + if(HAS_TRAIT(mymob, TRAIT_FOV_APPLIED)) + fov_enabled(mymob) + else + fov_disabled(mymob) + +/atom/movable/screen/plane_master/field_of_vision_blocker/proc/fov_enabled(mob/source) + SIGNAL_HANDLER + if(force_hidden == FALSE) + return + unhide_plane(source) + +/atom/movable/screen/plane_master/field_of_vision_blocker/proc/fov_disabled(mob/source) + SIGNAL_HANDLER + hide_plane(source) + /atom/movable/screen/plane_master/clickcatcher name = "Click Catcher" documentation = "Contains the screen object we use as a backdrop to catch clicks on portions of the screen that would otherwise contain nothing else. \ @@ -168,69 +203,17 @@ add_relay_to(GET_NEW_PLANE(EMISSIVE_RENDER_PLATE, offset), relay_layer = EMISSIVE_WALL_LAYER, relay_color = GLOB.em_block_color) /atom/movable/screen/plane_master/game - name = "Lower game world" - documentation = "Exists mostly because of FOV shit. Basically, if you've just got a normal not ABOVE fov thing, and you don't want it masked, stick it here yeah?" + name = "Game" + documentation = "Holds most non floor/wall things. Anything on this plane \"wants\" to interlayer depending on position." plane = GAME_PLANE render_relay_planes = list(RENDER_PLANE_GAME_WORLD) -/atom/movable/screen/plane_master/game_world_fov_hidden - name = "lower game world fov hidden" - documentation = "If you want something to be hidden by fov, stick it on this plane. We're masked by the fov blocker plane, so the items on us can actually well, disappear." - plane = GAME_PLANE_FOV_HIDDEN - render_relay_planes = list(RENDER_PLANE_GAME_WORLD) - -/atom/movable/screen/plane_master/game_world_fov_hidden/Initialize(mapload, datum/hud/hud_owner) - . = ..() - add_filter("vision_cone", 1, alpha_mask_filter(render_source = OFFSET_RENDER_TARGET(FIELD_OF_VISION_BLOCKER_RENDER_TARGET, offset), flags = MASK_INVERSE)) - -/atom/movable/screen/plane_master/field_of_vision_blocker - name = "Field of vision blocker" - documentation = "This is one of those planes that's only used as a filter. It masks out things that want to be hidden by fov.\ -
Literally just contains FOV images, or masks." - plane = FIELD_OF_VISION_BLOCKER_PLANE - appearance_flags = PLANE_MASTER|NO_CLIENT_COLOR - render_target = FIELD_OF_VISION_BLOCKER_RENDER_TARGET - mouse_opacity = MOUSE_OPACITY_TRANSPARENT - render_relay_planes = list() - // We do NOT allow offsetting, because there's no case where you would want to block only one layer, at least currently - allows_offsetting = FALSE - start_hidden = TRUE - // We mark as multiz_scaled FALSE so transforms don't effect us, and we draw to the planes below us as if they were us. - // This is safe because we will ALWAYS be on the top z layer, so it DON'T MATTER - multiz_scaled = FALSE - -/atom/movable/screen/plane_master/field_of_vision_blocker/Initialize(mapload, datum/hud/hud_owner, datum/plane_master_group/home, offset) - . = ..() - mirror_parent_hidden() - -/atom/movable/screen/plane_master/game_world_upper - name = "Upper game world" - documentation = "Ok so fov is kinda fucky, because planes in byond serve both as effect groupings and as rendering orderers. Since that's true, we need a plane that we can stick stuff that draws above fov blocked stuff on." - plane = GAME_PLANE_UPPER - render_relay_planes = list(RENDER_PLANE_GAME_WORLD) - -/atom/movable/screen/plane_master/wall_upper - name = "Upper wall" - documentation = "There are some walls that want to render above most things (mostly minerals since they shift over.\ -
We draw them to their own plane so we can hijack them for our emissive mask stuff" - plane = WALL_PLANE_UPPER - render_relay_planes = list(RENDER_PLANE_GAME_WORLD, LIGHT_MASK_PLANE) - -/atom/movable/screen/plane_master/wall_upper/Initialize(mapload, datum/hud/hud_owner, datum/plane_master_group/home, offset) - . = ..() - add_relay_to(GET_NEW_PLANE(EMISSIVE_RENDER_PLATE, offset), relay_layer = EMISSIVE_WALL_LAYER, relay_color = GLOB.em_block_color) - -/atom/movable/screen/plane_master/game_world_upper_fov_hidden - name = "Upper game world fov hidden" - documentation = "Just as we need a place to draw things \"above\" the hidden fov plane, we also need to be able to hide stuff that draws over the upper game plane." - plane = GAME_PLANE_UPPER_FOV_HIDDEN +/atom/movable/screen/plane_master/game_world_above + name = "Upper Game" + documentation = "For stuff you want to draw like the game plane, but not ever below its contents" + plane = ABOVE_GAME_PLANE render_relay_planes = list(RENDER_PLANE_GAME_WORLD) -/atom/movable/screen/plane_master/game_world_upper_fov_hidden/Initialize(mapload, datum/hud/hud_owner) - . = ..() - // Dupe of the other hidden plane - add_filter("vision_cone", 1, alpha_mask_filter(render_source = OFFSET_RENDER_TARGET(FIELD_OF_VISION_BLOCKER_RENDER_TARGET, offset), flags = MASK_INVERSE)) - /atom/movable/screen/plane_master/seethrough name = "Seethrough" documentation = "Holds the seethrough versions (done using image overrides) of large objects. Mouse transparent, so you can click through them." @@ -239,12 +222,6 @@ render_relay_planes = list(RENDER_PLANE_GAME_WORLD) start_hidden = TRUE -/atom/movable/screen/plane_master/game_world_above - name = "Above game world" - documentation = "We need a place that's unmasked by fov that also draws above the upper game world fov hidden plane. I told you fov was hacky man." - plane = ABOVE_GAME_PLANE - render_relay_planes = list(RENDER_PLANE_GAME_WORLD) - /** * Plane master that byond will by default draw to * Shouldn't be used, exists to prevent people using plane 0 diff --git a/code/_onclick/hud/rendering/render_plate.dm b/code/_onclick/hud/rendering/render_plate.dm index 02c43d34767..a4ec391c784 100644 --- a/code/_onclick/hud/rendering/render_plate.dm +++ b/code/_onclick/hud/rendering/render_plate.dm @@ -72,7 +72,8 @@ /atom/movable/screen/plane_master/rendering_plate/game_plate name = "Game rendering plate" documentation = "Holds all objects that are ahhh, in character? is maybe the best way to describe it.\ -
We apply a displacement effect from the gravity pulse plane too, so we can warp the game world." +
We apply a displacement effect from the gravity pulse plane too, so we can warp the game world.\ +
If we have fov enabled we'll relay this onto two different rendering plates to apply fov effects to only a portion. If not, we just draw straight to master" plane = RENDER_PLANE_GAME render_relay_planes = list(RENDER_PLANE_MASTER) @@ -84,6 +85,97 @@ // We're basically using alpha as better constant here btw add_filter("spook_color", 2, color_matrix_filter(list(0.75,0.13,0.13,0, 0.13,0.7,0.13,0, 0.13,0.13,0.75,0, -0.06,-0.09,-0.08,1, 0,0,0,0))) +/atom/movable/screen/plane_master/rendering_plate/game_plate/show_to(mob/mymob) + . = ..() + if(!. || !mymob) + return . + RegisterSignal(mymob, SIGNAL_ADDTRAIT(TRAIT_FOV_APPLIED), PROC_REF(fov_enabled), override = TRUE) + RegisterSignal(mymob, SIGNAL_REMOVETRAIT(TRAIT_FOV_APPLIED), PROC_REF(fov_disabled), override = TRUE) + if(HAS_TRAIT(mymob, TRAIT_FOV_APPLIED)) + fov_enabled(mymob) + else + fov_disabled(mymob) + +/atom/movable/screen/plane_master/rendering_plate/game_plate/proc/fov_enabled(mob/source) + SIGNAL_HANDLER + add_relay_to(GET_NEW_PLANE(RENDER_PLANE_GAME_UNMASKED, offset)) + add_relay_to(GET_NEW_PLANE(RENDER_PLANE_GAME_MASKED, offset)) + remove_relay_from(GET_NEW_PLANE(RENDER_PLANE_MASTER, offset)) + +/atom/movable/screen/plane_master/rendering_plate/game_plate/proc/fov_disabled(mob/source) + SIGNAL_HANDLER + remove_relay_from(GET_NEW_PLANE(RENDER_PLANE_GAME_UNMASKED, offset)) + remove_relay_from(GET_NEW_PLANE(RENDER_PLANE_GAME_MASKED, offset)) + add_relay_to(GET_NEW_PLANE(RENDER_PLANE_MASTER, offset)) + +///renders the parts of the plate unmasked by fov +/atom/movable/screen/plane_master/rendering_plate/unmasked_game_plate + name = "Unmasked Game rendering plate" + documentation = "Holds the bits of the game plate that aren't impacted by fov.\ +
We use an alpha mask to cut out the bits we plan on dealing with elsewhere" + plane = RENDER_PLANE_GAME_UNMASKED + render_relay_planes = list(RENDER_PLANE_MASTER) + +/atom/movable/screen/plane_master/rendering_plate/unmasked_game_plate/Initialize(mapload, datum/hud/hud_owner, datum/plane_master_group/home, offset) + . = ..() + add_filter("fov_handled", 1, alpha_mask_filter(render_source = OFFSET_RENDER_TARGET(FIELD_OF_VISION_BLOCKER_RENDER_TARGET, offset), flags = MASK_INVERSE)) + +/atom/movable/screen/plane_master/rendering_plate/unmasked_game_plate/show_to(mob/mymob) + . = ..() + if(!. || !mymob) + return . + RegisterSignal(mymob, SIGNAL_ADDTRAIT(TRAIT_FOV_APPLIED), PROC_REF(fov_enabled), override = TRUE) + RegisterSignal(mymob, SIGNAL_REMOVETRAIT(TRAIT_FOV_APPLIED), PROC_REF(fov_disabled), override = TRUE) + if(HAS_TRAIT(mymob, TRAIT_FOV_APPLIED)) + fov_enabled(mymob) + else + fov_disabled(mymob) + +/atom/movable/screen/plane_master/rendering_plate/unmasked_game_plate/proc/fov_enabled(mob/source) + SIGNAL_HANDLER + if(force_hidden == FALSE) + return + unhide_plane(source) + +/atom/movable/screen/plane_master/rendering_plate/unmasked_game_plate/proc/fov_disabled(mob/source) + SIGNAL_HANDLER + hide_plane(source) + +///renders the parts of the plate masked by fov +/atom/movable/screen/plane_master/rendering_plate/masked_game_plate + name = "FOV Game rendering plate" + documentation = "Contains the bits of the game plate that are hidden by some form of fov\ +
Applies a color matrix to dim and create contrast, alongside a blur. Goal is only half being able to see stuff" + plane = RENDER_PLANE_GAME_MASKED + render_relay_planes = list(RENDER_PLANE_MASTER) + +/atom/movable/screen/plane_master/rendering_plate/masked_game_plate/Initialize(mapload, datum/hud/hud_owner, datum/plane_master_group/home, offset) + . = ..() + add_filter("fov_blur", 1, gauss_blur_filter(1.8)) + add_filter("fov_handled_space", 2, alpha_mask_filter(render_source = OFFSET_RENDER_TARGET(FIELD_OF_VISION_BLOCKER_RENDER_TARGET, offset))) + add_filter("fov_matrix", 3, color_matrix_filter(list(0.5,-0.15,-0.15,0, -0.15,0.5,-0.15,0, -0.15,-0.15,0.5,0, 0,0,0,1, 0,0,0,0))) + +/atom/movable/screen/plane_master/rendering_plate/masked_game_plate/show_to(mob/mymob) + . = ..() + if(!. || !mymob) + return . + RegisterSignal(mymob, SIGNAL_ADDTRAIT(TRAIT_FOV_APPLIED), PROC_REF(fov_enabled), override = TRUE) + RegisterSignal(mymob, SIGNAL_REMOVETRAIT(TRAIT_FOV_APPLIED), PROC_REF(fov_disabled), override = TRUE) + if(HAS_TRAIT(mymob, TRAIT_FOV_APPLIED)) + fov_enabled(mymob) + else + fov_disabled(mymob) + +/atom/movable/screen/plane_master/rendering_plate/masked_game_plate/proc/fov_enabled(mob/source) + SIGNAL_HANDLER + if(force_hidden == FALSE) + return + unhide_plane(source) + +/atom/movable/screen/plane_master/rendering_plate/masked_game_plate/proc/fov_disabled(mob/source) + SIGNAL_HANDLER + hide_plane(source) + // Blackness renders weird when you view down openspace, because of transforms and borders and such // This is a consequence of not using lummy's grouped transparency, but I couldn't get that to work without totally fucking up // Sight flags, and shooting vis_contents usage to the moon. So we're doin it different. @@ -293,7 +385,6 @@ plane = RENDER_PLANE_NON_GAME render_relay_planes = list(RENDER_PLANE_MASTER) - /** * Plane master proc called in Initialize() that creates relay objects, and sets them uo as needed * Sets: diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 5053b4672f3..372a32b3c68 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -634,7 +634,7 @@ var/client/holder INITIALIZE_IMMEDIATE(/atom/movable/screen/splash) -/* SKYRAT EDIT REMOVAL +/* NOVA EDIT REMOVAL /atom/movable/screen/splash/Initialize(mapload, datum/hud/hud_owner, client/C, visible, use_previous_title) . = ..() if(!istype(C)) @@ -654,7 +654,7 @@ INITIALIZE_IMMEDIATE(/atom/movable/screen/splash) icon = SStitle.previous_icon holder.screen += src -*/ // SKYRAT EDIT END +*/ // NOVA EDIT END /atom/movable/screen/splash/proc/Fade(out, qdel_after = TRUE) if(QDELETED(src)) return diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 745d63b5b94..0e37a2f0c95 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -407,7 +407,7 @@ // rev deconversion through blunt trauma. // this can be signalized to the rev datum - if(mind && stat == CONSCIOUS && src != attacker && prob(damage_done + ((maxHealth - health) * 0.5))) // SKYRAT EDIT CHANGE - ORIGINAL : if(mind && stat == CONSCIOUS && src != attacker && prob(damage_done + ((100 - health) * 0.5))) + if(mind && stat == CONSCIOUS && src != attacker && prob(damage_done + ((maxHealth - health) * 0.5))) // NOVA EDIT CHANGE - ORIGINAL : if(mind && stat == CONSCIOUS && src != attacker && prob(damage_done + ((100 - health) * 0.5))) var/datum/antagonist/rev/rev = mind.has_antag_datum(/datum/antagonist/rev) rev?.remove_revolutionary(attacker) diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index f398a5c0343..03d6606a5f0 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -237,31 +237,6 @@ /atom/proc/attack_larva_secondary(mob/user, list/modifiers) return SECONDARY_ATTACK_CALL_NORMAL - -/* - Slimes - Nothing happening here -*/ -/mob/living/simple_animal/slime/resolve_unarmed_attack(atom/attack_target, proximity_flag, list/modifiers) - if(isturf(attack_target)) - return ..() - attack_target.attack_slime(src, modifiers) - -/mob/living/simple_animal/slime/resolve_right_click_attack(atom/target, list/modifiers) - if(isturf(target)) - return ..() - return target.attack_slime_secondary(src, modifiers) - -/atom/proc/attack_slime(mob/user, list/modifiers) - return - -/** - * Called when a slime mob right clicks an atom (that is not a turf). - * Returns a SECONDARY_ATTACK_* value. - */ -/atom/proc/attack_slime_secondary(mob/user, list/modifiers) - return SECONDARY_ATTACK_CALL_NORMAL - /* Drones */ diff --git a/code/controllers/configuration/configuration.dm b/code/controllers/configuration/configuration.dm index 10c6cc4284f..a59b386090f 100644 --- a/code/controllers/configuration/configuration.dm +++ b/code/controllers/configuration/configuration.dm @@ -104,10 +104,10 @@ if(CONFIG_GET(flag/usewhitelist)) load_whitelist() - // SKYRAT EDIT ADDITION START + // NOVA EDIT ADDITION START populate_interaction_instances() remove_erp_things() - // SKYRAT EDIT ADDITION END + // NOVA EDIT ADDITION END loaded = TRUE diff --git a/code/controllers/configuration/entries/general.dm b/code/controllers/configuration/entries/general.dm index 2c02e70fc8f..d3c86fa602e 100644 --- a/code/controllers/configuration/entries/general.dm +++ b/code/controllers/configuration/entries/general.dm @@ -115,7 +115,7 @@ /// log attack messages /datum/config_entry/flag/log_attack -/datum/config_entry/flag/log_subtler // log subtler emotes //SKYRAT EDIT ADDITION +/datum/config_entry/flag/log_subtler // log subtler emotes //NOVA EDIT ADDITION /datum/config_entry/flag/log_econ // log economy actions @@ -317,7 +317,7 @@ /datum/config_entry/string/banappeals /datum/config_entry/string/wikiurl - default = "https://wiki.skyrat13.com/index.php" //SKYRAT EDIT - Original: "http://www.tgstation13.org/wiki" + default = "https://wiki.novasector13.com/index.php" //NOVA EDIT - Original: "http://www.tgstation13.org/wiki" /datum/config_entry/string/forumurl default = "http://tgstation13.org/phpBB/index.php" diff --git a/code/controllers/globals.dm b/code/controllers/globals.dm index 365fdab921d..a3520ab1ee3 100644 --- a/code/controllers/globals.dm +++ b/code/controllers/globals.dm @@ -19,7 +19,7 @@ GLOBAL_REAL(GLOB, /datum/controller/global_vars) controller_vars["vars"] = null gvars_datum_in_built_vars = controller_vars + list(NAMEOF(src, gvars_datum_protected_varlist), NAMEOF(src, gvars_datum_in_built_vars), NAMEOF(src, gvars_datum_init_order)) -#if DM_VERSION >= 515 && DM_BUILD > 1620 +#if MIN_COMPILER_VERSION >= 515 && MIN_COMPILER_BUILD > 1620 #warn datum.vars hanging a ref should now be fixed, there should be no reason to remove the vars list from our controller's vars list anymore #endif QDEL_IN(exclude_these, 0) //signal logging isn't ready diff --git a/code/controllers/master.dm b/code/controllers/master.dm index da98580d5e0..ce660ff512b 100644 --- a/code/controllers/master.dm +++ b/code/controllers/master.dm @@ -216,7 +216,7 @@ GLOBAL_REAL(Master, /datum/controller/master) init_stage_completed = 0 var/mc_started = FALSE - add_startup_message("Initializing subsystems...") //SKYRAT EDIT CHANGE - Custom HTML Lobby Screen + add_startup_message("Initializing subsystems...") //NOVA EDIT CHANGE - Custom HTML Lobby Screen var/list/stage_sorted_subsystems = new(INITSTAGE_MAX) for (var/i in 1 to INITSTAGE_MAX) @@ -250,7 +250,7 @@ GLOBAL_REAL(Master, /datum/controller/master) SetRunLevel(1) // Intentionally not using the defines here because the MC doesn't care about them // Loop. Master.StartProcessing(0) - add_startup_message("Clearing clutter...") //SKYRAT EDIT ADDITION + add_startup_message("Clearing clutter...") //NOVA EDIT ADDITION var/time = (REALTIMEOFDAY - start_timeofday) / 10 @@ -349,12 +349,12 @@ GLOBAL_REAL(Master, /datum/controller/master) chat_warning = TRUE var/message = "[message_prefix] [seconds] second[seconds == 1 ? "" : "s"]!" - // SKYRAT EDIT REMOVAL BEGIN -- chat_message not used anymore due to change below + // NOVA EDIT REMOVAL BEGIN -- chat_message not used anymore due to change below // var/chat_message = chat_warning ? span_boldwarning(message) : span_boldannounce(message) - // SKYRAT EDIT REMOVAL END + // NOVA EDIT REMOVAL END if(result != SS_INIT_NO_MESSAGE) - add_startup_message(message, chat_warning) //SKYRAT EDIT CHANGE - ORIGINAL: to_chat(world, chat_message) + add_startup_message(message, chat_warning) //NOVA EDIT CHANGE - ORIGINAL: to_chat(world, chat_message) log_world(message) /datum/controller/master/proc/SetRunLevel(new_runlevel) diff --git a/code/controllers/subsystem/blackbox.dm b/code/controllers/subsystem/blackbox.dm index 6512ca6b97f..b4a2bfe7526 100644 --- a/code/controllers/subsystem/blackbox.dm +++ b/code/controllers/subsystem/blackbox.dm @@ -44,14 +44,14 @@ SUBSYSTEM_DEF(blackbox) return var/playercount = LAZYLEN(GLOB.player_list) var/admincount = GLOB.admins.len - var/datum/db_query/query_record_playercount = SSdbcore.NewQuery(/* SKYRAT EDIT CHANGE - MULTISERVER */{" + var/datum/db_query/query_record_playercount = SSdbcore.NewQuery(/* NOVA EDIT CHANGE - MULTISERVER */{" INSERT INTO [format_table_name("legacy_population")] (playercount, admincount, time, server_name, server_ip, server_port, round_id) VALUES (:playercount, :admincount, :time, :server_name, INET_ATON(:server_ip), :server_port, :round_id) "}, list( "playercount" = playercount, "admincount" = admincount, "time" = SQLtime(), - "server_name" = CONFIG_GET(string/serversqlname), // SKYRAT EDIT ADDITION - MULTISERVER + "server_name" = CONFIG_GET(string/serversqlname), // NOVA EDIT ADDITION - MULTISERVER "server_ip" = world.internet_address || "0", "server_port" = "[world.port]", "round_id" = GLOB.round_id, @@ -336,7 +336,7 @@ Versioning if(!SSdbcore.Connect()) return - var/datum/db_query/query_report_death = SSdbcore.NewQuery(/* SKYRAT EDIT CHANGE - MULTISERVER */{" + var/datum/db_query/query_report_death = SSdbcore.NewQuery(/* NOVA EDIT CHANGE - MULTISERVER */{" INSERT INTO [format_table_name("death")] (pod, x_coord, y_coord, z_coord, mapname, server_name, server_ip, server_port, round_id, tod, job, special, name, byondkey, laname, lakey, bruteloss, fireloss, brainloss, oxyloss, toxloss, staminaloss, last_words, suicide) VALUES (:pod, :x_coord, :y_coord, :z_coord, :map, :server_name, INET_ATON(:internet_address), :port, :round_id, :time, :job, :special, :name, :key, :laname, :lakey, :brute, :fire, :brain, :oxy, :tox, :clone, :stamina, :last_words, :suicide) "}, list( @@ -359,7 +359,7 @@ Versioning "last_words" = L.last_words, "suicide" = did_they_suicide, "map" = SSmapping.config.map_name, - "server_name" = CONFIG_GET(string/serversqlname), // SKYRAT EDIT ADDITION - MULTISERVER + "server_name" = CONFIG_GET(string/serversqlname), // NOVA EDIT ADDITION - MULTISERVER "internet_address" = world.internet_address || "0", "port" = "[world.port]", "round_id" = GLOB.round_id, diff --git a/code/controllers/subsystem/communications.dm b/code/controllers/subsystem/communications.dm index 3ad52bbf150..dfdeea26962 100644 --- a/code/controllers/subsystem/communications.dm +++ b/code/controllers/subsystem/communications.dm @@ -40,7 +40,7 @@ SUBSYSTEM_DEF(communications) if(syndicate) priority_announce(html_decode(message_data["message"]), null, 'sound/misc/announce_syndi.ogg', ANNOUNCEMENT_TYPE_SYNDICATE, has_important_message = TRUE, players = players, color_override = "red") else - priority_announce(html_decode(message_data["message"]), null, ANNOUNCER_CAPTAIN, ANNOUNCEMENT_TYPE_CAPTAIN, has_important_message = TRUE, players = players) // SKYRAT EDIT CHANGE - 'sound/misc/announce.ogg' to ANNOUNCER_CAPTAIN + priority_announce(html_decode(message_data["message"]), null, ANNOUNCER_CAPTAIN, ANNOUNCEMENT_TYPE_CAPTAIN, has_important_message = TRUE, players = players) // NOVA EDIT CHANGE - 'sound/misc/announce.ogg' to ANNOUNCER_CAPTAIN COOLDOWN_START(src, nonsilicon_message_cooldown, COMMUNICATION_COOLDOWN) user.log_talk(input, LOG_SAY, tag="priority announcement") message_admins("[ADMIN_LOOKUPFLW(user)] has made a priority announcement.") diff --git a/code/controllers/subsystem/dbcore.dm b/code/controllers/subsystem/dbcore.dm index 15484fb9cc6..56fd25f2f73 100644 --- a/code/controllers/subsystem/dbcore.dm +++ b/code/controllers/subsystem/dbcore.dm @@ -186,10 +186,10 @@ SUBSYSTEM_DEF(dbcore) UNTIL(query.process()) queries_active -= query - // SKYRAT EDIT START - SQL-based logging + // NOVA EDIT START - SQL-based logging for(var/table in queued_log_entries_by_table) MassInsert(table, rows = queued_log_entries_by_table[table], duplicate_key = FALSE, ignore_errors = FALSE, warn = FALSE, async = TRUE, special_columns = null) - // SKYRAT EDIT END + // NOVA EDIT END var/datum/db_query/query_round_shutdown = SSdbcore.NewQuery( "UPDATE [format_table_name("round")] SET shutdown_datetime = Now(), end_state = :end_state WHERE id = :round_id", @@ -303,9 +303,9 @@ SUBSYSTEM_DEF(dbcore) if(!Connect()) return - var/datum/db_query/query_round_initialize = SSdbcore.NewQuery(/* SKYRAT EDIT CHANGE - MULTISERVER */ + var/datum/db_query/query_round_initialize = SSdbcore.NewQuery(/* NOVA EDIT CHANGE - MULTISERVER */ "INSERT INTO [format_table_name("round")] (initialize_datetime, server_name, server_ip, server_port) VALUES (Now(), :server_name, INET_ATON(:internet_address), :port)", - list("server_name" = CONFIG_GET(string/serversqlname), "internet_address" = world.internet_address || "0", "port" = "[world.port]") // SKYRAT EDIT CHANGE - MULTISERVER + list("server_name" = CONFIG_GET(string/serversqlname), "internet_address" = world.internet_address || "0", "port" = "[world.port]") // NOVA EDIT CHANGE - MULTISERVER ) query_round_initialize.Execute(async = FALSE) GLOB.round_id = "[query_round_initialize.last_insert_id]" diff --git a/code/controllers/subsystem/dynamic/dynamic.dm b/code/controllers/subsystem/dynamic/dynamic.dm new file mode 100644 index 00000000000..fd6a5ecf9a5 --- /dev/null +++ b/code/controllers/subsystem/dynamic/dynamic.dm @@ -0,0 +1,1066 @@ +#define FAKE_GREENSHIFT_FORM_CHANCE 15 +#define FAKE_REPORT_CHANCE 8 +#define PULSAR_REPORT_CHANCE 8 +#define REPORT_NEG_DIVERGENCE -15 +#define REPORT_POS_DIVERGENCE 15 + +// Are HIGH_IMPACT_RULESETs allowed to stack? +GLOBAL_VAR_INIT(dynamic_no_stacking, TRUE) +// If enabled does not accept or execute any rulesets. +GLOBAL_VAR_INIT(dynamic_forced_extended, FALSE) +// How high threat is required for HIGH_IMPACT_RULESETs stacking. +// This is independent of dynamic_no_stacking. +GLOBAL_VAR_INIT(dynamic_stacking_limit, 90) +// List of forced roundstart rulesets. +GLOBAL_LIST_EMPTY(dynamic_forced_roundstart_ruleset) +// Forced threat level, setting this to zero or higher forces the roundstart threat to the value. +GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) +/// Modify the threat level for station traits before dynamic can be Initialized. List(instance = threat_reduction) +GLOBAL_LIST_EMPTY(dynamic_station_traits) +/// Rulesets which have been forcibly enabled or disabled +GLOBAL_LIST_EMPTY(dynamic_forced_rulesets) + +SUBSYSTEM_DEF(dynamic) + name = "Dynamic" + flags = SS_NO_INIT + wait = 1 SECONDS + + // Threat logging vars + /// The "threat cap", threat shouldn't normally go above this and is used in ruleset calculations + var/threat_level = 0 + + /// Set at the beginning of the round. Spent by the mode to "purchase" rules. Everything else goes in the postround budget. + var/round_start_budget = 0 + + /// Set at the beginning of the round. Spent by midrounds and latejoins. + var/mid_round_budget = 0 + + /// The initial round start budget for logging purposes, set once at the beginning of the round. + var/initial_round_start_budget = 0 + + /// Running information about the threat. Can store text or datum entries. + var/list/threat_log = list() + /// Threat log shown on the roundend report. Should only list player-made edits. + var/list/roundend_threat_log = list() + /// List of latejoin rules used for selecting the rules. + var/list/latejoin_rules + /// List of midround rules used for selecting the rules. + var/list/midround_rules + /** # Pop range per requirement. + * If the value is five the range is: + * 0-4, 5-9, 10-14, 15-19, 20-24, 25-29, 30-34, 35-39, 40-54, 45+ + * If it is six the range is: + * 0-5, 6-11, 12-17, 18-23, 24-29, 30-35, 36-41, 42-47, 48-53, 54+ + * If it is seven the range is: + * 0-6, 7-13, 14-20, 21-27, 28-34, 35-41, 42-48, 49-55, 56-62, 63+ + */ + var/pop_per_requirement = 6 + /// Number of players who were ready on roundstart. + var/roundstart_pop_ready = 0 + /// List of candidates used on roundstart rulesets. + var/list/candidates = list() + /// Rules that are processed, rule_process is called on the rules in this list. + var/list/current_rules = list() + /// List of executed rulesets. + var/list/executed_rules = list() + /// If TRUE, the next player to latejoin will guarantee roll for a random latejoin antag + /// (this does not guarantee they get said antag roll, depending on preferences and circumstances) + var/forced_injection = FALSE + /// Forced ruleset to be executed for the next latejoin. + var/datum/dynamic_ruleset/latejoin/forced_latejoin_rule = null + /// How many percent of the rounds are more peaceful. + var/peaceful_percentage = 50 + /// If a high impact ruleset was executed. Only one will run at a time in most circumstances. + var/high_impact_ruleset_executed = FALSE + /// If a only ruleset has been executed. + var/only_ruleset_executed = FALSE + /// Dynamic configuration, loaded on pre_setup + var/list/configuration = null + + /// When world.time is over this number the mode tries to inject a latejoin ruleset. + var/latejoin_injection_cooldown = 0 + + /// The minimum time the recurring latejoin ruleset timer is allowed to be. + var/latejoin_delay_min = (5 MINUTES) + + /// The maximum time the recurring latejoin ruleset timer is allowed to be. + var/latejoin_delay_max = (25 MINUTES) + + /// The low bound for the midround roll time splits. + /// This number influences where to place midround rolls, making this smaller + /// will make midround rolls more frequent, and vice versa. + /// A midround will never be able to roll before this. + var/midround_lower_bound = 10 MINUTES + + /// The upper bound for the midround roll time splits. + /// This number influences where to place midround rolls, making this larger + /// will make midround rolls less frequent, and vice versa. + /// A midround will never be able to roll farther than this. + var/midround_upper_bound = 100 MINUTES + + /// The distance between the chosen midround roll point (which is deterministic), + /// and when it can actually roll. + /// Basically, if this is set to 5 minutes, and a midround roll point is decided to be at 20 minutes, + /// then it can roll anywhere between 15 and 25 minutes. + var/midround_roll_distance = 3 MINUTES + + /// The amount of threat per midround roll. + /// 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 = 7 + + /// A number between -5 and +5. + /// A negative value will give a more peaceful round and + /// a positive value will give a round with higher threat. + var/threat_curve_centre = 0 + + /// A number between 0.5 and 4. + /// Higher value will favour extreme rounds and + /// lower value rounds closer to the average. + var/threat_curve_width = 1.8 + + /// A number between -5 and +5. + /// Equivalent to threat_curve_centre, but for the budget split. + /// A negative value will weigh towards midround rulesets, and a positive + /// value will weight towards roundstart ones. + var/roundstart_split_curve_centre = 1 + + /// A number between 0.5 and 4. + /// Equivalent to threat_curve_width, but for the budget split. + /// Higher value will favour more variance in splits and + /// lower value rounds closer to the average. + var/roundstart_split_curve_width = 1.8 + + /// The minimum amount of time for antag random events to be hijacked. + var/random_event_hijack_minimum = 10 MINUTES + + /// The maximum amount of time for antag random events to be hijacked. + var/random_event_hijack_maximum = 18 MINUTES + + /// What is the lower bound of when the roundstart annoucement is sent out? + var/waittime_l = 600 + + /// What is the higher bound of when the roundstart annoucement is sent out? + var/waittime_h = 1800 + + /// A number between 0 and 100. The maximum amount of threat allowed to generate. + var/max_threat_level = 100 + + /// The extra chance multiplier that a heavy impact midround ruleset will run next time. + /// For example, if this is set to 50, then the next heavy roll will be about 50% more likely to happen. + var/hijacked_random_event_injection_chance_modifier = 50 + + /// Any midround before this point is guaranteed to be light + var/midround_light_upper_bound = 25 MINUTES + + /// Any midround after this point is guaranteed to be heavy + var/midround_heavy_lower_bound = 55 MINUTES + + /// If there are less than this many players readied, threat level will be lowered. + /// This number should be kept fairly low, as there are other measures that population + /// impacts Dynamic, such as the requirements variable on rulesets. + var/low_pop_player_threshold = 20 + + /// 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_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_maximum_threat = 40 + + /// The chance for latejoins to roll when ready + var/latejoin_roll_chance = 50 + + // == EVERYTHING BELOW THIS POINT SHOULD NOT BE CONFIGURED == + + /// A list of recorded "snapshots" of the round, stored in the dynamic.json log + var/list/datum/dynamic_snapshot/snapshots + + /// The time when the last midround injection was attempted, whether or not it was successful + var/last_midround_injection_attempt = 0 + + /// Whether or not a random event has been hijacked this midround cycle + var/random_event_hijacked = HIJACKED_NOTHING + + /// The timer ID for the cancellable midround rule injection + var/midround_injection_timer_id + + /// The last drafted midround rulesets (without the current one included). + /// Used for choosing different midround injections. + var/list/current_midround_rulesets + + /// The amount of threat shown on the piece of paper. + /// Can differ from the actual threat amount. + var/shown_threat + + VAR_PRIVATE/next_midround_injection + +/datum/controller/subsystem/dynamic/proc/admin_panel() + var/list/dat = list("Game Mode Panel

Game Mode Panel

") + dat += "Dynamic Mode \[VV\] \[Refresh\]
" + dat += "Threat Level: [threat_level]
" + dat += "Budgets (Roundstart/Midrounds): [initial_round_start_budget]/[threat_level - initial_round_start_budget]
" + + dat += "Midround budget to spend: [mid_round_budget] \[Adjust\] \[View Log\]
" + dat += "
" + dat += "Parameters: centre = [threat_curve_centre] ; width = [threat_curve_width].
" + dat += "Split parameters: centre = [roundstart_split_curve_centre] ; width = [roundstart_split_curve_width].
" + dat += "On average, [clamp(peaceful_percentage, 1, 99)]% of the rounds are more peaceful.
" + dat += "Forced extended: [GLOB.dynamic_forced_extended ? "On" : "Off"]
" + dat += "No stacking (only one round-ender): [GLOB.dynamic_no_stacking ? "On" : "Off"]
" + dat += "Stacking limit: [GLOB.dynamic_stacking_limit] \[Adjust\]" + dat += "
" + dat += "\[Force Next Latejoin Ruleset\]
" + if (forced_latejoin_rule) + dat += {"-> [forced_latejoin_rule.name] <-
"} + dat += "\[Execute Midround Ruleset\]
" + dat += "
" + dat += "Executed rulesets: " + if (executed_rules.len > 0) + dat += "
" + for (var/datum/dynamic_ruleset/DR in executed_rules) + dat += "[DR.ruletype] - [DR.name]
" + else + dat += "none.
" + dat += "
Injection Timers: ([get_heavy_midround_injection_chance(dry_run = TRUE)]% heavy midround chance)
" + dat += "Latejoin: [DisplayTimeText(latejoin_injection_cooldown-world.time)] \[Now!\]
" + + var/next_injection = next_midround_injection() + if (next_injection == INFINITY) + dat += "All midrounds have been exhausted." + else + dat += "Midround: [DisplayTimeText(next_injection - world.time)] \[Now!\]
" + + usr << browse(dat.Join(), "window=gamemode_panel;size=500x500") + +/datum/controller/subsystem/dynamic/Topic(href, href_list) + if (..()) // Sanity, maybe ? + return + if(!check_rights(R_ADMIN)) + message_admins("[usr.key] has attempted to override the game mode panel!") + log_admin("[key_name(usr)] tried to use the game mode panel without authorization.") + return + if (href_list["forced_extended"]) + GLOB.dynamic_forced_extended = !GLOB.dynamic_forced_extended + else if (href_list["no_stacking"]) + GLOB.dynamic_no_stacking = !GLOB.dynamic_no_stacking + else if (href_list["adjustthreat"]) + var/threatadd = input("Specify how much threat to add (negative to subtract). This can inflate the threat level.", "Adjust Threat", 0) as null|num + if(!threatadd) + return + if(threatadd > 0) + create_threat(threatadd, threat_log, "[worldtime2text()]: increased by [key_name(usr)]") + else + spend_midround_budget(-threatadd, threat_log, "[worldtime2text()]: decreased by [key_name(usr)]") + else if (href_list["injectlate"]) + latejoin_injection_cooldown = 0 + forced_injection = TRUE + message_admins("[key_name(usr)] forced a latejoin injection.") + else if (href_list["injectmid"]) + forced_injection = TRUE + message_admins("[key_name(usr)] forced a midround injection.") + try_midround_roll() + else if (href_list["threatlog"]) + show_threatlog(usr) + else if (href_list["stacking_limit"]) + GLOB.dynamic_stacking_limit = input(usr,"Change the threat limit at which round-endings rulesets will start to stack.", "Change stacking limit", null) as num + else if(href_list["force_latejoin_rule"]) + var/added_rule = input(usr,"What ruleset do you want to force upon the next latejoiner? This will bypass threat level and population restrictions.", "Rigging Latejoin", null) as null|anything in sort_names(init_rulesets(/datum/dynamic_ruleset/latejoin)) + if (!added_rule) + return + forced_latejoin_rule = added_rule + log_admin("[key_name(usr)] set [added_rule] to proc on the next latejoin.") + message_admins("[key_name(usr)] set [added_rule] to proc on the next valid latejoin.") + else if(href_list["clear_forced_latejoin"]) + forced_latejoin_rule = null + log_admin("[key_name(usr)] cleared the forced latejoin ruleset.") + message_admins("[key_name(usr)] cleared the forced latejoin ruleset.") + else if(href_list["force_midround_rule"]) + var/added_rule = input(usr,"What ruleset do you want to force right now? This will bypass threat level and population restrictions.", "Execute Ruleset", null) as null|anything in sort_names(init_rulesets(/datum/dynamic_ruleset/midround)) + if (!added_rule) + return + log_admin("[key_name(usr)] executed the [added_rule] ruleset.") + message_admins("[key_name(usr)] executed the [added_rule] ruleset.") + picking_specific_rule(added_rule, TRUE) + else if(href_list["cancelmidround"]) + admin_cancel_midround(usr, href_list["cancelmidround"]) + return + else if (href_list["differentmidround"]) + admin_different_midround(usr, href_list["differentmidround"]) + return + + admin_panel() // Refreshes the window + +// Set result and news report here +/datum/controller/subsystem/dynamic/proc/set_round_result() + // If it got to this part, just pick one high impact ruleset if it exists + for(var/datum/dynamic_ruleset/rule in executed_rules) + if(rule.flags & HIGH_IMPACT_RULESET) + rule.round_result() + // One was set, so we're done here + if(SSticker.news_report) + return + + SSticker.mode_result = "undefined" + + // Something nuked the station - it wasn't nuke ops (they set their own via their rulset) + if(GLOB.station_was_nuked) + SSticker.news_report = STATION_NUKED + + if(SSsupermatter_cascade.cascade_initiated) + SSticker.news_report = SUPERMATTER_CASCADE + + // Only show this one if we have nothing better to show + if(EMERGENCY_ESCAPED_OR_ENDGAMED && !SSticker.news_report) + SSticker.news_report = SSshuttle.emergency?.is_hijacked() ? SHUTTLE_HIJACK : STATION_EVACUATED + +/datum/controller/subsystem/dynamic/proc/send_intercept() + if(SScommunications.block_command_report) //If we don't want the report to be printed just yet, we put it off until it's ready + addtimer(CALLBACK(src, PROC_REF(send_intercept)), 10 SECONDS) + return + + . = "Nanotrasen Department of Intelligence Threat Advisory, Spinward Sector, TCD [time2text(world.realtime, "DDD, MMM DD")], [CURRENT_STATION_YEAR]:
" + . += generate_advisory_level() + + var/min_threat = 100 + for(var/datum/dynamic_ruleset/ruleset as anything in init_rulesets(/datum/dynamic_ruleset)) + if(ruleset.weight <= 0 || ruleset.cost <= 0) + continue + min_threat = min(ruleset.cost, min_threat) + var/greenshift = GLOB.dynamic_forced_extended || (threat_level < min_threat && shown_threat < min_threat) //if both shown and real threat are below any ruleset, its extended time + + generate_station_goals(greenshift ? INFINITY : CONFIG_GET(number/station_goal_budget)) + + if (GLOB.station_goals.len > 0) + var/list/texts = list("
Special Orders for [station_name()]:
") + for(var/datum/station_goal/station_goal as anything in GLOB.station_goals) + station_goal.on_report() + texts += station_goal.get_report() + + . += texts.Join("
") + + var/list/trait_list_strings = list() + for(var/datum/station_trait/station_trait as anything in SSstation.station_traits) + if(!station_trait.show_in_report) + continue + trait_list_strings += "[station_trait.get_report()]
" + if(trait_list_strings.len > 0) + . += "
Identified shift divergencies:
" + trait_list_strings.Join() + + if(length(SScommunications.command_report_footnotes)) + var/footnote_pile = "" + + for(var/datum/command_footnote/footnote in SScommunications.command_report_footnotes) + footnote_pile += "[footnote.message]
" + footnote_pile += "[footnote.signature]
" + footnote_pile += "
" + + . += "
Additional Notes:

" + footnote_pile + + print_command_report(., "[command_name()] Status Summary", announce=FALSE) + if(greenshift) + priority_announce("Thanks to the tireless efforts of our security and intelligence divisions, there are currently no credible threats to [station_name()]. All station construction projects have been authorized. Have a secure shift!", "Security Report", SSstation.announcer.get_rand_report_sound(), color_override = "green") + else + if(SSsecurity_level.get_current_level_as_number() < SEC_LEVEL_BLUE) + SSsecurity_level.set_level(SEC_LEVEL_BLUE, announce = FALSE) + priority_announce("[SSsecurity_level.current_security_level.elevating_to_announcement]\n\nA summary has been copied and printed to all communications consoles.", "Security level elevated.", ANNOUNCER_INTERCEPT, color_override = SSsecurity_level.current_security_level.announcement_color) + + return . + +/// Generate the advisory level depending on the shown threat level. +/datum/controller/subsystem/dynamic/proc/generate_advisory_level() + var/advisory_string = "" + if (prob(PULSAR_REPORT_CHANCE)) + if(HAS_TRAIT(SSstation, STATION_TRAIT_BANANIUM_SHIPMENTS)) + advisory_string += "Advisory Level: Clown Planet
" + advisory_string += "Your sector's advisory level is Clown Planet! Our bike horns have picked up on a large bananium stash. Clowns show a large influx of clowns on your station. We highly advice you to slip any threats to keep Honkotrasen assets within the Banana Sector. The Department advises defending chemistry from any clowns that are trying to make baldium or space lube." + return advisory_string + + advisory_string += "Advisory Level: Pulsar Star
" + advisory_string += "Your sector's advisory level is Pulsar Star. A large unknown electromagnetic field has stormed through nearby surveillance equipment. No surveillance data has been able to be obtained showing no credible threats to Nanotrasen assets within the Spinward Sector. The Department advises maintaining high alert against potential threats, regardless of a lack of information." + return advisory_string + + switch(round(shown_threat)) + if(0) + advisory_string += "Advisory Level: White Dwarf
" + advisory_string += "Your sector's advisory level is White Dwarf. Our surveillors have ruled out any and all potential risks known in our database, ruling out the loss of our assets in the Spinward Sector. We advise a lower level of security, alongside distributing ressources on potential profit." + if(1 to 19) + var/show_core_territory = (GLOB.current_living_antags.len > 0) + if (prob(FAKE_GREENSHIFT_FORM_CHANCE)) + show_core_territory = !show_core_territory + + if (show_core_territory) + advisory_string += "Advisory Level: Blue Star
" + advisory_string += "Your sector's advisory level is Blue Star. At this threat advisory, the risk of attacks on Nanotrasen assets within the sector is minor, but cannot be ruled out entirely. Remain vigilant." + else + advisory_string += "Advisory Level: Green Star
" + advisory_string += "Your sector's advisory level is Green Star. Surveillance information shows no credible threats to Nanotrasen assets within the Spinward Sector at this time. As always, the Department advises maintaining vigilance against potential threats, regardless of a lack of known threats." + if(20 to 39) + advisory_string += "Advisory Level: Yellow Star
" + advisory_string += "Your sector's advisory level is Yellow Star. Surveillance shows a credible risk of enemy attack against our assets in the Spinward Sector. We advise a heightened level of security, alongside maintaining vigilance against potential threats." + if(40 to 65) + advisory_string += "Advisory Level: Orange Star
" + advisory_string += "Your sector's advisory level is Orange Star. Upon reviewing your sector's intelligence, the Department has determined that the risk of enemy activity is moderate to severe. At this advisory, we recommend maintaining a higher degree of security and alertness, and vigilance against threats that may (or will) arise." + if(66 to 79) + advisory_string += "Advisory Level: Red Star
" + advisory_string += "Your sector's advisory level is Red Star. The Department of Intelligence has decrypted Cybersun communications suggesting a high likelihood of attacks on Nanotrasen assets within the Spinward Sector. Stations in the region are advised to remain highly vigilant for signs of enemy activity and to be on high alert." + if(80 to 99) + advisory_string += "Advisory Level: Black Orbit
" + advisory_string += "Your sector's advisory level is Black Orbit. Your sector's local comms network is currently undergoing a blackout, and we are therefore unable to accurately judge enemy movements within the region. However, information passed to us by GDI suggests a high amount of enemy activity in the sector, indicative of an impending attack. Remain on high alert, and as always, we advise remaining vigilant against any other potential threats." + if(100) + advisory_string += "Advisory Level: Midnight Sun
" + advisory_string += "Your sector's advisory level is Midnight Sun. Credible information passed to us by GDI suggests that the Syndicate is preparing to mount a major concerted offensive on Nanotrasen assets in the Spinward Sector to cripple our foothold there. All stations should remain on high alert and prepared to defend themselves." + + return advisory_string + +/datum/controller/subsystem/dynamic/proc/show_threatlog(mob/admin) + if(!SSticker.HasRoundStarted()) + tgui_alert(usr, "The round hasn't started yet!") + return + + if(!check_rights(R_ADMIN)) + return + + var/list/out = list("Threat LogThreat Log
Starting Threat: [threat_level]
") + + for(var/entry in threat_log) + if(istext(entry)) + out += "[entry]
" + + out += "Remaining threat/threat_level: [mid_round_budget]/[threat_level]" + + usr << browse(out.Join(), "window=threatlog;size=700x500") + +/// Generates the threat level using lorentz distribution and assigns peaceful_percentage. +/datum/controller/subsystem/dynamic/proc/generate_threat() + // At lower pop levels we run a Liner Interpolation against the max threat based proportionally on the number + // of players ready. This creates a balanced lorentz curve within a smaller range than 0 to max_threat_level. + var/calculated_max_threat = (SSticker.totalPlayersReady < low_pop_player_threshold) ? LERP(low_pop_maximum_threat, max_threat_level, SSticker.totalPlayersReady / low_pop_player_threshold) : max_threat_level + log_dynamic("Calculated maximum threat level based on player count of [SSticker.totalPlayersReady]: [calculated_max_threat]") + + threat_level = lorentz_to_amount(threat_curve_centre, threat_curve_width, calculated_max_threat) + + for(var/datum/station_trait/station_trait in GLOB.dynamic_station_traits) + threat_level = max(threat_level - GLOB.dynamic_station_traits[station_trait], 0) + log_dynamic("Threat reduced by [GLOB.dynamic_station_traits[station_trait]]. Source: [type].") + + peaceful_percentage = (threat_level/max_threat_level)*100 + +/// Generates the midround and roundstart budgets +/datum/controller/subsystem/dynamic/proc/generate_budgets() + round_start_budget = lorentz_to_amount(roundstart_split_curve_centre, roundstart_split_curve_width, threat_level, 0.1) + initial_round_start_budget = round_start_budget + mid_round_budget = threat_level - round_start_budget + +/datum/controller/subsystem/dynamic/proc/setup_parameters() + log_dynamic("Dynamic mode parameters for the round:") + log_dynamic("Centre is [threat_curve_centre], Width is [threat_curve_width], Forced extended is [GLOB.dynamic_forced_extended ? "Enabled" : "Disabled"], No stacking is [GLOB.dynamic_no_stacking ? "Enabled" : "Disabled"].") + log_dynamic("Stacking limit is [GLOB.dynamic_stacking_limit].") + if(GLOB.dynamic_forced_threat_level >= 0) + threat_level = round(GLOB.dynamic_forced_threat_level, 0.1) + else + generate_threat() + generate_budgets() + set_cooldowns() + log_dynamic("Dynamic Mode initialized with a Threat Level of... [threat_level]! ([round_start_budget] round start budget)") + SSblackbox.record_feedback( + "associative", + "dynamic_threat", + 1, + list( + "server_name" = CONFIG_GET(string/serversqlname), + "forced_threat_level" = GLOB.dynamic_forced_threat_level, + "threat_level" = threat_level, + "max_threat" = (SSticker.totalPlayersReady < low_pop_player_threshold) ? LERP(low_pop_maximum_threat, max_threat_level, SSticker.totalPlayersReady / low_pop_player_threshold) : max_threat_level, + "player_count" = SSticker.totalPlayersReady, + "round_start_budget" = round_start_budget, + "parameters" = list( + "threat_curve_centre" = threat_curve_centre, + "threat_curve_width" = threat_curve_width, + "forced_extended" = GLOB.dynamic_forced_extended, + "no_stacking" = GLOB.dynamic_no_stacking, + "stacking_limit" = GLOB.dynamic_stacking_limit, + ), + ), + ) + return TRUE + +/datum/controller/subsystem/dynamic/proc/setup_shown_threat() + if (prob(FAKE_REPORT_CHANCE)) + shown_threat = rand(1, 100) + else + shown_threat = clamp(threat_level + rand(REPORT_NEG_DIVERGENCE, REPORT_POS_DIVERGENCE), 0, 100) + +/datum/controller/subsystem/dynamic/proc/set_cooldowns() + var/latejoin_injection_cooldown_middle = 0.5*(latejoin_delay_max + latejoin_delay_min) + latejoin_injection_cooldown = round(clamp(EXP_DISTRIBUTION(latejoin_injection_cooldown_middle), latejoin_delay_min, latejoin_delay_max)) + world.time + +// Called BEFORE everyone is equipped with their job +/datum/controller/subsystem/dynamic/proc/pre_setup() + if(CONFIG_GET(flag/dynamic_config_enabled)) + var/json_file = file("[global.config.directory]/dynamic.json") + if(fexists(json_file)) + configuration = json_decode(file2text(json_file)) + if(configuration["Dynamic"]) + for(var/variable in configuration["Dynamic"]) + if(!(variable in vars)) + stack_trace("Invalid dynamic configuration variable [variable] in game mode variable changes.") + continue + vars[variable] = configuration["Dynamic"][variable] + + configure_station_trait_costs() + setup_parameters() + setup_hijacking() + setup_shown_threat() + setup_rulesets() + + //We do this here instead of with the midround rulesets and such because these rules can hang refs + //To new_player and such, and we want the datums to just free when the roundstart work is done + var/list/roundstart_rules = init_rulesets(/datum/dynamic_ruleset/roundstart) + + SSjob.DivideOccupations(pure = TRUE, allow_all = TRUE) + for(var/i in GLOB.new_player_list) + var/mob/dead/new_player/player = i + if(player.ready == PLAYER_READY_TO_PLAY && player.mind && player.check_preferences()) + if(is_unassigned_job(player.mind.assigned_role)) + var/list/job_data = list() + var/job_prefs = player.client.prefs.job_preferences + for(var/job in job_prefs) + var/priority = job_prefs[job] + job_data += "[job]: [SSjob.job_priority_level_to_string(priority)]" + to_chat(player, span_danger("You were unable to qualify for any roundstart antagonist role this round because your job preferences presented a high chance of all of your selected jobs being unavailable, along with 'return to lobby if job is unavailable' enabled. Increase the number of roles set to medium or low priority to reduce the chances of this happening.")) + log_admin("[player.ckey] failed to qualify for any roundstart antagonist role because their job preferences presented a high chance of all of their selected jobs being unavailable, along with 'return to lobby if job is unavailable' enabled and has [player.client.prefs.be_special.len] antag preferences enabled. They will be unable to qualify for any roundstart antagonist role. These are their job preferences - [job_data.Join(" | ")]") + else + roundstart_pop_ready++ + candidates.Add(player) + SSjob.ResetOccupations() + log_dynamic("Listing [roundstart_rules.len] round start rulesets, and [candidates.len] players ready.") + if (candidates.len <= 0) + log_dynamic("[candidates.len] candidates.") + return TRUE + + if(GLOB.dynamic_forced_roundstart_ruleset.len > 0) + rigged_roundstart() + else + roundstart(roundstart_rules) + + log_dynamic("[round_start_budget] round start budget was left, donating it to midrounds.") + threat_log += "[worldtime2text()]: [round_start_budget] round start budget was left, donating it to midrounds." + mid_round_budget += round_start_budget + + var/starting_rulesets = "" + for (var/datum/dynamic_ruleset/roundstart/DR in executed_rules) + starting_rulesets += "[DR.name], " + log_dynamic("Picked the following roundstart rules: [starting_rulesets]") + candidates.Cut() + return TRUE + +// Called AFTER everyone is equipped with their job +/datum/controller/subsystem/dynamic/proc/post_setup(report) + for(var/datum/dynamic_ruleset/roundstart/rule in executed_rules) + rule.candidates.Cut() // The rule should not use candidates at this point as they all are null. + addtimer(CALLBACK(src, TYPE_PROC_REF(/datum/controller/subsystem/dynamic/, execute_roundstart_rule), rule), rule.delay) + + if (!CONFIG_GET(flag/no_intercept_report)) + addtimer(CALLBACK(src, PROC_REF(send_intercept)), rand(waittime_l, waittime_h)) + + addtimer(CALLBACK(src, PROC_REF(display_roundstart_logout_report)), ROUNDSTART_LOGOUT_REPORT_TIME) + //NOVA EDIT START - DIVERGENCY/GOALS REPORT + else + addtimer(CALLBACK(src, PROC_REF(send_trait_report)), rand(waittime_l, waittime_h)) + //NOVA EDIT END + + if(CONFIG_GET(flag/reopen_roundstart_suicide_roles)) + var/delay = CONFIG_GET(number/reopen_roundstart_suicide_roles_delay) + if(delay) + delay *= (1 SECONDS) + else + delay = (4 MINUTES) //default to 4 minutes if the delay isn't defined. + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(reopen_roundstart_suicide_roles)), delay) + + if(SSdbcore.Connect()) + var/list/to_set = list() + var/arguments = list() + if(GLOB.revdata.originmastercommit) + to_set += "commit_hash = :commit_hash" + arguments["commit_hash"] = GLOB.revdata.originmastercommit + if(to_set.len) + arguments["round_id"] = GLOB.round_id + var/datum/db_query/query_round_game_mode = SSdbcore.NewQuery( + "UPDATE [format_table_name("round")] SET [to_set.Join(", ")] WHERE id = :round_id", + arguments + ) + query_round_game_mode.Execute() + qdel(query_round_game_mode) + return TRUE + +/datum/controller/subsystem/dynamic/proc/display_roundstart_logout_report() + var/list/msg = list("[span_boldnotice("Roundstart logout report")]\n\n") + for(var/i in GLOB.mob_living_list) + var/mob/living/L = i + var/mob/living/carbon/C = L + if (istype(C) && !C.last_mind) + continue // never had a client + + if(L.ckey && !GLOB.directory[L.ckey]) + msg += "[L.name] ([L.key]), the [L.job] (Disconnected)\n" + + + if(L.ckey && L.client) + var/failed = FALSE + if(L.client.inactivity >= ROUNDSTART_LOGOUT_AFK_THRESHOLD) //Connected, but inactive (alt+tabbed or something) + msg += "[L.name] ([L.key]), the [L.job] (Connected, Inactive)\n" + failed = TRUE //AFK client + if(!failed && L.stat) + if(HAS_TRAIT(L, TRAIT_SUICIDED)) //Suicider + msg += "[L.name] ([L.key]), the [L.job] ([span_boldannounce("Suicide")])\n" + failed = TRUE //Disconnected client + if(!failed && (L.stat == UNCONSCIOUS || L.stat == HARD_CRIT)) + msg += "[L.name] ([L.key]), the [L.job] (Dying)\n" + failed = TRUE //Unconscious + if(!failed && L.stat == DEAD) + msg += "[L.name] ([L.key]), the [L.job] (Dead)\n" + failed = TRUE //Dead + + continue //Happy connected client + for(var/mob/dead/observer/D in GLOB.dead_mob_list) + if(D.mind && D.mind.current == L) + if(L.stat == DEAD) + if(HAS_TRAIT(L, TRAIT_SUICIDED)) //Suicider + msg += "[L.name] ([ckey(D.mind.key)]), the [L.job] ([span_boldannounce("Suicide")])\n" + continue //Disconnected client + else + msg += "[L.name] ([ckey(D.mind.key)]), the [L.job] (Dead)\n" + continue //Dead mob, ghost abandoned + else + if(D.can_reenter_corpse) + continue //Adminghost, or cult/wizard ghost + else + msg += "[L.name] ([ckey(D.mind.key)]), the [L.job] ([span_boldannounce("Ghosted")])\n" + continue //Ghosted while alive + + var/concatenated_message = msg.Join() + log_admin(concatenated_message) + to_chat(GLOB.admins, concatenated_message) + + +/// Initializes the internal ruleset variables +/datum/controller/subsystem/dynamic/proc/setup_rulesets() + midround_rules = init_rulesets(/datum/dynamic_ruleset/midround) + latejoin_rules = init_rulesets(/datum/dynamic_ruleset/latejoin) + +/// Returns a list of the provided rulesets. +/// Configures their variables to match config. +/datum/controller/subsystem/dynamic/proc/init_rulesets(ruleset_subtype) + var/list/rulesets = list() + + for (var/datum/dynamic_ruleset/ruleset_type as anything in subtypesof(ruleset_subtype)) + if (initial(ruleset_type.name) == "") + continue + + if (initial(ruleset_type.weight) == 0) + continue + + var/ruleset = new ruleset_type + configure_ruleset(ruleset) + rulesets += ruleset + + return rulesets + +/// A simple roundstart proc used when dynamic_forced_roundstart_ruleset has rules in it. +/datum/controller/subsystem/dynamic/proc/rigged_roundstart() + message_admins("[GLOB.dynamic_forced_roundstart_ruleset.len] rulesets being forced. Will now attempt to draft players for them.") + log_dynamic("[GLOB.dynamic_forced_roundstart_ruleset.len] rulesets being forced. Will now attempt to draft players for them.") + for (var/datum/dynamic_ruleset/roundstart/rule in GLOB.dynamic_forced_roundstart_ruleset) + configure_ruleset(rule) + message_admins("Drafting players for forced ruleset [rule.name].") + log_dynamic("Drafting players for forced ruleset [rule.name].") + rule.acceptable(roundstart_pop_ready, threat_level) // Assigns some vars in the modes, running it here for consistency + rule.candidates = candidates.Copy() + rule.trim_candidates() + rule.load_templates() + if (rule.ready(roundstart_pop_ready, TRUE)) + var/cost = rule.cost + var/scaled_times = 0 + if (rule.scaling_cost) + scaled_times = round(max(round_start_budget - cost, 0) / rule.scaling_cost) + cost += rule.scaling_cost * scaled_times + + spend_roundstart_budget(picking_roundstart_rule(rule, scaled_times, forced = TRUE)) + +/datum/controller/subsystem/dynamic/proc/roundstart(list/roundstart_rules) + if (GLOB.dynamic_forced_extended) + log_dynamic("Starting a round of forced extended.") + return TRUE + var/list/drafted_rules = list() + for (var/datum/dynamic_ruleset/roundstart/rule in roundstart_rules) + if (!rule.weight) + continue + if (rule.acceptable(roundstart_pop_ready, threat_level) && round_start_budget >= rule.cost) // If we got the population and threat required + rule.candidates = candidates.Copy() + rule.trim_candidates() + rule.load_templates() + if (rule.ready(roundstart_pop_ready) && rule.candidates.len > 0) + drafted_rules[rule] = rule.weight + + var/list/rulesets_picked = list() + + // Kept in case a ruleset can't be initialized for whatever reason, we want to be able to only spend what we can use. + var/round_start_budget_left = round_start_budget + + while (round_start_budget_left > 0) + var/datum/dynamic_ruleset/roundstart/ruleset = pick_weight(drafted_rules) + if (isnull(ruleset)) + log_dynamic("No more rules can be applied, stopping with [round_start_budget] left.") + break + + var/cost = (ruleset in rulesets_picked) ? ruleset.scaling_cost : ruleset.cost + if (cost == 0) + stack_trace("[ruleset] cost 0, this is going to result in an infinite loop.") + drafted_rules[ruleset] = null + continue + + if (cost > round_start_budget_left) + drafted_rules[ruleset] = null + continue + + if (check_blocking(ruleset.blocking_rules, rulesets_picked)) + drafted_rules[ruleset] = null + continue + + round_start_budget_left -= cost + + rulesets_picked[ruleset] += 1 + + if (ruleset.flags & HIGH_IMPACT_RULESET) + for (var/_other_ruleset in drafted_rules) + var/datum/dynamic_ruleset/other_ruleset = _other_ruleset + if (other_ruleset.flags & HIGH_IMPACT_RULESET) + drafted_rules[other_ruleset] = null + + if (ruleset.flags & LONE_RULESET) + drafted_rules[ruleset] = null + + for (var/ruleset in rulesets_picked) + spend_roundstart_budget(picking_roundstart_rule(ruleset, rulesets_picked[ruleset] - 1)) + + update_log() + +/// Initializes the round start ruleset provided to it. Returns how much threat to spend. +/datum/controller/subsystem/dynamic/proc/picking_roundstart_rule(datum/dynamic_ruleset/roundstart/ruleset, scaled_times = 0, forced = FALSE) + log_dynamic("Picked a ruleset: [ruleset.name], scaled [scaled_times] times") + + ruleset.trim_candidates() + var/added_threat = ruleset.scale_up(roundstart_pop_ready, scaled_times) + + if(ruleset.pre_execute(roundstart_pop_ready)) + threat_log += "[worldtime2text()]: Roundstart [ruleset.name] spent [ruleset.cost + added_threat]. [ruleset.scaling_cost ? "Scaled up [ruleset.scaled_times]/[scaled_times] times." : ""]" + if(ruleset.flags & ONLY_RULESET) + only_ruleset_executed = TRUE + if(ruleset.flags & HIGH_IMPACT_RULESET) + high_impact_ruleset_executed = TRUE + executed_rules += ruleset + return ruleset.cost + added_threat + else + stack_trace("The starting rule \"[ruleset.name]\" failed to pre_execute.") + return 0 + +/// Mainly here to facilitate delayed rulesets. All roundstart rulesets are executed with a timered callback to this proc. +/datum/controller/subsystem/dynamic/proc/execute_roundstart_rule(sent_rule) + var/datum/dynamic_ruleset/rule = sent_rule + if(rule.execute()) + if(rule.persistent) + current_rules += rule + new_snapshot(rule) + rule.forget_startup() + return TRUE + rule.clean_up() // Refund threat, delete teams and so on. + rule.forget_startup() + executed_rules -= rule + stack_trace("The starting rule \"[rule.name]\" failed to execute.") + return FALSE + +/// An experimental proc to allow admins to call rules on the fly or have rules call other rules. +/datum/controller/subsystem/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. + configure_ruleset(new_rule) // This makes sure the rule is set up properly. + else if(istype(ruletype, /datum/dynamic_ruleset)) + new_rule = ruletype + else + return FALSE + + if(!new_rule) + return FALSE + + if(!forced) + if(only_ruleset_executed) + return FALSE + // Check if a blocking ruleset has been executed. + else if(check_blocking(new_rule.blocking_rules, executed_rules)) + return FALSE + // Check if the ruleset is high impact and if a high impact ruleset has been executed + else if(new_rule.flags & HIGH_IMPACT_RULESET) + if(threat_level < GLOB.dynamic_stacking_limit && GLOB.dynamic_no_stacking) + if(high_impact_ruleset_executed) + return FALSE + + var/population = GLOB.alive_player_list.len + if((new_rule.acceptable(population, threat_level) && (ignore_cost || new_rule.cost <= mid_round_budget)) || forced) + new_rule.trim_candidates() + new_rule.load_templates() + if (new_rule.ready(forced)) + 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) + high_impact_ruleset_executed = TRUE + else if(new_rule.flags & ONLY_RULESET) + only_ruleset_executed = TRUE + log_dynamic("Making a call to a specific ruleset...[new_rule.name]!") + executed_rules += new_rule + if (new_rule.persistent) + current_rules += new_rule + new_rule.forget_startup() + return TRUE + else if (forced) + log_dynamic("The ruleset [new_rule.name] couldn't be executed due to lack of elligible players.") + new_rule.forget_startup() + return FALSE + +/datum/controller/subsystem/dynamic/fire() + for (var/datum/dynamic_ruleset/rule in current_rules) + if(rule.rule_process() == RULESET_STOP_PROCESSING) // If rule_process() returns 1 (RULESET_STOP_PROCESSING), stop processing. + current_rules -= rule + + try_midround_roll() + +/// Removes type from the list +/datum/controller/subsystem/dynamic/proc/remove_from_list(list/type_list, type) + for(var/I in type_list) + if(istype(I, type)) + type_list -= I + return type_list + +/// Checks if a type in blocking_list is in rule_list. +/datum/controller/subsystem/dynamic/proc/check_blocking(list/blocking_list, list/rule_list) + if(blocking_list.len > 0) + for(var/blocking in blocking_list) + for(var/_executed in rule_list) + var/datum/executed = _executed + if(blocking == executed.type) + log_dynamic("FAIL: check_blocking - [blocking] conflicts with [executed.type]") + return TRUE + return FALSE + +/// Handles late-join antag assignments +/datum/controller/subsystem/dynamic/proc/make_antag_chance(mob/living/carbon/human/newPlayer) + if (GLOB.dynamic_forced_extended) + return + if(EMERGENCY_ESCAPED_OR_ENDGAMED) // No more rules after the shuttle has left + return + + if (forced_latejoin_rule) + log_dynamic("Forcing specific [forced_latejoin_rule.ruletype] ruleset [forced_latejoin_rule].") + if(!handle_executing_latejoin(forced_latejoin_rule, newPlayer, forced = TRUE)) + message_admins("The forced latejoin ruleset [forced_latejoin_rule.name] couldn't be executed \ + as the most recent latejoin did not fulfill the ruleset's requirements.") + forced_latejoin_rule = null + return + + if(!forced_injection) + if(latejoin_injection_cooldown >= world.time) + return + if(!prob(latejoin_roll_chance)) + return + + var/was_forced = forced_injection + forced_injection = FALSE + var/list/possible_latejoin_rules = list() + for (var/datum/dynamic_ruleset/latejoin/rule in latejoin_rules) + if(!rule.weight) + continue + if(mid_round_budget < rule.cost) + continue + if(!rule.acceptable(GLOB.alive_player_list.len, threat_level)) + continue + possible_latejoin_rules[rule] = rule.get_weight() + + if(!length(possible_latejoin_rules)) + log_dynamic("FAIL: [newPlayer] was selected to roll for a latejoin ruleset, but there were no valid rulesets.") + return + + log_dynamic("[newPlayer] was selected to roll for a latejoin ruleset from the following list: [english_list(possible_latejoin_rules)].") + // You get one shot at becoming a latejoin antag, if it fails the next guy will try. + var/datum/dynamic_ruleset/latejoin/picked_rule = pick_ruleset(possible_latejoin_rules, max_allowed_attempts = 1) + if(isnull(picked_rule)) + log_dynamic("FAIL: No valid rulset was selected for [newPlayer]'s latejoin[was_forced ? "" : ", the next player will be checked instead"].") + return + if(was_forced) + log_dynamic("Forcing random [picked_rule.ruletype] ruleset [picked_rule].") + handle_executing_latejoin(picked_rule, newPlayer, forced = was_forced) + +/** + * This proc handles the execution of a latejoin ruleset, including removing it from latejoin rulesets if not repeatable, + * upping the injection cooldown, and starting a timer to execute the ruleset on delay. + */ +/datum/controller/subsystem/dynamic/proc/handle_executing_latejoin(datum/dynamic_ruleset/ruleset, mob/living/carbon/human/only_candidate, forced = FALSE) + ruleset.candidates = list(only_candidate) + ruleset.trim_candidates() + ruleset.load_templates() + if (!ruleset.ready(forced)) + log_dynamic("FAIL: [only_candidate] was selected to latejoin with the [ruleset] ruleset, \ + but the ruleset failed to execute[length(ruleset.candidates) ? "":" as they were not a valid candiate"].") + return FALSE + if (!ruleset.repeatable) + latejoin_rules = remove_from_list(latejoin_rules, ruleset.type) + addtimer(CALLBACK(src, PROC_REF(execute_midround_latejoin_rule), ruleset), ruleset.delay) + + if(!forced) + var/latejoin_injection_cooldown_middle = 0.5 * (latejoin_delay_max + latejoin_delay_min) + latejoin_injection_cooldown = round(clamp(EXP_DISTRIBUTION(latejoin_injection_cooldown_middle), latejoin_delay_min, latejoin_delay_max)) + world.time + log_dynamic("A latejoin rulset triggered successfully, the next latejoin injection will happen at [latejoin_injection_cooldown] round time.") + + return TRUE + +/// Apply configurations to rule. +/datum/controller/subsystem/dynamic/proc/configure_ruleset(datum/dynamic_ruleset/ruleset) + var/rule_conf = LAZYACCESSASSOC(configuration, ruleset.ruletype, ruleset.name) + for(var/variable in rule_conf) + if(!(variable in ruleset.vars)) + stack_trace("Invalid dynamic configuration variable [variable] in [ruleset.ruletype] [ruleset.name].") + continue + ruleset.vars[variable] = rule_conf[variable] + if(CONFIG_GET(flag/protect_roles_from_antagonist)) + ruleset.restricted_roles |= ruleset.protected_roles + if(CONFIG_GET(flag/protect_assistant_from_antagonist)) + ruleset.restricted_roles |= JOB_ASSISTANT + // NOVA EDIT ADDITION + for(var/datum/job/iterating_job as anything in subtypesof(/datum/job)) + if(!initial(iterating_job.antagonist_restricted)) + continue + if(initial(iterating_job.restricted_antagonists)) + var/list/restricted_antagonists = initial(iterating_job.restricted_antagonists) + if(!(ruleset.antag_flag in restricted_antagonists)) + continue + ruleset.restricted_roles |= initial(iterating_job.title) + else + ruleset.restricted_roles |= initial(iterating_job.title) + // NOVA EDIT END + +/// Get station traits and call for their config +/datum/controller/subsystem/dynamic/proc/configure_station_trait_costs() + if(!CONFIG_GET(flag/dynamic_config_enabled)) + return + for(var/datum/station_trait/station_trait as anything in GLOB.dynamic_station_traits) + configure_station_trait(station_trait) + +/// Apply configuration for station trait costs +/datum/controller/subsystem/dynamic/proc/configure_station_trait(datum/station_trait/station_trait) + var/list/station_trait_config = LAZYACCESSASSOC(configuration, "Station", station_trait.dynamic_threat_id) + var/cost = station_trait_config["cost"] + + if(isnull(cost)) //0 is valid so check for null specifically + return + + if(cost != GLOB.dynamic_station_traits[station_trait]) + log_dynamic("Config set [station_trait.dynamic_threat_id] cost from [station_trait.threat_reduction] to [cost]") + + GLOB.dynamic_station_traits[station_trait] = cost + +/// Refund threat, but no more than threat_level. +/datum/controller/subsystem/dynamic/proc/refund_threat(regain) + mid_round_budget = min(threat_level, mid_round_budget + regain) + +/// Generate threat and increase the threat_level if it goes beyond, capped at 100 +/datum/controller/subsystem/dynamic/proc/create_threat(gain, list/threat_log, reason) + mid_round_budget = min(100, mid_round_budget + gain) + if(mid_round_budget > threat_level) + threat_level = mid_round_budget + for(var/list/logs in threat_log) + log_threat(gain, logs, reason) + +/datum/controller/subsystem/dynamic/proc/log_threat(threat_change, list/threat_log, reason) + var/gain_or_loss = "+" + if(threat_change < 0) + gain_or_loss = "-" + threat_log += "Threat [gain_or_loss][abs(threat_change)] - [reason]." + +/// Expend round start threat, can't fall under 0. +/datum/controller/subsystem/dynamic/proc/spend_roundstart_budget(cost, list/threat_log, reason) + round_start_budget = max(round_start_budget - cost,0) + if (!isnull(threat_log)) + log_threat(-cost, threat_log, reason) + +/// Expend midround threat, can't fall under 0. +/datum/controller/subsystem/dynamic/proc/spend_midround_budget(cost, list/threat_log, reason) + mid_round_budget = max(mid_round_budget - cost,0) + if (!isnull(threat_log)) + log_threat(-cost, threat_log, reason) + +#define MAXIMUM_DYN_DISTANCE 5 + +/** + * Returns the comulative distribution of threat centre and width, and a random location of -0.5 to 0.5 + * plus or minus the otherwise unattainable lower and upper percentiles. All multiplied by the maximum + * threat and then rounded to the nearest interval. + * rand() calls without arguments returns a value between 0 and 1, allowing for smaller intervals. + */ +/datum/controller/subsystem/dynamic/proc/lorentz_to_amount(centre = 0, scale = 1.8, max_threat = 100, interval = 1) + var/location = RANDOM_DECIMAL(-MAXIMUM_DYN_DISTANCE, MAXIMUM_DYN_DISTANCE) * rand() + var/lorentz_result = LORENTZ_CUMULATIVE_DISTRIBUTION(centre, location, scale) + var/std_threat = lorentz_result * max_threat + ///Without these, the amount won't come close to hitting 0% or 100% of the max threat. + var/lower_deviation = max(std_threat * (location-centre)/MAXIMUM_DYN_DISTANCE, 0) + var/upper_deviation = max((max_threat - std_threat) * (centre-location)/MAXIMUM_DYN_DISTANCE, 0) + return clamp(round(std_threat + upper_deviation - lower_deviation, interval), 0, 100) + +/proc/reopen_roundstart_suicide_roles() + var/include_command = CONFIG_GET(flag/reopen_roundstart_suicide_roles_command_positions) + var/list/reopened_jobs = list() + + for(var/mob/living/quitter in GLOB.suicided_mob_list) + var/datum/job/job = SSjob.GetJob(quitter.job) + if(!job || !(job.job_flags & JOB_REOPEN_ON_ROUNDSTART_LOSS)) + continue + if(!include_command && job.departments_bitflags & DEPARTMENT_BITFLAG_COMMAND) + continue + job.current_positions = max(job.current_positions - 1, 0) + reopened_jobs += quitter.job + + if(CONFIG_GET(flag/reopen_roundstart_suicide_roles_command_report)) + if(reopened_jobs.len) + var/reopened_job_report_positions + for(var/dead_dudes_job in reopened_jobs) + reopened_job_report_positions = "[reopened_job_report_positions ? "[reopened_job_report_positions]\n":""][dead_dudes_job]" + + var/suicide_command_report = {" + [command_name()] Human Resources Board
+ Notice of Personnel Change

+ To personnel management staff aboard [station_name()]:

+ Our medical staff have detected a series of anomalies in the vital sensors + of some of the staff aboard your station.

+ Further investigation into the situation on our end resulted in us discovering + a series of rather... unforturnate decisions that were made on the part of said staff.

+ As such, we have taken the liberty to automatically reopen employment opportunities for the positions of the crew members + who have decided not to partake in our research. We will be forwarding their cases to our employment review board + to determine their eligibility for continued service with the company (and of course the + continued storage of cloning records within the central medical backup server.)

+ The following positions have been reopened on our behalf:

+ [reopened_job_report_positions]
+ "} + + print_command_report(suicide_command_report, "Central Command Personnel Update") + + +#undef MAXIMUM_DYN_DISTANCE + +#undef FAKE_REPORT_CHANCE +#undef FAKE_GREENSHIFT_FORM_CHANCE +#undef PULSAR_REPORT_CHANCE +#undef REPORT_NEG_DIVERGENCE +#undef REPORT_POS_DIVERGENCE diff --git a/code/game/gamemodes/dynamic/dynamic_hijacking.dm b/code/controllers/subsystem/dynamic/dynamic_hijacking.dm similarity index 86% rename from code/game/gamemodes/dynamic/dynamic_hijacking.dm rename to code/controllers/subsystem/dynamic/dynamic_hijacking.dm index 62c9a5d2124..7577cbcd84f 100644 --- a/code/game/gamemodes/dynamic/dynamic_hijacking.dm +++ b/code/controllers/subsystem/dynamic/dynamic_hijacking.dm @@ -1,7 +1,7 @@ -/datum/game_mode/dynamic/proc/setup_hijacking() +/datum/controller/subsystem/dynamic/proc/setup_hijacking() RegisterSignal(SSdcs, COMSIG_GLOB_PRE_RANDOM_EVENT, PROC_REF(on_pre_random_event)) -/datum/game_mode/dynamic/proc/on_pre_random_event(datum/source, datum/round_event_control/round_event_control) +/datum/controller/subsystem/dynamic/proc/on_pre_random_event(datum/source, datum/round_event_control/round_event_control) SIGNAL_HANDLER if (!round_event_control.dynamic_should_hijack) return diff --git a/code/game/gamemodes/dynamic/dynamic_logging.dm b/code/controllers/subsystem/dynamic/dynamic_logging.dm similarity index 95% rename from code/game/gamemodes/dynamic/dynamic_logging.dm rename to code/controllers/subsystem/dynamic/dynamic_logging.dm index 7490894b526..16bd56a7303 100644 --- a/code/game/gamemodes/dynamic/dynamic_logging.dm +++ b/code/controllers/subsystem/dynamic/dynamic_logging.dm @@ -69,7 +69,7 @@ return serialization /// Updates the log for the current snapshots. -/datum/game_mode/dynamic/proc/update_log() +/datum/controller/subsystem/dynamic/proc/update_log() var/list/serialized = list() serialized["threat_level"] = threat_level serialized["round_start_budget"] = initial_round_start_budget @@ -84,7 +84,7 @@ rustg_file_write(json_encode(serialized), "[GLOB.log_directory]/dynamic.json") /// Creates a new snapshot with the given rulesets chosen, and writes to the JSON output. -/datum/game_mode/dynamic/proc/new_snapshot(datum/dynamic_ruleset/ruleset_chosen) +/datum/controller/subsystem/dynamic/proc/new_snapshot(datum/dynamic_ruleset/ruleset_chosen) var/datum/dynamic_snapshot/new_snapshot = new new_snapshot.remaining_threat = mid_round_budget diff --git a/code/game/gamemodes/dynamic/dynamic_midround_rolling.dm b/code/controllers/subsystem/dynamic/dynamic_midround_rolling.dm similarity index 95% rename from code/game/gamemodes/dynamic/dynamic_midround_rolling.dm rename to code/controllers/subsystem/dynamic/dynamic_midround_rolling.dm index c3e295ae875..968037b9fa2 100644 --- a/code/game/gamemodes/dynamic/dynamic_midround_rolling.dm +++ b/code/controllers/subsystem/dynamic/dynamic_midround_rolling.dm @@ -1,7 +1,7 @@ /// Returns the world.time of the next midround injection. /// Will return a cached result from `next_midround_injection`, the variable. /// If that variable is null, will generate a new one. -/datum/game_mode/dynamic/proc/next_midround_injection() +/datum/controller/subsystem/dynamic/proc/next_midround_injection() if (!isnull(next_midround_injection)) return next_midround_injection @@ -16,7 +16,7 @@ return last_midround_injection_attempt + distance -/datum/game_mode/dynamic/proc/try_midround_roll() +/datum/controller/subsystem/dynamic/proc/try_midround_roll() if (!forced_injection && next_midround_injection() > world.time) return @@ -90,7 +90,7 @@ log_dynamic_and_announce("No midround rulesets could be drafted. ([heavy_light_log_count])") /// Gets the chance for a heavy ruleset midround injection, the dry_run argument is only used for forced injection. -/datum/game_mode/dynamic/proc/get_heavy_midround_injection_chance(dry_run) +/datum/controller/subsystem/dynamic/proc/get_heavy_midround_injection_chance(dry_run) var/chance_modifier = 1 var/next_midround_roll = next_midround_injection() - SSticker.round_start_time diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets.dm b/code/controllers/subsystem/dynamic/dynamic_rulesets.dm similarity index 92% rename from code/game/gamemodes/dynamic/dynamic_rulesets.dm rename to code/controllers/subsystem/dynamic/dynamic_rulesets.dm index 0af18e0b0aa..f05ae48fe1e 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets.dm +++ b/code/controllers/subsystem/dynamic/dynamic_rulesets.dm @@ -7,7 +7,7 @@ var/ruletype = "" /// If set to TRUE, the rule won't be discarded after being executed, and dynamic will call rule_process() every time it ticks. var/persistent = FALSE - /// If set to TRUE, dynamic mode will be able to draft this ruleset again later on. (doesn't apply for roundstart rules) + /// If set to TRUE, dynamic will be able to draft this ruleset again later on. (doesn't apply for roundstart rules) var/repeatable = FALSE /// If set higher than 0 decreases weight by itself causing the ruleset to appear less often the more it is repeated. var/repeatable_weight_decrease = 2 @@ -41,7 +41,7 @@ var/required_candidates = 0 /// 0 -> 9, probability for this rule to be picked against other rules. If zero this will effectively disable the rule. var/weight = 5 - /// Threat cost for this rule, this is decreased from the mode's threat when the rule is executed. + /// Threat cost for this rule, this is decreased from the threat level when the rule is executed. var/cost = 0 /// Cost per level the rule scales up. var/scaling_cost = 0 @@ -51,13 +51,11 @@ var/total_cost = 0 /// A flag that determines how the ruleset is handled. Check __DEFINES/dynamic.dm for an explanation of the accepted values. var/flags = NONE - /// Pop range per requirement. If zero defaults to mode's pop_per_requirement. + /// Pop range per requirement. If zero defaults to dynamic's pop_per_requirement. var/pop_per_requirement = 0 /// Requirements are the threat level requirements per pop range. /// With the default values, The rule will never get drafted below 10 threat level (aka: "peaceful extended"), and it requires a higher threat level at lower pops. var/list/requirements = list(40,30,20,10,10,10,10,10,10,10) - /// Reference to the mode, use this instead of SSticker.mode. - var/datum/game_mode/dynamic/mode = null /// If a role is to be considered another for the purpose of banning. var/antag_flag_override = null /// If set, will check this preference instead of antag_flag. @@ -92,8 +90,6 @@ // side effects here. Dynamic rulesets should be stateless anyway. SHOULD_NOT_OVERRIDE(TRUE) - mode = SSticker.mode - ..() /datum/dynamic_ruleset/roundstart // One or more of those drafted at roundstart @@ -135,7 +131,7 @@ /// Sets the current threat indices and returns true if we're inside of them /datum/dynamic_ruleset/proc/is_valid_threat(population, threat_level) - pop_per_requirement = pop_per_requirement > 0 ? pop_per_requirement : mode.pop_per_requirement + pop_per_requirement = pop_per_requirement > 0 ? pop_per_requirement : SSdynamic.pop_per_requirement indice_pop = min(requirements.len,round(population/pop_per_requirement)+1) return threat_level >= requirements[indice_pop] @@ -148,14 +144,14 @@ return 0 var/antag_fraction = 0 - for(var/_ruleset in (mode.executed_rules + list(src))) // we care about the antags we *will* assign, too + for(var/_ruleset in (SSdynamic.executed_rules + list(src))) // we care about the antags we *will* assign, too var/datum/dynamic_ruleset/ruleset = _ruleset - antag_fraction += ((1 + ruleset.scaled_times) * ruleset.get_antag_cap(population)) / mode.roundstart_pop_ready + antag_fraction += ((1 + ruleset.scaled_times) * ruleset.get_antag_cap(population)) / SSdynamic.roundstart_pop_ready for(var/i in 1 to max_scale) if(antag_fraction < 0.25) scaled_times += 1 - antag_fraction += get_antag_cap(population) / mode.roundstart_pop_ready // we added new antags, gotta update the % + antag_fraction += get_antag_cap(population) / SSdynamic.roundstart_pop_ready // we added new antags, gotta update the % return scaled_times * scaling_cost @@ -170,7 +166,7 @@ /datum/dynamic_ruleset/proc/rule_process() return -/// Called on game mode pre_setup for roundstart rulesets. +/// Called on pre_setup for roundstart rulesets. /// Do everything you need to do before job is assigned here. /// IMPORTANT: ASSIGN special_role HERE /datum/dynamic_ruleset/proc/pre_execute() @@ -206,15 +202,15 @@ /// Runs from gamemode process() if ruleset fails to start, like delayed rulesets not getting valid candidates. /// This one only handles refunding the threat, override in ruleset to clean up the rest. /datum/dynamic_ruleset/proc/clean_up() - mode.refund_threat(cost + (scaled_times * scaling_cost)) - mode.threat_log += "[worldtime2text()]: [ruletype] [name] refunded [cost + (scaled_times * scaling_cost)]. Failed to execute." + SSdynamic.refund_threat(cost + (scaled_times * scaling_cost)) + SSdynamic.threat_log += "[worldtime2text()]: [ruletype] [name] refunded [cost + (scaled_times * scaling_cost)]. Failed to execute." /// Gets weight of the ruleset /// Note that this decreases weight if repeatable is TRUE and repeatable_weight_decrease is higher than 0 /// Note: If you don't want repeatable rulesets to decrease their weight use the weight variable directly /datum/dynamic_ruleset/proc/get_weight() if(repeatable && weight > 1 && repeatable_weight_decrease > 0) - for(var/datum/dynamic_ruleset/DR in mode.executed_rules) + for(var/datum/dynamic_ruleset/DR in SSdynamic.executed_rules) if(istype(DR, type)) weight = max(weight-repeatable_weight_decrease,1) return weight @@ -233,7 +229,7 @@ /datum/dynamic_ruleset/proc/trim_candidates() return -/// Set mode result and news report here. +/// Set mode_result and news report here. /// Only called if ruleset is flagged as HIGH_IMPACT_RULESET /datum/dynamic_ruleset/proc/round_result() @@ -251,7 +247,7 @@ candidates.Remove(candidate_player) continue - //SKYRAT EDIT ADDITION + //NOVA EDIT ADDITION if(!candidate_client.prefs?.read_preference(/datum/preference/toggle/be_antag)) candidates.Remove(candidate_player) continue @@ -259,7 +255,7 @@ if(is_banned_from(candidate_client.ckey, BAN_ANTAGONIST)) candidates.Remove(candidate_player) continue - //SKYRAT EDIT END + //NOVA EDIT END if(candidate_client.get_remaining_days(minimum_required_age) > 0) candidates.Remove(candidate_player) diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm b/code/controllers/subsystem/dynamic/dynamic_rulesets_latejoin.dm similarity index 98% rename from code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm rename to code/controllers/subsystem/dynamic/dynamic_rulesets_latejoin.dm index 1d676ea2667..24347783847 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm +++ b/code/controllers/subsystem/dynamic/dynamic_rulesets_latejoin.dm @@ -16,14 +16,14 @@ candidates.Remove(P) else if (!((antag_preference || antag_flag) in P.client.prefs.be_special) || is_banned_from(P.ckey, list(antag_flag_override || antag_flag, ROLE_SYNDICATE))) candidates.Remove(P) - // SKYRAT EDIT ADDITION - PROTECTED JOBS + // NOVA EDIT ADDITION - PROTECTED JOBS else if(P.client?.prefs && !P.client.prefs.read_preference(/datum/preference/toggle/be_antag)) candidates.Remove(P) continue else if(is_banned_from(P.client?.ckey, BAN_ANTAGONIST)) candidates.Remove(P) continue - // SKYRAT EDIT END + // NOVA EDIT END /datum/dynamic_ruleset/latejoin/ready(forced = 0) if (forced) @@ -37,7 +37,7 @@ if (M.mind && (M.mind.assigned_role.title in enemy_roles) && (!(M in candidates) || (M.mind.assigned_role.title in restricted_roles))) job_check++ // Checking for "enemies" (such as sec officers). To be counters, they must either not be candidates to that rule, or have a job that restricts them from it - var/threat = round(mode.threat_level/10) + var/threat = round(SSdynamic.threat_level/10) var/ruleset_forced = (GLOB.dynamic_forced_rulesets[type] || RULESET_NOT_FORCED) == RULESET_FORCE_ENABLED if (!ruleset_forced && job_check < required_enemies[threat]) log_dynamic("FAIL: [src] is not ready, because there are not enough enemies: [required_enemies[threat]] needed, [job_check] found") diff --git a/code/controllers/subsystem/dynamic/dynamic_rulesets_midround.dm b/code/controllers/subsystem/dynamic/dynamic_rulesets_midround.dm new file mode 100644 index 00000000000..9890f4c0425 --- /dev/null +++ b/code/controllers/subsystem/dynamic/dynamic_rulesets_midround.dm @@ -0,0 +1,947 @@ +/// Probability the AI going malf will be accompanied by an ion storm announcement and some ion laws. +#define MALF_ION_PROB 33 +/// The probability to replace an existing law with an ion law instead of adding a new ion law. +#define REPLACE_LAW_WITH_ION_PROB 10 + +/// Midround Rulesets +/datum/dynamic_ruleset/midround // Can be drafted once in a while during a round + ruletype = MIDROUND_RULESET + var/midround_ruleset_style + /// If the ruleset should be restricted from ghost roles. + var/restrict_ghost_roles = TRUE + /// What mob type the ruleset is restricted to. + var/required_type = /mob/living/carbon/human + var/list/living_players = list() + var/list/living_antags = list() + var/list/dead_players = list() + var/list/list_observers = list() + + /// The minimum round time before this ruleset will show up + var/minimum_round_time = 0 + /// Abstract root value + var/abstract_type = /datum/dynamic_ruleset/midround + +/datum/dynamic_ruleset/midround/forget_startup() + living_players = list() + living_antags = list() + dead_players = list() + list_observers = list() + return ..() + +/datum/dynamic_ruleset/midround/from_ghosts + weight = 0 + required_type = /mob/dead/observer + abstract_type = /datum/dynamic_ruleset/midround/from_ghosts + /// Whether the ruleset should call generate_ruleset_body or not. + var/makeBody = TRUE + /// The rule needs this many applicants to be properly executed. + var/required_applicants = 1 + +/datum/dynamic_ruleset/midround/from_ghosts/check_candidates() + var/dead_count = dead_players.len + list_observers.len + if (required_candidates <= dead_count) + return TRUE + + log_dynamic("FAIL: [src], a from_ghosts ruleset, did not have enough dead candidates: [required_candidates] needed, [dead_count] found") + + return FALSE + +/datum/dynamic_ruleset/midround/trim_candidates() + living_players = trim_list(GLOB.alive_player_list) + living_antags = trim_list(GLOB.current_living_antags) + dead_players = trim_list(GLOB.dead_player_list) + list_observers = trim_list(GLOB.current_observers_list) + +/datum/dynamic_ruleset/midround/proc/trim_list(list/to_trim = list()) + var/list/trimmed_list = to_trim.Copy() + for(var/mob/creature in trimmed_list) + if (!istype(creature, required_type)) + trimmed_list.Remove(creature) + continue + if (isnull(creature.client)) // Are they connected? + trimmed_list.Remove(creature) + continue + //NOVA EDIT ADDITION + if(is_banned_from(creature.client.ckey, BAN_ANTAGONIST)) + trimmed_list.Remove(creature) + continue + if(!creature.client?.prefs?.read_preference(/datum/preference/toggle/be_antag)) + trimmed_list.Remove(creature) + continue + //NOVA EDIT END + if(creature.client.get_remaining_days(minimum_required_age) > 0) + trimmed_list.Remove(creature) + continue + if (!((antag_preference || antag_flag) in creature.client.prefs.be_special)) + trimmed_list.Remove(creature) + continue + if (is_banned_from(creature.ckey, list(antag_flag_override || antag_flag, ROLE_SYNDICATE))) + trimmed_list.Remove(creature) + continue + + if (isnull(creature.mind)) + continue + + if (restrict_ghost_roles && (creature.mind.assigned_role.title in GLOB.exp_specialmap[EXP_TYPE_SPECIAL])) // Are they playing a ghost role? + trimmed_list.Remove(creature) + continue + if (creature.mind.assigned_role.title in restricted_roles) // Does their job allow it? + trimmed_list.Remove(creature) + continue + if (length(exclusive_roles) && !(creature.mind.assigned_role.title in exclusive_roles)) // Is the rule exclusive to their job? + trimmed_list.Remove(creature) + continue + if(HAS_TRAIT(creature, TRAIT_MIND_TEMPORARILY_GONE)) // are they out of body? + trimmed_list.Remove(creature) + continue + if(HAS_TRAIT(creature, TRAIT_TEMPORARY_BODY)) // are they an avatar? + trimmed_list.Remove(creature) + continue + return trimmed_list + +// You can then for example prompt dead players in execute() to join as strike teams or whatever +// Or autotator someone + +// IMPORTANT, since /datum/dynamic_ruleset/midround may accept candidates from both living, dead, and even antag players +// subtype your midround with /from_ghosts or /from_living to get candidate checking. Or check yourself by subtyping from neither +/datum/dynamic_ruleset/midround/ready(forced = FALSE) + if (forced) + return TRUE + + var/job_check = 0 + if (enemy_roles.len > 0) + for (var/mob/M in GLOB.alive_player_list) + if (M.stat == DEAD || !M.client) + continue // Dead/disconnected players cannot count as opponents + if (M.mind && (M.mind.assigned_role.title in enemy_roles) && (!(M in candidates) || (M.mind.assigned_role.title in restricted_roles))) + job_check++ // Checking for "enemies" (such as sec officers). To be counters, they must either not be candidates to that rule, or have a job that restricts them from it + + var/threat = round(SSdynamic.threat_level/10) + var/ruleset_forced = (GLOB.dynamic_forced_rulesets[type] || RULESET_NOT_FORCED) == RULESET_FORCE_ENABLED + if (!ruleset_forced && job_check < required_enemies[threat]) + log_dynamic("FAIL: [src] is not ready, because there are not enough enemies: [required_enemies[threat]] needed, [job_check] found") + return FALSE + + return TRUE + +/datum/dynamic_ruleset/midround/from_ghosts/execute() + var/list/possible_candidates = list() + possible_candidates.Add(dead_players) + possible_candidates.Add(list_observers) + send_applications(possible_candidates) + if(assigned.len > 0) + return TRUE + else + return FALSE + +/// This sends a poll to ghosts if they want to be a ghost spawn from a ruleset. +/datum/dynamic_ruleset/midround/from_ghosts/proc/send_applications(list/possible_volunteers = list()) + if (possible_volunteers.len <= 0) // This shouldn't happen, as ready() should return FALSE if there is not a single valid candidate + message_admins("Possible volunteers was 0. This shouldn't appear, because of ready(), unless you forced it!") + return + + SSdynamic.log_dynamic_and_announce("Polling [possible_volunteers.len] players to apply for the [name] ruleset.") + candidates = SSpolling.poll_ghost_candidates("Looking for volunteers to become [antag_flag] for [name]", check_jobban = antag_flag_override, role = antag_flag || antag_flag_override, poll_time = 30 SECONDS, pic_source = /obj/structure/sign/poster/contraband/syndicate_recruitment, role_name_text = antag_flag) + + if(!candidates || candidates.len <= 0) + SSdynamic.log_dynamic_and_announce("The ruleset [name] received no applications.") + SSdynamic.executed_rules -= src + attempt_replacement() + return + + SSdynamic.log_dynamic_and_announce("[candidates.len] players volunteered for [name].") + review_applications() + +/// Here is where you can check if your ghost applicants are valid for the ruleset. +/// Called by send_applications(). +/datum/dynamic_ruleset/midround/from_ghosts/proc/review_applications() + if(candidates.len < required_applicants) + SSdynamic.executed_rules -= src + return + for (var/i = 1, i <= required_candidates, i++) + if(candidates.len <= 0) + break + var/mob/applicant = pick(candidates) + candidates -= applicant + if(!isobserver(applicant)) + if(applicant.stat == DEAD) // Not an observer? If they're dead, make them one. + applicant = applicant.ghostize(FALSE) + else // Not dead? Disregard them, pick a new applicant + i-- + continue + if(!applicant) + i-- + continue + assigned += applicant + finish_applications() + +/// Here the accepted applications get generated bodies and their setup is finished. +/// Called by review_applications() +/datum/dynamic_ruleset/midround/from_ghosts/proc/finish_applications() + var/i = 0 + for(var/mob/applicant as anything in assigned) + i++ + var/mob/new_character = applicant + if(makeBody) + new_character = generate_ruleset_body(applicant) + finish_setup(new_character, i) + notify_ghosts( + "[applicant.name] has been picked for the ruleset [name]!", + source = new_character, + ) + +/datum/dynamic_ruleset/midround/from_ghosts/proc/generate_ruleset_body(mob/applicant) + var/mob/living/carbon/human/new_character = make_body(applicant) + new_character.dna.remove_all_mutations() + return new_character + +/datum/dynamic_ruleset/midround/from_ghosts/proc/finish_setup(mob/new_character, index) + var/datum/antagonist/new_role = new antag_datum() + setup_role(new_role) + new_character.mind.add_antag_datum(new_role) + new_character.mind.special_role = antag_flag + +/datum/dynamic_ruleset/midround/from_ghosts/proc/setup_role(datum/antagonist/new_role) + return + +/// Fired when there are no valid candidates. Will spawn a sleeper agent or latejoin traitor. +/datum/dynamic_ruleset/midround/from_ghosts/proc/attempt_replacement() + var/datum/dynamic_ruleset/midround/from_living/autotraitor/sleeper_agent = new + + SSdynamic.configure_ruleset(sleeper_agent) + + if (!SSdynamic.picking_specific_rule(sleeper_agent)) + return + + SSdynamic.picking_specific_rule(/datum/dynamic_ruleset/latejoin/infiltrator) + +///subtype to handle checking players +/datum/dynamic_ruleset/midround/from_living + weight = 0 + abstract_type = /datum/dynamic_ruleset/midround/from_living + +/datum/dynamic_ruleset/midround/from_living/ready(forced) + if(!check_candidates()) + return FALSE + return ..() + + +/// Midround Traitor Ruleset (From Living) +/datum/dynamic_ruleset/midround/from_living/autotraitor + name = "Syndicate Sleeper Agent" + midround_ruleset_style = MIDROUND_RULESET_STYLE_LIGHT + antag_datum = /datum/antagonist/traitor/infiltrator/sleeper_agent + antag_flag = ROLE_SLEEPER_AGENT + antag_flag_override = ROLE_TRAITOR + protected_roles = list( + JOB_CAPTAIN, + JOB_DETECTIVE, + JOB_HEAD_OF_PERSONNEL, + JOB_HEAD_OF_SECURITY, + JOB_PRISONER, + JOB_SECURITY_OFFICER, + JOB_WARDEN, + ) + restricted_roles = list( + JOB_AI, + JOB_CYBORG, + ROLE_POSITRONIC_BRAIN, + ) + required_candidates = 1 + weight = 35 + cost = 3 + requirements = list(3,3,3,3,3,3,3,3,3,3) + repeatable = TRUE + +/datum/dynamic_ruleset/midround/from_living/autotraitor/trim_candidates() + ..() + candidates = living_players + for(var/mob/living/player in candidates) + if(issilicon(player)) // Your assigned role doesn't change when you are turned into a silicon. + candidates -= player + else if(is_centcom_level(player.z)) + candidates -= player // We don't autotator people in CentCom + else if(player.mind && (player.mind.special_role || player.mind.antag_datums?.len > 0)) + candidates -= player // We don't autotator people with roles already + +/datum/dynamic_ruleset/midround/from_living/autotraitor/execute() + var/mob/M = pick(candidates) + assigned += M + candidates -= M + var/datum/antagonist/traitor/infiltrator/sleeper_agent/newTraitor = new + M.mind.add_antag_datum(newTraitor) + message_admins("[ADMIN_LOOKUPFLW(M)] was selected by the [name] ruleset and has been made into a midround traitor.") + log_dynamic("[key_name(M)] was selected by the [name] ruleset and has been made into a midround traitor.") + return TRUE + + +////////////////////////////////////////////// +// // +// Malfunctioning AI // +// // +////////////////////////////////////////////// + +/datum/dynamic_ruleset/midround/malf + name = "Malfunctioning AI" + midround_ruleset_style = MIDROUND_RULESET_STYLE_HEAVY + antag_datum = /datum/antagonist/malf_ai + antag_flag = ROLE_MALF_MIDROUND + antag_flag_override = ROLE_MALF + enemy_roles = list( + JOB_CHEMIST, + JOB_CHIEF_ENGINEER, + JOB_HEAD_OF_SECURITY, + JOB_RESEARCH_DIRECTOR, + JOB_SCIENTIST, + JOB_SECURITY_OFFICER, + JOB_WARDEN, + ) + exclusive_roles = list(JOB_AI) + required_enemies = list(4,4,4,4,4,4,2,2,2,0) + required_candidates = 1 + minimum_players = 25 + weight = 2 + cost = 10 + required_type = /mob/living/silicon/ai + blocking_rules = list(/datum/dynamic_ruleset/roundstart/malf_ai) + +/datum/dynamic_ruleset/midround/malf/trim_candidates() + ..() + candidates = living_players + for(var/mob/living/player in candidates) + if(!isAI(player)) + candidates -= player + continue + + if(is_centcom_level(player.z)) + candidates -= player + continue + + if(player.mind && (player.mind.special_role || player.mind.antag_datums?.len > 0)) + candidates -= player + +/datum/dynamic_ruleset/midround/malf/execute() + if(!candidates || !candidates.len) + return FALSE + var/mob/living/silicon/ai/new_malf_ai = pick_n_take(candidates) + assigned += new_malf_ai.mind + var/datum/antagonist/malf_ai/malf_antag_datum = new + new_malf_ai.mind.special_role = antag_flag + new_malf_ai.mind.add_antag_datum(malf_antag_datum) + 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), LAW_ION) + else + new_malf_ai.add_ion_law(generate_ion_law()) + return TRUE + +/// Midround Wizard Ruleset (From Ghosts) +/datum/dynamic_ruleset/midround/from_ghosts/wizard + name = "Wizard" + midround_ruleset_style = MIDROUND_RULESET_STYLE_HEAVY + antag_datum = /datum/antagonist/wizard + antag_flag = ROLE_WIZARD_MIDROUND + antag_flag_override = ROLE_WIZARD + required_enemies = list(2,2,1,1,1,1,1,0,0,0) + required_candidates = 1 + weight = 1 + cost = 10 + requirements = REQUIREMENTS_VERY_HIGH_THREAT_NEEDED + flags = HIGH_IMPACT_RULESET + ruleset_lazy_templates = list(LAZY_TEMPLATE_KEY_WIZARDDEN) + +/datum/dynamic_ruleset/midround/from_ghosts/wizard/ready(forced = FALSE) + if(!check_candidates()) + return FALSE + if(!length(GLOB.wizardstart)) + log_admin("Cannot accept Wizard ruleset. Couldn't find any wizard spawn points.") + message_admins("Cannot accept Wizard ruleset. Couldn't find any wizard spawn points.") + return FALSE + return ..() + +/datum/dynamic_ruleset/midround/from_ghosts/wizard/finish_setup(mob/new_character, index) + ..() + new_character.forceMove(pick(GLOB.wizardstart)) + +/// Midround Nuclear Operatives Ruleset (From Ghosts) +/datum/dynamic_ruleset/midround/from_ghosts/nuclear + name = "Nuclear Assault" + midround_ruleset_style = MIDROUND_RULESET_STYLE_HEAVY + antag_flag = ROLE_OPERATIVE_MIDROUND + antag_flag_override = ROLE_OPERATIVE + antag_datum = /datum/antagonist/nukeop + enemy_roles = list( + JOB_AI, + JOB_CYBORG, + JOB_CAPTAIN, + JOB_DETECTIVE, + JOB_HEAD_OF_SECURITY, + JOB_SECURITY_OFFICER, + JOB_WARDEN, + ) + required_enemies = list(3,3,3,3,3,2,1,1,0,0) + required_candidates = 5 + weight = 5 + cost = 7 + minimum_round_time = 70 MINUTES + requirements = REQUIREMENTS_VERY_HIGH_THREAT_NEEDED + ruleset_lazy_templates = list(LAZY_TEMPLATE_KEY_NUKIEBASE) + flags = HIGH_IMPACT_RULESET + + var/list/operative_cap = list(2,2,3,3,4,5,5,5,5,5) + +/datum/dynamic_ruleset/midround/from_ghosts/nuclear/acceptable(population=0, threat_level=0) + if (locate(/datum/dynamic_ruleset/roundstart/nuclear) in SSdynamic.executed_rules) + return FALSE // Unavailable if nuke ops were already sent at roundstart + indice_pop = min(operative_cap.len, round(living_players.len/5)+1) + required_candidates = operative_cap[indice_pop] + return ..() + +/datum/dynamic_ruleset/midround/from_ghosts/nuclear/ready(forced = FALSE) + if (!check_candidates()) + return FALSE + return ..() + +/datum/dynamic_ruleset/midround/from_ghosts/nuclear/finish_applications() + var/mob/leader = get_most_experienced(assigned, ROLE_NUCLEAR_OPERATIVE) + if(leader) + assigned.Remove(leader) + assigned.Insert(1, leader) + return ..() + +/datum/dynamic_ruleset/midround/from_ghosts/nuclear/finish_setup(mob/new_character, index) + new_character.mind.set_assigned_role(SSjob.GetJobType(/datum/job/nuclear_operative)) + new_character.mind.special_role = ROLE_NUCLEAR_OPERATIVE + if(index == 1) + var/datum/antagonist/nukeop/leader/leader_antag_datum = new() + new_character.mind.add_antag_datum(leader_antag_datum) + return + return ..() + +/// Midround Blob Ruleset (From Ghosts) +/datum/dynamic_ruleset/midround/from_ghosts/blob + name = "Blob" + midround_ruleset_style = MIDROUND_RULESET_STYLE_HEAVY + antag_datum = /datum/antagonist/blob + antag_flag = ROLE_BLOB + required_enemies = list(2,2,1,1,1,1,1,0,0,0) + required_candidates = 1 + minimum_round_time = 35 MINUTES + weight = 3 + cost = 8 + minimum_players = 25 + repeatable = TRUE + +/datum/dynamic_ruleset/midround/from_ghosts/blob/generate_ruleset_body(mob/applicant) + var/body = applicant.become_overmind() + return body + +/// Midround Blob Infection Ruleset (From Living) +/datum/dynamic_ruleset/midround/from_living/blob_infection + name = "Blob Infection" + midround_ruleset_style = MIDROUND_RULESET_STYLE_HEAVY + antag_datum = /datum/antagonist/blob/infection + antag_flag = ROLE_BLOB_INFECTION + antag_flag_override = ROLE_BLOB + protected_roles = list( + JOB_CAPTAIN, + JOB_DETECTIVE, + JOB_HEAD_OF_SECURITY, + JOB_PRISONER, + JOB_SECURITY_OFFICER, + JOB_WARDEN, + ) + restricted_roles = list( + JOB_AI, + JOB_CYBORG, + ROLE_POSITRONIC_BRAIN, + ) + required_enemies = list(2,2,1,1,1,1,1,0,0,0) + required_candidates = 1 + minimum_round_time = 35 MINUTES + weight = 3 + cost = 10 + minimum_players = 25 + repeatable = TRUE + +/datum/dynamic_ruleset/midround/from_living/blob_infection/trim_candidates() + ..() + candidates = living_players + for(var/mob/living/player as anything in candidates) + var/turf/player_turf = get_turf(player) + if(!player_turf || !is_station_level(player_turf.z)) + candidates -= player + continue + + if(player.mind && (player.mind.special_role || length(player.mind.antag_datums) > 0)) + candidates -= player + +/datum/dynamic_ruleset/midround/from_living/blob_infection/execute() + if(!candidates || !candidates.len) + return FALSE + var/mob/living/carbon/human/blob_antag = pick_n_take(candidates) + assigned += blob_antag.mind + blob_antag.mind.special_role = antag_flag + return ..() + +/// Midround Xenomorph Ruleset (From Ghosts) +/datum/dynamic_ruleset/midround/from_ghosts/xenomorph + name = "Alien Infestation" + midround_ruleset_style = MIDROUND_RULESET_STYLE_HEAVY + antag_datum = /datum/antagonist/xeno + antag_flag = ROLE_ALIEN + required_enemies = list(2,2,1,1,1,1,1,0,0,0) + required_candidates = 1 + minimum_round_time = 40 MINUTES + weight = 5 + cost = 10 + minimum_players = 25 + repeatable = TRUE + var/list/vents = list() + +/datum/dynamic_ruleset/midround/from_ghosts/xenomorph/forget_startup() + vents = list() + return ..() + +/datum/dynamic_ruleset/midround/from_ghosts/xenomorph/execute() + // 50% chance of being incremented by one + required_candidates += prob(50) + var/list/vent_pumps = SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/atmospherics/components/unary/vent_pump) + for(var/obj/machinery/atmospherics/components/unary/vent_pump/temp_vent as anything in vent_pumps) + if(QDELETED(temp_vent)) + continue + if(is_station_level(temp_vent.loc.z) && !temp_vent.welded) + var/datum/pipeline/temp_vent_parent = temp_vent.parents[1] + if(!temp_vent_parent) + continue // No parent vent + // Stops Aliens getting stuck in small networks. + // See: Security, Virology + if(temp_vent_parent.other_atmos_machines.len > 20) + vents += temp_vent + if(!vents.len) + return FALSE + . = ..() + +/datum/dynamic_ruleset/midround/from_ghosts/xenomorph/generate_ruleset_body(mob/applicant) + var/obj/vent = pick_n_take(vents) + var/mob/living/carbon/alien/larva/new_xeno = new(vent.loc) + new_xeno.key = applicant.key + new_xeno.move_into_vent(vent) + message_admins("[ADMIN_LOOKUPFLW(new_xeno)] has been made into an alien by the midround ruleset.") + log_dynamic("[key_name(new_xeno)] was spawned as an alien by the midround ruleset.") + return new_xeno + +/// Midround Nightmare Ruleset (From Ghosts) +/datum/dynamic_ruleset/midround/from_ghosts/nightmare + name = "Nightmare" + midround_ruleset_style = MIDROUND_RULESET_STYLE_LIGHT + antag_datum = /datum/antagonist/nightmare + antag_flag = ROLE_NIGHTMARE + antag_flag_override = ROLE_ALIEN + required_enemies = list(2,2,1,1,1,1,1,0,0,0) + required_candidates = 1 + weight = 3 + cost = 5 + minimum_players = 15 + repeatable = TRUE + +/datum/dynamic_ruleset/midround/from_ghosts/nightmare/acceptable(population = 0, threat_level = 0) + var/turf/spawn_loc = find_maintenance_spawn(atmos_sensitive = TRUE, require_darkness = TRUE) //Checks if there's a single safe, dark tile on station. + if(!spawn_loc) + return FALSE + return ..() + +/datum/dynamic_ruleset/midround/from_ghosts/nightmare/generate_ruleset_body(mob/applicant) + var/datum/mind/player_mind = new /datum/mind(applicant.key) + player_mind.active = TRUE + + var/mob/living/carbon/human/new_nightmare = new (find_maintenance_spawn(atmos_sensitive = TRUE, require_darkness = TRUE)) + player_mind.transfer_to(new_nightmare) + player_mind.set_assigned_role(SSjob.GetJobType(/datum/job/nightmare)) + player_mind.special_role = ROLE_NIGHTMARE + player_mind.add_antag_datum(/datum/antagonist/nightmare) + new_nightmare.set_species(/datum/species/shadow/nightmare) + + playsound(new_nightmare, 'sound/magic/ethereal_exit.ogg', 50, TRUE, -1) + message_admins("[ADMIN_LOOKUPFLW(new_nightmare)] has been made into a Nightmare by the midround ruleset.") + log_dynamic("[key_name(new_nightmare)] was spawned as a Nightmare by the midround ruleset.") + return new_nightmare + +/// Midround Space Dragon Ruleset (From Ghosts) +/datum/dynamic_ruleset/midround/from_ghosts/space_dragon + name = "Space Dragon" + midround_ruleset_style = MIDROUND_RULESET_STYLE_HEAVY + antag_datum = /datum/antagonist/space_dragon + antag_flag = ROLE_SPACE_DRAGON + antag_flag_override = ROLE_SPACE_DRAGON + required_enemies = list(2,2,1,1,1,1,1,0,0,0) + required_candidates = 1 + weight = 4 + cost = 7 + minimum_players = 25 + repeatable = TRUE + var/list/spawn_locs = list() + +/datum/dynamic_ruleset/midround/from_ghosts/space_dragon/forget_startup() + spawn_locs = list() + return ..() + +/datum/dynamic_ruleset/midround/from_ghosts/space_dragon/execute() + for(var/obj/effect/landmark/carpspawn/C in GLOB.landmarks_list) + spawn_locs += (C.loc) + if(!spawn_locs.len) + message_admins("No valid spawn locations found, aborting...") + return MAP_ERROR + . = ..() + +/datum/dynamic_ruleset/midround/from_ghosts/space_dragon/generate_ruleset_body(mob/applicant) + var/datum/mind/player_mind = new /datum/mind(applicant.key) + player_mind.active = TRUE + + var/mob/living/basic/space_dragon/S = new (pick(spawn_locs)) + player_mind.transfer_to(S) + player_mind.add_antag_datum(/datum/antagonist/space_dragon) + + playsound(S, 'sound/magic/ethereal_exit.ogg', 50, TRUE, -1) + message_admins("[ADMIN_LOOKUPFLW(S)] has been made into a Space Dragon by the midround ruleset.") + log_dynamic("[key_name(S)] was spawned as a Space Dragon by the midround ruleset.") + priority_announce("A large organic energy flux has been recorded near of [station_name()], please stand-by.", "Lifesign Alert") + return S + +/datum/dynamic_ruleset/midround/from_ghosts/abductors + name = "Abductors" + midround_ruleset_style = MIDROUND_RULESET_STYLE_LIGHT + antag_datum = /datum/antagonist/abductor + antag_flag = ROLE_ABDUCTOR + required_enemies = list(2,2,1,1,1,1,1,0,0,0) + required_candidates = 2 + required_applicants = 2 + weight = 4 + cost = 7 + minimum_players = 25 + repeatable = TRUE + ruleset_lazy_templates = list(LAZY_TEMPLATE_KEY_ABDUCTOR_SHIPS) + + var/datum/team/abductor_team/new_team + +/datum/dynamic_ruleset/midround/from_ghosts/abductors/forget_startup() + new_team = null + return ..() + +/datum/dynamic_ruleset/midround/from_ghosts/abductors/ready(forced = FALSE) + if (required_candidates > (dead_players.len + list_observers.len)) + return FALSE + return ..() + +/datum/dynamic_ruleset/midround/from_ghosts/abductors/finish_setup(mob/new_character, index) + if (index == 1) // Our first guy is the scientist. We also initialize the team here as well since this should only happen once per pair of abductors. + new_team = new + if(new_team.team_number > ABDUCTOR_MAX_TEAMS) + return MAP_ERROR + var/datum/antagonist/abductor/scientist/new_role = new + new_character.mind.add_antag_datum(new_role, new_team) + else // Our second guy is the agent, team is already created, don't need to make another one. + var/datum/antagonist/abductor/agent/new_role = new + new_character.mind.add_antag_datum(new_role, new_team) + +/// Midround Space Ninja Ruleset (From Ghosts) +/datum/dynamic_ruleset/midround/from_ghosts/space_ninja + name = "Space Ninja" + midround_ruleset_style = MIDROUND_RULESET_STYLE_HEAVY + antag_datum = /datum/antagonist/ninja + antag_flag = ROLE_NINJA + required_enemies = list(2,2,1,1,1,1,1,0,0,0) + required_candidates = 1 + weight = 4 + cost = 8 + minimum_players = 30 + repeatable = TRUE + ruleset_lazy_templates = list(LAZY_TEMPLATE_KEY_NINJA_HOLDING_FACILITY) // I mean, no one uses the nets anymore but whateva + + var/list/spawn_locs = list() + +/datum/dynamic_ruleset/midround/from_ghosts/space_ninja/forget_startup() + spawn_locs = list() + return ..() + +/datum/dynamic_ruleset/midround/from_ghosts/space_ninja/execute() + for(var/obj/effect/landmark/carpspawn/carp_spawn in GLOB.landmarks_list) + if(!isturf(carp_spawn.loc)) + stack_trace("Carp spawn found not on a turf: [carp_spawn.type] on [isnull(carp_spawn.loc) ? "null" : carp_spawn.loc.type]") + continue + spawn_locs += carp_spawn.loc + if(!spawn_locs.len) + message_admins("No valid spawn locations found, aborting...") + return MAP_ERROR + return ..() + +/datum/dynamic_ruleset/midround/from_ghosts/space_ninja/generate_ruleset_body(mob/applicant) + var/mob/living/carbon/human/ninja = create_space_ninja(pick(spawn_locs)) + ninja.key = applicant.key + ninja.mind.add_antag_datum(/datum/antagonist/ninja) + + message_admins("[ADMIN_LOOKUPFLW(ninja)] has been made into a Space Ninja by the midround ruleset.") + log_dynamic("[key_name(ninja)] was spawned as a Space Ninja by the midround ruleset.") + return ninja + +/// Midround Spiders Ruleset (From Ghosts) +/datum/dynamic_ruleset/midround/spiders + name = "Spiders" + midround_ruleset_style = MIDROUND_RULESET_STYLE_HEAVY + antag_flag = ROLE_SPIDER + required_type = /mob/dead/observer + required_enemies = list(2,2,1,1,1,1,1,0,0,0) + required_candidates = 0 + weight = 3 + cost = 8 + minimum_players = 27 + repeatable = TRUE + var/spawncount = 2 + +/datum/dynamic_ruleset/midround/spiders/execute() + create_midwife_eggs(spawncount) + return ..() + +/// Midround Revenant Ruleset (From Ghosts) +/datum/dynamic_ruleset/midround/from_ghosts/revenant + name = "Revenant" + midround_ruleset_style = MIDROUND_RULESET_STYLE_LIGHT + antag_datum = /datum/antagonist/revenant + antag_flag = ROLE_REVENANT + required_enemies = list(2,2,1,1,1,1,1,0,0,0) + required_candidates = 1 + weight = 4 + cost = 5 + minimum_players = 15 + repeatable = TRUE + var/dead_mobs_required = 20 + var/need_extra_spawns_value = 15 + var/list/spawn_locs = list() + +/datum/dynamic_ruleset/midround/from_ghosts/revenant/forget_startup() + spawn_locs = list() + return ..() + +/datum/dynamic_ruleset/midround/from_ghosts/revenant/acceptable(population=0, threat_level=0) + if(GLOB.dead_mob_list.len < dead_mobs_required) + return FALSE + return ..() + +/datum/dynamic_ruleset/midround/from_ghosts/revenant/execute() + for(var/mob/living/corpse in GLOB.dead_mob_list) //look for any dead bodies + var/turf/corpse_turf = get_turf(corpse) + if(corpse_turf && is_station_level(corpse_turf.z)) + spawn_locs += corpse_turf + if(!spawn_locs.len || spawn_locs.len < need_extra_spawns_value) //look for any morgue trays, crematoriums, ect if there weren't alot of dead bodies on the station to pick from + for(var/obj/structure/bodycontainer/corpse_container in GLOB.bodycontainers) + var/turf/container_turf = get_turf(corpse_container) + if(container_turf && is_station_level(container_turf.z)) + spawn_locs += container_turf + if(!spawn_locs.len) //If we can't find any valid spawnpoints, try the carp spawns + for(var/obj/effect/landmark/carpspawn/carp_spawnpoint in GLOB.landmarks_list) + if(isturf(carp_spawnpoint.loc)) + spawn_locs += carp_spawnpoint.loc + if(!spawn_locs.len) //If we can't find THAT, then just give up and cry + return FALSE + . = ..() + +/datum/dynamic_ruleset/midround/from_ghosts/revenant/generate_ruleset_body(mob/applicant) + var/mob/living/basic/revenant/revenant = new(pick(spawn_locs)) + revenant.key = applicant.key + message_admins("[ADMIN_LOOKUPFLW(revenant)] has been made into a revenant by the midround ruleset.") + log_game("[key_name(revenant)] was spawned as a revenant by the midround ruleset.") + return revenant + +/// Midround Sentient Disease Ruleset (From Ghosts) +/datum/dynamic_ruleset/midround/from_ghosts/sentient_disease + name = "Sentient Disease" + midround_ruleset_style = MIDROUND_RULESET_STYLE_HEAVY + antag_datum = /datum/antagonist/disease + antag_flag = ROLE_SENTIENT_DISEASE + required_candidates = 1 + minimum_players = 25 + weight = 4 + cost = 8 + repeatable = TRUE + +/datum/dynamic_ruleset/midround/from_ghosts/sentient_disease/generate_ruleset_body(mob/applicant) + var/mob/camera/disease/virus = new /mob/camera/disease(SSmapping.get_station_center()) + virus.key = applicant.key + INVOKE_ASYNC(virus, TYPE_PROC_REF(/mob/camera/disease, pick_name)) + message_admins("[ADMIN_LOOKUPFLW(virus)] has been made into a sentient disease by the midround ruleset.") + log_game("[key_name(virus)] was spawned as a sentient disease by the midround ruleset.") + return virus + +/// Midround Space Pirates Ruleset (From Ghosts) +/datum/dynamic_ruleset/midround/pirates + name = "Space Pirates" + midround_ruleset_style = MIDROUND_RULESET_STYLE_LIGHT + antag_flag = "Space Pirates" + required_type = /mob/dead/observer + required_enemies = list(2,2,1,1,1,1,1,0,0,0) + required_candidates = 0 + weight = 3 + cost = 8 + minimum_players = 20 + repeatable = TRUE + +/datum/dynamic_ruleset/midround/pirates/acceptable(population=0, threat_level=0) + if (SSmapping.is_planetary() || GLOB.light_pirate_gangs.len == 0) + return FALSE + return ..() + +/datum/dynamic_ruleset/midround/pirates/execute() + send_pirate_threat(GLOB.light_pirate_gangs) + return ..() + +/// Dangerous Space Pirates ruleset +/datum/dynamic_ruleset/midround/dangerous_pirates + name = "Dangerous Space Pirates" + midround_ruleset_style = MIDROUND_RULESET_STYLE_HEAVY + antag_flag = "Space Pirates" + required_type = /mob/dead/observer + required_enemies = list(2,2,1,1,1,1,1,0,0,0) + required_candidates = 0 + weight = 3 + cost = 8 + minimum_players = 25 + repeatable = TRUE + +/datum/dynamic_ruleset/midround/dangerous_pirates/acceptable(population=0, threat_level=0) + if (SSmapping.is_planetary() || GLOB.heavy_pirate_gangs.len == 0) + return FALSE + return ..() + +/datum/dynamic_ruleset/midround/dangerous_pirates/execute() + send_pirate_threat(GLOB.heavy_pirate_gangs) + return ..() + +/// Midround Obsessed Ruleset (From Living) +/datum/dynamic_ruleset/midround/from_living/obsessed + name = "Obsessed" + midround_ruleset_style = MIDROUND_RULESET_STYLE_LIGHT + antag_datum = /datum/antagonist/obsessed + antag_flag = ROLE_OBSESSED + restricted_roles = list( + JOB_AI, + JOB_CYBORG, + ROLE_POSITRONIC_BRAIN, + ) + required_enemies = list(2,2,1,1,1,1,1,0,0,0) + required_candidates = 1 + weight = 4 + cost = 3 // Doesn't have the same impact on rounds as revenants, dragons, sentient disease (10) or syndicate infiltrators (5). + repeatable = TRUE + +/datum/dynamic_ruleset/midround/from_living/obsessed/trim_candidates() + ..() + candidates = living_players + for(var/mob/living/carbon/human/candidate in candidates) + if( \ + !candidate.get_organ_by_type(/obj/item/organ/internal/brain) \ + || candidate.mind.has_antag_datum(/datum/antagonist/obsessed) \ + || candidate.stat == DEAD \ + || !(ROLE_OBSESSED in candidate.client?.prefs?.be_special) \ + || !candidate.mind.assigned_role \ + ) + candidates -= candidate + +/datum/dynamic_ruleset/midround/from_living/obsessed/execute() + var/mob/living/carbon/human/obsessed = pick_n_take(candidates) + obsessed.gain_trauma(/datum/brain_trauma/special/obsessed) + message_admins("[ADMIN_LOOKUPFLW(obsessed)] has been made Obsessed by the midround ruleset.") + log_game("[key_name(obsessed)] was made Obsessed by the midround ruleset.") + return TRUE + +/// Midround Space Changeling Ruleset (From Ghosts) +/datum/dynamic_ruleset/midround/from_ghosts/changeling_midround + name = "Space Changeling" + midround_ruleset_style = MIDROUND_RULESET_STYLE_LIGHT + antag_datum = /datum/antagonist/changeling/space + antag_flag = ROLE_CHANGELING_MIDROUND + antag_flag_override = ROLE_CHANGELING + required_type = /mob/dead/observer + required_enemies = list(2,2,1,1,1,1,1,0,0,0) + required_candidates = 1 + weight = 3 + cost = 7 + minimum_players = 15 + repeatable = TRUE + +/datum/dynamic_ruleset/midround/from_ghosts/changeling_midround/generate_ruleset_body(mob/applicant) + var/body = generate_changeling_meteor(applicant) + message_admins("[ADMIN_LOOKUPFLW(body)] has been made into a space changeling by the midround ruleset.") + log_dynamic("[key_name(body)] was spawned as a space changeling by the midround ruleset.") + return body + +/// Midround Paradox Clone Ruleset (From Ghosts) +/datum/dynamic_ruleset/midround/from_ghosts/paradox_clone + name = "Paradox Clone" + midround_ruleset_style = MIDROUND_RULESET_STYLE_LIGHT + antag_datum = /datum/antagonist/paradox_clone + antag_flag = ROLE_PARADOX_CLONE + enemy_roles = list( + JOB_CAPTAIN, + JOB_DETECTIVE, + JOB_HEAD_OF_SECURITY, + JOB_SECURITY_OFFICER, + JOB_WARDEN, + ) + required_enemies = list(2, 2, 1, 1, 1, 1, 1, 0, 0, 0) + required_candidates = 1 + weight = 4 + cost = 3 + repeatable = TRUE + var/list/possible_spawns = list() ///places the antag can spawn + +/datum/dynamic_ruleset/midround/from_ghosts/paradox_clone/forget_startup() + possible_spawns = list() + return ..() + +/datum/dynamic_ruleset/midround/from_ghosts/paradox_clone/execute() + possible_spawns += find_maintenance_spawn(atmos_sensitive = TRUE, require_darkness = FALSE) + if(!possible_spawns.len) + return MAP_ERROR + return ..() + +/datum/dynamic_ruleset/midround/from_ghosts/paradox_clone/generate_ruleset_body(mob/applicant) + var/datum/mind/player_mind = new /datum/mind(applicant.key) + player_mind.active = TRUE + + var/mob/living/carbon/human/clone_victim = find_original() + var/mob/living/carbon/human/clone = clone_victim.make_full_human_copy(pick(possible_spawns)) + player_mind.transfer_to(clone) + + var/datum/antagonist/paradox_clone/new_datum = player_mind.add_antag_datum(/datum/antagonist/paradox_clone) + new_datum.original_ref = WEAKREF(clone_victim.mind) + new_datum.setup_clone() + + playsound(clone, 'sound/weapons/zapbang.ogg', 30, TRUE) + new /obj/item/storage/toolbox/mechanical(clone.loc) //so they dont get stuck in maints + + message_admins("[ADMIN_LOOKUPFLW(clone)] has been made into a Paradox Clone by the midround ruleset.") + clone.log_message("was spawned as a Paradox Clone of [key_name(clone)] by the midround ruleset.", LOG_GAME) + + return clone + +/** + * Trims through GLOB.player_list and finds a target + * Returns a single human victim, if none is possible then returns null. + */ +/datum/dynamic_ruleset/midround/from_ghosts/paradox_clone/proc/find_original() + var/list/possible_targets = list() + + for(var/mob/living/carbon/human/player in GLOB.player_list) + if(!player.client || !player.mind || player.stat) + continue + if(!(player.mind.assigned_role.job_flags & JOB_CREW_MEMBER)) + continue + possible_targets += player + + if(possible_targets.len) + return pick(possible_targets) + return FALSE + +#undef MALF_ION_PROB +#undef REPLACE_LAW_WITH_ION_PROB diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm b/code/controllers/subsystem/dynamic/dynamic_rulesets_roundstart.dm similarity index 99% rename from code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm rename to code/controllers/subsystem/dynamic/dynamic_rulesets_roundstart.dm index bb1300249c7..290b7116162 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm +++ b/code/controllers/subsystem/dynamic/dynamic_rulesets_roundstart.dm @@ -605,9 +605,9 @@ GLOBAL_VAR_INIT(revolutionary_win, FALSE) . = ..() message_admins("Starting a round of extended.") log_game("Starting a round of extended.") - mode.spend_roundstart_budget(mode.round_start_budget) - mode.spend_midround_budget(mode.mid_round_budget) - mode.threat_log += "[worldtime2text()]: Extended ruleset set threat to 0." + SSdynamic.spend_roundstart_budget(SSdynamic.round_start_budget) + SSdynamic.spend_midround_budget(SSdynamic.mid_round_budget) + SSdynamic.threat_log += "[worldtime2text()]: Extended ruleset set threat to 0." return TRUE ////////////////////////////////////////////// diff --git a/code/game/gamemodes/dynamic/dynamic_unfavorable_situation.dm b/code/controllers/subsystem/dynamic/dynamic_unfavorable_situation.dm similarity index 90% rename from code/game/gamemodes/dynamic/dynamic_unfavorable_situation.dm rename to code/controllers/subsystem/dynamic/dynamic_unfavorable_situation.dm index 1be6511433c..994f2e3f5de 100644 --- a/code/game/gamemodes/dynamic/dynamic_unfavorable_situation.dm +++ b/code/controllers/subsystem/dynamic/dynamic_unfavorable_situation.dm @@ -2,12 +2,12 @@ /// 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() +/datum/controller/subsystem/dynamic/proc/unfavorable_situation() SHOULD_NOT_SLEEP(TRUE) INVOKE_ASYNC(src, PROC_REF(_unfavorable_situation)) -/datum/game_mode/dynamic/proc/_unfavorable_situation() +/datum/controller/subsystem/dynamic/proc/_unfavorable_situation() var/static/list/unfavorable_random_events = list() if (!length(unfavorable_random_events)) unfavorable_random_events = generate_unfavourable_events() @@ -24,7 +24,7 @@ picking_specific_rule(heavy_ruleset, forced = TRUE, ignore_cost = TRUE) /// Return a valid heavy dynamic ruleset, or an empty list if there's no time to run any rulesets -/datum/game_mode/dynamic/proc/generate_unfavourable_heavy_rulesets() +/datum/controller/subsystem/dynamic/proc/generate_unfavourable_heavy_rulesets() if (EMERGENCY_PAST_POINT_OF_NO_RETURN) return list() @@ -58,7 +58,7 @@ return possible_heavies /// Filter the below list by which events can actually run on this map -/datum/game_mode/dynamic/proc/generate_unfavourable_events() +/datum/controller/subsystem/dynamic/proc/generate_unfavourable_events() var/static/list/unfavorable_random_events = list( /datum/round_event_control/earthquake, /datum/round_event_control/immovable_rod, diff --git a/code/controllers/subsystem/dynamic/readme.md b/code/controllers/subsystem/dynamic/readme.md new file mode 100644 index 00000000000..ec21626945e --- /dev/null +++ b/code/controllers/subsystem/dynamic/readme.md @@ -0,0 +1,194 @@ +# Dynamic Mode + +## Roundstart + +Dynamic rolls threat based on a special sauce formula: + +> [dynamic_curve_width][/datum/controller/global_vars/var/dynamic_curve_width] \* tan((3.1416 \* (rand() - 0.5) \* 57.2957795)) + [dynamic_curve_centre][/datum/controller/global_vars/var/dynamic_curve_centre] + +This threat is split into two separate budgets--`round_start_budget` and `mid_round_budget`. For example, a round with 50 threat might be split into a 30 roundstart budget, and a 20 midround budget. The roundstart budget is used to apply antagonists applied on readied players when the roundstarts (`/datum/dynamic_ruleset/roundstart`). The midround budget is used for two types of rulesets: +- `/datum/dynamic_ruleset/midround` - Rulesets that apply to either existing alive players, or to ghosts. Think Blob or Space Ninja, which poll ghosts asking if they want to play as these roles. +- `/datum/dynamic_ruleset/latejoin` - Rulesets that apply to the next player that joins. Think Syndicate Infiltrator, which converts a player just joining an existing round into traitor. + +This split is done with a similar method, known as the ["lorentz distribution"](https://en.wikipedia.org/wiki/Cauchy_distribution), exists to create a bell curve that ensures that while most rounds will have a threat level around ~50, chaotic and tame rounds still exist for variety. + +The process of creating these numbers occurs in `/datum/controller/subsystem/dynamic/proc/generate_threat` (for creating the threat level) and `/datum/controller/subsystem/dynamic/proc/generate_budgets` (for splitting the threat level into budgets). + +## Deciding roundstart threats +In `/datum/controller/subsystem/dynamic/proc/roundstart()` (called when no admin chooses the rulesets explicitly), Dynamic uses the available roundstart budget to pick threats. This is done through the following system: + +- All roundstart rulesets (remember, `/datum/dynamic_ruleset/roundstart`) are put into an associative list with their weight as the values (`drafted_rules`). +- Until there is either no roundstart budget left, or until there is no ruleset we can choose from with the available threat, a `pickweight` is done based on the drafted_rules. If the same threat is picked twice, it will "scale up". The meaning of this depends on the ruleset itself, using the `scaled_times` variable; traitors for instance will create more the higher they scale. + - If a ruleset is chosen with the `HIGH_IMPACT_RULESET` in its `flags`, then all other `HIGH_IMPACT_RULESET`s will be removed from `drafted_rules`. This is so that only one can ever be chosen. + - If a ruleset has `LONE_RULESET` in its `flags`, then it will be removed from `drafted_rules`. This is to ensure it will only ever be picked once. An example of this in use is Wizard, to avoid creating multiple wizards. +- After all roundstart threats are chosen, `/datum/dynamic_ruleset/proc/picking_roundstart_rule` is called for each, passing in the ruleset and the number of times it is scaled. + - In this stage, `pre_execute` is called, which is the function that will determine what players get what antagonists. If this function returns FALSE for whatever reason (in the case of an error), then its threat is refunded. + +After this process is done, any leftover roundstart threat will be given to the existing midround budget (done in `/datum/controller/subsystem/dynamic/pre_setup()`). + +## Deciding midround threats + +### Frequency + +The frequency of midround threats is based on the midround threat of the round. The number of midround threats that will roll is `threat_level` / `threat_per_midround_roll` (configurable), rounded up. For example, if `threat_per_midround_roll` is set to 5, then for every 5 threat, one midround roll will be added. If you have 6 threat, with this configuration, you will get 2 midround rolls. + +These midround roll points are then equidistantly spaced across the round, starting from `midround_lower_bound` (configurable) to `midround_upper_bound` (configurable), with a +/- of `midround_roll_distance` (configurable). + +For example, if: +1. `midround_lower_bound` is `10 MINUTES` +2. `midround_upper_bound` is `100 MINUTES` +3. `midround_roll_distance` is `3 MINUTES` +4. You have 5 midround rolls for the round + +...then those 5 midround rolls will be placed equidistantly (meaning equally apart) across the first 10-100 minutes of the round. Every individual roll will then be adjusted to either be 3 minutes earlier, or 3 minutes later. + +### Threat variety + +Threats are split between **heavy** rulesets and **light** rulesets. A heavy ruleset includes major threats like space dragons or blobs, while light rulesets are ones that don't often cause shuttle calls when rolled, such as revenants or traitors (sleeper agents). + +When a midround roll occurs, the decision to choose between light or heavy depends on the current round time. If it is less than `midround_light_upper_bound` (configurable), then it is guaranteed to be a light ruleset. If it is more than `midround_heavy_lower_bound`, then it is guaranteed to be a heavy ruleset. If it is any point in between, it will interpolate the value between those. This means that the longer the round goes on, the more likely you are to get a heavy ruleset. + +If no heavy ruleset can run, such as not having enough threat, then a light ruleset is guaranteed to run. + +## Rule Processing + +Calls [rule_process][/datum/dynamic_ruleset/proc/rule_process] on every rule which is in the current_rules list. +Every sixty seconds, update_playercounts() +Midround injection time is checked against world.time to see if an injection should happen. +If midround injection time is lower than world.time, it updates playercounts again, then tries to inject and generates a new cooldown regardless of whether a rule is picked. + +## Latejoin + +make_antag_chance(newPlayer) -> (For each latespawn rule...) +-> acceptable(living players, threat_level) -> trim_candidates() -> ready(forced=FALSE) +**If true, add to drafted rules +**NOTE that acceptable uses threat_level not threat! +**NOTE Latejoin timer is ONLY reset if at least one rule was drafted. +**NOTE the new_player.dm AttemptLateSpawn() calls OnPostSetup for all roles (unless assigned role is MODE) + +(After collecting all draftble rules...) +-> picking_latejoin_ruleset(drafted_rules) -> spend threat -> ruleset.execute() + +## Midround + +process() -> (For each midround rule... +-> acceptable(living players, threat_level) -> trim_candidates() -> ready(forced=FALSE) +(After collecting all draftble rules...) +-> picking_midround_ruleset(drafted_rules) -> spend threat -> ruleset.execute() + +## Forced + +For latejoin, it simply sets forced_latejoin_rule +make_antag_chance(newPlayer) -> trim_candidates() -> ready(forced=TRUE) **NOTE no acceptable() call + +For midround, calls the below proc with forced = TRUE +picking_specific_rule(ruletype,forced) -> forced OR acceptable(living_players, threat_level) -> trim_candidates() -> ready(forced) -> spend threat -> execute() +**NOTE specific rule can be called by RS traitor->MR autotraitor w/ forced=FALSE +**NOTE that due to short circuiting acceptable() need not be called if forced. + +## Ruleset + +acceptable(population,threat) just checks if enough threat_level for population indice. +**NOTE that we currently only send threat_level as the second arg, not threat. +ready(forced) checks if enough candidates and calls the map's map_ruleset(dynamic_ruleset) at the parent level + +trim_candidates() varies significantly according to the ruleset type +Roundstart: All candidates are new_player mobs. Check them for standard stuff: connected, desire role, not banned, etc. +**NOTE Roundstart deals with both candidates (trimmed list of valid players) and mode.candidates (everyone readied up). Don't confuse them! +Latejoin: Only one candidate, the latejoiner. Standard checks. +Midround: Instead of building a single list candidates, candidates contains four lists: living, dead, observing, and living antags. Standard checks in trim_list(list). + +Midround - Rulesets have additional types +/from_ghosts: execute() -> send_applications() -> review_applications() -> finish_applications() -> finish_setup(mob/newcharacter, index) -> setup_role(role) +**NOTE: execute() here adds dead players and observers to candidates list + +## Configuration and variables + +### Configuration +Configuration can be done through a `config/dynamic.json` file. One is provided as example in the codebase. This config file, loaded in `/datum/controller/subsystem/dynamic/pre_setup()`, directly overrides the values in the codebase, and so is perfect for making some rulesets harder/easier to get, turning them off completely, changing how much they cost, etc. + +The format of this file is: +```json +{ + "Dynamic": { + /* Configuration in here will directly override `/datum/controller/subsystem/dynamic` itself. */ + /* Keys are variable names, values are their new values. */ + }, + + "Roundstart": { + /* Configuration in here will apply to `/datum/dynamic_ruleset/roundstart` instances. */ + /* Keys are the ruleset names, values are another associative list with keys being variable names and values being new values. */ + "Wizard": { + /* I, a head admin, have died to wizard, and so I made it cost a lot more threat than it does in the codebase. */ + "cost": 80 + } + }, + + "Midround": { + /* Same as "Roundstart", but for `/datum/dynamic_ruleset/midround` instead. */ + }, + + "Latejoin": { + /* Same as "Roundstart", but for `/datum/dynamic_ruleset/latejoin` instead. */ + }, + + "Station": { + /* Special threat reductions for dangerous station traits. Traits are selected before dynamic, so traits will always */ + /* reduce threat even if there's no threat for it available. Only "cost" can be modified */ + } +} +``` + +Note: Comments are not possible in this format, and are just in this document for the sake of readability. + +### Rulesets +Rulesets have the following variables notable to developers and those interested in tuning. + +- `required_candidates` - The number of people that *must be willing* (in their preferences) to be an antagonist with this ruleset. If the candidates do not meet this requirement, then the ruleset will not bother to be drafted. +- `antag_cap` - Judges the amount of antagonists to apply, for both solo and teams. Note that some antagonists (such as traitors, lings, heretics, etc) will add more based on how many times they've been scaled. Written as a linear equation--ceil(x/denominator) + offset, or as a fixed constant. If written as a linear equation, will be in the form of `list("denominator" = denominator, "offset" = offset)`. + - Examples include: + - Traitor: `antag_cap = list("denominator" = 24)`. This means that for every 24 players, 1 traitor will be added (assuming no scaling). + - Nuclear Emergency: `antag_cap = list("denominator" = 18, "offset" = 1)`. For every 18 players, 1 nuke op will be added. Starts at 1, meaning at 30 players, 3 nuke ops will be created, rather than 2. + - Revolution: `antag_cap = 3`. There will always be 3 rev-heads, no matter what. +- `minimum_required_age` - The minimum age in order to apply for the ruleset. +- `weight` - How likely this ruleset is to be picked. A higher weight results in a higher chance of drafting. +- `cost` - The initial cost of the ruleset. This cost is taken from either the roundstart or midround budget, depending on the ruleset. +- `scaling_cost` - Cost for every *additional* application of this ruleset. + - Suppose traitors has a `cost` of 8, and a `scaling_cost` of 5. This means that buying 1 application of the traitor ruleset costs 8 threat, but buying two costs 13 (8 + 5). Buying it a third time is 18 (8 + 5 + 5), etc. +- `pop_per_requirement` - The range of population each value in `requirements` represents. By default, this is 6. + - If the value is five the range is 0-4, 5-9, 10-14, 15-19, 20-24, 25-29, 30-34, 35-39, 40-54, 45+. + - If it is six the range is 0-5, 6-11, 12-17, 18-23, 24-29, 30-35, 36-41, 42-47, 48-53, 54+. + - If it is seven the range is 0-6, 7-13, 14-20, 21-27, 28-34, 35-41, 42-48, 49-55, 56-62, 63+. +- `requirements` - A list that represents, per population range (see: `pop_per_requirement`), how much threat is required to *consider* this ruleset. This is independent of how much it'll actually cost. This uses *threat level*, not the budget--meaning if a round has 50 threat level, but only 10 points of round start threat, a ruleset with a requirement of 40 can still be picked if it can be bought. + - Suppose wizard has a `requirements` of `list(90,90,70,40,30,20,10,10,10,10)`. This means that, at 0-5 and 6-11 players, A station must have 90 threat in order for a wizard to be possible. At 12-17, 70 threat is required instead, etc. +- `restricted_roles` - A list of jobs that *can't* be drafted by this ruleset. For example, cyborgs cannot be changelings, and so are in the `restricted_roles`. +- `protected_roles` - Serves the same purpose of `restricted_roles`, except it can be turned off through configuration (`protect_roles_from_antagonist`). For example, security officers *shouldn't* be made traitor, so they are in Traitor's `protected_roles`. + - When considering putting a role in `protected_roles` or `restricted_roles`, the rule of thumb is if it is *technically infeasible* to support that job in that role. There's no *technical* reason a security officer can't be a traitor, and so they are simply in `protected_roles`. There *are* technical reasons a cyborg can't be a changeling, so they are in `restricted_roles` instead. + +This is not a complete list--search "configurable" in this README to learn more. + +### Dynamic + +The "Dynamic" key has the following configurable values: +- `pop_per_requirement` - The default value of `pop_per_requirement` for any ruleset that does not explicitly set it. Defaults to 6. +- `latejoin_delay_min`, `latejoin_delay_max` - The time range, in deciseconds (take your seconds, and multiply by 10), for a latejoin to attempt rolling. Once this timer is finished, a new one will be created within the same range. + - Suppose you have a `latejoin_delay_min` of 600 (60 seconds, 1 minute) and a `latejoin_delay_max` of 1800 (180 seconds, 3 minutes). Once the round starts, a random number in this range will be picked--let's suppose 1.5 minutes. After 1.5 minutes, Dynamic will decide if a latejoin threat should be created (a probability of `/datum/controller/subsystem/dynamic/proc/get_injection_chance()`). Regardless of its decision, a new timer will be started within the range of 1 to 3 minutes, repeatedly. +- `threat_curve_centre` - A number between -5 and +5. A negative value will give a more peaceful round and a positive value will give a round with higher threat. +- `threat_curve_width` - A number between 0.5 and 4. Higher value will favour extreme rounds and lower value rounds closer to the average. +- `roundstart_split_curve_centre` - A number between -5 and +5. Equivalent to threat_curve_centre, but for the budget split. A negative value will weigh towards midround rulesets, and a positive value will weight towards roundstart ones. +- `roundstart_split_curve_width` - A number between 0.5 and 4. Equivalent to threat_curve_width, but for the budget split. Higher value will favour more variance in splits and lower value rounds closer to the average. +- `random_event_hijack_minimum` - The minimum amount of time for antag random events to be hijacked. (See [Random Event Hijacking](#random-event-hijacking)) +- `random_event_hijack_maximum` - The maximum amount of time for antag random events to be hijacked. (See [Random Event Hijacking](#random-event-hijacking)) +- `hijacked_random_event_injection_chance` - The amount of injection chance to give to Dynamic when a random event is hijacked. (See [Random Event Hijacking](#random-event-hijacking)) +- `max_threat_level` - Sets the maximum amount of threat that can be rolled. Defaults to 100. You should only use this to *lower* the maximum threat, as raising it higher will not do anything. + +## Random Event "Hijacking" +Random events have the potential to be hijacked by Dynamic to keep the pace of midround injections, while also allowing greenshifts to contain some antagonists. + +`/datum/round_event_control/dynamic_should_hijack` is a variable to random events to allow Dynamic to hijack them, and defaults to FALSE. This is set to TRUE for random events that spawn antagonists. + +In `/datum/controller/subsystem/dynamic/on_pre_random_event` (in `dynamic_hijacking.dm`), Dynamic hooks to random events. If the `dynamic_should_hijack` variable is TRUE, the following sequence of events occurs: + +![Flow chart to describe the chain of events for Dynamic 2021 to take](https://github.com/tgstation/documentation-assets/blob/main/dynamic/random_event_hijacking.png) + +`n` is a random value between `random_event_hijack_minimum` and `random_event_hijack_maximum`. Heavy injection chance, should it need to be raised, is increased by `hijacked_random_event_injection_chance_modifier`. diff --git a/code/game/gamemodes/dynamic/ruleset_picking.dm b/code/controllers/subsystem/dynamic/ruleset_picking.dm similarity index 87% rename from code/game/gamemodes/dynamic/ruleset_picking.dm rename to code/controllers/subsystem/dynamic/ruleset_picking.dm index d6e2fd6b1f4..1a77a0288da 100644 --- a/code/game/gamemodes/dynamic/ruleset_picking.dm +++ b/code/controllers/subsystem/dynamic/ruleset_picking.dm @@ -1,4 +1,4 @@ -#define ADMIN_CANCEL_MIDROUND_TIME (180 SECONDS) //SKYRAT EDIT - ORIGINAL 10 SECONDS +#define ADMIN_CANCEL_MIDROUND_TIME (180 SECONDS) //NOVA EDIT - ORIGINAL 10 SECONDS /// /// @@ -8,7 +8,7 @@ * * * max_allowed_attempts - Allows you to configure how many times the proc will attempt to pick a ruleset before giving up. */ -/datum/game_mode/dynamic/proc/pick_ruleset(list/drafted_rules, max_allowed_attempts = INFINITY) +/datum/controller/subsystem/dynamic/proc/pick_ruleset(list/drafted_rules, max_allowed_attempts = INFINITY) if (only_ruleset_executed) log_dynamic("FAIL: only_ruleset_executed") return null @@ -52,7 +52,7 @@ return null /// Executes a random midround ruleset from the list of drafted rules. -/datum/game_mode/dynamic/proc/pick_midround_rule(list/drafted_rules, description) +/datum/controller/subsystem/dynamic/proc/pick_midround_rule(list/drafted_rules, description) log_dynamic("Rolling [drafted_rules.len] [description]") var/datum/dynamic_ruleset/rule = pick_ruleset(drafted_rules) @@ -66,7 +66,7 @@ ADMIN_CANCEL_MIDROUND_TIME, \ TIMER_STOPPABLE, \ ) - // SKYRAT EDIT REMOVAL BEGIN - Event notification + // NOVA EDIT REMOVAL BEGIN - Event notification /** log_dynamic("[rule] ruleset executing...") message_admins("DYNAMIC: Executing midround ruleset [rule] in [DisplayTimeText(ADMIN_CANCEL_MIDROUND_TIME)]. \ @@ -75,9 +75,9 @@ return rule */ - // SKYRAT EDIT REMOVAL END - Event notification + // NOVA EDIT REMOVAL END - Event notification - // SKYRAT EDIT ADDITION BEGIN - Event notification + // NOVA EDIT ADDITION BEGIN - Event notification message_admins("Dynamic Event triggering in [DisplayTimeText(ADMIN_CANCEL_MIDROUND_TIME)]: [rule]. (\ CANCEL | \ SOMETHING ELSE)") @@ -92,10 +92,10 @@ SOMETHING ELSE)") return rule - // SKYRAT EDIT ADDITION END - Event notification + // NOVA EDIT ADDITION END - Event notification /// Fired after admins do not cancel a midround injection. -/datum/game_mode/dynamic/proc/execute_midround_rule(datum/dynamic_ruleset/rule) +/datum/controller/subsystem/dynamic/proc/execute_midround_rule(datum/dynamic_ruleset/rule) current_midround_rulesets = null midround_injection_timer_id = null if (!rule.repeatable) @@ -103,7 +103,7 @@ addtimer(CALLBACK(src, PROC_REF(execute_midround_latejoin_rule), rule), rule.delay) /// Mainly here to facilitate delayed rulesets. All midround/latejoin rulesets are executed with a timered callback to this proc. -/datum/game_mode/dynamic/proc/execute_midround_latejoin_rule(sent_rule) +/datum/controller/subsystem/dynamic/proc/execute_midround_latejoin_rule(sent_rule) var/datum/dynamic_ruleset/rule = sent_rule spend_midround_budget(rule.cost, threat_log, "[worldtime2text()]: [rule.ruletype] [rule.name]") rule.pre_execute(GLOB.alive_player_list.len) @@ -129,7 +129,7 @@ return FALSE /// Fired when an admin cancels the current midround injection. -/datum/game_mode/dynamic/proc/admin_cancel_midround(mob/user, timer_id) +/datum/controller/subsystem/dynamic/proc/admin_cancel_midround(mob/user, timer_id) if (midround_injection_timer_id != timer_id || !deltimer(midround_injection_timer_id)) to_chat(user, span_notice("Too late!")) return @@ -140,7 +140,7 @@ current_midround_rulesets = null /// Fired when an admin requests a different midround injection. -/datum/game_mode/dynamic/proc/admin_different_midround(mob/user, timer_id) +/datum/controller/subsystem/dynamic/proc/admin_different_midround(mob/user, timer_id) if (midround_injection_timer_id != timer_id || !deltimer(midround_injection_timer_id)) to_chat(user, span_notice("Too late!")) return diff --git a/code/controllers/subsystem/economy.dm b/code/controllers/subsystem/economy.dm index f047d17d944..f8377302bd3 100644 --- a/code/controllers/subsystem/economy.dm +++ b/code/controllers/subsystem/economy.dm @@ -13,7 +13,7 @@ SUBSYSTEM_DEF(economy) ACCOUNT_MED = ACCOUNT_MED_NAME, ACCOUNT_SRV = ACCOUNT_SRV_NAME, ACCOUNT_CAR = ACCOUNT_CAR_NAME, - ACCOUNT_CMD = ACCOUNT_CMD_NAME, // SKYRAT EDIT + ACCOUNT_CMD = ACCOUNT_CMD_NAME, // NOVA EDIT ACCOUNT_SEC = ACCOUNT_SEC_NAME) var/list/departmental_accounts = list() /** diff --git a/code/controllers/subsystem/events.dm b/code/controllers/subsystem/events.dm index 98f847e4be6..037d3d09b96 100644 --- a/code/controllers/subsystem/events.dm +++ b/code/controllers/subsystem/events.dm @@ -17,7 +17,7 @@ SUBSYSTEM_DEF(events) ///Will wizard events be included in the event pool? var/wizardmode = FALSE - var/list/previously_run = list() //SKYRAT EDIT ADDITION + var/list/previously_run = list() //NOVA EDIT ADDITION /datum/controller/subsystem/events/Initialize() for(var/type in typesof(/datum/round_event_control)) @@ -60,7 +60,7 @@ SUBSYSTEM_DEF(events) scheduled = world.time + rand(frequency_lower, max(frequency_lower,frequency_upper)) //selects a random event based on whether it can occur and it's 'weight'(probability) -/datum/controller/subsystem/events/proc/spawnEvent(threat_override = FALSE) //SKYRAT EDIT CHANGE +/datum/controller/subsystem/events/proc/spawnEvent(threat_override = FALSE) //NOVA EDIT CHANGE set waitfor = FALSE //for the admin prompt if(!CONFIG_GET(flag/allow_random_events)) return @@ -73,10 +73,10 @@ SUBSYSTEM_DEF(events) for(var/datum/round_event_control/event_to_check in control) if(!event_to_check.can_spawn_event(players_amt)) continue - //SKYRAT EDIT ADDITION + //NOVA EDIT ADDITION if(threat_override && !event_to_check.alert_observers) continue - //SKYRAT EDIT END + //NOVA EDIT END if(event_to_check.weight < 0) //for round-start events etc. var/res = TriggerEvent(event_to_check) if(res == EVENT_INTERRUPTED) diff --git a/code/controllers/subsystem/explosions.dm b/code/controllers/subsystem/explosions.dm index 2021964609a..abc9918489d 100644 --- a/code/controllers/subsystem/explosions.dm +++ b/code/controllers/subsystem/explosions.dm @@ -441,10 +441,10 @@ SUBSYSTEM_DEF(explosions) if(EXPLODE_LIGHT) SSexplosions.lowturf += explode - //SKYRAT EDIT ADDITION + //NOVA EDIT ADDITION for(var/obj/machinery/light/iterating_light in explode) iterating_light.start_flickering() - //SKYRAT EDIT END + //NOVA EDIT END if(prob(40) && dist < flame_range && !isspaceturf(explode) && !explode.density) flameturf += explode diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm index 66d3f2e5e15..4f11a3ee577 100644 --- a/code/controllers/subsystem/garbage.dm +++ b/code/controllers/subsystem/garbage.dm @@ -337,7 +337,7 @@ SUBSYSTEM_DEF(garbage) /// Should be treated as a replacement for the 'del' keyword. /// /// Datums passed to this will be given a chance to clean up references to allow the GC to collect them. -/proc/qdel(datum/to_delete, force = FALSE, ...) +/proc/qdel(datum/to_delete, force = FALSE) if(!istype(to_delete)) del(to_delete) return @@ -359,7 +359,7 @@ SUBSYSTEM_DEF(garbage) var/start_time = world.time var/start_tick = world.tick_usage SEND_SIGNAL(to_delete, COMSIG_QDELETING, force) // Let the (remaining) components know about the result of Destroy - var/hint = to_delete.Destroy(arglist(args.Copy(2))) // Let our friend know they're about to get fucked up. + var/hint = to_delete.Destroy(force) // Let our friend know they're about to get fucked up. if(world.time != start_time) trash.slept_destroy++ diff --git a/code/controllers/subsystem/id_access.dm b/code/controllers/subsystem/id_access.dm index 86f2e124a8f..b2dadf4bcb8 100644 --- a/code/controllers/subsystem/id_access.dm +++ b/code/controllers/subsystem/id_access.dm @@ -330,7 +330,7 @@ SUBSYSTEM_DEF(id_access) desc_by_access["[ACCESS_CENT_CAPTAIN]"] = "Code Gold" desc_by_access["[ACCESS_CENT_BAR]"] = "Code Scotch" desc_by_access["[ACCESS_BIT_DEN]"] = "Bitrunner Den" - desc_by_access["[ACCESS_BARBER]"] = "Barber" // SKYRAT EDIT ADD - BARBER UPDATE + desc_by_access["[ACCESS_BARBER]"] = "Barber" // NOVA EDIT ADD - BARBER UPDATE /** * Returns the access bitflags associated with any given access level. diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm index 8376059e910..4f5308365c1 100644 --- a/code/controllers/subsystem/job.dm +++ b/code/controllers/subsystem/job.dm @@ -277,11 +277,11 @@ SUBSYSTEM_DEF(job) JobDebug("GRJ skipping command role, Player: [player], Job: [job]") continue - //SKYRAT EDIT ADDITION + //NOVA EDIT ADDITION if(job.departments_bitflags & DEPARTMENT_BITFLAG_CENTRAL_COMMAND) //If you want a CC position, select it! JobDebug("GRJ skipping Central Command role, Player: [player], Job: [job]") continue - //SKYRAT EDIT END + //NOVA EDIT END // This check handles its own output to JobDebug. if(check_job_eligibility(player, job, "GRJ", add_job_to_log = TRUE) != JOB_AVAILABLE) @@ -542,18 +542,18 @@ SUBSYSTEM_DEF(job) //Gives the player the stuff he should have with his rank /datum/controller/subsystem/job/proc/EquipRank(mob/living/equipping, datum/job/job, client/player_client) - // SKYRAT EDIT ADDITION BEGIN - ALTERNATIVE_JOB_TITLES + // NOVA EDIT ADDITION BEGIN - ALTERNATIVE_JOB_TITLES // The alt job title, if user picked one, or the default - var/alt_title = player_client?.prefs.alt_job_titles[job.title] - // SKYRAT EDIT ADDITION END + var/alt_title = player_client?.prefs.alt_job_titles?[job.title] || job.title + // NOVA EDIT ADDITION END equipping.job = job.title SEND_SIGNAL(equipping, COMSIG_JOB_RECEIVED, job) - equipping.mind?.set_assigned_role_with_greeting(job, player_client, alt_title) // SKYRAT EDIT CHANGE - ALTERNATIVE_JOB_TITLES - ORIGINAL: equipping.mind?.set_assigned_role_with_greeting(job, player_client) - equipping.on_job_equipping(job, player_client?.prefs, player_client) // SKYRAT EDIT CHANGE - ALTERNATIVE_JOB_TITLES - ORIGINAL: equipping.on_job_equipping(job) - job.announce_job(equipping, alt_title) // SKYRAT EDIT CHANGE - ALTERNATIVE_JOB_TITLES - ORIGINAL: job.announce_job(equipping) + equipping.mind?.set_assigned_role_with_greeting(job, player_client, alt_title) // NOVA EDIT CHANGE - ALTERNATIVE_JOB_TITLES - ORIGINAL: equipping.mind?.set_assigned_role_with_greeting(job, player_client) + equipping.on_job_equipping(job, player_client?.prefs, player_client) // NOVA EDIT CHANGE - ALTERNATIVE_JOB_TITLES - ORIGINAL: equipping.on_job_equipping(job) + job.announce_job(equipping, alt_title) // NOVA EDIT CHANGE - ALTERNATIVE_JOB_TITLES - ORIGINAL: job.announce_job(equipping) if(player_client?.holder) if(CONFIG_GET(flag/auto_deadmin_players) || (player_client.prefs?.toggles & DEADMIN_ALWAYS)) @@ -561,7 +561,7 @@ SUBSYSTEM_DEF(job) else handle_auto_deadmin_roles(player_client, job.title) - setup_alt_job_items(equipping, job, player_client) // SKYRAT EDIT ADDITION - ALTERNATIVE_JOB_TITLES + setup_alt_job_items(equipping, job, player_client) // NOVA EDIT ADDITION - ALTERNATIVE_JOB_TITLES job.after_spawn(equipping, player_client) /datum/controller/subsystem/job/proc/handle_auto_deadmin_roles(client/C, rank) @@ -592,7 +592,7 @@ SUBSYSTEM_DEF(job) var/ssc = CONFIG_GET(number/security_scaling_coeff) if(ssc > 0) if(J.spawn_positions > 0) - // SKYRAT EDIT - Reduced from 12 max sec to 7 max sec due to departmental security being deactivated and replaced. + // NOVA EDIT - Reduced from 12 max sec to 7 max sec due to departmental security being deactivated and replaced. var/officer_positions = min(7, max(J.spawn_positions, round(unassigned.len / ssc))) //Scale between configured minimum and 12 officers JobDebug("Setting open security officer positions to [officer_positions]") J.total_positions = officer_positions @@ -666,7 +666,7 @@ SUBSYSTEM_DEF(job) if(!run_divide_occupation_pure) to_chat(player, "You have failed to qualify for any job you desired.") player.ready = PLAYER_NOT_READY - player.client << output(player.ready, "lobby_browser:imgsrc") //SKYRAT EDIT ADDITION + player.client << output(player.ready, "lobby_browser:imgsrc") //NOVA EDIT ADDITION /datum/controller/subsystem/job/Recover() @@ -904,7 +904,7 @@ SUBSYSTEM_DEF(job) JobDebug("[debug_prefix] Error: [get_job_unavailable_error_message(JOB_UNAVAILABLE_AGE)], Player: [player][add_job_to_log ? ", Job: [possible_job]" : ""]") return JOB_UNAVAILABLE_AGE - //SKYRAT EDIT ADDITION BEGIN - CUSTOMIZATION + //NOVA EDIT ADDITION BEGIN - CUSTOMIZATION if(possible_job.veteran_only && !SSplayer_ranks.is_veteran(player.client)) JobDebug("[debug_prefix] Error: [get_job_unavailable_error_message(JOB_NOT_VETERAN)], Player: [player][add_job_to_log ? ", Job: [possible_job]" : ""]") return JOB_NOT_VETERAN @@ -931,7 +931,7 @@ SUBSYSTEM_DEF(job) return JOB_UNAVAILABLE_AUGMENT - //SKYRAT EDIT END + //NOVA EDIT END // Run this check after is_banned_from since it can query the DB which may sleep. diff --git a/code/controllers/subsystem/lag_switch.dm b/code/controllers/subsystem/lag_switch.dm index fdd9a9287e5..f59ead3a99b 100644 --- a/code/controllers/subsystem/lag_switch.dm +++ b/code/controllers/subsystem/lag_switch.dm @@ -124,13 +124,13 @@ SUBSYSTEM_DEF(lag_switch) to_chat(world, span_boldannounce("Footstep sounds have been disabled for performance concerns.")) else to_chat(world, span_boldannounce("Footstep sounds have been re-enabled.")) - // SKYRAT EDIT ADDITION + // NOVA EDIT ADDITION if (DISABLE_CREATOR) if (state) to_chat(world, span_boldannounce("The character creator and preferences menu has been disabled for performance metrics.")) else to_chat(world, span_boldannounce("The character creator has been re-enabled.")) - // SKYRAT EDIT END + // NOVA EDIT END return TRUE diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index cf1058f8a44..5881405da0b 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -405,24 +405,24 @@ Used by the AI doomsday and the self-destruct nuke. add_new_zlevel("[name][i ? " [i + 1]" : ""]", level, contain_turfs = FALSE) ++i - SSautomapper.preload_templates_from_toml(files) // SKYRAT EDIT ADDITION - We need to load our templates AFTER the Z level exists, otherwise, there is no z level to preload. - var/turf_blacklist = SSautomapper.get_turf_blacklists(files) // SKYRAT EDIT ADDITION - We use blacklisted turfs to carve out places for our templates. + SSautomapper.preload_templates_from_toml(files) // NOVA EDIT ADDITION - We need to load our templates AFTER the Z level exists, otherwise, there is no z level to preload. + var/turf_blacklist = SSautomapper.get_turf_blacklists(files) // NOVA EDIT ADDITION - We use blacklisted turfs to carve out places for our templates. // load the maps for (var/P in parsed_maps) var/datum/parsed_map/pm = P - pm.turf_blacklist = turf_blacklist // SKYRAT EDIT ADDITION - apply blacklist + pm.turf_blacklist = turf_blacklist // NOVA EDIT ADDITION - apply blacklist var/bounds = pm.bounds var/x_offset = bounds ? round(world.maxx / 2 - bounds[MAP_MAXX] / 2) + 1 : 1 var/y_offset = bounds ? round(world.maxy / 2 - bounds[MAP_MAXY] / 2) + 1 : 1 if (!pm.load(x_offset, y_offset, start_z + parsed_maps[P], no_changeturf = TRUE, new_z = TRUE)) errorList |= pm.original_path - // SKYRAT EDIT ADDITION BEGIN - We need to load our templates from cache after our space has been carved out. + // NOVA EDIT ADDITION BEGIN - We need to load our templates from cache after our space has been carved out. if(!LAZYLEN(errorList)) SSautomapper.load_templates_from_cache(files) - // SKYRAT EDIT ADDITION END + // NOVA EDIT ADDITION END if(!silent) - add_startup_message("Loaded [name] in [(REALTIMEOFDAY - start_time)/10]s!") //SKYRAT EDIT CHANGE + add_startup_message("Loaded [name] in [(REALTIMEOFDAY - start_time)/10]s!") //NOVA EDIT CHANGE return parsed_maps /datum/controller/subsystem/mapping/proc/loadWorld() @@ -434,7 +434,7 @@ Used by the AI doomsday and the self-destruct nuke. // load the station station_start = world.maxz + 1 - add_startup_message("Loading [config.map_name]...") // SKYRAT EDIT CHANGE + add_startup_message("Loading [config.map_name]...") // NOVA EDIT CHANGE LoadGroup(FailedZs, "Station", config.map_path, config.map_file, config.traits, ZTRAITS_STATION) if(SSdbcore.Connect()) diff --git a/code/controllers/subsystem/minor_mapping.dm b/code/controllers/subsystem/minor_mapping.dm index 8516ed98ea9..3f3d32d7bf4 100644 --- a/code/controllers/subsystem/minor_mapping.dm +++ b/code/controllers/subsystem/minor_mapping.dm @@ -11,7 +11,7 @@ SUBSYSTEM_DEF(minor_mapping) return SS_INIT_NO_NEED #else trigger_migration(CONFIG_GET(number/mice_roundstart)) - place_satchels(satchel_amount = 10) //SKYRAT EDIT CHANGE - ORIGINAL : place_satchels(satchel_amount = 2) + place_satchels(satchel_amount = 10) //NOVA EDIT CHANGE - ORIGINAL : place_satchels(satchel_amount = 2) return SS_INIT_SUCCESS #endif // the mice are easily the bigger problem, but let's just avoid anything that could cause some bullshit. diff --git a/code/controllers/subsystem/modular_computers.dm b/code/controllers/subsystem/modular_computers.dm index ad0be83bb52..678b26d24a4 100644 --- a/code/controllers/subsystem/modular_computers.dm +++ b/code/controllers/subsystem/modular_computers.dm @@ -1,12 +1,15 @@ -///The maximum amount of logs that can be generated before they start overwriting eachother. +s///The maximum amount of logs that can be generated before they start overwriting eachother. #define MAX_LOG_COUNT 300 SUBSYSTEM_DEF(modular_computers) name = "Modular Computers" - flags = SS_NO_FIRE - ///List of all ModPC logging - var/list/logs = list() + wait = 1 MINUTES + runlevels = RUNLEVEL_GAME + + ///List of all logs generated by ModPCs through the round. + ///Stops at MAX_LOG_COUNT and must be purged to keep logging. + var/list/modpc_logs = list() ///List of all programs available to download from the NTNet store. var/list/available_station_software = list() @@ -21,22 +24,105 @@ SUBSYSTEM_DEF(modular_computers) var/intrusion_detection_alarm = FALSE var/next_picture_id = 0 + ///Lazylist of coupons used by the Coupon Master PDA app. e.g. "COUPONCODE25" = coupon_code + var/list/discount_coupons + ///When will the next coupon drop? + var/next_discount = 0 + /datum/controller/subsystem/modular_computers/Initialize() build_software_lists() initialized = TRUE return SS_INIT_SUCCESS +/datum/controller/subsystem/modular_computers/fire(resumed = FALSE) + if(discount_coupons && world.time >= next_discount) + announce_coupon() + +///Generate new coupon codes that can be redeemed with the Coupon Master App +/datum/controller/subsystem/modular_computers/proc/announce_coupon() + //If there's no way to announce the coupon, we may as well skip it. + if(!length(GLOB.announcement_systems)) + return + var/obj/machinery/announcement_system/announcement_system = pick(GLOB.announcement_systems) + + var/static/list/discounts = list("0.10" = 7, "0.15" = 16, "0.20" = 20, "0.25" = 16, "0.50" = 8, "0.66" = 1) + var/static/list/flash_discounts = list("0.30" = 3, "0.40" = 8, "0.50" = 8, "0.66" = 2, "0.75" = 1) + ///Eliminates non-alphanumeri characters, as well as the word "Single-Pack" or "Pack" or "Crate" from the coupon code + var/static/regex/strip_pack_name = regex("\[^a-zA-Z0-9]|(Single-)?Pack|Crate", "g") + + var/datum/supply_pack/discounted_pack = pick(GLOB.discountable_packs[pick_weight(GLOB.pack_discount_odds)]) + var/pack_name = initial(discounted_pack.name) + var/chosen_discount + var/expires_in = 0 + if(prob(75)) + chosen_discount = text2num(pick_weight(discounts)) + if(prob(20)) + expires_in = rand(8,10) + else + chosen_discount = text2num(pick_weight(flash_discounts)) + expires_in = rand(2, 4) + var/coupon_code = "[uppertext(strip_pack_name.Replace(pack_name, ""))][chosen_discount*100]" + + var/list/targets = list() + for (var/messenger_ref in GLOB.pda_messengers) + var/datum/computer_file/program/messenger/messenger = GLOB.pda_messengers[messenger_ref] + if(locate(/datum/computer_file/program/coupon) in messenger?.computer.stored_files) + targets += messenger + + ///Don't go any further if the same coupon code has been done alrady or if there's no recipient for the 'promo'. + if((coupon_code in discount_coupons) || !length(targets)) + return + + var/datum/coupon_code/coupon = new(chosen_discount, discounted_pack, expires_in) + + discount_coupons[coupon_code] = coupon + + ///pda message code here + var/static/list/promo_messages = list( + "A new discount has dropped for %GOODY: %DISCOUNT.", + "Check this new offer out: %GOODY, now %DISCOUNT off.", + "Now on sales: %GOODY, at %DISCOUNT discount!", + "This item is now on sale (%DISCOUNT off): %GOODY.", + "Would you look at that! A %DISCOUNT discount on %GOODY!", + "Exclusive offer for %GOODY. Only %DISCOUNT! Get it now:", + "%GOODY is now %DISCOUNT off.", + "*RING* A new discount has dropped: %GOODY, %DISCOUNT off.", + "%GOODY - %DISCOUNT off." + ) + var/static/list/code_messages = list( + "Here's the code", + "Use this code to redeem it", + "Open the app to redeem it", + "Code", + "Redeem it now", + "Buy it now", + ) + + var/chosen_promo_message = replacetext(replacetext(pick(promo_messages), "%GOODY", pack_name), "%DISCOUNT", "[chosen_discount*100]%") + var/datum/signal/subspace/messaging/tablet_message/signal = new(announcement_system, list( + "fakename" = "Coupon Master", + "fakejob" = "Goodies Promotion", + "message" = "[chosen_promo_message] [pick(code_messages)]: [coupon_code][expires_in ? " (EXPIRES IN [expires_in] MINUTES)" : ""].", + "targets" = targets, + "automated" = TRUE, + )) + + signal.send_to_receivers() + + next_discount = world.time + rand(3, 5) MINUTES + + ///Finds all downloadable programs and adds them to their respective downloadable list. /datum/controller/subsystem/modular_computers/proc/build_software_lists() for(var/datum/computer_file/program/prog as anything in subtypesof(/datum/computer_file/program)) // Has no TGUI file so is not meant to be a downloadable thing. - if(!initial(prog.tgui_id)) + if(!initial(prog.tgui_id) || !initial(prog.filename)) continue prog = new prog - if(prog.available_on_ntnet) + if(prog.program_flags & PROGRAM_ON_NTNET_STORE) available_station_software.Add(prog) - if(prog.available_on_syndinet) + if(prog.program_flags & PROGRAM_ON_SYNDINET_STORE) available_antag_software.Add(prog) ///Attempts to find a new file through searching the available stores with its name. @@ -65,17 +151,17 @@ SUBSYSTEM_DEF(modular_computers) log_text += log_string log_string = log_text.Join() - logs.Add(log_string) + modpc_logs.Add(log_string) // We have too many logs, remove the oldest entries until we get into the limit - if(logs.len > MAX_LOG_COUNT) - logs = logs.Copy(logs.len - MAX_LOG_COUNT, 0) + if(modpc_logs.len > MAX_LOG_COUNT) + modpc_logs = modpc_logs.Copy(modpc_logs.len - MAX_LOG_COUNT, 0) /** * Removes all station logs and leaves it with an alert that it's been wiped. */ /datum/controller/subsystem/modular_computers/proc/purge_logs() - logs = list() + modpc_logs = list() add_log("-!- LOGS DELETED BY SYSTEM OPERATOR -!-") /** diff --git a/code/controllers/subsystem/movement/movement_types.dm b/code/controllers/subsystem/movement/movement_types.dm index de8e4531236..bf4b6a43029 100644 --- a/code/controllers/subsystem/movement/movement_types.dm +++ b/code/controllers/subsystem/movement/movement_types.dm @@ -323,6 +323,7 @@ turf/avoid, skip_first, subsystem, + diagonal_handling, priority, flags, datum/extra_info, @@ -343,6 +344,7 @@ simulated_only, avoid, skip_first, + diagonal_handling, initial_path) /datum/move_loop/has_target/jps @@ -360,6 +362,8 @@ var/turf/avoid ///Should we skip the first step? This is the tile we're currently on, which breaks some things var/skip_first + ///Whether we replace diagonal movements with cardinal movements or follow through with them + var/diagonal_handling ///A list for the path we're currently following var/list/movement_path ///Cooldown for repathing, prevents spam @@ -373,7 +377,7 @@ . = ..() on_finish_callbacks += CALLBACK(src, PROC_REF(on_finish_pathing)) -/datum/move_loop/has_target/jps/setup(delay, timeout, atom/chasing, repath_delay, max_path_length, minimum_distance, list/access, simulated_only, turf/avoid, skip_first, list/initial_path) +/datum/move_loop/has_target/jps/setup(delay, timeout, atom/chasing, repath_delay, max_path_length, minimum_distance, list/access, simulated_only, turf/avoid, skip_first, diagonal_handling, list/initial_path) . = ..() if(!.) return @@ -384,6 +388,7 @@ src.simulated_only = simulated_only src.avoid = avoid src.skip_first = skip_first + src.diagonal_handling = diagonal_handling movement_path = initial_path?.Copy() /datum/move_loop/has_target/jps/compare_loops(datum/move_loop/loop_type, priority, flags, extra_info, delay, timeout, atom/chasing, repath_delay, max_path_length, minimum_distance, list/access, simulated_only, turf/avoid, skip_first, initial_path) @@ -410,7 +415,7 @@ if(!COOLDOWN_FINISHED(src, repath_cooldown)) return COOLDOWN_START(src, repath_cooldown, repath_delay) - if(SSpathfinder.pathfind(moving, target, max_path_length, minimum_distance, access, simulated_only, avoid, skip_first, on_finish = on_finish_callbacks)) + if(SSpathfinder.pathfind(moving, target, max_path_length, minimum_distance, access, simulated_only, avoid, skip_first, diagonal_handling, on_finish = on_finish_callbacks)) is_pathing = TRUE SEND_SIGNAL(src, COMSIG_MOVELOOP_JPS_REPATH) @@ -418,6 +423,7 @@ /datum/move_loop/has_target/jps/proc/on_finish_pathing(list/path) movement_path = path is_pathing = FALSE + SEND_SIGNAL(src, COMSIG_MOVELOOP_JPS_FINISHED_PATHING, path) /datum/move_loop/has_target/jps/move() if(!length(movement_path)) diff --git a/code/controllers/subsystem/persistence/_persistence.dm b/code/controllers/subsystem/persistence/_persistence.dm index 565cf519d4b..fbc094f5b53 100644 --- a/code/controllers/subsystem/persistence/_persistence.dm +++ b/code/controllers/subsystem/persistence/_persistence.dm @@ -20,8 +20,23 @@ SUBSYSTEM_DEF(persistence) var/list/blocked_maps = list() var/list/saved_trophies = list() var/list/picture_logging_information = list() - var/list/obj/structure/sign/picture_frame/photo_frames - var/list/obj/item/storage/photo_album/photo_albums + + /// A json_database linking to data/photo_frames.json. + /// Schema is persistence_id => array of photo names. + var/datum/json_database/photo_frames_database + + /// A lazy list of every picture frame that is going to be loaded with persistent photos. + /// Will be null'd once the persistence system initializes, and never read from again. + var/list/obj/structure/sign/picture_frame/queued_photo_frames + + /// A json_database linking to data/photo_albums.json. + /// Schema is persistence_id => array of photo names. + var/datum/json_database/photo_albums_database + + /// A lazy list of every photo album that is going to be loaded with persistent photos. + /// Will be null'd once the persistence system initializes, and never read from again. + var/list/obj/item/storage/photo_album/queued_photo_albums + var/rounds_since_engine_exploded = 0 var/delam_highscore = 0 var/tram_hits_this_round = 0 @@ -37,7 +52,7 @@ SUBSYSTEM_DEF(persistence) load_randomized_recipes() load_custom_outfits() load_delamination_counter() - load_panic_bunker() //SKYRAT EDIT ADDITION - PANICBUNKER + load_panic_bunker() //NOVA EDIT ADDITION - PANICBUNKER load_tram_counter() load_adventures() return SS_INIT_SUCCESS @@ -48,17 +63,16 @@ SUBSYSTEM_DEF(persistence) save_prisoner_tattoos() collect_trophies() collect_maps() - save_photo_persistence() //THIS IS PERSISTENCE, NOT THE LOGGING PORTION. save_randomized_recipes() save_scars() save_custom_outfits() - save_modular_persistence() // SKYRAT EDIT ADDITION - MODULAR_PERSISTENCE + save_modular_persistence() // NOVA EDIT ADDITION - MODULAR_PERSISTENCE save_delamination_counter() if(SStransport.can_fire) for(var/datum/transport_controller/linear/tram/transport as anything in SStransport.transports_by_type[TRANSPORT_TYPE_TRAM]) save_tram_history(transport.specific_transport_id) save_tram_counter() - save_panic_bunker() //SKYRAT EDIT ADDITION - PANICBUNKER + save_panic_bunker() //NOVA EDIT ADDITION - PANICBUNKER ///Loads up Poly's speech buffer. /datum/controller/subsystem/persistence/proc/load_poly() diff --git a/code/controllers/subsystem/persistence/photo_albums.dm b/code/controllers/subsystem/persistence/photo_albums.dm index 3aee856b2c2..90c8ec31ac1 100644 --- a/code/controllers/subsystem/persistence/photo_albums.dm +++ b/code/controllers/subsystem/persistence/photo_albums.dm @@ -1,15 +1,3 @@ -///Loads up the photo album source file. -/datum/controller/subsystem/persistence/proc/get_photo_albums() - var/album_path = file("data/photo_albums.json") - if(fexists(album_path)) - return json_decode(file2text(album_path)) - -///Loads up the photo frames source file. -/datum/controller/subsystem/persistence/proc/get_photo_frames() - var/frame_path = file("data/photo_frames.json") - if(fexists(frame_path)) - return json_decode(file2text(frame_path)) - /// Removes the identifier of a persistent photo frame from the json. /datum/controller/subsystem/persistence/proc/remove_photo_frames(identifier) var/frame_path = file("data/photo_frames.json") @@ -25,62 +13,23 @@ ///Loads photo albums, and populates them; also loads and applies frames to picture frames. /datum/controller/subsystem/persistence/proc/load_photo_persistence() - var/album_path = file("data/photo_albums.json") - var/frame_path = file("data/photo_frames.json") - if(fexists(album_path)) - var/list/json = json_decode(file2text(album_path)) - if(json.len) - for(var/i in photo_albums) - var/obj/item/storage/photo_album/A = i - if(!A.persistence_id) - continue - if(json[A.persistence_id]) - A.populate_from_id_list(json[A.persistence_id]) - - if(fexists(frame_path)) - var/list/json = json_decode(file2text(frame_path)) - if(json.len) - for(var/i in photo_frames) - var/obj/structure/sign/picture_frame/PF = i - if(!PF.persistence_id) - continue - if(json[PF.persistence_id]) - PF.load_from_id(json[PF.persistence_id]) - -///Saves the contents of photo albums and the picture frames. -/datum/controller/subsystem/persistence/proc/save_photo_persistence() - var/album_path = file("data/photo_albums.json") - var/frame_path = file("data/photo_frames.json") - - var/list/frame_json = list() - var/list/album_json = list() - - if(fexists(album_path)) - album_json = json_decode(file2text(album_path)) - fdel(album_path) - - for(var/i in photo_albums) - var/obj/item/storage/photo_album/A = i - if(!istype(A) || !A.persistence_id) + photo_albums_database = new("data/photo_albums.json") + for (var/obj/item/storage/photo_album/album as anything in queued_photo_albums) + if (isnull(album.persistence_id)) continue - var/list/L = A.get_picture_id_list() - album_json[A.persistence_id] = L - - album_json = json_encode(album_json) - - WRITE_FILE(album_path, album_json) - if(fexists(frame_path)) - frame_json = json_decode(file2text(frame_path)) - fdel(frame_path) + var/album_data = photo_albums_database.get_key(album.persistence_id) + if (!isnull(album_data)) + album.populate_from_id_list(album_data) - for(var/i in photo_frames) - var/obj/structure/sign/picture_frame/F = i - if(!istype(F) || !F.persistence_id) + photo_frames_database = new("data/photo_frames.json") + for (var/obj/structure/sign/picture_frame/frame as anything in queued_photo_frames) + if (isnull(frame.persistence_id)) continue - frame_json[F.persistence_id] = F.get_photo_id() - frame_json = json_encode(frame_json) - - WRITE_FILE(frame_path, frame_json) + var/frame_data = photo_frames_database.get_key(frame.persistence_id) + if (!isnull(frame_data)) + frame.load_from_id(frame_data) + queued_photo_albums = null + queued_photo_frames = null diff --git a/code/controllers/subsystem/polling.dm b/code/controllers/subsystem/polling.dm new file mode 100644 index 00000000000..1eab3fb8f0d --- /dev/null +++ b/code/controllers/subsystem/polling.dm @@ -0,0 +1,234 @@ +SUBSYSTEM_DEF(polling) + name = "Polling" + flags = SS_BACKGROUND | SS_NO_INIT + wait = 1 SECONDS + runlevels = RUNLEVEL_GAME + /// List of polls currently ongoing, to be checked on next fire() + var/list/datum/candidate_poll/currently_polling + /// Number of polls performed since the start + var/total_polls = 0 + +/datum/controller/subsystem/polling/fire() + if(!currently_polling) // if polls_active is TRUE then this shouldn't happen, but still.. + currently_polling = list() + + for(var/datum/candidate_poll/running_poll as anything in currently_polling) + if(running_poll.time_left() <= 0) + polling_finished(running_poll) + +/datum/controller/subsystem/polling/proc/poll_candidates(question, role, check_jobban, poll_time = 30 SECONDS, ignore_category = null, flash_window = TRUE, list/group = null, pic_source, role_name_text) + if(group.len == 0) + return list() + if(role && !role_name_text) + role_name_text = role + if(role_name_text && !question) + question = "Do you want to play as [full_capitalize(role_name_text)]?" + if(!question) + question = "Do you want to play as a special role?" + log_game("Polling candidates [role_name_text ? "for [role_name_text]" : "\"[question]\""] for [DisplayTimeText(poll_time)] seconds") + + // Start firing + total_polls++ + + var/jumpable = isatom(pic_source) ? pic_source : null + + var/datum/candidate_poll/new_poll = new(role_name_text, question, poll_time, ignore_category, jumpable) + LAZYADD(currently_polling, new_poll) + + var/category = "[new_poll.poll_key]_poll_alert" + + for(var/mob/candidate_mob as anything in group) + if(!candidate_mob.client) + continue + // Universal opt-out for all players. + if((!candidate_mob.client.prefs.read_preference(/datum/preference/toggle/ghost_roles))) + continue + // 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) + continue + if(!is_eligible(candidate_mob, role, check_jobban, ignore_category)) + continue + + SEND_SOUND(candidate_mob, 'sound/misc/notice2.ogg') + if(flash_window) + window_flash(candidate_mob.client) + + // If we somehow send two polls for the same mob type, but with a duration on the second one shorter than the time left on the first one, + // we need to keep the first one's timeout rather than use the shorter one + var/atom/movable/screen/alert/poll_alert/current_alert = LAZYACCESS(candidate_mob.alerts, category) + var/alert_time = poll_time + var/datum/candidate_poll/alert_poll = new_poll + if(current_alert && current_alert.timeout > (world.time + poll_time - world.tick_lag)) + alert_time = current_alert.timeout - world.time + world.tick_lag + alert_poll = current_alert.poll + + // Send them an on-screen alert + var/atom/movable/screen/alert/poll_alert/poll_alert_button = candidate_mob.throw_alert(category, /atom/movable/screen/alert/poll_alert, timeout_override = alert_time, no_anim = TRUE) + if(!poll_alert_button) + continue + + new_poll.alert_buttons += poll_alert_button + new_poll.RegisterSignal(poll_alert_button, COMSIG_QDELETING, TYPE_PROC_REF(/datum/candidate_poll, clear_alert_ref)) + + poll_alert_button.icon = ui_style2icon(candidate_mob.client?.prefs?.read_preference(/datum/preference/choiced/ui_style)) + poll_alert_button.desc = "[question]" + poll_alert_button.show_time_left = TRUE + poll_alert_button.poll = alert_poll + poll_alert_button.set_role_overlay() + poll_alert_button.update_stacks_overlay() + + + // Sign up inheritance and stacking + for(var/datum/candidate_poll/other_poll as anything in currently_polling) + if(new_poll == other_poll || new_poll.poll_key != other_poll.poll_key) + continue + // If there's already a poll for an identical mob type ongoing and the client is signed up for it, sign them up for this one + if((candidate_mob in other_poll.signed_up) && new_poll.sign_up(candidate_mob, TRUE)) + break + + // Image to display + var/image/poll_image + if(pic_source) + if(!ispath(pic_source)) + var/atom/the_pic_source = pic_source + var/old_layer = the_pic_source.layer + var/old_plane = the_pic_source.plane + the_pic_source.plane = poll_alert_button.plane + the_pic_source.layer = FLOAT_LAYER + poll_alert_button.add_overlay(the_pic_source) + the_pic_source.layer = old_layer + the_pic_source.plane = old_plane + else + poll_image = image(pic_source, layer = FLOAT_LAYER) + else + // Just use a generic image + poll_image = image('icons/effects/effects.dmi', icon_state = "static", layer = FLOAT_LAYER) + + if(poll_image) + poll_image.plane = poll_alert_button.plane + poll_alert_button.add_overlay(poll_image) + + // Chat message + var/act_jump = "" + if(isatom(pic_source) && isobserver(candidate_mob)) + act_jump = "\[Teleport]" + var/act_signup = "\[Sign Up]" + var/act_never = "" + if(ignore_category) + act_never = "\[Never For This Round]" + to_chat(candidate_mob, span_boldnotice(examine_block("Now looking for candidates [role_name_text ? "to play as \an [role_name_text]." : "\"[question]\""] [act_jump] [act_signup] [act_never]"))) + + // Start processing it so it updates visually the timer + START_PROCESSING(SSprocessing, poll_alert_button) + + // Sleep until the time is up + UNTIL(new_poll.finished) + return new_poll.signed_up + +/datum/controller/subsystem/polling/proc/poll_ghost_candidates(question, role, check_jobban, poll_time = 30 SECONDS, ignore_category = null, flashwindow = TRUE, pic_source, role_name_text) + var/list/candidates = list() + if(!(GLOB.ghost_role_flags & GHOSTROLE_STATION_SENTIENCE)) + return candidates + + for(var/mob/dead/observer/ghost_player in GLOB.player_list) + candidates += ghost_player + + return poll_candidates(question, role, check_jobban, poll_time, ignore_category, flashwindow, candidates, pic_source, role_name_text) + +/datum/controller/subsystem/polling/proc/poll_ghost_candidates_for_mob(question, role, check_jobban, poll_time = 30 SECONDS, mob/target_mob, ignore_category = null, flashwindow = TRUE, pic_source, role_name_text) + var/static/list/mob/currently_polling_mobs = list() + + if(currently_polling_mobs.Find(target_mob)) + return list() + + currently_polling_mobs += target_mob + + var/list/possible_candidates = poll_ghost_candidates(question, role, check_jobban, poll_time, ignore_category, flashwindow, pic_source, role_name_text) + + currently_polling_mobs -= target_mob + if(!target_mob || QDELETED(target_mob) || !target_mob.loc) + return list() + + return possible_candidates + +/datum/controller/subsystem/polling/proc/poll_ghost_candidates_for_mobs(question, role, check_jobban, poll_time = 30 SECONDS, list/mobs, ignore_category = null, pic_source, role_name_text) + var/list/candidate_list = poll_ghost_candidates(question, role, check_jobban, poll_time, ignore_category, pic_source, role_name_text) + + for(var/mob/potential_mob as anything in mobs) + if(QDELETED(potential_mob) || !potential_mob.loc) + mobs -= potential_mob + + if(!length(mobs)) + return list() + + return candidate_list + +/datum/controller/subsystem/polling/proc/is_eligible(mob/potential_candidate, role, check_jobban, the_ignore_category) + if(isnull(potential_candidate.key) || isnull(potential_candidate.client)) + return FALSE + if(the_ignore_category) + if(potential_candidate.ckey in GLOB.poll_ignore[the_ignore_category]) + return FALSE + // NOVA EDIT ADDITION BEGIN + if(is_banned_from(potential_candidate.ckey, BAN_GHOST_TAKEOVER) || is_banned_from(potential_candidate.ckey, BAN_ANTAGONIST)) + to_chat(potential_candidate, "There was a ghost prompt for: [role], unfortunately you are banned from ghost takeovers.") + return FALSE + // NOVA EDIT ADDITION END + if(role) + if(!(role in potential_candidate.client.prefs.be_special)) + return FALSE + var/required_time = GLOB.special_roles[role] || 0 + if(potential_candidate.client && potential_candidate.client.get_remaining_days(required_time) > 0) + return FALSE + + if(check_jobban) + if(is_banned_from(potential_candidate.ckey, list(check_jobban, ROLE_SYNDICATE))) + return FALSE + + return TRUE + +/datum/controller/subsystem/polling/proc/polling_finished(datum/candidate_poll/finishing_poll) + currently_polling -= finishing_poll + // Trim players who aren't eligible anymore + var/length_pre_trim = length(finishing_poll.signed_up) + finishing_poll.trim_candidates() + log_game("Candidate poll [finishing_poll.role ? "for [finishing_poll.role]" : "\"[finishing_poll.question]\""] finished. [length_pre_trim] players signed up, [length(finishing_poll.signed_up)] after trimming") + finishing_poll.finished = TRUE + + // Take care of updating the remaining screen alerts if a similar poll is found, or deleting them. + if(length(finishing_poll.alert_buttons)) + var/polls_of_same_type_left = FALSE + for(var/datum/candidate_poll/running_poll as anything in currently_polling) + if(running_poll.poll_key == finishing_poll.poll_key && running_poll.time_left() > 0) + polls_of_same_type_left = TRUE + break + for(var/atom/movable/screen/alert/poll_alert/alert as anything in finishing_poll.alert_buttons) + if(polls_of_same_type_left) + alert.update_stacks_overlay() + else + alert.owner.clear_alert("[finishing_poll.poll_key]_poll_alert") + + //More than enough time for the the `UNTIL()` stopping loop in `poll_candidates()` to be over, and the results to be turned in. + QDEL_IN(finishing_poll, 0.5 SECONDS) + +/datum/controller/subsystem/polling/stat_entry(msg) + msg += "Active: [length(currently_polling)] | Total: [total_polls]" + var/datum/candidate_poll/soonest_to_complete = get_next_poll_to_finish() + if(soonest_to_complete) + msg += " | Next: [DisplayTimeText(soonest_to_complete.time_left())] ([length(soonest_to_complete.signed_up)] candidates)" + return ..() + +/datum/controller/subsystem/polling/proc/get_next_poll_to_finish() + var/lowest_time_left = INFINITY + var/next_poll_to_finish + for(var/datum/candidate_poll/poll as anything in currently_polling) + var/time_left = poll.time_left() + if(time_left >= lowest_time_left) + continue + lowest_time_left = time_left + next_poll_to_finish = poll + + if(isnull(next_poll_to_finish)) + return FALSE + + return next_poll_to_finish diff --git a/code/controllers/subsystem/processing/quirks.dm b/code/controllers/subsystem/processing/quirks.dm index f6a47fc7f8a..fd77c26c634 100644 --- a/code/controllers/subsystem/processing/quirks.dm +++ b/code/controllers/subsystem/processing/quirks.dm @@ -12,10 +12,10 @@ GLOBAL_LIST_INIT_TYPED(quirk_blacklist, /list/datum/quirk, list( list(/datum/quirk/item_quirk/clown_enjoyer, /datum/quirk/item_quirk/mime_fan, /datum/quirk/item_quirk/pride_pin), list(/datum/quirk/bad_touch, /datum/quirk/friendly), list(/datum/quirk/extrovert, /datum/quirk/introvert), - list(/datum/quirk/prosthetic_limb, /datum/quirk/quadruple_amputee, /datum/quirk/body_purist), + list(/datum/quirk/prosthetic_limb, /datum/quirk/quadruple_amputee, /datum/quirk/transhumanist, /datum/quirk/body_purist), list(/datum/quirk/prosthetic_organ, /datum/quirk/tin_man, /datum/quirk/body_purist), list(/datum/quirk/quadruple_amputee, /datum/quirk/paraplegic, /datum/quirk/hemiplegic), - //list(/datum/quirk/quadruple_amputee, /datum/quirk/frail), // SKYRAT EDIT REMOVAL- Since we have synth wounds now, frail has a large downside for prosthetics and such + //list(/datum/quirk/quadruple_amputee, /datum/quirk/frail), // NOVA EDIT REMOVAL- Since we have synth wounds now, frail has a large downside for prosthetics and such list(/datum/quirk/social_anxiety, /datum/quirk/mute), list(/datum/quirk/mute, /datum/quirk/softspoken), list(/datum/quirk/poor_aim, /datum/quirk/bighands), @@ -24,7 +24,7 @@ GLOBAL_LIST_INIT_TYPED(quirk_blacklist, /list/datum/quirk, list( list(/datum/quirk/photophobia, /datum/quirk/nyctophobia), list(/datum/quirk/item_quirk/settler, /datum/quirk/freerunning), list(/datum/quirk/numb, /datum/quirk/selfaware), - //SKYRAT EDIT ADDITION BEGIN + //NOVA EDIT ADDITION BEGIN list(/datum/quirk/equipping/nerve_staple, /datum/quirk/nonviolent), list(/datum/quirk/equipping/nerve_staple, /datum/quirk/item_quirk/nearsighted), list(/datum/quirk/no_guns, /datum/quirk/bighands, /datum/quirk/poor_aim), @@ -32,7 +32,7 @@ GLOBAL_LIST_INIT_TYPED(quirk_blacklist, /list/datum/quirk, list( list(/datum/quirk/spacer_born, /datum/quirk/oversized), list(/datum/quirk/feline_aspect, /datum/quirk/item_quirk/canine, /datum/quirk/item_quirk/avian), list(/datum/quirk/all_nighter, /datum/quirk/heavy_sleeper), - //SKYRAT EDIT ADDITION END + //NOVA EDIT ADDITION END )) GLOBAL_LIST_INIT(quirk_string_blacklist, generate_quirk_string_blacklist()) @@ -83,13 +83,13 @@ PROCESSING_SUBSYSTEM_DEF(quirks) if(initial(quirk_type.abstract_parent_type) == type) continue - // SKYRAT EDIT ADDITION START + // NOVA EDIT ADDITION START if(initial(quirk_type.erp_quirk) && CONFIG_GET(flag/disable_erp_preferences)) continue // Hidden quirks aren't visible to TGUI or the player if (initial(quirk_type.hidden_quirk)) continue - // SKYRAT EDIT ADDITION END + // NOVA EDIT ADDITION END quirks[initial(quirk_type.name)] = quirk_type quirk_points[initial(quirk_type.name)] = initial(quirk_type.value) @@ -106,7 +106,7 @@ PROCESSING_SUBSYSTEM_DEF(quirks) var/datum/quirk/quirk_type = quirks[quirk_name] if(ispath(quirk_type)) if(user.add_quirk(quirk_type, override_client = applied_client)) - SSblackbox.record_feedback("nested tally", "quirks_taken", 1, list("[quirk_name]")) + SSblackbox.record_feedback("tally", "quirks_taken", 1, "[quirk_name]") else stack_trace("Invalid quirk \"[quirk_name]\" in client [applied_client.ckey] preferences") applied_client.prefs.all_quirks -= quirk_name @@ -181,18 +181,18 @@ PROCESSING_SUBSYSTEM_DEF(quirks) /// be valid. /// If no changes need to be made, will return the same list. /// Expects all quirk names to be unique, but makes no other expectations. -/datum/controller/subsystem/processing/quirks/proc/filter_invalid_quirks(list/quirks, list/augments) // SKYRAT EDIT - AUGMENTS+ +/datum/controller/subsystem/processing/quirks/proc/filter_invalid_quirks(list/quirks, list/augments) // NOVA EDIT - AUGMENTS+ var/list/new_quirks = list() var/list/positive_quirks = list() var/balance = 0 var/list/all_quirks = get_quirks() - // SKYRAT EDIT BEGIN - AUGMENTS+ + // NOVA EDIT BEGIN - AUGMENTS+ for(var/key in augments) var/datum/augment_item/aug = GLOB.augment_items[augments[key]] balance += aug.cost - // SKYRAT EDIT END + // NOVA EDIT END for (var/quirk_name in quirks) var/datum/quirk/quirk = all_quirks[quirk_name] if (isnull(quirk)) diff --git a/code/controllers/subsystem/processing/reagents.dm b/code/controllers/subsystem/processing/reagents.dm index c4b86a23efc..20244c12bb5 100644 --- a/code/controllers/subsystem/processing/reagents.dm +++ b/code/controllers/subsystem/processing/reagents.dm @@ -18,7 +18,7 @@ PROCESSING_SUBSYSTEM_DEF(reagents) //Build GLOB lists - see holder.dm build_chemical_reactions_lists() - // SKYRAT EDIT ADDITION START + // NOVA EDIT ADDITION START if(CONFIG_GET(flag/disable_erp_preferences)) for(var/reaction_path in GLOB.chemical_reactions_list) var/datum/chemical_reaction/reaction_datum = GLOB.chemical_reactions_list[reaction_path] @@ -29,7 +29,7 @@ PROCESSING_SUBSYSTEM_DEF(reagents) var/list/reaction_list = GLOB.chemical_reactions_list_reactant_index[reaction] if(reaction_list) reaction_list -= reaction_datum - // SKYRAT EDIT ADDITION END + // NOVA EDIT ADDITION END return SS_INIT_SUCCESS /datum/controller/subsystem/processing/reagents/fire(resumed = FALSE) diff --git a/code/controllers/subsystem/shuttle.dm b/code/controllers/subsystem/shuttle.dm index b1ebf3d586c..bb88e8d6824 100644 --- a/code/controllers/subsystem/shuttle.dm +++ b/code/controllers/subsystem/shuttle.dm @@ -147,10 +147,10 @@ SUBSYSTEM_DEF(shuttle) while(length(pack_processing)) var/datum/supply_pack/pack = pack_processing[length(pack_processing)] pack_processing.len-- - //SKYRAT EDIT START + //NOVA EDIT START if(pack == /datum/supply_pack/armament) continue - //SKYRAT EDIT END + //NOVA EDIT END if(ispath(pack, /datum/supply_pack)) pack = new pack @@ -279,7 +279,7 @@ SUBSYSTEM_DEF(shuttle) priority_announce( text = "Emergency shuttle uplink interference detected, shuttle call disabled while the system reinitializes. Estimated restore in [DisplayTimeText(lockout_timer, round_seconds_to = 60)].", title = "Uplink Interference", - sound = ANNOUNCER_SHUTTLE, // SKYRAT EDIT CHANGE - Announcer Sounds - ORIGINAL: sound = 'sound/misc/announce_dig.ogg', + sound = ANNOUNCER_SHUTTLE, // NOVA EDIT CHANGE - Announcer Sounds - ORIGINAL: sound = 'sound/misc/announce_dig.ogg', sender_override = "Emergency Shuttle Uplink Alert", color_override = "grey", ) @@ -293,7 +293,7 @@ SUBSYSTEM_DEF(shuttle) priority_announce( text= "Emergency shuttle uplink services are now back online.", title = "Uplink Restored", - sound = ANNOUNCER_SHUTTLE, // SKYRAT EDIT CHANGE - Announcer Sounds - ORIGINAL: sound = 'sound/misc/announce_dig.ogg', + sound = ANNOUNCER_SHUTTLE, // NOVA EDIT CHANGE - Announcer Sounds - ORIGINAL: sound = 'sound/misc/announce_dig.ogg', sender_override = "Emergency Shuttle Uplink Alert", color_override = "green", ) @@ -447,9 +447,9 @@ SUBSYSTEM_DEF(shuttle) return if(SEC_LEVEL_BLUE) //if(emergency.timeLeft(1) < emergency_call_time * 0.5) ORIGINAL - if(emergency.timeLeft(1) < emergency_call_time * 0.6) //SKYRAT EDIT CHANGE - ALERTS + if(emergency.timeLeft(1) < emergency_call_time * 0.6) //NOVA EDIT CHANGE - ALERTS return - //SKYRAT EDIT ADDITION BEGIN - ALERTS + //NOVA EDIT ADDITION BEGIN - ALERTS if(SEC_LEVEL_ORANGE) if(emergency.timeLeft(1) < emergency_call_time * 0.4) return @@ -459,7 +459,7 @@ SUBSYSTEM_DEF(shuttle) if(SEC_LEVEL_AMBER) if(emergency.timeLeft(1) < emergency_call_time * 0.4) return - //SKYRAT EDIT ADDITION END + //NOVA EDIT ADDITION END else if(emergency.timeLeft(1) < emergency_call_time * 0.25) return diff --git a/code/controllers/subsystem/spatial_gridmap.dm b/code/controllers/subsystem/spatial_gridmap.dm index 64f7994a1fe..81ae29f6bad 100644 --- a/code/controllers/subsystem/spatial_gridmap.dm +++ b/code/controllers/subsystem/spatial_gridmap.dm @@ -44,7 +44,7 @@ client_contents = dummy_list atmos_contents = dummy_list -/datum/spatial_grid_cell/Destroy(force, ...) +/datum/spatial_grid_cell/Destroy(force) if(force)//the response to someone trying to qdel this is a right proper fuck you stack_trace("dont try to destroy spatial grid cells without a good reason. if you need to do it use force") return diff --git a/code/controllers/subsystem/statpanel.dm b/code/controllers/subsystem/statpanel.dm index 3f155695257..d652df3a567 100644 --- a/code/controllers/subsystem/statpanel.dm +++ b/code/controllers/subsystem/statpanel.dm @@ -23,7 +23,7 @@ SUBSYSTEM_DEF(statpanels) if (!resumed) num_fires++ var/datum/map_config/cached = SSmapping.next_map_config - /* SKYRAT EDIT CHANGE + /* NOVA EDIT CHANGE global_data = list( "Map: [SSmapping.config?.map_name || "Loading..."]", cached ? "Next Map: [cached.map_name]" : null, @@ -50,7 +50,7 @@ SUBSYSTEM_DEF(statpanels) "Round Timer: [round_time > MIDNIGHT_ROLLOVER ? "[round(round_time/MIDNIGHT_ROLLOVER)]:[worldtime2text()]" : worldtime2text()]", "Actual Round Timer: [time2text(real_round_time, "hh:mm:ss", 0)]" ) - // SKYRAT EDIT END + // NOVA EDIT END if(SSshuttle.emergency) var/ETA = SSshuttle.emergency.getModeStr() @@ -341,7 +341,7 @@ SUBSYSTEM_DEF(statpanels) . = ..() src.parent = parent -/datum/object_window_info/Destroy(force, ...) +/datum/object_window_info/Destroy(force) atoms_to_show = null atoms_to_images = null atoms_to_imagify = null diff --git a/code/controllers/subsystem/throwing.dm b/code/controllers/subsystem/throwing.dm index 60c8ecbf84c..b391200d6cf 100644 --- a/code/controllers/subsystem/throwing.dm +++ b/code/controllers/subsystem/throwing.dm @@ -58,7 +58,7 @@ SUBSYSTEM_DEF(throwing) ///Turfs to travel per tick var/speed ///If a mob is the one who has thrown the object, then it's moved here. This can be null and must be null checked before trying to use it. - var/mob/thrower + var/datum/weakref/thrower ///A variable that helps in describing objects thrown at an angle, if it should be moved diagonally first or last. var/diagonals_first ///Set to TRUE if the throw is exclusively diagonal (45 Degree angle throws for example) @@ -101,7 +101,8 @@ SUBSYSTEM_DEF(throwing) src.init_dir = init_dir src.maxrange = maxrange src.speed = speed - src.thrower = thrower + if(thrower) + src.thrower = WEAKREF(thrower) src.diagonals_first = diagonals_first src.force = force src.gentle = gentle @@ -124,6 +125,12 @@ SUBSYSTEM_DEF(throwing) qdel(src) +/// Returns the mob thrower, or null +/datum/thrownthing/proc/get_thrower() + . = thrower?.resolve() + if(isnull(.)) + thrower = null + /datum/thrownthing/proc/tick() var/atom/movable/AM = thrownthing if (!isturf(AM.loc) || !AM.throwing) @@ -135,10 +142,11 @@ SUBSYSTEM_DEF(throwing) return var/atom/movable/actual_target = initial_target?.resolve() + var/mob/mob_thrower = get_thrower() if(dist_travelled) //to catch sneaky things moving on our tile while we slept for(var/atom/movable/obstacle as anything in get_turf(thrownthing)) - if (obstacle == thrownthing || (obstacle == thrower && !ismob(thrownthing))) + if (obstacle == thrownthing || (obstacle == mob_thrower && !ismob(thrownthing))) continue if(ismob(obstacle) && thrownthing.pass_flags & PASSMOB && (obstacle != actual_target)) continue diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 97b2c85b2aa..75b51b2babc 100644 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -20,8 +20,6 @@ SUBSYSTEM_DEF(ticker) /// Boolean to track and check if our subsystem setup is done. var/setup_done = FALSE - var/datum/game_mode/mode = null - var/login_music //music played in pregame lobby var/round_end_sound //music/jingle played when the world reboots var/round_end_sound_sent = TRUE //If all clients have loaded it @@ -69,9 +67,9 @@ SUBSYSTEM_DEF(ticker) /// Why an emergency shuttle was called var/emergency_reason - var/real_round_start_time = 0 //SKYRAT EDIT ADDITION + var/real_round_start_time = 0 //NOVA EDIT ADDITION - var/discord_alerted = FALSE //SKYRAT EDIT - DISCORD PING SPAM PREVENTION + var/discord_alerted = FALSE //NOVA EDIT - DISCORD PING SPAM PREVENTION /datum/controller/subsystem/ticker/Initialize() var/list/byond_sound_formats = list( @@ -165,14 +163,14 @@ SUBSYSTEM_DEF(ticker) to_chat(world, span_notice("Welcome to [station_name()]!")) /* ORIGINAL: send2chat("New round starting on [SSmapping.config.map_name]!", CONFIG_GET(string/channel_announce_new_game)) - */ // SKYRAT EDIT START - DISCORD SPAM PREVENTION + */ // NOVA EDIT START - DISCORD SPAM PREVENTION if(!discord_alerted) discord_alerted = TRUE - send2chat(new /datum/tgs_message_content("<@&[CONFIG_GET(string/game_alert_role_id)]> Round **[GLOB.round_id]** starting on [SSmapping.config.map_name], [CONFIG_GET(string/servername)]! \nIf you wish to be pinged for game related stuff, go to <#[CONFIG_GET(string/role_assign_channel_id)]> and assign yourself the roles."), CONFIG_GET(string/channel_announce_new_game)) // SKYRAT EDIT - Role ping and round ID in game-alert - // SKYRAT EDIT END + send2chat(new /datum/tgs_message_content("<@&[CONFIG_GET(string/game_alert_role_id)]> Round **[GLOB.round_id]** starting on [SSmapping.config.map_name], [CONFIG_GET(string/servername)]! \nIf you wish to be pinged for game related stuff, go to <#[CONFIG_GET(string/role_assign_channel_id)]> and assign yourself the roles."), CONFIG_GET(string/channel_announce_new_game)) // NOVA EDIT - Role ping and round ID in game-alert + // NOVA EDIT END current_state = GAME_STATE_PREGAME - SStitle.change_title_screen() //SKYRAT EDIT ADDITION - Title screen - addtimer(CALLBACK(SStitle, TYPE_PROC_REF(/datum/controller/subsystem/title, change_title_screen)), 1 SECONDS) //SKYRAT EDIT ADDITION - Title screen + SStitle.change_title_screen() //NOVA EDIT ADDITION - Title screen + addtimer(CALLBACK(SStitle, TYPE_PROC_REF(/datum/controller/subsystem/title, change_title_screen)), 1 SECONDS) //NOVA EDIT ADDITION - Title screen //Everyone who wants to be an observer is now spawned SEND_SIGNAL(src, COMSIG_TICKER_ENTER_PREGAME) fire() @@ -205,7 +203,7 @@ SUBSYSTEM_DEF(ticker) SEND_SIGNAL(src, COMSIG_TICKER_ENTER_SETTING_UP) current_state = GAME_STATE_SETTING_UP Master.SetRunLevel(RUNLEVEL_SETUP) - SSevents.reschedule() // SKYRAT EDIT ADDITION + SSevents.reschedule() // NOVA EDIT ADDITION if(start_immediately) fire() @@ -219,10 +217,9 @@ SUBSYSTEM_DEF(ticker) SEND_SIGNAL(src, COMSIG_TICKER_ERROR_SETTING_UP) if(GAME_STATE_PLAYING) - mode.process(wait * 0.1) check_queue() - if(!roundend_check_paused && (mode.check_finished() || force_ending)) + if(!roundend_check_paused && (check_finished() || force_ending)) current_state = GAME_STATE_FINISHED toggle_ooc(TRUE) // Turn it on toggle_dooc(TRUE) @@ -230,17 +227,27 @@ SUBSYSTEM_DEF(ticker) check_maprotate() Master.SetRunLevel(RUNLEVEL_POSTGAME) +/// Checks if the round should be ending, called every ticker tick +/datum/controller/subsystem/ticker/proc/check_finished() + if(!setup_done) + return FALSE + if(SSshuttle.emergency && (SSshuttle.emergency.mode == SHUTTLE_ENDGAME)) + return TRUE + if(GLOB.station_was_nuked) + return TRUE + if(GLOB.revolutionary_win) + return TRUE + return FALSE + /datum/controller/subsystem/ticker/proc/setup() to_chat(world, span_boldannounce("Starting game...")) var/init_start = world.timeofday - mode = new /datum/game_mode/dynamic - CHECK_TICK - //Configure mode and assign player to special mode stuff - var/can_continue = 0 - can_continue = src.mode.pre_setup() //Choose antagonists + //Configure mode and assign player to antagonists + var/can_continue = FALSE + can_continue = SSdynamic.pre_setup() //Choose antagonists CHECK_TICK can_continue = can_continue && SSjob.DivideOccupations() //Distribute jobs CHECK_TICK @@ -248,7 +255,6 @@ SUBSYSTEM_DEF(ticker) if(!GLOB.Debug2) if(!can_continue) log_game("Game failed pre_setup") - QDEL_NULL(mode) to_chat(world, "Error setting up game. Reverting to pre-game lobby.") SSjob.ResetOccupations() return FALSE @@ -284,14 +290,14 @@ SUBSYSTEM_DEF(ticker) round_start_time = world.time //otherwise round_start_time would be 0 for the signals SEND_SIGNAL(src, COMSIG_TICKER_ROUND_STARTING, world.time) - real_round_start_time = REALTIMEOFDAY //SKYRAT EDIT ADDITION - SSautotransfer.new_shift(real_round_start_time) //SKYRAT EDIT ADDITION + real_round_start_time = REALTIMEOFDAY //NOVA EDIT ADDITION + SSautotransfer.new_shift(real_round_start_time) //NOVA EDIT ADDITION log_world("Game start took [(world.timeofday - init_start)/10]s") INVOKE_ASYNC(SSdbcore, TYPE_PROC_REF(/datum/controller/subsystem/dbcore,SetRoundStart)) to_chat(world, span_notice("Welcome to [station_name()], enjoy your stay!")) - alert_sound_to_playing(sound(SSstation.announcer.get_rand_welcome_sound())) //SKYRAT EDIT CHANGE + alert_sound_to_playing(sound(SSstation.announcer.get_rand_welcome_sound())) //NOVA EDIT CHANGE current_state = GAME_STATE_PLAYING Master.SetRunLevel(RUNLEVEL_GAME) @@ -308,7 +314,7 @@ SUBSYSTEM_DEF(ticker) /datum/controller/subsystem/ticker/proc/PostSetup() set waitfor = FALSE - mode.post_setup() + SSdynamic.post_setup() GLOB.start_state = new /datum/station_state() GLOB.start_state.count() @@ -332,7 +338,7 @@ SUBSYSTEM_DEF(ticker) iter_human.increment_scar_slot() iter_human.load_persistent_scars() - SSpersistence.load_modular_persistence(iter_human.get_organ_slot(ORGAN_SLOT_BRAIN)) // SKYRAT EDIT ADDITION - MODULAR_PERSISTENCE + SSpersistence.load_modular_persistence(iter_human.get_organ_slot(ORGAN_SLOT_BRAIN)) // NOVA EDIT ADDITION - MODULAR_PERSISTENCE if(!iter_human.hardcore_survival_score) continue @@ -366,11 +372,11 @@ SUBSYSTEM_DEF(ticker) GLOB.joined_player_list += player.ckey var/atom/destination = player.mind.assigned_role.get_roundstart_spawn_point() if(!destination) // Failed to fetch a proper roundstart location, won't be going anywhere. - player.show_title_screen() //SKYRAT EDIT CHANGE + player.show_title_screen() //NOVA EDIT CHANGE continue player.create_character(destination) else - player.show_title_screen() //SKYRAT EDIT ADDITION + player.show_title_screen() //NOVA EDIT ADDITION CHECK_TICK @@ -443,13 +449,13 @@ SUBSYSTEM_DEF(ticker) new_player_mob.client.prefs.hardcore_random_setup(new_player_living) SSquirks.AssignQuirks(new_player_living, new_player_mob.client) - //SKYRAT EDIT ADDITION + //NOVA EDIT ADDITION if(ishuman(new_player_living)) for(var/datum/loadout_item/item as anything in loadout_list_to_datums(new_player_mob.client?.prefs?.loadout_list)) if (item.restricted_roles && length(item.restricted_roles) && !(player_assigned_role.title in item.restricted_roles)) continue item.post_equip_item(new_player_mob.client?.prefs, new_player_living) - //SKYRAT EDIT END + //NOVA EDIT END CHECK_TICK if(captainless) @@ -554,7 +560,6 @@ SUBSYSTEM_DEF(ticker) /datum/controller/subsystem/ticker/Recover() current_state = SSticker.current_state force_ending = SSticker.force_ending - mode = SSticker.mode login_music = SSticker.login_music round_end_sound = SSticker.round_end_sound @@ -591,7 +596,7 @@ SUBSYSTEM_DEF(ticker) /datum/controller/subsystem/ticker/proc/send_news_report() var/news_message var/news_source = "Nanotrasen News Network" - var/decoded_station_name = html_decode(CONFIG_GET(string/cross_comms_name)) //decode station_name to avoid minor_announce double encode // SKYRAT EDIT: CROSS COMMS CONFIG + var/decoded_station_name = html_decode(CONFIG_GET(string/cross_comms_name)) //decode station_name to avoid minor_announce double encode // NOVA EDIT: CROSS COMMS CONFIG switch(news_report) // The nuke was detonated on the syndicate recon outpost @@ -682,24 +687,24 @@ SUBSYSTEM_DEF(ticker) news_message = "Officials are advising nearby colonies about a newly declared exclusion zone in \ the sector surrounding [decoded_station_name]." - //SKYRAT EDIT - START + //NOVA EDIT - START if(SSblackbox.first_death) var/list/ded = SSblackbox.first_death if(ded.len) news_message += " NT Sanctioned Psykers picked up faint traces of someone near the station, allegedly having had died. Their name was: [ded["name"]], [ded["role"]], at [ded["area"]].[ded["last_words"] ? " Their last words were: \"[ded["last_words"]]\"" : ""]" // " // An Extra quote and comment because highlighting goes weird else news_message += " NT Sanctioned Psykers proudly confirm reports that nobody died this shift!" - //SKYRAT EDIT - END + //NOVA EDIT - END - if(news_message && length(CONFIG_GET(keyed_list/cross_server))) //SKYRAT EDIT - CONFIG CHECK MOVED FROM ROUNDEND.DM - news_message += " (Shift on [CONFIG_GET(string/cross_server_name)] ending!)" //SKYRAT EDIT ADDITION + if(news_message && length(CONFIG_GET(keyed_list/cross_server))) //NOVA EDIT - CONFIG CHECK MOVED FROM ROUNDEND.DM + news_message += " (Shift on [CONFIG_GET(string/cross_server_name)] ending!)" //NOVA EDIT ADDITION send2otherserver(news_source, news_message,"News_Report") - //SKYRAT EDIT - START + //NOVA EDIT - START if(news_message) return news_message else return "We regret to inform you that shit be whack, yo. None of our reporters have any idea of what may or may not have gone on." - //SKYRAT EDIT - END + //NOVA EDIT - END /datum/controller/subsystem/ticker/proc/GetTimeLeft() if(isnull(SSticker.timeLeft)) diff --git a/code/controllers/subsystem/title.dm b/code/controllers/subsystem/title.dm index 1fb7944191d..93b684e7526 100644 --- a/code/controllers/subsystem/title.dm +++ b/code/controllers/subsystem/title.dm @@ -1,4 +1,4 @@ -/* SKYRAT EDIT REMOVAL +/* NOVA EDIT REMOVAL SUBSYSTEM_DEF(title) name = "Title Screen" flags = SS_NO_FIRE diff --git a/code/datums/achievements/job_achievements.dm b/code/datums/achievements/job_achievements.dm index 10835b895b8..6aafbee8e68 100644 --- a/code/datums/achievements/job_achievements.dm +++ b/code/datums/achievements/job_achievements.dm @@ -24,12 +24,6 @@ database_id = MEDAL_HELBITALJANKEN icon = "helbital" -/datum/award/achievement/jobs/chemistry_tut - name = "Perfect chemistry blossom" - desc = "Passed the chemistry tutorial with perfect purity!" - database_id = MEDAL_CHEM_TUT - icon = "chem_tut" - //mining /datum/award/achievement/jobs/frenching diff --git a/code/datums/achievements/misc_achievements.dm b/code/datums/achievements/misc_achievements.dm index 8ae3da33e3a..3a62e6c940a 100644 --- a/code/datums/achievements/misc_achievements.dm +++ b/code/datums/achievements/misc_achievements.dm @@ -141,6 +141,12 @@ database_id = MEDAL_LOCK_ASCENSION icon = "lockascend" +/datum/award/achievement/misc/moon_ascension + name = "The Last Act" + desc = "You managed to become the ringleader and slay the lie." + database_id = MEDAL_MOON_ASCENSION + icon = "moonascend" + /datum/award/achievement/misc/grand_ritual_finale name = "Archmage" desc = "Made a big impression on the station with your phenomenal cosmic power." diff --git a/code/datums/actions/items/hands_free.dm b/code/datums/actions/items/hands_free.dm index 24fddb52942..8b7a4f405b1 100644 --- a/code/datums/actions/items/hands_free.dm +++ b/code/datums/actions/items/hands_free.dm @@ -6,3 +6,7 @@ /datum/action/item_action/hands_free/shift_nerves name = "Shift Nerves" + +/datum/action/item_action/hands_free/moth_googles + name = "Toggle Zoom" + desc = "Look further out with the help of your mothic googles." diff --git a/code/datums/actions/items/toggles.dm b/code/datums/actions/items/toggles.dm index fa7bc821a5e..508c6e8639b 100644 --- a/code/datums/actions/items/toggles.dm +++ b/code/datums/actions/items/toggles.dm @@ -15,8 +15,8 @@ name = "Toggle Hood" /datum/action/item_action/toggle_firemode - button_icon = 'modular_skyrat/master_files/icons/mob/actions/actions_items.dmi' //SKYRAT EDIT ADDITION - button_icon_state = "fireselect_no" //SKYRAT EDIT ADDITION + button_icon = 'modular_nova/master_files/icons/mob/actions/actions_items.dmi' //NOVA EDIT ADDITION + button_icon_state = "fireselect_no" //NOVA EDIT ADDITION name = "Toggle Firemode" /datum/action/item_action/toggle_gunlight diff --git a/code/datums/actions/mobs/lava_swoop.dm b/code/datums/actions/mobs/lava_swoop.dm index 7532ccfda08..a5acc29bab6 100644 --- a/code/datums/actions/mobs/lava_swoop.dm +++ b/code/datums/actions/mobs/lava_swoop.dm @@ -199,7 +199,6 @@ icon = 'icons/mob/simple/lavaland/96x96megafauna.dmi' icon_state = "dragon" layer = ABOVE_ALL_MOB_LAYER - plane = GAME_PLANE_UPPER_FOV_HIDDEN pixel_x = -32 duration = 10 randomdir = FALSE diff --git a/code/datums/ai/_ai_controller.dm b/code/datums/ai/_ai_controller.dm index 6bbdabfc50d..a13cc8b36fa 100644 --- a/code/datums/ai/_ai_controller.dm +++ b/code/datums/ai/_ai_controller.dm @@ -67,7 +67,7 @@ multiple modular subtrees with behaviors if(!isnull(new_pawn)) // unit tests need the ai_controller to exist in isolation due to list schenanigans i hate it here PossessPawn(new_pawn) -/datum/ai_controller/Destroy(force, ...) +/datum/ai_controller/Destroy(force) set_ai_status(AI_STATUS_OFF) UnpossessPawn(FALSE) set_movement_target(type, null) @@ -175,6 +175,7 @@ multiple modular subtrees with behaviors ///Runs any actions that are currently running /datum/ai_controller/process(seconds_per_tick) + if(!able_to_run()) SSmove_manager.stop_looping(pawn) //stop moving return //this should remove them from processing in the future through event-based stuff. diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/targeting.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/targeting.dm index 435b9cb1ef3..8ba9624c21e 100644 --- a/code/datums/ai/basic_mobs/basic_ai_behaviors/targeting.dm +++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/targeting.dm @@ -1,11 +1,12 @@ +/// List of objects that AIs will treat as targets +GLOBAL_LIST_EMPTY_TYPED(hostile_machines, /atom) + /datum/ai_behavior/find_potential_targets action_cooldown = 2 SECONDS /// How far can we see stuff? var/vision_range = 9 /// Blackboard key for aggro range, uses vision range if not specified var/aggro_range_key = BB_AGGRO_RANGE - /// Static typecache list of potentially dangerous objs - var/static/list/hostile_machines = typecacheof(list(/obj/machinery/porta_turret, /obj/vehicle/sealed/mecha)) /datum/ai_behavior/find_potential_targets/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targeting_strategy_key, hiding_location_key) . = ..() @@ -26,9 +27,9 @@ var/list/potential_targets = hearers(aggro_range, get_turf(controller.pawn)) - living_mob //Remove self, so we don't suicide - for(var/HM in typecache_filter_list(range(aggro_range, living_mob), hostile_machines)) //Can we see any hostile machines? - if(can_see(living_mob, HM, aggro_range)) - potential_targets += HM + for (var/atom/hostile_machine as anything in GLOB.hostile_machines) + if (can_see(living_mob, hostile_machine, aggro_range)) + potential_targets += hostile_machine if(!potential_targets.len) finish_action(controller, succeeded = FALSE) diff --git a/code/datums/ai/generic/generic_behaviors.dm b/code/datums/ai/generic/generic_behaviors.dm index 9a7ec19cd5e..b769bc529e2 100644 --- a/code/datums/ai/generic/generic_behaviors.dm +++ b/code/datums/ai/generic/generic_behaviors.dm @@ -2,6 +2,7 @@ /datum/ai_behavior/resist/perform(seconds_per_tick, datum/ai_controller/controller) . = ..() var/mob/living/living_pawn = controller.pawn + living_pawn.ai_controller.set_blackboard_key(BB_RESISTING, TRUE) living_pawn.execute_resist() finish_action(controller, TRUE) diff --git a/code/datums/ai/monkey/monkey_controller.dm b/code/datums/ai/monkey/monkey_controller.dm index 781bfb70a85..8be754f8d4b 100644 --- a/code/datums/ai/monkey/monkey_controller.dm +++ b/code/datums/ai/monkey/monkey_controller.dm @@ -26,9 +26,22 @@ have ways of interacting with a specific mob and control it. BB_MONKEY_GUN_NEURONS_ACTIVATED = FALSE, BB_MONKEY_GUN_WORKED = TRUE, BB_SONG_LINES = MONKEY_SONG, + BB_RESISTING = FALSE, ) idle_behavior = /datum/idle_behavior/idle_monkey +/datum/ai_controller/monkey/process(seconds_per_tick) + + var/mob/living/living_pawn = src.pawn + + if(!length(living_pawn.do_afters) && living_pawn.ai_controller.blackboard[BB_RESISTING]) + living_pawn.ai_controller.set_blackboard_key(BB_RESISTING, FALSE) + + if(living_pawn.ai_controller.blackboard[BB_RESISTING]) + return + + . = ..() + /datum/ai_controller/monkey/New(atom/new_pawn) var/static/list/control_examine = list( ORGAN_SLOT_EYES = span_monkey("eyes have a primal look in them."), @@ -91,7 +104,7 @@ have ways of interacting with a specific mob and control it. /datum/ai_controller/monkey/able_to_run() var/mob/living/living_pawn = pawn - if(IS_DEAD_OR_INCAP(living_pawn)) + if(living_pawn.incapacitated(IGNORE_RESTRAINTS | IGNORE_GRAB | IGNORE_STASIS) || living_pawn.stat > CONSCIOUS) return FALSE return ..() diff --git a/code/datums/ai/movement/ai_movement_jps.dm b/code/datums/ai/movement/ai_movement_jps.dm index 31fd90ccf53..3644869140d 100644 --- a/code/datums/ai/movement/ai_movement_jps.dm +++ b/code/datums/ai/movement/ai_movement_jps.dm @@ -4,13 +4,15 @@ /datum/ai_movement/jps max_pathing_attempts = 20 var/maximum_length = AI_MAX_PATH_LENGTH + ///how we deal with diagonal movement, whether we try to avoid them or follow through with them + var/diagonal_flags = DIAGONAL_REMOVE_CLUNKY /datum/ai_movement/jps/start_moving_towards(datum/ai_controller/controller, atom/current_movement_target, min_distance) . = ..() var/atom/movable/moving = controller.pawn var/delay = controller.movement_delay - var/datum/move_loop/loop = SSmove_manager.jps_move(moving, + var/datum/move_loop/has_target/jps/loop = SSmove_manager.jps_move(moving, current_movement_target, delay, repath_delay = 0.5 SECONDS, @@ -18,6 +20,7 @@ minimum_distance = controller.get_minimum_distance(), access = controller.get_access(), subsystem = SSai_movement, + diagonal_handling = diagonal_flags, extra_info = controller, ) @@ -25,6 +28,8 @@ RegisterSignal(loop, COMSIG_MOVELOOP_POSTPROCESS, PROC_REF(post_move)) RegisterSignal(loop, COMSIG_MOVELOOP_JPS_REPATH, PROC_REF(repath_incoming)) + return loop + /datum/ai_movement/jps/proc/repath_incoming(datum/move_loop/has_target/jps/source) SIGNAL_HANDLER var/datum/ai_controller/controller = source.extra_info @@ -35,3 +40,11 @@ /datum/ai_movement/jps/bot max_pathing_attempts = 25 maximum_length = AI_BOT_PATH_LENGTH + diagonal_flags = DIAGONAL_REMOVE_ALL + +/datum/ai_movement/jps/bot/start_moving_towards(datum/ai_controller/controller, atom/current_movement_target, min_distance) + var/datum/move_loop/loop = ..() + var/atom/our_pawn = controller.pawn + if(isnull(our_pawn)) + return + our_pawn.RegisterSignal(loop, COMSIG_MOVELOOP_JPS_FINISHED_PATHING, TYPE_PROC_REF(/mob/living/basic/bot, generate_bot_path)) diff --git a/code/datums/announcers/default_announcer.dm b/code/datums/announcers/default_announcer.dm index c5dc142f818..8b91323ef5f 100644 --- a/code/datums/announcers/default_announcer.dm +++ b/code/datums/announcers/default_announcer.dm @@ -1,4 +1,4 @@ -/* SKYRAT EDIT REMOVAL +/* NOVA EDIT REMOVAL /datum/centcom_announcer/default welcome_sounds = list('sound/ai/default/welcome.ogg') alert_sounds = list('sound/ai/default/attention.ogg') diff --git a/code/datums/armor/_armor.dm b/code/datums/armor/_armor.dm index bfd15af4189..616ad00c324 100644 --- a/code/datums/armor/_armor.dm +++ b/code/datums/armor/_armor.dm @@ -42,7 +42,7 @@ GLOBAL_LIST_INIT(armor_by_type, generate_armor_type_cache()) /// A version of armor that cannot be modified and will always return itself when attempted to be modified /datum/armor/immune -/datum/armor/Destroy(force, ...) +/datum/armor/Destroy(force) if(!force && tag) return QDEL_HINT_LETMELIVE diff --git a/code/datums/atmosphere/planetary.dm b/code/datums/atmosphere/planetary.dm index 29db62369b9..e4babc9cf48 100644 --- a/code/datums/atmosphere/planetary.dm +++ b/code/datums/atmosphere/planetary.dm @@ -17,7 +17,7 @@ /datum/gas/miasma=1.2, /datum/gas/water_vapor=0.1, ) - restricted_chance = 0 // SKYRAT EDIT: Disables restricted gases from rolling - Original value (30) + restricted_chance = 0 // NOVA EDIT: Disables restricted gases from rolling - Original value (30) minimum_pressure = HAZARD_LOW_PRESSURE + 10 maximum_pressure = LAVALAND_EQUIPMENT_EFFECT_PRESSURE - 1 @@ -42,7 +42,7 @@ /datum/gas/water_vapor=0.1, /datum/gas/miasma=1.2, ) - restricted_chance = 0 // SKYRAT EDIT: Disables restricted gases from rolling - Original value (20) + restricted_chance = 0 // NOVA EDIT: Disables restricted gases from rolling - Original value (20) minimum_pressure = HAZARD_LOW_PRESSURE + 10 maximum_pressure = LAVALAND_EQUIPMENT_EFFECT_PRESSURE - 1 diff --git a/code/datums/beam.dm b/code/datums/beam.dm index 6b138387290..152de6ec1e1 100644 --- a/code/datums/beam.dm +++ b/code/datums/beam.dm @@ -179,7 +179,6 @@ /obj/effect/ebeam mouse_opacity = MOUSE_OPACITY_TRANSPARENT - plane = GAME_PLANE_UPPER_FOV_HIDDEN layer = ABOVE_ALL_MOB_LAYER anchored = TRUE var/emissive = TRUE diff --git a/code/datums/bodypart_overlays/bodypart_overlay.dm b/code/datums/bodypart_overlays/bodypart_overlay.dm index 5b6232fd303..7639aa8da53 100644 --- a/code/datums/bodypart_overlays/bodypart_overlay.dm +++ b/code/datums/bodypart_overlays/bodypart_overlay.dm @@ -4,7 +4,7 @@ ///Sometimes we need multiple layers, for like the back, middle and front of the person (EXTERNAL_FRONT, EXTERNAL_ADJACENT, EXTERNAL_BEHIND) var/layers ///List of all possible layers. Used for looping through in drawing - var/static/list/all_layers = list(EXTERNAL_FRONT, EXTERNAL_ADJACENT, EXTERNAL_BEHIND, EXTERNAL_FRONT_UNDER_CLOTHES, EXTERNAL_FRONT_OVER, EXTERNAL_FRONT_ABOVE_HAIR) // SKYRAT EDIT - Customization - ORIGINAL: var/static/list/all_layers = list(EXTERNAL_FRONT, EXTERNAL_ADJACENT, EXTERNAL_BEHIND) + var/static/list/all_layers = list(EXTERNAL_FRONT, EXTERNAL_ADJACENT, EXTERNAL_BEHIND, EXTERNAL_FRONT_UNDER_CLOTHES, EXTERNAL_FRONT_OVER, EXTERNAL_FRONT_ABOVE_HAIR) // NOVA EDIT - Customization - ORIGINAL: var/static/list/all_layers = list(EXTERNAL_FRONT, EXTERNAL_ADJACENT, EXTERNAL_BEHIND) ///Key of the icon states of all the sprite_datums for easy caching var/cache_key = "" @@ -46,14 +46,14 @@ return "ADJ" if(-BODY_FRONT_LAYER) return "FRONT" - //SKYRAT EDIT ADDITION - Customization + //NOVA EDIT ADDITION - Customization if(-BODY_FRONT_UNDER_CLOTHES) return "FRONT_UNDER" if(-ABOVE_BODY_FRONT_HEAD_LAYER) return "FRONT_OVER" if(-HEAD_LAYER) return "FRONT_OVER_HAIR" - //SKYRAT EDIT ADDITION END + //NOVA EDIT ADDITION END ///Converts a bitflag to the right layer. I'd love to make this a static index list, but byond made an attempt on my life when i did /datum/bodypart_overlay/proc/bitflag_to_layer(layer) @@ -64,14 +64,14 @@ return -BODY_ADJ_LAYER if(EXTERNAL_FRONT) return -BODY_FRONT_LAYER - //SKYRAT EDIT ADDITION - Customization + //NOVA EDIT ADDITION - Customization if(EXTERNAL_FRONT_UNDER_CLOTHES) return -BODY_FRONT_UNDER_CLOTHES if(EXTERNAL_FRONT_OVER) return -ABOVE_BODY_FRONT_HEAD_LAYER if(EXTERNAL_FRONT_ABOVE_HAIR) return -HEAD_LAYER - //SKYRAT EDIT ADDITION END + //NOVA EDIT ADDITION END ///Check whether we can draw the overlays. You generally don't want lizard snouts to draw over an EVA suit /datum/bodypart_overlay/proc/can_draw_on_bodypart(mob/living/carbon/human/human) diff --git a/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm b/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm index 7dd453163c5..f2b82e7a2c8 100644 --- a/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm +++ b/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm @@ -96,13 +96,13 @@ /datum/bodypart_overlay/mutant/proc/inherit_color(obj/item/bodypart/ownerlimb, force) if(isnull(ownerlimb)) draw_color = null - alpha = 255 // SKYRAT EDIT - Mutant bodyparts transparency are based on limb transparency + alpha = 255 // NOVA EDIT - Mutant bodyparts transparency are based on limb transparency return TRUE if(draw_color && !force) return FALSE - alpha = ownerlimb.alpha // SKYRAT EDIT - Mutant bodyparts transparency are based on limb transparency + alpha = ownerlimb.alpha // NOVA EDIT - Mutant bodyparts transparency are based on limb transparency switch(color_source) if(ORGAN_COLOR_OVERRIDE) draw_color = override_color(ownerlimb.draw_color) diff --git a/code/datums/brain_damage/creepy_trauma.dm b/code/datums/brain_damage/creepy_trauma.dm index 6d1122fa716..b056ddfb8de 100644 --- a/code/datums/brain_damage/creepy_trauma.dm +++ b/code/datums/brain_damage/creepy_trauma.dm @@ -136,10 +136,10 @@ continue if(!(player.mind.assigned_role.job_flags & JOB_CREW_MEMBER)) continue - // SKYRAT EDIT ADDITION START - Players in the interlink can't be obsession targets + // NOVA EDIT ADDITION START - Players in the interlink can't be obsession targets if(SSticker.IsRoundInProgress() && istype(get_area(player), /area/centcom/interlink)) continue - // SKYRAT EDIT END + // NOVA EDIT END viable_minds += player.mind for(var/datum/mind/possible_target as anything in viable_minds) if(possible_target != owner && ishuman(possible_target.current)) diff --git a/code/datums/brain_damage/severe.dm b/code/datums/brain_damage/severe.dm index 90248df1cfb..fc30d7fb3b8 100644 --- a/code/datums/brain_damage/severe.dm +++ b/code/datums/brain_damage/severe.dm @@ -330,3 +330,104 @@ /datum/brain_trauma/severe/dyslexia/on_lose() REMOVE_TRAIT(owner, TRAIT_ILLITERATE, TRAUMA_TRAIT) ..() + +/* + * Brain traumas that eldritch paintings apply + * This one is for "The Sister and He Who Wept" or /obj/structure/sign/painting/eldritch + */ +/datum/brain_trauma/severe/weeping + name = "The Weeping" + desc = "Patient hallucinates everyone as a figure called He Who Wept" + scan_desc = "H_E##%%%WEEP6%11S!!,)()" + gain_text = span_warning("HE WEEPS AND I WILL SEE HIM ONCE MORE") + lose_text = span_notice("You feel the tendrils of something slip from your mind.") + random_gain = FALSE + /// Our cooldown declare for causing hallucinations + COOLDOWN_DECLARE(weeping_hallucinations) + +/datum/brain_trauma/severe/weeping/on_life(seconds_per_tick, times_fired) + if(owner.stat != CONSCIOUS || owner.IsSleeping() || owner.IsUnconscious()) + return + // If they have examined a painting recently + if(HAS_TRAIT(owner, TRAIT_ELDRITCH_PAINTING_EXAMINE)) + return + if(!COOLDOWN_FINISHED(src, weeping_hallucinations)) + return + owner.cause_hallucination(/datum/hallucination/delusion/preset/heretic, "Caused by The Weeping brain trauma") + owner.add_mood_event("eldritch_weeping", /datum/mood_event/eldritch_painting/weeping) + COOLDOWN_START(src, weeping_hallucinations, 10 SECONDS) + ..() + +//This one is for "The First Desire" or /obj/structure/sign/painting/eldritch/desire +/datum/brain_trauma/severe/flesh_desire + name = "The Desire for Flesh" + desc = "Patient appears hungrier and only wishes to eat meats." + scan_desc = "H_(82882)G3E:__))9R" + gain_text = span_warning("I feel a hunger, only organs and flesh will feed it...") + lose_text = span_notice("You no longer feel the hunger for flesh...") + random_gain = FALSE + /// How much faster we loose hunger + var/hunger_rate = 15 + +/datum/brain_trauma/severe/flesh_desire/on_gain() + // Allows them to eat faster, mainly for flavor + ADD_TRAIT(owner, TRAIT_VORACIOUS, REF(src)) + ADD_TRAIT(owner, TRAIT_FLESH_DESIRE, REF(src)) + ..() + +/datum/brain_trauma/severe/flesh_desire/on_life(seconds_per_tick, times_fired) + // Causes them to need to eat at 10x the normal rate + owner.adjust_nutrition(-hunger_rate * HUNGER_FACTOR) + if(SPT_PROB(10, seconds_per_tick)) + to_chat(owner, span_notice("You feel a ravenous hunger for flesh...")) + owner.overeatduration = max(owner.overeatduration - 200 SECONDS, 0) + +/datum/brain_trauma/severe/flesh_desire/on_lose() + REMOVE_TRAIT(owner, TRAIT_VORACIOUS, REF(src)) + REMOVE_TRAIT(owner, TRAIT_FLESH_DESIRE, REF(src)) + return ..() + +// This one is for "Lady out of gates" or /obj/item/wallframe/painting/eldritch/beauty +/datum/brain_trauma/severe/eldritch_beauty + name = "The Pursuit of Perfection" + desc = "Patient seems to furiously scratch at their body, the only way to make them cease is for them to remove their jumpsuit." + scan_desc = "I_)8(P_E##R&&F(E)C__T)" + gain_text = span_warning("I WILL RID MY FLESH FROM IMPERFECTION!! I WILL BE PERFECT WITHOUT MY SUITS!!") + lose_text = span_notice("You feel the influence of something slip your mind, and you feel content as you are.") + random_gain = FALSE + /// How much damage we deal with each scratch + var/scratch_damage = 0.5 + +/datum/brain_trauma/severe/eldritch_beauty/on_life(seconds_per_tick, times_fired) + // Jumpsuits ruin the "perfection" of the body + if(!owner.get_item_by_slot(ITEM_SLOT_ICLOTHING)) + return + + // Scratching code + var/obj/item/bodypart/bodypart = owner.get_bodypart(owner.get_random_valid_zone(even_weights = TRUE)) + if(!(bodypart && IS_ORGANIC_LIMB(bodypart)) && bodypart.bodypart_flags & BODYPART_PSEUDOPART) + return + if(owner.incapacitated()) + return + bodypart.receive_damage(scratch_damage) + if(SPT_PROB(33, seconds_per_tick)) + to_chat(owner, span_notice("You scratch furiously at [bodypart] to ruin the cloth that hides the beauty!")) + +// This one is for "Climb over the rusted mountain" or /obj/structure/sign/painting/eldritch/rust +/datum/brain_trauma/severe/rusting + name = "The Rusted Climb" + desc = "Patient seems to oxidise things around them at random, and seem to believe they are aiding a creature in climbing a mountin." + scan_desc = "C_)L(#_I_##M;B" + gain_text = span_warning("The rusted climb shall finish at the peak") + lose_text = span_notice("The rusted climb? Whats that? An odd dream to be sure.") + random_gain = FALSE + +/datum/brain_trauma/severe/rusting/on_life(seconds_per_tick, times_fired) + var/atom/tile = get_turf(owner) + // Examining a painting should stop this effect to give counterplay + if(HAS_TRAIT(owner, TRAIT_ELDRITCH_PAINTING_EXAMINE)) + return + + if(SPT_PROB(50, seconds_per_tick)) + to_chat(owner, span_notice("You feel eldritch energies pulse from your body!")) + tile.rust_heretic_act() diff --git a/code/datums/brain_damage/special.dm b/code/datums/brain_damage/special.dm index 81d354a19e8..d9348f98f4b 100644 --- a/code/datums/brain_damage/special.dm +++ b/code/datums/brain_damage/special.dm @@ -100,7 +100,6 @@ image_icon = 'icons/effects/effects.dmi' image_state = "bluestream" image_layer = ABOVE_MOB_LAYER - image_plane = GAME_PLANE_UPPER var/obj/effect/client_image_holder/bluespace_stream/linked_to /obj/effect/client_image_holder/bluespace_stream/Initialize(mapload, list/mobs_which_see_us) diff --git a/code/datums/brain_damage/split_personality.dm b/code/datums/brain_damage/split_personality.dm index 7cbcdd6a4d8..f6e83c9537c 100644 --- a/code/datums/brain_damage/split_personality.dm +++ b/code/datums/brain_damage/split_personality.dm @@ -211,7 +211,7 @@ /datum/brain_trauma/severe/split_personality/brainwashing/get_ghost() set waitfor = FALSE - var/list/mob/dead/observer/candidates = poll_candidates_for_mob("Do you want to play as [owner.real_name]'s brainwashed mind?", null, null, 7.5 SECONDS, stranger_backseat) + var/list/mob/dead/observer/candidates = SSpolling.poll_ghost_candidates_for_mob("Do you want to play as [owner.real_name]'s brainwashed mind?", poll_time = 7.5 SECONDS, target_mob = stranger_backseat, pic_source = owner, role_name_text = "brainwashed mind") if(LAZYLEN(candidates)) var/mob/dead/observer/C = pick(candidates) stranger_backseat.key = C.key diff --git a/code/datums/candidate_poll.dm b/code/datums/candidate_poll.dm new file mode 100644 index 00000000000..1856858accd --- /dev/null +++ b/code/datums/candidate_poll.dm @@ -0,0 +1,114 @@ +/// The datum that describes one instance of candidate polling +/datum/candidate_poll + /// The role the poll is for + var/role + /// The question asked to potential candidates + var/question + /// The duration of the poll + var/duration + /// the atom observers can jump/teleport to + var/atom/jump_to_me + /// Never For This Round category + var/ignoring_category + /// The players who signed up to this poll + var/list/mob/signed_up + /// the linked alert buttons + var/list/atom/movable/screen/alert/poll_alert/alert_buttons = list() + /// The world.time at which the poll was created + var/time_started + /// Whether the polling is finished + var/finished = FALSE + /// Used to categorize in the alerts system and identify polls of same question+role so we can stack the alert buttons + var/poll_key + +/datum/candidate_poll/New(polled_role, polled_question, poll_duration, poll_ignoring_category, poll_jumpable) + role = polled_role + question = polled_question + duration = poll_duration + ignoring_category = poll_ignoring_category + jump_to_me = poll_jumpable + signed_up = list() + time_started = world.time + poll_key = "[question]_[role ? role : "0"]" + return ..() + +/datum/candidate_poll/Destroy() + if(src in SSpolling.currently_polling) + SSpolling.polling_finished(src) + return QDEL_HINT_IWILLGC // the above proc will call QDEL_IN(src, 0.5 SECONDS) + jump_to_me = null + signed_up = null + return ..() + +/datum/candidate_poll/proc/clear_alert_ref(atom/movable/screen/alert/poll_alert/source) + SIGNAL_HANDLER + alert_buttons -= source + +/datum/candidate_poll/proc/sign_up(mob/candidate, silent = FALSE) + if(!istype(candidate) || isnull(candidate.key) || isnull(candidate.client)) + return FALSE + if(candidate in signed_up) + if(!silent) + to_chat(candidate, span_warning("You have already signed up for this!")) + return FALSE + if(time_left() <= 0) + if(!silent) + to_chat(candidate, span_danger("Sorry, you were too late for the consideration!")) + SEND_SOUND(candidate, 'sound/machines/buzz-sigh.ogg') + return FALSE + + signed_up += candidate + if(!silent) + to_chat(candidate, span_notice("You have signed up for [role]! A candidate will be picked randomly soon.")) + // Sign them up for any other polls with the same mob type + for(var/datum/candidate_poll/existing_poll as anything in SSpolling.currently_polling) + if(src != existing_poll && poll_key == existing_poll.poll_key && !(candidate in existing_poll.signed_up)) + existing_poll.sign_up(candidate, TRUE) + for(var/atom/movable/screen/alert/poll_alert/linked_button as anything in alert_buttons) + linked_button.update_candidates_number_overlay() + return TRUE + +/datum/candidate_poll/proc/remove_candidate(mob/candidate, silent = FALSE) + if(!istype(candidate) || isnull(candidate.key) || isnull(candidate.client)) + return FALSE + if(!(candidate in signed_up)) + if(!silent) + to_chat(candidate, span_warning("You aren't signed up for this!")) + return FALSE + + if(time_left() <= 0) + if(!silent) + to_chat(candidate, span_danger("It's too late to unregister yourself, selection has already begun!")) + return FALSE + + signed_up -= candidate + if(!silent) + to_chat(candidate, span_danger("You have been unregistered as a candidate for [role]. You can sign up again before the poll ends.")) + + for(var/datum/candidate_poll/existing_poll as anything in SSpolling.currently_polling) + if(src != existing_poll && poll_key == existing_poll.poll_key && (candidate in existing_poll.signed_up)) + existing_poll.remove_candidate(candidate, TRUE) + for(var/atom/movable/screen/alert/poll_alert/linked_button as anything in alert_buttons) + linked_button.update_candidates_number_overlay() + return TRUE + +/datum/candidate_poll/proc/do_never_for_this_round(mob/candidate) + var/list/ignore_list = GLOB.poll_ignore[ignoring_category] + if(!ignore_list) + GLOB.poll_ignore[ignoring_category] = list() + GLOB.poll_ignore[ignoring_category] += candidate.ckey + to_chat(candidate, span_danger("Choice registered: Never for this round.")) + remove_candidate(candidate, silent = TRUE) + +/datum/candidate_poll/proc/undo_never_for_this_round(mob/candidate) + GLOB.poll_ignore[ignoring_category] -= candidate.ckey + to_chat(candidate, span_notice("Choice registered: Eligible for this round")) + +/datum/candidate_poll/proc/trim_candidates() + list_clear_nulls(signed_up) + for(var/mob/candidate as anything in signed_up) + if(isnull(candidate.key) || isnull(candidate.client)) + signed_up -= candidate + +/datum/candidate_poll/proc/time_left() + return duration - (world.time - time_started) diff --git a/code/datums/components/_component.dm b/code/datums/components/_component.dm index e461aa2ee36..acf9ceead56 100644 --- a/code/datums/components/_component.dm +++ b/code/datums/components/_component.dm @@ -72,15 +72,13 @@ * * Arguments: * * force - makes it not check for and remove the component from the parent - * * silent - deletes the component without sending a [COMSIG_COMPONENT_REMOVING] signal */ -/datum/component/Destroy(force=FALSE, silent=FALSE) +/datum/component/Destroy(force = FALSE) if(!parent) return ..() if(!force) _RemoveFromParent() - if(!silent) - SEND_SIGNAL(parent, COMSIG_COMPONENT_REMOVING, src) + SEND_SIGNAL(parent, COMSIG_COMPONENT_REMOVING, src) parent = null return ..() diff --git a/code/datums/components/acid.dm b/code/datums/components/acid.dm index 67be754c504..fc60e0312fd 100644 --- a/code/datums/components/acid.dm +++ b/code/datums/components/acid.dm @@ -72,7 +72,7 @@ GLOBAL_DATUM_INIT(acid_overlay, /mutable_appearance, mutable_appearance('icons/e particle_effect = new(atom_parent, acid_particles, isitem(atom_parent) ? NONE : PARTICLE_ATTACH_MOB) START_PROCESSING(SSacid, src) -/datum/component/acid/Destroy(force, silent) +/datum/component/acid/Destroy(force) STOP_PROCESSING(SSacid, src) if(sizzle) QDEL_NULL(sizzle) diff --git a/code/datums/components/action_item_overlay.dm b/code/datums/components/action_item_overlay.dm index e7e567cde36..80478aa9ca4 100644 --- a/code/datums/components/action_item_overlay.dm +++ b/code/datums/components/action_item_overlay.dm @@ -24,7 +24,7 @@ src.item_ref = WEAKREF(item) src.item_callback = item_callback -/datum/component/action_item_overlay/Destroy(force, silent) +/datum/component/action_item_overlay/Destroy(force) item_ref = null item_callback = null item_appearance = null diff --git a/code/datums/components/admin_popup.dm b/code/datums/components/admin_popup.dm index 1d258653bae..ff1e2a3d285 100644 --- a/code/datums/components/admin_popup.dm +++ b/code/datums/components/admin_popup.dm @@ -26,7 +26,7 @@ PROC_REF(delete_self), ) -/datum/component/admin_popup/Destroy(force, silent) +/datum/component/admin_popup/Destroy(force) var/client/parent_client = parent parent_client?.screen -= admin_popup diff --git a/code/datums/components/ai_has_target_timer.dm b/code/datums/components/ai_has_target_timer.dm index bcd748ce638..5fdc07417f4 100644 --- a/code/datums/components/ai_has_target_timer.dm +++ b/code/datums/components/ai_has_target_timer.dm @@ -33,7 +33,7 @@ REMOVE_TRAIT(parent, TRAIT_SUBTREE_REQUIRED_OPERATIONAL_DATUM, type) return ..() -/datum/component/ai_target_timer/Destroy(force, silent) +/datum/component/ai_target_timer/Destroy(force) finalise_losing_target() return ..() diff --git a/code/datums/components/ai_retaliate_advanced.dm b/code/datums/components/ai_retaliate_advanced.dm index ca477a0db27..d734fa92b3c 100644 --- a/code/datums/components/ai_retaliate_advanced.dm +++ b/code/datums/components/ai_retaliate_advanced.dm @@ -16,7 +16,7 @@ ADD_TRAIT(parent, TRAIT_SUBTREE_REQUIRED_OPERATIONAL_DATUM, type) -/datum/component/ai_retaliate_advanced/Destroy(force, silent) +/datum/component/ai_retaliate_advanced/Destroy(force) post_retaliate_callback = null return ..() diff --git a/code/datums/components/anti_magic.dm b/code/datums/components/anti_magic.dm index 059bc2f787d..48e5b10b25f 100644 --- a/code/datums/components/anti_magic.dm +++ b/code/datums/components/anti_magic.dm @@ -56,7 +56,7 @@ src.drain_antimagic = drain_antimagic src.expiration = expiration -/datum/component/anti_magic/Destroy(force, silent) +/datum/component/anti_magic/Destroy(force) drain_antimagic = null expiration = null return ..() diff --git a/code/datums/components/aquarium_content.dm b/code/datums/components/aquarium_content.dm index 589b831aa72..3e7e704638f 100644 --- a/code/datums/components/aquarium_content.dm +++ b/code/datums/components/aquarium_content.dm @@ -138,7 +138,7 @@ . = ..() REMOVE_TRAIT(parent, TRAIT_FISH_CASE_COMPATIBILE, REF(src)) -/datum/component/aquarium_content/Destroy(force, silent) +/datum/component/aquarium_content/Destroy(force) if(current_aquarium) remove_from_aquarium() QDEL_NULL(vc_obj) diff --git a/code/datums/components/area_sound_manager.dm b/code/datums/components/area_sound_manager.dm index bea20222699..65faf7ab3d6 100644 --- a/code/datums/components/area_sound_manager.dm +++ b/code/datums/components/area_sound_manager.dm @@ -29,7 +29,7 @@ else if(!isnull(remove_on)) RegisterSignal(parent, remove_on, PROC_REF(handle_removal)) -/datum/component/area_sound_manager/Destroy(force, silent) +/datum/component/area_sound_manager/Destroy(force) QDEL_NULL(our_loop) . = ..() diff --git a/code/datums/components/areabound.dm b/code/datums/components/areabound.dm index f952d5db2e1..872fab2d8e7 100644 --- a/code/datums/components/areabound.dm +++ b/code/datums/components/areabound.dm @@ -26,6 +26,6 @@ AM.forceMove(reset_turf) moving = FALSE -/datum/component/areabound/Destroy(force, silent) +/datum/component/areabound/Destroy(force) QDEL_NULL(move_tracker) . = ..() diff --git a/code/datums/components/aura_healing.dm b/code/datums/components/aura_healing.dm index ebd7691ac3b..2aa33203b41 100644 --- a/code/datums/components/aura_healing.dm +++ b/code/datums/components/aura_healing.dm @@ -78,7 +78,7 @@ src.limit_to_trait = limit_to_trait src.healing_color = healing_color -/datum/component/aura_healing/Destroy(force, silent) +/datum/component/aura_healing/Destroy(force) STOP_PROCESSING(SSaura_healing, src) var/alert_category = "aura_healing_[REF(src)]" diff --git a/code/datums/components/basic_mob_attack_telegraph.dm b/code/datums/components/basic_mob_attack_telegraph.dm index 5473dbd0fa0..2ccf2f5022b 100644 --- a/code/datums/components/basic_mob_attack_telegraph.dm +++ b/code/datums/components/basic_mob_attack_telegraph.dm @@ -25,7 +25,7 @@ src.telegraph_duration = telegraph_duration src.on_began_forecast = on_began_forecast -/datum/component/basic_mob_attack_telegraph/Destroy(force, silent) +/datum/component/basic_mob_attack_telegraph/Destroy(force) if(current_target) forget_target(current_target) target_overlay = null diff --git a/code/datums/components/basic_ranged_ready_overlay.dm b/code/datums/components/basic_ranged_ready_overlay.dm index 434a64dd6ff..4bcbd580ca7 100644 --- a/code/datums/components/basic_ranged_ready_overlay.dm +++ b/code/datums/components/basic_ranged_ready_overlay.dm @@ -29,7 +29,7 @@ UnregisterSignal(parent, list(COMSIG_BASICMOB_POST_ATTACK_RANGED, COMSIG_LIVING_REVIVE)) return ..() -/datum/component/basic_ranged_ready_overlay/Destroy(force, silent) +/datum/component/basic_ranged_ready_overlay/Destroy(force) deltimer(waiting_timer) return ..() diff --git a/code/datums/components/boomerang.dm b/code/datums/components/boomerang.dm index 751013d7116..8b35f171c28 100644 --- a/code/datums/components/boomerang.dm +++ b/code/datums/components/boomerang.dm @@ -37,12 +37,13 @@ * * thrown_thing: The thrownthing datum from the parent object's latest throw. Updates thrown_boomerang. * * spin: Carry over from POST_THROW, the speed of rotation on the boomerang when thrown. */ -/datum/component/boomerang/proc/prepare_throw(datum/source, datum/thrownthing/thrown_thing, spin) +/datum/component/boomerang/proc/prepare_throw(datum/source, datum/thrownthing/throwingdatum, spin) SIGNAL_HANDLER - if(thrower_easy_catch_enabled && thrown_thing?.thrower) - if(iscarbon(thrown_thing.thrower)) - var/mob/living/carbon/Carbon = thrown_thing.thrower - Carbon.throw_mode_on(THROW_MODE_TOGGLE) + var/mob/thrower = throwingdatum?.get_thrower() + if(thrower_easy_catch_enabled && thrower) + if(iscarbon(thrower)) + var/mob/living/carbon/carbon_mob = thrower + carbon_mob.throw_mode_on(THROW_MODE_TOGGLE) return /** @@ -63,24 +64,25 @@ * * source: Datum src from original signal call. * * throwing_datum: The thrownthing datum that originally impacted the object, that we use to build the new throwing datum for the rebound. */ -/datum/component/boomerang/proc/return_missed_throw(datum/source, datum/thrownthing/throwing_datum) +/datum/component/boomerang/proc/return_missed_throw(datum/source, datum/thrownthing/throwingdatum) SIGNAL_HANDLER if(!COOLDOWN_FINISHED(src, last_boomerang_throw)) return var/obj/item/true_parent = parent - aerodynamic_swing(throwing_datum, true_parent) + aerodynamic_swing(throwingdatum, true_parent) /** * Proc that triggers when the thrown boomerang has been fully thrown, rethrowing the boomerang back to the thrower, and producing visible feedback. * * throwing_datum: The thrownthing datum that originally impacted the object, that we use to build the new throwing datum for the rebound. * * hit_atom: The atom that has been hit by the boomerang'd object. */ -/datum/component/boomerang/proc/aerodynamic_swing(datum/thrownthing/throwing_datum, obj/item/true_parent) +/datum/component/boomerang/proc/aerodynamic_swing(datum/thrownthing/throwingdatum, obj/item/true_parent) var/mob/thrown_by = true_parent.thrownby?.resolve() if(thrown_by) - addtimer(CALLBACK(true_parent, TYPE_PROC_REF(/atom/movable, throw_at), thrown_by, boomerang_throw_range, throwing_datum.speed, null, TRUE), 1) + addtimer(CALLBACK(true_parent, TYPE_PROC_REF(/atom/movable, throw_at), thrown_by, boomerang_throw_range, throwingdatum.speed, null, TRUE), 1) COOLDOWN_START(src, last_boomerang_throw, BOOMERANG_REBOUND_INTERVAL) - true_parent.visible_message(span_danger("[true_parent] is flying back at [throwing_datum.thrower]!"), \ + var/mob/thrower = throwingdatum?.get_thrower() + true_parent.visible_message(span_danger("[true_parent] is flying back at [thrower]!"), \ span_danger("You see [true_parent] fly back at you!"), \ span_hear("You hear an aerodynamic woosh!")) diff --git a/code/datums/components/boss_music.dm b/code/datums/components/boss_music.dm index 56307d12655..a5d2de4c8d5 100644 --- a/code/datums/components/boss_music.dm +++ b/code/datums/components/boss_music.dm @@ -22,7 +22,7 @@ src.boss_track = boss_track src.track_duration = track_duration -/datum/component/boss_music/Destroy(force, silent) +/datum/component/boss_music/Destroy(force) . = ..() for(var/callback in music_callbacks) deltimer(callback) diff --git a/code/datums/components/bullet_intercepting.dm b/code/datums/components/bullet_intercepting.dm index d8de0680665..c176de54b94 100644 --- a/code/datums/components/bullet_intercepting.dm +++ b/code/datums/components/bullet_intercepting.dm @@ -25,7 +25,7 @@ RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(on_parent_equipped)) RegisterSignal(parent, COMSIG_ITEM_PRE_UNEQUIP, PROC_REF(on_unequipped)) -/datum/component/bullet_intercepting/Destroy(force, silent) +/datum/component/bullet_intercepting/Destroy(force) wearer = null on_intercepted = null return ..() diff --git a/code/datums/components/burning.dm b/code/datums/components/burning.dm index e5624d69b08..2535a5b6f90 100644 --- a/code/datums/components/burning.dm +++ b/code/datums/components/burning.dm @@ -30,7 +30,7 @@ GLOBAL_DATUM_INIT(fire_overlay, /mutable_appearance, mutable_appearance('icons/e particle_effect = new(atom_parent, fire_particles, isitem(atom_parent) ? NONE : PARTICLE_ATTACH_MOB) START_PROCESSING(SSburning, src) -/datum/component/burning/Destroy(force, silent) +/datum/component/burning/Destroy(force) STOP_PROCESSING(SSburning, src) fire_overlay = null if(particle_effect) diff --git a/code/datums/components/butchering.dm b/code/datums/components/butchering.dm index 183203ed709..0cf6631f807 100644 --- a/code/datums/components/butchering.dm +++ b/code/datums/components/butchering.dm @@ -34,7 +34,7 @@ if(isitem(parent)) RegisterSignal(parent, COMSIG_ITEM_ATTACK, PROC_REF(onItemAttack)) -/datum/component/butchering/Destroy(force, silent) +/datum/component/butchering/Destroy(force) butcher_callback = null return ..() diff --git a/code/datums/components/caltrop.dm b/code/datums/components/caltrop.dm index a863eb62d1f..c760adbebb0 100644 --- a/code/datums/components/caltrop.dm +++ b/code/datums/components/caltrop.dm @@ -97,10 +97,10 @@ return if (!(flags & CALTROP_BYPASS_SHOES)) - // SKYRAT EDIT ADDITION BEGIN - Hardened Soles Quirk + // NOVA EDIT ADDITION BEGIN - Hardened Soles Quirk if(HAS_TRAIT(digitigrade_fan, TRAIT_HARD_SOLES)) return - // SKYRAT EDIT ADDITION END + // NOVA EDIT ADDITION END if ((digitigrade_fan.wear_suit?.body_parts_covered | digitigrade_fan.w_uniform?.body_parts_covered | digitigrade_fan.shoes?.body_parts_covered) & FEET) return diff --git a/code/datums/components/cleaner.dm b/code/datums/components/cleaner.dm index 0ab0b199d74..242ad72071c 100644 --- a/code/datums/components/cleaner.dm +++ b/code/datums/components/cleaner.dm @@ -29,7 +29,7 @@ src.pre_clean_callback = pre_clean_callback src.on_cleaned_callback = on_cleaned_callback -/datum/component/cleaner/Destroy(force, silent) +/datum/component/cleaner/Destroy(force) pre_clean_callback = null on_cleaned_callback = null return ..() diff --git a/code/datums/components/combo_attacks.dm b/code/datums/components/combo_attacks.dm index 33989e26682..a8dbe423780 100644 --- a/code/datums/components/combo_attacks.dm +++ b/code/datums/components/combo_attacks.dm @@ -32,7 +32,7 @@ src.leniency_time = leniency_time src.can_attack_callback = can_attack_callback -/datum/component/combo_attacks/Destroy(force, silent) +/datum/component/combo_attacks/Destroy(force) can_attack_callback = null return ..() diff --git a/code/datums/components/cracked.dm b/code/datums/components/cracked.dm index 60264090b31..4d67a9190ea 100644 --- a/code/datums/components/cracked.dm +++ b/code/datums/components/cracked.dm @@ -12,7 +12,7 @@ src.crack_appearances = crack_appearances src.crack_integrity = crack_integrity -/datum/component/cracked/Destroy(force, silent) +/datum/component/cracked/Destroy(force) RemoveCracks(parent, length(applied_cracks)) return ..() diff --git a/code/datums/components/crafting/entertainment.dm b/code/datums/components/crafting/entertainment.dm index d01ffbc00dc..8b2bfa40731 100644 --- a/code/datums/components/crafting/entertainment.dm +++ b/code/datums/components/crafting/entertainment.dm @@ -205,3 +205,12 @@ /obj/item/stack/cable_coil = 2, ) category = CAT_EQUIPMENT + +/datum/crafting_recipe/bonedice + name = "Bone Die" + result = /obj/item/dice/d6/bone + time = 5 SECONDS + reqs = list( + /obj/item/stack/sheet/bone = 1, + ) + category = CAT_EQUIPMENT diff --git a/code/datums/components/crafting/robot.dm b/code/datums/components/crafting/robot.dm index e0c6b4ecd3a..326c58d50c4 100644 --- a/code/datums/components/crafting/robot.dm +++ b/code/datums/components/crafting/robot.dm @@ -131,7 +131,7 @@ /datum/crafting_recipe/hygienebot name = "Hygienebot" - result = /mob/living/simple_animal/bot/hygienebot + result = /mob/living/basic/bot/hygienebot reqs = list( /obj/item/bot_assembly/hygienebot = 1, /obj/item/stack/ducts = 1, diff --git a/code/datums/components/crafting/slapcrafting.dm b/code/datums/components/crafting/slapcrafting.dm index e08fa3ad6c6..a15a8a80b17 100644 --- a/code/datums/components/crafting/slapcrafting.dm +++ b/code/datums/components/crafting/slapcrafting.dm @@ -38,7 +38,7 @@ return src.slapcraft_recipes += slapcraft_recipes -/datum/component/slapcrafting/Destroy(force, silent) +/datum/component/slapcrafting/Destroy(force) UnregisterSignal(parent, list(COMSIG_ATOM_ATTACKBY, COMSIG_ATOM_EXAMINE, COMSIG_ATOM_EXAMINE_MORE)) return ..() diff --git a/code/datums/components/crafting/tools.dm b/code/datums/components/crafting/tools.dm index b7d93f162a5..15cc565d5e0 100644 --- a/code/datums/components/crafting/tools.dm +++ b/code/datums/components/crafting/tools.dm @@ -14,7 +14,7 @@ reqs = list(/obj/item/grown/log = 5) parts = list(/obj/item/grown/log = 5) blacklist = list(/obj/item/grown/log/steel) - result = /obj/structure/bonfire/player_made // SKYRAT EDIT - Pollution - ORIGINAL: result = /obj/structure/bonfire + result = /obj/structure/bonfire/player_made // NOVA EDIT - Pollution - ORIGINAL: result = /obj/structure/bonfire category = CAT_TOOLS /datum/crafting_recipe/boneshovel diff --git a/code/datums/components/crank_recharge.dm b/code/datums/components/crank_recharge.dm index 455fa9298f9..3cee7088008 100644 --- a/code/datums/components/crank_recharge.dm +++ b/code/datums/components/crank_recharge.dm @@ -54,7 +54,7 @@ is_charging = FALSE return charging_cell.give(charge_amount) - SEND_SIGNAL(parent, COMSIG_UPDATE_AMMO_HUD) // SKYRAT EDIT ADDITION - AMMO COUNT HUD + SEND_SIGNAL(parent, COMSIG_UPDATE_AMMO_HUD) // NOVA EDIT ADDITION - AMMO COUNT HUD source.update_appearance() is_charging = FALSE source.balloon_alert(user, "charged") diff --git a/code/datums/components/crate_carrier.dm b/code/datums/components/crate_carrier.dm index a36128b89e1..9f2f1ac9dae 100644 --- a/code/datums/components/crate_carrier.dm +++ b/code/datums/components/crate_carrier.dm @@ -23,7 +23,7 @@ var/static/default_cache = typecacheof(list(/obj/structure/closet/crate)) src.carriable_cache = default_cache -/datum/component/crate_carrier/Destroy(force, silent) +/datum/component/crate_carrier/Destroy(force) LAZYCLEARLIST(crates_in_hand) return ..() diff --git a/code/datums/components/cult_ritual_item.dm b/code/datums/components/cult_ritual_item.dm index 749fa1eac1c..c3acb0b9467 100644 --- a/code/datums/components/cult_ritual_item.dm +++ b/code/datums/components/cult_ritual_item.dm @@ -39,7 +39,7 @@ 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) +/datum/component/cult_ritual_item/Destroy(force) cleanup_shields() QDEL_NULL(linked_action_ref) return ..() diff --git a/code/datums/components/customizable_reagent_holder.dm b/code/datums/components/customizable_reagent_holder.dm index 36c84fc94af..7bffb3d9ada 100644 --- a/code/datums/components/customizable_reagent_holder.dm +++ b/code/datums/components/customizable_reagent_holder.dm @@ -55,7 +55,7 @@ handle_fill(ingredient) -/datum/component/customizable_reagent_holder/Destroy(force, silent) +/datum/component/customizable_reagent_holder/Destroy(force) QDEL_NULL(top_overlay) return ..() diff --git a/code/datums/components/damage_aura.dm b/code/datums/components/damage_aura.dm index e1111dc628d..b4c535cb52d 100644 --- a/code/datums/components/damage_aura.dm +++ b/code/datums/components/damage_aura.dm @@ -74,7 +74,7 @@ src.immune_factions = immune_factions src.current_owner = WEAKREF(current_owner) -/datum/component/damage_aura/Destroy(force, silent) +/datum/component/damage_aura/Destroy(force) STOP_PROCESSING(SSobj, src) return ..() diff --git a/code/datums/components/damage_chain.dm b/code/datums/components/damage_chain.dm index be61ec68a33..9b24a4c2bae 100644 --- a/code/datums/components/damage_chain.dm +++ b/code/datums/components/damage_chain.dm @@ -61,7 +61,7 @@ /datum/component/damage_chain/UnregisterFromParent() UnregisterSignal(parent, COMSIG_LIVING_DEATH) -/datum/component/damage_chain/Destroy(force, silent) +/datum/component/damage_chain/Destroy(force) if (!QDELETED(chain)) UnregisterSignal(chain, COMSIG_QDELETING) QDEL_NULL(chain) diff --git a/code/datums/components/deadchat_control.dm b/code/datums/components/deadchat_control.dm index f1ec2d73bc8..7517f35ff29 100644 --- a/code/datums/components/deadchat_control.dm +++ b/code/datums/components/deadchat_control.dm @@ -48,7 +48,7 @@ SSpoints_of_interest.make_point_of_interest(parent) generated_point_of_interest = TRUE -/datum/component/deadchat_control/Destroy(force, silent) +/datum/component/deadchat_control/Destroy(force) on_removal?.Invoke() inputs = null orbiters = null diff --git a/code/datums/components/direct_explosive_trap.dm b/code/datums/components/direct_explosive_trap.dm index 0d204f21a1e..e3a125eb928 100644 --- a/code/datums/components/direct_explosive_trap.dm +++ b/code/datums/components/direct_explosive_trap.dm @@ -46,7 +46,7 @@ if (!isnull(saboteur)) UnregisterSignal(saboteur, COMSIG_QDELETING) -/datum/component/direct_explosive_trap/Destroy(force, silent) +/datum/component/direct_explosive_trap/Destroy(force) if (isnull(saboteur)) return ..() UnregisterSignal(saboteur, COMSIG_QDELETING) diff --git a/code/datums/components/echolocation.dm b/code/datums/components/echolocation.dm index 2de6d028605..5e4f7528415 100644 --- a/code/datums/components/echolocation.dm +++ b/code/datums/components/echolocation.dm @@ -63,7 +63,7 @@ echolocator.overlay_fullscreen("echo", /atom/movable/screen/fullscreen/echo, echo_icon) START_PROCESSING(SSfastprocess, src) -/datum/component/echolocation/Destroy(force, silent) +/datum/component/echolocation/Destroy(force) STOP_PROCESSING(SSfastprocess, src) var/mob/living/echolocator = parent QDEL_NULL(client_color) diff --git a/code/datums/components/effect_remover.dm b/code/datums/components/effect_remover.dm index 7f1f437eddf..a02be73f568 100644 --- a/code/datums/components/effect_remover.dm +++ b/code/datums/components/effect_remover.dm @@ -41,7 +41,7 @@ src.effects_we_clear = typecacheof(effects_we_clear) src.time_to_remove = time_to_remove -/datum/component/effect_remover/Destroy(force, silent) +/datum/component/effect_remover/Destroy(force) on_clear_callback = null return ..() diff --git a/code/datums/components/egg_layer.dm b/code/datums/components/egg_layer.dm index a1e137de6d3..3092829fd13 100644 --- a/code/datums/components/egg_layer.dm +++ b/code/datums/components/egg_layer.dm @@ -47,7 +47,7 @@ . = ..() UnregisterSignal(parent, COMSIG_ATOM_ATTACKBY) -/datum/component/egg_layer/Destroy(force, silent) +/datum/component/egg_layer/Destroy(force) . = ..() STOP_PROCESSING(SSobj, src) egg_laid_callback = null diff --git a/code/datums/components/energized.dm b/code/datums/components/energized.dm index 97ff670113f..d637bc2eb76 100644 --- a/code/datums/components/energized.dm +++ b/code/datums/components/energized.dm @@ -76,7 +76,7 @@ if(prob(100 - toast_prob)) if(prob(25)) do_sparks(1, FALSE, source) - playsound(src, SFX_SPARKS, 40, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + playsound(parent, SFX_SPARKS, 40, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) source.audible_message(span_danger("[parent] makes an electric crackle...")) return FALSE @@ -116,10 +116,10 @@ header = "Electrifying!", ) do_sparks(4, FALSE, source) - playsound(src, SFX_SPARKS, 75, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + playsound(parent, SFX_SPARKS, 75, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) source.audible_message(span_danger("[parent] makes a loud electric crackle!")) to_chat(future_tram_victim, span_userdanger("You hear a loud electric crackle!")) - future_tram_victim.electrocute_act(15, src, 1) + future_tram_victim.electrocute_act(15, parent, 1) return TRUE #undef NORMAL_TOAST_PROB diff --git a/code/datums/components/engraved.dm b/code/datums/components/engraved.dm index 016e3082a8d..60bfa5f6177 100644 --- a/code/datums/components/engraved.dm +++ b/code/datums/components/engraved.dm @@ -52,7 +52,7 @@ RegisterSignal(parent, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(on_update_overlays)) engraved_wall.update_appearance() -/datum/component/engraved/Destroy(force, silent) +/datum/component/engraved/Destroy(force) if(!parent) return ..() parent.RemoveElement(/datum/element/art) diff --git a/code/datums/components/evolutionary_leap.dm b/code/datums/components/evolutionary_leap.dm index 5ff7f31beaa..3a47dbbdcf0 100644 --- a/code/datums/components/evolutionary_leap.dm +++ b/code/datums/components/evolutionary_leap.dm @@ -30,7 +30,7 @@ setup_timer() -/datum/component/evolutionary_leap/Destroy(force, silent) +/datum/component/evolutionary_leap/Destroy(force) . = ..() deltimer(timer_id) diff --git a/code/datums/components/focused_attacker.dm b/code/datums/components/focused_attacker.dm index 8635973f263..c927aab8822 100644 --- a/code/datums/components/focused_attacker.dm +++ b/code/datums/components/focused_attacker.dm @@ -17,7 +17,7 @@ src.maximum_gain = maximum_gain src.gain_per_attack = gain_per_attack -/datum/component/focused_attacker/Destroy(force, silent) +/datum/component/focused_attacker/Destroy(force) if (!isnull(last_target)) UnregisterSignal(last_target, COMSIG_QDELETING) return ..() diff --git a/code/datums/components/food/edible.dm b/code/datums/components/food/edible.dm index 9986b2a4d43..b7b6bda2f5a 100644 --- a/code/datums/components/food/edible.dm +++ b/code/datums/components/food/edible.dm @@ -187,7 +187,7 @@ Behavior that's still missing from this component that original food items had t // add newly passed in reagents setup_initial_reagents(initial_reagents) -/datum/component/edible/Destroy(force, silent) +/datum/component/edible/Destroy(force) after_eat = null on_consume = null check_liked = null diff --git a/code/datums/components/food/ghost_edible.dm b/code/datums/components/food/ghost_edible.dm index 801aa95cb6b..fb8a0c55559 100644 --- a/code/datums/components/food/ghost_edible.dm +++ b/code/datums/components/food/ghost_edible.dm @@ -36,7 +36,7 @@ /datum/component/ghost_edible/UnregisterFromParent() STOP_PROCESSING(SSdcs, src) -/datum/component/ghost_edible/Destroy(force, silent) +/datum/component/ghost_edible/Destroy(force) STOP_PROCESSING(SSdcs, src) return ..() diff --git a/code/datums/components/food/golem_food.dm b/code/datums/components/food/golem_food.dm index c2540f54cc1..136d495b59e 100644 --- a/code/datums/components/food/golem_food.dm +++ b/code/datums/components/food/golem_food.dm @@ -29,7 +29,7 @@ UnregisterSignal(parent, list(COMSIG_ITEM_ATTACK, COMSIG_ATOM_EXAMINE)) return ..() -/datum/component/golem_food/Destroy(force, silent) +/datum/component/golem_food/Destroy(force) QDEL_NULL(golem_snack) snack_type = null extra_validation = null diff --git a/code/datums/components/food_storage.dm b/code/datums/components/food_storage.dm index 60fc3f6c486..cb1008f88f0 100644 --- a/code/datums/components/food_storage.dm +++ b/code/datums/components/food_storage.dm @@ -33,7 +33,7 @@ food.flags_1 |= HAS_CONTEXTUAL_SCREENTIPS_1 -/datum/component/food_storage/Destroy(force, silent) +/datum/component/food_storage/Destroy(force) if(stored_item) stored_item.forceMove(stored_item.drop_location()) stored_item.dropped() diff --git a/code/datums/components/fov_handler.dm b/code/datums/components/fov_handler.dm index 0390357aced..73d04a6b0e6 100644 --- a/code/datums/components/fov_handler.dm +++ b/code/datums/components/fov_handler.dm @@ -10,8 +10,6 @@ var/fov_angle = FOV_180_DEGREES /// The blocker mask applied to a client's screen var/atom/movable/screen/fov_blocker/blocker_mask - /// The shadow mask applied to a client's screen - var/atom/movable/screen/fov_shadow/visual_shadow /datum/component/fov_handler/Initialize(fov_type = FOV_180_DEGREES) if(!isliving(parent)) @@ -22,13 +20,9 @@ qdel(src) //no QDEL hint for components, and we dont want this to print a warning regarding bad component application return - for(var/atom/movable/screen/plane_master/plane_master as anything in mob_parent.hud_used.get_true_plane_masters(FIELD_OF_VISION_BLOCKER_PLANE)) - plane_master.unhide_plane(mob_parent) + ADD_TRAIT(mob_parent, TRAIT_FOV_APPLIED, REF(src)) blocker_mask = new - visual_shadow = new - //visual_shadow.alpha = parent_client?.prefs.read_preference(/datum/preference/numeric/fov_darkness) //SKYRAT EDIT REMOVAL - update_visual_shadow_alpha() //SKYRAT EDIT ADDITION set_fov_angle(fov_type) on_dir_change(mob_parent, mob_parent.dir, mob_parent.dir) update_fov_size() @@ -36,21 +30,17 @@ /datum/component/fov_handler/Destroy() var/mob/living/mob_parent = parent - for(var/atom/movable/screen/plane_master/plane_master as anything in mob_parent.hud_used.get_true_plane_masters(FIELD_OF_VISION_BLOCKER_PLANE)) - plane_master.hide_plane(mob_parent) + REMOVE_TRAIT(mob_parent, TRAIT_FOV_APPLIED, REF(src)) if(applied_mask) remove_mask() if(blocker_mask) // In a case of early deletion due to volatile client QDEL_NULL(blocker_mask) - if(visual_shadow) // In a case of early deletion due to volatile client - QDEL_NULL(visual_shadow) return ..() /datum/component/fov_handler/proc/set_fov_angle(new_angle) fov_angle = new_angle blocker_mask.icon_state = "[fov_angle]" - visual_shadow.icon_state = "[fov_angle]_v" /// Updates the size of the FOV masks by comparing them to client view size. /datum/component/fov_handler/proc/update_fov_size() @@ -71,8 +61,8 @@ var/y_scale = view_size[2] / current_fov_y current_fov_x = view_size[1] current_fov_y = view_size[2] - visual_shadow.transform = blocker_mask.transform = new_matrix.Scale(x_scale, y_scale) - visual_shadow.transform = blocker_mask.transform = new_matrix.Translate(x_shift * 16, y_shift * 16) + blocker_mask.transform = new_matrix.Scale(x_scale, y_scale) + blocker_mask.transform = new_matrix.Translate(x_shift * 16, y_shift * 16) /// Updates the mask application to client by checking `stat` and `eye` /datum/component/fov_handler/proc/update_mask() @@ -99,13 +89,10 @@ var/client/parent_client = parent_mob.client // Prevents stupid ass hard deletes parent_mob.hud_used.always_visible_inventory -= blocker_mask - parent_mob.hud_used.always_visible_inventory -= visual_shadow if(!parent_client) //Love client volatility!! return applied_mask = FALSE parent_client.screen -= blocker_mask - parent_client.screen -= visual_shadow - /datum/component/fov_handler/proc/add_mask() var/mob/parent_mob = parent @@ -114,15 +101,12 @@ return applied_mask = TRUE parent_client.screen += blocker_mask - parent_client.screen += visual_shadow parent_mob.hud_used.always_visible_inventory += blocker_mask - parent_mob.hud_used.always_visible_inventory += visual_shadow /// When a direction of the user changes, so do the masks /datum/component/fov_handler/proc/on_dir_change(mob/source, old_dir, new_dir) SIGNAL_HANDLER blocker_mask.dir = new_dir - visual_shadow.dir = new_dir /// When a mob logs out, delete the component /datum/component/fov_handler/proc/mob_logout(mob/source) @@ -137,19 +121,7 @@ RegisterSignal(parent, COMSIG_MOB_CLIENT_CHANGE_VIEW, PROC_REF(update_fov_size)) RegisterSignal(parent, COMSIG_MOB_RESET_PERSPECTIVE, PROC_REF(update_mask)) RegisterSignal(parent, COMSIG_MOB_LOGOUT, PROC_REF(mob_logout)) - RegisterSignal(parent, COMSIG_LIVING_COMBAT_MODE_TOGGLE, PROC_REF(update_visual_shadow_alpha)) //SKYRAT EDIT ADDITION /datum/component/fov_handler/UnregisterFromParent() . = ..() UnregisterSignal(parent, list(COMSIG_MOB_RESET_PERSPECTIVE, COMSIG_ATOM_DIR_CHANGE, COMSIG_LIVING_DEATH, COMSIG_LIVING_REVIVE, COMSIG_MOB_LOGOUT)) - UnregisterSignal(parent, COMSIG_LIVING_COMBAT_MODE_TOGGLE) //SKYRAT EDIT ADDITION - -//SKYRAT EDIT ADDITION BEGIN -/// When toggling combat mode, we update the alpha of the shadow mask -/datum/component/fov_handler/proc/update_visual_shadow_alpha() - SIGNAL_HANDLER - var/mob/living/parent_mob = parent - var/pref_to_read = parent_mob.combat_mode ? /datum/preference/numeric/fov_darkness : /datum/preference/numeric/out_of_combat_fov_darkness - var/target_alpha = parent_mob.client.prefs.read_preference(pref_to_read) - visual_shadow.alpha = target_alpha -//SKYRAT EDIT ADDITION END diff --git a/code/datums/components/gas_leaker.dm b/code/datums/components/gas_leaker.dm index d386b73ff00..eeceb73f5fa 100644 --- a/code/datums/components/gas_leaker.dm +++ b/code/datums/components/gas_leaker.dm @@ -30,7 +30,7 @@ src.integrity_leak_percent = integrity_leak_percent src.leak_rate = leak_rate -/datum/component/gas_leaker/Destroy(force, silent) +/datum/component/gas_leaker/Destroy(force) SSair.stop_processing_machine(src) return ..() diff --git a/code/datums/components/geiger_sound.dm b/code/datums/components/geiger_sound.dm index 3a8a22df383..441aef27756 100644 --- a/code/datums/components/geiger_sound.dm +++ b/code/datums/components/geiger_sound.dm @@ -8,7 +8,7 @@ if (!isatom(parent)) return COMPONENT_INCOMPATIBLE -/datum/component/geiger_sound/Destroy(force, silent) +/datum/component/geiger_sound/Destroy(force) QDEL_NULL(sound) if (!isnull(last_parent)) diff --git a/code/datums/components/ghost_direct_control.dm b/code/datums/components/ghost_direct_control.dm index c4d08380db1..83c893b6dca 100644 --- a/code/datums/components/ghost_direct_control.dm +++ b/code/datums/components/ghost_direct_control.dm @@ -47,7 +47,7 @@ UnregisterSignal(parent, list(COMSIG_ATOM_ATTACK_GHOST, COMSIG_ATOM_EXAMINE)) return ..() -/datum/component/ghost_direct_control/Destroy(force, silent) +/datum/component/ghost_direct_control/Destroy(force) extra_control_checks = null after_assumed_control = null @@ -73,12 +73,14 @@ if (!(GLOB.ghost_role_flags & GHOSTROLE_SPAWNER)) return awaiting_ghosts = TRUE - var/list/mob/dead/observer/candidates = poll_ghost_candidates( + var/list/mob/dead/observer/candidates = SSpolling.poll_ghost_candidates( question = "Do you want to play as [role_name]?", - jobban_type = ban_type, - be_special_flag = ban_type, + check_jobban = ban_type, + role = ban_type, poll_time = poll_length, ignore_category = poll_ignore_key, + pic_source = parent, + role_name_text = role_name, ) awaiting_ghosts = FALSE if (!LAZYLEN(candidates)) diff --git a/code/datums/components/grillable.dm b/code/datums/components/grillable.dm index 72c2e75e8cb..b74ae607290 100644 --- a/code/datums/components/grillable.dm +++ b/code/datums/components/grillable.dm @@ -83,11 +83,11 @@ SIGNAL_HANDLER . = COMPONENT_HANDLED_GRILLING - //SKYRAT EDIT ADDITION + //NOVA EDIT ADDITION if(pollutant_type) var/turf/parent_turf = get_turf(parent) parent_turf.pollute_turf(pollutant_type, 10) - //SKYRAT EDIT END + //NOVA EDIT END current_cook_time += seconds_per_tick * 10 //turn it into ds if(current_cook_time >= required_cook_time) diff --git a/code/datums/components/ground_sinking.dm b/code/datums/components/ground_sinking.dm index b4f069fb507..d29e84908a4 100644 --- a/code/datums/components/ground_sinking.dm +++ b/code/datums/components/ground_sinking.dm @@ -59,7 +59,7 @@ deltimer(ground_sinking_start_timer) UnregisterSignal(parent, COMSIG_MOVABLE_MOVED) -/datum/component/ground_sinking/Destroy(force, silent) +/datum/component/ground_sinking/Destroy(force) if(sinked || is_sinking) unsink() . = ..() diff --git a/code/datums/components/growth_and_differentiation.dm b/code/datums/components/growth_and_differentiation.dm index 0920344ce58..a6e10b98f6d 100644 --- a/code/datums/components/growth_and_differentiation.dm +++ b/code/datums/components/growth_and_differentiation.dm @@ -63,7 +63,7 @@ return setup_growth_tracking() -/datum/component/growth_and_differentiation/Destroy(force, silent) +/datum/component/growth_and_differentiation/Destroy(force) STOP_PROCESSING(SSdcs, src) deltimer(timer_id) optional_checks = null diff --git a/code/datums/components/gunpoint.dm b/code/datums/components/gunpoint.dm index bf44f1c4b3c..cb8dfb1ec8d 100644 --- a/code/datums/components/gunpoint.dm +++ b/code/datums/components/gunpoint.dm @@ -73,7 +73,7 @@ addtimer(CALLBACK(src, PROC_REF(update_stage), 2), GUNPOINT_DELAY_STAGE_2) -/datum/component/gunpoint/Destroy(force, silent) +/datum/component/gunpoint/Destroy(force) var/mob/living/shooter = parent shooter.remove_status_effect(/datum/status_effect/holdup) target.remove_status_effect(/datum/status_effect/grouped/heldup, REF(shooter)) diff --git a/code/datums/components/hazard_area.dm b/code/datums/components/hazard_area.dm index 79b4399023e..f747e8e2ace 100644 --- a/code/datums/components/hazard_area.dm +++ b/code/datums/components/hazard_area.dm @@ -39,7 +39,7 @@ UnregisterSignal(SSdcs, COMSIG_AREA_CREATED) parent_mob.lose_area_sensitivity(type) -/datum/component/hazard_area/Destroy(force, silent) +/datum/component/hazard_area/Destroy(force) . = ..() area_created = null diff --git a/code/datums/components/healing_touch.dm b/code/datums/components/healing_touch.dm index cf6ef88f24d..bc0493b4787 100644 --- a/code/datums/components/healing_touch.dm +++ b/code/datums/components/healing_touch.dm @@ -103,7 +103,7 @@ UnregisterSignal(parent, list(COMSIG_LIVING_UNARMED_ATTACK, COMSIG_HOSTILE_PRE_ATTACKINGTARGET)) return ..() -/datum/component/healing_touch/Destroy(force, silent) +/datum/component/healing_touch/Destroy(force) extra_checks = null return ..() diff --git a/code/datums/components/health_scaling_effects.dm b/code/datums/components/health_scaling_effects.dm index 140a60ea962..e3754ae2061 100644 --- a/code/datums/components/health_scaling_effects.dm +++ b/code/datums/components/health_scaling_effects.dm @@ -53,7 +53,7 @@ UnregisterSignal(parent, COMSIG_LIVING_HEALTH_UPDATE) return ..() -/datum/component/health_scaling_effects/Destroy(force, silent) +/datum/component/health_scaling_effects/Destroy(force) additional_status_callback = null return ..() diff --git a/code/datums/components/heirloom.dm b/code/datums/components/heirloom.dm index 064c33ff7d7..fe3aa73bcd3 100644 --- a/code/datums/components/heirloom.dm +++ b/code/datums/components/heirloom.dm @@ -14,7 +14,7 @@ RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) -/datum/component/heirloom/Destroy(force, silent) +/datum/component/heirloom/Destroy(force) owner = null return ..() diff --git a/code/datums/components/interaction_booby_trap.dm b/code/datums/components/interaction_booby_trap.dm index 12cf0a7c677..2ae22ffbb5a 100644 --- a/code/datums/components/interaction_booby_trap.dm +++ b/code/datums/components/interaction_booby_trap.dm @@ -56,7 +56,7 @@ if (length(additional_triggers)) RegisterSignals(parent, additional_triggers, PROC_REF(trigger_explosive)) -/datum/component/interaction_booby_trap/Destroy(force, silent) +/datum/component/interaction_booby_trap/Destroy(force) UnregisterSignal(parent, list(COMSIG_ATOM_ATTACK_HAND, COMSIG_ATOM_TOOL_ACT(defuse_tool), COMSIG_ATOM_EXAMINE_MORE) + additional_triggers) QDEL_NULL(active_sound_loop) on_triggered_callback = null diff --git a/code/datums/components/irradiated.dm b/code/datums/components/irradiated.dm index bffd56459bf..805288fe486 100644 --- a/code/datums/components/irradiated.dm +++ b/code/datums/components/irradiated.dm @@ -58,7 +58,7 @@ COMSIG_GEIGER_COUNTER_SCAN, )) -/datum/component/irradiated/Destroy(force, silent) +/datum/component/irradiated/Destroy(force) var/atom/movable/parent_movable = parent if (istype(parent_movable)) parent_movable.remove_filter("rad_glow") diff --git a/code/datums/components/itembound.dm b/code/datums/components/itembound.dm index f742c1233fd..f6df7f0bab5 100644 --- a/code/datums/components/itembound.dm +++ b/code/datums/components/itembound.dm @@ -40,7 +40,7 @@ return qdel(src) -/datum/component/itembound/Destroy(force, silent) +/datum/component/itembound/Destroy(force) var/atom/movable/container = containerref?.resolve() if (!QDELETED(container)) UnregisterSignal(container, COMSIG_ATOM_EXAMINE_MORE) diff --git a/code/datums/components/jetpack.dm b/code/datums/components/jetpack.dm index f7e1fca70e6..3e0fd28ed80 100644 --- a/code/datums/components/jetpack.dm +++ b/code/datums/components/jetpack.dm @@ -63,7 +63,7 @@ if(trail && trail.effect_type != effect_type) setup_trail(trail.holder) -/datum/component/jetpack/Destroy(force, silent) +/datum/component/jetpack/Destroy(force) if(trail) QDEL_NULL(trail) check_on_move = null diff --git a/code/datums/components/keep_me_secure.dm b/code/datums/components/keep_me_secure.dm index 9bce3ab5e86..84e295db178 100644 --- a/code/datums/components/keep_me_secure.dm +++ b/code/datums/components/keep_me_secure.dm @@ -22,7 +22,7 @@ src.secured_callback = secured_callback src.unsecured_callback = unsecured_callback -/datum/component/keep_me_secure/Destroy(force, silent) +/datum/component/keep_me_secure/Destroy(force) secured_callback = null unsecured_callback = null return ..() diff --git a/code/datums/components/light_eater.dm b/code/datums/components/light_eater.dm index 0501af5e0cb..11344d5f37c 100644 --- a/code/datums/components/light_eater.dm +++ b/code/datums/components/light_eater.dm @@ -22,7 +22,7 @@ LAZYSET(cached_eaten_lights, morsel, TRUE) RegisterSignal(morsel, COMSIG_QDELETING, PROC_REF(deref_eaten_light)) -/datum/component/light_eater/Destroy(force, silent) +/datum/component/light_eater/Destroy(force) for(var/light in eaten_lights) var/atom/eaten_light = light eaten_light.RemoveElement(/datum/element/light_eaten) diff --git a/code/datums/components/listen_and_repeat.dm b/code/datums/components/listen_and_repeat.dm index 307e515bbb2..f3006d3111d 100644 --- a/code/datums/components/listen_and_repeat.dm +++ b/code/datums/components/listen_and_repeat.dm @@ -33,7 +33,7 @@ ADD_TRAIT(parent, TRAIT_SUBTREE_REQUIRED_OPERATIONAL_DATUM, type) -/datum/component/listen_and_repeat/Destroy(force, silent) +/datum/component/listen_and_repeat/Destroy(force) REMOVE_TRAIT(parent, TRAIT_SUBTREE_REQUIRED_OPERATIONAL_DATUM, type) return ..() @@ -49,11 +49,11 @@ if(over_radio && prob(RADIO_IGNORE_CHANCE)) return - //SKYRAT EDIT ADDITION START - parrot commands + //NOVA EDIT ADDITION START - parrot commands var/mob/living/basic/parrot/maybe_parrot = parent if(!over_radio && istype(maybe_parrot)) maybe_parrot.check_command(message, speaker) - // SKYRAT EDIT ADDITION END + // NOVA EDIT ADDITION END var/number_of_excess_strings = LAZYLEN(speech_buffer) - MAX_SPEECH_BUFFER_SIZE if(number_of_excess_strings > 0) // only remove if we're overfull diff --git a/code/datums/components/lock_on_cursor.dm b/code/datums/components/lock_on_cursor.dm index 30140dd95bd..4b78f031aa0 100644 --- a/code/datums/components/lock_on_cursor.dm +++ b/code/datums/components/lock_on_cursor.dm @@ -62,7 +62,7 @@ mouse_tracker.assign_to_mob(owner) START_PROCESSING(SSfastprocess, src) -/datum/component/lock_on_cursor/Destroy(force, silent) +/datum/component/lock_on_cursor/Destroy(force) clear_visuals() STOP_PROCESSING(SSfastprocess, src) mouse_tracker = null diff --git a/code/datums/components/magnet.dm b/code/datums/components/magnet.dm index 5c78b8665ce..2d1d8932dfa 100644 --- a/code/datums/components/magnet.dm +++ b/code/datums/components/magnet.dm @@ -40,7 +40,7 @@ STOP_PROCESSING(SSdcs, src) UnregisterSignal(parent, COMSIG_MOB_STATCHANGE) -/datum/component/magnet/Destroy(force, silent) +/datum/component/magnet/Destroy(force) STOP_PROCESSING(SSdcs, src) on_pulled = null on_contact = null diff --git a/code/datums/components/manual_blinking.dm b/code/datums/components/manual_blinking.dm index 1a742c68678..67229a8b85f 100644 --- a/code/datums/components/manual_blinking.dm +++ b/code/datums/components/manual_blinking.dm @@ -22,7 +22,7 @@ last_blink = world.time to_chat(C, span_notice("You suddenly realize you're blinking manually.")) -/datum/component/manual_blinking/Destroy(force, silent) +/datum/component/manual_blinking/Destroy(force) E = null STOP_PROCESSING(SSdcs, src) to_chat(parent, span_notice("You revert back to automatic blinking.")) diff --git a/code/datums/components/manual_breathing.dm b/code/datums/components/manual_breathing.dm index 0488cce6aa3..d8d4fea07d9 100644 --- a/code/datums/components/manual_breathing.dm +++ b/code/datums/components/manual_breathing.dm @@ -22,7 +22,7 @@ last_breath = world.time to_chat(C, span_notice("You suddenly realize you're breathing manually.")) -/datum/component/manual_breathing/Destroy(force, silent) +/datum/component/manual_breathing/Destroy(force) L = null STOP_PROCESSING(SSdcs, src) to_chat(parent, span_notice("You revert back to automatic breathing.")) diff --git a/code/datums/components/material/material_container.dm b/code/datums/components/material/material_container.dm index 8acf3e274f1..e84e3a46c82 100644 --- a/code/datums/components/material/material_container.dm +++ b/code/datums/components/material/material_container.dm @@ -30,13 +30,13 @@ /// Sets up the proper signals and fills the list of materials with the appropriate references. /datum/component/material_container/Initialize( - list/init_mats, - max_amt = 0, - _mat_container_flags = NONE, - list/allowed_mats = init_mats, - list/allowed_items, - list/container_signals - ) + list/init_mats, + max_amt = 0, + _mat_container_flags = NONE, + list/allowed_mats = init_mats, + list/allowed_items, + list/container_signals +) if(!isatom(parent)) return COMPONENT_INCOMPATIBLE @@ -74,7 +74,7 @@ RegisterSignal(atom_target, COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM, PROC_REF(on_requesting_context_from_item)) -/datum/component/material_container/Destroy(force, silent) +/datum/component/material_container/Destroy(force) retrieve_all() materials = null allowed_materials = null @@ -133,17 +133,16 @@ * Arguments: * - [source][/obj/item]: The source of the materials we are inserting. * - multiplier: The multiplier for the materials extract from this item being inserted. - * - breakdown_flags: The breakdown bitflags that will be used to retrieve the materials from the source * - context: the atom performing the operation, this is the last argument sent in COMSIG_MATCONTAINER_ITEM_CONSUMED * and is used mostly for silo logging, the silo resends this signal on the context to give it a * chance to process the item */ -/datum/component/material_container/proc/insert_item_materials(obj/item/source, multiplier = 1, breakdown_flags = mat_container_flags, atom/context = parent) +/datum/component/material_container/proc/insert_item_materials(obj/item/source, multiplier = 1, atom/context = parent) var/primary_mat var/max_mat_value = 0 var/material_amount = 0 - var/list/item_materials = source.get_material_composition(breakdown_flags) + var/list/item_materials = source.get_material_composition() var/list/mats_consumed = list() for(var/MAT in item_materials) if(!can_hold_material(MAT)) @@ -200,17 +199,16 @@ * Arguments: * - [weapon][obj/item]: the item you are trying to insert * - multiplier: The multiplier for the materials being inserted - * - breakdown_flags: The breakdown bitflags that will be used to retrieve the materials from the source * - context: the atom performing the operation, this is the last argument sent in COMSIG_MATCONTAINER_ITEM_CONSUMED and is used mostly for silo logging */ -/datum/component/material_container/proc/insert_item(obj/item/weapon, multiplier = 1, breakdown_flags = mat_container_flags, atom/context = parent) +/datum/component/material_container/proc/insert_item(obj/item/weapon, multiplier = 1, atom/context = parent) if(QDELETED(weapon)) return MATERIAL_INSERT_ITEM_NO_MATS multiplier = CEILING(multiplier, 0.01) var/obj/item/target = weapon - var/material_amount = OPTIMAL_COST(get_item_material_amount(target, breakdown_flags) * multiplier) + var/material_amount = OPTIMAL_COST(get_item_material_amount(target) * multiplier) if(!material_amount) return MATERIAL_INSERT_ITEM_NO_MATS var/obj/item/stack/item_stack @@ -224,7 +222,7 @@ if(!sheets_to_insert) return MATERIAL_INSERT_ITEM_NO_SPACE target = fast_split_stack(item_stack, sheets_to_insert) - material_amount = get_item_material_amount(target, breakdown_flags) * multiplier + material_amount = get_item_material_amount(target) * multiplier material_amount = OPTIMAL_COST(material_amount) //not enough space, time to bail @@ -232,7 +230,7 @@ return MATERIAL_INSERT_ITEM_NO_SPACE //do the insert - var/last_inserted_id = insert_item_materials(target, multiplier, breakdown_flags, context) + var/last_inserted_id = insert_item_materials(target, multiplier, context) if(!isnull(last_inserted_id)) qdel(target) //item gone return material_amount @@ -254,10 +252,9 @@ * Arguments: * * held_item - the item to insert * * user - the mob inserting this item - * * breakdown_flags - how this item and all it's contents inside are broken down during insertion. This is unique to the machine doing the insertion * * context - the atom performing the operation, this is the last argument sent in COMSIG_MATCONTAINER_ITEM_CONSUMED and is used mostly for silo logging */ -/datum/component/material_container/proc/user_insert(obj/item/held_item, mob/living/user, breakdown_flags = mat_container_flags, atom/context = parent) +/datum/component/material_container/proc/user_insert(obj/item/held_item, mob/living/user, atom/context = parent) set waitfor = FALSE . = 0 @@ -342,7 +339,7 @@ if(!isstack(target_item) && !is_type_in_list(target_item, storage_items)) var/total_amount = 0 for(var/obj/item/weapon as anything in target_item.get_all_contents_type(/obj/item)) - total_amount += get_item_material_amount(weapon, breakdown_flags) + total_amount += get_item_material_amount(weapon) if(!has_space(total_amount)) if(!(mat_container_flags & MATCONTAINER_SILENT)) to_chat(user, span_warning("[parent] does not have enough space for [target_item]!")) @@ -397,7 +394,7 @@ item_name = the_stack.singular_name item_count = the_stack.amount is_stack = TRUE - inserted = insert_item(target_item, 1, mat_container_flags, context) + inserted = insert_item(target_item, 1, context) if(inserted > 0) . += inserted inserted /= SHEET_MATERIAL_AMOUNT // display units inserted as sheets for improved readability @@ -418,11 +415,9 @@ //collect all messages to print later var/list/status_data = chat_msgs["[MATERIAL_INSERT_ITEM_SUCCESS]"] || list() var/list/item_data = status_data[item_name] || list() + item_data["count"] += item_count item_data["amount"] += inserted - if(!is_stack) //count will match with amount so its not required - item_data["count"] += item_count - else - item_data["stack"] = TRUE + item_data["stack"] = is_stack status_data[item_name] = item_data chat_msgs["[MATERIAL_INSERT_ITEM_SUCCESS]"] = status_data @@ -463,7 +458,8 @@ switch(text2num(status)) if(MATERIAL_INSERT_ITEM_SUCCESS) //no problems full item was consumed if(chat_data["stack"]) - to_chat(user, span_notice("[amount > 1 ? amount : ""] [item_name][amount > 1 ? "'s" : ""] was consumed by [parent]")) + var/sheets = min(count, amount) //minimum between sheets inserted vs sheets consumed(values differ for alloys) + to_chat(user, span_notice("[sheets > 1 ? sheets : ""] [item_name][sheets > 1 ? "'s" : ""] was consumed by [parent]")) else to_chat(user, span_notice("[count > 1 ? count : ""] [item_name][count > 1 ? "'s" : ""] worth [amount] sheets of material was consumed by [parent]")) if(MATERIAL_INSERT_ITEM_NO_SPACE) //no space @@ -539,13 +535,12 @@ * * Arguments: * - [I][obj/item]: the item whos materials must be retrieved - * - breakdown_flags: how this item must be broken down to retrieve its materials */ -/datum/component/material_container/proc/get_item_material_amount(obj/item/I, breakdown_flags = mat_container_flags) +/datum/component/material_container/proc/get_item_material_amount(obj/item/I) if(!istype(I) || !I.custom_materials) return 0 var/material_amount = 0 - var/list/item_materials = I.get_material_composition(breakdown_flags) + var/list/item_materials = I.get_material_composition() for(var/MAT in item_materials) if(!can_hold_material(MAT)) continue @@ -750,7 +745,7 @@ return NONE if((held_item.flags_1 & HOLOGRAM_1) || (held_item.item_flags & NO_MAT_REDEMPTION) || (allowed_item_typecache && !is_type_in_typecache(held_item, allowed_item_typecache))) return NONE - var/list/item_materials = held_item.get_material_composition(mat_container_flags) + var/list/item_materials = held_item.get_material_composition() if(!length(item_materials)) return NONE for(var/material in item_materials) diff --git a/code/datums/components/material/remote_materials.dm b/code/datums/components/material/remote_materials.dm index e57a212cbde..33d85a5376f 100644 --- a/code/datums/components/material/remote_materials.dm +++ b/code/datums/components/material/remote_materials.dm @@ -19,15 +19,24 @@ handles linking back and forth. var/allow_standalone ///Local size of container when silo = null var/local_size = INFINITY - ///Flags used when converting inserted materials into their component materials. + ///Flags used for the local material container(exceptions for item insert & intent flags) var/mat_container_flags = NONE - -/datum/component/remote_materials/Initialize(mapload, allow_standalone = TRUE, force_connect = FALSE, mat_container_flags = NONE) + ///List of signals to hook onto the local container + var/list/mat_container_signals + +/datum/component/remote_materials/Initialize( + mapload, + allow_standalone = TRUE, + force_connect = FALSE, + mat_container_flags = NONE, + list/mat_container_signals = null +) if (!isatom(parent)) return COMPONENT_INCOMPATIBLE src.allow_standalone = allow_standalone src.mat_container_flags = mat_container_flags + src.mat_container_signals = mat_container_signals RegisterSignal(parent, COMSIG_ATOM_TOOL_ACT(TOOL_MULTITOOL), PROC_REF(OnMultitool)) @@ -35,7 +44,8 @@ handles linking back and forth. var/connect_to_silo = FALSE if(force_connect || (mapload && is_station_level(T.z))) connect_to_silo = TRUE - RegisterSignal(parent, COMSIG_ATOM_ATTACKBY, TYPE_PROC_REF(/datum/component/remote_materials, SiloAttackBy)) + if(!(mat_container_flags & MATCONTAINER_NO_INSERT)) + RegisterSignal(parent, COMSIG_ATOM_ATTACKBY, TYPE_PROC_REF(/datum/component/remote_materials, SiloAttackBy)) if(mapload) // wait for silo to initialize during mapload addtimer(CALLBACK(src, PROC_REF(_PrepareStorage), connect_to_silo)) @@ -50,6 +60,8 @@ handles linking back and forth. * only if allow_standalone = TRUE, else you a null mat_container */ /datum/component/remote_materials/proc/_PrepareStorage(connect_to_silo) + PRIVATE_PROC(TRUE) + if (connect_to_silo) silo = GLOB.ore_silo_default if (silo) @@ -68,6 +80,8 @@ handles linking back and forth. return ..() /datum/component/remote_materials/proc/_MakeLocal() + PRIVATE_PROC(TRUE) + silo = null var/static/list/allowed_mats = list( @@ -89,6 +103,7 @@ handles linking back and forth. allowed_mats, \ local_size, \ mat_container_flags, \ + container_signals = mat_container_signals, \ allowed_items = /obj/item/stack \ ) @@ -132,7 +147,7 @@ handles linking back and forth. return if(silo) - mat_container.user_insert(target, user, mat_container_flags, parent) + mat_container.user_insert(target, user, parent) return COMPONENT_NO_AFTERATTACK @@ -170,7 +185,8 @@ handles linking back and forth. silo.ore_connected_machines += src silo.updateUsrDialog() mat_container = new_container - RegisterSignal(parent, COMSIG_ATOM_ATTACKBY, TYPE_PROC_REF(/datum/component/remote_materials, SiloAttackBy)) + if(!(mat_container_flags & MATCONTAINER_NO_INSERT)) + RegisterSignal(parent, COMSIG_ATOM_ATTACKBY, TYPE_PROC_REF(/datum/component/remote_materials, SiloAttackBy)) to_chat(user, span_notice("You connect [parent] to [silo] from the multitool's buffer.")) return ITEM_INTERACT_BLOCKING @@ -199,15 +215,19 @@ handles linking back and forth. * - The parent is of type movable atom * - A mat container is actually present * - The silo in not on hold + * Arguments + * * check_hold - should we check if the silo is on hold */ -/datum/component/remote_materials/proc/_can_use_resource() +/datum/component/remote_materials/proc/_can_use_resource(check_hold = TRUE) + PRIVATE_PROC(TRUE) + var/atom/movable/movable_parent = parent if (!istype(movable_parent)) return FALSE if (!mat_container) //no silolink & local storage not supported movable_parent.say("No access to material storage, please contact the quartermaster.") return FALSE - if(on_hold()) //silo on hold + if(check_hold && on_hold()) //silo on hold movable_parent.say("Mineral access is on hold, please contact the quartermaster.") return FALSE return TRUE @@ -254,3 +274,16 @@ handles linking back and forth. drop_target = movable_parent.drop_location() return mat_container.retrieve_sheets(eject_amount, material_ref, target = drop_target, context = parent) + +/** + * Insert an item into the mat container, helper proc to insert items with the correct context + * + * Arguments + * * obj/item/weapon - the item you are trying to insert + * * multiplier - the multiplier applied on the materials consumed + */ +/datum/component/remote_materials/proc/insert_item(obj/item/weapon, multiplier = 1) + if(!_can_use_resource(FALSE)) + return MATERIAL_INSERT_ITEM_FAILURE + + return mat_container.insert_item(weapon, multiplier, parent) diff --git a/code/datums/components/mind_linker.dm b/code/datums/components/mind_linker.dm index 41ed23ecc2f..d22999512d9 100644 --- a/code/datums/components/mind_linker.dm +++ b/code/datums/components/mind_linker.dm @@ -65,13 +65,13 @@ master_speech.Grant(owner) */ //ORIGINAL CODE END - //SKYRAT EDIT - NIFs + //NOVA EDIT - NIFs if(speech_action) master_speech = new(src) master_speech.Grant(owner) - //SKYRAT EDIT END + //NOVA EDIT END -/datum/component/mind_linker/Destroy(force, silent) +/datum/component/mind_linker/Destroy(force) for(var/mob/living/remaining_mob as anything in linked_mobs) unlink_mob(remaining_mob) linked_mobs.Cut() @@ -102,12 +102,12 @@ if(to_link.can_block_magic(MAGIC_RESISTANCE_MIND, charge_cost = 0)) return FALSE */ //ORIGINAL CODE END - //SKYRAT EDIT START + //NOVA EDIT START if(HAS_TRAIT(to_link, TRAIT_MINDSHIELD) && linking_protection) // Mindshield implant - no dice return FALSE if(to_link.can_block_magic(MAGIC_RESISTANCE_MIND, charge_cost = 0) && linking_protection) return FALSE - //SKYRAT EDIT END + //NOVA EDIT END if(linked_mobs[to_link]) return FALSE diff --git a/code/datums/components/mob_chain.dm b/code/datums/components/mob_chain.dm index 583a80534c1..a258fe3f5be 100644 --- a/code/datums/components/mob_chain.dm +++ b/code/datums/components/mob_chain.dm @@ -28,7 +28,7 @@ var/mob/living/living_parent = parent living_parent.set_glide_size(front.glide_size) -/datum/component/mob_chain/Destroy(force, silent) +/datum/component/mob_chain/Destroy(force) if (!isnull(front)) SEND_SIGNAL(front, COMSIG_MOB_LOST_CHAIN_TAIL, parent) front = null diff --git a/code/datums/components/mob_harvest.dm b/code/datums/components/mob_harvest.dm index 8342ee411fe..b9f9f86350b 100644 --- a/code/datums/components/mob_harvest.dm +++ b/code/datums/components/mob_harvest.dm @@ -42,7 +42,7 @@ item_generation_time = item_generation_wait START_PROCESSING(SSobj, src) -/datum/component/mob_harvest/Destroy(force, silent) +/datum/component/mob_harvest/Destroy(force) STOP_PROCESSING(SSobj, src) return ..() diff --git a/code/datums/components/nuclear_bomb_operator.dm b/code/datums/components/nuclear_bomb_operator.dm index da6e8b0cab1..6ab9330e5ca 100644 --- a/code/datums/components/nuclear_bomb_operator.dm +++ b/code/datums/components/nuclear_bomb_operator.dm @@ -48,7 +48,7 @@ )) parent.remove_traits(list(TRAIT_DISK_VERIFIER, TRAIT_CAN_STRIP, TRAIT_CAN_USE_NUKE), NUKE_OP_MINION_TRAIT) -/datum/component/nuclear_bomb_operator/Destroy(force, silent) +/datum/component/nuclear_bomb_operator/Destroy(force) QDEL_NULL(disky) on_disk_collected = null add_disk_overlays = null diff --git a/code/datums/components/on_hit_effect.dm b/code/datums/components/on_hit_effect.dm index 50f31269f16..4093249c1ad 100644 --- a/code/datums/components/on_hit_effect.dm +++ b/code/datums/components/on_hit_effect.dm @@ -21,7 +21,7 @@ return ELEMENT_INCOMPATIBLE src.thrown_effect = thrown_effect -/datum/component/on_hit_effect/Destroy(force, silent) +/datum/component/on_hit_effect/Destroy(force) on_hit_callback = null extra_check_callback = null return ..() diff --git a/code/datums/components/pellet_cloud.dm b/code/datums/components/pellet_cloud.dm index fbd32fe5e4f..5a34feafed7 100644 --- a/code/datums/components/pellet_cloud.dm +++ b/code/datums/components/pellet_cloud.dm @@ -55,7 +55,7 @@ /datum/component/pellet_cloud/Initialize(projectile_type=/obj/item/shrapnel, magnitude=5) - if(!isammocasing(parent) && !isgrenade(parent) && !islandmine(parent) && !issupplypod(parent) && !ishorrorling(parent)) //SKYRAT EDIT CHANGE: if(!isammocasing(parent) && !isgrenade(parent) && !islandmine(parent) && !issupplypod(parent)) + if(!isammocasing(parent) && !isgrenade(parent) && !islandmine(parent) && !issupplypod(parent) && !ishorrorling(parent)) //NOVA EDIT CHANGE: if(!isammocasing(parent) && !isgrenade(parent) && !islandmine(parent) && !issupplypod(parent)) return COMPONENT_INCOMPATIBLE if(magnitude < 1) @@ -66,10 +66,10 @@ if(isammocasing(parent)) num_pellets = magnitude - else if(isgrenade(parent) || islandmine(parent) || issupplypod(parent) || ishorrorling(parent)) //SKYRAT EDIT CHANGE: else if(isgrenade(parent) || islandmine(parent) || issupplypod(parent)) + else if(isgrenade(parent) || islandmine(parent) || issupplypod(parent) || ishorrorling(parent)) //NOVA EDIT CHANGE: else if(isgrenade(parent) || islandmine(parent) || issupplypod(parent)) radius = magnitude -/datum/component/pellet_cloud/Destroy(force, silent) +/datum/component/pellet_cloud/Destroy(force) purple_hearts = null pellets = null targets_hit = null @@ -88,10 +88,10 @@ RegisterSignal(parent, COMSIG_MINE_TRIGGERED, PROC_REF(create_blast_pellets)) else if(issupplypod(parent)) RegisterSignal(parent, COMSIG_SUPPLYPOD_LANDED, PROC_REF(create_blast_pellets)) - //SKYRAT EDIT ADDITION BEGIN + //NOVA EDIT ADDITION BEGIN else if(ishorrorling(parent)) RegisterSignal(parent, COMSIG_HORRORFORM_EXPLODE, PROC_REF(create_blast_pellets)) - //SKYRAT EDIT END + //NOVA EDIT END /datum/component/pellet_cloud/UnregisterFromParent() UnregisterSignal(parent, list(COMSIG_PREQDELETED, COMSIG_FIRE_CASING, COMSIG_GRENADE_DETONATE, COMSIG_GRENADE_ARMED, COMSIG_MOVABLE_MOVED, COMSIG_MINE_TRIGGERED, COMSIG_ITEM_DROPPED)) diff --git a/code/datums/components/pet_commands/fetch.dm b/code/datums/components/pet_commands/fetch.dm index fa0b3193a44..9a42c485d5c 100644 --- a/code/datums/components/pet_commands/fetch.dm +++ b/code/datums/components/pet_commands/fetch.dm @@ -57,7 +57,7 @@ RegisterSignal(thrown_thing, COMSIG_MOVABLE_THROW_LANDED, PROC_REF(listen_throw_land)) /// A throw we were listening to has finished, see if it's in range for us to try grabbing it -/datum/pet_command/point_targeting/fetch/proc/listen_throw_land(obj/item/thrown_thing, datum/thrownthing/throwing_datum) +/datum/pet_command/point_targeting/fetch/proc/listen_throw_land(obj/item/thrown_thing, datum/thrownthing/throwingdatum) SIGNAL_HANDLER UnregisterSignal(thrown_thing, COMSIG_MOVABLE_THROW_LANDED) @@ -69,9 +69,11 @@ if (!can_see(parent, thrown_thing, length = sense_radius)) return - try_activate_command(throwing_datum.thrower) - set_command_target(parent, thrown_thing) - parent.ai_controller.set_blackboard_key(BB_FETCH_DELIVER_TO, throwing_datum.thrower) + var/mob/thrower = throwingdatum?.get_thrower() + if(thrower) + try_activate_command(thrower) + set_command_target(parent, thrown_thing) + parent.ai_controller.set_blackboard_key(BB_FETCH_DELIVER_TO, thrower) // Don't try and fetch turfs or anchored objects if someone points at them /datum/pet_command/point_targeting/fetch/look_for_target(mob/living/pointing_friend, obj/item/pointed_atom) diff --git a/code/datums/components/pet_commands/obeys_commands.dm b/code/datums/components/pet_commands/obeys_commands.dm index efe01985d20..2fceaa2b337 100644 --- a/code/datums/components/pet_commands/obeys_commands.dm +++ b/code/datums/components/pet_commands/obeys_commands.dm @@ -22,7 +22,7 @@ var/datum/pet_command/new_command = new command_path(parent) available_commands[new_command.command_name] = new_command -/datum/component/obeys_commands/Destroy(force, silent) +/datum/component/obeys_commands/Destroy(force) . = ..() QDEL_NULL(available_commands) diff --git a/code/datums/components/pet_commands/pet_command.dm b/code/datums/components/pet_commands/pet_command.dm index 7762b9b2aa8..cf376b21001 100644 --- a/code/datums/components/pet_commands/pet_command.dm +++ b/code/datums/components/pet_commands/pet_command.dm @@ -30,10 +30,18 @@ /// Register a new guy we want to listen to /datum/pet_command/proc/add_new_friend(mob/living/tamer) RegisterSignal(tamer, COMSIG_MOB_SAY, PROC_REF(respond_to_command)) + RegisterSignal(tamer, COMSIG_MOB_AUTOMUTE_CHECK, PROC_REF(waive_automute)) /// Stop listening to a guy /datum/pet_command/proc/remove_friend(mob/living/unfriended) - UnregisterSignal(unfriended, COMSIG_MOB_SAY) + UnregisterSignal(unfriended, list(COMSIG_MOB_SAY, COMSIG_MOB_AUTOMUTE_CHECK)) + +/// Stop the automute from triggering for commands (unless the spoken text is suspiciously longer than the command) +/datum/pet_command/proc/waive_automute(mob/living/speaker, client/client, last_message, mute_type) + SIGNAL_HANDLER + if(mute_type == MUTE_IC && find_command_in_text(last_message, check_verbosity = TRUE)) + return WAIVE_AUTOMUTE_CHECK + return NONE /// Respond to something that one of our friends has asked us to do /datum/pet_command/proc/respond_to_command(mob/living/speaker, speech_args) @@ -51,11 +59,16 @@ try_activate_command(speaker) -/// Returns true if we find any of our spoken commands in the text -/datum/pet_command/proc/find_command_in_text(spoken_text) +/** + * Returns true if we find any of our spoken commands in the text. + * if check_verbosity is true, skip the match if there spoken_text is way longer than the match + */ +/datum/pet_command/proc/find_command_in_text(spoken_text, check_verbosity = FALSE) for (var/command as anything in speech_commands) if (!findtext(spoken_text, command)) continue + if(check_verbosity && length(spoken_text) > length(command) + MAX_NAME_LEN) + continue return TRUE return FALSE diff --git a/code/datums/components/pinata.dm b/code/datums/components/pinata.dm index 1056200e3e2..064bc2de26b 100644 --- a/code/datums/components/pinata.dm +++ b/code/datums/components/pinata.dm @@ -52,7 +52,7 @@ new dropped_item(get_turf(parent)) qdel(src) -/datum/component/pinata/Destroy(force, silent) +/datum/component/pinata/Destroy(force) UnregisterSignal(parent, list( COMSIG_MOB_APPLY_DAMAGE, COMSIG_LIVING_DEATH, diff --git a/code/datums/components/plumbing/chemical_acclimator.dm b/code/datums/components/plumbing/chemical_acclimator.dm index 777a2804a78..f84252c51de 100644 --- a/code/datums/components/plumbing/chemical_acclimator.dm +++ b/code/datums/components/plumbing/chemical_acclimator.dm @@ -9,7 +9,7 @@ return COMPONENT_INCOMPATIBLE myacclimator = parent -/datum/component/plumbing/acclimator/Destroy(force, silent) +/datum/component/plumbing/acclimator/Destroy(force) myacclimator = null return ..() diff --git a/code/datums/components/puzzgrid.dm b/code/datums/components/puzzgrid.dm index 8a7620b06e3..611df16ccaa 100644 --- a/code/datums/components/puzzgrid.dm +++ b/code/datums/components/puzzgrid.dm @@ -55,7 +55,7 @@ addtimer(CALLBACK(src, PROC_REF(out_of_time)), timer) time_to_finish = world.time + timer -/datum/component/puzzgrid/Destroy(force, silent) +/datum/component/puzzgrid/Destroy(force) puzzgrid = null on_victory_callback = null on_fail_callback = null diff --git a/code/datums/components/radioactive_emitter.dm b/code/datums/components/radioactive_emitter.dm index 6a95f36079c..26e33855a11 100644 --- a/code/datums/components/radioactive_emitter.dm +++ b/code/datums/components/radioactive_emitter.dm @@ -41,7 +41,7 @@ // Easier to handle edits to the cooldown duration, prevents timer spam for short cooldown emitters START_PROCESSING(SSfastprocess, src) -/datum/component/radioactive_emitter/Destroy(force, silent) +/datum/component/radioactive_emitter/Destroy(force) STOP_PROCESSING(SSfastprocess, src) return ..() diff --git a/code/datums/components/radioactive_exposure.dm b/code/datums/components/radioactive_exposure.dm index 0819b46f7df..b8a034e7788 100644 --- a/code/datums/components/radioactive_exposure.dm +++ b/code/datums/components/radioactive_exposure.dm @@ -66,7 +66,7 @@ qdel(src) -/datum/component/radioactive_exposure/Destroy(force, silent) +/datum/component/radioactive_exposure/Destroy(force) var/mob/living/carbon/human/human_parent = parent human_parent.clear_alert(ALERT_RADIOACTIVE_AREA) diff --git a/code/datums/components/reagent_refiller.dm b/code/datums/components/reagent_refiller.dm index ffb451b83ac..35bdcb4ce51 100644 --- a/code/datums/components/reagent_refiller.dm +++ b/code/datums/components/reagent_refiller.dm @@ -28,7 +28,7 @@ return ..() -/datum/component/reagent_refiller/Destroy(force, silent) +/datum/component/reagent_refiller/Destroy(force) power_draw_callback = null return ..() diff --git a/code/datums/components/redirect_attack_hand_from_turf.dm b/code/datums/components/redirect_attack_hand_from_turf.dm index 5beef957dd3..bb823609241 100644 --- a/code/datums/components/redirect_attack_hand_from_turf.dm +++ b/code/datums/components/redirect_attack_hand_from_turf.dm @@ -25,7 +25,7 @@ RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(on_moved)) connect_to_new_turf() -/datum/component/redirect_attack_hand_from_turf/Destroy(force, silent) +/datum/component/redirect_attack_hand_from_turf/Destroy(force) disconnect_from_old_turf() return ..() diff --git a/code/datums/components/reflection.dm b/code/datums/components/reflection.dm index 80532ca2a61..d85960951aa 100644 --- a/code/datums/components/reflection.dm +++ b/code/datums/components/reflection.dm @@ -55,7 +55,7 @@ var/list/reflect_update_signals = list(COMSIG_MOVABLE_MOVED) + update_signals RegisterSignals(parent, reflect_update_signals, PROC_REF(get_reflection_targets)) -/datum/component/reflection/Destroy(force, silent) +/datum/component/reflection/Destroy(force) QDEL_LIST_ASSOC_VAL(reflected_movables) QDEL_NULL(reflection_holder) can_reflect = null diff --git a/code/datums/components/regenerator.dm b/code/datums/components/regenerator.dm index b9886764565..a8fd3d0c46c 100644 --- a/code/datums/components/regenerator.dm +++ b/code/datums/components/regenerator.dm @@ -59,7 +59,7 @@ UnregisterSignal(parent, COMSIG_MOB_APPLY_DAMAGE) stop_regenerating() -/datum/component/regenerator/Destroy(force, silent) +/datum/component/regenerator/Destroy(force) stop_regenerating() . = ..() if(regeneration_start_timer) diff --git a/code/datums/components/religious_tool.dm b/code/datums/components/religious_tool.dm index 8491e489bed..3c421a04aa3 100644 --- a/code/datums/components/religious_tool.dm +++ b/code/datums/components/religious_tool.dm @@ -43,7 +43,7 @@ RegisterSignal(SSdcs, COMSIG_RELIGIOUS_SECT_CHANGED, PROC_REF(SetGlobalToLocal)) RegisterSignal(SSdcs, COMSIG_RELIGIOUS_SECT_RESET, PROC_REF(on_sect_reset)) -/datum/component/religious_tool/Destroy(force, silent) +/datum/component/religious_tool/Destroy(force) easy_access_sect = null performing_rite = null catalyst_type = null diff --git a/code/datums/components/riding/riding.dm b/code/datums/components/riding/riding.dm index c8c969a8c6b..98024e1a00e 100644 --- a/code/datums/components/riding/riding.dm +++ b/code/datums/components/riding/riding.dm @@ -26,8 +26,6 @@ var/list/directional_vehicle_layers = list() /// same as above but instead of layer you have a list(px, py) var/list/directional_vehicle_offsets = list() - /// planes of the rider - var/list/directional_rider_planes = list() /// allow typecache for only certain turfs, forbid to allow all but those. allow only certain turfs will take precedence. var/list/allowed_turf_typecache /// allow typecache for only certain turfs, forbid to allow all but those. allow only certain turfs will take precedence. @@ -108,7 +106,6 @@ var/atom/movable/movable_parent = parent handle_vehicle_layer(movable_parent.dir) handle_vehicle_offsets(movable_parent.dir) - handle_rider_plane(movable_parent.dir) if(rider.pulling == source) rider.stop_pulling() @@ -138,20 +135,9 @@ . = AM.layer AM.layer = . -/datum/component/riding/proc/handle_rider_plane(dir) - var/atom/movable/movable_parent = parent - var/target_plane = directional_rider_planes["[dir]"] - if(isnull(target_plane)) - return - for(var/mob/buckled_mob in movable_parent.buckled_mobs) - SET_PLANE_EXPLICIT(buckled_mob, target_plane, movable_parent) - /datum/component/riding/proc/set_vehicle_dir_layer(dir, layer) directional_vehicle_layers["[dir]"] = layer -/datum/component/riding/proc/set_rider_dir_plane(dir, plane) - directional_rider_planes["[dir]"] = plane - /// This is called after the ridden atom is successfully moved and is used to handle icon stuff /datum/component/riding/proc/vehicle_moved(datum/source, oldloc, dir, forced) SIGNAL_HANDLER @@ -166,7 +152,6 @@ return // runtimed with piggy's without this, look into this more handle_vehicle_offsets(dir) handle_vehicle_layer(dir) - handle_rider_plane(dir) /// Turning is like moving /datum/component/riding/proc/vehicle_turned(datum/source, _old_dir, new_dir) diff --git a/code/datums/components/riding/riding_mob.dm b/code/datums/components/riding/riding_mob.dm index 0ad6c1e4c7f..53aa87b74bb 100644 --- a/code/datums/components/riding/riding_mob.dm +++ b/code/datums/components/riding/riding_mob.dm @@ -1,11 +1,11 @@ // For any mob that can be ridden -//SKYRAT EDIT START: Human Riding Defines +//NOVA EDIT START: Human Riding Defines #define OVERSIZED_OFFSET 18 #define OVERSIZED_SIDE_OFFSET 11 #define REGULAR_OFFSET 6 #define REGULAR_SIDE_OFFSET 4 -//SKYRAT EDIT END +//NOVA EDIT END /datum/component/riding/creature /// If TRUE, this creature's movements can be controlled by the rider while mounted (as opposed to riding cyborgs and humans, which is passive) var/can_be_driven = TRUE @@ -32,7 +32,7 @@ var/mob/living/simple_animal/simple_parent = parent simple_parent.stop_automated_movement = TRUE -/datum/component/riding/creature/Destroy(force, silent) +/datum/component/riding/creature/Destroy(force) unequip_buckle_inhands(parent) if(isanimal(parent)) var/mob/living/simple_animal/simple_parent = parent @@ -289,7 +289,7 @@ /datum/component/riding/creature/human/get_offsets(pass_index) var/mob/living/carbon/human/H = parent - //SKYRAT EDIT BEGIN - Oversized Overhaul + //NOVA EDIT BEGIN - Oversized Overhaul if(H.buckle_lying) return HAS_TRAIT(H, TRAIT_OVERSIZED) ? list( TEXT_NORTH = list(0, OVERSIZED_OFFSET), @@ -314,7 +314,7 @@ TEXT_EAST = list(-REGULAR_OFFSET, REGULAR_SIDE_OFFSET), TEXT_WEST = list(REGULAR_OFFSET, REGULAR_SIDE_OFFSET) ) - //SKYRAT EDIT END + //NOVA EDIT END /datum/component/riding/creature/human/force_dismount(mob/living/dismounted_rider) var/atom/movable/AM = parent AM.unbuckle_mob(dismounted_rider) @@ -464,7 +464,7 @@ var/mob/living/basic/mining/goliath/goliath = parent goliath.add_movespeed_modifier(/datum/movespeed_modifier/goliath_mount) -/datum/component/riding/creature/goliath/Destroy(force, silent) +/datum/component/riding/creature/goliath/Destroy(force) var/mob/living/basic/mining/goliath/goliath = parent goliath.remove_movespeed_modifier(/datum/movespeed_modifier/goliath_mount) return ..() @@ -527,10 +527,6 @@ /datum/component/riding/creature/leaper/handle_specials() . = ..() set_riding_offsets(RIDING_OFFSET_ALL, list(TEXT_NORTH = list(17, 46), TEXT_SOUTH = list(17,51), TEXT_EAST = list(27, 46), TEXT_WEST = list(6, 46))) - set_rider_dir_plane(SOUTH, GAME_PLANE_UPPER) - set_rider_dir_plane(NORTH, GAME_PLANE) - set_rider_dir_plane(EAST, GAME_PLANE_UPPER) - set_rider_dir_plane(WEST, GAME_PLANE_UPPER) /datum/component/riding/creature/leaper/Initialize(mob/living/riding_mob, force = FALSE, ride_check_flags = NONE, potion_boost = FALSE) . = ..() @@ -550,9 +546,9 @@ . = ..() UnregisterSignal(rider, COMSIG_MOB_POINTED) -//SKYRAT EDIT START: Human Riding Defines +//NOVA EDIT START: Human Riding Defines #undef OVERSIZED_OFFSET #undef OVERSIZED_SIDE_OFFSET #undef REGULAR_OFFSET #undef REGULAR_SIDE_OFFSET -//SKYRAT EDIT END +//NOVA EDIT END diff --git a/code/datums/components/riding/riding_vehicle.dm b/code/datums/components/riding/riding_vehicle.dm index 2a556ac8944..bacf012aa5a 100644 --- a/code/datums/components/riding/riding_vehicle.dm +++ b/code/datums/components/riding/riding_vehicle.dm @@ -178,7 +178,7 @@ set_vehicle_dir_layer(WEST, OBJ_LAYER) /datum/component/riding/vehicle/scooter/skateboard/wheelys - vehicle_move_delay = 1.75 // SKYRAT EDIT - ORIGINAL: 0 + vehicle_move_delay = 1.75 // NOVA EDIT - ORIGINAL: 0 /datum/component/riding/vehicle/scooter/skateboard/wheelys/handle_specials() . = ..() diff --git a/code/datums/components/scope.dm b/code/datums/components/scope.dm index 853820eaa73..b413b6f8e51 100644 --- a/code/datums/components/scope.dm +++ b/code/datums/components/scope.dm @@ -1,33 +1,54 @@ +///A component that allows players to use the item to zoom out. Mainly intended for firearms, but now works with other items too. /datum/component/scope /// How far we can extend, with modifier of 1, up to our vision edge, higher numbers multiply. var/range_modifier = 1 - /// Fullscreen object we use for tracking the shots. + /// Fullscreen object we use for tracking. var/atom/movable/screen/fullscreen/cursor_catcher/scope/tracker /// The owner of the tracker's ckey. For comparing with the current owner mob, in case the client has left it (e.g. ghosted). var/tracker_owner_ckey - /// Are we zooming currently? - var/zooming + /// The method which we zoom in and out + var/zoom_method = ZOOM_METHOD_RIGHT_CLICK + /// if not null, an item action will be added. Redundant if the mode is ZOOM_METHOD_RIGHT_CLICK or ZOOM_METHOD_WIELD. + var/item_action_type -/datum/component/scope/Initialize(range_modifier) - if(!isgun(parent)) +/datum/component/scope/Initialize(range_modifier = 1, zoom_method = ZOOM_METHOD_RIGHT_CLICK, item_action_type) + if(!isitem(parent)) return COMPONENT_INCOMPATIBLE src.range_modifier = range_modifier + src.zoom_method = zoom_method + src.item_action_type = item_action_type -/datum/component/scope/Destroy(force, silent) +/datum/component/scope/Destroy(force) if(tracker) stop_zooming(tracker.owner) return ..() /datum/component/scope/RegisterWithParent() RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(on_move)) - RegisterSignal(parent, COMSIG_ITEM_AFTERATTACK_SECONDARY, PROC_REF(on_secondary_afterattack)) - RegisterSignal(parent, COMSIG_GUN_TRY_FIRE, PROC_REF(on_gun_fire)) + switch(zoom_method) + if(ZOOM_METHOD_RIGHT_CLICK) + RegisterSignal(parent, COMSIG_ITEM_AFTERATTACK_SECONDARY, PROC_REF(on_secondary_afterattack)) + if(ZOOM_METHOD_WIELD) + RegisterSignal(parent, SIGNAL_ADDTRAIT(TRAIT_WIELDED), PROC_REF(on_wielded)) + RegisterSignal(parent, SIGNAL_REMOVETRAIT(TRAIT_WIELDED), PROC_REF(on_unwielded)) + if(item_action_type) + var/obj/item/parent_item = parent + var/datum/action/item_action/scope = parent_item.add_item_action(item_action_type) + RegisterSignal(scope, COMSIG_ACTION_TRIGGER, PROC_REF(on_action_trigger)) RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) + if(isgun(parent)) + RegisterSignal(parent, COMSIG_GUN_TRY_FIRE, PROC_REF(on_gun_fire)) /datum/component/scope/UnregisterFromParent() + if(item_action_type) + var/obj/item/parent_item = parent + var/datum/action/item_action/scope = locate(item_action_type) in parent_item.actions + parent_item.remove_item_action(scope) UnregisterSignal(parent, list( COMSIG_MOVABLE_MOVED, COMSIG_ITEM_AFTERATTACK_SECONDARY, + SIGNAL_ADDTRAIT(TRAIT_WIELDED), + SIGNAL_REMOVETRAIT(TRAIT_WIELDED), COMSIG_GUN_TRY_FIRE, COMSIG_ATOM_EXAMINE, )) @@ -56,9 +77,28 @@ if(tracker) stop_zooming(user) else - start_zooming(user) + zoom(user) return COMPONENT_SECONDARY_CANCEL_ATTACK_CHAIN +/datum/component/scope/proc/on_action_trigger(datum/action/source) + SIGNAL_HANDLER + var/obj/item/item = source.target + var/mob/living/user = item.loc + if(tracker) + stop_zooming(user) + else + zoom(user) + +/datum/component/scope/proc/on_wielded(obj/item/source, trait) + SIGNAL_HANDLER + var/mob/living/user = source.loc + zoom(user) + +/datum/component/scope/proc/on_unwielded(obj/item/source, trait) + SIGNAL_HANDLER + var/mob/living/user = source.loc + stop_zooming(user) + /datum/component/scope/proc/on_gun_fire(obj/item/gun/source, mob/living/user, atom/target, flag, params) SIGNAL_HANDLER @@ -70,7 +110,12 @@ /datum/component/scope/proc/on_examine(datum/source, mob/user, list/examine_list) SIGNAL_HANDLER - examine_list += span_notice("You can scope in with right-click.") + var/scope = isgun(parent) ? "scope in" : "zoom out" + switch(zoom_method) + if(ZOOM_METHOD_RIGHT_CLICK) + examine_list += span_notice("You can [scope] with right-click.") + if(ZOOM_METHOD_WIELD) + examine_list += span_notice("You can [scope] by wielding it with both hands.") /** * We find and return the best target to hit on a given turf. @@ -105,17 +150,7 @@ return target_turf /** - * Wrapper for zoom(), so in case we runtime we do not get stuck in a bad state - * - * Arguments: - * * user: The mob we are starting zooming on. -*/ -/datum/component/scope/proc/start_zooming(mob/user) - if(zoom(user)) - zooming = TRUE - -/** - * We start zooming by hiding the mouse pointer, adding our tracker overlay and starting our processing. + * We start zooming by adding our tracker overlay and starting our processing. * * Arguments: * * user: The mob we are starting zooming on. @@ -123,18 +158,33 @@ /datum/component/scope/proc/zoom(mob/user) if(isnull(user.client)) return - if(zooming) + if(HAS_TRAIT(user, TRAIT_USER_SCOPED)) + user.balloon_alert(user, "already zoomed!") return - user.client.mouse_override_icon = 'icons/effects/mouse_pointers/scope_hide.dmi' - user.update_mouse_pointer() user.playsound_local(parent, 'sound/weapons/scope.ogg', 75, TRUE) - tracker = user.overlay_fullscreen("scope", /atom/movable/screen/fullscreen/cursor_catcher/scope, 0) + tracker = user.overlay_fullscreen("scope", /atom/movable/screen/fullscreen/cursor_catcher/scope, isgun(parent)) tracker.assign_to_mob(user, range_modifier) tracker_owner_ckey = user.ckey - RegisterSignals(user, list(COMSIG_MOB_SWAP_HANDS, COMSIG_QDELETING), PROC_REF(stop_zooming)) + if(user.is_holding(parent)) + RegisterSignals(user, list(COMSIG_MOB_SWAP_HANDS, COMSIG_QDELETING), PROC_REF(stop_zooming)) + else // The item is likely worn (eg. mothic cap) + RegisterSignal(user, COMSIG_QDELETING, PROC_REF(stop_zooming)) + var/static/list/capacity_signals = list( + COMSIG_LIVING_STATUS_KNOCKDOWN, + COMSIG_LIVING_STATUS_PARALYZE, + COMSIG_LIVING_STATUS_STUN, + ) + RegisterSignals(user, capacity_signals, PROC_REF(on_incapacitated)) START_PROCESSING(SSprojectiles, src) + ADD_TRAIT(user, TRAIT_USER_SCOPED, REF(src)) return TRUE +/datum/component/scope/proc/on_incapacitated(mob/living/source, amount = 0, ignore_canstun = FALSE) + SIGNAL_HANDLER + + if(amount > 0) + stop_zooming(source) + /** * We stop zooming, canceling processing, resetting stuff back to normal and deleting our tracker. * @@ -144,13 +194,18 @@ /datum/component/scope/proc/stop_zooming(mob/user) SIGNAL_HANDLER - if(!zooming) + if(!HAS_TRAIT(user, TRAIT_USER_SCOPED)) return STOP_PROCESSING(SSprojectiles, src) - UnregisterSignal(user, list(COMSIG_MOB_SWAP_HANDS, COMSIG_QDELETING)) - - zooming = FALSE + UnregisterSignal(user, list( + COMSIG_LIVING_STATUS_KNOCKDOWN, + COMSIG_LIVING_STATUS_PARALYZE, + COMSIG_LIVING_STATUS_STUN, + COMSIG_MOB_SWAP_HANDS, + COMSIG_QDELETING, + )) + REMOVE_TRAIT(user, TRAIT_USER_SCOPED, REF(src)) user.playsound_local(parent, 'sound/weapons/scope.ogg', 75, TRUE, frequency = -1) user.clear_fullscreen("scope") @@ -165,8 +220,6 @@ if(user.client) animate(user.client, 0.2 SECONDS, pixel_x = 0, pixel_y = 0) - user.client.mouse_override_icon = null - user.update_mouse_pointer() tracker = null tracker_owner_ckey = null diff --git a/code/datums/components/seclight_attachable.dm b/code/datums/components/seclight_attachable.dm index d82f274a07c..b1d4aebc93f 100644 --- a/code/datums/components/seclight_attachable.dm +++ b/code/datums/components/seclight_attachable.dm @@ -50,7 +50,7 @@ if(istype(starting_light)) add_light(starting_light) -/datum/component/seclite_attachable/Destroy(force, silent) +/datum/component/seclite_attachable/Destroy(force) if(light) remove_light() return ..() diff --git a/code/datums/components/seethrough_mob.dm b/code/datums/components/seethrough_mob.dm index 4359c454f1a..bae87faf615 100644 --- a/code/datums/components/seethrough_mob.dm +++ b/code/datums/components/seethrough_mob.dm @@ -42,7 +42,7 @@ var/datum/action/cooldown/toggle_seethrough/action = new(src) action.Grant(parent) -/datum/component/seethrough_mob/Destroy(force, silent) +/datum/component/seethrough_mob/Destroy(force) QDEL_NULL(render_source_atom) return ..() diff --git a/code/datums/components/shell.dm b/code/datums/components/shell.dm index 77f0b16ab71..a436a40d516 100644 --- a/code/datums/components/shell.dm +++ b/code/datums/components/shell.dm @@ -101,7 +101,7 @@ QDEL_NULL(attached_circuit) -/datum/component/shell/Destroy(force, silent) +/datum/component/shell/Destroy(force) QDEL_LIST(unremovable_circuit_components) return ..() diff --git a/code/datums/components/shielded.dm b/code/datums/components/shielded.dm index 0265148c8b5..8a46697745f 100644 --- a/code/datums/components/shielded.dm +++ b/code/datums/components/shielded.dm @@ -57,7 +57,7 @@ if(recharge_start_delay) START_PROCESSING(SSdcs, src) -/datum/component/shielded/Destroy(force, silent) +/datum/component/shielded/Destroy(force) if(wearer) shield_icon = "broken" UnregisterSignal(wearer, COMSIG_ATOM_UPDATE_OVERLAYS) diff --git a/code/datums/components/shovel_hands.dm b/code/datums/components/shovel_hands.dm index 34eaf8a98b6..752af0d8bd9 100644 --- a/code/datums/components/shovel_hands.dm +++ b/code/datums/components/shovel_hands.dm @@ -20,7 +20,7 @@ UnregisterSignal(parent, list(COMSIG_LIVING_UNARMED_ATTACK, COMSIG_HOSTILE_PRE_ATTACKINGTARGET)) return ..() -/datum/component/shovel_hands/Destroy(force, silent) +/datum/component/shovel_hands/Destroy(force) if (internal_shovel) UnregisterSignal(internal_shovel, COMSIG_QDELETING) QDEL_NULL(internal_shovel) diff --git a/code/datums/components/shuttle_cling.dm b/code/datums/components/shuttle_cling.dm index 9cbff17c0a3..6702b9d601d 100644 --- a/code/datums/components/shuttle_cling.dm +++ b/code/datums/components/shuttle_cling.dm @@ -177,7 +177,7 @@ qdel(src) -/datum/component/shuttle_cling/Destroy(force, silent) +/datum/component/shuttle_cling/Destroy(force) REMOVE_TRAIT(parent, TRAIT_HYPERSPACED, REF(src)) QDEL_NULL(hyperloop) diff --git a/code/datums/components/singularity.dm b/code/datums/components/singularity.dm index 41b11a219c0..c1323d01e2f 100644 --- a/code/datums/components/singularity.dm +++ b/code/datums/components/singularity.dm @@ -108,7 +108,7 @@ GLOB.singularities |= src -/datum/component/singularity/Destroy(force, silent) +/datum/component/singularity/Destroy(force) GLOB.singularities -= src consume_callback = null target = null diff --git a/code/datums/components/sitcomlaughter.dm b/code/datums/components/sitcomlaughter.dm index 8ca335eb8b5..62e9276b1d7 100644 --- a/code/datums/components/sitcomlaughter.dm +++ b/code/datums/components/sitcomlaughter.dm @@ -22,7 +22,7 @@ if(laugh_delay) src.laugh_delay = laugh_delay -/datum/component/wearertargeting/sitcomlaughter/Destroy(force, silent) +/datum/component/wearertargeting/sitcomlaughter/Destroy(force) post_comedy_callback = null return ..() diff --git a/code/datums/components/slippery.dm b/code/datums/components/slippery.dm index 620f6baa816..74dbdd5642f 100644 --- a/code/datums/components/slippery.dm +++ b/code/datums/components/slippery.dm @@ -88,7 +88,7 @@ else RegisterSignal(parent, COMSIG_ATOM_ENTERED, PROC_REF(Slip)) -/datum/component/slippery/Destroy(force, silent) +/datum/component/slippery/Destroy(force) can_slip_callback = null on_slip_callback = null holder = null diff --git a/code/datums/components/smooth_tunes.dm b/code/datums/components/smooth_tunes.dm index 1442d29547b..0b86693f7f2 100644 --- a/code/datums/components/smooth_tunes.dm +++ b/code/datums/components/smooth_tunes.dm @@ -24,7 +24,7 @@ src.particles_path = particles_path src.glow_color = glow_color -/datum/component/smooth_tunes/Destroy(force, silent) +/datum/component/smooth_tunes/Destroy(force) if(particle_holder) QDEL_NULL(particle_holder) qdel(linked_songtuner_rite) diff --git a/code/datums/components/spin2win.dm b/code/datums/components/spin2win.dm index 0812258f769..4524b403355 100644 --- a/code/datums/components/spin2win.dm +++ b/code/datums/components/spin2win.dm @@ -38,7 +38,7 @@ src.start_spin_message = start_spin_message src.end_spin_message = end_spin_message -/datum/component/spin2win/Destroy(force, silent) +/datum/component/spin2win/Destroy(force) on_spin_callback = null on_unspin_callback = null return ..() diff --git a/code/datums/components/spinny.dm b/code/datums/components/spinny.dm index bec04b34560..d3cf52e29e0 100644 --- a/code/datums/components/spinny.dm +++ b/code/datums/components/spinny.dm @@ -18,7 +18,7 @@ turn_degrees = (reverse ? -90 : 90) START_PROCESSING(SSfastprocess, src) -/datum/component/spinny/Destroy(force, silent) +/datum/component/spinny/Destroy(force) STOP_PROCESSING(SSfastprocess, src) return ..() diff --git a/code/datums/components/spirit_holding.dm b/code/datums/components/spirit_holding.dm index 37186825d62..cb626801d86 100644 --- a/code/datums/components/spirit_holding.dm +++ b/code/datums/components/spirit_holding.dm @@ -13,7 +13,7 @@ if(!ismovable(parent)) //you may apply this to mobs, i take no responsibility for how that works out return COMPONENT_INCOMPATIBLE -/datum/component/spirit_holding/Destroy(force, silent) +/datum/component/spirit_holding/Destroy(force) . = ..() if(bound_spirit) QDEL_NULL(bound_spirit) diff --git a/code/datums/components/squashable.dm b/code/datums/components/squashable.dm index 86135faa7bb..785c6771ad3 100644 --- a/code/datums/components/squashable.dm +++ b/code/datums/components/squashable.dm @@ -29,7 +29,7 @@ AddComponent(/datum/component/connect_loc_behalf, parent, loc_connections) -/datum/component/squashable/Destroy(force, silent) +/datum/component/squashable/Destroy(force) on_squash_callback = null return ..() diff --git a/code/datums/components/strong_pull.dm b/code/datums/components/strong_pull.dm index bfcfb34c163..afb46b7252d 100644 --- a/code/datums/components/strong_pull.dm +++ b/code/datums/components/strong_pull.dm @@ -10,7 +10,7 @@ Basically, the items they pull cannot be pulled (except by the puller) if(!isliving(parent)) return COMPONENT_INCOMPATIBLE -/datum/component/strong_pull/Destroy(force, silent) +/datum/component/strong_pull/Destroy(force) if(strongpulling) lose_strong_grip() return ..() diff --git a/code/datums/components/style/style.dm b/code/datums/components/style/style.dm index 99fe652fad6..fd4c2580a79 100644 --- a/code/datums/components/style/style.dm +++ b/code/datums/components/style/style.dm @@ -98,7 +98,7 @@ RegisterSignal(src, COMSIG_ATOM_TOOL_ACT(TOOL_MULTITOOL), PROC_REF(on_parent_multitool)) - ADD_TRAIT(mob_parent, TRAIT_STYLISH, REF(src)) // SKYRAT EDIT ADD - allows style meter chads to do flips + ADD_TRAIT(mob_parent, TRAIT_STYLISH, REF(src)) // NOVA EDIT ADD - allows style meter chads to do flips /datum/component/style/RegisterWithParent() RegisterSignal(parent, COMSIG_MOB_ITEM_AFTERATTACK, PROC_REF(hotswap)) @@ -146,13 +146,13 @@ qdel(projectile_parry.resolve()) -/datum/component/style/Destroy(force, silent) +/datum/component/style/Destroy(force) STOP_PROCESSING(SSdcs, src) var/mob/mob_parent = parent if(mob_parent.hud_used) mob_parent.hud_used.static_inventory -= meter mob_parent.hud_used.show_hud(mob_parent.hud_used.hud_version) - REMOVE_TRAIT(mob_parent, TRAIT_STYLISH, REF(src)) // SKYRAT EDIT ADD - allows style meter chads to do flips + REMOVE_TRAIT(mob_parent, TRAIT_STYLISH, REF(src)) // NOVA EDIT ADD - allows style meter chads to do flips return ..() diff --git a/code/datums/components/subtype_picker.dm b/code/datums/components/subtype_picker.dm index 2bc429f9b70..78401c9e022 100644 --- a/code/datums/components/subtype_picker.dm +++ b/code/datums/components/subtype_picker.dm @@ -22,7 +22,7 @@ src.on_picked_callback = on_picked_callback build_radial_list() -/datum/component/subtype_picker/Destroy(force, silent) +/datum/component/subtype_picker/Destroy(force) on_picked_callback = null return ..() diff --git a/code/datums/components/supermatter_crystal.dm b/code/datums/components/supermatter_crystal.dm index f3047f87768..cf9e9d36a82 100644 --- a/code/datums/components/supermatter_crystal.dm +++ b/code/datums/components/supermatter_crystal.dm @@ -28,7 +28,7 @@ src.tool_act_callback = tool_act_callback src.consume_callback = consume_callback -/datum/component/supermatter_crystal/Destroy(force, silent) +/datum/component/supermatter_crystal/Destroy(force) tool_act_callback = null consume_callback = null return ..() diff --git a/code/datums/components/surgery_initiator.dm b/code/datums/components/surgery_initiator.dm index bc8b0ee9b97..bb817612e98 100644 --- a/code/datums/components/surgery_initiator.dm +++ b/code/datums/components/surgery_initiator.dm @@ -14,7 +14,7 @@ var/obj/item/surgery_tool = parent surgery_tool.item_flags |= ITEM_HAS_CONTEXTUAL_SCREENTIPS -/datum/component/surgery_initiator/Destroy(force, silent) +/datum/component/surgery_initiator/Destroy(force) last_user_ref = null surgery_target_ref = null @@ -233,9 +233,9 @@ if (surgery_needs_exposure(surgery, surgery_target)) surgery_info["blocked"] = TRUE - surgery_info["blocked_reason"] = "Their body is covered!" // SKYRAT EDIT ADDITION - Surgically unremovable bodyparts + surgery_info["blocked_reason"] = "Their body is covered!" // NOVA EDIT ADDITION - Surgically unremovable bodyparts - // SKYRAT EDIT START - Surgically unremovable bodyparts + // NOVA EDIT START - Surgically unremovable bodyparts if (surgery.removes_target_bodypart) if (iscarbon(surgery_target)) var/mob/living/carbon/carbon_target = surgery_target @@ -243,7 +243,7 @@ if(!affecting_limb.can_be_surgically_removed) surgery_info["blocked"] = TRUE surgery_info["blocked_reason"] = "That limb cannot be surgically removed!" - // SKYRAT EDIT END + // NOVA EDIT END surgeries += list(surgery_info) @@ -314,11 +314,11 @@ target.balloon_alert(user, "not the right type of limb!") return - // SKYRAT EDIT START - Limbs that can't be surgically removed + // NOVA EDIT START - Limbs that can't be surgically removed if (surgery.removes_target_bodypart && !isnull(affecting_limb) && !affecting_limb.can_be_surgically_removed) target.balloon_alert(user, "limb can't be surgically removed!") return - // SKYRAT EDIT END + // NOVA EDIT END if (IS_IN_INVALID_SURGICAL_POSITION(target, surgery)) target.balloon_alert(user, "patient is not lying down!") diff --git a/code/datums/components/swabbing.dm b/code/datums/components/swabbing.dm index fa649a5e018..12d851afe39 100644 --- a/code/datums/components/swabbing.dm +++ b/code/datums/components/swabbing.dm @@ -32,7 +32,7 @@ This component is used in vat growing to swab for microbiological samples which src.update_icons = update_icons src.update_overlays = update_overlays -/datum/component/swabbing/Destroy(force, silent) +/datum/component/swabbing/Destroy(force) for(var/swabbed in swabbed_items) qdel(swabbed) update_icons = null diff --git a/code/datums/components/tackle.dm b/code/datums/components/tackle.dm index c05277c136f..d93a6e3d3c5 100644 --- a/code/datums/components/tackle.dm +++ b/code/datums/components/tackle.dm @@ -65,7 +65,7 @@ SIGNAL_HANDLER tackle_ref = WEAKREF(tackle) - tackle.thrower = user + tackle.thrower = WEAKREF(user) ///See if we can tackle or not. If we can, leap! /datum/component/tackler/proc/checkTackle(mob/living/carbon/user, atom/clicked_atom, list/modifiers) @@ -106,7 +106,7 @@ RegisterSignal(user, COMSIG_MOVABLE_MOVED, PROC_REF(checkObstacle)) playsound(user, 'sound/weapons/thudswoosh.ogg', 40, TRUE, -1) - var/leap_word = isfeline(user) ? "pounce" : "leap" //If cat, "pounce" instead of "leap". // SKYRAT EDIT - FELINE TRAITS. Was: isfelinid(user) + var/leap_word = isfeline(user) ? "pounce" : "leap" //If cat, "pounce" instead of "leap". // NOVA EDIT - FELINE TRAITS. Was: isfelinid(user) if(can_see(user, clicked_atom, 7)) user.visible_message(span_warning("[user] [leap_word]s at [clicked_atom]!"), span_danger("You [leap_word] at [clicked_atom]!")) else @@ -152,7 +152,7 @@ return var/mob/living/carbon/target = hit - var/tackle_word = isfeline(user) ? "pounce" : "tackle" //If cat, "pounce" instead of "tackle". // SKYRAT EDIT - FELINE TRAITS - ORIGINAL : var/tackle_word = isfelinid(user) ? "pounce" : "tackle" + var/tackle_word = isfeline(user) ? "pounce" : "tackle" //If cat, "pounce" instead of "tackle". // NOVA EDIT - FELINE TRAITS - ORIGINAL : var/tackle_word = isfelinid(user) ? "pounce" : "tackle" var/roll = rollTackle(target) tackling = FALSE diff --git a/code/datums/components/tactical.dm b/code/datums/components/tactical.dm index ec78f3dfeb9..e8e54926949 100644 --- a/code/datums/components/tactical.dm +++ b/code/datums/components/tactical.dm @@ -40,7 +40,6 @@ var/obj/item/master = parent var/image/I = image(icon = master.icon, icon_state = master.icon_state, loc = user) - SET_PLANE_EXPLICIT(I, GAME_PLANE_FOV_HIDDEN, master) I.copy_overlays(master) I.override = TRUE source.add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/everyone, "sneaking_mission", I) diff --git a/code/datums/components/takes_reagent_appearance.dm b/code/datums/components/takes_reagent_appearance.dm index fd1312ba112..96b9a4d6f0c 100644 --- a/code/datums/components/takes_reagent_appearance.dm +++ b/code/datums/components/takes_reagent_appearance.dm @@ -43,7 +43,7 @@ src.base_container_type = base_container_type || parent.type -/datum/component/takes_reagent_appearance/Destroy(force, silent) +/datum/component/takes_reagent_appearance/Destroy(force) on_icon_changed = null on_icon_reset = null return ..() diff --git a/code/datums/components/tameable.dm b/code/datums/components/tameable.dm index 81228b2c3cc..3da6d616149 100644 --- a/code/datums/components/tameable.dm +++ b/code/datums/components/tameable.dm @@ -32,7 +32,7 @@ RegisterSignal(parent, COMSIG_SIMPLEMOB_SENTIENCEPOTION, PROC_REF(on_tame)) //Instantly succeeds RegisterSignal(parent, COMSIG_SIMPLEMOB_TRANSFERPOTION, PROC_REF(on_tame)) //Instantly succeeds -/datum/component/tameable/Destroy(force, silent) +/datum/component/tameable/Destroy(force) after_tame = null return ..() diff --git a/code/datums/components/tattoo.dm b/code/datums/components/tattoo.dm index 7289c301520..fe51a53781b 100644 --- a/code/datums/components/tattoo.dm +++ b/code/datums/components/tattoo.dm @@ -25,7 +25,7 @@ if(tatted_limb.owner) setup_tatted_owner(tatted_limb.owner) -/datum/component/tattoo/Destroy(force, silent) +/datum/component/tattoo/Destroy(force) if(!parent) return ..() var/obj/item/bodypart/tatted_limb = parent diff --git a/code/datums/components/toggle_attached_clothing.dm b/code/datums/components/toggle_attached_clothing.dm index 5d8f7c2b3ea..da503985169 100644 --- a/code/datums/components/toggle_attached_clothing.dm +++ b/code/datums/components/toggle_attached_clothing.dm @@ -77,7 +77,7 @@ if (!destroy_on_removal) create_deployable() -/datum/component/toggle_attached_clothing/Destroy(force, silent) +/datum/component/toggle_attached_clothing/Destroy(force) unequip_deployable() QDEL_NULL(deployable) QDEL_NULL(toggle_action) diff --git a/code/datums/components/trapdoor.dm b/code/datums/components/trapdoor.dm index da90580a20d..bda67048ffe 100644 --- a/code/datums/components/trapdoor.dm +++ b/code/datums/components/trapdoor.dm @@ -59,11 +59,11 @@ RegisterSignal(SSdcs, COMSIG_GLOB_TRAPDOOR_LINK, PROC_REF(on_link_requested)) else RegisterSignal(assembly, COMSIG_ASSEMBLY_PULSED, PROC_REF(toggle_trapdoor)) - // SKYRAT EDIT START - Trapdoors shouldn't be targeted by SSDecay. + // NOVA EDIT START - Trapdoors shouldn't be targeted by SSDecay. if(isturf(parent)) var/turf/turf_parent = parent turf_parent.turf_flags &= ~CAN_DECAY_BREAK_1 - // SKYRAT EDIT END + // NOVA EDIT END RegisterSignal(parent, COMSIG_ATOM_TOOL_ACT(TOOL_MULTITOOL), PROC_REF(try_unlink)) /datum/component/trapdoor/UnregisterFromParent() diff --git a/code/datums/components/twohanded.dm b/code/datums/components/twohanded.dm index 37df7308217..6d033469cc2 100644 --- a/code/datums/components/twohanded.dm +++ b/code/datums/components/twohanded.dm @@ -56,7 +56,7 @@ if(require_twohands) ADD_TRAIT(parent, TRAIT_NEEDS_TWO_HANDS, ABSTRACT_ITEM_TRAIT) -/datum/component/two_handed/Destroy(force, silent) +/datum/component/two_handed/Destroy(force) offhand_item = null wield_callback = null unwield_callback = null diff --git a/code/datums/components/unbreakable.dm b/code/datums/components/unbreakable.dm index 423fad138bb..594b8dc7b8f 100644 --- a/code/datums/components/unbreakable.dm +++ b/code/datums/components/unbreakable.dm @@ -6,7 +6,7 @@ return COMPONENT_INCOMPATIBLE ADD_TRAIT(parent, TRAIT_UNBREAKABLE, INNATE_TRAIT) -/datum/component/unbreakable/Destroy(force, silent) +/datum/component/unbreakable/Destroy(force) REMOVE_TRAIT(parent, TRAIT_UNBREAKABLE, INNATE_TRAIT) return ..() diff --git a/code/datums/components/unusual_effect.dm b/code/datums/components/unusual_effect.dm index eb67b953799..7fe5b281825 100644 --- a/code/datums/components/unusual_effect.dm +++ b/code/datums/components/unusual_effect.dm @@ -39,7 +39,7 @@ special_effects = new(parent_movable, /particles/unusual_effect) START_PROCESSING(SSobj, src) -/datum/component/unusual_effect/Destroy(force, silent) +/datum/component/unusual_effect/Destroy(force) var/atom/movable/parent_movable = parent if (istype(parent_movable)) parent_movable.remove_filter("unusual_effect") diff --git a/code/datums/components/uplink.dm b/code/datums/components/uplink.dm index 03740417678..adb10f128ae 100644 --- a/code/datums/components/uplink.dm +++ b/code/datums/components/uplink.dm @@ -59,7 +59,7 @@ RegisterSignal(parent, COMSIG_IMPLANT_IMPLANTING, PROC_REF(implanting)) RegisterSignal(parent, COMSIG_IMPLANT_OTHER, PROC_REF(old_implant)) RegisterSignal(parent, COMSIG_IMPLANT_EXISTING_UPLINK, PROC_REF(new_implant)) - else if(istype(parent, /obj/item/modular_computer/pda)) + else if(istype(parent, /obj/item/modular_computer)) RegisterSignal(parent, COMSIG_TABLET_CHANGE_ID, PROC_REF(new_ringtone)) RegisterSignal(parent, COMSIG_TABLET_CHECK_DETONATE, PROC_REF(check_detonate)) else if(istype(parent, /obj/item/radio)) @@ -455,7 +455,7 @@ /datum/component/uplink/proc/setup_unlock_code() unlock_code = generate_code() var/obj/item/P = parent - if(istype(parent,/obj/item/modular_computer/pda)) + if(istype(parent,/obj/item/modular_computer)) unlock_note = "Uplink Passcode: [unlock_code] ([P.name])." else if(istype(parent,/obj/item/radio)) unlock_note = "Radio Passcode: [unlock_code] ([P.name], [RADIO_TOKEN_UPLINK] channel)." @@ -465,7 +465,7 @@ /datum/component/uplink/proc/generate_code() var/returnable_code = "" - if(istype(parent, /obj/item/modular_computer/pda)) + if(istype(parent, /obj/item/modular_computer)) returnable_code = "[rand(100,999)] [pick(GLOB.phonetic_alphabet)]" else if(istype(parent, /obj/item/radio)) diff --git a/code/datums/components/wall_mounted.dm b/code/datums/components/wall_mounted.dm index 8d1722f89fe..62af35dc974 100644 --- a/code/datums/components/wall_mounted.dm +++ b/code/datums/components/wall_mounted.dm @@ -18,7 +18,7 @@ /datum/component/wall_mounted/RegisterWithParent() RegisterSignal(hanging_wall_turf, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) RegisterSignal(hanging_wall_turf, COMSIG_TURF_CHANGE, PROC_REF(on_turf_changing)) - RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(drop_wallmount)) + RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(on_move)) RegisterSignal(parent, COMSIG_QDELETING, PROC_REF(on_linked_destroyed)) /datum/component/wall_mounted/UnregisterFromParent() @@ -49,6 +49,18 @@ if (ispath(path, /turf/open)) drop_wallmount() + +/** + * If we get dragged from our wall (by a singulo for instance) we should deconstruct + */ +/datum/component/wall_mounted/proc/on_move(datum/source, atom/old_loc, dir, forced, list/old_locs) + SIGNAL_HANDLER + // If we're having our lighting messed with we're likely to get dragged about + // That shouldn't lead to a decon + if(HAS_TRAIT(parent, TRAIT_LIGHTING_DEBUGGED)) + return + drop_wallmount() + /** * Handles the dropping of the linked object. This is done via deconstruction, as that should be the most sane way to handle it for most objects. * Except for intercoms, which are handled by creating a new wallframe intercom, as they're apparently items. @@ -66,6 +78,7 @@ if(!QDELING(src)) qdel(src) //Well, we fell off the wall, so we're done here. + /** * Checks object direction and then verifies if there's a wall in that direction. Finally, applies a wall_mounted component to the object. * diff --git a/code/datums/components/weatherannouncer.dm b/code/datums/components/weatherannouncer.dm index fec31ccf9d3..0eda6c47a32 100644 --- a/code/datums/components/weatherannouncer.dm +++ b/code/datums/components/weatherannouncer.dm @@ -38,7 +38,7 @@ speaker.update_appearance(UPDATE_ICON) update_light_color() -/datum/component/weather_announcer/Destroy(force, silent) +/datum/component/weather_announcer/Destroy(force) STOP_PROCESSING(SSprocessing, src) return ..() diff --git a/code/datums/datum.dm b/code/datums/datum.dm index a0fcd94c89e..5bfd548b64e 100644 --- a/code/datums/datum.dm +++ b/code/datums/datum.dm @@ -101,7 +101,7 @@ * * Returns [QDEL_HINT_QUEUE] */ -/datum/proc/Destroy(force=FALSE, ...) +/datum/proc/Destroy(force = FALSE) SHOULD_CALL_PARENT(TRUE) SHOULD_NOT_SLEEP(TRUE) tag = null @@ -129,10 +129,10 @@ var/component_or_list = dc[component_key] if(islist(component_or_list)) for(var/datum/component/component as anything in component_or_list) - qdel(component, FALSE, TRUE) + qdel(component, FALSE) else var/datum/component/C = component_or_list - qdel(C, FALSE, TRUE) + qdel(C, FALSE) dc.Cut() _clear_signal_refs() diff --git a/code/datums/diseases/advance/symptoms/heal.dm b/code/datums/diseases/advance/symptoms/heal.dm index 0da4a27c6a4..b00e6ca7966 100644 --- a/code/datums/diseases/advance/symptoms/heal.dm +++ b/code/datums/diseases/advance/symptoms/heal.dm @@ -273,14 +273,14 @@ level = 6 passive_message = span_notice("You feel tingling on your skin as light passes over it.") threshold_descs = list( - "Stage Speed 7" = "Doubles healing speed.", //SKYRAT EDIT: Brings Noc regen into line with the rest of the healing symptoms. + "Stage Speed 7" = "Doubles healing speed.", //NOVA EDIT: Brings Noc regen into line with the rest of the healing symptoms. ) /datum/symptom/heal/darkness/Start(datum/disease/advance/A) . = ..() if(!.) return - if(A.totalStageSpeed() >= 7)//SKYRAT EDIT: Brings Noc regen into line with the rest of the healing symptoms. + if(A.totalStageSpeed() >= 7)//NOVA EDIT: Brings Noc regen into line with the rest of the healing symptoms. power = 2 /datum/symptom/heal/darkness/CanHeal(datum/disease/advance/A) @@ -378,7 +378,7 @@ return power * 0.9 if(SOFT_CRIT) return power * 0.5 - if(M.getBruteLoss() + M.getFireLoss() >= 103 && !active_coma) //SKYRAT EDIT: ORIGINAL: 70 - Adjusts this to remain 37.5% of total health(plus crit health). Because 70 is alot less health here then it is on tg. + if(M.getBruteLoss() + M.getFireLoss() >= 103 && !active_coma) //NOVA EDIT: ORIGINAL: 70 - Adjusts this to remain 37.5% of total health(plus crit health). Because 70 is alot less health here then it is on tg. to_chat(M, span_warning("You feel yourself slip into a regenerative coma...")) active_coma = TRUE addtimer(CALLBACK(src, PROC_REF(coma), M), 60) diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm index 259a1b28dff..741520ed6ae 100644 --- a/code/datums/diseases/transformation.dm +++ b/code/datums/diseases/transformation.dm @@ -84,7 +84,7 @@ /datum/disease/transformation/proc/replace_banned_player(mob/living/new_mob) // This can run well after the mob has been transferred, so need a handle on the new mob to kill it if needed. set waitfor = FALSE - var/list/mob/dead/observer/candidates = poll_candidates_for_mob("Do you want to play as [affected_mob.real_name]?", bantype, bantype, 5 SECONDS, affected_mob) + var/list/mob/dead/observer/candidates = SSpolling.poll_ghost_candidates_for_mob("Do you want to play as [affected_mob.real_name]?", check_jobban = bantype, role = bantype, poll_time = 5 SECONDS, target_mob = affected_mob, pic_source = affected_mob, role_name_text = "transformation victim") if(LAZYLEN(candidates)) var/mob/dead/observer/C = pick(candidates) to_chat(affected_mob, span_userdanger("Your mob has been taken over by a ghost! Appeal your job ban if you want to avoid this in the future!")) diff --git a/code/datums/dna.dm b/code/datums/dna.dm index 3651735ddfd..0eb811cc8bd 100644 --- a/code/datums/dna.dm +++ b/code/datums/dna.dm @@ -1,4 +1,4 @@ -//SKYRAT EDIT REMOVAL BEGIN - CUSTOMIZATION (moved to modular_skyrat/modules/customization/code/datums/dna.dm) +//NOVA EDIT REMOVAL BEGIN - CUSTOMIZATION (moved to modular_nova/modules/customization/code/datums/dna.dm) /* /** * Some identity blocks (basically pieces of the unique_identity string variable of the dna datum, commonly abbreviated with ui) @@ -74,7 +74,7 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) . += total_block_len total_block_len += GET_UF_BLOCK_LEN(blocknumber) */ -//SKYRAT EDIT REMOVAL END +//NOVA EDIT REMOVAL END /////////////////////////// DNA DATUM /datum/dna ///An md5 hash of the dna holder's real name @@ -137,17 +137,17 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) destination.dna.features = features.Copy() destination.dna.real_name = real_name destination.dna.temporary_mutations = temporary_mutations.Copy() - //SKYRAT EDIT ADDITION BEGIN - CUSTOMIZATION + //NOVA EDIT ADDITION BEGIN - CUSTOMIZATION destination.dna.mutant_bodyparts = mutant_bodyparts.Copy() destination.dna.body_markings = body_markings.Copy() destination.dna.update_body_size() - //SKYRAT EDIT ADDITION END + //NOVA EDIT ADDITION END if(transfer_SE) destination.dna.mutation_index = mutation_index destination.dna.default_mutation_genes = default_mutation_genes if(transfer_species) //destination.set_species(species.type, icon_update=0) - ORIGINAL - destination.set_species(species.type, TRUE, FALSE, features.Copy(), mutant_bodyparts.Copy(), body_markings.Copy()) //SKYRAT EDIT CHANGE - CUSTOMIZATION + destination.set_species(species.type, TRUE, FALSE, features.Copy(), mutant_bodyparts.Copy(), body_markings.Copy()) //NOVA EDIT CHANGE - CUSTOMIZATION /datum/dna/proc/copy_dna(datum/dna/new_dna) new_dna.unique_enzymes = unique_enzymes @@ -157,11 +157,11 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) new_dna.unique_features = unique_features new_dna.blood_type = blood_type new_dna.features = features.Copy() - //SKYRAT EDIT ADDITION BEGIN - CUSTOMIZATION + //NOVA EDIT ADDITION BEGIN - CUSTOMIZATION new_dna.mutant_bodyparts = mutant_bodyparts.Copy() new_dna.body_markings = body_markings.Copy() new_dna.update_body_size() - //SKYRAT EDIT ADDITION END + //NOVA EDIT ADDITION END //if the new DNA has a holder, transform them immediately, otherwise save it if(new_dna.holder) new_dna.holder.set_species(species.type, icon_update = 0) @@ -233,7 +233,7 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) for(var/blocknum in 1 to DNA_UNI_IDENTITY_BLOCKS) . += L[blocknum] || random_string(GET_UI_BLOCK_LEN(blocknum), GLOB.hex_characters) -//SKYRAT EDIT REMOVAL BEGIN - CUSTOMIZATION (moved to modular_skyrat/modules/customization/code/datums/dna.dm) +//NOVA EDIT REMOVAL BEGIN - CUSTOMIZATION (moved to modular_nova/modules/customization/code/datums/dna.dm) /* /datum/dna/proc/generate_unique_features() . = "" @@ -275,7 +275,7 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) return data.Join() */ -//SKYRAT EDIT REMOVAL END +//NOVA EDIT REMOVAL END /datum/dna/proc/generate_dna_blocks() var/bonus @@ -373,7 +373,7 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) if(DNA_HAIRSTYLE_BLOCK) set_uni_identity_block(blocknumber, construct_block(GLOB.hairstyles_list.Find(H.hairstyle), GLOB.hairstyles_list.len)) -//SKYRAT EDIT REMOVAL BEGIN - CUSTOMIZATION (moved to modular_skyrat/modules/customization/code/datums/dna.dm) +//NOVA EDIT REMOVAL BEGIN - CUSTOMIZATION (moved to modular_nova/modules/customization/code/datums/dna.dm) /* /datum/dna/proc/update_uf_block(blocknumber) if(!blocknumber) @@ -412,7 +412,7 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) if(DNA_POD_HAIR_BLOCK) set_uni_feature_block(blocknumber, construct_block(GLOB.pod_hair_list.Find(features["pod_hair"]), GLOB.pod_hair_list.len)) */ -//SKYRAT EDIT REMOVAL END +//NOVA EDIT REMOVAL END //Please use add_mutation or activate_mutation instead /datum/dna/proc/force_give(datum/mutation/human/human_mutation) @@ -497,7 +497,7 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) if(create_mutation_blocks) //I hate this generate_dna_blocks() if(randomize_features) - /* SKYRAT EDIT REMOVAL - We don't really want this. We instead let get_mutant_bodyparts() handle the bodypart randomization on our end, to prevent getting any crazy cross-species features. + /* NOVA EDIT REMOVAL - We don't really want this. We instead let get_mutant_bodyparts() handle the bodypart randomization on our end, to prevent getting any crazy cross-species features. var/static/list/all_species_protoypes if(isnull(all_species_protoypes)) all_species_protoypes = list() @@ -506,12 +506,12 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) for(var/datum/species/random_species as anything in all_species_protoypes) features |= random_species.randomize_features() - SKYRAT EDIT REMOVAL END */ + NOVA EDIT REMOVAL END */ - features = species.randomize_features() | features // SKYRAT EDIT CHANGE - Where applicable, replace features with the features generated by species/randomize_features() - Original: features["mcolor"] = "#[random_color()]" - body_markings = species.get_random_body_markings(features) // SKYRAT EDIT ADDITION + features = species.randomize_features() | features // NOVA EDIT CHANGE - Where applicable, replace features with the features generated by species/randomize_features() - Original: features["mcolor"] = "#[random_color()]" + body_markings = species.get_random_body_markings(features) // NOVA EDIT ADDITION - mutant_bodyparts = species.get_mutant_bodyparts(features, existing_mutant_bodyparts = randomize_features ? list() : mutant_bodyparts) // SKYRAT EDIT ADDITION + mutant_bodyparts = species.get_mutant_bodyparts(features, existing_mutant_bodyparts = randomize_features ? list() : mutant_bodyparts) // NOVA EDIT ADDITION update_dna_identity() /datum/dna/stored //subtype used by brain mob's stored_dna @@ -545,7 +545,7 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) stored_dna.species = mrace //not calling any species update procs since we're a brain, not a monkey/human -/mob/living/carbon/set_species(datum/species/mrace, icon_update = TRUE, pref_load = FALSE, list/override_features, list/override_mutantparts, list/override_markings) // SKYRAT EDIT CHANGE - ORIGINAL: /mob/living/carbon/set_species(datum/species/mrace, icon_update = TRUE, pref_load = FALSE) +/mob/living/carbon/set_species(datum/species/mrace, icon_update = TRUE, pref_load = FALSE, list/override_features, list/override_mutantparts, list/override_markings) // NOVA EDIT CHANGE - ORIGINAL: /mob/living/carbon/set_species(datum/species/mrace, icon_update = TRUE, pref_load = FALSE) if(QDELETED(src)) CRASH("You're trying to change your species post deletion, this is a recipe for madness") if(isnull(mrace)) @@ -571,7 +571,7 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) if (old_species.properly_gained) old_species.on_species_loss(src, new_race, pref_load) - // SKYRAT EDIT ADDITION START - BODYPARTS AND FEATURES + // NOVA EDIT ADDITION START - BODYPARTS AND FEATURES // We need to instantiate the list with compatible mutant parts so we don't break things if(override_mutantparts && override_mutantparts.len) @@ -593,7 +593,7 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) dna.unique_features = dna.generate_unique_features() dna.update_body_size() - // SKYRAT EDIT ADDITION END + // NOVA EDIT ADDITION END dna.species.on_species_gain(src, old_species, pref_load) log_mob_tag("TAG: [tag] SPECIES: [key_name(src)] \[[mrace]\]") @@ -687,7 +687,7 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) else gender = PLURAL -//SKYRAT EDIT REMOVAL BEGIN - CUSTOMIZATION (moved to modular_skyrat/modules/customization/code/datums/dna.dm) +//NOVA EDIT REMOVAL BEGIN - CUSTOMIZATION (moved to modular_nova/modules/customization/code/datums/dna.dm) /* /mob/living/carbon/human/updateappearance(icon_update = TRUE, mutcolor_update = FALSE, mutations_overlay_update = FALSE) ..() @@ -756,7 +756,7 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) if(mutations_overlay_update) update_mutations_overlay() */ -//SKYRAT EDIT REMOVAL END +//NOVA EDIT REMOVAL END /mob/proc/domutcheck() return diff --git a/code/datums/elements/crusher_loot.dm b/code/datums/elements/crusher_loot.dm index 7d53794d5b0..0de39bcbab0 100644 --- a/code/datums/elements/crusher_loot.dm +++ b/code/datums/elements/crusher_loot.dm @@ -35,11 +35,11 @@ SIGNAL_HANDLER var/datum/status_effect/crusher_damage/damage = target.has_status_effect(/datum/status_effect/crusher_damage) - // SKYRAT EDIT START - ASHWALKER TROPHIES - var/datum/status_effect/ashwalker_damage/ashie_damage = target.has_status_effect(/datum/status_effect/ashwalker_damage) // SKYRAT EDIT ADDITION - var/damage_total = damage?.total_damage + ashie_damage?.total_damage // SKYRAT EDIT ADDITION - if(damage_total && prob((damage_total/target.maxHealth) * drop_mod)) //on average, you'll need to kill 4 creatures before getting the item. by default. // SKYRAT EDIT - ORIGINAL: if(damage && prob((damage.total_damage/target.maxHealth) * drop_mod)) - // SKYRAT EDIT END - ASHWALKER TROPHIES + // NOVA EDIT START - ASHWALKER TROPHIES + var/datum/status_effect/ashwalker_damage/ashie_damage = target.has_status_effect(/datum/status_effect/ashwalker_damage) // NOVA EDIT ADDITION + var/damage_total = damage?.total_damage + ashie_damage?.total_damage // NOVA EDIT ADDITION + if(damage_total && prob((damage_total/target.maxHealth) * drop_mod)) //on average, you'll need to kill 4 creatures before getting the item. by default. // NOVA EDIT - ORIGINAL: if(damage && prob((damage.total_damage/target.maxHealth) * drop_mod)) + // NOVA EDIT END - ASHWALKER TROPHIES if(drop_immediately) new trophy_type(get_turf(target)) else diff --git a/code/datums/elements/damage_threshold.dm b/code/datums/elements/damage_threshold.dm index 918c984b066..60c87dc5ed5 100644 --- a/code/datums/elements/damage_threshold.dm +++ b/code/datums/elements/damage_threshold.dm @@ -40,7 +40,7 @@ var/obj/item/item_hitting = hitby var/tap_vol = istype(item_hitting) ? item_hitting.get_clamped_volume() : 50 source.visible_message( - span_warning("[src] looks unharmed!"), + span_warning("[source] looks unharmed!"), span_warning("[attack_text] deals no damage to you!"), span_hear("You hear a thud."), COMBAT_MESSAGE_RANGE, diff --git a/code/datums/elements/elevation.dm b/code/datums/elements/elevation.dm index 645ee2a6081..ffa6de398b6 100644 --- a/code/datums/elements/elevation.dm +++ b/code/datums/elements/elevation.dm @@ -152,10 +152,13 @@ /datum/element/elevation_core/proc/on_exited(turf/source, atom/movable/gone) SIGNAL_HANDLER if((isnull(gone.loc) || !HAS_TRAIT_FROM(gone.loc, TRAIT_ELEVATED_TURF, REF(src))) && isliving(gone)) + // Always unregister the signal, we're still leaving even if already shifted down. + UnregisterSignal(gone, COMSIG_LIVING_SET_BUCKLED) + if(!HAS_TRAIT_FROM(gone, TRAIT_ON_ELEVATED_SURFACE, REF(src))) + return REMOVE_TRAIT(gone, TRAIT_ON_ELEVATED_SURFACE, REF(src)) var/elevate_time = isturf(gone.loc) && source.Adjacent(gone.loc) ? ELEVATE_TIME : 0 elevate_mob(gone, -pixel_shift, elevate_time) - UnregisterSignal(gone, COMSIG_LIVING_SET_BUCKLED) /datum/element/elevation_core/proc/elevate_mob(mob/living/target, z_shift = pixel_shift, elevate_time = ELEVATE_TIME) var/buckled_to_vehicle = FALSE diff --git a/code/datums/elements/footstep.dm b/code/datums/elements/footstep.dm index bdf3f98a11f..a162e58752d 100644 --- a/code/datums/elements/footstep.dm +++ b/code/datums/elements/footstep.dm @@ -137,7 +137,7 @@ return //cache for sanic speed (lists are references anyways) - var/static/list/footstep_sounds = GLOB.footstep + var/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 @@ -157,7 +157,7 @@ heard_clients = playsound(source.loc, pick(source.dna.species.special_step_sounds), 50, TRUE, falloff_distance = 1, vary = sound_vary) else var/barefoot_type = prepared_steps[FOOTSTEP_MOB_BAREFOOT] - var/static/list/bare_footstep_sounds = GLOB.barefootstep + var/bare_footstep_sounds = GLOB.barefootstep if(!isnull(barefoot_type) && bare_footstep_sounds[barefoot_type]) // barefoot_type can be null heard_clients = playsound(source.loc, pick(bare_footstep_sounds[barefoot_type][1]), bare_footstep_sounds[barefoot_type][2] * volume * volume_multiplier, diff --git a/code/datums/elements/hostile_machine.dm b/code/datums/elements/hostile_machine.dm new file mode 100644 index 00000000000..0a5f19287bb --- /dev/null +++ b/code/datums/elements/hostile_machine.dm @@ -0,0 +1,15 @@ +/// AIs will attack this as a potential target if they see it +/datum/element/hostile_machine + element_flags = ELEMENT_DETACH_ON_HOST_DESTROY + +/datum/element/hostile_machine/Attach(datum/target) + . = ..() + + if (!isatom(target)) + return ELEMENT_INCOMPATIBLE + + GLOB.hostile_machines += target + +/datum/element/hostile_machine/Detach(datum/source) + GLOB.hostile_machines -= source + return ..() diff --git a/code/datums/elements/immerse.dm b/code/datums/elements/immerse.dm index 1a3b37d6530..d4171588c31 100644 --- a/code/datums/elements/immerse.dm +++ b/code/datums/elements/immerse.dm @@ -96,8 +96,8 @@ /datum/element/immerse/proc/stop_immersion(turf/source) SIGNAL_HANDLER UnregisterSignal(source, list(COMSIG_ATOM_ABSTRACT_ENTERED, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON, COMSIG_ATOM_ABSTRACT_EXITED)) - for(var/atom/movable/movable as anything in attached_turfs_and_movables[source]) - remove_from_element(source, movable) + for(var/datum/weakref/movable as anything in attached_turfs_and_movables[source]) + remove_from_element(source, movable.resolve()) attached_turfs_and_movables -= source /** @@ -109,7 +109,7 @@ SIGNAL_HANDLER if(HAS_TRAIT(movable, TRAIT_IMMERSED)) return - if(movable.layer >= ABOVE_ALL_MOB_LAYER || !ISINRANGE(movable.plane, MUTATE_PLANE(FLOOR_PLANE, source), MUTATE_PLANE(GAME_PLANE_UPPER_FOV_HIDDEN, source))) + if(movable.layer >= ABOVE_ALL_MOB_LAYER || !ISINRANGE(movable.plane, MUTATE_PLANE(FLOOR_PLANE, source), MUTATE_PLANE(GAME_PLANE, source))) return if(is_type_in_typecache(movable, movables_to_ignore)) return @@ -122,7 +122,7 @@ try_immerse(movable, buckled) RegisterSignal(movable, COMSIG_QDELETING, PROC_REF(on_movable_qdel)) - LAZYADD(attached_turfs_and_movables[source], movable) + LAZYADD(attached_turfs_and_movables[source], WEAKREF(movable)) ADD_TRAIT(movable, TRAIT_IMMERSED, ELEMENT_TRAIT(src)) /datum/element/immerse/proc/on_movable_qdel(atom/movable/source) @@ -170,7 +170,7 @@ movable.vis_contents |= vis_overlay - LAZYSET(immersed_movables, movable, vis_overlay) + LAZYSET(immersed_movables, WEAKREF(movable), vis_overlay) ///Initializes and caches a new visual overlay given parameters such as width, height and whether it should appear fully underwater. /datum/element/immerse/proc/generate_vis_overlay(width, height, is_below_water) @@ -212,11 +212,11 @@ ///This proc removes the vis_overlay, the keep together trait and some signals from the movable. /datum/element/immerse/proc/remove_immerse_overlay(atom/movable/movable) - var/atom/movable/immerse_overlay/vis_overlay = LAZYACCESS(immersed_movables, movable) + var/atom/movable/immerse_overlay/vis_overlay = LAZYACCESS(immersed_movables, WEAKREF(movable)) if(!vis_overlay) return movable.vis_contents -= vis_overlay - LAZYREMOVE(immersed_movables, movable) + LAZYREMOVE(immersed_movables, WEAKREF(movable)) if(HAS_TRAIT(movable, TRAIT_UNIQUE_IMMERSE)) UnregisterSignal(movable, list(COMSIG_ATOM_SPIN_ANIMATION, COMSIG_LIVING_POST_UPDATE_TRANSFORM)) qdel(vis_overlay) @@ -298,8 +298,8 @@ if(!(exited.loc in attached_turfs_and_movables)) remove_from_element(source, exited) else - LAZYREMOVE(attached_turfs_and_movables[source], exited) - LAZYADD(attached_turfs_and_movables[exited.loc], exited) + LAZYREMOVE(attached_turfs_and_movables[source], WEAKREF(exited)) + LAZYADD(attached_turfs_and_movables[exited.loc], WEAKREF(exited)) ///Remove any signal, overlay, trait given to the movable and reference to it within the element. /datum/element/immerse/proc/remove_from_element(turf/source, atom/movable/movable) @@ -311,7 +311,7 @@ UnregisterSignal(movable, list(COMSIG_LIVING_SET_BUCKLED, COMSIG_QDELETING)) REMOVE_TRAIT(movable, TRAIT_IMMERSED, ELEMENT_TRAIT(src)) - LAZYREMOVE(attached_turfs_and_movables[source], movable) + LAZYREMOVE(attached_turfs_and_movables[source], WEAKREF(movable)) /// A band-aid to keep the (unique) visual overlay from scaling and rotating along with its owner. I'm sorry. /datum/element/immerse/proc/on_update_transform(mob/living/source, resize, new_lying_angle, is_opposite_angle) @@ -320,7 +320,7 @@ new_transform.Scale(1/source.current_size) new_transform.Turn(-new_lying_angle) - var/atom/movable/immerse_overlay/vis_overlay = immersed_movables[source] + var/atom/movable/immerse_overlay/vis_overlay = immersed_movables[WEAKREF(source)] if(is_opposite_angle) vis_overlay.transform = new_transform vis_overlay.adjust_living_overlay_offset(source) @@ -361,7 +361,7 @@ ///Spin the overlay in the opposite direction so it doesn't look like it's spinning at all. /datum/element/immerse/proc/on_spin_animation(atom/source, speed, loops, segments, segment) SIGNAL_HANDLER - var/atom/movable/immerse_overlay/vis_overlay = immersed_movables[source] + var/atom/movable/immerse_overlay/vis_overlay = immersed_movables[WEAKREF(source)] vis_overlay.do_spin_animation(speed, loops, segments, -segment) ///We need to make sure to remove hard refs from the element when deleted. diff --git a/code/datums/elements/snail_crawl.dm b/code/datums/elements/snail_crawl.dm index 80b3f66e03b..d514ba03e30 100644 --- a/code/datums/elements/snail_crawl.dm +++ b/code/datums/elements/snail_crawl.dm @@ -23,24 +23,24 @@ if(snail.resting && !snail.buckled && lubricate(snail)) snail.add_movespeed_modifier(/datum/movespeed_modifier/snail_crawl) - //SKYRAT EDIT ADDITION BEGIN - This is to prevent snails from achieving FTL speeds without gravity, think of it like snails affixing to walls irl. + //NOVA EDIT ADDITION BEGIN - This is to prevent snails from achieving FTL speeds without gravity, think of it like snails affixing to walls irl. ADD_TRAIT(snail, TRAIT_NEGATES_GRAVITY, TRAIT_GENERIC) snail.AddElement(/datum/element/forced_gravity, 0) if(HAS_TRAIT(snail, TRAIT_SETTLER)) //This is to keep settlers from reaching FTL speeds too. snail.remove_movespeed_modifier(/datum/movespeed_modifier/snail_crawl) - //SKYRAT EDIT ADDITION END + //NOVA EDIT ADDITION END else snail.remove_movespeed_modifier(/datum/movespeed_modifier/snail_crawl) - //SKYRAT EDIT ADDITION BEGIN - This clears the forced gravity so they're affected by it while standing. + //NOVA EDIT ADDITION BEGIN - This clears the forced gravity so they're affected by it while standing. REMOVE_TRAIT(snail, TRAIT_NEGATES_GRAVITY, TRAIT_GENERIC) snail.RemoveElement(/datum/element/forced_gravity, 0) - //SKYRAT EDIT ADDITION END + //NOVA EDIT ADDITION END /datum/element/snailcrawl/proc/lubricate(atom/movable/snail) SIGNAL_HANDLER var/turf/open/OT = get_turf(snail) if(istype(OT)) - OT.MakeSlippery(TURF_WET_WATER, 1 SECONDS) //SKYRAT EDIT CHANGE: Roundstart Snails - No more lube - ORIGINAL: OT.MakeSlippery(TURF_WET_LUBE, 20) - OT.wash(CLEAN_WASH) //SKYRAT EDIT ADDITION: Roundstart Snails - Snails Keep Clean + OT.MakeSlippery(TURF_WET_WATER, 1 SECONDS) //NOVA EDIT CHANGE: Roundstart Snails - No more lube - ORIGINAL: OT.MakeSlippery(TURF_WET_LUBE, 20) + OT.wash(CLEAN_WASH) //NOVA EDIT ADDITION: Roundstart Snails - Snails Keep Clean return TRUE diff --git a/code/datums/elements/strippable.dm b/code/datums/elements/strippable.dm index e6f0d257ed7..9d671f9cd93 100644 --- a/code/datums/elements/strippable.dm +++ b/code/datums/elements/strippable.dm @@ -68,7 +68,7 @@ var/show_visible_message = TRUE /// Can it be silent? - var/can_be_silent = FALSE //SKYRAT EDIT ADDITION - THIEVING GLOVES + var/can_be_silent = FALSE //NOVA EDIT ADDITION - THIEVING GLOVES /// Gets the item from the given source. /datum/strippable_item/proc/get_item(atom/source) @@ -131,7 +131,7 @@ if (HAS_TRAIT(item, TRAIT_NO_STRIP)) return FALSE - //SKYRAT EDIT CHANGE START - THIEVING GLOVES + //NOVA EDIT CHANGE START - THIEVING GLOVES var/is_silent = can_be_silent && HAS_TRAIT(user, TRAIT_STICKY_FINGERS) if (!is_silent) source.visible_message( @@ -140,14 +140,14 @@ blind_message = span_hear("You hear rustling."), ignored_mobs = user, ) - //SKYRAT EDIT CHANGE END + //NOVA EDIT CHANGE END to_chat(user, span_danger("You try to remove [source]'s [item.name]...")) user.log_message("is stripping [key_name(source)] of [item].", LOG_ATTACK, color="red") source.log_message("is being stripped of [item] by [key_name(user)].", LOG_VICTIM, color="orange", log_globally=FALSE) item.add_fingerprint(src) - if(ishuman(source) && !is_silent) //SKYRAT EDIT ADDITION - THIEVING GLOVES ORIGINAL if(ishuman(source)) + if(ishuman(source) && !is_silent) //NOVA EDIT ADDITION - THIEVING GLOVES ORIGINAL if(ishuman(source)) var/mob/living/carbon/human/victim_human = source if(victim_human.key && !victim_human.client) // AKA braindead if(victim_human.stat <= SOFT_CRIT && LAZYLEN(victim_human.afk_thefts) <= AFK_THEFT_MAX_MESSAGES) @@ -277,7 +277,7 @@ /// A utility function for `/datum/strippable_item`s to start unequipping an item from a mob. /proc/start_unequip_mob(obj/item/item, mob/source, mob/user, strip_delay) - //SKYRAT EDIT ADDITION - THIEVING GLOVES + //NOVA EDIT ADDITION - THIEVING GLOVES //if (!do_after(user, strip_delay || item.strip_delay, source, interaction_key = REF(item))) if (!do_after(user, (strip_delay || item.strip_delay) * (HAS_TRAIT(user, TRAIT_STICKY_FINGERS) ? THIEVING_GLOVES_STRIP_SLOWDOWN : NORMAL_STRIP_SLOWDOWN), source, interaction_key = REF(item))) return FALSE diff --git a/code/datums/emotes.dm b/code/datums/emotes.dm index 64c7de25764..cc9d5820c91 100644 --- a/code/datums/emotes.dm +++ b/code/datums/emotes.dm @@ -60,12 +60,12 @@ var/can_message_change = FALSE /// How long is the cooldown on the audio of the emote, if it has one? var/audio_cooldown = 2 SECONDS - //SKYRAT EDIT ADDITION BEGIN - EMOTES + //NOVA EDIT ADDITION BEGIN - EMOTES var/sound_volume = 25 //Emote volume var/list/allowed_species /// Are silicons explicitely allowed to use this emote? var/silicon_allowed = FALSE - //SKYRAT EDIT ADDITION END + //NOVA EDIT ADDITION END /datum/emote/New() switch(mob_type_allowed_typecache) @@ -109,21 +109,21 @@ return user.log_message(msg, LOG_EMOTE) - // SKYRAT EDIT START - Better emotes - Original: var/dchatmsg = "[user] [msg]" + // NOVA EDIT START - Better emotes - Original: var/dchatmsg = "[user] [msg]" var/space = should_have_space_before_emote(html_decode(msg)[1]) ? " " : "" var/dchatmsg = "[user][space][msg]" - // SKYRAT EDIT END + // NOVA EDIT END var/tmp_sound = get_sound(user) if(tmp_sound && should_play_sound(user, intentional) && TIMER_COOLDOWN_FINISHED(user, type)) TIMER_COOLDOWN_START(user, type, audio_cooldown) - //SKYRAT EDIT CHANGE BEGIN - //playsound(user, tmp_sound, 50, vary) - SKYRAT EDIT - ORIGINAL + //NOVA EDIT CHANGE BEGIN + //playsound(user, tmp_sound, 50, vary) - NOVA EDIT - ORIGINAL if(istype(src, /datum/emote/living/lewd)) play_lewd_sound(user, tmp_sound, sound_volume, vary, pref_to_check = /datum/preference/toggle/erp/sounds) else playsound(user, tmp_sound, sound_volume, vary) - //SKYRAT EDIT CHANGE END + //NOVA EDIT CHANGE END var/user_turf = get_turf(user) if (user.client) @@ -131,19 +131,19 @@ if(!ghost.client || isnewplayer(ghost)) continue if(get_chat_toggles(ghost.client) & CHAT_GHOSTSIGHT && !(ghost in viewers(user_turf, null))) - if(pref_check_emote(ghost)) // SKYRAT EDIT ADDITION - Pref checked emotes - ghost.show_message("[FOLLOW_LINK(ghost, user)] [dchatmsg]") // SKYRAT EDIT CHANGE - Indented + if(pref_check_emote(ghost)) // NOVA EDIT ADDITION - Pref checked emotes + ghost.show_message("[FOLLOW_LINK(ghost, user)] [dchatmsg]") // NOVA EDIT CHANGE - Indented if(emote_type & (EMOTE_AUDIBLE | EMOTE_VISIBLE)) //emote is audible and visible - user.audible_message(msg, deaf_message = "You see how [user][space][msg]", audible_message_flags = EMOTE_MESSAGE, separation = space, pref_to_check = pref_to_check) // SKYRAT EDIT - Better emotes - ORIGINAL: user.audible_message(msg, deaf_message = "You see how [user] [msg]", audible_message_flags = EMOTE_MESSAGE) + user.audible_message(msg, deaf_message = "You see how [user][space][msg]", audible_message_flags = EMOTE_MESSAGE, separation = space, pref_to_check = pref_to_check) // NOVA EDIT - Better emotes - ORIGINAL: user.audible_message(msg, deaf_message = "You see how [user] [msg]", audible_message_flags = EMOTE_MESSAGE) else if(emote_type & EMOTE_VISIBLE) //emote is only visible - user.visible_message(msg, visible_message_flags = EMOTE_MESSAGE, separation = space, pref_to_check = pref_to_check) // SKYRAT EDIT - Better emotes - ORIGINAL: user.visible_message(msg, visible_message_flags = EMOTE_MESSAGE) + user.visible_message(msg, visible_message_flags = EMOTE_MESSAGE, separation = space, pref_to_check = pref_to_check) // NOVA EDIT - Better emotes - ORIGINAL: user.visible_message(msg, visible_message_flags = EMOTE_MESSAGE) if(emote_type & EMOTE_IMPORTANT) for(var/mob/living/viewer in viewers()) if(viewer.is_blind() && !viewer.can_hear()) - if(pref_check_emote(viewer)) // SKYRAT EDIT ADDITION - Pref checked emotes - to_chat(viewer, msg) // SKYRAT EDIT CHANGE - Indented + if(pref_check_emote(viewer)) // NOVA EDIT ADDITION - Pref checked emotes + to_chat(viewer, msg) // NOVA EDIT CHANGE - Indented - // SKYRAT EDIT -- BEGIN -- ADDITION -- AI QOL - RELAY EMOTES OVER HOLOPADS + // NOVA EDIT -- BEGIN -- ADDITION -- AI QOL - RELAY EMOTES OVER HOLOPADS var/obj/effect/overlay/holo_pad_hologram/hologram = GLOB.hologram_impersonators[user] if(hologram) if(emote_type & (EMOTE_AUDIBLE | EMOTE_VISIBLE)) @@ -155,7 +155,7 @@ if(viewer.is_blind() && !viewer.can_hear()) if(pref_check_emote(viewer)) to_chat(viewer, msg) - // SKYRAT EDIT -- END + // NOVA EDIT -- END /** * For handling emote cooldown, return true to allow the emote to happen. @@ -169,8 +169,8 @@ /datum/emote/proc/check_cooldown(mob/user, intentional) if(!intentional) return TRUE - //SKYRAT EDIT CHANGE BEGIN - EMOTES - GLOBAL COOLDOWN - //if(user.emotes_used && user.emotes_used[src] + cooldown > world.time) - SKYRAT EDIT - ORIGINAL + //NOVA EDIT CHANGE BEGIN - EMOTES - GLOBAL COOLDOWN + //if(user.emotes_used && user.emotes_used[src] + cooldown > world.time) - NOVA EDIT - ORIGINAL if(user.nextsoundemote > world.time) var/datum/emote/default_emote = /datum/emote if(cooldown > initial(default_emote.cooldown)) // only worry about longer-than-normal emotes @@ -178,9 +178,9 @@ return FALSE //if(!user.emotes_used) // user.emotes_used = list() - //user.emotes_used[src] = world.time - SKYRAT EDIT - ORIGINAL + //user.emotes_used[src] = world.time - NOVA EDIT - ORIGINAL user.nextsoundemote = world.time + cooldown - //SKYRAT EDIT CHANGE END + //NOVA EDIT CHANGE END return TRUE /** @@ -298,7 +298,7 @@ if(HAS_TRAIT(user, TRAIT_EMOTEMUTE)) return FALSE - //SKYRAT EDIT BEGIN + //NOVA EDIT BEGIN if(allowed_species) var/check = FALSE if(silicon_allowed && issilicon(user)) @@ -308,7 +308,7 @@ if(sender.dna.species.type in allowed_species) check = TRUE return check - //SKYRAT EDIT END + //NOVA EDIT END return TRUE diff --git a/code/datums/ert.dm b/code/datums/ert.dm index c33db7b2667..92930339467 100644 --- a/code/datums/ert.dm +++ b/code/datums/ert.dm @@ -16,7 +16,7 @@ var/spawn_admin = FALSE /// If TRUE, we try and pick one of the most experienced players who volunteered to fill the leader slot var/leader_experience = TRUE - ///SKYRAT EDIT: Do we want to notify the players of this ERT? + ///NOVA EDIT: Do we want to notify the players of this ERT? var/notify_players = TRUE /// A custom map template to spawn the ERT at. If this is null or use_custom_shuttle is FALSE, the ERT will spawn at Centcom. var/datum/map_template/ert_template diff --git a/code/datums/greyscale/_greyscale_config.dm b/code/datums/greyscale/_greyscale_config.dm index 9d3099d770b..c6973a5d983 100644 --- a/code/datums/greyscale/_greyscale_config.dm +++ b/code/datums/greyscale/_greyscale_config.dm @@ -57,21 +57,16 @@ if(!json_config) stack_trace("Greyscale config object [DebugName()] is missing a json configuration, make sure `json_config` has been assigned a value.") string_json_config = "[json_config]" - /* SKYRAT EDIT - Added recognition for the Skyrat GAGS folder - ORIGINAL: - if(findtext(string_json_config, "code/datums/greyscale/json_configs/") != 1) - stack_trace("All greyscale json configuration files should be located within 'code/datums/greyscale/json_configs/'") - */ // ORIGINAL END - SKYART EDIT BEGIN: - var/static/regex/skyrat_gags_regex = regex("(modular_skyrat/modules/GAGS/.*json_configs/)") - if(findtext(string_json_config, "code/datums/greyscale/json_configs/") != 1 && skyrat_gags_regex.Find(string_json_config) != 1) - stack_trace("All greyscale json configuration files should be located within '/greyscale/json_configs/' or 'modular_skyrat/modules/GAGS/json_configs/'.") - // SKYRAT EDIT END + var/static/regex/nova_gags_regex = regex(@"^modular_nova\/modules\/GAGS\/(?:[\w]+\/)*json_configs\/(?:[\w]+\/)*\w+\.json$") // NOVA EDIT ADDITION - Added recognition for the Nova GAGS folder + if(findtext(string_json_config, "code/datums/greyscale/json_configs/") != 1 && nova_gags_regex.Find(string_json_config) != 1) // NOVA EDIT CHANGE - ORIGINAL: if(findtext(string_json_config, "code/datums/greyscale/json_configs/") != 1) + stack_trace("All greyscale json configuration files should be located within '/greyscale/json_configs/' or 'modular_nova/modules/GAGS/json_configs/'.") // NOVA EDIT CHANGE - ORIGINAL: stack_trace("All greyscale json configuration files should be located within 'code/datums/greyscale/json_configs/'") if(!icon_file) stack_trace("Greyscale config object [DebugName()] is missing an icon file, make sure `icon_file` has been assigned a value.") string_icon_file = "[icon_file]" if(!name) stack_trace("Greyscale config object [DebugName()] is missing a name, make sure `name` has been assigned a value.") -/datum/greyscale_config/Destroy(force, ...) +/datum/greyscale_config/Destroy(force) if(!force) return QDEL_HINT_LETMELIVE return ..() diff --git a/code/datums/greyscale/config_types/greyscale_configs/greyscale_clothes.dm b/code/datums/greyscale/config_types/greyscale_configs/greyscale_clothes.dm index 5ff1fde7c27..a277ec50544 100644 --- a/code/datums/greyscale/config_types/greyscale_configs/greyscale_clothes.dm +++ b/code/datums/greyscale/config_types/greyscale_configs/greyscale_clothes.dm @@ -35,7 +35,7 @@ name = "Held Sombrero Style (Held, Right)" json_config = 'code/datums/greyscale/json_configs/sombrero_base_righthand.json' -/* SKYRAT EDIT START - Beret-lliant (moved to modular_skyrat/modules/berets/code/datums/config_types) +/* NOVA EDIT START - Beret-lliant (moved to modular_nova/modules/berets/code/datums/config_types) /datum/greyscale_config/beret/worn name = "Beret Worn" name = "Beret (Worn)" @@ -51,7 +51,7 @@ name = "Beret With Badge Worn" name = "Badged Beret (Worn)" json_config = 'code/datums/greyscale/json_configs/beret_badge_worn.json' -SKYRAT EDIT END */ +NOVA EDIT END */ /datum/greyscale_config/beanie name = "Beanie" @@ -80,6 +80,15 @@ SKYRAT EDIT END */ name = "Party Hat (Worn)" icon_file = 'icons/mob/clothing/head/costume.dmi' +/datum/greyscale_config/santa_hat + name = "Santa Hat" + icon_file = 'icons/obj/clothing/head/costume.dmi' + json_config = 'code/datums/greyscale/json_configs/santa_hat.json' + +/datum/greyscale_config/santa_hat/worn + name = "Santa Hat (Worn)" + icon_file = 'icons/mob/clothing/head/costume.dmi' + // // MASKS // @@ -354,6 +363,18 @@ SKYRAT EDIT END */ icon_file = 'icons/mob/clothing/under/shorts_pants_shirts.dmi' json_config = 'code/datums/greyscale/json_configs/buttondown_skirt_worn.json' +// +// LABCOATS +// + +/datum/greyscale_config/labcoat + name = "Labcoat" + icon_file = 'icons/obj/clothing/suits/labcoat.dmi' + json_config = 'code/datums/greyscale/json_configs/labcoat.json' + +/datum/greyscale_config/labcoat/worn + name = "Labcoat (Worn)" + icon_file = 'icons/mob/clothing/suits/labcoat.dmi' // // SUITS diff --git a/code/datums/greyscale/json_configs/labcoat.json b/code/datums/greyscale/json_configs/labcoat.json new file mode 100644 index 00000000000..f95b86893b0 --- /dev/null +++ b/code/datums/greyscale/json_configs/labcoat.json @@ -0,0 +1,54 @@ +{ + "labcoat_job": [ + { + "type": "icon_state", + "icon_state": "labcoat_job", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "sash", + "blend_mode": "overlay", + "color_ids": [ 2 ] + }, + { + "type": "icon_state", + "icon_state": "shoulder", + "blend_mode": "overlay", + "color_ids": [ 3 ] + }, + { + "type": "icon_state", + "icon_state": "back", + "blend_mode": "overlay", + "color_ids": [ 4 ] + } + ], + "labcoat_job_t": [ + { + "type": "icon_state", + "icon_state": "labcoat_job_t", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "sash_t", + "blend_mode": "overlay", + "color_ids": [ 2 ] + }, + { + "type": "icon_state", + "icon_state": "shoulder", + "blend_mode": "overlay", + "color_ids": [ 3 ] + }, + { + "type": "icon_state", + "icon_state": "back_t", + "blend_mode": "overlay", + "color_ids": [ 4 ] + } + ] +} diff --git a/code/datums/greyscale/json_configs/labcoat_worn.json b/code/datums/greyscale/json_configs/labcoat_worn.json new file mode 100644 index 00000000000..54abebcfa99 --- /dev/null +++ b/code/datums/greyscale/json_configs/labcoat_worn.json @@ -0,0 +1,54 @@ +{ + "labcoat_job": [ + { + "type": "icon_state", + "icon_state": "labcoat_job", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "shoulder", + "blend_mode": "overlay", + "color_ids": [ 2 ] + }, + { + "type": "icon_state", + "icon_state": "sash", + "blend_mode": "overlay", + "color_ids": [ 3 ] + }, + { + "type": "icon_state", + "icon_state": "back", + "blend_mode": "overlay", + "color_ids": [ 4 ] + } + ], + "labcoat_job_t": [ + { + "type": "icon_state", + "icon_state": "labcoat_job_t", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "shoulder_t", + "blend_mode": "overlay", + "color_ids": [ 2 ] + }, + { + "type": "icon_state", + "icon_state": "sash_t", + "blend_mode": "overlay", + "color_ids": [ 3 ] + }, + { + "type": "icon_state", + "icon_state": "back_t", + "blend_mode": "overlay", + "color_ids": [ 4 ] + } + ] +} diff --git a/code/datums/greyscale/json_configs/santa_hat.json b/code/datums/greyscale/json_configs/santa_hat.json new file mode 100644 index 00000000000..dda130d59c7 --- /dev/null +++ b/code/datums/greyscale/json_configs/santa_hat.json @@ -0,0 +1,16 @@ +{ + "santa_hat": [ + { + "type": "icon_state", + "icon_state": "santa_base", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "santa_trim", + "blend_mode": "overlay", + "color_ids": [ 2 ] + } + ] +} diff --git a/code/datums/hud.dm b/code/datums/hud.dm index b69b9f40015..aa091db5b01 100644 --- a/code/datums/hud.dm +++ b/code/datums/hud.dm @@ -19,8 +19,8 @@ GLOBAL_LIST_INIT(huds, list( DATA_HUD_AI_DETECT = new/datum/atom_hud/ai_detector(), DATA_HUD_FAN = new/datum/atom_hud/data/human/fan_hud(), DATA_HUD_MALF_APC = new/datum/atom_hud/data/malf_apc(), - DATA_HUD_PERMIT = new/datum/atom_hud/data/human/permit(), // SKYRAT EDIT ADDITION - DATA_HUD_DNR = new/datum/atom_hud/data/human/dnr(), // SKYRAT EDIT ADDITION + DATA_HUD_PERMIT = new/datum/atom_hud/data/human/permit(), // NOVA EDIT ADDITION + DATA_HUD_DNR = new/datum/atom_hud/data/human/dnr(), // NOVA EDIT ADDITION )) /datum/atom_hud diff --git a/code/datums/json_database.dm b/code/datums/json_database.dm new file mode 100644 index 00000000000..ea3ff354b48 --- /dev/null +++ b/code/datums/json_database.dm @@ -0,0 +1,128 @@ +/// Represents a json file being used as a database in the data/ folder. +/// Changes made here will save back to the associated file, with recovery. +/// Will defer writes until later if multiple happen in the same tick. +/// Do not add an extra cache on top of this. This IS your cache. +/datum/json_database + VAR_PRIVATE + filepath + backup_filepath + + cached_data + save_queued = FALSE + + static/existing_json_database = list() + +/datum/json_database/New(filepath) + if (IsAdminAdvancedProcCall()) + to_chat(usr, "json_database creation, linking to [html_encode(filepath)], was blocked.", confidential = TRUE) + return + + ASSERT(isnull(existing_json_database[filepath]), "[filepath] already has an associated json_database. You must expose it somehow and use that instead of making a new one.") + + existing_json_database[filepath] = TRUE + + src.filepath = filepath + backup_filepath = "[filepath].savebac" + + if (fexists(filepath)) + cached_data = safe_json_decode(file2text(filepath)) + if (isnull(cached_data)) + var/scenario = "[filepath] existed, but did not have valid JSON" + + if (fexists(backup_filepath)) + load_backup(scenario) + else + stack_trace("[scenario]. No backup could be found.") + cached_data = list() + else + if (fexists(backup_filepath)) + load_backup("[filepath] didn't exist") + else + cached_data = list() + +/datum/json_database/Destroy() + if (save_queued) + save() + + existing_json_database -= filepath + + return ..() + +/// Returns the cached data. +/// Be careful on holding onto this data for too long, as it can mutate when other stuff changes it. +/// Do not mutate it yourself. +/datum/json_database/proc/get() + return cached_data + +/// Returns the data with the given key. +/// For arrays, this is a number. +/// Be careful on holding onto this data for too long, as it can mutate when other stuff changes it. +/// Do not mutate it yourself. +/datum/json_database/proc/get_key(key) + return cached_data[key] + +/// Sets the data at the key to the value, and queues a save. +/datum/json_database/proc/set_key(key, value) + cached_data[key] = value + queue_save() + +/// Removes the data at the given item, and queues a save. +/// For dictionaries, this can be the key. +/// For arrays, this can be the value. +/datum/json_database/proc/remove(item) + UNTYPED_LIST_REMOVE(cached_data, item) + queue_save() + +/// Inserts the data at the end of what is assumed to be an array, and queues a save. +/datum/json_database/proc/insert(value) + UNTYPED_LIST_ADD(cached_data, value) + queue_save() + +/// Replaces the cache with the new data completely, and queues a save. +/// Do not touch the new data after passing it in. +/datum/json_database/proc/replace(list/new_data) + cached_data = new_data + queue_save() + +/datum/json_database/proc/queue_save() + PRIVATE_PROC(TRUE) + + if (save_queued) + return + + addtimer(CALLBACK(src, PROC_REF(save)), 0) + +/datum/json_database/proc/save() + PRIVATE_PROC(TRUE) + + save_queued = FALSE + + if (fexists(filepath)) + rustg_file_write(file2text(filepath), backup_filepath) + + rustg_file_write(json_encode(cached_data, JSON_PRETTY_PRINT), filepath) + + ASSERT(!isnull(safe_json_decode(file2text(filepath))), "JSON written to [filepath] was not valid. Backup will be preserved.") + + fdel(backup_filepath) + +/datum/json_database/proc/load_backup(scenario) + PRIVATE_PROC(TRUE) + + var/cached_contents = file2text(backup_filepath) + var/list/backed_up_data = safe_json_decode(cached_contents) + + if (isnull(backed_up_data)) + stack_trace("[scenario]. Backup existed, but also did not have valid JSON.") + cached_data = list() + else + stack_trace("[scenario]. Backup existed and was used instead. The JSON file has been updated.") + cached_data = backed_up_data + rustg_file_write(cached_contents, filepath) + +/datum/json_database/vv_edit_var(var_name, var_value) + switch (var_name) + if (nameof(filepath), nameof(backup_filepath)) + return FALSE + else + return ..() diff --git a/code/datums/json_savefile.dm b/code/datums/json_savefile.dm index 08f8cf2d616..dd2a6af0b98 100644 --- a/code/datums/json_savefile.dm +++ b/code/datums/json_savefile.dm @@ -57,7 +57,7 @@ GENERAL_PROTECT_DATUM(/datum/json_savefile) /datum/json_savefile/proc/save() if(path) - rustg_file_write(json_encode(tree), path) + rustg_file_write(json_encode(tree, JSON_PRETTY_PRINT), path) /datum/json_savefile/serialize_list(list/options, list/semvers) SHOULD_CALL_PARENT(FALSE) diff --git a/code/datums/keybinding/communication.dm b/code/datums/keybinding/communication.dm index 92c8f3c4984..b1344c096b9 100644 --- a/code/datums/keybinding/communication.dm +++ b/code/datums/keybinding/communication.dm @@ -16,7 +16,7 @@ /datum/keybinding/client/communication/radio //hotkey_keys = list("Y") // ORIGINAL - hotkey_keys = list(";") // SKYRAT EDIT CHANGE - CUSTOMIZATION + hotkey_keys = list(";") // NOVA EDIT CHANGE - CUSTOMIZATION name = RADIO_CHANNEL full_name = "IC Radio (;)" keybind_signal = COMSIG_KB_CLIENT_RADIO_DOWN diff --git a/code/datums/keybinding/living.dm b/code/datums/keybinding/living.dm index 84e3685f5f8..eb666f57028 100644 --- a/code/datums/keybinding/living.dm +++ b/code/datums/keybinding/living.dm @@ -22,7 +22,7 @@ /datum/keybinding/living/look_up // hotkey_keys = list("L") // ORIGINAL - hotkey_keys = list("P") //SKYRAT EDIT CHANGE - CUSTOMIZATION + hotkey_keys = list("P") //NOVA EDIT CHANGE - CUSTOMIZATION name = "look up" full_name = "Look Up" description = "Look up at the next z-level. Only works if directly below open space." @@ -43,7 +43,7 @@ /datum/keybinding/living/look_down // hotkey_keys = list(";") // ORIGINAL - hotkey_keys = list("\[") //SKYRAT EDIT CHANGE - CUSTOMIZATION + hotkey_keys = list("\[") //NOVA EDIT CHANGE - CUSTOMIZATION name = "look down" full_name = "Look Down" description = "Look down at the previous z-level. Only works if directly above open space." @@ -121,7 +121,7 @@ user_mob.set_combat_mode(FALSE, silent = FALSE) /datum/keybinding/living/toggle_move_intent - hotkey_keys = list("Alt") //SKYRAT EDIT CHANGE - C IS FOR COMBAT INDICATOR - ORIGINAL: hotkey_keys = list("C") + hotkey_keys = list("Alt") //NOVA EDIT CHANGE - C IS FOR COMBAT INDICATOR - ORIGINAL: hotkey_keys = list("C") name = "toggle_move_intent" full_name = "Hold to toggle move intent" description = "Held down to cycle to the other move intent, release to cycle back" diff --git a/code/datums/lazy_template.dm b/code/datums/lazy_template.dm index e3006e13056..0a5e8e53314 100644 --- a/code/datums/lazy_template.dm +++ b/code/datums/lazy_template.dm @@ -18,7 +18,7 @@ reservations = list() ..() -/datum/lazy_template/Destroy(force, ...) +/datum/lazy_template/Destroy(force) if(!force) stack_trace("Something is trying to delete [type]") return QDEL_HINT_LETMELIVE diff --git a/code/datums/looping_sounds/music.dm b/code/datums/looping_sounds/music.dm index 56723f5db49..ac76e236bc7 100644 --- a/code/datums/looping_sounds/music.dm +++ b/code/datums/looping_sounds/music.dm @@ -8,3 +8,4 @@ use_reverb = FALSE direct = TRUE sound_channel = CHANNEL_ELEVATOR + diff --git a/code/datums/looping_sounds/projectiles.dm b/code/datums/looping_sounds/projectiles.dm new file mode 100644 index 00000000000..6bc9a466ea1 --- /dev/null +++ b/code/datums/looping_sounds/projectiles.dm @@ -0,0 +1,4 @@ +/datum/looping_sound/moon_parade + mid_sounds = list('sound/effects/moon_parade_soundloop.ogg' = 1) + mid_length = 0 + volume = 20 diff --git a/code/datums/map_config.dm b/code/datums/map_config.dm index 9535bcf8576..762658b462a 100644 --- a/code/datums/map_config.dm +++ b/code/datums/map_config.dm @@ -34,7 +34,7 @@ "cargo" = "cargo_skyrat", "ferry" = "ferry_fancy", "whiteship" = "whiteship_meta", - "emergency" = "emergency_skyrat") //SKYRAT EDIT CHANGE + "emergency" = "emergency_skyrat") //NOVA EDIT CHANGE /// Dictionary of job sub-typepath to template changes dictionary var/job_changes = list() diff --git a/code/datums/mapgen/CaveGenerator.dm b/code/datums/mapgen/CaveGenerator.dm index 754b8755545..123b66ea13c 100644 --- a/code/datums/mapgen/CaveGenerator.dm +++ b/code/datums/mapgen/CaveGenerator.dm @@ -88,10 +88,10 @@ string_gen = rustg_cnoise_generate("[initial_closed_chance]", "[smoothing_iterations]", "[birth_limit]", "[death_limit]", "[world.maxx]", "[world.maxy]") //Generate the raw CA data for(var/turf/gen_turf as anything in turfs) //Go through all the turfs and generate them - //SKYRAT EDIT ADDITION + //NOVA EDIT ADDITION if(istype(gen_turf, /turf/open/space/mirage)) continue - //SKYRAT EDIT END + //NOVA EDIT END var/closed = string_gen[world.maxx * (gen_turf.y - 1) + gen_turf.x] != "0" var/turf/new_turf = pick(closed ? closed_turf_types : open_turf_types) @@ -192,5 +192,5 @@ CHECK_TICK var/message = "[name] terrain population finished in [(REALTIMEOFDAY - start_time)/10]s!" - add_startup_message(message) //SKYRAT EDIT CHANGE - ORIGINAL: to_chat(world, span_boldannounce("[message]")) + add_startup_message(message) //NOVA EDIT CHANGE - ORIGINAL: to_chat(world, span_boldannounce("[message]")) log_world(message) diff --git a/code/datums/martial/boxing.dm b/code/datums/martial/boxing.dm index 9ba1a53d40c..da30104c9af 100644 --- a/code/datums/martial/boxing.dm +++ b/code/datums/martial/boxing.dm @@ -33,14 +33,14 @@ var/obj/item/bodypart/affecting = defender.get_bodypart(defender.get_random_valid_zone(attacker.zone_selected)) var/armor_block = defender.run_armor_check(affecting, MELEE) - // SKYRAT EDIT CHANGE + // NOVA EDIT CHANGE var/sound/attack_sound if(!active_arm.unarmed_attack_sound) attack_sound = get_sfx("punch") else attack_sound = active_arm.unarmed_attack_sound playsound(defender.loc, attack_sound, 25, TRUE, -1) - //SKYRAT EDIT END + //NOVA EDIT END defender.visible_message(span_danger("[attacker] [atk_verb]ed [defender]!"), \ span_userdanger("You're [atk_verb]ed by [attacker]!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), COMBAT_MESSAGE_RANGE, attacker) diff --git a/code/datums/martial/plasma_fist.dm b/code/datums/martial/plasma_fist.dm index f4c89177ac3..ce2b2e6e2d3 100644 --- a/code/datums/martial/plasma_fist.dm +++ b/code/datums/martial/plasma_fist.dm @@ -98,7 +98,7 @@ human_attacker.underwear = "Nude" human_attacker.undershirt = "Nude" human_attacker.socks = "Nude" - human_attacker.bra = "Nude" // SKYRAT EDIT ADDITION - Underwear and bra split + human_attacker.bra = "Nude" // NOVA EDIT ADDITION - Underwear and bra split human_attacker.update_body() var/turf/boomspot = get_turf(user) diff --git a/code/datums/materials/_material.dm b/code/datums/materials/_material.dm index 53e661d39d8..396b902b73f 100644 --- a/code/datums/materials/_material.dm +++ b/code/datums/materials/_material.dm @@ -245,7 +245,7 @@ Simple datum which is instanced once per type and is used for every object of sa * * Arguments: * - amount: The amount of the material to break down. - * - breakdown_flags: Some flags dictating how exactly this material is being broken down. */ -/datum/material/proc/return_composition(amount=1, breakdown_flags=NONE) - return list((src) = amount) // Yes we need the parenthesis, without them BYOND stringifies src into "src" and things break. +/datum/material/proc/return_composition(amount = 1) + // Yes we need the parenthesis, without them BYOND stringifies src into "src" and things break. + return list((src) = amount) diff --git a/code/datums/materials/alloys.dm b/code/datums/materials/alloys.dm index af208fdc5a4..e878a7f495d 100644 --- a/code/datums/materials/alloys.dm +++ b/code/datums/materials/alloys.dm @@ -6,18 +6,14 @@ init_flags = NONE /// The materials this alloy is made from weighted by their ratios. var/list/composition = null - /// Breakdown flags required to reduce this alloy to its component materials. - var/req_breakdown_flags = BREAKDOWN_ALLOYS - -/datum/material/alloy/return_composition(amount=1, breakdown_flags) - if(req_breakdown_flags & !(breakdown_flags & req_breakdown_flags)) - return ..() +/datum/material/alloy/return_composition(amount = 1) . = list() + var/list/cached_comp = composition for(var/comp_mat in cached_comp) var/datum/material/component_material = GET_MATERIAL_REF(comp_mat) - var/list/component_composition = component_material.return_composition(cached_comp[comp_mat], breakdown_flags) + var/list/component_composition = component_material.return_composition(cached_comp[comp_mat]) for(var/comp_comp_mat in component_composition) .[comp_comp_mat] += component_composition[comp_comp_mat] * amount diff --git a/code/datums/memory/_memory.dm b/code/datums/memory/_memory.dm index 57312774776..0656d32006a 100644 --- a/code/datums/memory/_memory.dm +++ b/code/datums/memory/_memory.dm @@ -71,7 +71,7 @@ // This happens after everything's all set, remember this for New overrides generate_memory_name() -/datum/memory/Destroy(force, ...) +/datum/memory/Destroy(force) memorizer_mind = null return ..() diff --git a/code/datums/mergers/_merger.dm b/code/datums/mergers/_merger.dm index 8014b6419fc..6816d415a89 100644 --- a/code/datums/mergers/_merger.dm +++ b/code/datums/mergers/_merger.dm @@ -28,7 +28,7 @@ src.attempt_merge_proc = attempt_merge_proc Refresh() -/datum/merger/Destroy(force, ...) +/datum/merger/Destroy(force) for(var/atom/thing as anything in members) RemoveMember(thing) return ..() diff --git a/code/datums/mind/_mind.dm b/code/datums/mind/_mind.dm index deb55e92ecb..e33065651a3 100644 --- a/code/datums/mind/_mind.dm +++ b/code/datums/mind/_mind.dm @@ -501,13 +501,13 @@ log_admin("[key_name(usr)] tried and failed to give [current] an uplink.") else log_admin("[key_name(usr)] gave [current] an uplink.") - //SKYRAT EDIT ADDITION BEGIN -- EXPLOITABLES + //NOVA EDIT ADDITION BEGIN -- EXPLOITABLES if("toggle_exploitables") has_exploitables_override = !has_exploitables_override //First we set the override to be the opposite of whatever it was apon execution, then we handle_exploitables() // use ternaries to convert this into true/false for admin logs. log_admin("[key_name(usr)] toggled [current]'s exploitables override to [(has_exploitables_override) ? "true" : "false"].") message_admins("[key_name(usr)] toggled [current]'s exploitables override to [(has_exploitables_override) ? "true" : "false"].") - //SKYRAT EDIT ADDITION END + //NOVA EDIT ADDITION END else if (href_list["obj_announce"]) announce_objectives() @@ -569,12 +569,12 @@ /// Sets us to the passed job datum, then greets them to their new job. /// Use this one for when you're assigning this mind to a new job for the first time, /// or for when someone's recieving a job they'd really want to be greeted to. -/datum/mind/proc/set_assigned_role_with_greeting(datum/job/new_role, client/incoming_client, alt_title) // SKYRAT EDIT CHANGE - ALTERNATIVE_JOB_TITLES - ORIGINAL: /datum/mind/proc/set_assigned_role_with_greeting(datum/job/new_role, client/incoming_client) +/datum/mind/proc/set_assigned_role_with_greeting(datum/job/new_role, client/incoming_client, alt_title) // NOVA EDIT CHANGE - ALTERNATIVE_JOB_TITLES - ORIGINAL: /datum/mind/proc/set_assigned_role_with_greeting(datum/job/new_role, client/incoming_client) . = set_assigned_role(new_role) if(assigned_role != new_role) return - var/intro_message = new_role.get_spawn_message(alt_title) // SKYRAT EDIT CHANGE - ALTERNATIVE_JOB_TITLES - ORIGINAL: var/intro_message = new_role.get_spawn_message() + var/intro_message = new_role.get_spawn_message(alt_title) // NOVA EDIT CHANGE - ALTERNATIVE_JOB_TITLES - ORIGINAL: var/intro_message = new_role.get_spawn_message() if(incoming_client && intro_message) to_chat(incoming_client, intro_message) diff --git a/code/datums/mind/antag.dm b/code/datums/mind/antag.dm index f95b1992c0d..81a0a939a9c 100644 --- a/code/datums/mind/antag.dm +++ b/code/datums/mind/antag.dm @@ -25,7 +25,7 @@ antag_team.add_member(src) INVOKE_ASYNC(A, TYPE_PROC_REF(/datum/antagonist, on_gain)) log_game("[key_name(src)] has gained antag datum [A.name]([A.type]).") - handle_exploitables() //SKYRAT EDIT ADDITION - EXPLOITABLES MENU + handle_exploitables() //NOVA EDIT ADDITION - EXPLOITABLES MENU return A /datum/mind/proc/remove_antag_datum(datum_type) diff --git a/code/datums/mocking/client.dm b/code/datums/mocking/client.dm index 418f5cfb8db..dc1db213f34 100644 --- a/code/datums/mocking/client.dm +++ b/code/datums/mocking/client.dm @@ -39,7 +39,7 @@ GLOB.directory[ckey] = src #endif -/datum/client_interface/Destroy(force, ...) +/datum/client_interface/Destroy(force) GLOB.directory -= ckey return ..() diff --git a/code/datums/mood.dm b/code/datums/mood.dm index 76f08641ecb..d8e7a1bbf9b 100644 --- a/code/datums/mood.dm +++ b/code/datums/mood.dm @@ -67,7 +67,7 @@ mob_parent = null -/datum/mood/Destroy(force, ...) +/datum/mood/Destroy(force) STOP_PROCESSING(SSmood, src) QDEL_LIST_ASSOC_VAL(mood_events) return ..() @@ -267,12 +267,12 @@ mood_screen_object.color = "#f15d36" if (!conflicting_moodies.len) // theres no special icons, use the normal icon states - //SKYRAT EDIT ADDITION BEGIN - ALEXITHYMIA + //NOVA EDIT ADDITION BEGIN - ALEXITHYMIA if(HAS_TRAIT(mob_parent, TRAIT_MOOD_NOEXAMINE)) mood_screen_object.icon_state = "mood5" mood_screen_object.color = "#4b96c4" return - //SKYRAT EDIT ADDITION END + //NOVA EDIT ADDITION END mood_screen_object.icon_state = "mood[mood_level]" return @@ -331,7 +331,7 @@ if(SANITY_INSANE to SANITY_CRAZY) msg += "[span_boldwarning("AHAHAHAHAHAHAHAHAHAH!!")]\n" */ - //SKYRAT EDIT CHANGE BEGIN - ALEXITHYMIA + //NOVA EDIT CHANGE BEGIN - ALEXITHYMIA if(!HAS_TRAIT(user, TRAIT_MOOD_NOEXAMINE)) switch(sanity) if(SANITY_GREAT to INFINITY) @@ -348,7 +348,7 @@ msg += "[span_boldwarning("AHAHAHAHAHAHAHAHAHAH!!")]\n" else msg += span_notice("I don't really know.") - //SKYRAT EDIT CHANGE END + //NOVA EDIT CHANGE END msg += span_notice("My current mood: ") //Short term //ORIGINAL @@ -373,7 +373,7 @@ if(MOOD_LEVEL_HAPPY4) msg += "[span_boldnicegreen("I love life!")]\n" */ - //SKYRAT EDIT CHANGE BEGIN - ALEXITHYMIA + //NOVA EDIT CHANGE BEGIN - ALEXITHYMIA if(!HAS_TRAIT(user, TRAIT_MOOD_NOEXAMINE)) switch(mood_level) if(MOOD_LEVEL_SAD4) @@ -396,10 +396,10 @@ msg += "[span_boldnicegreen("I love life!")]\n" else msg += "[span_notice("No clue.")]\n" - //SKYRAT EDIT CHANGE END + //NOVA EDIT CHANGE END msg += "[span_notice("Moodlets:")]\n"//All moodlets //if(mood_events.len) //ORIGINAL - if(mood_events.len && !HAS_TRAIT(user, TRAIT_MOOD_NOEXAMINE)) //SKYRAT EDIT CHANGE - ALEXITHYMIA + if(mood_events.len && !HAS_TRAIT(user, TRAIT_MOOD_NOEXAMINE)) //NOVA EDIT CHANGE - ALEXITHYMIA for(var/category in mood_events) var/datum/mood_event/event = mood_events[category] switch(event.mood_change) diff --git a/code/datums/mood_events/eldritch_painting_events.dm b/code/datums/mood_events/eldritch_painting_events.dm new file mode 100644 index 00000000000..7df89104263 --- /dev/null +++ b/code/datums/mood_events/eldritch_painting_events.dm @@ -0,0 +1,48 @@ +// These mood events are related to /obj/structure/sign/painting/eldritch +// Names are based on the subtype of painting they belong to + +// Mood applied for ripping the painting +/datum/mood_event/eldritch_painting + description = "YOU, I SHOULD NOT HAVE DONE THAT!!!" + mood_change = -6 + timeout = 3 MINUTES + +/datum/mood_event/eldritch_painting/weeping + description = "HE IS HERE, AND HE WEEPS!" + mood_change = -3 + timeout = 11 SECONDS + +/datum/mood_event/eldritch_painting/weeping_heretic + description = "Oh such arts! They truly inspire me!" + mood_change = 5 + timeout = 3 MINUTES + +/datum/mood_event/eldritch_painting/weeping_withdrawl + description = "My mind is clear from his influence." + mood_change = 1 + timeout = 3 MINUTES + +/datum/mood_event/eldritch_painting/desire_heretic + description = "A part gained, the manus takes and gives. What did it take from me?" + mood_change = -2 + timeout = 3 MINUTES + +/datum/mood_event/eldritch_painting/desire_examine + description = "A hunger kept at bay..." + mood_change = 3 + timeout = 3 MINUTES + +/datum/mood_event/eldritch_painting/heretic_vines + description = "Oh what a lovely flower!" + mood_change = 3 + timeout = 3 MINUTES + +/datum/mood_event/eldritch_painting/rust_examine + description = "The rusted climb can wait..." + mood_change = -2 + timeout = 3 MINUTES + +/datum/mood_event/eldritch_painting/rust_heretic_examine + description = "I must hurry the rusted climb!" + mood_change = 6 + timeout = 3 MINUTES diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm index e5f199b47ac..cc3af071eef 100644 --- a/code/datums/mood_events/generic_negative_events.dm +++ b/code/datums/mood_events/generic_negative_events.dm @@ -440,6 +440,16 @@ description = "I've been here too long! I want to go out and explore space!" mood_change = -3 +/datum/mood_event/moon_insanity + description = "THE MOON JUDGES AND FINDS ME WANTING!!!" + mood_change = -3 + timeout = 5 MINUTES + +/datum/mood_event/amulette_insanity + description = "I sEe THe LiGHt, It mUsT BE stOPPed" + mood_change = -6 + timeout = 5 MINUTES + ///Wizard cheesy grand finale - what everyone but the wizard gets /datum/mood_event/madness_despair description = "UNWORTHY, UNWORTHY, UNWORTHY!!!" diff --git a/code/datums/mood_events/generic_positive_events.dm b/code/datums/mood_events/generic_positive_events.dm index 9126f0a090e..8c760e8c4f8 100644 --- a/code/datums/mood_events/generic_positive_events.dm +++ b/code/datums/mood_events/generic_positive_events.dm @@ -372,6 +372,11 @@ mood_change = 2 timeout = 5 MINUTES +/datum/mood_event/moon_smile + description = "THE MOON SHOWS ME THE TRUTH AND ITS SMILE IS FACED TOWARDS ME!!!" + mood_change = 10 + timeout = 2 MINUTES + ///Wizard cheesy grand finale - what the wizard gets /datum/mood_event/madness_elation description = "Madness truly is the greatest of blessings..." diff --git a/code/datums/mood_events/needs_events.dm b/code/datums/mood_events/needs_events.dm index ceee687918e..dd710554d8d 100644 --- a/code/datums/mood_events/needs_events.dm +++ b/code/datums/mood_events/needs_events.dm @@ -76,3 +76,47 @@ description = "There's nothing like the feeling of a freshly laundered jumpsuit." mood_change = 2 timeout = 10 MINUTES + +/datum/mood_event/surrounded_by_silicon + description = "I'm surrounded by perfect lifeforms!!" + mood_change = 8 + +/datum/mood_event/around_many_silicon + description = "So many silicon lifeforms near me!" + mood_change = 4 + +/datum/mood_event/around_silicon + description = "The silicon lifeforms near me are absolutely perfect." + mood_change = 2 + +/datum/mood_event/around_organic + description = "The organics near me remind me of the inferiority of flesh." + mood_change = -2 + +/datum/mood_event/around_many_organic + description = "So many disgusting organics!" + mood_change = -4 + +/datum/mood_event/surrounded_by_organic + description = "I'm surrounded by disgusting organics!!" + mood_change = -8 + +/datum/mood_event/completely_robotic + description = "I've abandoned my feeble flesh, my form is perfect!!" + mood_change = 8 + +/datum/mood_event/very_robotic + description = "I'm more robot than organic!" + mood_change = 4 + +/datum/mood_event/balanced_robotic + description = "I'm part machine, part organic." + mood_change = 0 + +/datum/mood_event/very_organic + description = "I hate this feeble and weak flesh!" + mood_change = -4 + +/datum/mood_event/completely_organic + description = "I'm completely organic, this is miserable!!" + mood_change = -8 diff --git a/code/datums/mutations/_mutations.dm b/code/datums/mutations/_mutations.dm index cc99917c746..b33fbdadbf1 100644 --- a/code/datums/mutations/_mutations.dm +++ b/code/datums/mutations/_mutations.dm @@ -95,10 +95,10 @@ /datum/mutation/human/proc/on_acquiring(mob/living/carbon/human/acquirer) if(!acquirer || !istype(acquirer) || acquirer.stat == DEAD || (src in acquirer.dna.mutations)) return TRUE - // SKYRAT EDIT ADDITION + // NOVA EDIT ADDITION if(acquirer.has_borer()) to_chat(acquirer, span_warning("Something inside holds dearly to your humanity!")) - // SKYRAT EDIT END + // NOVA EDIT END if(species_allowed && !species_allowed.Find(acquirer.dna.species.id)) return TRUE if(health_req && acquirer.health < health_req) diff --git a/code/datums/mutations/body.dm b/code/datums/mutations/body.dm index 0fdf2820d2f..92859902137 100644 --- a/code/datums/mutations/body.dm +++ b/code/datums/mutations/body.dm @@ -119,24 +119,24 @@ /datum/mutation/human/dwarfism/on_acquiring(mob/living/carbon/human/owner) if(..()) return - // SKYRAT EDIT BEGIN + // NOVA EDIT BEGIN if(owner.dna.features["body_size"] < 1) to_chat(owner, "You feel your body shrinking even further, but your organs aren't! Uh oh!") owner.adjustBruteLoss(25) return - // SKYRAT EDIT END + // NOVA EDIT END ADD_TRAIT(owner, TRAIT_DWARF, GENETIC_MUTATION) owner.visible_message(span_danger("[owner] suddenly shrinks!"), span_notice("Everything around you seems to grow..")) /datum/mutation/human/dwarfism/on_losing(mob/living/carbon/human/owner) if(..()) return - // SKYRAT EDIT BEGIN + // NOVA EDIT BEGIN if(owner.dna.features["body_size"] < 1) to_chat(owner, "You feel relief as your organs cease to strain against your insides.") REMOVE_TRAIT(owner, TRAIT_DWARF, GENETIC_MUTATION) return - // SKYRAT EDIT END + // NOVA EDIT END REMOVE_TRAIT(owner, TRAIT_DWARF, GENETIC_MUTATION) owner.visible_message(span_danger("[owner] suddenly grows!"), span_notice("Everything around you seems to shrink..")) @@ -391,12 +391,12 @@ /datum/mutation/human/gigantism/on_acquiring(mob/living/carbon/human/owner) if(..()) return - // SKYRAT EDIT BEGIN + // NOVA EDIT BEGIN if(owner.dna.features["body_size"] > 1) to_chat(owner, "You feel your body expanding even further, but it feels like your bones are expanding too much!") owner.adjustBruteLoss(25) // take some DAMAGE return - // SKYRAT EDIT END + // NOVA EDIT END ADD_TRAIT(owner, TRAIT_GIANT, GENETIC_MUTATION) owner.update_transform(1.25) owner.visible_message(span_danger("[owner] suddenly grows!"), span_notice("Everything around you seems to shrink..")) @@ -404,12 +404,12 @@ /datum/mutation/human/gigantism/on_losing(mob/living/carbon/human/owner) if(..()) return - // SKYRAT EDIT BEGIN + // NOVA EDIT BEGIN if(owner.dna.features["body_size"] > 1) to_chat(owner, "You feel relief as your bones cease their growth spurt.") REMOVE_TRAIT(owner, TRAIT_GIANT, GENETIC_MUTATION) return - // SKYRAT EDIT END + // NOVA EDIT END REMOVE_TRAIT(owner, TRAIT_GIANT, GENETIC_MUTATION) owner.update_transform(0.8) owner.visible_message(span_danger("[owner] suddenly shrinks!"), span_notice("Everything around you seems to grow..")) diff --git a/code/datums/mutations/chameleon.dm b/code/datums/mutations/chameleon.dm index 4ec73f92a4b..b9b415efab6 100644 --- a/code/datums/mutations/chameleon.dm +++ b/code/datums/mutations/chameleon.dm @@ -12,20 +12,20 @@ /datum/mutation/human/chameleon/on_acquiring(mob/living/carbon/human/owner) if(..()) return - /// SKYRAT EDIT BEGIN + /// NOVA EDIT BEGIN if(HAS_TRAIT(owner, TRAIT_CHAMELEON_SKIN)) return ADD_TRAIT(owner, TRAIT_CHAMELEON_SKIN, GENETIC_MUTATION) - /// SKYRAT EDIT END + /// NOVA EDIT END owner.alpha = CHAMELEON_MUTATION_DEFAULT_TRANSPARENCY RegisterSignal(owner, COMSIG_MOVABLE_MOVED, PROC_REF(on_move)) RegisterSignal(owner, COMSIG_LIVING_UNARMED_ATTACK, PROC_REF(on_attack_hand)) /datum/mutation/human/chameleon/on_life(seconds_per_tick, times_fired) - /// SKYRAT EDIT BEGIN + /// NOVA EDIT BEGIN if(HAS_TRAIT(owner, TRAIT_CHAMELEON_SKIN)) owner.alpha = max(owner.alpha - (12.5 * (GET_MUTATION_POWER(src)) * seconds_per_tick), 0) - /// SKYRAT EDIT END + /// NOVA EDIT END /** * Resets the alpha of the host to the chameleon default if they move. @@ -40,12 +40,12 @@ /datum/mutation/human/chameleon/proc/on_move(atom/movable/source, atom/old_loc, move_dir, forced, list/atom/old_locs) SIGNAL_HANDLER - /// SKYRAT EDIT BEGIN + /// NOVA EDIT BEGIN if(HAS_TRAIT(owner, TRAIT_CHAMELEON_SKIN)) owner.alpha = CHAMELEON_MUTATION_DEFAULT_TRANSPARENCY else owner.alpha = 255 - /// SKYRAT EDIT END + /// NOVA EDIT END /** * Resets the alpha of the host if they click on something nearby. @@ -62,18 +62,18 @@ if(!proximity) //stops tk from breaking chameleon return - /// SKYRAT EDIT BEGIN + /// NOVA EDIT BEGIN if(HAS_TRAIT(owner, TRAIT_CHAMELEON_SKIN)) owner.alpha = CHAMELEON_MUTATION_DEFAULT_TRANSPARENCY else owner.alpha = 255 - /// SKYRAT EDIT END + /// NOVA EDIT END /datum/mutation/human/chameleon/on_losing(mob/living/carbon/human/owner) if(..()) return owner.alpha = 255 UnregisterSignal(owner, list(COMSIG_MOVABLE_MOVED, COMSIG_LIVING_UNARMED_ATTACK)) - /// SKYRAT EDIT BEGIN + /// NOVA EDIT BEGIN REMOVE_TRAIT(owner, TRAIT_CHAMELEON_SKIN, GENETIC_MUTATION) - /// SKYRAT EDIT END + /// NOVA EDIT END diff --git a/code/datums/mutations/hulk.dm b/code/datums/mutations/hulk.dm index a76adac10ac..5530a3b8311 100644 --- a/code/datums/mutations/hulk.dm +++ b/code/datums/mutations/hulk.dm @@ -130,7 +130,7 @@ if(ishuman(possible_throwable)) var/mob/living/carbon/human/human_throwable = possible_throwable //if(human_throwable.wear_suit && (human_throwable.wear_suit.flags_inv & HIDEJUMPSUIT)) // ORIGINAL - if(human_throwable.wear_suit && (human_throwable.wear_suit.flags_inv & HIDETAIL)) // SKYRAT EDIT CHANGE + if(human_throwable.wear_suit && (human_throwable.wear_suit.flags_inv & HIDETAIL)) // NOVA EDIT CHANGE to_chat(user, span_warning("You can't reach [human_throwable]'s tail through [human_throwable.p_their()] [human_throwable.wear_suit.name]!")) return diff --git a/code/datums/mutations/sight.dm b/code/datums/mutations/sight.dm index 69514ded90f..be2ee57b5f3 100644 --- a/code/datums/mutations/sight.dm +++ b/code/datums/mutations/sight.dm @@ -41,7 +41,7 @@ text_gain_indication = "You can see the heat rising off of your skin..." text_lose_indication = "You can no longer see the heat rising off of your skin..." instability = 25 - locked = TRUE //SKYRAT EDIT ADDITION + locked = TRUE //NOVA EDIT ADDITION synchronizer_coeff = 1 power_coeff = 1 energy_coeff = 1 diff --git a/code/datums/mutations/telekinesis.dm b/code/datums/mutations/telekinesis.dm index 956b266dd65..d5c719ece84 100644 --- a/code/datums/mutations/telekinesis.dm +++ b/code/datums/mutations/telekinesis.dm @@ -13,7 +13,7 @@ /datum/mutation/human/telekinesis/New(class_ = MUT_OTHER, timer, datum/mutation/human/copymut) ..() if(!(type in visual_indicators)) - visual_indicators[type] = list(mutable_appearance('modular_skyrat/master_files/icons/effects/tele_effects.dmi', "telekinesishead", -MUTATIONS_LAYER)) //SKYRAT EDIT, Old icon location: "icons/effects/genetics.dmi" + visual_indicators[type] = list(mutable_appearance('modular_nova/master_files/icons/effects/tele_effects.dmi', "telekinesishead", -MUTATIONS_LAYER)) //NOVA EDIT, Old icon location: "icons/effects/genetics.dmi" //visual_indicators[type] = list(mutable_appearance('icons/mob/effects/genetics.dmi', "telekinesishead", -MUTATIONS_LAYER)) //non Skyrat version /datum/mutation/human/telekinesis/on_acquiring(mob/living/carbon/human/H) diff --git a/code/datums/outfit.dm b/code/datums/outfit.dm index 38a67b1baa2..6289ea13f38 100644 --- a/code/datums/outfit.dm +++ b/code/datums/outfit.dm @@ -221,10 +221,10 @@ user.socks = initial(socks.name) - // SKYRAT EDIT ADDITION START - Underwear and bra split + // NOVA EDIT ADDITION START - Underwear and bra split if(bra) user.bra = initial(bra.name) - // SKYRAT EDIT END + // NOVA EDIT END if(accessory) var/obj/item/clothing/under/U = user.w_uniform @@ -342,7 +342,7 @@ item.add_fingerprint(user, ignoregloves = TRUE) return TRUE -//SKYRAT EDIT +//NOVA EDIT /** * Copies the outfit from a human to itself. **/ @@ -374,7 +374,7 @@ if(H.belt) belt = H.belt.type return TRUE -// SKYRAT EDIT END +// NOVA EDIT END /// Return a list of all the types that are required to disguise as this outfit type /datum/outfit/proc/get_chameleon_disguise_info() @@ -416,7 +416,7 @@ for(var/skillpath in skillchips) preload += skillpath - preload -= typesof(/obj/item/clothing/under/color/random) // SKYRAT EDIT - Don't preload random jumpsuit spawners that delete themselves + preload -= typesof(/obj/item/clothing/under/color/random) // NOVA EDIT - Don't preload random jumpsuit spawners that delete themselves return preload diff --git a/code/datums/proximity_monitor/fields/projectile_dampener.dm b/code/datums/proximity_monitor/fields/projectile_dampener.dm index 7f625d64524..705ac6bface 100644 --- a/code/datums/proximity_monitor/fields/projectile_dampener.dm +++ b/code/datums/proximity_monitor/fields/projectile_dampener.dm @@ -35,7 +35,6 @@ for(var/obj/projectile/projectile in tracked) if(!(projectile in ranged) || !projectile.loc) release_projectile(projectile) - ..() /datum/proximity_monitor/advanced/projectile_dampener/setup_edge_turf(turf/target) . = ..() diff --git a/code/datums/proximity_monitor/fields/timestop.dm b/code/datums/proximity_monitor/fields/timestop.dm index 86ea41aee01..c48759c1deb 100644 --- a/code/datums/proximity_monitor/fields/timestop.dm +++ b/code/datums/proximity_monitor/fields/timestop.dm @@ -238,7 +238,7 @@ //you don't look quite right, is something the matter? /datum/proximity_monitor/advanced/timestop/proc/into_the_negative_zone(atom/A) - A.add_atom_colour(list(-1,0,0,0, 0,-1,0,0, 0,0,-1,0, 0,0,0,1, 1,1,1,0), TEMPORARY_COLOUR_PRIORITY) + A.add_atom_colour(COLOR_MATRIX_INVERT, TEMPORARY_COLOUR_PRIORITY) //let's put some colour back into your cheeks /datum/proximity_monitor/advanced/timestop/proc/escape_the_negative_zone(atom/A) diff --git a/code/datums/quirks/_quirk.dm b/code/datums/quirks/_quirk.dm index 873ffd95fbd..6fbb583628f 100644 --- a/code/datums/quirks/_quirk.dm +++ b/code/datums/quirks/_quirk.dm @@ -28,7 +28,7 @@ var/abstract_parent_type = /datum/quirk /// The icon to show in the preferences menu. /// This references a tgui icon, so it can be FontAwesome or a tgfont (with a tg- prefix). - var/icon = "bug" //SKYRAT EDIT CHANGE + var/icon = "bug" //NOVA EDIT CHANGE /// A list of items people can receive from mail who have this quirk enabled /// The base weight for the each quirk's mail goodies list to be selected is 5 /// then the item selected is determined by pick(selected_quirk.mail_goodies) @@ -204,7 +204,7 @@ /mob/living/proc/get_quirk_string(medical = FALSE, category = CAT_QUIRK_ALL, from_scan = FALSE) var/list/dat = list() - // SKYRAT EDIT ADDITION START + // NOVA EDIT ADDITION START // The health analyzer will first check if the target is a changeling, and if they are, load the quirks of the person they're disguising as. var/target_quirks = quirks @@ -212,9 +212,9 @@ if(target_changeling) target_quirks = target_changeling.current_profile.quirks - // SKYRAT EDIT END + // NOVA EDIT END - for(var/datum/quirk/candidate as anything in target_quirks) // SKYRAT EDIT CHANGE - ORIGINAL : for(var/datum/quirk/candidate as anything in quirks) + for(var/datum/quirk/candidate as anything in target_quirks) // NOVA EDIT CHANGE - ORIGINAL : for(var/datum/quirk/candidate as anything in quirks) if(from_scan & candidate.quirk_flags & QUIRK_HIDE_FROM_SCAN) continue switch(category) diff --git a/code/datums/quirks/_quirk_constant_data.dm b/code/datums/quirks/_quirk_constant_data.dm index 977c52a6837..1984acecec0 100644 --- a/code/datums/quirks/_quirk_constant_data.dm +++ b/code/datums/quirks/_quirk_constant_data.dm @@ -58,7 +58,7 @@ GLOBAL_LIST_INIT_TYPED(all_quirk_constant_data, /datum/quirk_constant_data, gene /datum/quirk_constant_data/proc/is_customizable() return LAZYLEN(customization_options) > 0 -/datum/quirk_constant_data/Destroy(force, ...) +/datum/quirk_constant_data/Destroy(force) var/error_message = "[src], a singleton quirk constant data instance, was destroyed! This should not happen!" if (force) error_message += " NOTE: This Destroy() was called with force == TRUE. This instance will be deleted and replaced with a new one." diff --git a/code/datums/quirks/negative_quirks/claustrophobia.dm b/code/datums/quirks/negative_quirks/claustrophobia.dm index 226c9b65ef8..99442f13ffe 100644 --- a/code/datums/quirks/negative_quirks/claustrophobia.dm +++ b/code/datums/quirks/negative_quirks/claustrophobia.dm @@ -1,6 +1,6 @@ /datum/quirk/claustrophobia name = "Claustrophobia" - desc = "You are terrified of small spaces and certain jolly figures. If you are placed inside any container, locker, or machinery, a panic attack sets in and you struggle to breathe." + desc = "You are terrified of small spaces. If you are placed inside any container, locker, or machinery, a panic attack sets in and you struggle to breathe." // NOVA EDIT CHANGE - ORIGINAL: desc = "You are terrified of small spaces and certain jolly figures. If you are placed inside any container, locker, or machinery, a panic attack sets in and you struggle to breathe." icon = FA_ICON_BOX_OPEN value = -4 medical_record_text = "Patient demonstrates a fear of tight spaces." @@ -20,10 +20,12 @@ var/nick_spotted = FALSE +/* NOVA EDIT REMOVAL START for(var/mob/living/carbon/human/possible_claus in view(5, quirk_holder)) if(evaluate_jolly_levels(possible_claus)) nick_spotted = TRUE break +NOVA EDIT REMOVAL END */ if(!nick_spotted && isturf(quirk_holder.loc)) quirk_holder.clear_mood_event("claustrophobia") diff --git a/code/datums/quirks/negative_quirks/cursed.dm b/code/datums/quirks/negative_quirks/cursed.dm index 4b99ff850b8..638c8ae97a8 100644 --- a/code/datums/quirks/negative_quirks/cursed.dm +++ b/code/datums/quirks/negative_quirks/cursed.dm @@ -1,5 +1,5 @@ /* -// SKYRAT EDIT REMOVAL +// NOVA EDIT REMOVAL /datum/quirk/cursed name = "Cursed" desc = "You are cursed with bad luck. You are much more likely to suffer from accidents and mishaps. When it rains, it pours." @@ -14,4 +14,4 @@ /datum/quirk/cursed/add(client/client_source) quirk_holder.AddComponent(/datum/component/omen/quirk) */ -// SKYRAT EDIT REMOVAL END +// NOVA EDIT REMOVAL END diff --git a/code/datums/quirks/neutral_quirks/colorist.dm b/code/datums/quirks/neutral_quirks/colorist.dm index f82fd5bf6fe..2374ad63430 100644 --- a/code/datums/quirks/neutral_quirks/colorist.dm +++ b/code/datums/quirks/neutral_quirks/colorist.dm @@ -1,4 +1,4 @@ -/* SKYRAT EDIT REMOVAL +/* NOVA EDIT REMOVAL /datum/quirk/item_quirk/colorist name = "Colorist" desc = "You like carrying around a hair dye spray to quickly apply color patterns to your hair." @@ -10,4 +10,4 @@ /datum/quirk/item_quirk/colorist/add_unique(client/client_source) give_item_to_holder(/obj/item/dyespray, list(LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, LOCATION_HANDS = ITEM_SLOT_HANDS)) */ -//SKYRAT EDIT REMOVAL +//NOVA EDIT REMOVAL diff --git a/code/datums/quirks/neutral_quirks/transhumanist.dm b/code/datums/quirks/neutral_quirks/transhumanist.dm new file mode 100644 index 00000000000..573b70cf21b --- /dev/null +++ b/code/datums/quirks/neutral_quirks/transhumanist.dm @@ -0,0 +1,174 @@ +#define MOOD_CATEGORY_TRANSHUMANIST_PEOPLE "transhumanist_people" +#define MOOD_CATEGORY_TRANSHUMANIST_BODYPART "transhumanist_bodypart" +// The number of silicons minus the number of organics determines the level +#define TRANSHUMANIST_LEVEL_ECSTATIC 4 +#define TRANSHUMANIST_LEVEL_HAPPY 1 +#define TRANSHUMANIST_LEVEL_NEUTRAL 0 +#define TRANSHUMANIST_LEVEL_UNHAPPY -2 +#define TRANSHUMANIST_LEVEL_ANGRY -5 + +#define BODYPART_SCORE_ORGANIC 1 +#define BODYPART_SCORE_SILICON 2 +#define BODYPART_SCORE_OTHER_BODYTYPES 3 +#define BODYPART_SCORE_OVERALL 4 + + +/datum/quirk/transhumanist + name = "Transhumanist" + desc = "You see silicon life as the perfect lifeform and despise organic flesh. You are happier around silicons, but get frustrated when around organics. You seek to replace your fleshy limbs with their silicon counterparts. You start with a robotic limb." + icon = FA_ICON_ROBOT + quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_PROCESSES|QUIRK_MOODLET_BASED + value = 0 + gain_text = span_notice("You have a desire to ditch your feeble organic flesh and surround yourself with robots.") + lose_text = span_danger("Robots don't seem all that great anymore.") + medical_record_text = "Patient reports hating pathetic creatures of meat and bone." + mail_goodies = list( + /obj/item/stock_parts/cell/potato, + /obj/item/stack/cable_coil, + /obj/item/toy/talking/ai, + /obj/item/toy/figure/borg, + ) + var/slot_string + var/obj/item/bodypart/old_limb + +/datum/quirk/transhumanist/add(client/client_source) + RegisterSignal(quirk_holder, COMSIG_CARBON_POST_ATTACH_LIMB, PROC_REF(calculate_bodypart_score)) + RegisterSignal(quirk_holder, COMSIG_CARBON_POST_REMOVE_LIMB, PROC_REF(calculate_bodypart_score)) + RegisterSignal(quirk_holder, COMSIG_CARBON_GAIN_ORGAN, PROC_REF(calculate_bodypart_score)) + RegisterSignal(quirk_holder, COMSIG_CARBON_LOSE_ORGAN, PROC_REF(calculate_bodypart_score)) + calculate_bodypart_score() + +/datum/quirk/transhumanist/remove() + UnregisterSignal(quirk_holder, list(COMSIG_CARBON_REMOVE_LIMB, COMSIG_CARBON_ATTACH_LIMB)) + +/datum/quirk/transhumanist/proc/get_bodypart_score(mob/living/carbon/target, limbs_only = FALSE) + var/organic_bodytypes = 0 + var/silicon_bodytypes = 0 + var/other_bodytypes = FALSE + for(var/obj/item/bodypart/part as anything in target.bodyparts) + if(part.bodytype & BODYTYPE_ROBOTIC) + silicon_bodytypes += 1 + else if(part.bodytype & BODYTYPE_ORGANIC) + organic_bodytypes += 0.1 + else + other_bodytypes = TRUE + + if(!limbs_only) + for(var/obj/item/organ/organ as anything in target.organs) + if(organ.organ_flags & ORGAN_ROBOTIC) + silicon_bodytypes += 0.25 + else if(organ.organ_flags & ORGAN_ORGANIC) + organic_bodytypes += 0.02 + + return list( + BODYPART_SCORE_ORGANIC = organic_bodytypes, + BODYPART_SCORE_SILICON = silicon_bodytypes, + BODYPART_SCORE_OTHER_BODYTYPES = other_bodytypes, + BODYPART_SCORE_OVERALL = silicon_bodytypes - organic_bodytypes + ) + + +/datum/quirk/transhumanist/proc/calculate_bodypart_score() + SIGNAL_HANDLER + var/list/score = get_bodypart_score(quirk_holder) + var/organic_bodytypes = score[BODYPART_SCORE_ORGANIC] + var/silicon_bodytypes = score[BODYPART_SCORE_SILICON] + var/other_bodytypes = score[BODYPART_SCORE_OTHER_BODYTYPES] + + if(!other_bodytypes) + if(organic_bodytypes <= 0.02) + quirk_holder.add_mood_event(MOOD_CATEGORY_TRANSHUMANIST_BODYPART, /datum/mood_event/completely_robotic) + return + else if(silicon_bodytypes == 0) + quirk_holder.add_mood_event(MOOD_CATEGORY_TRANSHUMANIST_BODYPART, /datum/mood_event/completely_organic) + return + else if(silicon_bodytypes == 0 && organic_bodytypes == 0) + quirk_holder.clear_mood_event(MOOD_CATEGORY_TRANSHUMANIST_BODYPART) + return + + var/bodypart_score = score[BODYPART_SCORE_OVERALL] + switch(bodypart_score) + if(3 to INFINITY) + quirk_holder.add_mood_event(MOOD_CATEGORY_TRANSHUMANIST_BODYPART, /datum/mood_event/very_robotic) + if(0 to 3) + quirk_holder.add_mood_event(MOOD_CATEGORY_TRANSHUMANIST_BODYPART, /datum/mood_event/balanced_robotic) + if(-INFINITY to 0) + quirk_holder.add_mood_event(MOOD_CATEGORY_TRANSHUMANIST_BODYPART, /datum/mood_event/very_organic) + + +/datum/quirk/transhumanist/add_unique(client/client_source) + var/limb_type = GLOB.limb_choice_transhuman[client_source?.prefs?.read_preference(/datum/preference/choiced/prosthetic)] + if(isnull(limb_type)) //Client gone or they chose a random prosthetic + limb_type = GLOB.limb_choice_transhuman[pick(GLOB.limb_choice_transhuman)] + + var/mob/living/carbon/human/human_holder = quirk_holder + var/obj/item/bodypart/new_part = new limb_type() + + slot_string = "[new_part.plaintext_zone]" + old_limb = human_holder.return_and_replace_bodypart(new_part, special = TRUE) + +/datum/quirk/transhumanist/post_add() + if(slot_string) + to_chat(quirk_holder, span_boldannounce("Your [slot_string] has been replaced with a robot arm. You need to use a welding tool and cables to repair it, instead of sutures and regenerative meshes.")) + +/datum/quirk/transhumanist/remove() + if(old_limb) + var/mob/living/carbon/human/human_holder = quirk_holder + human_holder.del_and_replace_bodypart(old_limb, special = TRUE) + old_limb = null + quirk_holder.clear_mood_event(MOOD_CATEGORY_TRANSHUMANIST_BODYPART) + quirk_holder.clear_mood_event(MOOD_CATEGORY_TRANSHUMANIST_PEOPLE) + +/datum/quirk/transhumanist/process(seconds_per_tick) + var/organics_nearby = 0 + var/silicons_nearby = 0 + + // Only cares about things that are nearby + var/list/mobs = get_hearers_in_LOS(3, quirk_holder) + + for(var/mob/living/target in mobs) + if(!isturf(target.loc) || target == quirk_holder || target.alpha <= 128 || target.invisibility > quirk_holder.see_invisible) + continue + + if(iscarbon(target)) + var/list/score = get_bodypart_score(target, limbs_only = TRUE) + // For an average human, they'll need 2 augmented limbs to not get counted as an organic nor a silicon. + // If some monstrosity has 20-30 organic limbs, they'll likely need more. + if(score[BODYPART_SCORE_OVERALL] < 1) + organics_nearby += 1 + else if(score[BODYPART_SCORE_ORGANIC] == 0) + silicons_nearby += 1 + else if(target.mob_biotypes & MOB_ORGANIC) + organics_nearby += 1 + else if(target.mob_biotypes & MOB_ROBOTIC && target.stat != DEAD) // Dead silicons don't count, they're basically just machinery + silicons_nearby += 1 + + var/mood_result = silicons_nearby - organics_nearby + + switch(mood_result) + if(TRANSHUMANIST_LEVEL_ECSTATIC to INFINITY) + quirk_holder.add_mood_event(MOOD_CATEGORY_TRANSHUMANIST_PEOPLE, /datum/mood_event/surrounded_by_silicon) + if(TRANSHUMANIST_LEVEL_HAPPY to TRANSHUMANIST_LEVEL_ECSTATIC) + quirk_holder.add_mood_event(MOOD_CATEGORY_TRANSHUMANIST_PEOPLE, /datum/mood_event/around_many_silicon) + if(TRANSHUMANIST_LEVEL_NEUTRAL + 0.01 to TRANSHUMANIST_LEVEL_HAPPY) + quirk_holder.add_mood_event(MOOD_CATEGORY_TRANSHUMANIST_PEOPLE, /datum/mood_event/around_silicon) + if(TRANSHUMANIST_LEVEL_NEUTRAL) + quirk_holder.clear_mood_event(MOOD_CATEGORY_TRANSHUMANIST_PEOPLE) + if(TRANSHUMANIST_LEVEL_UNHAPPY to TRANSHUMANIST_LEVEL_NEUTRAL - 0.01) + quirk_holder.add_mood_event(MOOD_CATEGORY_TRANSHUMANIST_PEOPLE, /datum/mood_event/around_organic) + if(TRANSHUMANIST_LEVEL_ANGRY to TRANSHUMANIST_LEVEL_UNHAPPY) + quirk_holder.add_mood_event(MOOD_CATEGORY_TRANSHUMANIST_PEOPLE, /datum/mood_event/around_many_organic) + if(-INFINITY to TRANSHUMANIST_LEVEL_ANGRY) + quirk_holder.add_mood_event(MOOD_CATEGORY_TRANSHUMANIST_PEOPLE, /datum/mood_event/surrounded_by_organic) + +#undef MOOD_CATEGORY_TRANSHUMANIST_PEOPLE +#undef MOOD_CATEGORY_TRANSHUMANIST_BODYPART +#undef TRANSHUMANIST_LEVEL_ECSTATIC +#undef TRANSHUMANIST_LEVEL_HAPPY +#undef TRANSHUMANIST_LEVEL_NEUTRAL +#undef TRANSHUMANIST_LEVEL_UNHAPPY +#undef TRANSHUMANIST_LEVEL_ANGRY +#undef BODYPART_SCORE_ORGANIC +#undef BODYPART_SCORE_SILICON +#undef BODYPART_SCORE_OTHER_BODYTYPES +#undef BODYPART_SCORE_OVERALL diff --git a/code/datums/quirks/positive_quirks/cyborg_lover.dm b/code/datums/quirks/positive_quirks/cyborg_lover.dm deleted file mode 100644 index 8c75ab143b6..00000000000 --- a/code/datums/quirks/positive_quirks/cyborg_lover.dm +++ /dev/null @@ -1,45 +0,0 @@ -/datum/quirk/cyborg_lover - name = "Cyborg Lover" - desc = "You find silicon life forms fascinating! You like inspecting and touching their hulls and robo-bodies, as well you like being touched by their manipulators." - icon = FA_ICON_ROBOT - value = 2 - gain_text = span_notice("You are fascinated by silicon life forms.") - lose_text = span_danger("Cyborgs and other silicons aren't cool anymore.") - medical_record_text = "Patient reports being fascinated by silicon life forms." - mail_goodies = list( - /obj/item/stock_parts/cell/potato, - /obj/item/stack/cable_coil, - /obj/item/toy/talking/ai, - /obj/item/toy/figure/borg, - ) - -/datum/quirk/cyborg_lover/add(client/client_source) - var/datum/atom_hud/fan = GLOB.huds[DATA_HUD_FAN] - fan.show_to(quirk_holder) - -/datum/quirk/cyborg_lover/add_to_holder(mob/living/new_holder, quirk_transfer, client/client_source) - . = ..() - RegisterSignal(new_holder, COMSIG_MOB_PAT_BORG, PROC_REF(pat_cyborg), override = TRUE) - RegisterSignal(new_holder, COMSIG_BORG_TOUCH_MOB, PROC_REF(touched_by_cyborg), override = TRUE) - RegisterSignal(new_holder, COMSIG_BORG_HUG_MOB, PROC_REF(hugged_by_cyborg), override = TRUE) - -/datum/quirk/cyborg_lover/remove_from_current_holder(quirk_transfer) - UnregisterSignal(quirk_holder, list(COMSIG_MOB_PAT_BORG, COMSIG_BORG_TOUCH_MOB, COMSIG_BORG_HUG_MOB)) - return ..() - -/datum/quirk/cyborg_lover/proc/pat_cyborg() - SIGNAL_HANDLER - quirk_holder.add_mood_event("pat_borg", /datum/mood_event/pat_borg) - -/datum/quirk/cyborg_lover/proc/touched_by_cyborg() - SIGNAL_HANDLER - quirk_holder.add_mood_event("borg_touch", /datum/mood_event/borg_touch) - -/datum/quirk/cyborg_lover/proc/hugged_by_cyborg(borghugitem, mob/living/silicon/robot/hugger) - SIGNAL_HANDLER - hugger.visible_message( - span_notice("[hugger] hugs [quirk_holder] in a firm bear-hug! [quirk_holder] looks satisfied!"), - span_notice("You hug [quirk_holder] firmly to make [quirk_holder.p_them()] feel better! [quirk_holder] looks satisfied!"), - ) - quirk_holder.add_mood_event("borg_hug", /datum/mood_event/borg_hug) - return COMSIG_BORG_HUG_HANDLED diff --git a/code/datums/quirks/positive_quirks/empath.dm b/code/datums/quirks/positive_quirks/empath.dm index 3379f8a97c4..24115e71eaa 100644 --- a/code/datums/quirks/positive_quirks/empath.dm +++ b/code/datums/quirks/positive_quirks/empath.dm @@ -2,7 +2,7 @@ name = "Empath" desc = "Whether it's a sixth sense or careful study of body language, it only takes you a quick glance at someone to understand how they feel." icon = FA_ICON_SMILE_BEAM - value = 6 // SKYRAT EDIT CHANGE - Quirk Rebalance - Original: value = 8 + value = 6 // NOVA EDIT CHANGE - Quirk Rebalance - Original: value = 8 mob_trait = TRAIT_EMPATH gain_text = span_notice("You feel in tune with those around you.") lose_text = span_danger("You feel isolated from others.") diff --git a/code/datums/quirks/positive_quirks/spacer.dm b/code/datums/quirks/positive_quirks/spacer.dm index 3dbef8ecac5..83157352901 100644 --- a/code/datums/quirks/positive_quirks/spacer.dm +++ b/code/datums/quirks/positive_quirks/spacer.dm @@ -10,7 +10,7 @@ lose_text = span_danger("You feel homesick.") icon = FA_ICON_USER_ASTRONAUT value = 7 - quirk_flags = QUIRK_CHANGES_APPEARANCE //SKYRAT EDIT CHANGE - ORIGINAL: quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_CHANGES_APPEARANCE + quirk_flags = QUIRK_CHANGES_APPEARANCE //NOVA EDIT CHANGE - ORIGINAL: quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_CHANGES_APPEARANCE medical_record_text = "Patient is well-adapted to non-terrestrial environments." mail_goodies = list( /obj/item/storage/pill_bottle/ondansetron, diff --git a/code/datums/quirks/positive_quirks/spiritual.dm b/code/datums/quirks/positive_quirks/spiritual.dm index b08fe8b60c6..ab6a96cc249 100644 --- a/code/datums/quirks/positive_quirks/spiritual.dm +++ b/code/datums/quirks/positive_quirks/spiritual.dm @@ -2,7 +2,7 @@ name = "Spiritual" desc = "You hold a spiritual belief, whether in God, nature or the arcane rules of the universe. You gain comfort from the presence of holy people, and believe that your prayers are more special than others. Being in the chapel makes you happy." icon = FA_ICON_BIBLE - value = 2 /// SKYRAT EDIT - Quirk Rebalance - Original: value = 4 + value = 2 /// NOVA EDIT - Quirk Rebalance - Original: value = 4 mob_trait = TRAIT_SPIRITUAL gain_text = span_notice("You have faith in a higher power.") lose_text = span_danger("You lose faith!") diff --git a/code/datums/quirks/positive_quirks/tagger.dm b/code/datums/quirks/positive_quirks/tagger.dm index 4b0f48a1ca8..c2640081a6d 100644 --- a/code/datums/quirks/positive_quirks/tagger.dm +++ b/code/datums/quirks/positive_quirks/tagger.dm @@ -1,10 +1,10 @@ /datum/quirk/item_quirk/tagger name = "Tagger" - desc = "You're an experienced artist. People will actually be impressed by your graffiti, and you can get twice as many uses out of drawing supplies." + desc = "You're an experienced artist. People will actually be impressed by your graffiti, and you can get twice as many uses out of drawing supplies in half the time." icon = FA_ICON_SPRAY_CAN value = 4 mob_trait = TRAIT_TAGGER - gain_text = span_notice("You know how to tag walls efficiently.") + gain_text = span_notice("You know how to tag walls efficiently and quickly.") lose_text = span_danger("You forget how to tag walls properly.") medical_record_text = "Patient was recently seen for possible paint huffing incident." mail_goodies = list( diff --git a/code/datums/records/manifest.dm b/code/datums/records/manifest.dm index 7b43b7644ef..febd6374f7f 100644 --- a/code/datums/records/manifest.dm +++ b/code/datums/records/manifest.dm @@ -16,7 +16,7 @@ GLOBAL_DATUM_INIT(manifest, /datum/manifest, new) if(readied_player.new_character) log_manifest(readied_player.ckey,readied_player.new_character.mind,readied_player.new_character) if(ishuman(readied_player.new_character)) - inject(readied_player.new_character, readied_player.client) // SKYRAT EDIT - RP Records - ORIGINAL: inject(readied_player.new_character) + inject(readied_player.new_character, readied_player.client) // NOVA EDIT - RP Records - ORIGINAL: inject(readied_player.new_character) CHECK_TICK /// Gets the current manifest. @@ -38,7 +38,7 @@ GLOBAL_DATUM_INIT(manifest, /datum/manifest, new) misc_list[++misc_list.len] = list( "name" = name, "rank" = rank, - "trim" = trim, // SKYRAT EDIT ADDITION - Alt Titles + "trim" = trim, // NOVA EDIT ADDITION - Alt Titles ) continue for(var/department_type as anything in job.departments_list) @@ -52,7 +52,7 @@ GLOBAL_DATUM_INIT(manifest, /datum/manifest, new) var/list/entry = list( "name" = name, "rank" = rank, - "trim" = trim, // SKYRAT EDIT ADDITION - Alt Titles + "trim" = trim, // NOVA EDIT ADDITION - Alt Titles ) var/list/department_list = manifest_out[department.department_name] if(istype(job, department.department_head)) @@ -99,7 +99,7 @@ GLOBAL_DATUM_INIT(manifest, /datum/manifest, new) /// Injects a record into the manifest. -/datum/manifest/proc/inject(mob/living/carbon/human/person, client/person_client) // SKYRAT EDIT - RP Records - ORIGINAL: /datum/manifest/proc/inject(mob/living/carbon/human/person) +/datum/manifest/proc/inject(mob/living/carbon/human/person, client/person_client) // NOVA EDIT - RP Records - ORIGINAL: /datum/manifest/proc/inject(mob/living/carbon/human/person) set waitfor = FALSE if(!(person.mind?.assigned_role.job_flags & JOB_CREW_MANIFEST)) return @@ -114,10 +114,10 @@ GLOBAL_DATUM_INIT(manifest, /datum/manifest, new) var/datum/dna/record_dna = new() person.dna.copy_dna(record_dna) - // SKYRAT EDIT ADDITION BEGIN - ALTERNATIVE_JOB_TITLES + // NOVA EDIT ADDITION BEGIN - ALTERNATIVE_JOB_TITLES // The alt job title, if user picked one, or the default var/chosen_assignment = person_client?.prefs.alt_job_titles[assignment] || assignment - // SKYRAT EDIT ADDITION END - ALTERNATIVE_JOB_TITLES + // NOVA EDIT ADDITION END - ALTERNATIVE_JOB_TITLES var/datum/record/locked/lockfile = new( age = person.age, @@ -128,7 +128,7 @@ GLOBAL_DATUM_INIT(manifest, /datum/manifest, new) gender = person_gender, initial_rank = assignment, name = person.real_name, - rank = chosen_assignment, // SKYRAT EDIT - Alt job titles - ORIGINAL: rank = assignment, + rank = chosen_assignment, // NOVA EDIT - Alt job titles - ORIGINAL: rank = assignment, species = record_dna.species.name, trim = assignment, // Locked specifics @@ -145,7 +145,7 @@ GLOBAL_DATUM_INIT(manifest, /datum/manifest, new) gender = person_gender, initial_rank = assignment, name = person.real_name, - rank = chosen_assignment, // SKYRAT EDIT - Alt job titles - ORIGINAL: rank = assignment, + rank = chosen_assignment, // NOVA EDIT - Alt job titles - ORIGINAL: rank = assignment, species = record_dna.species.name, trim = assignment, // Crew specific @@ -155,13 +155,13 @@ GLOBAL_DATUM_INIT(manifest, /datum/manifest, new) minor_disabilities = person.get_quirk_string(FALSE, CAT_QUIRK_MINOR_DISABILITY, from_scan = TRUE), minor_disabilities_desc = person.get_quirk_string(TRUE, CAT_QUIRK_MINOR_DISABILITY), quirk_notes = person.get_quirk_string(TRUE, CAT_QUIRK_NOTES), - // SKYRAT EDIT START - RP Records + // NOVA EDIT START - RP Records background_information = person_client?.prefs.read_preference(/datum/preference/text/background) || "", exploitable_information = person_client?.prefs.read_preference(/datum/preference/text/exploitable) || "", past_general_records = person_client?.prefs.read_preference(/datum/preference/text/general) || "", past_medical_records = person_client?.prefs.read_preference(/datum/preference/text/medical) || "", past_security_records = person_client?.prefs.read_preference(/datum/preference/text/security) || "", - // SKYRAT EDIT END + // NOVA EDIT END ) return diff --git a/code/datums/records/record.dm b/code/datums/records/record.dm index 276865115e4..40f3ff06ed7 100644 --- a/code/datums/records/record.dm +++ b/code/datums/records/record.dm @@ -105,13 +105,13 @@ physical_status = PHYSICAL_ACTIVE, mental_status = MENTAL_STABLE, quirk_notes, - // SKYRAT EDIT START - RP Records + // NOVA EDIT START - RP Records background_information = "", exploitable_information = "", past_general_records = "", past_medical_records = "", past_security_records = "", - // SKYRAT EDIT END + // NOVA EDIT END ) . = ..() src.lock_ref = lock_ref @@ -122,13 +122,13 @@ src.physical_status = physical_status src.mental_status = mental_status src.quirk_notes = quirk_notes - // SKYRAT EDIT START - RP Records + // NOVA EDIT START - RP Records src.background_information = background_information src.exploitable_information = exploitable_information src.past_general_records = past_general_records src.past_medical_records = past_medical_records src.past_security_records = past_security_records - // SKYRAT EDIT END + // NOVA EDIT END GLOB.manifest.general += src @@ -239,18 +239,18 @@ final_paper_text += "Species: [species]
Fingerprint: [fingerprint]
Wanted Status: [wanted_status]

" - //SKYRAT EDIT ADD - RP RECORDS + //NOVA EDIT ADD - RP RECORDS if(past_general_records != "") final_paper_text += "
General Records:" final_paper_text += "
[past_general_records]
" - //SKYRAT EDIT ADD END + //NOVA EDIT ADD END final_paper_text += "
Security Data


" - //SKYRAT EDIT ADDITION START - RP RECORDS + //NOVA EDIT ADDITION START - RP RECORDS if(past_security_records != "") final_paper_text += "Security Records:" final_paper_text += "
[past_security_records]
" - //SKYRAT EDIT END + //NOVA EDIT END final_paper_text += "Crimes:
" final_paper_text += {" @@ -298,9 +298,9 @@ printed_paper.name = "SR-[print_count] '[name]'" - /// SKYRAT EDIT ADD - TRUE + /// NOVA EDIT ADD - TRUE printed_paper.add_raw_text(final_paper_text,TRUE) - /// SKYRAT EDIT ADD END + /// NOVA EDIT ADD END printed_paper.update_appearance() return printed_paper diff --git a/code/datums/ruins/icemoon.dm b/code/datums/ruins/icemoon.dm index a903d9444f4..406f4f46d0d 100644 --- a/code/datums/ruins/icemoon.dm +++ b/code/datums/ruins/icemoon.dm @@ -74,7 +74,7 @@ suffix = "icemoon_surface_smoking_room.dmm" // above and below ground together -/* SKYRAT EDIT REMOVAL - Mapping +/* NOVA EDIT REMOVAL - Mapping /datum/map_template/ruin/icemoon/mining_site name = "Mining Site" id = "miningsite" @@ -90,7 +90,7 @@ suffix = "icemoon_underground_mining_site.dmm" has_ceiling = FALSE unpickable = TRUE -*/ // SKYRAT EDIT REMOVAL End +*/ // NOVA EDIT REMOVAL End // below ground only /datum/map_template/ruin/icemoon/underground diff --git a/code/datums/ruins/lavaland.dm b/code/datums/ruins/lavaland.dm index b3bc5a4dc18..be28f7b5713 100644 --- a/code/datums/ruins/lavaland.dm +++ b/code/datums/ruins/lavaland.dm @@ -52,10 +52,10 @@ description = "A race of unbreathing lizards live here, that run faster than a human can, worship a broken dead city, and are capable of reproducing by something involving tentacles? \ Probably best to stay clear." prefix = "_maps/RandomRuins/LavaRuins/skyrat/" // SKYRAT ADDITION - suffix = "lavaland_surface_ash_walker1_skyrat.dmm" // SKYRAT EDIT - ORIGINAL: lavaland_surface_ash_walker1.dmm - cost = 1000 //SKYRAT EDIT: Original: 20 + suffix = "lavaland_surface_ash_walker1_skyrat.dmm" // NOVA EDIT - ORIGINAL: lavaland_surface_ash_walker1.dmm + cost = 1000 //NOVA EDIT: Original: 20 allow_duplicates = FALSE -//SKYRAT EDIT REMOVAL BEGIN - MAPPING +//NOVA EDIT REMOVAL BEGIN - MAPPING /* /datum/map_template/ruin/lavaland/syndicate_base name = "Syndicate Lava Base" @@ -65,7 +65,7 @@ cost = 20 allow_duplicates = FALSE */ -//SKYRAT EDIT REMOVAL END +//NOVA EDIT REMOVAL END /datum/map_template/ruin/lavaland/free_golem name = "Free Golem Ship" id = "golem-ship" diff --git a/code/datums/ruins/space.dm b/code/datums/ruins/space.dm index e95167cf83e..c89351ef926 100644 --- a/code/datums/ruins/space.dm +++ b/code/datums/ruins/space.dm @@ -179,7 +179,7 @@ /datum/map_template/ruin/space/spacehotel id = "spacehotel" - suffix = "spacehotel_skyrat.dmm" // SKYRAT EDIT CHANGE - ORIGINAL: suffix = "spacehotel.dmm" + suffix = "spacehotel_skyrat.dmm" // NOVA EDIT CHANGE - ORIGINAL: suffix = "spacehotel.dmm" name = "The Twin-Nexus Hotel" description = "An interstellar hotel, where the weary spaceman can rest their head and relax, assured that the residental staff will not murder them in their sleep. Probably." @@ -283,16 +283,16 @@ name = "Gondoland" description = "Just an ordinary rock- wait, what's that thing?" -// SKYRAT EDIT CHANGE START -- Reworked whiteship ruin -/* SKYRAT EDIT CHANGE -- ORIGINAL COMMENTED OUT +// NOVA EDIT CHANGE START -- Reworked whiteship ruin +/* NOVA EDIT CHANGE -- ORIGINAL COMMENTED OUT /datum/map_template/ruin/space/whiteshipruin_box id = "whiteshipruin_box" suffix = "whiteshipruin_box.dmm"*/ -/datum/map_template/ruin/space/whiteshipruin_box_skyrat//Skyrat Edit +/datum/map_template/ruin/space/whiteshipruin_box_skyrat//NOVA EDIT id = "whiteshipruin_box_skyrat" suffix = "whiteshipruin_box_skyrat.dmm" - // SKYRAT EDIT CHANGE END + // NOVA EDIT CHANGE END name = "NT Medical Ship" description = "An ancient ship, said to be among the first discovered derelicts near Space Station 13 that was still in working order. \ Aged and deprecated by time, this relic of a vessel is now broken beyond repair." diff --git a/code/datums/shuttles/emergency.dm b/code/datums/shuttles/emergency.dm index 5e8553c69ee..38dccb62295 100644 --- a/code/datums/shuttles/emergency.dm +++ b/code/datums/shuttles/emergency.dm @@ -1,6 +1,6 @@ #define EMAG_LOCKED_SHUTTLE_COST (CARGO_CRATE_VALUE * 50) -/datum/map_template/shuttle/emergency // SKYRAT EDIT OVERRIDE - OVERRIDEN IN ADVANCED_SHUTTLES - shuttles.dm +/datum/map_template/shuttle/emergency // NOVA EDIT OVERRIDE - OVERRIDEN IN ADVANCED_SHUTTLES - shuttles.dm port_id = "emergency" name = "Base Shuttle Template (Emergency)" ///assoc list of shuttle events to add to this shuttle on spawn (typepath = weight) @@ -130,7 +130,7 @@ credit_cost = EMAG_LOCKED_SHUTTLE_COST * 1.8 movement_force = list("KNOCKDOWN" = 3, "THROW" = 5) occupancy_limit = "70" - who_can_purchase = null //SKYRAT EDIT ADDITION + who_can_purchase = null //NOVA EDIT ADDITION /datum/map_template/shuttle/emergency/luxury suffix = "luxury" diff --git a/code/datums/skills/fitness.dm b/code/datums/skills/fitness.dm index 5e6e3a14c23..b000b7c5897 100644 --- a/code/datums/skills/fitness.dm +++ b/code/datums/skills/fitness.dm @@ -8,7 +8,7 @@ var/static/size_boost = list(0, 1/16, 1/8, 3/16, 2/8, 3/8, 4/8) // skill_item_path - your mob sprite gets bigger to showoff so we don't get a special item -/* SKYRAT EDIT REMOVAL START - NO SIZE INCREASE +/* NOVA EDIT REMOVAL START - NO SIZE INCREASE /datum/skill/fitness/level_gained(datum/mind/mind, new_level, old_level, silent) . = ..() var/old_gym_size = RESIZE_DEFAULT_SIZE + size_boost[old_level] @@ -22,4 +22,4 @@ var/new_gym_size = RESIZE_DEFAULT_SIZE + size_boost[new_level] mind.current.update_transform(new_gym_size / old_gym_size) -SKYRAT EDIT REMOVAL END */ +NOVA EDIT REMOVAL END */ diff --git a/code/datums/sprite_accessories.dm b/code/datums/sprite_accessories.dm index a3b81d41873..02e12504576 100644 --- a/code/datums/sprite_accessories.dm +++ b/code/datums/sprite_accessories.dm @@ -1169,7 +1169,7 @@ -/* SKYRAT EDIT REMOVAL START - Underwear and bra split +/* NOVA EDIT REMOVAL START - Underwear and bra split //FEMALE UNDERWEAR /datum/sprite_accessory/underwear/female_bikini name = "Bikini" @@ -1271,7 +1271,7 @@ icon_state = "female_kinky" gender = FEMALE use_static = TRUE -*/ // SKYRAT EDIT END +*/ // NOVA EDIT END //////////////////////////// // Undershirt Definitions // @@ -1467,7 +1467,7 @@ name = "Short-sleeved Shirt (White)" icon_state = "whiteshortsleeve" gender = NEUTER -/* SKYRAT EDIT REMOVAL START - Underwear and bra split +/* NOVA EDIT REMOVAL START - Underwear and bra split /datum/sprite_accessory/undershirt/sports_bra name = "Sports Bra" icon_state = "sports_bra" @@ -1477,7 +1477,7 @@ name = "Sports Bra (Alt)" icon_state = "sports_bra_alt" gender = NEUTER -*/ // SKYRAT EDIT END +*/ // NOVA EDIT END /datum/sprite_accessory/undershirt/blueshirtsport name = "Sports Shirt (Blue)" icon_state = "blueshirtsport" diff --git a/code/datums/station_traits/negative_traits.dm b/code/datums/station_traits/negative_traits.dm index 5c37fd7ede5..7b0ecf5b097 100644 --- a/code/datums/station_traits/negative_traits.dm +++ b/code/datums/station_traits/negative_traits.dm @@ -17,6 +17,30 @@ /datum/station_trait/distant_supply_lines/on_round_start() SSeconomy.pack_price_modifier *= 1.2 +///A negative trait that stops mail from arriving (or the inverse if on holiday). It also enables a specific shuttle loan situation. +/datum/station_trait/mail_blocked + name = "Postal workers strike" + trait_type = STATION_TRAIT_NEGATIVE + weight = 2 + show_in_report = TRUE + report_message = "Due to an ongoing strike announced by the postal workers union, mail won't be delivered this shift." + +/datum/station_trait/mail_blocked/on_round_start() + //This is either a holiday or sunday... well then, let's flip the situation. + if(SSeconomy.mail_blocked) + name = "Postal system overtime" + report_message = "Despite being a day off, the postal system is working overtime today. Mail will be delivered this shift." + else + var/datum/round_event_control/shuttle_loan/our_event = locate() in SSevents.control + our_event.unavailable_situations -= /datum/shuttle_loan_situation/mail_strike + SSeconomy.mail_blocked = !SSeconomy.mail_blocked + +/datum/station_trait/mail_blocked/hangover/revert() + var/datum/round_event_control/shuttle_loan/our_event = locate() in SSevents.control + our_event.unavailable_situations |= /datum/shuttle_loan_situation/mail_strike + SSeconomy.mail_blocked = !SSeconomy.mail_blocked + return ..() + ///A negative trait that reduces the amount of products available from vending machines throughout the station. /datum/station_trait/vending_shortage name = "Vending products shortage" @@ -458,11 +482,11 @@ var/list/shielding = list() /datum/station_trait/nebula/hostile/process(seconds_per_tick) - // SKYRAT EDIT ADDITION START + // NOVA EDIT ADDITION START if(!storms_enabled) get_shielding_level() // So shields still produce tritium return - // SKYRAT EDIT ADDITION END + // NOVA EDIT ADDITION END calculate_nebula_strength() apply_nebula_effect(nebula_intensity - get_shielding_level()) @@ -528,7 +552,7 @@ threat_reduction = 30 dynamic_threat_id = "Radioactive Nebula" - intensity_increment_time = 10 MINUTES // SKYRAT EDIT longer shield duration - ORIGINAL: intensity_increment_time = 5 MINUTES / + intensity_increment_time = 10 MINUTES // NOVA EDIT longer shield duration - ORIGINAL: intensity_increment_time = 5 MINUTES / maximum_nebula_intensity = 1 HOURS + 40 MINUTES nebula_layer = /atom/movable/screen/parallax_layer/random/space_gas/radioactive @@ -629,7 +653,7 @@ new /obj/effect/pod_landingzone (get_safe_random_station_turf(), new /obj/structure/closet/supplypod/centcompod (), new /obj/machinery/nebula_shielding/emergency/radiation ()) /datum/station_trait/nebula/hostile/radiation/send_instructions() - /* SKYRAT EDIT REMOVAL START - No more radiation storms on station + /* NOVA EDIT REMOVAL START - No more radiation storms on station var/obj/machinery/nebula_shielding/shielder = /obj/machinery/nebula_shielding/radiation var/obj/machinery/gravity_generator/main/innate_shielding = /obj/machinery/gravity_generator/main //How long do we have untill the first shielding unit needs to be up? @@ -648,12 +672,12 @@ You have [deadline] before the nebula enters the station. \ Every shielding unit will provide an additional [shielder_time] of protection, fully protecting the station with [max_shielders] shielding units. "} - SKYRAT EDIT REMOVAL END */ - // SKYRAT EDIT CHANGE START - ORIGINAL: See above + NOVA EDIT REMOVAL END */ + // NOVA EDIT CHANGE START - ORIGINAL: See above var/announcement = {"Your station has been constructed inside a radioactive nebula. \ Standard spacesuits will not protect against the nebula and using them is strongly discouraged. "} - // SKYRAT EDIT CHANGE END + // NOVA EDIT CHANGE END priority_announce(announcement, sound = 'sound/misc/notice1.ogg') diff --git a/code/datums/station_traits/neutral_traits.dm b/code/datums/station_traits/neutral_traits.dm index f0b2c625537..d3eba73bdc1 100644 --- a/code/datums/station_traits/neutral_traits.dm +++ b/code/datums/station_traits/neutral_traits.dm @@ -411,7 +411,7 @@ name = "AI Triumvirate" trait_type = STATION_TRAIT_NEUTRAL show_in_report = TRUE - weight = 0 // SKYRAT EDIT Original = 1 + weight = 0 // NOVA EDIT Original = 1 report_message = "Your station has been instated with three Nanotrasen Artificial Intelligence models." /datum/station_trait/triple_ai/New() diff --git a/code/datums/station_traits/positive_traits.dm b/code/datums/station_traits/positive_traits.dm index b8f349a5e8f..7b3ed0a0b15 100644 --- a/code/datums/station_traits/positive_traits.dm +++ b/code/datums/station_traits/positive_traits.dm @@ -242,7 +242,7 @@ /datum/job/station_engineer = /obj/item/organ/internal/cyberimp/arm/toolset, /datum/job/virologist = /obj/item/organ/internal/lungs/cybernetic/tier2, /datum/job/warden = /obj/item/organ/internal/cyberimp/eyes/hud/security, - // SKYRAT EDIT ADDITION START - MODULAR JOBS + // NOVA EDIT ADDITION START - MODULAR JOBS /datum/job/blueshield = /obj/item/organ/internal/cyberimp/brain/anti_stun, /datum/job/nanotrasen_consultant = /obj/item/organ/internal/heart/cybernetic/tier3, /datum/job/barber = /obj/item/organ/internal/ears/cybernetic/whisper, @@ -252,7 +252,7 @@ /datum/job/customs_agent = /obj/item/organ/internal/cyberimp/eyes/hud/security, /datum/job/bouncer = /obj/item/organ/internal/cyberimp/arm/muscle, /datum/job/engineering_guard = /obj/item/organ/internal/cyberimp/arm/flash, - // SKYRAT EDIT END + // NOVA EDIT END ) /datum/station_trait/cybernetic_revolution/New() diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm index 39d5c3a3754..fe8deeef337 100644 --- a/code/datums/status_effects/buffs.dm +++ b/code/datums/status_effects/buffs.dm @@ -380,7 +380,7 @@ /datum/status_effect/regenerative_core/on_apply() ADD_TRAIT(owner, TRAIT_IGNOREDAMAGESLOWDOWN, STATUS_EFFECT_TRAIT) owner.adjustBruteLoss(-25) - owner.adjustStaminaLoss(-40) //Skyrat edit. Removes stamina on usage of regen core. + owner.adjustStaminaLoss(-40) //NOVA EDIT. Removes stamina on usage of regen core. owner.adjustFireLoss(-25) owner.fully_heal(HEAL_CC_STATUS) owner.bodytemperature = owner.get_body_temp_normal() diff --git a/code/datums/status_effects/debuffs/debuffs.dm b/code/datums/status_effects/debuffs/debuffs.dm index 18f99a91f89..a3c52f2e204 100644 --- a/code/datums/status_effects/debuffs/debuffs.dm +++ b/code/datums/status_effects/debuffs/debuffs.dm @@ -278,8 +278,8 @@ . = ..() if(!.) return - owner.add_traits(list(TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED, TRAIT_STASIS, TRAIT_NUMBED), TRAIT_STATUS_EFFECT(id)) // SKYRAT EDIT CHANGE - ORIGINAL: owner.add_traits(list(TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED, TRAIT_STASIS), TRAIT_STATUS_EFFECT(id)) - owner.throw_alert("stasis numbed", /atom/movable/screen/alert/numbed) //SKYRAT EDIT ADDITION - STASIS APPLIES NUMBED + owner.add_traits(list(TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED, TRAIT_STASIS, TRAIT_NUMBED), TRAIT_STATUS_EFFECT(id)) // NOVA EDIT CHANGE - ORIGINAL: owner.add_traits(list(TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED, TRAIT_STASIS), TRAIT_STATUS_EFFECT(id)) + owner.throw_alert("stasis numbed", /atom/movable/screen/alert/numbed) //NOVA EDIT ADDITION - STASIS APPLIES NUMBED owner.add_filter("stasis_status_ripple", 2, list("type" = "ripple", "flags" = WAVE_BOUNDED, "radius" = 0, "size" = 2)) var/filter = owner.get_filter("stasis_status_ripple") animate(filter, radius = 0, time = 0.2 SECONDS, size = 2, easing = JUMP_EASING, loop = -1, flags = ANIMATION_PARALLEL) @@ -290,12 +290,12 @@ /datum/status_effect/grouped/stasis/tick(seconds_between_ticks) update_time_of_death() - if(owner.stat >= UNCONSCIOUS) //SKYRAT EDIT START - STASIS KEEPS SLEEP GOING - owner.Sleeping(15 SECONDS) //SKYRAT EDIT END + if(owner.stat >= UNCONSCIOUS) //NOVA EDIT START - STASIS KEEPS SLEEP GOING + owner.Sleeping(15 SECONDS) //NOVA EDIT END /datum/status_effect/grouped/stasis/on_remove() - owner.remove_traits(list(TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED, TRAIT_STASIS, TRAIT_NUMBED), TRAIT_STATUS_EFFECT(id)) // SKYRAT EDIT CHANGE - ORIGINAL: owner.remove_traits(list(TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED, TRAIT_STASIS), TRAIT_STATUS_EFFECT(id)) - owner.clear_alert("stasis numbed") //SKYRAT EDIT ADDITION - STASIS APPLIED NUMBED + owner.remove_traits(list(TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED, TRAIT_STASIS, TRAIT_NUMBED), TRAIT_STATUS_EFFECT(id)) // NOVA EDIT CHANGE - ORIGINAL: owner.remove_traits(list(TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED, TRAIT_STASIS), TRAIT_STATUS_EFFECT(id)) + owner.clear_alert("stasis numbed") //NOVA EDIT ADDITION - STASIS APPLIED NUMBED owner.remove_filter("stasis_status_ripple") update_time_of_death() if(iscarbon(owner)) diff --git a/code/datums/status_effects/debuffs/drunk.dm b/code/datums/status_effects/debuffs/drunk.dm index 061c008def8..40bffc21b80 100644 --- a/code/datums/status_effects/debuffs/drunk.dm +++ b/code/datums/status_effects/debuffs/drunk.dm @@ -1,4 +1,4 @@ -// SKYRAT EDIT CHANGE BEGIN (#21546 DRUNK EFFECTS) +// NOVA EDIT CHANGE BEGIN (#21546 DRUNK EFFECTS) // Defines for the ballmer peak. #define BALLMER_PEAK_LOW_END 25.8 // Original 12.9 #define BALLMER_PEAK_HIGH_END 27.6 // Original 13.8 @@ -6,7 +6,7 @@ /// The threshld which determine if someone is tipsy vs drunk #define TIPSY_THRESHOLD 21 // Original 6 -// SKYRAT EDIT CHANGE END (#21546 DRUNK EFFECTS) +// NOVA EDIT CHANGE END (#21546 DRUNK EFFECTS) /** * The drunk status effect. @@ -71,7 +71,7 @@ // Every tick, the drunk value decrases by // 4% the current drunk_value + 0.01 // (until it reaches 0 and terminates) - set_drunk_value(drunk_value - (0.0075 + drunk_value * 0.0075)) // SKYRAT EDIT CHANGE - Alcohol Tolerance - Original: set_drunk_value(drunk_value - (0.01 + drunk_value * 0.04) + set_drunk_value(drunk_value - (0.0075 + drunk_value * 0.0075)) // NOVA EDIT CHANGE - Alcohol Tolerance - Original: set_drunk_value(drunk_value - (0.01 + drunk_value * 0.04) if(QDELETED(src)) return @@ -146,7 +146,7 @@ if(drunk_value > BALLMER_PEAK_WINDOWS_ME) // by this point you're into windows ME territory owner.say(pick_list_replacements(VISTA_FILE, "ballmer_windows_me_msg"), forced = "ballmer") - // SKYRAT EDIT CHANGE BEGIN (#21546 DRUNK EFFECTS) + // NOVA EDIT CHANGE BEGIN (#21546 DRUNK EFFECTS) /* ORIGINAL // Drunk slurring scales in intensity based on how drunk we are -at 16 you will likely not even notice it, // but when we start to scale up you definitely will @@ -201,7 +201,7 @@ if(iscarbon(owner)) var/mob/living/carbon/carbon_owner = owner carbon_owner.vomit() // Vomiting clears toxloss - consider this a blessing - // SKYRAT EDIT CHANGE END (#21546 DRUNK EFFECTS) + // NOVA EDIT CHANGE END (#21546 DRUNK EFFECTS) // Over 81, we will gain constant toxloss if(drunk_value >= 81) @@ -221,7 +221,7 @@ owner.adjustToxLoss(2) /datum/status_effect/inebriated/drunk/proc/attempt_to_blackout() - /* SKYRAT EDIT REMOVAL - Blackout drunk begone + /* NOVA EDIT REMOVAL - Blackout drunk begone var/mob/living/carbon/drunkard = owner if(drunkard.has_trauma_type(/datum/brain_trauma/severe/split_personality/blackout))// prevent ping spamming if(prob(10)) @@ -231,7 +231,7 @@ if(drunkard.gain_trauma(/datum/brain_trauma/severe/split_personality/blackout, TRAUMA_LIMIT_ABSOLUTE)) drunk_value -= 70 //So that the drunk personality can spice things up without being killed by liver failure return - */ // SKYRAT EDIT REMOVAL END + */ // NOVA EDIT REMOVAL END if(SSshuttle.emergency.mode == SHUTTLE_DOCKED && is_station_level(owner.z))// Don't put us in a deep sleep if the shuttle's here. QoL, mainly. to_chat(owner, span_warning("You're so tired... but you can't miss that shuttle...")) else diff --git a/code/datums/votes/map_vote.dm b/code/datums/votes/map_vote.dm index f65b06a1d8c..e30451c5d5e 100644 --- a/code/datums/votes/map_vote.dm +++ b/code/datums/votes/map_vote.dm @@ -13,7 +13,7 @@ var/list/maps = shuffle(global.config.maplist) for(var/map in maps) var/datum/map_config/possible_config = config.maplist[map] - if(!possible_config.votable || (possible_config.map_name in SSpersistence.blocked_maps) || possible_config.map_name == SSmapping.config?.map_name) // SKYRAT EDIT - Can't vote for the current map + if(!possible_config.votable || (possible_config.map_name in SSpersistence.blocked_maps) || possible_config.map_name == SSmapping.config?.map_name) // NOVA EDIT - Can't vote for the current map continue default_choices += possible_config.map_name diff --git a/code/datums/weather/weather_types/radiation_storm.dm b/code/datums/weather/weather_types/radiation_storm.dm index 08c88cd65f1..0b300214fdc 100644 --- a/code/datums/weather/weather_types/radiation_storm.dm +++ b/code/datums/weather/weather_types/radiation_storm.dm @@ -60,7 +60,7 @@ /datum/weather/rad_storm/end() if(..()) return - priority_announce("The radiation threat has passed. Please return to your workplaces.", "Anomaly Alert", ANNOUNCER_RADIATIONPASSED) //SKYRAT EDIT CHANGE + priority_announce("The radiation threat has passed. Please return to your workplaces.", "Anomaly Alert", ANNOUNCER_RADIATIONPASSED) //NOVA EDIT CHANGE status_alarm(FALSE) /datum/weather/rad_storm/proc/do_mutate(mob/living/carbon/human/mutant) diff --git a/code/datums/world_topic.dm b/code/datums/world_topic.dm index d930c496de6..b3ad0f0decc 100644 --- a/code/datums/world_topic.dm +++ b/code/datums/world_topic.dm @@ -163,7 +163,7 @@ /datum/world_topic/news_report/Run(list/input) - priority_announce(input["message"], "Breaking Update From [input["message_sender"]]") //SKYRAT EDIT CHANGE + priority_announce(input["message"], "Breaking Update From [input["message_sender"]]") //NOVA EDIT CHANGE /datum/world_topic/adminmsg keyword = "adminmsg" diff --git a/code/datums/wounds/_wound_static_data.dm b/code/datums/wounds/_wound_static_data.dm index 7a59ea57413..f996bb258c7 100644 --- a/code/datums/wounds/_wound_static_data.dm +++ b/code/datums/wounds/_wound_static_data.dm @@ -185,7 +185,7 @@ return new wound_path_to_generate -/datum/wound_pregen_data/Destroy(force, ...) +/datum/wound_pregen_data/Destroy(force) var/error_message = "[src], a singleton wound pregen data instance, was destroyed! This should not happen!" if (force) error_message += " NOTE: This Destroy() was called with force == TRUE. This instance will be deleted and replaced with a new one." diff --git a/code/datums/wounds/bones.dm b/code/datums/wounds/bones.dm index 1df5ff689ff..97c511f518e 100644 --- a/code/datums/wounds/bones.dm +++ b/code/datums/wounds/bones.dm @@ -13,7 +13,7 @@ /datum/wound/blunt/bone name = "Blunt (Bone) Wound" - wound_flags = (ACCEPTS_GAUZE | SPLINT_OVERLAY) // SKYRAT EDIT: MEDICAL -- Makes bone wounds have a splint overlay + wound_flags = (ACCEPTS_GAUZE | SPLINT_OVERLAY) // NOVA EDIT: MEDICAL -- Makes bone wounds have a splint overlay default_scar_file = BONE_SCAR_FILE @@ -334,7 +334,7 @@ brain_trauma_group = BRAIN_TRAUMA_MILD trauma_cycle_cooldown = 1.5 MINUTES internal_bleeding_chance = 40 - wound_flags = (ACCEPTS_GAUZE | MANGLES_INTERIOR | SPLINT_OVERLAY) // SKYRAT EDIT - MEDICAL (SPLINT_OVERLAY) + wound_flags = (ACCEPTS_GAUZE | MANGLES_INTERIOR | SPLINT_OVERLAY) // NOVA EDIT - MEDICAL (SPLINT_OVERLAY) regen_ticks_needed = 120 // ticks every 2 seconds, 240 seconds, so roughly 4 minutes default simple_desc = "Patient's bone has cracked in the middle, drastically reducing limb functionality." @@ -370,7 +370,7 @@ brain_trauma_group = BRAIN_TRAUMA_SEVERE trauma_cycle_cooldown = 2.5 MINUTES internal_bleeding_chance = 60 - wound_flags = (ACCEPTS_GAUZE | MANGLES_INTERIOR | SPLINT_OVERLAY) // SKYRAT EDIT - MEDICAL (SPLINT_OVERLAY) + wound_flags = (ACCEPTS_GAUZE | MANGLES_INTERIOR | SPLINT_OVERLAY) // NOVA EDIT - MEDICAL (SPLINT_OVERLAY) regen_ticks_needed = 240 // ticks every 2 seconds, 480 seconds, so roughly 8 minutes default simple_desc = "Patient's bones have effectively shattered completely, causing total immobilization of the limb." diff --git a/code/datums/wounds/scars/_scars.dm b/code/datums/wounds/scars/_scars.dm index e650899be29..2fdd92b82d0 100644 --- a/code/datums/wounds/scars/_scars.dm +++ b/code/datums/wounds/scars/_scars.dm @@ -30,7 +30,7 @@ /// If false, we will only check to see if a limb has ALL our biostates, instead of just any. var/check_any_biostates -/datum/scar/Destroy(force, ...) +/datum/scar/Destroy(force) if(limb) LAZYREMOVE(limb.scars, src) if(victim) diff --git a/code/game/area/areas/away_content.dm b/code/game/area/areas/away_content.dm index e7f56393a66..b5f63c41398 100644 --- a/code/game/area/areas/away_content.dm +++ b/code/game/area/areas/away_content.dm @@ -11,7 +11,7 @@ Unused icons for new areas are "awaycontent1" ~ "awaycontent30" has_gravity = STANDARD_GRAVITY ambience_index = AMBIENCE_AWAY sound_environment = SOUND_ENVIRONMENT_ROOM - area_flags = NOTELEPORT|UNIQUE_AREA //SKYRAT EDIT CHANGE + area_flags = NOTELEPORT|UNIQUE_AREA //NOVA EDIT CHANGE /area/awaymission/beach name = "Beach" diff --git a/code/game/area/areas/centcom.dm b/code/game/area/areas/centcom.dm index f5ac4fac78e..ee79b5b8cc7 100644 --- a/code/game/area/areas/centcom.dm +++ b/code/game/area/areas/centcom.dm @@ -87,11 +87,11 @@ name = "Supplypod Loading Facility" icon_state = "supplypod_loading" var/loading_id = "" - // SKYRAT EDIT START - Dynamic lights on CentCom + // NOVA EDIT START - Dynamic lights on CentCom static_lighting = FALSE base_lighting_color = COLOR_WHITE base_lighting_alpha = 255 - // SKYRAT EDIT END + // NOVA EDIT END /area/centcom/central_command_areas/supplypod/loading/Initialize(mapload) . = ..() diff --git a/code/game/area/areas/ruins/lavaland.dm b/code/game/area/areas/ruins/lavaland.dm index c16d65059ff..574ab51689b 100644 --- a/code/game/area/areas/ruins/lavaland.dm +++ b/code/game/area/areas/ruins/lavaland.dm @@ -92,10 +92,10 @@ //ash walker nest /area/ruin/unpowered/ash_walkers - //SKYRAT EDIT ADDITION BEGIN - ASH WALKER MACHINES FIX + //NOVA EDIT ADDITION BEGIN - ASH WALKER MACHINES FIX always_unpowered = FALSE power_equip = TRUE - //SKYRAT EDIT ADDITION END + //NOVA EDIT ADDITION END ambient_buzz = 'sound/ambience/magma.ogg' /area/ruin/unpowered/ratvar diff --git a/code/game/area/areas/shuttles.dm b/code/game/area/areas/shuttles.dm index 990c4d803d9..90a0d8313b7 100644 --- a/code/game/area/areas/shuttles.dm +++ b/code/game/area/areas/shuttles.dm @@ -149,7 +149,7 @@ name = "Labor Camp Shuttle" /area/shuttle/supply - name = "NLV Consign" //SKYRAT EDIT CHANGE + name = "NLV Consign" //NOVA EDIT CHANGE area_flags = NOTELEPORT /area/shuttle/escape diff --git a/code/game/atom/_atom.dm b/code/game/atom/_atom.dm index 92c2a6b8657..66ed2048665 100644 --- a/code/game/atom/_atom.dm +++ b/code/game/atom/_atom.dm @@ -133,6 +133,8 @@ /// How this atom should react to having its astar blocking checked var/can_astar_pass = CANASTARPASS_DENSITY + ///whether ghosts can see screentips on it + var/ghost_screentips = FALSE /** * Top level of the destroy chain for most atoms @@ -842,11 +844,11 @@ var/mob/user = client?.mob if (isnull(user)) return - ///SKYRAT EDIT ADDITION BEGIN + ///NOVA EDIT ADDITION BEGIN // Face directions on combat mode. No procs, no typechecks, just a var for speed if(user.face_mouse) user.face_atom(src) - ///SKYRAT EDIT ADDITION END + ///NOVA EDIT ADDITION END // Screentips var/datum/hud/active_hud = user.hud_used @@ -866,7 +868,7 @@ var/extra_lines = 0 var/extra_context = "" - if (isliving(user) || isovermind(user) || isaicamera(user)) + if(isliving(user) || isovermind(user) || isaicamera(user) || (ghost_screentips && isobserver(user))) var/obj/item/held_item = user.get_active_held_item() if (flags_1 & HAS_CONTEXTUAL_SCREENTIPS_1 || held_item?.item_flags & ITEM_HAS_CONTEXTUAL_SCREENTIPS) diff --git a/code/game/atom/atom_defense.dm b/code/game/atom/atom_defense.dm index 409b5a9e40b..8b398313616 100644 --- a/code/game/atom/atom_defense.dm +++ b/code/game/atom/atom_defense.dm @@ -111,12 +111,12 @@ switch(damage_type) if(BRUTE) if(damage_amount) - //SKYRAT EDIT ADDITION - CREDITS TO WHITEDREAM(valtos) - playsound(src, pick('modular_skyrat/master_files/sound/effects/metalblock1.wav', 'modular_skyrat/master_files/sound/effects/metalblock2.wav', \ - 'modular_skyrat/master_files/sound/effects/metalblock3.wav', 'modular_skyrat/master_files/sound/effects/metalblock4.wav', \ - 'modular_skyrat/master_files/sound/effects/metalblock5.wav', 'modular_skyrat/master_files/sound/effects/metalblock6.wav', \ - 'modular_skyrat/master_files/sound/effects/metalblock7.wav', 'modular_skyrat/master_files/sound/effects/metalblock8.wav'), 50, TRUE) - //SKYRAT EDIT END + //NOVA EDIT ADDITION - CREDITS TO WHITEDREAM(valtos) + playsound(src, pick('modular_nova/master_files/sound/effects/metalblock1.wav', 'modular_nova/master_files/sound/effects/metalblock2.wav', \ + 'modular_nova/master_files/sound/effects/metalblock3.wav', 'modular_nova/master_files/sound/effects/metalblock4.wav', \ + 'modular_nova/master_files/sound/effects/metalblock5.wav', 'modular_nova/master_files/sound/effects/metalblock6.wav', \ + 'modular_nova/master_files/sound/effects/metalblock7.wav', 'modular_nova/master_files/sound/effects/metalblock8.wav'), 50, TRUE) + //NOVA EDIT END else playsound(src, 'sound/weapons/tap.ogg', 50, TRUE) if(BURN) @@ -126,7 +126,7 @@ /atom/proc/hulk_damage() return 150 //the damage hulks do on punches to this atom, is affected by melee armor -/atom/proc/attack_generic(mob/user, damage_amount = 0, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, armor_penetration = 0) //used by attack_alien, attack_animal, and attack_slime +/atom/proc/attack_generic(mob/user, damage_amount = 0, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, armor_penetration = 0) //used by attack_alien, attack_animal if(!uses_integrity) CRASH("unimplemented /atom/proc/attack_generic()!") user.do_attack_animation(src) diff --git a/code/game/atom/atom_examine.dm b/code/game/atom/atom_examine.dm index a00f485391d..ada7074d773 100644 --- a/code/game/atom/atom_examine.dm +++ b/code/game/atom/atom_examine.dm @@ -13,7 +13,7 @@ /atom/proc/examine(mob/user) var/examine_string = get_examine_string(user, thats = TRUE) if(examine_string) - . = list("[examine_string].", EXAMINE_SECTION_BREAK) // SKYRAT EDIT CHANGE + . = list("[examine_string].", EXAMINE_SECTION_BREAK) // NOVA EDIT CHANGE else . = list() @@ -22,19 +22,19 @@ . += desc if(custom_materials) - // SKYRAT EDIT ADDITION BEGIN - HR sections + // NOVA EDIT ADDITION BEGIN - HR sections if(length(custom_materials) > 1) - . += EXAMINE_SECTION_BREAK //SKYRAT EDIT ADDITION - //SKYRAT EDIT ADDITION END + . += EXAMINE_SECTION_BREAK //NOVA EDIT ADDITION + //NOVA EDIT ADDITION END var/list/materials_list = list() for(var/custom_material in custom_materials) var/datum/material/current_material = GET_MATERIAL_REF(custom_material) materials_list += "[current_material.name]" . += "It is made out of [english_list(materials_list)]." - // SKYRAT EDIT ADDITION BEGIN - HR sections + // NOVA EDIT ADDITION BEGIN - HR sections if(length(custom_materials) > 1) - . += EXAMINE_SECTION_BREAK //SKYRAT EDIT ADDITION - //SKYRAT EDIT ADDITION END + . += EXAMINE_SECTION_BREAK //NOVA EDIT ADDITION + //NOVA EDIT ADDITION END if(reagents) var/user_sees_reagents = user.can_see_reagents() diff --git a/code/game/atom/atom_materials.dm b/code/game/atom/atom_materials.dm index ae9a5b3a18e..803a79110a1 100644 --- a/code/game/atom/atom_materials.dm +++ b/code/game/atom/atom_materials.dm @@ -36,15 +36,13 @@ * Arguments: * - flags: A set of flags determining how exactly the materials are broken down. */ -/atom/proc/get_material_composition(breakdown_flags=NONE) +/atom/proc/get_material_composition() . = list() - if(!(breakdown_flags & BREAKDOWN_INCLUDE_ALCHEMY) && HAS_TRAIT(src, TRAIT_MAT_TRANSMUTED)) - return var/list/cached_materials = custom_materials for(var/mat in cached_materials) var/datum/material/material = GET_MATERIAL_REF(mat) - var/list/material_comp = material.return_composition(cached_materials[mat], breakdown_flags) + var/list/material_comp = material.return_composition(cached_materials[mat]) for(var/comp_mat in material_comp) .[comp_mat] += material_comp[comp_mat] diff --git a/code/game/atom/atom_tool_acts.dm b/code/game/atom/atom_tool_acts.dm index 078615dba75..fb02d674cde 100644 --- a/code/game/atom/atom_tool_acts.dm +++ b/code/game/atom/atom_tool_acts.dm @@ -62,7 +62,7 @@ act_result = is_left_clicking ? welder_act(user, tool) : welder_act_secondary(user, tool) if(TOOL_ANALYZER) act_result = is_left_clicking ? analyzer_act(user, tool) : analyzer_act_secondary(user, tool) - // SKYRAT EDIT ADDITION START - SKYRAT TOOLS + // NOVA EDIT ADDITION START - SKYRAT TOOLS if(TOOL_BILLOW) act_result = is_left_clicking ? billow_act(user, tool) : billow_act_secondary(user, tool) if(TOOL_TONG) @@ -71,7 +71,7 @@ act_result = is_left_clicking ? hammer_act(user, tool) : hammer_act_secondary(user, tool) if(TOOL_BLOWROD) act_result = is_left_clicking ? blowrod_act(user, tool) : blowrod_act_secondary(user, tool) - // SKYRAT EDIT ADDITION END + // NOVA EDIT ADDITION END if(!act_result) return NONE diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index eda26605859..7966417a9ee 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -98,8 +98,8 @@ /// The degree of pressure protection that mobs in list/contents have from the external environment, between 0 and 1 var/contents_pressure_protection = 0 - /// Whether a user will face atoms on entering them with a mouse. Despite being a mob variable, it is here for performances //SKYRAT EDIT ADDITION - var/face_mouse = FALSE //SKYRAT EDIT ADDITION + /// Whether a user will face atoms on entering them with a mouse. Despite being a mob variable, it is here for performances //NOVA EDIT ADDITION + var/face_mouse = FALSE //NOVA EDIT ADDITION /// The voice that this movable makes when speaking var/voice @@ -621,7 +621,7 @@ if(!direction) direction = get_dir(src, newloc) - if(set_dir_on_move && dir != direction && update_dir && !face_mouse) // SKYRAT EDIT - && !face_mouse + if(set_dir_on_move && dir != direction && update_dir && !face_mouse) // NOVA EDIT - && !face_mouse setDir(direction) var/is_multi_tile_object = is_multi_tile_object(src) @@ -747,7 +747,7 @@ moving_diagonally = SECOND_DIAG_STEP . = step(src, SOUTH) if(moving_diagonally == SECOND_DIAG_STEP) - if(!. && set_dir_on_move && update_dir && !face_mouse) // SKYRAT EDIT CHANGE - && !face_mouse + if(!. && set_dir_on_move && update_dir && !face_mouse) // NOVA EDIT CHANGE - && !face_mouse setDir(first_step_dir) else if(!inertia_moving) newtonian_move(direct) @@ -787,7 +787,7 @@ last_move = direct - if(set_dir_on_move && dir != direct && update_dir && !face_mouse) // SKYRAT EDIT CHANGE - && !face_mouse) + if(set_dir_on_move && dir != direct && update_dir && !face_mouse) // NOVA EDIT CHANGE - && !face_mouse) setDir(direct) if(. && has_buckled_mobs() && !handle_buckled_mob_movement(loc, direct, glide_size_override)) //movement failed due to buckled mob(s) . = FALSE @@ -1225,7 +1225,7 @@ if(locate(/obj/structure/lattice) in range(1, get_turf(src))) //Not realistic but makes pushing things in space easier return TRUE - if(locate(/obj/structure/spacevine) in range(1, get_turf(src))) //SKYRAT EDIT: allow walking when vines are around + if(locate(/obj/structure/spacevine) in range(1, get_turf(src))) //NOVA EDIT: allow walking when vines are around return TRUE return FALSE diff --git a/code/game/communications.dm b/code/game/communications.dm index 41867376684..b2802899ec3 100644 --- a/code/game/communications.dm +++ b/code/game/communications.dm @@ -99,12 +99,12 @@ GLOBAL_LIST_INIT(radiochannels, list( RADIO_CHANNEL_ENGINEERING = FREQ_ENGINEERING, RADIO_CHANNEL_SECURITY = FREQ_SECURITY, RADIO_CHANNEL_CENTCOM = FREQ_CENTCOM, - RADIO_CHANNEL_FACTION = FREQ_FACTION, //SKYRAT EDIT ADDITION - FACTION - RADIO_CHANNEL_CYBERSUN = FREQ_CYBERSUN, //SKYRAT EDIT ADDITION - MAPPING - RADIO_CHANNEL_INTERDYNE = FREQ_INTERDYNE, //SKYRAT EDIT ADDITION - MAPPING - RADIO_CHANNEL_GUILD = FREQ_GUILD, //SKYRAT EDIT ADDITION - ASSAULT OPS - RADIO_CHANNEL_TARKON = FREQ_TARKON, //SKYRAT EDIT ADDITION - MAPPING - RADIO_CHANNEL_SOLFED = FREQ_SOLFED, //SKYRAT EDIT ADDITION - SOLFED + RADIO_CHANNEL_FACTION = FREQ_FACTION, //NOVA EDIT ADDITION - FACTION + RADIO_CHANNEL_CYBERSUN = FREQ_CYBERSUN, //NOVA EDIT ADDITION - MAPPING + RADIO_CHANNEL_INTERDYNE = FREQ_INTERDYNE, //NOVA EDIT ADDITION - MAPPING + RADIO_CHANNEL_GUILD = FREQ_GUILD, //NOVA EDIT ADDITION - ASSAULT OPS + RADIO_CHANNEL_TARKON = FREQ_TARKON, //NOVA EDIT ADDITION - MAPPING + RADIO_CHANNEL_SOLFED = FREQ_SOLFED, //NOVA EDIT ADDITION - SOLFED RADIO_CHANNEL_SYNDICATE = FREQ_SYNDICATE, RADIO_CHANNEL_UPLINK = FREQ_UPLINK, RADIO_CHANNEL_SUPPLY = FREQ_SUPPLY, @@ -124,11 +124,11 @@ GLOBAL_LIST_INIT(reverseradiochannels, list( "[FREQ_ENGINEERING]" = RADIO_CHANNEL_ENGINEERING, "[FREQ_SECURITY]" = RADIO_CHANNEL_SECURITY, "[FREQ_CENTCOM]" = RADIO_CHANNEL_CENTCOM, - "[FREQ_FACTION]" = RADIO_CHANNEL_FACTION, //SKYRAT EDIT ADDITION - FACTION - "[FREQ_CYBERSUN]" = RADIO_CHANNEL_CYBERSUN, //SKYRAT EDIT ADDITION - MAPPING - "[FREQ_INTERDYNE]" = RADIO_CHANNEL_INTERDYNE, //SKYRAT EDIT ADDITION - MAPPING - "[FREQ_TARKON]" = RADIO_CHANNEL_TARKON, //SKYRAT EDIT ADDITION - MAPPING - "[FREQ_SOLFED]" = RADIO_CHANNEL_SOLFED, //SKYRAT EDIT ADDITION - SOLFED + "[FREQ_FACTION]" = RADIO_CHANNEL_FACTION, //NOVA EDIT ADDITION - FACTION + "[FREQ_CYBERSUN]" = RADIO_CHANNEL_CYBERSUN, //NOVA EDIT ADDITION - MAPPING + "[FREQ_INTERDYNE]" = RADIO_CHANNEL_INTERDYNE, //NOVA EDIT ADDITION - MAPPING + "[FREQ_TARKON]" = RADIO_CHANNEL_TARKON, //NOVA EDIT ADDITION - MAPPING + "[FREQ_SOLFED]" = RADIO_CHANNEL_SOLFED, //NOVA EDIT ADDITION - SOLFED "[FREQ_SYNDICATE]" = RADIO_CHANNEL_SYNDICATE, "[FREQ_UPLINK]" = RADIO_CHANNEL_UPLINK, "[FREQ_SUPPLY]" = RADIO_CHANNEL_SUPPLY, diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm index 0412aab33e9..a7d7a86a78c 100644 --- a/code/game/data_huds.dm +++ b/code/game/data_huds.dm @@ -18,7 +18,7 @@ /datum/atom_hud/data /datum/atom_hud/data/human/medical - hud_icons = list(STATUS_HUD, HEALTH_HUD, DNR_HUD) // SKYRAT EDIT ADDITION - DNR_HUD + hud_icons = list(STATUS_HUD, HEALTH_HUD, DNR_HUD) // NOVA EDIT ADDITION - DNR_HUD /datum/atom_hud/data/human/medical/basic @@ -47,7 +47,7 @@ hud_icons = list(ID_HUD) /datum/atom_hud/data/human/security/advanced - hud_icons = list(ID_HUD, IMPSEC_FIRST_HUD, IMPLOYAL_HUD, IMPSEC_SECOND_HUD, WANTED_HUD, PERMIT_HUD, DNR_HUD) //SKYRAT EDIT ADDITION - PERMIT_HUD, DNR_HUD + hud_icons = list(ID_HUD, IMPSEC_FIRST_HUD, IMPLOYAL_HUD, IMPSEC_SECOND_HUD, WANTED_HUD, PERMIT_HUD, DNR_HUD) //NOVA EDIT ADDITION - PERMIT_HUD, DNR_HUD /datum/atom_hud/data/human/fan_hud hud_icons = list(FAN_HUD) @@ -279,14 +279,14 @@ Security HUDs! Basic mode shows only the job. sechud_icon_state = "hudno_id" holder.icon_state = sechud_icon_state sec_hud_set_security_status() - //SKYRAT EDIT START + //NOVA EDIT START var/image/permit_holder = hud_list[PERMIT_HUD] permit_holder.pixel_y = I.Height() - world.icon_size var/permit_icon_state = wear_id?.get_gun_permit_iconstate() if(!permit_icon_state) permit_icon_state = "hudfan_no" permit_holder.icon_state = permit_icon_state - //SKYRAT EDIT END + //NOVA EDIT END /mob/living/proc/sec_hud_set_implants() var/image/holder diff --git a/code/game/gamemodes/dynamic/dynamic.dm b/code/game/gamemodes/dynamic/dynamic.dm deleted file mode 100644 index 71d1ff1287e..00000000000 --- a/code/game/gamemodes/dynamic/dynamic.dm +++ /dev/null @@ -1,914 +0,0 @@ -#define FAKE_GREENSHIFT_FORM_CHANCE 15 -#define FAKE_REPORT_CHANCE 8 -#define PULSAR_REPORT_CHANCE 8 -#define REPORT_NEG_DIVERGENCE -15 -#define REPORT_POS_DIVERGENCE 15 - -// Are HIGH_IMPACT_RULESETs allowed to stack? -GLOBAL_VAR_INIT(dynamic_no_stacking, TRUE) -// If enabled does not accept or execute any rulesets. -GLOBAL_VAR_INIT(dynamic_forced_extended, FALSE) -// How high threat is required for HIGH_IMPACT_RULESETs stacking. -// This is independent of dynamic_no_stacking. -GLOBAL_VAR_INIT(dynamic_stacking_limit, 90) -// List of forced roundstart rulesets. -GLOBAL_LIST_EMPTY(dynamic_forced_roundstart_ruleset) -// Forced threat level, setting this to zero or higher forces the roundstart threat to the value. -GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) -/// Modify the threat level for station traits before dynamic can be Initialized. List(instance = threat_reduction) -GLOBAL_LIST_EMPTY(dynamic_station_traits) -/// Rulesets which have been forcibly enabled or disabled -GLOBAL_LIST_EMPTY(dynamic_forced_rulesets) - -/datum/game_mode/dynamic - // Threat logging vars - /// The "threat cap", threat shouldn't normally go above this and is used in ruleset calculations - var/threat_level = 0 - - /// Set at the beginning of the round. Spent by the mode to "purchase" rules. Everything else goes in the postround budget. - var/round_start_budget = 0 - - /// Set at the beginning of the round. Spent by midrounds and latejoins. - var/mid_round_budget = 0 - - /// The initial round start budget for logging purposes, set once at the beginning of the round. - var/initial_round_start_budget = 0 - - /// Running information about the threat. Can store text or datum entries. - var/list/threat_log = list() - /// Threat log shown on the roundend report. Should only list player-made edits. - var/list/roundend_threat_log = list() - /// List of latejoin rules used for selecting the rules. - var/list/latejoin_rules - /// List of midround rules used for selecting the rules. - var/list/midround_rules - /** # Pop range per requirement. - * If the value is five the range is: - * 0-4, 5-9, 10-14, 15-19, 20-24, 25-29, 30-34, 35-39, 40-54, 45+ - * If it is six the range is: - * 0-5, 6-11, 12-17, 18-23, 24-29, 30-35, 36-41, 42-47, 48-53, 54+ - * If it is seven the range is: - * 0-6, 7-13, 14-20, 21-27, 28-34, 35-41, 42-48, 49-55, 56-62, 63+ - */ - var/pop_per_requirement = 6 - /// Number of players who were ready on roundstart. - var/roundstart_pop_ready = 0 - /// List of candidates used on roundstart rulesets. - var/list/candidates = list() - /// Rules that are processed, rule_process is called on the rules in this list. - var/list/current_rules = list() - /// List of executed rulesets. - var/list/executed_rules = list() - /// If TRUE, the next player to latejoin will guarantee roll for a random latejoin antag - /// (this does not guarantee they get said antag roll, depending on preferences and circumstances) - var/forced_injection = FALSE - /// Forced ruleset to be executed for the next latejoin. - var/datum/dynamic_ruleset/latejoin/forced_latejoin_rule = null - /// How many percent of the rounds are more peaceful. - var/peaceful_percentage = 50 - /// If a high impact ruleset was executed. Only one will run at a time in most circumstances. - var/high_impact_ruleset_executed = FALSE - /// If a only ruleset has been executed. - var/only_ruleset_executed = FALSE - /// Dynamic configuration, loaded on pre_setup - var/list/configuration = null - - /// When world.time is over this number the mode tries to inject a latejoin ruleset. - var/latejoin_injection_cooldown = 0 - - /// The minimum time the recurring latejoin ruleset timer is allowed to be. - var/latejoin_delay_min = (5 MINUTES) - - /// The maximum time the recurring latejoin ruleset timer is allowed to be. - var/latejoin_delay_max = (25 MINUTES) - - /// The low bound for the midround roll time splits. - /// This number influences where to place midround rolls, making this smaller - /// will make midround rolls more frequent, and vice versa. - /// A midround will never be able to roll before this. - var/midround_lower_bound = 10 MINUTES - - /// The upper bound for the midround roll time splits. - /// This number influences where to place midround rolls, making this larger - /// will make midround rolls less frequent, and vice versa. - /// A midround will never be able to roll farther than this. - var/midround_upper_bound = 100 MINUTES - - /// The distance between the chosen midround roll point (which is deterministic), - /// and when it can actually roll. - /// Basically, if this is set to 5 minutes, and a midround roll point is decided to be at 20 minutes, - /// then it can roll anywhere between 15 and 25 minutes. - var/midround_roll_distance = 3 MINUTES - - /// The amount of threat per midround roll. - /// 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 = 7 - - /// A number between -5 and +5. - /// A negative value will give a more peaceful round and - /// a positive value will give a round with higher threat. - var/threat_curve_centre = 0 - - /// A number between 0.5 and 4. - /// Higher value will favour extreme rounds and - /// lower value rounds closer to the average. - var/threat_curve_width = 1.8 - - /// A number between -5 and +5. - /// Equivalent to threat_curve_centre, but for the budget split. - /// A negative value will weigh towards midround rulesets, and a positive - /// value will weight towards roundstart ones. - var/roundstart_split_curve_centre = 1 - - /// A number between 0.5 and 4. - /// Equivalent to threat_curve_width, but for the budget split. - /// Higher value will favour more variance in splits and - /// lower value rounds closer to the average. - var/roundstart_split_curve_width = 1.8 - - /// The minimum amount of time for antag random events to be hijacked. - var/random_event_hijack_minimum = 10 MINUTES - - /// The maximum amount of time for antag random events to be hijacked. - var/random_event_hijack_maximum = 18 MINUTES - - /// What is the lower bound of when the roundstart annoucement is sent out? - var/waittime_l = 600 - - /// What is the higher bound of when the roundstart annoucement is sent out? - var/waittime_h = 1800 - - /// A number between 0 and 100. The maximum amount of threat allowed to generate. - var/max_threat_level = 100 - - /// The extra chance multiplier that a heavy impact midround ruleset will run next time. - /// For example, if this is set to 50, then the next heavy roll will be about 50% more likely to happen. - var/hijacked_random_event_injection_chance_modifier = 50 - - /// Any midround before this point is guaranteed to be light - var/midround_light_upper_bound = 25 MINUTES - - /// Any midround after this point is guaranteed to be heavy - var/midround_heavy_lower_bound = 55 MINUTES - - /// If there are less than this many players readied, threat level will be lowered. - /// This number should be kept fairly low, as there are other measures that population - /// impacts Dynamic, such as the requirements variable on rulesets. - var/low_pop_player_threshold = 20 - - /// 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_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_maximum_threat = 40 - - /// The chance for latejoins to roll when ready - var/latejoin_roll_chance = 50 - - // == EVERYTHING BELOW THIS POINT SHOULD NOT BE CONFIGURED == - - /// A list of recorded "snapshots" of the round, stored in the dynamic.json log - var/list/datum/dynamic_snapshot/snapshots - - /// The time when the last midround injection was attempted, whether or not it was successful - var/last_midround_injection_attempt = 0 - - /// Whether or not a random event has been hijacked this midround cycle - var/random_event_hijacked = HIJACKED_NOTHING - - /// The timer ID for the cancellable midround rule injection - var/midround_injection_timer_id - - /// The last drafted midround rulesets (without the current one included). - /// Used for choosing different midround injections. - var/list/current_midround_rulesets - - /// The amount of threat shown on the piece of paper. - /// Can differ from the actual threat amount. - var/shown_threat - - VAR_PRIVATE/next_midround_injection - -/datum/game_mode/dynamic/admin_panel() - var/list/dat = list("Game Mode Panel

Game Mode Panel

") - dat += "Dynamic Mode \[VV\]\[Refresh\]
" - dat += "Threat Level: [threat_level]
" - dat += "Budgets (Roundstart/Midrounds): [initial_round_start_budget]/[threat_level - initial_round_start_budget]
" - - dat += "Midround budget to spend: [mid_round_budget]\[Adjust\]\[View Log\]
" - dat += "
" - dat += "Parameters: centre = [threat_curve_centre] ; width = [threat_curve_width].
" - dat += "Split parameters: centre = [roundstart_split_curve_centre] ; width = [roundstart_split_curve_width].
" - dat += "On average, [clamp(peaceful_percentage, 1, 99)]% of the rounds are more peaceful.
" - dat += "Forced extended: [GLOB.dynamic_forced_extended ? "On" : "Off"]
" - dat += "No stacking (only one round-ender): [GLOB.dynamic_no_stacking ? "On" : "Off"]
" - dat += "Stacking limit: [GLOB.dynamic_stacking_limit] \[Adjust\]" - dat += "
" - dat += "\[Force Next Latejoin Ruleset\]
" - if (forced_latejoin_rule) - dat += {"-> [forced_latejoin_rule.name] <-
"} - dat += "\[Execute Midround Ruleset\]
" - dat += "
" - dat += "Executed rulesets: " - if (executed_rules.len > 0) - dat += "
" - for (var/datum/dynamic_ruleset/DR in executed_rules) - dat += "[DR.ruletype] - [DR.name]
" - else - dat += "none.
" - dat += "
Injection Timers: ([get_heavy_midround_injection_chance(dry_run = TRUE)]% heavy midround chance)
" - dat += "Latejoin: [DisplayTimeText(latejoin_injection_cooldown-world.time)] \[Now!\]
" - - var/next_injection = next_midround_injection() - if (next_injection == INFINITY) - dat += "All midrounds have been exhausted." - else - dat += "Midround: [DisplayTimeText(next_injection - world.time)] \[Now!\]
" - - usr << browse(dat.Join(), "window=gamemode_panel;size=500x500") - -/datum/game_mode/dynamic/Topic(href, href_list) - if (..()) // Sanity, maybe ? - return - if(!check_rights(R_ADMIN)) - message_admins("[usr.key] has attempted to override the game mode panel!") - log_admin("[key_name(usr)] tried to use the game mode panel without authorization.") - return - if (href_list["forced_extended"]) - GLOB.dynamic_forced_extended = !GLOB.dynamic_forced_extended - else if (href_list["no_stacking"]) - GLOB.dynamic_no_stacking = !GLOB.dynamic_no_stacking - else if (href_list["adjustthreat"]) - var/threatadd = input("Specify how much threat to add (negative to subtract). This can inflate the threat level.", "Adjust Threat", 0) as null|num - if(!threatadd) - return - if(threatadd > 0) - create_threat(threatadd, threat_log, "[worldtime2text()]: increased by [key_name(usr)]") - else - spend_midround_budget(-threatadd, threat_log, "[worldtime2text()]: decreased by [key_name(usr)]") - else if (href_list["injectlate"]) - latejoin_injection_cooldown = 0 - forced_injection = TRUE - message_admins("[key_name(usr)] forced a latejoin injection.") - else if (href_list["injectmid"]) - forced_injection = TRUE - message_admins("[key_name(usr)] forced a midround injection.") - try_midround_roll() - else if (href_list["threatlog"]) - show_threatlog(usr) - else if (href_list["stacking_limit"]) - GLOB.dynamic_stacking_limit = input(usr,"Change the threat limit at which round-endings rulesets will start to stack.", "Change stacking limit", null) as num - else if(href_list["force_latejoin_rule"]) - var/added_rule = input(usr,"What ruleset do you want to force upon the next latejoiner? This will bypass threat level and population restrictions.", "Rigging Latejoin", null) as null|anything in sort_names(init_rulesets(/datum/dynamic_ruleset/latejoin)) - if (!added_rule) - return - forced_latejoin_rule = added_rule - log_admin("[key_name(usr)] set [added_rule] to proc on the next latejoin.") - message_admins("[key_name(usr)] set [added_rule] to proc on the next valid latejoin.") - else if(href_list["clear_forced_latejoin"]) - forced_latejoin_rule = null - log_admin("[key_name(usr)] cleared the forced latejoin ruleset.") - message_admins("[key_name(usr)] cleared the forced latejoin ruleset.") - else if(href_list["force_midround_rule"]) - var/added_rule = input(usr,"What ruleset do you want to force right now? This will bypass threat level and population restrictions.", "Execute Ruleset", null) as null|anything in sort_names(init_rulesets(/datum/dynamic_ruleset/midround)) - if (!added_rule) - return - log_admin("[key_name(usr)] executed the [added_rule] ruleset.") - message_admins("[key_name(usr)] executed the [added_rule] ruleset.") - picking_specific_rule(added_rule, TRUE) - else if(href_list["cancelmidround"]) - admin_cancel_midround(usr, href_list["cancelmidround"]) - return - else if (href_list["differentmidround"]) - admin_different_midround(usr, href_list["differentmidround"]) - return - - admin_panel() // Refreshes the window - -// Checks if there are HIGH_IMPACT_RULESETs and calls the rule's round_result() proc -/datum/game_mode/dynamic/set_round_result() - // If it got to this part, just pick one high impact ruleset if it exists - for(var/datum/dynamic_ruleset/rule in executed_rules) - if(rule.flags & HIGH_IMPACT_RULESET) - rule.round_result() - // One was set, so we're done here - if(SSticker.news_report) - return - - return ..() - -/datum/game_mode/dynamic/proc/send_intercept() - if(SScommunications.block_command_report) //If we don't want the report to be printed just yet, we put it off until it's ready - addtimer(CALLBACK(src, PROC_REF(send_intercept)), 10 SECONDS) - return - - . = "Nanotrasen Department of Intelligence Threat Advisory, Spinward Sector, TCD [time2text(world.realtime, "DDD, MMM DD")], [CURRENT_STATION_YEAR]:
" - . += generate_advisory_level() - - var/min_threat = 100 - for(var/datum/dynamic_ruleset/ruleset as anything in init_rulesets(/datum/dynamic_ruleset)) - if(ruleset.weight <= 0 || ruleset.cost <= 0) - continue - min_threat = min(ruleset.cost, min_threat) - var/greenshift = GLOB.dynamic_forced_extended || (threat_level < min_threat && shown_threat < min_threat) //if both shown and real threat are below any ruleset, its extended time - - generate_station_goals(greenshift) - . += generate_station_goal_report() - . += generate_station_trait_report() - if(length(SScommunications.command_report_footnotes)) - . += generate_report_footnote() - - print_command_report(., "[command_name()] Status Summary", announce=FALSE) - if(greenshift) - priority_announce("Thanks to the tireless efforts of our security and intelligence divisions, there are currently no credible threats to [station_name()]. All station construction projects have been authorized. Have a secure shift!", "Security Report", SSstation.announcer.get_rand_report_sound(), color_override = "green") - else - if(SSsecurity_level.get_current_level_as_number() < SEC_LEVEL_BLUE) - SSsecurity_level.set_level(SEC_LEVEL_BLUE, announce = FALSE) - priority_announce("[SSsecurity_level.current_security_level.elevating_to_announcement]\n\nA summary has been copied and printed to all communications consoles.", "Security level elevated.", ANNOUNCER_INTERCEPT, color_override = SSsecurity_level.current_security_level.announcement_color) - -/// Generate the advisory level depending on the shown threat level. -/datum/game_mode/dynamic/proc/generate_advisory_level() - var/advisory_string = "" - if (prob(PULSAR_REPORT_CHANCE)) - if(HAS_TRAIT(SSstation, STATION_TRAIT_BANANIUM_SHIPMENTS)) - advisory_string += "Advisory Level: Clown Planet
" - advisory_string += "Your sector's advisory level is Clown Planet! Our bike horns have picked up on a large bananium stash. Clowns show a large influx of clowns on your station. We highly advice you to slip any threats to keep Honkotrasen assets within the Banana Sector. The Department advises defending chemistry from any clowns that are trying to make baldium or space lube." - return advisory_string - - advisory_string += "Advisory Level: Pulsar Star
" - advisory_string += "Your sector's advisory level is Pulsar Star. A large unknown electromagnetic field has stormed through nearby surveillance equipment. No surveillance data has been able to be obtained showing no credible threats to Nanotrasen assets within the Spinward Sector. The Department advises maintaining high alert against potential threats, regardless of a lack of information." - return advisory_string - - switch(round(shown_threat)) - if(0) - advisory_string += "Advisory Level: White Dwarf
" - advisory_string += "Your sector's advisory level is White Dwarf. Our surveillors have ruled out any and all potential risks known in our database, ruling out the loss of our assets in the Spinward Sector. We advise a lower level of security, alongside distributing ressources on potential profit." - if(1 to 19) - var/show_core_territory = (GLOB.current_living_antags.len > 0) - if (prob(FAKE_GREENSHIFT_FORM_CHANCE)) - show_core_territory = !show_core_territory - - if (show_core_territory) - advisory_string += "Advisory Level: Blue Star
" - advisory_string += "Your sector's advisory level is Blue Star. At this threat advisory, the risk of attacks on Nanotrasen assets within the sector is minor, but cannot be ruled out entirely. Remain vigilant." - else - advisory_string += "Advisory Level: Green Star
" - advisory_string += "Your sector's advisory level is Green Star. Surveillance information shows no credible threats to Nanotrasen assets within the Spinward Sector at this time. As always, the Department advises maintaining vigilance against potential threats, regardless of a lack of known threats." - if(20 to 39) - advisory_string += "Advisory Level: Yellow Star
" - advisory_string += "Your sector's advisory level is Yellow Star. Surveillance shows a credible risk of enemy attack against our assets in the Spinward Sector. We advise a heightened level of security, alongside maintaining vigilance against potential threats." - if(40 to 65) - advisory_string += "Advisory Level: Orange Star
" - advisory_string += "Your sector's advisory level is Orange Star. Upon reviewing your sector's intelligence, the Department has determined that the risk of enemy activity is moderate to severe. At this advisory, we recommend maintaining a higher degree of security and alertness, and vigilance against threats that may (or will) arise." - if(66 to 79) - advisory_string += "Advisory Level: Red Star
" - advisory_string += "Your sector's advisory level is Red Star. The Department of Intelligence has decrypted Cybersun communications suggesting a high likelihood of attacks on Nanotrasen assets within the Spinward Sector. Stations in the region are advised to remain highly vigilant for signs of enemy activity and to be on high alert." - if(80 to 99) - advisory_string += "Advisory Level: Black Orbit
" - advisory_string += "Your sector's advisory level is Black Orbit. Your sector's local comms network is currently undergoing a blackout, and we are therefore unable to accurately judge enemy movements within the region. However, information passed to us by GDI suggests a high amount of enemy activity in the sector, indicative of an impending attack. Remain on high alert, and as always, we advise remaining vigilant against any other potential threats." - if(100) - advisory_string += "Advisory Level: Midnight Sun
" - advisory_string += "Your sector's advisory level is Midnight Sun. Credible information passed to us by GDI suggests that the Syndicate is preparing to mount a major concerted offensive on Nanotrasen assets in the Spinward Sector to cripple our foothold there. All stations should remain on high alert and prepared to defend themselves." - - return advisory_string - -/datum/game_mode/dynamic/proc/show_threatlog(mob/admin) - if(!SSticker.HasRoundStarted()) - tgui_alert(usr, "The round hasn't started yet!") - return - - if(!check_rights(R_ADMIN)) - return - - var/list/out = list("Threat LogThreat Log
Starting Threat: [threat_level]
") - - for(var/entry in threat_log) - if(istext(entry)) - out += "[entry]
" - - out += "Remaining threat/threat_level: [mid_round_budget]/[threat_level]" - - usr << browse(out.Join(), "window=threatlog;size=700x500") - -/// Generates the threat level using lorentz distribution and assigns peaceful_percentage. -/datum/game_mode/dynamic/proc/generate_threat() - // At lower pop levels we run a Liner Interpolation against the max threat based proportionally on the number - // of players ready. This creates a balanced lorentz curve within a smaller range than 0 to max_threat_level. - var/calculated_max_threat = (SSticker.totalPlayersReady < low_pop_player_threshold) ? LERP(low_pop_maximum_threat, max_threat_level, SSticker.totalPlayersReady / low_pop_player_threshold) : max_threat_level - log_dynamic("Calculated maximum threat level based on player count of [SSticker.totalPlayersReady]: [calculated_max_threat]") - - threat_level = lorentz_to_amount(threat_curve_centre, threat_curve_width, calculated_max_threat) - - for(var/datum/station_trait/station_trait in GLOB.dynamic_station_traits) - threat_level = max(threat_level - GLOB.dynamic_station_traits[station_trait], 0) - log_dynamic("Threat reduced by [GLOB.dynamic_station_traits[station_trait]]. Source: [type].") - - peaceful_percentage = (threat_level/max_threat_level)*100 - -/// Generates the midround and roundstart budgets -/datum/game_mode/dynamic/proc/generate_budgets() - round_start_budget = lorentz_to_amount(roundstart_split_curve_centre, roundstart_split_curve_width, threat_level, 0.1) - initial_round_start_budget = round_start_budget - mid_round_budget = threat_level - round_start_budget - -/datum/game_mode/dynamic/proc/setup_parameters() - log_dynamic("Dynamic mode parameters for the round:") - log_dynamic("Centre is [threat_curve_centre], Width is [threat_curve_width], Forced extended is [GLOB.dynamic_forced_extended ? "Enabled" : "Disabled"], No stacking is [GLOB.dynamic_no_stacking ? "Enabled" : "Disabled"].") - log_dynamic("Stacking limit is [GLOB.dynamic_stacking_limit].") - if(GLOB.dynamic_forced_threat_level >= 0) - threat_level = round(GLOB.dynamic_forced_threat_level, 0.1) - else - generate_threat() - generate_budgets() - set_cooldowns() - log_dynamic("Dynamic Mode initialized with a Threat Level of... [threat_level]! ([round_start_budget] round start budget)") - SSblackbox.record_feedback( - "associative", - "dynamic_threat", - 1, - list( - "server_name" = CONFIG_GET(string/serversqlname), - "forced_threat_level" = GLOB.dynamic_forced_threat_level, - "threat_level" = threat_level, - "max_threat" = (SSticker.totalPlayersReady < low_pop_player_threshold) ? LERP(low_pop_maximum_threat, max_threat_level, SSticker.totalPlayersReady / low_pop_player_threshold) : max_threat_level, - "player_count" = SSticker.totalPlayersReady, - "round_start_budget" = round_start_budget, - "parameters" = list( - "threat_curve_centre" = threat_curve_centre, - "threat_curve_width" = threat_curve_width, - "forced_extended" = GLOB.dynamic_forced_extended, - "no_stacking" = GLOB.dynamic_no_stacking, - "stacking_limit" = GLOB.dynamic_stacking_limit, - ), - ), - ) - return TRUE - -/datum/game_mode/dynamic/proc/setup_shown_threat() - if (prob(FAKE_REPORT_CHANCE)) - shown_threat = rand(1, 100) - else - shown_threat = clamp(threat_level + rand(REPORT_NEG_DIVERGENCE, REPORT_POS_DIVERGENCE), 0, 100) - -/datum/game_mode/dynamic/proc/set_cooldowns() - var/latejoin_injection_cooldown_middle = 0.5*(latejoin_delay_max + latejoin_delay_min) - latejoin_injection_cooldown = round(clamp(EXP_DISTRIBUTION(latejoin_injection_cooldown_middle), latejoin_delay_min, latejoin_delay_max)) + world.time - -/datum/game_mode/dynamic/pre_setup() - if(CONFIG_GET(flag/dynamic_config_enabled)) - var/json_file = file("[global.config.directory]/dynamic.json") - if(fexists(json_file)) - configuration = json_decode(file2text(json_file)) - if(configuration["Dynamic"]) - for(var/variable in configuration["Dynamic"]) - if(!(variable in vars)) - stack_trace("Invalid dynamic configuration variable [variable] in game mode variable changes.") - continue - vars[variable] = configuration["Dynamic"][variable] - - configure_station_trait_costs() - setup_parameters() - setup_hijacking() - setup_shown_threat() - setup_rulesets() - - //We do this here instead of with the midround rulesets and such because these rules can hang refs - //To new_player and such, and we want the datums to just free when the roundstart work is done - var/list/roundstart_rules = init_rulesets(/datum/dynamic_ruleset/roundstart) - - SSjob.DivideOccupations(pure = TRUE, allow_all = TRUE) - for(var/i in GLOB.new_player_list) - var/mob/dead/new_player/player = i - if(player.ready == PLAYER_READY_TO_PLAY && player.mind && player.check_preferences()) - if(is_unassigned_job(player.mind.assigned_role)) - var/list/job_data = list() - var/job_prefs = player.client.prefs.job_preferences - for(var/job in job_prefs) - var/priority = job_prefs[job] - job_data += "[job]: [SSjob.job_priority_level_to_string(priority)]" - to_chat(player, span_danger("You were unable to qualify for any roundstart antagonist role this round because your job preferences presented a high chance of all of your selected jobs being unavailable, along with 'return to lobby if job is unavailable' enabled. Increase the number of roles set to medium or low priority to reduce the chances of this happening.")) - log_admin("[player.ckey] failed to qualify for any roundstart antagonist role because their job preferences presented a high chance of all of their selected jobs being unavailable, along with 'return to lobby if job is unavailable' enabled and has [player.client.prefs.be_special.len] antag preferences enabled. They will be unable to qualify for any roundstart antagonist role. These are their job preferences - [job_data.Join(" | ")]") - else - roundstart_pop_ready++ - candidates.Add(player) - SSjob.ResetOccupations() - log_dynamic("Listing [roundstart_rules.len] round start rulesets, and [candidates.len] players ready.") - if (candidates.len <= 0) - log_dynamic("[candidates.len] candidates.") - return TRUE - - if(GLOB.dynamic_forced_roundstart_ruleset.len > 0) - rigged_roundstart() - else - roundstart(roundstart_rules) - - log_dynamic("[round_start_budget] round start budget was left, donating it to midrounds.") - threat_log += "[worldtime2text()]: [round_start_budget] round start budget was left, donating it to midrounds." - mid_round_budget += round_start_budget - - var/starting_rulesets = "" - for (var/datum/dynamic_ruleset/roundstart/DR in executed_rules) - starting_rulesets += "[DR.name], " - log_dynamic("Picked the following roundstart rules: [starting_rulesets]") - candidates.Cut() - return TRUE - -/datum/game_mode/dynamic/post_setup(report) - for(var/datum/dynamic_ruleset/roundstart/rule in executed_rules) - rule.candidates.Cut() // The rule should not use candidates at this point as they all are null. - addtimer(CALLBACK(src, TYPE_PROC_REF(/datum/game_mode/dynamic/, execute_roundstart_rule), rule), rule.delay) - - if (!CONFIG_GET(flag/no_intercept_report)) - addtimer(CALLBACK(src, PROC_REF(send_intercept)), rand(waittime_l, waittime_h)) - - //SKYRAT EDIT START - DIVERGENCY/GOALS REPORT - else - addtimer(CALLBACK(src, PROC_REF(send_trait_report)), rand(waittime_l, waittime_h)) - //SKYRAT EDIT END - - ..() - -/// Initializes the internal ruleset variables -/datum/game_mode/dynamic/proc/setup_rulesets() - midround_rules = init_rulesets(/datum/dynamic_ruleset/midround) - latejoin_rules = init_rulesets(/datum/dynamic_ruleset/latejoin) - -/// Returns a list of the provided rulesets. -/// Configures their variables to match config. -/datum/game_mode/dynamic/proc/init_rulesets(ruleset_subtype) - var/list/rulesets = list() - - for (var/datum/dynamic_ruleset/ruleset_type as anything in subtypesof(ruleset_subtype)) - if (initial(ruleset_type.name) == "") - continue - - if (initial(ruleset_type.weight) == 0) - continue - - var/ruleset = new ruleset_type - configure_ruleset(ruleset) - rulesets += ruleset - - return rulesets - -/// A simple roundstart proc used when dynamic_forced_roundstart_ruleset has rules in it. -/datum/game_mode/dynamic/proc/rigged_roundstart() - message_admins("[GLOB.dynamic_forced_roundstart_ruleset.len] rulesets being forced. Will now attempt to draft players for them.") - log_dynamic("[GLOB.dynamic_forced_roundstart_ruleset.len] rulesets being forced. Will now attempt to draft players for them.") - for (var/datum/dynamic_ruleset/roundstart/rule in GLOB.dynamic_forced_roundstart_ruleset) - configure_ruleset(rule) - message_admins("Drafting players for forced ruleset [rule.name].") - log_dynamic("Drafting players for forced ruleset [rule.name].") - rule.mode = src - rule.acceptable(roundstart_pop_ready, threat_level) // Assigns some vars in the modes, running it here for consistency - rule.candidates = candidates.Copy() - rule.trim_candidates() - rule.load_templates() - if (rule.ready(roundstart_pop_ready, TRUE)) - var/cost = rule.cost - var/scaled_times = 0 - if (rule.scaling_cost) - scaled_times = round(max(round_start_budget - cost, 0) / rule.scaling_cost) - cost += rule.scaling_cost * scaled_times - - spend_roundstart_budget(picking_roundstart_rule(rule, scaled_times, forced = TRUE)) - -/datum/game_mode/dynamic/proc/roundstart(list/roundstart_rules) - if (GLOB.dynamic_forced_extended) - log_dynamic("Starting a round of forced extended.") - return TRUE - var/list/drafted_rules = list() - for (var/datum/dynamic_ruleset/roundstart/rule in roundstart_rules) - if (!rule.weight) - continue - if (rule.acceptable(roundstart_pop_ready, threat_level) && round_start_budget >= rule.cost) // If we got the population and threat required - rule.candidates = candidates.Copy() - rule.trim_candidates() - rule.load_templates() - if (rule.ready(roundstart_pop_ready) && rule.candidates.len > 0) - drafted_rules[rule] = rule.weight - - var/list/rulesets_picked = list() - - // Kept in case a ruleset can't be initialized for whatever reason, we want to be able to only spend what we can use. - var/round_start_budget_left = round_start_budget - - while (round_start_budget_left > 0) - var/datum/dynamic_ruleset/roundstart/ruleset = pick_weight(drafted_rules) - if (isnull(ruleset)) - log_dynamic("No more rules can be applied, stopping with [round_start_budget] left.") - break - - var/cost = (ruleset in rulesets_picked) ? ruleset.scaling_cost : ruleset.cost - if (cost == 0) - stack_trace("[ruleset] cost 0, this is going to result in an infinite loop.") - drafted_rules[ruleset] = null - continue - - if (cost > round_start_budget_left) - drafted_rules[ruleset] = null - continue - - if (check_blocking(ruleset.blocking_rules, rulesets_picked)) - drafted_rules[ruleset] = null - continue - - round_start_budget_left -= cost - - rulesets_picked[ruleset] += 1 - - if (ruleset.flags & HIGH_IMPACT_RULESET) - for (var/_other_ruleset in drafted_rules) - var/datum/dynamic_ruleset/other_ruleset = _other_ruleset - if (other_ruleset.flags & HIGH_IMPACT_RULESET) - drafted_rules[other_ruleset] = null - - if (ruleset.flags & LONE_RULESET) - drafted_rules[ruleset] = null - - for (var/ruleset in rulesets_picked) - spend_roundstart_budget(picking_roundstart_rule(ruleset, rulesets_picked[ruleset] - 1)) - - update_log() - -/// Initializes the round start ruleset provided to it. Returns how much threat to spend. -/datum/game_mode/dynamic/proc/picking_roundstart_rule(datum/dynamic_ruleset/roundstart/ruleset, scaled_times = 0, forced = FALSE) - log_dynamic("Picked a ruleset: [ruleset.name], scaled [scaled_times] times") - - ruleset.trim_candidates() - var/added_threat = ruleset.scale_up(roundstart_pop_ready, scaled_times) - - if(ruleset.pre_execute(roundstart_pop_ready)) - threat_log += "[worldtime2text()]: Roundstart [ruleset.name] spent [ruleset.cost + added_threat]. [ruleset.scaling_cost ? "Scaled up [ruleset.scaled_times]/[scaled_times] times." : ""]" - if(ruleset.flags & ONLY_RULESET) - only_ruleset_executed = TRUE - if(ruleset.flags & HIGH_IMPACT_RULESET) - high_impact_ruleset_executed = TRUE - executed_rules += ruleset - return ruleset.cost + added_threat - else - stack_trace("The starting rule \"[ruleset.name]\" failed to pre_execute.") - return 0 - -/// Mainly here to facilitate delayed rulesets. All roundstart rulesets are executed with a timered callback to this proc. -/datum/game_mode/dynamic/proc/execute_roundstart_rule(sent_rule) - var/datum/dynamic_ruleset/rule = sent_rule - if(rule.execute()) - if(rule.persistent) - current_rules += rule - new_snapshot(rule) - rule.forget_startup() - return TRUE - rule.clean_up() // Refund threat, delete teams and so on. - rule.forget_startup() - executed_rules -= rule - stack_trace("The starting rule \"[rule.name]\" failed to execute.") - return FALSE - -/// 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, 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. - configure_ruleset(new_rule) // This makes sure the rule is set up properly. - else if(istype(ruletype, /datum/dynamic_ruleset)) - new_rule = ruletype - else - return FALSE - - if(!new_rule) - return FALSE - - if(!forced) - if(only_ruleset_executed) - return FALSE - // Check if a blocking ruleset has been executed. - else if(check_blocking(new_rule.blocking_rules, executed_rules)) - return FALSE - // Check if the ruleset is high impact and if a high impact ruleset has been executed - else if(new_rule.flags & HIGH_IMPACT_RULESET) - if(threat_level < GLOB.dynamic_stacking_limit && GLOB.dynamic_no_stacking) - if(high_impact_ruleset_executed) - return FALSE - - var/population = GLOB.alive_player_list.len - if((new_rule.acceptable(population, threat_level) && (ignore_cost || new_rule.cost <= mid_round_budget)) || forced) - new_rule.trim_candidates() - new_rule.load_templates() - if (new_rule.ready(forced)) - 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) - high_impact_ruleset_executed = TRUE - else if(new_rule.flags & ONLY_RULESET) - only_ruleset_executed = TRUE - log_dynamic("Making a call to a specific ruleset...[new_rule.name]!") - executed_rules += new_rule - if (new_rule.persistent) - current_rules += new_rule - new_rule.forget_startup() - return TRUE - else if (forced) - log_dynamic("The ruleset [new_rule.name] couldn't be executed due to lack of elligible players.") - new_rule.forget_startup() - return FALSE - -/datum/game_mode/dynamic/process() - for (var/datum/dynamic_ruleset/rule in current_rules) - if(rule.rule_process() == RULESET_STOP_PROCESSING) // If rule_process() returns 1 (RULESET_STOP_PROCESSING), stop processing. - current_rules -= rule - - try_midround_roll() - -/// Removes type from the list -/datum/game_mode/dynamic/proc/remove_from_list(list/type_list, type) - for(var/I in type_list) - if(istype(I, type)) - type_list -= I - return type_list - -/// Checks if a type in blocking_list is in rule_list. -/datum/game_mode/dynamic/proc/check_blocking(list/blocking_list, list/rule_list) - if(blocking_list.len > 0) - for(var/blocking in blocking_list) - for(var/_executed in rule_list) - var/datum/executed = _executed - if(blocking == executed.type) - log_dynamic("FAIL: check_blocking - [blocking] conflicts with [executed.type]") - return TRUE - return FALSE - -/datum/game_mode/dynamic/make_antag_chance(mob/living/carbon/human/newPlayer) - if (GLOB.dynamic_forced_extended) - return - if(EMERGENCY_ESCAPED_OR_ENDGAMED) // No more rules after the shuttle has left - return - - if (forced_latejoin_rule) - log_dynamic("Forcing specific [forced_latejoin_rule.ruletype] ruleset [forced_latejoin_rule].") - if(!handle_executing_latejoin(forced_latejoin_rule, newPlayer, forced = TRUE)) - message_admins("The forced latejoin ruleset [forced_latejoin_rule.name] couldn't be executed \ - as the most recent latejoin did not fulfill the ruleset's requirements.") - forced_latejoin_rule = null - return - - if(!forced_injection) - if(latejoin_injection_cooldown >= world.time) - return - if(!prob(latejoin_roll_chance)) - return - - var/was_forced = forced_injection - forced_injection = FALSE - var/list/possible_latejoin_rules = list() - for (var/datum/dynamic_ruleset/latejoin/rule in latejoin_rules) - if(!rule.weight) - continue - if(mid_round_budget < rule.cost) - continue - if(!rule.acceptable(GLOB.alive_player_list.len, threat_level)) - continue - possible_latejoin_rules[rule] = rule.get_weight() - - if(!length(possible_latejoin_rules)) - log_dynamic("FAIL: [newPlayer] was selected to roll for a latejoin ruleset, but there were no valid rulesets.") - return - - log_dynamic("[newPlayer] was selected to roll for a latejoin ruleset from the following list: [english_list(possible_latejoin_rules)].") - // You get one shot at becoming a latejoin antag, if it fails the next guy will try. - var/datum/dynamic_ruleset/latejoin/picked_rule = pick_ruleset(possible_latejoin_rules, max_allowed_attempts = 1) - if(isnull(picked_rule)) - log_dynamic("FAIL: No valid rulset was selected for [newPlayer]'s latejoin[was_forced ? "" : ", the next player will be checked instead"].") - return - if(was_forced) - log_dynamic("Forcing random [picked_rule.ruletype] ruleset [picked_rule].") - handle_executing_latejoin(picked_rule, newPlayer, forced = was_forced) - -/** - * This proc handles the execution of a latejoin ruleset, including removing it from latejoin rulesets if not repeatable, - * upping the injection cooldown, and starting a timer to execute the ruleset on delay. - */ -/datum/game_mode/dynamic/proc/handle_executing_latejoin(datum/dynamic_ruleset/ruleset, mob/living/carbon/human/only_candidate, forced = FALSE) - ruleset.candidates = list(only_candidate) - ruleset.trim_candidates() - ruleset.load_templates() - if (!ruleset.ready(forced)) - log_dynamic("FAIL: [only_candidate] was selected to latejoin with the [ruleset] ruleset, \ - but the ruleset failed to execute[length(ruleset.candidates) ? "":" as they were not a valid candiate"].") - return FALSE - if (!ruleset.repeatable) - latejoin_rules = remove_from_list(latejoin_rules, ruleset.type) - addtimer(CALLBACK(src, PROC_REF(execute_midround_latejoin_rule), ruleset), ruleset.delay) - - if(!forced) - var/latejoin_injection_cooldown_middle = 0.5 * (latejoin_delay_max + latejoin_delay_min) - latejoin_injection_cooldown = round(clamp(EXP_DISTRIBUTION(latejoin_injection_cooldown_middle), latejoin_delay_min, latejoin_delay_max)) + world.time - log_dynamic("A latejoin rulset triggered successfully, the next latejoin injection will happen at [latejoin_injection_cooldown] round time.") - - return TRUE - -/// Apply configurations to rule. -/datum/game_mode/dynamic/proc/configure_ruleset(datum/dynamic_ruleset/ruleset) - var/rule_conf = LAZYACCESSASSOC(configuration, ruleset.ruletype, ruleset.name) - for(var/variable in rule_conf) - if(!(variable in ruleset.vars)) - stack_trace("Invalid dynamic configuration variable [variable] in [ruleset.ruletype] [ruleset.name].") - continue - ruleset.vars[variable] = rule_conf[variable] - if(CONFIG_GET(flag/protect_roles_from_antagonist)) - ruleset.restricted_roles |= ruleset.protected_roles - if(CONFIG_GET(flag/protect_assistant_from_antagonist)) - ruleset.restricted_roles |= JOB_ASSISTANT - // SKYRAT EDIT ADDITION - for(var/datum/job/iterating_job as anything in subtypesof(/datum/job)) - if(!initial(iterating_job.antagonist_restricted)) - continue - if(initial(iterating_job.restricted_antagonists)) - var/list/restricted_antagonists = initial(iterating_job.restricted_antagonists) - if(!(ruleset.antag_flag in restricted_antagonists)) - continue - ruleset.restricted_roles |= initial(iterating_job.title) - else - ruleset.restricted_roles |= initial(iterating_job.title) - // SKYRAT EDIT END - -/// Get station traits and call for their config -/datum/game_mode/dynamic/proc/configure_station_trait_costs() - if(!CONFIG_GET(flag/dynamic_config_enabled)) - return - for(var/datum/station_trait/station_trait as anything in GLOB.dynamic_station_traits) - configure_station_trait(station_trait) - -/// Apply configuration for station trait costs -/datum/game_mode/dynamic/proc/configure_station_trait(datum/station_trait/station_trait) - var/list/station_trait_config = LAZYACCESSASSOC(configuration, "Station", station_trait.dynamic_threat_id) - var/cost = station_trait_config["cost"] - - if(isnull(cost)) //0 is valid so check for null specifically - return - - if(cost != GLOB.dynamic_station_traits[station_trait]) - log_dynamic("Config set [station_trait.dynamic_threat_id] cost from [station_trait.threat_reduction] to [cost]") - - GLOB.dynamic_station_traits[station_trait] = cost - -/// Refund threat, but no more than threat_level. -/datum/game_mode/dynamic/proc/refund_threat(regain) - mid_round_budget = min(threat_level, mid_round_budget + regain) - -/// Generate threat and increase the threat_level if it goes beyond, capped at 100 -/datum/game_mode/dynamic/proc/create_threat(gain, list/threat_log, reason) - mid_round_budget = min(100, mid_round_budget + gain) - if(mid_round_budget > threat_level) - threat_level = mid_round_budget - for(var/list/logs in threat_log) - log_threat(gain, logs, reason) - -/datum/game_mode/dynamic/proc/log_threat(threat_change, list/threat_log, reason) - var/gain_or_loss = "+" - if(threat_change < 0) - gain_or_loss = "-" - threat_log += "Threat [gain_or_loss][abs(threat_change)] - [reason]." - -/// Expend round start threat, can't fall under 0. -/datum/game_mode/dynamic/proc/spend_roundstart_budget(cost, list/threat_log, reason) - round_start_budget = max(round_start_budget - cost,0) - if (!isnull(threat_log)) - log_threat(-cost, threat_log, reason) - -/// Expend midround threat, can't fall under 0. -/datum/game_mode/dynamic/proc/spend_midround_budget(cost, list/threat_log, reason) - mid_round_budget = max(mid_round_budget - cost,0) - if (!isnull(threat_log)) - log_threat(-cost, threat_log, reason) - -#define MAXIMUM_DYN_DISTANCE 5 - -/** - * Returns the comulative distribution of threat centre and width, and a random location of -0.5 to 0.5 - * plus or minus the otherwise unattainable lower and upper percentiles. All multiplied by the maximum - * threat and then rounded to the nearest interval. - * rand() calls without arguments returns a value between 0 and 1, allowing for smaller intervals. - */ -/datum/game_mode/dynamic/proc/lorentz_to_amount(centre = 0, scale = 1.8, max_threat = 100, interval = 1) - var/location = RANDOM_DECIMAL(-MAXIMUM_DYN_DISTANCE, MAXIMUM_DYN_DISTANCE) * rand() - var/lorentz_result = LORENTZ_CUMULATIVE_DISTRIBUTION(centre, location, scale) - var/std_threat = lorentz_result * max_threat - ///Without these, the amount won't come close to hitting 0% or 100% of the max threat. - var/lower_deviation = max(std_threat * (location-centre)/MAXIMUM_DYN_DISTANCE, 0) - var/upper_deviation = max((max_threat - std_threat) * (centre-location)/MAXIMUM_DYN_DISTANCE, 0) - return clamp(round(std_threat + upper_deviation - lower_deviation, interval), 0, 100) - -#undef MAXIMUM_DYN_DISTANCE - -#undef FAKE_REPORT_CHANCE -#undef FAKE_GREENSHIFT_FORM_CHANCE -#undef PULSAR_REPORT_CHANCE -#undef REPORT_NEG_DIVERGENCE -#undef REPORT_POS_DIVERGENCE diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm deleted file mode 100644 index ee02bd8d80c..00000000000 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm +++ /dev/null @@ -1,947 +0,0 @@ -/// Probability the AI going malf will be accompanied by an ion storm announcement and some ion laws. -#define MALF_ION_PROB 33 -/// The probability to replace an existing law with an ion law instead of adding a new ion law. -#define REPLACE_LAW_WITH_ION_PROB 10 - -/// Midround Rulesets -/datum/dynamic_ruleset/midround // Can be drafted once in a while during a round - ruletype = MIDROUND_RULESET - var/midround_ruleset_style - /// If the ruleset should be restricted from ghost roles. - var/restrict_ghost_roles = TRUE - /// What mob type the ruleset is restricted to. - var/required_type = /mob/living/carbon/human - var/list/living_players = list() - var/list/living_antags = list() - var/list/dead_players = list() - var/list/list_observers = list() - - /// The minimum round time before this ruleset will show up - var/minimum_round_time = 0 - /// Abstract root value - var/abstract_type = /datum/dynamic_ruleset/midround - -/datum/dynamic_ruleset/midround/forget_startup() - living_players = list() - living_antags = list() - dead_players = list() - list_observers = list() - return ..() - -/datum/dynamic_ruleset/midround/from_ghosts - weight = 0 - required_type = /mob/dead/observer - abstract_type = /datum/dynamic_ruleset/midround/from_ghosts - /// Whether the ruleset should call generate_ruleset_body or not. - var/makeBody = TRUE - /// The rule needs this many applicants to be properly executed. - var/required_applicants = 1 - -/datum/dynamic_ruleset/midround/from_ghosts/check_candidates() - var/dead_count = dead_players.len + list_observers.len - if (required_candidates <= dead_count) - return TRUE - - log_dynamic("FAIL: [src], a from_ghosts ruleset, did not have enough dead candidates: [required_candidates] needed, [dead_count] found") - - return FALSE - -/datum/dynamic_ruleset/midround/trim_candidates() - living_players = trim_list(GLOB.alive_player_list) - living_antags = trim_list(GLOB.current_living_antags) - dead_players = trim_list(GLOB.dead_player_list) - list_observers = trim_list(GLOB.current_observers_list) - -/datum/dynamic_ruleset/midround/proc/trim_list(list/to_trim = list()) - var/list/trimmed_list = to_trim.Copy() - for(var/mob/creature in trimmed_list) - if (!istype(creature, required_type)) - trimmed_list.Remove(creature) - continue - if (isnull(creature.client)) // Are they connected? - trimmed_list.Remove(creature) - continue - //SKYRAT EDIT ADDITION - if(is_banned_from(creature.client.ckey, BAN_ANTAGONIST)) - trimmed_list.Remove(creature) - continue - if(!creature.client?.prefs?.read_preference(/datum/preference/toggle/be_antag)) - trimmed_list.Remove(creature) - continue - //SKYRAT EDIT END - if(creature.client.get_remaining_days(minimum_required_age) > 0) - trimmed_list.Remove(creature) - continue - if (!((antag_preference || antag_flag) in creature.client.prefs.be_special)) - trimmed_list.Remove(creature) - continue - if (is_banned_from(creature.ckey, list(antag_flag_override || antag_flag, ROLE_SYNDICATE))) - trimmed_list.Remove(creature) - continue - - if (isnull(creature.mind)) - continue - - if (restrict_ghost_roles && (creature.mind.assigned_role.title in GLOB.exp_specialmap[EXP_TYPE_SPECIAL])) // Are they playing a ghost role? - trimmed_list.Remove(creature) - continue - if (creature.mind.assigned_role.title in restricted_roles) // Does their job allow it? - trimmed_list.Remove(creature) - continue - if (length(exclusive_roles) && !(creature.mind.assigned_role.title in exclusive_roles)) // Is the rule exclusive to their job? - trimmed_list.Remove(creature) - continue - if(HAS_TRAIT(creature, TRAIT_MIND_TEMPORARILY_GONE)) // are they out of body? - trimmed_list.Remove(creature) - continue - if(HAS_TRAIT(creature, TRAIT_TEMPORARY_BODY)) // are they an avatar? - trimmed_list.Remove(creature) - continue - return trimmed_list - -// You can then for example prompt dead players in execute() to join as strike teams or whatever -// Or autotator someone - -// IMPORTANT, since /datum/dynamic_ruleset/midround may accept candidates from both living, dead, and even antag players -// subtype your midround with /from_ghosts or /from_living to get candidate checking. Or check yourself by subtyping from neither -/datum/dynamic_ruleset/midround/ready(forced = FALSE) - if (forced) - return TRUE - - var/job_check = 0 - if (enemy_roles.len > 0) - for (var/mob/M in GLOB.alive_player_list) - if (M.stat == DEAD || !M.client) - continue // Dead/disconnected players cannot count as opponents - if (M.mind && (M.mind.assigned_role.title in enemy_roles) && (!(M in candidates) || (M.mind.assigned_role.title in restricted_roles))) - job_check++ // Checking for "enemies" (such as sec officers). To be counters, they must either not be candidates to that rule, or have a job that restricts them from it - - var/threat = round(mode.threat_level/10) - var/ruleset_forced = (GLOB.dynamic_forced_rulesets[type] || RULESET_NOT_FORCED) == RULESET_FORCE_ENABLED - if (!ruleset_forced && job_check < required_enemies[threat]) - log_dynamic("FAIL: [src] is not ready, because there are not enough enemies: [required_enemies[threat]] needed, [job_check] found") - return FALSE - - return TRUE - -/datum/dynamic_ruleset/midround/from_ghosts/execute() - var/list/possible_candidates = list() - possible_candidates.Add(dead_players) - possible_candidates.Add(list_observers) - send_applications(possible_candidates) - if(assigned.len > 0) - return TRUE - else - return FALSE - -/// This sends a poll to ghosts if they want to be a ghost spawn from a ruleset. -/datum/dynamic_ruleset/midround/from_ghosts/proc/send_applications(list/possible_volunteers = list()) - if (possible_volunteers.len <= 0) // This shouldn't happen, as ready() should return FALSE if there is not a single valid candidate - message_admins("Possible volunteers was 0. This shouldn't appear, because of ready(), unless you forced it!") - mode.log_dynamic_and_announce("Polling [possible_volunteers.len] players to apply for the [name] ruleset.") - - candidates = poll_ghost_candidates("The mode is looking for volunteers to become [antag_flag] for [name]", antag_flag_override, antag_flag || antag_flag_override, poll_time = 300) - - if(!candidates || candidates.len <= 0) - mode.log_dynamic_and_announce("The ruleset [name] received no applications.") - mode.executed_rules -= src - attempt_replacement() - return - - mode.log_dynamic_and_announce("[candidates.len] players volunteered for [name].") - review_applications() - -/// Here is where you can check if your ghost applicants are valid for the ruleset. -/// Called by send_applications(). -/datum/dynamic_ruleset/midround/from_ghosts/proc/review_applications() - if(candidates.len < required_applicants) - mode.executed_rules -= src - return - for (var/i = 1, i <= required_candidates, i++) - if(candidates.len <= 0) - break - var/mob/applicant = pick(candidates) - candidates -= applicant - if(!isobserver(applicant)) - if(applicant.stat == DEAD) // Not an observer? If they're dead, make them one. - applicant = applicant.ghostize(FALSE) - else // Not dead? Disregard them, pick a new applicant - i-- - continue - if(!applicant) - i-- - continue - assigned += applicant - finish_applications() - -/// Here the accepted applications get generated bodies and their setup is finished. -/// Called by review_applications() -/datum/dynamic_ruleset/midround/from_ghosts/proc/finish_applications() - var/i = 0 - for(var/mob/applicant as anything in assigned) - i++ - var/mob/new_character = applicant - if(makeBody) - new_character = generate_ruleset_body(applicant) - finish_setup(new_character, i) - notify_ghosts( - "[applicant.name] has been picked for the ruleset [name]!", - source = new_character, - ) - -/datum/dynamic_ruleset/midround/from_ghosts/proc/generate_ruleset_body(mob/applicant) - var/mob/living/carbon/human/new_character = make_body(applicant) - new_character.dna.remove_all_mutations() - return new_character - -/datum/dynamic_ruleset/midround/from_ghosts/proc/finish_setup(mob/new_character, index) - var/datum/antagonist/new_role = new antag_datum() - setup_role(new_role) - new_character.mind.add_antag_datum(new_role) - new_character.mind.special_role = antag_flag - -/datum/dynamic_ruleset/midround/from_ghosts/proc/setup_role(datum/antagonist/new_role) - return - -/// Fired when there are no valid candidates. Will spawn a sleeper agent or latejoin traitor. -/datum/dynamic_ruleset/midround/from_ghosts/proc/attempt_replacement() - var/datum/dynamic_ruleset/midround/from_living/autotraitor/sleeper_agent = new - - mode.configure_ruleset(sleeper_agent) - - if (!mode.picking_specific_rule(sleeper_agent)) - return - - mode.picking_specific_rule(/datum/dynamic_ruleset/latejoin/infiltrator) - return - -///subtype to handle checking players -/datum/dynamic_ruleset/midround/from_living - weight = 0 - abstract_type = /datum/dynamic_ruleset/midround/from_living - -/datum/dynamic_ruleset/midround/from_living/ready(forced) - if(!check_candidates()) - return FALSE - return ..() - - -/// Midround Traitor Ruleset (From Living) -/datum/dynamic_ruleset/midround/from_living/autotraitor - name = "Syndicate Sleeper Agent" - midround_ruleset_style = MIDROUND_RULESET_STYLE_LIGHT - antag_datum = /datum/antagonist/traitor/infiltrator/sleeper_agent - antag_flag = ROLE_SLEEPER_AGENT - antag_flag_override = ROLE_TRAITOR - protected_roles = list( - JOB_CAPTAIN, - JOB_DETECTIVE, - JOB_HEAD_OF_PERSONNEL, - JOB_HEAD_OF_SECURITY, - JOB_PRISONER, - JOB_SECURITY_OFFICER, - JOB_WARDEN, - ) - restricted_roles = list( - JOB_AI, - JOB_CYBORG, - ROLE_POSITRONIC_BRAIN, - ) - required_candidates = 1 - weight = 35 - cost = 3 - requirements = list(3,3,3,3,3,3,3,3,3,3) - repeatable = TRUE - -/datum/dynamic_ruleset/midround/from_living/autotraitor/trim_candidates() - ..() - candidates = living_players - for(var/mob/living/player in candidates) - if(issilicon(player)) // Your assigned role doesn't change when you are turned into a silicon. - candidates -= player - else if(is_centcom_level(player.z)) - candidates -= player // We don't autotator people in CentCom - else if(player.mind && (player.mind.special_role || player.mind.antag_datums?.len > 0)) - candidates -= player // We don't autotator people with roles already - -/datum/dynamic_ruleset/midround/from_living/autotraitor/execute() - var/mob/M = pick(candidates) - assigned += M - candidates -= M - var/datum/antagonist/traitor/infiltrator/sleeper_agent/newTraitor = new - M.mind.add_antag_datum(newTraitor) - message_admins("[ADMIN_LOOKUPFLW(M)] was selected by the [name] ruleset and has been made into a midround traitor.") - log_dynamic("[key_name(M)] was selected by the [name] ruleset and has been made into a midround traitor.") - return TRUE - - -////////////////////////////////////////////// -// // -// Malfunctioning AI // -// // -////////////////////////////////////////////// - -/datum/dynamic_ruleset/midround/malf - name = "Malfunctioning AI" - midround_ruleset_style = MIDROUND_RULESET_STYLE_HEAVY - antag_datum = /datum/antagonist/malf_ai - antag_flag = ROLE_MALF_MIDROUND - antag_flag_override = ROLE_MALF - enemy_roles = list( - JOB_CHEMIST, - JOB_CHIEF_ENGINEER, - JOB_HEAD_OF_SECURITY, - JOB_RESEARCH_DIRECTOR, - JOB_SCIENTIST, - JOB_SECURITY_OFFICER, - JOB_WARDEN, - ) - exclusive_roles = list(JOB_AI) - required_enemies = list(4,4,4,4,4,4,2,2,2,0) - required_candidates = 1 - minimum_players = 25 - weight = 2 - cost = 10 - required_type = /mob/living/silicon/ai - blocking_rules = list(/datum/dynamic_ruleset/roundstart/malf_ai) - -/datum/dynamic_ruleset/midround/malf/trim_candidates() - ..() - candidates = living_players - for(var/mob/living/player in candidates) - if(!isAI(player)) - candidates -= player - continue - - if(is_centcom_level(player.z)) - candidates -= player - continue - - if(player.mind && (player.mind.special_role || player.mind.antag_datums?.len > 0)) - candidates -= player - -/datum/dynamic_ruleset/midround/malf/execute() - if(!candidates || !candidates.len) - return FALSE - var/mob/living/silicon/ai/new_malf_ai = pick_n_take(candidates) - assigned += new_malf_ai.mind - var/datum/antagonist/malf_ai/malf_antag_datum = new - new_malf_ai.mind.special_role = antag_flag - new_malf_ai.mind.add_antag_datum(malf_antag_datum) - 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), LAW_ION) - else - new_malf_ai.add_ion_law(generate_ion_law()) - return TRUE - -/// Midround Wizard Ruleset (From Ghosts) -/datum/dynamic_ruleset/midround/from_ghosts/wizard - name = "Wizard" - midround_ruleset_style = MIDROUND_RULESET_STYLE_HEAVY - antag_datum = /datum/antagonist/wizard - antag_flag = ROLE_WIZARD_MIDROUND - antag_flag_override = ROLE_WIZARD - required_enemies = list(2,2,1,1,1,1,1,0,0,0) - required_candidates = 1 - weight = 1 - cost = 10 - requirements = REQUIREMENTS_VERY_HIGH_THREAT_NEEDED - flags = HIGH_IMPACT_RULESET - ruleset_lazy_templates = list(LAZY_TEMPLATE_KEY_WIZARDDEN) - -/datum/dynamic_ruleset/midround/from_ghosts/wizard/ready(forced = FALSE) - if(!check_candidates()) - return FALSE - if(!length(GLOB.wizardstart)) - log_admin("Cannot accept Wizard ruleset. Couldn't find any wizard spawn points.") - message_admins("Cannot accept Wizard ruleset. Couldn't find any wizard spawn points.") - return FALSE - return ..() - -/datum/dynamic_ruleset/midround/from_ghosts/wizard/finish_setup(mob/new_character, index) - ..() - new_character.forceMove(pick(GLOB.wizardstart)) - -/// Midround Nuclear Operatives Ruleset (From Ghosts) -/datum/dynamic_ruleset/midround/from_ghosts/nuclear - name = "Nuclear Assault" - midround_ruleset_style = MIDROUND_RULESET_STYLE_HEAVY - antag_flag = ROLE_OPERATIVE_MIDROUND - antag_flag_override = ROLE_OPERATIVE - antag_datum = /datum/antagonist/nukeop - enemy_roles = list( - JOB_AI, - JOB_CYBORG, - JOB_CAPTAIN, - JOB_DETECTIVE, - JOB_HEAD_OF_SECURITY, - JOB_SECURITY_OFFICER, - JOB_WARDEN, - ) - required_enemies = list(3,3,3,3,3,2,1,1,0,0) - required_candidates = 5 - weight = 5 - cost = 7 - minimum_round_time = 70 MINUTES - requirements = REQUIREMENTS_VERY_HIGH_THREAT_NEEDED - ruleset_lazy_templates = list(LAZY_TEMPLATE_KEY_NUKIEBASE) - flags = HIGH_IMPACT_RULESET - - var/list/operative_cap = list(2,2,3,3,4,5,5,5,5,5) - -/datum/dynamic_ruleset/midround/from_ghosts/nuclear/acceptable(population=0, threat_level=0) - if (locate(/datum/dynamic_ruleset/roundstart/nuclear) in mode.executed_rules) - return FALSE // Unavailable if nuke ops were already sent at roundstart - indice_pop = min(operative_cap.len, round(living_players.len/5)+1) - required_candidates = operative_cap[indice_pop] - return ..() - -/datum/dynamic_ruleset/midround/from_ghosts/nuclear/ready(forced = FALSE) - if (!check_candidates()) - return FALSE - return ..() - -/datum/dynamic_ruleset/midround/from_ghosts/nuclear/finish_applications() - var/mob/leader = get_most_experienced(assigned, ROLE_NUCLEAR_OPERATIVE) - if(leader) - assigned.Remove(leader) - assigned.Insert(1, leader) - return ..() - -/datum/dynamic_ruleset/midround/from_ghosts/nuclear/finish_setup(mob/new_character, index) - new_character.mind.set_assigned_role(SSjob.GetJobType(/datum/job/nuclear_operative)) - new_character.mind.special_role = ROLE_NUCLEAR_OPERATIVE - if(index == 1) - var/datum/antagonist/nukeop/leader/leader_antag_datum = new() - new_character.mind.add_antag_datum(leader_antag_datum) - return - return ..() - -/// Midround Blob Ruleset (From Ghosts) -/datum/dynamic_ruleset/midround/from_ghosts/blob - name = "Blob" - midround_ruleset_style = MIDROUND_RULESET_STYLE_HEAVY - antag_datum = /datum/antagonist/blob - antag_flag = ROLE_BLOB - required_enemies = list(2,2,1,1,1,1,1,0,0,0) - required_candidates = 1 - minimum_round_time = 35 MINUTES - weight = 3 - cost = 8 - minimum_players = 25 - repeatable = TRUE - -/datum/dynamic_ruleset/midround/from_ghosts/blob/generate_ruleset_body(mob/applicant) - var/body = applicant.become_overmind() - return body - -/// Midround Blob Infection Ruleset (From Living) -/datum/dynamic_ruleset/midround/from_living/blob_infection - name = "Blob Infection" - midround_ruleset_style = MIDROUND_RULESET_STYLE_HEAVY - antag_datum = /datum/antagonist/blob/infection - antag_flag = ROLE_BLOB_INFECTION - antag_flag_override = ROLE_BLOB - protected_roles = list( - JOB_CAPTAIN, - JOB_DETECTIVE, - JOB_HEAD_OF_SECURITY, - JOB_PRISONER, - JOB_SECURITY_OFFICER, - JOB_WARDEN, - ) - restricted_roles = list( - JOB_AI, - JOB_CYBORG, - ROLE_POSITRONIC_BRAIN, - ) - required_enemies = list(2,2,1,1,1,1,1,0,0,0) - required_candidates = 1 - minimum_round_time = 35 MINUTES - weight = 3 - cost = 10 - minimum_players = 25 - repeatable = TRUE - -/datum/dynamic_ruleset/midround/from_living/blob_infection/trim_candidates() - ..() - candidates = living_players - for(var/mob/living/player as anything in candidates) - var/turf/player_turf = get_turf(player) - if(!player_turf || !is_station_level(player_turf.z)) - candidates -= player - continue - - if(player.mind && (player.mind.special_role || length(player.mind.antag_datums) > 0)) - candidates -= player - -/datum/dynamic_ruleset/midround/from_living/blob_infection/execute() - if(!candidates || !candidates.len) - return FALSE - var/mob/living/carbon/human/blob_antag = pick_n_take(candidates) - assigned += blob_antag.mind - blob_antag.mind.special_role = antag_flag - return ..() - -/// Midround Xenomorph Ruleset (From Ghosts) -/datum/dynamic_ruleset/midround/from_ghosts/xenomorph - name = "Alien Infestation" - midround_ruleset_style = MIDROUND_RULESET_STYLE_HEAVY - antag_datum = /datum/antagonist/xeno - antag_flag = ROLE_ALIEN - required_enemies = list(2,2,1,1,1,1,1,0,0,0) - required_candidates = 1 - minimum_round_time = 40 MINUTES - weight = 5 - cost = 10 - minimum_players = 25 - repeatable = TRUE - var/list/vents = list() - -/datum/dynamic_ruleset/midround/from_ghosts/xenomorph/forget_startup() - vents = list() - return ..() - -/datum/dynamic_ruleset/midround/from_ghosts/xenomorph/execute() - // 50% chance of being incremented by one - required_candidates += prob(50) - var/list/vent_pumps = SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/atmospherics/components/unary/vent_pump) - for(var/obj/machinery/atmospherics/components/unary/vent_pump/temp_vent as anything in vent_pumps) - if(QDELETED(temp_vent)) - continue - if(is_station_level(temp_vent.loc.z) && !temp_vent.welded) - var/datum/pipeline/temp_vent_parent = temp_vent.parents[1] - if(!temp_vent_parent) - continue // No parent vent - // Stops Aliens getting stuck in small networks. - // See: Security, Virology - if(temp_vent_parent.other_atmos_machines.len > 20) - vents += temp_vent - if(!vents.len) - return FALSE - . = ..() - -/datum/dynamic_ruleset/midround/from_ghosts/xenomorph/generate_ruleset_body(mob/applicant) - var/obj/vent = pick_n_take(vents) - var/mob/living/carbon/alien/larva/new_xeno = new(vent.loc) - new_xeno.key = applicant.key - new_xeno.move_into_vent(vent) - message_admins("[ADMIN_LOOKUPFLW(new_xeno)] has been made into an alien by the midround ruleset.") - log_dynamic("[key_name(new_xeno)] was spawned as an alien by the midround ruleset.") - return new_xeno - -/// Midround Nightmare Ruleset (From Ghosts) -/datum/dynamic_ruleset/midround/from_ghosts/nightmare - name = "Nightmare" - midround_ruleset_style = MIDROUND_RULESET_STYLE_LIGHT - antag_datum = /datum/antagonist/nightmare - antag_flag = ROLE_NIGHTMARE - antag_flag_override = ROLE_ALIEN - required_enemies = list(2,2,1,1,1,1,1,0,0,0) - required_candidates = 1 - weight = 3 - cost = 5 - minimum_players = 15 - repeatable = TRUE - -/datum/dynamic_ruleset/midround/from_ghosts/nightmare/acceptable(population = 0, threat_level = 0) - var/turf/spawn_loc = find_maintenance_spawn(atmos_sensitive = TRUE, require_darkness = TRUE) //Checks if there's a single safe, dark tile on station. - if(!spawn_loc) - return FALSE - return ..() - -/datum/dynamic_ruleset/midround/from_ghosts/nightmare/generate_ruleset_body(mob/applicant) - var/datum/mind/player_mind = new /datum/mind(applicant.key) - player_mind.active = TRUE - - var/mob/living/carbon/human/new_nightmare = new (find_maintenance_spawn(atmos_sensitive = TRUE, require_darkness = TRUE)) - player_mind.transfer_to(new_nightmare) - player_mind.set_assigned_role(SSjob.GetJobType(/datum/job/nightmare)) - player_mind.special_role = ROLE_NIGHTMARE - player_mind.add_antag_datum(/datum/antagonist/nightmare) - new_nightmare.set_species(/datum/species/shadow/nightmare) - - playsound(new_nightmare, 'sound/magic/ethereal_exit.ogg', 50, TRUE, -1) - message_admins("[ADMIN_LOOKUPFLW(new_nightmare)] has been made into a Nightmare by the midround ruleset.") - log_dynamic("[key_name(new_nightmare)] was spawned as a Nightmare by the midround ruleset.") - return new_nightmare - -/// Midround Space Dragon Ruleset (From Ghosts) -/datum/dynamic_ruleset/midround/from_ghosts/space_dragon - name = "Space Dragon" - midround_ruleset_style = MIDROUND_RULESET_STYLE_HEAVY - antag_datum = /datum/antagonist/space_dragon - antag_flag = ROLE_SPACE_DRAGON - antag_flag_override = ROLE_SPACE_DRAGON - required_enemies = list(2,2,1,1,1,1,1,0,0,0) - required_candidates = 1 - weight = 4 - cost = 7 - minimum_players = 25 - repeatable = TRUE - var/list/spawn_locs = list() - -/datum/dynamic_ruleset/midround/from_ghosts/space_dragon/forget_startup() - spawn_locs = list() - return ..() - -/datum/dynamic_ruleset/midround/from_ghosts/space_dragon/execute() - for(var/obj/effect/landmark/carpspawn/C in GLOB.landmarks_list) - spawn_locs += (C.loc) - if(!spawn_locs.len) - message_admins("No valid spawn locations found, aborting...") - return MAP_ERROR - . = ..() - -/datum/dynamic_ruleset/midround/from_ghosts/space_dragon/generate_ruleset_body(mob/applicant) - var/datum/mind/player_mind = new /datum/mind(applicant.key) - player_mind.active = TRUE - - var/mob/living/basic/space_dragon/S = new (pick(spawn_locs)) - player_mind.transfer_to(S) - player_mind.add_antag_datum(/datum/antagonist/space_dragon) - - playsound(S, 'sound/magic/ethereal_exit.ogg', 50, TRUE, -1) - message_admins("[ADMIN_LOOKUPFLW(S)] has been made into a Space Dragon by the midround ruleset.") - log_dynamic("[key_name(S)] was spawned as a Space Dragon by the midround ruleset.") - priority_announce("A large organic energy flux has been recorded near of [station_name()], please stand-by.", "Lifesign Alert") - return S - -/datum/dynamic_ruleset/midround/from_ghosts/abductors - name = "Abductors" - midround_ruleset_style = MIDROUND_RULESET_STYLE_LIGHT - antag_datum = /datum/antagonist/abductor - antag_flag = ROLE_ABDUCTOR - required_enemies = list(2,2,1,1,1,1,1,0,0,0) - required_candidates = 2 - required_applicants = 2 - weight = 4 - cost = 7 - minimum_players = 25 - repeatable = TRUE - ruleset_lazy_templates = list(LAZY_TEMPLATE_KEY_ABDUCTOR_SHIPS) - - var/datum/team/abductor_team/new_team - -/datum/dynamic_ruleset/midround/from_ghosts/abductors/forget_startup() - new_team = null - return ..() - -/datum/dynamic_ruleset/midround/from_ghosts/abductors/ready(forced = FALSE) - if (required_candidates > (dead_players.len + list_observers.len)) - return FALSE - return ..() - -/datum/dynamic_ruleset/midround/from_ghosts/abductors/finish_setup(mob/new_character, index) - if (index == 1) // Our first guy is the scientist. We also initialize the team here as well since this should only happen once per pair of abductors. - new_team = new - if(new_team.team_number > ABDUCTOR_MAX_TEAMS) - return MAP_ERROR - var/datum/antagonist/abductor/scientist/new_role = new - new_character.mind.add_antag_datum(new_role, new_team) - else // Our second guy is the agent, team is already created, don't need to make another one. - var/datum/antagonist/abductor/agent/new_role = new - new_character.mind.add_antag_datum(new_role, new_team) - -/// Midround Space Ninja Ruleset (From Ghosts) -/datum/dynamic_ruleset/midround/from_ghosts/space_ninja - name = "Space Ninja" - midround_ruleset_style = MIDROUND_RULESET_STYLE_HEAVY - antag_datum = /datum/antagonist/ninja - antag_flag = ROLE_NINJA - required_enemies = list(2,2,1,1,1,1,1,0,0,0) - required_candidates = 1 - weight = 4 - cost = 8 - minimum_players = 30 - repeatable = TRUE - ruleset_lazy_templates = list(LAZY_TEMPLATE_KEY_NINJA_HOLDING_FACILITY) // I mean, no one uses the nets anymore but whateva - - var/list/spawn_locs = list() - -/datum/dynamic_ruleset/midround/from_ghosts/space_ninja/forget_startup() - spawn_locs = list() - return ..() - -/datum/dynamic_ruleset/midround/from_ghosts/space_ninja/execute() - for(var/obj/effect/landmark/carpspawn/carp_spawn in GLOB.landmarks_list) - if(!isturf(carp_spawn.loc)) - stack_trace("Carp spawn found not on a turf: [carp_spawn.type] on [isnull(carp_spawn.loc) ? "null" : carp_spawn.loc.type]") - continue - spawn_locs += carp_spawn.loc - if(!spawn_locs.len) - message_admins("No valid spawn locations found, aborting...") - return MAP_ERROR - return ..() - -/datum/dynamic_ruleset/midround/from_ghosts/space_ninja/generate_ruleset_body(mob/applicant) - var/mob/living/carbon/human/ninja = create_space_ninja(pick(spawn_locs)) - ninja.key = applicant.key - ninja.mind.add_antag_datum(/datum/antagonist/ninja) - - message_admins("[ADMIN_LOOKUPFLW(ninja)] has been made into a Space Ninja by the midround ruleset.") - log_dynamic("[key_name(ninja)] was spawned as a Space Ninja by the midround ruleset.") - return ninja - -/// Midround Spiders Ruleset (From Ghosts) -/datum/dynamic_ruleset/midround/spiders - name = "Spiders" - midround_ruleset_style = MIDROUND_RULESET_STYLE_HEAVY - antag_flag = ROLE_SPIDER - required_type = /mob/dead/observer - required_enemies = list(2,2,1,1,1,1,1,0,0,0) - required_candidates = 0 - weight = 3 - cost = 8 - minimum_players = 27 - repeatable = TRUE - var/spawncount = 2 - -/datum/dynamic_ruleset/midround/spiders/execute() - create_midwife_eggs(spawncount) - return ..() - -/// Midround Revenant Ruleset (From Ghosts) -/datum/dynamic_ruleset/midround/from_ghosts/revenant - name = "Revenant" - midround_ruleset_style = MIDROUND_RULESET_STYLE_LIGHT - antag_datum = /datum/antagonist/revenant - antag_flag = ROLE_REVENANT - required_enemies = list(2,2,1,1,1,1,1,0,0,0) - required_candidates = 1 - weight = 4 - cost = 5 - minimum_players = 15 - repeatable = TRUE - var/dead_mobs_required = 20 - var/need_extra_spawns_value = 15 - var/list/spawn_locs = list() - -/datum/dynamic_ruleset/midround/from_ghosts/revenant/forget_startup() - spawn_locs = list() - return ..() - -/datum/dynamic_ruleset/midround/from_ghosts/revenant/acceptable(population=0, threat_level=0) - if(GLOB.dead_mob_list.len < dead_mobs_required) - return FALSE - return ..() - -/datum/dynamic_ruleset/midround/from_ghosts/revenant/execute() - for(var/mob/living/corpse in GLOB.dead_mob_list) //look for any dead bodies - var/turf/corpse_turf = get_turf(corpse) - if(corpse_turf && is_station_level(corpse_turf.z)) - spawn_locs += corpse_turf - if(!spawn_locs.len || spawn_locs.len < need_extra_spawns_value) //look for any morgue trays, crematoriums, ect if there weren't alot of dead bodies on the station to pick from - for(var/obj/structure/bodycontainer/corpse_container in GLOB.bodycontainers) - var/turf/container_turf = get_turf(corpse_container) - if(container_turf && is_station_level(container_turf.z)) - spawn_locs += container_turf - if(!spawn_locs.len) //If we can't find any valid spawnpoints, try the carp spawns - for(var/obj/effect/landmark/carpspawn/carp_spawnpoint in GLOB.landmarks_list) - if(isturf(carp_spawnpoint.loc)) - spawn_locs += carp_spawnpoint.loc - if(!spawn_locs.len) //If we can't find THAT, then just give up and cry - return FALSE - . = ..() - -/datum/dynamic_ruleset/midround/from_ghosts/revenant/generate_ruleset_body(mob/applicant) - var/mob/living/basic/revenant/revenant = new(pick(spawn_locs)) - revenant.key = applicant.key - message_admins("[ADMIN_LOOKUPFLW(revenant)] has been made into a revenant by the midround ruleset.") - log_game("[key_name(revenant)] was spawned as a revenant by the midround ruleset.") - return revenant - -/// Midround Sentient Disease Ruleset (From Ghosts) -/datum/dynamic_ruleset/midround/from_ghosts/sentient_disease - name = "Sentient Disease" - midround_ruleset_style = MIDROUND_RULESET_STYLE_HEAVY - antag_datum = /datum/antagonist/disease - antag_flag = ROLE_SENTIENT_DISEASE - required_candidates = 1 - minimum_players = 25 - weight = 4 - cost = 8 - repeatable = TRUE - -/datum/dynamic_ruleset/midround/from_ghosts/sentient_disease/generate_ruleset_body(mob/applicant) - var/mob/camera/disease/virus = new /mob/camera/disease(SSmapping.get_station_center()) - virus.key = applicant.key - INVOKE_ASYNC(virus, TYPE_PROC_REF(/mob/camera/disease, pick_name)) - message_admins("[ADMIN_LOOKUPFLW(virus)] has been made into a sentient disease by the midround ruleset.") - log_game("[key_name(virus)] was spawned as a sentient disease by the midround ruleset.") - return virus - -/// Midround Space Pirates Ruleset (From Ghosts) -/datum/dynamic_ruleset/midround/pirates - name = "Space Pirates" - midround_ruleset_style = MIDROUND_RULESET_STYLE_LIGHT - antag_flag = "Space Pirates" - required_type = /mob/dead/observer - required_enemies = list(2,2,1,1,1,1,1,0,0,0) - required_candidates = 0 - weight = 3 - cost = 8 - minimum_players = 20 - repeatable = TRUE - -/datum/dynamic_ruleset/midround/pirates/acceptable(population=0, threat_level=0) - if (SSmapping.is_planetary() || GLOB.light_pirate_gangs.len == 0) - return FALSE - return ..() - -/datum/dynamic_ruleset/midround/pirates/execute() - send_pirate_threat(GLOB.light_pirate_gangs) - return ..() - -/// Dangerous Space Pirates ruleset -/datum/dynamic_ruleset/midround/dangerous_pirates - name = "Dangerous Space Pirates" - midround_ruleset_style = MIDROUND_RULESET_STYLE_HEAVY - antag_flag = "Space Pirates" - required_type = /mob/dead/observer - required_enemies = list(2,2,1,1,1,1,1,0,0,0) - required_candidates = 0 - weight = 3 - cost = 8 - minimum_players = 25 - repeatable = TRUE - -/datum/dynamic_ruleset/midround/dangerous_pirates/acceptable(population=0, threat_level=0) - if (SSmapping.is_planetary() || GLOB.heavy_pirate_gangs.len == 0) - return FALSE - return ..() - -/datum/dynamic_ruleset/midround/dangerous_pirates/execute() - send_pirate_threat(GLOB.heavy_pirate_gangs) - return ..() - -/// Midround Obsessed Ruleset (From Living) -/datum/dynamic_ruleset/midround/from_living/obsessed - name = "Obsessed" - midround_ruleset_style = MIDROUND_RULESET_STYLE_LIGHT - antag_datum = /datum/antagonist/obsessed - antag_flag = ROLE_OBSESSED - restricted_roles = list( - JOB_AI, - JOB_CYBORG, - ROLE_POSITRONIC_BRAIN, - ) - required_enemies = list(2,2,1,1,1,1,1,0,0,0) - required_candidates = 1 - weight = 4 - cost = 3 // Doesn't have the same impact on rounds as revenants, dragons, sentient disease (10) or syndicate infiltrators (5). - repeatable = TRUE - -/datum/dynamic_ruleset/midround/from_living/obsessed/trim_candidates() - ..() - candidates = living_players - for(var/mob/living/carbon/human/candidate in candidates) - if( \ - !candidate.get_organ_by_type(/obj/item/organ/internal/brain) \ - || candidate.mind.has_antag_datum(/datum/antagonist/obsessed) \ - || candidate.stat == DEAD \ - || !(ROLE_OBSESSED in candidate.client?.prefs?.be_special) \ - || !candidate.mind.assigned_role \ - ) - candidates -= candidate - -/datum/dynamic_ruleset/midround/from_living/obsessed/execute() - var/mob/living/carbon/human/obsessed = pick_n_take(candidates) - obsessed.gain_trauma(/datum/brain_trauma/special/obsessed) - message_admins("[ADMIN_LOOKUPFLW(obsessed)] has been made Obsessed by the midround ruleset.") - log_game("[key_name(obsessed)] was made Obsessed by the midround ruleset.") - return TRUE - -/// Midround Space Changeling Ruleset (From Ghosts) -/datum/dynamic_ruleset/midround/from_ghosts/changeling_midround - name = "Space Changeling" - midround_ruleset_style = MIDROUND_RULESET_STYLE_LIGHT - antag_datum = /datum/antagonist/changeling/space - antag_flag = ROLE_CHANGELING_MIDROUND - antag_flag_override = ROLE_CHANGELING - required_type = /mob/dead/observer - required_enemies = list(2,2,1,1,1,1,1,0,0,0) - required_candidates = 1 - weight = 3 - cost = 7 - minimum_players = 15 - repeatable = TRUE - -/datum/dynamic_ruleset/midround/from_ghosts/changeling_midround/generate_ruleset_body(mob/applicant) - var/body = generate_changeling_meteor(applicant) - message_admins("[ADMIN_LOOKUPFLW(body)] has been made into a space changeling by the midround ruleset.") - log_dynamic("[key_name(body)] was spawned as a space changeling by the midround ruleset.") - return body - -/// Midround Paradox Clone Ruleset (From Ghosts) -/datum/dynamic_ruleset/midround/from_ghosts/paradox_clone - name = "Paradox Clone" - midround_ruleset_style = MIDROUND_RULESET_STYLE_LIGHT - antag_datum = /datum/antagonist/paradox_clone - antag_flag = ROLE_PARADOX_CLONE - enemy_roles = list( - JOB_CAPTAIN, - JOB_DETECTIVE, - JOB_HEAD_OF_SECURITY, - JOB_SECURITY_OFFICER, - JOB_WARDEN, - ) - required_enemies = list(2, 2, 1, 1, 1, 1, 1, 0, 0, 0) - required_candidates = 1 - weight = 4 - cost = 3 - repeatable = TRUE - var/list/possible_spawns = list() ///places the antag can spawn - -/datum/dynamic_ruleset/midround/from_ghosts/paradox_clone/forget_startup() - possible_spawns = list() - return ..() - -/datum/dynamic_ruleset/midround/from_ghosts/paradox_clone/execute() - possible_spawns += find_maintenance_spawn(atmos_sensitive = TRUE, require_darkness = FALSE) - if(!possible_spawns.len) - return MAP_ERROR - return ..() - -/datum/dynamic_ruleset/midround/from_ghosts/paradox_clone/generate_ruleset_body(mob/applicant) - var/datum/mind/player_mind = new /datum/mind(applicant.key) - player_mind.active = TRUE - - var/mob/living/carbon/human/clone_victim = find_original() - var/mob/living/carbon/human/clone = clone_victim.make_full_human_copy(pick(possible_spawns)) - player_mind.transfer_to(clone) - - var/datum/antagonist/paradox_clone/new_datum = player_mind.add_antag_datum(/datum/antagonist/paradox_clone) - new_datum.original_ref = WEAKREF(clone_victim.mind) - new_datum.setup_clone() - - playsound(clone, 'sound/weapons/zapbang.ogg', 30, TRUE) - new /obj/item/storage/toolbox/mechanical(clone.loc) //so they dont get stuck in maints - - message_admins("[ADMIN_LOOKUPFLW(clone)] has been made into a Paradox Clone by the midround ruleset.") - clone.log_message("was spawned as a Paradox Clone of [key_name(clone)] by the midround ruleset.", LOG_GAME) - - return clone - -/** - * Trims through GLOB.player_list and finds a target - * Returns a single human victim, if none is possible then returns null. - */ -/datum/dynamic_ruleset/midround/from_ghosts/paradox_clone/proc/find_original() - var/list/possible_targets = list() - - for(var/mob/living/carbon/human/player in GLOB.player_list) - if(!player.client || !player.mind || player.stat) - continue - if(!(player.mind.assigned_role.job_flags & JOB_CREW_MEMBER)) - continue - possible_targets += player - - if(possible_targets.len) - return pick(possible_targets) - return FALSE - -#undef MALF_ION_PROB -#undef REPLACE_LAW_WITH_ION_PROB diff --git a/code/game/gamemodes/dynamic/dynamic_simulations.dm b/code/game/gamemodes/dynamic/dynamic_simulations.dm deleted file mode 100644 index 63da54becee..00000000000 --- a/code/game/gamemodes/dynamic/dynamic_simulations.dm +++ /dev/null @@ -1,122 +0,0 @@ -#ifdef TESTING -/datum/dynamic_simulation - var/datum/game_mode/dynamic/gamemode - var/datum/dynamic_simulation_config/config - var/list/mock_candidates = list() - -/datum/dynamic_simulation/proc/initialize_gamemode(forced_threat) - gamemode = new - - if (forced_threat) - gamemode.create_threat(forced_threat) - else - gamemode.generate_threat() - - gamemode.generate_budgets() - gamemode.set_cooldowns() - -/datum/dynamic_simulation/proc/create_candidates(players) - GLOB.new_player_list.Cut() - - for (var/_ in 1 to players) - var/mob/dead/new_player/mock_new_player = new - mock_new_player.ready = PLAYER_READY_TO_PLAY - - var/datum/mind/mock_mind = new - mock_new_player.mind = mock_mind - - var/datum/client_interface/mock_client = new - - var/datum/preferences/prefs = new - var/list/be_special = list() - for (var/special_role in GLOB.special_roles) - be_special += special_role - - prefs.be_special = be_special - mock_client.prefs = prefs - - mock_new_player.mock_client = mock_client - - mock_candidates += mock_new_player - -/datum/dynamic_simulation/proc/simulate(datum/dynamic_simulation_config/config) - src.config = config - - initialize_gamemode(config.forced_threat_level) - create_candidates(config.roundstart_players) - gamemode.pre_setup() - - var/total_antags = 0 - for (var/_ruleset in gamemode.executed_rules) - var/datum/dynamic_ruleset/ruleset = _ruleset - total_antags += ruleset.assigned.len - - return list( - "roundstart_players" = config.roundstart_players, - "threat_level" = gamemode.threat_level, - "snapshot" = list( - "antag_percent" = total_antags / config.roundstart_players, - "remaining_threat" = gamemode.mid_round_budget, - "rulesets" = gamemode.executed_rules.Copy(), - ), - ) - -/datum/dynamic_simulation_config - /// How many players round start should there be? - var/roundstart_players - - /// Optional, force this threat level instead of picking randomly through the lorentz distribution - var/forced_threat_level - -/client/proc/run_dynamic_simulations() - set name = "Run Dynamic Simulations" - set category = "Debug" - - var/simulations = input(usr, "Enter number of simulations") as num - var/roundstart_players = input(usr, "Enter number of round start players") as num - var/forced_threat_level = input(usr, "Enter forced threat level, if you want one") as num | null - - SSticker.mode = new /datum/game_mode/dynamic - message_admins("Running dynamic simulations...") - - var/list/outputs = list() - - var/datum/dynamic_simulation_config/dynamic_config = new - - if (roundstart_players) - dynamic_config.roundstart_players = roundstart_players - - if (forced_threat_level) - dynamic_config.forced_threat_level = forced_threat_level - - for (var/count in 1 to simulations) - var/datum/dynamic_simulation/simulator = new - var/output = simulator.simulate(dynamic_config) - outputs += list(output) - - if (CHECK_TICK) - log_world("[count]/[simulations]") - - message_admins("Writing file...") - WRITE_FILE(file("[GLOB.log_directory]/dynamic_simulations.json"), json_encode(outputs)) - message_admins("Writing complete.") - -/proc/export_dynamic_json_of(ruleset_list) - var/list/export = list() - - for (var/_ruleset in ruleset_list) - var/datum/dynamic_ruleset/ruleset = _ruleset - export[ruleset.name] = list( - "repeatable_weight_decrease" = ruleset.repeatable_weight_decrease, - "weight" = ruleset.weight, - "cost" = ruleset.cost, - "scaling_cost" = ruleset.scaling_cost, - "antag_cap" = ruleset.antag_cap, - "pop_per_requirement" = ruleset.pop_per_requirement, - "requirements" = ruleset.requirements, - "base_prob" = ruleset.base_prob, - ) - - return export - -#endif diff --git a/code/game/gamemodes/dynamic/readme.md b/code/game/gamemodes/dynamic/readme.md deleted file mode 100644 index d663e88a239..00000000000 --- a/code/game/gamemodes/dynamic/readme.md +++ /dev/null @@ -1,194 +0,0 @@ -# Dynamic Mode - -## Roundstart - -Dynamic rolls threat based on a special sauce formula: - -> [dynamic_curve_width][/datum/controller/global_vars/var/dynamic_curve_width] \* tan((3.1416 \* (rand() - 0.5) \* 57.2957795)) + [dynamic_curve_centre][/datum/controller/global_vars/var/dynamic_curve_centre] - -This threat is split into two separate budgets--`round_start_budget` and `mid_round_budget`. For example, a round with 50 threat might be split into a 30 roundstart budget, and a 20 midround budget. The roundstart budget is used to apply antagonists applied on readied players when the roundstarts (`/datum/dynamic_ruleset/roundstart`). The midround budget is used for two types of rulesets: -- `/datum/dynamic_ruleset/midround` - Rulesets that apply to either existing alive players, or to ghosts. Think Blob or Space Ninja, which poll ghosts asking if they want to play as these roles. -- `/datum/dynamic_ruleset/latejoin` - Rulesets that apply to the next player that joins. Think Syndicate Infiltrator, which converts a player just joining an existing round into traitor. - -This split is done with a similar method, known as the ["lorentz distribution"](https://en.wikipedia.org/wiki/Cauchy_distribution), exists to create a bell curve that ensures that while most rounds will have a threat level around ~50, chaotic and tame rounds still exist for variety. - -The process of creating these numbers occurs in `/datum/game_mode/dynamic/proc/generate_threat` (for creating the threat level) and `/datum/game_mode/dynamic/proc/generate_budgets` (for splitting the threat level into budgets). - -## Deciding roundstart threats -In `/datum/game_mode/dynamic/proc/roundstart()` (called when no admin chooses the rulesets explicitly), Dynamic uses the available roundstart budget to pick threats. This is done through the following system: - -- All roundstart rulesets (remember, `/datum/dynamic_ruleset/roundstart`) are put into an associative list with their weight as the values (`drafted_rules`). -- Until there is either no roundstart budget left, or until there is no ruleset we can choose from with the available threat, a `pickweight` is done based on the drafted_rules. If the same threat is picked twice, it will "scale up". The meaning of this depends on the ruleset itself, using the `scaled_times` variable; traitors for instance will create more the higher they scale. - - If a ruleset is chosen with the `HIGH_IMPACT_RULESET` in its `flags`, then all other `HIGH_IMPACT_RULESET`s will be removed from `drafted_rules`. This is so that only one can ever be chosen. - - If a ruleset has `LONE_RULESET` in its `flags`, then it will be removed from `drafted_rules`. This is to ensure it will only ever be picked once. An example of this in use is Wizard, to avoid creating multiple wizards. -- After all roundstart threats are chosen, `/datum/dynamic_ruleset/proc/picking_roundstart_rule` is called for each, passing in the ruleset and the number of times it is scaled. - - In this stage, `pre_execute` is called, which is the function that will determine what players get what antagonists. If this function returns FALSE for whatever reason (in the case of an error), then its threat is refunded. - -After this process is done, any leftover roundstart threat will be given to the existing midround budget (done in `/datum/game_mode/dynamic/pre_setup()`). - -## Deciding midround threats - -### Frequency - -The frequency of midround threats is based on the midround threat of the round. The number of midround threats that will roll is `threat_level` / `threat_per_midround_roll` (configurable), rounded up. For example, if `threat_per_midround_roll` is set to 5, then for every 5 threat, one midround roll will be added. If you have 6 threat, with this configuration, you will get 2 midround rolls. - -These midround roll points are then equidistantly spaced across the round, starting from `midround_lower_bound` (configurable) to `midround_upper_bound` (configurable), with a +/- of `midround_roll_distance` (configurable). - -For example, if: -1. `midround_lower_bound` is `10 MINUTES` -2. `midround_upper_bound` is `100 MINUTES` -3. `midround_roll_distance` is `3 MINUTES` -4. You have 5 midround rolls for the round - -...then those 5 midround rolls will be placed equidistantly (meaning equally apart) across the first 10-100 minutes of the round. Every individual roll will then be adjusted to either be 3 minutes earlier, or 3 minutes later. - -### Threat variety - -Threats are split between **heavy** rulesets and **light** rulesets. A heavy ruleset includes major threats like space dragons or blobs, while light rulesets are ones that don't often cause shuttle calls when rolled, such as revenants or traitors (sleeper agents). - -When a midround roll occurs, the decision to choose between light or heavy depends on the current round time. If it is less than `midround_light_upper_bound` (configurable), then it is guaranteed to be a light ruleset. If it is more than `midround_heavy_lower_bound`, then it is guaranteed to be a heavy ruleset. If it is any point in between, it will interpolate the value between those. This means that the longer the round goes on, the more likely you are to get a heavy ruleset. - -If no heavy ruleset can run, such as not having enough threat, then a light ruleset is guaranteed to run. - -## Rule Processing - -Calls [rule_process][/datum/dynamic_ruleset/proc/rule_process] on every rule which is in the current_rules list. -Every sixty seconds, update_playercounts() -Midround injection time is checked against world.time to see if an injection should happen. -If midround injection time is lower than world.time, it updates playercounts again, then tries to inject and generates a new cooldown regardless of whether a rule is picked. - -## Latejoin - -make_antag_chance(newPlayer) -> (For each latespawn rule...) --> acceptable(living players, threat_level) -> trim_candidates() -> ready(forced=FALSE) -**If true, add to drafted rules -**NOTE that acceptable uses threat_level not threat! -**NOTE Latejoin timer is ONLY reset if at least one rule was drafted. -**NOTE the new_player.dm AttemptLateSpawn() calls OnPostSetup for all roles (unless assigned role is MODE) - -(After collecting all draftble rules...) --> picking_latejoin_ruleset(drafted_rules) -> spend threat -> ruleset.execute() - -## Midround - -process() -> (For each midround rule... --> acceptable(living players, threat_level) -> trim_candidates() -> ready(forced=FALSE) -(After collecting all draftble rules...) --> picking_midround_ruleset(drafted_rules) -> spend threat -> ruleset.execute() - -## Forced - -For latejoin, it simply sets forced_latejoin_rule -make_antag_chance(newPlayer) -> trim_candidates() -> ready(forced=TRUE) **NOTE no acceptable() call - -For midround, calls the below proc with forced = TRUE -picking_specific_rule(ruletype,forced) -> forced OR acceptable(living_players, threat_level) -> trim_candidates() -> ready(forced) -> spend threat -> execute() -**NOTE specific rule can be called by RS traitor->MR autotraitor w/ forced=FALSE -**NOTE that due to short circuiting acceptable() need not be called if forced. - -## Ruleset - -acceptable(population,threat) just checks if enough threat_level for population indice. -**NOTE that we currently only send threat_level as the second arg, not threat. -ready(forced) checks if enough candidates and calls the map's map_ruleset(dynamic_ruleset) at the parent level - -trim_candidates() varies significantly according to the ruleset type -Roundstart: All candidates are new_player mobs. Check them for standard stuff: connected, desire role, not banned, etc. -**NOTE Roundstart deals with both candidates (trimmed list of valid players) and mode.candidates (everyone readied up). Don't confuse them! -Latejoin: Only one candidate, the latejoiner. Standard checks. -Midround: Instead of building a single list candidates, candidates contains four lists: living, dead, observing, and living antags. Standard checks in trim_list(list). - -Midround - Rulesets have additional types -/from_ghosts: execute() -> send_applications() -> review_applications() -> finish_applications() -> finish_setup(mob/newcharacter, index) -> setup_role(role) -**NOTE: execute() here adds dead players and observers to candidates list - -## Configuration and variables - -### Configuration -Configuration can be done through a `config/dynamic.json` file. One is provided as example in the codebase. This config file, loaded in `/datum/game_mode/dynamic/pre_setup()`, directly overrides the values in the codebase, and so is perfect for making some rulesets harder/easier to get, turning them off completely, changing how much they cost, etc. - -The format of this file is: -```json -{ - "Dynamic": { - /* Configuration in here will directly override `/datum/game_mode/dynamic` itself. */ - /* Keys are variable names, values are their new values. */ - }, - - "Roundstart": { - /* Configuration in here will apply to `/datum/dynamic_ruleset/roundstart` instances. */ - /* Keys are the ruleset names, values are another associative list with keys being variable names and values being new values. */ - "Wizard": { - /* I, a head admin, have died to wizard, and so I made it cost a lot more threat than it does in the codebase. */ - "cost": 80 - } - }, - - "Midround": { - /* Same as "Roundstart", but for `/datum/dynamic_ruleset/midround` instead. */ - }, - - "Latejoin": { - /* Same as "Roundstart", but for `/datum/dynamic_ruleset/latejoin` instead. */ - }, - - "Station": { - /* Special threat reductions for dangerous station traits. Traits are selected before dynamic, so traits will always */ - /* reduce threat even if there's no threat for it available. Only "cost" can be modified */ - } -} -``` - -Note: Comments are not possible in this format, and are just in this document for the sake of readability. - -### Rulesets -Rulesets have the following variables notable to developers and those interested in tuning. - -- `required_candidates` - The number of people that *must be willing* (in their preferences) to be an antagonist with this ruleset. If the candidates do not meet this requirement, then the ruleset will not bother to be drafted. -- `antag_cap` - Judges the amount of antagonists to apply, for both solo and teams. Note that some antagonists (such as traitors, lings, heretics, etc) will add more based on how many times they've been scaled. Written as a linear equation--ceil(x/denominator) + offset, or as a fixed constant. If written as a linear equation, will be in the form of `list("denominator" = denominator, "offset" = offset)`. - - Examples include: - - Traitor: `antag_cap = list("denominator" = 24)`. This means that for every 24 players, 1 traitor will be added (assuming no scaling). - - Nuclear Emergency: `antag_cap = list("denominator" = 18, "offset" = 1)`. For every 18 players, 1 nuke op will be added. Starts at 1, meaning at 30 players, 3 nuke ops will be created, rather than 2. - - Revolution: `antag_cap = 3`. There will always be 3 rev-heads, no matter what. -- `minimum_required_age` - The minimum age in order to apply for the ruleset. -- `weight` - How likely this ruleset is to be picked. A higher weight results in a higher chance of drafting. -- `cost` - The initial cost of the ruleset. This cost is taken from either the roundstart or midround budget, depending on the ruleset. -- `scaling_cost` - Cost for every *additional* application of this ruleset. - - Suppose traitors has a `cost` of 8, and a `scaling_cost` of 5. This means that buying 1 application of the traitor ruleset costs 8 threat, but buying two costs 13 (8 + 5). Buying it a third time is 18 (8 + 5 + 5), etc. -- `pop_per_requirement` - The range of population each value in `requirements` represents. By default, this is 6. - - If the value is five the range is 0-4, 5-9, 10-14, 15-19, 20-24, 25-29, 30-34, 35-39, 40-54, 45+. - - If it is six the range is 0-5, 6-11, 12-17, 18-23, 24-29, 30-35, 36-41, 42-47, 48-53, 54+. - - If it is seven the range is 0-6, 7-13, 14-20, 21-27, 28-34, 35-41, 42-48, 49-55, 56-62, 63+. -- `requirements` - A list that represents, per population range (see: `pop_per_requirement`), how much threat is required to *consider* this ruleset. This is independent of how much it'll actually cost. This uses *threat level*, not the budget--meaning if a round has 50 threat level, but only 10 points of round start threat, a ruleset with a requirement of 40 can still be picked if it can be bought. - - Suppose wizard has a `requirements` of `list(90,90,70,40,30,20,10,10,10,10)`. This means that, at 0-5 and 6-11 players, A station must have 90 threat in order for a wizard to be possible. At 12-17, 70 threat is required instead, etc. -- `restricted_roles` - A list of jobs that *can't* be drafted by this ruleset. For example, cyborgs cannot be changelings, and so are in the `restricted_roles`. -- `protected_roles` - Serves the same purpose of `restricted_roles`, except it can be turned off through configuration (`protect_roles_from_antagonist`). For example, security officers *shouldn't* be made traitor, so they are in Traitor's `protected_roles`. - - When considering putting a role in `protected_roles` or `restricted_roles`, the rule of thumb is if it is *technically infeasible* to support that job in that role. There's no *technical* reason a security officer can't be a traitor, and so they are simply in `protected_roles`. There *are* technical reasons a cyborg can't be a changeling, so they are in `restricted_roles` instead. - -This is not a complete list--search "configurable" in this README to learn more. - -### Dynamic - -The "Dynamic" key has the following configurable values: -- `pop_per_requirement` - The default value of `pop_per_requirement` for any ruleset that does not explicitly set it. Defaults to 6. -- `latejoin_delay_min`, `latejoin_delay_max` - The time range, in deciseconds (take your seconds, and multiply by 10), for a latejoin to attempt rolling. Once this timer is finished, a new one will be created within the same range. - - Suppose you have a `latejoin_delay_min` of 600 (60 seconds, 1 minute) and a `latejoin_delay_max` of 1800 (180 seconds, 3 minutes). Once the round starts, a random number in this range will be picked--let's suppose 1.5 minutes. After 1.5 minutes, Dynamic will decide if a latejoin threat should be created (a probability of `/datum/game_mode/dynamic/proc/get_injection_chance()`). Regardless of its decision, a new timer will be started within the range of 1 to 3 minutes, repeatedly. -- `threat_curve_centre` - A number between -5 and +5. A negative value will give a more peaceful round and a positive value will give a round with higher threat. -- `threat_curve_width` - A number between 0.5 and 4. Higher value will favour extreme rounds and lower value rounds closer to the average. -- `roundstart_split_curve_centre` - A number between -5 and +5. Equivalent to threat_curve_centre, but for the budget split. A negative value will weigh towards midround rulesets, and a positive value will weight towards roundstart ones. -- `roundstart_split_curve_width` - A number between 0.5 and 4. Equivalent to threat_curve_width, but for the budget split. Higher value will favour more variance in splits and lower value rounds closer to the average. -- `random_event_hijack_minimum` - The minimum amount of time for antag random events to be hijacked. (See [Random Event Hijacking](#random-event-hijacking)) -- `random_event_hijack_maximum` - The maximum amount of time for antag random events to be hijacked. (See [Random Event Hijacking](#random-event-hijacking)) -- `hijacked_random_event_injection_chance` - The amount of injection chance to give to Dynamic when a random event is hijacked. (See [Random Event Hijacking](#random-event-hijacking)) -- `max_threat_level` - Sets the maximum amount of threat that can be rolled. Defaults to 100. You should only use this to *lower* the maximum threat, as raising it higher will not do anything. - -## Random Event "Hijacking" -Random events have the potential to be hijacked by Dynamic to keep the pace of midround injections, while also allowing greenshifts to contain some antagonists. - -`/datum/round_event_control/dynamic_should_hijack` is a variable to random events to allow Dynamic to hijack them, and defaults to FALSE. This is set to TRUE for random events that spawn antagonists. - -In `/datum/game_mode/dynamic/on_pre_random_event` (in `dynamic_hijacking.dm`), Dynamic hooks to random events. If the `dynamic_should_hijack` variable is TRUE, the following sequence of events occurs: - -![Flow chart to describe the chain of events for Dynamic 2021 to take](https://github.com/tgstation/documentation-assets/blob/main/dynamic/random_event_hijacking.png) - -`n` is a random value between `random_event_hijack_minimum` and `random_event_hijack_maximum`. Heavy injection chance, should it need to be raised, is increased by `hijacked_random_event_injection_chance_modifier`. diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm deleted file mode 100644 index 39dcb81920a..00000000000 --- a/code/game/gamemodes/game_mode.dm +++ /dev/null @@ -1,228 +0,0 @@ - - -/* - * GAMEMODES (by Rastaf0) - * - * In the new mode system all special roles are fully supported. - * You can have proper wizards/traitors/changelings/cultists during any mode. - * Only two things really depends on gamemode: - * 1. Starting roles, equipment and preparations - * 2. Conditions of finishing the round. - * - */ - - -/datum/game_mode - -///Attempts to select players for special roles the mode might have. -/datum/game_mode/proc/pre_setup() - return TRUE - -///Everyone should now be on the station and have their normal gear. This is the place to give the special roles extra things -/datum/game_mode/proc/post_setup(report) //Gamemodes can override the intercept report. Passing TRUE as the argument will force a report. - if(!report) - report = !CONFIG_GET(flag/no_intercept_report) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(display_roundstart_logout_report)), ROUNDSTART_LOGOUT_REPORT_TIME) - - if(CONFIG_GET(flag/reopen_roundstart_suicide_roles)) - var/delay = CONFIG_GET(number/reopen_roundstart_suicide_roles_delay) - if(delay) - delay = (delay SECONDS) - else - delay = (4 MINUTES) //default to 4 minutes if the delay isn't defined. - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(reopen_roundstart_suicide_roles)), delay) - - if(SSdbcore.Connect()) - var/list/to_set = list() - var/arguments = list() - if(SSticker.mode) - to_set += "game_mode = :game_mode" - arguments["game_mode"] = SSticker.mode - if(GLOB.revdata.originmastercommit) - to_set += "commit_hash = :commit_hash" - arguments["commit_hash"] = GLOB.revdata.originmastercommit - if(to_set.len) - arguments["round_id"] = GLOB.round_id - var/datum/db_query/query_round_game_mode = SSdbcore.NewQuery( - "UPDATE [format_table_name("round")] SET [to_set.Join(", ")] WHERE id = :round_id", - arguments - ) - query_round_game_mode.Execute() - qdel(query_round_game_mode) - return TRUE - - -///Handles late-join antag assignments -/datum/game_mode/proc/make_antag_chance(mob/living/carbon/human/character) - return - -/// Checks if the round should be ending, called every ticker tick -/datum/game_mode/proc/check_finished() - if(!SSticker.setup_done) - return FALSE - if(SSshuttle.emergency && (SSshuttle.emergency.mode == SHUTTLE_ENDGAME)) - return TRUE - if(GLOB.station_was_nuked) - return TRUE - if(GLOB.revolutionary_win) - return TRUE - return FALSE - -/* - * Generate a list of station goals available to purchase to report to the crew. - * - * Returns a formatted string all station goals that are available to the station. - */ -/datum/game_mode/proc/generate_station_goal_report() - if(!GLOB.station_goals.len) - return - . = "
Special Orders for [station_name()]:
" - var/list/goal_reports = list() - for(var/datum/station_goal/station_goal as anything in GLOB.station_goals) - station_goal.on_report() - goal_reports += station_goal.get_report() - - . += goal_reports.Join("
") - return - -/* - * Generate a list of active station traits to report to the crew. - * - * Returns a formatted string of all station traits (that are shown) affecting the station. - */ -/datum/game_mode/proc/generate_station_trait_report() - var/trait_list_string = "" - for(var/datum/station_trait/station_trait as anything in SSstation.station_traits) - if(!station_trait.show_in_report) - continue - trait_list_string += "[station_trait.get_report()]
" - if(trait_list_string != "") - return "
Identified shift divergencies:
" + trait_list_string - return - -/datum/game_mode/proc/generate_report_footnote() - var/footnote_pile = "" - - for(var/datum/command_footnote/footnote in SScommunications.command_report_footnotes) - footnote_pile += "[footnote.message]
" - footnote_pile += "[footnote.signature]
" - footnote_pile += "
" - - return "
Additional Notes:

" + footnote_pile - -/proc/reopen_roundstart_suicide_roles() - var/include_command = CONFIG_GET(flag/reopen_roundstart_suicide_roles_command_positions) - var/list/reopened_jobs = list() - - for(var/mob/living/quitter in GLOB.suicided_mob_list) - var/datum/job/job = SSjob.GetJob(quitter.job) - if(!job || !(job.job_flags & JOB_REOPEN_ON_ROUNDSTART_LOSS)) - continue - if(!include_command && job.departments_bitflags & DEPARTMENT_BITFLAG_COMMAND) - continue - job.current_positions = max(job.current_positions - 1, 0) - reopened_jobs += quitter.job - - if(CONFIG_GET(flag/reopen_roundstart_suicide_roles_command_report)) - if(reopened_jobs.len) - var/reopened_job_report_positions - for(var/dead_dudes_job in reopened_jobs) - reopened_job_report_positions = "[reopened_job_report_positions ? "[reopened_job_report_positions]\n":""][dead_dudes_job]" - - var/suicide_command_report = "[command_name()] Human Resources Board
\ - Notice of Personnel Change

\ - To personnel management staff aboard [station_name()]:

\ - Our medical staff have detected a series of anomalies in the vital sensors \ - of some of the staff aboard your station.

\ - Further investigation into the situation on our end resulted in us discovering \ - a series of rather... unforturnate decisions that were made on the part of said staff.

\ - As such, we have taken the liberty to automatically reopen employment opportunities for the positions of the crew members \ - who have decided not to partake in our research. We will be forwarding their cases to our employment review board \ - to determine their eligibility for continued service with the company (and of course the \ - continued storage of cloning records within the central medical backup server.)

\ - The following positions have been reopened on our behalf:

\ - [reopened_job_report_positions]
" - - print_command_report(suicide_command_report, "Central Command Personnel Update") - -////////////////////////// -//Reports player logouts// -////////////////////////// -/proc/display_roundstart_logout_report() - var/list/msg = list("[span_boldnotice("Roundstart logout report")]\n\n") - for(var/i in GLOB.mob_living_list) - var/mob/living/L = i - var/mob/living/carbon/C = L - if (istype(C) && !C.last_mind) - continue // never had a client - - if(L.ckey && !GLOB.directory[L.ckey]) - msg += "[L.name] ([L.key]), the [L.job] (Disconnected)\n" - - - if(L.ckey && L.client) - var/failed = FALSE - if(L.client.inactivity >= ROUNDSTART_LOGOUT_AFK_THRESHOLD) //Connected, but inactive (alt+tabbed or something) - msg += "[L.name] ([L.key]), the [L.job] (Connected, Inactive)\n" - failed = TRUE //AFK client - if(!failed && L.stat) - if(HAS_TRAIT(L, TRAIT_SUICIDED)) //Suicider - msg += "[L.name] ([L.key]), the [L.job] ([span_boldannounce("Suicide")])\n" - failed = TRUE //Disconnected client - if(!failed && (L.stat == UNCONSCIOUS || L.stat == HARD_CRIT)) - msg += "[L.name] ([L.key]), the [L.job] (Dying)\n" - failed = TRUE //Unconscious - if(!failed && L.stat == DEAD) - msg += "[L.name] ([L.key]), the [L.job] (Dead)\n" - failed = TRUE //Dead - - continue //Happy connected client - for(var/mob/dead/observer/D in GLOB.dead_mob_list) - if(D.mind && D.mind.current == L) - if(L.stat == DEAD) - if(HAS_TRAIT(L, TRAIT_SUICIDED)) //Suicider - msg += "[L.name] ([ckey(D.mind.key)]), the [L.job] ([span_boldannounce("Suicide")])\n" - continue //Disconnected client - else - msg += "[L.name] ([ckey(D.mind.key)]), the [L.job] (Dead)\n" - continue //Dead mob, ghost abandoned - else - if(D.can_reenter_corpse) - continue //Adminghost, or cult/wizard ghost - else - msg += "[L.name] ([ckey(D.mind.key)]), the [L.job] ([span_boldannounce("Ghosted")])\n" - continue //Ghosted while alive - - var/concatenated_message = msg.Join() - log_admin(concatenated_message) - to_chat(GLOB.admins, concatenated_message) - -/datum/game_mode/proc/generate_station_goals(greenshift) - var/goal_budget = greenshift ? INFINITY : CONFIG_GET(number/station_goal_budget) - var/list/possible = subtypesof(/datum/station_goal) - // Remove all goals that require space if space is not present - if(SSmapping.is_planetary()) - for(var/datum/station_goal/goal as anything in possible) - if(initial(goal.requires_space)) - possible -= goal - var/goal_weights = 0 - while(possible.len && goal_weights < goal_budget) - var/datum/station_goal/picked = pick_n_take(possible) - goal_weights += initial(picked.weight) - GLOB.station_goals += new picked - -//Set result and news report here -/datum/game_mode/proc/set_round_result() - SSticker.mode_result = "undefined" - // Something nuked the station - it wasn't nuke ops (they set their own via their rulset) - if(GLOB.station_was_nuked) - SSticker.news_report = STATION_NUKED - if(SSsupermatter_cascade.cascade_initiated) - SSticker.news_report = SUPERMATTER_CASCADE - // Only show this one if we have nothing better to show - if(EMERGENCY_ESCAPED_OR_ENDGAMED && !SSticker.news_report) - SSticker.news_report = SSshuttle.emergency?.is_hijacked() ? SHUTTLE_HIJACK : STATION_EVACUATED - -/// Mode specific admin panel. -/datum/game_mode/proc/admin_panel() - return diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 4a75abef9b1..ba0d7b931cd 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -1,5 +1,5 @@ GLOBAL_LIST(admin_objective_list) //Prefilled admin assignable objective list -GLOBAL_LIST_EMPTY(objectives) //SKYRAT EDIT ADDITION +GLOBAL_LIST_EMPTY(objectives) //NOVA EDIT ADDITION /datum/objective var/datum/mind/owner //The primary owner of the objective. !!SOMEWHAT DEPRECATED!! Prefer using 'team' for new code. @@ -17,13 +17,13 @@ GLOBAL_LIST_EMPTY(objectives) //SKYRAT EDIT ADDITION var/admin_grantable = FALSE /datum/objective/New(text) - GLOB.objectives += src //SKYRAT EDIT ADDITION + GLOB.objectives += src //NOVA EDIT ADDITION if(text) explanation_text = text //Apparently objectives can be qdel'd. Learn a new thing every day /datum/objective/Destroy() - GLOB.objectives -= src //SKYRAT EDIT ADDITION + GLOB.objectives -= src //NOVA EDIT ADDITION return ..() /datum/objective/proc/get_owners() // Combine owner and team into a single list. @@ -136,13 +136,13 @@ GLOBAL_LIST_EMPTY(objectives) //SKYRAT EDIT ADDITION if(!HAS_TRAIT(SSstation, STATION_TRAIT_LATE_ARRIVALS) && istype(target_area, /area/shuttle/arrival)) return FALSE - // SKYRAT EDIT ADDITION + // NOVA EDIT ADDITION if(SSticker.IsRoundInProgress() && istype(target_area, /area/centcom/interlink)) return FALSE if(!count_space_areas) if(istype(target_area, /area/space) || istype(target_area, /area/ruin) || istype(target_area, /area/icemoon) || istype(target_area, /area/lavaland)) return FALSE - // SKYRAT EDIT END + // NOVA EDIT END return TRUE @@ -237,7 +237,7 @@ GLOBAL_LIST_EMPTY(objectives) //SKYRAT EDIT ADDITION /datum/objective/assassinate/update_explanation_text() ..() if(target?.current) - explanation_text = "Assassinate [target.name], the [!target_role_type ? target.assigned_role.title : target.special_role] ONCE." //SKYRAT EDIT CHANGE + explanation_text = "Assassinate [target.name], the [!target_role_type ? target.assigned_role.title : target.special_role] ONCE." //NOVA EDIT CHANGE else explanation_text = "Free objective." diff --git a/code/game/gamemodes/objective_items.dm b/code/game/gamemodes/objective_items.dm index 2240f220e48..cdb373f8712 100644 --- a/code/game/gamemodes/objective_items.dm +++ b/code/game/gamemodes/objective_items.dm @@ -312,15 +312,15 @@ /datum/objective_item/steal/hypo //name = "the hypospray" // ORIGINAL - name = "the Chief Medical Officer's hypospray" // SKYRAT EDIT CHANGE + name = "the Chief Medical Officer's hypospray" // NOVA EDIT CHANGE //targetitem = /obj/item/reagent_containers/hypospray/cmo // ORIGINAL - targetitem = /obj/item/hypospray/mkii/cmo // SKYRAT EDIT CHANGE + targetitem = /obj/item/hypospray/mkii/cmo // NOVA EDIT CHANGE excludefromjob = list(JOB_CHIEF_MEDICAL_OFFICER) item_owner = list(JOB_CHIEF_MEDICAL_OFFICER) exists_on_map = TRUE -/obj/item/hypospray/mkii/cmo/add_stealing_item_objective() // SKYRAT EDIT CHANGE - return add_item_to_steal(src, /obj/item/hypospray/mkii/cmo) // SKYRAT EDIT CHANGE +/obj/item/hypospray/mkii/cmo/add_stealing_item_objective() // NOVA EDIT CHANGE + return add_item_to_steal(src, /obj/item/hypospray/mkii/cmo) // NOVA EDIT CHANGE /datum/objective_item/steal/nukedisc name = "the nuclear authentication disk" diff --git a/code/game/machinery/botlaunchpad.dm b/code/game/machinery/botlaunchpad.dm index 5c0ba432d35..0744954257a 100644 --- a/code/game/machinery/botlaunchpad.dm +++ b/code/game/machinery/botlaunchpad.dm @@ -56,7 +56,7 @@ /obj/machinery/botpad/proc/recall(mob/living/user) var/atom/our_bot = launched_bot?.resolve() if(isnull(our_bot)) - user.balloon_alert(user, "no bots detected on the pad!") + user.balloon_alert(user, "no bots sent from the pad!") return user.balloon_alert(user, "bot sent back to pad") if(isbasicbot(our_bot)) diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 860c708ff59..f3008ca4ebc 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -6,7 +6,6 @@ use_power = ACTIVE_POWER_USE active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 0.02 layer = WALL_OBJ_LAYER - plane = GAME_PLANE_UPPER resistance_flags = FIRE_PROOF damage_deflection = 12 armor_type = /datum/armor/machinery_camera @@ -342,7 +341,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/xray, 0) return // OTHER - if(istype(attacking_item, /obj/item/modular_computer/pda)) + if(istype(attacking_item, /obj/item/modular_computer)) var/itemname = "" var/info = "" diff --git a/code/game/machinery/camera/motion.dm b/code/game/machinery/camera/motion.dm index f73a786865c..ec01c2365f8 100644 --- a/code/game/machinery/camera/motion.dm +++ b/code/game/machinery/camera/motion.dm @@ -8,8 +8,7 @@ /obj/machinery/camera/process() // motion camera event loop if(!isMotion()) - . = PROCESS_KILL - return + return PROCESS_KILL if(machine_stat & EMPED) return if (detectTime > 0) diff --git a/code/game/machinery/camera/trackable.dm b/code/game/machinery/camera/trackable.dm index 8aedd1b80a8..884f38f750b 100644 --- a/code/game/machinery/camera/trackable.dm +++ b/code/game/machinery/camera/trackable.dm @@ -26,7 +26,7 @@ tracking_holder = source RegisterSignal(tracking_holder, COMSIG_MOB_RESET_PERSPECTIVE, PROC_REF(cancel_target_tracking)) -/datum/trackable/Destroy(force, ...) +/datum/trackable/Destroy(force) tracking_holder = null tracked_mob = null STOP_PROCESSING(SSprocessing, src) diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm index 54640e6490b..8d3e4b3e661 100644 --- a/code/game/machinery/cell_charger.dm +++ b/code/game/machinery/cell_charger.dm @@ -9,7 +9,7 @@ var/obj/item/stock_parts/cell/charging = null var/charge_rate = 250 -/* OVERWRITTEN IN modular_skyrat\modules\aesthetics\cells\cell.dm +/* OVERWRITTEN IN modular_nova\modules\aesthetics\cells\cell.dm /obj/machinery/cell_charger/update_overlays() . = ..() @@ -54,12 +54,12 @@ if(charging) to_chat(user, span_warning("There is already a cell in the charger!")) return - //SKYRAT EDIT ADDITION + //NOVA EDIT ADDITION var/obj/item/stock_parts/cell/inserting_cell = W if(inserting_cell.chargerate <= 0) to_chat(user, span_warning("[inserting_cell] cannot be recharged!")) return - //SKYRAT EDIT END + //NOVA EDIT END else var/area/a = loc.loc // Gets our locations location, like a dream within a dream if(!isarea(a)) diff --git a/code/game/machinery/computer/_computer.dm b/code/game/machinery/computer/_computer.dm index fd2ee08e181..a9954a71f12 100644 --- a/code/game/machinery/computer/_computer.dm +++ b/code/game/machinery/computer/_computer.dm @@ -135,11 +135,11 @@ /obj/machinery/computer/ui_interact(mob/user, datum/tgui/ui) SHOULD_CALL_PARENT(TRUE) - //SKYRAT EDIT ADDITON BEGIN - AESTHETICS + //NOVA EDIT ADDITON BEGIN - AESTHETICS if(clicksound && world.time > next_clicksound && isliving(user)) next_clicksound = world.time + rand(50, 150) playsound(src, get_sfx_skyrat(clicksound), clickvol) - //SKYRAT EDIT END + //NOVA EDIT END . = ..() update_use_power(ACTIVE_POWER_USE) diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index d5a635a8ac1..0914d91739b 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -195,10 +195,10 @@ var/obj/machinery/new_machine = new circuit.build_path(loc) new_machine.setDir(dir) transfer_fingerprints_to(new_machine) - // SKYRAT EDIT ADDITION BEGIN - Connecting Computers + // NOVA EDIT ADDITION BEGIN - Connecting Computers for(var/obj/machinery/computer/selected in range(1,src)) selected.update_overlays() - // SKYRAT EDIT ADDITION END - Connecting Computers + // NOVA EDIT ADDITION END - Connecting Computers if(istype(new_machine, /obj/machinery/computer)) var/obj/machinery/computer/new_computer = new_machine diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index f32eff91c4e..8574ca15c42 100755 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -5,13 +5,13 @@ #define STATE_CHANGING_STATUS "changing_status" #define STATE_MAIN "main" #define STATE_MESSAGES "messages" -//SKYRAT EDIT ADDITION +//NOVA EDIT ADDITION GLOBAL_VAR_INIT(cops_arrived, FALSE) #define EMERGENCY_RESPONSE_POLICE "WOOP WOOP THAT'S THE SOUND OF THE POLICE" #define EMERGENCY_RESPONSE_ATMOS "DISCO INFERNO" #define EMERGENCY_RESPONSE_EMT "AAAAAUGH, I'M DYING, I NEEEEEEEEEED A MEDIC BAG" #define EMERGENCY_RESPONSE_EMAG "AYO THE PIZZA HERE" -//SKYRAT EDIT END +//NOVA EDIT END // The communications computer /obj/machinery/computer/communications @@ -118,11 +118,11 @@ GLOBAL_VAR_INIT(cops_arrived, FALSE) return TRUE return authenticated -/// Skyrat Edit Start - Are we the AI? +/// NOVA EDIT Start - Are we the AI? /obj/machinery/computer/communications/proc/authenticated_as_ai_or_captain(mob/user) if (isAI(user)) return TRUE - return ACCESS_CAPTAIN in authorize_access //Skyrat Edit End + return ACCESS_CAPTAIN in authorize_access //NOVA EDIT End /obj/machinery/computer/communications/attackby(obj/I, mob/user, params) if(isidcard(I)) @@ -145,7 +145,7 @@ GLOBAL_VAR_INIT(cops_arrived, FALSE) caller_card.use_charge(user) addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(summon_battlecruiser), caller_card.team), rand(20 SECONDS, 1 MINUTES)) playsound(src, 'sound/machines/terminal_alert.ogg', 50, FALSE) - priority_announce("Attention crew: deep-space sensors detect a Syndicate battlecruiser-class signature subspace rift forming near your station. Estimated time until arrival: three to five minutes.", "[command_name()] High-Priority Update") //SKYRAT EDIT ADDITION: announcement on battlecruiser call + priority_announce("Attention crew: deep-space sensors detect a Syndicate battlecruiser-class signature subspace rift forming near your station. Estimated time until arrival: three to five minutes.", "[command_name()] High-Priority Update") //NOVA EDIT ADDITION: announcement on battlecruiser call return TRUE if(obj_flags & EMAGGED) @@ -215,7 +215,7 @@ GLOBAL_VAR_INIT(cops_arrived, FALSE) return var/new_sec_level = SSsecurity_level.text_level_to_number(params["newSecurityLevel"]) - if (new_sec_level < SEC_LEVEL_GREEN || new_sec_level > SEC_LEVEL_AMBER) //SKYRAT EDIT CHANGE - ALERTS + if (new_sec_level < SEC_LEVEL_GREEN || new_sec_level > SEC_LEVEL_AMBER) //NOVA EDIT CHANGE - ALERTS return if (SSsecurity_level.get_current_level_as_number() == new_sec_level) return @@ -243,7 +243,7 @@ GLOBAL_VAR_INIT(cops_arrived, FALSE) return make_announcement(usr) if ("messageAssociates") - if (!authenticated_as_ai_or_captain(usr)) //Skyrat edit | Allows AI and Captain to send messages + if (!authenticated_as_ai_or_captain(usr)) //NOVA EDIT | Allows AI and Captain to send messages return if (!COOLDOWN_FINISHED(src, important_action_cooldown)) return @@ -404,7 +404,7 @@ GLOBAL_VAR_INIT(cops_arrived, FALSE) post_status("alert", "bluealert") if(SEC_LEVEL_GREEN) post_status("alert", "greenalert") - // SKYRAT EDIT ADD START - Alert Levels + // NOVA EDIT ADD START - Alert Levels if(SEC_LEVEL_VIOLET) post_status("alert", "violetalert") if(SEC_LEVEL_ORANGE) @@ -413,7 +413,7 @@ GLOBAL_VAR_INIT(cops_arrived, FALSE) post_status("alert", "amberalert") if(SEC_LEVEL_GAMMA) post_status("alert", "gammaalert") - // SKYRAT EDIT ADD END - Alert Levels + // NOVA EDIT ADD END - Alert Levels else post_status("alert", picture) @@ -482,7 +482,7 @@ GLOBAL_VAR_INIT(cops_arrived, FALSE) SSjob.safe_code_requested = TRUE SSjob.safe_code_timer_id = addtimer(CALLBACK(SSjob, TYPE_PROC_REF(/datum/controller/subsystem/job, send_spare_id_safe_code), pod_location), 120 SECONDS, TIMER_UNIQUE | TIMER_STOPPABLE) minor_announce("Due to staff shortages, your station has been approved for delivery of access codes to secure the Captain's Spare ID. Delivery via drop pod at [get_area(pod_location)]. ETA 120 seconds.") - // SKYRAT EDIT ADDITION START + // NOVA EDIT ADDITION START if ("callThePolice") if(!pre_911_check(usr)) return @@ -521,7 +521,7 @@ GLOBAL_VAR_INIT(cops_arrived, FALSE) toggle_eng_override() usr.log_message("enabled airlock engineering override.", LOG_GAME) deadchat_broadcast(" enabled airlock engineering override at [span_name("[get_area_name(usr, TRUE)]")].", span_name("[usr.real_name]"), usr, message_type = DEADCHAT_ANNOUNCEMENT) - // SKYRAT EDIT ADDITION END + // NOVA EDIT ADDITION END /obj/machinery/computer/communications/proc/emergency_access_cooldown(mob/user) if(toggle_uses == toggle_max_uses) //you have used up free uses already, do it one more time and start a cooldown to_chat(user, span_warning("This was your last free use without cooldown, you will not be able to use this again for [DisplayTimeText(EMERGENCY_ACCESS_COOLDOWN)].")) @@ -552,9 +552,9 @@ GLOBAL_VAR_INIT(cops_arrived, FALSE) if(SScommunications.soft_filtering) payload["is_filtered"] = TRUE - var/name_to_send = "[CONFIG_GET(string/cross_comms_name)]([station_name()])" //SKYRAT EDIT ADDITION + var/name_to_send = "[CONFIG_GET(string/cross_comms_name)]([station_name()])" //NOVA EDIT ADDITION - send2otherserver(html_decode(name_to_send), message, "Comms_Console", destination == "all" ? null : list(destination), additional_data = payload) //SKYRAT EDIT END + send2otherserver(html_decode(name_to_send), message, "Comms_Console", destination == "all" ? null : list(destination), additional_data = payload) //NOVA EDIT END minor_announce(message, title = "Outgoing message to allied station") usr.log_talk(message, LOG_SAY, tag = "message to the other server") message_admins("[ADMIN_LOOKUPFLW(usr)] has sent a message to the other server\[s].") @@ -603,7 +603,7 @@ GLOBAL_VAR_INIT(cops_arrived, FALSE) data["canSendToSectors"] = FALSE data["canSetAlertLevel"] = FALSE data["canToggleEmergencyAccess"] = FALSE - data["canToggleEngineeringOverride"] = FALSE //SKYRAT EDIT - Engineering Override + data["canToggleEngineeringOverride"] = FALSE //NOVA EDIT - Engineering Override data["importantActionReady"] = COOLDOWN_FINISHED(src, important_action_cooldown) data["shuttleCalled"] = FALSE data["shuttleLastCalled"] = FALSE @@ -635,8 +635,8 @@ GLOBAL_VAR_INIT(cops_arrived, FALSE) if (authenticated_as_silicon_or_captain(user)) data["canToggleEmergencyAccess"] = TRUE data["emergencyAccess"] = GLOB.emergency_access - data["canToggleEngineeringOverride"] = TRUE //SKYRAT EDIT - Engineering Override Toggle - data["engineeringOverride"] = GLOB.force_eng_override //SKYRAT EDIT - Engineering Override Toggle + data["canToggleEngineeringOverride"] = TRUE //NOVA EDIT - Engineering Override Toggle + data["engineeringOverride"] = GLOB.force_eng_override //NOVA EDIT - Engineering Override Toggle data["alertLevelTick"] = alert_level_tick data["canMakeAnnouncement"] = TRUE data["canSetAlertLevel"] = issilicon(user) ? "NO_SWIPE_NEEDED" : "SWIPE_NEEDED" @@ -644,7 +644,7 @@ GLOBAL_VAR_INIT(cops_arrived, FALSE) data["canMakeAnnouncement"] = TRUE if (authenticated_as_ai_or_captain(user)) - data["canMessageAssociates"] = TRUE //Skyrat Edit | Allows AI to report to CC in the event of there being no command alive/to begin with + data["canMessageAssociates"] = TRUE //NOVA EDIT | Allows AI to report to CC in the event of there being no command alive/to begin with if (SSshuttle.emergency.mode != SHUTTLE_IDLE && SSshuttle.emergency.mode != SHUTTLE_RECALL) data["shuttleCalled"] = TRUE @@ -931,7 +931,6 @@ GLOBAL_VAR_INIT(cops_arrived, FALSE) hacker.log_message("hacked a communications console, resulting in: [picked_option].", LOG_GAME, log_globally = TRUE) switch(picked_option) if(HACK_PIRATE) // Triggers pirates, which the crew may be able to pay off to prevent - var/datum/game_mode/dynamic/dynamic = SSticker.mode var/list/pirate_rulesets = list( /datum/dynamic_ruleset/midround/pirates, /datum/dynamic_ruleset/midround/dangerous_pirates, @@ -940,7 +939,7 @@ GLOBAL_VAR_INIT(cops_arrived, FALSE) "Attention crew: sector monitoring reports a massive jump-trace from an enemy vessel destined for your system. Prepare for imminent hostile contact.", "[command_name()] High-Priority Update", ) - dynamic.picking_specific_rule(pick(pirate_rulesets), forced = TRUE, ignore_cost = TRUE) + SSdynamic.picking_specific_rule(pick(pirate_rulesets), forced = TRUE, ignore_cost = TRUE) if(HACK_FUGITIVES) // Triggers fugitives, which can cause confusion / chaos as the crew decides which side help priority_announce( @@ -961,22 +960,20 @@ GLOBAL_VAR_INIT(cops_arrived, FALSE) continue shake_camera(crew_member, 15, 1) - var/datum/game_mode/dynamic/dynamic = SSticker.mode - dynamic.unfavorable_situation() + SSdynamic.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/from_living/autotraitor - var/datum/game_mode/dynamic/dynamic = SSticker.mode 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)) - if(!dynamic.picking_specific_rule(sleeper_agent_type, forced = TRUE, ignore_cost = TRUE)) + if(!SSdynamic.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, forced = TRUE, ignore_cost = TRUE) + SSdynamic.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 @@ -1021,9 +1018,9 @@ GLOBAL_VAR_INIT(cops_arrived, FALSE) #undef STATE_MAIN #undef STATE_MESSAGES -//SKYRAT EDIT ADDITION +//NOVA EDIT ADDITION #undef EMERGENCY_RESPONSE_POLICE #undef EMERGENCY_RESPONSE_ATMOS #undef EMERGENCY_RESPONSE_EMT #undef EMERGENCY_RESPONSE_EMAG -//SKYRAT EDIT END +//NOVA EDIT END diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm index bc4a4ecabed..a2b5db099e9 100644 --- a/code/game/machinery/computer/crew.dm +++ b/code/game/machinery/computer/crew.dm @@ -44,7 +44,7 @@ . += create_table_notices(list( "name", "job", - "is_robot", //SKYRAT EDIT ADDITION - Displaying robotic species Icon + "is_robot", //NOVA EDIT ADDITION - Displaying robotic species Icon "life_status", "suffocation", "toxin", @@ -65,7 +65,7 @@ var/list/entry = list() entry["name"] = player_record["name"] entry["job"] = player_record["assignment"] - entry["is_robot"] = player_record["is_robot"] //SKYRAT EDIT ADDITION - Displaying robotic species Icon + entry["is_robot"] = player_record["is_robot"] //NOVA EDIT ADDITION - Displaying robotic species Icon entry["life_status"] = player_record["life_status"] entry["suffocation"] = player_record["oxydam"] entry["toxin"] = player_record["toxdam"] @@ -108,7 +108,7 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new) JOB_SECURITY_OFFICER_SCIENCE = 15, JOB_SECURITY_OFFICER_SUPPLY = 16, */ - JOB_CORRECTIONS_OFFICER = 13, // SKYRAT EDIT ADDITION + JOB_CORRECTIONS_OFFICER = 13, // NOVA EDIT ADDITION JOB_DETECTIVE = 14, // 20-29: Medbay JOB_CHIEF_MEDICAL_OFFICER = 20, @@ -117,25 +117,25 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new) JOB_MEDICAL_DOCTOR = 23, JOB_PARAMEDIC = 24, JOB_CORONER = 25, - JOB_ORDERLY = 26, // SKYRAT EDIT ADDITION - JOB_PSYCHOLOGIST = 27, // SKYRAT EDIT - ORIGINAL: JOB_PSYCHOLOGIST = 71, + JOB_ORDERLY = 26, // NOVA EDIT ADDITION + JOB_PSYCHOLOGIST = 27, // NOVA EDIT - ORIGINAL: JOB_PSYCHOLOGIST = 71, // 30-39: Science JOB_RESEARCH_DIRECTOR = 30, JOB_SCIENTIST = 31, JOB_ROBOTICIST = 32, JOB_GENETICIST = 33, - JOB_SCIENCE_GUARD = 34, // SKYRAT EDIT ADDITION + JOB_SCIENCE_GUARD = 34, // NOVA EDIT ADDITION // 40-49: Engineering JOB_CHIEF_ENGINEER = 40, JOB_STATION_ENGINEER = 41, JOB_ATMOSPHERIC_TECHNICIAN = 42, - JOB_ENGINEERING_GUARD = 43, // SKYRAT EDIT ADDITION + JOB_ENGINEERING_GUARD = 43, // NOVA EDIT ADDITION // 50-59: Cargo JOB_QUARTERMASTER = 50, JOB_SHAFT_MINER = 51, JOB_CARGO_TECHNICIAN = 52, JOB_BITRUNNER = 53, - JOB_CUSTOMS_AGENT = 54, // SKYRAT EDIT ADDITION + JOB_CUSTOMS_AGENT = 54, // NOVA EDIT ADDITION // 60+: Civilian/other JOB_HEAD_OF_PERSONNEL = 60, JOB_BARTENDER = 61, @@ -147,8 +147,8 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new) JOB_MIME = 67, JOB_JANITOR = 68, JOB_LAWYER = 69, - JOB_BARBER = 71, // SKYRAT EDIT ADDITION - JOB_BOUNCER = 72, // SKYRAT EDIT ADDITION + JOB_BARBER = 71, // NOVA EDIT ADDITION + JOB_BOUNCER = 72, // NOVA EDIT ADDITION // 200-239: Centcom JOB_CENTCOM_ADMIRAL = 200, JOB_CENTCOM = 201, @@ -166,8 +166,8 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new) JOB_ERT_CHAPLAIN = 225, JOB_ERT_JANITOR = 226, JOB_ERT_DEATHSQUAD = 227, - JOB_NT_REP = 230, // SKYRAT EDIT ADDITION - JOB_BLUESHIELD = 231, // SKYRAT EDIT ADDITION + JOB_NT_REP = 230, // NOVA EDIT ADDITION + JOB_BLUESHIELD = 231, // NOVA EDIT ADDITION // ANYTHING ELSE = UNKNOWN_JOB_ID, Unknowns/custom jobs will appear after civilians, and before assistants JOB_ASSISTANT = 999, @@ -257,10 +257,10 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new) if (jobs[trim_assignment] != null) entry["ijob"] = jobs[trim_assignment] - // SKYRAT EDIT BEGIN: Checking for robotic race + // NOVA EDIT BEGIN: Checking for robotic race if (issynthetic(tracked_human)) entry["is_robot"] = TRUE - // SKYRAT EDIT END + // NOVA EDIT END // Binary living/dead status // Current status diff --git a/code/game/machinery/computer/dna_console.dm b/code/game/machinery/computer/dna_console.dm index c3510afce73..1fe999010b7 100644 --- a/code/game/machinery/computer/dna_console.dm +++ b/code/game/machinery/computer/dna_console.dm @@ -710,11 +710,11 @@ var/datum/mutation/human/matched_mutation = null //Go through all sequences for matching gene, and set the mutation for (var/M in subtypesof(/datum/mutation/human)) - // SKYRAT EDIT ADDITION + // NOVA EDIT ADDITION var/datum/mutation/human/iterating_mutation = M if(initial(iterating_mutation.disabled)) continue - // SKYRAT EDIT END + // NOVA EDIT END var/true_sequence = GET_SEQUENCE(M) if (new_sequence == true_sequence) matched_mutation = M diff --git a/code/game/machinery/computer/orders/order_computer/mining_order.dm b/code/game/machinery/computer/orders/order_computer/mining_order.dm index 2ba9e00d9f5..75a5c980dfe 100644 --- a/code/game/machinery/computer/orders/order_computer/mining_order.dm +++ b/code/game/machinery/computer/orders/order_computer/mining_order.dm @@ -71,11 +71,11 @@ if(istype(weapon, /obj/item/mining_voucher)) redeem_voucher(weapon, user) return - //SKYRAT EDIT ADDITON BEGIN - SEVA + //NOVA EDIT ADDITON BEGIN - SEVA if(istype(weapon, /obj/item/suit_voucher)) redeem_suit_voucher(weapon, user) return - //SKYRAT EDIT ADDITON END + //NOVA EDIT ADDITON END return ..() /obj/machinery/computer/order_console/mining/update_icon_state() diff --git a/code/game/machinery/computer/orders/order_items/order_datum.dm b/code/game/machinery/computer/orders/order_items/order_datum.dm index e7bb3c35e56..13684fc742b 100644 --- a/code/game/machinery/computer/orders/order_items/order_datum.dm +++ b/code/game/machinery/computer/orders/order_items/order_datum.dm @@ -22,7 +22,7 @@ if(!desc) desc = initial(item_path.desc) -/datum/orderable_item/Destroy(force, ...) +/datum/orderable_item/Destroy(force) if(item_path) qdel(item_path) return ..() diff --git a/code/game/machinery/computer/records/medical.dm b/code/game/machinery/computer/records/medical.dm index 3b80f80888b..71eab88c113 100644 --- a/code/game/machinery/computer/records/medical.dm +++ b/code/game/machinery/computer/records/medical.dm @@ -65,10 +65,10 @@ quirk_notes = target.quirk_notes, rank = target.rank, species = target.species, - // SKYRAT EDIT ADDITION START - Expanded records! + // NOVA EDIT ADDITION START - Expanded records! past_medical_records = target.past_medical_records, past_general_records = target.past_general_records, - // SKYRAT EDIT END + // NOVA EDIT END )) data["records"] = records diff --git a/code/game/machinery/computer/records/security.dm b/code/game/machinery/computer/records/security.dm index 53a7ff9dc11..e30814f231a 100644 --- a/code/game/machinery/computer/records/security.dm +++ b/code/game/machinery/computer/records/security.dm @@ -129,10 +129,10 @@ rank = target.rank, species = target.species, wanted_status = target.wanted_status, - // SKYRAT EDIT ADDITION - RP Records + // NOVA EDIT ADDITION - RP Records past_general_records = target.past_general_records, past_security_records = target.past_security_records, - // SKYRAT EDIT END + // NOVA EDIT END )) data["records"] = records @@ -354,12 +354,12 @@ printable = wanted_poster if("rapsheet") - /// SKYRAT EDIT REMOVE - REMOVE CRIMES REQUIREMENT FOR PRINTING RECORDS + /// NOVA EDIT REMOVE - REMOVE CRIMES REQUIREMENT FOR PRINTING RECORDS //var/list/crimes = target.crimes //if(!length(crimes)) //balloon_alert(user, "no crimes") //return FALSE - /// SKYRAT EDIT REMOVE END + /// NOVA EDIT REMOVE END var/obj/item/paper/rapsheet = target.get_rapsheet(input_alias, input_header, input_description) printable = rapsheet diff --git a/code/game/machinery/computer/station_alert.dm b/code/game/machinery/computer/station_alert.dm index 53fda80f4fa..54f461948bf 100644 --- a/code/game/machinery/computer/station_alert.dm +++ b/code/game/machinery/computer/station_alert.dm @@ -31,7 +31,7 @@ . = ..() if(machine_stat & (NOPOWER|BROKEN)) return - if(length(alert_control?.listener.alarms)) /// SKYRAT EDIT - Fixing master - Original: if(length(alert_control.listener.alarms)) + if(length(alert_control?.listener.alarms)) /// NOVA EDIT - Fixing master - Original: if(length(alert_control.listener.alarms)) . += "alert:2" /** diff --git a/code/game/machinery/dance_machine.dm b/code/game/machinery/dance_machine.dm index de60d84dafd..66be2dc2450 100644 --- a/code/game/machinery/dance_machine.dm +++ b/code/game/machinery/dance_machine.dm @@ -1,4 +1,4 @@ -/* SKYRAT EDIT REMOVAL BEGIN - JUKEBOX - MOVED TO 'modular_skyrat/modules/jukebox/code/dance_machine.dm' +/* NOVA EDIT REMOVAL BEGIN - JUKEBOX - MOVED TO 'modular_nova/modules/jukebox/code/dance_machine.dm' /// Helper macro to check if the passed mob has jukebox sound preference enabled #define HAS_JUKEBOX_PREF(mob) (!QDELETED(mob) && !isnull(mob.client) && mob.client.prefs.read_preference(/datum/preference/toggle/sound_jukebox)) @@ -523,4 +523,4 @@ dance(to_dance) #undef HAS_JUKEBOX_PREF -*/ //SKYRAT EDIT REMOVAL END +*/ //NOVA EDIT REMOVAL END diff --git a/code/game/machinery/dish_drive.dm b/code/game/machinery/dish_drive.dm index 1cd8b3c7bf0..2d74abf1d99 100644 --- a/code/game/machinery/dish_drive.dm +++ b/code/game/machinery/dish_drive.dm @@ -10,7 +10,7 @@ circuit = /obj/item/circuitboard/machine/dish_drive pass_flags = PASSTABLE /// List of dishes the drive can hold - var/list/collectable_items = list(/obj/item/trash/waffles, // SKYRAT EDIT CHANGE - non-static list + var/list/collectable_items = list(/obj/item/trash/waffles, // NOVA EDIT CHANGE - non-static list /obj/item/trash/waffles, /obj/item/broken_bottle, /obj/item/kitchen/fork, @@ -37,7 +37,7 @@ var/list/dish_drive_contents /// Distance this is capable of sucking dishes up over. (2 + servo tier) var/suck_distance = 0 - var/binrange = 7 //SKYRAT EDIT ADDITION - SEC_HAUL + var/binrange = 7 //NOVA EDIT ADDITION - SEC_HAUL COOLDOWN_DECLARE(time_since_dishes) @@ -152,7 +152,7 @@ if(manual) visible_message(span_notice("[src] is empty!")) return - var/obj/machinery/disposal/bin/bin = locate() in view(binrange, src) //SKYRAT EDIT CHANGE + var/obj/machinery/disposal/bin/bin = locate() in view(binrange, src) //NOVA EDIT CHANGE if(!bin) if(manual) visible_message(span_warning("[src] buzzes. There are no disposal bins in range!")) diff --git a/code/game/machinery/dna_infuser/organ_sets/fly_organs.dm b/code/game/machinery/dna_infuser/organ_sets/fly_organs.dm index e7551394131..8330bbe2f0c 100644 --- a/code/game/machinery/dna_infuser/organ_sets/fly_organs.dm +++ b/code/game/machinery/dna_infuser/organ_sets/fly_organs.dm @@ -52,7 +52,7 @@ message = fly_buZZ.Replace(message, "ZZZ") message = replacetext(message, "s", "z") message = replacetext(message, "S", "Z") -//SKYRAT EDIT START: Adding russian version to autohiss +//NOVA EDIT START: Adding russian version to autohiss if(CONFIG_GET(flag/russian_text_formation)) var/static/regex/fly_buzz_ru = new("з+", "g") var/static/regex/fly_buZZ_ru = new("З+", "g") @@ -60,7 +60,7 @@ message = fly_buZZ_ru.Replace(message, "ЗЗЗ") message = replacetext(message, "с", "з") message = replacetext(message, "С", "З") -//SKYRAT EDIT END: Adding russian version to autohiss +//NOVA EDIT END: Adding russian version to autohiss speech_args[SPEECH_MESSAGE] = message /obj/item/organ/internal/tongue/fly/Initialize(mapload) diff --git a/code/game/machinery/dna_infuser/organ_sets/fox_organs.dm b/code/game/machinery/dna_infuser/organ_sets/fox_organs.dm index 57a26d36842..cb5347c8a51 100644 --- a/code/game/machinery/dna_infuser/organ_sets/fox_organs.dm +++ b/code/game/machinery/dna_infuser/organ_sets/fox_organs.dm @@ -6,7 +6,7 @@ visual = TRUE damage_multiplier = 2 -//SKYRAT EDIT REMOVAL BEGIN - CUSTOMIZATION +//NOVA EDIT REMOVAL BEGIN - CUSTOMIZATION /* /obj/item/organ/internal/ears/fox/on_insert(mob/living/carbon/human/ear_owner) . = ..() @@ -23,4 +23,4 @@ ear_owner.dna.species.mutant_bodyparts -= "ears" ear_owner.update_body() */ -//SKYRAT EDIT REMOVAL END +//NOVA EDIT REMOVAL END diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 509e3347f84..981db3e064c 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -22,20 +22,20 @@ /// Someone, for the love of god, profile this. Is there a reason to cache mutable_appearance /// if so, why are we JUST doing the airlocks when we can put this in mutable_appearance.dm for /// everything -/proc/get_airlock_overlay(icon_state, icon_file, atom/offset_spokesman, em_block, state_color = null) // SKYRAT EDIT - Airlock accent greyscale color support - Added `state_color = null` +/proc/get_airlock_overlay(icon_state, icon_file, atom/offset_spokesman, em_block, state_color = null) // NOVA EDIT - Airlock accent greyscale color support - Added `state_color = null` var/static/list/airlock_overlays = list() - var/base_icon_key = "[icon_state][REF(icon_file)][state_color]" // SKYRAT EDIT - Airlock accent greyscale color support - ORIGINAL: var/base_icon_key = "[icon_state][REF(icon_file)]" + var/base_icon_key = "[icon_state][REF(icon_file)][state_color]" // NOVA EDIT - Airlock accent greyscale color support - ORIGINAL: var/base_icon_key = "[icon_state][REF(icon_file)]" if(!(. = airlock_overlays[base_icon_key])) - /* SKYRAT EDIT - Airlock accent greyscale color support - ORIGINAL: + /* NOVA EDIT - Airlock accent greyscale color support - ORIGINAL: . = airlock_overlays[base_icon_key] = mutable_appearance(icon_file, icon_state) - */ // SKYRAT EDIT START + */ // NOVA EDIT START var/mutable_appearance/airlock_overlay = mutable_appearance(icon_file, icon_state) if(state_color) airlock_overlay.color = state_color . = airlock_overlays[base_icon_key] = airlock_overlay - // SKYRAT EDIT END + // NOVA EDIT END if(isnull(em_block)) return @@ -54,7 +54,7 @@ // "Would this be better with a global var" // Wires for the airlock are located in the datum folder, inside the wires datum folder. -// SKYRAT EDIT REMOVAL START - moved to code/__DEFINES/~skyrat_defines/airlock.dm +// NOVA EDIT REMOVAL START - moved to code/__DEFINES/~skyrat_defines/airlock.dm /* #define AIRLOCK_FRAME_CLOSED "closed" #define AIRLOCK_FRAME_CLOSING "closing" @@ -82,7 +82,7 @@ #define DOOR_VISION_DISTANCE 11 ///The maximum distance a door will see out to */ -// SKYRAT EDIT REMOVAL END - moved to code/__DEFINES/~skyrat_defines/airlock.dm +// NOVA EDIT REMOVAL END - moved to code/__DEFINES/~skyrat_defines/airlock.dm /obj/machinery/door/airlock name = "Airlock" @@ -526,7 +526,7 @@ if(AIRLOCK_DENY, AIRLOCK_OPENING, AIRLOCK_CLOSING, AIRLOCK_EMAG) icon_state = "nonexistenticonstate" //MADNESS -/* SKYRAT EDIT MOVED TO AIRLOCK.DM IN AESTHETICS MODULE +/* NOVA EDIT MOVED TO AIRLOCK.DM IN AESTHETICS MODULE /obj/machinery/door/airlock/update_overlays() . = ..() @@ -817,7 +817,7 @@ if(!istype(H.head, /obj/item/clothing/head/helmet)) H.visible_message(span_danger("[user] headbutts the airlock."), \ span_userdanger("You headbutt the airlock!")) - //H.Paralyze(100) - SKYRAT EDIT REMOVAL - COMBAT + //H.Paralyze(100) - NOVA EDIT REMOVAL - COMBAT H.StaminaKnockdown(10, TRUE, TRUE) H.apply_damage(10, BRUTE, BODY_ZONE_HEAD) else @@ -1284,7 +1284,7 @@ if(BYPASS_DOOR_CHECKS) // No power usage, special sound, get it open. //playsound(src, 'sound/machines/airlockforced.ogg', 30, TRUE) - ORIGINAL - playsound(src, forcedOpen, 30, TRUE) //SKYRAT EDIT CHANGE - AESTHETICS + playsound(src, forcedOpen, 30, TRUE) //NOVA EDIT CHANGE - AESTHETICS return TRUE else @@ -2041,7 +2041,6 @@ if(prob(50)) radiate() last_event = world.time - ..() /obj/machinery/door/airlock/uranium/proc/radiate() radiation_pulse( @@ -2482,7 +2481,7 @@ set_density(TRUE) operating = FALSE return TRUE -// SKYRAT EDIT REMOVAL START - moved to code/__DEFINES/~skyrat_defines/airlock.dm +// NOVA EDIT REMOVAL START - moved to code/__DEFINES/~skyrat_defines/airlock.dm /* #undef AIRLOCK_SECURITY_NONE #undef AIRLOCK_SECURITY_IRON @@ -2509,4 +2508,4 @@ #undef AIRLOCK_FRAME_OPEN #undef AIRLOCK_FRAME_OPENING */ -// SKYRAT EDIT REMOVAL END - moved to code/__DEFINES/~skyrat_defines/airlock.dm +// NOVA EDIT REMOVAL END - moved to code/__DEFINES/~skyrat_defines/airlock.dm diff --git a/code/game/machinery/doors/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm index 60a536c6038..2dfff746d37 100644 --- a/code/game/machinery/doors/brigdoors.dm +++ b/code/game/machinery/doors/brigdoors.dm @@ -1,11 +1,11 @@ //#define MAX_TIMER (15 MINUTES) //ORIGINAL -#define MAX_TIMER (60 MINUTES) //SKYRAT EDIT CHANGE +#define MAX_TIMER (60 MINUTES) //NOVA EDIT CHANGE //#define PRESET_SHORT (2 MINUTES) //ORIGINAL -#define PRESET_SHORT (5 MINUTES) //SKYRAT EDIT CHANGE +#define PRESET_SHORT (5 MINUTES) //NOVA EDIT CHANGE //#define PRESET_MEDIUM (3 MINUTES) //ORIGINAL -#define PRESET_MEDIUM (10 MINUTES) //SKYRAT EDIT CHANGE +#define PRESET_MEDIUM (10 MINUTES) //NOVA EDIT CHANGE //#define PRESET_LONG (5 MINUTES) //ORIGINAL -#define PRESET_LONG (15 MINUTES) //SKYRAT EDIT CHANGE +#define PRESET_LONG (15 MINUTES) //NOVA EDIT CHANGE /** * Brig Door control displays. @@ -72,7 +72,7 @@ if(!timing) return PROCESS_KILL - if(REALTIMEOFDAY - activation_time >= timer_duration) // SKYRAT EDIT CHANGE: original was world.time + if(REALTIMEOFDAY - activation_time >= timer_duration) // NOVA EDIT CHANGE: original was world.time timer_end() // open doors, reset timer, clear status screen update_content() @@ -98,7 +98,7 @@ if(machine_stat & (NOPOWER|BROKEN)) return 0 - activation_time = REALTIMEOFDAY // SKYRAT EDIT CHANGE: original was world.time + activation_time = REALTIMEOFDAY // NOVA EDIT CHANGE: original was world.time timing = TRUE begin_processing() @@ -171,7 +171,7 @@ * * seconds - return time in seconds it TRUE, else deciseconds. */ /obj/machinery/status_display/door_timer/proc/time_left(seconds = FALSE) - . = max(0, timer_duration - (activation_time ? REALTIMEOFDAY - activation_time : 0)) // SKYRAT EDIT CHANGE: original was world.time + . = max(0, timer_duration - (activation_time ? REALTIMEOFDAY - activation_time : 0)) // NOVA EDIT CHANGE: original was world.time if(seconds) . /= 10 @@ -263,7 +263,7 @@ user.investigate_log("set cell [id]'s timer to [preset_time/10] seconds", INVESTIGATE_RECORDS) user.log_message("set cell [id]'s timer to [preset_time/10] seconds", LOG_ATTACK) if(timing) - activation_time = REALTIMEOFDAY // SKYRAT EDIT CHANGE: original was world.time + activation_time = REALTIMEOFDAY // NOVA EDIT CHANGE: original was world.time else . = FALSE diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index db09a0db560..136de1ffd14 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -1,4 +1,4 @@ -// #define DOOR_CLOSE_WAIT 60 ///Default wait until doors autoclose // SKYRAT EDIT REMOVAL - moved to code/__DEFINES/~skyrat_defines/airlock.dm +// #define DOOR_CLOSE_WAIT 60 ///Default wait until doors autoclose // NOVA EDIT REMOVAL - moved to code/__DEFINES/~skyrat_defines/airlock.dm /obj/machinery/door name = "door" desc = "It opens and closes." @@ -381,12 +381,12 @@ if(glass) playsound(loc, 'sound/effects/glasshit.ogg', 90, TRUE) else if(damage_amount) - //SKYRAT EDIT ADDITION - CREDITS TO WHITEDREAM(valtos) - playsound(src, pick('modular_skyrat/master_files/sound/effects/metalblock1.wav', 'modular_skyrat/master_files/sound/effects/metalblock2.wav', \ - 'modular_skyrat/master_files/sound/effects/metalblock3.wav', 'modular_skyrat/master_files/sound/effects/metalblock4.wav', \ - 'modular_skyrat/master_files/sound/effects/metalblock5.wav', 'modular_skyrat/master_files/sound/effects/metalblock6.wav', \ - 'modular_skyrat/master_files/sound/effects/metalblock7.wav', 'modular_skyrat/master_files/sound/effects/metalblock8.wav'), 50, TRUE) - //SKYRAT EDIT END + //NOVA EDIT ADDITION - CREDITS TO WHITEDREAM(valtos) + playsound(src, pick('modular_nova/master_files/sound/effects/metalblock1.wav', 'modular_nova/master_files/sound/effects/metalblock2.wav', \ + 'modular_nova/master_files/sound/effects/metalblock3.wav', 'modular_nova/master_files/sound/effects/metalblock4.wav', \ + 'modular_nova/master_files/sound/effects/metalblock5.wav', 'modular_nova/master_files/sound/effects/metalblock6.wav', \ + 'modular_nova/master_files/sound/effects/metalblock7.wav', 'modular_nova/master_files/sound/effects/metalblock8.wav'), 50, TRUE) + //NOVA EDIT END else playsound(src, 'sound/weapons/tap.ogg', 50, TRUE) if(BURN) @@ -508,11 +508,11 @@ else if(ismonkey(future_pancake)) //For monkeys future_pancake.emote("screech") future_pancake.adjustBruteLoss(DOOR_CRUSH_DAMAGE) - future_pancake.StaminaKnockdown(20, TRUE, TRUE) // SKYRAT EDIT CHANGE - AIRLOCKS - ORIGINAL: future_pancake.Paralyze(100) + future_pancake.StaminaKnockdown(20, TRUE, TRUE) // NOVA EDIT CHANGE - AIRLOCKS - ORIGINAL: future_pancake.Paralyze(100) else if(ishuman(future_pancake)) //For humans future_pancake.adjustBruteLoss(DOOR_CRUSH_DAMAGE) future_pancake.emote("scream") - future_pancake.StaminaKnockdown(20, TRUE, TRUE) // SKYRAT EDIT CHANGE - AIRLOCKS - ORIGINAL: future_pancake.Paralyze(100) + future_pancake.StaminaKnockdown(20, TRUE, TRUE) // NOVA EDIT CHANGE - AIRLOCKS - ORIGINAL: future_pancake.Paralyze(100) else //for simple_animals & borgs future_pancake.adjustBruteLoss(DOOR_CRUSH_DAMAGE) var/turf/location = get_turf(src) @@ -599,4 +599,4 @@ return ..() return ..(0) -// #undef DOOR_CLOSE_WAIT // SKYRAT EDIT REMOVAL - moved to code/__DEFINES/~skyrat_defines/airlock.dm +// #undef DOOR_CLOSE_WAIT // NOVA EDIT REMOVAL - moved to code/__DEFINES/~skyrat_defines/airlock.dm diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 3c64e8ec07c..8c6e5174a28 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -273,10 +273,10 @@ /obj/machinery/door/firedoor/proc/check_atmos(turf/checked_turf) var/datum/gas_mixture/environment = checked_turf.return_air() - var/pressure = environment?.return_pressure() //SKYRAT EDIT ADDITION - Micro optimisation - if(environment?.temperature >= BODYTEMP_HEAT_DAMAGE_LIMIT || pressure > WARNING_HIGH_PRESSURE) //SKYRAT EDIT CHANGE - BETTER LOCKS + var/pressure = environment?.return_pressure() //NOVA EDIT ADDITION - Micro optimisation + if(environment?.temperature >= BODYTEMP_HEAT_DAMAGE_LIMIT || pressure > WARNING_HIGH_PRESSURE) //NOVA EDIT CHANGE - BETTER LOCKS return FIRELOCK_ALARM_TYPE_HOT - if(environment?.temperature <= BODYTEMP_COLD_DAMAGE_LIMIT || pressure < WARNING_LOW_PRESSURE) //SKYRAT EDIT CHANGE - BETTER LOCKS + if(environment?.temperature <= BODYTEMP_COLD_DAMAGE_LIMIT || pressure < WARNING_LOW_PRESSURE) //NOVA EDIT CHANGE - BETTER LOCKS return FIRELOCK_ALARM_TYPE_COLD return @@ -746,7 +746,7 @@ /obj/machinery/door/firedoor/heavy name = "heavy firelock" - icon = 'icons/obj/doors/Doorfire.dmi' //SKYRAT EDIT - ICON OVERRIDEN IN AESTHETICS MODULE + icon = 'icons/obj/doors/Doorfire.dmi' //NOVA EDIT - ICON OVERRIDEN IN AESTHETICS MODULE glass = FALSE explosion_block = 2 assemblytype = /obj/structure/firelock_frame/heavy @@ -761,7 +761,7 @@ /obj/structure/firelock_frame name = "firelock frame" desc = "A partially completed firelock." - icon = 'icons/obj/doors/Doorfire.dmi' //SKYRAT EDIT - ICON OVERRIDEN IN AESTHETICS MODULE + icon = 'icons/obj/doors/Doorfire.dmi' //NOVA EDIT - ICON OVERRIDEN IN AESTHETICS MODULE icon_state = "frame1" base_icon_state = "frame" anchored = FALSE diff --git a/code/game/machinery/droneDispenser.dm b/code/game/machinery/droneDispenser.dm index 3b78d6bb0b1..1d428e7547e 100644 --- a/code/game/machinery/droneDispenser.dm +++ b/code/game/machinery/droneDispenser.dm @@ -56,8 +56,8 @@ /datum/component/material_container, \ list(/datum/material/iron, /datum/material/glass), \ SHEET_MATERIAL_AMOUNT * MAX_STACK_SIZE * 2, \ - MATCONTAINER_EXAMINE|BREAKDOWN_FLAGS_DRONE_DISPENSER, \ - allowed_items=/obj/item/stack \ + MATCONTAINER_EXAMINE, \ + allowed_items = /obj/item/stack \ ) materials.insert_amount_mat(starting_amount) materials.precise_insertion = TRUE @@ -152,7 +152,6 @@ . += span_warning("[recharging_text]") /obj/machinery/drone_dispenser/process() - ..() if((machine_stat & (NOPOWER|BROKEN)) || !anchored) return diff --git a/code/game/machinery/embedded_controller/access_controller.dm b/code/game/machinery/embedded_controller/access_controller.dm index 1e2287a0492..1fc7c41e2e9 100644 --- a/code/game/machinery/embedded_controller/access_controller.dm +++ b/code/game/machinery/embedded_controller/access_controller.dm @@ -39,7 +39,7 @@ /obj/machinery/door_buttons/access_button - icon = 'icons/obj/machines/wallmounts.dmi' // SKYRAT EDIT CHANGE - ICON OVERRIDEN BY AESTHETICS - SEE MODULE + icon = 'icons/obj/machines/wallmounts.dmi' // NOVA EDIT CHANGE - ICON OVERRIDEN BY AESTHETICS - SEE MODULE icon_state = "access_button_standby" base_icon_state = "access_button" name = "access button" diff --git a/code/game/machinery/embedded_controller/airlock_controller.dm b/code/game/machinery/embedded_controller/airlock_controller.dm index e16e9f61c24..0e5e7701696 100644 --- a/code/game/machinery/embedded_controller/airlock_controller.dm +++ b/code/game/machinery/embedded_controller/airlock_controller.dm @@ -6,7 +6,7 @@ #define AIRLOCK_STATE_OUTOPEN "outopen" /obj/machinery/airlock_controller - icon = 'icons/obj/machines/wallmounts.dmi' // SKYRAT EDIT CHANGE - ICON OVERRIDEN BY AESTHETICS - SEE MODULE + icon = 'icons/obj/machines/wallmounts.dmi' // NOVA EDIT CHANGE - ICON OVERRIDEN BY AESTHETICS - SEE MODULE icon_state = "airlock_control_standby" base_icon_state = "airlock_control" diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm index b3b1615aded..cef15f43caa 100644 --- a/code/game/machinery/firealarm.dm +++ b/code/game/machinery/firealarm.dm @@ -187,7 +187,7 @@ set_light(l_color = LIGHT_COLOR_FLARE) if(SEC_LEVEL_DELTA) set_light(l_color = LIGHT_COLOR_INTENSE_RED) - //SKYRAT EDIT ADDITION BEGIN - ADDITIONAL ALERT LEVELS + //NOVA EDIT ADDITION BEGIN - ADDITIONAL ALERT LEVELS if(SEC_LEVEL_VIOLET) set_light(l_color = COLOR_VIOLET) if(SEC_LEVEL_ORANGE) @@ -196,7 +196,7 @@ set_light(l_color = LIGHT_COLOR_DIM_YELLOW) if(SEC_LEVEL_GAMMA) set_light(l_color = COLOR_ASSEMBLY_PURPLE) - //SKYRAT EDIT ADDITION END + //NOVA EDIT ADDITION END else . += mutable_appearance(icon, "fire_offstation") . += emissive_appearance(icon, "fire_level_e", src, alpha = src.alpha) diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index bc0d480af64..11726392619 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -548,15 +548,15 @@ Possible to do for anyone motivated enough: if(AI) AI.eyeobj.setLoc(get_turf(src)) //ensure the AI camera moves to the holopad - hologram.Impersonation = AI //SKYRAT EDIT -- ADDITION -- Customization; puts the AI core as the impersonated mob so that the examine proc can be redirected + hologram.Impersonation = AI //NOVA EDIT -- ADDITION -- Customization; puts the AI core as the impersonated mob so that the examine proc can be redirected else //make it like real life hologram.Impersonation = user - //Hologram.mouse_opacity = MOUSE_OPACITY_TRANSPARENT//So you can't click on it. //SKYRAT EDIT -- Customization; Making holograms clickable/examinable + //Hologram.mouse_opacity = MOUSE_OPACITY_TRANSPARENT//So you can't click on it. //NOVA EDIT -- Customization; Making holograms clickable/examinable hologram.layer = FLY_LAYER //Above all the other objects/mobs. Or the vast majority of them. SET_PLANE_EXPLICIT(hologram, ABOVE_GAME_PLANE, src) hologram.set_anchored(TRUE)//So space wind cannot drag it. //hologram.name = "[user.name] (Hologram)"//If someone decides to right click. // ORIGINAL - hologram.name = user.name //SKYRAT EDIT -- Make the name exact, so that the double-emotes are less jarring in the chat + hologram.name = user.name //NOVA EDIT -- Make the name exact, so that the double-emotes are less jarring in the chat set_holo(user, hologram) set_holo(user, hologram) diff --git a/code/game/machinery/lightswitch.dm b/code/game/machinery/lightswitch.dm index 238f0db3f19..0f34a498658 100644 --- a/code/game/machinery/lightswitch.dm +++ b/code/game/machinery/lightswitch.dm @@ -1,7 +1,7 @@ /// The light switch. Can have multiple per area. /obj/machinery/light_switch name = "light switch" - icon = 'icons/obj/machines/wallmounts.dmi' //SKYRAT EDIT CHANGE - ICON OVERRIDEN IN SKYRAT AESTHETICS - SEE MODULE + icon = 'icons/obj/machines/wallmounts.dmi' //NOVA EDIT CHANGE - ICON OVERRIDEN IN SKYRAT AESTHETICS - SEE MODULE icon_state = "light-nopower" base_icon_state = "light" desc = "Make dark." diff --git a/code/game/machinery/medical_kiosk.dm b/code/game/machinery/medical_kiosk.dm index 12562c428ad..3b12e38a527 100644 --- a/code/game/machinery/medical_kiosk.dm +++ b/code/game/machinery/medical_kiosk.dm @@ -262,10 +262,10 @@ var/list/trauma_text = list() for(var/t in patient.get_traumas()) var/datum/brain_trauma/trauma = t - //SKYRAT EDIT: Scary Traits (Bimbo) + //NOVA EDIT: Scary Traits (Bimbo) if(!trauma.display_scanner) continue - //SKYRAT EDIT: Scary Traits (Bimbo) + //NOVA EDIT: Scary Traits (Bimbo) var/trauma_desc = "" switch(trauma.resilience) if(TRAUMA_RESILIENCE_SURGERY) diff --git a/code/game/machinery/medipen_refiller.dm b/code/game/machinery/medipen_refiller.dm index b56e35b2389..5563000183c 100644 --- a/code/game/machinery/medipen_refiller.dm +++ b/code/game/machinery/medipen_refiller.dm @@ -76,7 +76,7 @@ return add_overlay("active") if(do_after(user, 2 SECONDS, src)) - medipen.reagents.maximum_volume = initial(medipen.reagents.maximum_volume) + medipen.used_up = FALSE medipen.add_initial_reagents() reagents.remove_reagent(allowed_pens[medipen.type], 10) balloon_alert(user, "refilled") diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index 11f4bb1dd55..6d272de65b3 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -133,6 +133,8 @@ DEFINE_BITFIELD(turret_flags, list( if(!has_cover) INVOKE_ASYNC(src, PROC_REF(popUp)) + AddElement(/datum/element/hostile_machine) + /obj/machinery/porta_turret/proc/toggle_on(set_to) var/current = on if (!isnull(set_to)) diff --git a/code/game/machinery/quantum_pad.dm b/code/game/machinery/quantum_pad.dm index 037b4692fc7..84597b29c50 100644 --- a/code/game/machinery/quantum_pad.dm +++ b/code/game/machinery/quantum_pad.dm @@ -103,12 +103,12 @@ if(!map_pad_link_id || !initMappedLink()) to_chat(user, span_warning("Target pad not found!")) return - //SKYRAT EDIT ADDITION + //NOVA EDIT ADDITION var/turf/my_turf = get_turf(src) if(is_away_level(my_turf.z)) to_chat(user, "[src] cannot be used here!") return - //SKYRAT EDIT END + //NOVA EDIT END if(world.time < last_teleport + teleport_cooldown) to_chat(user, span_warning("[src] is recharging power. Please wait [DisplayTimeText(last_teleport + teleport_cooldown - world.time)].")) diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index 1a20bf90e18..f9747843d57 100755 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -13,8 +13,8 @@ var/finished_recharging = FALSE var/static/list/allowed_devices = typecacheof(list( - /obj/item/stock_parts/cell/microfusion, //SKYRAT EDIT ADDITION - /obj/item/gun/microfusion, // SKYRAT EDIT ADDITION + /obj/item/stock_parts/cell/microfusion, //NOVA EDIT ADDITION + /obj/item/gun/microfusion, // NOVA EDIT ADDITION /obj/item/gun/energy, /obj/item/melee/baton/security, /obj/item/ammo_box/magazine/recharge, @@ -100,7 +100,7 @@ to_chat(user, span_notice("Your gun has no external power connector.")) return TRUE - //SKYRAT EDIT ADDITION + //NOVA EDIT ADDITION if (istype(attacking_item, /obj/item/gun/microfusion)) var/obj/item/gun/microfusion/microfusion_gun = attacking_item if(microfusion_gun.cell?.chargerate <= 0) @@ -112,7 +112,7 @@ if(inserting_cell.chargerate <= 0) to_chat(user, span_notice("[inserting_cell] cannot be recharged!")) return TRUE - //SKYRAT EDIT END + //NOVA EDIT END user.transferItemToLoc(attacking_item, src) return TRUE diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm index a17d9b845b0..f2f5b1b0fec 100644 --- a/code/game/machinery/recycler.dm +++ b/code/game/machinery/recycler.dm @@ -32,12 +32,18 @@ /datum/material/titanium, /datum/material/bluespace ) - materials = AddComponent(/datum/component/material_container, allowed_materials, INFINITY, MATCONTAINER_NO_INSERT|BREAKDOWN_FLAGS_RECYCLER) + materials = AddComponent( + /datum/component/material_container, \ + allowed_materials, \ + INFINITY, \ + MATCONTAINER_NO_INSERT \ + ) AddComponent(/datum/component/simple_rotation) - AddComponent(/datum/component/butchering/recycler, \ - speed = 0.1 SECONDS, \ - effectiveness = amount_produced, \ - bonus_modifier = amount_produced/5, \ + AddComponent( + /datum/component/butchering/recycler, \ + speed = 0.1 SECONDS, \ + effectiveness = amount_produced, \ + bonus_modifier = amount_produced / 5, \ ) . = ..() return INITIALIZE_HINT_LATELOAD @@ -193,7 +199,7 @@ new wood.plank_type(loc, 1 + seed_modifier) . = TRUE else - var/retrieved = materials.insert_item(weapon, multiplier = (amount_produced / 100), breakdown_flags = BREAKDOWN_FLAGS_RECYCLER) + var/retrieved = materials.insert_item(weapon, multiplier = (amount_produced / 100)) if(retrieved > 0) //item was salvaged i.e. deleted materials.retrieve_all() return TRUE diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm index ea02d1ab78e..1d0f00517dd 100644 --- a/code/game/machinery/requests_console.dm +++ b/code/game/machinery/requests_console.dm @@ -200,7 +200,7 @@ GLOBAL_LIST_EMPTY(req_console_ckey_departments) var/mob/living/L = usr message = L.treat_message(message)["message"] - minor_announce(message, "[department] Announcement:", html_encode = FALSE, sound_override = ANNOUNCER_DEPARTMENTAL) // SKYRAT EDIT CHANGE - Announcer Sounds + minor_announce(message, "[department] Announcement:", html_encode = FALSE, sound_override = ANNOUNCER_DEPARTMENTAL) // NOVA EDIT CHANGE - Announcer Sounds GLOB.news_network.submit_article(message, department, "Station Announcements", null) usr.log_talk(message, LOG_SAY, tag="station announcement from [src]") message_admins("[ADMIN_LOOKUPFLW(usr)] has made a station announcement from [src] at [AREACOORD(usr)].") diff --git a/code/game/machinery/scan_gate.dm b/code/game/machinery/scan_gate.dm index 4c1c8590157..6590ba17d64 100644 --- a/code/game/machinery/scan_gate.dm +++ b/code/game/machinery/scan_gate.dm @@ -16,7 +16,7 @@ #define SCANGATE_POD "pod" #define SCANGATE_GOLEM "golem" #define SCANGATE_ZOMBIE "zombie" -//SKYRAT EDIT BEGIN - MORE SCANNER GATE OPTIONS +//NOVA EDIT BEGIN - MORE SCANNER GATE OPTIONS #define SCANGATE_MAMMAL "mammal" #define SCANGATE_VOX "vox" #define SCANGATE_AQUATIC "aquatic" @@ -31,7 +31,7 @@ #define SCANGATE_SNAIL "snail" #define SCANGATE_GENDER "Gender" -//SKYRAT EDIT END - MORE SCANNER GATE OPTIONS +//NOVA EDIT END - MORE SCANNER GATE OPTIONS /obj/machinery/scanner_gate name = "scanner gate" @@ -61,7 +61,7 @@ var/light_fail = FALSE ///Does the scanner ignore light_pass and light_fail for sending signals? var/ignore_signals = FALSE - var/detect_gender = "male" //SKYRAT EDIT - MORE SCANNER GATE OPTIONS + var/detect_gender = "male" //NOVA EDIT - MORE SCANNER GATE OPTIONS /obj/machinery/scanner_gate/Initialize(mapload) @@ -175,7 +175,7 @@ scan_species = /datum/species/golem if(SCANGATE_ZOMBIE) scan_species = /datum/species/zombie - //SKYRAT EDIT BEGIN - MORE SCANNER GATE OPTIONS + //NOVA EDIT BEGIN - MORE SCANNER GATE OPTIONS if(SCANGATE_MAMMAL) scan_species = /datum/species/mammal if(SCANGATE_VOX) @@ -200,7 +200,7 @@ scan_species = /datum/species/hemophage if(SCANGATE_SNAIL) scan_species = /datum/species/snail - //SKYRAT EDIT END - MORE SCANNER GATE OPTIONS + //NOVA EDIT END - MORE SCANNER GATE OPTIONS if(is_species(H, scan_species)) beep = TRUE if(detect_species == SCANGATE_ZOMBIE) //Can detect dormant zombies @@ -218,14 +218,14 @@ beep = TRUE if(H.nutrition >= detect_nutrition && detect_nutrition == NUTRITION_LEVEL_FAT) beep = TRUE - //SKYRAT EDIT BEGIN - MORE SCANNER GATE OPTIONS + //NOVA EDIT BEGIN - MORE SCANNER GATE OPTIONS if(SCANGATE_GENDER) if(ishuman(M)) var/mob/living/carbon/human/scanned_human = M if((scanned_human.gender in list("male", "female"))) //funny thing: nb people will always get by the scan B) if(scanned_human.gender == detect_gender) beep = TRUE - //SKYRAT EDIT END - MORE SCANNER GATE OPTIONS + //NOVA EDIT END - MORE SCANNER GATE OPTIONS if(reverse) beep = !beep @@ -273,7 +273,7 @@ data["disease_threshold"] = disease_threshold data["target_species"] = detect_species data["target_nutrition"] = detect_nutrition - data["target_gender"] = detect_gender //SKYRAT EDIT - MORE SCANNER GATE OPTIONS + data["target_gender"] = detect_gender //NOVA EDIT - MORE SCANNER GATE OPTIONS return data /obj/machinery/scanner_gate/ui_act(action, params) @@ -315,7 +315,7 @@ if("Obese") detect_nutrition = NUTRITION_LEVEL_FAT . = TRUE - //SKYRAT EDIT BEGIN - MORE SCANNER GATE OPTIONS + //NOVA EDIT BEGIN - MORE SCANNER GATE OPTIONS if("set_target_gender") var/new_gender = params["new_gender"] var/gender_list = list( @@ -329,7 +329,7 @@ if("Female") detect_gender = "female" . = TRUE - //SKYRAT EDIT END - MORE SCANNER GATE OPTIONS + //NOVA EDIT END - MORE SCANNER GATE OPTIONS #undef SCANGATE_NONE #undef SCANGATE_MINDSHIELD @@ -349,7 +349,7 @@ #undef SCANGATE_POD #undef SCANGATE_GOLEM #undef SCANGATE_ZOMBIE -//SKYRAT EDIT BEGIN - MORE SCANNER GATE OPTIONS +//NOVA EDIT BEGIN - MORE SCANNER GATE OPTIONS #undef SCANGATE_MAMMAL #undef SCANGATE_VOX #undef SCANGATE_AQUATIC @@ -364,4 +364,4 @@ #undef SCANGATE_SNAIL #undef SCANGATE_GENDER -//SKYRAT EDIT END - MORE SCANNER GATE OPTIONS +//NOVA EDIT END - MORE SCANNER GATE OPTIONS diff --git a/code/game/machinery/sheetifier.dm b/code/game/machinery/sheetifier.dm index 249eff1cfbe..69bebfca69e 100644 --- a/code/game/machinery/sheetifier.dm +++ b/code/game/machinery/sheetifier.dm @@ -15,7 +15,7 @@ /datum/component/material_container, \ list(/datum/material/meat, /datum/material/hauntium), \ SHEET_MATERIAL_AMOUNT * MAX_STACK_SIZE * 2, \ - MATCONTAINER_EXAMINE|BREAKDOWN_FLAGS_SHEETIFIER, \ + MATCONTAINER_EXAMINE, \ typesof(/datum/material/meat) + /datum/material/hauntium, list(/obj/item/food/meat, /obj/item/photo), \ container_signals = list( COMSIG_MATCONTAINER_PRE_USER_INSERT = TYPE_PROC_REF(/obj/machinery/sheetifier, CanInsertMaterials), diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm index 91ce119d3df..7da1af14492 100644 --- a/code/game/machinery/shieldgen.dm +++ b/code/game/machinery/shieldgen.dm @@ -98,7 +98,6 @@ max_integrity = 20 mouse_opacity = MOUSE_OPACITY_TRANSPARENT layer = ABOVE_MOB_LAYER - plane = GAME_PLANE_UPPER /obj/structure/emergency_shield/cult/barrier density = FALSE //toggled on right away by the parent rune @@ -284,7 +283,7 @@ /obj/machinery/power/shieldwallgen name = "shield wall generator" desc = "A shield generator." - icon ='icons/obj/machines/shield_generator.dmi' //SKYRAT EDIT CHANGE - ICON OVERRIDEN IN SKYRAT AESTHETICS - SEE MODULE + icon ='icons/obj/machines/shield_generator.dmi' //NOVA EDIT CHANGE - ICON OVERRIDEN IN SKYRAT AESTHETICS - SEE MODULE icon_state = "shield_wall_gen" base_icon_state = "shield_wall_gen" anchored = FALSE diff --git a/code/game/machinery/sleepers.dm b/code/game/machinery/sleepers.dm index 42a6c0d1948..daa474029f6 100644 --- a/code/game/machinery/sleepers.dm +++ b/code/game/machinery/sleepers.dm @@ -178,7 +178,6 @@ . += span_notice("Alt-click [src] to [state_open ? "close" : "open"] it.") /obj/machinery/sleeper/process() - ..() use_power(idle_power_usage) /obj/machinery/sleeper/nap_violation(mob/violator) diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index 209b7101564..b0209713ea1 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -7,7 +7,7 @@ anchored = FALSE density = TRUE interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN - icon = 'icons/obj/pipes_n_cables/atmos.dmi' // SKYRAT EDIT CHANGE - ICON OVERRIDEN IN SKYRAT AESTHETICS - SEE MODULE + icon = 'icons/obj/pipes_n_cables/atmos.dmi' // NOVA EDIT CHANGE - ICON OVERRIDEN IN SKYRAT AESTHETICS - SEE MODULE icon_state = "sheater-off" base_icon_state = "sheater" name = "space heater" diff --git a/code/game/machinery/status_display.dm b/code/game/machinery/status_display.dm index 24c0ac8bda5..fae7ee98d09 100644 --- a/code/game/machinery/status_display.dm +++ b/code/game/machinery/status_display.dm @@ -14,7 +14,7 @@ /obj/machinery/status_display name = "status display" desc = null - icon = 'icons/obj/machines/status_display.dmi' //// SKYRAT EDIT CHANGE - ICON OVERRIDEN IN SKYRAT AESTHETICS - SEE MODULE + icon = 'icons/obj/machines/status_display.dmi' //// NOVA EDIT CHANGE - ICON OVERRIDEN IN SKYRAT AESTHETICS - SEE MODULE icon_state = "frame" verb_say = "beeps" verb_ask = "beeps" @@ -190,7 +190,7 @@ if(message1 == "" && message2 == "") return - . += emissive_appearance('modular_skyrat/modules/aesthetics/status_display/icons/status_display.dmi', "outline", src, alpha = src.alpha) // SKYRAT EDIT CHANGE - AESTHETICS + . += emissive_appearance('modular_nova/modules/aesthetics/status_display/icons/status_display.dmi', "outline", src, alpha = src.alpha) // NOVA EDIT CHANGE - AESTHETICS // Timed process - performs nothing in the base class /obj/machinery/status_display/process() @@ -499,10 +499,10 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/status_display/ai, 32) "Red Alert" = "redalert", "Blue Alert" = "bluealert", "Green Alert" = "greenalert", - "Violet Alert" = "violetalert", // SKYRAT EDIT ADD - Alert Levels - "Orange Alert" = "orangealert", // SKYRAT EDIT ADD - Alert Levels - "Amber Alert" = "amberalert", // SKYRAT EDIT ADD - Alert Levels - "Gamma Alert" = "gammaalert", // SKYRAT EDIT ADD - Alert Levels + "Violet Alert" = "violetalert", // NOVA EDIT ADD - Alert Levels + "Orange Alert" = "orangealert", // NOVA EDIT ADD - Alert Levels + "Amber Alert" = "amberalert", // NOVA EDIT ADD - Alert Levels + "Gamma Alert" = "gammaalert", // NOVA EDIT ADD - Alert Levels "Biohazard" = "biohazard", "Lockdown" = "lockdown", "Radiation" = "radiation", diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index 8b6601dd471..c39f36f93cf 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -89,7 +89,7 @@ human.set_species(species_to_transform) log_game("[human] ([key_name(human)]) was turned into a [initial(species_to_transform.name)] through [src].") - */ //SKYRAT EDIT REMOVAL END + */ //NOVA EDIT REMOVAL END //SKRYAT EDIT CHANGE BEGIN to_chat(human, span_danger("Your limbs lose molecular cohesion as you teleport!")) var/list/bodyparts_dismember = list() @@ -106,7 +106,7 @@ bodyparts_dismember.Remove(BP) //GC optimisation BP.dismember() qdel(BP) - //SKYRAT EDIT CHANGE END + //NOVA EDIT CHANGE END calibrated = FALSE return diff --git a/code/game/objects/effects/anomalies/anomalies_bluespace.dm b/code/game/objects/effects/anomalies/anomalies_bluespace.dm index 49d59b9bcf7..d6d5a8de9a5 100644 --- a/code/game/objects/effects/anomalies/anomalies_bluespace.dm +++ b/code/game/objects/effects/anomalies/anomalies_bluespace.dm @@ -45,7 +45,7 @@ var/turf/TO = get_turf(chosen) // the turf of origin we're travelling TO playsound(TO, 'sound/effects/phasein.ogg', 100, TRUE) - priority_announce("Massive bluespace translocation detected.", "Anomaly Alert", ANNOUNCER_TRANSLOCATION) //SKYRAT EDIT CHANGE - ANNOUNCER + priority_announce("Massive bluespace translocation detected.", "Anomaly Alert", ANNOUNCER_TRANSLOCATION) //NOVA EDIT CHANGE - ANNOUNCER var/list/flashers = list() for(var/mob/living/carbon/C in viewers(TO, null)) diff --git a/code/game/objects/effects/anomalies/anomalies_dimensional.dm b/code/game/objects/effects/anomalies/anomalies_dimensional.dm index 2d9b8ec71b4..9aea9dfea6a 100644 --- a/code/game/objects/effects/anomalies/anomalies_dimensional.dm +++ b/code/game/objects/effects/anomalies/anomalies_dimensional.dm @@ -8,7 +8,7 @@ /// Range of effect, if left alone anomaly will convert a 2(range)+1 squared area. var/range = 3 /// List of turfs this anomaly will try to transform before relocating - var/list/turf/target_turfs = new() + var/list/turf/target_turfs = list() /// Current anomaly 'theme', dictates what tiles to create. var/datum/dimension_theme/theme /// Effect displaying on the anomaly to represent the theme. @@ -38,7 +38,7 @@ var/turf/affected_turf = target_turfs[1] new /obj/effect/temp_visual/transmute_tile_flash(affected_turf) theme.apply_theme(affected_turf) - target_turfs.Remove(affected_turf) + target_turfs -= affected_turf /** * Prepare a new area for transformation into a new theme. @@ -50,11 +50,10 @@ theme = new new_theme_path() apply_theme_icon() - target_turfs = new() - var/list/turfs = spiral_range_turfs(range, src) - for (var/turf/turf in turfs) + target_turfs = list() + for (var/turf/turf as anything in spiral_range_turfs(range, src)) if (theme.can_convert(turf)) - target_turfs.Add(turf) + target_turfs += turf /** * Applies an overlay icon based on the current theme. diff --git a/code/game/objects/effects/anomalies/anomalies_dimensional_themes.dm b/code/game/objects/effects/anomalies/anomalies_dimensional_themes.dm index b0f69b99b47..16408ea9ce6 100644 --- a/code/game/objects/effects/anomalies/anomalies_dimensional_themes.dm +++ b/code/game/objects/effects/anomalies/anomalies_dimensional_themes.dm @@ -3,6 +3,8 @@ * Datum which describes a theme and replaces turfs and objects in specified locations to match that theme */ /datum/dimension_theme + /// Human readable name of the theme + var/name = "Unnamed Theme" /// An icon to display to represent the theme var/icon/icon /// Icon state to use to represent the theme @@ -16,11 +18,16 @@ /// Typepath of turf to replace walls with. var/turf/replace_walls = /turf/closed/wall/material /// List of weighted lists for object replacement. Key is an original typepath, value is a weighted list of typepaths to replace it with. - var/list/replace_objs = list(\ - /obj/structure/chair = list(/obj/structure/chair/greyscale = 1), \ - /obj/machinery/door/airlock = list(/obj/machinery/door/airlock/material = 1, /obj/machinery/door/airlock/material/glass = 1), \ - /obj/structure/table = list(/obj/structure/table/greyscale = 1), \ - /obj/structure/toilet = list(/obj/structure/toilet/greyscale = 1),) + var/list/replace_objs = list( + /obj/structure/chair = list(/obj/structure/chair/greyscale = 1), + /obj/machinery/door/airlock = list(/obj/machinery/door/airlock/material = 1, /obj/machinery/door/airlock/material/glass = 1), + /obj/structure/table = list(/obj/structure/table/greyscale = 1), + /obj/structure/toilet = list(/obj/structure/toilet/greyscale = 1), + ) + /// List of random spawns to place in completely open turfs + var/list/random_spawns + /// Prob of placing a random spawn in a completely open turf + var/random_spawn_chance = 0 /// Typepath of full-size windows which will replace existing ones /// These need to be separate from replace_objs because we don't want to replace dir windows with full ones and they share typepath var/obj/structure/window/replace_window @@ -38,15 +45,33 @@ * Arguments * * affected_turf - Turf to transform. */ -/datum/dimension_theme/proc/apply_theme(turf/affected_turf) +/datum/dimension_theme/proc/apply_theme(turf/affected_turf, skip_sound = FALSE) if (!replace_turf(affected_turf)) return - playsound(affected_turf, sound, 100, TRUE) + if (!skip_sound) + playsound(affected_turf, sound, 100, TRUE) for (var/obj/object in affected_turf) replace_object(object) + if (length(random_spawns) && prob(random_spawn_chance) && !affected_turf.is_blocked_turf(exclude_mobs = TRUE)) + var/random_spawn_picked = pick(random_spawns) + new random_spawn_picked(affected_turf) if (material) apply_materials(affected_turf) +/** + * Applies the transformation to a list of turfs, ensuring a sound is only played every few turfs to reduce noice spam + * + * Arguments + * * list/turf/all_turfs - List of turfs to transform. + */ +/datum/dimension_theme/proc/apply_theme_to_list_of_turfs(list/turf/all_turfs) + var/every_nth_turf = 0 + for (var/turf/turf as anything in all_turfs) + if(can_convert(turf)) + apply_theme(turf, skip_sound = (every_nth_turf % 7 != 0)) + every_nth_turf++ + CHECK_TICK + /** * Returns true if you actually can transform the provided turf. * @@ -75,6 +100,8 @@ * * affected_turf - Turf to transform. */ /datum/dimension_theme/proc/replace_turf(turf/affected_turf) + PROTECTED_PROC(TRUE) + if (isfloorturf(affected_turf)) if (isindestructiblefloor(affected_turf)) return FALSE @@ -96,6 +123,8 @@ * * affected_floor - Floor turf to transform. */ /datum/dimension_theme/proc/transform_floor(turf/open/floor/affected_floor) + PROTECTED_PROC(TRUE) + if (replace_floors.len == 0) return FALSE affected_floor.replace_floor(pick_weight(replace_floors), flags = CHANGETURF_INHERIT_AIR) @@ -108,6 +137,8 @@ * * object - Object to replace. */ /datum/dimension_theme/proc/replace_object(obj/object) + PROTECTED_PROC(TRUE) + if (istype(object, /obj/structure/window)) transform_window(object) return @@ -117,6 +148,8 @@ return var/obj/new_object = new replace_path(object.loc) new_object.setDir(object.dir) + if(istype(object, /obj/machinery/door/airlock)) + new_object.name = object.name qdel(object) /** @@ -126,10 +159,11 @@ * * object - Object to transform. */ /datum/dimension_theme/proc/get_replacement_object_typepath(obj/object) + PROTECTED_PROC(TRUE) + for (var/type in replace_objs) if (istype(object, type)) return pick_weight(replace_objs[type]) - return /** * Replaces a window with a different window and recolours it. @@ -139,6 +173,8 @@ * * object - Object to transform. */ /datum/dimension_theme/proc/transform_window(obj/structure/window/window) + PROTECTED_PROC(TRUE) + if (!window.fulltile) return if (!replace_window) @@ -164,10 +200,10 @@ * * object - Object to transform. */ /datum/dimension_theme/proc/permit_replace_material(obj/object) - for (var/type in PERMITTED_MATERIAL_REPLACE_TYPES) - if (istype(object, type)) - return TRUE - return FALSE + PROTECTED_PROC(TRUE) + + return is_type_in_list(object, PERMITTED_MATERIAL_REPLACE_TYPES) + /** * Applies a new custom material to the contents of a provided turf. @@ -176,6 +212,8 @@ * * affected_turf - Turf to transform. */ /datum/dimension_theme/proc/apply_materials(turf/affected_turf) + PROTECTED_PROC(TRUE) + var/list/custom_materials = list(GET_MATERIAL_REF(material) = SHEET_MATERIAL_AMOUNT) if (istype(affected_turf, /turf/open/floor/material) || istype(affected_turf, /turf/closed/wall/material)) @@ -191,79 +229,110 @@ ///////////////////// /datum/dimension_theme/gold + name = "Gold" icon = 'icons/obj/stack_objects.dmi' icon_state = "sheet-gold_2" material = /datum/material/gold /datum/dimension_theme/plasma + name = "Plasma" icon = 'icons/obj/clothing/masks.dmi' icon_state = "gas_alt" material = /datum/material/plasma /datum/dimension_theme/clown + name = "Clown" icon = 'icons/obj/clothing/masks.dmi' icon_state = "clown" material = /datum/material/bananium sound = 'sound/items/bikehorn.ogg' /datum/dimension_theme/radioactive + name = "Radioactive" icon = 'icons/obj/ore.dmi' icon_state = "Uranium ore" material = /datum/material/uranium sound = 'sound/items/welder.ogg' /datum/dimension_theme/meat + name = "Meat" icon = 'icons/obj/food/meat.dmi' icon_state = "meat" material = /datum/material/meat sound = 'sound/items/eatfood.ogg' /datum/dimension_theme/pizza + name = "Pizza" icon = 'icons/obj/food/pizza.dmi' icon_state = "pizzamargherita" material = /datum/material/pizza sound = 'sound/items/eatfood.ogg' /datum/dimension_theme/natural + name = "Natural" icon = 'icons/obj/service/hydroponics/harvest.dmi' icon_state = "map_flower" window_colour = "#00f7ff" replace_floors = list(/turf/open/floor/grass = 1) replace_walls = /turf/closed/wall/mineral/wood/nonmetal - replace_objs = list(\ - /obj/structure/chair = list(/obj/structure/chair/wood = 3, /obj/structure/chair/wood/wings = 1), \ - /obj/machinery/door/airlock = list(/obj/machinery/door/airlock/wood = 1, /obj/machinery/door/airlock/wood/glass = 1), \ - /obj/structure/table = list(/obj/structure/table/wood = 5, /obj/structure/table/wood/fancy = 1),) + replace_objs = list( + /obj/structure/chair = list(/obj/structure/chair/wood = 3, /obj/structure/chair/wood/wings = 1), + /obj/machinery/door/airlock = list(/obj/machinery/door/airlock/wood = 1, /obj/machinery/door/airlock/wood/glass = 1), + /obj/structure/table = list(/obj/structure/table/wood = 5, /obj/structure/table/wood/fancy = 1), + ) /datum/dimension_theme/bamboo + name = "Bamboo" icon = 'icons/obj/service/hydroponics/harvest.dmi' icon_state = "bamboo" replace_floors = list(/turf/open/floor/bamboo = 1) replace_walls = /turf/closed/wall/mineral/bamboo replace_window = /obj/structure/window/paperframe - replace_objs = list(\ - /obj/structure/chair = list(/obj/structure/chair/stool/bamboo = 1), \ - /obj/machinery/door/airlock = list(/obj/machinery/door/airlock/wood = 1, /obj/machinery/door/airlock/wood/glass = 1), \ - /obj/structure/table = list(/obj/structure/table/wood = 1),) + replace_objs = list( + /obj/structure/chair = list(/obj/structure/chair/stool/bamboo = 1), + /obj/machinery/door/airlock = list(/obj/machinery/door/airlock/wood = 1, /obj/machinery/door/airlock/wood/glass = 1), + /obj/structure/table = list(/obj/structure/table/wood = 1), + ) /datum/dimension_theme/icebox - icon = 'icons/obj/clothing/shoes.dmi' - icon_state = "iceboots" + name = "Winter" + icon = 'icons/obj/clothing/head/costume.dmi' + icon_state = "snowman_h" window_colour = "#00f7ff" material = /datum/material/snow replace_floors = list(/turf/open/floor/fake_snow = 10, /turf/open/floor/fakeice/slippery = 1) replace_walls = /turf/closed/wall/mineral/snow + random_spawns = list( + /obj/structure/flora/grass/both/style_random, + /obj/structure/flora/grass/brown/style_random, + /obj/structure/flora/grass/green/style_random, + ) + random_spawn_chance = 8 + +/datum/dimension_theme/icebox/winter_cabin + name = "Winter Cabin" + icon = 'icons/obj/clothing/shoes.dmi' + icon_state = "iceboots" + replace_walls = /turf/closed/wall/mineral/wood + replace_objs = list( + /obj/structure/chair = list(/obj/structure/chair/wood = 1), + /obj/machinery/door/airlock = list(/obj/machinery/door/airlock/wood = 1), + /obj/structure/table = list(/obj/structure/table/wood = 1), + ) /datum/dimension_theme/lavaland + name = "Lavaland" icon = 'icons/obj/stack_objects.dmi' icon_state = "goliath_hide" window_colour = "#860000" replace_floors = list(/turf/open/floor/fakebasalt = 5, /turf/open/floor/fakepit = 1) replace_walls = /turf/closed/wall/mineral/cult - replace_objs = list(\ - /obj/machinery/door/airlock = list(/obj/machinery/door/airlock/external/glass/ruin = 1)) + replace_objs = list(/obj/machinery/door/airlock = list(/obj/machinery/door/airlock/external/glass/ruin = 1)) + random_spawns = list(/mob/living/basic/mining/goldgrub) + random_spawn_chance = 1 /datum/dimension_theme/space + name = "Space" icon = 'icons/effects/effects.dmi' icon_state = "blessed" window_colour = "#000000" @@ -273,6 +342,7 @@ replace_objs = list(/obj/machinery/door/airlock = list(/obj/machinery/door/airlock/external/glass/ruin = 1)) /datum/dimension_theme/glass + name = "Glass" icon = 'icons/obj/debris.dmi' icon_state = "small" material = /datum/material/glass @@ -280,6 +350,7 @@ sound = SFX_SHATTER /datum/dimension_theme/fancy + name = "Fancy" icon = 'icons/obj/clothing/head/costume.dmi' icon_state = "fancycrown" replace_walls = /turf/closed/wall/mineral/wood/nonmetal @@ -299,15 +370,18 @@ /turf/open/floor/carpet/royalblue,) /datum/dimension_theme/fancy/New() + . = ..() replace_floors = list(pick(FANCY_CARPETS) = 1) - replace_objs = list(\ - /obj/structure/chair = list(/obj/structure/chair/comfy = 1), \ - /obj/machinery/door/airlock = list(/obj/machinery/door/airlock/wood = 1, /obj/machinery/door/airlock/wood/glass = 1), \ - /obj/structure/table/wood = list(pick(subtypesof(/obj/structure/table/wood/fancy)) = 1),) + replace_objs = list( + /obj/structure/chair = list(/obj/structure/chair/comfy = 1), + /obj/machinery/door/airlock = list(/obj/machinery/door/airlock/wood = 1, /obj/machinery/door/airlock/wood/glass = 1), + /obj/structure/table/wood = list(pick(subtypesof(/obj/structure/table/wood/fancy)) = 1), + ) #undef FANCY_CARPETS /datum/dimension_theme/disco + name = "Disco" icon = 'icons/obj/lighting.dmi' icon_state = "lbulb" material = /datum/material/glass @@ -320,3 +394,40 @@ var/turf/open/floor/light/disco_floor = affected_floor disco_floor.currentcolor = pick(disco_floor.coloredlights) disco_floor.update_appearance() + +/datum/dimension_theme/jungle + name = "Jungle" + icon = 'icons/obj/tiles.dmi' + icon_state = "tile_grass" + sound = SFX_CRUNCHY_BUSH_WHACK + replace_floors = list(/turf/open/floor/grass = 1) + replace_walls = /turf/closed/wall/mineral/wood + replace_objs = list( + /obj/structure/chair = list(/obj/structure/chair/wood = 1), + /obj/machinery/door/airlock = list(/obj/machinery/door/airlock/wood = 1), + /obj/structure/table = list(/obj/structure/table/wood = 1), + ) + random_spawns = list( + /mob/living/carbon/human/species/monkey, + /obj/structure/flora/bush/ferny/style_random, + /obj/structure/flora/bush/grassy/style_random, + /obj/structure/flora/bush/leavy/style_random, + /obj/structure/flora/tree/palm/style_random, + /obj/structure/flora/bush/sparsegrass/style_random, + /obj/structure/flora/bush/sunny/style_random, + ) + random_spawn_chance = 20 + +/datum/dimension_theme/ayylmao + name = "Alien" + icon = 'icons/obj/antags/abductor.dmi' + icon_state = "sheet-abductor" + material = /datum/material/alloy/alien + replace_walls = /turf/closed/wall/mineral/abductor + replace_floors = list(/turf/open/floor/mineral/abductor = 1) + replace_objs = list( + /obj/structure/chair = list(/obj/structure/chair/greyscale = 9, /obj/structure/bed/abductor = 1), + /obj/machinery/door/airlock = list(/obj/machinery/door/airlock/material = 1, /obj/machinery/door/airlock/material/glass = 2), + /obj/structure/table = list(/obj/structure/table/greyscale = 9, /obj/structure/table/abductor = 1), + /obj/structure/toilet = list(/obj/structure/toilet/greyscale = 1), + ) diff --git a/code/game/objects/effects/anomalies/anomalies_ectoplasm.dm b/code/game/objects/effects/anomalies/anomalies_ectoplasm.dm index a219b2f5492..3e6d84d809a 100644 --- a/code/game/objects/effects/anomalies/anomalies_ectoplasm.dm +++ b/code/game/objects/effects/anomalies/anomalies_ectoplasm.dm @@ -180,7 +180,7 @@ candidate_list += GLOB.current_observers_list candidate_list += GLOB.dead_player_list - var/list/candidates = poll_candidates("Would you like to participate in a spooky ghost swarm? (Warning: you will not be able to return to your body!)", ROLE_SENTIENCE, FALSE, 10 SECONDS, group = candidate_list) + var/list/candidates = SSpolling.poll_candidates("Would you like to participate in a spooky ghost swarm? (Warning: you will not be able to return to your body!)", check_jobban = ROLE_SENTIENCE, poll_time = 10 SECONDS, group = candidate_list, pic_source = src, role_name_text = "ghost swarm") for(var/mob/dead/observer/candidate_ghost as anything in candidates) var/mob/living/basic/ghost/swarm/new_ghost = new(get_turf(src)) ghosts_spawned += new_ghost diff --git a/code/game/objects/effects/anomalies/anomalies_pyroclastic.dm b/code/game/objects/effects/anomalies/anomalies_pyroclastic.dm index d3ee84181ed..87221eeec9f 100644 --- a/code/game/objects/effects/anomalies/anomalies_pyroclastic.dm +++ b/code/game/objects/effects/anomalies/anomalies_pyroclastic.dm @@ -39,7 +39,7 @@ var/datum/action/innate/slime/reproduce/repro_action = new repro_action.Grant(pyro) - var/list/mob/dead/observer/candidates = poll_candidates_for_mob("Do you want to play as a pyroclastic anomaly slime?", ROLE_SENTIENCE, null, 10 SECONDS, pyro, POLL_IGNORE_PYROSLIME) + var/list/mob/dead/observer/candidates = SSpolling.poll_ghost_candidates_for_mob("Do you want to play as a pyroclastic anomaly slime?", check_jobban = ROLE_SENTIENCE, poll_time = 10 SECONDS, target_mob = pyro, ignore_category = POLL_IGNORE_PYROSLIME, pic_source = pyro, role_name_text = "pyroclastic anomaly slime") if(!LAZYLEN(candidates)) return diff --git a/code/game/objects/effects/bump_teleporter.dm b/code/game/objects/effects/bump_teleporter.dm index da7c4701230..9c114a6dc69 100644 --- a/code/game/objects/effects/bump_teleporter.dm +++ b/code/game/objects/effects/bump_teleporter.dm @@ -29,7 +29,7 @@ /obj/effect/bump_teleporter/singularity_pull() return -/* SKYRAT EDIT REMOVAL - MOVED TO BLACK_MESA +/* NOVA EDIT REMOVAL - MOVED TO BLACK_MESA /obj/effect/bump_teleporter/Bumped(atom/movable/bumper) if(!validate_setup(bumper)) return diff --git a/code/game/objects/effects/decals/cleanable/humans.dm b/code/game/objects/effects/decals/cleanable/humans.dm index d329de34a5f..b195f115d46 100644 --- a/code/game/objects/effects/decals/cleanable/humans.dm +++ b/code/game/objects/effects/decals/cleanable/humans.dm @@ -128,7 +128,7 @@ . = ..() if(!.) return - //AddComponent(/datum/component/rot, 0, 5 MINUTES, 0.7) skyrat edit + //AddComponent(/datum/component/rot, 0, 5 MINUTES, 0.7) NOVA EDIT /obj/effect/decal/cleanable/blood/gibs/ex_act(severity, target) return FALSE diff --git a/code/game/objects/effects/decals/cleanable/misc.dm b/code/game/objects/effects/decals/cleanable/misc.dm index daaddb00ce0..8a80692f1a9 100644 --- a/code/game/objects/effects/decals/cleanable/misc.dm +++ b/code/game/objects/effects/decals/cleanable/misc.dm @@ -129,7 +129,6 @@ desc = "Somebody should remove that." gender = NEUTER layer = WALL_OBJ_LAYER - plane = GAME_PLANE_UPPER icon_state = "cobweb1" resistance_flags = FLAMMABLE beauty = -100 diff --git a/code/game/objects/effects/decals/turfdecal/markings.dm b/code/game/objects/effects/decals/turfdecal/markings.dm index 237ea9eb4ff..f852cb04b5f 100644 --- a/code/game/objects/effects/decals/turfdecal/markings.dm +++ b/code/game/objects/effects/decals/turfdecal/markings.dm @@ -244,7 +244,7 @@ icon_state = "siding_plain_end" /obj/effect/turf_decal/siding/red - color = "#486091" //SKYRAT EDIT CHANGE + color = "#486091" //NOVA EDIT CHANGE /obj/effect/turf_decal/siding/red/corner icon_state = "siding_plain_corner" diff --git a/code/game/objects/effects/decals/turfdecal/tilecoloring.dm b/code/game/objects/effects/decals/turfdecal/tilecoloring.dm index ec307a87d98..3e02261d610 100644 --- a/code/game/objects/effects/decals/turfdecal/tilecoloring.dm +++ b/code/game/objects/effects/decals/turfdecal/tilecoloring.dm @@ -83,7 +83,7 @@ TILE_DECAL_SUBTYPE_HELPER(/obj/effect/turf_decal/tile/yellow) /obj/effect/turf_decal/tile/red name = "red tile decal" - color = "#486091" // SKYRAT EDIT CHANGE + color = "#486091" // NOVA EDIT CHANGE TILE_DECAL_SUBTYPE_HELPER(/obj/effect/turf_decal/tile/red) @@ -260,7 +260,7 @@ TRIMLINE_SUBTYPE_HELPER(/obj/effect/turf_decal/trimline/white) /// Red trimlines /obj/effect/turf_decal/trimline/red - color = "#486091" //SKYRAT EDIT CHANGE + color = "#486091" //NOVA EDIT CHANGE TRIMLINE_SUBTYPE_HELPER(/obj/effect/turf_decal/trimline/red) 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 9a13e68c1b1..efb5b1fbb91 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 @@ -17,7 +17,6 @@ anchored = TRUE density = FALSE layer = EDGED_TURF_LAYER - plane = GAME_PLANE_UPPER mouse_opacity = MOUSE_OPACITY_TRANSPARENT animate_movement = NO_STEPS /// The types of turfs that this foam cannot spread to. @@ -298,7 +297,6 @@ opacity = TRUE // changed in New() anchored = TRUE layer = EDGED_TURF_LAYER - plane = GAME_PLANE_UPPER resistance_flags = FIRE_PROOF | ACID_PROOF name = "foamed metal" desc = "A lightweight foamed metal wall that can be used as base to construct a wall." diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index f6151a3cbf6..88c4203c350 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -68,10 +68,10 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark) /obj/effect/landmark/start/prisoner name = "Prisoner" icon_state = "Prisoner" - //SKYRAT EDIT: Start - Makes latejoin prisoners spawn in the prison instead of on the interlink. + //NOVA EDIT: Start - Makes latejoin prisoners spawn in the prison instead of on the interlink. jobspawn_override = TRUE delete_after_roundstart = FALSE - //SKYRAT EDIT: End - Makes latejoin prisoners spawn in the prison instead of on the interlink. + //NOVA EDIT: End - Makes latejoin prisoners spawn in the prison instead of on the interlink. /obj/effect/landmark/start/prisoner/after_round_start() return @@ -211,10 +211,10 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark) /obj/effect/landmark/start/cyborg name = "Cyborg" icon_state = "Cyborg" - //SKYRAT EDIT: Start - Makes latejoin cyborgs spawn in the station instead of on the interlink. + //NOVA EDIT: Start - Makes latejoin cyborgs spawn in the station instead of on the interlink. jobspawn_override = TRUE delete_after_roundstart = FALSE - //SKYRAT EDIT: End - Makes latejoin cyborgs spawn in the station instead of on the interlink. + //NOVA EDIT: End - Makes latejoin cyborgs spawn in the station instead of on the interlink. /obj/effect/landmark/start/ai name = "AI" diff --git a/code/game/objects/effects/misc.dm b/code/game/objects/effects/misc.dm index 5a23ff32b09..2b8abcb1728 100644 --- a/code/game/objects/effects/misc.dm +++ b/code/game/objects/effects/misc.dm @@ -38,6 +38,11 @@ moveToNullspace() return QDEL_HINT_QUEUE +/obj/effect/spawner/forceMove(atom/destination) + if(destination && QDELETED(src)) // throw a warning if we try to forceMove a qdeleted spawner to somewhere other than nullspace + stack_trace("Warning: something tried to forceMove() a qdeleted [src]([type]) to non-null destination [destination]([destination.type])!") + return ..() + /obj/effect/list_container name = "list container" diff --git a/code/game/objects/effects/spawners/random/ai_module.dm b/code/game/objects/effects/spawners/random/ai_module.dm index 1ca7a05f2e9..f87febfa011 100644 --- a/code/game/objects/effects/spawners/random/ai_module.dm +++ b/code/game/objects/effects/spawners/random/ai_module.dm @@ -38,8 +38,8 @@ /obj/item/ai_module/supplied/protect_station, /obj/item/ai_module/supplied/quarantine, /obj/item/ai_module/remove, - /obj/item/ai_module/core/full/dagothbot, // SKYRAT EDIT - EDITION - /obj/item/ai_module/core/full/texas, // SKYRAT EDIT - EDITION + /obj/item/ai_module/core/full/dagothbot, // NOVA EDIT - EDITION + /obj/item/ai_module/core/full/texas, // NOVA EDIT - EDITION ) /obj/effect/spawner/random/aimodule/harmful diff --git a/code/game/objects/effects/spawners/random/contraband.dm b/code/game/objects/effects/spawners/random/contraband.dm index f5bf0f452a3..ca5acbdbe67 100644 --- a/code/game/objects/effects/spawners/random/contraband.dm +++ b/code/game/objects/effects/spawners/random/contraband.dm @@ -141,3 +141,59 @@ /obj/item/restraints/legcuffs/beartrap/prearmed = 5, //not really a landmine, but still a good threat /obj/effect/mine/shrapnel = 5, ) + +/obj/effect/spawner/random/contraband/grenades + name = "grenades spawner" + loot = list( + /obj/item/grenade/chem_grenade/metalfoam, + /obj/item/grenade/chem_grenade/cleaner, + /obj/effect/spawner/random/entertainment/colorful_grenades, + /obj/item/grenade/smokebomb, + /obj/item/grenade/chem_grenade/antiweed, + /obj/item/grenade/spawnergrenade/syndiesoap, + /obj/effect/spawner/random/contraband/grenades/dangerous, + ) + +/obj/effect/spawner/random/contraband/grenades/dangerous + name = "dangerous grenades spawner" + loot = list( + /obj/item/grenade/flashbang = 3, + /obj/item/grenade/chem_grenade/teargas = 2, + /obj/item/grenade/iedcasing/spawned = 2, + /obj/item/grenade/empgrenade = 2, + /obj/item/grenade/antigravity = 2, + /obj/effect/spawner/random/contraband/grenades/cluster = 1, + /obj/effect/spawner/random/contraband/grenades/lethal = 1, + ) + +/obj/effect/spawner/random/contraband/grenades/cluster + name = "clusterbusters spawner" + loot = list( + /obj/item/grenade/clusterbuster/smoke = 4, + /obj/item/grenade/clusterbuster/metalfoam = 4, + /obj/item/grenade/clusterbuster/cleaner = 4, + /obj/item/grenade/clusterbuster = 3, + /obj/item/grenade/clusterbuster/teargas = 3, + /obj/item/grenade/clusterbuster/antiweed = 3, + /obj/item/grenade/clusterbuster/soap = 2, + /obj/item/grenade/clusterbuster/emp = 1, + /obj/item/grenade/clusterbuster/spawner_spesscarp = 1, + /obj/item/grenade/clusterbuster/facid = 1, + /obj/item/grenade/clusterbuster/inferno = 1, + /obj/item/grenade/clusterbuster/clf3 = 1, + ) + +/obj/effect/spawner/random/contraband/grenades/lethal + name = "lethal grenades spawner" + loot = list( + /obj/item/grenade/chem_grenade/incendiary = 3, + /obj/item/grenade/chem_grenade/facid = 3, + /obj/item/grenade/chem_grenade/ez_clean = 3, + /obj/item/grenade/chem_grenade/clf3 = 2, + /obj/item/grenade/gluon = 2, + /obj/item/grenade/chem_grenade/holy = 2, + /obj/item/grenade/spawnergrenade/spesscarp = 1, + /obj/item/grenade/spawnergrenade/cat = 1, + /obj/item/grenade/frag = 1, + /obj/item/grenade/chem_grenade/bioterrorfoam = 1, + ) diff --git a/code/game/objects/effects/spawners/random/entertainment.dm b/code/game/objects/effects/spawners/random/entertainment.dm index 1c635f07a5a..0a61cd1ab1f 100644 --- a/code/game/objects/effects/spawners/random/entertainment.dm +++ b/code/game/objects/effects/spawners/random/entertainment.dm @@ -281,3 +281,12 @@ /obj/item/toy/plush/ratplush = 2, /obj/item/toy/plush/narplush = 2, ) + +/obj/effect/spawner/random/entertainment/colorful_grenades + name = "colorful/glitter grenades spawner" + loot = list( + /obj/item/grenade/chem_grenade/glitter/pink, + /obj/item/grenade/chem_grenade/glitter/blue, + /obj/item/grenade/chem_grenade/glitter/white, + /obj/item/grenade/chem_grenade/colorful + ) diff --git a/code/game/objects/effects/spawners/random/food_or_drink.dm b/code/game/objects/effects/spawners/random/food_or_drink.dm index b2639b2df68..192914b6e3d 100644 --- a/code/game/objects/effects/spawners/random/food_or_drink.dm +++ b/code/game/objects/effects/spawners/random/food_or_drink.dm @@ -323,3 +323,17 @@ /obj/item/food/donut/jelly/slimejelly/matcha = 2, /obj/item/food/donut/jelly/slimejelly/trumpet = 2, ) + +/obj/effect/spawner/random/food_or_drink/any_snack_or_beverage + name = "any snack or beverage spawner" + icon_state = "slime_jelly_donut" + loot = list( + /obj/effect/spawner/random/food_or_drink/snack = 6, + /obj/effect/spawner/random/food_or_drink/refreshing_beverage = 6, + /obj/effect/spawner/random/food_or_drink/donuts = 5, + /obj/effect/spawner/random/food_or_drink/donkpockets_single = 5, + /obj/effect/spawner/random/food_or_drink/booze = 4, + /obj/effect/spawner/random/food_or_drink/snack/lizard = 4, + /obj/effect/spawner/random/food_or_drink/jelly_donuts = 3, + /obj/effect/spawner/random/food_or_drink/slime_jelly_donuts = 1, + ) diff --git a/code/game/objects/effects/spawners/random/medical.dm b/code/game/objects/effects/spawners/random/medical.dm index ccbc109254a..b0f7a4aeaf5 100644 --- a/code/game/objects/effects/spawners/random/medical.dm +++ b/code/game/objects/effects/spawners/random/medical.dm @@ -70,7 +70,7 @@ icon_state = "xeno_egg" loot = list( /obj/effect/decal/remains/xeno = 49, - /obj/item/clothing/mask/facehugger/toy = 1, // SKYRAT EDIT - They should be handled by dynamic - ORIGIGNAL: /obj/effect/spawner/xeno_egg_delivery = 1, + /obj/item/clothing/mask/facehugger/toy = 1, // NOVA EDIT - They should be handled by dynamic - ORIGIGNAL: /obj/effect/spawner/xeno_egg_delivery = 1, ) /obj/effect/spawner/random/medical/surgery_tool diff --git a/code/game/objects/effects/spiderwebs.dm b/code/game/objects/effects/spiderwebs.dm index 9a3d6c9c8e3..5023f9bd825 100644 --- a/code/game/objects/effects/spiderwebs.dm +++ b/code/game/objects/effects/spiderwebs.dm @@ -114,7 +114,7 @@ opacity = TRUE density = TRUE max_integrity = 90 - plane = GAME_PLANE_UPPER + layer = ABOVE_MOB_LAYER resistance_flags = FIRE_PROOF | FREEZE_PROOF /obj/structure/spider/solid/Initialize(mapload) @@ -130,7 +130,7 @@ opacity = TRUE max_integrity = 60 alpha = 200 - plane = GAME_PLANE_UPPER + layer = ABOVE_MOB_LAYER resistance_flags = FIRE_PROOF | FREEZE_PROOF /obj/structure/spider/passage/Initialize(mapload) diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm index 5b9f5a5a06b..05ecfeec2ba 100644 --- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm +++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm @@ -21,7 +21,6 @@ if(SOUTH) target_pixel_y = -16 layer = ABOVE_MOB_LAYER - SET_PLANE_IMPLICIT(src, GAME_PLANE_UPPER) if(EAST) target_pixel_x = 16 if(WEST) @@ -36,12 +35,10 @@ target_pixel_x = 16 target_pixel_y = -16 layer = ABOVE_MOB_LAYER - SET_PLANE_IMPLICIT(src, GAME_PLANE_UPPER) if(SOUTHWEST) target_pixel_x = -16 target_pixel_y = -16 layer = ABOVE_MOB_LAYER - SET_PLANE_IMPLICIT(src, GAME_PLANE_UPPER) animate(src, pixel_x = target_pixel_x, pixel_y = target_pixel_y, alpha = 0, time = duration) /obj/effect/temp_visual/dir_setting/bloodsplatter/xenosplatter @@ -270,8 +267,8 @@ /obj/effect/temp_visual/telekinesis name = "telekinetic force" //icon_state = "empdisable" //Non-Skyrat version - icon_state = "telekinesis_throw" //Skyrat edit, was "empdisable" - icon = 'modular_skyrat/master_files/icons/effects/tele_effects.dmi' //Skyrat Addition + icon_state = "telekinesis_throw" //NOVA EDIT, was "empdisable" + icon = 'modular_nova/master_files/icons/effects/tele_effects.dmi' //Skyrat Addition duration = 5 /obj/effect/temp_visual/emp diff --git a/code/game/objects/effects/temporary_visuals/projectiles/projectile_effects.dm b/code/game/objects/effects/temporary_visuals/projectiles/projectile_effects.dm index 1e8577bbd3a..81c854f2c3e 100644 --- a/code/game/objects/effects/temporary_visuals/projectiles/projectile_effects.dm +++ b/code/game/objects/effects/temporary_visuals/projectiles/projectile_effects.dm @@ -3,7 +3,6 @@ icon = 'icons/obj/weapons/guns/projectiles.dmi' icon_state = "nothing" layer = HITSCAN_PROJECTILE_LAYER - plane = GAME_PLANE_FOV_HIDDEN anchored = TRUE mouse_opacity = MOUSE_OPACITY_TRANSPARENT appearance_flags = LONG_GLIDE diff --git a/code/game/objects/effects/temporary_visuals/temporary_visual.dm b/code/game/objects/effects/temporary_visuals/temporary_visual.dm index 0d5b7bf1463..9669b4ed290 100644 --- a/code/game/objects/effects/temporary_visuals/temporary_visual.dm +++ b/code/game/objects/effects/temporary_visuals/temporary_visual.dm @@ -3,7 +3,6 @@ icon_state = "nothing" anchored = TRUE layer = ABOVE_MOB_LAYER - plane = GAME_PLANE_UPPER mouse_opacity = MOUSE_OPACITY_TRANSPARENT ///time, in deciseconds, that this object will exist var/duration = 10 diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 4a8ad3f4cad..a71c479811f 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -217,10 +217,10 @@ var/override_notes = FALSE /// Used if we want to have a custom verb text for throwing. "John Spaceman flicks the ciggerate" for example. var/throw_verb - // SKYRAT EDIT ADDITION START + // NOVA EDIT ADDITION START /// Does this use the advanced reskinning setup? var/uses_advanced_reskins = FALSE - // SKYRAT EDIT ADDITION END + // NOVA EDIT ADDITION END /// A lazylist used for applying fantasy values, contains the actual modification applied to a variable. var/list/fantasy_modifications = null @@ -371,7 +371,7 @@ return if(greyscale_config_worn) worn_icon = SSgreyscale.GetColoredIconByType(greyscale_config_worn, greyscale_colors) - // SKYRAT EDIT ADD START + // NOVA EDIT ADD START if(greyscale_config_worn_digi) worn_icon_digi = SSgreyscale.GetColoredIconByType(greyscale_config_worn_digi, greyscale_colors) if(greyscale_config_worn_muzzled) @@ -390,7 +390,7 @@ worn_icon_taur_paw = SSgreyscale.GetColoredIconByType(greyscale_config_worn_taur_paw, greyscale_colors) if(greyscale_config_worn_taur_hoof) worn_icon_taur_hoof = SSgreyscale.GetColoredIconByType(greyscale_config_worn_taur_hoof, greyscale_colors) - // SKYRAT EDIT ADD END + // NOVA EDIT ADD END if(greyscale_config_inhand_left) lefthand_file = SSgreyscale.GetColoredIconByType(greyscale_config_inhand_left, greyscale_colors) if(greyscale_config_inhand_right) @@ -1189,13 +1189,13 @@ return !HAS_TRAIT(src, TRAIT_NODROP) && !(item_flags & ABSTRACT) /obj/item/proc/doStrip(mob/stripper, mob/owner) - //SKYRAT EDIT CHANGE BEGIN - THIEVING GLOVES - ORIGINAL: return owner.dropItemToGround(src) + //NOVA EDIT CHANGE BEGIN - THIEVING GLOVES - ORIGINAL: return owner.dropItemToGround(src) if (!owner.dropItemToGround(src)) return FALSE if (HAS_TRAIT(stripper, TRAIT_STICKY_FINGERS)) stripper.put_in_hands(src) return TRUE - //SKYRAT EDIT END + //NOVA EDIT END @@ -1409,7 +1409,7 @@ if(SEND_SIGNAL(src, COMSIG_ITEM_OFFER_TAKEN, offerer, taker) & COMPONENT_OFFER_INTERRUPT) return TRUE -/// SKYRAT EDIT ADDITION START +/// NOVA EDIT ADDITION START /obj/item/reskin_obj(mob/M) if(!uses_advanced_reskins) return ..() @@ -1475,7 +1475,7 @@ /obj/item/proc/post_reskin(mob/our_mob) return -/// SKYRAT EDIT ADDITION END +/// NOVA EDIT ADDITION END /// Special stuff you want to do when an outfit equips this item. /obj/item/proc/on_outfit_equip(mob/living/carbon/human/outfit_wearer, visuals_only, item_slot) @@ -1734,3 +1734,6 @@ if (!isnull(tool_behaviour)) return list(tool_behaviour) return null + +/obj/item/animate_atom_living(mob/living/owner) + new /mob/living/simple_animal/hostile/mimic/copy(drop_location(), src, owner) diff --git a/code/game/objects/items/airlock_painter.dm b/code/game/objects/items/airlock_painter.dm index a7a17de8814..eaa28431978 100644 --- a/code/game/objects/items/airlock_painter.dm +++ b/code/game/objects/items/airlock_painter.dm @@ -327,7 +327,6 @@ /datum/asset/spritesheet/decals name = "floor_decals" - cross_round_cachable = TRUE /// The floor icon used for blend_preview_floor() var/preview_floor_icon = 'icons/turf/floors.dmi' @@ -395,7 +394,7 @@ list("Neutral", "#D4D4D432"), list("Dark", "#0e0f0f"), list("Bar Burgundy", "#79150082"), - list("Sec Blue", "#486091"), // SKYRAT EDIT CHANGE + list("Sec Blue", "#486091"), // NOVA EDIT CHANGE list("Cargo Brown", "#A46106"), list("Engi Yellow", "#EFB341"), list("Service Green", "#9FED58"), diff --git a/code/game/objects/items/binoculars.dm b/code/game/objects/items/binoculars.dm index 47b36843d01..5557d457d4a 100644 --- a/code/game/objects/items/binoculars.dm +++ b/code/game/objects/items/binoculars.dm @@ -9,46 +9,21 @@ righthand_file = 'icons/mob/inhands/items_righthand.dmi' slot_flags = ITEM_SLOT_NECK | ITEM_SLOT_BELT w_class = WEIGHT_CLASS_SMALL - var/mob/listeningTo - var/zoom_out_amt = 5.5 - var/zoom_amt = 10 /obj/item/binoculars/Initialize(mapload) . = ..() AddComponent(/datum/component/two_handed, force_unwielded=8, force_wielded=12, wield_callback = CALLBACK(src, PROC_REF(on_wield)), unwield_callback = CALLBACK(src, PROC_REF(on_unwield))) - -/obj/item/binoculars/Destroy() - listeningTo = null - return ..() + AddComponent(/datum/component/scope, range_modifier = 4, zoom_method = ZOOM_METHOD_WIELD) /obj/item/binoculars/proc/on_wield(obj/item/source, mob/user) - RegisterSignal(user, COMSIG_MOVABLE_MOVED, PROC_REF(on_walk)) - RegisterSignal(user, COMSIG_ATOM_DIR_CHANGE, PROC_REF(rotate)) - listeningTo = user user.visible_message(span_notice("[user] holds [src] up to [user.p_their()] eyes."), span_notice("You hold [src] up to your eyes.")) inhand_icon_state = "binoculars_wielded" user.regenerate_icons() - user.client.view_size.zoomOut(zoom_out_amt, zoom_amt, user.dir) - -/obj/item/binoculars/proc/rotate(atom/thing, old_dir, new_dir) - SIGNAL_HANDLER - - if(ismob(thing)) - var/mob/lad = thing - lad.regenerate_icons() - lad.client.view_size.zoomOut(zoom_out_amt, zoom_amt, new_dir) - -/obj/item/binoculars/proc/on_walk() - SIGNAL_HANDLER - - attack_self(listeningTo) //Yes I have sinned, why do you ask? + //Have you ever tried running with binocs on? It takes some willpower not to stop as things appear way too close than they're. + user.add_movespeed_modifier(/datum/movespeed_modifier/binocs_wielded) /obj/item/binoculars/proc/on_unwield(obj/item/source, mob/user) - if(listeningTo) - UnregisterSignal(user, COMSIG_MOVABLE_MOVED) - UnregisterSignal(user, COMSIG_ATOM_DIR_CHANGE) - listeningTo = null user.visible_message(span_notice("[user] lowers [src]."), span_notice("You lower [src].")) inhand_icon_state = "binoculars" user.regenerate_icons() - user.client.view_size.zoomIn() + user.remove_movespeed_modifier(/datum/movespeed_modifier/binocs_wielded) diff --git a/code/game/objects/items/botpad_remote.dm b/code/game/objects/items/botpad_remote.dm index eb8cf8bb905..ff77b088063 100644 --- a/code/game/objects/items/botpad_remote.dm +++ b/code/game/objects/items/botpad_remote.dm @@ -52,7 +52,7 @@ if(connected_botpad.panel_open) user?.balloon_alert(user, "close the panel!") return - if(!(locate(/mob/living/simple_animal/bot) in get_turf(connected_botpad))) + if(!(locate(/mob/living) in get_turf(connected_botpad))) user?.balloon_alert(user, "no bots detected on the pad!") return connected_botpad.launch(user) diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index 195895c44c3..d67b773b5a8 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -92,7 +92,7 @@ var/holopay_name = "holographic pay stand" /// Registered owner's age. - var/registered_age = 18 //SKYRAT EDIT - ORIGINAL (13) + var/registered_age = 18 //NOVA EDIT - ORIGINAL (13) /// The job name registered on the card (for example: Assistant). var/assignment @@ -419,7 +419,7 @@ if(Adjacent(user)) var/minor if(registered_name && registered_age && registered_age < AGE_MINOR) - minor = " [registered_age]" //SKYRAT EDIT CHANGE + minor = " [registered_age]" //NOVA EDIT CHANGE user.visible_message(span_notice("[user] shows you: [icon2html(src, viewers(user))] [src.name][minor]."), span_notice("You show \the [src.name][minor].")) add_fingerprint(user) @@ -569,11 +569,11 @@ if (money_added) to_chat(user, span_notice("You stuff the contents into the card! They disappear in a puff of bluespace smoke, adding [money_added] worth of credits to the linked account.")) return - /// SKYRAT EDIT BEGINS - Trim Tokens - Proc defined in modular_skyrat/modules/trim_tokens/code/cards_id.dm + /// NOVA EDIT BEGINS - Trim Tokens - Proc defined in modular_nova/modules/trim_tokens/code/cards_id.dm else if(istype(W, /obj/item/trim_token)) apply_token(W, user) return - /// SKYRAT EDIT ENDS + /// NOVA EDIT ENDS else return ..() @@ -1005,7 +1005,7 @@ if(istype(old_loc, /obj/item/storage/wallet)) UnregisterSignal(old_loc, list(COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED)) - if(istype(old_loc, /obj/item/modular_computer/pda)) + if(istype(old_loc, /obj/item/modular_computer)) UnregisterSignal(old_loc, list(COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED)) //New loc @@ -1013,7 +1013,7 @@ RegisterSignal(loc, COMSIG_ITEM_EQUIPPED, PROC_REF(update_intern_status)) RegisterSignal(loc, COMSIG_ITEM_DROPPED, PROC_REF(remove_intern_status)) - if(istype(loc, /obj/item/modular_computer/pda)) + if(istype(loc, /obj/item/modular_computer)) RegisterSignal(loc, COMSIG_ITEM_EQUIPPED, PROC_REF(update_intern_status)) RegisterSignal(loc, COMSIG_ITEM_DROPPED, PROC_REF(remove_intern_status)) @@ -1345,7 +1345,7 @@ desc = "A highly advanced chameleon ID card. Touch this card on another ID card or player to choose which accesses to copy. \ Has special magnetic properties which force it to the front of wallets." trim = /datum/id_trim/chameleon - wildcard_slots = WILDCARD_LIMIT_CHAMELEON_PLUS // SKYRAT EDIT - Original WILDCARD_LIMIT_CHAMELEON + wildcard_slots = WILDCARD_LIMIT_CHAMELEON_PLUS // NOVA EDIT - Original WILDCARD_LIMIT_CHAMELEON actions_types = list(/datum/action/item_action/chameleon/change/id, /datum/action/item_action/chameleon/change/id_trim) /// Have we set a custom name and job assignment, or will we use what we're given when we chameleon change? diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm index e9378d505f3..ee78b11c720 100644 --- a/code/game/objects/items/cigs_lighters.dm +++ b/code/game/objects/items/cigs_lighters.dm @@ -43,10 +43,10 @@ CIGARETTE PACKETS ARE IN FANCY.DM /obj/item/match/proc/matchignite() if(lit || burnt) return - //SKYRAT EDIT ADDITION + //NOVA EDIT ADDITION var/turf/my_turf = get_turf(src) my_turf.pollute_turf(/datum/pollutant/sulphur, 5) - //SKYRAT EDIT END + //NOVA EDIT END playsound(src, 'sound/items/match_strike.ogg', 15, TRUE) lit = TRUE icon_state = "match_lit" @@ -173,7 +173,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM /// When choking, what is the maximum amount of time we COULD choke for var/choke_time_max = 30 SECONDS // I am mean - var/pollution_type = /datum/pollutant/smoke //SKYRAT EDIT ADDITION /// What type of pollution does this produce on smoking, changed to weed pollution sometimes + var/pollution_type = /datum/pollutant/smoke //NOVA EDIT ADDITION /// What type of pollution does this produce on smoking, changed to weed pollution sometimes /obj/item/clothing/mask/cigarette/Initialize(mapload) @@ -294,12 +294,12 @@ CIGARETTE PACKETS ARE IN FANCY.DM e.start(src) qdel(src) return - //SKYRAT EDIT ADDITION + //NOVA EDIT ADDITION // Setting the puffed pollutant to cannabis if we're smoking the space drugs reagent(obtained from cannabis) if(reagents.has_reagent(/datum/reagent/drug/space_drugs)) pollution_type = /datum/pollutant/smoke/cannabis // allowing reagents to react after being lit - //SKYRAT EDIT END + //NOVA EDIT END reagents.flags &= ~(NO_REACT) reagents.handle_reactions() @@ -379,10 +379,10 @@ CIGARETTE PACKETS ARE IN FANCY.DM extinguish() return - // SKYRAT EDIT ADDITION START - Pollution + // NOVA EDIT ADDITION START - Pollution var/turf/location = get_turf(src) location.pollute_turf(pollution_type, 5, POLLUTION_PASSIVE_EMITTER_CAP) - // SKYRAT EDIT END + // NOVA EDIT END smoketime -= seconds_per_tick * (1 SECONDS) if(smoketime <= 0) @@ -847,7 +847,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM span_notice("You hear a quiet click, as [user] shuts off [src] without even looking at what [user.p_theyre()] doing. Wow."), span_notice("You quietly shut off [src] without even looking at what you're doing. Wow.") ) - playsound(src, 'modular_skyrat/master_files/sound/items/zippo_close.ogg', 50, TRUE) // SKYRAT EDIT ADDITION + playsound(src, 'modular_nova/master_files/sound/items/zippo_close.ogg', 50, TRUE) // NOVA EDIT ADDITION else user.visible_message( span_notice("[user] quietly shuts off [src]."), @@ -861,7 +861,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM span_notice("Without even breaking stride, [user] flips open and lights [src] in one smooth movement."), span_notice("Without even breaking stride, you flip open and light [src] in one smooth movement.") ) - playsound(src, 'modular_skyrat/master_files/sound/items/zippo_open.ogg', 50, TRUE) // SKYRAT EDIT ADDITION + playsound(src, 'modular_nova/master_files/sound/items/zippo_open.ogg', 50, TRUE) // NOVA EDIT ADDITION return var/hand_protected = FALSE @@ -1053,12 +1053,12 @@ CIGARETTE PACKETS ARE IN FANCY.DM name = "\improper E-Cigarette" desc = "A classy and highly sophisticated electronic cigarette, for classy and dignified gentlemen. A warning label reads \"Warning: Do not fill with flammable materials.\""//<<< i'd vape to that. icon = 'icons/obj/clothing/masks.dmi' - worn_icon_muzzled = 'modular_skyrat/master_files/icons/mob/clothing/mask.dmi' //SKYRAT EDIT: ADDITION + worn_icon_muzzled = 'modular_nova/master_files/icons/mob/clothing/mask.dmi' //NOVA EDIT: ADDITION icon_state = "vape" worn_icon_state = "vape_worn" greyscale_config = /datum/greyscale_config/vape greyscale_config_worn = /datum/greyscale_config/vape/worn - greyscale_config_worn_muzzled = /datum/greyscale_config/vape/worn/muzzled //SKYRAT EDIT ADDITION + greyscale_config_worn_muzzled = /datum/greyscale_config/vape/worn/muzzled //NOVA EDIT ADDITION greyscale_colors = "#2e2e2e" inhand_icon_state = null w_class = WEIGHT_CLASS_TINY @@ -1208,11 +1208,11 @@ CIGARETTE PACKETS ARE IN FANCY.DM //Time to start puffing those fat vapes, yo. COOLDOWN_START(src, drag_cooldown, dragtime) - //SKYRAT EDIT ADDITION + //NOVA EDIT ADDITION //open flame removed because vapes are a closed system, they won't light anything on fire var/turf/my_turf = get_turf(src) my_turf.pollute_turf(/datum/pollutant/smoke/vape, 5, POLLUTION_PASSIVE_EMITTER_CAP) - //SKYRAT EDIT END + //NOVA EDIT END if(obj_flags & EMAGGED) var/datum/effect_system/fluid_spread/smoke/chem/smoke_machine/puff = new diff --git a/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm index 0645ad04165..906f2ec2f95 100644 --- a/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm @@ -283,7 +283,7 @@ /obj/item/circuitboard/machine/turbine_compressor name = "Turbine - Inlet Compressor" greyscale_colors = CIRCUIT_COLOR_ENGINEERING - build_path = /obj/machinery/power/turbine/inlet_compressor/constructed + build_path = /obj/machinery/power/turbine/inlet_compressor req_components = list( /obj/item/stack/cable_coil = 5, /obj/item/stack/sheet/iron = 5) @@ -291,7 +291,7 @@ /obj/item/circuitboard/machine/turbine_rotor name = "Turbine - Core Rotor" greyscale_colors = CIRCUIT_COLOR_ENGINEERING - build_path = /obj/machinery/power/turbine/core_rotor/constructed + build_path = /obj/machinery/power/turbine/core_rotor req_components = list( /obj/item/stack/cable_coil = 5, /obj/item/stack/sheet/iron = 5) @@ -299,7 +299,7 @@ /obj/item/circuitboard/machine/turbine_stator name = "Turbine - Turbine Outlet" greyscale_colors = CIRCUIT_COLOR_ENGINEERING - build_path = /obj/machinery/power/turbine/turbine_outlet/constructed + build_path = /obj/machinery/power/turbine/turbine_outlet req_components = list( /obj/item/stack/cable_coil = 5, /obj/item/stack/sheet/iron = 5) @@ -656,17 +656,17 @@ /obj/machinery/vending/robotics = "Robotech Deluxe", /obj/machinery/vending/engineering = "Robco Tool Maker", /obj/machinery/vending/sovietsoda = "BODA", - /obj/machinery/vending/security = "Armadyne Peacekeeper Equipment Vendor", //SKYRAT EDIT CHANGE - SEC_HUAL - ORIGINAL: /obj/machinery/vending/security = "SecTech", + /obj/machinery/vending/security = "Armadyne Peacekeeper Equipment Vendor", //NOVA EDIT CHANGE - SEC_HUAL - ORIGINAL: /obj/machinery/vending/security = "SecTech", /obj/machinery/vending/modularpc = "Deluxe Silicate Selections", /obj/machinery/vending/tool = "YouTool", /obj/machinery/vending/custom = "Custom Vendor", - /obj/machinery/vending/dorms = "LustWish", //SKYRAT EDIT CHANGE - ERP UPDATE - ORIGINAL: /obj/machinery/vending/dorms = "KinkVend" - /obj/machinery/vending/access/command = "Command Outfitting Station", //SKYRAT EDIT ADDITION - /obj/machinery/vending/barbervend = "Fab-O-Vend", //SKYRAT EDIT ADDITION - /obj/machinery/vending/imported = "NT Sustenance Supplier", //SKYRAT EDIT ADDITION - /obj/machinery/vending/imported/yangyu = "Fudobenda", //SKYRAT EDIT ADDITION - /obj/machinery/vending/imported/mothic = "Nomad Fleet Ration Chit Exchange", //SKYRAT EDIT ADDITION - /obj/machinery/vending/imported/tiziran = "Tiziran Imported Delicacies",) //SKYRAT EDIT ADDITION + /obj/machinery/vending/dorms = "LustWish", //NOVA EDIT CHANGE - ERP UPDATE - ORIGINAL: /obj/machinery/vending/dorms = "KinkVend" + /obj/machinery/vending/access/command = "Command Outfitting Station", //NOVA EDIT ADDITION + /obj/machinery/vending/barbervend = "Fab-O-Vend", //NOVA EDIT ADDITION + /obj/machinery/vending/imported = "NT Sustenance Supplier", //NOVA EDIT ADDITION + /obj/machinery/vending/imported/yangyu = "Fudobenda", //NOVA EDIT ADDITION + /obj/machinery/vending/imported/mothic = "Nomad Fleet Ration Chit Exchange", //NOVA EDIT ADDITION + /obj/machinery/vending/imported/tiziran = "Tiziran Imported Delicacies",) //NOVA EDIT ADDITION /obj/item/circuitboard/machine/vendor/screwdriver_act(mob/living/user, obj/item/tool) var/static/list/display_vending_names_paths diff --git a/code/game/objects/items/cosmetics.dm b/code/game/objects/items/cosmetics.dm index b865d9c4579..68b523932b7 100644 --- a/code/game/objects/items/cosmetics.dm +++ b/code/game/objects/items/cosmetics.dm @@ -6,7 +6,7 @@ gender = PLURAL name = "red lipstick" desc = "A generic brand of lipstick." - icon = 'modular_skyrat/modules/salon/icons/items.dmi' //SKYRAT EDIT CHANGE - ORIGINAL: icon = 'icons/obj/cosmetic.dmi' + icon = 'modular_nova/modules/salon/icons/items.dmi' //NOVA EDIT CHANGE - ORIGINAL: icon = 'icons/obj/cosmetic.dmi' icon_state = "lipstick" inhand_icon_state = "lipstick" w_class = WEIGHT_CLASS_TINY @@ -182,7 +182,7 @@ span_notice("You wipe off [target]'s lipstick.")) target.update_lips(null) -/* SKYRAT EDIT REMOVAL +/* NOVA EDIT REMOVAL /obj/item/razor name = "electric razor" desc = "The latest and greatest power razor born from the science of shaving." diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index 5ba709ef324..3090842b65a 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -14,6 +14,7 @@ #define AVAILABLE_SPRAYCAN_SPACE 8 // enough to fill one radial menu page +#define DRAW_TIME 5 SECONDS #define INFINITE_CHARGES -1 /* @@ -504,11 +505,13 @@ audible_message(span_notice("You hear spraying.")) playsound(user.loc, 'sound/effects/spray.ogg', 5, TRUE, 5) - var/wait_time = 50 + var/wait_time = DRAW_TIME if(paint_mode == PAINT_LARGE_HORIZONTAL) wait_time *= 3 + if(istagger) + wait_time *= 0.5 - if(!instant && !do_after(user, 50, target = target)) + if(!instant && !do_after(user, wait_time, target = target)) return if(!use_charges(user, cost)) @@ -762,6 +765,30 @@ /datum/component/slapcrafting,\ slapcraft_recipes = slapcraft_recipe_list,\ ) + register_context() + register_item_context() + +/obj/item/toy/crayon/spraycan/add_context(atom/source, list/context, obj/item/held_item, mob/living/user) + . = ..() + + if(!user.can_perform_action(src, NEED_DEXTERITY|NEED_HANDS)) + return . + + if(has_cap) + context[SCREENTIP_CONTEXT_ALT_LMB] = "Toggle cap" + + return CONTEXTUAL_SCREENTIP_SET + +/obj/item/toy/crayon/spraycan/add_item_context(datum/source, list/context, atom/target, mob/living/user) + . = ..() + + if(!user.can_perform_action(src, NEED_DEXTERITY|NEED_HANDS)) + return . + + context[SCREENTIP_CONTEXT_LMB] = "Paint" + context[SCREENTIP_CONTEXT_RMB] = "Copy color" + + return CONTEXTUAL_SCREENTIP_SET /obj/item/toy/crayon/spraycan/isValidSurface(surface) return (isfloorturf(surface) || iswallturf(surface)) @@ -1040,3 +1067,4 @@ #undef PAINT_LARGE_HORIZONTAL_ICON #undef INFINITE_CHARGES +#undef DRAW_TIME diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index bfcb42a94b2..269e6ac43f1 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -578,12 +578,12 @@ do_cancel() /obj/item/shockpaddles/proc/do_help(mob/living/carbon/H, mob/living/user) - var/target_synthetic = (H.mob_biotypes & MOB_ROBOTIC) // SKYRAT EDIT ADDITION BEGIN - SYNTH REVIVAL + var/target_synthetic = (H.mob_biotypes & MOB_ROBOTIC) // NOVA EDIT ADDITION BEGIN - SYNTH REVIVAL if (target_synthetic) to_chat(user, span_boldwarning("[H] is a synthetic lifeform! This defibrillator probably isn't calibrated to revive [H.p_them()] properly and could have some serious consequences! \ [span_warning("You might want to [span_blue("surgically revive [H.p_them()]")]...")]")) balloon_alert(user, "target is synthetic!") // immediately grabs their attention even if they dont see chat - // SKYRAT EDIT ADDITION END - SYNTH REVIVAL + // NOVA EDIT ADDITION END - SYNTH REVIVAL user.visible_message(span_warning("[user] begins to place [src] on [H]'s chest."), span_warning("You begin to place [src] on [H]'s chest...")) busy = TRUE update_appearance() @@ -630,10 +630,10 @@ fail_reason = "Patient's brain is missing. Further attempts futile." if (DEFIB_FAIL_BLACKLISTED) fail_reason = "Patient has been blacklisted from revival. Further attempts futile." - //SKYRAT EDIT ADDITION - DNR TRAIT + //NOVA EDIT ADDITION - DNR TRAIT if (DEFIB_FAIL_DNR) fail_reason = "Patient has been flagged as Do Not Resuscitate. Further attempts futile." - //SKYRAT EDIT ADDITION END - DNR TRAIT + //NOVA EDIT ADDITION END - DNR TRAIT if(fail_reason) user.visible_message(span_warning("[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - [fail_reason]")) @@ -663,14 +663,14 @@ H.revive() H.emote("gasp") H.set_jitter_if_lower(200 SECONDS) - to_chat(H, "[CONFIG_GET(string/blackoutpolicy)]") //SKYRAT EDIT ADDITION + to_chat(H, "[CONFIG_GET(string/blackoutpolicy)]") //NOVA EDIT ADDITION SEND_SIGNAL(H, COMSIG_LIVING_MINOR_SHOCK) if(HAS_MIND_TRAIT(user, TRAIT_MORBID)) user.add_mood_event("morbid_saved_life", /datum/mood_event/morbid_saved_life) else user.add_mood_event("saved_life", /datum/mood_event/saved_life) log_combat(user, H, "revived", defib) - // SKYRAT EDIT ADDITION BEGIN - SYNTH REVIVAL + // NOVA EDIT ADDITION BEGIN - SYNTH REVIVAL if (target_synthetic) user.visible_message(span_boldwarning("[src] fire a powerful jolt of electricity into [H]'s vulnerable circuitry!")) to_chat(H, span_userdanger("[user]'s defibrillator fires a powerful jolt of electricity into your vulnerable circuitry, overloading it!")) @@ -685,7 +685,7 @@ var/datum/brain_trauma/trauma = brain_organ.gain_trauma_type(SYNTH_DEFIBBED_TRAUMA_SEVERITY, TRAUMA_LIMIT_BASIC) if (!QDELETED(trauma)) addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(remove_synth_defib_trauma), brain_organ, trauma), SYNTH_DEFIBBED_TRAUMA_DURATION) - // SKYRAT EDIT ADDITION END - SYNTH REVIVAL + // NOVA EDIT ADDITION END - SYNTH REVIVAL do_success() return diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm index 75623ed57e8..e5507473fae 100644 --- a/code/game/objects/items/devices/chameleonproj.dm +++ b/code/game/objects/items/devices/chameleonproj.dm @@ -140,9 +140,6 @@ /obj/effect/dummy/chameleon/attack_animal(mob/user, list/modifiers) master.disrupt() -/obj/effect/dummy/chameleon/attack_slime(mob/user, list/modifiers) - master.disrupt() - /obj/effect/dummy/chameleon/attack_alien(mob/user, list/modifiers) master.disrupt() diff --git a/code/game/objects/items/devices/desynchronizer.dm b/code/game/objects/items/devices/desynchronizer.dm index 7a2efbcec7e..e8ce6fe57a4 100644 --- a/code/game/objects/items/devices/desynchronizer.dm +++ b/code/game/objects/items/devices/desynchronizer.dm @@ -1,4 +1,4 @@ -/obj/item/desynchronizer //SKYRAT EDIT - ICON OVERRIDDEN BY AESTHETICS - SEE MODULE +/obj/item/desynchronizer //NOVA EDIT - ICON OVERRIDDEN BY AESTHETICS - SEE MODULE name = "desynchronizer" desc = "An experimental device that can temporarily desynchronize the user from spacetime, effectively making them disappear while it's active." icon = 'icons/obj/devices/syndie_gadget.dmi' diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index d0a94da0cac..f7c9b4eda7d 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -529,7 +529,7 @@ randomize_fuel = FALSE trash_type = /obj/item/trash/candle can_be_extinguished = TRUE - var/scented_type //SKYRAT EDIT ADDITION /// Pollutant type for scented candles + var/scented_type //NOVA EDIT ADDITION /// Pollutant type for scented candles /// The current wax level, used for drawing the correct icon var/current_wax_level = 1 /// The previous wax level, remembered so we only have to make 3 update_appearance calls total as opposed to every tick @@ -690,8 +690,8 @@ light_system = MOVABLE_LIGHT /obj/item/flashlight/emp - special_desc_requirement = EXAMINE_CHECK_SYNDICATE // SKYRAT EDIT - special_desc = "This flashlight is equipped with a miniature EMP generator." //SKYRAT EDIT + special_desc_requirement = EXAMINE_CHECK_SYNDICATE // NOVA EDIT + special_desc = "This flashlight is equipped with a miniature EMP generator." //NOVA EDIT var/emp_max_charges = 4 var/emp_cur_charges = 4 var/charge_timer = 0 diff --git a/code/game/objects/items/devices/gps.dm b/code/game/objects/items/devices/gps.dm index 8103fb491cb..a661c2877d3 100644 --- a/code/game/objects/items/devices/gps.dm +++ b/code/game/objects/items/devices/gps.dm @@ -1,5 +1,5 @@ -/obj/item/gps //SKYRAT EDIT - ICON OVERRIDDEN BY AESTHETICS - SEE MODULE +/obj/item/gps //NOVA EDIT - ICON OVERRIDDEN BY AESTHETICS - SEE MODULE name = "global positioning system" desc = "Helping lost spacemen find their way through the planets since 2016." icon = 'icons/obj/devices/tracker.dmi' diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm index a9046145168..e3b1c2430c2 100644 --- a/code/game/objects/items/devices/laserpointer.dm +++ b/code/game/objects/items/devices/laserpointer.dm @@ -262,18 +262,18 @@ //catpeople: make any felinid near the target to face the target, chance for felinids to pounce at the light, stepping to the target for(var/mob/living/carbon/human/target_felinid in view(1, targloc)) - if(!isfeline(target_felinid) || target_felinid.stat == DEAD || target_felinid.is_blind() || target_felinid.incapacitated()) // SKYRAT EDIT - FELINE TRAITS. Was: isfelinid(H) + if(!isfeline(target_felinid) || target_felinid.stat == DEAD || target_felinid.is_blind() || target_felinid.incapacitated()) // NOVA EDIT - FELINE TRAITS. Was: isfelinid(H) continue if(target_felinid.body_position == STANDING_UP) target_felinid.setDir(get_dir(target_felinid, targloc)) // kitty always looks at the light - //SKYRAT EDIT REMOVAL BEGIN (removes forced felinid movement from laserpointers, also fixes the longstanding windoor negation glitch) + //NOVA EDIT REMOVAL BEGIN (removes forced felinid movement from laserpointers, also fixes the longstanding windoor negation glitch) /* if(prob(effectchance * diode.rating)) target_felinid.visible_message(span_warning("[target_felinid] makes a grab for the light!"), span_userdanger("LIGHT!")) target_felinid.Move(targloc) log_combat(user, target_felinid, "moved with a laser pointer", src) else - SKYRAT EDIT REMOVAL END */ - target_felinid.visible_message(span_notice("[target_felinid] looks briefly distracted by the light."), span_warning("You're briefly tempted by the shiny light...")) //SKYRAT EDIT CHANGE : indent this block if re-enabling above + NOVA EDIT REMOVAL END */ + target_felinid.visible_message(span_notice("[target_felinid] looks briefly distracted by the light."), span_warning("You're briefly tempted by the shiny light...")) //NOVA EDIT CHANGE : indent this block if re-enabling above else target_felinid.visible_message(span_notice("[target_felinid] stares at the light."), span_warning("You stare at the light...")) //The pointer is shining, change its sprite to show @@ -292,9 +292,9 @@ laser.pixel_y = target.pixel_y + rand(-5,5) if(outmsg) - user.visible_message(span_danger("[user] points [src] at [target]!"), outmsg) //SKYRAT EDIT CHANGE - ORIGINAL: to_chat(user, outmsg) + user.visible_message(span_danger("[user] points [src] at [target]!"), outmsg) //NOVA EDIT CHANGE - ORIGINAL: to_chat(user, outmsg) else - user.visible_message(span_notice("[user] points [src] at [target]."), span_notice("You point [src] at [target].")) //SKYRAT EDIT CHANGE - ORIGINAL: to_chat(user, span_info("You point [src] at [target].")) + user.visible_message(span_notice("[user] points [src] at [target]."), span_notice("You point [src] at [target].")) //NOVA EDIT CHANGE - ORIGINAL: to_chat(user, span_info("You point [src] at [target].")) //we have successfully shone our pointer, reduce our battery depending on whether we have an extra lens or not energy -= crystal_lens ? 2 : 1 diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm index 66a8f29ed1d..c845c12b2e4 100644 --- a/code/game/objects/items/devices/multitool.dm +++ b/code/game/objects/items/devices/multitool.dm @@ -10,7 +10,7 @@ -/obj/item/multitool //SKYRAT EDIT - ICON OVERRIDDEN BY AESTHETICS - SEE MODULE +/obj/item/multitool //NOVA EDIT - ICON OVERRIDDEN BY AESTHETICS - SEE MODULE name = "multitool" desc = "Used for pulsing wires to test which to cut. Not recommended by doctors." icon = 'icons/obj/devices/tool.dmi' @@ -67,8 +67,8 @@ // Syndicate device disguised as a multitool; it will turn red when an AI camera is nearby. /obj/item/multitool/ai_detect - special_desc_requirement = EXAMINE_CHECK_SYNDICATE // Skyrat edit - special_desc = "A special sensor embedded stealthily into this device can detect and warn of nearby silicon activity and camera vision range." // Skyrat edit + special_desc_requirement = EXAMINE_CHECK_SYNDICATE // NOVA EDIT + special_desc = "A special sensor embedded stealthily into this device can detect and warn of nearby silicon activity and camera vision range." // NOVA EDIT actions_types = list(/datum/action/item_action/toggle_multitool) var/detect_state = PROXIMITY_NONE var/rangealert = 8 //Glows red when inside diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index c2af9c33821..861dd46109a 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -7,12 +7,12 @@ GLOBAL_LIST_INIT(channel_tokens, list( RADIO_CHANNEL_ENGINEERING = RADIO_TOKEN_ENGINEERING, RADIO_CHANNEL_SECURITY = RADIO_TOKEN_SECURITY, RADIO_CHANNEL_CENTCOM = RADIO_TOKEN_CENTCOM, - RADIO_CHANNEL_FACTION = RADIO_TOKEN_FACTION, //SKYRAT EDIT ADDITION - Faction - RADIO_CHANNEL_CYBERSUN = RADIO_TOKEN_CYBERSUN, //SKYRAT EDIT ADDITION - Mapping - RADIO_CHANNEL_INTERDYNE = RADIO_TOKEN_INTERDYNE, //SKYRAT EDIT ADDITION - Mapping - RADIO_CHANNEL_GUILD = RADIO_TOKEN_GUILD, //SKYRAT EDIT ADDITION - Mapping - RADIO_CHANNEL_TARKON = RADIO_TOKEN_TARKON, //SKYRAT EDIT ADDITION - MAPPING - RADIO_CHANNEL_SOLFED = RADIO_TOKEN_SOLFED, //SKYRAT EDIT ADDITION - SOLFED + RADIO_CHANNEL_FACTION = RADIO_TOKEN_FACTION, //NOVA EDIT ADDITION - Faction + RADIO_CHANNEL_CYBERSUN = RADIO_TOKEN_CYBERSUN, //NOVA EDIT ADDITION - Mapping + RADIO_CHANNEL_INTERDYNE = RADIO_TOKEN_INTERDYNE, //NOVA EDIT ADDITION - Mapping + RADIO_CHANNEL_GUILD = RADIO_TOKEN_GUILD, //NOVA EDIT ADDITION - Mapping + RADIO_CHANNEL_TARKON = RADIO_TOKEN_TARKON, //NOVA EDIT ADDITION - MAPPING + RADIO_CHANNEL_SOLFED = RADIO_TOKEN_SOLFED, //NOVA EDIT ADDITION - SOLFED RADIO_CHANNEL_SYNDICATE = RADIO_TOKEN_SYNDICATE, RADIO_CHANNEL_SUPPLY = RADIO_TOKEN_SUPPLY, RADIO_CHANNEL_SERVICE = RADIO_TOKEN_SERVICE, diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 3375a4d16d1..7a79688e5b5 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -320,7 +320,7 @@ var/datum/signal/subspace/vocal/signal = new(src, freq, speaker, language, message, spans, message_mods) // Independent radios, on the CentCom frequency, reach all independent radios - if (independent && (freq == FREQ_CENTCOM || freq == FREQ_CTF_RED || freq == FREQ_CTF_BLUE || freq == FREQ_CTF_GREEN || freq == FREQ_CTF_YELLOW || freq == FREQ_FACTION || freq == FREQ_CYBERSUN || freq == FREQ_INTERDYNE || freq == FREQ_GUILD || freq == FREQ_TARKON || freq == FREQ_SOLFED)) //SKYRAT EDIT CHANGE - FACTION, MAPPING, SOLFED + if (independent && (freq == FREQ_CENTCOM || freq == FREQ_CTF_RED || freq == FREQ_CTF_BLUE || freq == FREQ_CTF_GREEN || freq == FREQ_CTF_YELLOW || freq == FREQ_FACTION || freq == FREQ_CYBERSUN || freq == FREQ_INTERDYNE || freq == FREQ_GUILD || freq == FREQ_TARKON || freq == FREQ_SOLFED)) //NOVA EDIT CHANGE - FACTION, MAPPING, SOLFED signal.data["compression"] = 0 signal.transmission_method = TRANSMISSION_SUPERSPACE signal.levels = list(0) diff --git a/code/game/objects/items/devices/scanners/gas_analyzer.dm b/code/game/objects/items/devices/scanners/gas_analyzer.dm index fb4a37e6075..76958126f27 100644 --- a/code/game/objects/items/devices/scanners/gas_analyzer.dm +++ b/code/game/objects/items/devices/scanners/gas_analyzer.dm @@ -21,6 +21,7 @@ var/cooldown_time = 250 var/barometer_accuracy // 0 is the best accuracy. var/list/last_gasmix_data + var/ranged_scan_distance = 1 /obj/item/analyzer/Initialize(mapload) . = ..() @@ -131,17 +132,24 @@ return list("gasmixes" = last_gasmix_data) /obj/item/analyzer/attack_self(mob/user, modifiers) - if(user.stat != CONSCIOUS || !user.can_read(src)) //SKYRAT EDIT: Blind People Can Analyze Again + if(user.stat != CONSCIOUS || !user.can_read(src)) //NOVA EDIT: Blind People Can Analyze Again return 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) - if(user.stat != CONSCIOUS || !user.can_read(src)) //SKYRAT EDIT: Blind People Can Analyze Again + if(user.stat != CONSCIOUS || !user.can_read(src)) //NOVA EDIT: Blind People Can Analyze Again return ui_interact(user) +/obj/item/analyzer/afterattack(atom/target, mob/user, proximity_flag, click_parameters) + . = ..() + if(!can_see(user, target, ranged_scan_distance)) + return + . |= AFTERATTACK_PROCESSED_ITEM + atmos_scan(user, (target.return_analyzable_air() ? target : get_turf(target))) + /// Called when our analyzer is used on something /obj/item/analyzer/proc/on_analyze(datum/source, atom/target) SIGNAL_HANDLER @@ -217,10 +225,4 @@ w_class = WEIGHT_CLASS_NORMAL custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 0.2, /datum/material/gold = SMALL_MATERIAL_AMOUNT*3, /datum/material/bluespace=SMALL_MATERIAL_AMOUNT*2) grind_results = list(/datum/reagent/mercury = 5, /datum/reagent/iron = 5, /datum/reagent/silicon = 5) - -/obj/item/analyzer/ranged/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - . = ..() - if(!can_see(user, target, 15)) - return - . |= AFTERATTACK_PROCESSED_ITEM - atmos_scan(user, (target.return_analyzable_air() ? target : get_turf(target))) + ranged_scan_distance = 15 diff --git a/code/game/objects/items/devices/scanners/health_analyzer.dm b/code/game/objects/items/devices/scanners/health_analyzer.dm index e38cc2bc43e..207a8b96533 100644 --- a/code/game/objects/items/devices/scanners/health_analyzer.dm +++ b/code/game/objects/items/devices/scanners/health_analyzer.dm @@ -44,7 +44,7 @@ return BRUTELOSS /obj/item/healthanalyzer/attack_self(mob/user) - if(!user.can_read(src)) //SKYRAT EDIT: Blind People Can Analyze Again + if(!user.can_read(src)) //NOVA EDIT: Blind People Can Analyze Again return scanmode = (scanmode + 1) % SCANMODE_COUNT @@ -57,7 +57,7 @@ /obj/item/healthanalyzer/interact_with_atom(atom/interacting_with, mob/living/user) if(!isliving(interacting_with)) return NONE - if(!user.can_read(src)) //SKYRAT EDIT CHANGE - Blind People Can Analyze Again- ORIGINAL: if(!user.can_read(src) || user.is_blind()) + if(!user.can_read(src)) //NOVA EDIT CHANGE - Blind People Can Analyze Again- ORIGINAL: if(!user.can_read(src) || user.is_blind()) return ITEM_INTERACT_BLOCKING var/mob/living/M = interacting_with @@ -95,7 +95,7 @@ /obj/item/healthanalyzer/interact_with_atom_secondary(atom/interacting_with, mob/living/user) if(!isliving(interacting_with)) return NONE - if(!user.can_read(src)) // SKYRAT EDIT CHANGE - Blind people can analyze again - ORIGINAL: if(!user.can_read(src) || user.is_blind()) + if(!user.can_read(src)) // NOVA EDIT CHANGE - Blind people can analyze again - ORIGINAL: if(!user.can_read(src) || user.is_blind()) return ITEM_INTERACT_BLOCKING chemscan(user, interacting_with) @@ -180,16 +180,16 @@ if (!target.get_organ_slot(ORGAN_SLOT_BRAIN)) // kept exclusively for soul purposes render_list += "Subject lacks a brain.\n" - var/death_consequences_status_text // SKYRAT EDIT ADDITION: Death consequences quirk + var/death_consequences_status_text // NOVA EDIT ADDITION: Death consequences quirk if(iscarbon(target)) var/mob/living/carbon/carbontarget = target if(LAZYLEN(carbontarget.get_traumas())) var/list/trauma_text = list() for(var/datum/brain_trauma/trauma in carbontarget.get_traumas()) - //SKYRAT EDIT: Scary Traits (Bimbo) + //NOVA EDIT: Scary Traits (Bimbo) if(!trauma.display_scanner) continue - //SKYRAT EDIT: Scary Traits (Bimbo) + //NOVA EDIT: Scary Traits (Bimbo) var/trauma_desc = "" switch(trauma.resilience) if(TRAUMA_RESILIENCE_SURGERY) @@ -202,11 +202,11 @@ trauma_desc += "permanent " trauma_desc += trauma.scan_desc trauma_text += trauma_desc - // SKYRAT EDIT ADDITION START: Death Consequences Quirk + // NOVA EDIT ADDITION START: Death Consequences Quirk if (istype(trauma, /datum/brain_trauma/severe/death_consequences)) var/datum/brain_trauma/severe/death_consequences/consequences_trauma = trauma death_consequences_status_text = consequences_trauma.get_health_analyzer_link_text(user) - // SKYRAT EDIT ADDITION END: Death Consequences Quirk + // NOVA EDIT ADDITION END: Death Consequences Quirk render_list += "Cerebral traumas detected: subject appears to be suffering from [english_list(trauma_text)].\n" if(carbontarget.quirks.len) render_list += "Subject Major Disabilities: [carbontarget.get_quirk_string(FALSE, CAT_QUIRK_MAJOR_DISABILITY, from_scan = TRUE)].\n" @@ -404,15 +404,15 @@ render_list += "[cyberimp_detect]\n" // we handled the last
so we don't need handholding - // SKYRAT EDIT ADDITION - Mutant stuff + // NOVA EDIT ADDITION - Mutant stuff if(target.GetComponent(/datum/component/mutant_infection)) render_list += span_userdanger("UNKNOWN PROTO-VIRAL INFECTION DETECTED. ISOLATE IMMEDIATELY.") - // SKYRAT EDIT END + // NOVA EDIT END - // SKYRAT EDIT ADDITION - DEATH CONSEQUENCES QUIRK + // NOVA EDIT ADDITION - DEATH CONSEQUENCES QUIRK if(death_consequences_status_text) render_list += death_consequences_status_text - // SKYRAT EDIT END + // NOVA EDIT END if(tochat) to_chat(user, examine_block(jointext(render_list, "")), trailing_newline = FALSE, type = MESSAGE_TYPE_INFO) @@ -594,7 +594,7 @@ /obj/item/healthanalyzer/simple/interact_with_atom(atom/interacting_with, mob/living/user) if(!isliving(interacting_with)) return NONE - if(!user.can_read(src)) //SKYRAT EDIT CHANGE - Blind People Can Analyze Again - ORIGINAL: if(!user.can_read(src) || user.is_blind()) + if(!user.can_read(src)) //NOVA EDIT CHANGE - Blind People Can Analyze Again - ORIGINAL: if(!user.can_read(src) || user.is_blind()) return ITEM_INTERACT_BLOCKING add_fingerprint(user) diff --git a/code/game/objects/items/devices/scanners/slime_scanner.dm b/code/game/objects/items/devices/scanners/slime_scanner.dm index ab360c6fc0d..92f681649c4 100644 --- a/code/game/objects/items/devices/scanners/slime_scanner.dm +++ b/code/game/objects/items/devices/scanners/slime_scanner.dm @@ -16,7 +16,7 @@ /obj/item/slime_scanner/interact_with_atom(atom/interacting_with, mob/living/user) if(!isliving(interacting_with)) return NONE - if(!user.can_read(src)) //SKYRAT EDIT CHANGE - Blind People Can Analyze Again - ORIGINAL : if(!user.can_read(src) || user.is_blind()) + if(!user.can_read(src)) //NOVA EDIT CHANGE - Blind People Can Analyze Again - ORIGINAL : if(!user.can_read(src) || user.is_blind()) return ITEM_INTERACT_BLOCKING if (!isslime(interacting_with)) to_chat(user, span_warning("This device can only scan slimes!")) @@ -27,12 +27,12 @@ /proc/slime_scan(mob/living/simple_animal/slime/scanned_slime, mob/living/user) var/to_render = "Slime scan results:\ - \n[span_notice("[scanned_slime.slime_type.colour] [scanned_slime.is_adult ? "adult" : "baby"] slime")]\ - \nNutrition: [scanned_slime.nutrition]/[scanned_slime.get_max_nutrition()]" + \n[span_notice("[scanned_slime.slime_type.colour] [scanned_slime.life_stage] slime")]\ + \nNutrition: [scanned_slime.nutrition]/[scanned_slime.max_nutrition]" - if (scanned_slime.nutrition < scanned_slime.get_starve_nutrition()) + if (scanned_slime.nutrition < scanned_slime.starve_nutrition) to_render += "\n[span_warning("Warning: slime is starving!")]" - else if (scanned_slime.nutrition < scanned_slime.get_hunger_nutrition()) + else if (scanned_slime.nutrition < scanned_slime.hunger_nutrition) to_render += "\n[span_warning("Warning: slime is hungry")]" to_render += "\nElectric charge strength: [scanned_slime.powerlevel]\nHealth: [round(scanned_slime.health/scanned_slime.maxHealth,0.01)*100]%" diff --git a/code/game/objects/items/devices/scanners/t_scanner.dm b/code/game/objects/items/devices/scanners/t_scanner.dm index b034c954811..c9f1ae0fd9d 100644 --- a/code/game/objects/items/devices/scanners/t_scanner.dm +++ b/code/game/objects/items/devices/scanners/t_scanner.dm @@ -35,8 +35,7 @@ /obj/item/t_scanner/process() if(!on) - STOP_PROCESSING(SSobj, src) - return null + return PROCESS_KILL scan() /obj/item/t_scanner/proc/scan() diff --git a/code/game/objects/items/devices/swapper.dm b/code/game/objects/items/devices/swapper.dm index ed0f632b381..e2aa385ce93 100644 --- a/code/game/objects/items/devices/swapper.dm +++ b/code/game/objects/items/devices/swapper.dm @@ -45,12 +45,12 @@ if(world.time < next_use) to_chat(user, span_warning("[src] is still recharging.")) return - //SKYRAT EDIT BEGIN + //NOVA EDIT BEGIN var/turf/my_turf = get_turf(src) if(is_away_level(my_turf.z)) to_chat(user, "[src] cannot be used here!") return - //SKYRAT EDIT END + //NOVA EDIT END if(QDELETED(linked_swapper)) to_chat(user, span_warning("[src] is not linked with another swapper.")) return diff --git a/code/game/objects/items/dice.dm b/code/game/objects/items/dice.dm index 789f6250441..8fe83e2e380 100644 --- a/code/game/objects/items/dice.dm +++ b/code/game/objects/items/dice.dm @@ -107,6 +107,12 @@ icon_state = "de6" microwave_riggable = FALSE // You can't melt wood in the microwave +/obj/item/dice/d6/bone + name = "bone die" + desc = "A die carved from a creature's bone. Dried blood marks the indented pits." + icon_state = "db6" + microwave_riggable = FALSE // You can't melt bone in the microwave + /obj/item/dice/d6/space name = "space cube" desc = "A die with six sides. 6 TIMES 255 TIMES 255 TILE TOTAL EXISTENCE, SQUARE YOUR MIND OF EDUCATED STUPID: 2 DOES NOT EXIST." @@ -425,7 +431,7 @@ var/mob/living/carbon/human/human_servant = new(drop_location()) do_smoke(0, holder = src, location = drop_location()) - var/list/mob/dead/observer/candidates = poll_candidates_for_mob("Do you want to play as [user.real_name]'s Servant?", ROLE_WIZARD, ROLE_WIZARD, 5 SECONDS, human_servant) + var/list/mob/dead/observer/candidates = SSpolling.poll_ghost_candidates_for_mob("Do you want to play as [user.real_name]'s Servant?", check_jobban = ROLE_WIZARD, role = ROLE_WIZARD, poll_time = 5 SECONDS, target_mob = human_servant, pic_source = user, role_name_text = "dice servant") if(LAZYLEN(candidates)) var/mob/dead/observer/candidate = pick(candidates) message_admins("[ADMIN_LOOKUPFLW(candidate)] was spawned as Dice Servant") diff --git a/code/game/objects/items/dualsaber.dm b/code/game/objects/items/dualsaber.dm index 0dcb621a80f..04b95f1049b 100644 --- a/code/game/objects/items/dualsaber.dm +++ b/code/game/objects/items/dualsaber.dm @@ -23,15 +23,15 @@ light_on = FALSE attack_verb_continuous = list("attacks", "slashes", "stabs", "slices", "tears", "lacerates", "rips", "dices", "cuts") attack_verb_simple = list("attack", "slash", "stab", "slice", "tear", "lacerate", "rip", "dice", "cut") - block_chance = 45 //SKYRAT EDIT - Lowered ORIGINAL:75 + block_chance = 45 //NOVA EDIT - Lowered ORIGINAL:75 block_sound = 'sound/weapons/block_blade.ogg' max_integrity = 200 armor_type = /datum/armor/item_dualsaber resistance_flags = FIRE_PROOF wound_bonus = -10 bare_wound_bonus = 20 - special_desc_requirement = EXAMINE_CHECK_SYNDICATE_TOY // Skyrat edit - special_desc = "A double bladed energy sword employed by the Syndicate in raids" // Skyrat edit + special_desc_requirement = EXAMINE_CHECK_SYNDICATE_TOY // NOVA EDIT + special_desc = "A double bladed energy sword employed by the Syndicate in raids" // NOVA EDIT item_flags = NO_BLOOD_ON_ITEM var/w_class_on = WEIGHT_CLASS_BULKY var/saber_color = "green" @@ -173,7 +173,7 @@ set_light_color(pick(COLOR_SOFT_RED, LIGHT_COLOR_GREEN, LIGHT_COLOR_LIGHT_CYAN, LIGHT_COLOR_LAVENDER)) open_flame() else - STOP_PROCESSING(SSobj, src) + return PROCESS_KILL /obj/item/dualsaber/IsReflect() if(HAS_TRAIT(src, TRAIT_WIELDED) && prob(block_chance)) diff --git a/code/game/objects/items/dyespray.dm b/code/game/objects/items/dyespray.dm index 6852ac7b0e1..16944d3e386 100644 --- a/code/game/objects/items/dyespray.dm +++ b/code/game/objects/items/dyespray.dm @@ -1,11 +1,11 @@ /obj/item/dyespray name = "hair dye spray" - desc = "A spray to dye hair as well as giving it any gradient you'd like." // SKYRAT EDIT - Making the dyespray change hair color + desc = "A spray to dye hair as well as giving it any gradient you'd like." // NOVA EDIT - Making the dyespray change hair color w_class = WEIGHT_CLASS_TINY icon = 'icons/obj/cosmetic.dmi' icon_state = "dyespray" - var/uses = 40 //SKYRAT EDIT ADDITION + var/uses = 40 //NOVA EDIT ADDITION /obj/item/dyespray/attack_self(mob/user) dye(user, user) @@ -20,13 +20,13 @@ * Arguments: * * target - The mob who we will apply the gradient and gradient color to. */ -/* SKYRAT EDIT REMOVAL - MOVED TO MODULAR (modular_skyrat\master_files\code\game\objects\items\dyekit.dm) +/* NOVA EDIT REMOVAL - MOVED TO MODULAR (modular_nova\master_files\code\game\objects\items\dyekit.dm) /obj/item/dyespray/proc/dye(mob/target, mob/user) if(!ishuman(target)) return - if(!uses) //SKYRAT EDIT ADDITION - return //SKYRAT EDIT ADDITION + if(!uses) //NOVA EDIT ADDITION + return //NOVA EDIT ADDITION var/mob/living/carbon/human/human_target = target var/beard_or_hair = tgui_alert(user, "What do you want to dye?", "Character Preference", list("Hair", "Facial Hair")) diff --git a/code/game/objects/items/emags.dm b/code/game/objects/items/emags.dm index 141e242fc03..f1d66b875c3 100644 --- a/code/game/objects/items/emags.dm +++ b/code/game/objects/items/emags.dm @@ -12,8 +12,8 @@ name = "cryptographic sequencer" //SKYRAT COMMENT: Everyone knows what an emag is, both IC and OOC, they even make toy lookalikes. icon_state = "emag" item_flags = NO_MAT_REDEMPTION | NOBLUDGEON - special_desc_requirement = EXAMINE_CHECK_SYNDICATE // SKYRAT EDIT ADDITION - special_desc = "An specially modified ID card used to break machinery and disable safeties. Notoriously used by Syndicate agents." // Skyrat edit + special_desc_requirement = EXAMINE_CHECK_SYNDICATE // NOVA EDIT ADDITION + special_desc = "An specially modified ID card used to break machinery and disable safeties. Notoriously used by Syndicate agents." // NOVA EDIT slot_flags = ITEM_SLOT_ID worn_icon_state = "emag" var/prox_check = TRUE //If the emag requires you to be in range @@ -36,13 +36,13 @@ icon_state = "hack_o_lantern" /obj/item/card/emagfake - desc = "It's a card with a magnetic strip attached to some circuitry." //SKYRAT EDIT CHANGE + desc = "It's a card with a magnetic strip attached to some circuitry." //NOVA EDIT CHANGE name = "cryptographic sequencer" icon_state = "emag" slot_flags = ITEM_SLOT_ID worn_icon_state = "emag" - special_desc_requirement = EXAMINE_CHECK_SYNDICATE_TOY // SKYRAT EDIT ADDITION - It's a toy, we're not hiding it. - special_desc = "Closer inspection shows that this card is a poorly made replica, with a \"DonkCo\" logo stamped on the back." // SKYRAT EDIT ADDITION + special_desc_requirement = EXAMINE_CHECK_SYNDICATE_TOY // NOVA EDIT ADDITION - It's a toy, we're not hiding it. + special_desc = "Closer inspection shows that this card is a poorly made replica, with a \"DonkCo\" logo stamped on the back." // NOVA EDIT ADDITION /obj/item/card/emagfake/attack_self(mob/user) //for assistants with balls of plasteel if(Adjacent(user)) @@ -85,11 +85,11 @@ * DOORMAG */ /obj/item/card/emag/doorjack - desc = "This dated-looking ID card has been obviously and illegally modified with extra circuitry. Resembles the infamous \"emag\"." //SKYRAT EDIT CHANGE + desc = "This dated-looking ID card has been obviously and illegally modified with extra circuitry. Resembles the infamous \"emag\"." //NOVA EDIT CHANGE name = "modified ID card" icon_state = "doorjack" - special_desc_requirement = EXAMINE_CHECK_SYNDICATE // SKYRAT EDIT ADDITION - special_desc = "Identifies commonly as a \"doorjack\", this illegally modified ID card can disrupt airlock electronics. Has a self recharging cell. Used often by Syndicate agents." // SKYRAT EDIT ADDITION + special_desc_requirement = EXAMINE_CHECK_SYNDICATE // NOVA EDIT ADDITION + special_desc = "Identifies commonly as a \"doorjack\", this illegally modified ID card can disrupt airlock electronics. Has a self recharging cell. Used often by Syndicate agents." // NOVA EDIT ADDITION worn_icon_state = "doorjack" var/type_whitelist //List of types var/charges = 3 diff --git a/code/game/objects/items/extinguisher.dm b/code/game/objects/items/extinguisher.dm index b571688f1a8..0645b2a0108 100644 --- a/code/game/objects/items/extinguisher.dm +++ b/code/game/objects/items/extinguisher.dm @@ -1,7 +1,7 @@ /obj/item/extinguisher name = "fire extinguisher" desc = "A traditional red fire extinguisher." - icon = 'icons/obj/tools.dmi' // SKYRAT EDIT CHANGE - ICON OVERRIDEN IN SKYRAT AESTHETICS - SEE MODULE + icon = 'icons/obj/tools.dmi' // NOVA EDIT CHANGE - ICON OVERRIDEN IN SKYRAT AESTHETICS - SEE MODULE icon_state = "fire_extinguisher0" worn_icon_state = "fire_extinguisher" inhand_icon_state = "fire_extinguisher" diff --git a/code/game/objects/items/flamethrower.dm b/code/game/objects/items/flamethrower.dm index 35f76ab89a1..b7896c64381 100644 --- a/code/game/objects/items/flamethrower.dm +++ b/code/game/objects/items/flamethrower.dm @@ -52,8 +52,7 @@ /obj/item/flamethrower/process() if(!lit || !igniter) - STOP_PROCESSING(SSobj, src) - return null + return PROCESS_KILL var/turf/location = loc if(ismob(location)) var/mob/M = location diff --git a/code/game/objects/items/food/frozen.dm b/code/game/objects/items/food/frozen.dm index 8951165aa80..0bd0cd3a606 100644 --- a/code/game/objects/items/food/frozen.dm +++ b/code/game/objects/items/food/frozen.dm @@ -434,3 +434,16 @@ foodtypes = DAIRY | SUGAR venue_value = FOOD_PRICE_NORMAL crafting_complexity = FOOD_COMPLEXITY_3 + +/obj/item/food/popsicle/meatsicle + name = "Meatsicle" + desc = "A horrific abomination of raw meat, glazed with sugar on a stick, then frozen." + food_reagents = list( + /datum/reagent/consumable/nutriment = 4, + /datum/reagent/consumable/nutriment/fat = 2, + /datum/reagent/consumable/nutriment/protein = 2, + /datum/reagent/consumable/sugar = 4, + ) + overlay_state = "meatsicle" + foodtypes = RAW | MEAT | SUGAR + crafting_complexity = FOOD_COMPLEXITY_4 diff --git a/code/game/objects/items/food/lizard.dm b/code/game/objects/items/food/lizard.dm index 2954b52a9fd..5f7092c64db 100644 --- a/code/game/objects/items/food/lizard.dm +++ b/code/game/objects/items/food/lizard.dm @@ -839,3 +839,109 @@ tastes = list("peanut butter" = 1, "banana" = 1, "rootbread" = 2) foodtypes = FRUIT | NUTS crafting_complexity = FOOD_COMPLEXITY_3 + +/obj/item/food/burger/plain/korta + name = "plain rootburger" + desc = "A simple patty in a rootdough bun." + icon_state = "kortaburger" + icon = 'icons/obj/food/lizard.dmi' + food_reagents = list( + /datum/reagent/consumable/nutriment = 2, + /datum/reagent/consumable/nutriment/protein = 6, + /datum/reagent/consumable/nutriment/vitamin = 1, + ) + foodtypes = NUTS | MEAT + crafting_complexity = FOOD_COMPLEXITY_3 //Gotta make the dough, +1 + +/obj/item/food/burger/rat/korta + name = "rat rootburger" + desc = "Pretty much what you'd expect... Just in a rootdough bun." + icon_state = "ratburger" + icon = 'icons/obj/food/lizard.dmi' + food_reagents = list( + /datum/reagent/consumable/nutriment = 3, + /datum/reagent/consumable/nutriment/protein = 6, + /datum/reagent/consumable/nutriment/vitamin = 2, + ) + tastes = list("dead rat" = 4, "bun" = 2) + foodtypes = NUTS | MEAT | GORE + crafting_complexity = FOOD_COMPLEXITY_3 + +/obj/item/food/burger/rootguffin + name = "root-guffin" + desc = "A cheap and greasy lizard-friendly imitation of an eggs benedict." + icon_state = "rootguffin" + icon = 'icons/obj/food/lizard.dmi' + food_reagents = list( + /datum/reagent/consumable/nutriment = 2, + /datum/reagent/consumable/eggyolk = 3, + /datum/reagent/consumable/nutriment/protein = 7, + /datum/reagent/consumable/nutriment/vitamin = 1, + ) + tastes = list("muffin" = 2, "bacon" = 3) + foodtypes = NUTS | MEAT | BREAKFAST + venue_value = FOOD_PRICE_NORMAL + crafting_complexity = FOOD_COMPLEXITY_4 + +/obj/item/food/burger/rootrib + name = "rootrib" + desc = "An elusive rib shaped burger with limited availablity across the galaxy. Now meeting subhuman requirements." + icon_state = "rootrib" + icon = 'icons/obj/food/lizard.dmi' + food_reagents = list( + /datum/reagent/consumable/nutriment = 2, + /datum/reagent/consumable/nutriment/protein = 7, + /datum/reagent/consumable/nutriment/vitamin = 4, + /datum/reagent/consumable/bbqsauce = 1, + ) + tastes = list("bun" = 2, "pork patty" = 4) + foodtypes = NUTS | MEAT + venue_value = FOOD_PRICE_NORMAL + crafting_complexity = FOOD_COMPLEXITY_4 + +/obj/item/food/burger/rootchicken + name = "chicken rootwich" + desc = "A delicious chicken sandwich, in a soft rootbread roll." + icon_state = "rootchicken" + icon = 'icons/obj/food/lizard.dmi' + food_reagents = list( + /datum/reagent/consumable/nutriment = 3, + /datum/reagent/consumable/mayonnaise = 3, + /datum/reagent/consumable/nutriment/protein = 7, + /datum/reagent/consumable/nutriment/vitamin = 1, + /datum/reagent/consumable/nutriment/fat/oil = 2, + ) + tastes = list("bun" = 2, "chicken" = 4, "God's covenant" = 1) + foodtypes = NUTS | MEAT | FRIED + venue_value = FOOD_PRICE_NORMAL + crafting_complexity = FOOD_COMPLEXITY_4 + +/obj/item/food/burger/rootfish + name = "Fish rootwich" + desc = "Lightly battered fish, sandwiched in a rootroll." + icon_state = "rootfish" + icon = 'icons/obj/food/lizard.dmi' + food_reagents = list( + /datum/reagent/consumable/nutriment = 3, + /datum/reagent/consumable/nutriment/protein = 6, + /datum/reagent/consumable/nutriment/vitamin = 4, + ) + tastes = list("bun" = 4, "fish" = 4) + foodtypes = NUTS | SEAFOOD + venue_value = FOOD_PRICE_EXOTIC + crafting_complexity = FOOD_COMPLEXITY_3 + +/obj/item/food/burger/sloppyroot + name = "sssloppy moe" + desc = "Ground meat mixed with onions and barbeque sssauce, sssloppily plopped onto a rootroll. Delicious, but guaranteed to get your hands dirty." + icon_state = "sloppyroot" + icon = 'icons/obj/food/lizard.dmi' + food_reagents = list( + /datum/reagent/consumable/nutriment = 10, + /datum/reagent/consumable/nutriment/protein = 8, + /datum/reagent/consumable/nutriment/vitamin = 6, + ) + tastes = list("juicy meat" = 4, "BBQ sauce" = 3, "onions" = 2, "bun" = 2) + foodtypes = NUTS | MEAT | VEGETABLES + venue_value = FOOD_PRICE_NORMAL + crafting_complexity = FOOD_COMPLEXITY_4 diff --git a/code/game/objects/items/food/meatdish.dm b/code/game/objects/items/food/meatdish.dm index 205fca79708..b928a460abb 100644 --- a/code/game/objects/items/food/meatdish.dm +++ b/code/game/objects/items/food/meatdish.dm @@ -939,6 +939,39 @@ venue_value = FOOD_PRICE_NORMAL crafting_complexity = FOOD_COMPLEXITY_5 +/obj/item/food/korta_wellington + name = "Kotra wellington" + desc = "A luxurious log of beef, covered in a fine mushroom duxelle and pancetta ham, then bound in korta pastry." + icon = 'icons/obj/food/meat.dmi' + icon_state = "korta_wellington" + food_reagents = list( + /datum/reagent/consumable/nutriment/protein = 21, + /datum/reagent/consumable/nutriment/vitamin = 6, + ) + tastes = list("beef" = 3, "mushrooms" = 1, "pancetta" = 1) + foodtypes = MEAT | VEGETABLES | NUTS + w_class = WEIGHT_CLASS_NORMAL + venue_value = FOOD_PRICE_EXOTIC + crafting_complexity = FOOD_COMPLEXITY_5 + +/obj/item/food/korta_wellington/make_processable() + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/korta_wellington_slice, 3, 3 SECONDS, table_required = TRUE, screentip_verb = "Cut") + +/obj/item/food/korta_wellington_slice + name = "korta wellington slice" + desc = "A slice of korta & beef wellington, topped with a rich gravy. Simply delicious." + icon = 'icons/obj/food/meat.dmi' + icon_state = "korta_wellington_slice" + food_reagents = list( + /datum/reagent/consumable/nutriment/protein = 7, + /datum/reagent/consumable/nutriment/vitamin = 2, + ) + tastes = list("beef" = 3, "mushrooms" = 1, "pancetta" = 1) + foodtypes = MEAT | VEGETABLES | NUTS + w_class = WEIGHT_CLASS_SMALL + venue_value = FOOD_PRICE_NORMAL + crafting_complexity = FOOD_COMPLEXITY_5 + /obj/item/food/roast_dinner name = "roast dinner" desc = "A luxuriously roasted chicken, accompanied by cabbage, parsnip, potatoes, peas, stuffing and a small boat of gravy." diff --git a/code/game/objects/items/food/sweets.dm b/code/game/objects/items/food/sweets.dm index 98f9417811a..5c638077d16 100644 --- a/code/game/objects/items/food/sweets.dm +++ b/code/game/objects/items/food/sweets.dm @@ -232,7 +232,6 @@ metabolization_amount = REAGENTS_METABOLISM /obj/item/food/bubblegum/bubblegum/process() - . = ..() if(iscarbon(loc)) hallucinate(loc) diff --git a/code/game/objects/items/grenades/emgrenade.dm b/code/game/objects/items/grenades/emgrenade.dm index 30e73dfe5ef..42dc891b7e5 100644 --- a/code/game/objects/items/grenades/emgrenade.dm +++ b/code/game/objects/items/grenades/emgrenade.dm @@ -1,4 +1,4 @@ -/obj/item/grenade/empgrenade//SKYRAT EDIT - ICON OVERRIDEN BY AESTHETICS - SEE MODULE +/obj/item/grenade/empgrenade//NOVA EDIT - ICON OVERRIDEN BY AESTHETICS - SEE MODULE name = "classic EMP grenade" desc = "It is designed to wreak havoc on electronic systems." icon_state = "emp" diff --git a/code/game/objects/items/grenades/plastic.dm b/code/game/objects/items/grenades/plastic.dm index 9b44b2ed4a2..8fa6aae5783 100644 --- a/code/game/objects/items/grenades/plastic.dm +++ b/code/game/objects/items/grenades/plastic.dm @@ -119,9 +119,12 @@ message_admins("[ADMIN_LOOKUPFLW(user)] planted [name] on [target.name] at [ADMIN_VERBOSEJMP(target)] with [det_time] second fuse") user.log_message("planted [name] on [target.name] with a [det_time] second fuse.", LOG_ATTACK) + var/icon/target_icon = icon(bomb_target.icon, bomb_target.icon_state) + target_icon.Blend(icon(icon, icon_state), ICON_OVERLAY) + var/image/bomb_target_image = image(target_icon) notify_ghosts( "[user] has planted \a [src] on [target] with a [det_time] second fuse!", - source = bomb_target, + source = bomb_target_image, header = "Explosive Planted", notify_flags = NOTIFY_CATEGORY_NOFLASH, ) diff --git a/code/game/objects/items/holosign_creator.dm b/code/game/objects/items/holosign_creator.dm index 9f5f94d048b..b4835a0d565 100644 --- a/code/game/objects/items/holosign_creator.dm +++ b/code/game/objects/items/holosign_creator.dm @@ -66,15 +66,19 @@ return . 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) - target_holosign.add_hiddenprint(user) - if(color) - target_holosign.color = color + target_holosign = create_holosign(target, user) return . /obj/item/holosign_creator/attack(mob/living/carbon/human/M, mob/user) return +/obj/item/holosign_creator/proc/create_holosign(atom/target, mob/user) + var/atom/new_holosign = new holosign_type(get_turf(target), src) + new_holosign.add_hiddenprint(user) + if(color) + new_holosign.color = color + return new_holosign + /obj/item/holosign_creator/attack_self(mob/user) if(LAZYLEN(signs)) for(var/obj/structure/holosign/hologram as anything in signs) @@ -126,6 +130,49 @@ holosign_type = /obj/structure/holosign/barrier/atmos creation_time = 0 max_signs = 6 + /// Clearview holograms don't catch clicks and are more transparent + var/clearview = FALSE + /// Timer for auto-turning off clearview + var/clearview_timer + +/obj/item/holosign_creator/atmos/Initialize(mapload) + . = ..() + register_context() + +/obj/item/holosign_creator/atmos/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = ..() + if(LAZYLEN(signs)) + context[SCREENTIP_CONTEXT_RMB] = "[clearview ? "Turn off" : "Temporarily activate"] clearview" + return CONTEXTUAL_SCREENTIP_SET + +/obj/item/holosign_creator/atmos/create_holosign(atom/target, mob/user) + var/obj/structure/holosign/barrier/atmos/new_holosign = new holosign_type(get_turf(target), src) + new_holosign.add_hiddenprint(user) + if(color) + new_holosign.color = color + if(clearview) + new_holosign.clearview_transparency() + return new_holosign + +/obj/item/holosign_creator/atmos/attack_self_secondary(mob/user, modifiers) + if(clearview) + reset_hologram_transparency() + balloon_alert(user, "turned off clearview") + return + if(LAZYLEN(signs)) + for(var/obj/structure/holosign/barrier/atmos/hologram as anything in signs) + hologram.clearview_transparency() + clearview = TRUE + balloon_alert(user, "turned on clearview") + clearview_timer = addtimer(CALLBACK(src, PROC_REF(reset_hologram_transparency)), 40 SECONDS, TIMER_STOPPABLE) + return ..() + +/obj/item/holosign_creator/atmos/proc/reset_hologram_transparency() + if(LAZYLEN(signs)) + for(var/obj/structure/holosign/barrier/atmos/hologram as anything in signs) + hologram.reset_transparency() + clearview = FALSE + deltimer(clearview_timer) /obj/item/holosign_creator/medical name = "\improper PENLITE barrier projector" diff --git a/code/game/objects/items/implants/implant_freedom.dm b/code/game/objects/items/implants/implant_freedom.dm index 1fa61c27510..7185695cb2a 100644 --- a/code/game/objects/items/implants/implant_freedom.dm +++ b/code/game/objects/items/implants/implant_freedom.dm @@ -43,10 +43,10 @@ return dat /obj/item/implanter/freedom - name = "implanter" // Skyrat edit , was implanter (freedom) + name = "implanter" // NOVA EDIT , was implanter (freedom) imp_type = /obj/item/implant/freedom - special_desc_requirement = EXAMINE_CHECK_SYNDICATE // Skyrat edit - special_desc = "A Syndicate implanter used for a freedom implant" // Skyrat edit + special_desc_requirement = EXAMINE_CHECK_SYNDICATE // NOVA EDIT + special_desc = "A Syndicate implanter used for a freedom implant" // NOVA EDIT /obj/item/implantcase/freedom name = "implant case - 'Freedom'" diff --git a/code/game/objects/items/implants/implant_misc.dm b/code/game/objects/items/implants/implant_misc.dm index 5f06071cd5c..da83974c237 100644 --- a/code/game/objects/items/implants/implant_misc.dm +++ b/code/game/objects/items/implants/implant_misc.dm @@ -26,10 +26,10 @@ qdel(src) /obj/item/implanter/emp - name = "implanter" // Skyrat edit, was implanter (EMP) + name = "implanter" // NOVA EDIT, was implanter (EMP) imp_type = /obj/item/implant/emp - special_desc_requirement = EXAMINE_CHECK_SYNDICATE // Skyrat edit - special_desc = "A Syndicate implanter used for a EMP implant" // Skyrat edit + special_desc_requirement = EXAMINE_CHECK_SYNDICATE // NOVA EDIT + special_desc = "A Syndicate implanter used for a EMP implant" // NOVA EDIT /obj/item/implant/radio name = "internal radio implant" @@ -88,8 +88,8 @@ imp_type = /obj/item/implant/radio /obj/item/implanter/radio/syndicate - name = "implanter" // Skyrat edit , was originally implanter (internal syndicate radio) + name = "implanter" // NOVA EDIT , was originally implanter (internal syndicate radio) imp_type = /obj/item/implant/radio/syndicate - special_desc_requirement = EXAMINE_CHECK_SYNDICATE // Skyrat edit - special_desc = "A Syndicate implanter used for a internal radio implant" // Skyrat edit + special_desc_requirement = EXAMINE_CHECK_SYNDICATE // NOVA EDIT + special_desc = "A Syndicate implanter used for a internal radio implant" // NOVA EDIT diff --git a/code/game/objects/items/implants/implant_stealth.dm b/code/game/objects/items/implants/implant_stealth.dm index 101cc4a807d..fe7e342f08d 100644 --- a/code/game/objects/items/implants/implant_stealth.dm +++ b/code/game/objects/items/implants/implant_stealth.dm @@ -4,10 +4,10 @@ actions_types = list(/datum/action/item_action/agent_box) /obj/item/implanter/stealth - name = "implanter" // Skyrat edit , was originaly implanter (stealth) + name = "implanter" // NOVA EDIT , was originaly implanter (stealth) imp_type = /obj/item/implant/stealth - special_desc_requirement = EXAMINE_CHECK_SYNDICATE // Skyrat edit - special_desc = "A Syndicate implanter used for a stealth implant" // Skyrat edit + special_desc_requirement = EXAMINE_CHECK_SYNDICATE // NOVA EDIT + special_desc = "A Syndicate implanter used for a stealth implant" // NOVA EDIT //Box Object diff --git a/code/game/objects/items/implants/implant_storage.dm b/code/game/objects/items/implants/implant_storage.dm index e3ba30b4705..76f6b2547f7 100644 --- a/code/game/objects/items/implants/implant_storage.dm +++ b/code/game/objects/items/implants/implant_storage.dm @@ -40,7 +40,7 @@ return ..() /obj/item/implanter/storage - name = "implanter" // Skyrat edit , original was implanter (storage) + name = "implanter" // NOVA EDIT , original was implanter (storage) imp_type = /obj/item/implant/storage - special_desc_requirement = EXAMINE_CHECK_SYNDICATE // Skyrat edit - special_desc = "A Syndicate implanter used for a storage implant" // Skyrat edit + special_desc_requirement = EXAMINE_CHECK_SYNDICATE // NOVA EDIT + special_desc = "A Syndicate implanter used for a storage implant" // NOVA EDIT diff --git a/code/game/objects/items/implants/implantcase.dm b/code/game/objects/items/implants/implantcase.dm index 56a16f3058c..b209f1eccff 100644 --- a/code/game/objects/items/implants/implantcase.dm +++ b/code/game/objects/items/implants/implantcase.dm @@ -1,7 +1,7 @@ /** * Item used to store implants. Can be renamed with a pen. Implants are moved between those and implanters when a mob uses an implanter on a case. */ -/obj/item/implantcase//SKYRAT EDIT - ICON OVERRIDEN BY AESTHETICS - SEE MODULE +/obj/item/implantcase//NOVA EDIT - ICON OVERRIDEN BY AESTHETICS - SEE MODULE name = "implant case" desc = "A glass case containing an implant." icon = 'icons/obj/medical/syringe.dmi' diff --git a/code/game/objects/items/implants/implanter.dm b/code/game/objects/items/implants/implanter.dm index d44b42d7a9f..c03e519f0f4 100644 --- a/code/game/objects/items/implants/implanter.dm +++ b/code/game/objects/items/implants/implanter.dm @@ -1,7 +1,7 @@ /** * Players can use this item to put obj/item/implant's in living mobs. Can be renamed with a pen. */ -/obj/item/implanter//SKYRAT EDIT - ICON OVERRIDEN BY AESTHETICS - SEE MODULE +/obj/item/implanter//NOVA EDIT - ICON OVERRIDEN BY AESTHETICS - SEE MODULE name = "implanter" desc = "A sterile automatic implant injector." icon = 'icons/obj/medical/syringe.dmi' diff --git a/code/game/objects/items/implants/implantpad.dm b/code/game/objects/items/implants/implantpad.dm index 6a1b662f64e..ab899c3f048 100644 --- a/code/game/objects/items/implants/implantpad.dm +++ b/code/game/objects/items/implants/implantpad.dm @@ -1,4 +1,4 @@ -/obj/item/implantpad//SKYRAT EDIT - ICON OVERRIDEN BY AESTHETICS - SEE MODULE +/obj/item/implantpad//NOVA EDIT - ICON OVERRIDEN BY AESTHETICS - SEE MODULE name = "implant pad" desc = "Used to modify implants." icon = 'icons/obj/devices/tool.dmi' diff --git a/code/game/objects/items/implants/implantuplink.dm b/code/game/objects/items/implants/implantuplink.dm index 3631ddc94ae..278c97ed6c9 100644 --- a/code/game/objects/items/implants/implantuplink.dm +++ b/code/game/objects/items/implants/implantuplink.dm @@ -16,7 +16,7 @@ if(!uplink_flag) uplink_flag = src.uplink_flag src.uplink_handler = uplink_handler - RegisterSignal(src, COMSIG_COMPONENT_REMOVING, PROC_REF(_component_removal)) + RegisterSignal(src, COMSIG_COMPONENT_REMOVING, PROC_REF(on_component_removing)) /obj/item/implant/uplink/implant(mob/living/carbon/target, mob/user, silent, force) . = ..() @@ -34,26 +34,30 @@ * generally by admin verbs or var editing. Implant does nothing without * the component, so delete itself. */ -/obj/item/implant/uplink/proc/_component_removal(datum/source, datum/component/component) +/obj/item/implant/uplink/proc/on_component_removing(datum/source, datum/component/component) SIGNAL_HANDLER + + if (QDELING(src)) + return + if(istype(component, /datum/component/uplink)) qdel(src) /obj/item/implanter/uplink - name = "implanter" // Skyrat edit , original was implanter (uplink) + name = "implanter" // NOVA EDIT , original was implanter (uplink) imp_type = /obj/item/implant/uplink - special_desc_requirement = EXAMINE_CHECK_SYNDICATE // Skyrat edit - special_desc = "A Syndicate implanter for an uplink" // Skyrat edit + special_desc_requirement = EXAMINE_CHECK_SYNDICATE // NOVA EDIT + special_desc = "A Syndicate implanter for an uplink" // NOVA EDIT /obj/item/implanter/uplink/Initialize(mapload, uplink_handler) imp = new imp_type(src, uplink_handler) return ..() /obj/item/implanter/uplink/precharged - name = "implanter" // Skyrat edit , original was implanter (precharged uplink) + name = "implanter" // NOVA EDIT , original was implanter (precharged uplink) imp_type = /obj/item/implant/uplink/precharged - special_desc_requirement = EXAMINE_CHECK_SYNDICATE // Skyrat edit - special_desc = "A Syndicate implanter for a precharged uplink" // Skyrat edit + special_desc_requirement = EXAMINE_CHECK_SYNDICATE // NOVA EDIT + special_desc = "A Syndicate implanter for a precharged uplink" // NOVA EDIT /obj/item/implant/uplink/precharged starting_tc = TELECRYSTALS_PRELOADED_IMPLANT diff --git a/code/game/objects/items/inducer.dm b/code/game/objects/items/inducer.dm index f6ed89a870f..35c73a8cb95 100644 --- a/code/game/objects/items/inducer.dm +++ b/code/game/objects/items/inducer.dm @@ -172,12 +172,19 @@ return . += "inducer-[cell ? "bat" : "nobat"]" +/obj/item/inducer/empty + cell_type = null + opened = TRUE + +/obj/item/inducer/orderable + cell_type = /obj/item/stock_parts/cell/inducer_supply + opened = FALSE + /obj/item/inducer/sci icon_state = "inducer-sci" inhand_icon_state = "inducer-sci" desc = "A tool for inductively charging internal power cells. This one has a science color scheme, and is less potent than its engineering counterpart." cell_type = null - powertransfer = 500 opened = TRUE /obj/item/inducer/sci/Initialize(mapload) diff --git a/code/game/objects/items/kirby_plants/kirbyplants.dm b/code/game/objects/items/kirby_plants/kirbyplants.dm index 74a0c8637e8..e06db9abda0 100644 --- a/code/game/objects/items/kirby_plants/kirbyplants.dm +++ b/code/game/objects/items/kirby_plants/kirbyplants.dm @@ -2,12 +2,11 @@ /obj/item/kirbyplants name = "potted plant" //icon = 'icons/obj/fluff/flora/plants.dmi' // ORIGINAL - icon = 'modular_skyrat/modules/aesthetics/plants/plants.dmi' // SKYRAT EDIT CHANGE + icon = 'modular_nova/modules/aesthetics/plants/plants.dmi' // NOVA EDIT CHANGE icon_state = "plant-01" base_icon_state = "plant-01" desc = "A little bit of nature contained in a pot." layer = ABOVE_MOB_LAYER - plane = GAME_PLANE_UPPER w_class = WEIGHT_CLASS_HUGE force = 10 throwforce = 13 @@ -23,7 +22,7 @@ var/custom_plant_name = FALSE var/list/static/random_plant_states /// Maximum icon state number - KEEP THIS UP TO DATE - var/random_state_cap = 43 // SKYRAT EDIT ADDITION + var/random_state_cap = 43 // NOVA EDIT ADDITION /obj/item/kirbyplants/Initialize(mapload) . = ..() @@ -77,14 +76,14 @@ /obj/item/kirbyplants/proc/generate_states() random_plant_states = list() - for(var/i in 1 to random_state_cap) //SKYRAT EDIT CHANGE - ORIGINAL: for(var/i in 1 to 24) + for(var/i in 1 to random_state_cap) //NOVA EDIT CHANGE - ORIGINAL: for(var/i in 1 to 24) var/number if(i < 10) number = "0[i]" else number = "[i]" random_plant_states += "plant-[number]" - random_plant_states += list("applebush", "monkeyplant") //SKYRAT EDIT CHANGE - ORIGINAL:random_plant_states += "applebush" + random_plant_states += list("applebush", "monkeyplant") //NOVA EDIT CHANGE - ORIGINAL:random_plant_states += "applebush" /obj/item/kirbyplants/random icon = 'icons/obj/fluff/flora/_flora.dmi' @@ -93,7 +92,7 @@ /obj/item/kirbyplants/random/Initialize(mapload) . = ..() //icon = 'icons/obj/flora/plants.dmi' // ORIGINAL - icon = 'modular_skyrat/modules/aesthetics/plants/plants.dmi' //SKYRAT EDIT CHANGE + icon = 'modular_nova/modules/aesthetics/plants/plants.dmi' //NOVA EDIT CHANGE randomize_base_icon_state() //Handles randomizing the icon during initialize() @@ -128,13 +127,13 @@ base_icon_state = "plant-[rand(26, 29)]" update_appearance(UPDATE_ICON) -//SKYRAT EDIT ADDITION START +//NOVA EDIT ADDITION START /obj/item/kirbyplants/monkey name = "monkey plant" desc = "Something that seems to have been made by the Nanotrasen science division, one might call it an abomination. It's heads seem... alive." icon_state = "monkeyplant" trimmable = FALSE -//SKYRAT EDIT ADDITION END +//NOVA EDIT ADDITION END /obj/item/kirbyplants/photosynthetic name = "photosynthetic potted plant" diff --git a/code/game/objects/items/mail.dm b/code/game/objects/items/mail.dm index d058f96a40c..eb0730c1101 100644 --- a/code/game/objects/items/mail.dm +++ b/code/game/objects/items/mail.dm @@ -64,8 +64,8 @@ ACCOUNT_SRV = COLOR_PALE_GREEN_GRAY, ACCOUNT_CAR = COLOR_BEIGE, ACCOUNT_SEC = COLOR_PALE_RED_GRAY, - ACCOUNT_CMD = COLOR_BLUE_GRAY, // SKYRAT EDIT ADDITION - ACCOUNT_CCM = COLOR_DARK_MODERATE_LIME_GREEN, // SKYRAT EDIT ADDITION + ACCOUNT_CMD = COLOR_BLUE_GRAY, // NOVA EDIT ADDITION + ACCOUNT_CCM = COLOR_DARK_MODERATE_LIME_GREEN, // NOVA EDIT ADDITION ) // Icons @@ -154,14 +154,18 @@ /obj/item/mail/examine_more(mob/user) . = ..() - var/list/msg = list(span_notice("You notice the postmarking on the front of the mail...")) + if(!postmarked) + . += span_info("This mail has no postmarking of any sort...") + else + . += span_notice("You notice the postmarking on the front of the mail...") var/datum/mind/recipient = recipient_ref.resolve() if(recipient) - msg += "\t[span_info("Certified NT mail for [recipient].")]" + . += span_info("[postmarked ? "Certified NT" : "Uncertfieid"] mail for [recipient].") + else if(postmarked) + . += span_info("Certified mail for [GLOB.station_name].") else - msg += "\t[span_info("Certified mail for [GLOB.station_name].")]" - msg += "\t[span_info("Distribute by hand or via destination tagger using the certified NT disposal system.")]" - return msg + . += span_info("This is a dead letter mail with no recipient.") + . += span_info("Distribute by hand or via destination tagger using the certified NT disposal system.") /// Accepts a mind to initialize goodies for a piece of mail. /obj/item/mail/proc/initialize_for_recipient(datum/mind/recipient) @@ -251,6 +255,8 @@ lid_x = -26 lid_y = 2 paint_jobs = null + ///if it'll show the nt mark on the crate + var/postmarked = TRUE /obj/structure/closet/crate/mail/update_icon_state() . = ..() @@ -261,6 +267,11 @@ else icon_state = "[base_icon_state]sealed" +/obj/structure/closet/crate/mail/update_overlays() + . = ..() + if(postmarked) + . += "mail_nt" + /// Fills this mail crate with N pieces of mail, where N is the lower of the amount var passed, and the maximum capacity of this crate. If N is larger than the number of alive human players, the excess will be junkmail. /obj/structure/closet/crate/mail/proc/populate(amount) var/mail_count = min(amount, storage_capacity) @@ -306,6 +317,19 @@ . = ..() populate(INFINITY) +///Used in the mail strike shuttle loan event +/obj/structure/closet/crate/mail/full/mail_strike + desc = "A post crate from somewhere else. It has no NT logo on it." + postmarked = FALSE + +/obj/structure/closet/crate/mail/full/mail_strike/populate(amount) + var/strike_mail_to_spawn = rand(1, storage_capacity-1) + for(var/i in 1 to strike_mail_to_spawn) + if(prob(95)) + new /obj/item/mail/mail_strike(src) + else + new /obj/item/mail/traitor/mail_strike(src) + return ..(storage_capacity - strike_mail_to_spawn) /// Opened mail crate /obj/structure/closet/crate/mail/preopen @@ -383,7 +407,8 @@ playsound(loc, 'sound/items/poster_ripped.ogg', vol = 50, vary = TRUE) for(var/obj/item/stuff as anything in contents) // Mail and envelope actually can have more than 1 item. if(user.put_in_hands(stuff) && armed) - log_bomber(user, "opened armed mail made by [made_by_cached_name] ([made_by_cached_ckey]), activating", stuff) + var/whomst = made_by_cached_name ? "[made_by_cached_name] ([made_by_cached_ckey])" : "no one in particular" + log_bomber(user, "opened armed mail made by [whomst], activating", stuff) INVOKE_ASYNC(stuff, TYPE_PROC_REF(/obj/item, attack_self), user) qdel(src) return TRUE @@ -414,6 +439,55 @@ after_unwrap(user) return TRUE +///Generic mail used in the mail strike shuttle loan event +/obj/item/mail/mail_strike + name = "dead mail" + desc = "An unmarked parcel of unknown origins, effectively undeliverable." + postmarked = FALSE + generic_goodies = list( + /obj/effect/spawner/random/entertainment/money_medium = 2, + /obj/effect/spawner/random/contraband = 2, + /obj/effect/spawner/random/entertainment/money_large = 1, + /obj/effect/spawner/random/entertainment/coin = 1, + /obj/effect/spawner/random/food_or_drink/any_snack_or_beverage = 1, + /obj/effect/spawner/random/entertainment/drugs = 1, + /obj/effect/spawner/random/contraband/grenades = 1, + ) + +/obj/item/mail/mail_strike/Initialize(mapload) + if(prob(35)) + stamped = FALSE + if(prob(35)) + name = "dead envelope" + icon_state = "mail_large" + goodie_count = 2 + stamp_max = 2 + stamp_offset_y = 5 + . = ..() + color = pick(COLOR_SILVER, COLOR_DARK, COLOR_DRIED_TAN, COLOR_ORANGE_BROWN, COLOR_BROWN, COLOR_SYNDIE_RED) + for(var/goodie in 1 to goodie_count) + var/target_good = pick_weight(generic_goodies) + new target_good(src) + +///Also found in the mail strike shuttle loan. It contains a random grenade that'll be triggered when unwrapped +/obj/item/mail/traitor/mail_strike + name = "dead mail" + desc = "An unmarked parcel of unknown origins, effectively undeliverable." + postmarked = FALSE + +/obj/item/mail/traitor/mail_strike/Initialize(mapload) + if(prob(35)) + stamped = FALSE + if(prob(35)) + name = "dead envelope" + icon_state = "mail_large" + goodie_count = 2 + stamp_max = 2 + stamp_offset_y = 5 + . = ..() + color = pick(COLOR_SILVER, COLOR_DARK, COLOR_DRIED_TAN, COLOR_ORANGE_BROWN, COLOR_BROWN, COLOR_SYNDIE_RED) + new /obj/effect/spawner/random/contraband/grenades/dangerous(src) + /obj/item/storage/mail_counterfeit_device name = "GLA-2 mail counterfeit device" desc = "Device that actually able to counterfeit NT's mail. This device also able to place a trap inside of mail for malicious actions. Trap will \"activate\" any item inside of mail. Also it might be used for contraband purposes. Integrated micro-computer will give you great configuration optionality for your needs." diff --git a/code/game/objects/items/melee/baton.dm b/code/game/objects/items/melee/baton.dm index 01f66c0e4dd..c5602d38687 100644 --- a/code/game/objects/items/melee/baton.dm +++ b/code/game/objects/items/melee/baton.dm @@ -26,7 +26,7 @@ /// The length of the knockdown applied to the user on clumsy_check() var/clumsy_knockdown_time = 18 SECONDS /// How much stamina damage we deal on a successful hit against a living, non-cyborg mob. - var/stamina_damage = 35 // SKYRAT EDIT - Less Stamina Damage (Original: 55) + var/stamina_damage = 35 // NOVA EDIT - Less Stamina Damage (Original: 55) /// Chance of causing force_say() when stunning a human mob var/force_say_chance = 33 /// Can we stun cyborgs? @@ -388,7 +388,7 @@ force = 5 cooldown = 2.5 SECONDS force_say_chance = 80 //very high force say chance because it's funny - stamina_damage = 115 // SKYRAT EDIT: Original 85 + stamina_damage = 115 // NOVA EDIT: Original 85 clumsy_knockdown_time = 24 SECONDS affect_cyborg = TRUE on_stun_sound = 'sound/effects/contractorbatonhit.ogg' @@ -419,7 +419,7 @@ armor_type = /datum/armor/baton_security throwforce = 7 force_say_chance = 50 - stamina_damage = 35 // SKYRAT EDIT - 4 baton crit now (Original: 60) + stamina_damage = 35 // NOVA EDIT - 4 baton crit now (Original: 60) knockdown_time = 5 SECONDS clumsy_knockdown_time = 15 SECONDS cooldown = 2.5 SECONDS @@ -597,7 +597,7 @@ */ /obj/item/melee/baton/security/additional_effects_non_cyborg(mob/living/target, mob/living/user) target.set_jitter_if_lower(40 SECONDS) - // target.set_confusion_if_lower(10 SECONDS) // SKYRAT EDIT REMOVAL + // target.set_confusion_if_lower(10 SECONDS) // NOVA EDIT REMOVAL target.set_stutter_if_lower(16 SECONDS) SEND_SIGNAL(target, COMSIG_LIVING_MINOR_SHOCK) diff --git a/code/game/objects/items/melee/energy.dm b/code/game/objects/items/melee/energy.dm index d07f05169e8..9882f515d0d 100644 --- a/code/game/objects/items/melee/energy.dm +++ b/code/game/objects/items/melee/energy.dm @@ -29,7 +29,7 @@ /// The heat given off when active. var/active_heat = 3500 - // SKYRAT EDIT ADD START + // NOVA EDIT ADD START /// The sound played when the item is turned on var/enable_sound = 'sound/weapons/saberon.ogg' @@ -37,7 +37,7 @@ /// The sound played when the item is turned off var/disable_sound = 'sound/weapons/saberoff.ogg' - // SKYRAT EDIT ADD END + // NOVA EDIT ADD END /datum/armor/melee_energy fire = 100 diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm index a1e25bf0d12..0f30507a905 100644 --- a/code/game/objects/items/melee/misc.dm +++ b/code/game/objects/items/melee/misc.dm @@ -53,7 +53,7 @@ //very imprecise /obj/item/melee/sabre - name = "officer's sabre" //SKYRAT EDIT - Buffed in modular_skyrat/modules/modular_weapons/code/melee.dm + name = "officer's sabre" //NOVA EDIT - Buffed in modular_nova/modules/modular_weapons/code/melee.dm desc = "An elegant weapon, its monomolecular edge is capable of cutting through flesh and bone with ease." icon = 'icons/obj/weapons/sword.dmi' icon_state = "sabre" diff --git a/code/game/objects/items/mop.dm b/code/game/objects/items/mop.dm index 8874b9337db..9528894232d 100644 --- a/code/game/objects/items/mop.dm +++ b/code/game/objects/items/mop.dm @@ -16,7 +16,7 @@ resistance_flags = FLAMMABLE var/mopcount = 0 ///Maximum volume of reagents it can hold. - var/max_reagent_volume = 50 // SKYRAT EDIT - ORIGINAL: 15 + var/max_reagent_volume = 50 // NOVA EDIT - ORIGINAL: 15 var/mopspeed = 1.5 SECONDS force_string = "robust... against germs" var/insertable = TRUE @@ -74,9 +74,9 @@ ADD_TRAIT(src, TRAIT_NODROP, CYBORG_ITEM_TRAIT) /obj/item/mop/advanced - desc = "The most advanced tool in a custodian's arsenal, complete with a condenser for self-wetting! Just think of all the viscera you will clean up with this! Due to the self-wetting technology, it proves very inefficient for cleaning up spills." //SKYRAT EDIT + desc = "The most advanced tool in a custodian's arsenal, complete with a condenser for self-wetting! Just think of all the viscera you will clean up with this! Due to the self-wetting technology, it proves very inefficient for cleaning up spills." //NOVA EDIT name = "advanced mop" - max_reagent_volume = 100 // SKYRAT EDIT - ORIGINAL: 10 + max_reagent_volume = 100 // NOVA EDIT - ORIGINAL: 10 icon_state = "advmop" inhand_icon_state = "advmop" lefthand_file = 'icons/mob/inhands/equipment/custodial_lefthand.dmi' diff --git a/code/game/objects/items/pet_carrier.dm b/code/game/objects/items/pet_carrier.dm index 86c548ea4de..6a5d1280a60 100644 --- a/code/game/objects/items/pet_carrier.dm +++ b/code/game/objects/items/pet_carrier.dm @@ -86,7 +86,7 @@ if(target.mob_size > max_occupant_weight) if(ishuman(target)) var/mob/living/carbon/human/H = target - if(isfeline(H)) // SKYRAT EDIT - FELINE TRAITS. Was: isfelinid(H) + if(isfeline(H)) // NOVA EDIT - FELINE TRAITS. Was: isfelinid(H) to_chat(user, span_warning("You'd need a lot of catnip and treats, plus maybe a laser pointer, for that to work.")) else to_chat(user, span_warning("Humans, generally, do not fit into pet carriers.")) diff --git a/code/game/objects/items/rcd/RPD.dm b/code/game/objects/items/rcd/RPD.dm index 21619310d35..9af1041779e 100644 --- a/code/game/objects/items/rcd/RPD.dm +++ b/code/game/objects/items/rcd/RPD.dm @@ -9,6 +9,8 @@ #define DESTROY_MODE (1<<2) #define REPROGRAM_MODE (1<<3) +#define PIPE_LAYER(num) (1<<(num-1)) + ///Sound to make when we use the item to build/destroy something #define RPD_USE_SOUND 'sound/items/deconstruct.ogg' @@ -198,8 +200,10 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( var/transit_build_speed = 0.5 SECONDS ///Category currently active (Atmos, disposal, transit) var/category = ATMOS_CATEGORY - ///Piping layer we are going to spawn the atmos device in - var/piping_layer = PIPING_LAYER_DEFAULT + ///All pipe layers we are going to spawn the atmos devices in + var/pipe_layers = PIPE_LAYER(3) + ///Are we laying multiple layers per click + var/multi_layer = FALSE ///Layer for disposal ducts var/ducting_layer = DUCT_LAYER_DEFAULT ///Stores the current device to spawn @@ -255,6 +259,13 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( UnregisterSignal(user, COMSIG_MOUSE_SCROLL_ON) return ..() +/obj/item/pipe_dispenser/proc/get_active_pipe_layers() + var/list/layer_nums = list() + for(var/pipe_layer_number in 1 to 5) + if(PIPE_LAYER(pipe_layer_number) & pipe_layers) + layer_nums += pipe_layer_number + return layer_nums + /obj/item/pipe_dispenser/cyborg_unequip(mob/user) UnregisterSignal(user, COMSIG_MOUSE_SCROLL_ON) return ..() @@ -267,7 +278,7 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN if(target.pipe_color && target.piping_layer) paint_color = GLOB.pipe_color_name[target.pipe_color] - piping_layer = target.piping_layer + pipe_layers = PIPE_LAYER(target.piping_layer) balloon_alert(user, "color/layer copied") return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN @@ -304,7 +315,8 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( /obj/item/pipe_dispenser/ui_data(mob/user) var/list/data = list( "category" = category, - "piping_layer" = piping_layer, + "multi_layer" = multi_layer, + "pipe_layers" = pipe_layers, "ducting_layer" = ducting_layer, "categories" = list(), "selected_recipe" = recipe.name, @@ -365,9 +377,25 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( recipe = first_transit p_dir = NORTH playeffect = FALSE - if("piping_layer") - piping_layer = text2num(params["piping_layer"]) + if("pipe_layers") + var/selected_layers = text2num(params["pipe_layers"]) + var/valid_layer = FALSE + for(var/pipe_layer_number in 1 to 5) + if(!(PIPE_LAYER(pipe_layer_number) & selected_layers)) + continue + valid_layer = TRUE + if(!valid_layer) + return + if(multi_layer) + if(pipe_layers != selected_layers) + pipe_layers ^= selected_layers + else + pipe_layers = selected_layers playeffect = FALSE + if("toggle_multi_layer") + if(multi_layer) + pipe_layers = PIPE_LAYER(max(get_active_pipe_layers())) + multi_layer = !multi_layer if("ducting_layer") ducting_layer = text2num(params["ducting_layer"]) playeffect = FALSE @@ -410,9 +438,9 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( var/atom/attack_target = atom_to_attack //So that changing the menu settings doesn't affect the pipes already being built. - var/queued_p_type = recipe.id - var/queued_p_dir = p_dir - var/queued_p_flipped = p_flipped + var/queued_pipe_type = recipe.id + var/queued_pipe_dir = p_dir + var/queued_pipe_flipped = p_flipped //Unwrench pipe before we build one over/paint it, but only if we're not already running a do_after on it already to prevent a potential runtime. if((mode & DESTROY_MODE) && (upgrade_flags & RPD_UPGRADE_UNWRENCH) && istype(attack_target, /obj/machinery/atmospherics) && !(DOING_INTERACTION_WITH_TARGET(user, attack_target))) @@ -420,13 +448,10 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( if(!isatom(attack_target)) //can return null, FALSE if do_after() fails see /obj/machinery/atmospherics/wrench_act() return TRUE - //make sure what we're clicking is valid for the current category - var/static/list/make_pipe_whitelist - if(!make_pipe_whitelist) - make_pipe_whitelist = typecacheof(list(/obj/structure/lattice, /obj/structure/girder, /obj/item/pipe, /obj/structure/window, /obj/structure/grille)) - if(istype(attack_target, /obj/machinery/atmospherics) && mode & BUILD_MODE) + if(istype(attack_target, /obj/machinery/atmospherics) && (mode & BUILD_MODE)) attack_target = get_turf(attack_target) - var/can_make_pipe = (isturf(attack_target) || is_type_in_typecache(attack_target, make_pipe_whitelist)) + + var/can_make_pipe = check_can_make_pipe(attack_target) . = TRUE @@ -507,46 +532,8 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( if(mode & BUILD_MODE) switch(category) //if we've gotten this var, the target is valid if(ATMOS_CATEGORY) //Making pipes - if(!can_make_pipe) + if(!do_pipe_build(attack_target, user, params)) return ..() - playsound(get_turf(src), 'sound/machines/click.ogg', 50, TRUE) - if (recipe.type == /datum/pipe_info/meter) - if(do_after(user, atmos_build_speed, target = attack_target)) - playsound(get_turf(src), RPD_USE_SOUND, 50, TRUE) - var/obj/item/pipe_meter/new_meter = new /obj/item/pipe_meter(get_turf(attack_target)) - new_meter.setAttachLayer(piping_layer) - if(mode & WRENCH_MODE) - new_meter.wrench_act(user, src) - else - if(recipe.all_layers == FALSE && (piping_layer == 1 || piping_layer == 5)) - balloon_alert(user, "can't build on this layer!") - return ..() - if(do_after(user, atmos_build_speed, target = attack_target)) - if(recipe.all_layers == FALSE && (piping_layer == 1 || piping_layer == 5))//double check to stop cheaters (and to not waste time waiting for something that can't be placed) - balloon_alert(user, "can't build on this layer!") - return ..() - playsound(get_turf(src), RPD_USE_SOUND, 50, TRUE) - var/obj/machinery/atmospherics/path = queued_p_type - var/pipe_item_type = initial(path.construction_type) || /obj/item/pipe - var/obj/item/pipe/pipe_type = new pipe_item_type( - get_turf(attack_target), - queued_p_type, - queued_p_dir, - null, - GLOB.pipe_paint_colors[paint_color], - ispath(queued_p_type, /obj/machinery/atmospherics/pipe/smart) ? p_init_dir : null, - ) - if(queued_p_flipped && istype(pipe_type, /obj/item/pipe/trinary/flippable)) - var/obj/item/pipe/trinary/flippable/new_flippable_pipe = pipe_type - new_flippable_pipe.flipped = queued_p_flipped - - pipe_type.update() - pipe_type.add_fingerprint(usr) - pipe_type.set_piping_layer(piping_layer) - if(ispath(queued_p_type, /obj/machinery/atmospherics) && !ispath(queued_p_type, /obj/machinery/atmospherics/pipe/color_adapter)) - pipe_type.add_atom_colour(GLOB.pipe_paint_colors[paint_color], FIXED_COLOUR_PRIORITY) - if(mode & WRENCH_MODE) - pipe_type.wrench_act(user, src) if(DISPOSALS_CATEGORY) //Making disposals pipes if(!can_make_pipe) @@ -557,7 +544,7 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( return playsound(get_turf(src), 'sound/machines/click.ogg', 50, TRUE) if(do_after(user, disposal_build_speed, target = attack_target)) - var/obj/structure/disposalconstruct/new_disposals_segment = new (attack_target, queued_p_type, queued_p_dir, queued_p_flipped) + var/obj/structure/disposalconstruct/new_disposals_segment = new (attack_target, queued_pipe_type, queued_pipe_dir, queued_pipe_flipped) if(!new_disposals_segment.can_place()) balloon_alert(user, "not enough room!") @@ -588,18 +575,18 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( playsound(get_turf(src), 'sound/machines/click.ogg', 50, TRUE) if(do_after(user, transit_build_speed, target = attack_target)) playsound(get_turf(src), RPD_USE_SOUND, 50, TRUE) - if(queued_p_type == /obj/structure/c_transit_tube_pod) + if(queued_pipe_type == /obj/structure/c_transit_tube_pod) var/obj/structure/c_transit_tube_pod/pod = new /obj/structure/c_transit_tube_pod(attack_target) pod.add_fingerprint(usr) if(mode & WRENCH_MODE) pod.wrench_act(user, src) else - var/obj/structure/c_transit_tube/tube = new queued_p_type(attack_target) - tube.setDir(queued_p_dir) + var/obj/structure/c_transit_tube/tube = new queued_pipe_type(attack_target) + tube.setDir(queued_pipe_dir) - if(queued_p_flipped) - tube.setDir(turn(queued_p_dir, 45 + ROTATION_FLIP)) + if(queued_pipe_flipped) + tube.setDir(turn(queued_pipe_dir, 45 + ROTATION_FLIP)) tube.AfterRotation(user, ROTATION_FLIP) tube.add_fingerprint(usr) @@ -609,6 +596,67 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( else return ..() +/obj/item/pipe_dispenser/proc/check_can_make_pipe(atom/target_of_attack) + //make sure what we're clicking is valid for the current category + var/static/list/make_pipe_whitelist = typecacheof(list(/obj/structure/lattice, /obj/structure/girder, /obj/item/pipe, /obj/structure/window, /obj/structure/grille)) + var/can_we_make_pipe = (isturf(target_of_attack) || is_type_in_typecache(target_of_attack, make_pipe_whitelist)) + return can_we_make_pipe + +/obj/item/pipe_dispenser/proc/do_pipe_build(atom/atom_to_target, mob/user, params) + //So that changing the menu settings doesn't affect the pipes already being built. + var/queued_pipe_type = recipe.id + var/queued_pipe_dir = p_dir + var/queued_pipe_flipped = p_flipped + + var/can_make_pipe = check_can_make_pipe(atom_to_target) + var/list/pipe_layer_numbers = get_active_pipe_layers() + var/continued_build = FALSE + for(var/pipe_layer_num in 1 to length(pipe_layer_numbers)) + var/layer_to_build = pipe_layer_numbers[pipe_layer_num] + if(layer_to_build != pipe_layer_numbers[1]) + continued_build = TRUE + if(!layer_to_build) + return FALSE + if(!can_make_pipe) + return FALSE + playsound(get_turf(src), 'sound/machines/click.ogg', 50, vary = TRUE) + if(!continued_build && !do_after(user, atmos_build_speed, target = atom_to_target)) + return FALSE + if(!recipe.all_layers && (layer_to_build == 1 || layer_to_build == 5)) + balloon_alert(user, "can't build on layer [layer_to_build]!") + if(multi_layer) + continue + return FALSE + playsound(get_turf(src), RPD_USE_SOUND, 50, TRUE) + if(recipe.type == /datum/pipe_info/meter) + var/obj/item/pipe_meter/new_meter = new /obj/item/pipe_meter(get_turf(atom_to_target)) + new_meter.setAttachLayer(layer_to_build) + if(mode & WRENCH_MODE) + new_meter.wrench_act(user, src) + else + var/obj/machinery/atmospherics/path = queued_pipe_type + var/pipe_item_type = initial(path.construction_type) || /obj/item/pipe + var/obj/item/pipe/pipe_type = new pipe_item_type( + get_turf(atom_to_target), + queued_pipe_type, + queued_pipe_dir, + null, + GLOB.pipe_paint_colors[paint_color], + ispath(queued_pipe_type, /obj/machinery/atmospherics/pipe/smart) ? p_init_dir : null, + ) + if(queued_pipe_flipped && istype(pipe_type, /obj/item/pipe/trinary/flippable)) + var/obj/item/pipe/trinary/flippable/new_flippable_pipe = pipe_type + new_flippable_pipe.flipped = queued_pipe_flipped + + pipe_type.update() + pipe_type.add_fingerprint(usr) + pipe_type.set_piping_layer(layer_to_build) + if(ispath(queued_pipe_type, /obj/machinery/atmospherics) && !ispath(queued_pipe_type, /obj/machinery/atmospherics/pipe/color_adapter)) + pipe_type.add_atom_colour(GLOB.pipe_paint_colors[paint_color], FIXED_COLOUR_PRIORITY) + if(mode & WRENCH_MODE) + pipe_type.wrench_act(user, src) + return TRUE + /obj/item/pipe_dispenser/attackby(obj/item/item, mob/user, params) if(istype(item, /obj/item/rpd_upgrade)) install_upgrade(item, user) @@ -630,19 +678,22 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( ///Changes the piping layer when the mousewheel is scrolled up or down. /obj/item/pipe_dispenser/proc/mouse_wheeled(mob/source_mob, atom/A, delta_x, delta_y, params) SIGNAL_HANDLER + if(multi_layer) + balloon_alert(source_mob, "turn off multi layer!") + return if(source_mob.incapacitated(IGNORE_RESTRAINTS|IGNORE_STASIS)) return if(source_mob.get_active_held_item() != src) return if(delta_y < 0) - piping_layer = min(PIPING_LAYER_MAX, piping_layer + 1) + pipe_layers = min(PIPE_LAYER(5), pipe_layers << 1) else if(delta_y > 0) - piping_layer = max(PIPING_LAYER_MIN, piping_layer - 1) + pipe_layers = max(PIPE_LAYER(1), pipe_layers >> 1) else //mice with side-scrolling wheels are apparently a thing and fuck this up return SStgui.update_uis(src) - to_chat(source_mob, span_notice("You set the layer to [piping_layer].")) + balloon_alert(source_mob, "set pipe layer to [get_active_pipe_layers()[1]]") /obj/item/rpd_upgrade @@ -666,4 +717,6 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( #undef WRENCH_MODE #undef REPROGRAM_MODE +#undef PIPE_LAYER + #undef RPD_USE_SOUND diff --git a/code/game/objects/items/rcd/RPLD.dm b/code/game/objects/items/rcd/RPLD.dm index c2184bcacf9..0dd78d6a348 100644 --- a/code/game/objects/items/rcd/RPLD.dm +++ b/code/game/objects/items/rcd/RPLD.dm @@ -64,13 +64,13 @@ /obj/machinery/plumbing/pill_press = 20, /obj/machinery/iv_drip/plumbing = 20 ), - // SKYRAT EDIT ADDITION START - static list so we have no choice but to skyrat edit these here + // NOVA EDIT ADDITION START - static list so we have no choice but to NOVA EDIT these here //category 4 liquids "Liquids" = list( /obj/structure/drain = 5, ), - // SKYRAT EDIT ADDITION END + // NOVA EDIT ADDITION END ) /obj/item/construction/plumbing/Initialize(mapload) @@ -335,7 +335,7 @@ /obj/machinery/plumbing/tank = 20, /obj/machinery/plumbing/acclimator = 10, ), - // SKYRAT EDIT ADDITION START - static list so we have no choice but to skyrat edit these here + // NOVA EDIT ADDITION START - static list so we have no choice but to NOVA EDIT these here //category 4 liquids "Liquids" = list( @@ -343,7 +343,7 @@ /obj/machinery/plumbing/floor_pump/input = 20, /obj/machinery/plumbing/floor_pump/output = 20, ), - // SKYRAT EDIT ADDITION END + // NOVA EDIT ADDITION END ) /obj/item/construction/plumbing/research/Initialize(mapload) @@ -385,13 +385,13 @@ /obj/machinery/plumbing/tank = 20, /obj/machinery/plumbing/acclimator = 10, ), - // SKYRAT EDIT ADDITION START - static list so we have no choice but to skyrat edit these here + // NOVA EDIT ADDITION START - static list so we have no choice but to NOVA EDIT these here //category 4 liquids "Liquids" = list( /obj/structure/drain = 5, ), - // SKYRAT EDIT ADDITION END + // NOVA EDIT ADDITION END ) /obj/item/construction/plumbing/service/Initialize(mapload) diff --git a/code/game/objects/items/religion.dm b/code/game/objects/items/religion.dm index e68a1b8c883..2f2d0b4b80e 100644 --- a/code/game/objects/items/religion.dm +++ b/code/game/objects/items/religion.dm @@ -225,7 +225,7 @@ /obj/item/banner/command/Initialize(mapload) . = ..() - job_loyalties = DEPARTMENT_BITFLAG_COMMAND | DEPARTMENT_BITFLAG_CENTRAL_COMMAND //SKYRAT EDIT ADDITION + job_loyalties = DEPARTMENT_BITFLAG_COMMAND | DEPARTMENT_BITFLAG_CENTRAL_COMMAND //NOVA EDIT ADDITION /obj/item/banner/command/mundane inspiration_available = FALSE diff --git a/code/game/objects/items/robot/items/generic.dm b/code/game/objects/items/robot/items/generic.dm index ee3583d5ee6..7ebd87408f6 100644 --- a/code/game/objects/items/robot/items/generic.dm +++ b/code/game/objects/items/robot/items/generic.dm @@ -9,21 +9,6 @@ #define HARM_ALARM_NO_SAFETY_COOLDOWN (60 SECONDS) #define HARM_ALARM_SAFETY_COOLDOWN (20 SECONDS) -/datum/mood_event/borg_touch - description = "Being touched by those manipulators is nice." - mood_change = 2 - timeout = 2 MINUTES - -/datum/mood_event/borg_hug - description = "Those robo-hugs were really nice!" - mood_change = 4 - timeout = 3 MINUTES - -/datum/mood_event/pat_borg - description = "There is something really special about touching my robotic friends!" - mood_change = 4 - timeout = 1 MINUTES - /obj/item/borg icon = 'icons/mob/silicon/robot_items.dmi' @@ -126,12 +111,11 @@ span_notice("You playfully boop [attacked_mob] on the head!"), ) user.do_attack_animation(attacked_mob, ATTACK_EFFECT_BOOP) - SEND_SIGNAL(attacked_mob, COMSIG_BORG_TOUCH_MOB) playsound(loc, 'sound/weapons/tap.ogg', 50, TRUE, -1) else if(ishuman(attacked_mob)) if(user.body_position == LYING_DOWN) user.visible_message( - span_notice("[user] shakes [attacked_mob] trying to get [attacked_mob.p_them()] up!"), + span_notice("[user] shakes [attacked_mob] trying to get [attacked_mob.p_them()] up!"), span_notice("You shake [attacked_mob] trying to get [attacked_mob.p_them()] up!"), ) else @@ -139,7 +123,6 @@ span_notice("[user] hugs [attacked_mob] to make [attacked_mob.p_them()] feel better!"), span_notice("You hug [attacked_mob] to make [attacked_mob.p_them()] feel better!"), ) - SEND_SIGNAL(attacked_mob, COMSIG_BORG_TOUCH_MOB) if(attacked_mob.resting) attacked_mob.set_resting(FALSE, TRUE) else @@ -160,7 +143,6 @@ user.visible_message(span_warning("[user] bops [attacked_mob] on the head!"), span_warning("You bop [attacked_mob] on the head!"), ) - SEND_SIGNAL(attacked_mob, COMSIG_BORG_TOUCH_MOB) user.do_attack_animation(attacked_mob, ATTACK_EFFECT_PUNCH) else if(!(SEND_SIGNAL(attacked_mob, COMSIG_BORG_HUG_MOB, user) & COMSIG_BORG_HUG_HANDLED)) diff --git a/code/game/objects/items/robot/items/hypo.dm b/code/game/objects/items/robot/items/hypo.dm index f91e6275f82..552ea514601 100644 --- a/code/game/objects/items/robot/items/hypo.dm +++ b/code/game/objects/items/robot/items/hypo.dm @@ -8,7 +8,7 @@ /datum/reagent/medicine/salglu_solution,\ /datum/reagent/medicine/spaceacillin,\ /datum/reagent/medicine/lidocaine\ - ) //SKYRAT EDIT line 10 added Lidocaine + ) //NOVA EDIT line 10 added Lidocaine #define EXPANDED_MEDICAL_REAGENTS list(\ /datum/reagent/medicine/haloperidol,\ /datum/reagent/medicine/inacusiate,\ diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index 2af72f17a35..2dcaf1b413e 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -551,14 +551,14 @@ if(robot.hasExpanded) to_chat(usr, span_warning("This unit already has an expand module installed!")) return FALSE - // SKYRAT EDIT BEGIN + // NOVA EDIT BEGIN if(robot.model.model_select_icon == "nomod") to_chat(usr, span_warning("Default models cannot take expand or shrink upgrades.")) return FALSE if((TRAIT_R_WIDE in robot.model.model_features) || (TRAIT_R_TALL in robot.model.model_features)) to_chat(usr, span_warning("This unit's chassis cannot be enlarged any further.")) return FALSE - // SKYRAT EDIT END + // NOVA EDIT END ADD_TRAIT(robot, TRAIT_NO_TRANSFORM, REF(src)) var/prev_lockcharge = robot.lockcharge @@ -576,7 +576,7 @@ robot.set_anchored(FALSE) REMOVE_TRAIT(robot, TRAIT_NO_TRANSFORM, REF(src)) robot.hasExpanded = TRUE - robot.update_transform(1.5) // SKYRAT EDIT CHANGE - ORIGINAL: robot.update_transform(2) + robot.update_transform(1.5) // NOVA EDIT CHANGE - ORIGINAL: robot.update_transform(2) /obj/item/borg/upgrade/expand/deactivate(mob/living/silicon/robot/R, user = usr) . = ..() @@ -584,9 +584,9 @@ if (R.hasExpanded) R.hasExpanded = FALSE //R.update_transform(0.5) // Original - R.update_transform(0.8) // SKYRAT EDIT CHANGE + R.update_transform(0.8) // NOVA EDIT CHANGE -/obj/item/borg/upgrade/rped//SKYRAT EDIT - ICON OVERRIDEN BY AESTHETICS - SEE MODULE +/obj/item/borg/upgrade/rped//NOVA EDIT - ICON OVERRIDEN BY AESTHETICS - SEE MODULE name = "engineering cyborg RPED" desc = "A rapid part exchange device for the engineering cyborg." icon = 'icons/obj/storage/storage.dmi' diff --git a/code/game/objects/items/spear.dm b/code/game/objects/items/spear.dm index 410cddd1fc0..c5d9038a6bd 100644 --- a/code/game/objects/items/spear.dm +++ b/code/game/objects/items/spear.dm @@ -230,12 +230,12 @@ throwforce = 22 armour_penetration = 15 //Enhanced armor piercing custom_materials = list(/datum/material/bone = HALF_SHEET_MATERIAL_AMOUNT * 7) - force_unwielded = 8 // SKYRAT EDIT CHANGE - ORIGINAL: 12 - force_wielded = 16 // SKYRAT EDIT CHANGE - ORIGINAL: 20 + force_unwielded = 8 // NOVA EDIT CHANGE - ORIGINAL: 12 + force_wielded = 16 // NOVA EDIT CHANGE - ORIGINAL: 20 - //SKYRAT EDIT ADDITION BEGIN - increases bone spear range to 2 + //NOVA EDIT ADDITION BEGIN - increases bone spear range to 2 reach = 2 - //SKYRAT EDIT ADDITION END + //NOVA EDIT ADDITION END /obj/item/spear/bonespear/add_headpike_component() var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/headpikebone) diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 309d23aac9f..4228866506a 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -328,7 +328,7 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \ new/datum/stack_recipe("loom", /obj/structure/loom, 10, time = 1.5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_TOOLS), \ new/datum/stack_recipe("mortar", /obj/item/reagent_containers/cup/mortar, 3, check_density = FALSE, category = CAT_CHEMISTRY), \ new/datum/stack_recipe("firebrand", /obj/item/match/firebrand, 2, time = 10 SECONDS, check_density = FALSE, category = CAT_TOOLS), \ - new/datum/stack_recipe("bonfire", /obj/structure/bonfire/player_made, 10, time = 6 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_TOOLS), /* SKYRAT EDIT - Pollution - ORIGINAL: /obj/structure/bonfire */ \ + new/datum/stack_recipe("bonfire", /obj/structure/bonfire/player_made, 10, time = 6 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_TOOLS), /* NOVA EDIT - Pollution - ORIGINAL: /obj/structure/bonfire */ \ new/datum/stack_recipe("easel", /obj/structure/easel, 5, time = 1 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_ENTERTAINMENT), \ new/datum/stack_recipe("noticeboard", /obj/item/wallframe/noticeboard, 1, time = 1 SECONDS, one_per_turf = FALSE, on_solid_ground = FALSE, check_density = FALSE, category = CAT_FURNITURE), \ new/datum/stack_recipe("test tube rack", /obj/item/storage/test_tube_rack, 1, time = 1 SECONDS, check_density = FALSE, category = CAT_CHEMISTRY), \ @@ -769,7 +769,8 @@ GLOBAL_LIST_INIT(bronze_recipes, list ( \ // Sinew slapcrafting will mostly-sinew recipes, and bones will have mostly-bones recipes. var/static/list/slapcraft_recipe_list = list(\ /datum/crafting_recipe/bonedagger, /datum/crafting_recipe/bonespear, /datum/crafting_recipe/boneaxe,\ - /datum/crafting_recipe/bonearmor, /datum/crafting_recipe/skullhelm, /datum/crafting_recipe/bracers + /datum/crafting_recipe/bonearmor, /datum/crafting_recipe/skullhelm, /datum/crafting_recipe/bracers, + /datum/crafting_recipe/ash_recipe/bone_greaves, ) AddComponent( diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index 67b260dcf09..90861953426 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -1134,7 +1134,7 @@ singular_name = "floor tile" desc = "The ground you walk on." //throwforce = 10 //ORIGINAL - throwforce = 6 //SKYRAT EDIT CHANGE + throwforce = 6 //NOVA EDIT CHANGE icon_state = "material_tile" turf_type = /turf/open/floor/material material_flags = MATERIAL_EFFECTS | MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS diff --git a/code/game/objects/items/stacks/wrap.dm b/code/game/objects/items/stacks/wrap.dm index 15247e3051d..a87d2f308a1 100644 --- a/code/game/objects/items/stacks/wrap.dm +++ b/code/game/objects/items/stacks/wrap.dm @@ -83,7 +83,7 @@ parcel.base_icon_state = "deliverypackage5" parcel.update_icon() user.forceMove(parcel) - parcel.contains_mobs = TRUE // SKYRAT EDIT - CARGO BORGS + parcel.contains_mobs = TRUE // NOVA EDIT - CARGO BORGS parcel.add_fingerprint(user) return OXYLOSS else @@ -110,10 +110,10 @@ return if(target.anchored) return - // SKYRAT EDIT START - Cargo borgs + // NOVA EDIT START - Cargo borgs if(!amount) return - // SKYRAT EDIT END + // NOVA EDIT END if(isitem(target)) . |= AFTERATTACK_PROCESSED_ITEM @@ -156,12 +156,12 @@ closet.forceMove(parcel) parcel.add_fingerprint(user) closet.add_fingerprint(user) - // SKYRAT EDIT START - CARGO BORGS + // NOVA EDIT START - CARGO BORGS for(var/item in closet.get_all_contents()) if(istype(item, /mob)) parcel.contains_mobs = TRUE break - // SKYRAT EDIT END + // NOVA EDIT END else balloon_alert(user, "not enough paper!") return diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index a67788f2725..372be881257 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -383,7 +383,7 @@ /obj/item/storage/backpack/satchel/flat/Initialize(mapload) . = ..() - AddElement(/datum/element/undertile, TRAIT_T_RAY_VISIBLE, INVISIBILITY_MAXIMUM, use_anchor = TRUE) // SKYRAT EDIT - Ghosts can't see smuggler's satchels + AddElement(/datum/element/undertile, TRAIT_T_RAY_VISIBLE, INVISIBILITY_MAXIMUM, use_anchor = TRUE) // NOVA EDIT - Ghosts can't see smuggler's satchels atom_storage.max_total_storage = 15 atom_storage.set_holdable(cant_hold_list = list(/obj/item/storage/backpack/satchel/flat)) //muh recursive backpacks) @@ -590,7 +590,7 @@ new /obj/item/surgicaldrill(src) new /obj/item/cautery(src) new /obj/item/surgical_drapes(src) - new /obj/item/clothing/suit/toggle/labcoat/skyrat/hospitalgown(src) //SKYRAT EDIT ADDITION + new /obj/item/clothing/suit/toggle/labcoat/hospitalgown(src) //NOVA EDIT ADDITION new /obj/item/clothing/mask/surgical(src) new /obj/item/blood_filter(src) @@ -643,13 +643,13 @@ unzip_duration = 0.5 SECONDS unzip_sfx = 'sound/items/zip_up.ogg' -//SKYRAT EDIT CHANGE START - It's just a black duffel. +//NOVA EDIT CHANGE START - It's just a black duffel. /obj/item/storage/backpack/duffelbag/syndie name = "tactical duffel bag" desc = "A large duffel bag for holding extra tactical supplies." special_desc_requirement = EXAMINE_CHECK_SYNDICATE special_desc = "This duffel bag has the Syndicate logo stiched on the inside. It appears to be made from lighter yet sturdier materials, and features an oiled plastitanium zipper for maximum speed tactical zipping." -//SKYRAT EDIT CHANGE END +//NOVA EDIT CHANGE END /obj/item/storage/backpack/duffelbag/syndie/hitman desc = "A large duffel bag for holding extra things. There is a Nanotrasen logo on the back." @@ -674,11 +674,11 @@ /obj/item/storage/backpack/duffelbag/syndie/surgery name = "surgery duffel bag" - desc = "A large duffel bag for holding extra supplies - this one has a material inlay with space for various sharp-looking tools." //SKYRAT EDIT CHANGE, to match the security surgery bag + desc = "A large duffel bag for holding extra supplies - this one has a material inlay with space for various sharp-looking tools." //NOVA EDIT CHANGE, to match the security surgery bag icon_state = "duffel-syndiemed" inhand_icon_state = "duffel-syndiemed" - special_desc_requirement = EXAMINE_CHECK_SYNDICATE // SKYRAT EDIT ADDITION - special_desc = "This duffel bag has the Syndicate logo stiched on the inside. It appears to be made from lighter yet sturdier materials." // SKYRAT EDIT ADDITION + special_desc_requirement = EXAMINE_CHECK_SYNDICATE // NOVA EDIT ADDITION + special_desc = "This duffel bag has the Syndicate logo stiched on the inside. It appears to be made from lighter yet sturdier materials." // NOVA EDIT ADDITION /obj/item/storage/backpack/duffelbag/syndie/surgery/PopulateContents() new /obj/item/scalpel/advanced(src) diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index 01f075597c4..bc331db0775 100644 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -95,18 +95,18 @@ SSwardrobe.provide_type(/obj/item/multitool, src) SSwardrobe.provide_type(/obj/item/stack/cable_coil, src) SSwardrobe.provide_type(/obj/item/extinguisher/mini, src) - SSwardrobe.provide_type(/obj/item/analyzer/ranged, src) //SKYRAT EDIT - Ranged Analyzer for CE - ORIGINAL: SSwardrobe.provide_type(/obj/item/analyzer, src) + SSwardrobe.provide_type(/obj/item/analyzer/ranged, src) //NOVA EDIT - Ranged Analyzer for CE - ORIGINAL: SSwardrobe.provide_type(/obj/item/analyzer, src) //much roomier now that we've managed to remove two tools /obj/item/storage/belt/utility/chief/full/get_types_to_preload() var/list/to_preload = list() //Yes this is a pain. Yes this is the point to_preload += /obj/item/screwdriver/power to_preload += /obj/item/crowbar/power - to_preload += /obj/item/weldingtool/electric // SKYRAT EDIT - Electric welder + to_preload += /obj/item/weldingtool/electric // NOVA EDIT - Electric welder to_preload += /obj/item/multitool to_preload += /obj/item/stack/cable_coil to_preload += /obj/item/extinguisher/mini - to_preload += /obj/item/analyzer/ranged // SKYRAT EDIT - Ranged Analyzer for CE + to_preload += /obj/item/analyzer/ranged // NOVA EDIT - Ranged Analyzer for CE return to_preload /obj/item/storage/belt/utility/full/PopulateContents() @@ -135,7 +135,7 @@ /obj/item/storage/belt/utility/full/powertools/PopulateContents() new /obj/item/screwdriver/power(src) new /obj/item/crowbar/power(src) - new /obj/item/weldingtool/electric(src) // SKYRAT EDIT - original: new /obj/item/weldingtool/experimental(src) + new /obj/item/weldingtool/electric(src) // NOVA EDIT - original: new /obj/item/weldingtool/experimental(src) new /obj/item/multitool(src) new /obj/item/holosign_creator/atmos(src) new /obj/item/extinguisher/mini(src) @@ -225,7 +225,7 @@ /obj/item/clothing/mask/breath, /obj/item/clothing/mask/muzzle, /obj/item/clothing/mask/surgical, - /obj/item/clothing/suit/toggle/labcoat/skyrat/hospitalgown, //SKYRAT EDIT ADDITION - adds surgery gowns to belts + /obj/item/clothing/suit/toggle/labcoat/hospitalgown, //NOVA EDIT ADDITION - adds surgery gowns to belts /obj/item/construction/plumbing, /obj/item/dnainjector, /obj/item/extinguisher/mini, @@ -235,7 +235,7 @@ /obj/item/healthanalyzer, /obj/item/hemostat, /obj/item/holosign_creator/medical, - /obj/item/hypospray/mkii, //SKYRAT EDIT ADDITION - HYPOSPRAYS + /obj/item/hypospray/mkii, //NOVA EDIT ADDITION - HYPOSPRAYS /obj/item/implant, /obj/item/implantcase, /obj/item/implanter, @@ -248,7 +248,7 @@ /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/cup/beaker, /obj/item/reagent_containers/cup/bottle, - /obj/item/reagent_containers/cup/vial, //SKYRAT EDIT ADDITION - HYPOSPRAYS + /obj/item/reagent_containers/cup/vial, //NOVA EDIT ADDITION - HYPOSPRAYS /obj/item/reagent_containers/cup/tube, /obj/item/reagent_containers/hypospray, /obj/item/reagent_containers/medigel, @@ -267,8 +267,8 @@ /obj/item/surgical_drapes, //for true paramedics /obj/item/surgicaldrill, /obj/item/tank/internals/emergency_oxygen, - /obj/item/weaponcell/medical, //SKYRAT EDIT MEDIGUNS - /obj/item/handheld_soulcatcher, // SKYRAT EDIT SOULCATCHERS + /obj/item/weaponcell/medical, //NOVA EDIT MEDIGUNS + /obj/item/handheld_soulcatcher, // NOVA EDIT SOULCATCHERS /obj/item/wrench/medical, )) @@ -334,7 +334,7 @@ inhand_icon_state = "security"//Could likely use a better one. worn_icon_state = "security" content_overlays = TRUE - // SKYRAT EDIT ADDITION START + // NOVA EDIT ADDITION START uses_advanced_reskins = TRUE unique_reskin = list( "Basic Security" = list( @@ -344,13 +344,13 @@ RESKIN_WORN_ICON_STATE = "security" ), "Peacekeeper" = list( - RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/belts.dmi', + RESKIN_ICON = 'modular_nova/master_files/icons/obj/clothing/belts.dmi', RESKIN_ICON_STATE = "peacekeeperbelt", - RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/belt.dmi', + RESKIN_WORN_ICON = 'modular_nova/master_files/icons/mob/clothing/belt.dmi', RESKIN_WORN_ICON_STATE = "peacekeeperbelt" ) ) - // SKYRAT EDIT ADDITION END + // NOVA EDIT ADDITION END /obj/item/storage/belt/security/Initialize(mapload) . = ..() @@ -365,7 +365,7 @@ /obj/item/flashlight/seclite, /obj/item/food/donut, /obj/item/grenade, - /obj/item/gun, //SKYRAT EDIT ADDITION + /obj/item/gun, //NOVA EDIT ADDITION /obj/item/holosign_creator/security, /obj/item/knife/combat, /obj/item/melee/baton, @@ -373,7 +373,7 @@ /obj/item/reagent_containers/spray/pepper, /obj/item/restraints/handcuffs, /obj/item/restraints/legcuffs/bola, - /obj/item/stock_parts/cell/microfusion, //SKYRAT EDIT ADDITION + /obj/item/stock_parts/cell/microfusion, //NOVA EDIT ADDITION )) /obj/item/storage/belt/security/full/PopulateContents() @@ -674,7 +674,7 @@ /obj/item/storage/belt/wands/full/PopulateContents() new /obj/item/gun/magic/wand/death(src) new /obj/item/gun/magic/wand/resurrection(src) - new /obj/item/gun/magic/wand/fireball(src) //SKYRAT EDIT - Trades polymorph for second fireball + new /obj/item/gun/magic/wand/fireball(src) //NOVA EDIT - Trades polymorph for second fireball new /obj/item/gun/magic/wand/teleport(src) new /obj/item/gun/magic/wand/door(src) new /obj/item/gun/magic/wand/fireball(src) @@ -705,12 +705,12 @@ /obj/item/key/janitor, /obj/item/lightreplacer, /obj/item/melee/flyswatter, - /obj/item/mop, //SKYRAT EDIT - For when you're lazy to use soap - /obj/item/mop/advanced, //SKYRAT EDIT For when you're lazy to use a bucket + /obj/item/mop, //NOVA EDIT - For when you're lazy to use soap + /obj/item/mop/advanced, //NOVA EDIT For when you're lazy to use a bucket /obj/item/paint/paint_remover, /obj/item/plunger, /obj/item/pushbroom, - /obj/item/reagent_containers/cup/bucket, //SKYRAT EDIT - Bucket + /obj/item/reagent_containers/cup/bucket, //NOVA EDIT - Bucket /obj/item/reagent_containers/spray, /obj/item/soap, /obj/item/wirebrush, diff --git a/code/game/objects/items/storage/boxes/clothes_boxes.dm b/code/game/objects/items/storage/boxes/clothes_boxes.dm index 0fe4210e249..4c18ef4f6df 100644 --- a/code/game/objects/items/storage/boxes/clothes_boxes.dm +++ b/code/game/objects/items/storage/boxes/clothes_boxes.dm @@ -104,11 +104,11 @@ new /obj/item/storage/box/papersack/meat(src) /obj/item/storage/box/hero/mothpioneer - name = "Mothic Fleet Pioneer - 2100's." + name = "Mothic Fleet Pioneer - 2429." desc = "Some claim that the fleet engineers are directly responsible for most modern advancements in spacefaring designs. Although the exact details of their past contributions are somewhat fuzzy, their ingenuity remains unmatched and unquestioned to this day." /obj/item/storage/box/hero/mothpioneer/PopulateContents() - new /obj/item/clothing/head/mothcap(src) + new /obj/item/clothing/head/mothcap/original(src) new /obj/item/clothing/suit/mothcoat/original(src) new /obj/item/crowbar(src) new /obj/item/flashlight/lantern(src) diff --git a/code/game/objects/items/storage/boxes/job_boxes.dm b/code/game/objects/items/storage/boxes/job_boxes.dm index 335ccbe7185..b77d52ab3b9 100644 --- a/code/game/objects/items/storage/boxes/job_boxes.dm +++ b/code/game/objects/items/storage/boxes/job_boxes.dm @@ -29,7 +29,7 @@ return if(!isnull(mask_type)) new mask_type(src) - //SKYRAT EDIT ADDITION START - VOX INTERNALS - Honestly I dont know if this has a function any more with wardrobe_removal(), but TG still uses the plasmaman one so better safe than sorry + //NOVA EDIT ADDITION START - VOX INTERNALS - Honestly I dont know if this has a function any more with wardrobe_removal(), but TG still uses the plasmaman one so better safe than sorry if(!isplasmaman(loc)) if(isvox(loc)) new /obj/item/tank/internals/nitrogen/belt/emergency(src) @@ -37,7 +37,7 @@ new internal_type(src) else new /obj/item/tank/internals/plasmaman/belt(src) - //SKYRAT EDIT ADDITION END - VOX INTERNALS + //NOVA EDIT ADDITION END - VOX INTERNALS if(!isnull(medipen_type)) new medipen_type(src) @@ -52,23 +52,23 @@ if(SSmapping.is_planetary() && LAZYLEN(SSmapping.multiz_levels)) new /obj/item/climbing_hook/emergency(src) - new /obj/item/oxygen_candle(src) //SKYRAT EDIT ADDITION + new /obj/item/oxygen_candle(src) //NOVA EDIT ADDITION /obj/item/storage/box/survival/radio/PopulateContents() ..() // we want the survival stuff too. new /obj/item/radio/off(src) /obj/item/storage/box/survival/proc/wardrobe_removal() - if(!isplasmaman(loc) && !isvox(loc)) //We need to specially fill the box with plasmaman gear, since it's intended for one //SKYRAT EDIT: && !isvox(loc) + if(!isplasmaman(loc) && !isvox(loc)) //We need to specially fill the box with plasmaman gear, since it's intended for one //NOVA EDIT: && !isvox(loc) return var/obj/item/mask = locate(mask_type) in src var/obj/item/internals = locate(internal_type) in src - //SKYRAT EDIT ADDITION START - VOX INTERNALS - Vox mimic the above and below behavior, removing the redundant mask/internals; they dont mimic the plasma breathing though + //NOVA EDIT ADDITION START - VOX INTERNALS - Vox mimic the above and below behavior, removing the redundant mask/internals; they dont mimic the plasma breathing though if(!isvox(loc)) new /obj/item/tank/internals/plasmaman/belt(src) else new /obj/item/tank/internals/nitrogen/belt/emergency(src) - //SKYRAT EDIT ADDITION END - VOX INTERNALS + //NOVA EDIT ADDITION END - VOX INTERNALS qdel(mask) // Get rid of the items that shouldn't be qdel(internals) diff --git a/code/game/objects/items/storage/boxes/medical_boxes.dm b/code/game/objects/items/storage/boxes/medical_boxes.dm index ff4b232454c..c70fffc1f6e 100644 --- a/code/game/objects/items/storage/boxes/medical_boxes.dm +++ b/code/game/objects/items/storage/boxes/medical_boxes.dm @@ -133,7 +133,7 @@ /obj/item/storage/box/bandages name = "box of bandages" desc = "A box of DeForest brand gel bandages designed to treat blunt-force trauma." - icon = 'icons/obj/storage/box.dmi' // SKYRAT EDIT CHANGE + icon = 'icons/obj/storage/box.dmi' // NOVA EDIT CHANGE icon_state = "brutebox" base_icon_state = "brutebox" inhand_icon_state = "brutebox" diff --git a/code/game/objects/items/storage/fancy.dm b/code/game/objects/items/storage/fancy.dm index 5aeeff5128b..61d96c1ff34 100644 --- a/code/game/objects/items/storage/fancy.dm +++ b/code/game/objects/items/storage/fancy.dm @@ -213,7 +213,7 @@ balloon_alert(user, "ooh, free coupon") var/obj/item/coupon/attached_coupon = new user.put_in_hands(attached_coupon) - attached_coupon.generate(rigged_omen) + attached_coupon.generate(rigged_omen ? COUPON_OMEN : null) attached_coupon = null spawn_coupon = FALSE name = "discarded cigarette packet" @@ -506,7 +506,7 @@ spawn_type = /obj/item/food/pickle spawn_count = 10 contents_tag = "pickle" - foldable_result = null + foldable_result = /obj/item/reagent_containers/cup/beaker/large custom_materials = list(/datum/material/glass = SHEET_MATERIAL_AMOUNT) open_status = FANCY_CONTAINER_ALWAYS_OPEN has_open_closed_states = FALSE diff --git a/code/game/objects/items/storage/garment.dm b/code/game/objects/items/storage/garment.dm index e9ff2f28ce1..437902ef75e 100644 --- a/code/game/objects/items/storage/garment.dm +++ b/code/game/objects/items/storage/garment.dm @@ -76,7 +76,7 @@ new /obj/item/clothing/shoes/laceup(src) /obj/item/storage/bag/garment/hos/PopulateContents() - //new /obj/item/clothing/under/rank/security/head_of_security/skirt(src) SKYRAT EDIT REMOVAL - Blue Sec + //new /obj/item/clothing/under/rank/security/head_of_security/skirt(src) NOVA EDIT REMOVAL - Blue Sec new /obj/item/clothing/under/rank/security/head_of_security/alt(src) new /obj/item/clothing/under/rank/security/head_of_security/alt/skirt(src) new /obj/item/clothing/under/rank/security/head_of_security/grey(src) @@ -89,19 +89,20 @@ new /obj/item/clothing/suit/armor/vest/leather(src) new /obj/item/clothing/glasses/hud/security/sunglasses/eyepatch(src) new /obj/item/clothing/glasses/hud/security/sunglasses/gars/giga(src) + new /obj/item/clothing/head/hats/hos/beret(src) new /obj/item/clothing/head/hats/hos/cap(src) new /obj/item/clothing/mask/gas/sechailer/swat(src) new /obj/item/clothing/neck/cloak/hos(src) /obj/item/storage/bag/garment/warden/PopulateContents() new /obj/item/clothing/suit/armor/vest/warden(src) - //new /obj/item/clothing/head/hats/warden(src) SKYRAT EDIT REMOVAL - //new /obj/item/clothing/head/hats/warden/drill(src) SKYRAT EDIT REMOVAL + //new /obj/item/clothing/head/hats/warden(src) NOVA EDIT REMOVAL + //new /obj/item/clothing/head/hats/warden/drill(src) NOVA EDIT REMOVAL new /obj/item/clothing/head/beret/sec/navywarden(src) - //new /obj/item/clothing/suit/armor/vest/warden/alt(src) SKYRAT EDIT REMOVAL + //new /obj/item/clothing/suit/armor/vest/warden/alt(src) NOVA EDIT REMOVAL new /obj/item/clothing/under/rank/security/warden/formal(src) new /obj/item/clothing/suit/jacket/warden/blue(src) //SKYRAT ADDITION - FORMAL COAT - //new /obj/item/clothing/under/rank/security/warden/skirt(src) SKYRAT EDIT REMOVAL + //new /obj/item/clothing/under/rank/security/warden/skirt(src) NOVA EDIT REMOVAL new /obj/item/clothing/gloves/krav_maga/sec(src) new /obj/item/clothing/glasses/hud/security/sunglasses(src) new /obj/item/clothing/mask/gas/sechailer(src) @@ -113,7 +114,7 @@ new /obj/item/clothing/under/rank/rnd/research_director/alt/skirt(src) new /obj/item/clothing/under/rank/rnd/research_director/turtleneck(src) new /obj/item/clothing/under/rank/rnd/research_director/turtleneck/skirt(src) - new /obj/item/clothing/suit/toggle/labcoat/skyrat/rd(src) //SKYRAT EDIT ADDITION + new /obj/item/clothing/suit/toggle/labcoat/skyrat/rd(src) //NOVA EDIT ADDITION new /obj/item/clothing/suit/hooded/wintercoat/science/rd(src) new /obj/item/clothing/head/beret/science/rd(src) new /obj/item/clothing/gloves/color/black(src) diff --git a/code/game/objects/items/storage/lockbox.dm b/code/game/objects/items/storage/lockbox.dm index 9154e0ef3ed..35b321d892f 100644 --- a/code/game/objects/items/storage/lockbox.dm +++ b/code/game/objects/items/storage/lockbox.dm @@ -253,11 +253,11 @@ ADD_TRAIT(src, TRAIT_NO_MISSING_ITEM_ERROR, TRAIT_GENERIC) ADD_TRAIT(src, TRAIT_NO_MANIFEST_CONTENTS_ERROR, TRAIT_GENERIC) - //SKYRAT EDIT START + //NOVA EDIT START if(istype(buyer_account, /datum/bank_account/department)) department_purchase = TRUE department_account = buyer_account - //SKYRAT EDIT END + //NOVA EDIT END /obj/item/storage/lockbox/order/attackby(obj/item/W, mob/user, params) var/obj/item/card/id/id_card = W.GetID() @@ -267,7 +267,7 @@ if(iscarbon(user)) add_fingerprint(user) - if((id_card.registered_account != buyer_account) && !(department_purchase && (id_card.registered_account?.account_job?.paycheck_department) == (department_account.department_id))) //SKYRAT EDIT + if((id_card.registered_account != buyer_account) && !(department_purchase && (id_card.registered_account?.account_job?.paycheck_department) == (department_account.department_id))) //NOVA EDIT balloon_alert(user, "incorrect bank account!") return diff --git a/code/game/objects/items/storage/toolbox.dm b/code/game/objects/items/storage/toolbox.dm index b6872a113f0..97d6305eacc 100644 --- a/code/game/objects/items/storage/toolbox.dm +++ b/code/game/objects/items/storage/toolbox.dm @@ -162,14 +162,14 @@ new_cable_three.set_cable_color(pickedcolor) /obj/item/storage/toolbox/syndicate - name = "tactical toolbox" //SKYRAT EDIT + name = "tactical toolbox" //NOVA EDIT icon_state = "syndicate" inhand_icon_state = "toolbox_syndi" force = 15 throwforce = 18 material_flags = NONE - special_desc_requirement = EXAMINE_CHECK_SYNDICATE // Skyrat edit - special_desc = "A toolbox manufactured by the Syndicate containing extra tactical tools. Made of more robust materials than the average toolbox." // Skyrat edit + special_desc_requirement = EXAMINE_CHECK_SYNDICATE // NOVA EDIT + special_desc = "A toolbox manufactured by the Syndicate containing extra tactical tools. Made of more robust materials than the average toolbox." // NOVA EDIT /obj/item/storage/toolbox/syndicate/Initialize(mapload) . = ..() diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm index cba35c8b95c..345fe7e0ae4 100644 --- a/code/game/objects/items/storage/uplink_kits.dm +++ b/code/game/objects/items/storage/uplink_kits.dm @@ -39,7 +39,7 @@ ))) if(KIT_RECON) new /obj/item/clothing/glasses/thermal/xray(src) // ~8 tc? -// new /obj/item/storage/briefcase/launchpad(src) //6 tc // SKYRAT EDIT REMOVAL +// new /obj/item/storage/briefcase/launchpad(src) //6 tc // NOVA EDIT REMOVAL new /obj/item/binoculars(src) // 2 tc? new /obj/item/encryptionkey/syndicate(src) // 2 tc new /obj/item/storage/box/syndie_kit/space(src) //4 tc @@ -276,63 +276,6 @@ new /obj/item/implanter/freedom(src) // 5 tc new /obj/item/stack/telecrystal(src) //The failsafe/self destruct isn't an item we can physically include in the kit, but 1 TC is technically enough to buy the equivalent. -/obj/item/storage/box/syndicate/contract_kit //SKYRAT EDIT - CHANGED IN MODULAR FOLDER - name = "Contract Kit" - desc = "Supplied to Syndicate contractors." - icon_state = "syndiebox" - illustration = "writing_syndie" - -/obj/item/storage/box/syndicate/contractor_loadout //SKYRAT EDIT - CHANGED IN MODULAR FOLDER - name = "Standard Loadout" - desc = "Supplied to Syndicate contractors, providing their specialised space suit and chameleon uniform." - icon_state = "syndiebox" - illustration = "writing_syndie" - -/obj/item/paper/contractor_guide //SKYRAT EDIT - CHANGED IN MODULAR FOLDER - name = "Contractor Guide" - -/obj/item/paper/contractor_guide/Initialize(mapload) //SKYRAT EDIT - CHANGED IN MODULAR FOLDER - default_raw_text = {"

Welcome agent, congratulations on your new position as contractor. On top of your already assigned objectives, - this kit will provide you contracts to take on for TC payments.

- -

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

- -

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

- -

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

- -

Using the tablet

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

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

-

The tablet can also be recharged at any cell charger.

-

Extracting

-
    -
  1. Make sure both yourself and your target are at the dropoff.
  2. -
  3. Call the extraction, and stand back from the drop point.
  4. -
  5. If it fails, make sure your target is inside, and there's a free space for the pod to land.
  6. -
  7. Grab your target, and drag them into the pod.
  8. -
-

Ransoms

-

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

- -

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

"} - return ..() - /obj/item/storage/box/syndie_kit name = "box" desc = "A sleek, sturdy box." @@ -821,6 +764,63 @@ /obj/item/food/grown/apple = 1, ), src) +/obj/item/storage/box/syndicate/contract_kit + name = "Contract Kit" + desc = "Supplied to Syndicate contractors." + icon_state = "syndiebox" + illustration = "writing_syndie" + +/obj/item/storage/box/syndicate/contract_kit/PopulateContents() + new /obj/item/modular_computer/pda/contractor(src) // SKYRAT EDIT CHANGE - ORIGINAL : /obj/item/modular_computer/pda/syndicate_contract_uplink(src) + new /obj/item/storage/box/syndicate/contractor_loadout(src) + new /obj/item/melee/baton/telescopic/contractor_baton(src) + + // All about 4 TC or less - some nukeops only items, but fit nicely to the theme. + var/static/list/item_list = list( + /obj/item/storage/backpack/duffelbag/syndie/x4, + /obj/item/storage/box/syndie_kit/throwing_weapons, + /obj/item/gun/syringe/syndicate, + /obj/item/pen/edagger, + /obj/item/pen/sleepy, + /obj/item/flashlight/emp, + /obj/item/reagent_containers/syringe/mulligan, + /obj/item/clothing/shoes/chameleon/noslip, + /obj/item/storage/medkit/tactical, + /obj/item/encryptionkey/syndicate, + /obj/item/clothing/glasses/thermal/syndi, + /obj/item/slimepotion/slime/sentience/nuclear, + /obj/item/storage/box/syndie_kit/imp_radio, + ///obj/item/storage/box/syndie_kit/imp_uplink, // SKYRAT EDIT REMOVAL + ///obj/item/clothing/gloves/krav_maga/combatglovesplus, // SKYRAT EDIT REMOVAL + /obj/item/gun/ballistic/automatic/c20r/toy/unrestricted/riot, + /obj/item/reagent_containers/hypospray/medipen/stimulants, + /obj/item/storage/box/syndie_kit/imp_freedom, + /obj/item/toy/eightball/haunted, + ) + for(var/i in 1 to 3) + var/selected_item = pick_n_take(item_list + modular_item_list) // NOVA EDIT CHANGE - ORIGINAL : var/selected_item = pick_n_take(item_list) + new selected_item(src) + + // Paper guide is always last. + new /obj/item/paper/contractor_guide(src) + +/obj/item/storage/box/syndicate/contractor_loadout + name = "Standard Loadout" + desc = "Supplied to Syndicate contractors, providing their specialised space suit and chameleon uniform." + icon_state = "syndiebox" + illustration = "writing_syndie" + +/obj/item/storage/box/syndicate/contractor_loadout/PopulateContents() + /* SKYRAT EDIT REMOVAL BEGIN - Contractors get MODSuits instead, see contractor modular for overrides + new /obj/item/clothing/head/helmet/space/syndicate/contract(src) + new /obj/item/clothing/suit/space/syndicate/contract(src) + SKYRAT EDIT REMOVAL END */ + new /obj/item/clothing/under/chameleon(src) + new /obj/item/clothing/mask/chameleon(src) + new /obj/item/storage/fancy/cigarettes/cigpack_syndicate(src) + new /obj/item/card/id/advanced/chameleon(src) + new /obj/item/lighter(src) + #undef KIT_RECON #undef KIT_BLOODY_SPAI #undef KIT_STEALTHY diff --git a/code/game/objects/items/storage/wallets.dm b/code/game/objects/items/storage/wallets.dm index 17412698e64..f83c199a049 100644 --- a/code/game/objects/items/storage/wallets.dm +++ b/code/game/objects/items/storage/wallets.dm @@ -19,10 +19,10 @@ /obj/item/holochip, /obj/item/card, /obj/item/clothing/mask/cigarette, - // SKYRAT EDIT BEGIN + // NOVA EDIT BEGIN /obj/item/condom_pack, /obj/item/gbp_punchcard, - // SKYRAT EDIT END + // NOVA EDIT END /obj/item/coupon, /obj/item/flashlight/pen, /obj/item/folder/biscuit, diff --git a/code/game/objects/items/surgery_tray.dm b/code/game/objects/items/surgery_tray.dm index 680698e3318..958fb9fef05 100644 --- a/code/game/objects/items/surgery_tray.dm +++ b/code/game/objects/items/surgery_tray.dm @@ -12,7 +12,7 @@ /obj/item/cautery, /obj/item/circular_saw, /obj/item/clothing/mask/surgical, - /obj/item/clothing/suit/toggle/labcoat/skyrat/hospitalgown, // SKYRAT EDIT ADDITION + /obj/item/clothing/suit/toggle/labcoat/hospitalgown, // NOVA EDIT ADDITION /obj/item/hemostat, /obj/item/razor, /obj/item/reagent_containers/medigel, @@ -197,7 +197,7 @@ new /obj/item/cautery(src) new /obj/item/circular_saw(src) new /obj/item/clothing/mask/surgical(src) - new /obj/item/clothing/suit/toggle/labcoat/skyrat/hospitalgown(src) // SKYRAT EDIT ADDITION + new /obj/item/clothing/suit/toggle/labcoat/hospitalgown(src) // NOVA EDIT ADDITION new /obj/item/hemostat(src) new /obj/item/razor/surgery(src) new /obj/item/retractor(src) @@ -219,7 +219,7 @@ new /obj/item/cautery/cruel(src) new /obj/item/circular_saw(src) new /obj/item/clothing/mask/surgical(src) - new /obj/item/clothing/suit/toggle/labcoat/skyrat/hospitalgown(src) // SKYRAT EDIT ADDITION + new /obj/item/clothing/suit/toggle/labcoat/hospitalgown(src) // NOVA EDIT ADDITION new /obj/item/hemostat/cruel(src) new /obj/item/razor/surgery(src) new /obj/item/retractor/cruel(src) diff --git a/code/game/objects/items/syndie_spraycan.dm b/code/game/objects/items/syndie_spraycan.dm index deab6229a28..02a576a2cb9 100644 --- a/code/game/objects/items/syndie_spraycan.dm +++ b/code/game/objects/items/syndie_spraycan.dm @@ -1,3 +1,5 @@ +#define SYNDIE_DRAW_TIME 3 SECONDS + // Extending the existing spraycan item was more trouble than it was worth, I don't want or need this to be able to draw arbitrary shapes. /obj/item/traitor_spraycan name = "seditious spraycan" @@ -79,7 +81,12 @@ /obj/item/traitor_spraycan/proc/try_draw_step(start_output, mob/living/user, atom/target) drawing_rune = TRUE user.balloon_alert(user, "[start_output]") - if (!do_after(user, 3 SECONDS, target)) + var/wait_time = SYNDIE_DRAW_TIME + + if(HAS_TRAIT(user, TRAIT_TAGGER)) + wait_time *= 0.5 + + if(!do_after(user, wait_time, target)) user.balloon_alert(user, "interrupted!") drawing_rune = FALSE return FALSE @@ -220,6 +227,7 @@ return ..() +#undef SYNDIE_DRAW_TIME #undef RUNE_STAGE_COLOURED #undef RUNE_STAGE_COMPLETE #undef RUNE_STAGE_OUTLINE diff --git a/code/game/objects/items/teleportation.dm b/code/game/objects/items/teleportation.dm index 5317afe4a78..6442a28238c 100644 --- a/code/game/objects/items/teleportation.dm +++ b/code/game/objects/items/teleportation.dm @@ -168,12 +168,12 @@ /obj/item/hand_tele/attack_self(mob/user) if (!can_teleport_notifies(user)) return - //SKYRAT EDIT BEGIN + //NOVA EDIT BEGIN var/turf/my_turf = get_turf(src) if(is_away_level(my_turf.z)) to_chat(user, "[src] cannot be used here!") return - //SKYRAT EDIT END + //NOVA EDIT END var/list/locations = list() for(var/obj/machinery/computer/teleporter/computer as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/computer/teleporter)) var/atom/target = computer.target_ref?.resolve() diff --git a/code/game/objects/items/theft_tools.dm b/code/game/objects/items/theft_tools.dm index 8f357e05139..e695dedbca3 100644 --- a/code/game/objects/items/theft_tools.dm +++ b/code/game/objects/items/theft_tools.dm @@ -157,13 +157,10 @@ inhand_icon_state = null //touching it dusts you, so no need for an inhand icon. pulseicon = "supermatter_sliver_pulse" layer = ABOVE_MOB_LAYER - plane = GAME_PLANE_UPPER - /obj/item/nuke_core/supermatter_sliver/attack_tk(mob/user) // no TK dusting memes return - /obj/item/nuke_core/supermatter_sliver/can_be_pulled(user) // no drag memes return FALSE @@ -192,11 +189,11 @@ var/mob/living/victim = hit_atom if(victim.incorporeal_move || victim.status_flags & GODMODE) //try to keep this in sync with supermatter's consume fail conditions return ..() - if(throwingdatum?.thrower) - var/mob/user = throwingdatum.thrower - log_combat(throwingdatum?.thrower, hit_atom, "consumed", src) - message_admins("[src] has consumed [key_name_admin(victim)] [ADMIN_JMP(src)], thrown by [key_name_admin(user)].") - investigate_log("has consumed [key_name(victim)], thrown by [key_name(user)]", INVESTIGATE_ENGINE) + var/mob/thrower = throwingdatum?.get_thrower() + if(thrower) + log_combat(thrower, hit_atom, "consumed", src) + message_admins("[src] has consumed [key_name_admin(victim)] [ADMIN_JMP(src)], thrown by [key_name_admin(thrower)].") + investigate_log("has consumed [key_name(victim)], thrown by [key_name(thrower)]", INVESTIGATE_ENGINE) else message_admins("[src] has consumed [key_name_admin(victim)] [ADMIN_JMP(src)] via throw impact.") investigate_log("has consumed [key_name(victim)] via throw impact.", INVESTIGATE_ENGINE) diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm index e09beadd5af..6ac0969abb9 100644 --- a/code/game/objects/items/tools/weldingtool.dm +++ b/code/game/objects/items/tools/weldingtool.dm @@ -30,8 +30,8 @@ heat = 3800 tool_behaviour = TOOL_WELDER toolspeed = 1 - //wound_bonus = 10 //SKYRAT EDIT REMOVAL - //bare_wound_bonus = 15 //SKYRAT EDIT REMOVAL + //wound_bonus = 10 //NOVA EDIT REMOVAL + //bare_wound_bonus = 15 //NOVA EDIT REMOVAL custom_materials = list(/datum/material/iron=SMALL_MATERIAL_AMOUNT*0.7, /datum/material/glass=SMALL_MATERIAL_AMOUNT*0.3) /// Whether the welding tool is on or off. var/welding = FALSE @@ -151,12 +151,12 @@ if(user == attacked_humanoid) user.visible_message(span_notice("[user] starts to fix some of the dents on [attacked_humanoid]'s [affecting.name]."), span_notice("You start fixing some of the dents on [attacked_humanoid == user ? "your" : "[attacked_humanoid]'s"] [affecting.name].")) - if(!do_after(user, self_delay, attacked_humanoid)) // SKYRAT EDIT CHANGE - ORIGINAL: if(!do_after(user, 5 SECONDS, attacked_humanoid)) + if(!do_after(user, self_delay, attacked_humanoid)) // NOVA EDIT CHANGE - ORIGINAL: if(!do_after(user, 5 SECONDS, attacked_humanoid)) return ITEM_INTERACT_BLOCKING - // SKYRAT EDIT ADDITION START + // NOVA EDIT ADDITION START if(!do_after(user, other_delay, attacked_humanoid)) return ITEM_INTERACT_BLOCKING - // SKYRAT EDIT ADDITION END + // NOVA EDIT ADDITION END item_heal_robotic(attacked_humanoid, user, 15, 0) return ITEM_INTERACT_SUCCESS diff --git a/code/game/objects/items/tools/wirecutters.dm b/code/game/objects/items/tools/wirecutters.dm index dad9763bd3d..14c51faf080 100644 --- a/code/game/objects/items/tools/wirecutters.dm +++ b/code/game/objects/items/tools/wirecutters.dm @@ -63,7 +63,7 @@ playsound(loc, usesound, 50, TRUE, -1) return BRUTELOSS -/obj/item/wirecutters/abductor//SKYRAT EDIT - ICON OVERRIDEN BY AESTHETICS - SEE MODULE +/obj/item/wirecutters/abductor//NOVA EDIT - ICON OVERRIDEN BY AESTHETICS - SEE MODULE name = "alien wirecutters" desc = "Extremely sharp wirecutters, made out of a silvery-green metal." icon = 'icons/obj/antags/abductor.dmi' diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 18d65f2d8b6..c91f6eb6c44 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -135,7 +135,8 @@ return ..() /obj/item/toy/balloon/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) - if(ismonkey(throwingdatum.thrower) && istype(AM, /obj/item/ammo_casing/foam_dart)) + var/mob/thrower = throwingdatum?.get_thrower() + if(ismonkey(thrower) && istype(AM, /obj/item/ammo_casing/foam_dart)) pop_balloon(monkey_pop = TRUE) else return ..() diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index c83fefb2fce..059f78b80c9 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -161,7 +161,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 /obj/item/claymore/highlander/process() if(ishuman(loc)) var/mob/living/carbon/human/holder = loc - SET_PLANE_EXPLICIT(holder, GAME_PLANE_UPPER_FOV_HIDDEN, src) //NO HIDING BEHIND PLANTS FOR YOU, DICKWEED (HA GET IT, BECAUSE WEEDS ARE PLANTS) + layer = ABOVE_ALL_MOB_LAYER //NO HIDING BEHIND PLANTS FOR YOU, DICKWEED (HA GET IT, BECAUSE WEEDS ARE PLANTS) ADD_TRAIT(holder, TRAIT_NOBLOOD, HIGHLANDER_TRAIT) //AND WE WON'T BLEED OUT LIKE COWARDS else if(!(flags_1 & ADMIN_SPAWNED_1)) @@ -285,7 +285,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 return INITIALIZE_HINT_QDEL /obj/item/claymore/highlander/robot/process() - SET_PLANE_IMPLICIT(loc, GAME_PLANE_UPPER_FOV_HIDDEN) + layer = ABOVE_ALL_MOB_LAYER /obj/item/katana name = "katana" diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm index 2a6db83d9d4..c556f6d28d6 100644 --- a/code/game/objects/obj_defense.dm +++ b/code/game/objects/obj_defense.dm @@ -98,12 +98,6 @@ var/amt = max(0, ((force - (move_resist * MOVE_FORCE_CRUSH_RATIO)) / (move_resist * MOVE_FORCE_CRUSH_RATIO)) * 10) take_damage(amt, BRUTE) -/obj/attack_slime(mob/living/simple_animal/slime/user, list/modifiers) - if(!user.is_adult) - return - if(attack_generic(user, rand(10, 15), BRUTE, MELEE, 1)) - log_combat(user, src, "attacked") - /obj/singularity_act() SSexplosions.high_mov_atom += src if(src && !QDELETED(src)) @@ -118,7 +112,7 @@ . = ..() if((resistance_flags & UNACIDABLE) || (acid_volume <= 0) || (acidpwr <= 0)) return FALSE - if(QDELETED(src)) //skyrat edit: fix createanddestroy + if(QDELETED(src)) //NOVA EDIT: fix createanddestroy return FALSE AddComponent(/datum/component/acid, acidpwr, acid_volume, custom_acid_overlay || GLOB.acid_overlay) return TRUE diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index cdc2b2bd5ec..1943f0aa398 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -66,3 +66,6 @@ take_damage(power * 2.5e-4, BURN, "energy") power -= power * 5e-4 //walls take a lot out of ya . = ..() + +/obj/structure/animate_atom_living(mob/living/owner) + new /mob/living/simple_animal/hostile/mimic/copy(drop_location(), src, owner) diff --git a/code/game/objects/structures/aliens.dm b/code/game/objects/structures/aliens.dm index e637ecc274e..886d0b9bcba 100644 --- a/code/game/objects/structures/aliens.dm +++ b/code/game/objects/structures/aliens.dm @@ -338,7 +338,6 @@ integrity_failure = 0.05 var/status = GROWING //can be GROWING, GROWN or BURST; all mutually exclusive layer = MOB_LAYER - plane = GAME_PLANE_FOV_HIDDEN /// Ref to the hugger within. var/obj/item/clothing/mask/facehugger/child ///Proximity monitor associated with this atom, needed for proximity checks. diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm index a6a1131a1b9..9fd8da19391 100644 --- a/code/game/objects/structures/beds_chairs/chair.dm +++ b/code/game/objects/structures/beds_chairs/chair.dm @@ -109,20 +109,18 @@ /obj/structure/chair/proc/handle_layer() if(has_buckled_mobs() && dir == NORTH) layer = ABOVE_MOB_LAYER - SET_PLANE_IMPLICIT(src, GAME_PLANE_UPPER_FOV_HIDDEN) else layer = OBJ_LAYER - SET_PLANE_IMPLICIT(src, GAME_PLANE) /obj/structure/chair/post_buckle_mob(mob/living/M) . = ..() handle_layer() - //SKYRAT EDIT ADDITION + //NOVA EDIT ADDITION if(HAS_TRAIT(M, TRAIT_OVERSIZED)) visible_message(span_warning("[src] buckles under the weight of [M] causing it to break!")) - playsound(src, 'modular_skyrat/modules/oversized/sound/chair_break.ogg', 70, TRUE) + playsound(src, 'modular_nova/modules/oversized/sound/chair_break.ogg', 70, TRUE) deconstruct() - //SKYRAT EDIT END + //NOVA EDIT END /obj/structure/chair/post_unbuckle_mob() . = ..() handle_layer() @@ -184,7 +182,6 @@ /obj/structure/chair/comfy/proc/gen_armrest() armrest = GetArmrest() armrest.layer = ABOVE_MOB_LAYER - SET_PLANE_EXPLICIT(armrest, GAME_PLANE_UPPER, src) update_armrest() /obj/structure/chair/comfy/proc/GetArmrest() diff --git a/code/game/objects/structures/beds_chairs/pew.dm b/code/game/objects/structures/beds_chairs/pew.dm index 21bf0fbf09c..6388247e8c4 100644 --- a/code/game/objects/structures/beds_chairs/pew.dm +++ b/code/game/objects/structures/beds_chairs/pew.dm @@ -33,10 +33,8 @@ /obj/structure/chair/pew/left/proc/gen_armrest() leftpewarmrest = GetLeftPewArmrest() leftpewarmrest.layer = ABOVE_MOB_LAYER - SET_PLANE_EXPLICIT(leftpewarmrest, GAME_PLANE_UPPER, src) update_leftpewarmrest() - /obj/structure/chair/pew/left/proc/GetLeftPewArmrest() return mutable_appearance('icons/obj/chairs_wide.dmi', "pewend_left_armrest") @@ -76,7 +74,6 @@ /obj/structure/chair/pew/right/proc/gen_armrest() rightpewarmrest = GetRightPewArmrest() rightpewarmrest.layer = ABOVE_MOB_LAYER - SET_PLANE_EXPLICIT(rightpewarmrest, GAME_PLANE_UPPER, src) update_rightpewarmrest() /obj/structure/chair/pew/right/proc/GetRightPewArmrest() diff --git a/code/game/objects/structures/beds_chairs/sofa.dm b/code/game/objects/structures/beds_chairs/sofa.dm index 076f95f4dc9..bf9a221929b 100644 --- a/code/game/objects/structures/beds_chairs/sofa.dm +++ b/code/game/objects/structures/beds_chairs/sofa.dm @@ -36,7 +36,6 @@ path/corner/color_name {\ /obj/structure/chair/sofa/proc/gen_armrest() armrest = mutable_appearance(initial(icon), "[icon_state]_armrest", ABOVE_MOB_LAYER) - SET_PLANE_EXPLICIT(armrest, GAME_PLANE_UPPER, src) update_armrest() /obj/structure/chair/sofa/electrify_self(obj/item/assembly/shock_kit/input_shock_kit, mob/user, list/overlays_from_child_procs) diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index 8517a321ceb..c440976b409 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -86,7 +86,6 @@ LINEN BINS /obj/item/bedsheet/proc/coverup(mob/living/sleeper) layer = ABOVE_MOB_LAYER - SET_PLANE_IMPLICIT(src, GAME_PLANE_UPPER) pixel_x = 0 pixel_y = 0 balloon_alert(sleeper, "covered") diff --git a/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm b/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm index 063200b486b..f0d1eaa0cc8 100644 --- a/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm +++ b/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm @@ -50,16 +50,15 @@ if(!.) return FALSE - alerted = null + LAZYINITLIST(alerted) var/do_alert = (COOLDOWN_FINISHED(src, alert_cooldown) && (locate(/mob/living) in contents)) if(!do_alert) - return TRUE + + alerted.Cut() // just in case we runtimed and the list didn't get cleared in after_open // Cache the list before we open the box. - alerted = viewers(7, src) - // There are no mobs to alert? clear the list & prevent further action after opening the box - if(!(locate(/mob/living) in alerted)) - alerted = null + for(var/mob/living/alerted_mob in viewers(7, src)) + alerted += alerted_mob return TRUE @@ -77,6 +76,7 @@ alerted_mob.face_atom(src) alerted_mob.do_alert_animation() + alerted.Cut() playsound(loc, 'sound/machines/chime.ogg', 50, FALSE, -5) /// Does the MGS ! animation diff --git a/code/game/objects/structures/crates_lockers/closets/job_closets.dm b/code/game/objects/structures/crates_lockers/closets/job_closets.dm index 4e56395330b..795d8ccc452 100644 --- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm @@ -67,10 +67,10 @@ new /obj/item/watertank/janitor(src) new /obj/item/storage/belt/janitor(src) - //SKYRAT EDIT ADDITION + //NOVA EDIT ADDITION new /obj/item/air_refresher(src) new /obj/item/air_refresher(src) - //SKYRAT EDIT END + //NOVA EDIT END /obj/structure/closet/lawcloset name = "legal closet" @@ -299,7 +299,7 @@ /obj/item/clothing/suit/toggle/labcoat/science = 3, /obj/item/clothing/shoes/sneakers/white = 3, /obj/item/radio/headset/headset_sci = 2, - /obj/item/clothing/mask/gas/alt = 3) //SKYRAT EDIT CHANGE - ORIGINAL: /obj/item/clothing/mask/gas = 3) + /obj/item/clothing/mask/gas/alt = 3) //NOVA EDIT CHANGE - ORIGINAL: /obj/item/clothing/mask/gas = 3) generate_items_inside(items_inside,src) return diff --git a/code/game/objects/structures/crates_lockers/closets/secure/bar.dm b/code/game/objects/structures/crates_lockers/closets/secure/bar.dm index e74873bfaef..473fedfa10a 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/bar.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/bar.dm @@ -18,10 +18,10 @@ new /obj/item/etherealballdeployer(src) new /obj/item/roulette_wheel_beacon(src) - //SKYRAT EDIT ADDITION + //NOVA EDIT ADDITION new /obj/item/storage/fancy/candle_box(src) new /obj/item/storage/fancy/candle_box(src) - //SKYRAT EDIT END + //NOVA EDIT END /obj/structure/closet/secure_closet/bar/all_access req_access = null diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm index 679e31f9295..88e8fe8d2d0 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm @@ -18,17 +18,17 @@ new /obj/item/extinguisher/advanced(src) new /obj/item/storage/photo_album/ce(src) new /obj/item/storage/box/skillchips/engineering(src) - new /obj/item/storage/box/gas_miner_beacons(src) // SKYRAT EDIT ADDITION - new /obj/item/construction/plumbing/engineering(src) //SKYRAT EDIT ADDITION - new /obj/item/circuitboard/machine/rodstopper(src) //SKYRAT EDIT ADDITION - new /obj/item/card/id/departmental_budget/eng(src) //SKYRAT EDIT ADDITION + new /obj/item/storage/box/gas_miner_beacons(src) // NOVA EDIT ADDITION + new /obj/item/construction/plumbing/engineering(src) //NOVA EDIT ADDITION + new /obj/item/circuitboard/machine/rodstopper(src) //NOVA EDIT ADDITION + new /obj/item/card/id/departmental_budget/eng(src) //NOVA EDIT ADDITION /obj/structure/closet/secure_closet/engineering_chief/populate_contents_immediate() . = ..() // Traitor steal objective new /obj/item/areaeditor/blueprints(src) - new /obj/item/pipe_dispenser/bluespace(src) // SKYRAT EDIT -- BLUESPACE RPD -- ORIGINAL: new /obj/item/pipe_dispenser(src) + new /obj/item/pipe_dispenser/bluespace(src) // NOVA EDIT -- BLUESPACE RPD -- ORIGINAL: new /obj/item/pipe_dispenser(src) /obj/structure/closet/secure_closet/engineering_electrical name = "electrical supplies locker" @@ -79,7 +79,7 @@ new /obj/item/clothing/glasses/meson/engine(src) new /obj/item/storage/box/emptysandbags(src) new /obj/item/storage/bag/construction(src) - new /obj/item/construction/plumbing/engineering(src) //SKYRAT EDIT ADDITION + new /obj/item/construction/plumbing/engineering(src) //NOVA EDIT ADDITION /obj/structure/closet/secure_closet/atmospherics diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm index 5f2c694ed21..b227eb1c6fc 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm @@ -86,7 +86,7 @@ new /obj/item/defibrillator/compact/loaded(src) new /obj/item/healthanalyzer/advanced(src) new /obj/item/assembly/flash/handheld(src) - new /obj/item/storage/briefcase/medicalgunset/cmo(src) //SKYRAT EDIT ADDITION MEDIGUNS + new /obj/item/storage/briefcase/medicalgunset/cmo(src) //NOVA EDIT ADDITION MEDIGUNS new /obj/item/autosurgeon/medical_hud(src) new /obj/item/door_remote/chief_medical_officer(src) new /obj/item/clothing/neck/petcollar(src) @@ -95,14 +95,14 @@ new /obj/item/circuitboard/machine/techfab/department/medical(src) new /obj/item/storage/photo_album/cmo(src) new /obj/item/storage/lockbox/medal/med(src) - new /obj/item/card/id/departmental_budget/med(src) //SKYRAT EDIT ADDITION + new /obj/item/card/id/departmental_budget/med(src) //NOVA EDIT ADDITION /obj/structure/closet/secure_closet/chief_medical/populate_contents_immediate() . = ..() // Traitor steal objective //new /obj/item/reagent_containers/hypospray/cmo(src) - ORIGINAL - new /obj/item/storage/hypospraykit/cmo(src) //SKYRAT EDIT ADDITION - New Hyposprays + new /obj/item/storage/hypospraykit/cmo(src) //NOVA EDIT ADDITION - New Hyposprays /obj/structure/closet/secure_closet/animal name = "animal control locker" @@ -127,8 +127,8 @@ new /obj/item/storage/box/pillbottles(src) new /obj/item/storage/box/medigels(src) new /obj/item/storage/box/medigels(src) - new /obj/item/storage/box/hypospray(src) //SKYRAT EDIT ADDITION - HYPOSPRAYS - new /obj/item/storage/box/hypospray(src) //SKYRAT EDIT ADDITION - HYPOSPRAYS + new /obj/item/storage/box/hypospray(src) //NOVA EDIT ADDITION - HYPOSPRAYS + new /obj/item/storage/box/hypospray(src) //NOVA EDIT ADDITION - HYPOSPRAYS new /obj/item/ph_booklet(src) new /obj/item/reagent_containers/dropper(src) new /obj/item/reagent_containers/cup/bottle/acidic_buffer(src) //hopefully they get the hint diff --git a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm index 7bfcd40d34b..002d3d7dca2 100755 --- a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm @@ -18,7 +18,7 @@ new /obj/item/circuitboard/machine/techfab/department/science(src) new /obj/item/storage/photo_album/rd(src) new /obj/item/storage/box/skillchips/science(src) - new /obj/item/card/id/departmental_budget/sci(src) //SKYRAT EDIT ADDITION + new /obj/item/card/id/departmental_budget/sci(src) //NOVA EDIT ADDITION /obj/structure/closet/secure_closet/research_director/populate_contents_immediate() . = ..() diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index 6d58bce0b32..01529951587 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -20,7 +20,7 @@ new /obj/item/gun/energy/e_gun(src) new /obj/item/door_remote/captain(src) new /obj/item/storage/photo_album/captain(src) - new /obj/item/card/id/departmental_budget(src) //SKYRAT EDIT ADDITION + new /obj/item/card/id/departmental_budget(src) //NOVA EDIT ADDITION /obj/structure/closet/secure_closet/hop name = "head of personnel's locker" @@ -45,7 +45,7 @@ new /obj/item/circuitboard/machine/techfab/department/service(src) new /obj/item/storage/photo_album/hop(src) new /obj/item/storage/lockbox/medal/hop(src) - new /obj/item/card/id/departmental_budget/srv(src) //SKYRAT EDIT ADDITION + new /obj/item/card/id/departmental_budget/srv(src) //NOVA EDIT ADDITION /obj/structure/closet/secure_closet/hos name = "head of security's locker" @@ -57,6 +57,7 @@ new /obj/item/computer_disk/command/hos(src) new /obj/item/radio/headset/heads/hos(src) + new /obj/item/radio/headset/heads/hos/alt(src) new /obj/item/storage/bag/garment/hos(src) new /obj/item/storage/lockbox/medal/sec(src) new /obj/item/megaphone/sec(src) @@ -67,7 +68,7 @@ new /obj/item/storage/belt/security/full(src) new /obj/item/circuitboard/machine/techfab/department/security(src) new /obj/item/storage/photo_album/hos(src) - new /obj/item/card/id/departmental_budget/sec(src) //SKYRAT EDIT ADDITION + new /obj/item/card/id/departmental_budget/sec(src) //NOVA EDIT ADDITION /obj/structure/closet/secure_closet/hos/populate_contents_immediate() . = ..() @@ -103,13 +104,13 @@ /obj/structure/closet/secure_closet/security/PopulateContents() ..() new /obj/item/clothing/suit/armor/vest/alt/sec(src) - new /obj/item/clothing/head/security_cap(src) //SKYRAT EDIT ADDITION + new /obj/item/clothing/head/security_cap(src) //NOVA EDIT ADDITION new /obj/item/clothing/head/helmet/sec(src) new /obj/item/radio/headset/headset_sec(src) new /obj/item/radio/headset/headset_sec/alt(src) new /obj/item/clothing/glasses/hud/security/sunglasses(src) new /obj/item/flashlight/seclite(src) - new /obj/item/clothing/gloves/tackler/security(src) // SKYRAT EDIT CHANGE - Gives Them The Blue Ones - ORIGINAL: new /obj/item/clothing/gloves/tackler(src) + new /obj/item/clothing/gloves/tackler/security(src) // NOVA EDIT CHANGE - Gives Them The Blue Ones - ORIGINAL: new /obj/item/clothing/gloves/tackler(src) /obj/structure/closet/secure_closet/security/sec @@ -117,7 +118,7 @@ ..() new /obj/item/storage/belt/security/full(src) -// SKYRAT EDIT CHANGE -- GOOFSEC DEP GUARDS +// NOVA EDIT CHANGE -- GOOFSEC DEP GUARDS /obj/structure/closet/secure_closet/security/cargo name = "\proper customs agent's locker" req_access = list(ACCESS_BRIG_ENTRANCE, ACCESS_CARGO) @@ -161,7 +162,7 @@ new /obj/item/restraints/handcuffs/cable/blue(src) new /obj/item/storage/bag/garment/orderly(src) new /obj/item/assembly/flash/handheld(src) -// SKYRAT EDIT CHANGE END -- GOOFSEC DEP GUARDS +// NOVA EDIT CHANGE END -- GOOFSEC DEP GUARDS /obj/structure/closet/secure_closet/detective name = "\improper detective's cabinet" @@ -182,7 +183,7 @@ new /obj/item/holosign_creator/security(src) new /obj/item/reagent_containers/spray/pepper(src) new /obj/item/clothing/suit/armor/vest/det_suit(src) - new /obj/item/toy/crayon/white(src) //SKYRAT EDIT CHANGE - ORIGINAL: /obj/item/storage/belt/holster/detective/full(src) + new /obj/item/toy/crayon/white(src) //NOVA EDIT CHANGE - ORIGINAL: /obj/item/storage/belt/holster/detective/full(src) new /obj/item/pinpointer/crew(src) new /obj/item/binoculars(src) new /obj/item/storage/box/rxglasses/spyglasskit(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 7367e04e6f5..e28e0508021 100644 --- a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm @@ -33,13 +33,13 @@ /obj/structure/closet/emcloset/PopulateContents() ..() - new /obj/item/storage/box/emergency_spacesuit(src) // SKYRAT EDIT ADD + new /obj/item/storage/box/emergency_spacesuit(src) // NOVA EDIT ADD if (prob(40)) new /obj/item/storage/toolbox/emergency(src) //switch (pick_weight(list("small" = 35, "aid" = 30, "tank" = 20, "both" = 10, "nothing" = 4))) // ORIGINAL - switch (pick_weight(list("small" = 35, "aid" = 30, "tank" = 20, "both" = 10))) // SKYRAT EDIT CHANGE + switch (pick_weight(list("small" = 35, "aid" = 30, "tank" = 20, "both" = 10))) // NOVA EDIT CHANGE if ("small") new /obj/item/tank/internals/emergency_oxygen(src) new /obj/item/tank/internals/emergency_oxygen(src) @@ -59,13 +59,13 @@ new /obj/item/tank/internals/emergency_oxygen(src) new /obj/item/clothing/mask/breath(src) - // SKYRAT EDIT REMOVAL START + // NOVA EDIT REMOVAL START /* if ("nothing") // doot pass() */ - // SKYRAT EDIT REMOVAL END + // NOVA EDIT REMOVAL END /* * Fire Closet @@ -78,16 +78,16 @@ /obj/structure/closet/firecloset/PopulateContents() ..() new /obj/item/clothing/suit/utility/fire/firefighter(src) - new /obj/item/clothing/mask/gas/alt(src) //SKYRAT EDIT CHANGE - ORIGINAL: /obj/item/clothing/mask/gas(src) + new /obj/item/clothing/mask/gas/alt(src) //NOVA EDIT CHANGE - ORIGINAL: /obj/item/clothing/mask/gas(src) new /obj/item/tank/internals/oxygen/red(src) new /obj/item/extinguisher(src) new /obj/item/clothing/head/utility/hardhat/red(src) new /obj/item/crowbar/large/emergency(src) - new /obj/item/storage/inflatable(src) //SKYRAT EDIT ADDITION - INFLATABLES + new /obj/item/storage/inflatable(src) //NOVA EDIT ADDITION - INFLATABLES /obj/structure/closet/firecloset/full/PopulateContents() new /obj/item/clothing/suit/utility/fire/firefighter(src) - new /obj/item/clothing/mask/gas/alt(src) //SKYRAT EDIT CHANGE - ORIGINAL: /obj/item/clothing/mask/gas(src) + new /obj/item/clothing/mask/gas/alt(src) //NOVA EDIT CHANGE - ORIGINAL: /obj/item/clothing/mask/gas(src) new /obj/item/flashlight(src) new /obj/item/tank/internals/oxygen/red(src) new /obj/item/extinguisher(src) diff --git a/code/game/objects/structures/deployable_turret.dm b/code/game/objects/structures/deployable_turret.dm index 0e810526bdc..ac4b35678c9 100644 --- a/code/game/objects/structures/deployable_turret.dm +++ b/code/game/objects/structures/deployable_turret.dm @@ -12,7 +12,6 @@ max_integrity = 100 buckle_lying = 0 layer = ABOVE_MOB_LAYER - plane = GAME_PLANE_UPPER var/view_range = 2.5 var/cooldown = 0 /// The projectile that the turret fires @@ -101,7 +100,6 @@ M.put_in_hands(TC) M.pixel_y = 14 layer = ABOVE_MOB_LAYER - SET_PLANE_IMPLICIT(src, GAME_PLANE_UPPER) setDir(SOUTH) playsound(src,'sound/mecha/mechmove01.ogg', 50, TRUE) set_anchored(TRUE) @@ -136,43 +134,34 @@ switch(dir) if(NORTH) layer = BELOW_MOB_LAYER - SET_PLANE_IMPLICIT(src, GAME_PLANE) user.pixel_x = 0 user.pixel_y = -14 if(NORTHEAST) layer = BELOW_MOB_LAYER - SET_PLANE_IMPLICIT(src, GAME_PLANE) user.pixel_x = -8 user.pixel_y = -4 if(EAST) layer = ABOVE_MOB_LAYER - SET_PLANE_IMPLICIT(src, GAME_PLANE_UPPER) user.pixel_x = -14 user.pixel_y = 0 if(SOUTHEAST) layer = BELOW_MOB_LAYER - SET_PLANE_IMPLICIT(src, GAME_PLANE) user.pixel_x = -8 user.pixel_y = 4 if(SOUTH) layer = ABOVE_MOB_LAYER - SET_PLANE_IMPLICIT(src, GAME_PLANE_UPPER) - plane = GAME_PLANE_UPPER user.pixel_x = 0 user.pixel_y = 14 if(SOUTHWEST) layer = BELOW_MOB_LAYER - SET_PLANE_IMPLICIT(src, GAME_PLANE) user.pixel_x = 8 user.pixel_y = 4 if(WEST) layer = ABOVE_MOB_LAYER - SET_PLANE_IMPLICIT(src, GAME_PLANE_UPPER) user.pixel_x = 14 user.pixel_y = 0 if(NORTHWEST) layer = BELOW_MOB_LAYER - SET_PLANE_IMPLICIT(src, GAME_PLANE) user.pixel_x = 8 user.pixel_y = -4 diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index 13ab18fdb0e..1858fd1ef5e 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -103,8 +103,8 @@ /obj/structure/displaycase/proc/trigger_alarm() if(!alert) return - //var/area/alarmed = get_area(src) SKYRAT EDIT REMOVAL - //alarmed.burglaralert(src) SKYRAT EDIT REMOVAL + //var/area/alarmed = get_area(src) NOVA EDIT REMOVAL + //alarmed.burglaralert(src) NOVA EDIT REMOVAL alarm_manager.send_alarm(ALARM_BURGLAR) addtimer(CALLBACK(alarm_manager, TYPE_PROC_REF(/datum/alarm_handler, clear_alarm), ALARM_BURGLAR), 1 MINUTES) @@ -317,7 +317,7 @@ //The lab cage and captain's display case do not spawn with electronics, which is why req_access is needed. /obj/structure/displaycase/captain start_showpiece_type = /obj/item/gun/energy/laser/captain - req_access = list(ACCESS_CAPTAIN) //SKYRAT EDIT CHANGE - ORIGINAL: req_access = list(ACCESS_CENT_SPECOPS) //this was intentional, presumably to make it slightly harder for caps to grab their gun roundstart + req_access = list(ACCESS_CAPTAIN) //NOVA EDIT CHANGE - ORIGINAL: req_access = list(ACCESS_CENT_SPECOPS) //this was intentional, presumably to make it slightly harder for caps to grab their gun roundstart /obj/structure/displaycase/labcage name = "lab cage" diff --git a/code/game/objects/structures/dresser.dm b/code/game/objects/structures/dresser.dm index 9232a992a5b..9108216f271 100644 --- a/code/game/objects/structures/dresser.dm +++ b/code/game/objects/structures/dresser.dm @@ -1,6 +1,6 @@ -//THIS FILE HAS BEEN EDITED BY SKYRAT EDIT +//THIS FILE HAS BEEN EDITED BY NOVA EDIT -/obj/structure/dresser//SKYRAT EDIT - ICON OVERRIDEN BY AESTHETICS - SEE MODULE +/obj/structure/dresser//NOVA EDIT - ICON OVERRIDEN BY AESTHETICS - SEE MODULE name = "dresser" desc = "A nicely-crafted wooden dresser. It's filled with lots of undies." icon = 'icons/obj/fluff/general.dmi' @@ -36,7 +36,7 @@ to_chat(dressing_human, span_warning("You are not capable of wearing underwear.")) return - var/choice = tgui_input_list(user, "Underwear, Bra, Undershirt, or Socks?", "Changing", list("Underwear", "Underwear Color", "Bra", "Bra Color", "Undershirt", "Undershirt Color", "Socks", "Socks Color")) //SKYRAT EDIT ADDITION - Colorable Undershirt/Socks/Bra + var/choice = tgui_input_list(user, "Underwear, Bra, Undershirt, or Socks?", "Changing", list("Underwear", "Underwear Color", "Bra", "Bra Color", "Undershirt", "Undershirt Color", "Socks", "Socks Color")) //NOVA EDIT ADDITION - Colorable Undershirt/Socks/Bra if(isnull(choice)) return @@ -59,7 +59,7 @@ var/new_socks = tgui_input_list(user, "Select your socks", "Changing", GLOB.socks_list) if(new_socks) dressing_human.socks = new_socks - //SKYRAT EDIT ADDITION BEGIN - Colorable Undershirt/Socks/Bras + //NOVA EDIT ADDITION BEGIN - Colorable Undershirt/Socks/Bras if("Undershirt Color") var/new_undershirt_color = input(dressing_human, "Choose your undershirt color", "Undershirt Color", dressing_human.undershirt_color) as color|null if(new_undershirt_color) @@ -79,7 +79,7 @@ if(new_bra_color) dressing_human.bra_color = sanitize_hexcolor(new_bra_color) - //SKYRAT EDIT ADDITION END - Colorable Undershirt/Socks/Bras + //NOVA EDIT ADDITION END - Colorable Undershirt/Socks/Bras add_fingerprint(dressing_human) dressing_human.update_body() diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm index 71166a840df..2cb67a8cafb 100644 --- a/code/game/objects/structures/extinguisher.dm +++ b/code/game/objects/structures/extinguisher.dm @@ -17,7 +17,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/extinguisher_cabinet, 29) if(building) opened = TRUE //icon_state = "extinguisher_empty" ORIGINAL - icon_state = "extinguisher_empty_open" //SKYRAT EDIT CHANGE - AESTHETICS + icon_state = "extinguisher_empty_open" //NOVA EDIT CHANGE - AESTHETICS else stored_extinguisher = new /obj/item/extinguisher(src) update_appearance(UPDATE_ICON) @@ -107,6 +107,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/extinguisher_cabinet, 29) if(!opened) opened = 1 playsound(loc, 'sound/machines/click.ogg', 15, TRUE, -3) + update_appearance(UPDATE_ICON) else toggle_cabinet(user) @@ -140,7 +141,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/extinguisher_cabinet, 29) opened = !opened update_appearance(UPDATE_ICON) -/* SKYRAT EDIT REMOVAL BEGIN - AESTHETICS - MOVED TO MODULAR. +/* NOVA EDIT REMOVAL BEGIN - AESTHETICS - MOVED TO MODULAR. /obj/structure/extinguisher_cabinet/update_icon_state() icon_state = "extinguisher" diff --git a/code/game/objects/structures/fireplace.dm b/code/game/objects/structures/fireplace.dm index 97a9ce8bd4d..19cdab1e6a4 100644 --- a/code/game/objects/structures/fireplace.dm +++ b/code/game/objects/structures/fireplace.dm @@ -1,6 +1,6 @@ -#define LOG_BURN_TIMER 5000 //SKYRAT EDIT original: #define LOG_BURN_TIMER 150 +#define LOG_BURN_TIMER 5000 //NOVA EDIT original: #define LOG_BURN_TIMER 150 #define PAPER_BURN_TIMER 5 -#define MAXIMUM_BURN_TIMER 100000 //SKYRAT EDIT original: #define MAXIMUM_BURN_TIMER 3000 +#define MAXIMUM_BURN_TIMER 100000 //NOVA EDIT original: #define MAXIMUM_BURN_TIMER 3000 /obj/structure/fireplace name = "fireplace" @@ -95,15 +95,15 @@ return switch(burn_time_remaining()) - if(0 to 19999) //SKYRAT EDIT original: if(0 to 500) + if(0 to 19999) //NOVA EDIT original: if(0 to 500) . += "fireplace_fire0" - if(20000 to 39999) //SKYRAT EDIT original: if(500 to 1000) + if(20000 to 39999) //NOVA EDIT original: if(500 to 1000) . += "fireplace_fire1" - if(40000 to 59999) //SKYRAT EDIT original: if(1000 to 1500) + if(40000 to 59999) //NOVA EDIT original: if(1000 to 1500) . += "fireplace_fire2" - if(60000 to 79999) //SKYRAT EDIT original: if(1500 to 2000) + if(60000 to 79999) //NOVA EDIT original: if(1500 to 2000) . += "fireplace_fire3" - if(80000 to MAXIMUM_BURN_TIMER) //SKYRAT EDIT original: if(2000 to MAXIMUM_BURN_TIMER) + if(80000 to MAXIMUM_BURN_TIMER) //NOVA EDIT original: if(2000 to MAXIMUM_BURN_TIMER) . += "fireplace_fire4" . += "fireplace_glow" @@ -113,15 +113,15 @@ return switch(burn_time_remaining()) - if(0 to 19999) //SKYRAT EDIT original: if(0 to 500) + if(0 to 19999) //NOVA EDIT original: if(0 to 500) set_light(1) - if(20000 to 39999) //SKYRAT EDIT original: if(500 to 1000) + if(20000 to 39999) //NOVA EDIT original: if(500 to 1000) set_light(2) - if(40000 to 59999) //SKYRAT EDIT original: if(1000 to 1500) + if(40000 to 59999) //NOVA EDIT original: if(1000 to 1500) set_light(3) - if(60000 to 79999) //SKYRAT EDIT original: if(1500 to 2000) + if(60000 to 79999) //NOVA EDIT original: if(1500 to 2000) set_light(4) - if(80000 to MAXIMUM_BURN_TIMER) //SKYRAT EDIT original: if(2000 to MAXIMUM_BURN_TIMER) + if(80000 to MAXIMUM_BURN_TIMER) //NOVA EDIT original: if(2000 to MAXIMUM_BURN_TIMER) set_light(6) /obj/structure/fireplace/process(seconds_per_tick) diff --git a/code/game/objects/structures/fluff.dm b/code/game/objects/structures/fluff.dm index 57207cf7aba..a38659aaefe 100644 --- a/code/game/objects/structures/fluff.dm +++ b/code/game/objects/structures/fluff.dm @@ -74,7 +74,7 @@ density = TRUE deconstructible = FALSE layer = EDGED_TURF_LAYER - plane = GAME_PLANE_UPPER + /** * A variety of statue in disrepair; parts are broken off and a gemstone is missing */ diff --git a/code/game/objects/structures/guillotine.dm b/code/game/objects/structures/guillotine.dm index ca019c05c12..bc56b3838ca 100644 --- a/code/game/objects/structures/guillotine.dm +++ b/code/game/objects/structures/guillotine.dm @@ -42,7 +42,6 @@ buckle_lying = 0 buckle_prevents_pull = TRUE layer = ABOVE_MOB_LAYER - plane = GAME_PLANE_UPPER /// The sound the guillotine makes when it successfully cuts off a head var/drop_sound = 'sound/weapons/guillotine.ogg' /// The current state of the blade diff --git a/code/game/objects/structures/gym/weight_machine.dm b/code/game/objects/structures/gym/weight_machine.dm index a7426e2f465..055c9788c95 100644 --- a/code/game/objects/structures/gym/weight_machine.dm +++ b/code/game/objects/structures/gym/weight_machine.dm @@ -152,7 +152,6 @@ end_workout() return FALSE var/mutable_appearance/workout = mutable_appearance(icon, "[base_icon_state]-o", ABOVE_MOB_LAYER) - SET_PLANE_EXPLICIT(workout, GAME_PLANE_UPPER, src) flick_overlay_view(workout, 0.8 SECONDS) flick("[base_icon_state]-u", src) var/mob/living/user = buckled_mobs[1] diff --git a/code/game/objects/structures/holosign.dm b/code/game/objects/structures/holosign.dm index bd20ef405fc..a3d09340d87 100644 --- a/code/game/objects/structures/holosign.dm +++ b/code/game/objects/structures/holosign.dm @@ -24,7 +24,7 @@ var/turf/our_turf = get_turf(src) if(use_vis_overlay) alpha = 0 - SSvis_overlays.add_vis_overlay(src, icon, icon_state, ABOVE_MOB_LAYER, MUTATE_PLANE(GAME_PLANE_UPPER, our_turf), dir, add_appearance_flags = RESET_ALPHA) //you see mobs under it, but you hit them like they are above it + SSvis_overlays.add_vis_overlay(src, icon, icon_state, ABOVE_MOB_LAYER, MUTATE_PLANE(GAME_PLANE, our_turf), dir, add_appearance_flags = RESET_ALPHA) //you see mobs under it, but you hit them like they are above it if(source_projector) projector = source_projector LAZYADD(projector.signs, src) @@ -111,6 +111,20 @@ rad_insulation = RAD_LIGHT_INSULATION resistance_flags = FIRE_PROOF | FREEZE_PROOF +/obj/structure/holosign/barrier/atmos/proc/clearview_transparency() + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + alpha = 25 + SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays) + var/turf/our_turf = get_turf(src) + SSvis_overlays.add_vis_overlay(src, icon, icon_state, ABOVE_MOB_LAYER, MUTATE_PLANE(GAME_PLANE, our_turf), dir) + +/obj/structure/holosign/barrier/atmos/proc/reset_transparency() + mouse_opacity = initial(mouse_opacity) + alpha = initial(alpha) + SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays) + var/turf/our_turf = get_turf(src) + SSvis_overlays.add_vis_overlay(src, icon, icon_state, ABOVE_MOB_LAYER, MUTATE_PLANE(GAME_PLANE, our_turf), dir, add_appearance_flags = RESET_ALPHA) + /obj/structure/holosign/barrier/atmos/sturdy name = "sturdy holofirelock" max_integrity = 150 diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm index fd4daaeaa18..0f11779ead2 100644 --- a/code/game/objects/structures/kitchen_spike.dm +++ b/code/game/objects/structures/kitchen_spike.dm @@ -1,6 +1,6 @@ #define MEATSPIKE_IRONROD_REQUIREMENT 4 -/obj/structure/kitchenspike_frame//SKYRAT EDIT - ICON OVERRIDEN BY AESTHETICS - SEE MODULE +/obj/structure/kitchenspike_frame//NOVA EDIT - ICON OVERRIDEN BY AESTHETICS - SEE MODULE name = "meatspike frame" icon = 'icons/obj/service/kitchen.dmi' icon_state = "spikeframe" @@ -64,7 +64,7 @@ return balloon_alert(user, "[MEATSPIKE_IRONROD_REQUIREMENT] rods needed!") -/obj/structure/kitchenspike//SKYRAT EDIT - ICON OVERRIDEN BY AESTHETICS - SEE MODULE +/obj/structure/kitchenspike//NOVA EDIT - ICON OVERRIDEN BY AESTHETICS - SEE MODULE name = "meat spike" icon = 'icons/obj/service/kitchen.dmi' icon_state = "spike" diff --git a/code/game/objects/structures/ladders.dm b/code/game/objects/structures/ladders.dm index 9b7b5590018..ef6ea9d433e 100644 --- a/code/game/objects/structures/ladders.dm +++ b/code/game/objects/structures/ladders.dm @@ -224,17 +224,6 @@ use(user, going_up = FALSE) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN -/obj/structure/ladder/attack_slime(mob/user, list/modifiers) - use(user) - return TRUE - -/obj/structure/ladder/attack_slime_secondary(mob/user, list/modifiers) - . = ..() - if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) - return - use(user, going_up = FALSE) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - /obj/structure/ladder/attackby(obj/item/item, mob/user, params) use(user) return TRUE diff --git a/code/game/objects/structures/mannequin.dm b/code/game/objects/structures/mannequin.dm index 4fc14ada0b2..a4cc8a99ed1 100644 --- a/code/game/objects/structures/mannequin.dm +++ b/code/game/objects/structures/mannequin.dm @@ -109,11 +109,11 @@ var/datum/sprite_accessory/socks/socks = GLOB.socks_list[socks_name] if(socks) . += mutable_appearance(socks.icon, socks.icon_state, -BODY_LAYER) - //SKYRAT EDIT ADDITION BEGIN - Underwear and Bra split + //NOVA EDIT ADDITION BEGIN - Underwear and Bra split var/datum/sprite_accessory/bra/bra = GLOB.bra_list[bra_name] if(bra) . += mutable_appearance(bra.icon, bra.icon_state, -BODY_LAYER) - //SKYRAT EDIT END + //NOVA EDIT END for(var/slot_flag in worn_items) var/obj/item/worn_item = worn_items[slot_flag] @@ -168,7 +168,7 @@ . = ..() if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) return - var/choice = tgui_input_list(user, "Underwear, Bra, Undershirt, or Socks?", "Changing", list("Underwear", "Bra", "Undershirt","Socks")) //SKYRAT EDIT ADDITION - Underwear and Bra split + var/choice = tgui_input_list(user, "Underwear, Bra, Undershirt, or Socks?", "Changing", list("Underwear", "Bra", "Undershirt","Socks")) //NOVA EDIT ADDITION - Underwear and Bra split if(!Adjacent(user)) return switch(choice) @@ -184,12 +184,12 @@ var/new_socks = tgui_input_list(user, "Select the mannequin's socks", "Changing", GLOB.socks_list) if(new_socks) socks_name = new_socks - //SKYRAT EDIT ADDITION BEGIN - Underwear and Bra split + //NOVA EDIT ADDITION BEGIN - Underwear and Bra split if("Bra") var/new_bra = tgui_input_list(user, "Select the mannequin's bra", "Changing", GLOB.bra_list) if(new_bra) bra_name = new_bra - //SKYRAT EDIT END + //NOVA EDIT END update_appearance() /obj/structure/mannequin/wood diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm index f8392159078..51ec52e4584 100644 --- a/code/game/objects/structures/mirror.dm +++ b/code/game/objects/structures/mirror.dm @@ -79,7 +79,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/mirror/broken, 28) /obj/structure/mirror/attack_hand(mob/living/carbon/human/user) . = ..() - if(. || !ishuman(user) || broken || !istype(src, /obj/structure/mirror/magic)) // SKYRAT EDIT CHANGE - MUNDANE MIRRORS DON'T LET YOU CHANGE - ORIGINAL: if(. || !ishuman(user) || broken) + if(. || !ishuman(user) || broken || !istype(src, /obj/structure/mirror/magic)) // NOVA EDIT CHANGE - MUNDANE MIRRORS DON'T LET YOU CHANGE - ORIGINAL: if(. || !ishuman(user) || broken) return TRUE if(!istype(src, /obj/structure/mirror/magic) && !user.can_perform_action(src, FORBID_TELEKINESIS_REACH)) @@ -357,7 +357,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/mirror/broken, 28) user.set_facial_haircolor(sanitize_hexcolor(new_face_color), update = FALSE) user.dna.update_ui_block(DNA_FACIAL_HAIR_COLOR_BLOCK) user.update_body_parts() - user.update_mutant_bodyparts(force_update = TRUE) /// SKYRAT EDIT ADDITION - Mirrors are no longer scared of colored ears + user.update_mutant_bodyparts(force_update = TRUE) /// NOVA EDIT ADDITION - Mirrors are no longer scared of colored ears /obj/structure/mirror/magic/attack_hand(mob/living/carbon/human/user) . = ..() diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index 1935d6ba417..f31eae55dd8 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -425,10 +425,10 @@ GLOBAL_LIST_EMPTY(crematoriums) qdel(M) for(var/obj/O in conts) //conts defined above, ignores crematorium and tray - // SKYRAT EDIT ADDITION + // NOVA EDIT ADDITION if(istype(O, /obj/item/goldeneye_key)) continue - // SKYRAT EDIT END + // NOVA EDIT END if(istype(O, /obj/effect/dummy/phased_mob)) //they're not physical, don't burn em. continue qdel(O) diff --git a/code/game/objects/structures/petrified_statue.dm b/code/game/objects/structures/petrified_statue.dm index 54896c2e414..a752faba40c 100644 --- a/code/game/objects/structures/petrified_statue.dm +++ b/code/game/objects/structures/petrified_statue.dm @@ -91,8 +91,24 @@ visible_message(span_danger(destruction_message)) qdel(src) +/obj/structure/statue/petrified/animate_atom_living(mob/living/owner) + if(isnull(petrified_mob)) + return ..() + var/mob/living/basic/statue/new_statue = new(drop_location()) + new_statue.name = "statue of [petrified_mob.name]" + if(owner) + new_statue.befriend(owner) + new_statue.icon = icon + new_statue.icon_state = icon_state + new_statue.copy_overlays(src, TRUE) + new_statue.atom_colours = atom_colours.Copy() + petrified_mob.mind?.transfer_to(new_statue) + to_chat(new_statue, span_userdanger("You are an animate statue. You cannot move when monitored, but are nearly invincible and deadly when unobserved! [owner ? "Do not harm [owner], your creator" : ""].")) + forceMove(new_statue) + /mob/proc/petrify(statue_timer) + return /mob/living/carbon/human/petrify(statue_timer, save_brain, colorlist) if(!isturf(loc)) diff --git a/code/game/objects/structures/plasticflaps.dm b/code/game/objects/structures/plasticflaps.dm index 6ac313883df..f4834ecf48a 100644 --- a/code/game/objects/structures/plasticflaps.dm +++ b/code/game/objects/structures/plasticflaps.dm @@ -36,7 +36,7 @@ /obj/structure/plasticflaps/proc/gen_overlay() var/turf/our_turf = get_turf(src) - SSvis_overlays.add_vis_overlay(src, icon, icon_state, ABOVE_MOB_LAYER, MUTATE_PLANE(GAME_PLANE_UPPER, our_turf), dir, add_appearance_flags = RESET_ALPHA) //you see mobs under it, but you hit them like they are above it + SSvis_overlays.add_vis_overlay(src, icon, icon_state, ABOVE_MOB_LAYER, MUTATE_PLANE(GAME_PLANE, our_turf), dir, add_appearance_flags = RESET_ALPHA) //you see mobs under it, but you hit them like they are above it /obj/structure/plasticflaps/examine(mob/user) . = ..() diff --git a/code/game/objects/structures/railings.dm b/code/game/objects/structures/railings.dm index fb69570eea5..3604bd06c63 100644 --- a/code/game/objects/structures/railings.dm +++ b/code/game/objects/structures/railings.dm @@ -9,7 +9,6 @@ anchored = TRUE pass_flags_self = LETPASSTHROW|PASSSTRUCTURE layer = ABOVE_MOB_LAYER - plane = GAME_PLANE_UPPER /// armor is a little bit less than a grille. max_integrity about half that of a grille. armor_type = /datum/armor/structure_railing max_integrity = 25 @@ -164,7 +163,6 @@ icon = 'icons/obj/structures.dmi' icon_state = "wooden_railing" item_deconstruct = /obj/item/stack/sheet/mineral/wood - plane = GAME_PLANE_FOV_HIDDEN layer = ABOVE_MOB_LAYER /obj/structure/railing/wooden_fence/Initialize(mapload) diff --git a/code/game/objects/structures/shower.dm b/code/game/objects/structures/shower.dm index ce3d8414398..7b86a17e9dc 100644 --- a/code/game/objects/structures/shower.dm +++ b/code/game/objects/structures/shower.dm @@ -120,12 +120,12 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/shower, (-16)) return TRUE -//SKYRAT EDIT ADDITION +//NOVA EDIT ADDITION /obj/machinery/shower/plunger_act(obj/item/plunger/P, mob/living/user, reinforced) if(do_after(user, 3 SECONDS, src)) reagents.remove_any(reagents.total_volume) balloon_alert(user, "reservoir emptied") -//SKYRAT EDIT END +//NOVA EDIT END /obj/machinery/shower/analyzer_act(mob/living/user, obj/item/tool) . = ..() @@ -204,7 +204,6 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/shower, (-16)) return var/mutable_appearance/water_falling = mutable_appearance('icons/obj/watercloset.dmi', "water", ABOVE_MOB_LAYER) water_falling.color = mix_color_from_reagents(reagents.reagent_list) - SET_PLANE_EXPLICIT(water_falling, GAME_PLANE_UPPER, src) switch(dir) if(NORTH) water_falling.pixel_y += pixel_shift diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index c3ec9b166f9..0bcfb36579a 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -723,7 +723,7 @@ * Surgery Tables */ -/obj/structure/table/optable//SKYRAT EDIT - ICON OVERRIDEN BY AESTHETICS - SEE MODULE +/obj/structure/table/optable//NOVA EDIT - ICON OVERRIDEN BY AESTHETICS - SEE MODULE name = "operating table" desc = "Used for advanced medical procedures." icon = 'icons/obj/medical/surgery_table.dmi' @@ -802,11 +802,11 @@ if(potential_patient.body_position == LYING_DOWN && potential_patient.loc == loc) patient = potential_patient - chill_out(patient) // SKYRAT EDIT - Operation Table Numbing + chill_out(patient) // NOVA EDIT - Operation Table Numbing return - if(!isnull(patient)) // SKYRAT EDIT - Operation Table Numbing - thaw_them(patient) // SKYRAT EDIT - Operation Table Numbing + if(!isnull(patient)) // NOVA EDIT - Operation Table Numbing + thaw_them(patient) // NOVA EDIT - Operation Table Numbing // Find another lying mob as a replacement. for (var/mob/living/carbon/replacement_patient in loc.contents) diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 531df729957..b343cd85f50 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -760,12 +760,10 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sink/kitchen, (-16)) open = !open if(open) layer = SIGN_LAYER - SET_PLANE_IMPLICIT(src, GAME_PLANE) set_density(FALSE) set_opacity(FALSE) else layer = WALL_OBJ_LAYER - SET_PLANE_IMPLICIT(src, GAME_PLANE_UPPER) set_density(TRUE) if(opaque_closed) set_opacity(TRUE) @@ -878,7 +876,6 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sink/kitchen, (-16)) /obj/structure/curtain/cloth/fancy/mechanical/proc/close() icon_state = "[icon_type]-closed" layer = WALL_OBJ_LAYER - SET_PLANE_IMPLICIT(src, GAME_PLANE_UPPER) set_density(TRUE) open = FALSE if(opaque_closed) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 678a9a25314..c10eedeec5e 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -108,7 +108,7 @@ /obj/structure/window/singularity_pull(S, current_size) ..() - if(anchored && current_size >= STAGE_FIVE) //SKYRAT EDIT CHANGE + if(anchored && current_size >= STAGE_FIVE) //NOVA EDIT CHANGE set_anchored(FALSE) if(current_size >= STAGE_FIVE) deconstruct(FALSE) @@ -185,7 +185,7 @@ /obj/structure/window/attack_paw(mob/user, list/modifiers) return attack_hand(user, modifiers) -/obj/structure/window/attack_generic(mob/user, damage_amount = 0, damage_type = BRUTE, damage_flag = 0, sound_effect = 1) //used by attack_alien, attack_animal, and attack_slime +/obj/structure/window/attack_generic(mob/user, damage_amount = 0, damage_type = BRUTE, damage_flag = 0, sound_effect = 1) //used by attack_alien, attack_animal if(!can_be_reached(user)) return return ..() diff --git a/code/game/say.dm b/code/game/say.dm index c0e9d4ff8ef..3799b5ed432 100644 --- a/code/game/say.dm +++ b/code/game/say.dm @@ -15,12 +15,12 @@ GLOBAL_LIST_INIT(freqtospan, list( "[FREQ_SYNDICATE]" = "syndradio", "[FREQ_UPLINK]" = "syndradio", // this probably shouldnt appear ingame "[FREQ_CENTCOM]" = "centcomradio", - "[FREQ_FACTION]" = "suppradio", //SKYRAT EDIT ADDITIION - FACTION - "[FREQ_CYBERSUN]" = "syndradio", //SKYRAT EDIT ADDITION - MAPPING - "[FREQ_INTERDYNE]" = "syndradio", //SKYRAT EDIT ADDITION - MAPPING - "[FREQ_GUILD]" = "syndradio", //SKYRAT EDIT ADDITION - MAPPING - "[FREQ_TARKON]" = "engradio", //SKYRAT EDIT ADDITION - MAPPING - "[FREQ_SOLFED]" = "medradio", //SKYRAT EDIT ADDITION - SOLFED + "[FREQ_FACTION]" = "suppradio", //NOVA EDIT ADDITIION - FACTION + "[FREQ_CYBERSUN]" = "syndradio", //NOVA EDIT ADDITION - MAPPING + "[FREQ_INTERDYNE]" = "syndradio", //NOVA EDIT ADDITION - MAPPING + "[FREQ_GUILD]" = "syndradio", //NOVA EDIT ADDITION - MAPPING + "[FREQ_TARKON]" = "engradio", //NOVA EDIT ADDITION - MAPPING + "[FREQ_SOLFED]" = "medradio", //NOVA EDIT ADDITION - SOLFED "[FREQ_CTF_RED]" = "redteamradio", "[FREQ_CTF_BLUE]" = "blueteamradio", "[FREQ_CTF_GREEN]" = "greenteamradio", diff --git a/code/game/sound.dm b/code/game/sound.dm index f1b5dd0406f..52127f8ea1f 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -150,8 +150,8 @@ sound_to_use.environment = A.sound_environment if(use_reverb && sound_to_use.environment != SOUND_ENVIRONMENT_NONE) //We have reverb, reset our echo setting - sound_to_use.echo[3] = -1300 //Room setting, 0 means normal reverb //SKYRAT EDIT CHANGE - sound_to_use.echo[4] = -1300 //RoomHF setting, 0 means normal reverb. //SKYRAT EDIT CHANGE + sound_to_use.echo[3] = -1300 //Room setting, 0 means normal reverb //NOVA EDIT CHANGE + sound_to_use.echo[4] = -1300 //RoomHF setting, 0 means normal reverb. //NOVA EDIT CHANGE SEND_SOUND(src, sound_to_use) @@ -183,7 +183,7 @@ /proc/get_sfx(soundin) if(istext(soundin)) - soundin = get_sfx_skyrat(soundin) //SKYRAT EDIT ADDITION - This overrides the default sound effects too, so use it to modularly change a sound effect output. + soundin = get_sfx_skyrat(soundin) //NOVA EDIT ADDITION - This overrides the default sound effects too, so use it to modularly change a sound effect output. switch(soundin) if(SFX_SHATTER) soundin = pick('sound/effects/glassbr1.ogg','sound/effects/glassbr2.ogg','sound/effects/glassbr3.ogg') diff --git a/code/game/turfs/change_turf.dm b/code/game/turfs/change_turf.dm index 1253d156a2c..2c2d5712b46 100644 --- a/code/game/turfs/change_turf.dm +++ b/code/game/turfs/change_turf.dm @@ -76,11 +76,11 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( var/old_lighting_corner_NW = lighting_corner_NW var/old_directional_opacity = directional_opacity var/old_dynamic_lumcount = dynamic_lumcount - //SKYRAT EDIT CHANGE + //NOVA EDIT CHANGE var/obj/effect/abstract/liquid_turf/old_liquids = liquids if(lgroup) lgroup.remove_from_group(src) - //SKYRAT EDIT END + //NOVA EDIT END var/old_rcd_memory = rcd_memory var/old_explosion_throw_details = explosion_throw_details var/old_opacity = opacity @@ -178,7 +178,7 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( else if(ispath(old_type, /turf/open/space)) for(var/turf/open/space/space_tile in RANGE_TURFS(1, src)) space_tile.enable_starlight() - //SKYRAT EDIT ADDITION + //NOVA EDIT ADDITION if(old_liquids) if(new_turf.liquids) var/liquid_cache = new_turf.liquids //Need to cache and re-set some vars due to the cleaning on Destroy(), and turf references @@ -201,7 +201,7 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( old_liquids.remove_turf(src) else qdel(old_liquids, TRUE) - //SKYRAT EDIT END + //NOVA EDIT END if(old_opacity != opacity && SSticker) GLOB.cameranet.bareMajorChunkChange(src) @@ -224,17 +224,17 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( var/datum/gas_mixture/stashed_air = new() stashed_air.copy_from(air) var/stashed_state = excited - var/datum/pollution/stashed_pollution = pollution //SKYRAT EDIT ADDITION + var/datum/pollution/stashed_pollution = pollution //NOVA EDIT ADDITION var/datum/excited_group/stashed_group = excited_group . = ..() //If path == type this will return us, don't bank on making a new type if (!.) // changeturf failed or didn't do anything return var/turf/open/new_turf = . - //SKYRAT EDIT ADDITION + //NOVA EDIT ADDITION if(stashed_pollution) new_turf.pollution = stashed_pollution stashed_pollution.handle_overlay() - //SKYRAT EDIT END + //NOVA EDIT END new_turf.air.copy_from(stashed_air) new_turf.excited = stashed_state new_turf.excited_group = stashed_group @@ -246,10 +246,10 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( if(stashed_group.should_display || SSair.display_all_groups) stashed_group.display_turf(new_turf) else - //SKYRAT EDIT ADDITION + //NOVA EDIT ADDITION if(pollution) qdel(pollution) - //SKYRAT EDIT END + //NOVA EDIT END if(excited || excited_group) SSair.remove_from_active(src) //Clean up wall excitement, and refresh excited groups if(ispath(path, /turf/closed) || ispath(path, /turf/cordon)) diff --git a/code/game/turfs/closed/indestructible.dm b/code/game/turfs/closed/indestructible.dm index b8c386ecf10..d68fbe51b3e 100644 --- a/code/game/turfs/closed/indestructible.dm +++ b/code/game/turfs/closed/indestructible.dm @@ -67,12 +67,12 @@ desc = null icon = 'icons/blanks/blank_title.png' icon_state = "" - pixel_x = 0 // SKYRAT EDIT - Re-centering the title screen - ORIGINAL: pixel_x = -64 + pixel_x = 0 // NOVA EDIT - Re-centering the title screen - ORIGINAL: pixel_x = -64 plane = SPLASHSCREEN_PLANE bullet_bounce_sound = null INITIALIZE_IMMEDIATE(/turf/closed/indestructible/splashscreen) -/* SKYRAT EDIT REMOVAL +/* NOVA EDIT REMOVAL /turf/closed/indestructible/splashscreen/Initialize(mapload) . = ..() SStitle.splash_turf = src @@ -88,10 +88,10 @@ INITIALIZE_IMMEDIATE(/turf/closed/indestructible/splashscreen) pixel_x = 0 else if(width == 608) // 608x480 is widescreen pixel_x = -64 - // SKYRAT EDIT START - Wider widescreen + // NOVA EDIT START - Wider widescreen else if(width == 672) // Skyrat's widescreen is slightly wider than /tg/'s, so we need to accomodate that too. pixel_x = -96 - // SKYRAT EDIT END + // NOVA EDIT END /turf/closed/indestructible/splashscreen/vv_edit_var(var_name, var_value) . = ..() @@ -104,7 +104,7 @@ INITIALIZE_IMMEDIATE(/turf/closed/indestructible/splashscreen) /turf/closed/indestructible/splashscreen/examine() desc = pick(strings(SPLASH_FILE, "splashes")) return ..() -SKYRAT EDIT REMOVAL END */ +NOVA EDIT REMOVAL END */ /turf/closed/indestructible/start_area name = null diff --git a/code/game/turfs/closed/minerals.dm b/code/game/turfs/closed/minerals.dm index 173033c01c9..8da806bcb82 100644 --- a/code/game/turfs/closed/minerals.dm +++ b/code/game/turfs/closed/minerals.dm @@ -4,15 +4,19 @@ /turf/closed/mineral //wall piece name = "rock" - icon = MAP_SWITCH('modular_skyrat/modules/liquids/icons/turf/smoothrocks.dmi', 'icons/turf/mining.dmi') // SKYRAT EDIT CHANGE + icon = MAP_SWITCH('modular_nova/modules/liquids/icons/turf/smoothrocks.dmi', 'icons/turf/mining.dmi') // NOVA EDIT CHANGE icon_state = "rock" + smoothing_groups = SMOOTH_GROUP_CLOSED_TURFS + SMOOTH_GROUP_MINERAL_WALLS + canSmoothWith = SMOOTH_GROUP_MINERAL_WALLS smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER baseturfs = /turf/open/misc/asteroid/airless initial_gas_mix = AIRLESS_ATMOS opacity = TRUE density = TRUE + // We're a BIG wall, larger then 32x32, so we need to be on the game plane + // Otherwise we'll draw under shit in weird ways + plane = GAME_PLANE layer = EDGED_TURF_LAYER - plane = WALL_PLANE_UPPER base_icon_state = "smoothrocks" // This is static @@ -21,7 +25,7 @@ transform = MAP_SWITCH(TRANSLATE_MATRIX(-4, -4), matrix()) temperature = TCMB - color = "#677" //SKYRAT EDIT ADDITION + color = "#677" //NOVA EDIT ADDITION var/turf/open/floor/plating/turf_type = /turf/open/misc/asteroid/airless var/obj/item/stack/ore/mineralType = null @@ -37,14 +41,15 @@ /turf/closed/mineral/Initialize(mapload) - var/static/list/smoothing_groups = SMOOTH_GROUP_CLOSED_TURFS + SMOOTH_GROUP_MINERAL_WALLS - var/static/list/canSmoothWith = SMOOTH_GROUP_MINERAL_WALLS - - // The cost of the list() being in the type def is very large for something as common as minerals - src.smoothing_groups = smoothing_groups - src.canSmoothWith = canSmoothWith - - return ..() + . = ..() + // Mineral turfs are big, so they need to be on the game plane at a high layer + // But they're also turfs, so we need to cut them out from the light mask plane + // So we draw them as if they were on the game plane, and then overlay a copy onto + // The wall plane (so emissives/light masks behave) + // I am so sorry + var/static/mutable_appearance/wall_overlay = mutable_appearance('icons/turf/mining.dmi', "rock", appearance_flags = RESET_TRANSFORM) + wall_overlay.plane = MUTATE_PLANE(WALL_PLANE, src) + overlays += wall_overlay // Inlined version of the bump click element. way faster this way, the element's nice but it's too much overhead /turf/closed/mineral/Bumped(atom/movable/bumped_atom) @@ -231,13 +236,13 @@ var/path = pick(spawn_chance_list) if(ispath(path, /turf)) var/stored_flags = 0 - var/stored_color = color //SKYRAT EDIT ADDITION + var/stored_color = color //NOVA EDIT ADDITION if(turf_flags & NO_RUINS) stored_flags |= NO_RUINS var/turf/T = ChangeTurf(path,null,CHANGETURF_IGNORE_AIR) T.flags_1 |= stored_flags - T.color = stored_color //SKYRAT EDIT ADDITION + T.color = stored_color //NOVA EDIT ADDITION if(ismineralturf(T)) var/turf/closed/mineral/M = T M.turf_type = src.turf_type @@ -689,7 +694,6 @@ /turf/closed/mineral/gibtonite/proc/explosive_reaction(mob/user = null) if(stage == GIBTONITE_UNSTRUCK) activated_overlay = mutable_appearance('icons/turf/smoothrocks_overlays.dmi', "rock_Gibtonite_inactive", ON_EDGED_TURF_LAYER) //shows in gaps between pulses if there are any - SET_PLANE(activated_overlay, WALL_PLANE_UPPER, src) add_overlay(activated_overlay) name = "gibtonite deposit" desc = "An active gibtonite reserve. Run!" diff --git a/code/game/turfs/closed/wall/reinf_walls.dm b/code/game/turfs/closed/wall/reinf_walls.dm index 39e19f45a07..3172e5a9e56 100644 --- a/code/game/turfs/closed/wall/reinf_walls.dm +++ b/code/game/turfs/closed/wall/reinf_walls.dm @@ -201,10 +201,10 @@ // We don't react to smoothing changing here because this else exists only to "revert" intact changes /turf/closed/wall/r_wall/update_icon_state() if(d_state != INTACT) - icon = 'modular_skyrat/modules/aesthetics/walls/icons/reinforced_wall.dmi' // SKYRAT EDIT CHANGE - ORIGINAL: icon = 'icons/turf/walls/reinforced_states.dmi' + icon = 'modular_nova/modules/aesthetics/walls/icons/reinforced_wall.dmi' // NOVA EDIT CHANGE - ORIGINAL: icon = 'icons/turf/walls/reinforced_states.dmi' icon_state = "[base_decon_state]-[d_state]" else - icon = 'modular_skyrat/modules/aesthetics/walls/icons/reinforced_wall.dmi' // SKYRAT EDIT CHANGE - ORIGINAL: icon = 'icons/turf/walls/reinforced_wall.dmi' + icon = 'modular_nova/modules/aesthetics/walls/icons/reinforced_wall.dmi' // NOVA EDIT CHANGE - ORIGINAL: icon = 'icons/turf/walls/reinforced_wall.dmi' icon_state = "[base_icon_state]-[smoothing_junction]" return ..() diff --git a/code/game/turfs/closed/walls.dm b/code/game/turfs/closed/walls.dm index f8d411acee4..2cc6d32bc03 100644 --- a/code/game/turfs/closed/walls.dm +++ b/code/game/turfs/closed/walls.dm @@ -1,4 +1,3 @@ -#define MAX_DENT_DECALS 15 #define LEANING_OFFSET 11 /turf/closed/wall @@ -387,5 +386,4 @@ . = ..() SEND_SIGNAL(gone, COMSIG_LIVING_WALL_EXITED, src) -#undef MAX_DENT_DECALS #undef LEANING_OFFSET diff --git a/code/game/turfs/open/_open.dm b/code/game/turfs/open/_open.dm index 6b83427a7b2..e049c2c393f 100644 --- a/code/game/turfs/open/_open.dm +++ b/code/game/turfs/open/_open.dm @@ -302,13 +302,13 @@ // Stops sliding slide_distance = 0 - // SKYRAT EDIT START - Akula species + // NOVA EDIT START - Akula species if(HAS_TRAIT(slipper, TRAIT_SLIPPERY)) if(!(lube & SLIDE_ICE)) lube |= SLIDE slide_distance = rand(SLIPPERY_MIN, SLIPPERY_MAX) - // SKYRAT EDIT END + // NOVA EDIT END var/obj/buckled_obj if(slipper.buckled) diff --git a/code/game/turfs/open/lava.dm b/code/game/turfs/open/lava.dm index 69060ac8568..7c7c321f0e2 100644 --- a/code/game/turfs/open/lava.dm +++ b/code/game/turfs/open/lava.dm @@ -68,7 +68,7 @@ // But that's rare, and I'm ok with that, quartering our light source count is useful var/mutable_appearance/light_mask = mutable_appearance(mask_icon, mask_state, LIGHTING_MASK_LAYER, src, LIGHTING_PLANE) light_mask.blend_mode = BLEND_MULTIPLY - light_mask.color = list(-1,0,0,0, 0,-1,0,0, 0,0,-1,0, 0,0,0,1, 1,1,1,0) + light_mask.color = COLOR_MATRIX_INVERT . += light_mask /// Refreshes this lava turf's lighting diff --git a/code/game/turfs/open/sand.dm b/code/game/turfs/open/sand.dm index c821b9d4516..cfcd4dccfb1 100644 --- a/code/game/turfs/open/sand.dm +++ b/code/game/turfs/open/sand.dm @@ -53,6 +53,7 @@ name = "dirt" desc = "Upon closer examination, it's still dirt." icon = 'icons/turf/floors.dmi' + damaged_dmi = 'icons/turf/damaged.dmi' icon_state = "sand" base_icon_state = "sand" bullet_bounce_sound = null @@ -66,6 +67,9 @@ . = ..() icon_state = "sand_damaged" +/turf/open/misc/sandy_dirt/broken_states() + return list("sand_damaged") + /turf/open/misc/ironsand gender = PLURAL name = "iron sand" diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 2bee06e7c49..8f29bb2e2c2 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -600,7 +600,7 @@ GLOBAL_LIST_EMPTY(station_turfs) . = ..() if((acidpwr <= 0) || (acid_volume <= 0)) return FALSE - if(QDELETED(src)) //skyrat edit: fix createanddestroy + if(QDELETED(src)) //NOVA EDIT: fix createanddestroy return FALSE AddComponent(/datum/component/acid, acidpwr, acid_volume, GLOB.acid_overlay) @@ -618,7 +618,7 @@ GLOBAL_LIST_EMPTY(station_turfs) AddElement(/datum/element/rust) /turf/handle_fall(mob/faller) - SEND_SIGNAL(src, COMSIG_TURF_MOB_FALL, faller) //SKYRAT EDIT ADDITION + SEND_SIGNAL(src, COMSIG_TURF_MOB_FALL, faller) //NOVA EDIT ADDITION if(has_gravity(src)) playsound(src, SFX_BODYFALL, 50, TRUE) faller.drop_all_held_items() diff --git a/code/game/world.dm b/code/game/world.dm index 43e01895575..e1a7a8ccab3 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -348,7 +348,7 @@ GLOBAL_VAR(restart_counter) auxcleanup() . = ..() -/* SKYRAT EDIT REMOVAL - OVERRIDEN +/* NOVA EDIT REMOVAL - OVERRIDEN /world/proc/update_status() var/list/features = list() diff --git a/code/modules/admin/IsBanned.dm b/code/modules/admin/IsBanned.dm index fd3806c6a9e..73a2d9fa693 100644 --- a/code/modules/admin/IsBanned.dm +++ b/code/modules/admin/IsBanned.dm @@ -32,7 +32,7 @@ if(GLOB.admin_datums[ckey] || GLOB.deadmins[ckey]) admin = TRUE - /* SKYRAT EDIT REMOVAL START - We have the panic bunker on 24/7, this just makes our method unusable. + /* NOVA EDIT REMOVAL START - We have the panic bunker on 24/7, this just makes our method unusable. if(!real_bans_only && !admin && CONFIG_GET(flag/panic_bunker) && !CONFIG_GET(flag/panic_bunker_interview)) var/datum/db_query/query_client_in_db = SSdbcore.NewQuery( "SELECT 1 FROM [format_table_name("player")] WHERE ckey = :ckey", @@ -52,7 +52,7 @@ return list("reason"="panicbunker", "desc" = "Sorry but the server is currently not accepting connections from never before seen players") qdel(query_client_in_db) - */ // SKYRAT EDIT REMOVAL END + */ // NOVA EDIT REMOVAL END //Whitelist if(!real_bans_only && !C && CONFIG_GET(flag/usewhitelist)) @@ -107,17 +107,17 @@ addclientmessage(ckey,span_adminnotice("Admin [ckey] has been allowed to bypass a matching non-admin ban on [i["key"]] [i["ip"]]-[i["computerid"]].")) continue var/expires = "This is a permanent ban." - var/global_ban = "This is a global ban from all of our servers." //SKYRAT EDIT ADDITION - MULTISERVER + var/global_ban = "This is a global ban from all of our servers." //NOVA EDIT ADDITION - MULTISERVER if(i["expiration_time"]) expires = " The ban is for [DisplayTimeText(text2num(i["duration"]) MINUTES)] and expires on [i["expiration_time"]] (server time)." - if(!text2num(i["global_ban"])) //SKYRAT EDIT ADDITION - MULTISERVER - global_ban = "This is a single-server ban, and only applies to [i["server_name"]]." //SKYRAT EDIT ADDITION - MULTISERVER - var/desc = /* SKYRAT EDIT CHANGE - MULTISERVER */ {"You, or another user of this computer or connection ([i["key"]]) is banned from playing here. + if(!text2num(i["global_ban"])) //NOVA EDIT ADDITION - MULTISERVER + global_ban = "This is a single-server ban, and only applies to [i["server_name"]]." //NOVA EDIT ADDITION - MULTISERVER + var/desc = /* NOVA EDIT CHANGE - MULTISERVER */ {"You, or another user of this computer or connection ([i["key"]]) is banned from playing here. The ban reason is: [i["reason"]] This ban (BanID #[i["id"]]) was applied by [i["admin_key"]] on [i["bantime"]] during round ID [i["round_id"]]. [global_ban] [expires]"} - log_suspicious_login("Failed Login: [ckey] [computer_id] [address] - Banned (#[i["id"]]) [text2num(i["global_ban"]) ? "globally" : "locally"]") //SKYRAT EDIT CHANGE - MULTISERVER + log_suspicious_login("Failed Login: [ckey] [computer_id] [address] - Banned (#[i["id"]]) [text2num(i["global_ban"]) ? "globally" : "locally"]") //NOVA EDIT CHANGE - MULTISERVER return list("reason"="Banned","desc"="[desc]") if (admin) if (GLOB.directory[ckey]) diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index a1f083f6139..99aa63325ad 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -31,8 +31,7 @@ dat += "
" if(SSticker.IsRoundInProgress()) dat += "(Game Mode Panel)
" - if(istype(SSticker.mode, /datum/game_mode/dynamic)) - dat += "(Manage Dynamic Rulesets)
" + dat += "(Manage Dynamic Rulesets)
" dat += {"
Create Object
@@ -147,9 +146,6 @@ user << browse(dat, "window=dyn_mode_options;size=900x650") /datum/admins/proc/dynamic_ruleset_manager(mob/user) - if (SSticker.current_state > GAME_STATE_PREGAME && !istype(SSticker.mode, /datum/game_mode/dynamic)) - return // Not running dynamic - var/dat = "

Dynamic Ruleset Management


\ Change these options to forcibly enable or disable dynamic rulesets.
\ Disabled rulesets will never run, even if they would otherwise be valid.
\ @@ -172,11 +168,10 @@ user << browse(dat, "window=dyn_mode_options;size=900x650") return - var/datum/game_mode/dynamic/current_mode = SSticker.mode var/pop_count = length(GLOB.alive_player_list) - var/threat_level = current_mode.threat_level - dat += dynamic_ruleset_category_during_round_display("Latejoin", current_mode.latejoin_rules, pop_count, threat_level) - dat += dynamic_ruleset_category_during_round_display("Midround", current_mode.midround_rules, pop_count, threat_level) + var/threat_level = SSdynamic.threat_level + dat += dynamic_ruleset_category_during_round_display("Latejoin", SSdynamic.latejoin_rules, pop_count, threat_level) + dat += dynamic_ruleset_category_during_round_display("Midround", SSdynamic.midround_rules, pop_count, threat_level) user << browse(dat, "window=dyn_mode_options;size=900x650") /datum/admins/proc/dynamic_ruleset_category_pre_start_display(title, list/rules) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 930861bd5b2..4a497df0d30 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -22,10 +22,10 @@ GLOBAL_PROTECT(admin_verbs_default) /client/proc/stop_sounds, /client/proc/tag_datum_mapview, - /client/proc/addbunkerbypass, /*SKYRAT EDIT ADDITION - PANICBUNKER*/ - /client/proc/cmd_loud_admin_say, /*admin-only chat except its annoying - SKYRAT EDIT ADDITION - ADMIN*/ - /client/proc/remove_liquid, /*SKYRAT EDIT ADDITION*/ - /client/proc/revokebunkerbypass, /*SKYRAT EDIT ADDITION - PANICBUNKER*/ + /client/proc/addbunkerbypass, /*NOVA EDIT ADDITION - PANICBUNKER*/ + /client/proc/cmd_loud_admin_say, /*admin-only chat except its annoying - NOVA EDIT ADDITION - ADMIN*/ + /client/proc/remove_liquid, /*NOVA EDIT ADDITION*/ + /client/proc/revokebunkerbypass, /*NOVA EDIT ADDITION - PANICBUNKER*/ ) GLOBAL_LIST_INIT(admin_verbs_admin, world.AVerbsAdmin()) GLOBAL_PROTECT(admin_verbs_admin) @@ -102,13 +102,13 @@ GLOBAL_PROTECT(admin_verbs_admin) /client/proc/cmd_admin_law_panel, /client/proc/log_viewer_new, /client/proc/player_ticket_history, - /datum/admins/proc/toggleaooc, /*Toggle Antag OOC - SKYRAT EDIT ADDITION*/ - /datum/admins/proc/toggledchat, /*SKYRAT EDIT ADDITION*/ - /datum/admins/proc/togglesooc, /*Toggle Security OOC - SKYRAT EDIT ADDITION*/ - /client/proc/admin_open_event_spawners_menu, /*EVENTS - SKYRAT EDIT ADDITION*/ - /client/proc/request_help, /*SKYRAT EDIT ADDITION*/ - /client/proc/view_opfors, /*OPFOR - SKYRAT EDIT ADDITION*/ - /client/proc/lorecaster_story_manager, /* SKYRAT EDIT ADDITION */ + /datum/admins/proc/toggleaooc, /*Toggle Antag OOC - NOVA EDIT ADDITION*/ + /datum/admins/proc/toggledchat, /*NOVA EDIT ADDITION*/ + /datum/admins/proc/togglesooc, /*Toggle Security OOC - NOVA EDIT ADDITION*/ + /client/proc/admin_open_event_spawners_menu, /*EVENTS - NOVA EDIT ADDITION*/ + /client/proc/request_help, /*NOVA EDIT ADDITION*/ + /client/proc/view_opfors, /*OPFOR - NOVA EDIT ADDITION*/ + /client/proc/lorecaster_story_manager, /* NOVA EDIT ADDITION */ ) GLOBAL_LIST_INIT(admin_verbs_ban, list(/client/proc/unban_panel, /client/proc/ban_panel, /client/proc/stickybanpanel, /client/proc/library_control)) GLOBAL_PROTECT(admin_verbs_ban) @@ -144,20 +144,20 @@ GLOBAL_LIST_INIT(admin_verbs_fun, list( /client/proc/summon_ert, /client/proc/toggle_nuke, /client/proc/toggle_random_events, - /client/proc/admin_change_title_screen, /*SKYRAT EDIT ADDITION*/ - /client/proc/change_title_screen_html, /*SKYRAT EDIT ADDITION*/ - /client/proc/change_title_screen_notice, /*SKYRAT EDIT ADDITION*/ - /client/proc/fix_say, /*SKYRAT EDIT ADDITION*/ - /client/proc/one_click_antag, /*ONE CLICK ANTAG - SKYRAT EDIT ADDITION*/ - /client/proc/request_more_opfor, /*SKYRAT EDIT ADDITION*/ - /client/proc/spawn_liquid, /*SKYRAT EDIT ADDITION*/ - /client/proc/spawn_mob_spawner, /*SKYRAT EDIT ADDITION*/ - /client/proc/spawn_pollution, /*SKYRAT EDIT ADDITION*/ - /client/proc/spawn_sunbeam, /*SKYRAT EDIT ADDITION*/ - /client/proc/intensity_credits_panel, /*SKYRAT EDIT ADDITION*/ - /client/proc/toggle_bsa, /*SKYRAT EDIT ADDITION*/ - /client/proc/try_stop_delam, /*SKYRAT EDIT ADDITION*/ - /client/proc/toggle_delam_suppression, /*SKYRAT EDIT ADDITION*/ + /client/proc/admin_change_title_screen, /*NOVA EDIT ADDITION*/ + /client/proc/change_title_screen_html, /*NOVA EDIT ADDITION*/ + /client/proc/change_title_screen_notice, /*NOVA EDIT ADDITION*/ + /client/proc/fix_say, /*NOVA EDIT ADDITION*/ + /client/proc/one_click_antag, /*ONE CLICK ANTAG - NOVA EDIT ADDITION*/ + /client/proc/request_more_opfor, /*NOVA EDIT ADDITION*/ + /client/proc/spawn_liquid, /*NOVA EDIT ADDITION*/ + /client/proc/spawn_mob_spawner, /*NOVA EDIT ADDITION*/ + /client/proc/spawn_pollution, /*NOVA EDIT ADDITION*/ + /client/proc/spawn_sunbeam, /*NOVA EDIT ADDITION*/ + /client/proc/intensity_credits_panel, /*NOVA EDIT ADDITION*/ + /client/proc/toggle_bsa, /*NOVA EDIT ADDITION*/ + /client/proc/try_stop_delam, /*NOVA EDIT ADDITION*/ + /client/proc/toggle_delam_suppression, /*NOVA EDIT ADDITION*/ )) GLOBAL_PROTECT(admin_verbs_fun) GLOBAL_LIST_INIT(admin_verbs_spawn, list(/datum/admins/proc/spawn_atom, /datum/admins/proc/podspawn_atom, /datum/admins/proc/spawn_cargo, /datum/admins/proc/spawn_objasmob, /client/proc/respawn_character, /datum/admins/proc/beaker_panel)) @@ -195,7 +195,6 @@ GLOBAL_PROTECT(admin_verbs_debug) return list( #ifdef TESTING /* Keep these at the top to not make the list look fugly */ /client/proc/check_missing_sprites, - /client/proc/run_dynamic_simulations, #endif /proc/machine_upgrade, /datum/admins/proc/create_or_modify_area, @@ -232,6 +231,7 @@ GLOBAL_PROTECT(admin_verbs_debug) /client/proc/get_dynex_range, /*debug verbs for dynex explosions.*/ /client/proc/jump_to_ruin, /client/proc/load_circuit, + /client/proc/map_export, /client/proc/map_template_load, /client/proc/map_template_upload, /client/proc/modify_goals, @@ -260,9 +260,9 @@ GLOBAL_PROTECT(admin_verbs_debug) /client/proc/GeneratePipeSpritesheet, /client/proc/view_runtimes, - /client/proc/reload_interactions, /*SKYRAT EDIT ADDITION*/ - /client/proc/test_area_spawner, /*AUTOMAPPER - SKYRAT EDIT ADDITION*/ - /client/proc/toggle_liquid_debug, /*SKYRAT EDIT ADDITION*/ + /client/proc/reload_interactions, /*NOVA EDIT ADDITION*/ + /client/proc/test_area_spawner, /*AUTOMAPPER - NOVA EDIT ADDITION*/ + /client/proc/toggle_liquid_debug, /*NOVA EDIT ADDITION*/ /datum/admins/proc/delay, /*FLUFFY FRONTIER ADDITION - EVENTMAKER QOL*/ /datum/admins/proc/end_round, /*FLUFFY FRONTIER ADDITION - EVENTMAKER QOL*/ @@ -270,13 +270,13 @@ GLOBAL_PROTECT(admin_verbs_debug) ) GLOBAL_LIST_INIT(admin_verbs_possess, list(/proc/possess, GLOBAL_PROC_REF(release))) GLOBAL_PROTECT(admin_verbs_possess) -/// SKYRAT EDIT BEGIN - Player Rank Manager - ORIGINAL: GLOBAL_LIST_INIT(admin_verbs_permissions, list(/client/proc/edit_admin_permissions)) +/// NOVA EDIT BEGIN - Player Rank Manager - ORIGINAL: GLOBAL_LIST_INIT(admin_verbs_permissions, list(/client/proc/edit_admin_permissions)) GLOBAL_LIST_INIT(admin_verbs_permissions, list( /client/proc/edit_admin_permissions, /client/proc/manage_player_ranks, /client/proc/migrate_player_ranks, )) -/// SKYRAT EDIT END +/// NOVA EDIT END GLOBAL_PROTECT(admin_verbs_permissions) GLOBAL_LIST_INIT(admin_verbs_poll, list(/client/proc/poll_panel)) GLOBAL_PROTECT(admin_verbs_poll) diff --git a/code/modules/admin/antag_panel.dm b/code/modules/admin/antag_panel.dm index b8f6737b155..78601deeb02 100644 --- a/code/modules/admin/antag_panel.dm +++ b/code/modules/admin/antag_panel.dm @@ -72,7 +72,7 @@ GLOBAL_VAR(antag_prototypes) if (R.emagged) common_commands += "Unemag slaved cyborgs" break - common_commands += "Toggle exploitables override" //SKYRAT EDIT ADDITION -- EXPLOITABLES + common_commands += "Toggle exploitables override" //NOVA EDIT ADDITION -- EXPLOITABLES return common_commands /datum/mind/proc/get_special_statuses() diff --git a/code/modules/admin/check_antagonists.dm b/code/modules/admin/check_antagonists.dm index 770d1b9c637..0069ce27ced 100644 --- a/code/modules/admin/check_antagonists.dm +++ b/code/modules/admin/check_antagonists.dm @@ -95,8 +95,7 @@ tgui_alert(usr, "The game hasn't started yet!") return var/list/dat = list("Round Status

Round Status

") - if(istype(SSticker.mode, /datum/game_mode/dynamic)) // Currently only used by dynamic. If more start using this, find a better way. - dat += "Game Mode Panel
" + dat += "Game Mode Panel
" dat += "Round Duration: [DisplayTimeText(world.time - SSticker.round_start_time)]
" dat += "Emergency shuttle
" if(EMERGENCY_IDLE_OR_RECALLED) @@ -181,7 +180,7 @@ dat += build_antag_listing() - dat += SSopposing_force.get_check_antag_listing() //SKYRAT EDIT ADDITION + dat += SSopposing_force.get_check_antag_listing() //NOVA EDIT ADDITION dat += "" usr << browse(dat.Join(), "window=roundstatus;size=500x500") diff --git a/code/modules/admin/create_mob.dm b/code/modules/admin/create_mob.dm index c23b37e14f1..6eef8e8f7d1 100644 --- a/code/modules/admin/create_mob.dm +++ b/code/modules/admin/create_mob.dm @@ -28,10 +28,10 @@ human.dna.species.randomize_active_underwear_only(human) // Needs to be called towards the end to update all the UIs just set above human.dna.initialize_dna(newblood_type = random_blood_type(), create_mutation_blocks = randomize_mutations, randomize_features = TRUE) - // SKYRAT EDIT ADDITION BEGIN - CUSTOMIZATION + // NOVA EDIT ADDITION BEGIN - CUSTOMIZATION human.dna.species.mutant_bodyparts = human.dna.mutant_bodyparts.Copy() human.dna.species.body_markings = human.dna.body_markings.Copy() - // SKYRAT EDIT ADDITION END + // NOVA EDIT ADDITION END // Snowflake for Ethereals human.updatehealth() human.updateappearance(mutcolor_update = TRUE) diff --git a/code/modules/admin/fun_balloon.dm b/code/modules/admin/fun_balloon.dm index 979e51bd5a1..91d4c5161fa 100644 --- a/code/modules/admin/fun_balloon.dm +++ b/code/modules/admin/fun_balloon.dm @@ -88,7 +88,7 @@ bodies += possessable var/question = "Would you like to be [group_name]?" - var/list/candidates = poll_candidates_for_mobs(question, ROLE_SENTIENCE, ROLE_SENTIENCE, 10 SECONDS, bodies, POLL_IGNORE_SHUTTLE_DENIZENS) + var/list/candidates = SSpolling.poll_ghost_candidates_for_mobs(question, check_jobban = ROLE_SENTIENCE, role = ROLE_SENTIENCE, poll_time = 10 SECONDS, mobs = bodies, ignore_category = POLL_IGNORE_SHUTTLE_DENIZENS, pic_source = src, role_name_text = "sentience fun balloon") while(LAZYLEN(candidates) && LAZYLEN(bodies)) var/mob/dead/observer/C = pick_n_take(candidates) var/mob/living/body = pick_n_take(bodies) diff --git a/code/modules/admin/greyscale_modify_menu.dm b/code/modules/admin/greyscale_modify_menu.dm index fd2db6d1ed3..084c5e0272c 100644 --- a/code/modules/admin/greyscale_modify_menu.dm +++ b/code/modules/admin/greyscale_modify_menu.dm @@ -305,7 +305,7 @@ This is highly likely to cause massive amounts of lag as every object in the gam CHECK_TICK var/image/layer = image(step["step"]) var/image/result = image(step["result"]) - // SKYRAT EDIT BEGIN - Bringing back the GAGS coloring menu + // NOVA EDIT BEGIN - Bringing back the GAGS coloring menu steps += list( list( "layer"=icon2html(layer, user, dir=sprite_dir, sourceonly=TRUE), @@ -313,7 +313,7 @@ This is highly likely to cause massive amounts of lag as every object in the gam "config_name"=step["config_name"] ) ) - // SKYRAT EDIT END + // NOVA EDIT END sprite_data["time_spent"] = TICK_DELTA_TO_MS(time_spent) sprite_data["finished"] = icon2html(finished, user, dir=sprite_dir, sourceonly=TRUE) diff --git a/code/modules/admin/smites/imaginary_friend_special.dm b/code/modules/admin/smites/imaginary_friend_special.dm index e95f8c52cb1..5b2bc6ba805 100644 --- a/code/modules/admin/smites/imaginary_friend_special.dm +++ b/code/modules/admin/smites/imaginary_friend_special.dm @@ -57,11 +57,12 @@ if (isnull(how_many) || how_many < 1) return FALSE - var/list/volunteers = poll_ghost_candidates( + var/list/volunteers = SSpolling.poll_ghost_candidates( question = "Do you want to play as an imaginary friend?", - jobban_type = ROLE_PAI, + check_jobban = ROLE_PAI, poll_time = 10 SECONDS, ignore_category = POLL_IGNORE_IMAGINARYFRIEND, + role_name_text = "imaginary friend", ) var/volunteer_count = length(volunteers) if (volunteer_count == 0) diff --git a/code/modules/admin/sql_ban_system.dm b/code/modules/admin/sql_ban_system.dm index e5b3756cfd4..e6e4c95d376 100644 --- a/code/modules/admin/sql_ban_system.dm +++ b/code/modules/admin/sql_ban_system.dm @@ -49,14 +49,14 @@ "player_ckey" = player_ckey, "must_apply_to_admins" = !!(GLOB.admin_datums[player_ckey] || GLOB.deadmins[player_ckey]), ) - // SKYRAT EDIT ADDITION BEGIN - MULTISERVER + // NOVA EDIT ADDITION BEGIN - MULTISERVER var/ssqlname = CONFIG_GET(string/serversqlname) var/server_check if(CONFIG_GET(flag/respect_global_bans)) server_check = "(server_name = '[ssqlname]' OR global_ban = '1')" else server_check = "server_name = '[ssqlname]'" - // SKYRAT EDIT ADDITION END - MULTISERVER + // NOVA EDIT ADDITION END - MULTISERVER var/sql_roles if(islist(roles)) var/list/sql_roles_list = list() @@ -68,7 +68,7 @@ values["role"] = roles sql_roles = ":role" - var/datum/db_query/query_check_ban = SSdbcore.NewQuery(/* SKYRAT EDIT CHANGE - MULTISERVER */{" + var/datum/db_query/query_check_ban = SSdbcore.NewQuery(/* NOVA EDIT CHANGE - MULTISERVER */{" SELECT 1 FROM [format_table_name("ban")] WHERE @@ -99,13 +99,13 @@ /proc/is_banned_from_with_details(player_ckey, player_ip, player_cid, role) if(!player_ckey && !player_ip && !player_cid) return - var/ssqlname = CONFIG_GET(string/serversqlname) // SKYRAT EDIT ADDITION BEGIN - MULTISERVER + var/ssqlname = CONFIG_GET(string/serversqlname) // NOVA EDIT ADDITION BEGIN - MULTISERVER var/server_check if(CONFIG_GET(flag/respect_global_bans)) server_check = "(server_name = '[ssqlname]' OR global_ban = '1')" else - server_check = "server_name = '[ssqlname]'" // SKYRAT EDIT ADDITION END - MULTISERVER - var/datum/db_query/query_check_ban = SSdbcore.NewQuery(/* SKYRAT EDIT CHANGE - MULTISERVER */{" + server_check = "server_name = '[ssqlname]'" // NOVA EDIT ADDITION END - MULTISERVER + var/datum/db_query/query_check_ban = SSdbcore.NewQuery(/* NOVA EDIT CHANGE - MULTISERVER */{" SELECT id, bantime, @@ -176,16 +176,16 @@ var/is_admin = FALSE if(GLOB.admin_datums[ckey] || GLOB.deadmins[ckey]) is_admin = TRUE - // SKYRAT EDIT ADDITION BEGIN - MULTISERVER + // NOVA EDIT ADDITION BEGIN - MULTISERVER var/ssqlname = CONFIG_GET(string/serversqlname) var/server_check if(CONFIG_GET(flag/respect_global_bans)) server_check = "(server_name = '[ssqlname]' OR global_ban = '1')" else server_check = "server_name = '[ssqlname]'" - // SKYRAT EDIT ADDITION END - MULTISERVER + // NOVA EDIT ADDITION END - MULTISERVER var/datum/db_query/query_build_ban_cache = SSdbcore.NewQuery( - "SELECT role, applies_to_admins FROM [format_table_name("ban")] WHERE ckey = :ckey AND unbanned_datetime IS NULL AND (expiration_time IS NULL OR expiration_time > NOW()) AND [server_check]", //skyrat edit + "SELECT role, applies_to_admins FROM [format_table_name("ban")] WHERE ckey = :ckey AND unbanned_datetime IS NULL AND (expiration_time IS NULL OR expiration_time > NOW()) AND [server_check]", //NOVA EDIT list("ckey" = ckey) ) var/query_successful = query_build_ban_cache.warn_execute() @@ -207,7 +207,7 @@ return ban_cache -/datum/admins/proc/ban_panel(player_key, player_ip, player_cid, role, duration = 1440, applies_to_admins, reason, edit_id, page, admin_key, global_ban = TRUE) // SKYRAT EDIT CHANGE - MULTISERVER +/datum/admins/proc/ban_panel(player_key, player_ip, player_cid, role, duration = 1440, applies_to_admins, reason, edit_id, page, admin_key, global_ban = TRUE) // NOVA EDIT CHANGE - MULTISERVER if (duration == BAN_PANEL_PERMANENT) duration = null @@ -316,7 +316,7 @@ "} if(edit_id) - output += /* SKYRAT EDIT CHANGE - MULTISERVER */{"